remoat 0.2.0

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 (200) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +297 -0
  3. package/dist/bin/cli.d.ts +2 -0
  4. package/dist/bin/cli.js +80 -0
  5. package/dist/bin/cli.js.map +1 -0
  6. package/dist/bin/commands/doctor.d.ts +1 -0
  7. package/dist/bin/commands/doctor.js +211 -0
  8. package/dist/bin/commands/doctor.js.map +1 -0
  9. package/dist/bin/commands/open.d.ts +1 -0
  10. package/dist/bin/commands/open.js +187 -0
  11. package/dist/bin/commands/open.js.map +1 -0
  12. package/dist/bin/commands/setup.d.ts +1 -0
  13. package/dist/bin/commands/setup.js +267 -0
  14. package/dist/bin/commands/setup.js.map +1 -0
  15. package/dist/bin/commands/start.d.ts +2 -0
  16. package/dist/bin/commands/start.js +39 -0
  17. package/dist/bin/commands/start.js.map +1 -0
  18. package/dist/bot/index.d.ts +2 -0
  19. package/dist/bot/index.js +1393 -0
  20. package/dist/bot/index.js.map +1 -0
  21. package/dist/commands/chatCommandHandler.d.ts +20 -0
  22. package/dist/commands/chatCommandHandler.js +30 -0
  23. package/dist/commands/chatCommandHandler.js.map +1 -0
  24. package/dist/commands/cleanupCommandHandler.d.ts +21 -0
  25. package/dist/commands/cleanupCommandHandler.js +40 -0
  26. package/dist/commands/cleanupCommandHandler.js.map +1 -0
  27. package/dist/commands/joinCommandHandler.d.ts +19 -0
  28. package/dist/commands/joinCommandHandler.js +27 -0
  29. package/dist/commands/joinCommandHandler.js.map +1 -0
  30. package/dist/commands/messageParser.d.ts +7 -0
  31. package/dist/commands/messageParser.js +29 -0
  32. package/dist/commands/messageParser.js.map +1 -0
  33. package/dist/commands/slashCommandHandler.d.ts +21 -0
  34. package/dist/commands/slashCommandHandler.js +105 -0
  35. package/dist/commands/slashCommandHandler.js.map +1 -0
  36. package/dist/commands/workspaceCommandHandler.d.ts +16 -0
  37. package/dist/commands/workspaceCommandHandler.js +29 -0
  38. package/dist/commands/workspaceCommandHandler.js.map +1 -0
  39. package/dist/database/chatSessionRepository.d.ts +59 -0
  40. package/dist/database/chatSessionRepository.js +110 -0
  41. package/dist/database/chatSessionRepository.js.map +1 -0
  42. package/dist/database/scheduleRepository.d.ts +60 -0
  43. package/dist/database/scheduleRepository.js +106 -0
  44. package/dist/database/scheduleRepository.js.map +1 -0
  45. package/dist/database/templateRepository.d.ts +51 -0
  46. package/dist/database/templateRepository.js +90 -0
  47. package/dist/database/templateRepository.js.map +1 -0
  48. package/dist/database/workspaceBindingRepository.d.ts +48 -0
  49. package/dist/database/workspaceBindingRepository.js +92 -0
  50. package/dist/database/workspaceBindingRepository.js.map +1 -0
  51. package/dist/index.d.ts +1 -0
  52. package/dist/index.js +11 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/middleware/auth.d.ts +5 -0
  55. package/dist/middleware/auth.js +14 -0
  56. package/dist/middleware/auth.js.map +1 -0
  57. package/dist/middleware/sanitize.d.ts +1 -0
  58. package/dist/middleware/sanitize.js +18 -0
  59. package/dist/middleware/sanitize.js.map +1 -0
  60. package/dist/services/antigravityLauncher.d.ts +7 -0
  61. package/dist/services/antigravityLauncher.js +94 -0
  62. package/dist/services/antigravityLauncher.js.map +1 -0
  63. package/dist/services/approvalDetector.d.ts +97 -0
  64. package/dist/services/approvalDetector.js +394 -0
  65. package/dist/services/approvalDetector.js.map +1 -0
  66. package/dist/services/assistantDomExtractor.d.ts +49 -0
  67. package/dist/services/assistantDomExtractor.js +340 -0
  68. package/dist/services/assistantDomExtractor.js.map +1 -0
  69. package/dist/services/autoAcceptService.d.ts +14 -0
  70. package/dist/services/autoAcceptService.js +81 -0
  71. package/dist/services/autoAcceptService.js.map +1 -0
  72. package/dist/services/cdpBridgeManager.d.ts +50 -0
  73. package/dist/services/cdpBridgeManager.js +355 -0
  74. package/dist/services/cdpBridgeManager.js.map +1 -0
  75. package/dist/services/cdpConnectionPool.d.ts +88 -0
  76. package/dist/services/cdpConnectionPool.js +235 -0
  77. package/dist/services/cdpConnectionPool.js.map +1 -0
  78. package/dist/services/cdpService.d.ts +214 -0
  79. package/dist/services/cdpService.js +1423 -0
  80. package/dist/services/cdpService.js.map +1 -0
  81. package/dist/services/chatSessionService.d.ts +89 -0
  82. package/dist/services/chatSessionService.js +738 -0
  83. package/dist/services/chatSessionService.js.map +1 -0
  84. package/dist/services/errorPopupDetector.d.ts +89 -0
  85. package/dist/services/errorPopupDetector.js +274 -0
  86. package/dist/services/errorPopupDetector.js.map +1 -0
  87. package/dist/services/modeService.d.ts +44 -0
  88. package/dist/services/modeService.js +74 -0
  89. package/dist/services/modeService.js.map +1 -0
  90. package/dist/services/modelService.d.ts +36 -0
  91. package/dist/services/modelService.js +64 -0
  92. package/dist/services/modelService.js.map +1 -0
  93. package/dist/services/planningDetector.d.ts +87 -0
  94. package/dist/services/planningDetector.js +321 -0
  95. package/dist/services/planningDetector.js.map +1 -0
  96. package/dist/services/processManager.d.ts +18 -0
  97. package/dist/services/processManager.js +62 -0
  98. package/dist/services/processManager.js.map +1 -0
  99. package/dist/services/progressSender.d.ts +20 -0
  100. package/dist/services/progressSender.js +65 -0
  101. package/dist/services/progressSender.js.map +1 -0
  102. package/dist/services/promptDispatcher.d.ts +38 -0
  103. package/dist/services/promptDispatcher.js +42 -0
  104. package/dist/services/promptDispatcher.js.map +1 -0
  105. package/dist/services/quotaService.d.ts +21 -0
  106. package/dist/services/quotaService.js +191 -0
  107. package/dist/services/quotaService.js.map +1 -0
  108. package/dist/services/responseMonitor.d.ts +129 -0
  109. package/dist/services/responseMonitor.js +996 -0
  110. package/dist/services/responseMonitor.js.map +1 -0
  111. package/dist/services/scheduleService.d.ts +58 -0
  112. package/dist/services/scheduleService.js +135 -0
  113. package/dist/services/scheduleService.js.map +1 -0
  114. package/dist/services/screenshotService.d.ts +55 -0
  115. package/dist/services/screenshotService.js +86 -0
  116. package/dist/services/screenshotService.js.map +1 -0
  117. package/dist/services/telegramTopicManager.d.ts +40 -0
  118. package/dist/services/telegramTopicManager.js +103 -0
  119. package/dist/services/telegramTopicManager.js.map +1 -0
  120. package/dist/services/titleGeneratorService.d.ts +32 -0
  121. package/dist/services/titleGeneratorService.js +114 -0
  122. package/dist/services/titleGeneratorService.js.map +1 -0
  123. package/dist/services/updateCheckService.d.ts +16 -0
  124. package/dist/services/updateCheckService.js +148 -0
  125. package/dist/services/updateCheckService.js.map +1 -0
  126. package/dist/services/userMessageDetector.d.ts +57 -0
  127. package/dist/services/userMessageDetector.js +222 -0
  128. package/dist/services/userMessageDetector.js.map +1 -0
  129. package/dist/services/workspaceService.d.ts +33 -0
  130. package/dist/services/workspaceService.js +65 -0
  131. package/dist/services/workspaceService.js.map +1 -0
  132. package/dist/ui/autoAcceptUi.d.ts +6 -0
  133. package/dist/ui/autoAcceptUi.js +22 -0
  134. package/dist/ui/autoAcceptUi.js.map +1 -0
  135. package/dist/ui/modeUi.d.ts +12 -0
  136. package/dist/ui/modeUi.js +40 -0
  137. package/dist/ui/modeUi.js.map +1 -0
  138. package/dist/ui/modelsUi.d.ts +12 -0
  139. package/dist/ui/modelsUi.js +101 -0
  140. package/dist/ui/modelsUi.js.map +1 -0
  141. package/dist/ui/projectListUi.d.ts +11 -0
  142. package/dist/ui/projectListUi.js +59 -0
  143. package/dist/ui/projectListUi.js.map +1 -0
  144. package/dist/ui/screenshotUi.d.ts +6 -0
  145. package/dist/ui/screenshotUi.js +28 -0
  146. package/dist/ui/screenshotUi.js.map +1 -0
  147. package/dist/ui/sessionPickerUi.d.ts +8 -0
  148. package/dist/ui/sessionPickerUi.js +32 -0
  149. package/dist/ui/sessionPickerUi.js.map +1 -0
  150. package/dist/ui/templateUi.d.ts +5 -0
  151. package/dist/ui/templateUi.js +44 -0
  152. package/dist/ui/templateUi.js.map +1 -0
  153. package/dist/utils/cdpPorts.d.ts +2 -0
  154. package/dist/utils/cdpPorts.js +6 -0
  155. package/dist/utils/cdpPorts.js.map +1 -0
  156. package/dist/utils/config.d.ts +14 -0
  157. package/dist/utils/config.js +12 -0
  158. package/dist/utils/config.js.map +1 -0
  159. package/dist/utils/configLoader.d.ts +23 -0
  160. package/dist/utils/configLoader.js +153 -0
  161. package/dist/utils/configLoader.js.map +1 -0
  162. package/dist/utils/htmlToTelegramMarkdown.d.ts +6 -0
  163. package/dist/utils/htmlToTelegramMarkdown.js +189 -0
  164. package/dist/utils/htmlToTelegramMarkdown.js.map +1 -0
  165. package/dist/utils/i18n.d.ts +3 -0
  166. package/dist/utils/i18n.js +78 -0
  167. package/dist/utils/i18n.js.map +1 -0
  168. package/dist/utils/imageHandler.d.ts +35 -0
  169. package/dist/utils/imageHandler.js +155 -0
  170. package/dist/utils/imageHandler.js.map +1 -0
  171. package/dist/utils/lockfile.d.ts +7 -0
  172. package/dist/utils/lockfile.js +117 -0
  173. package/dist/utils/lockfile.js.map +1 -0
  174. package/dist/utils/logger.d.ts +23 -0
  175. package/dist/utils/logger.js +85 -0
  176. package/dist/utils/logger.js.map +1 -0
  177. package/dist/utils/logo.d.ts +1 -0
  178. package/dist/utils/logo.js +14 -0
  179. package/dist/utils/logo.js.map +1 -0
  180. package/dist/utils/metadataExtractor.d.ts +5 -0
  181. package/dist/utils/metadataExtractor.js +16 -0
  182. package/dist/utils/metadataExtractor.js.map +1 -0
  183. package/dist/utils/pathUtils.d.ts +23 -0
  184. package/dist/utils/pathUtils.js +58 -0
  185. package/dist/utils/pathUtils.js.map +1 -0
  186. package/dist/utils/processLogBuffer.d.ts +17 -0
  187. package/dist/utils/processLogBuffer.js +108 -0
  188. package/dist/utils/processLogBuffer.js.map +1 -0
  189. package/dist/utils/streamMessageFormatter.d.ts +18 -0
  190. package/dist/utils/streamMessageFormatter.js +91 -0
  191. package/dist/utils/streamMessageFormatter.js.map +1 -0
  192. package/dist/utils/telegramFormatter.d.ts +37 -0
  193. package/dist/utils/telegramFormatter.js +445 -0
  194. package/dist/utils/telegramFormatter.js.map +1 -0
  195. package/dist/utils/voiceHandler.d.ts +23 -0
  196. package/dist/utils/voiceHandler.js +169 -0
  197. package/dist/utils/voiceHandler.js.map +1 -0
  198. package/locales/en.json +85 -0
  199. package/locales/ja.json +109 -0
  200. package/package.json +84 -0
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.WorkspaceService = void 0;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const sanitize_1 = require("../middleware/sanitize");
9
+ /**
10
+ * Service for workspace filesystem operations and path validation.
11
+ * Manages directories under WORKSPACE_BASE_DIR.
12
+ */
13
+ class WorkspaceService {
14
+ baseDir;
15
+ constructor(baseDir) {
16
+ this.baseDir = baseDir;
17
+ }
18
+ /**
19
+ * Ensure the base directory exists, creating it if necessary
20
+ */
21
+ ensureBaseDir() {
22
+ if (!fs_1.default.existsSync(this.baseDir)) {
23
+ fs_1.default.mkdirSync(this.baseDir, { recursive: true });
24
+ }
25
+ }
26
+ /**
27
+ * Return a list of subdirectories in the base directory
28
+ */
29
+ scanWorkspaces() {
30
+ this.ensureBaseDir();
31
+ const entries = fs_1.default.readdirSync(this.baseDir, { withFileTypes: true });
32
+ return entries
33
+ .filter((entry) => entry.isDirectory() && !entry.name.startsWith('.'))
34
+ .map((entry) => entry.name)
35
+ .sort();
36
+ }
37
+ /**
38
+ * Validate a relative path and return a safe absolute path
39
+ * @throws On path traversal detection
40
+ */
41
+ validatePath(relativePath) {
42
+ return (0, sanitize_1.resolveSafePath)(relativePath, this.baseDir);
43
+ }
44
+ /**
45
+ * Get the base directory path
46
+ */
47
+ getBaseDir() {
48
+ return this.baseDir;
49
+ }
50
+ /**
51
+ * Return the absolute path of the specified workspace
52
+ */
53
+ getWorkspacePath(workspaceName) {
54
+ return this.validatePath(workspaceName);
55
+ }
56
+ /**
57
+ * Check if the specified workspace exists
58
+ */
59
+ exists(workspaceName) {
60
+ const fullPath = this.validatePath(workspaceName);
61
+ return fs_1.default.existsSync(fullPath) && fs_1.default.statSync(fullPath).isDirectory();
62
+ }
63
+ }
64
+ exports.WorkspaceService = WorkspaceService;
65
+ //# sourceMappingURL=workspaceService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspaceService.js","sourceRoot":"","sources":["../../src/services/workspaceService.ts"],"names":[],"mappings":";;;;;;AAAA,4CAAoB;AACpB,qDAAyD;AAEzD;;;GAGG;AACH,MAAa,gBAAgB;IACR,OAAO,CAAS;IAEjC,YAAY,OAAe;QACvB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IAC3B,CAAC;IAED;;OAEG;IACI,aAAa;QAChB,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC/B,YAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,CAAC;IACL,CAAC;IAED;;OAEG;IACI,cAAc;QACjB,IAAI,CAAC,aAAa,EAAE,CAAC;QAErB,MAAM,OAAO,GAAG,YAAE,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACtE,OAAO,OAAO;aACT,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;aACrE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;aAC1B,IAAI,EAAE,CAAC;IAChB,CAAC;IAED;;;OAGG;IACI,YAAY,CAAC,YAAoB;QACpC,OAAO,IAAA,0BAAe,EAAC,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACvD,CAAC;IAED;;OAEG;IACI,UAAU;QACb,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;IAED;;OAEG;IACI,gBAAgB,CAAC,aAAqB;QACzC,OAAO,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;IAC5C,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,aAAqB;QAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;QAClD,OAAO,YAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,YAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IAC1E,CAAC;CACJ;AA1DD,4CA0DC"}
@@ -0,0 +1,6 @@
1
+ import { InlineKeyboard } from 'grammy';
2
+ import { AutoAcceptService } from '../services/autoAcceptService';
3
+ export declare const AUTOACCEPT_BTN_ON = "autoaccept_btn_on";
4
+ export declare const AUTOACCEPT_BTN_OFF = "autoaccept_btn_off";
5
+ export declare const AUTOACCEPT_BTN_REFRESH = "autoaccept_btn_refresh";
6
+ export declare function sendAutoAcceptUI(sendFn: (text: string, keyboard: InlineKeyboard) => Promise<void>, autoAcceptService: AutoAcceptService): Promise<void>;
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AUTOACCEPT_BTN_REFRESH = exports.AUTOACCEPT_BTN_OFF = exports.AUTOACCEPT_BTN_ON = void 0;
4
+ exports.sendAutoAcceptUI = sendAutoAcceptUI;
5
+ const grammy_1 = require("grammy");
6
+ exports.AUTOACCEPT_BTN_ON = 'autoaccept_btn_on';
7
+ exports.AUTOACCEPT_BTN_OFF = 'autoaccept_btn_off';
8
+ exports.AUTOACCEPT_BTN_REFRESH = 'autoaccept_btn_refresh';
9
+ async function sendAutoAcceptUI(sendFn, autoAcceptService) {
10
+ const enabled = autoAcceptService.isEnabled();
11
+ const text = `<b>Auto-accept Management</b>\n\n` +
12
+ `<b>Current Status:</b> ${enabled ? '🟢 ON' : '⚪ OFF'}\n\n` +
13
+ `ON: approval dialogs are automatically allowed.\n` +
14
+ `OFF: approval dialogs require manual action.`;
15
+ const keyboard = new grammy_1.InlineKeyboard()
16
+ .text(enabled ? '✅ Turn ON' : 'Turn ON', exports.AUTOACCEPT_BTN_ON)
17
+ .text(!enabled ? '🔴 Turn OFF' : 'Turn OFF', exports.AUTOACCEPT_BTN_OFF)
18
+ .row()
19
+ .text('🔄 Refresh', exports.AUTOACCEPT_BTN_REFRESH);
20
+ await sendFn(text, keyboard);
21
+ }
22
+ //# sourceMappingURL=autoAcceptUi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autoAcceptUi.js","sourceRoot":"","sources":["../../src/ui/autoAcceptUi.ts"],"names":[],"mappings":";;;AAOA,4CAmBC;AA1BD,mCAAwC;AAG3B,QAAA,iBAAiB,GAAG,mBAAmB,CAAC;AACxC,QAAA,kBAAkB,GAAG,oBAAoB,CAAC;AAC1C,QAAA,sBAAsB,GAAG,wBAAwB,CAAC;AAExD,KAAK,UAAU,gBAAgB,CAClC,MAAiE,EACjE,iBAAoC;IAEpC,MAAM,OAAO,GAAG,iBAAiB,CAAC,SAAS,EAAE,CAAC;IAE9C,MAAM,IAAI,GACN,mCAAmC;QACnC,0BAA0B,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,MAAM;QAC3D,mDAAmD;QACnD,8CAA8C,CAAC;IAEnD,MAAM,QAAQ,GAAG,IAAI,uBAAc,EAAE;SAChC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,EAAE,yBAAiB,CAAC;SAC1D,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,EAAE,0BAAkB,CAAC;SAC/D,GAAG,EAAE;SACL,IAAI,CAAC,YAAY,EAAE,8BAAsB,CAAC,CAAC;IAEhD,MAAM,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AACjC,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { InlineKeyboard } from 'grammy';
2
+ import { ModeService } from '../services/modeService';
3
+ import { CdpService } from '../services/cdpService';
4
+ export interface ModeUiDeps {
5
+ getCurrentCdp?: () => CdpService | null;
6
+ }
7
+ export interface ModeUiPayload {
8
+ text: string;
9
+ keyboard: InlineKeyboard;
10
+ }
11
+ export declare function buildModeUI(modeService: ModeService, deps?: ModeUiDeps): Promise<ModeUiPayload>;
12
+ export declare function sendModeUI(sendFn: (text: string, keyboard: InlineKeyboard) => Promise<void>, modeService: ModeService, deps?: ModeUiDeps): Promise<void>;
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildModeUI = buildModeUI;
4
+ exports.sendModeUI = sendModeUI;
5
+ const grammy_1 = require("grammy");
6
+ const modeService_1 = require("../services/modeService");
7
+ const telegramFormatter_1 = require("../utils/telegramFormatter");
8
+ async function buildModeUI(modeService, deps) {
9
+ if (deps?.getCurrentCdp) {
10
+ const cdp = deps.getCurrentCdp();
11
+ if (cdp) {
12
+ const liveMode = await cdp.getCurrentMode();
13
+ if (liveMode)
14
+ modeService.setMode(liveMode);
15
+ }
16
+ }
17
+ const currentMode = modeService.getCurrentMode();
18
+ const modeLines = modeService_1.AVAILABLE_MODES.map(m => {
19
+ const icon = m === currentMode ? '✅' : '⬜';
20
+ return `${icon} <b>${(0, telegramFormatter_1.escapeHtml)(modeService_1.MODE_DISPLAY_NAMES[m] || m)}</b> — ${(0, telegramFormatter_1.escapeHtml)(modeService_1.MODE_DESCRIPTIONS[m] || '')}`;
21
+ }).join('\n');
22
+ const text = `<b>Mode Management</b>\n\n` +
23
+ `<b>Current Mode:</b> ${(0, telegramFormatter_1.escapeHtml)(modeService_1.MODE_DISPLAY_NAMES[currentMode] || currentMode)}\n` +
24
+ `${(0, telegramFormatter_1.escapeHtml)(modeService_1.MODE_DESCRIPTIONS[currentMode] || '')}\n\n` +
25
+ `<b>Available Modes (${modeService_1.AVAILABLE_MODES.length})</b>\n` +
26
+ modeLines;
27
+ const keyboard = new grammy_1.InlineKeyboard();
28
+ for (const m of modeService_1.AVAILABLE_MODES) {
29
+ const label = m === currentMode
30
+ ? `✅ ${modeService_1.MODE_DISPLAY_NAMES[m] || m}`
31
+ : modeService_1.MODE_DISPLAY_NAMES[m] || m;
32
+ keyboard.text(label, `mode_select:${m}`).row();
33
+ }
34
+ return { text, keyboard };
35
+ }
36
+ async function sendModeUI(sendFn, modeService, deps) {
37
+ const { text, keyboard } = await buildModeUI(modeService, deps);
38
+ await sendFn(text, keyboard);
39
+ }
40
+ //# sourceMappingURL=modeUi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modeUi.js","sourceRoot":"","sources":["../../src/ui/modeUi.ts"],"names":[],"mappings":";;AAoBA,kCAmCC;AAED,gCAOC;AAhED,mCAAwC;AAExC,yDAKiC;AAEjC,kEAAwD;AAWjD,KAAK,UAAU,WAAW,CAC7B,WAAwB,EACxB,IAAiB;IAEjB,IAAI,IAAI,EAAE,aAAa,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACjC,IAAI,GAAG,EAAE,CAAC;YACN,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,cAAc,EAAE,CAAC;YAC5C,IAAI,QAAQ;gBAAE,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAChD,CAAC;IACL,CAAC;IAED,MAAM,WAAW,GAAG,WAAW,CAAC,cAAc,EAAE,CAAC;IAEjD,MAAM,SAAS,GAAG,6BAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;QACtC,MAAM,IAAI,GAAG,CAAC,KAAK,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QAC3C,OAAO,GAAG,IAAI,OAAO,IAAA,8BAAU,EAAC,gCAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,IAAA,8BAAU,EAAC,+BAAiB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;IAClH,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,IAAI,GACN,4BAA4B;QAC5B,wBAAwB,IAAA,8BAAU,EAAC,gCAAkB,CAAC,WAAW,CAAC,IAAI,WAAW,CAAC,IAAI;QACtF,GAAG,IAAA,8BAAU,EAAC,+BAAiB,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,MAAM;QACzD,uBAAuB,6BAAe,CAAC,MAAM,SAAS;QACtD,SAAS,CAAC;IAEd,MAAM,QAAQ,GAAG,IAAI,uBAAc,EAAE,CAAC;IACtC,KAAK,MAAM,CAAC,IAAI,6BAAe,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,CAAC,KAAK,WAAW;YAC3B,CAAC,CAAC,KAAK,gCAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE;YACnC,CAAC,CAAC,gCAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACjC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,eAAe,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC;IACnD,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAC9B,CAAC;AAEM,KAAK,UAAU,UAAU,CAC5B,MAAiE,EACjE,WAAwB,EACxB,IAAiB;IAEjB,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,MAAM,WAAW,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IAChE,MAAM,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AACjC,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { InlineKeyboard } from 'grammy';
2
+ import { CdpService } from '../services/cdpService';
3
+ export interface ModelsUiDeps {
4
+ getCurrentCdp: () => CdpService | null;
5
+ fetchQuota: () => Promise<any[]>;
6
+ }
7
+ export interface ModelsUiPayload {
8
+ text: string;
9
+ keyboard: InlineKeyboard;
10
+ }
11
+ export declare function buildModelsUI(cdp: CdpService, fetchQuota: () => Promise<any[]>): Promise<ModelsUiPayload | null>;
12
+ export declare function sendModelsUI(sendFn: (text: string, keyboard: InlineKeyboard) => Promise<void>, deps: ModelsUiDeps): Promise<void>;
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildModelsUI = buildModelsUI;
4
+ exports.sendModelsUI = sendModelsUI;
5
+ const grammy_1 = require("grammy");
6
+ const telegramFormatter_1 = require("../utils/telegramFormatter");
7
+ async function buildModelsUI(cdp, fetchQuota) {
8
+ const models = await cdp.getUiModels();
9
+ const currentModel = await cdp.getCurrentModel();
10
+ const quotaData = await fetchQuota();
11
+ if (models.length === 0)
12
+ return null;
13
+ function formatQuota(mName, current) {
14
+ if (!mName)
15
+ return `${current ? '✅' : '⬜'} Unknown`;
16
+ const normalize = (s) => s.toLowerCase().replace(/[\s\-_]/g, '');
17
+ const nName = normalize(mName);
18
+ const q = quotaData.find(q => {
19
+ const nLabel = normalize(q.label);
20
+ const nModel = normalize(q.model || '');
21
+ return nLabel === nName || nModel === nName
22
+ || nName.includes(nLabel) || nLabel.includes(nName)
23
+ || (nModel && (nName.includes(nModel) || nModel.includes(nName)));
24
+ });
25
+ if (!q || !q.quotaInfo)
26
+ return `${current ? '✅' : '⬜'} ${mName}`;
27
+ const rem = q.quotaInfo.remainingFraction;
28
+ const resetTime = q.quotaInfo.resetTime ? new Date(q.quotaInfo.resetTime) : null;
29
+ const diffMs = resetTime ? resetTime.getTime() - Date.now() : 0;
30
+ let timeStr = 'Ready';
31
+ if (diffMs > 0) {
32
+ const mins = Math.ceil(diffMs / 60000);
33
+ if (mins < 60)
34
+ timeStr = `${mins}m`;
35
+ else
36
+ timeStr = `${Math.floor(mins / 60)}h ${mins % 60}m`;
37
+ }
38
+ if (rem !== undefined && rem !== null && !isNaN(rem)) {
39
+ const percent = Math.round(rem * 100);
40
+ let icon = '🟢';
41
+ if (percent <= 0)
42
+ icon = '⛔';
43
+ else if (percent <= 20)
44
+ icon = '🔴';
45
+ else if (percent <= 50)
46
+ icon = '🟡';
47
+ const quotaStr = percent <= 0 ? 'Exhausted' : `${percent}%`;
48
+ return `${current ? '✅' : '⬜'} ${mName} ${icon} ${quotaStr} (⏱️ ${timeStr})`;
49
+ }
50
+ return `${current ? '✅' : '⬜'} ${mName} ❓ N/A (⏱️ ${timeStr})`;
51
+ }
52
+ const currentModelFormatted = currentModel ? formatQuota(currentModel, true) : 'Unknown';
53
+ const text = `<b>Model Management</b>\n\n` +
54
+ `<b>Current Model:</b>\n${(0, telegramFormatter_1.escapeHtml)(currentModelFormatted)}\n\n` +
55
+ `<b>Available Models (${models.length})</b>\n` +
56
+ models.map(m => (0, telegramFormatter_1.escapeHtml)(formatQuota(m, m === currentModel))).join('\n');
57
+ const isExhausted = (mName) => {
58
+ if (!mName)
59
+ return false;
60
+ const normalize = (s) => s.toLowerCase().replace(/[\s\-_]/g, '');
61
+ const nName = normalize(mName);
62
+ const q = quotaData.find(q => {
63
+ const nLabel = normalize(q.label);
64
+ const nModel = normalize(q.model || '');
65
+ return nLabel === nName || nModel === nName
66
+ || nName.includes(nLabel) || nLabel.includes(nName)
67
+ || (nModel && (nName.includes(nModel) || nModel.includes(nName)));
68
+ });
69
+ if (!q?.quotaInfo)
70
+ return false;
71
+ const rem = q.quotaInfo.remainingFraction;
72
+ return typeof rem === 'number' && !isNaN(rem) && rem <= 0;
73
+ };
74
+ const keyboard = new grammy_1.InlineKeyboard();
75
+ const MAX_BUTTONS = 24;
76
+ for (const mName of models.slice(0, MAX_BUTTONS)) {
77
+ const exhausted = isExhausted(mName);
78
+ const safeName = mName.length > 40 ? mName.substring(0, 37) + '...' : mName;
79
+ const label = exhausted ? `⛔ ${safeName}` : safeName;
80
+ const maxNameLen = 64 - 'model_exhausted_'.length;
81
+ const cbName = mName.length > maxNameLen ? mName.substring(0, maxNameLen) : mName;
82
+ const cbData = exhausted ? `model_exhausted_${cbName}` : `model_btn_${cbName}`;
83
+ keyboard.text(label, cbData).row();
84
+ }
85
+ keyboard.text('🔄 Refresh', 'model_refresh_btn').row();
86
+ return { text, keyboard };
87
+ }
88
+ async function sendModelsUI(sendFn, deps) {
89
+ const cdp = deps.getCurrentCdp();
90
+ if (!cdp) {
91
+ await sendFn('Not connected to CDP.', new grammy_1.InlineKeyboard());
92
+ return;
93
+ }
94
+ const payload = await buildModelsUI(cdp, deps.fetchQuota);
95
+ if (!payload) {
96
+ await sendFn('Failed to retrieve model list from Antigravity.', new grammy_1.InlineKeyboard());
97
+ return;
98
+ }
99
+ await sendFn(payload.text, payload.keyboard);
100
+ }
101
+ //# sourceMappingURL=modelsUi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modelsUi.js","sourceRoot":"","sources":["../../src/ui/modelsUi.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { InlineKeyboard } from 'grammy';
2
+ export declare const PROJECT_SELECT_ID = "project_select";
3
+ export declare const WORKSPACE_SELECT_ID = "workspace_select";
4
+ export declare const PROJECT_PAGE_PREFIX = "project_page";
5
+ export declare const ITEMS_PER_PAGE = 10;
6
+ export declare function parseProjectPageId(customId: string): number;
7
+ export declare function isProjectSelectId(customId: string): boolean;
8
+ export declare function buildProjectListUI(workspaces: string[], page?: number): {
9
+ text: string;
10
+ keyboard: InlineKeyboard;
11
+ };
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ITEMS_PER_PAGE = exports.PROJECT_PAGE_PREFIX = exports.WORKSPACE_SELECT_ID = exports.PROJECT_SELECT_ID = void 0;
4
+ exports.parseProjectPageId = parseProjectPageId;
5
+ exports.isProjectSelectId = isProjectSelectId;
6
+ exports.buildProjectListUI = buildProjectListUI;
7
+ const grammy_1 = require("grammy");
8
+ const i18n_1 = require("../utils/i18n");
9
+ const telegramFormatter_1 = require("../utils/telegramFormatter");
10
+ exports.PROJECT_SELECT_ID = 'project_select';
11
+ exports.WORKSPACE_SELECT_ID = 'workspace_select';
12
+ exports.PROJECT_PAGE_PREFIX = 'project_page';
13
+ exports.ITEMS_PER_PAGE = 10;
14
+ function parseProjectPageId(customId) {
15
+ if (!customId.startsWith(`${exports.PROJECT_PAGE_PREFIX}:`))
16
+ return NaN;
17
+ return parseInt(customId.slice(exports.PROJECT_PAGE_PREFIX.length + 1), 10);
18
+ }
19
+ function isProjectSelectId(customId) {
20
+ return (customId === exports.PROJECT_SELECT_ID ||
21
+ customId === exports.WORKSPACE_SELECT_ID ||
22
+ customId.startsWith(`${exports.PROJECT_SELECT_ID}:`));
23
+ }
24
+ function buildProjectListUI(workspaces, page = 0) {
25
+ const totalPages = Math.max(1, Math.ceil(workspaces.length / exports.ITEMS_PER_PAGE));
26
+ const safePage = Math.max(0, Math.min(page, totalPages - 1));
27
+ if (workspaces.length === 0) {
28
+ return {
29
+ text: `<b>📁 Projects</b>\n\n${(0, i18n_1.t)('No projects found.')}`,
30
+ keyboard: new grammy_1.InlineKeyboard(),
31
+ };
32
+ }
33
+ const start = safePage * exports.ITEMS_PER_PAGE;
34
+ const end = Math.min(start + exports.ITEMS_PER_PAGE, workspaces.length);
35
+ const pageItems = workspaces.slice(start, end);
36
+ const lines = pageItems.map((ws, i) => `${start + i + 1}. ${(0, telegramFormatter_1.escapeHtml)(ws)}`);
37
+ let text = `<b>📁 Projects</b>\n\n` +
38
+ (0, i18n_1.t)('Select a project to auto-create a topic and session') + `\n\n` +
39
+ lines.join('\n');
40
+ if (totalPages > 1) {
41
+ text += `\n\n<i>Page ${safePage + 1} / ${totalPages} (${workspaces.length} projects total)</i>`;
42
+ }
43
+ const keyboard = new grammy_1.InlineKeyboard();
44
+ for (const ws of pageItems) {
45
+ const label = ws.length > 40 ? ws.substring(0, 37) + '...' : ws;
46
+ keyboard.text(label, `${exports.PROJECT_SELECT_ID}:${ws}`).row();
47
+ }
48
+ if (totalPages > 1) {
49
+ if (safePage > 0) {
50
+ keyboard.text('◀ Prev', `${exports.PROJECT_PAGE_PREFIX}:${safePage - 1}`);
51
+ }
52
+ if (safePage < totalPages - 1) {
53
+ keyboard.text('Next ▶', `${exports.PROJECT_PAGE_PREFIX}:${safePage + 1}`);
54
+ }
55
+ keyboard.row();
56
+ }
57
+ return { text, keyboard };
58
+ }
59
+ //# sourceMappingURL=projectListUi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projectListUi.js","sourceRoot":"","sources":["../../src/ui/projectListUi.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { InputFile } from 'grammy';
2
+ import { CdpService } from '../services/cdpService';
3
+ /**
4
+ * Capture a screenshot and send it via Telegram.
5
+ */
6
+ export declare function handleScreenshot(sendPhoto: (input: InputFile, caption?: string) => Promise<void>, sendText: (text: string) => Promise<void>, cdp: CdpService | null): Promise<void>;
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handleScreenshot = handleScreenshot;
4
+ const grammy_1 = require("grammy");
5
+ const screenshotService_1 = require("../services/screenshotService");
6
+ /**
7
+ * Capture a screenshot and send it via Telegram.
8
+ */
9
+ async function handleScreenshot(sendPhoto, sendText, cdp) {
10
+ if (!cdp) {
11
+ await sendText('Not connected to Antigravity.');
12
+ return;
13
+ }
14
+ try {
15
+ const screenshot = new screenshotService_1.ScreenshotService({ cdpService: cdp });
16
+ const result = await screenshot.capture({ format: 'png' });
17
+ if (result.success && result.buffer) {
18
+ await sendPhoto(new grammy_1.InputFile(result.buffer, 'screenshot.png'), '📸 Screenshot');
19
+ }
20
+ else {
21
+ await sendText(`Screenshot failed: ${result.error}`);
22
+ }
23
+ }
24
+ catch (e) {
25
+ await sendText(`Screenshot error: ${e.message}`);
26
+ }
27
+ }
28
+ //# sourceMappingURL=screenshotUi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screenshotUi.js","sourceRoot":"","sources":["../../src/ui/screenshotUi.ts"],"names":[],"mappings":";;AAOA,4CAqBC;AA5BD,mCAAmC;AAEnC,qEAAkE;AAElE;;GAEG;AACI,KAAK,UAAU,gBAAgB,CAClC,SAAgE,EAChE,QAAyC,EACzC,GAAsB;IAEtB,IAAI,CAAC,GAAG,EAAE,CAAC;QACP,MAAM,QAAQ,CAAC,+BAA+B,CAAC,CAAC;QAChD,OAAO;IACX,CAAC;IAED,IAAI,CAAC;QACD,MAAM,UAAU,GAAG,IAAI,qCAAiB,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;QAC9D,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QAC3D,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClC,MAAM,SAAS,CAAC,IAAI,kBAAS,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,EAAE,eAAe,CAAC,CAAC;QACrF,CAAC;aAAM,CAAC;YACJ,MAAM,QAAQ,CAAC,sBAAsB,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QACzD,CAAC;IACL,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QACd,MAAM,QAAQ,CAAC,qBAAqB,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IACrD,CAAC;AACL,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { InlineKeyboard } from 'grammy';
2
+ import { SessionListItem } from '../services/chatSessionService';
3
+ export declare const SESSION_SELECT_ID = "session_select";
4
+ export declare function isSessionSelectId(customId: string): boolean;
5
+ export declare function buildSessionPickerUI(sessions: SessionListItem[]): {
6
+ text: string;
7
+ keyboard: InlineKeyboard;
8
+ };
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SESSION_SELECT_ID = void 0;
4
+ exports.isSessionSelectId = isSessionSelectId;
5
+ exports.buildSessionPickerUI = buildSessionPickerUI;
6
+ const grammy_1 = require("grammy");
7
+ const i18n_1 = require("../utils/i18n");
8
+ exports.SESSION_SELECT_ID = 'session_select';
9
+ const MAX_SELECT_OPTIONS = 25;
10
+ function isSessionSelectId(customId) {
11
+ return customId.startsWith(exports.SESSION_SELECT_ID + ':') || customId === exports.SESSION_SELECT_ID;
12
+ }
13
+ function buildSessionPickerUI(sessions) {
14
+ if (sessions.length === 0) {
15
+ return {
16
+ text: `<b>🔗 Join Session</b>\n\n${(0, i18n_1.t)('No sessions found in the Antigravity side panel.')}`,
17
+ keyboard: new grammy_1.InlineKeyboard(),
18
+ };
19
+ }
20
+ const text = `<b>🔗 Join Session</b>\n\n` +
21
+ (0, i18n_1.t)(`Select a session to join (${sessions.length} found)`);
22
+ const keyboard = new grammy_1.InlineKeyboard();
23
+ const pageItems = sessions.slice(0, MAX_SELECT_OPTIONS);
24
+ for (const session of pageItems) {
25
+ const label = session.isActive
26
+ ? `✅ ${session.title.slice(0, 40)}`
27
+ : session.title.slice(0, 40);
28
+ keyboard.text(label, `${exports.SESSION_SELECT_ID}:${session.title.slice(0, 49)}`).row();
29
+ }
30
+ return { text, keyboard };
31
+ }
32
+ //# sourceMappingURL=sessionPickerUi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessionPickerUi.js","sourceRoot":"","sources":["../../src/ui/sessionPickerUi.ts"],"names":[],"mappings":";;;AASA,8CAEC;AAED,oDAwBC;AArCD,mCAAwC;AACxC,wCAAkC;AAIrB,QAAA,iBAAiB,GAAG,gBAAgB,CAAC;AAElD,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAE9B,SAAgB,iBAAiB,CAAC,QAAgB;IAC9C,OAAO,QAAQ,CAAC,UAAU,CAAC,yBAAiB,GAAG,GAAG,CAAC,IAAI,QAAQ,KAAK,yBAAiB,CAAC;AAC1F,CAAC;AAED,SAAgB,oBAAoB,CAChC,QAA2B;IAE3B,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO;YACH,IAAI,EAAE,6BAA6B,IAAA,QAAC,EAAC,kDAAkD,CAAC,EAAE;YAC1F,QAAQ,EAAE,IAAI,uBAAc,EAAE;SACjC,CAAC;IACN,CAAC;IAED,MAAM,IAAI,GAAG,4BAA4B;QACrC,IAAA,QAAC,EAAC,6BAA6B,QAAQ,CAAC,MAAM,SAAS,CAAC,CAAC;IAE7D,MAAM,QAAQ,GAAG,IAAI,uBAAc,EAAE,CAAC;IACtC,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC;IAExD,KAAK,MAAM,OAAO,IAAI,SAAS,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ;YAC1B,CAAC,CAAC,KAAK,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE;YACnC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACjC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,yBAAiB,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC;IACrF,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { InlineKeyboard } from 'grammy';
2
+ import { TemplateRecord } from '../database/templateRepository';
3
+ export declare const TEMPLATE_BTN_PREFIX = "template_btn_";
4
+ export declare function parseTemplateButtonId(customId: string): number;
5
+ export declare function sendTemplateUI(sendFn: (text: string, keyboard: InlineKeyboard) => Promise<void>, templates: TemplateRecord[]): Promise<void>;
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TEMPLATE_BTN_PREFIX = void 0;
4
+ exports.parseTemplateButtonId = parseTemplateButtonId;
5
+ exports.sendTemplateUI = sendTemplateUI;
6
+ const grammy_1 = require("grammy");
7
+ const telegramFormatter_1 = require("../utils/telegramFormatter");
8
+ exports.TEMPLATE_BTN_PREFIX = 'template_btn_';
9
+ const MAX_PROMPT_PREVIEW_LEN = 60;
10
+ const MAX_BUTTONS = 25;
11
+ function parseTemplateButtonId(customId) {
12
+ if (!customId.startsWith(exports.TEMPLATE_BTN_PREFIX))
13
+ return NaN;
14
+ return parseInt(customId.slice(exports.TEMPLATE_BTN_PREFIX.length), 10);
15
+ }
16
+ async function sendTemplateUI(sendFn, templates) {
17
+ if (templates.length === 0) {
18
+ const text = `<b>Template Management</b>\n\n` +
19
+ `No templates registered.\n\n` +
20
+ `Use /template_add to add one.`;
21
+ await sendFn(text, new grammy_1.InlineKeyboard());
22
+ return;
23
+ }
24
+ const truncate = (text, max) => text.length > max ? `${text.substring(0, max - 3)}...` : text;
25
+ const displayTemplates = templates.slice(0, MAX_BUTTONS);
26
+ const hasMore = templates.length > MAX_BUTTONS;
27
+ const description = displayTemplates
28
+ .map((tpl, i) => `<b>${i + 1}. ${(0, telegramFormatter_1.escapeHtml)(tpl.name)}</b>\n ${(0, telegramFormatter_1.escapeHtml)(truncate(tpl.prompt, MAX_PROMPT_PREVIEW_LEN))}`)
29
+ .join('\n\n');
30
+ const footerText = hasMore
31
+ ? `\n\n${templates.length - MAX_BUTTONS} templates are hidden.`
32
+ : '\n\nTap a button to execute the template.';
33
+ const text = `<b>Template Management</b>\n\n` +
34
+ `<b>Registered Templates (${templates.length})</b>\n\n` +
35
+ description +
36
+ footerText;
37
+ const keyboard = new grammy_1.InlineKeyboard();
38
+ for (const tpl of displayTemplates) {
39
+ const safeLabel = tpl.name.length > 40 ? `${tpl.name.substring(0, 37)}...` : tpl.name;
40
+ keyboard.text(`▶ ${safeLabel}`, `${exports.TEMPLATE_BTN_PREFIX}${tpl.id}`).row();
41
+ }
42
+ await sendFn(text, keyboard);
43
+ }
44
+ //# sourceMappingURL=templateUi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templateUi.js","sourceRoot":"","sources":["../../src/ui/templateUi.ts"],"names":[],"mappings":";;;AASA,sDAGC;AAED,wCAwCC;AAtDD,mCAAwC;AAExC,kEAAwD;AAE3C,QAAA,mBAAmB,GAAG,eAAe,CAAC;AAEnD,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAClC,MAAM,WAAW,GAAG,EAAE,CAAC;AAEvB,SAAgB,qBAAqB,CAAC,QAAgB;IAClD,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,2BAAmB,CAAC;QAAE,OAAO,GAAG,CAAC;IAC1D,OAAO,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,2BAAmB,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;AACpE,CAAC;AAEM,KAAK,UAAU,cAAc,CAChC,MAAiE,EACjE,SAA2B;IAE3B,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,GACN,gCAAgC;YAChC,8BAA8B;YAC9B,+BAA+B,CAAC;QACpC,MAAM,MAAM,CAAC,IAAI,EAAE,IAAI,uBAAc,EAAE,CAAC,CAAC;QACzC,OAAO;IACX,CAAC;IAED,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAE,GAAW,EAAU,EAAE,CACnD,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IAElE,MAAM,gBAAgB,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;IACzD,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,GAAG,WAAW,CAAC;IAE/C,MAAM,WAAW,GAAG,gBAAgB;SAC/B,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,IAAA,8BAAU,EAAC,GAAG,CAAC,IAAI,CAAC,WAAW,IAAA,8BAAU,EAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC,EAAE,CAAC;SAC1H,IAAI,CAAC,MAAM,CAAC,CAAC;IAElB,MAAM,UAAU,GAAG,OAAO;QACtB,CAAC,CAAC,OAAO,SAAS,CAAC,MAAM,GAAG,WAAW,wBAAwB;QAC/D,CAAC,CAAC,2CAA2C,CAAC;IAElD,MAAM,IAAI,GACN,gCAAgC;QAChC,4BAA4B,SAAS,CAAC,MAAM,WAAW;QACvD,WAAW;QACX,UAAU,CAAC;IAEf,MAAM,QAAQ,GAAG,IAAI,uBAAc,EAAE,CAAC;IACtC,KAAK,MAAM,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACjC,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;QACtF,QAAQ,CAAC,IAAI,CAAC,KAAK,SAAS,EAAE,EAAE,GAAG,2BAAmB,GAAG,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC;IAC7E,CAAC;IAED,MAAM,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AACjC,CAAC"}
@@ -0,0 +1,2 @@
1
+ /** CDP port list scanned for Antigravity connections */
2
+ export declare const CDP_PORTS: readonly [9222, 9223, 9333, 9444, 9555, 9666];
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CDP_PORTS = void 0;
4
+ /** CDP port list scanned for Antigravity connections */
5
+ exports.CDP_PORTS = [9222, 9223, 9333, 9444, 9555, 9666];
6
+ //# sourceMappingURL=cdpPorts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cdpPorts.js","sourceRoot":"","sources":["../../src/utils/cdpPorts.ts"],"names":[],"mappings":";;;AAAA,wDAAwD;AAC3C,QAAA,SAAS,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAU,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { LogLevel } from './logger';
2
+ export type ExtractionMode = 'legacy' | 'structured';
3
+ export interface AppConfig {
4
+ telegramBotToken: string;
5
+ allowedUserIds: string[];
6
+ workspaceBaseDir: string;
7
+ autoApproveFileEdits: boolean;
8
+ logLevel: LogLevel;
9
+ extractionMode: ExtractionMode;
10
+ useTopics: boolean;
11
+ }
12
+ export type ResponseDeliveryMode = 'stream';
13
+ export declare function resolveResponseDeliveryMode(): ResponseDeliveryMode;
14
+ export declare function loadConfig(): AppConfig;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveResponseDeliveryMode = resolveResponseDeliveryMode;
4
+ exports.loadConfig = loadConfig;
5
+ const configLoader_1 = require("./configLoader");
6
+ function resolveResponseDeliveryMode() {
7
+ return 'stream';
8
+ }
9
+ function loadConfig() {
10
+ return configLoader_1.ConfigLoader.load();
11
+ }
12
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":";;AAiBA,kEAEC;AAED,gCAEC;AAvBD,iDAA8C;AAiB9C,SAAgB,2BAA2B;IACvC,OAAO,QAAQ,CAAC;AACpB,CAAC;AAED,SAAgB,UAAU;IACtB,OAAO,2BAAY,CAAC,IAAI,EAAE,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,23 @@
1
+ import type { AppConfig } from './config';
2
+ import type { LogLevel } from './logger';
3
+ export interface PersistedConfig {
4
+ telegramBotToken?: string;
5
+ allowedUserIds?: string[];
6
+ workspaceBaseDir?: string;
7
+ autoApproveFileEdits?: boolean;
8
+ logLevel?: LogLevel;
9
+ extractionMode?: 'legacy' | 'structured';
10
+ useTopics?: boolean;
11
+ }
12
+ declare function getConfigDir(): string;
13
+ declare function getConfigFilePath(): string;
14
+ declare function getDefaultDbPath(): string;
15
+ export declare const ConfigLoader: {
16
+ getConfigDir: typeof getConfigDir;
17
+ getConfigFilePath: typeof getConfigFilePath;
18
+ getDefaultDbPath: typeof getDefaultDbPath;
19
+ configExists(): boolean;
20
+ load(persistedOverride?: PersistedConfig): AppConfig;
21
+ save(config: Partial<PersistedConfig>): void;
22
+ };
23
+ export {};