@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.
Files changed (106) hide show
  1. package/README.md +655 -0
  2. package/dist/agent/index.d.ts +17 -0
  3. package/dist/agent/index.d.ts.map +1 -0
  4. package/dist/agent/index.js +30 -0
  5. package/dist/agent/index.js.map +1 -0
  6. package/dist/bot/commands/clear.d.ts +7 -0
  7. package/dist/bot/commands/clear.d.ts.map +1 -0
  8. package/dist/bot/commands/clear.js +23 -0
  9. package/dist/bot/commands/clear.js.map +1 -0
  10. package/dist/bot/commands/help.d.ts +3 -0
  11. package/dist/bot/commands/help.d.ts.map +1 -0
  12. package/dist/bot/commands/help.js +16 -0
  13. package/dist/bot/commands/help.js.map +1 -0
  14. package/dist/bot/commands/loader.d.ts +26 -0
  15. package/dist/bot/commands/loader.d.ts.map +1 -0
  16. package/dist/bot/commands/loader.js +206 -0
  17. package/dist/bot/commands/loader.js.map +1 -0
  18. package/dist/bot/commands/start.d.ts +3 -0
  19. package/dist/bot/commands/start.d.ts.map +1 -0
  20. package/dist/bot/commands/start.js +10 -0
  21. package/dist/bot/commands/start.js.map +1 -0
  22. package/dist/bot/commands/watcher.d.ts +11 -0
  23. package/dist/bot/commands/watcher.d.ts.map +1 -0
  24. package/dist/bot/commands/watcher.js +106 -0
  25. package/dist/bot/commands/watcher.js.map +1 -0
  26. package/dist/bot/handlers/document.d.ts +7 -0
  27. package/dist/bot/handlers/document.d.ts.map +1 -0
  28. package/dist/bot/handlers/document.js +128 -0
  29. package/dist/bot/handlers/document.js.map +1 -0
  30. package/dist/bot/handlers/index.d.ts +5 -0
  31. package/dist/bot/handlers/index.d.ts.map +1 -0
  32. package/dist/bot/handlers/index.js +5 -0
  33. package/dist/bot/handlers/index.js.map +1 -0
  34. package/dist/bot/handlers/photo.d.ts +7 -0
  35. package/dist/bot/handlers/photo.d.ts.map +1 -0
  36. package/dist/bot/handlers/photo.js +87 -0
  37. package/dist/bot/handlers/photo.js.map +1 -0
  38. package/dist/bot/handlers/text.d.ts +7 -0
  39. package/dist/bot/handlers/text.d.ts.map +1 -0
  40. package/dist/bot/handlers/text.js +186 -0
  41. package/dist/bot/handlers/text.js.map +1 -0
  42. package/dist/bot/handlers/voice.d.ts +7 -0
  43. package/dist/bot/handlers/voice.d.ts.map +1 -0
  44. package/dist/bot/handlers/voice.js +147 -0
  45. package/dist/bot/handlers/voice.js.map +1 -0
  46. package/dist/bot/middleware/auth.d.ts +7 -0
  47. package/dist/bot/middleware/auth.d.ts.map +1 -0
  48. package/dist/bot/middleware/auth.js +23 -0
  49. package/dist/bot/middleware/auth.js.map +1 -0
  50. package/dist/bot/middleware/rateLimit.d.ts +11 -0
  51. package/dist/bot/middleware/rateLimit.d.ts.map +1 -0
  52. package/dist/bot/middleware/rateLimit.js +49 -0
  53. package/dist/bot/middleware/rateLimit.js.map +1 -0
  54. package/dist/bot.d.ts +11 -0
  55. package/dist/bot.d.ts.map +1 -0
  56. package/dist/bot.js +93 -0
  57. package/dist/bot.js.map +1 -0
  58. package/dist/claude/executor.d.ts +21 -0
  59. package/dist/claude/executor.d.ts.map +1 -0
  60. package/dist/claude/executor.js +185 -0
  61. package/dist/claude/executor.js.map +1 -0
  62. package/dist/claude/parser.d.ts +13 -0
  63. package/dist/claude/parser.d.ts.map +1 -0
  64. package/dist/claude/parser.js +63 -0
  65. package/dist/claude/parser.js.map +1 -0
  66. package/dist/cli.d.ts +3 -0
  67. package/dist/cli.d.ts.map +1 -0
  68. package/dist/cli.js +192 -0
  69. package/dist/cli.js.map +1 -0
  70. package/dist/config.d.ts +216 -0
  71. package/dist/config.d.ts.map +1 -0
  72. package/dist/config.js +396 -0
  73. package/dist/config.js.map +1 -0
  74. package/dist/context/resolver.d.ts +19 -0
  75. package/dist/context/resolver.d.ts.map +1 -0
  76. package/dist/context/resolver.js +171 -0
  77. package/dist/context/resolver.js.map +1 -0
  78. package/dist/index.d.ts +7 -0
  79. package/dist/index.d.ts.map +1 -0
  80. package/dist/index.js +5 -0
  81. package/dist/index.js.map +1 -0
  82. package/dist/logger.d.ts +17 -0
  83. package/dist/logger.d.ts.map +1 -0
  84. package/dist/logger.js +44 -0
  85. package/dist/logger.js.map +1 -0
  86. package/dist/telegram/chunker.d.ts +10 -0
  87. package/dist/telegram/chunker.d.ts.map +1 -0
  88. package/dist/telegram/chunker.js +88 -0
  89. package/dist/telegram/chunker.js.map +1 -0
  90. package/dist/telegram/fileSender.d.ts +8 -0
  91. package/dist/telegram/fileSender.d.ts.map +1 -0
  92. package/dist/telegram/fileSender.js +46 -0
  93. package/dist/telegram/fileSender.js.map +1 -0
  94. package/dist/transcription/whisper.d.ts +11 -0
  95. package/dist/transcription/whisper.d.ts.map +1 -0
  96. package/dist/transcription/whisper.js +58 -0
  97. package/dist/transcription/whisper.js.map +1 -0
  98. package/dist/types.d.ts +22 -0
  99. package/dist/types.d.ts.map +1 -0
  100. package/dist/types.js +2 -0
  101. package/dist/types.js.map +1 -0
  102. package/dist/user/setup.d.ts +26 -0
  103. package/dist/user/setup.d.ts.map +1 -0
  104. package/dist/user/setup.js +73 -0
  105. package/dist/user/setup.js.map +1 -0
  106. 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
@@ -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,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}