@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,110 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { stateDir } from '../utils.js';
4
+ function lockPath() {
5
+ return path.join(stateDir(), 'anton.lock');
6
+ }
7
+ const STALE_LOCK_MS = 60 * 60 * 1000; // 1 hour
8
+ let currentLock = null;
9
+ function isPidAlive(pid) {
10
+ try {
11
+ process.kill(pid, 0);
12
+ return true;
13
+ }
14
+ catch {
15
+ return false;
16
+ }
17
+ }
18
+ function lockAgeMs(lock) {
19
+ if (!lock?.startedAt)
20
+ return null;
21
+ const ts = Date.parse(lock.startedAt);
22
+ if (!Number.isFinite(ts))
23
+ return null;
24
+ return Date.now() - ts;
25
+ }
26
+ function isLockStale(lock) {
27
+ if (!lock)
28
+ return false;
29
+ const age = lockAgeMs(lock);
30
+ if (age != null && age > STALE_LOCK_MS)
31
+ return true;
32
+ return !isPidAlive(lock.pid);
33
+ }
34
+ async function ensureStateDir() {
35
+ await fs.mkdir(stateDir(), { recursive: true });
36
+ }
37
+ async function readLock() {
38
+ try {
39
+ const content = await fs.readFile(lockPath(), 'utf8');
40
+ const parsed = JSON.parse(content);
41
+ return {
42
+ pid: typeof parsed.pid === 'number' ? parsed.pid : 0,
43
+ startedAt: typeof parsed.startedAt === 'string' ? parsed.startedAt : '',
44
+ cwd: typeof parsed.cwd === 'string' ? parsed.cwd : '',
45
+ taskFile: typeof parsed.taskFile === 'string' ? parsed.taskFile : '',
46
+ };
47
+ }
48
+ catch {
49
+ return null;
50
+ }
51
+ }
52
+ async function writeLock(taskFile, cwd) {
53
+ await ensureStateDir();
54
+ const payload = {
55
+ pid: process.pid,
56
+ startedAt: new Date().toISOString(),
57
+ cwd,
58
+ taskFile,
59
+ };
60
+ await fs.writeFile(lockPath(), JSON.stringify(payload), { encoding: 'utf8', flag: 'wx' });
61
+ currentLock = payload;
62
+ }
63
+ async function removeLock() {
64
+ try {
65
+ await fs.rm(lockPath(), { force: true });
66
+ }
67
+ catch {
68
+ // best effort
69
+ }
70
+ currentLock = null;
71
+ }
72
+ export async function acquireAntonLock(taskFile, cwd) {
73
+ const existing = await readLock();
74
+ if (existing) {
75
+ if (isLockStale(existing)) {
76
+ console.warn(`Warning: Stale Anton lock detected (PID ${existing.pid}), reclaiming...`);
77
+ await removeLock();
78
+ }
79
+ else if (existing.pid === process.pid) {
80
+ // Same process (e.g. concurrent tests in same runner) — safe to reclaim.
81
+ await removeLock();
82
+ }
83
+ else {
84
+ throw new Error(`Anton: Run already in progress (PID ${existing.pid}). Use /anton stop first.`);
85
+ }
86
+ }
87
+ try {
88
+ await writeLock(taskFile, cwd);
89
+ }
90
+ catch (error) {
91
+ if (error.code === 'EEXIST') {
92
+ // Race condition - another process created lock
93
+ const newExisting = await readLock();
94
+ if (newExisting && !isLockStale(newExisting)) {
95
+ throw new Error(`Anton: Run already in progress (PID ${newExisting.pid}). Use /anton stop first.`);
96
+ }
97
+ // If it's stale, try again recursively (but this should be rare)
98
+ return acquireAntonLock(taskFile, cwd);
99
+ }
100
+ throw error;
101
+ }
102
+ }
103
+ export async function releaseAntonLock() {
104
+ await removeLock();
105
+ }
106
+ export async function isAntonLockHeld() {
107
+ const lock = await readLock();
108
+ return lock !== null && !isLockStale(lock);
109
+ }
110
+ //# sourceMappingURL=lock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lock.js","sourceRoot":"","sources":["../../src/anton/lock.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,303 @@
1
+ /**
2
+ * Anton autonomous task runner — task file parser and mutators.
3
+ */
4
+ import { createHash } from 'node:crypto';
5
+ import { readFile, writeFile, rename } from 'node:fs/promises';
6
+ /**
7
+ * Normalize whitespace: collapse all runs to single space, trim.
8
+ */
9
+ function normalizeWhitespace(text) {
10
+ return text.replace(/\s+/g, ' ').trim();
11
+ }
12
+ /**
13
+ * Generate stable task key using section 6.2 algorithm.
14
+ */
15
+ function generateTaskKey(phasePath, depth, taskText, siblingOrdinal) {
16
+ const input = [
17
+ phasePath.join(' > '),
18
+ String(depth),
19
+ normalizeWhitespace(taskText),
20
+ String(siblingOrdinal)
21
+ ].join(' | ');
22
+ return createHash('sha256').update(input, 'utf8').digest('hex').slice(0, 16);
23
+ }
24
+ /**
25
+ * Atomic write helper for file mutations.
26
+ */
27
+ async function atomicWriteFile(filePath, content) {
28
+ const tmp = filePath + '.anton-tmp';
29
+ await writeFile(tmp, content, 'utf8');
30
+ await rename(tmp, filePath);
31
+ }
32
+ /**
33
+ * Parse task string content into AntonTaskFile.
34
+ */
35
+ export function parseTaskString(content, filePath) {
36
+ const lines = content.split('\n');
37
+ const allTasks = [];
38
+ const phasePath = [];
39
+ const taskStack = []; // Stack to track parent tasks
40
+ let inCodeBlock = false;
41
+ let currentTask = null;
42
+ // Track sibling ordinals for duplicate text detection
43
+ const siblingCounts = new Map(); // "parentKey:depth:normalizedText" -> count
44
+ for (let i = 0; i < lines.length; i++) {
45
+ const line = lines[i];
46
+ const lineNum = i + 1;
47
+ // Toggle code block state
48
+ if (line.trim().startsWith('```')) {
49
+ inCodeBlock = !inCodeBlock;
50
+ continue;
51
+ }
52
+ // Skip lines inside code blocks
53
+ if (inCodeBlock) {
54
+ continue;
55
+ }
56
+ // Handle headings - update phasePath
57
+ const headingMatch = line.match(/^(#+)\s*(.+)$/);
58
+ if (headingMatch) {
59
+ const level = headingMatch[1].length;
60
+ const title = headingMatch[2].trim();
61
+ // Update phasePath: replace this level and clear deeper levels
62
+ phasePath.length = level - 1;
63
+ phasePath[level - 1] = title;
64
+ continue;
65
+ }
66
+ // Match task lines
67
+ const taskMatch = line.match(/^(\s*)- \[([ xX])\] (.+)$/);
68
+ if (taskMatch) {
69
+ const indentStr = taskMatch[1];
70
+ const checkbox = taskMatch[2];
71
+ const text = taskMatch[3].trim();
72
+ // Skip empty task text
73
+ if (!text) {
74
+ console.warn(`Warning: Skipping empty task at line ${lineNum}`);
75
+ continue;
76
+ }
77
+ // Calculate depth: 2 spaces = 1 level, 1 tab = 1 level
78
+ const depth = indentStr.replace(/\t/g, ' ').length / 2;
79
+ // Find parent task
80
+ let parentKey;
81
+ // Pop tasks from stack that are not ancestors (same or deeper depth)
82
+ while (taskStack.length > 0 && taskStack[taskStack.length - 1].depth >= depth) {
83
+ taskStack.pop();
84
+ }
85
+ // If there's a task on the stack, it's our parent
86
+ if (taskStack.length > 0) {
87
+ parentKey = taskStack[taskStack.length - 1].key;
88
+ }
89
+ // Calculate sibling ordinal
90
+ const siblingKey = `${parentKey || 'root'}:${depth}:${normalizeWhitespace(text)}`;
91
+ const siblingOrdinal = siblingCounts.get(siblingKey) || 0;
92
+ siblingCounts.set(siblingKey, siblingOrdinal + 1);
93
+ // Generate stable key
94
+ const key = generateTaskKey([...phasePath], depth, text, siblingOrdinal);
95
+ // Create task
96
+ const task = {
97
+ key,
98
+ text,
99
+ phasePath: [...phasePath],
100
+ depth,
101
+ line: lineNum,
102
+ checked: checkbox !== ' ',
103
+ parentKey,
104
+ children: []
105
+ };
106
+ // Add to parent's children if applicable
107
+ if (parentKey && taskStack.length > 0) {
108
+ taskStack[taskStack.length - 1].children.push(task);
109
+ }
110
+ allTasks.push(task);
111
+ taskStack.push(task);
112
+ currentTask = task;
113
+ }
114
+ else if (currentTask && line.match(/^\s/) && !line.trim().startsWith('-')) {
115
+ // Continuation line - append to previous task text
116
+ const continuationText = line.trim();
117
+ if (continuationText) {
118
+ currentTask.text += ' ' + continuationText;
119
+ }
120
+ }
121
+ else {
122
+ // Non-task, non-continuation line resets current task
123
+ currentTask = null;
124
+ }
125
+ }
126
+ // Build root tasks (depth 0)
127
+ const roots = allTasks.filter(task => task.depth === 0);
128
+ // Split into pending and completed
129
+ const pending = allTasks.filter(task => !task.checked);
130
+ const completed = allTasks.filter(task => task.checked);
131
+ // Generate content hash
132
+ const contentHash = createHash('sha256').update(content, 'utf8').digest('hex');
133
+ return {
134
+ filePath,
135
+ allTasks,
136
+ roots,
137
+ pending,
138
+ completed,
139
+ totalCount: allTasks.length,
140
+ contentHash
141
+ };
142
+ }
143
+ /**
144
+ * Parse task file from disk.
145
+ */
146
+ export async function parseTaskFile(filePath) {
147
+ try {
148
+ const content = await readFile(filePath, 'utf8');
149
+ return parseTaskString(content, filePath);
150
+ }
151
+ catch (error) {
152
+ if (error && typeof error === 'object' && 'code' in error && error.code === 'ENOENT') {
153
+ throw new Error(`Task file not found: ${filePath}`);
154
+ }
155
+ throw error;
156
+ }
157
+ }
158
+ /**
159
+ * Find runnable pending tasks, filtering by skipped keys and parent dependencies.
160
+ */
161
+ export function findRunnablePendingTasks(taskFile, skippedKeys) {
162
+ const pendingTasks = taskFile.pending.filter(task => !skippedKeys.has(task.key));
163
+ const pendingKeys = new Set(pendingTasks.map(t => t.key));
164
+ return pendingTasks.filter(task => {
165
+ // If task has no parent, it's runnable
166
+ if (!task.parentKey) {
167
+ return true;
168
+ }
169
+ // Find parent task
170
+ const parent = taskFile.allTasks.find(t => t.key === task.parentKey);
171
+ if (!parent) {
172
+ return true; // Parent not found, assume runnable
173
+ }
174
+ // If parent is checked, child is runnable
175
+ if (parent.checked) {
176
+ return true;
177
+ }
178
+ // If parent is unchecked AND pending, child must wait
179
+ if (pendingKeys.has(parent.key)) {
180
+ return false;
181
+ }
182
+ // Parent is unchecked but not pending (skipped), child is runnable
183
+ return true;
184
+ });
185
+ }
186
+ /**
187
+ * Mark a task as checked by replacing [ ] with [x].
188
+ */
189
+ export async function markTaskChecked(filePath, taskKey) {
190
+ const content = await readFile(filePath, 'utf8');
191
+ const taskFile = parseTaskString(content, filePath);
192
+ const task = taskFile.allTasks.find(t => t.key === taskKey);
193
+ if (!task) {
194
+ throw new Error(`Task not found: ${taskKey}`);
195
+ }
196
+ // If already checked, no-op (idempotent)
197
+ if (task.checked) {
198
+ return;
199
+ }
200
+ // Split content into lines and update the specific line
201
+ const lines = content.split('\n');
202
+ const lineIndex = task.line - 1;
203
+ if (lineIndex >= 0 && lineIndex < lines.length) {
204
+ const line = lines[lineIndex];
205
+ const updatedLine = line.replace(/- \[ \]/, '- [x]');
206
+ lines[lineIndex] = updatedLine;
207
+ const newContent = lines.join('\n');
208
+ await atomicWriteFile(filePath, newContent);
209
+ }
210
+ }
211
+ /**
212
+ * Append a note to a task using HTML comment format.
213
+ */
214
+ export async function appendTaskNote(filePath, taskKey, note) {
215
+ const content = await readFile(filePath, 'utf8');
216
+ const taskFile = parseTaskString(content, filePath);
217
+ const task = taskFile.allTasks.find(t => t.key === taskKey);
218
+ if (!task) {
219
+ throw new Error(`Task not found: ${taskKey}`);
220
+ }
221
+ const noteComment = `<!-- anton: ${note} -->`;
222
+ // Check if note already exists (idempotent)
223
+ if (content.includes(noteComment)) {
224
+ return;
225
+ }
226
+ // Split content into lines and insert note after task line
227
+ const lines = content.split('\n');
228
+ const lineIndex = task.line - 1;
229
+ if (lineIndex >= 0 && lineIndex < lines.length) {
230
+ lines.splice(lineIndex + 1, 0, noteComment);
231
+ const newContent = lines.join('\n');
232
+ await atomicWriteFile(filePath, newContent);
233
+ }
234
+ }
235
+ /**
236
+ * Insert subtasks after a parent task.
237
+ */
238
+ export async function insertSubTasks(filePath, parentKey, items) {
239
+ if (items.length === 0) {
240
+ return [];
241
+ }
242
+ const content = await readFile(filePath, 'utf8');
243
+ const taskFile = parseTaskString(content, filePath);
244
+ const parentTask = taskFile.allTasks.find(t => t.key === parentKey);
245
+ if (!parentTask) {
246
+ throw new Error(`Parent task not found: ${parentKey}`);
247
+ }
248
+ // Calculate indentation for subtasks
249
+ const parentIndent = ' '.repeat(parentTask.depth);
250
+ const childIndent = ' '.repeat(parentTask.depth + 1);
251
+ // Generate subtask lines
252
+ const subtaskLines = items.map(item => `${childIndent}- [ ] ${item}`);
253
+ // Split content into lines and insert subtasks
254
+ const lines = content.split('\n');
255
+ const insertIndex = parentTask.line; // Insert after parent line (0-based vs 1-based)
256
+ lines.splice(insertIndex, 0, ...subtaskLines);
257
+ const newContent = lines.join('\n');
258
+ await atomicWriteFile(filePath, newContent);
259
+ // Re-parse to get the new tasks
260
+ const updatedTaskFile = parseTaskString(newContent, filePath);
261
+ // Find the newly created subtasks
262
+ const newTasks = updatedTaskFile.allTasks.filter(task => task.parentKey === parentKey &&
263
+ !taskFile.allTasks.some(oldTask => oldTask.key === task.key));
264
+ return newTasks;
265
+ }
266
+ /**
267
+ * Auto-complete ancestor tasks when all children are checked.
268
+ */
269
+ export async function autoCompleteAncestors(filePath, childKey) {
270
+ const completedAncestors = [];
271
+ let currentKey = childKey;
272
+ while (true) {
273
+ const content = await readFile(filePath, 'utf8');
274
+ const taskFile = parseTaskString(content, filePath);
275
+ const currentTask = taskFile.allTasks.find(t => t.key === currentKey);
276
+ if (!currentTask || !currentTask.parentKey) {
277
+ break; // No parent, done
278
+ }
279
+ const parent = taskFile.allTasks.find(t => t.key === currentTask.parentKey);
280
+ if (!parent) {
281
+ break; // Parent not found
282
+ }
283
+ // If parent is already checked, stop
284
+ if (parent.checked) {
285
+ break;
286
+ }
287
+ // Check if ALL children of parent are checked
288
+ const allChildrenChecked = parent.children.every(child => child.checked);
289
+ if (allChildrenChecked) {
290
+ // Mark parent as checked
291
+ await markTaskChecked(filePath, parent.key);
292
+ completedAncestors.push(parent.key);
293
+ // Continue with parent
294
+ currentKey = parent.key;
295
+ }
296
+ else {
297
+ // Not all children are checked, stop cascading
298
+ break;
299
+ }
300
+ }
301
+ return completedAncestors;
302
+ }
303
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/anton/parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,203 @@
1
+ /**
2
+ * Anton autonomous task runner — prompt protocol and context injection.
3
+ *
4
+ * Builds prompts with task context, vault search results, and structured result parsing.
5
+ */
6
+ import { estimateTokens } from '../utils.js';
7
+ /**
8
+ * Build the complete Anton prompt from task context and configuration.
9
+ */
10
+ export async function buildAntonPrompt(opts) {
11
+ const sections = [];
12
+ // 1. Preamble - rules and instructions
13
+ sections.push(buildPreamble(opts.config));
14
+ // 2. Current task - task details and location
15
+ sections.push(buildCurrentTaskSection(opts.task, opts.taskFilePath));
16
+ // 3. Progress summary - completion status
17
+ sections.push(buildProgressSummary(opts.taskFile, opts.task));
18
+ // 4. Relevant context from Vault (if available)
19
+ if (opts.vault) {
20
+ const vaultSection = await buildVaultContextSection(opts.task, opts.vault, opts.maxContextTokens);
21
+ if (vaultSection) {
22
+ sections.push(vaultSection);
23
+ }
24
+ }
25
+ // 5. Retry context (if retrying)
26
+ if (opts.retryContext) {
27
+ sections.push(buildRetryContextSection(opts.retryContext));
28
+ }
29
+ // 6. Structured result instructions
30
+ sections.push(buildResultInstructions(opts.config.decompose));
31
+ return sections.join('\n\n');
32
+ }
33
+ /**
34
+ * Parse the structured result block from agent output.
35
+ */
36
+ export function parseAntonResult(agentOutput) {
37
+ // Find all <anton-result> blocks (use last one if multiple)
38
+ const blockRegex = /<anton-result>([\s\S]*?)<\/anton-result>/g;
39
+ const matches = Array.from(agentOutput.matchAll(blockRegex));
40
+ if (matches.length === 0) {
41
+ return {
42
+ status: 'blocked',
43
+ reason: 'Agent did not emit structured result',
44
+ subtasks: []
45
+ };
46
+ }
47
+ const lastMatch = matches[matches.length - 1];
48
+ const blockContent = lastMatch[1].trim();
49
+ // Parse status line
50
+ const statusMatch = blockContent.match(/^status:\s*(.+)$/m);
51
+ if (!statusMatch) {
52
+ return {
53
+ status: 'blocked',
54
+ reason: 'No status line found in result block',
55
+ subtasks: []
56
+ };
57
+ }
58
+ const status = statusMatch[1].trim();
59
+ if (status !== 'done' && status !== 'blocked' && status !== 'decompose') {
60
+ return {
61
+ status: 'blocked',
62
+ reason: `Unknown status: ${status}`,
63
+ subtasks: []
64
+ };
65
+ }
66
+ // Parse reason line (if present)
67
+ const reasonMatch = blockContent.match(/^reason:\s*(.+)$/m);
68
+ const reason = reasonMatch ? reasonMatch[1].trim() : undefined;
69
+ // Parse subtasks section (if present)
70
+ const subtasks = [];
71
+ const subtaskMatches = blockContent.matchAll(/^-\s*(.+)$/gm);
72
+ for (const match of subtaskMatches) {
73
+ subtasks.push(match[1].trim());
74
+ }
75
+ return {
76
+ status: status,
77
+ reason,
78
+ subtasks
79
+ };
80
+ }
81
+ function buildPreamble(config) {
82
+ let preamble = `You are an autonomous coding agent working on ONE task.
83
+ Complete the task, then emit exactly one \`<anton-result>\` block.
84
+ Do NOT edit the task file checkboxes.
85
+ Keep changes minimal and focused.`;
86
+ if (config.decompose) {
87
+ preamble += `\n\nIf a task is too large or complex, you can decompose it into smaller subtasks.
88
+ Maximum decomposition depth: ${config.maxDecomposeDepth}
89
+ Only decompose when truly necessary - prefer completing tasks directly when possible.`;
90
+ }
91
+ return preamble;
92
+ }
93
+ function buildCurrentTaskSection(task, taskFilePath) {
94
+ let section = `## Current Task
95
+
96
+ **File:** ${taskFilePath}
97
+ **Line:** ${task.line}
98
+ **Phase:** ${task.phasePath.join(' → ')}
99
+ **Task:** ${task.text}`;
100
+ if (task.children.length > 0) {
101
+ section += '\n\n**Children:**';
102
+ for (const child of task.children) {
103
+ const status = child.checked ? '[x]' : '[ ]';
104
+ section += `\n- ${status} ${child.text}`;
105
+ }
106
+ }
107
+ return section;
108
+ }
109
+ function buildProgressSummary(taskFile, currentTask) {
110
+ const completed = taskFile.completed.length;
111
+ const total = taskFile.totalCount;
112
+ const phase = currentTask.phasePath.length > 0 ? currentTask.phasePath[0] : 'Unknown';
113
+ return `## Progress Summary
114
+
115
+ ${completed}/${total} complete. Phase: ${phase}.`;
116
+ }
117
+ async function buildVaultContextSection(task, vault, maxContextTokens) {
118
+ // Extract keywords from task text
119
+ const keywords = extractKeywords(task.text);
120
+ if (keywords.length === 0) {
121
+ return null;
122
+ }
123
+ // Search vault for relevant context
124
+ const searchResults = await vault.search(keywords.join(' '), 10);
125
+ if (searchResults.length === 0) {
126
+ return null;
127
+ }
128
+ // Build context section, respecting token budget
129
+ let section = '## Relevant Files\n\n';
130
+ let usedTokens = estimateTokens(section);
131
+ for (const result of searchResults) {
132
+ const content = result.content || result.snippet || '';
133
+ if (!content)
134
+ continue;
135
+ const itemText = `**${result.key || result.id}**\n${content}\n\n`;
136
+ const itemTokens = estimateTokens(itemText);
137
+ if (usedTokens + itemTokens > maxContextTokens) {
138
+ break;
139
+ }
140
+ section += itemText;
141
+ usedTokens += itemTokens;
142
+ }
143
+ return section.trim() === '## Relevant Files' ? null : section.trim();
144
+ }
145
+ function extractKeywords(text) {
146
+ // Simple keyword extraction: split on whitespace, filter stop words
147
+ const stopWords = new Set([
148
+ 'a', 'an', 'and', 'are', 'as', 'at', 'be', 'by', 'for', 'from',
149
+ 'has', 'he', 'in', 'is', 'it', 'its', 'of', 'on', 'that', 'the',
150
+ 'to', 'was', 'were', 'will', 'with', 'this', 'these', 'they',
151
+ 'should', 'would', 'could', 'can', 'may', 'might', 'must'
152
+ ]);
153
+ return text
154
+ .toLowerCase()
155
+ .split(/\s+/)
156
+ .filter(word => word.length > 2)
157
+ .filter(word => !stopWords.has(word))
158
+ .filter(word => /^[a-zA-Z]+$/.test(word))
159
+ .slice(0, 10); // Take top 10 keywords
160
+ }
161
+ function buildRetryContextSection(retryContext) {
162
+ return `## Previous Attempt Failed
163
+
164
+ ${retryContext}
165
+
166
+ Do not repeat the same mistake.`;
167
+ }
168
+ function buildResultInstructions(decomposeEnabled) {
169
+ let instructions = `## Instructions
170
+
171
+ When finished, emit exactly this block at the end of your response:
172
+
173
+ \`\`\`
174
+ <anton-result>
175
+ status: done
176
+ </anton-result>
177
+ \`\`\`
178
+
179
+ If blocked:
180
+
181
+ \`\`\`
182
+ <anton-result>
183
+ status: blocked
184
+ reason: <why>
185
+ </anton-result>
186
+ \`\`\``;
187
+ if (decomposeEnabled) {
188
+ instructions += `
189
+
190
+ If task is too large:
191
+
192
+ \`\`\`
193
+ <anton-result>
194
+ status: decompose
195
+ subtasks:
196
+ - <sub-task 1>
197
+ - <sub-task 2>
198
+ </anton-result>
199
+ \`\`\``;
200
+ }
201
+ return instructions;
202
+ }
203
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/anton/prompt.ts"],"names":[],"mappings":"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"}