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.
- package/LICENSE +9 -0
- package/README.md +55 -0
- package/dist/agent/Agent.d.ts +9 -0
- package/dist/agent/Agent.d.ts.map +1 -0
- package/dist/agent/Agent.js +2 -0
- package/dist/agent/Agent.js.map +1 -0
- package/dist/agent/AgentExecutor.d.ts +36 -0
- package/dist/agent/AgentExecutor.d.ts.map +1 -0
- package/dist/agent/AgentExecutor.js +306 -0
- package/dist/agent/AgentExecutor.js.map +1 -0
- package/dist/agent/ApprovalManager.d.ts +8 -0
- package/dist/agent/ApprovalManager.d.ts.map +1 -0
- package/dist/agent/ApprovalManager.js +45 -0
- package/dist/agent/ApprovalManager.js.map +1 -0
- package/dist/agent/ContextCompressor.d.ts +9 -0
- package/dist/agent/ContextCompressor.d.ts.map +1 -0
- package/dist/agent/ContextCompressor.js +58 -0
- package/dist/agent/ContextCompressor.js.map +1 -0
- package/dist/agent/ConversationContext.d.ts +19 -0
- package/dist/agent/ConversationContext.d.ts.map +1 -0
- package/dist/agent/ConversationContext.js +236 -0
- package/dist/agent/ConversationContext.js.map +1 -0
- package/dist/agent/ModelFactory.d.ts +4 -0
- package/dist/agent/ModelFactory.d.ts.map +1 -0
- package/dist/agent/ModelFactory.js +32 -0
- package/dist/agent/ModelFactory.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +146 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/setup.d.ts +2 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +110 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/config/ConfigSchema.d.ts +75 -0
- package/dist/config/ConfigSchema.d.ts.map +1 -0
- package/dist/config/ConfigSchema.js +54 -0
- package/dist/config/ConfigSchema.js.map +1 -0
- package/dist/config/Configuration.d.ts +30 -0
- package/dist/config/Configuration.d.ts.map +1 -0
- package/dist/config/Configuration.js +2 -0
- package/dist/config/Configuration.js.map +1 -0
- package/dist/config/ConfigurationLoader.d.ts +8 -0
- package/dist/config/ConfigurationLoader.d.ts.map +1 -0
- package/dist/config/ConfigurationLoader.js +75 -0
- package/dist/config/ConfigurationLoader.js.map +1 -0
- package/dist/messaging/MessageBus.d.ts +11 -0
- package/dist/messaging/MessageBus.d.ts.map +1 -0
- package/dist/messaging/MessageBus.js +23 -0
- package/dist/messaging/MessageBus.js.map +1 -0
- package/dist/messaging/MessageTypes.d.ts +39 -0
- package/dist/messaging/MessageTypes.d.ts.map +1 -0
- package/dist/messaging/MessageTypes.js +2 -0
- package/dist/messaging/MessageTypes.js.map +1 -0
- package/dist/session/SessionManager.d.ts +11 -0
- package/dist/session/SessionManager.d.ts.map +1 -0
- package/dist/session/SessionManager.js +56 -0
- package/dist/session/SessionManager.js.map +1 -0
- package/dist/tools/base/Tool.d.ts +19 -0
- package/dist/tools/base/Tool.d.ts.map +1 -0
- package/dist/tools/base/Tool.js +15 -0
- package/dist/tools/base/Tool.js.map +1 -0
- package/dist/tools/base/ToolRegistry.d.ts +16 -0
- package/dist/tools/base/ToolRegistry.d.ts.map +1 -0
- package/dist/tools/base/ToolRegistry.js +29 -0
- package/dist/tools/base/ToolRegistry.js.map +1 -0
- package/dist/tools/file/ListFilesTool.d.ts +17 -0
- package/dist/tools/file/ListFilesTool.d.ts.map +1 -0
- package/dist/tools/file/ListFilesTool.js +80 -0
- package/dist/tools/file/ListFilesTool.js.map +1 -0
- package/dist/tools/file/ReadFileTool.d.ts +13 -0
- package/dist/tools/file/ReadFileTool.d.ts.map +1 -0
- package/dist/tools/file/ReadFileTool.js +32 -0
- package/dist/tools/file/ReadFileTool.js.map +1 -0
- package/dist/tools/file/WriteFileTool.d.ts +18 -0
- package/dist/tools/file/WriteFileTool.d.ts.map +1 -0
- package/dist/tools/file/WriteFileTool.js +54 -0
- package/dist/tools/file/WriteFileTool.js.map +1 -0
- package/dist/tools/file/index.d.ts +4 -0
- package/dist/tools/file/index.d.ts.map +1 -0
- package/dist/tools/file/index.js +4 -0
- package/dist/tools/file/index.js.map +1 -0
- package/dist/tools/hackmd/CreateNoteTool.d.ts +27 -0
- package/dist/tools/hackmd/CreateNoteTool.d.ts.map +1 -0
- package/dist/tools/hackmd/CreateNoteTool.js +85 -0
- package/dist/tools/hackmd/CreateNoteTool.js.map +1 -0
- package/dist/tools/hackmd/DeleteNoteTool.d.ts +19 -0
- package/dist/tools/hackmd/DeleteNoteTool.d.ts.map +1 -0
- package/dist/tools/hackmd/DeleteNoteTool.js +54 -0
- package/dist/tools/hackmd/DeleteNoteTool.js.map +1 -0
- package/dist/tools/hackmd/ExportNoteTool.d.ts +18 -0
- package/dist/tools/hackmd/ExportNoteTool.d.ts.map +1 -0
- package/dist/tools/hackmd/ExportNoteTool.js +75 -0
- package/dist/tools/hackmd/ExportNoteTool.js.map +1 -0
- package/dist/tools/hackmd/GetHistoryTool.d.ts +16 -0
- package/dist/tools/hackmd/GetHistoryTool.d.ts.map +1 -0
- package/dist/tools/hackmd/GetHistoryTool.js +51 -0
- package/dist/tools/hackmd/GetHistoryTool.js.map +1 -0
- package/dist/tools/hackmd/GetUserInfoTool.d.ts +13 -0
- package/dist/tools/hackmd/GetUserInfoTool.d.ts.map +1 -0
- package/dist/tools/hackmd/GetUserInfoTool.js +30 -0
- package/dist/tools/hackmd/GetUserInfoTool.js.map +1 -0
- package/dist/tools/hackmd/ListNotesTool.d.ts +17 -0
- package/dist/tools/hackmd/ListNotesTool.d.ts.map +1 -0
- package/dist/tools/hackmd/ListNotesTool.js +48 -0
- package/dist/tools/hackmd/ListNotesTool.js.map +1 -0
- package/dist/tools/hackmd/ListTeamsTool.d.ts +13 -0
- package/dist/tools/hackmd/ListTeamsTool.d.ts.map +1 -0
- package/dist/tools/hackmd/ListTeamsTool.js +34 -0
- package/dist/tools/hackmd/ListTeamsTool.js.map +1 -0
- package/dist/tools/hackmd/ReadNoteTool.d.ts +16 -0
- package/dist/tools/hackmd/ReadNoteTool.d.ts.map +1 -0
- package/dist/tools/hackmd/ReadNoteTool.js +36 -0
- package/dist/tools/hackmd/ReadNoteTool.js.map +1 -0
- package/dist/tools/hackmd/SearchNotesTool.d.ts +17 -0
- package/dist/tools/hackmd/SearchNotesTool.d.ts.map +1 -0
- package/dist/tools/hackmd/SearchNotesTool.js +49 -0
- package/dist/tools/hackmd/SearchNotesTool.js.map +1 -0
- package/dist/tools/hackmd/UpdateNoteTool.d.ts +20 -0
- package/dist/tools/hackmd/UpdateNoteTool.d.ts.map +1 -0
- package/dist/tools/hackmd/UpdateNoteTool.js +62 -0
- package/dist/tools/hackmd/UpdateNoteTool.js.map +1 -0
- package/dist/tools/hackmd/errorHandler.d.ts +6 -0
- package/dist/tools/hackmd/errorHandler.d.ts.map +1 -0
- package/dist/tools/hackmd/errorHandler.js +59 -0
- package/dist/tools/hackmd/errorHandler.js.map +1 -0
- package/dist/tools/hackmd/index.d.ts +11 -0
- package/dist/tools/hackmd/index.d.ts.map +1 -0
- package/dist/tools/hackmd/index.js +24 -0
- package/dist/tools/hackmd/index.js.map +1 -0
- package/dist/ui/shell/CommandRegistry.d.ts +20 -0
- package/dist/ui/shell/CommandRegistry.d.ts.map +1 -0
- package/dist/ui/shell/CommandRegistry.js +77 -0
- package/dist/ui/shell/CommandRegistry.js.map +1 -0
- package/dist/ui/shell/InteractiveShell.d.ts +15 -0
- package/dist/ui/shell/InteractiveShell.d.ts.map +1 -0
- package/dist/ui/shell/InteractiveShell.js +94 -0
- package/dist/ui/shell/InteractiveShell.js.map +1 -0
- package/dist/ui/shell/OutputRenderer.d.ts +8 -0
- package/dist/ui/shell/OutputRenderer.d.ts.map +1 -0
- package/dist/ui/shell/OutputRenderer.js +85 -0
- package/dist/ui/shell/OutputRenderer.js.map +1 -0
- package/dist/utils/ErrorTypes.d.ts +58 -0
- package/dist/utils/ErrorTypes.d.ts.map +1 -0
- package/dist/utils/ErrorTypes.js +156 -0
- package/dist/utils/ErrorTypes.js.map +1 -0
- package/dist/utils/Logger.d.ts +13 -0
- package/dist/utils/Logger.d.ts.map +1 -0
- package/dist/utils/Logger.js +72 -0
- package/dist/utils/Logger.js.map +1 -0
- 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 @@
|
|
|
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 @@
|
|
|
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
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -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
|