@marcopeg/hal 1.0.20 → 1.0.23

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 (117) hide show
  1. package/README.md +90 -768
  2. package/dist/agent/index.d.ts +3 -3
  3. package/dist/agent/index.d.ts.map +1 -1
  4. package/dist/agent/index.js +5 -5
  5. package/dist/agent/index.js.map +1 -1
  6. package/dist/bot/commands/loader.d.ts +14 -2
  7. package/dist/bot/commands/loader.d.ts.map +1 -1
  8. package/dist/bot/commands/loader.js +75 -24
  9. package/dist/bot/commands/loader.js.map +1 -1
  10. package/dist/bot/commands/message.d.ts.map +1 -1
  11. package/dist/bot/commands/message.js +5 -4
  12. package/dist/bot/commands/message.js.map +1 -1
  13. package/dist/bot/commands/model-callback.d.ts +4 -0
  14. package/dist/bot/commands/model-callback.d.ts.map +1 -0
  15. package/dist/bot/commands/model-callback.js +34 -0
  16. package/dist/bot/commands/model-callback.js.map +1 -0
  17. package/dist/bot/commands/model.d.ts +4 -0
  18. package/dist/bot/commands/model.d.ts.map +1 -0
  19. package/dist/bot/commands/model.js +83 -0
  20. package/dist/bot/commands/model.js.map +1 -0
  21. package/dist/bot/commands/reset.d.ts +3 -2
  22. package/dist/bot/commands/reset.d.ts.map +1 -1
  23. package/dist/bot/commands/reset.js +73 -10
  24. package/dist/bot/commands/reset.js.map +1 -1
  25. package/dist/bot/commands/resetPrompt.d.ts +20 -0
  26. package/dist/bot/commands/resetPrompt.d.ts.map +1 -0
  27. package/dist/bot/commands/resetPrompt.js +58 -0
  28. package/dist/bot/commands/resetPrompt.js.map +1 -0
  29. package/dist/bot/commands/watcher.d.ts +1 -1
  30. package/dist/bot/commands/watcher.d.ts.map +1 -1
  31. package/dist/bot/commands/watcher.js +20 -6
  32. package/dist/bot/commands/watcher.js.map +1 -1
  33. package/dist/bot/handlers/text.d.ts.map +1 -1
  34. package/dist/bot/handlers/text.js +4 -6
  35. package/dist/bot/handlers/text.js.map +1 -1
  36. package/dist/bot/middleware/auth.d.ts +0 -3
  37. package/dist/bot/middleware/auth.d.ts.map +1 -1
  38. package/dist/bot/middleware/auth.js +13 -12
  39. package/dist/bot/middleware/auth.js.map +1 -1
  40. package/dist/bot.d.ts.map +1 -1
  41. package/dist/bot.js +25 -7
  42. package/dist/bot.js.map +1 -1
  43. package/dist/cli.js +15 -22
  44. package/dist/cli.js.map +1 -1
  45. package/dist/config-watcher.d.ts.map +1 -1
  46. package/dist/config-watcher.js +6 -0
  47. package/dist/config-watcher.js.map +1 -1
  48. package/dist/config-writer.d.ts +8 -0
  49. package/dist/config-writer.d.ts.map +1 -0
  50. package/dist/config-writer.js +57 -0
  51. package/dist/config-writer.js.map +1 -0
  52. package/dist/config.d.ts +221 -13
  53. package/dist/config.d.ts.map +1 -1
  54. package/dist/config.js +222 -43
  55. package/dist/config.js.map +1 -1
  56. package/dist/engine/adapters/antigravity.d.ts +13 -0
  57. package/dist/engine/adapters/antigravity.d.ts.map +1 -0
  58. package/dist/engine/adapters/antigravity.js +230 -0
  59. package/dist/engine/adapters/antigravity.js.map +1 -0
  60. package/dist/engine/adapters/claude.js +2 -2
  61. package/dist/engine/adapters/claude.js.map +1 -1
  62. package/dist/engine/adapters/codex.d.ts.map +1 -1
  63. package/dist/engine/adapters/codex.js +2 -3
  64. package/dist/engine/adapters/codex.js.map +1 -1
  65. package/dist/engine/adapters/copilot.d.ts.map +1 -1
  66. package/dist/engine/adapters/copilot.js +6 -3
  67. package/dist/engine/adapters/copilot.js.map +1 -1
  68. package/dist/engine/adapters/cursor.d.ts.map +1 -1
  69. package/dist/engine/adapters/cursor.js +5 -2
  70. package/dist/engine/adapters/cursor.js.map +1 -1
  71. package/dist/engine/adapters/opencode.d.ts.map +1 -1
  72. package/dist/engine/adapters/opencode.js +6 -2
  73. package/dist/engine/adapters/opencode.js.map +1 -1
  74. package/dist/engine/detect.d.ts +26 -0
  75. package/dist/engine/detect.d.ts.map +1 -0
  76. package/dist/engine/detect.js +129 -0
  77. package/dist/engine/detect.js.map +1 -0
  78. package/dist/engine/model-cache.d.ts +25 -0
  79. package/dist/engine/model-cache.d.ts.map +1 -0
  80. package/dist/engine/model-cache.js +162 -0
  81. package/dist/engine/model-cache.js.map +1 -0
  82. package/dist/engine/model-validation.d.ts +9 -0
  83. package/dist/engine/model-validation.d.ts.map +1 -0
  84. package/dist/engine/model-validation.js +21 -0
  85. package/dist/engine/model-validation.js.map +1 -0
  86. package/dist/engine/models-data.generated.d.ts +4 -0
  87. package/dist/engine/models-data.generated.d.ts.map +1 -0
  88. package/dist/engine/models-data.generated.js +196 -0
  89. package/dist/engine/models-data.generated.js.map +1 -0
  90. package/dist/engine/models-fetch.d.ts +5 -0
  91. package/dist/engine/models-fetch.d.ts.map +1 -0
  92. package/dist/engine/models-fetch.js +54 -0
  93. package/dist/engine/models-fetch.js.map +1 -0
  94. package/dist/engine/probe-utils.d.ts +6 -0
  95. package/dist/engine/probe-utils.d.ts.map +1 -0
  96. package/dist/engine/probe-utils.js +42 -0
  97. package/dist/engine/probe-utils.js.map +1 -0
  98. package/dist/engine/registry.d.ts.map +1 -1
  99. package/dist/engine/registry.js +2 -0
  100. package/dist/engine/registry.js.map +1 -1
  101. package/dist/engine/types.d.ts +3 -3
  102. package/dist/engine/types.d.ts.map +1 -1
  103. package/dist/engine/types.js +1 -0
  104. package/dist/engine/types.js.map +1 -1
  105. package/dist/logger.d.ts +2 -1
  106. package/dist/logger.d.ts.map +1 -1
  107. package/dist/logger.js +54 -3
  108. package/dist/logger.js.map +1 -1
  109. package/dist/prompts.d.ts +19 -0
  110. package/dist/prompts.d.ts.map +1 -0
  111. package/dist/prompts.js +73 -0
  112. package/dist/prompts.js.map +1 -0
  113. package/dist/setup-wizard.d.ts +4 -0
  114. package/dist/setup-wizard.d.ts.map +1 -0
  115. package/dist/setup-wizard.js +258 -0
  116. package/dist/setup-wizard.js.map +1 -0
  117. package/package.json +5 -2
@@ -1 +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,GAAG,QAAQ,CAAC;AAEhF,eAAO,MAAM,YAAY,EAAE,SAAS,UAAU,EAMpC,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;IACvC,8EAA8E;IAC9E,eAAe,CAAC,EAAE,OAAO,CAAC;IAG1B,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;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"}
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,GAClB,QAAQ,GACR,SAAS,GACT,OAAO,GACP,UAAU,GACV,QAAQ,GACR,aAAa,CAAC;AAElB,eAAO,MAAM,YAAY,EAAE,SAAS,UAAU,EAOpC,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;IACvC,8EAA8E;IAC9E,eAAe,CAAC,EAAE,OAAO,CAAC;IAG1B,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;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,yFAAyF;IACzF,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACzC,4DAA4D;IAC5D,gBAAgB,IAAI,MAAM,CAAC;CAC5B"}
@@ -4,5 +4,6 @@ export const ENGINE_NAMES = [
4
4
  "codex",
5
5
  "opencode",
6
6
  "cursor",
7
+ "antigravity",
7
8
  ];
8
9
  //# sourceMappingURL=types.js.map
@@ -1 +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;IACV,QAAQ;CACA,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/engine/types.ts"],"names":[],"mappings":"AAaA,MAAM,CAAC,MAAM,YAAY,GAA0B;IACjD,QAAQ;IACR,SAAS;IACT,OAAO;IACP,UAAU;IACV,QAAQ;IACR,aAAa;CACL,CAAC"}
package/dist/logger.d.ts CHANGED
@@ -1,7 +1,8 @@
1
1
  import pino from "pino";
2
2
  import type { ResolvedProjectConfig } from "./config.js";
3
3
  /**
4
- * A startup logger for CLI-level messages. Always writes to stdout at info level.
4
+ * A startup logger for CLI-level messages. Writes human-readable lines to stdout
5
+ * at info level and flushes synchronously so boot order is stable.
5
6
  * Used before per-project loggers are created, and for process-level notices.
6
7
  */
7
8
  export declare function createStartupLogger(): pino.Logger;
@@ -1 +1 @@
1
- {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAGA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEzD;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAAC,MAAM,CAEjD;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,qBAAqB,GAC5B,IAAI,CAAC,MAAM,CA4Bb"}
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAGA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AA6DzD;;;;GAIG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAAC,MAAM,CAEjD;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,qBAAqB,GAC5B,IAAI,CAAC,MAAM,CA4Bb"}
package/dist/logger.js CHANGED
@@ -2,12 +2,63 @@ import { createWriteStream, mkdirSync } from "node:fs";
2
2
  import { join } from "node:path";
3
3
  import { Writable } from "node:stream";
4
4
  import pino from "pino";
5
+ const LEVEL_NAMES = {
6
+ 10: "TRACE",
7
+ 20: "DEBUG",
8
+ 30: "INFO",
9
+ 40: "WARN",
10
+ 50: "ERROR",
11
+ 60: "FATAL",
12
+ };
5
13
  /**
6
- * A startup logger for CLI-level messages. Always writes to stdout at info level.
14
+ * Human-readable stream for terminal logs: parses pino NDJSON and writes
15
+ * "[HH:mm:ss] LEVEL message" so boot and runtime output is readable.
16
+ */
17
+ function createPrettyLogStream(out = process.stdout) {
18
+ let buffer = "";
19
+ return new Writable({
20
+ write(chunk, _enc, cb) {
21
+ buffer += chunk.toString();
22
+ const lines = buffer.split("\n");
23
+ buffer = lines.pop() ?? "";
24
+ for (const line of lines) {
25
+ if (!line.trim())
26
+ continue;
27
+ try {
28
+ const obj = JSON.parse(line);
29
+ const time = obj.time != null ? new Date(obj.time) : new Date();
30
+ const ts = time.toTimeString().slice(0, 8);
31
+ const levelName = LEVEL_NAMES[obj.level ?? 30] ?? "INFO";
32
+ const msg = obj.msg ?? "";
33
+ const rest = [];
34
+ for (const [k, v] of Object.entries(obj)) {
35
+ if (k === "level" ||
36
+ k === "time" ||
37
+ k === "msg" ||
38
+ k === "pid" ||
39
+ k === "hostname")
40
+ continue;
41
+ if (v !== undefined && v !== null)
42
+ rest.push(`${k}=${JSON.stringify(v)}`);
43
+ }
44
+ const suffix = rest.length > 0 ? ` ${rest.join(" ")}` : "";
45
+ out.write(`${ts} ${levelName} ${msg}${suffix}\n`);
46
+ }
47
+ catch {
48
+ out.write(line + "\n");
49
+ }
50
+ }
51
+ cb();
52
+ },
53
+ });
54
+ }
55
+ /**
56
+ * A startup logger for CLI-level messages. Writes human-readable lines to stdout
57
+ * at info level and flushes synchronously so boot order is stable.
7
58
  * Used before per-project loggers are created, and for process-level notices.
8
59
  */
9
60
  export function createStartupLogger() {
10
- return pino({ level: "info" });
61
+ return pino({ level: "info" }, createPrettyLogStream());
11
62
  }
12
63
  /**
13
64
  * Create a per-project logger that respects flow and persist settings.
@@ -21,7 +72,7 @@ export function createProjectLogger(config) {
21
72
  const { level, flow, persist } = config.logging;
22
73
  const streams = [];
23
74
  if (flow) {
24
- streams.push({ stream: process.stdout });
75
+ streams.push({ stream: createPrettyLogStream() });
25
76
  }
26
77
  if (persist) {
27
78
  mkdirSync(config.logDir, { recursive: true });
@@ -1 +1 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,IAAI,MAAM,MAAM,CAAC;AAGxB;;;GAGG;AACH,MAAM,UAAU,mBAAmB;IACjC,OAAO,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;AACjC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CACjC,MAA6B;IAE7B,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC;IAEhD,MAAM,OAAO,GAAuB,EAAE,CAAC;IAEvC,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,OAAO,EAAE,CAAC;QACZ,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa;QACjE,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,CAAC;QACnD,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,iBAAiB,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,0EAA0E;QAC1E,OAAO,CAAC,IAAI,CAAC;YACX,MAAM,EAAE,IAAI,QAAQ,CAAC;gBACnB,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE;oBACpB,EAAE,EAAE,CAAC;gBACP,CAAC;aACF,CAAC;SACH,CAAC,CAAC;IACL,CAAC;IAED,OAAO,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;AACpD,CAAC"}
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /** Close the shared readline. Call once when all prompts are done. */
2
+ export declare function closePrompts(): void;
3
+ export declare function confirm(options: {
4
+ message: string;
5
+ default?: boolean;
6
+ }): Promise<boolean>;
7
+ export declare function input(options: {
8
+ message: string;
9
+ default?: string;
10
+ validate?: (val: string) => string | true;
11
+ }): Promise<string>;
12
+ export declare function select<T extends string>(options: {
13
+ message: string;
14
+ choices: Array<{
15
+ name: string;
16
+ value: T;
17
+ }>;
18
+ }): Promise<T>;
19
+ //# sourceMappingURL=prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AA6BA,sEAAsE;AACtE,wBAAgB,YAAY,IAAI,IAAI,CAKnC;AAUD,wBAAsB,OAAO,CAAC,OAAO,EAAE;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,GAAG,OAAO,CAAC,OAAO,CAAC,CAQnB;AAID,wBAAsB,KAAK,CAAC,OAAO,EAAE;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;CAC3C,GAAG,OAAO,CAAC,MAAM,CAAC,CAkBlB;AAID,wBAAsB,MAAM,CAAC,CAAC,SAAS,MAAM,EAAE,OAAO,EAAE;IACtD,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,CAAC,CAAA;KAAE,CAAC,CAAC;CAC5C,GAAG,OAAO,CAAC,CAAC,CAAC,CAiBb"}
@@ -0,0 +1,73 @@
1
+ import { createInterface } from "node:readline";
2
+ let sharedRl = null;
3
+ function getRl() {
4
+ if (!sharedRl) {
5
+ sharedRl = createInterface({
6
+ input: process.stdin,
7
+ output: process.stdout,
8
+ });
9
+ // Clean up when stdin closes naturally
10
+ sharedRl.on("close", () => {
11
+ sharedRl = null;
12
+ });
13
+ }
14
+ return sharedRl;
15
+ }
16
+ /** Close the shared readline. Call once when all prompts are done. */
17
+ export function closePrompts() {
18
+ if (sharedRl) {
19
+ sharedRl.close();
20
+ sharedRl = null;
21
+ }
22
+ }
23
+ function ask(rl, q) {
24
+ return new Promise((resolve) => {
25
+ rl.question(q, (answer) => resolve(answer));
26
+ });
27
+ }
28
+ // ─── confirm ────────────────────────────────────────────────────────────────
29
+ export async function confirm(options) {
30
+ const defaultVal = options.default ?? true;
31
+ const hint = defaultVal ? "Y/n" : "y/N";
32
+ const rl = getRl();
33
+ const answer = await ask(rl, `? ${options.message} (${hint}) `);
34
+ const trimmed = answer.trim().toLowerCase();
35
+ if (trimmed === "")
36
+ return defaultVal;
37
+ return trimmed === "y" || trimmed === "yes";
38
+ }
39
+ // ─── input ──────────────────────────────────────────────────────────────────
40
+ export async function input(options) {
41
+ const rl = getRl();
42
+ const suffix = options.default ? ` (${options.default})` : "";
43
+ while (true) {
44
+ const answer = await ask(rl, `? ${options.message}${suffix} `);
45
+ const value = answer.trim() || options.default || "";
46
+ if (options.validate) {
47
+ const result = options.validate(value);
48
+ if (result !== true) {
49
+ console.log(` ${result}`);
50
+ continue;
51
+ }
52
+ }
53
+ return value;
54
+ }
55
+ }
56
+ // ─── select ─────────────────────────────────────────────────────────────────
57
+ export async function select(options) {
58
+ const { choices } = options;
59
+ const rl = getRl();
60
+ console.log(`? ${options.message}`);
61
+ for (let i = 0; i < choices.length; i++) {
62
+ console.log(` ${i + 1}. ${choices[i].name}`);
63
+ }
64
+ while (true) {
65
+ const answer = await ask(rl, `Enter choice (1-${choices.length}): `);
66
+ const num = Number.parseInt(answer.trim(), 10);
67
+ if (num >= 1 && num <= choices.length) {
68
+ return choices[num - 1].value;
69
+ }
70
+ console.log(` Please enter a number between 1 and ${choices.length}.`);
71
+ }
72
+ }
73
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type pino from "pino";
2
+ export declare function runSetupWizard(configDir: string, logger: pino.Logger): Promise<void>;
3
+ export declare function runConfigRepair(configDir: string, raw: Record<string, unknown>, issues: string[], logger: pino.Logger): Promise<void>;
4
+ //# sourceMappingURL=setup-wizard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-wizard.d.ts","sourceRoot":"","sources":["../src/setup-wizard.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAY7B,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,IAAI,CAAC,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CA+Ff;AAID,wBAAsB,eAAe,CACnC,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,MAAM,EAAE,MAAM,EAAE,EAChB,MAAM,EAAE,IAAI,CAAC,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CAmFf"}
@@ -0,0 +1,258 @@
1
+ import { existsSync, readdirSync, statSync, writeFileSync } from "node:fs";
2
+ import { writeFile } from "node:fs/promises";
3
+ import { basename, join, resolve } from "node:path";
4
+ import open from "open";
5
+ import { getDefaultEngineModel } from "./default-models.js";
6
+ import { detectEngine } from "./engine/detect.js";
7
+ import { getEngine } from "./engine/registry.js";
8
+ import { closePrompts, confirm, input, select } from "./prompts.js";
9
+ // ─── Constants ──────────────────────────────────────────────────────────────
10
+ const BOTFATHER_URL = "https://core.telegram.org/bots/tutorial";
11
+ // ─── Full setup wizard (no config file exists) ─────────────────────────────
12
+ export async function runSetupWizard(configDir, logger) {
13
+ console.log("");
14
+ console.log("Hey! Looks like you don't have a config file yet.");
15
+ const wantSetup = await confirm({
16
+ message: "Want me to help you set one up?",
17
+ });
18
+ if (!wantSetup) {
19
+ console.log('No worries! You can run "npx @marcopeg/hal init" any time to create a template config.');
20
+ process.exit(0);
21
+ }
22
+ // 1. Engine detection (skip both initial and persist prompts — wizard handles config writing)
23
+ console.log("");
24
+ console.log("Let's start by finding an AI engine on your system...");
25
+ const { engine: engineName } = await detectEngine(configDir, logger, {
26
+ skipInitialPrompt: true,
27
+ skipPersistPrompt: true,
28
+ });
29
+ // 2. Project working directory
30
+ console.log("");
31
+ const projectCwd = await askProjectCwd(configDir);
32
+ // 3. Telegram bot token
33
+ console.log("");
34
+ const botToken = await askBotToken();
35
+ // 4. Project name (optional)
36
+ console.log("");
37
+ const defaultName = projectCwd === "."
38
+ ? basename(resolve(configDir))
39
+ : basename(resolve(configDir, projectCwd));
40
+ const projectName = await input({
41
+ message: "Project name (press Enter to skip):",
42
+ default: defaultName,
43
+ });
44
+ // 5. Dictation / transcription
45
+ console.log("");
46
+ const enableDictation = await confirm({
47
+ message: "Enable voice dictation? (allows sending voice messages to the bot)",
48
+ default: false,
49
+ });
50
+ // 6. Build and write config
51
+ const config = {
52
+ globals: {
53
+ engine: { name: engineName },
54
+ logging: { level: "info", flow: true, persist: false },
55
+ rateLimit: { max: 10, windowMs: 60000 },
56
+ access: { allowedUserIds: [] },
57
+ ...(enableDictation
58
+ ? { transcription: { model: "base.en", showTranscription: true } }
59
+ : {}),
60
+ },
61
+ projects: [
62
+ {
63
+ ...(projectName.trim() ? { name: projectName.trim() } : {}),
64
+ cwd: projectCwd.trim(),
65
+ telegram: { botToken: botToken.trim() },
66
+ access: { allowedUserIds: [] },
67
+ },
68
+ ],
69
+ };
70
+ const configPath = join(configDir, "hal.config.json");
71
+ writeFileSync(configPath, `${JSON.stringify(config, null, 2)}\n`, "utf-8");
72
+ logger.info({ configPath }, "Configuration file created");
73
+ // 7. Scaffold engine instructions file
74
+ const effectiveModel = getDefaultEngineModel(engineName);
75
+ const engineAdapter = getEngine(engineName, undefined, effectiveModel);
76
+ const instrFile = engineAdapter.instructionsFile();
77
+ const instrPath = join(configDir, instrFile);
78
+ if (!existsSync(instrPath)) {
79
+ await writeFile(instrPath, "# Project Instructions\n\nAdd your project-specific instructions here.\n", "utf-8");
80
+ console.log(`Created ${instrFile}`);
81
+ }
82
+ closePrompts();
83
+ console.log("");
84
+ console.log(`Config written to ${configPath}`);
85
+ console.log("Setup complete! Starting up...");
86
+ console.log("");
87
+ }
88
+ // ─── Config repair (config exists but has validation issues) ────────────────
89
+ export async function runConfigRepair(configDir, raw, issues, logger) {
90
+ console.log("");
91
+ console.log("Your config file has some issues:");
92
+ for (const issue of issues) {
93
+ console.log(` - ${issue}`);
94
+ }
95
+ console.log("");
96
+ const wantRepair = await confirm({
97
+ message: "Want me to help you fix them?",
98
+ });
99
+ if (!wantRepair) {
100
+ console.log("Please fix the issues above and try again.");
101
+ process.exit(1);
102
+ }
103
+ const patched = { ...raw };
104
+ // Ensure globals exists
105
+ if (!patched.globals || typeof patched.globals !== "object") {
106
+ patched.globals = {};
107
+ }
108
+ const globals = patched.globals;
109
+ // Check engine
110
+ const engine = globals.engine;
111
+ if (!engine?.name) {
112
+ console.log("");
113
+ console.log("Let's find an AI engine for you...");
114
+ const { engine: engineName } = await detectEngine(configDir, logger, {
115
+ skipInitialPrompt: true,
116
+ skipPersistPrompt: true,
117
+ });
118
+ globals.engine = { ...engine, name: engineName };
119
+ }
120
+ // Check projects
121
+ let projects = patched.projects;
122
+ if (!Array.isArray(projects) || projects.length === 0) {
123
+ console.log("");
124
+ console.log("No projects configured. Let's add one!");
125
+ const project = await askNewProject(configDir);
126
+ patched.projects = [project];
127
+ projects = patched.projects;
128
+ }
129
+ // Check each project for missing mandatory fields
130
+ for (let i = 0; i < projects.length; i++) {
131
+ const proj = projects[i];
132
+ const label = proj.name || `project ${i + 1}`;
133
+ if (!proj.cwd || proj.cwd.trim().length === 0) {
134
+ console.log("");
135
+ console.log(`Missing working directory for "${label}".`);
136
+ proj.cwd = await askProjectCwd(configDir);
137
+ }
138
+ const telegram = proj.telegram;
139
+ const token = telegram?.botToken;
140
+ if (!token ||
141
+ token.trim().length === 0 ||
142
+ token === "YOUR_BOT_TOKEN_HERE") {
143
+ console.log("");
144
+ console.log(`Missing Telegram bot token for "${label}".`);
145
+ const newToken = await askBotToken();
146
+ proj.telegram = { ...telegram, botToken: newToken.trim() };
147
+ }
148
+ }
149
+ // Write patched config
150
+ const configPath = join(configDir, "hal.config.json");
151
+ writeFileSync(configPath, `${JSON.stringify(patched, null, 2)}\n`, "utf-8");
152
+ logger.info({ configPath }, "Configuration file repaired");
153
+ closePrompts();
154
+ console.log("");
155
+ console.log(`Config updated at ${configPath}`);
156
+ console.log("Issues fixed! Starting up...");
157
+ console.log("");
158
+ }
159
+ // ─── Shared prompt helpers ──────────────────────────────────────────────────
160
+ async function askProjectCwd(configDir) {
161
+ // Scan for subdirectories to offer as choices
162
+ const subdirs = listSubdirectories(configDir);
163
+ if (subdirs.length > 0) {
164
+ const cwdChoice = await select({
165
+ message: "Which folder should the AI engine work in?",
166
+ choices: [
167
+ { name: ". (current directory)", value: "." },
168
+ ...subdirs.map((d) => ({ name: d, value: d })),
169
+ { name: "Enter a custom path...", value: "__custom__" },
170
+ ],
171
+ });
172
+ if (cwdChoice !== "__custom__") {
173
+ return cwdChoice;
174
+ }
175
+ }
176
+ return input({
177
+ message: "Project working directory:",
178
+ default: ".",
179
+ validate: (val) => {
180
+ if (!val || val.trim().length === 0)
181
+ return "A working directory is required.";
182
+ const resolved = resolve(configDir, val.trim());
183
+ if (!existsSync(resolved))
184
+ return `Directory not found: ${resolved}`;
185
+ return true;
186
+ },
187
+ });
188
+ }
189
+ async function askBotToken() {
190
+ const hasToken = await select({
191
+ message: "Do you have a Telegram bot token?",
192
+ choices: [
193
+ {
194
+ name: "Yes, I have a token",
195
+ value: "yes",
196
+ },
197
+ {
198
+ name: "No, help me create one",
199
+ value: "help",
200
+ },
201
+ ],
202
+ });
203
+ if (hasToken === "help") {
204
+ console.log("");
205
+ console.log("Opening the Telegram Bot tutorial — follow the steps to create a bot with @BotFather.");
206
+ console.log("Once you have the token, come back here and paste it.");
207
+ await open(BOTFATHER_URL);
208
+ console.log("");
209
+ }
210
+ return input({
211
+ message: "Telegram bot token (from @BotFather):",
212
+ validate: (val) => {
213
+ if (!val || val.trim().length === 0)
214
+ return "A bot token is required.";
215
+ return true;
216
+ },
217
+ });
218
+ }
219
+ async function askNewProject(configDir) {
220
+ const cwd = await askProjectCwd(configDir);
221
+ const botToken = await askBotToken();
222
+ const defaultName = cwd === "."
223
+ ? basename(resolve(configDir))
224
+ : basename(resolve(configDir, cwd));
225
+ const name = await input({
226
+ message: "Project name (press Enter to skip):",
227
+ default: defaultName,
228
+ });
229
+ return {
230
+ ...(name.trim() ? { name: name.trim() } : {}),
231
+ cwd: cwd.trim(),
232
+ telegram: { botToken: botToken.trim() },
233
+ access: { allowedUserIds: [] },
234
+ };
235
+ }
236
+ // ─── Helpers ────────────────────────────────────────────────────────────────
237
+ function listSubdirectories(dir) {
238
+ try {
239
+ return readdirSync(dir)
240
+ .filter((entry) => {
241
+ if (entry.startsWith("."))
242
+ return false;
243
+ if (entry === "node_modules" || entry === "dist")
244
+ return false;
245
+ try {
246
+ return statSync(join(dir, entry)).isDirectory();
247
+ }
248
+ catch {
249
+ return false;
250
+ }
251
+ })
252
+ .sort();
253
+ }
254
+ catch {
255
+ return [];
256
+ }
257
+ }
258
+ //# sourceMappingURL=setup-wizard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-wizard.js","sourceRoot":"","sources":["../src/setup-wizard.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@marcopeg/hal",
3
- "version": "1.0.20",
3
+ "version": "1.0.23",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -20,7 +20,8 @@
20
20
  "prepublishOnly": "pnpm run build",
21
21
  "sync-skills": "node .agents/scripts/sync-skills.mjs",
22
22
  "prepare": "husky",
23
- "deploy": "npm version patch && npm publish --access public"
23
+ "deploy": "npm version patch && npm publish --access public",
24
+ "docs": "npx mdts"
24
25
  },
25
26
  "keywords": [
26
27
  "telegram",
@@ -47,6 +48,8 @@
47
48
  "grammy": "^1.39.2",
48
49
  "nodejs-whisper": "^0.2.9",
49
50
  "pino": "^10.2.0",
51
+ "strip-json-comments": "^5.0.3",
52
+ "yaml": "^2.8.2",
50
53
  "zod": "^4.3.5"
51
54
  },
52
55
  "devDependencies": {