@visorcraft/idlehands 0.9.1

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 (197) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +30 -0
  3. package/dist/agent.js +2604 -0
  4. package/dist/agent.js.map +1 -0
  5. package/dist/anton/controller.js +341 -0
  6. package/dist/anton/controller.js.map +1 -0
  7. package/dist/anton/lock.js +110 -0
  8. package/dist/anton/lock.js.map +1 -0
  9. package/dist/anton/parser.js +303 -0
  10. package/dist/anton/parser.js.map +1 -0
  11. package/dist/anton/prompt.js +203 -0
  12. package/dist/anton/prompt.js.map +1 -0
  13. package/dist/anton/reporter.js +119 -0
  14. package/dist/anton/reporter.js.map +1 -0
  15. package/dist/anton/session.js +51 -0
  16. package/dist/anton/session.js.map +1 -0
  17. package/dist/anton/types.js +7 -0
  18. package/dist/anton/types.js.map +1 -0
  19. package/dist/anton/verifier.js +263 -0
  20. package/dist/anton/verifier.js.map +1 -0
  21. package/dist/bench/compare.js +239 -0
  22. package/dist/bench/compare.js.map +1 -0
  23. package/dist/bench/debug_hooks.js +17 -0
  24. package/dist/bench/debug_hooks.js.map +1 -0
  25. package/dist/bench/json_extract.js +22 -0
  26. package/dist/bench/json_extract.js.map +1 -0
  27. package/dist/bench/openclaw.js +86 -0
  28. package/dist/bench/openclaw.js.map +1 -0
  29. package/dist/bench/report.js +116 -0
  30. package/dist/bench/report.js.map +1 -0
  31. package/dist/bench/runner.js +312 -0
  32. package/dist/bench/runner.js.map +1 -0
  33. package/dist/bench/types.js +2 -0
  34. package/dist/bench/types.js.map +1 -0
  35. package/dist/bot/commands.js +444 -0
  36. package/dist/bot/commands.js.map +1 -0
  37. package/dist/bot/confirm-discord.js +133 -0
  38. package/dist/bot/confirm-discord.js.map +1 -0
  39. package/dist/bot/confirm-telegram.js +290 -0
  40. package/dist/bot/confirm-telegram.js.map +1 -0
  41. package/dist/bot/discord.js +826 -0
  42. package/dist/bot/discord.js.map +1 -0
  43. package/dist/bot/format.js +210 -0
  44. package/dist/bot/format.js.map +1 -0
  45. package/dist/bot/session-manager.js +270 -0
  46. package/dist/bot/session-manager.js.map +1 -0
  47. package/dist/bot/telegram.js +678 -0
  48. package/dist/bot/telegram.js.map +1 -0
  49. package/dist/cli/agent-turn.js +45 -0
  50. package/dist/cli/agent-turn.js.map +1 -0
  51. package/dist/cli/args.js +236 -0
  52. package/dist/cli/args.js.map +1 -0
  53. package/dist/cli/bot.js +252 -0
  54. package/dist/cli/bot.js.map +1 -0
  55. package/dist/cli/build-repl-context.js +365 -0
  56. package/dist/cli/build-repl-context.js.map +1 -0
  57. package/dist/cli/command-registry.js +20 -0
  58. package/dist/cli/command-registry.js.map +1 -0
  59. package/dist/cli/commands/anton.js +271 -0
  60. package/dist/cli/commands/anton.js.map +1 -0
  61. package/dist/cli/commands/editing.js +328 -0
  62. package/dist/cli/commands/editing.js.map +1 -0
  63. package/dist/cli/commands/model.js +274 -0
  64. package/dist/cli/commands/model.js.map +1 -0
  65. package/dist/cli/commands/project.js +255 -0
  66. package/dist/cli/commands/project.js.map +1 -0
  67. package/dist/cli/commands/runtime.js +63 -0
  68. package/dist/cli/commands/runtime.js.map +1 -0
  69. package/dist/cli/commands/session.js +281 -0
  70. package/dist/cli/commands/session.js.map +1 -0
  71. package/dist/cli/commands/tools.js +126 -0
  72. package/dist/cli/commands/tools.js.map +1 -0
  73. package/dist/cli/commands/trifecta.js +221 -0
  74. package/dist/cli/commands/trifecta.js.map +1 -0
  75. package/dist/cli/commands/tui.js +17 -0
  76. package/dist/cli/commands/tui.js.map +1 -0
  77. package/dist/cli/init.js +222 -0
  78. package/dist/cli/init.js.map +1 -0
  79. package/dist/cli/input.js +360 -0
  80. package/dist/cli/input.js.map +1 -0
  81. package/dist/cli/oneshot.js +254 -0
  82. package/dist/cli/oneshot.js.map +1 -0
  83. package/dist/cli/repl-context.js +2 -0
  84. package/dist/cli/repl-context.js.map +1 -0
  85. package/dist/cli/runtime-cmds.js +811 -0
  86. package/dist/cli/runtime-cmds.js.map +1 -0
  87. package/dist/cli/service.js +145 -0
  88. package/dist/cli/service.js.map +1 -0
  89. package/dist/cli/session-state.js +130 -0
  90. package/dist/cli/session-state.js.map +1 -0
  91. package/dist/cli/setup.js +815 -0
  92. package/dist/cli/setup.js.map +1 -0
  93. package/dist/cli/shell.js +79 -0
  94. package/dist/cli/shell.js.map +1 -0
  95. package/dist/cli/status.js +392 -0
  96. package/dist/cli/status.js.map +1 -0
  97. package/dist/cli/watch.js +33 -0
  98. package/dist/cli/watch.js.map +1 -0
  99. package/dist/client.js +676 -0
  100. package/dist/client.js.map +1 -0
  101. package/dist/commands.js +194 -0
  102. package/dist/commands.js.map +1 -0
  103. package/dist/config.js +507 -0
  104. package/dist/config.js.map +1 -0
  105. package/dist/confirm/auto.js +13 -0
  106. package/dist/confirm/auto.js.map +1 -0
  107. package/dist/confirm/headless.js +41 -0
  108. package/dist/confirm/headless.js.map +1 -0
  109. package/dist/confirm/terminal.js +90 -0
  110. package/dist/confirm/terminal.js.map +1 -0
  111. package/dist/context.js +49 -0
  112. package/dist/context.js.map +1 -0
  113. package/dist/git.js +136 -0
  114. package/dist/git.js.map +1 -0
  115. package/dist/harnesses.js +171 -0
  116. package/dist/harnesses.js.map +1 -0
  117. package/dist/history.js +139 -0
  118. package/dist/history.js.map +1 -0
  119. package/dist/index.js +700 -0
  120. package/dist/index.js.map +1 -0
  121. package/dist/indexer.js +374 -0
  122. package/dist/indexer.js.map +1 -0
  123. package/dist/jsonrpc.js +76 -0
  124. package/dist/jsonrpc.js.map +1 -0
  125. package/dist/lens.js +525 -0
  126. package/dist/lens.js.map +1 -0
  127. package/dist/lsp.js +605 -0
  128. package/dist/lsp.js.map +1 -0
  129. package/dist/markdown.js +275 -0
  130. package/dist/markdown.js.map +1 -0
  131. package/dist/mcp.js +554 -0
  132. package/dist/mcp.js.map +1 -0
  133. package/dist/recovery.js +178 -0
  134. package/dist/recovery.js.map +1 -0
  135. package/dist/replay.js +132 -0
  136. package/dist/replay.js.map +1 -0
  137. package/dist/replay_cli.js +24 -0
  138. package/dist/replay_cli.js.map +1 -0
  139. package/dist/runtime/executor.js +418 -0
  140. package/dist/runtime/executor.js.map +1 -0
  141. package/dist/runtime/planner.js +197 -0
  142. package/dist/runtime/planner.js.map +1 -0
  143. package/dist/runtime/store.js +289 -0
  144. package/dist/runtime/store.js.map +1 -0
  145. package/dist/runtime/types.js +2 -0
  146. package/dist/runtime/types.js.map +1 -0
  147. package/dist/safety.js +446 -0
  148. package/dist/safety.js.map +1 -0
  149. package/dist/spinner.js +224 -0
  150. package/dist/spinner.js.map +1 -0
  151. package/dist/sys/context.js +124 -0
  152. package/dist/sys/context.js.map +1 -0
  153. package/dist/sys/snapshot.sh +97 -0
  154. package/dist/term.js +61 -0
  155. package/dist/term.js.map +1 -0
  156. package/dist/themes.js +135 -0
  157. package/dist/themes.js.map +1 -0
  158. package/dist/tools.js +1114 -0
  159. package/dist/tools.js.map +1 -0
  160. package/dist/tui/branch-picker.js +65 -0
  161. package/dist/tui/branch-picker.js.map +1 -0
  162. package/dist/tui/command-handler.js +108 -0
  163. package/dist/tui/command-handler.js.map +1 -0
  164. package/dist/tui/confirm.js +90 -0
  165. package/dist/tui/confirm.js.map +1 -0
  166. package/dist/tui/controller.js +463 -0
  167. package/dist/tui/controller.js.map +1 -0
  168. package/dist/tui/event-bridge.js +44 -0
  169. package/dist/tui/event-bridge.js.map +1 -0
  170. package/dist/tui/events.js +2 -0
  171. package/dist/tui/events.js.map +1 -0
  172. package/dist/tui/keymap.js +144 -0
  173. package/dist/tui/keymap.js.map +1 -0
  174. package/dist/tui/layout.js +11 -0
  175. package/dist/tui/layout.js.map +1 -0
  176. package/dist/tui/render.js +186 -0
  177. package/dist/tui/render.js.map +1 -0
  178. package/dist/tui/screen.js +48 -0
  179. package/dist/tui/screen.js.map +1 -0
  180. package/dist/tui/state.js +167 -0
  181. package/dist/tui/state.js.map +1 -0
  182. package/dist/tui/theme.js +70 -0
  183. package/dist/tui/theme.js.map +1 -0
  184. package/dist/tui/types.js +2 -0
  185. package/dist/tui/types.js.map +1 -0
  186. package/dist/types.js +2 -0
  187. package/dist/types.js.map +1 -0
  188. package/dist/upgrade.js +412 -0
  189. package/dist/upgrade.js.map +1 -0
  190. package/dist/utils.js +87 -0
  191. package/dist/utils.js.map +1 -0
  192. package/dist/vault.js +520 -0
  193. package/dist/vault.js.map +1 -0
  194. package/dist/vim.js +160 -0
  195. package/dist/vim.js.map +1 -0
  196. package/package.json +67 -0
  197. package/src/sys/snapshot.sh +97 -0
@@ -0,0 +1,444 @@
1
+ /**
2
+ * Telegram bot command handlers.
3
+ * Each handler receives the grammy Context and the SessionManager.
4
+ */
5
+ import path from 'node:path';
6
+ import fs from 'node:fs/promises';
7
+ import { escapeHtml } from './format.js';
8
+ import { runAnton } from '../anton/controller.js';
9
+ import { parseTaskFile } from '../anton/parser.js';
10
+ import { formatRunSummary, formatProgressBar, formatTaskStart, formatTaskEnd, formatTaskSkip } from '../anton/reporter.js';
11
+ export async function handleStart({ ctx, botConfig }) {
12
+ const lines = [
13
+ '<b>🔧 Idle Hands</b> — Local-first coding agent',
14
+ '',
15
+ `<b>Model:</b> <code>${escapeHtml(botConfig.model || 'auto')}</code>`,
16
+ `<b>Endpoint:</b> <code>${escapeHtml(botConfig.endpoint || '?')}</code>`,
17
+ `<b>Default dir:</b> <code>${escapeHtml(botConfig.defaultDir || '~')}</code>`,
18
+ '',
19
+ 'Send me a coding task, or use /help for commands.',
20
+ ];
21
+ await ctx.reply(lines.join('\n'), { parse_mode: 'HTML' });
22
+ }
23
+ export async function handleHelp({ ctx }) {
24
+ const lines = [
25
+ '<b>Commands:</b>',
26
+ '',
27
+ '/start — Welcome + config summary',
28
+ '/help — This message',
29
+ '/reset — Clear session, start fresh',
30
+ '/cancel — Abort current generation',
31
+ '/status — Session stats',
32
+ '/dir [path] — Get/set working directory',
33
+ '/model — Show current model',
34
+ '/approval [mode] — Get/set approval mode',
35
+ '/mode [code|sys] — Get/set mode',
36
+ '/compact — Trigger context compaction',
37
+ '/changes — Show files modified this session',
38
+ '/undo — Undo last edit',
39
+ '/vault [query] — Search vault entries',
40
+ '/anton &lt;file&gt; — Start autonomous task runner',
41
+ '/anton status — Show task runner progress',
42
+ '/anton stop — Stop task runner',
43
+ '/anton last — Show last run results',
44
+ '',
45
+ 'Or just send any text as a coding task.',
46
+ ];
47
+ await ctx.reply(lines.join('\n'), { parse_mode: 'HTML' });
48
+ }
49
+ export async function handleReset({ ctx, sessions }) {
50
+ const chatId = ctx.chat?.id;
51
+ if (!chatId)
52
+ return;
53
+ const res = sessions.resetSession(chatId);
54
+ await ctx.reply(res.message);
55
+ }
56
+ export async function handleCancel({ ctx, sessions }) {
57
+ const chatId = ctx.chat?.id;
58
+ if (!chatId)
59
+ return;
60
+ const res = sessions.cancelActive(chatId);
61
+ await ctx.reply(res.message);
62
+ }
63
+ export async function handleStatus({ ctx, sessions }) {
64
+ const chatId = ctx.chat?.id;
65
+ if (!chatId)
66
+ return;
67
+ const managed = sessions.get(chatId);
68
+ if (!managed) {
69
+ await ctx.reply('No active session. Send a message to start one.');
70
+ return;
71
+ }
72
+ const s = managed.session;
73
+ const contextPct = s.contextWindow > 0
74
+ ? ((s.usage.prompt + s.usage.completion) / s.contextWindow * 100).toFixed(1)
75
+ : '?';
76
+ const lines = [
77
+ '<b>Session Status</b>',
78
+ '',
79
+ `<b>Model:</b> <code>${escapeHtml(s.model)}</code>`,
80
+ `<b>Harness:</b> <code>${escapeHtml(s.harness)}</code>`,
81
+ `<b>Dir:</b> <code>${escapeHtml(managed.workingDir)}</code>`,
82
+ `<b>Context:</b> ~${(s.usage.prompt + s.usage.completion).toLocaleString()} / ${s.contextWindow.toLocaleString()} (${contextPct}%)`,
83
+ `<b>Tokens:</b> prompt=${s.usage.prompt.toLocaleString()}, completion=${s.usage.completion.toLocaleString()}`,
84
+ `<b>In-flight:</b> ${managed.inFlight ? 'yes' : 'no'}`,
85
+ `<b>State:</b> ${managed.state}`,
86
+ `<b>Queue:</b> ${managed.pendingQueue.length} pending`,
87
+ ];
88
+ await ctx.reply(lines.join('\n'), { parse_mode: 'HTML' });
89
+ }
90
+ export async function handleDir({ ctx, sessions }) {
91
+ const chatId = ctx.chat?.id;
92
+ if (!chatId)
93
+ return;
94
+ const text = ctx.message?.text ?? '';
95
+ const arg = text.replace(/^\/dir\s*/, '').trim();
96
+ const managed = sessions.get(chatId);
97
+ if (!arg) {
98
+ // Show current dir
99
+ const dir = managed?.workingDir ?? '(no session)';
100
+ await ctx.reply(`<b>Working directory:</b> <code>${escapeHtml(dir)}</code>`, { parse_mode: 'HTML' });
101
+ return;
102
+ }
103
+ // Set new dir
104
+ const ok = await sessions.setDir(chatId, arg);
105
+ if (ok) {
106
+ await ctx.reply(`✅ Working directory set to <code>${escapeHtml(arg)}</code>`, { parse_mode: 'HTML' });
107
+ }
108
+ else {
109
+ await ctx.reply('❌ Directory not allowed or session error. Check bot.telegram.allowed_dirs config.');
110
+ }
111
+ }
112
+ export async function handleModel({ ctx, sessions }) {
113
+ const chatId = ctx.chat?.id;
114
+ if (!chatId)
115
+ return;
116
+ const managed = sessions.get(chatId);
117
+ if (!managed) {
118
+ await ctx.reply('No active session. Send a message to start one.');
119
+ return;
120
+ }
121
+ await ctx.reply(`<b>Model:</b> <code>${escapeHtml(managed.session.model)}</code>\n<b>Harness:</b> <code>${escapeHtml(managed.session.harness)}</code>`, { parse_mode: 'HTML' });
122
+ }
123
+ export async function handleCompact({ ctx, sessions }) {
124
+ const chatId = ctx.chat?.id;
125
+ if (!chatId)
126
+ return;
127
+ const managed = sessions.get(chatId);
128
+ if (!managed) {
129
+ await ctx.reply('No active session.');
130
+ return;
131
+ }
132
+ // Reset is the simplest form of compaction for now
133
+ managed.session.reset();
134
+ await ctx.reply('🗜 Session context compacted (reset to system prompt).');
135
+ }
136
+ export async function handleApproval({ ctx, sessions }) {
137
+ const chatId = ctx.chat?.id;
138
+ if (!chatId)
139
+ return;
140
+ const text = ctx.message?.text ?? '';
141
+ const arg = text.replace(/^\/approval\s*/, '').trim();
142
+ const modes = ['plan', 'default', 'auto-edit', 'yolo'];
143
+ const managed = sessions.get(chatId);
144
+ if (!arg) {
145
+ const current = managed?.approvalMode ?? 'auto-edit';
146
+ await ctx.reply(`<b>Approval mode:</b> <code>${escapeHtml(current)}</code>\n\nOptions: ${modes.join(', ')}`, { parse_mode: 'HTML' });
147
+ return;
148
+ }
149
+ if (!modes.includes(arg)) {
150
+ await ctx.reply(`Invalid mode. Options: ${modes.join(', ')}`);
151
+ return;
152
+ }
153
+ if (managed) {
154
+ managed.approvalMode = arg;
155
+ managed.config.approval_mode = arg;
156
+ managed.config.no_confirm = arg === 'yolo';
157
+ }
158
+ await ctx.reply(`✅ Approval mode set to <code>${escapeHtml(arg)}</code>`, { parse_mode: 'HTML' });
159
+ }
160
+ export async function handleMode({ ctx, sessions }) {
161
+ const chatId = ctx.chat?.id;
162
+ if (!chatId)
163
+ return;
164
+ const text = ctx.message?.text ?? '';
165
+ const arg = text.replace(/^\/mode\s*/, '').trim().toLowerCase();
166
+ const managed = sessions.get(chatId);
167
+ if (!managed) {
168
+ await ctx.reply('No active session. Send a message to start one.');
169
+ return;
170
+ }
171
+ if (!arg) {
172
+ await ctx.reply(`<b>Mode:</b> <code>${escapeHtml(managed.config.mode ?? 'code')}</code>`, { parse_mode: 'HTML' });
173
+ return;
174
+ }
175
+ if (arg !== 'code' && arg !== 'sys') {
176
+ await ctx.reply('Invalid mode. Options: code, sys');
177
+ return;
178
+ }
179
+ managed.config.mode = arg;
180
+ if (arg === 'sys' && managed.config.approval_mode === 'auto-edit') {
181
+ managed.config.approval_mode = 'default';
182
+ managed.approvalMode = 'default';
183
+ }
184
+ await ctx.reply(`✅ Mode set to <code>${escapeHtml(arg)}</code>`, { parse_mode: 'HTML' });
185
+ }
186
+ export async function handleChanges({ ctx, sessions }) {
187
+ const chatId = ctx.chat?.id;
188
+ if (!chatId)
189
+ return;
190
+ const managed = sessions.get(chatId);
191
+ if (!managed) {
192
+ await ctx.reply('No active session.');
193
+ return;
194
+ }
195
+ const replay = managed.session.replay;
196
+ if (!replay) {
197
+ await ctx.reply('Replay is disabled. No change tracking available.');
198
+ return;
199
+ }
200
+ try {
201
+ const checkpoints = await replay.list(50);
202
+ if (!checkpoints.length) {
203
+ await ctx.reply('No file changes this session.');
204
+ return;
205
+ }
206
+ // Group by file path for diffstat
207
+ const byFile = new Map();
208
+ for (const cp of checkpoints) {
209
+ byFile.set(cp.filePath, (byFile.get(cp.filePath) ?? 0) + 1);
210
+ }
211
+ const lines = [`<b>Session changes (${byFile.size} files):</b>`, ''];
212
+ for (const [fp, count] of byFile) {
213
+ lines.push(` ✎ <code>${escapeHtml(fp)}</code> (${count} edit${count > 1 ? 's' : ''})`);
214
+ }
215
+ await ctx.reply(lines.join('\n'), { parse_mode: 'HTML' });
216
+ }
217
+ catch (e) {
218
+ await ctx.reply(`Error listing changes: ${e?.message ?? e}`);
219
+ }
220
+ }
221
+ export async function handleUndo({ ctx, sessions }) {
222
+ const chatId = ctx.chat?.id;
223
+ if (!chatId)
224
+ return;
225
+ const managed = sessions.get(chatId);
226
+ if (!managed) {
227
+ await ctx.reply('No active session.');
228
+ return;
229
+ }
230
+ const lastPath = managed.session.lastEditedPath;
231
+ if (!lastPath) {
232
+ await ctx.reply('No recent edits to undo.');
233
+ return;
234
+ }
235
+ try {
236
+ // Use the undo_path tool function
237
+ const { undo_path } = await import('../tools.js');
238
+ const ctx2 = {
239
+ cwd: managed.workingDir,
240
+ noConfirm: true,
241
+ dryRun: false,
242
+ };
243
+ const result = await undo_path(ctx2, { path: lastPath });
244
+ await ctx.reply(`✅ ${result}`);
245
+ }
246
+ catch (e) {
247
+ await ctx.reply(`❌ Undo failed: ${e?.message ?? e}`);
248
+ }
249
+ }
250
+ export async function handleVault({ ctx, sessions }) {
251
+ const chatId = ctx.chat?.id;
252
+ if (!chatId)
253
+ return;
254
+ const managed = sessions.get(chatId);
255
+ if (!managed) {
256
+ await ctx.reply('No active session.');
257
+ return;
258
+ }
259
+ const vault = managed.session.vault;
260
+ if (!vault) {
261
+ await ctx.reply('Vault is disabled.');
262
+ return;
263
+ }
264
+ const text = ctx.message?.text ?? '';
265
+ const query = text.replace(/^\/vault\s*/, '').trim();
266
+ if (!query) {
267
+ await ctx.reply('Usage: /vault &lt;search query&gt;', { parse_mode: 'HTML' });
268
+ return;
269
+ }
270
+ try {
271
+ const results = await vault.search(query, 5);
272
+ if (!results.length) {
273
+ await ctx.reply(`No vault results for "${escapeHtml(query)}"`, { parse_mode: 'HTML' });
274
+ return;
275
+ }
276
+ const lines = [`<b>Vault results for "${escapeHtml(query)}":</b>`, ''];
277
+ for (const r of results) {
278
+ const title = r.kind === 'note' ? `note:${r.key}` : `tool:${r.tool || r.key || '?'}`;
279
+ const body = (r.value ?? r.snippet ?? r.content ?? '').replace(/\s+/g, ' ').slice(0, 120);
280
+ lines.push(`• <b>${escapeHtml(title)}</b>: ${escapeHtml(body)}`);
281
+ }
282
+ await ctx.reply(lines.join('\n'), { parse_mode: 'HTML' });
283
+ }
284
+ catch (e) {
285
+ await ctx.reply(`Error searching vault: ${e?.message ?? e}`);
286
+ }
287
+ }
288
+ // ── Anton ───────────────────────────────────────────────────────────
289
+ const ANTON_RATE_LIMIT_MS = 10_000; // min 10s between progress updates
290
+ export async function handleAnton({ ctx, sessions }) {
291
+ const chatId = ctx.chat?.id;
292
+ const userId = ctx.from?.id;
293
+ if (!chatId || !userId)
294
+ return;
295
+ const text = ctx.message?.text ?? '';
296
+ const args = text.replace(/^\/anton\s*/, '').trim();
297
+ const sub = args.split(/\s+/)[0]?.toLowerCase() || '';
298
+ const managed = sessions.get(chatId);
299
+ // status
300
+ if (!sub || sub === 'status') {
301
+ if (!managed?.antonActive) {
302
+ await ctx.reply('No Anton run in progress.');
303
+ return;
304
+ }
305
+ if (managed.antonProgress) {
306
+ await ctx.reply(formatProgressBar(managed.antonProgress));
307
+ }
308
+ else {
309
+ await ctx.reply('🤖 Anton is running (no progress data yet).');
310
+ }
311
+ return;
312
+ }
313
+ // stop
314
+ if (sub === 'stop') {
315
+ if (!managed?.antonActive || !managed.antonAbortSignal) {
316
+ await ctx.reply('No Anton run in progress.');
317
+ return;
318
+ }
319
+ managed.antonAbortSignal.aborted = true;
320
+ await ctx.reply('🛑 Anton stop requested. Run will halt after the current task.');
321
+ return;
322
+ }
323
+ // last
324
+ if (sub === 'last') {
325
+ if (!managed?.antonLastResult) {
326
+ await ctx.reply('No previous Anton run.');
327
+ return;
328
+ }
329
+ await ctx.reply(formatRunSummary(managed.antonLastResult));
330
+ return;
331
+ }
332
+ // start run — args is the file path (possibly with "run" prefix)
333
+ const filePart = sub === 'run' ? args.replace(/^\S+\s*/, '').trim() : args;
334
+ if (!filePart) {
335
+ await ctx.reply([
336
+ '<b>/anton</b> — Autonomous task runner',
337
+ '',
338
+ '/anton &lt;file&gt; — Start run',
339
+ '/anton status — Show progress',
340
+ '/anton stop — Stop running',
341
+ '/anton last — Last run results',
342
+ ].join('\n'), { parse_mode: 'HTML' });
343
+ return;
344
+ }
345
+ // Ensure session exists
346
+ const session = managed || await sessions.getOrCreate(chatId, userId);
347
+ if (!session) {
348
+ await ctx.reply('⚠️ Too many active sessions. Try again later or /reset.');
349
+ return;
350
+ }
351
+ if (session.antonActive) {
352
+ await ctx.reply('⚠️ Anton is already running. Use /anton stop first.');
353
+ return;
354
+ }
355
+ const cwd = session.workingDir;
356
+ const filePath = path.resolve(cwd, filePart);
357
+ try {
358
+ await fs.stat(filePath);
359
+ }
360
+ catch {
361
+ await ctx.reply(`File not found: ${escapeHtml(filePath)}`, { parse_mode: 'HTML' });
362
+ return;
363
+ }
364
+ const defaults = session.config.anton || {};
365
+ const runConfig = {
366
+ taskFile: filePath,
367
+ projectDir: cwd,
368
+ maxRetriesPerTask: defaults.max_retries ?? 3,
369
+ maxIterations: defaults.max_iterations ?? 200,
370
+ taskTimeoutSec: defaults.task_timeout_sec ?? 600,
371
+ totalTimeoutSec: defaults.total_timeout_sec ?? 7200,
372
+ maxTotalTokens: defaults.max_total_tokens ?? Infinity,
373
+ autoCommit: defaults.auto_commit ?? true,
374
+ branch: false,
375
+ allowDirty: false,
376
+ aggressiveCleanOnFail: false,
377
+ verifyAi: defaults.verify_ai ?? true,
378
+ verifyModel: undefined,
379
+ decompose: defaults.decompose ?? true,
380
+ maxDecomposeDepth: defaults.max_decompose_depth ?? 2,
381
+ maxTotalTasks: defaults.max_total_tasks ?? 500,
382
+ buildCommand: undefined,
383
+ testCommand: undefined,
384
+ lintCommand: undefined,
385
+ skipOnFail: defaults.skip_on_fail ?? true,
386
+ approvalMode: (defaults.approval_mode ?? 'yolo'),
387
+ verbose: false,
388
+ dryRun: false,
389
+ };
390
+ const abortSignal = { aborted: false };
391
+ session.antonActive = true;
392
+ session.antonAbortSignal = abortSignal;
393
+ session.antonProgress = null;
394
+ let lastProgressAt = 0;
395
+ const progress = {
396
+ onTaskStart(task, attempt, prog) {
397
+ session.antonProgress = prog;
398
+ const now = Date.now();
399
+ if (now - lastProgressAt >= ANTON_RATE_LIMIT_MS) {
400
+ lastProgressAt = now;
401
+ ctx.reply(formatTaskStart(task, attempt, prog)).catch(() => { });
402
+ }
403
+ },
404
+ onTaskEnd(task, result, prog) {
405
+ session.antonProgress = prog;
406
+ const now = Date.now();
407
+ if (now - lastProgressAt >= ANTON_RATE_LIMIT_MS) {
408
+ lastProgressAt = now;
409
+ ctx.reply(formatTaskEnd(task, result, prog)).catch(() => { });
410
+ }
411
+ },
412
+ onTaskSkip(task, reason) {
413
+ ctx.reply(formatTaskSkip(task, reason)).catch(() => { });
414
+ },
415
+ onRunComplete(result) {
416
+ session.antonLastResult = result;
417
+ session.antonActive = false;
418
+ session.antonAbortSignal = null;
419
+ session.antonProgress = null;
420
+ ctx.reply(formatRunSummary(result)).catch(() => { });
421
+ },
422
+ };
423
+ let pendingCount = 0;
424
+ try {
425
+ const tf = await parseTaskFile(filePath);
426
+ pendingCount = tf.pending.length;
427
+ }
428
+ catch { /* non-fatal */ }
429
+ await ctx.reply(`🤖 Anton started on ${escapeHtml(filePart)} (${pendingCount} tasks pending)`, { parse_mode: 'HTML' });
430
+ runAnton({
431
+ config: runConfig,
432
+ idlehandsConfig: session.config,
433
+ progress,
434
+ abortSignal,
435
+ vault: session.session.vault,
436
+ lens: session.session.lens,
437
+ }).catch((err) => {
438
+ session.antonActive = false;
439
+ session.antonAbortSignal = null;
440
+ session.antonProgress = null;
441
+ ctx.reply(`Anton error: ${err.message}`).catch(() => { });
442
+ });
443
+ }
444
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/bot/commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,133 @@
1
+ import { ActionRowBuilder, ButtonBuilder, ButtonStyle, ComponentType, } from 'discord.js';
2
+ const MAX_DIFF_CHARS = 1800;
3
+ export class DiscordConfirmProvider {
4
+ channel;
5
+ userId;
6
+ timeoutSec;
7
+ seq = 0;
8
+ constructor(channel, userId, timeoutSec = 300) {
9
+ this.channel = channel;
10
+ this.userId = userId;
11
+ this.timeoutSec = timeoutSec;
12
+ }
13
+ async send(payload) {
14
+ return await this.channel.send(payload);
15
+ }
16
+ async confirm(opts) {
17
+ const id = this.nextId('c');
18
+ const row = new ActionRowBuilder().addComponents(new ButtonBuilder().setCustomId(`${id}:approve`).setLabel('✅ Approve').setStyle(ButtonStyle.Success), new ButtonBuilder().setCustomId(`${id}:reject`).setLabel('❌ Reject').setStyle(ButtonStyle.Danger), ...(opts.diff
19
+ ? [new ButtonBuilder().setCustomId(`${id}:diff`).setLabel('📋 Diff').setStyle(ButtonStyle.Secondary)]
20
+ : []));
21
+ const message = await this.send({
22
+ content: [
23
+ `🔧 **Agent requests approval**`,
24
+ `**Action:** \`${opts.tool}\``,
25
+ `**Summary:** ${opts.summary}`,
26
+ ].join('\n'),
27
+ components: [row],
28
+ });
29
+ const deadline = Date.now() + this.timeoutSec * 1000;
30
+ while (true) {
31
+ const remaining = deadline - Date.now();
32
+ if (remaining <= 0) {
33
+ await this.safeEdit(message, {
34
+ content: `🔧 **Timed out — rejected**\n${opts.summary}`,
35
+ components: [],
36
+ });
37
+ return false;
38
+ }
39
+ try {
40
+ const interaction = await message.awaitMessageComponent({
41
+ componentType: ComponentType.Button,
42
+ time: remaining,
43
+ filter: (i) => i.user.id === this.userId && i.customId.startsWith(`${id}:`),
44
+ });
45
+ const action = interaction.customId.slice(id.length + 1);
46
+ if (action === 'diff') {
47
+ const diff = opts.diff?.slice(0, MAX_DIFF_CHARS) ?? '(no diff)';
48
+ await interaction.reply({
49
+ content: `\`\`\`diff\n${diff}\n\`\`\``,
50
+ ephemeral: true,
51
+ }).catch(() => { });
52
+ continue;
53
+ }
54
+ const approved = action === 'approve';
55
+ await interaction.update({
56
+ content: `🔧 **Action ${approved ? 'approved' : 'rejected'}**\n${opts.summary}`,
57
+ components: [],
58
+ }).catch(() => { });
59
+ return approved;
60
+ }
61
+ catch {
62
+ await this.safeEdit(message, {
63
+ content: `🔧 **Timed out — rejected**\n${opts.summary}`,
64
+ components: [],
65
+ });
66
+ return false;
67
+ }
68
+ }
69
+ }
70
+ async confirmPlan(opts) {
71
+ const id = this.nextId('p');
72
+ const lines = [
73
+ `📋 **Plan approval requested**`,
74
+ ...opts.steps.map((s, i) => `${i + 1}. ${s.summary}`),
75
+ ];
76
+ const row1 = new ActionRowBuilder().addComponents(new ButtonBuilder().setCustomId(`${id}:all-approve`).setLabel('✅ Approve All').setStyle(ButtonStyle.Success), new ButtonBuilder().setCustomId(`${id}:all-reject`).setLabel('❌ Reject All').setStyle(ButtonStyle.Danger));
77
+ const stepButtons = opts.steps.slice(0, 5).map((_, i) => new ButtonBuilder()
78
+ .setCustomId(`${id}:step-${i}`)
79
+ .setLabel(`▶ #${i + 1}`)
80
+ .setStyle(ButtonStyle.Secondary));
81
+ const rows = [row1];
82
+ if (stepButtons.length > 0) {
83
+ rows.push(new ActionRowBuilder().addComponents(...stepButtons));
84
+ }
85
+ const message = await this.send({ content: lines.join('\n'), components: rows });
86
+ try {
87
+ const interaction = await message.awaitMessageComponent({
88
+ componentType: ComponentType.Button,
89
+ time: this.timeoutSec * 1000,
90
+ filter: (i) => i.user.id === this.userId && i.customId.startsWith(`${id}:`),
91
+ });
92
+ const action = interaction.customId.slice(id.length + 1);
93
+ let decisions;
94
+ if (action === 'all-approve') {
95
+ decisions = opts.steps.map((_, i) => ({ index: i, approved: true }));
96
+ }
97
+ else if (action === 'all-reject') {
98
+ decisions = opts.steps.map((_, i) => ({ index: i, approved: false }));
99
+ }
100
+ else if (action.startsWith('step-')) {
101
+ const idx = Number(action.slice('step-'.length));
102
+ decisions = opts.steps.map((_, i) => ({ index: i, approved: i === idx }));
103
+ }
104
+ else {
105
+ decisions = opts.steps.map((_, i) => ({ index: i, approved: false }));
106
+ }
107
+ const approvedCount = decisions.filter((d) => d.approved).length;
108
+ await interaction.update({
109
+ content: `📋 **Plan resolved** — approved ${approvedCount}/${opts.steps.length} step(s).`,
110
+ components: [],
111
+ }).catch(() => { });
112
+ return decisions;
113
+ }
114
+ catch {
115
+ await this.safeEdit(message, {
116
+ content: `📋 **Timed out — rejected all**`,
117
+ components: [],
118
+ });
119
+ return opts.steps.map((_, i) => ({ index: i, approved: false }));
120
+ }
121
+ }
122
+ async showBlocked(opts) {
123
+ await this.send(`🚫 Blocked: \`${opts.tool}\` — ${opts.reason}`).catch(() => { });
124
+ }
125
+ nextId(prefix) {
126
+ this.seq += 1;
127
+ return `${prefix}${this.seq.toString(16).padStart(4, '0')}`;
128
+ }
129
+ async safeEdit(message, payload) {
130
+ await message.edit(payload).catch(() => { });
131
+ }
132
+ }
133
+ //# sourceMappingURL=confirm-discord.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confirm-discord.js","sourceRoot":"","sources":["../../src/bot/confirm-discord.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,WAAW,EACX,aAAa,GAGd,MAAM,YAAY,CAAC;AASpB,MAAM,cAAc,GAAG,IAAI,CAAC;AAE5B,MAAM,OAAO,sBAAsB;IAIvB;IACA;IACA;IALF,GAAG,GAAG,CAAC,CAAC;IAEhB,YACU,OAAyB,EACzB,MAAc,EACd,aAAqB,GAAG;QAFxB,YAAO,GAAP,OAAO,CAAkB;QACzB,WAAM,GAAN,MAAM,CAAQ;QACd,eAAU,GAAV,UAAU,CAAc;IAC/B,CAAC;IAEI,KAAK,CAAC,IAAI,CAAC,OAAyD;QAC1E,OAAO,MAAO,IAAI,CAAC,OAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAoB;QAChC,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,GAAG,GAAG,IAAI,gBAAgB,EAAiB,CAAC,aAAa,CAC7D,IAAI,aAAa,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,EACpG,IAAI,aAAa,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,EACjG,GAAG,CAAC,IAAI,CAAC,IAAI;YACX,CAAC,CAAC,CAAC,IAAI,aAAa,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;YACrG,CAAC,CAAC,EAAE,CAAC,CACR,CAAC;QAEF,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC;YAC9B,OAAO,EAAE;gBACP,gCAAgC;gBAChC,iBAAiB,IAAI,CAAC,IAAI,IAAI;gBAC9B,gBAAgB,IAAI,CAAC,OAAO,EAAE;aAC/B,CAAC,IAAI,CAAC,IAAI,CAAC;YACZ,UAAU,EAAE,CAAC,GAAG,CAAC;SAClB,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QAErD,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,SAAS,GAAG,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACxC,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;gBACnB,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE;oBAC3B,OAAO,EAAE,gCAAgC,IAAI,CAAC,OAAO,EAAE;oBACvD,UAAU,EAAE,EAAE;iBACf,CAAC,CAAC;gBACH,OAAO,KAAK,CAAC;YACf,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,qBAAqB,CAAC;oBACtD,aAAa,EAAE,aAAa,CAAC,MAAM;oBACnC,IAAI,EAAE,SAAS;oBACf,MAAM,EAAE,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC;iBACjF,CAAC,CAAC;gBAEH,MAAM,MAAM,GAAG,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBAEzD,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;oBACtB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,IAAI,WAAW,CAAC;oBAChE,MAAM,WAAW,CAAC,KAAK,CAAC;wBACtB,OAAO,EAAE,eAAe,IAAI,UAAU;wBACtC,SAAS,EAAE,IAAI;qBAChB,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;oBACnB,SAAS;gBACX,CAAC;gBAED,MAAM,QAAQ,GAAG,MAAM,KAAK,SAAS,CAAC;gBACtC,MAAM,WAAW,CAAC,MAAM,CAAC;oBACvB,OAAO,EAAE,eAAe,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,OAAO,IAAI,CAAC,OAAO,EAAE;oBAC/E,UAAU,EAAE,EAAE;iBACf,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;gBACnB,OAAO,QAAQ,CAAC;YAClB,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE;oBAC3B,OAAO,EAAE,gCAAgC,IAAI,CAAC,OAAO,EAAE;oBACvD,UAAU,EAAE,EAAE;iBACf,CAAC,CAAC;gBACH,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,IAAwB;QACxC,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAE5B,MAAM,KAAK,GAAG;YACZ,gCAAgC;YAChC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;SACtD,CAAC;QAEF,MAAM,IAAI,GAAG,IAAI,gBAAgB,EAAiB,CAAC,aAAa,CAC9D,IAAI,aAAa,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,EAC5G,IAAI,aAAa,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,CAC1G,CAAC;QAEF,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACtD,IAAI,aAAa,EAAE;aAChB,WAAW,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,CAAC;aAC9B,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;aACvB,QAAQ,CAAC,WAAW,CAAC,SAAS,CAAC,CACnC,CAAC;QAEF,MAAM,IAAI,GAAG,CAAC,IAAI,CAAsC,CAAC;QACzD,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC,IAAI,CAAC,IAAI,gBAAgB,EAAiB,CAAC,aAAa,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC;QACjF,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;QAEjF,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,qBAAqB,CAAC;gBACtD,aAAa,EAAE,aAAa,CAAC,MAAM;gBACnC,IAAI,EAAE,IAAI,CAAC,UAAU,GAAG,IAAI;gBAC5B,MAAM,EAAE,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC;aACjF,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACzD,IAAI,SAAyB,CAAC;YAC9B,IAAI,MAAM,KAAK,aAAa,EAAE,CAAC;gBAC7B,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YACvE,CAAC;iBAAM,IAAI,MAAM,KAAK,YAAY,EAAE,CAAC;gBACnC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YACxE,CAAC;iBAAM,IAAI,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBACtC,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;gBACjD,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC;YAC5E,CAAC;iBAAM,CAAC;gBACN,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YACxE,CAAC;YAED,MAAM,aAAa,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC;YACjE,MAAM,WAAW,CAAC,MAAM,CAAC;gBACvB,OAAO,EAAE,mCAAmC,aAAa,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,WAAW;gBACzF,UAAU,EAAE,EAAE;aACf,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAEnB,OAAO,SAAS,CAAC;QACnB,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE;gBAC3B,OAAO,EAAE,iCAAiC;gBAC1C,UAAU,EAAE,EAAE;aACf,CAAC,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,IAAmB;QACnC,MAAM,IAAI,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,IAAI,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACnF,CAAC;IAEO,MAAM,CAAC,MAAc;QAC3B,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QACd,OAAO,GAAG,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;IAC9D,CAAC;IAEO,KAAK,CAAC,QAAQ,CAAC,OAAgB,EAAE,OAA4C;QACnF,MAAM,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAC9C,CAAC;CACF"}