@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.
- package/LICENSE +21 -0
- package/README.md +30 -0
- package/dist/agent.js +2604 -0
- package/dist/agent.js.map +1 -0
- package/dist/anton/controller.js +341 -0
- package/dist/anton/controller.js.map +1 -0
- package/dist/anton/lock.js +110 -0
- package/dist/anton/lock.js.map +1 -0
- package/dist/anton/parser.js +303 -0
- package/dist/anton/parser.js.map +1 -0
- package/dist/anton/prompt.js +203 -0
- package/dist/anton/prompt.js.map +1 -0
- package/dist/anton/reporter.js +119 -0
- package/dist/anton/reporter.js.map +1 -0
- package/dist/anton/session.js +51 -0
- package/dist/anton/session.js.map +1 -0
- package/dist/anton/types.js +7 -0
- package/dist/anton/types.js.map +1 -0
- package/dist/anton/verifier.js +263 -0
- package/dist/anton/verifier.js.map +1 -0
- package/dist/bench/compare.js +239 -0
- package/dist/bench/compare.js.map +1 -0
- package/dist/bench/debug_hooks.js +17 -0
- package/dist/bench/debug_hooks.js.map +1 -0
- package/dist/bench/json_extract.js +22 -0
- package/dist/bench/json_extract.js.map +1 -0
- package/dist/bench/openclaw.js +86 -0
- package/dist/bench/openclaw.js.map +1 -0
- package/dist/bench/report.js +116 -0
- package/dist/bench/report.js.map +1 -0
- package/dist/bench/runner.js +312 -0
- package/dist/bench/runner.js.map +1 -0
- package/dist/bench/types.js +2 -0
- package/dist/bench/types.js.map +1 -0
- package/dist/bot/commands.js +444 -0
- package/dist/bot/commands.js.map +1 -0
- package/dist/bot/confirm-discord.js +133 -0
- package/dist/bot/confirm-discord.js.map +1 -0
- package/dist/bot/confirm-telegram.js +290 -0
- package/dist/bot/confirm-telegram.js.map +1 -0
- package/dist/bot/discord.js +826 -0
- package/dist/bot/discord.js.map +1 -0
- package/dist/bot/format.js +210 -0
- package/dist/bot/format.js.map +1 -0
- package/dist/bot/session-manager.js +270 -0
- package/dist/bot/session-manager.js.map +1 -0
- package/dist/bot/telegram.js +678 -0
- package/dist/bot/telegram.js.map +1 -0
- package/dist/cli/agent-turn.js +45 -0
- package/dist/cli/agent-turn.js.map +1 -0
- package/dist/cli/args.js +236 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/bot.js +252 -0
- package/dist/cli/bot.js.map +1 -0
- package/dist/cli/build-repl-context.js +365 -0
- package/dist/cli/build-repl-context.js.map +1 -0
- package/dist/cli/command-registry.js +20 -0
- package/dist/cli/command-registry.js.map +1 -0
- package/dist/cli/commands/anton.js +271 -0
- package/dist/cli/commands/anton.js.map +1 -0
- package/dist/cli/commands/editing.js +328 -0
- package/dist/cli/commands/editing.js.map +1 -0
- package/dist/cli/commands/model.js +274 -0
- package/dist/cli/commands/model.js.map +1 -0
- package/dist/cli/commands/project.js +255 -0
- package/dist/cli/commands/project.js.map +1 -0
- package/dist/cli/commands/runtime.js +63 -0
- package/dist/cli/commands/runtime.js.map +1 -0
- package/dist/cli/commands/session.js +281 -0
- package/dist/cli/commands/session.js.map +1 -0
- package/dist/cli/commands/tools.js +126 -0
- package/dist/cli/commands/tools.js.map +1 -0
- package/dist/cli/commands/trifecta.js +221 -0
- package/dist/cli/commands/trifecta.js.map +1 -0
- package/dist/cli/commands/tui.js +17 -0
- package/dist/cli/commands/tui.js.map +1 -0
- package/dist/cli/init.js +222 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/input.js +360 -0
- package/dist/cli/input.js.map +1 -0
- package/dist/cli/oneshot.js +254 -0
- package/dist/cli/oneshot.js.map +1 -0
- package/dist/cli/repl-context.js +2 -0
- package/dist/cli/repl-context.js.map +1 -0
- package/dist/cli/runtime-cmds.js +811 -0
- package/dist/cli/runtime-cmds.js.map +1 -0
- package/dist/cli/service.js +145 -0
- package/dist/cli/service.js.map +1 -0
- package/dist/cli/session-state.js +130 -0
- package/dist/cli/session-state.js.map +1 -0
- package/dist/cli/setup.js +815 -0
- package/dist/cli/setup.js.map +1 -0
- package/dist/cli/shell.js +79 -0
- package/dist/cli/shell.js.map +1 -0
- package/dist/cli/status.js +392 -0
- package/dist/cli/status.js.map +1 -0
- package/dist/cli/watch.js +33 -0
- package/dist/cli/watch.js.map +1 -0
- package/dist/client.js +676 -0
- package/dist/client.js.map +1 -0
- package/dist/commands.js +194 -0
- package/dist/commands.js.map +1 -0
- package/dist/config.js +507 -0
- package/dist/config.js.map +1 -0
- package/dist/confirm/auto.js +13 -0
- package/dist/confirm/auto.js.map +1 -0
- package/dist/confirm/headless.js +41 -0
- package/dist/confirm/headless.js.map +1 -0
- package/dist/confirm/terminal.js +90 -0
- package/dist/confirm/terminal.js.map +1 -0
- package/dist/context.js +49 -0
- package/dist/context.js.map +1 -0
- package/dist/git.js +136 -0
- package/dist/git.js.map +1 -0
- package/dist/harnesses.js +171 -0
- package/dist/harnesses.js.map +1 -0
- package/dist/history.js +139 -0
- package/dist/history.js.map +1 -0
- package/dist/index.js +700 -0
- package/dist/index.js.map +1 -0
- package/dist/indexer.js +374 -0
- package/dist/indexer.js.map +1 -0
- package/dist/jsonrpc.js +76 -0
- package/dist/jsonrpc.js.map +1 -0
- package/dist/lens.js +525 -0
- package/dist/lens.js.map +1 -0
- package/dist/lsp.js +605 -0
- package/dist/lsp.js.map +1 -0
- package/dist/markdown.js +275 -0
- package/dist/markdown.js.map +1 -0
- package/dist/mcp.js +554 -0
- package/dist/mcp.js.map +1 -0
- package/dist/recovery.js +178 -0
- package/dist/recovery.js.map +1 -0
- package/dist/replay.js +132 -0
- package/dist/replay.js.map +1 -0
- package/dist/replay_cli.js +24 -0
- package/dist/replay_cli.js.map +1 -0
- package/dist/runtime/executor.js +418 -0
- package/dist/runtime/executor.js.map +1 -0
- package/dist/runtime/planner.js +197 -0
- package/dist/runtime/planner.js.map +1 -0
- package/dist/runtime/store.js +289 -0
- package/dist/runtime/store.js.map +1 -0
- package/dist/runtime/types.js +2 -0
- package/dist/runtime/types.js.map +1 -0
- package/dist/safety.js +446 -0
- package/dist/safety.js.map +1 -0
- package/dist/spinner.js +224 -0
- package/dist/spinner.js.map +1 -0
- package/dist/sys/context.js +124 -0
- package/dist/sys/context.js.map +1 -0
- package/dist/sys/snapshot.sh +97 -0
- package/dist/term.js +61 -0
- package/dist/term.js.map +1 -0
- package/dist/themes.js +135 -0
- package/dist/themes.js.map +1 -0
- package/dist/tools.js +1114 -0
- package/dist/tools.js.map +1 -0
- package/dist/tui/branch-picker.js +65 -0
- package/dist/tui/branch-picker.js.map +1 -0
- package/dist/tui/command-handler.js +108 -0
- package/dist/tui/command-handler.js.map +1 -0
- package/dist/tui/confirm.js +90 -0
- package/dist/tui/confirm.js.map +1 -0
- package/dist/tui/controller.js +463 -0
- package/dist/tui/controller.js.map +1 -0
- package/dist/tui/event-bridge.js +44 -0
- package/dist/tui/event-bridge.js.map +1 -0
- package/dist/tui/events.js +2 -0
- package/dist/tui/events.js.map +1 -0
- package/dist/tui/keymap.js +144 -0
- package/dist/tui/keymap.js.map +1 -0
- package/dist/tui/layout.js +11 -0
- package/dist/tui/layout.js.map +1 -0
- package/dist/tui/render.js +186 -0
- package/dist/tui/render.js.map +1 -0
- package/dist/tui/screen.js +48 -0
- package/dist/tui/screen.js.map +1 -0
- package/dist/tui/state.js +167 -0
- package/dist/tui/state.js.map +1 -0
- package/dist/tui/theme.js +70 -0
- package/dist/tui/theme.js.map +1 -0
- package/dist/tui/types.js +2 -0
- package/dist/tui/types.js.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/upgrade.js +412 -0
- package/dist/upgrade.js.map +1 -0
- package/dist/utils.js +87 -0
- package/dist/utils.js.map +1 -0
- package/dist/vault.js +520 -0
- package/dist/vault.js.map +1 -0
- package/dist/vim.js +160 -0
- package/dist/vim.js.map +1 -0
- package/package.json +67 -0
- 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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"}
|