@marcopeg/hal 1.0.18 → 1.0.22

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 (163) hide show
  1. package/README.md +90 -743
  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/git/callback.d.ts +8 -0
  7. package/dist/bot/commands/git/callback.d.ts.map +1 -0
  8. package/dist/bot/commands/git/callback.js +72 -0
  9. package/dist/bot/commands/git/callback.js.map +1 -0
  10. package/dist/bot/commands/git/clean.d.ts +4 -0
  11. package/dist/bot/commands/git/clean.d.ts.map +1 -0
  12. package/dist/bot/commands/git/clean.js +50 -0
  13. package/dist/bot/commands/git/clean.js.map +1 -0
  14. package/dist/bot/commands/git/commit.d.ts +4 -0
  15. package/dist/bot/commands/git/commit.d.ts.map +1 -0
  16. package/dist/bot/commands/git/commit.js +72 -0
  17. package/dist/bot/commands/git/commit.js.map +1 -0
  18. package/dist/bot/commands/git/exec.d.ts +6 -0
  19. package/dist/bot/commands/git/exec.d.ts.map +1 -0
  20. package/dist/bot/commands/git/exec.js +16 -0
  21. package/dist/bot/commands/git/exec.js.map +1 -0
  22. package/dist/bot/commands/git/index.d.ts +6 -0
  23. package/dist/bot/commands/git/index.d.ts.map +1 -0
  24. package/dist/bot/commands/git/index.js +6 -0
  25. package/dist/bot/commands/git/index.js.map +1 -0
  26. package/dist/bot/commands/git/init.d.ts +4 -0
  27. package/dist/bot/commands/git/init.d.ts.map +1 -0
  28. package/dist/bot/commands/git/init.js +22 -0
  29. package/dist/bot/commands/git/init.js.map +1 -0
  30. package/dist/bot/commands/git/status.d.ts +4 -0
  31. package/dist/bot/commands/git/status.d.ts.map +1 -0
  32. package/dist/bot/commands/git/status.js +18 -0
  33. package/dist/bot/commands/git/status.js.map +1 -0
  34. package/dist/bot/commands/help.js +1 -1
  35. package/dist/bot/commands/help.js.map +1 -1
  36. package/dist/bot/commands/loader.d.ts +14 -6
  37. package/dist/bot/commands/loader.d.ts.map +1 -1
  38. package/dist/bot/commands/loader.js +126 -34
  39. package/dist/bot/commands/loader.js.map +1 -1
  40. package/dist/bot/commands/message.d.ts.map +1 -1
  41. package/dist/bot/commands/message.js +51 -25
  42. package/dist/bot/commands/message.js.map +1 -1
  43. package/dist/bot/commands/model-callback.d.ts +4 -0
  44. package/dist/bot/commands/model-callback.d.ts.map +1 -0
  45. package/dist/bot/commands/model-callback.js +34 -0
  46. package/dist/bot/commands/model-callback.js.map +1 -0
  47. package/dist/bot/commands/model.d.ts +4 -0
  48. package/dist/bot/commands/model.d.ts.map +1 -0
  49. package/dist/bot/commands/model.js +83 -0
  50. package/dist/bot/commands/model.js.map +1 -0
  51. package/dist/bot/commands/reset.d.ts +3 -2
  52. package/dist/bot/commands/reset.d.ts.map +1 -1
  53. package/dist/bot/commands/reset.js +73 -10
  54. package/dist/bot/commands/reset.js.map +1 -1
  55. package/dist/bot/commands/resetPrompt.d.ts +20 -0
  56. package/dist/bot/commands/resetPrompt.d.ts.map +1 -0
  57. package/dist/bot/commands/resetPrompt.js +58 -0
  58. package/dist/bot/commands/resetPrompt.js.map +1 -0
  59. package/dist/bot/commands/session.d.ts +2 -2
  60. package/dist/bot/commands/session.d.ts.map +1 -1
  61. package/dist/bot/commands/session.js +7 -4
  62. package/dist/bot/commands/session.js.map +1 -1
  63. package/dist/bot/commands/start.js +2 -2
  64. package/dist/bot/commands/start.js.map +1 -1
  65. package/dist/bot/commands/watcher.d.ts +2 -1
  66. package/dist/bot/commands/watcher.d.ts.map +1 -1
  67. package/dist/bot/commands/watcher.js +11 -5
  68. package/dist/bot/commands/watcher.js.map +1 -1
  69. package/dist/bot/handlers/text.d.ts.map +1 -1
  70. package/dist/bot/handlers/text.js +11 -6
  71. package/dist/bot/handlers/text.js.map +1 -1
  72. package/dist/bot/middleware/auth.d.ts +0 -3
  73. package/dist/bot/middleware/auth.d.ts.map +1 -1
  74. package/dist/bot/middleware/auth.js +13 -12
  75. package/dist/bot/middleware/auth.js.map +1 -1
  76. package/dist/bot.d.ts.map +1 -1
  77. package/dist/bot.js +43 -11
  78. package/dist/bot.js.map +1 -1
  79. package/dist/cli.js +52 -29
  80. package/dist/cli.js.map +1 -1
  81. package/dist/config-watcher.d.ts +10 -0
  82. package/dist/config-watcher.d.ts.map +1 -0
  83. package/dist/config-watcher.js +55 -0
  84. package/dist/config-watcher.js.map +1 -0
  85. package/dist/config-writer.d.ts +8 -0
  86. package/dist/config-writer.d.ts.map +1 -0
  87. package/dist/config-writer.js +57 -0
  88. package/dist/config-writer.js.map +1 -0
  89. package/dist/config.d.ts +338 -53
  90. package/dist/config.d.ts.map +1 -1
  91. package/dist/config.js +337 -92
  92. package/dist/config.js.map +1 -1
  93. package/dist/context/resolver.d.ts +4 -0
  94. package/dist/context/resolver.d.ts.map +1 -1
  95. package/dist/context/resolver.js +8 -2
  96. package/dist/context/resolver.js.map +1 -1
  97. package/dist/default-models.d.ts +3 -0
  98. package/dist/default-models.d.ts.map +1 -0
  99. package/dist/default-models.js +16 -0
  100. package/dist/default-models.js.map +1 -0
  101. package/dist/engine/adapters/antigravity.d.ts +13 -0
  102. package/dist/engine/adapters/antigravity.d.ts.map +1 -0
  103. package/dist/engine/adapters/antigravity.js +230 -0
  104. package/dist/engine/adapters/antigravity.js.map +1 -0
  105. package/dist/engine/adapters/claude.js +2 -2
  106. package/dist/engine/adapters/claude.js.map +1 -1
  107. package/dist/engine/adapters/codex.d.ts.map +1 -1
  108. package/dist/engine/adapters/codex.js +27 -8
  109. package/dist/engine/adapters/codex.js.map +1 -1
  110. package/dist/engine/adapters/copilot.d.ts.map +1 -1
  111. package/dist/engine/adapters/copilot.js +6 -3
  112. package/dist/engine/adapters/copilot.js.map +1 -1
  113. package/dist/engine/adapters/cursor.d.ts +3 -0
  114. package/dist/engine/adapters/cursor.d.ts.map +1 -0
  115. package/dist/engine/adapters/cursor.js +106 -0
  116. package/dist/engine/adapters/cursor.js.map +1 -0
  117. package/dist/engine/adapters/opencode.d.ts +2 -2
  118. package/dist/engine/adapters/opencode.d.ts.map +1 -1
  119. package/dist/engine/adapters/opencode.js +33 -13
  120. package/dist/engine/adapters/opencode.js.map +1 -1
  121. package/dist/engine/detect.d.ts +26 -0
  122. package/dist/engine/detect.d.ts.map +1 -0
  123. package/dist/engine/detect.js +129 -0
  124. package/dist/engine/detect.js.map +1 -0
  125. package/dist/engine/model-cache.d.ts +25 -0
  126. package/dist/engine/model-cache.d.ts.map +1 -0
  127. package/dist/engine/model-cache.js +162 -0
  128. package/dist/engine/model-cache.js.map +1 -0
  129. package/dist/engine/model-validation.d.ts +9 -0
  130. package/dist/engine/model-validation.d.ts.map +1 -0
  131. package/dist/engine/model-validation.js +21 -0
  132. package/dist/engine/model-validation.js.map +1 -0
  133. package/dist/engine/models-data.generated.d.ts +4 -0
  134. package/dist/engine/models-data.generated.d.ts.map +1 -0
  135. package/dist/engine/models-data.generated.js +196 -0
  136. package/dist/engine/models-data.generated.js.map +1 -0
  137. package/dist/engine/models-fetch.d.ts +5 -0
  138. package/dist/engine/models-fetch.d.ts.map +1 -0
  139. package/dist/engine/models-fetch.js +54 -0
  140. package/dist/engine/models-fetch.js.map +1 -0
  141. package/dist/engine/probe-utils.d.ts +6 -0
  142. package/dist/engine/probe-utils.d.ts.map +1 -0
  143. package/dist/engine/probe-utils.js +42 -0
  144. package/dist/engine/probe-utils.js.map +1 -0
  145. package/dist/engine/prompt.d.ts.map +1 -1
  146. package/dist/engine/prompt.js +8 -0
  147. package/dist/engine/prompt.js.map +1 -1
  148. package/dist/engine/registry.d.ts.map +1 -1
  149. package/dist/engine/registry.js +4 -0
  150. package/dist/engine/registry.js.map +1 -1
  151. package/dist/engine/types.d.ts +3 -3
  152. package/dist/engine/types.d.ts.map +1 -1
  153. package/dist/engine/types.js +2 -0
  154. package/dist/engine/types.js.map +1 -1
  155. package/dist/prompts.d.ts +19 -0
  156. package/dist/prompts.d.ts.map +1 -0
  157. package/dist/prompts.js +73 -0
  158. package/dist/prompts.js.map +1 -0
  159. package/dist/setup-wizard.d.ts +4 -0
  160. package/dist/setup-wizard.d.ts.map +1 -0
  161. package/dist/setup-wizard.js +258 -0
  162. package/dist/setup-wizard.js.map +1 -0
  163. package/package.json +6 -2
@@ -1,23 +1,86 @@
1
1
  import { join } from "node:path";
2
+ import { InlineKeyboard } from "grammy";
2
3
  import { clearUserData } from "../../user/setup.js";
3
- import { resolveCommandMessage } from "./message.js";
4
- const DEFAULT_TEMPLATE = "All user data wiped and session reset. Your next message starts fresh.";
5
- export function createResetHandler(ctx) {
4
+ import { invalidatePrompt, resolvePrompt, trackPrompt } from "./resetPrompt.js";
5
+ import { resetSession } from "./session.js";
6
+ const DEFAULT_CONFIRM = "This is going to delete the user data folder. Are you sure?";
7
+ const DEFAULT_DONE = "done!";
8
+ export function createResetHandler(ctx, botApi) {
6
9
  return async (gramCtx) => {
7
10
  const userId = gramCtx.from?.id;
8
- if (!userId) {
11
+ const chatId = gramCtx.chat?.id;
12
+ if (!userId || !chatId) {
9
13
  await gramCtx.reply("Could not identify user.");
10
14
  return;
11
15
  }
12
- const userDir = join(ctx.config.dataDir, String(userId));
13
16
  try {
14
- await clearUserData(userDir);
15
- const template = ctx.config.commands.reset?.message ?? DEFAULT_TEMPLATE;
16
- const message = await resolveCommandMessage(template, ctx, gramCtx);
17
- await gramCtx.reply(message, { parse_mode: "Markdown" });
17
+ // Invalidate any previous active prompt for this user
18
+ await invalidatePrompt(userId, botApi);
19
+ const keyboard = new InlineKeyboard()
20
+ .text("Yes, go ahead!", `r:y:${userId}`)
21
+ .text("Abort!", `r:n:${userId}`);
22
+ const confirmText = ctx.config.commands.reset.message.confirm ?? DEFAULT_CONFIRM;
23
+ const sent = await gramCtx.reply(confirmText, {
24
+ reply_markup: keyboard,
25
+ });
26
+ trackPrompt(userId, chatId, sent.message_id, ctx.config.commands.reset.timeout * 1000, botApi);
18
27
  }
19
28
  catch (_error) {
20
- await gramCtx.reply("Failed to reset. Please try again.");
29
+ await gramCtx.reply("Failed to initiate reset. Please try again.");
30
+ }
31
+ };
32
+ }
33
+ export function createResetCallbackHandler(ctx) {
34
+ return async (gramCtx, next) => {
35
+ const data = gramCtx.callbackQuery?.data;
36
+ if (!data?.startsWith("r:")) {
37
+ return next();
38
+ }
39
+ const { config, logger } = ctx;
40
+ try {
41
+ const parts = data.split(":");
42
+ const action = parts[1];
43
+ const targetUserId = Number(parts[2]);
44
+ // Verify the tapping user matches the target
45
+ if (gramCtx.from?.id !== targetUserId) {
46
+ await gramCtx.answerCallbackQuery({
47
+ text: "This action is not for you.",
48
+ });
49
+ return;
50
+ }
51
+ resolvePrompt(targetUserId);
52
+ if (action === "y") {
53
+ const userDir = join(config.dataDir, String(targetUserId));
54
+ await clearUserData(userDir);
55
+ // Reset session if configured
56
+ if (config.commands.reset.sessionReset) {
57
+ try {
58
+ await resetSession(ctx, gramCtx, { silent: true });
59
+ }
60
+ catch (err) {
61
+ logger.error({ error: err instanceof Error ? err.message : String(err) }, "/reset session reset failed");
62
+ }
63
+ }
64
+ const doneText = config.commands.reset.message.done ?? DEFAULT_DONE;
65
+ await gramCtx.editMessageText(doneText, {
66
+ reply_markup: undefined,
67
+ });
68
+ }
69
+ else {
70
+ await gramCtx.editMessageText("Reset cancelled.", {
71
+ reply_markup: undefined,
72
+ });
73
+ }
74
+ await gramCtx.answerCallbackQuery();
75
+ }
76
+ catch (err) {
77
+ logger.error({ data, error: err instanceof Error ? err.message : String(err) }, "reset callback failed");
78
+ try {
79
+ await gramCtx.answerCallbackQuery({ text: "Operation failed." });
80
+ }
81
+ catch {
82
+ // ignore
83
+ }
21
84
  }
22
85
  };
23
86
  }
@@ -1 +1 @@
1
- {"version":3,"file":"reset.js","sourceRoot":"","sources":["../../../src/bot/commands/reset.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,wEAAwE,CAAC;AAE3E,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,CAAC,oCAAoC,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"reset.js","sourceRoot":"","sources":["../../../src/bot/commands/reset.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { Api } from "grammy";
2
+ /**
3
+ * Track a new reset confirmation prompt for a user.
4
+ * Starts a timeout that auto-removes the inline keyboard on expiry.
5
+ */
6
+ export declare function trackPrompt(userId: number, chatId: number, messageId: number, timeoutMs: number, api: Api): void;
7
+ /**
8
+ * Invalidate a previous active prompt for a user (e.g. when /reset is sent again).
9
+ * Cancels the timer and edits the message to remove buttons.
10
+ */
11
+ export declare function invalidatePrompt(userId: number, api: Api): Promise<void>;
12
+ /**
13
+ * Resolve (clean up) a prompt after the user has tapped confirm or abort.
14
+ */
15
+ export declare function resolvePrompt(userId: number): void;
16
+ /**
17
+ * Cancel all active prompt timers. Call on bot shutdown.
18
+ */
19
+ export declare function clearAllPrompts(): void;
20
+ //# sourceMappingURL=resetPrompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resetPrompt.d.ts","sourceRoot":"","sources":["../../../src/bot/commands/resetPrompt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAUlC;;;GAGG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,GAAG,GACP,IAAI,CAaN;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,GAAG,GACP,OAAO,CAAC,IAAI,CAAC,CAcf;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAKlD;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAKtC"}
@@ -0,0 +1,58 @@
1
+ const activePrompts = new Map();
2
+ /**
3
+ * Track a new reset confirmation prompt for a user.
4
+ * Starts a timeout that auto-removes the inline keyboard on expiry.
5
+ */
6
+ export function trackPrompt(userId, chatId, messageId, timeoutMs, api) {
7
+ const timer = setTimeout(async () => {
8
+ activePrompts.delete(userId);
9
+ try {
10
+ await api.editMessageReplyMarkup(chatId, messageId, {
11
+ reply_markup: undefined,
12
+ });
13
+ }
14
+ catch {
15
+ // Message may already be edited or deleted — ignore
16
+ }
17
+ }, timeoutMs);
18
+ activePrompts.set(userId, { chatId, messageId, timer });
19
+ }
20
+ /**
21
+ * Invalidate a previous active prompt for a user (e.g. when /reset is sent again).
22
+ * Cancels the timer and edits the message to remove buttons.
23
+ */
24
+ export async function invalidatePrompt(userId, api) {
25
+ const entry = activePrompts.get(userId);
26
+ if (!entry)
27
+ return;
28
+ clearTimeout(entry.timer);
29
+ activePrompts.delete(userId);
30
+ try {
31
+ await api.editMessageReplyMarkup(entry.chatId, entry.messageId, {
32
+ reply_markup: undefined,
33
+ });
34
+ }
35
+ catch {
36
+ // Message may already be edited or deleted — ignore
37
+ }
38
+ }
39
+ /**
40
+ * Resolve (clean up) a prompt after the user has tapped confirm or abort.
41
+ */
42
+ export function resolvePrompt(userId) {
43
+ const entry = activePrompts.get(userId);
44
+ if (!entry)
45
+ return;
46
+ clearTimeout(entry.timer);
47
+ activePrompts.delete(userId);
48
+ }
49
+ /**
50
+ * Cancel all active prompt timers. Call on bot shutdown.
51
+ */
52
+ export function clearAllPrompts() {
53
+ for (const entry of activePrompts.values()) {
54
+ clearTimeout(entry.timer);
55
+ }
56
+ activePrompts.clear();
57
+ }
58
+ //# sourceMappingURL=resetPrompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resetPrompt.js","sourceRoot":"","sources":["../../../src/bot/commands/resetPrompt.ts"],"names":[],"mappings":"AAQA,MAAM,aAAa,GAAG,IAAI,GAAG,EAAwB,CAAC;AAEtD;;;GAGG;AACH,MAAM,UAAU,WAAW,CACzB,MAAc,EACd,MAAc,EACd,SAAiB,EACjB,SAAiB,EACjB,GAAQ;IAER,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,IAAI,EAAE;QAClC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE;gBAClD,YAAY,EAAE,SAAS;aACxB,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,oDAAoD;QACtD,CAAC;IACH,CAAC,EAAE,SAAS,CAAC,CAAC;IAEd,aAAa,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;AAC1D,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAAc,EACd,GAAQ;IAER,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACxC,IAAI,CAAC,KAAK;QAAE,OAAO;IAEnB,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC1B,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAE7B,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,sBAAsB,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,EAAE;YAC9D,YAAY,EAAE,SAAS;SACxB,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,oDAAoD;IACtD,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACxC,IAAI,CAAC,KAAK;QAAE,OAAO;IACnB,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC1B,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,KAAK,MAAM,KAAK,IAAI,aAAa,CAAC,MAAM,EAAE,EAAE,CAAC;QAC3C,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IACD,aAAa,CAAC,KAAK,EAAE,CAAC;AACxB,CAAC"}
@@ -4,8 +4,8 @@ import type { ProjectContext } from "../../types.js";
4
4
  * Shared session-reset logic used by /clean and /start (when configured).
5
5
  *
6
6
  * - Always clears local session state (session.json).
7
- * - For active-reset engines (copilot, codex): sends sessionMsg without
8
- * continueSession to force a new engine session, replies with engine output.
7
+ * - For active-reset engines (copilot, codex, opencode, cursor): sends sessionMsg
8
+ * without continueSession to force a new engine session, replies with engine output.
9
9
  * - For passive engines (claude, etc.): static confirmation reply.
10
10
  *
11
11
  * When `silent` is true, no reply is sent to the user (caller handles messaging).
@@ -1 +1 @@
1
- {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/bot/commands/session.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAGtC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAOrD;;;;;;;;;GASG;AACH,wBAAsB,YAAY,CAChC,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAC7B,OAAO,CAAC,IAAI,CAAC,CAiDf;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,cAAc,IACtC,SAAS,OAAO,KAAG,OAAO,CAAC,IAAI,CAAC,CAgB/C"}
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/bot/commands/session.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAGtC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAOrD;;;;;;;;;GASG;AACH,wBAAsB,YAAY,CAChC,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAC7B,OAAO,CAAC,IAAI,CAAC,CAsDf;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,cAAc,IACtC,SAAS,OAAO,KAAG,OAAO,CAAC,IAAI,CAAC,CAgB/C"}
@@ -8,8 +8,8 @@ const DEFAULT_CLEAN_TEMPLATE = "Session reset. Your next message starts a new co
8
8
  * Shared session-reset logic used by /clean and /start (when configured).
9
9
  *
10
10
  * - Always clears local session state (session.json).
11
- * - For active-reset engines (copilot, codex): sends sessionMsg without
12
- * continueSession to force a new engine session, replies with engine output.
11
+ * - For active-reset engines (copilot, codex, opencode, cursor): sends sessionMsg
12
+ * without continueSession to force a new engine session, replies with engine output.
13
13
  * - For passive engines (claude, etc.): static confirmation reply.
14
14
  *
15
15
  * When `silent` is true, no reply is sent to the user (caller handles messaging).
@@ -25,7 +25,10 @@ export async function resetSession(ctx, gramCtx, options) {
25
25
  const userDir = join(config.dataDir, String(userId));
26
26
  await clearSessionData(userDir);
27
27
  logger.info({ userId }, "Session data cleared");
28
- if (config.engine === "copilot" || config.engine === "codex") {
28
+ if (config.engine === "copilot" ||
29
+ config.engine === "codex" ||
30
+ config.engine === "opencode" ||
31
+ config.engine === "cursor") {
29
32
  const statusMsg = await gramCtx.reply("_Starting new session..._", {
30
33
  parse_mode: "Markdown",
31
34
  });
@@ -67,7 +70,7 @@ export function createCleanHandler(ctx) {
67
70
  return async (gramCtx) => {
68
71
  try {
69
72
  await resetSession(ctx, gramCtx, { silent: true });
70
- const template = ctx.config.commands.clean?.message ?? DEFAULT_CLEAN_TEMPLATE;
73
+ const template = ctx.config.commands.clean.message ?? DEFAULT_CLEAN_TEMPLATE;
71
74
  const message = await resolveCommandMessage(template, ctx, gramCtx);
72
75
  await gramCtx.reply(message, { parse_mode: "Markdown" });
73
76
  }
@@ -1 +1 @@
1
- {"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/bot/commands/session.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/bot/commands/session.ts"],"names":[],"mappings":"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"}
@@ -6,10 +6,10 @@ export function createStartHandler(ctx) {
6
6
  return async (gramCtx) => {
7
7
  const { config, logger } = ctx;
8
8
  const startCfg = config.commands.start;
9
- const template = startCfg?.message ?? DEFAULT_TEMPLATE;
9
+ const template = startCfg.message ?? DEFAULT_TEMPLATE;
10
10
  const message = await resolveCommandMessage(template, ctx, gramCtx);
11
11
  await gramCtx.reply(message, { parse_mode: "Markdown" });
12
- if (startCfg?.sessionReset) {
12
+ if (startCfg.sessionReset) {
13
13
  try {
14
14
  await resetSession(ctx, gramCtx, { silent: true });
15
15
  }
@@ -1 +1 @@
1
- {"version":3,"file":"start.js","sourceRoot":"","sources":["../../../src/bot/commands/start.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,gGAAgG;AAChG,MAAM,gBAAgB,GAAG,gDAAgD,CAAC;AAE1E,MAAM,UAAU,kBAAkB,CAAC,GAAmB;IACpD,OAAO,KAAK,EAAE,OAAgB,EAAiB,EAAE;QAC/C,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC;QAC/B,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAEvC,MAAM,QAAQ,GAAG,QAAQ,EAAE,OAAO,IAAI,gBAAgB,CAAC;QACvD,MAAM,OAAO,GAAG,MAAM,qBAAqB,CAAC,QAAQ,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;QACpE,MAAM,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,CAAC;QAEzD,IAAI,QAAQ,EAAE,YAAY,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACH,MAAM,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YACrD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,KAAK,CACV,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAC3D,6BAA6B,CAC9B,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../../src/bot/commands/start.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,gGAAgG;AAChG,MAAM,gBAAgB,GAAG,gDAAgD,CAAC;AAE1E,MAAM,UAAU,kBAAkB,CAAC,GAAmB;IACpD,OAAO,KAAK,EAAE,OAAgB,EAAiB,EAAE;QAC/C,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC;QAC/B,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAEvC,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,IAAI,gBAAgB,CAAC;QACtD,MAAM,OAAO,GAAG,MAAM,qBAAqB,CAAC,QAAQ,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;QACpE,MAAM,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,CAAC;QAEzD,IAAI,QAAQ,CAAC,YAAY,EAAE,CAAC;YAC1B,IAAI,CAAC;gBACH,MAAM,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YACrD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,KAAK,CACV,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAC3D,6BAA6B,CAC9B,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import type { Bot } from "grammy";
2
2
  import type pino from "pino";
3
+ import { type CommandEnabledFlags } from "./loader.js";
3
4
  export interface CommandWatcher {
4
5
  stop: () => Promise<void>;
5
6
  }
@@ -7,5 +8,5 @@ export interface CommandWatcher {
7
8
  * Start a file watcher that monitors command directories and the skills dir,
8
9
  * then re-publishes the full merged command list to Telegram on any change.
9
10
  */
10
- export declare function startCommandWatcher(bot: Bot, projectCwd: string, configDir: string, logger: pino.Logger, skillsDir?: string): CommandWatcher;
11
+ export declare function startCommandWatcher(bot: Bot, projectCwd: string, configDir: string, logger: pino.Logger, skillsDirs?: string[], enabled?: CommandEnabledFlags): CommandWatcher;
11
12
  //# sourceMappingURL=watcher.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../../../src/bot/commands/watcher.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAK7B,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAID;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,GAAG,EACR,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,IAAI,CAAC,MAAM,EACnB,SAAS,CAAC,EAAE,MAAM,GACjB,cAAc,CAqIhB"}
1
+ {"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../../../src/bot/commands/watcher.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,KAAK,mBAAmB,EAAgB,MAAM,aAAa,CAAC;AAIrE,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAID;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,GAAG,EACR,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,IAAI,CAAC,MAAM,EACnB,UAAU,CAAC,EAAE,MAAM,EAAE,EACrB,OAAO,CAAC,EAAE,mBAAmB,GAC5B,cAAc,CA4IhB"}
@@ -1,3 +1,4 @@
1
+ import { mkdirSync } from "node:fs";
1
2
  import { join } from "node:path";
2
3
  import { loadCommands } from "./loader.js";
3
4
  // ─── Implementation ──────────────────────────────────────────────────────────
@@ -5,13 +6,13 @@ import { loadCommands } from "./loader.js";
5
6
  * Start a file watcher that monitors command directories and the skills dir,
6
7
  * then re-publishes the full merged command list to Telegram on any change.
7
8
  */
8
- export function startCommandWatcher(bot, projectCwd, configDir, logger, skillsDir) {
9
+ export function startCommandWatcher(bot, projectCwd, configDir, logger, skillsDirs, enabled) {
9
10
  const projectCommandDir = join(projectCwd, ".hal", "commands");
10
11
  const globalCommandDir = join(configDir, ".hal", "commands");
11
12
  let debounceTimer = null;
12
13
  async function republish() {
13
14
  try {
14
- const commands = await loadCommands(projectCwd, configDir, logger, skillsDir);
15
+ const commands = await loadCommands(projectCwd, configDir, logger, skillsDirs, enabled);
15
16
  await bot.api.setMyCommands(commands.map((c) => ({
16
17
  command: c.command,
17
18
  description: c.description,
@@ -41,8 +42,13 @@ export function startCommandWatcher(bot, projectCwd, configDir, logger, skillsDi
41
42
  try {
42
43
  const chokidar = await import("chokidar");
43
44
  const watchPaths = [projectCommandDir, globalCommandDir];
44
- if (skillsDir) {
45
- watchPaths.push(skillsDir);
45
+ if (skillsDirs) {
46
+ watchPaths.push(...skillsDirs);
47
+ }
48
+ // Ensure all watched directories exist so chokidar can establish
49
+ // real fs watches from the start (it won't detect dirs created later)
50
+ for (const dir of watchPaths) {
51
+ mkdirSync(dir, { recursive: true });
46
52
  }
47
53
  const watcher = chokidar.watch(watchPaths, {
48
54
  ignoreInitial: true,
@@ -80,7 +86,7 @@ export function startCommandWatcher(bot, projectCwd, configDir, logger, skillsDi
80
86
  logger.error({ error: err instanceof Error ? err.message : String(err) }, "Command watcher error");
81
87
  });
82
88
  watcherInstance = watcher;
83
- logger.debug({ projectCommandDir, globalCommandDir, skillsDir }, "Command watcher started");
89
+ logger.debug({ projectCommandDir, globalCommandDir, skillsDirs }, "Command watcher started");
84
90
  }
85
91
  catch (err) {
86
92
  logger.error({ error: err instanceof Error ? err.message : String(err) }, "Failed to start command watcher");
@@ -1 +1 @@
1
- {"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../../src/bot/commands/watcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAQ3C,gFAAgF;AAEhF;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CACjC,GAAQ,EACR,UAAkB,EAClB,SAAiB,EACjB,MAAmB,EACnB,SAAkB;IAElB,MAAM,iBAAiB,GAAG,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;IAC/D,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;IAE7D,IAAI,aAAa,GAAyC,IAAI,CAAC;IAE/D,KAAK,UAAU,SAAS;QACtB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,YAAY,CACjC,UAAU,EACV,SAAS,EACT,MAAM,EACN,SAAS,CACV,CAAC;YACF,MAAM,GAAG,CAAC,GAAG,CAAC,aAAa,CACzB,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACnB,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,WAAW,EAAE,CAAC,CAAC,WAAW;aAC3B,CAAC,CAAC,CACJ,CAAC;YACF,MAAM,CAAC,IAAI,CACT;gBACE,KAAK,EAAE,QAAQ,CAAC,MAAM;gBACtB,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;aACzC,EACD,sCAAsC,CACvC,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CACV,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAC3D,8CAA8C,CAC/C,CAAC;QACJ,CAAC;IACH,CAAC;IAED,SAAS,iBAAiB;QACxB,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;YAC3B,YAAY,CAAC,aAAa,CAAC,CAAC;QAC9B,CAAC;QACD,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE;YAC9B,aAAa,GAAG,IAAI,CAAC;YACrB,KAAK,SAAS,EAAE,CAAC;QACnB,CAAC,EAAE,GAAG,CAAC,CAAC;IACV,CAAC;IAED,gDAAgD;IAChD,kDAAkD;IAClD,IAAI,eAAe,GAA0C,IAAI,CAAC;IAElE,MAAM,YAAY,GAAG,CAAC,KAAK,IAAI,EAAE;QAC/B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;YAE1C,MAAM,UAAU,GAAG,CAAC,iBAAiB,EAAE,gBAAgB,CAAC,CAAC;YACzD,IAAI,SAAS,EAAE,CAAC;gBACd,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC7B,CAAC;YAED,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,UAAU,EAAE;gBACzC,aAAa,EAAE,IAAI;gBACnB,UAAU,EAAE,IAAI;gBAChB,OAAO,EAAE,CAAC,IAAY,EAAE,EAAE;oBACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;oBAC7C,mEAAmE;oBACnE,OAAO,CACL,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC;wBACtB,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;wBAC1B,QAAQ,KAAK,UAAU,CACxB,CAAC;gBACJ,CAAC;aACF,CAAC,CAAC;YAEH,SAAS,UAAU,CAAC,QAAgB;gBAClC,OAAO,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YACpE,CAAC;YAED,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,QAAgB,EAAE,EAAE;gBACrC,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACzB,MAAM,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,EAAE,0BAA0B,CAAC,CAAC;oBACvD,iBAAiB,EAAE,CAAC;gBACtB,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAgB,EAAE,EAAE;gBACxC,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACzB,MAAM,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,EAAE,4BAA4B,CAAC,CAAC;oBACzD,iBAAiB,EAAE,CAAC;gBACtB,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAgB,EAAE,EAAE;gBACxC,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACzB,MAAM,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,EAAE,4BAA4B,CAAC,CAAC;oBACzD,iBAAiB,EAAE,CAAC;gBACtB,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAY,EAAE,EAAE;gBACnC,MAAM,CAAC,KAAK,CACV,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAC3D,uBAAuB,CACxB,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,eAAe,GAAG,OAAO,CAAC;YAC1B,MAAM,CAAC,KAAK,CACV,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,SAAS,EAAE,EAClD,yBAAyB,CAC1B,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CACV,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAC3D,iCAAiC,CAClC,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,EAAE,CAAC;IAEL,OAAO;QACL,IAAI,EAAE,KAAK,IAAI,EAAE;YACf,8BAA8B;YAC9B,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;gBAC3B,YAAY,CAAC,aAAa,CAAC,CAAC;gBAC5B,aAAa,GAAG,IAAI,CAAC;YACvB,CAAC;YACD,8CAA8C;YAC9C,MAAM,YAAY,CAAC;YACnB,IAAI,eAAe,KAAK,IAAI,EAAE,CAAC;gBAC7B,MAAM,eAAe,CAAC,KAAK,EAAE,CAAC;gBAC9B,eAAe,GAAG,IAAI,CAAC;gBACvB,MAAM,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../../src/bot/commands/watcher.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../../src/bot/handlers/text.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAKtC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AASrD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,cAAc,IACrC,SAAS,OAAO,KAAG,OAAO,CAAC,IAAI,CAAC,CA4O/C"}
1
+ {"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../../src/bot/handlers/text.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAMtC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AASrD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,cAAc,IACrC,SAAS,OAAO,KAAG,OAAO,CAAC,IAAI,CAAC,CAgP/C"}
@@ -1,6 +1,7 @@
1
1
  import { join, resolve } from "node:path";
2
- import { createAgent, getSkillsDir } from "../../agent/index.js";
2
+ import { createAgent, getSkillsDirs } from "../../agent/index.js";
3
3
  import { resolveContext } from "../../context/resolver.js";
4
+ import { getDefaultEngineModel } from "../../default-models.js";
4
5
  import { sendChunkedResponse } from "../../telegram/chunker.js";
5
6
  import { sendDownloadFiles } from "../../telegram/fileSender.js";
6
7
  import { ensureUserSetup, getDownloadsPath, getSessionId, saveSessionId, } from "../../user/setup.js";
@@ -42,6 +43,12 @@ export function createTextHandler(ctx) {
42
43
  projectName: config.name,
43
44
  projectSlug: config.slug,
44
45
  logger,
46
+ engineName: config.engine,
47
+ engineCommand: ctx.engine.command,
48
+ engineModel: config.engineModel,
49
+ engineDefaultModel: config.engineModel
50
+ ? undefined
51
+ : (getDefaultEngineModel(config.engine) ?? "engine-defaults"),
45
52
  });
46
53
  const agent = createAgent(ctx);
47
54
  // Cache-bust on every dispatch call
@@ -70,7 +77,7 @@ export function createTextHandler(ctx) {
70
77
  return;
71
78
  }
72
79
  // No .mjs handler — check if this is a registered skill
73
- const skillEntry = await resolveSkillEntry(commandName, getSkillsDir(config.cwd, ctx), logger);
80
+ const skillEntry = await resolveSkillEntry(commandName, getSkillsDirs(config.cwd, ctx), logger);
74
81
  if (skillEntry?.skillPrompt) {
75
82
  const prompt = args.length > 0
76
83
  ? `${skillEntry.skillPrompt}\n\nUser input: ${args.join(" ")}`
@@ -173,10 +180,8 @@ export function createTextHandler(ctx) {
173
180
  await saveSessionId(userDir, result.sessionId);
174
181
  logger.debug({ sessionId: result.sessionId }, "Session saved");
175
182
  }
176
- const responseText = result.success
177
- ? result.output
178
- : result.error || "An error occurred";
179
- await sendChunkedResponse(gramCtx, responseText);
183
+ const parsed = ctx.engine.parse(result);
184
+ await sendChunkedResponse(gramCtx, parsed.text);
180
185
  const filesSent = await sendDownloadFiles(gramCtx, userDir, ctx);
181
186
  if (filesSent > 0) {
182
187
  logger.info({ filesSent }, "Sent download files to user");
@@ -1 +1 @@
1
- {"version":3,"file":"text.js","sourceRoot":"","sources":["../../../src/bot/handlers/text.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"text.js","sourceRoot":"","sources":["../../../src/bot/handlers/text.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,4 @@
1
1
  import type { Context, NextFunction } from "grammy";
2
2
  import type { ProjectContext } from "../../types.js";
3
- /**
4
- * Returns a middleware that checks if the user is in the project's whitelist.
5
- */
6
3
  export declare function createAuthMiddleware(ctx: ProjectContext): (gramCtx: Context, next: NextFunction) => Promise<void>;
7
4
  //# sourceMappingURL=auth.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/bot/middleware/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,cAAc,IACxC,SAAS,OAAO,EAAE,MAAM,YAAY,KAAG,OAAO,CAAC,IAAI,CAAC,CAsBnE"}
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/bot/middleware/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAMrD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,cAAc,IACxC,SAAS,OAAO,EAAE,MAAM,YAAY,KAAG,OAAO,CAAC,IAAI,CAAC,CAuBnE"}
@@ -1,23 +1,24 @@
1
- /**
2
- * Returns a middleware that checks if the user is in the project's whitelist.
3
- */
1
+ const DENIED_MSG = "Sorry, you are not authorized to use this bot.\n" +
2
+ "Contact the administrator to request access.";
4
3
  export function createAuthMiddleware(ctx) {
5
4
  return async (gramCtx, next) => {
6
- const { allowedUserIds } = ctx.config.access;
5
+ const { allowedUserIds, dangerouslyAllowUnrestrictedAccess } = ctx.config.access;
7
6
  const userId = gramCtx.from?.id;
8
- // Allow if no whitelist is configured (open access)
9
- if (allowedUserIds.length === 0) {
10
- await next();
7
+ // allowedUserIds takes precedence over dangerouslyAllowUnrestrictedAccess
8
+ if (allowedUserIds.length > 0) {
9
+ if (userId && allowedUserIds.includes(userId)) {
10
+ await next();
11
+ return;
12
+ }
13
+ await gramCtx.reply(DENIED_MSG);
11
14
  return;
12
15
  }
13
- // Check if user is in whitelist
14
- if (userId && allowedUserIds.includes(userId)) {
16
+ if (dangerouslyAllowUnrestrictedAccess) {
15
17
  await next();
16
18
  return;
17
19
  }
18
- // User not authorized
19
- await gramCtx.reply("Sorry, you are not authorized to use this bot.\n" +
20
- "Contact the administrator to request access.");
20
+ // Defensive: boot validation should prevent reaching this branch
21
+ await gramCtx.reply(DENIED_MSG);
21
22
  };
22
23
  }
23
24
  //# sourceMappingURL=auth.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/bot/middleware/auth.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,GAAmB;IACtD,OAAO,KAAK,EAAE,OAAgB,EAAE,IAAkB,EAAiB,EAAE;QACnE,MAAM,EAAE,cAAc,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC;QAC7C,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QAEhC,oDAAoD;QACpD,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QAED,gCAAgC;QAChC,IAAI,MAAM,IAAI,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9C,MAAM,IAAI,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QAED,sBAAsB;QACtB,MAAM,OAAO,CAAC,KAAK,CACjB,kDAAkD;YAChD,8CAA8C,CACjD,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/bot/middleware/auth.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,GACd,kDAAkD;IAClD,8CAA8C,CAAC;AAEjD,MAAM,UAAU,oBAAoB,CAAC,GAAmB;IACtD,OAAO,KAAK,EAAE,OAAgB,EAAE,IAAkB,EAAiB,EAAE;QACnE,MAAM,EAAE,cAAc,EAAE,kCAAkC,EAAE,GAC1D,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC;QACpB,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QAEhC,0EAA0E;QAC1E,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,IAAI,MAAM,IAAI,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC9C,MAAM,IAAI,EAAE,CAAC;gBACb,OAAO;YACT,CAAC;YACD,MAAM,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAChC,OAAO;QACT,CAAC;QAED,IAAI,kCAAkC,EAAE,CAAC;YACvC,MAAM,IAAI,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QAED,iEAAiE;QACjE,MAAM,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAClC,CAAC,CAAC;AACJ,CAAC"}
package/dist/bot.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"bot.d.ts","sourceRoot":"","sources":["../src/bot.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAED;;;;GAIG;AACH,wBAAsB,QAAQ,CAAC,UAAU,EAAE,cAAc,GAAG,OAAO,CAAC,SAAS,CAAC,CAsG7E"}
1
+ {"version":3,"file":"bot.d.ts","sourceRoot":"","sources":["../src/bot.ts"],"names":[],"mappings":"AA+BA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAED;;;;GAIG;AACH,wBAAsB,QAAQ,CAAC,UAAU,EAAE,cAAc,GAAG,OAAO,CAAC,SAAS,CAAC,CAoI7E"}
package/dist/bot.js CHANGED
@@ -1,7 +1,11 @@
1
1
  import { Bot } from "grammy";
2
+ import { createGitCallbackHandler, createGitCleanHandler, createGitCommitHandler, createGitInitHandler, createGitStatusHandler, } from "./bot/commands/git/index.js";
2
3
  import { createHelpHandler } from "./bot/commands/help.js";
3
- import { loadCommands } from "./bot/commands/loader.js";
4
- import { createResetHandler } from "./bot/commands/reset.js";
4
+ import { loadCommands, } from "./bot/commands/loader.js";
5
+ import { createModelHandler } from "./bot/commands/model.js";
6
+ import { createModelCallbackHandler } from "./bot/commands/model-callback.js";
7
+ import { createResetCallbackHandler, createResetHandler, } from "./bot/commands/reset.js";
8
+ import { clearAllPrompts } from "./bot/commands/resetPrompt.js";
5
9
  import { createCleanHandler } from "./bot/commands/session.js";
6
10
  import { createStartHandler } from "./bot/commands/start.js";
7
11
  import { startCommandWatcher } from "./bot/commands/watcher.js";
@@ -25,11 +29,29 @@ export async function startBot(projectCtx) {
25
29
  const { middleware: rateLimitMw, cleanup: rateLimitCleanup } = createRateLimitMiddleware(projectCtx);
26
30
  bot.use(createAuthMiddleware(projectCtx));
27
31
  bot.use(rateLimitMw);
28
- // Wire commands
29
- bot.command("start", createStartHandler(projectCtx));
30
- bot.command("help", createHelpHandler(projectCtx));
31
- bot.command("reset", createResetHandler(projectCtx));
32
- bot.command("clean", createCleanHandler(projectCtx));
32
+ // Wire commands (only when enabled)
33
+ const cmd = config.commands;
34
+ if (cmd.start.enabled)
35
+ bot.command("start", createStartHandler(projectCtx));
36
+ if (cmd.help.enabled)
37
+ bot.command("help", createHelpHandler(projectCtx));
38
+ if (cmd.reset.enabled) {
39
+ bot.command("reset", createResetHandler(projectCtx, bot.api));
40
+ bot.on("callback_query:data", createResetCallbackHandler(projectCtx));
41
+ }
42
+ if (cmd.clean.enabled)
43
+ bot.command("clean", createCleanHandler(projectCtx));
44
+ if (cmd.git.enabled) {
45
+ bot.command("git_init", createGitInitHandler(projectCtx));
46
+ bot.command("git_status", createGitStatusHandler(projectCtx));
47
+ bot.command("git_commit", createGitCommitHandler(projectCtx));
48
+ bot.command("git_clean", createGitCleanHandler(projectCtx));
49
+ bot.on("callback_query:data", createGitCallbackHandler(projectCtx));
50
+ }
51
+ if (cmd.model.enabled) {
52
+ bot.command("model", createModelHandler(projectCtx));
53
+ bot.on("callback_query:data", createModelCallbackHandler(projectCtx));
54
+ }
33
55
  // Wire handlers
34
56
  bot.on("message:text", createTextHandler(projectCtx));
35
57
  bot.on("message:photo", createPhotoHandler(projectCtx));
@@ -59,20 +81,30 @@ export async function startBot(projectCtx) {
59
81
  });
60
82
  // Wait until the bot reports it's running (or fails)
61
83
  await startedPromise;
84
+ // Derive enabled flags from resolved config
85
+ const enabledFlags = {
86
+ start: cmd.start.enabled,
87
+ help: cmd.help.enabled,
88
+ reset: cmd.reset.enabled,
89
+ clean: cmd.clean.enabled,
90
+ git: cmd.git.enabled,
91
+ model: cmd.model.enabled,
92
+ };
62
93
  // Register project-specific commands and skills with Telegram on startup
63
- const skillsDir = engine.skillsDir(config.cwd);
64
- const commands = await loadCommands(config.cwd, config.configDir, logger, skillsDir);
94
+ const skillsDirs = engine.skillsDirs(config.cwd);
95
+ const commands = await loadCommands(config.cwd, config.configDir, logger, skillsDirs, enabledFlags);
65
96
  if (commands.length > 0) {
66
97
  await bot.api.setMyCommands(commands.map((c) => ({ command: c.command, description: c.description })));
67
98
  logger.info({ count: commands.length }, "Commands registered with Telegram");
68
99
  }
69
100
  // Start file watcher for hot-reload of command and skill files
70
- const watcher = startCommandWatcher(bot, config.cwd, config.configDir, logger, skillsDir);
101
+ const watcher = startCommandWatcher(bot, config.cwd, config.configDir, logger, skillsDirs, enabledFlags);
71
102
  return {
72
103
  stop: async () => {
73
104
  await watcher.stop();
105
+ clearAllPrompts();
74
106
  rateLimitCleanup();
75
- await bot.stop();
107
+ await bot.stop(); // Stops polling; Grammy waits for in-flight updates to finish
76
108
  await runningPromise;
77
109
  },
78
110
  };