dipclaw 0.1.0

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 (53) hide show
  1. package/config.example.json +26 -0
  2. package/dist/agent/agent.d.ts +85 -0
  3. package/dist/agent/agent.js +725 -0
  4. package/dist/agent/agent.js.map +1 -0
  5. package/dist/agent/memory.d.ts +17 -0
  6. package/dist/agent/memory.js +92 -0
  7. package/dist/agent/memory.js.map +1 -0
  8. package/dist/agent/scheduler.d.ts +35 -0
  9. package/dist/agent/scheduler.js +154 -0
  10. package/dist/agent/scheduler.js.map +1 -0
  11. package/dist/agent/skill-generator.d.ts +37 -0
  12. package/dist/agent/skill-generator.js +263 -0
  13. package/dist/agent/skill-generator.js.map +1 -0
  14. package/dist/agent/task-runner.d.ts +31 -0
  15. package/dist/agent/task-runner.js +242 -0
  16. package/dist/agent/task-runner.js.map +1 -0
  17. package/dist/browser/actions.d.ts +28 -0
  18. package/dist/browser/actions.js +212 -0
  19. package/dist/browser/actions.js.map +1 -0
  20. package/dist/browser/manager.d.ts +17 -0
  21. package/dist/browser/manager.js +249 -0
  22. package/dist/browser/manager.js.map +1 -0
  23. package/dist/browser/script-runner.d.ts +49 -0
  24. package/dist/browser/script-runner.js +137 -0
  25. package/dist/browser/script-runner.js.map +1 -0
  26. package/dist/browser/snapshot.d.ts +15 -0
  27. package/dist/browser/snapshot.js +38 -0
  28. package/dist/browser/snapshot.js.map +1 -0
  29. package/dist/config/types.d.ts +62 -0
  30. package/dist/config/types.js +47 -0
  31. package/dist/config/types.js.map +1 -0
  32. package/dist/index.d.ts +2 -0
  33. package/dist/index.js +219 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/llm/client.d.ts +3 -0
  36. package/dist/llm/client.js +503 -0
  37. package/dist/llm/client.js.map +1 -0
  38. package/dist/llm/tools.d.ts +5 -0
  39. package/dist/llm/tools.js +94 -0
  40. package/dist/llm/tools.js.map +1 -0
  41. package/dist/llm/types.d.ts +49 -0
  42. package/dist/llm/types.js +2 -0
  43. package/dist/llm/types.js.map +1 -0
  44. package/dist/logging/logger.d.ts +17 -0
  45. package/dist/logging/logger.js +46 -0
  46. package/dist/logging/logger.js.map +1 -0
  47. package/dist/telegram/bot.d.ts +15 -0
  48. package/dist/telegram/bot.js +279 -0
  49. package/dist/telegram/bot.js.map +1 -0
  50. package/dist/tui/tui.d.ts +12 -0
  51. package/dist/tui/tui.js +176 -0
  52. package/dist/tui/tui.js.map +1 -0
  53. package/package.json +53 -0
@@ -0,0 +1,49 @@
1
+ export type Role = "system" | "user" | "assistant" | "tool";
2
+ export interface ChatMessage {
3
+ role: Role;
4
+ content: string | ContentBlock[];
5
+ toolCallId?: string;
6
+ toolCalls?: ToolCall[];
7
+ }
8
+ export interface ContentBlock {
9
+ type: "text" | "image";
10
+ text?: string;
11
+ /** base64 encoded image data */
12
+ imageData?: string;
13
+ mediaType?: string;
14
+ }
15
+ export interface ToolCall {
16
+ id: string;
17
+ name: string;
18
+ arguments: Record<string, unknown>;
19
+ }
20
+ export interface ToolResult {
21
+ toolCallId: string;
22
+ content: string;
23
+ isError?: boolean;
24
+ }
25
+ export interface ToolDefinition {
26
+ name: string;
27
+ description: string;
28
+ parameters: Record<string, unknown>;
29
+ }
30
+ export interface LlmResponse {
31
+ content: string;
32
+ toolCalls: ToolCall[];
33
+ stopReason: "stop" | "tool_use" | "length" | "error";
34
+ usage?: {
35
+ inputTokens: number;
36
+ outputTokens: number;
37
+ };
38
+ }
39
+ export interface StreamEvent {
40
+ type: "text_delta" | "tool_call_start" | "tool_call_delta" | "tool_call_end" | "done";
41
+ text?: string;
42
+ toolCall?: Partial<ToolCall> & {
43
+ id: string;
44
+ };
45
+ }
46
+ export interface LlmClient {
47
+ chat(messages: ChatMessage[], tools?: ToolDefinition[], systemPrompt?: string): Promise<LlmResponse>;
48
+ chatStream(messages: ChatMessage[], tools?: ToolDefinition[], systemPrompt?: string): AsyncIterable<StreamEvent>;
49
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/llm/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,17 @@
1
+ export interface LogEntry {
2
+ step: number;
3
+ action: string;
4
+ timestamp: string;
5
+ success: boolean;
6
+ [key: string]: unknown;
7
+ }
8
+ export declare class ExecutionLogger {
9
+ private logFile;
10
+ private stepCounter;
11
+ constructor(logsDir: string, taskName: string);
12
+ log(action: string, details?: Record<string, unknown>, success?: boolean): LogEntry;
13
+ getLogFilePath(): string;
14
+ getStepCount(): number;
15
+ static readLog(logFilePath: string): LogEntry[];
16
+ static listLogs(logsDir: string): string[];
17
+ }
@@ -0,0 +1,46 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ export class ExecutionLogger {
4
+ logFile;
5
+ stepCounter = 0;
6
+ constructor(logsDir, taskName) {
7
+ const date = new Date().toISOString().slice(0, 10);
8
+ const time = new Date().toISOString().slice(11, 19).replace(/:/g, "-");
9
+ const safeName = taskName.replace(/[^a-zA-Z0-9_-]/g, "_");
10
+ this.logFile = path.join(logsDir, `${date}_${time}_${safeName}.jsonl`);
11
+ }
12
+ log(action, details = {}, success = true) {
13
+ this.stepCounter++;
14
+ const entry = {
15
+ step: this.stepCounter,
16
+ action,
17
+ timestamp: new Date().toISOString(),
18
+ success,
19
+ ...details,
20
+ };
21
+ fs.appendFileSync(this.logFile, JSON.stringify(entry) + "\n", "utf-8");
22
+ return entry;
23
+ }
24
+ getLogFilePath() {
25
+ return this.logFile;
26
+ }
27
+ getStepCount() {
28
+ return this.stepCounter;
29
+ }
30
+ static readLog(logFilePath) {
31
+ const content = fs.readFileSync(logFilePath, "utf-8").trim();
32
+ if (!content)
33
+ return [];
34
+ return content.split("\n").map((line) => JSON.parse(line));
35
+ }
36
+ static listLogs(logsDir) {
37
+ if (!fs.existsSync(logsDir))
38
+ return [];
39
+ return fs
40
+ .readdirSync(logsDir)
41
+ .filter((f) => f.endsWith(".jsonl"))
42
+ .sort()
43
+ .reverse();
44
+ }
45
+ }
46
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/logging/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAU7B,MAAM,OAAO,eAAe;IAClB,OAAO,CAAS;IAChB,WAAW,GAAG,CAAC,CAAC;IAExB,YAAY,OAAe,EAAE,QAAgB;QAC3C,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACnD,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACvE,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC;QAC1D,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,IAAI,IAAI,QAAQ,QAAQ,CAAC,CAAC;IACzE,CAAC;IAED,GAAG,CAAC,MAAc,EAAE,UAAmC,EAAE,EAAE,OAAO,GAAG,IAAI;QACvE,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,MAAM,KAAK,GAAa;YACtB,IAAI,EAAE,IAAI,CAAC,WAAW;YACtB,MAAM;YACN,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,OAAO;YACP,GAAG,OAAO;SACX,CAAC;QACF,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;QACvE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,cAAc;QACZ,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,YAAY;QACV,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,MAAM,CAAC,OAAO,CAAC,WAAmB;QAChC,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QAC7D,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,CAAC;QACxB,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,OAAe;QAC7B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC;YAAE,OAAO,EAAE,CAAC;QACvC,OAAO,EAAE;aACN,WAAW,CAAC,OAAO,CAAC;aACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;aACnC,IAAI,EAAE;aACN,OAAO,EAAE,CAAC;IACf,CAAC;CACF"}
@@ -0,0 +1,15 @@
1
+ import type { Agent } from "../agent/agent.js";
2
+ export declare class TelegramBot {
3
+ private bot;
4
+ private agent;
5
+ private allowedUsers;
6
+ constructor(token: string, agent: Agent, allowedUsers: number[]);
7
+ private isAllowed;
8
+ private setupHandlers;
9
+ start(): Promise<void>;
10
+ stop(): void;
11
+ /** Send a notification message to allowed users */
12
+ notify(message: string): Promise<void>;
13
+ private handleStreamingChat;
14
+ private splitMessage;
15
+ }
@@ -0,0 +1,279 @@
1
+ import { Bot } from "grammy";
2
+ import path from "node:path";
3
+ import { ExecutionLogger } from "../logging/logger.js";
4
+ const TELEGRAM_MAX_TEXT = 4096;
5
+ const MIN_INITIAL_CHARS = 20;
6
+ const THROTTLE_MS = 1000;
7
+ export class TelegramBot {
8
+ bot;
9
+ agent;
10
+ allowedUsers;
11
+ constructor(token, agent, allowedUsers) {
12
+ this.bot = new Bot(token);
13
+ this.agent = agent;
14
+ this.allowedUsers = new Set(allowedUsers);
15
+ this.setupHandlers();
16
+ }
17
+ isAllowed(ctx) {
18
+ if (this.allowedUsers.size === 0)
19
+ return true; // No restriction if empty
20
+ const userId = ctx.from?.id;
21
+ return userId !== undefined && this.allowedUsers.has(userId);
22
+ }
23
+ setupHandlers() {
24
+ // Auth middleware
25
+ this.bot.use(async (ctx, next) => {
26
+ if (!this.isAllowed(ctx)) {
27
+ await ctx.reply("⛔ Unauthorized. Your user ID: " + ctx.from?.id);
28
+ return;
29
+ }
30
+ await next();
31
+ });
32
+ // Commands
33
+ this.bot.command("start", async (ctx) => {
34
+ await ctx.reply(`Hi, I'm ${this.agent.getName()}. Send me a message to get started.`);
35
+ });
36
+ this.bot.command("new", async (ctx) => {
37
+ this.agent.clearChat();
38
+ await ctx.reply("🔄 New session started. Chat history cleared.");
39
+ });
40
+ this.bot.command("tasks", async (ctx) => {
41
+ await ctx.reply(this.agent.listTasks() || "(no tasks)");
42
+ });
43
+ this.bot.command("add", async (ctx) => {
44
+ const text = ctx.match;
45
+ if (!text) {
46
+ await ctx.reply("Usage: /add <name> | <cron> | <prompt>");
47
+ return;
48
+ }
49
+ const parts = text.split("|").map((s) => s.trim());
50
+ if (parts.length < 3) {
51
+ await ctx.reply("Usage: /add <name> | <cron> | <prompt>");
52
+ return;
53
+ }
54
+ const [name, cron, ...promptParts] = parts;
55
+ const prompt = promptParts.join("|");
56
+ try {
57
+ const result = this.agent.addTask(name, cron, prompt);
58
+ await ctx.reply(result);
59
+ }
60
+ catch (err) {
61
+ await ctx.reply(`Error: ${err instanceof Error ? err.message : String(err)}`);
62
+ }
63
+ });
64
+ this.bot.command("remove", async (ctx) => {
65
+ const id = ctx.match?.trim();
66
+ if (!id) {
67
+ await ctx.reply("Usage: /remove <task-id>");
68
+ return;
69
+ }
70
+ await ctx.reply(this.agent.removeTask(id));
71
+ });
72
+ this.bot.command("enable", async (ctx) => {
73
+ const id = ctx.match?.trim();
74
+ if (!id) {
75
+ await ctx.reply("Usage: /enable <task-id>");
76
+ return;
77
+ }
78
+ await ctx.reply(this.agent.toggleTask(id, true));
79
+ });
80
+ this.bot.command("disable", async (ctx) => {
81
+ const id = ctx.match?.trim();
82
+ if (!id) {
83
+ await ctx.reply("Usage: /disable <task-id>");
84
+ return;
85
+ }
86
+ await ctx.reply(this.agent.toggleTask(id, false));
87
+ });
88
+ this.bot.command("run", async (ctx) => {
89
+ const id = ctx.match?.trim();
90
+ if (!id) {
91
+ await ctx.reply("Usage: /run <task-id>");
92
+ return;
93
+ }
94
+ await ctx.reply("⏳ Running task...");
95
+ try {
96
+ const result = await this.agent.runTaskById(id);
97
+ // Split long messages (Telegram 4096 char limit)
98
+ const chunks = this.splitMessage(result);
99
+ for (const chunk of chunks) {
100
+ await ctx.reply(chunk);
101
+ }
102
+ }
103
+ catch (err) {
104
+ await ctx.reply(`❌ Error: ${err instanceof Error ? err.message : String(err)}`);
105
+ }
106
+ });
107
+ this.bot.command("logs", async (ctx) => {
108
+ const logsDir = path.join(this.agent.getWorkspace(), "logs");
109
+ const logs = ExecutionLogger.listLogs(logsDir);
110
+ if (logs.length === 0) {
111
+ await ctx.reply("(no logs found)");
112
+ return;
113
+ }
114
+ await ctx.reply("Recent logs:\n" + logs.slice(0, 20).map((l) => ` ${l}`).join("\n"));
115
+ });
116
+ this.bot.command("skills", async (ctx) => {
117
+ await ctx.reply(this.agent.listSkills() || "(no skills)");
118
+ });
119
+ this.bot.command("genskill", async (ctx) => {
120
+ const logFile = ctx.match?.trim();
121
+ if (!logFile) {
122
+ await ctx.reply("Usage: /genskill <log-filename>");
123
+ return;
124
+ }
125
+ await ctx.reply("⏳ Generating skill...");
126
+ try {
127
+ const result = await this.agent.generateSkill(logFile);
128
+ await ctx.reply(result);
129
+ }
130
+ catch (err) {
131
+ await ctx.reply(`❌ Error: ${err instanceof Error ? err.message : String(err)}`);
132
+ }
133
+ });
134
+ this.bot.command("memory", async (ctx) => {
135
+ await ctx.reply(this.agent.listMemories() || "(no memories)");
136
+ });
137
+ // Regular messages → chat with agent (streaming)
138
+ this.bot.on("message:text", async (ctx) => {
139
+ try {
140
+ await this.handleStreamingChat(ctx, ctx.message.text);
141
+ }
142
+ catch (err) {
143
+ await ctx.reply(`❌ Error: ${err instanceof Error ? err.message : String(err)}`);
144
+ }
145
+ });
146
+ }
147
+ async start() {
148
+ console.log("📱 Telegram bot starting...");
149
+ // Register command menu so "/" shows autocomplete hints
150
+ await this.bot.api.setMyCommands([
151
+ { command: "new", description: "Start a new session (clear chat history)" },
152
+ { command: "tasks", description: "List scheduled tasks" },
153
+ { command: "remove", description: "Remove a task: /remove <id>" },
154
+ { command: "enable", description: "Enable a task: /enable <id>" },
155
+ { command: "disable", description: "Disable a task: /disable <id>" },
156
+ { command: "run", description: "Run a task now: /run <id>" },
157
+ { command: "logs", description: "View execution logs" },
158
+ { command: "skills", description: "List available skills" },
159
+ { command: "memory", description: "View saved memories" },
160
+ ]);
161
+ this.bot.start({
162
+ onStart: (info) => {
163
+ console.log(`📱 Telegram bot started: @${info.username}`);
164
+ },
165
+ });
166
+ }
167
+ stop() {
168
+ this.bot.stop();
169
+ }
170
+ /** Send a notification message to allowed users */
171
+ async notify(message) {
172
+ for (const userId of this.allowedUsers) {
173
+ try {
174
+ await this.bot.api.sendMessage(userId, message);
175
+ }
176
+ catch {
177
+ // User may not have started the bot yet
178
+ }
179
+ }
180
+ }
181
+ async handleStreamingChat(ctx, text) {
182
+ const chatId = ctx.chat.id;
183
+ // Show typing indicator
184
+ await ctx.api.sendChatAction(chatId, "typing").catch(() => { });
185
+ let accumulated = "";
186
+ let messageId = null;
187
+ let lastEditedText = "";
188
+ let lastEditAt = 0;
189
+ let editTimer = null;
190
+ const editMessage = async (content) => {
191
+ if (!messageId || content === lastEditedText)
192
+ return;
193
+ // Telegram max message length
194
+ const truncated = content.length > TELEGRAM_MAX_TEXT
195
+ ? content.slice(0, TELEGRAM_MAX_TEXT - 4) + " ..."
196
+ : content;
197
+ try {
198
+ await ctx.api.editMessageText(chatId, messageId, truncated);
199
+ lastEditedText = truncated;
200
+ lastEditAt = Date.now();
201
+ }
202
+ catch (err) {
203
+ // Ignore "message is not modified" errors
204
+ const msg = err instanceof Error ? err.message : String(err);
205
+ if (!msg.includes("message is not modified")) {
206
+ throw err;
207
+ }
208
+ }
209
+ };
210
+ const scheduleEdit = () => {
211
+ if (editTimer)
212
+ return;
213
+ const elapsed = Date.now() - lastEditAt;
214
+ const delay = Math.max(0, THROTTLE_MS - elapsed);
215
+ editTimer = setTimeout(async () => {
216
+ editTimer = null;
217
+ await editMessage(accumulated).catch(() => { });
218
+ }, delay);
219
+ };
220
+ try {
221
+ for await (const delta of this.agent.chatStream(text)) {
222
+ accumulated += delta;
223
+ if (!messageId && accumulated.trim().length >= MIN_INITIAL_CHARS) {
224
+ // Send initial message
225
+ const sent = await ctx.reply(accumulated);
226
+ messageId = sent.message_id;
227
+ lastEditedText = accumulated;
228
+ lastEditAt = Date.now();
229
+ }
230
+ else if (messageId) {
231
+ scheduleEdit();
232
+ }
233
+ // Refresh typing indicator periodically
234
+ if (Date.now() - lastEditAt > 4000) {
235
+ await ctx.api.sendChatAction(chatId, "typing").catch(() => { });
236
+ }
237
+ }
238
+ // Clear any pending timer and do final edit
239
+ if (editTimer) {
240
+ clearTimeout(editTimer);
241
+ editTimer = null;
242
+ }
243
+ if (!messageId) {
244
+ // Stream ended before we sent anything
245
+ const finalText = accumulated.trim() || "(no response)";
246
+ await ctx.reply(finalText);
247
+ }
248
+ else {
249
+ // Final edit with complete text
250
+ if (accumulated.length > TELEGRAM_MAX_TEXT) {
251
+ // Edit existing message with first chunk, send remainder as new messages
252
+ await editMessage(accumulated.slice(0, TELEGRAM_MAX_TEXT));
253
+ const remainder = accumulated.slice(TELEGRAM_MAX_TEXT);
254
+ for (const chunk of this.splitMessage(remainder, TELEGRAM_MAX_TEXT)) {
255
+ await ctx.reply(chunk);
256
+ }
257
+ }
258
+ else {
259
+ await editMessage(accumulated);
260
+ }
261
+ }
262
+ }
263
+ catch (err) {
264
+ if (editTimer)
265
+ clearTimeout(editTimer);
266
+ throw err;
267
+ }
268
+ }
269
+ splitMessage(text, maxLen = 4000) {
270
+ if (text.length <= maxLen)
271
+ return [text];
272
+ const chunks = [];
273
+ for (let i = 0; i < text.length; i += maxLen) {
274
+ chunks.push(text.slice(i, i + maxLen));
275
+ }
276
+ return chunks;
277
+ }
278
+ }
279
+ //# sourceMappingURL=bot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bot.js","sourceRoot":"","sources":["../../src/telegram/bot.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { Agent } from "../agent/agent.js";
2
+ export declare class TUI {
3
+ private agent;
4
+ private rl;
5
+ constructor(agent: Agent);
6
+ start(): void;
7
+ private prompt;
8
+ private handleChat;
9
+ private handleCommand;
10
+ private handleAddTask;
11
+ stop(): void;
12
+ }
@@ -0,0 +1,176 @@
1
+ import readline from "node:readline";
2
+ import path from "node:path";
3
+ import { ExecutionLogger } from "../logging/logger.js";
4
+ export class TUI {
5
+ agent;
6
+ rl;
7
+ constructor(agent) {
8
+ this.agent = agent;
9
+ this.rl = readline.createInterface({
10
+ input: process.stdin,
11
+ output: process.stdout,
12
+ });
13
+ }
14
+ start() {
15
+ console.log(`\nHi, I'm ${this.agent.getName()}. Type /help for commands.\n`);
16
+ this.prompt();
17
+ }
18
+ prompt() {
19
+ this.rl.question("you> ", async (input) => {
20
+ const trimmed = input.trim();
21
+ if (!trimmed) {
22
+ this.prompt();
23
+ return;
24
+ }
25
+ if (trimmed.startsWith("/")) {
26
+ await this.handleCommand(trimmed);
27
+ }
28
+ else {
29
+ await this.handleChat(trimmed);
30
+ }
31
+ this.prompt();
32
+ });
33
+ }
34
+ async handleChat(message) {
35
+ try {
36
+ process.stdout.write("agent> ");
37
+ for await (const chunk of this.agent.chatStream(message)) {
38
+ process.stdout.write(chunk);
39
+ }
40
+ console.log(); // newline after streaming ends
41
+ }
42
+ catch (err) {
43
+ console.error("\nError:", err instanceof Error ? err.message : String(err));
44
+ }
45
+ }
46
+ async handleCommand(input) {
47
+ const parts = input.slice(1).split(/\s+/);
48
+ const cmd = parts[0].toLowerCase();
49
+ const args = parts.slice(1);
50
+ try {
51
+ switch (cmd) {
52
+ case "tasks":
53
+ console.log(this.agent.listTasks());
54
+ break;
55
+ case "add":
56
+ await this.handleAddTask();
57
+ break;
58
+ case "remove":
59
+ if (!args[0]) {
60
+ console.log("Usage: /remove <task-id>");
61
+ break;
62
+ }
63
+ console.log(this.agent.removeTask(args[0]));
64
+ break;
65
+ case "enable":
66
+ if (!args[0]) {
67
+ console.log("Usage: /enable <task-id>");
68
+ break;
69
+ }
70
+ console.log(this.agent.toggleTask(args[0], true));
71
+ break;
72
+ case "disable":
73
+ if (!args[0]) {
74
+ console.log("Usage: /disable <task-id>");
75
+ break;
76
+ }
77
+ console.log(this.agent.toggleTask(args[0], false));
78
+ break;
79
+ case "run":
80
+ if (!args[0]) {
81
+ console.log("Usage: /run <task-id>");
82
+ break;
83
+ }
84
+ console.log("Running task...");
85
+ const result = await this.agent.runTaskById(args[0]);
86
+ console.log(result);
87
+ break;
88
+ case "logs": {
89
+ const logsDir = path.join(this.agent.getWorkspace(), "logs");
90
+ const logs = ExecutionLogger.listLogs(logsDir);
91
+ if (logs.length === 0) {
92
+ console.log("(no logs found)");
93
+ }
94
+ else {
95
+ if (args[0]) {
96
+ // Show specific log
97
+ const logFile = logs.find((l) => l.includes(args[0]));
98
+ if (logFile) {
99
+ const entries = ExecutionLogger.readLog(path.join(logsDir, logFile));
100
+ for (const entry of entries) {
101
+ const status = entry.success ? "✓" : "✗";
102
+ console.log(` ${status} Step ${entry.step}: ${entry.action} ${JSON.stringify(Object.fromEntries(Object.entries(entry).filter(([k]) => !["step", "action", "timestamp", "success"].includes(k))))}`);
103
+ }
104
+ }
105
+ else {
106
+ console.log(`Log not found: ${args[0]}`);
107
+ }
108
+ }
109
+ else {
110
+ console.log("Recent logs:");
111
+ for (const log of logs.slice(0, 20)) {
112
+ console.log(` ${log}`);
113
+ }
114
+ }
115
+ }
116
+ break;
117
+ }
118
+ case "skills":
119
+ console.log(this.agent.listSkills());
120
+ break;
121
+ case "genskill":
122
+ if (!args[0]) {
123
+ console.log("Usage: /genskill <log-filename>");
124
+ break;
125
+ }
126
+ console.log("Generating skill from log...");
127
+ const skillResult = await this.agent.generateSkill(args[0]);
128
+ console.log(skillResult);
129
+ break;
130
+ case "memory":
131
+ console.log(this.agent.listMemories());
132
+ break;
133
+ case "help":
134
+ console.log("Commands:");
135
+ console.log(" /tasks - List scheduled tasks");
136
+ console.log(" /add - Add a task (interactive)");
137
+ console.log(" /remove <id> - Remove a task");
138
+ console.log(" /enable <id> - Enable a task");
139
+ console.log(" /disable <id> - Disable a task");
140
+ console.log(" /run <id> - Run a task now");
141
+ console.log(" /logs [id] - View execution logs");
142
+ console.log(" /skills - List available skills");
143
+ console.log(" /genskill <log> - Generate skill from log");
144
+ console.log(" /memory - View saved memories");
145
+ console.log(" /quit - Exit");
146
+ break;
147
+ case "quit":
148
+ case "exit":
149
+ console.log("Shutting down...");
150
+ await this.agent.stop();
151
+ process.exit(0);
152
+ break;
153
+ default:
154
+ console.log(`Unknown command: /${cmd}. Type /help for available commands.`);
155
+ }
156
+ }
157
+ catch (err) {
158
+ console.error("Error:", err instanceof Error ? err.message : String(err));
159
+ }
160
+ }
161
+ async handleAddTask() {
162
+ const ask = (question) => new Promise((resolve) => this.rl.question(question, resolve));
163
+ const name = await ask("Task name: ");
164
+ const cronExpr = await ask("Cron expression (e.g., '0 9 * * *'): ");
165
+ const prompt = await ask("Task description/prompt: ");
166
+ if (!name || !cronExpr || !prompt) {
167
+ console.log("Cancelled: all fields are required.");
168
+ return;
169
+ }
170
+ console.log(this.agent.addTask(name, cronExpr, prompt));
171
+ }
172
+ stop() {
173
+ this.rl.close();
174
+ }
175
+ }
176
+ //# sourceMappingURL=tui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tui.js","sourceRoot":"","sources":["../../src/tui/tui.ts"],"names":[],"mappings":"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"}