@marcopeg/hal 1.0.11 → 1.0.12

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 (67) hide show
  1. package/README.md +121 -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 +10 -9
  5. package/dist/agent/index.js.map +1 -1
  6. package/dist/bot/commands/loader.d.ts.map +1 -1
  7. package/dist/bot/commands/loader.js +15 -0
  8. package/dist/bot/commands/loader.js.map +1 -1
  9. package/dist/bot/handlers/document.d.ts.map +1 -1
  10. package/dist/bot/handlers/document.js +4 -6
  11. package/dist/bot/handlers/document.js.map +1 -1
  12. package/dist/bot/handlers/photo.d.ts.map +1 -1
  13. package/dist/bot/handlers/photo.js +4 -6
  14. package/dist/bot/handlers/photo.js.map +1 -1
  15. package/dist/bot/handlers/text.d.ts.map +1 -1
  16. package/dist/bot/handlers/text.js +10 -6
  17. package/dist/bot/handlers/text.js.map +1 -1
  18. package/dist/bot/handlers/voice.d.ts.map +1 -1
  19. package/dist/bot/handlers/voice.js +4 -6
  20. package/dist/bot/handlers/voice.js.map +1 -1
  21. package/dist/bot.d.ts.map +1 -1
  22. package/dist/bot.js +6 -21
  23. package/dist/bot.js.map +1 -1
  24. package/dist/cli.js +65 -17
  25. package/dist/cli.js.map +1 -1
  26. package/dist/config.d.ts +56 -19
  27. package/dist/config.d.ts.map +1 -1
  28. package/dist/config.js +21 -5
  29. package/dist/config.js.map +1 -1
  30. package/dist/context/resolver.d.ts.map +1 -1
  31. package/dist/context/resolver.js +6 -5
  32. package/dist/context/resolver.js.map +1 -1
  33. package/dist/engine/adapters/claude.d.ts +3 -0
  34. package/dist/engine/adapters/claude.d.ts.map +1 -0
  35. package/dist/engine/adapters/claude.js +241 -0
  36. package/dist/engine/adapters/claude.js.map +1 -0
  37. package/dist/engine/adapters/codex.d.ts +7 -0
  38. package/dist/engine/adapters/codex.d.ts.map +1 -0
  39. package/dist/engine/adapters/codex.js +94 -0
  40. package/dist/engine/adapters/codex.js.map +1 -0
  41. package/dist/engine/adapters/copilot.d.ts +3 -0
  42. package/dist/engine/adapters/copilot.d.ts.map +1 -0
  43. package/dist/engine/adapters/copilot.js +109 -0
  44. package/dist/engine/adapters/copilot.js.map +1 -0
  45. package/dist/engine/adapters/opencode.d.ts +7 -0
  46. package/dist/engine/adapters/opencode.d.ts.map +1 -0
  47. package/dist/engine/adapters/opencode.js +94 -0
  48. package/dist/engine/adapters/opencode.js.map +1 -0
  49. package/dist/engine/index.d.ts +4 -0
  50. package/dist/engine/index.d.ts.map +1 -0
  51. package/dist/engine/index.js +3 -0
  52. package/dist/engine/index.js.map +1 -0
  53. package/dist/engine/prompt.d.ts +9 -0
  54. package/dist/engine/prompt.d.ts.map +1 -0
  55. package/dist/engine/prompt.js +29 -0
  56. package/dist/engine/prompt.js.map +1 -0
  57. package/dist/engine/registry.d.ts +9 -0
  58. package/dist/engine/registry.d.ts.map +1 -0
  59. package/dist/engine/registry.js +24 -0
  60. package/dist/engine/registry.js.map +1 -0
  61. package/dist/engine/types.d.ts +42 -0
  62. package/dist/engine/types.d.ts.map +1 -0
  63. package/dist/engine/types.js +7 -0
  64. package/dist/engine/types.js.map +1 -0
  65. package/dist/types.d.ts +3 -1
  66. package/dist/types.d.ts.map +1 -1
  67. package/package.json +1 -1
@@ -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 { sessionId, onProgress } = 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
+ // --resume [id] Resume a previous session
29
+ const args = ["-p", fullPrompt, "--allow-all"];
30
+ // Set model if specified
31
+ if (model) {
32
+ args.push("--model", model);
33
+ }
34
+ // Resume session if available
35
+ if (sessionId) {
36
+ args.push("--resume", sessionId);
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"}
@@ -0,0 +1,9 @@
1
+ import type { ProjectContext } from "../types.js";
2
+ import type { EngineExecuteOptions } from "./types.js";
3
+ /**
4
+ * Build a fully-resolved prompt from engine execute options.
5
+ * Handles context injection and downloads-path system message.
6
+ * Shared across all engine adapters.
7
+ */
8
+ export declare function buildContextualPrompt(options: EngineExecuteOptions, ctx: ProjectContext): Promise<string>;
9
+ //# sourceMappingURL=prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/engine/prompt.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEvD;;;;GAIG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,oBAAoB,EAC7B,GAAG,EAAE,cAAc,GAClB,OAAO,CAAC,MAAM,CAAC,CAwBjB"}
@@ -0,0 +1,29 @@
1
+ import { formatContextPrompt, resolveContext } from "../context/resolver.js";
2
+ /**
3
+ * Build a fully-resolved prompt from engine execute options.
4
+ * Handles context injection and downloads-path system message.
5
+ * Shared across all engine adapters.
6
+ */
7
+ export async function buildContextualPrompt(options, ctx) {
8
+ const { prompt, gramCtx, downloadsPath } = options;
9
+ const { config, logger, bootContext } = ctx;
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
+ if (downloadsPath) {
25
+ return `${contextualPrompt}\n\n[System: To send files to the user, write them to: ${downloadsPath}]`;
26
+ }
27
+ return contextualPrompt;
28
+ }
29
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/engine/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAI7E;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,OAA6B,EAC7B,GAAmB;IAEnB,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC;IACnD,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,GAAG,CAAC;IAE5C,IAAI,gBAAgB,GAAG,MAAM,CAAC;IAC9B,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC;YACvC,OAAO;YACP,aAAa,EAAE,MAAM,CAAC,OAAO;YAC7B,WAAW;YACX,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,UAAU,EAAE,MAAM,CAAC,GAAG;YACtB,WAAW,EAAE,MAAM,CAAC,IAAI;YACxB,WAAW,EAAE,MAAM,CAAC,IAAI;YACxB,MAAM;SACP,CAAC,CAAC;QACH,gBAAgB,GAAG,mBAAmB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAC9D,CAAC;IAED,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,GAAG,gBAAgB,0DAA0D,aAAa,GAAG,CAAC;IACvG,CAAC;IAED,OAAO,gBAAgB,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { EngineAdapter, EngineName } from "./types.js";
2
+ /**
3
+ * Create an engine adapter by name.
4
+ * @param name - Engine identifier
5
+ * @param command - Optional custom CLI command override
6
+ * @param model - Optional model override (omit to use engine default)
7
+ */
8
+ export declare function getEngine(name: EngineName, command?: string, model?: string): EngineAdapter;
9
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/engine/registry.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAW5D;;;;;GAKG;AACH,wBAAgB,SAAS,CACvB,IAAI,EAAE,UAAU,EAChB,OAAO,CAAC,EAAE,MAAM,EAChB,KAAK,CAAC,EAAE,MAAM,GACb,aAAa,CAQf"}
@@ -0,0 +1,24 @@
1
+ import { createClaudeAdapter } from "./adapters/claude.js";
2
+ import { createCodexAdapter } from "./adapters/codex.js";
3
+ import { createCopilotAdapter } from "./adapters/copilot.js";
4
+ import { createOpencodeAdapter } from "./adapters/opencode.js";
5
+ const factories = {
6
+ claude: createClaudeAdapter,
7
+ copilot: createCopilotAdapter,
8
+ codex: createCodexAdapter,
9
+ opencode: createOpencodeAdapter,
10
+ };
11
+ /**
12
+ * Create an engine adapter by name.
13
+ * @param name - Engine identifier
14
+ * @param command - Optional custom CLI command override
15
+ * @param model - Optional model override (omit to use engine default)
16
+ */
17
+ export function getEngine(name, command, model) {
18
+ const factory = factories[name];
19
+ if (!factory) {
20
+ throw new Error(`Unknown engine "${name}". Supported: ${Object.keys(factories).join(", ")}`);
21
+ }
22
+ return factory(command, model);
23
+ }
24
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/engine/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAK/D,MAAM,SAAS,GAAuC;IACpD,MAAM,EAAE,mBAAmB;IAC3B,OAAO,EAAE,oBAAoB;IAC7B,KAAK,EAAE,kBAAkB;IACzB,QAAQ,EAAE,qBAAqB;CAChC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CACvB,IAAgB,EAChB,OAAgB,EAChB,KAAc;IAEd,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,mBAAmB,IAAI,iBAAiB,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC5E,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AACjC,CAAC"}
@@ -0,0 +1,42 @@
1
+ import type { Context as GrammyContext } from "grammy";
2
+ import type { ProjectContext } from "../types.js";
3
+ export type EngineName = "claude" | "copilot" | "codex" | "opencode";
4
+ export declare const ENGINE_NAMES: readonly EngineName[];
5
+ export interface EngineExecuteOptions {
6
+ prompt: string;
7
+ userDir: string;
8
+ gramCtx?: GrammyContext;
9
+ downloadsPath?: string;
10
+ sessionId?: string | null;
11
+ onProgress?: (message: string) => void;
12
+ }
13
+ export interface EngineResult {
14
+ success: boolean;
15
+ output: string;
16
+ sessionId?: string;
17
+ error?: string;
18
+ }
19
+ export interface ParsedResponse {
20
+ text: string;
21
+ sessionId?: string;
22
+ costUsd?: number;
23
+ inputTokens?: number;
24
+ outputTokens?: number;
25
+ }
26
+ export interface EngineAdapter {
27
+ /** Human-readable engine name for logs/errors */
28
+ readonly name: string;
29
+ /** CLI command to invoke (e.g. "claude", "copilot") */
30
+ readonly command: string;
31
+ /** Verify the CLI is installed and available; throw on failure */
32
+ check(): void;
33
+ /** Execute a prompt and return a normalised result */
34
+ execute(options: EngineExecuteOptions, ctx: ProjectContext): Promise<EngineResult>;
35
+ /** Parse raw result into user-facing response */
36
+ parse(result: EngineResult): ParsedResponse;
37
+ /** Return the skills directory path for a project */
38
+ skillsDir(projectCwd: string): string;
39
+ /** Return the instructions filename for init scaffolding */
40
+ instructionsFile(): string;
41
+ }
42
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/engine/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAIlD,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,UAAU,CAAC;AAErE,eAAO,MAAM,YAAY,EAAE,SAAS,UAAU,EAKpC,CAAC;AAIX,MAAM,WAAW,oBAAoB;IACnC,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,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,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;AAID,MAAM,WAAW,aAAa;IAC5B,iDAAiD;IACjD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,uDAAuD;IACvD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,kEAAkE;IAClE,KAAK,IAAI,IAAI,CAAC;IACd,sDAAsD;IACtD,OAAO,CACL,OAAO,EAAE,oBAAoB,EAC7B,GAAG,EAAE,cAAc,GAClB,OAAO,CAAC,YAAY,CAAC,CAAC;IACzB,iDAAiD;IACjD,KAAK,CAAC,MAAM,EAAE,YAAY,GAAG,cAAc,CAAC;IAC5C,qDAAqD;IACrD,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC;IACtC,4DAA4D;IAC5D,gBAAgB,IAAI,MAAM,CAAC;CAC5B"}
@@ -0,0 +1,7 @@
1
+ export const ENGINE_NAMES = [
2
+ "claude",
3
+ "copilot",
4
+ "codex",
5
+ "opencode",
6
+ ];
7
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/engine/types.ts"],"names":[],"mappings":"AAOA,MAAM,CAAC,MAAM,YAAY,GAA0B;IACjD,QAAQ;IACR,SAAS;IACT,OAAO;IACP,UAAU;CACF,CAAC"}
package/dist/types.d.ts CHANGED
@@ -1,9 +1,10 @@
1
1
  import type pino from "pino";
2
2
  import type { ResolvedProjectConfig } from "./config.js";
3
3
  import type { BootContext } from "./context/resolver.js";
4
+ import type { EngineAdapter } from "./engine/types.js";
4
5
  /**
5
6
  * Engine-agnostic interface for making one-shot AI calls from command handlers.
6
- * The underlying provider (Claude Code, Codex, etc.) is an implementation detail.
7
+ * The underlying provider (Claude Code, Copilot, etc.) is an implementation detail.
7
8
  */
8
9
  export interface Agent {
9
10
  call(prompt: string, options?: {
@@ -18,5 +19,6 @@ export interface ProjectContext {
18
19
  config: ResolvedProjectConfig;
19
20
  logger: pino.Logger;
20
21
  bootContext: BootContext;
22
+ engine: EngineAdapter;
21
23
  }
22
24
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEzD;;;GAGG;AACH,MAAM,WAAW,KAAK;IACpB,IAAI,CACF,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE,GACnD,OAAO,CAAC,MAAM,CAAC,CAAC;CACpB;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,qBAAqB,CAAC;IAC9B,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;IACpB,WAAW,EAAE,WAAW,CAAC;CAC1B"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD;;;GAGG;AACH,MAAM,WAAW,KAAK;IACpB,IAAI,CACF,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE,GACnD,OAAO,CAAC,MAAM,CAAC,CAAC;CACpB;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,qBAAqB,CAAC;IAC9B,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;IACpB,WAAW,EAAE,WAAW,CAAC;IACzB,MAAM,EAAE,aAAa,CAAC;CACvB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@marcopeg/hal",
3
- "version": "1.0.11",
3
+ "version": "1.0.12",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "bin": {