@marcopeg/hal 1.0.26 → 1.0.28

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 (107) hide show
  1. package/README.md +54 -54
  2. package/dist/bot/commands/session.d.ts.map +1 -1
  3. package/dist/bot/commands/session.js +8 -4
  4. package/dist/bot/commands/session.js.map +1 -1
  5. package/dist/bot/handlers/document.d.ts.map +1 -1
  6. package/dist/bot/handlers/document.js +8 -4
  7. package/dist/bot/handlers/document.js.map +1 -1
  8. package/dist/bot/handlers/photo.d.ts.map +1 -1
  9. package/dist/bot/handlers/photo.js +8 -4
  10. package/dist/bot/handlers/photo.js.map +1 -1
  11. package/dist/bot/handlers/text.d.ts.map +1 -1
  12. package/dist/bot/handlers/text.js +8 -4
  13. package/dist/bot/handlers/text.js.map +1 -1
  14. package/dist/bot/handlers/voice.d.ts.map +1 -1
  15. package/dist/bot/handlers/voice.js +8 -4
  16. package/dist/bot/handlers/voice.js.map +1 -1
  17. package/dist/bot.d.ts.map +1 -1
  18. package/dist/bot.js +20 -2
  19. package/dist/bot.js.map +1 -1
  20. package/dist/cli.js +54 -23
  21. package/dist/cli.js.map +1 -1
  22. package/dist/config-watcher.d.ts +7 -3
  23. package/dist/config-watcher.d.ts.map +1 -1
  24. package/dist/config-watcher.js +6 -4
  25. package/dist/config-watcher.js.map +1 -1
  26. package/dist/config.d.ts +49 -146
  27. package/dist/config.d.ts.map +1 -1
  28. package/dist/config.js +140 -39
  29. package/dist/config.js.map +1 -1
  30. package/dist/default-models.d.ts.map +1 -1
  31. package/dist/default-models.js +3 -4
  32. package/dist/default-models.js.map +1 -1
  33. package/dist/engine/adapters/antigravity.d.ts.map +1 -1
  34. package/dist/engine/adapters/antigravity.js +7 -3
  35. package/dist/engine/adapters/antigravity.js.map +1 -1
  36. package/dist/engine/adapters/claude.d.ts.map +1 -1
  37. package/dist/engine/adapters/claude.js +16 -6
  38. package/dist/engine/adapters/claude.js.map +1 -1
  39. package/dist/engine/adapters/codex.d.ts.map +1 -1
  40. package/dist/engine/adapters/codex.js +28 -5
  41. package/dist/engine/adapters/codex.js.map +1 -1
  42. package/dist/engine/adapters/copilot.js +2 -2
  43. package/dist/engine/adapters/copilot.js.map +1 -1
  44. package/dist/engine/adapters/cursor.d.ts.map +1 -1
  45. package/dist/engine/adapters/cursor.js +45 -5
  46. package/dist/engine/adapters/cursor.js.map +1 -1
  47. package/dist/engine/adapters/opencode.d.ts.map +1 -1
  48. package/dist/engine/adapters/opencode.js +4 -2
  49. package/dist/engine/adapters/opencode.js.map +1 -1
  50. package/dist/engine/cli-available.d.ts +9 -1
  51. package/dist/engine/cli-available.d.ts.map +1 -1
  52. package/dist/engine/cli-available.js +27 -2
  53. package/dist/engine/cli-available.js.map +1 -1
  54. package/dist/engine/codex-sessions.d.ts +7 -0
  55. package/dist/engine/codex-sessions.d.ts.map +1 -0
  56. package/dist/engine/codex-sessions.js +90 -0
  57. package/dist/engine/codex-sessions.js.map +1 -0
  58. package/dist/init-template.yaml +5 -8
  59. package/package.json +8 -4
  60. package/dist/bot/commands/clear.d.ts +0 -4
  61. package/dist/bot/commands/clear.d.ts.map +0 -1
  62. package/dist/bot/commands/clear.js +0 -24
  63. package/dist/bot/commands/clear.js.map +0 -1
  64. package/dist/bot/commands/tasks.d.ts +0 -5
  65. package/dist/bot/commands/tasks.d.ts.map +0 -1
  66. package/dist/bot/commands/tasks.js +0 -123
  67. package/dist/bot/commands/tasks.js.map +0 -1
  68. package/dist/claude/executor.d.ts +0 -21
  69. package/dist/claude/executor.d.ts.map +0 -1
  70. package/dist/claude/executor.js +0 -185
  71. package/dist/claude/executor.js.map +0 -1
  72. package/dist/claude/parser.d.ts +0 -13
  73. package/dist/claude/parser.d.ts.map +0 -1
  74. package/dist/claude/parser.js +0 -63
  75. package/dist/claude/parser.js.map +0 -1
  76. package/dist/engine/detect.d.ts +0 -26
  77. package/dist/engine/detect.d.ts.map +0 -1
  78. package/dist/engine/detect.js +0 -129
  79. package/dist/engine/detect.js.map +0 -1
  80. package/dist/engine/model-cache.d.ts +0 -25
  81. package/dist/engine/model-cache.d.ts.map +0 -1
  82. package/dist/engine/model-cache.js +0 -162
  83. package/dist/engine/model-cache.js.map +0 -1
  84. package/dist/engine/model-validation.d.ts +0 -9
  85. package/dist/engine/model-validation.d.ts.map +0 -1
  86. package/dist/engine/model-validation.js +0 -21
  87. package/dist/engine/model-validation.js.map +0 -1
  88. package/dist/engine/models-data.generated.d.ts +0 -4
  89. package/dist/engine/models-data.generated.d.ts.map +0 -1
  90. package/dist/engine/models-data.generated.js +0 -196
  91. package/dist/engine/models-data.generated.js.map +0 -1
  92. package/dist/engine/models-fetch.d.ts +0 -5
  93. package/dist/engine/models-fetch.d.ts.map +0 -1
  94. package/dist/engine/models-fetch.js +0 -54
  95. package/dist/engine/models-fetch.js.map +0 -1
  96. package/dist/engine/probe-utils.d.ts +0 -6
  97. package/dist/engine/probe-utils.d.ts.map +0 -1
  98. package/dist/engine/probe-utils.js +0 -42
  99. package/dist/engine/probe-utils.js.map +0 -1
  100. package/dist/prompts.d.ts +0 -19
  101. package/dist/prompts.d.ts.map +0 -1
  102. package/dist/prompts.js +0 -73
  103. package/dist/prompts.js.map +0 -1
  104. package/dist/setup-wizard.d.ts +0 -4
  105. package/dist/setup-wizard.d.ts.map +0 -1
  106. package/dist/setup-wizard.js +0 -258
  107. package/dist/setup-wizard.js.map +0 -1
@@ -1,24 +0,0 @@
1
- import { join } from "node:path";
2
- import { clearUserData } from "../../user/setup.js";
3
- import { resolveCommandMessage } from "./message.js";
4
- const DEFAULT_TEMPLATE = "Conversation history cleared. Your next message will start a fresh conversation.";
5
- export function createClearHandler(ctx) {
6
- return async (gramCtx) => {
7
- const userId = gramCtx.from?.id;
8
- if (!userId) {
9
- await gramCtx.reply("Could not identify user.");
10
- return;
11
- }
12
- const userDir = join(ctx.config.dataDir, String(userId));
13
- try {
14
- await clearUserData(userDir);
15
- const template = ctx.config.commands.clear?.message ?? DEFAULT_TEMPLATE;
16
- const message = await resolveCommandMessage(template, ctx, gramCtx);
17
- await gramCtx.reply(message, { parse_mode: "Markdown" });
18
- }
19
- catch (_error) {
20
- await gramCtx.reply("Failed to clear conversation history. Please try again.");
21
- }
22
- };
23
- }
24
- //# sourceMappingURL=clear.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"clear.js","sourceRoot":"","sources":["../../../src/bot/commands/clear.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAErD,MAAM,gBAAgB,GACpB,kFAAkF,CAAC;AAErF,MAAM,UAAU,kBAAkB,CAAC,GAAmB;IACpD,OAAO,KAAK,EAAE,OAAgB,EAAiB,EAAE;QAC/C,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QAEhC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;YAChD,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QAEzD,IAAI,CAAC;YACH,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC;YAE7B,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,IAAI,gBAAgB,CAAC;YACxE,MAAM,OAAO,GAAG,MAAM,qBAAqB,CAAC,QAAQ,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;YACpE,MAAM,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,CAAC;QAC3D,CAAC;QAAC,OAAO,MAAM,EAAE,CAAC;YAChB,MAAM,OAAO,CAAC,KAAK,CACjB,yDAAyD,CAC1D,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
@@ -1,5 +0,0 @@
1
- import type { Context, NextFunction } from "grammy";
2
- import type { ProjectContext } from "../../types.js";
3
- export declare function createTasksHandler(ctx: ProjectContext): (gramCtx: Context) => Promise<void>;
4
- export declare function createTasksCallbackHandler(ctx: ProjectContext): (gramCtx: Context, next: NextFunction) => Promise<void>;
5
- //# sourceMappingURL=tasks.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../../src/bot/commands/tasks.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AA8FrD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,cAAc,IACtC,SAAS,OAAO,KAAG,OAAO,CAAC,IAAI,CAAC,CAiC/C;AAWD,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,cAAc,IAC9C,SAAS,OAAO,EAAE,MAAM,YAAY,KAAG,OAAO,CAAC,IAAI,CAAC,CA0BnE"}
@@ -1,123 +0,0 @@
1
- import { readFile } from "node:fs/promises";
2
- import { join } from "node:path";
3
- import { InlineKeyboard } from "grammy";
4
- const CB = "tasks:";
5
- // ─── Parsing ─────────────────────────────────────────────────────────────────
6
- const SECTION_HEADERS = {
7
- "## in progress": "inProgress",
8
- "## ready tasks": "ready",
9
- "## drafts": "drafts",
10
- "## completed": "completed",
11
- };
12
- // Matches: - [022 — Title](path) or - [032a — Title](path)
13
- // Also handles sub-tasks indented with spaces.
14
- const TASK_RE = /^\s*-\s+\[(\d+[a-z]*)\s*[—–-]\s*([^\]]+)\]/i;
15
- function parseItems(lines) {
16
- return lines.flatMap((line) => {
17
- const m = line.match(TASK_RE);
18
- return m ? [{ id: m[1].trim(), name: m[2].trim() }] : [];
19
- });
20
- }
21
- async function parseBacklog(cwd) {
22
- const path = join(cwd, "tasks", "BACKLOG.md");
23
- let content;
24
- try {
25
- content = await readFile(path, "utf-8");
26
- }
27
- catch {
28
- return { inProgress: [], ready: [], drafts: [], completed: [] };
29
- }
30
- const buckets = {
31
- inProgress: [],
32
- ready: [],
33
- drafts: [],
34
- completed: [],
35
- };
36
- let current = null;
37
- for (const line of content.split("\n")) {
38
- const lower = line.toLowerCase().trim();
39
- const matched = SECTION_HEADERS[lower];
40
- if (matched !== undefined) {
41
- current = matched;
42
- continue;
43
- }
44
- // Any unrecognised ## heading closes the current section
45
- if (line.startsWith("## ")) {
46
- current = null;
47
- continue;
48
- }
49
- if (current !== null) {
50
- buckets[current].push(line);
51
- }
52
- }
53
- return {
54
- inProgress: parseItems(buckets.inProgress),
55
- ready: parseItems(buckets.ready),
56
- drafts: parseItems(buckets.drafts),
57
- completed: parseItems(buckets.completed),
58
- };
59
- }
60
- // ─── Formatting ──────────────────────────────────────────────────────────────
61
- function esc(text) {
62
- return text.replace(/[_*`[]/g, "\\$&");
63
- }
64
- function formatList(tasks) {
65
- return tasks.map((t) => `• *${t.id}* — ${esc(t.name)}`).join("\n");
66
- }
67
- // ─── Command handler ─────────────────────────────────────────────────────────
68
- export function createTasksHandler(ctx) {
69
- return async (gramCtx) => {
70
- const { config } = ctx;
71
- const bl = await parseBacklog(config.cwd);
72
- const inProgressText = bl.inProgress.length > 0 ? formatList(bl.inProgress) : "_None_";
73
- const readySlice = bl.ready.slice(0, 3);
74
- const readySuffix = bl.ready.length > 3 ? `\n_…and ${bl.ready.length - 3} more_` : "";
75
- const readyText = readySlice.length > 0 ? formatList(readySlice) + readySuffix : "_None_";
76
- const summary = [
77
- `*In Progress* (${bl.inProgress.length})`,
78
- inProgressText,
79
- "",
80
- `*Ready* (${bl.ready.length}${bl.ready.length > 3 ? `, first 3` : ""})`,
81
- readyText,
82
- ].join("\n");
83
- const keyboard = new InlineKeyboard()
84
- .text(`📝 Drafts (${bl.drafts.length})`, `${CB}drafts`)
85
- .text(`✅ Ready (${bl.ready.length})`, `${CB}ready`)
86
- .row()
87
- .text(`🔄 In Progress (${bl.inProgress.length})`, `${CB}inprogress`)
88
- .text(`🏁 Completed (${bl.completed.length})`, `${CB}completed`);
89
- await gramCtx.reply(summary, {
90
- parse_mode: "Markdown",
91
- reply_markup: keyboard,
92
- });
93
- };
94
- }
95
- // ─── Callback handler ────────────────────────────────────────────────────────
96
- const SECTION_META = {
97
- drafts: { label: "📝 Drafts", key: "drafts" },
98
- ready: { label: "✅ Ready", key: "ready" },
99
- inprogress: { label: "🔄 In Progress", key: "inProgress" },
100
- completed: { label: "🏁 Completed", key: "completed" },
101
- };
102
- export function createTasksCallbackHandler(ctx) {
103
- return async (gramCtx, next) => {
104
- const data = gramCtx.callbackQuery?.data;
105
- if (!data?.startsWith(CB)) {
106
- return next();
107
- }
108
- const { config } = ctx;
109
- const slug = data.slice(CB.length);
110
- const meta = SECTION_META[slug];
111
- if (!meta) {
112
- await gramCtx.answerCallbackQuery({ text: "Unknown section." });
113
- return;
114
- }
115
- const bl = await parseBacklog(config.cwd);
116
- const tasks = bl[meta.key];
117
- const body = tasks.length > 0 ? formatList(tasks) : "_No tasks in this section\\._";
118
- const text = `*${meta.label}* (${tasks.length})\n\n${body}`;
119
- await gramCtx.answerCallbackQuery();
120
- await gramCtx.reply(text, { parse_mode: "Markdown" });
121
- };
122
- }
123
- //# sourceMappingURL=tasks.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../../src/bot/commands/tasks.ts"],"names":[],"mappings":"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"}
@@ -1,21 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,185 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"executor.js","sourceRoot":"","sources":["../../src/claude/executor.ts"],"names":[],"mappings":"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"}
@@ -1,13 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,63 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,26 +0,0 @@
1
- import type pino from "pino";
2
- import type { EngineName } from "./types.js";
3
- interface MultiConfigLike {
4
- globals?: {
5
- engine?: {
6
- name?: string;
7
- };
8
- };
9
- }
10
- /**
11
- * Returns true if globals.engine.name is set (i.e. a global default exists).
12
- */
13
- export declare function isEngineConfigured(config: MultiConfigLike): boolean;
14
- export declare function persistEngineToConfig(configDir: string, engine: EngineName): Promise<void>;
15
- export interface DetectEngineOptions {
16
- /** Skip the initial "do you want me to check?" confirmation prompt. */
17
- skipInitialPrompt?: boolean;
18
- /** Skip the final "save to config?" prompt and always return persist: true. */
19
- skipPersistPrompt?: boolean;
20
- }
21
- export declare function detectEngine(configDir: string, logger: pino.Logger, options?: DetectEngineOptions): Promise<{
22
- engine: EngineName;
23
- persist: boolean;
24
- }>;
25
- export {};
26
- //# sourceMappingURL=detect.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../../src/engine/detect.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAG7B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAuB7C,UAAU,eAAe;IACvB,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE;YAAE,IAAI,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC;CAC1C;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAKnE;AAID,wBAAsB,qBAAqB,CACzC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,UAAU,GACjB,OAAO,CAAC,IAAI,CAAC,CAWf;AAID,MAAM,WAAW,mBAAmB;IAClC,uEAAuE;IACvE,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,+EAA+E;IAC/E,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,wBAAsB,YAAY,CAChC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,IAAI,CAAC,MAAM,EACnB,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAwGnD"}
@@ -1,129 +0,0 @@
1
- import { readFileSync, writeFileSync } from "node:fs";
2
- import { join } from "node:path";
3
- import open from "open";
4
- import { confirm, select } from "../prompts.js";
5
- import { getEngine } from "./registry.js";
6
- // ─── Constants ──────────────────────────────────────────────────────────────
7
- /** Detection priority order (cosmetic — no pre-selection) */
8
- const DETECTION_ORDER = [
9
- "opencode",
10
- "claude",
11
- "copilot",
12
- "cursor",
13
- "codex",
14
- ];
15
- const INSTALL_URLS = {
16
- opencode: "https://opencode.ai",
17
- claude: "https://docs.anthropic.com/en/docs/claude-code/overview",
18
- copilot: "https://docs.github.com/en/copilot/github-copilot-in-the-cli",
19
- cursor: "https://docs.cursor.com/agent",
20
- codex: "https://github.com/openai/codex",
21
- };
22
- /**
23
- * Returns true if globals.engine.name is set (i.e. a global default exists).
24
- */
25
- export function isEngineConfigured(config) {
26
- return (typeof config.globals?.engine?.name === "string" &&
27
- config.globals.engine.name.length > 0);
28
- }
29
- // ─── Config writer ──────────────────────────────────────────────────────────
30
- export async function persistEngineToConfig(configDir, engine) {
31
- const configPath = join(configDir, "hal.config.json");
32
- const content = readFileSync(configPath, "utf-8");
33
- const obj = JSON.parse(content);
34
- if (!obj.globals) {
35
- obj.globals = {};
36
- }
37
- obj.globals.engine = { ...obj.globals.engine, name: engine };
38
- writeFileSync(configPath, `${JSON.stringify(obj, null, 2)}\n`, "utf-8");
39
- }
40
- export async function detectEngine(configDir, logger, options) {
41
- // Step 1 — Ask user if they want auto-detection (skippable from wizard)
42
- if (!options?.skipInitialPrompt) {
43
- const wantDetection = await confirm({
44
- message: "No engine config found, do you want me to check your system and figure this out?",
45
- });
46
- if (!wantDetection) {
47
- console.log('Ok then, please fix your "hal.config.json" and set the "globals.engine.name" — then ping me again!');
48
- process.exit(0);
49
- }
50
- }
51
- // Step 2 — Auto-detect engines with self-replacing progress line
52
- const available = [];
53
- for (const name of DETECTION_ORDER) {
54
- process.stdout.write(`\r\x1b[KChecking ${name}...`);
55
- logger.debug({ engine: name }, "Probing engine");
56
- const adapter = getEngine(name);
57
- // Check if CLI binary exists
58
- let hasCliPresence = false;
59
- try {
60
- adapter.check();
61
- hasCliPresence = true;
62
- logger.debug({ engine: name }, "check() passed");
63
- }
64
- catch {
65
- logger.debug({ engine: name }, "check() failed — binary not found");
66
- process.stdout.write(`\r\x1b[KChecking ${name}... \u2717 not found`);
67
- await sleep(500);
68
- continue;
69
- }
70
- // Probe with a minimal prompt
71
- if (hasCliPresence) {
72
- const probeOk = await adapter.probe(configDir);
73
- logger.debug({ engine: name, probeOk }, "probe() result");
74
- if (probeOk) {
75
- available.push(name);
76
- process.stdout.write(`\r\x1b[KChecking ${name}... \u2713 available`);
77
- }
78
- else {
79
- process.stdout.write(`\r\x1b[KChecking ${name}... \u2717 check failed`);
80
- }
81
- await sleep(500);
82
- }
83
- }
84
- // Clear progress line
85
- process.stdout.write("\r\x1b[K");
86
- let chosen;
87
- if (available.length > 0) {
88
- // Step 3a — Engines found: let user choose
89
- chosen = await select({
90
- message: "I found the following available engines, which one do you want to use?",
91
- choices: available.map((name) => ({
92
- name,
93
- value: name,
94
- })),
95
- });
96
- }
97
- else {
98
- // Step 3b — No engines found: install guidance
99
- const toInstall = await select({
100
- message: "Sorry, I couldn't find any working engine on your system. Pick one to install:",
101
- choices: DETECTION_ORDER.map((name) => ({
102
- name,
103
- value: name,
104
- })),
105
- });
106
- const url = INSTALL_URLS[toInstall];
107
- if (url) {
108
- await open(url);
109
- }
110
- console.log("Once installed, boot me again and I'll detect it!");
111
- process.exit(0);
112
- }
113
- // Step 4 — Persist to config? (skippable from wizard)
114
- if (options?.skipPersistPrompt) {
115
- return { engine: chosen, persist: true };
116
- }
117
- const wantPersist = await confirm({
118
- message: `Great, you want to use "${chosen}", do you want me to add this to your configuration file? (recommended)`,
119
- });
120
- if (!wantPersist) {
121
- console.log("Dude, I will do what you ask. But keep in mind that you are forcing me to re-run this task again next time you boot me up! Please consider storing this in your configuration file.");
122
- }
123
- return { engine: chosen, persist: wantPersist };
124
- }
125
- // ─── Helpers ────────────────────────────────────────────────────────────────
126
- function sleep(ms) {
127
- return new Promise((resolve) => setTimeout(resolve, ms));
128
- }
129
- //# sourceMappingURL=detect.js.map