@marcopeg/hal 1.0.11 → 1.0.15

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 (76) hide show
  1. package/README.md +151 -32
  2. package/dist/agent/index.d.ts +5 -7
  3. package/dist/agent/index.d.ts.map +1 -1
  4. package/dist/agent/index.js +15 -9
  5. package/dist/agent/index.js.map +1 -1
  6. package/dist/bot/commands/loader.d.ts +5 -0
  7. package/dist/bot/commands/loader.d.ts.map +1 -1
  8. package/dist/bot/commands/loader.js +31 -0
  9. package/dist/bot/commands/loader.js.map +1 -1
  10. package/dist/bot/commands/session.d.ts +11 -0
  11. package/dist/bot/commands/session.d.ts.map +1 -0
  12. package/dist/bot/commands/session.js +65 -0
  13. package/dist/bot/commands/session.js.map +1 -0
  14. package/dist/bot/handlers/document.d.ts.map +1 -1
  15. package/dist/bot/handlers/document.js +8 -8
  16. package/dist/bot/handlers/document.js.map +1 -1
  17. package/dist/bot/handlers/photo.d.ts.map +1 -1
  18. package/dist/bot/handlers/photo.js +8 -8
  19. package/dist/bot/handlers/photo.js.map +1 -1
  20. package/dist/bot/handlers/text.d.ts.map +1 -1
  21. package/dist/bot/handlers/text.js +14 -8
  22. package/dist/bot/handlers/text.js.map +1 -1
  23. package/dist/bot/handlers/voice.d.ts.map +1 -1
  24. package/dist/bot/handlers/voice.js +8 -8
  25. package/dist/bot/handlers/voice.js.map +1 -1
  26. package/dist/bot.d.ts.map +1 -1
  27. package/dist/bot.js +10 -21
  28. package/dist/bot.js.map +1 -1
  29. package/dist/cli.js +65 -17
  30. package/dist/cli.js.map +1 -1
  31. package/dist/config.d.ts +66 -19
  32. package/dist/config.d.ts.map +1 -1
  33. package/dist/config.js +25 -5
  34. package/dist/config.js.map +1 -1
  35. package/dist/context/resolver.d.ts.map +1 -1
  36. package/dist/context/resolver.js +6 -5
  37. package/dist/context/resolver.js.map +1 -1
  38. package/dist/engine/adapters/claude.d.ts +3 -0
  39. package/dist/engine/adapters/claude.d.ts.map +1 -0
  40. package/dist/engine/adapters/claude.js +241 -0
  41. package/dist/engine/adapters/claude.js.map +1 -0
  42. package/dist/engine/adapters/codex.d.ts +9 -0
  43. package/dist/engine/adapters/codex.d.ts.map +1 -0
  44. package/dist/engine/adapters/codex.js +109 -0
  45. package/dist/engine/adapters/codex.js.map +1 -0
  46. package/dist/engine/adapters/copilot.d.ts +3 -0
  47. package/dist/engine/adapters/copilot.d.ts.map +1 -0
  48. package/dist/engine/adapters/copilot.js +109 -0
  49. package/dist/engine/adapters/copilot.js.map +1 -0
  50. package/dist/engine/adapters/opencode.d.ts +7 -0
  51. package/dist/engine/adapters/opencode.d.ts.map +1 -0
  52. package/dist/engine/adapters/opencode.js +94 -0
  53. package/dist/engine/adapters/opencode.js.map +1 -0
  54. package/dist/engine/index.d.ts +4 -0
  55. package/dist/engine/index.d.ts.map +1 -0
  56. package/dist/engine/index.js +3 -0
  57. package/dist/engine/index.js.map +1 -0
  58. package/dist/engine/prompt.d.ts +9 -0
  59. package/dist/engine/prompt.d.ts.map +1 -0
  60. package/dist/engine/prompt.js +29 -0
  61. package/dist/engine/prompt.js.map +1 -0
  62. package/dist/engine/registry.d.ts +9 -0
  63. package/dist/engine/registry.d.ts.map +1 -0
  64. package/dist/engine/registry.js +24 -0
  65. package/dist/engine/registry.js.map +1 -0
  66. package/dist/engine/types.d.ts +45 -0
  67. package/dist/engine/types.d.ts.map +1 -0
  68. package/dist/engine/types.js +7 -0
  69. package/dist/engine/types.js.map +1 -0
  70. package/dist/types.d.ts +5 -1
  71. package/dist/types.d.ts.map +1 -1
  72. package/dist/user/setup.d.ts +5 -0
  73. package/dist/user/setup.d.ts.map +1 -1
  74. package/dist/user/setup.js +13 -0
  75. package/dist/user/setup.js.map +1 -1
  76. package/package.json +1 -1
@@ -0,0 +1,241 @@
1
+ import { execSync, spawn } from "node:child_process";
2
+ import { join } from "node:path";
3
+ import { buildContextualPrompt } from "../prompt.js";
4
+ const DEFAULT_COMMAND = "claude";
5
+ export function createClaudeAdapter(command, model) {
6
+ const cmd = command || DEFAULT_COMMAND;
7
+ return {
8
+ name: "Claude Code",
9
+ command: cmd,
10
+ check() {
11
+ try {
12
+ execSync(`${cmd} --version`, { stdio: "pipe" });
13
+ }
14
+ catch {
15
+ throw new Error(`Claude CLI command "${cmd}" not found or not executable. ` +
16
+ `Please ensure Claude Code is installed and the command is in your PATH.`);
17
+ }
18
+ },
19
+ async execute(options, ctx) {
20
+ const { sessionId, onProgress } = options;
21
+ const { config, logger } = ctx;
22
+ const fullPrompt = await buildContextualPrompt(options, ctx);
23
+ const args = [
24
+ "-p",
25
+ fullPrompt,
26
+ "--output-format",
27
+ "stream-json",
28
+ "--verbose",
29
+ ];
30
+ // Set model if specified
31
+ if (model) {
32
+ args.push("--model", model);
33
+ }
34
+ // Resume previous session if we have a session ID
35
+ if (sessionId) {
36
+ args.push("--resume", sessionId);
37
+ }
38
+ const cwd = config.cwd;
39
+ logger.info({ command: cmd, args, cwd }, "Executing Claude CLI");
40
+ return new Promise((resolve) => {
41
+ const proc = spawn(cmd, args, {
42
+ cwd,
43
+ env: process.env,
44
+ stdio: ["ignore", "pipe", "pipe"],
45
+ });
46
+ let stderrOutput = "";
47
+ let lastResult = null;
48
+ let currentSessionId;
49
+ let lastAssistantText = "";
50
+ proc.stdout.on("data", (data) => {
51
+ const chunk = data.toString();
52
+ const lines = chunk.split("\n").filter((line) => line.trim());
53
+ for (const line of lines) {
54
+ try {
55
+ const event = JSON.parse(line);
56
+ // Extract session ID from init message
57
+ if (event.type === "system" &&
58
+ event.subtype === "init" &&
59
+ event.session_id) {
60
+ currentSessionId = event.session_id;
61
+ }
62
+ // Extract text from assistant messages and send progress updates
63
+ if (event.type === "assistant" && event.message?.content) {
64
+ for (const block of event.message.content) {
65
+ if (block.type === "text" && block.text) {
66
+ lastAssistantText = block.text;
67
+ }
68
+ if (block.type === "tool_use") {
69
+ const toolName = block.name || "unknown";
70
+ let progressMsg = `Using ${toolName}...`;
71
+ if (toolName === "Read" && block.input?.file_path) {
72
+ progressMsg = `Reading: ${block.input.file_path}`;
73
+ }
74
+ else if (toolName === "Grep" && block.input?.pattern) {
75
+ progressMsg = `Searching for: ${block.input.pattern}`;
76
+ }
77
+ else if (toolName === "Glob" && block.input?.pattern) {
78
+ progressMsg = `Finding files: ${block.input.pattern}`;
79
+ }
80
+ else if (toolName === "Bash" && block.input?.command) {
81
+ const cmdStr = block.input.command.slice(0, 50);
82
+ progressMsg = `Running: ${cmdStr}${block.input.command.length > 50 ? "..." : ""}`;
83
+ }
84
+ else if (toolName === "Edit" && block.input?.file_path) {
85
+ progressMsg = `Editing: ${block.input.file_path}`;
86
+ }
87
+ else if (toolName === "Write" && block.input?.file_path) {
88
+ progressMsg = `Writing: ${block.input.file_path}`;
89
+ }
90
+ else if (toolName === "WebSearch" && block.input?.query) {
91
+ progressMsg = `Searching web: ${block.input.query}`;
92
+ }
93
+ else if (toolName === "WebFetch" && block.input?.url) {
94
+ progressMsg = `Fetching: ${block.input.url}`;
95
+ }
96
+ logger.info({ tool: toolName, input: block.input }, progressMsg);
97
+ if (onProgress) {
98
+ onProgress(progressMsg);
99
+ }
100
+ }
101
+ }
102
+ }
103
+ // Log tool results
104
+ if (event.type === "user" && event.message?.content) {
105
+ for (const block of event.message.content) {
106
+ if (block.type === "tool_result") {
107
+ const result = typeof block.content === "string"
108
+ ? block.content.slice(0, 500)
109
+ : JSON.stringify(block.content).slice(0, 500);
110
+ logger.info({
111
+ toolUseId: block.tool_use_id,
112
+ isError: block.is_error,
113
+ }, `Tool result: ${result}${result.length >= 500 ? "..." : ""}`);
114
+ }
115
+ }
116
+ }
117
+ // Capture the final result
118
+ if (event.type === "result") {
119
+ logger.debug({ event }, "Claude result event");
120
+ const errorMessage = event.is_error
121
+ ? event.result ||
122
+ (event.errors?.length ? event.errors.join("; ") : undefined)
123
+ : undefined;
124
+ lastResult = {
125
+ success: !event.is_error,
126
+ output: event.result || "",
127
+ sessionId: event.session_id || currentSessionId,
128
+ error: errorMessage,
129
+ };
130
+ }
131
+ }
132
+ catch {
133
+ // Not valid JSON, ignore
134
+ }
135
+ }
136
+ });
137
+ proc.stderr.on("data", (data) => {
138
+ const chunk = data.toString().trim();
139
+ if (chunk) {
140
+ stderrOutput += `${chunk}\n`;
141
+ logger.debug({ stderr: chunk }, "Claude stderr");
142
+ }
143
+ });
144
+ proc.on("close", (code) => {
145
+ logger.debug({ code }, "Claude process closed");
146
+ if (lastResult) {
147
+ if (!lastResult.success) {
148
+ logger.error({
149
+ error: lastResult.error,
150
+ output: lastResult.output?.slice(0, 1000),
151
+ stderr: stderrOutput,
152
+ }, "Claude returned error");
153
+ }
154
+ resolve(lastResult);
155
+ }
156
+ else if (code === 0) {
157
+ resolve({
158
+ success: true,
159
+ output: lastAssistantText || "No response received",
160
+ sessionId: currentSessionId,
161
+ });
162
+ }
163
+ else {
164
+ const errorMsg = stderrOutput.trim() || `Claude exited with code ${code}`;
165
+ logger.error({ code, stderr: stderrOutput, lastText: lastAssistantText }, "Claude process failed");
166
+ resolve({
167
+ success: false,
168
+ output: lastAssistantText,
169
+ error: errorMsg,
170
+ });
171
+ }
172
+ });
173
+ proc.on("error", (err) => {
174
+ logger.error({ error: err.message }, "Claude process error");
175
+ resolve({
176
+ success: false,
177
+ output: "",
178
+ error: `Failed to start ${cmd}: ${err.message}`,
179
+ });
180
+ });
181
+ });
182
+ },
183
+ parse(result) {
184
+ if (!result.success) {
185
+ return { text: result.error || "An unknown error occurred" };
186
+ }
187
+ try {
188
+ const parsed = JSON.parse(result.output);
189
+ let text = "";
190
+ if (typeof parsed === "string") {
191
+ text = parsed;
192
+ }
193
+ else if (parsed.result) {
194
+ text = parsed.result;
195
+ }
196
+ else if (parsed.message) {
197
+ text = parsed.message;
198
+ }
199
+ else if (parsed.content) {
200
+ if (Array.isArray(parsed.content)) {
201
+ text = parsed.content
202
+ .filter((block) => {
203
+ const b = block;
204
+ return b.type === "text";
205
+ })
206
+ .map((block) => {
207
+ const b = block;
208
+ return b.text || "";
209
+ })
210
+ .join("\n");
211
+ }
212
+ else {
213
+ text = String(parsed.content);
214
+ }
215
+ }
216
+ else {
217
+ text = JSON.stringify(parsed, null, 2);
218
+ }
219
+ return {
220
+ text: text || "No response received",
221
+ sessionId: parsed.session_id,
222
+ costUsd: parsed.cost_usd,
223
+ inputTokens: parsed.input_tokens,
224
+ outputTokens: parsed.output_tokens,
225
+ };
226
+ }
227
+ catch {
228
+ return {
229
+ text: result.output || "No response received",
230
+ };
231
+ }
232
+ },
233
+ skillsDir(projectCwd) {
234
+ return join(projectCwd, ".claude", "skills");
235
+ },
236
+ instructionsFile() {
237
+ return "CLAUDE.md";
238
+ },
239
+ };
240
+ }
241
+ //# sourceMappingURL=claude.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude.js","sourceRoot":"","sources":["../../../src/engine/adapters/claude.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { EngineAdapter } from "../types.js";
2
+ /**
3
+ * Adapter for OpenAI Codex CLI.
4
+ * Fresh: `codex exec -C <cwd> [-m model] [PROMPT]`
5
+ * Continue: `codex exec resume --last [-m model] [PROMPT]`
6
+ * Buffered stdout only (no streaming).
7
+ */
8
+ export declare function createCodexAdapter(command?: string, model?: string): EngineAdapter;
9
+ //# sourceMappingURL=codex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../../src/engine/adapters/codex.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,aAAa,EAId,MAAM,aAAa,CAAC;AAIrB;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,CAAC,EAAE,MAAM,EAChB,KAAK,CAAC,EAAE,MAAM,GACb,aAAa,CAsHf"}
@@ -0,0 +1,109 @@
1
+ import { execSync, spawn } from "node:child_process";
2
+ import { join } from "node:path";
3
+ import { buildContextualPrompt } from "../prompt.js";
4
+ const DEFAULT_COMMAND = "codex";
5
+ /**
6
+ * Adapter for OpenAI Codex CLI.
7
+ * Fresh: `codex exec -C <cwd> [-m model] [PROMPT]`
8
+ * Continue: `codex exec resume --last [-m model] [PROMPT]`
9
+ * Buffered stdout only (no streaming).
10
+ */
11
+ export function createCodexAdapter(command, model) {
12
+ const cmd = command || DEFAULT_COMMAND;
13
+ return {
14
+ name: "Codex",
15
+ command: cmd,
16
+ check() {
17
+ try {
18
+ execSync(`${cmd} --version`, { stdio: "pipe" });
19
+ }
20
+ catch {
21
+ throw new Error(`Codex CLI command "${cmd}" not found or not executable. ` +
22
+ `Please ensure OpenAI Codex CLI is installed and the command is in your PATH.`);
23
+ }
24
+ },
25
+ async execute(options, ctx) {
26
+ const { continueSession } = options;
27
+ const { config, logger } = ctx;
28
+ const fullPrompt = await buildContextualPrompt(options, ctx);
29
+ const cwd = config.cwd;
30
+ const continueSessionRequested = config.engineSession && continueSession !== false;
31
+ // Non-interactive: `codex exec` for fresh; `codex exec resume --last` for continue
32
+ const args = ["exec"];
33
+ if (continueSessionRequested) {
34
+ args.push("resume", "--last");
35
+ }
36
+ else {
37
+ args.push("-C", cwd);
38
+ }
39
+ if (model) {
40
+ args.push("-m", model);
41
+ }
42
+ args.push("--full-auto");
43
+ args.push(fullPrompt);
44
+ logger.info({
45
+ command: cmd,
46
+ args: args.slice(0, -1),
47
+ cwd,
48
+ continue: continueSessionRequested,
49
+ }, "Executing Codex CLI");
50
+ return new Promise((resolve) => {
51
+ const proc = spawn(cmd, args, {
52
+ cwd,
53
+ env: process.env,
54
+ stdio: ["ignore", "pipe", "pipe"],
55
+ });
56
+ let stdout = "";
57
+ let stderrOutput = "";
58
+ proc.stdout.on("data", (data) => {
59
+ stdout += data.toString();
60
+ });
61
+ proc.stderr.on("data", (data) => {
62
+ const chunk = data.toString().trim();
63
+ if (chunk) {
64
+ stderrOutput += `${chunk}\n`;
65
+ logger.debug({ stderr: chunk }, "Codex stderr");
66
+ }
67
+ });
68
+ proc.on("close", (code) => {
69
+ logger.debug({ code }, "Codex process closed");
70
+ if (code === 0) {
71
+ resolve({
72
+ success: true,
73
+ output: stdout.trim() || "No response received",
74
+ });
75
+ }
76
+ else {
77
+ resolve({
78
+ success: false,
79
+ output: "",
80
+ error: stderrOutput.trim() || `Codex exited with code ${code}`,
81
+ });
82
+ }
83
+ });
84
+ proc.on("error", (err) => {
85
+ logger.error({ error: err.message }, "Codex process error");
86
+ resolve({
87
+ success: false,
88
+ output: "",
89
+ error: `Failed to start ${cmd}: ${err.message}`,
90
+ });
91
+ });
92
+ });
93
+ },
94
+ parse(result) {
95
+ if (!result.success) {
96
+ return { text: result.error || "An unknown error occurred" };
97
+ }
98
+ return { text: result.output || "No response received" };
99
+ },
100
+ skillsDir(projectCwd) {
101
+ // All engines share .claude/skills/ for now
102
+ return join(projectCwd, ".claude", "skills");
103
+ },
104
+ instructionsFile() {
105
+ return "AGENTS.md";
106
+ },
107
+ };
108
+ }
109
+ //# sourceMappingURL=codex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../src/engine/adapters/codex.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { EngineAdapter } from "../types.js";
2
+ export declare function createCopilotAdapter(command?: string, model?: string): EngineAdapter;
3
+ //# sourceMappingURL=copilot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copilot.d.ts","sourceRoot":"","sources":["../../../src/engine/adapters/copilot.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,aAAa,EAId,MAAM,aAAa,CAAC;AAIrB,wBAAgB,oBAAoB,CAClC,OAAO,CAAC,EAAE,MAAM,EAChB,KAAK,CAAC,EAAE,MAAM,GACb,aAAa,CAiIf"}
@@ -0,0 +1,109 @@
1
+ import { execSync, spawn } from "node:child_process";
2
+ import { join } from "node:path";
3
+ import { buildContextualPrompt } from "../prompt.js";
4
+ const DEFAULT_COMMAND = "copilot";
5
+ export function createCopilotAdapter(command, model) {
6
+ const cmd = command || DEFAULT_COMMAND;
7
+ return {
8
+ name: "GitHub Copilot",
9
+ command: cmd,
10
+ check() {
11
+ try {
12
+ execSync(`${cmd} --version`, { stdio: "pipe" });
13
+ }
14
+ catch {
15
+ throw new Error(`Copilot CLI command "${cmd}" not found or not executable. ` +
16
+ `Please ensure GitHub Copilot CLI is installed and the command is in your PATH.`);
17
+ }
18
+ },
19
+ async execute(options, ctx) {
20
+ const { onProgress, continueSession } = options;
21
+ const { config, logger } = ctx;
22
+ const fullPrompt = await buildContextualPrompt(options, ctx);
23
+ // Copilot CLI flags (confirmed via `copilot --help`):
24
+ // -p <text> Non-interactive prompt (exits after completion)
25
+ // -s / --silent Clean output for scripting (no stats banner)
26
+ // --allow-all Enable all permissions (tools + paths + urls)
27
+ // --model <model> Override the AI model
28
+ // --continue Continue the most recent session
29
+ const args = ["-p", fullPrompt, "--allow-all"];
30
+ // Set model if specified
31
+ if (model) {
32
+ args.push("--model", model);
33
+ }
34
+ // Continue session only when persistence is enabled and not explicitly disabled (e.g. /new, /clean)
35
+ if (config.engineSession && continueSession !== false) {
36
+ args.push("--continue");
37
+ }
38
+ const cwd = config.cwd;
39
+ logger.info({ command: cmd, cwd }, "Executing Copilot CLI");
40
+ return new Promise((resolve) => {
41
+ const proc = spawn(cmd, args, {
42
+ cwd,
43
+ env: process.env,
44
+ stdio: ["ignore", "pipe", "pipe"],
45
+ });
46
+ let stdout = "";
47
+ let stderrOutput = "";
48
+ proc.stdout.on("data", (data) => {
49
+ const chunk = data.toString();
50
+ stdout += chunk;
51
+ // Copilot in silent mode outputs plain text.
52
+ // Send incremental progress if a callback is provided.
53
+ if (onProgress && chunk.trim()) {
54
+ onProgress("Copilot is responding...");
55
+ }
56
+ });
57
+ proc.stderr.on("data", (data) => {
58
+ const chunk = data.toString().trim();
59
+ if (chunk) {
60
+ stderrOutput += `${chunk}\n`;
61
+ logger.info({ stderr: chunk }, "Copilot stderr");
62
+ }
63
+ });
64
+ proc.on("close", (code) => {
65
+ logger.info({ code }, "Copilot process closed");
66
+ if (code === 0) {
67
+ resolve({
68
+ success: true,
69
+ output: stdout.trim() || "No response received",
70
+ });
71
+ }
72
+ else {
73
+ const errorMsg = stderrOutput.trim() || `Copilot exited with code ${code}`;
74
+ logger.error({ code, stderr: stderrOutput }, "Copilot process failed");
75
+ resolve({
76
+ success: false,
77
+ output: stdout.trim(),
78
+ error: errorMsg,
79
+ });
80
+ }
81
+ });
82
+ proc.on("error", (err) => {
83
+ logger.error({ error: err.message }, "Copilot process error");
84
+ resolve({
85
+ success: false,
86
+ output: "",
87
+ error: `Failed to start ${cmd}: ${err.message}`,
88
+ });
89
+ });
90
+ });
91
+ },
92
+ parse(result) {
93
+ if (!result.success) {
94
+ return { text: result.error || "An unknown error occurred" };
95
+ }
96
+ return {
97
+ text: result.output || "No response received",
98
+ };
99
+ },
100
+ skillsDir(projectCwd) {
101
+ // All engines share .claude/skills/ for now (portable; revisit later)
102
+ return join(projectCwd, ".claude", "skills");
103
+ },
104
+ instructionsFile() {
105
+ return "AGENTS.md";
106
+ },
107
+ };
108
+ }
109
+ //# sourceMappingURL=copilot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copilot.js","sourceRoot":"","sources":["../../../src/engine/adapters/copilot.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { EngineAdapter } from "../types.js";
2
+ /**
3
+ * Stub adapter for OpenCode CLI.
4
+ * TODO: Confirm exact CLI flags, streaming support, and output format.
5
+ */
6
+ export declare function createOpencodeAdapter(command?: string, model?: string): EngineAdapter;
7
+ //# sourceMappingURL=opencode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode.d.ts","sourceRoot":"","sources":["../../../src/engine/adapters/opencode.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,aAAa,EAId,MAAM,aAAa,CAAC;AAIrB;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,CAAC,EAAE,MAAM,EAChB,KAAK,CAAC,EAAE,MAAM,GACb,aAAa,CAuGf"}
@@ -0,0 +1,94 @@
1
+ import { execSync, spawn } from "node:child_process";
2
+ import { join } from "node:path";
3
+ import { buildContextualPrompt } from "../prompt.js";
4
+ const DEFAULT_COMMAND = "opencode";
5
+ /**
6
+ * Stub adapter for OpenCode CLI.
7
+ * TODO: Confirm exact CLI flags, streaming support, and output format.
8
+ */
9
+ export function createOpencodeAdapter(command, model) {
10
+ const cmd = command || DEFAULT_COMMAND;
11
+ return {
12
+ name: "OpenCode",
13
+ command: cmd,
14
+ check() {
15
+ try {
16
+ execSync(`${cmd} --version`, { stdio: "pipe" });
17
+ }
18
+ catch {
19
+ throw new Error(`OpenCode CLI command "${cmd}" not found or not executable. ` +
20
+ `Please ensure OpenCode CLI is installed and the command is in your PATH.`);
21
+ }
22
+ },
23
+ async execute(options, ctx) {
24
+ const { config, logger } = ctx;
25
+ const fullPrompt = await buildContextualPrompt(options, ctx);
26
+ // TODO: Confirm exact opencode CLI flags — using best-guess values.
27
+ const args = ["-p", fullPrompt];
28
+ // Set model if specified
29
+ if (model) {
30
+ args.push("--model", model);
31
+ }
32
+ const cwd = config.cwd;
33
+ logger.info({ command: cmd, cwd }, "Executing OpenCode CLI");
34
+ logger.warn("OpenCode adapter is a stub — CLI flags may need adjustment");
35
+ return new Promise((resolve) => {
36
+ const proc = spawn(cmd, args, {
37
+ cwd,
38
+ env: process.env,
39
+ stdio: ["ignore", "pipe", "pipe"],
40
+ });
41
+ let stdout = "";
42
+ let stderrOutput = "";
43
+ proc.stdout.on("data", (data) => {
44
+ stdout += data.toString();
45
+ });
46
+ proc.stderr.on("data", (data) => {
47
+ const chunk = data.toString().trim();
48
+ if (chunk) {
49
+ stderrOutput += `${chunk}\n`;
50
+ logger.debug({ stderr: chunk }, "OpenCode stderr");
51
+ }
52
+ });
53
+ proc.on("close", (code) => {
54
+ logger.debug({ code }, "OpenCode process closed");
55
+ if (code === 0) {
56
+ resolve({
57
+ success: true,
58
+ output: stdout.trim() || "No response received",
59
+ });
60
+ }
61
+ else {
62
+ resolve({
63
+ success: false,
64
+ output: "",
65
+ error: stderrOutput.trim() || `OpenCode exited with code ${code}`,
66
+ });
67
+ }
68
+ });
69
+ proc.on("error", (err) => {
70
+ logger.error({ error: err.message }, "OpenCode process error");
71
+ resolve({
72
+ success: false,
73
+ output: "",
74
+ error: `Failed to start ${cmd}: ${err.message}`,
75
+ });
76
+ });
77
+ });
78
+ },
79
+ parse(result) {
80
+ if (!result.success) {
81
+ return { text: result.error || "An unknown error occurred" };
82
+ }
83
+ return { text: result.output || "No response received" };
84
+ },
85
+ skillsDir(projectCwd) {
86
+ // All engines share .claude/skills/ for now
87
+ return join(projectCwd, ".claude", "skills");
88
+ },
89
+ instructionsFile() {
90
+ return "AGENTS.md";
91
+ },
92
+ };
93
+ }
94
+ //# sourceMappingURL=opencode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../../src/engine/adapters/opencode.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { getEngine } from "./registry.js";
2
+ export type { EngineAdapter, EngineExecuteOptions, EngineName, EngineResult, ParsedResponse, } from "./types.js";
3
+ export { ENGINE_NAMES } from "./types.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/engine/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,YAAY,EACV,aAAa,EACb,oBAAoB,EACpB,UAAU,EACV,YAAY,EACZ,cAAc,GACf,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { getEngine } from "./registry.js";
2
+ export { ENGINE_NAMES } from "./types.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/engine/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAQ1C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}