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.
- package/config.example.json +26 -0
- package/dist/agent/agent.d.ts +85 -0
- package/dist/agent/agent.js +725 -0
- package/dist/agent/agent.js.map +1 -0
- package/dist/agent/memory.d.ts +17 -0
- package/dist/agent/memory.js +92 -0
- package/dist/agent/memory.js.map +1 -0
- package/dist/agent/scheduler.d.ts +35 -0
- package/dist/agent/scheduler.js +154 -0
- package/dist/agent/scheduler.js.map +1 -0
- package/dist/agent/skill-generator.d.ts +37 -0
- package/dist/agent/skill-generator.js +263 -0
- package/dist/agent/skill-generator.js.map +1 -0
- package/dist/agent/task-runner.d.ts +31 -0
- package/dist/agent/task-runner.js +242 -0
- package/dist/agent/task-runner.js.map +1 -0
- package/dist/browser/actions.d.ts +28 -0
- package/dist/browser/actions.js +212 -0
- package/dist/browser/actions.js.map +1 -0
- package/dist/browser/manager.d.ts +17 -0
- package/dist/browser/manager.js +249 -0
- package/dist/browser/manager.js.map +1 -0
- package/dist/browser/script-runner.d.ts +49 -0
- package/dist/browser/script-runner.js +137 -0
- package/dist/browser/script-runner.js.map +1 -0
- package/dist/browser/snapshot.d.ts +15 -0
- package/dist/browser/snapshot.js +38 -0
- package/dist/browser/snapshot.js.map +1 -0
- package/dist/config/types.d.ts +62 -0
- package/dist/config/types.js +47 -0
- package/dist/config/types.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +219 -0
- package/dist/index.js.map +1 -0
- package/dist/llm/client.d.ts +3 -0
- package/dist/llm/client.js +503 -0
- package/dist/llm/client.js.map +1 -0
- package/dist/llm/tools.d.ts +5 -0
- package/dist/llm/tools.js +94 -0
- package/dist/llm/tools.js.map +1 -0
- package/dist/llm/types.d.ts +49 -0
- package/dist/llm/types.js +2 -0
- package/dist/llm/types.js.map +1 -0
- package/dist/logging/logger.d.ts +17 -0
- package/dist/logging/logger.js +46 -0
- package/dist/logging/logger.js.map +1 -0
- package/dist/telegram/bot.d.ts +15 -0
- package/dist/telegram/bot.js +279 -0
- package/dist/telegram/bot.js.map +1 -0
- package/dist/tui/tui.d.ts +12 -0
- package/dist/tui/tui.js +176 -0
- package/dist/tui/tui.js.map +1 -0
- 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 @@
|
|
|
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
|
+
}
|
package/dist/tui/tui.js
ADDED
|
@@ -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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"}
|