@marcopeg/hal 1.0.11
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/README.md +655 -0
- package/dist/agent/index.d.ts +17 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +30 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/bot/commands/clear.d.ts +7 -0
- package/dist/bot/commands/clear.d.ts.map +1 -0
- package/dist/bot/commands/clear.js +23 -0
- package/dist/bot/commands/clear.js.map +1 -0
- package/dist/bot/commands/help.d.ts +3 -0
- package/dist/bot/commands/help.d.ts.map +1 -0
- package/dist/bot/commands/help.js +16 -0
- package/dist/bot/commands/help.js.map +1 -0
- package/dist/bot/commands/loader.d.ts +26 -0
- package/dist/bot/commands/loader.d.ts.map +1 -0
- package/dist/bot/commands/loader.js +206 -0
- package/dist/bot/commands/loader.js.map +1 -0
- package/dist/bot/commands/start.d.ts +3 -0
- package/dist/bot/commands/start.d.ts.map +1 -0
- package/dist/bot/commands/start.js +10 -0
- package/dist/bot/commands/start.js.map +1 -0
- package/dist/bot/commands/watcher.d.ts +11 -0
- package/dist/bot/commands/watcher.d.ts.map +1 -0
- package/dist/bot/commands/watcher.js +106 -0
- package/dist/bot/commands/watcher.js.map +1 -0
- package/dist/bot/handlers/document.d.ts +7 -0
- package/dist/bot/handlers/document.d.ts.map +1 -0
- package/dist/bot/handlers/document.js +128 -0
- package/dist/bot/handlers/document.js.map +1 -0
- package/dist/bot/handlers/index.d.ts +5 -0
- package/dist/bot/handlers/index.d.ts.map +1 -0
- package/dist/bot/handlers/index.js +5 -0
- package/dist/bot/handlers/index.js.map +1 -0
- package/dist/bot/handlers/photo.d.ts +7 -0
- package/dist/bot/handlers/photo.d.ts.map +1 -0
- package/dist/bot/handlers/photo.js +87 -0
- package/dist/bot/handlers/photo.js.map +1 -0
- package/dist/bot/handlers/text.d.ts +7 -0
- package/dist/bot/handlers/text.d.ts.map +1 -0
- package/dist/bot/handlers/text.js +186 -0
- package/dist/bot/handlers/text.js.map +1 -0
- package/dist/bot/handlers/voice.d.ts +7 -0
- package/dist/bot/handlers/voice.d.ts.map +1 -0
- package/dist/bot/handlers/voice.js +147 -0
- package/dist/bot/handlers/voice.js.map +1 -0
- package/dist/bot/middleware/auth.d.ts +7 -0
- package/dist/bot/middleware/auth.d.ts.map +1 -0
- package/dist/bot/middleware/auth.js +23 -0
- package/dist/bot/middleware/auth.js.map +1 -0
- package/dist/bot/middleware/rateLimit.d.ts +11 -0
- package/dist/bot/middleware/rateLimit.d.ts.map +1 -0
- package/dist/bot/middleware/rateLimit.js +49 -0
- package/dist/bot/middleware/rateLimit.js.map +1 -0
- package/dist/bot.d.ts +11 -0
- package/dist/bot.d.ts.map +1 -0
- package/dist/bot.js +93 -0
- package/dist/bot.js.map +1 -0
- package/dist/claude/executor.d.ts +21 -0
- package/dist/claude/executor.d.ts.map +1 -0
- package/dist/claude/executor.js +185 -0
- package/dist/claude/executor.js.map +1 -0
- package/dist/claude/parser.d.ts +13 -0
- package/dist/claude/parser.d.ts.map +1 -0
- package/dist/claude/parser.js +63 -0
- package/dist/claude/parser.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +192 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +216 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +396 -0
- package/dist/config.js.map +1 -0
- package/dist/context/resolver.d.ts +19 -0
- package/dist/context/resolver.d.ts.map +1 -0
- package/dist/context/resolver.js +171 -0
- package/dist/context/resolver.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +17 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +44 -0
- package/dist/logger.js.map +1 -0
- package/dist/telegram/chunker.d.ts +10 -0
- package/dist/telegram/chunker.d.ts.map +1 -0
- package/dist/telegram/chunker.js +88 -0
- package/dist/telegram/chunker.js.map +1 -0
- package/dist/telegram/fileSender.d.ts +8 -0
- package/dist/telegram/fileSender.d.ts.map +1 -0
- package/dist/telegram/fileSender.js +46 -0
- package/dist/telegram/fileSender.js.map +1 -0
- package/dist/transcription/whisper.d.ts +11 -0
- package/dist/transcription/whisper.d.ts.map +1 -0
- package/dist/transcription/whisper.js +58 -0
- package/dist/transcription/whisper.js.map +1 -0
- package/dist/types.d.ts +22 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/user/setup.d.ts +26 -0
- package/dist/user/setup.d.ts.map +1 -0
- package/dist/user/setup.js +73 -0
- package/dist/user/setup.js.map +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"voice.js","sourceRoot":"","sources":["../../../src/bot/handlers/voice.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Context, NextFunction } from "grammy";
|
|
2
|
+
import type { ProjectContext } from "../../types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Returns a middleware that checks if the user is in the project's whitelist.
|
|
5
|
+
*/
|
|
6
|
+
export declare function createAuthMiddleware(ctx: ProjectContext): (gramCtx: Context, next: NextFunction) => Promise<void>;
|
|
7
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/bot/middleware/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,cAAc,IACxC,SAAS,OAAO,EAAE,MAAM,YAAY,KAAG,OAAO,CAAC,IAAI,CAAC,CAsBnE"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Returns a middleware that checks if the user is in the project's whitelist.
|
|
3
|
+
*/
|
|
4
|
+
export function createAuthMiddleware(ctx) {
|
|
5
|
+
return async (gramCtx, next) => {
|
|
6
|
+
const { allowedUserIds } = ctx.config.access;
|
|
7
|
+
const userId = gramCtx.from?.id;
|
|
8
|
+
// Allow if no whitelist is configured (open access)
|
|
9
|
+
if (allowedUserIds.length === 0) {
|
|
10
|
+
await next();
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
// Check if user is in whitelist
|
|
14
|
+
if (userId && allowedUserIds.includes(userId)) {
|
|
15
|
+
await next();
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
// User not authorized
|
|
19
|
+
await gramCtx.reply("Sorry, you are not authorized to use this bot.\n" +
|
|
20
|
+
"Contact the administrator to request access.");
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/bot/middleware/auth.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,GAAmB;IACtD,OAAO,KAAK,EAAE,OAAgB,EAAE,IAAkB,EAAiB,EAAE;QACnE,MAAM,EAAE,cAAc,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC;QAC7C,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QAEhC,oDAAoD;QACpD,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QAED,gCAAgC;QAChC,IAAI,MAAM,IAAI,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9C,MAAM,IAAI,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QAED,sBAAsB;QACtB,MAAM,OAAO,CAAC,KAAK,CACjB,kDAAkD;YAChD,8CAA8C,CACjD,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Context, NextFunction } from "grammy";
|
|
2
|
+
import type { ProjectContext } from "../../types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Returns a per-bot rate limit middleware and a cleanup function.
|
|
5
|
+
* Each bot gets its own in-memory store — no cross-bot state.
|
|
6
|
+
*/
|
|
7
|
+
export declare function createRateLimitMiddleware(ctx: ProjectContext): {
|
|
8
|
+
middleware: (gramCtx: Context, next: NextFunction) => Promise<void>;
|
|
9
|
+
cleanup: () => void;
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=rateLimit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rateLimit.d.ts","sourceRoot":"","sources":["../../../src/bot/middleware/rateLimit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAOrD;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,cAAc,GAAG;IAC9D,UAAU,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAwDA"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Returns a per-bot rate limit middleware and a cleanup function.
|
|
3
|
+
* Each bot gets its own in-memory store — no cross-bot state.
|
|
4
|
+
*/
|
|
5
|
+
export function createRateLimitMiddleware(ctx) {
|
|
6
|
+
const { max, windowMs } = ctx.config.rateLimit;
|
|
7
|
+
const store = new Map();
|
|
8
|
+
const interval = setInterval(() => {
|
|
9
|
+
const now = Date.now();
|
|
10
|
+
for (const [userId, entry] of store) {
|
|
11
|
+
if (now - entry.windowStart > windowMs) {
|
|
12
|
+
store.delete(userId);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
}, 60000);
|
|
16
|
+
// Prevent the interval from keeping the process alive
|
|
17
|
+
if (interval.unref)
|
|
18
|
+
interval.unref();
|
|
19
|
+
const middleware = async (gramCtx, next) => {
|
|
20
|
+
const userId = gramCtx.from?.id;
|
|
21
|
+
if (!userId) {
|
|
22
|
+
await next();
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
const now = Date.now();
|
|
26
|
+
const entry = store.get(userId);
|
|
27
|
+
if (entry) {
|
|
28
|
+
if (now - entry.windowStart > windowMs) {
|
|
29
|
+
// Reset window
|
|
30
|
+
store.set(userId, { count: 1, windowStart: now });
|
|
31
|
+
await next();
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
if (entry.count >= max) {
|
|
35
|
+
const remainingMs = windowMs - (now - entry.windowStart);
|
|
36
|
+
const remainingSec = Math.ceil(remainingMs / 1000);
|
|
37
|
+
await gramCtx.reply(`Rate limit exceeded. Please wait ${remainingSec} seconds before sending another message.`);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
entry.count++;
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
store.set(userId, { count: 1, windowStart: now });
|
|
44
|
+
}
|
|
45
|
+
await next();
|
|
46
|
+
};
|
|
47
|
+
return { middleware, cleanup: () => clearInterval(interval) };
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=rateLimit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rateLimit.js","sourceRoot":"","sources":["../../../src/bot/middleware/rateLimit.ts"],"names":[],"mappings":"AAQA;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CAAC,GAAmB;IAI3D,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC;IAC/C,MAAM,KAAK,GAAG,IAAI,GAAG,EAA0B,CAAC;IAEhD,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE;QAChC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,KAAK,EAAE,CAAC;YACpC,IAAI,GAAG,GAAG,KAAK,CAAC,WAAW,GAAG,QAAQ,EAAE,CAAC;gBACvC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;IACH,CAAC,EAAE,KAAK,CAAC,CAAC;IAEV,sDAAsD;IACtD,IAAI,QAAQ,CAAC,KAAK;QAAE,QAAQ,CAAC,KAAK,EAAE,CAAC;IAErC,MAAM,UAAU,GAAG,KAAK,EACtB,OAAgB,EAChB,IAAkB,EACH,EAAE;QACjB,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QAEhC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAEhC,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,GAAG,GAAG,KAAK,CAAC,WAAW,GAAG,QAAQ,EAAE,CAAC;gBACvC,eAAe;gBACf,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC;gBAClD,MAAM,IAAI,EAAE,CAAC;gBACb,OAAO;YACT,CAAC;YAED,IAAI,KAAK,CAAC,KAAK,IAAI,GAAG,EAAE,CAAC;gBACvB,MAAM,WAAW,GAAG,QAAQ,GAAG,CAAC,GAAG,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC;gBACzD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;gBACnD,MAAM,OAAO,CAAC,KAAK,CACjB,oCAAoC,YAAY,0CAA0C,CAC3F,CAAC;gBACF,OAAO;YACT,CAAC;YAED,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC;QACpD,CAAC;QAED,MAAM,IAAI,EAAE,CAAC;IACf,CAAC,CAAC;IAEF,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC;AAChE,CAAC"}
|
package/dist/bot.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ProjectContext } from "./types.js";
|
|
2
|
+
export interface BotHandle {
|
|
3
|
+
stop: () => Promise<void>;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Start a single bot for one project context.
|
|
7
|
+
* Resolves when the bot is fully running; rejects if startup fails.
|
|
8
|
+
* Returns a handle with a stop() function for graceful shutdown.
|
|
9
|
+
*/
|
|
10
|
+
export declare function startBot(projectCtx: ProjectContext): Promise<BotHandle>;
|
|
11
|
+
//# sourceMappingURL=bot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bot.d.ts","sourceRoot":"","sources":["../src/bot.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAiBjD,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAED;;;;GAIG;AACH,wBAAsB,QAAQ,CAAC,UAAU,EAAE,cAAc,GAAG,OAAO,CAAC,SAAS,CAAC,CA+F7E"}
|
package/dist/bot.js
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { execSync } from "node:child_process";
|
|
2
|
+
import { Bot } from "grammy";
|
|
3
|
+
import { getSkillsDir } from "./agent/index.js";
|
|
4
|
+
import { createClearHandler } from "./bot/commands/clear.js";
|
|
5
|
+
import { helpHandler } from "./bot/commands/help.js";
|
|
6
|
+
import { loadCommands } from "./bot/commands/loader.js";
|
|
7
|
+
import { startHandler } from "./bot/commands/start.js";
|
|
8
|
+
import { startCommandWatcher } from "./bot/commands/watcher.js";
|
|
9
|
+
import { createDocumentHandler, createPhotoHandler, createTextHandler, createVoiceHandler, } from "./bot/handlers/index.js";
|
|
10
|
+
import { createAuthMiddleware } from "./bot/middleware/auth.js";
|
|
11
|
+
import { createRateLimitMiddleware } from "./bot/middleware/rateLimit.js";
|
|
12
|
+
/**
|
|
13
|
+
* Check if the Claude CLI command is available, throwing on failure.
|
|
14
|
+
*/
|
|
15
|
+
function checkClaudeCommand(command) {
|
|
16
|
+
try {
|
|
17
|
+
execSync(`${command} --version`, { stdio: "pipe" });
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
throw new Error(`Claude CLI command "${command}" not found or not executable. ` +
|
|
21
|
+
`Please ensure Claude Code is installed and the command is in your PATH. ` +
|
|
22
|
+
`You can also set a custom command in hal.config.json under "claude.command".`);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Start a single bot for one project context.
|
|
27
|
+
* Resolves when the bot is fully running; rejects if startup fails.
|
|
28
|
+
* Returns a handle with a stop() function for graceful shutdown.
|
|
29
|
+
*/
|
|
30
|
+
export async function startBot(projectCtx) {
|
|
31
|
+
const { config, logger } = projectCtx;
|
|
32
|
+
logger.info({ cwd: config.cwd, dataDir: config.dataDir }, "Starting bot");
|
|
33
|
+
// Verify Claude CLI is available (throws on failure)
|
|
34
|
+
logger.debug({ command: config.claude.command }, "Checking Claude CLI");
|
|
35
|
+
checkClaudeCommand(config.claude.command);
|
|
36
|
+
logger.info({ command: config.claude.command }, "Claude CLI verified");
|
|
37
|
+
const bot = new Bot(config.telegram.botToken);
|
|
38
|
+
// Wire per-bot middleware
|
|
39
|
+
const { middleware: rateLimitMw, cleanup: rateLimitCleanup } = createRateLimitMiddleware(projectCtx);
|
|
40
|
+
bot.use(createAuthMiddleware(projectCtx));
|
|
41
|
+
bot.use(rateLimitMw);
|
|
42
|
+
// Wire commands
|
|
43
|
+
bot.command("start", startHandler);
|
|
44
|
+
bot.command("help", helpHandler);
|
|
45
|
+
bot.command("clear", createClearHandler(projectCtx));
|
|
46
|
+
// Wire handlers
|
|
47
|
+
bot.on("message:text", createTextHandler(projectCtx));
|
|
48
|
+
bot.on("message:photo", createPhotoHandler(projectCtx));
|
|
49
|
+
bot.on("message:document", createDocumentHandler(projectCtx));
|
|
50
|
+
bot.on("message:voice", createVoiceHandler(projectCtx));
|
|
51
|
+
// Error handler
|
|
52
|
+
bot.catch((err) => {
|
|
53
|
+
logger.error({ error: err.error, ctx: err.ctx?.update }, "Bot error");
|
|
54
|
+
});
|
|
55
|
+
// Signal when the bot has started (or failed to start)
|
|
56
|
+
let resolveStarted;
|
|
57
|
+
let rejectStarted;
|
|
58
|
+
const startedPromise = new Promise((res, rej) => {
|
|
59
|
+
resolveStarted = res;
|
|
60
|
+
rejectStarted = rej;
|
|
61
|
+
});
|
|
62
|
+
// Start bot — runs until stopped, do not await here
|
|
63
|
+
const runningPromise = bot
|
|
64
|
+
.start({
|
|
65
|
+
onStart: (botInfo) => {
|
|
66
|
+
logger.info({ username: botInfo.username, slug: config.slug }, "Bot is running");
|
|
67
|
+
resolveStarted();
|
|
68
|
+
},
|
|
69
|
+
})
|
|
70
|
+
.catch((err) => {
|
|
71
|
+
rejectStarted(err);
|
|
72
|
+
});
|
|
73
|
+
// Wait until the bot reports it's running (or fails)
|
|
74
|
+
await startedPromise;
|
|
75
|
+
// Register project-specific commands and skills with Telegram on startup
|
|
76
|
+
const skillsDir = getSkillsDir(config.cwd);
|
|
77
|
+
const commands = await loadCommands(config.cwd, config.configDir, logger, skillsDir);
|
|
78
|
+
if (commands.length > 0) {
|
|
79
|
+
await bot.api.setMyCommands(commands.map((c) => ({ command: c.command, description: c.description })));
|
|
80
|
+
logger.info({ count: commands.length }, "Commands registered with Telegram");
|
|
81
|
+
}
|
|
82
|
+
// Start file watcher for hot-reload of command and skill files
|
|
83
|
+
const watcher = startCommandWatcher(bot, config.cwd, config.configDir, logger, skillsDir);
|
|
84
|
+
return {
|
|
85
|
+
stop: async () => {
|
|
86
|
+
await watcher.stop();
|
|
87
|
+
rateLimitCleanup();
|
|
88
|
+
await bot.stop();
|
|
89
|
+
await runningPromise;
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=bot.js.map
|
package/dist/bot.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bot.js","sourceRoot":"","sources":["../src/bot.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Context as GrammyContext } from "grammy";
|
|
2
|
+
import type { ProjectContext } from "../types.js";
|
|
3
|
+
export interface ExecuteOptions {
|
|
4
|
+
prompt: string;
|
|
5
|
+
userDir: string;
|
|
6
|
+
gramCtx?: GrammyContext;
|
|
7
|
+
downloadsPath?: string;
|
|
8
|
+
sessionId?: string | null;
|
|
9
|
+
onProgress?: (message: string) => void;
|
|
10
|
+
}
|
|
11
|
+
export interface ExecuteResult {
|
|
12
|
+
success: boolean;
|
|
13
|
+
output: string;
|
|
14
|
+
sessionId?: string;
|
|
15
|
+
error?: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Execute a Claude query using the CLI with streaming progress
|
|
19
|
+
*/
|
|
20
|
+
export declare function executeClaudeQuery(options: ExecuteOptions, ctx: ProjectContext): Promise<ExecuteResult>;
|
|
21
|
+
//# sourceMappingURL=executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/claude/executor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,QAAQ,CAAC;AAEvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACxC;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,cAAc,EACvB,GAAG,EAAE,cAAc,GAClB,OAAO,CAAC,aAAa,CAAC,CA6MxB"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { formatContextPrompt, resolveContext } from "../context/resolver.js";
|
|
3
|
+
/**
|
|
4
|
+
* Execute a Claude query using the CLI with streaming progress
|
|
5
|
+
*/
|
|
6
|
+
export async function executeClaudeQuery(options, ctx) {
|
|
7
|
+
const { prompt, gramCtx, downloadsPath, sessionId, onProgress } = options;
|
|
8
|
+
const { config, logger, bootContext } = ctx;
|
|
9
|
+
// Resolve context and format prompt if Grammy context is available
|
|
10
|
+
let contextualPrompt = prompt;
|
|
11
|
+
if (gramCtx) {
|
|
12
|
+
const resolvedCtx = await resolveContext({
|
|
13
|
+
gramCtx,
|
|
14
|
+
configContext: config.context,
|
|
15
|
+
bootContext,
|
|
16
|
+
configDir: config.configDir,
|
|
17
|
+
projectCwd: config.cwd,
|
|
18
|
+
projectName: config.name,
|
|
19
|
+
projectSlug: config.slug,
|
|
20
|
+
logger,
|
|
21
|
+
});
|
|
22
|
+
contextualPrompt = formatContextPrompt(resolvedCtx, prompt);
|
|
23
|
+
}
|
|
24
|
+
// Append downloads path info to prompt if provided
|
|
25
|
+
const fullPrompt = downloadsPath
|
|
26
|
+
? `${contextualPrompt}\n\n[System: To send files to the user, write them to: ${downloadsPath}]`
|
|
27
|
+
: contextualPrompt;
|
|
28
|
+
const args = [
|
|
29
|
+
"-p",
|
|
30
|
+
fullPrompt,
|
|
31
|
+
"--output-format",
|
|
32
|
+
"stream-json",
|
|
33
|
+
"--verbose",
|
|
34
|
+
];
|
|
35
|
+
// Resume previous session if we have a session ID
|
|
36
|
+
if (sessionId) {
|
|
37
|
+
args.push("--resume", sessionId);
|
|
38
|
+
}
|
|
39
|
+
const claudeCommand = config.claude.command;
|
|
40
|
+
const cwd = config.cwd;
|
|
41
|
+
logger.info({ command: claudeCommand, args, cwd }, "Executing Claude CLI");
|
|
42
|
+
return new Promise((resolve) => {
|
|
43
|
+
const proc = spawn(claudeCommand, args, {
|
|
44
|
+
cwd,
|
|
45
|
+
env: process.env,
|
|
46
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
47
|
+
});
|
|
48
|
+
let stderrOutput = "";
|
|
49
|
+
let lastResult = null;
|
|
50
|
+
let currentSessionId;
|
|
51
|
+
let lastAssistantText = ""; // Track last text response for fallback
|
|
52
|
+
proc.stdout.on("data", (data) => {
|
|
53
|
+
const chunk = data.toString();
|
|
54
|
+
// Parse streaming JSON lines
|
|
55
|
+
const lines = chunk.split("\n").filter((line) => line.trim());
|
|
56
|
+
for (const line of lines) {
|
|
57
|
+
try {
|
|
58
|
+
const event = JSON.parse(line);
|
|
59
|
+
// Extract session ID from init message
|
|
60
|
+
if (event.type === "system" &&
|
|
61
|
+
event.subtype === "init" &&
|
|
62
|
+
event.session_id) {
|
|
63
|
+
currentSessionId = event.session_id;
|
|
64
|
+
}
|
|
65
|
+
// Extract text from assistant messages and send progress updates
|
|
66
|
+
if (event.type === "assistant" && event.message?.content) {
|
|
67
|
+
for (const block of event.message.content) {
|
|
68
|
+
// Capture text content for fallback
|
|
69
|
+
if (block.type === "text" && block.text) {
|
|
70
|
+
lastAssistantText = block.text;
|
|
71
|
+
}
|
|
72
|
+
// Send progress updates for tool usage
|
|
73
|
+
if (block.type === "tool_use") {
|
|
74
|
+
const toolName = block.name || "unknown";
|
|
75
|
+
let progressMsg = `Using ${toolName}...`;
|
|
76
|
+
if (toolName === "Read" && block.input?.file_path) {
|
|
77
|
+
progressMsg = `Reading: ${block.input.file_path}`;
|
|
78
|
+
}
|
|
79
|
+
else if (toolName === "Grep" && block.input?.pattern) {
|
|
80
|
+
progressMsg = `Searching for: ${block.input.pattern}`;
|
|
81
|
+
}
|
|
82
|
+
else if (toolName === "Glob" && block.input?.pattern) {
|
|
83
|
+
progressMsg = `Finding files: ${block.input.pattern}`;
|
|
84
|
+
}
|
|
85
|
+
else if (toolName === "Bash" && block.input?.command) {
|
|
86
|
+
const cmd = block.input.command.slice(0, 50);
|
|
87
|
+
progressMsg = `Running: ${cmd}${block.input.command.length > 50 ? "..." : ""}`;
|
|
88
|
+
}
|
|
89
|
+
else if (toolName === "Edit" && block.input?.file_path) {
|
|
90
|
+
progressMsg = `Editing: ${block.input.file_path}`;
|
|
91
|
+
}
|
|
92
|
+
else if (toolName === "Write" && block.input?.file_path) {
|
|
93
|
+
progressMsg = `Writing: ${block.input.file_path}`;
|
|
94
|
+
}
|
|
95
|
+
else if (toolName === "WebSearch" && block.input?.query) {
|
|
96
|
+
progressMsg = `Searching web: ${block.input.query}`;
|
|
97
|
+
}
|
|
98
|
+
else if (toolName === "WebFetch" && block.input?.url) {
|
|
99
|
+
progressMsg = `Fetching: ${block.input.url}`;
|
|
100
|
+
}
|
|
101
|
+
logger.info({ tool: toolName, input: block.input }, progressMsg);
|
|
102
|
+
if (onProgress) {
|
|
103
|
+
onProgress(progressMsg);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// Log tool results
|
|
109
|
+
if (event.type === "user" && event.message?.content) {
|
|
110
|
+
for (const block of event.message.content) {
|
|
111
|
+
if (block.type === "tool_result") {
|
|
112
|
+
const result = typeof block.content === "string"
|
|
113
|
+
? block.content.slice(0, 500)
|
|
114
|
+
: JSON.stringify(block.content).slice(0, 500);
|
|
115
|
+
logger.info({ toolUseId: block.tool_use_id, isError: block.is_error }, `Tool result: ${result}${result.length >= 500 ? "..." : ""}`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
// Capture the final result
|
|
120
|
+
if (event.type === "result") {
|
|
121
|
+
logger.debug({ event }, "Claude result event");
|
|
122
|
+
const errorMessage = event.is_error
|
|
123
|
+
? event.result ||
|
|
124
|
+
(event.errors?.length ? event.errors.join("; ") : undefined)
|
|
125
|
+
: undefined;
|
|
126
|
+
lastResult = {
|
|
127
|
+
success: !event.is_error,
|
|
128
|
+
output: event.result || "",
|
|
129
|
+
sessionId: event.session_id || currentSessionId,
|
|
130
|
+
error: errorMessage,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
// Not valid JSON, ignore
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
proc.stderr.on("data", (data) => {
|
|
140
|
+
const chunk = data.toString().trim();
|
|
141
|
+
if (chunk) {
|
|
142
|
+
stderrOutput += `${chunk}\n`;
|
|
143
|
+
logger.debug({ stderr: chunk }, "Claude stderr");
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
proc.on("close", (code) => {
|
|
147
|
+
logger.debug({ code }, "Claude process closed");
|
|
148
|
+
if (lastResult) {
|
|
149
|
+
if (!lastResult.success) {
|
|
150
|
+
logger.error({
|
|
151
|
+
error: lastResult.error,
|
|
152
|
+
output: lastResult.output?.slice(0, 1000),
|
|
153
|
+
stderr: stderrOutput,
|
|
154
|
+
}, "Claude returned error");
|
|
155
|
+
}
|
|
156
|
+
resolve(lastResult);
|
|
157
|
+
}
|
|
158
|
+
else if (code === 0) {
|
|
159
|
+
resolve({
|
|
160
|
+
success: true,
|
|
161
|
+
output: lastAssistantText || "No response received",
|
|
162
|
+
sessionId: currentSessionId,
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
const errorMsg = stderrOutput.trim() || `Claude exited with code ${code}`;
|
|
167
|
+
logger.error({ code, stderr: stderrOutput, lastText: lastAssistantText }, "Claude process failed");
|
|
168
|
+
resolve({
|
|
169
|
+
success: false,
|
|
170
|
+
output: lastAssistantText,
|
|
171
|
+
error: errorMsg,
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
proc.on("error", (err) => {
|
|
176
|
+
logger.error({ error: err.message }, "Claude process error");
|
|
177
|
+
resolve({
|
|
178
|
+
success: false,
|
|
179
|
+
output: "",
|
|
180
|
+
error: `Failed to start ${claudeCommand}: ${err.message}`,
|
|
181
|
+
});
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../../src/claude/executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ExecuteResult } from "./executor.js";
|
|
2
|
+
export interface ParsedResponse {
|
|
3
|
+
text: string;
|
|
4
|
+
sessionId?: string;
|
|
5
|
+
costUsd?: number;
|
|
6
|
+
inputTokens?: number;
|
|
7
|
+
outputTokens?: number;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Parse Claude CLI JSON output and extract the result text
|
|
11
|
+
*/
|
|
12
|
+
export declare function parseClaudeOutput(result: ExecuteResult): ParsedResponse;
|
|
13
|
+
//# sourceMappingURL=parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/claude/parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,aAAa,GAAG,cAAc,CAwDvE"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parse Claude CLI JSON output and extract the result text
|
|
3
|
+
*/
|
|
4
|
+
export function parseClaudeOutput(result) {
|
|
5
|
+
if (!result.success) {
|
|
6
|
+
return {
|
|
7
|
+
text: result.error || "An unknown error occurred",
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
try {
|
|
11
|
+
// Claude CLI with --output-format json returns structured JSON
|
|
12
|
+
const parsed = JSON.parse(result.output);
|
|
13
|
+
// Extract the result text
|
|
14
|
+
// The structure may vary, but typically contains a 'result' or 'message' field
|
|
15
|
+
let text = "";
|
|
16
|
+
if (typeof parsed === "string") {
|
|
17
|
+
text = parsed;
|
|
18
|
+
}
|
|
19
|
+
else if (parsed.result) {
|
|
20
|
+
text = parsed.result;
|
|
21
|
+
}
|
|
22
|
+
else if (parsed.message) {
|
|
23
|
+
text = parsed.message;
|
|
24
|
+
}
|
|
25
|
+
else if (parsed.content) {
|
|
26
|
+
// Handle content array format
|
|
27
|
+
if (Array.isArray(parsed.content)) {
|
|
28
|
+
text = parsed.content
|
|
29
|
+
.filter((block) => {
|
|
30
|
+
const b = block;
|
|
31
|
+
return b.type === "text";
|
|
32
|
+
})
|
|
33
|
+
.map((block) => {
|
|
34
|
+
const b = block;
|
|
35
|
+
return b.text || "";
|
|
36
|
+
})
|
|
37
|
+
.join("\n");
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
text = String(parsed.content);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
// Fallback: stringify the entire response
|
|
45
|
+
text = JSON.stringify(parsed, null, 2);
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
text: text || "No response received",
|
|
49
|
+
sessionId: parsed.session_id,
|
|
50
|
+
costUsd: parsed.cost_usd,
|
|
51
|
+
inputTokens: parsed.input_tokens,
|
|
52
|
+
outputTokens: parsed.output_tokens,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
// If JSON parsing fails, return the raw output
|
|
57
|
+
// This handles cases where Claude returns plain text
|
|
58
|
+
return {
|
|
59
|
+
text: result.output || "No response received",
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/claude/parser.ts"],"names":[],"mappings":"AAUA;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAqB;IACrD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO;YACL,IAAI,EAAE,MAAM,CAAC,KAAK,IAAI,2BAA2B;SAClD,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,+DAA+D;QAC/D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAEzC,0BAA0B;QAC1B,+EAA+E;QAC/E,IAAI,IAAI,GAAG,EAAE,CAAC;QAEd,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC/B,IAAI,GAAG,MAAM,CAAC;QAChB,CAAC;aAAM,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YACzB,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC;QACvB,CAAC;aAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YAC1B,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC;QACxB,CAAC;aAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YAC1B,8BAA8B;YAC9B,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;gBAClC,IAAI,GAAG,MAAM,CAAC,OAAO;qBAClB,MAAM,CAAC,CAAC,KAAc,EAAE,EAAE;oBACzB,MAAM,CAAC,GAAG,KAA0B,CAAC;oBACrC,OAAO,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;gBAC3B,CAAC,CAAC;qBACD,GAAG,CAAC,CAAC,KAAc,EAAE,EAAE;oBACtB,MAAM,CAAC,GAAG,KAA0B,CAAC;oBACrC,OAAO,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;gBACtB,CAAC,CAAC;qBACD,IAAI,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC;iBAAM,CAAC;gBACN,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;aAAM,CAAC;YACN,0CAA0C;YAC1C,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACzC,CAAC;QAED,OAAO;YACL,IAAI,EAAE,IAAI,IAAI,sBAAsB;YACpC,SAAS,EAAE,MAAM,CAAC,UAAU;YAC5B,OAAO,EAAE,MAAM,CAAC,QAAQ;YACxB,WAAW,EAAE,MAAM,CAAC,YAAY;YAChC,YAAY,EAAE,MAAM,CAAC,aAAa;SACnC,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,+CAA+C;QAC/C,qDAAqD;QACrD,OAAO;YACL,IAAI,EAAE,MAAM,CAAC,MAAM,IAAI,sBAAsB;SAC9C,CAAC;IACJ,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":""}
|