hackwriter 0.0.2

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 (151) hide show
  1. package/LICENSE +9 -0
  2. package/README.md +55 -0
  3. package/dist/agent/Agent.d.ts +9 -0
  4. package/dist/agent/Agent.d.ts.map +1 -0
  5. package/dist/agent/Agent.js +2 -0
  6. package/dist/agent/Agent.js.map +1 -0
  7. package/dist/agent/AgentExecutor.d.ts +36 -0
  8. package/dist/agent/AgentExecutor.d.ts.map +1 -0
  9. package/dist/agent/AgentExecutor.js +306 -0
  10. package/dist/agent/AgentExecutor.js.map +1 -0
  11. package/dist/agent/ApprovalManager.d.ts +8 -0
  12. package/dist/agent/ApprovalManager.d.ts.map +1 -0
  13. package/dist/agent/ApprovalManager.js +45 -0
  14. package/dist/agent/ApprovalManager.js.map +1 -0
  15. package/dist/agent/ContextCompressor.d.ts +9 -0
  16. package/dist/agent/ContextCompressor.d.ts.map +1 -0
  17. package/dist/agent/ContextCompressor.js +58 -0
  18. package/dist/agent/ContextCompressor.js.map +1 -0
  19. package/dist/agent/ConversationContext.d.ts +19 -0
  20. package/dist/agent/ConversationContext.d.ts.map +1 -0
  21. package/dist/agent/ConversationContext.js +236 -0
  22. package/dist/agent/ConversationContext.js.map +1 -0
  23. package/dist/agent/ModelFactory.d.ts +4 -0
  24. package/dist/agent/ModelFactory.d.ts.map +1 -0
  25. package/dist/agent/ModelFactory.js +32 -0
  26. package/dist/agent/ModelFactory.js.map +1 -0
  27. package/dist/cli.d.ts +3 -0
  28. package/dist/cli.d.ts.map +1 -0
  29. package/dist/cli.js +146 -0
  30. package/dist/cli.js.map +1 -0
  31. package/dist/commands/setup.d.ts +2 -0
  32. package/dist/commands/setup.d.ts.map +1 -0
  33. package/dist/commands/setup.js +110 -0
  34. package/dist/commands/setup.js.map +1 -0
  35. package/dist/config/ConfigSchema.d.ts +75 -0
  36. package/dist/config/ConfigSchema.d.ts.map +1 -0
  37. package/dist/config/ConfigSchema.js +54 -0
  38. package/dist/config/ConfigSchema.js.map +1 -0
  39. package/dist/config/Configuration.d.ts +30 -0
  40. package/dist/config/Configuration.d.ts.map +1 -0
  41. package/dist/config/Configuration.js +2 -0
  42. package/dist/config/Configuration.js.map +1 -0
  43. package/dist/config/ConfigurationLoader.d.ts +8 -0
  44. package/dist/config/ConfigurationLoader.d.ts.map +1 -0
  45. package/dist/config/ConfigurationLoader.js +75 -0
  46. package/dist/config/ConfigurationLoader.js.map +1 -0
  47. package/dist/messaging/MessageBus.d.ts +11 -0
  48. package/dist/messaging/MessageBus.d.ts.map +1 -0
  49. package/dist/messaging/MessageBus.js +23 -0
  50. package/dist/messaging/MessageBus.js.map +1 -0
  51. package/dist/messaging/MessageTypes.d.ts +39 -0
  52. package/dist/messaging/MessageTypes.d.ts.map +1 -0
  53. package/dist/messaging/MessageTypes.js +2 -0
  54. package/dist/messaging/MessageTypes.js.map +1 -0
  55. package/dist/session/SessionManager.d.ts +11 -0
  56. package/dist/session/SessionManager.d.ts.map +1 -0
  57. package/dist/session/SessionManager.js +56 -0
  58. package/dist/session/SessionManager.js.map +1 -0
  59. package/dist/tools/base/Tool.d.ts +19 -0
  60. package/dist/tools/base/Tool.d.ts.map +1 -0
  61. package/dist/tools/base/Tool.js +15 -0
  62. package/dist/tools/base/Tool.js.map +1 -0
  63. package/dist/tools/base/ToolRegistry.d.ts +16 -0
  64. package/dist/tools/base/ToolRegistry.d.ts.map +1 -0
  65. package/dist/tools/base/ToolRegistry.js +29 -0
  66. package/dist/tools/base/ToolRegistry.js.map +1 -0
  67. package/dist/tools/file/ListFilesTool.d.ts +17 -0
  68. package/dist/tools/file/ListFilesTool.d.ts.map +1 -0
  69. package/dist/tools/file/ListFilesTool.js +80 -0
  70. package/dist/tools/file/ListFilesTool.js.map +1 -0
  71. package/dist/tools/file/ReadFileTool.d.ts +13 -0
  72. package/dist/tools/file/ReadFileTool.d.ts.map +1 -0
  73. package/dist/tools/file/ReadFileTool.js +32 -0
  74. package/dist/tools/file/ReadFileTool.js.map +1 -0
  75. package/dist/tools/file/WriteFileTool.d.ts +18 -0
  76. package/dist/tools/file/WriteFileTool.d.ts.map +1 -0
  77. package/dist/tools/file/WriteFileTool.js +54 -0
  78. package/dist/tools/file/WriteFileTool.js.map +1 -0
  79. package/dist/tools/file/index.d.ts +4 -0
  80. package/dist/tools/file/index.d.ts.map +1 -0
  81. package/dist/tools/file/index.js +4 -0
  82. package/dist/tools/file/index.js.map +1 -0
  83. package/dist/tools/hackmd/CreateNoteTool.d.ts +27 -0
  84. package/dist/tools/hackmd/CreateNoteTool.d.ts.map +1 -0
  85. package/dist/tools/hackmd/CreateNoteTool.js +85 -0
  86. package/dist/tools/hackmd/CreateNoteTool.js.map +1 -0
  87. package/dist/tools/hackmd/DeleteNoteTool.d.ts +19 -0
  88. package/dist/tools/hackmd/DeleteNoteTool.d.ts.map +1 -0
  89. package/dist/tools/hackmd/DeleteNoteTool.js +54 -0
  90. package/dist/tools/hackmd/DeleteNoteTool.js.map +1 -0
  91. package/dist/tools/hackmd/ExportNoteTool.d.ts +18 -0
  92. package/dist/tools/hackmd/ExportNoteTool.d.ts.map +1 -0
  93. package/dist/tools/hackmd/ExportNoteTool.js +75 -0
  94. package/dist/tools/hackmd/ExportNoteTool.js.map +1 -0
  95. package/dist/tools/hackmd/GetHistoryTool.d.ts +16 -0
  96. package/dist/tools/hackmd/GetHistoryTool.d.ts.map +1 -0
  97. package/dist/tools/hackmd/GetHistoryTool.js +51 -0
  98. package/dist/tools/hackmd/GetHistoryTool.js.map +1 -0
  99. package/dist/tools/hackmd/GetUserInfoTool.d.ts +13 -0
  100. package/dist/tools/hackmd/GetUserInfoTool.d.ts.map +1 -0
  101. package/dist/tools/hackmd/GetUserInfoTool.js +30 -0
  102. package/dist/tools/hackmd/GetUserInfoTool.js.map +1 -0
  103. package/dist/tools/hackmd/ListNotesTool.d.ts +17 -0
  104. package/dist/tools/hackmd/ListNotesTool.d.ts.map +1 -0
  105. package/dist/tools/hackmd/ListNotesTool.js +48 -0
  106. package/dist/tools/hackmd/ListNotesTool.js.map +1 -0
  107. package/dist/tools/hackmd/ListTeamsTool.d.ts +13 -0
  108. package/dist/tools/hackmd/ListTeamsTool.d.ts.map +1 -0
  109. package/dist/tools/hackmd/ListTeamsTool.js +34 -0
  110. package/dist/tools/hackmd/ListTeamsTool.js.map +1 -0
  111. package/dist/tools/hackmd/ReadNoteTool.d.ts +16 -0
  112. package/dist/tools/hackmd/ReadNoteTool.d.ts.map +1 -0
  113. package/dist/tools/hackmd/ReadNoteTool.js +36 -0
  114. package/dist/tools/hackmd/ReadNoteTool.js.map +1 -0
  115. package/dist/tools/hackmd/SearchNotesTool.d.ts +17 -0
  116. package/dist/tools/hackmd/SearchNotesTool.d.ts.map +1 -0
  117. package/dist/tools/hackmd/SearchNotesTool.js +49 -0
  118. package/dist/tools/hackmd/SearchNotesTool.js.map +1 -0
  119. package/dist/tools/hackmd/UpdateNoteTool.d.ts +20 -0
  120. package/dist/tools/hackmd/UpdateNoteTool.d.ts.map +1 -0
  121. package/dist/tools/hackmd/UpdateNoteTool.js +62 -0
  122. package/dist/tools/hackmd/UpdateNoteTool.js.map +1 -0
  123. package/dist/tools/hackmd/errorHandler.d.ts +6 -0
  124. package/dist/tools/hackmd/errorHandler.d.ts.map +1 -0
  125. package/dist/tools/hackmd/errorHandler.js +59 -0
  126. package/dist/tools/hackmd/errorHandler.js.map +1 -0
  127. package/dist/tools/hackmd/index.d.ts +11 -0
  128. package/dist/tools/hackmd/index.d.ts.map +1 -0
  129. package/dist/tools/hackmd/index.js +24 -0
  130. package/dist/tools/hackmd/index.js.map +1 -0
  131. package/dist/ui/shell/CommandRegistry.d.ts +20 -0
  132. package/dist/ui/shell/CommandRegistry.d.ts.map +1 -0
  133. package/dist/ui/shell/CommandRegistry.js +77 -0
  134. package/dist/ui/shell/CommandRegistry.js.map +1 -0
  135. package/dist/ui/shell/InteractiveShell.d.ts +15 -0
  136. package/dist/ui/shell/InteractiveShell.d.ts.map +1 -0
  137. package/dist/ui/shell/InteractiveShell.js +94 -0
  138. package/dist/ui/shell/InteractiveShell.js.map +1 -0
  139. package/dist/ui/shell/OutputRenderer.d.ts +8 -0
  140. package/dist/ui/shell/OutputRenderer.d.ts.map +1 -0
  141. package/dist/ui/shell/OutputRenderer.js +85 -0
  142. package/dist/ui/shell/OutputRenderer.js.map +1 -0
  143. package/dist/utils/ErrorTypes.d.ts +58 -0
  144. package/dist/utils/ErrorTypes.d.ts.map +1 -0
  145. package/dist/utils/ErrorTypes.js +156 -0
  146. package/dist/utils/ErrorTypes.js.map +1 -0
  147. package/dist/utils/Logger.d.ts +13 -0
  148. package/dist/utils/Logger.d.ts.map +1 -0
  149. package/dist/utils/Logger.js +72 -0
  150. package/dist/utils/Logger.js.map +1 -0
  151. package/package.json +66 -0
@@ -0,0 +1,236 @@
1
+ import { promises as fs } from 'fs';
2
+ import { Logger } from '../utils/Logger';
3
+ const SUPPORTED_ROLES = new Set(['system', 'user', 'assistant', 'tool']);
4
+ function isSupportedRole(value) {
5
+ return typeof value === 'string' && SUPPORTED_ROLES.has(value);
6
+ }
7
+ function isModelMessage(value) {
8
+ if (!value || typeof value !== 'object') {
9
+ return false;
10
+ }
11
+ const candidate = value;
12
+ return isSupportedRole(candidate.role);
13
+ }
14
+ function coerceLegacyMessage(data) {
15
+ if (isModelMessage(data)) {
16
+ return data;
17
+ }
18
+ if (!data || typeof data !== 'object') {
19
+ return undefined;
20
+ }
21
+ const { role, content } = data;
22
+ if (!isSupportedRole(role)) {
23
+ return undefined;
24
+ }
25
+ if (role === 'tool') {
26
+ const toolContent = coerceLegacyToolContent(content);
27
+ if (toolContent) {
28
+ return { role: 'tool', content: toolContent };
29
+ }
30
+ return undefined;
31
+ }
32
+ const textContent = coerceLegacyTextContent(content);
33
+ if (textContent !== undefined) {
34
+ return { role: role, content: textContent };
35
+ }
36
+ return undefined;
37
+ }
38
+ function coerceLegacyTextContent(content) {
39
+ if (typeof content === 'string') {
40
+ return content;
41
+ }
42
+ if (Array.isArray(content)) {
43
+ const flattened = content
44
+ .map(block => {
45
+ if (!block || typeof block !== 'object') {
46
+ return undefined;
47
+ }
48
+ const kind = block.type;
49
+ if (kind === 'text' && typeof block.text === 'string') {
50
+ return block.text;
51
+ }
52
+ if (kind === 'tool_use') {
53
+ const name = block.name ?? 'unknown-tool';
54
+ return `[tool:${name}]`;
55
+ }
56
+ if (kind === 'tool_result') {
57
+ return `[tool-result:${JSON.stringify(block)}]`;
58
+ }
59
+ return undefined;
60
+ })
61
+ .filter((val) => typeof val === 'string');
62
+ if (flattened.length > 0) {
63
+ return flattened.join('\n');
64
+ }
65
+ }
66
+ if (content !== undefined) {
67
+ try {
68
+ return JSON.stringify(content);
69
+ }
70
+ catch {
71
+ return undefined;
72
+ }
73
+ }
74
+ return undefined;
75
+ }
76
+ function coerceLegacyToolContent(content) {
77
+ if (!Array.isArray(content)) {
78
+ return undefined;
79
+ }
80
+ const parts = [];
81
+ for (const block of content) {
82
+ if (!block || typeof block !== 'object') {
83
+ continue;
84
+ }
85
+ const kind = block.type;
86
+ if (kind !== 'tool_result') {
87
+ continue;
88
+ }
89
+ const id = block.tool_call_id ??
90
+ block.tool_use_id ??
91
+ `legacy-tool-${parts.length}`;
92
+ const name = block.tool_name ?? block.name ?? 'legacy-tool';
93
+ const isError = Boolean(block.is_error);
94
+ const value = block.content ?? block.output ?? null;
95
+ const serializedValue = serializeLegacyValue(value);
96
+ parts.push({
97
+ type: 'tool-result',
98
+ toolCallId: String(id),
99
+ toolName: String(name),
100
+ output: isError
101
+ ? { type: 'error-json', value: { ok: false, content: serializedValue } }
102
+ : { type: 'json', value: { ok: true, content: serializedValue } },
103
+ });
104
+ }
105
+ return parts.length > 0 ? parts : undefined;
106
+ }
107
+ function serializeLegacyValue(value) {
108
+ if (value === null || value === undefined) {
109
+ return null;
110
+ }
111
+ if (typeof value === 'string') {
112
+ return value;
113
+ }
114
+ try {
115
+ return JSON.stringify(value);
116
+ }
117
+ catch {
118
+ return null;
119
+ }
120
+ }
121
+ export class ConversationContext {
122
+ messages = [];
123
+ _tokenCount = 0;
124
+ checkpointCounter = 0;
125
+ storageFile;
126
+ isMemoryMode;
127
+ constructor(storageFile) {
128
+ this.storageFile = storageFile;
129
+ this.isMemoryMode = storageFile === ':memory:';
130
+ }
131
+ async loadFromDisk() {
132
+ if (this.isMemoryMode) {
133
+ return false;
134
+ }
135
+ try {
136
+ const content = await fs.readFile(this.storageFile, 'utf-8');
137
+ const lines = content.split('\n').filter(l => l.trim());
138
+ for (const line of lines) {
139
+ const record = JSON.parse(line);
140
+ if (record.type === 'usage') {
141
+ this._tokenCount = record.tokenCount;
142
+ }
143
+ else if (record.type === 'checkpoint') {
144
+ this.checkpointCounter = record.id + 1;
145
+ }
146
+ else if (record.type === 'message') {
147
+ const normalized = coerceLegacyMessage(record.data);
148
+ if (normalized) {
149
+ this.messages.push(normalized);
150
+ }
151
+ }
152
+ }
153
+ Logger.debug('ConversationContext', `Loaded ${this.messages.length} messages, ${this._tokenCount} tokens`);
154
+ return true;
155
+ }
156
+ catch (error) {
157
+ if (error.code === 'ENOENT') {
158
+ return false;
159
+ }
160
+ throw error;
161
+ }
162
+ }
163
+ async createCheckpoint() {
164
+ const checkpointId = this.checkpointCounter++;
165
+ await this.persistRecord({ type: 'checkpoint', id: checkpointId });
166
+ return checkpointId;
167
+ }
168
+ async addMessage(message) {
169
+ const msgs = Array.isArray(message) ? message : [message];
170
+ this.messages.push(...msgs);
171
+ for (const msg of msgs) {
172
+ await this.persistRecord({ type: 'message', data: msg });
173
+ }
174
+ }
175
+ async updateTokenCount(count) {
176
+ this._tokenCount += count;
177
+ await this.persistRecord({ type: 'usage', tokenCount: this._tokenCount });
178
+ }
179
+ async revertToCheckpoint(checkpointId) {
180
+ if (this.isMemoryMode) {
181
+ // In memory mode, just reset to initial state since we don't track checkpoints
182
+ this.messages = [];
183
+ this._tokenCount = 0;
184
+ this.checkpointCounter = 0;
185
+ return;
186
+ }
187
+ const originalContent = await fs.readFile(this.storageFile, 'utf-8');
188
+ const lines = originalContent.split('\n').filter(l => l.trim());
189
+ // Create backup
190
+ const backupFile = `${this.storageFile}.${Date.now()}.backup`;
191
+ await fs.rename(this.storageFile, backupFile);
192
+ // Rebuild to checkpoint
193
+ this.messages = [];
194
+ this._tokenCount = 0;
195
+ this.checkpointCounter = 0;
196
+ for (const line of lines) {
197
+ const record = JSON.parse(line);
198
+ if (record.type === 'checkpoint' && record.id === checkpointId) {
199
+ break;
200
+ }
201
+ if (record.type === 'message') {
202
+ const normalized = coerceLegacyMessage(record.data);
203
+ if (!normalized) {
204
+ continue;
205
+ }
206
+ await this.persistRecord({ type: 'message', data: normalized });
207
+ this.messages.push(normalized);
208
+ }
209
+ else {
210
+ await this.persistRecord(record);
211
+ if (record.type === 'usage') {
212
+ this._tokenCount = record.tokenCount;
213
+ }
214
+ else if (record.type === 'checkpoint') {
215
+ this.checkpointCounter = record.id + 1;
216
+ }
217
+ }
218
+ }
219
+ }
220
+ getHistory() {
221
+ return this.messages;
222
+ }
223
+ get tokenCount() {
224
+ return this._tokenCount;
225
+ }
226
+ get checkpointCount() {
227
+ return this.checkpointCounter;
228
+ }
229
+ async persistRecord(data) {
230
+ if (this.isMemoryMode) {
231
+ return;
232
+ }
233
+ await fs.appendFile(this.storageFile, JSON.stringify(data) + '\n', 'utf-8');
234
+ }
235
+ }
236
+ //# sourceMappingURL=ConversationContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConversationContext.js","sourceRoot":"","sources":["../../src/agent/ConversationContext.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { LanguageModel } from 'ai';
2
+ import type { LLMProvider } from '../config/Configuration';
3
+ export declare function buildLanguageModel(provider: LLMProvider, modelId: string): LanguageModel;
4
+ //# sourceMappingURL=ModelFactory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ModelFactory.d.ts","sourceRoot":"","sources":["../../src/agent/ModelFactory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAGxC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAG3D,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,GAAG,aAAa,CA4BxF"}
@@ -0,0 +1,32 @@
1
+ import { createAnthropic } from '@ai-sdk/anthropic';
2
+ import { createOpenAI } from '@ai-sdk/openai';
3
+ import { Logger } from '../utils/Logger';
4
+ export function buildLanguageModel(provider, modelId) {
5
+ Logger.debug('ModelFactory', 'Building language model', {
6
+ providerType: provider.type,
7
+ modelId,
8
+ hasApiKey: !!provider.apiKey,
9
+ baseUrl: provider.baseUrl
10
+ });
11
+ switch (provider.type) {
12
+ case 'anthropic': {
13
+ const anthropic = createAnthropic({
14
+ apiKey: provider.apiKey,
15
+ baseURL: provider.baseUrl,
16
+ });
17
+ return anthropic.languageModel(modelId);
18
+ }
19
+ case 'openai': {
20
+ const openai = createOpenAI({
21
+ apiKey: provider.apiKey,
22
+ baseURL: provider.baseUrl,
23
+ organization: provider.organizationId,
24
+ project: provider.projectId,
25
+ });
26
+ return openai.languageModel(modelId);
27
+ }
28
+ default:
29
+ throw new Error(`Unsupported provider type: ${provider.type}`);
30
+ }
31
+ }
32
+ //# sourceMappingURL=ModelFactory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ModelFactory.js","sourceRoot":"","sources":["../../src/agent/ModelFactory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEzC,MAAM,UAAU,kBAAkB,CAAC,QAAqB,EAAE,OAAe;IACvE,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,yBAAyB,EAAE;QACtD,YAAY,EAAE,QAAQ,CAAC,IAAI;QAC3B,OAAO;QACP,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM;QAC5B,OAAO,EAAE,QAAQ,CAAC,OAAO;KAC1B,CAAC,CAAC;IAEH,QAAQ,QAAQ,CAAC,IAAI,EAAE,CAAC;QACtB,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,MAAM,SAAS,GAAG,eAAe,CAAC;gBAChC,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,OAAO,EAAE,QAAQ,CAAC,OAAO;aAC1B,CAAC,CAAC;YACH,OAAO,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAC1C,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,MAAM,GAAG,YAAY,CAAC;gBAC1B,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,OAAO,EAAE,QAAQ,CAAC,OAAO;gBACzB,YAAY,EAAE,QAAQ,CAAC,cAAc;gBACrC,OAAO,EAAE,QAAQ,CAAC,SAAS;aAC5B,CAAC,CAAC;YACH,OAAO,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QACvC,CAAC;QACD;YACE,MAAM,IAAI,KAAK,CAAC,8BAA+B,QAA6B,CAAC,IAAI,EAAE,CAAC,CAAC;IACzF,CAAC;AACH,CAAC"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,146 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from "commander";
3
+ import chalk from "chalk";
4
+ import { API } from "@hackmd/api";
5
+ import { AgentExecutor } from "./agent/AgentExecutor";
6
+ import { ConversationContext } from "./agent/ConversationContext";
7
+ import { ApprovalManager } from "./agent/ApprovalManager";
8
+ import { ToolRegistry } from "./tools/base/ToolRegistry";
9
+ import { ConfigurationLoader } from "./config/ConfigurationLoader";
10
+ import { SessionManager } from "./session/SessionManager";
11
+ import { InteractiveShell } from "./ui/shell/InteractiveShell";
12
+ import { setupCommand } from "./commands/setup";
13
+ import { buildLanguageModel } from "./agent/ModelFactory";
14
+ import { Logger } from "./utils/Logger";
15
+ import { readFileSync } from "fs";
16
+ import { dirname, join } from "path";
17
+ import { fileURLToPath } from "url";
18
+ import { ListNotesTool, ReadNoteTool, CreateNoteTool, UpdateNoteTool, DeleteNoteTool, GetUserInfoTool, ListTeamsTool, GetHistoryTool, SearchNotesTool, ExportNoteTool, } from "./tools/hackmd";
19
+ const __filename = fileURLToPath(import.meta.url);
20
+ const __dirname = dirname(__filename);
21
+ const packageJson = JSON.parse(readFileSync(join(__dirname, "../package.json"), "utf-8"));
22
+ const program = new Command();
23
+ program
24
+ .name("hackwriter")
25
+ .description("HackWriter - Writing agent for HackMD")
26
+ .version(packageJson.version)
27
+ .option("-c, --command <text>", "Execute a single command")
28
+ .option("--continue", "Continue previous session")
29
+ .option("--yolo", "Auto-approve all actions")
30
+ .option("--debug", "Enable debug logging")
31
+ .option("-m, --model <name>", "LLM model to use")
32
+ .action(async (options) => {
33
+ try {
34
+ await runAgent(options);
35
+ }
36
+ catch (error) {
37
+ console.error(chalk.red("Fatal error:"), error);
38
+ process.exit(1);
39
+ }
40
+ });
41
+ // Setup command
42
+ program
43
+ .command("setup")
44
+ .description("Configure HackWriter for first-time use")
45
+ .action(setupCommand);
46
+ async function runAgent(options) {
47
+ // Enable debug logging if --debug flag is set
48
+ if (options.debug) {
49
+ Logger.setLevel("debug");
50
+ Logger.info("CLI", "Debug mode enabled");
51
+ }
52
+ // Load configuration
53
+ const config = await ConfigurationLoader.load();
54
+ Logger.debug("CLI", `Config loaded: ${config.defaultModel || "no default"}, ${Object.keys(config.models).length} model(s)`);
55
+ // Check if configuration is needed
56
+ const needsSetup = !config.services.hackmd?.apiToken ||
57
+ (!config.defaultModel && !options.model);
58
+ if (needsSetup) {
59
+ console.log(chalk.yellow("⚙️ Configuration needed. Starting setup wizard...\n"));
60
+ await setupCommand(true); // Pass true to indicate auto-triggered
61
+ // Reload configuration after setup
62
+ const newConfig = await ConfigurationLoader.load();
63
+ // Verify setup was completed
64
+ if (!newConfig.services.hackmd?.apiToken || !newConfig.defaultModel) {
65
+ console.log(chalk.gray("\nSetup cancelled or incomplete."));
66
+ process.exit(0);
67
+ }
68
+ // Use the new config
69
+ Object.assign(config, newConfig);
70
+ }
71
+ // Create or continue session
72
+ const workDir = process.cwd();
73
+ const session = options.continue
74
+ ? ((await SessionManager.continue(workDir)) ??
75
+ (await SessionManager.create(workDir)))
76
+ : await SessionManager.create(workDir);
77
+ Logger.debug("CLI", `Session: ${session.id.slice(0, 8)}...`);
78
+ // Initialize LLM
79
+ const modelName = options.model ?? config.defaultModel;
80
+ const modelConfig = config.models[modelName];
81
+ Logger.debug("CLI", `Model: ${modelConfig.provider}/${modelConfig.model}`);
82
+ const providerConfig = config.providers[modelConfig.provider];
83
+ if (!providerConfig) {
84
+ throw new Error(`Provider configuration '${modelConfig.provider}' is missing`);
85
+ }
86
+ const languageModel = buildLanguageModel(providerConfig, modelConfig.model);
87
+ // Initialize HackMD API
88
+ if (!config.services.hackmd) {
89
+ throw new Error("HackMD service configuration is missing");
90
+ }
91
+ const hackmdClient = new API(config.services.hackmd.apiToken);
92
+ // Create approval manager
93
+ const approvalManager = new ApprovalManager(options.yolo ?? false);
94
+ // Register tools
95
+ const toolRegistry = new ToolRegistry();
96
+ // Note tools (now support both personal and team notes via optional teamPath)
97
+ toolRegistry.register(new ListNotesTool(hackmdClient));
98
+ toolRegistry.register(new ReadNoteTool(hackmdClient));
99
+ toolRegistry.register(new CreateNoteTool(hackmdClient, approvalManager));
100
+ toolRegistry.register(new UpdateNoteTool(hackmdClient, approvalManager));
101
+ toolRegistry.register(new DeleteNoteTool(hackmdClient, approvalManager));
102
+ // User & team management
103
+ toolRegistry.register(new GetUserInfoTool(hackmdClient));
104
+ toolRegistry.register(new ListTeamsTool(hackmdClient));
105
+ toolRegistry.register(new GetHistoryTool(hackmdClient));
106
+ // Advanced features
107
+ toolRegistry.register(new SearchNotesTool(hackmdClient));
108
+ toolRegistry.register(new ExportNoteTool(hackmdClient));
109
+ Logger.debug("CLI", `Registered ${toolRegistry.getAll().length} tools`);
110
+ // Create Agent
111
+ const agent = {
112
+ name: "HackMD Agent",
113
+ modelName: modelConfig.model,
114
+ maxContextSize: modelConfig.maxContextSize,
115
+ systemPrompt: buildSystemPrompt(workDir),
116
+ toolRegistry,
117
+ };
118
+ // Create conversation context
119
+ const context = new ConversationContext(session.historyFile);
120
+ await context.loadFromDisk();
121
+ // Create executor
122
+ const executor = new AgentExecutor(agent, context, languageModel, config.loopControl);
123
+ // Start interactive shell
124
+ const shell = new InteractiveShell(executor);
125
+ await shell.start(options.command);
126
+ }
127
+ function buildSystemPrompt(workDir) {
128
+ return `You are a HackMD assistant. Help users manage their HackMD notes.
129
+
130
+ Available tools:
131
+ - list_notes, read_note, create_note, update_note, delete_note (use teamPath for team notes)
132
+ - get_user_info, list_teams, get_history
133
+ - search_notes, export_note
134
+
135
+ Guidelines:
136
+ - Use markdown formatting
137
+ - Be concise in responses
138
+ - Show note titles and IDs clearly
139
+ - For team notes, include teamPath parameter
140
+ - For file operations, use bash commands (cat, ls, echo, etc.)
141
+ - Combine tools for complex operations (e.g., clone = read + create)
142
+
143
+ Working directory: ${workDir}`;
144
+ }
145
+ program.parse();
146
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function setupCommand(isAutoTriggered?: boolean): Promise<void>;
2
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"AAKA,wBAAsB,YAAY,CAAC,eAAe,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CA0HzE"}
@@ -0,0 +1,110 @@
1
+ import { input, password, select } from '@inquirer/prompts';
2
+ import chalk from 'chalk';
3
+ import { ConfigurationLoader } from '../config/ConfigurationLoader';
4
+ export async function setupCommand(isAutoTriggered = false) {
5
+ console.log(chalk.bold.cyan('\n🔧 HackWriter Setup\n'));
6
+ const providerType = await select({
7
+ message: 'Select your primary LLM provider',
8
+ choices: [
9
+ { name: 'Anthropic (Claude)', value: 'anthropic' },
10
+ { name: 'OpenAI (GPT-4/5)', value: 'openai' },
11
+ ],
12
+ default: 'anthropic',
13
+ });
14
+ const providerName = await input({
15
+ message: 'Name this provider configuration',
16
+ default: `${providerType}-default`,
17
+ });
18
+ const providerLabel = providerType === 'anthropic' ? 'Anthropic (Claude)' : 'OpenAI';
19
+ const llmApiKey = await password({
20
+ message: `Enter ${providerLabel} API key`,
21
+ mask: '*',
22
+ });
23
+ if (!llmApiKey) {
24
+ console.log(chalk.red('\n❌ API key is required'));
25
+ process.exit(1);
26
+ }
27
+ // Model
28
+ const model = await input({
29
+ message: 'Enter model name',
30
+ default: providerType === 'anthropic' ? 'claude-3-5-haiku-latest' : 'gpt-4.1-mini',
31
+ });
32
+ // Max context size
33
+ const contextDefault = providerType === 'anthropic' ? 200000 : 128000;
34
+ const maxContextSizeStr = await input({
35
+ message: 'Maximum context size (tokens)',
36
+ default: String(contextDefault),
37
+ });
38
+ const parsedContextSize = Number.parseInt(maxContextSizeStr, 10);
39
+ const maxContextSize = Number.isFinite(parsedContextSize) ? parsedContextSize : contextDefault;
40
+ const baseUrl = await input({
41
+ message: 'Custom base URL (optional)',
42
+ default: '',
43
+ });
44
+ let organizationId;
45
+ let projectId;
46
+ if (providerType === 'openai') {
47
+ organizationId = (await input({
48
+ message: 'OpenAI organization ID (optional)',
49
+ default: '',
50
+ })).trim() || undefined;
51
+ projectId = (await input({
52
+ message: 'OpenAI project ID (optional)',
53
+ default: '',
54
+ })).trim() || undefined;
55
+ }
56
+ // HackMD Token
57
+ const hackmdToken = await password({
58
+ message: 'Enter HackMD API token',
59
+ mask: '*',
60
+ });
61
+ if (!hackmdToken) {
62
+ console.log(chalk.red('\n❌ HackMD token is required'));
63
+ process.exit(1);
64
+ }
65
+ const answers = {
66
+ provider: providerName,
67
+ llmApiKey,
68
+ model,
69
+ maxContextSize,
70
+ hackmdToken,
71
+ };
72
+ const config = {
73
+ defaultModel: 'default',
74
+ models: {
75
+ default: {
76
+ provider: answers.provider,
77
+ model: answers.model,
78
+ maxContextSize: answers.maxContextSize,
79
+ },
80
+ },
81
+ providers: {
82
+ [answers.provider]: {
83
+ type: providerType,
84
+ apiKey: answers.llmApiKey,
85
+ baseUrl: baseUrl.trim() || undefined,
86
+ organizationId,
87
+ projectId,
88
+ },
89
+ },
90
+ services: {
91
+ hackmd: {
92
+ baseUrl: 'https://api.hackmd.io/v1',
93
+ apiToken: answers.hackmdToken,
94
+ },
95
+ },
96
+ loopControl: {
97
+ maxStepsPerRun: 100,
98
+ maxRetriesPerStep: 3,
99
+ },
100
+ };
101
+ await ConfigurationLoader.save(config);
102
+ console.log(chalk.green('\n✅ Configuration saved!'));
103
+ if (isAutoTriggered) {
104
+ console.log(chalk.cyan('\n🚀 Starting HackMD Agent...\n'));
105
+ }
106
+ else {
107
+ console.log(chalk.gray('\nYou can now run: hackmd-agent\n'));
108
+ }
109
+ }
110
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * Zod schemas for runtime configuration validation
4
+ */
5
+ export declare const HackMDConfigSchema: z.ZodObject<{
6
+ baseUrl: z.ZodString;
7
+ apiToken: z.ZodString;
8
+ }, z.core.$strip>;
9
+ export declare const LLMProviderSchema: z.ZodObject<{
10
+ type: z.ZodEnum<{
11
+ anthropic: "anthropic";
12
+ openai: "openai";
13
+ }>;
14
+ apiKey: z.ZodString;
15
+ baseUrl: z.ZodOptional<z.ZodString>;
16
+ organizationId: z.ZodOptional<z.ZodString>;
17
+ projectId: z.ZodOptional<z.ZodString>;
18
+ }, z.core.$strip>;
19
+ export declare const LLMModelSchema: z.ZodObject<{
20
+ provider: z.ZodString;
21
+ model: z.ZodString;
22
+ maxContextSize: z.ZodNumber;
23
+ }, z.core.$strip>;
24
+ export declare const LoopControlSchema: z.ZodObject<{
25
+ maxStepsPerRun: z.ZodDefault<z.ZodNumber>;
26
+ maxRetriesPerStep: z.ZodDefault<z.ZodNumber>;
27
+ }, z.core.$strip>;
28
+ export declare const ConfigurationSchema: z.ZodObject<{
29
+ defaultModel: z.ZodString;
30
+ models: z.ZodRecord<z.ZodString, z.ZodObject<{
31
+ provider: z.ZodString;
32
+ model: z.ZodString;
33
+ maxContextSize: z.ZodNumber;
34
+ }, z.core.$strip>>;
35
+ providers: z.ZodRecord<z.ZodString, z.ZodObject<{
36
+ type: z.ZodEnum<{
37
+ anthropic: "anthropic";
38
+ openai: "openai";
39
+ }>;
40
+ apiKey: z.ZodString;
41
+ baseUrl: z.ZodOptional<z.ZodString>;
42
+ organizationId: z.ZodOptional<z.ZodString>;
43
+ projectId: z.ZodOptional<z.ZodString>;
44
+ }, z.core.$strip>>;
45
+ services: z.ZodObject<{
46
+ hackmd: z.ZodOptional<z.ZodObject<{
47
+ baseUrl: z.ZodString;
48
+ apiToken: z.ZodString;
49
+ }, z.core.$strip>>;
50
+ }, z.core.$strip>;
51
+ loopControl: z.ZodObject<{
52
+ maxStepsPerRun: z.ZodDefault<z.ZodNumber>;
53
+ maxRetriesPerStep: z.ZodDefault<z.ZodNumber>;
54
+ }, z.core.$strip>;
55
+ }, z.core.$strip>;
56
+ export type ValidatedConfiguration = z.infer<typeof ConfigurationSchema>;
57
+ export type ValidatedHackMDConfig = z.infer<typeof HackMDConfigSchema>;
58
+ export type ValidatedLLMProvider = z.infer<typeof LLMProviderSchema>;
59
+ export type ValidatedLLMModel = z.infer<typeof LLMModelSchema>;
60
+ /**
61
+ * Validate configuration object
62
+ */
63
+ export declare function validateConfiguration(data: unknown): ValidatedConfiguration;
64
+ /**
65
+ * Safely validate configuration with detailed error messages
66
+ */
67
+ export declare function safeValidateConfiguration(data: unknown): {
68
+ success: boolean;
69
+ data?: ValidatedConfiguration;
70
+ errors?: {
71
+ path: string;
72
+ message: string;
73
+ }[];
74
+ };
75
+ //# sourceMappingURL=ConfigSchema.d.ts.map