fixo-cli 1.0.3 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of fixo-cli might be problematic. Click here for more details.
- package/CHANGELOG.md +62 -0
- package/README.md +18 -14
- package/dist/agent/agent-client.d.ts +28 -6
- package/dist/agent/agent-client.d.ts.map +1 -1
- package/dist/agent/agent-client.js +118 -39
- package/dist/agent/agent-client.js.map +1 -1
- package/dist/agent/agent-pool.d.ts +55 -6
- package/dist/agent/agent-pool.d.ts.map +1 -1
- package/dist/agent/agent-pool.js +120 -20
- package/dist/agent/agent-pool.js.map +1 -1
- package/dist/agent/auto-verifier.d.ts +55 -0
- package/dist/agent/auto-verifier.d.ts.map +1 -0
- package/dist/agent/auto-verifier.js +50 -0
- package/dist/agent/auto-verifier.js.map +1 -0
- package/dist/agent/command-parser.d.ts +37 -0
- package/dist/agent/command-parser.d.ts.map +1 -1
- package/dist/agent/command-parser.js +473 -1
- package/dist/agent/command-parser.js.map +1 -1
- package/dist/agent/context-builder.d.ts +24 -0
- package/dist/agent/context-builder.d.ts.map +1 -0
- package/dist/agent/context-builder.js +197 -0
- package/dist/agent/context-builder.js.map +1 -0
- package/dist/agent/conversation.d.ts +32 -2
- package/dist/agent/conversation.d.ts.map +1 -1
- package/dist/agent/conversation.js +84 -9
- package/dist/agent/conversation.js.map +1 -1
- package/dist/agent/duration.d.ts +24 -0
- package/dist/agent/duration.d.ts.map +1 -0
- package/dist/agent/duration.js +42 -0
- package/dist/agent/duration.js.map +1 -0
- package/dist/agent/file-writing-rules.d.ts +19 -0
- package/dist/agent/file-writing-rules.d.ts.map +1 -0
- package/dist/agent/file-writing-rules.js +31 -0
- package/dist/agent/file-writing-rules.js.map +1 -0
- package/dist/agent/mcp-bridge.js +1 -1
- package/dist/agent/mcp-bridge.js.map +1 -1
- package/dist/agent/orchestrator.d.ts +45 -0
- package/dist/agent/orchestrator.d.ts.map +1 -1
- package/dist/agent/orchestrator.js +140 -3
- package/dist/agent/orchestrator.js.map +1 -1
- package/dist/agent/parser-adapter.d.ts +17 -0
- package/dist/agent/parser-adapter.d.ts.map +1 -1
- package/dist/agent/parser-adapter.js +311 -7
- package/dist/agent/parser-adapter.js.map +1 -1
- package/dist/agent/predictive-gate.d.ts.map +1 -1
- package/dist/agent/predictive-gate.js +4 -1
- package/dist/agent/predictive-gate.js.map +1 -1
- package/dist/agent/provider-cooldown.d.ts.map +1 -1
- package/dist/agent/provider-cooldown.js +3 -2
- package/dist/agent/provider-cooldown.js.map +1 -1
- package/dist/agent/providers-manager.d.ts +5 -0
- package/dist/agent/providers-manager.d.ts.map +1 -1
- package/dist/agent/providers-manager.js +119 -8
- package/dist/agent/providers-manager.js.map +1 -1
- package/dist/agent/repo-map.d.ts +18 -1
- package/dist/agent/repo-map.d.ts.map +1 -1
- package/dist/agent/repo-map.js +144 -54
- package/dist/agent/repo-map.js.map +1 -1
- package/dist/agent/retry.js +1 -2
- package/dist/agent/retry.js.map +1 -1
- package/dist/agent/single-agent.d.ts +13 -0
- package/dist/agent/single-agent.d.ts.map +1 -1
- package/dist/agent/single-agent.js +225 -37
- package/dist/agent/single-agent.js.map +1 -1
- package/dist/agent/skills.d.ts.map +1 -1
- package/dist/agent/skills.js +2 -1
- package/dist/agent/skills.js.map +1 -1
- package/dist/agent/subagent.js +2 -2
- package/dist/agent/subagent.js.map +1 -1
- package/dist/agent/task-router.d.ts +46 -0
- package/dist/agent/task-router.d.ts.map +1 -0
- package/dist/agent/task-router.js +352 -0
- package/dist/agent/task-router.js.map +1 -0
- package/dist/agent/telemetry.d.ts +29 -1
- package/dist/agent/telemetry.d.ts.map +1 -1
- package/dist/agent/telemetry.js +29 -11
- package/dist/agent/telemetry.js.map +1 -1
- package/dist/agent/tool-definitions.d.ts +3 -0
- package/dist/agent/tool-definitions.d.ts.map +1 -0
- package/dist/agent/tool-definitions.js +519 -0
- package/dist/agent/tool-definitions.js.map +1 -0
- package/dist/agent/tool-executor.d.ts +6 -1
- package/dist/agent/tool-executor.d.ts.map +1 -1
- package/dist/agent/tool-executor.js +99 -553
- package/dist/agent/tool-executor.js.map +1 -1
- package/dist/agent/tools/command-tools.d.ts +6 -0
- package/dist/agent/tools/command-tools.d.ts.map +1 -0
- package/dist/agent/tools/command-tools.js +104 -0
- package/dist/agent/tools/command-tools.js.map +1 -0
- package/dist/agent/tools/file-tools.d.ts +15 -0
- package/dist/agent/tools/file-tools.d.ts.map +1 -0
- package/dist/agent/tools/file-tools.js +551 -0
- package/dist/agent/tools/file-tools.js.map +1 -0
- package/dist/agent/tools/todo-tools.d.ts +3 -0
- package/dist/agent/tools/todo-tools.d.ts.map +1 -0
- package/dist/agent/tools/todo-tools.js +70 -0
- package/dist/agent/tools/todo-tools.js.map +1 -0
- package/dist/agent/web-impl.d.ts.map +1 -1
- package/dist/agent/web-impl.js +45 -0
- package/dist/agent/web-impl.js.map +1 -1
- package/dist/agent/worker-agent.d.ts +3 -1
- package/dist/agent/worker-agent.d.ts.map +1 -1
- package/dist/agent/worker-agent.js +56 -16
- package/dist/agent/worker-agent.js.map +1 -1
- package/dist/config.d.ts +253 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +81 -1
- package/dist/config.js.map +1 -1
- package/dist/git/git-manager.d.ts +33 -2
- package/dist/git/git-manager.d.ts.map +1 -1
- package/dist/git/git-manager.js +111 -15
- package/dist/git/git-manager.js.map +1 -1
- package/dist/git/git-ops.d.ts.map +1 -1
- package/dist/git/git-ops.js +2 -1
- package/dist/git/git-ops.js.map +1 -1
- package/dist/index.js +89 -8
- package/dist/index.js.map +1 -1
- package/dist/lsp/lsp-manager.js +1 -1
- package/dist/lsp/lsp-manager.js.map +1 -1
- package/dist/model-outcomes.d.ts.map +1 -1
- package/dist/model-outcomes.js +2 -1
- package/dist/model-outcomes.js.map +1 -1
- package/dist/planner.d.ts +0 -9
- package/dist/planner.d.ts.map +1 -1
- package/dist/planner.js +0 -9
- package/dist/planner.js.map +1 -1
- package/dist/project-memory.d.ts +12 -1
- package/dist/project-memory.d.ts.map +1 -1
- package/dist/project-memory.js +8 -6
- package/dist/project-memory.js.map +1 -1
- package/dist/runtime/loop-mitigation.d.ts +119 -0
- package/dist/runtime/loop-mitigation.d.ts.map +1 -0
- package/dist/runtime/loop-mitigation.js +192 -0
- package/dist/runtime/loop-mitigation.js.map +1 -0
- package/dist/runtime/os-sandbox.d.ts +100 -0
- package/dist/runtime/os-sandbox.d.ts.map +1 -0
- package/dist/runtime/os-sandbox.js +246 -0
- package/dist/runtime/os-sandbox.js.map +1 -0
- package/dist/runtime/run-inventory.d.ts +17 -0
- package/dist/runtime/run-inventory.d.ts.map +1 -0
- package/dist/runtime/run-inventory.js +49 -0
- package/dist/runtime/run-inventory.js.map +1 -0
- package/dist/runtime/session-snapshots.d.ts +52 -2
- package/dist/runtime/session-snapshots.d.ts.map +1 -1
- package/dist/runtime/session-snapshots.js +76 -1
- package/dist/runtime/session-snapshots.js.map +1 -1
- package/dist/runtime/staging.d.ts.map +1 -1
- package/dist/runtime/staging.js +4 -1
- package/dist/runtime/staging.js.map +1 -1
- package/dist/runtime/task-session.d.ts +14 -0
- package/dist/runtime/task-session.d.ts.map +1 -1
- package/dist/runtime/task-session.js +26 -0
- package/dist/runtime/task-session.js.map +1 -1
- package/dist/setup-wizard.d.ts +11 -3
- package/dist/setup-wizard.d.ts.map +1 -1
- package/dist/setup-wizard.js +113 -15
- package/dist/setup-wizard.js.map +1 -1
- package/dist/types.d.ts +8 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/ui/commands/context-commands.d.ts +7 -0
- package/dist/ui/commands/context-commands.d.ts.map +1 -0
- package/dist/ui/commands/context-commands.js +241 -0
- package/dist/ui/commands/context-commands.js.map +1 -0
- package/dist/ui/commands/index.d.ts +3 -0
- package/dist/ui/commands/index.d.ts.map +1 -0
- package/dist/ui/commands/index.js +46 -0
- package/dist/ui/commands/index.js.map +1 -0
- package/dist/ui/commands/info-commands.d.ts +15 -0
- package/dist/ui/commands/info-commands.d.ts.map +1 -0
- package/dist/ui/commands/info-commands.js +122 -0
- package/dist/ui/commands/info-commands.js.map +1 -0
- package/dist/ui/commands/model-commands.d.ts +5 -0
- package/dist/ui/commands/model-commands.d.ts.map +1 -0
- package/dist/ui/commands/model-commands.js +417 -0
- package/dist/ui/commands/model-commands.js.map +1 -0
- package/dist/ui/commands/session-commands.d.ts +5 -0
- package/dist/ui/commands/session-commands.d.ts.map +1 -0
- package/dist/ui/commands/session-commands.js +154 -0
- package/dist/ui/commands/session-commands.js.map +1 -0
- package/dist/ui/commands/task-commands.d.ts +8 -0
- package/dist/ui/commands/task-commands.d.ts.map +1 -0
- package/dist/ui/commands/task-commands.js +152 -0
- package/dist/ui/commands/task-commands.js.map +1 -0
- package/dist/ui/commands/types.d.ts +46 -0
- package/dist/ui/commands/types.d.ts.map +1 -0
- package/dist/ui/commands/types.js +2 -0
- package/dist/ui/commands/types.js.map +1 -0
- package/dist/ui/commands/workspace-commands.d.ts +8 -0
- package/dist/ui/commands/workspace-commands.d.ts.map +1 -0
- package/dist/ui/commands/workspace-commands.js +131 -0
- package/dist/ui/commands/workspace-commands.js.map +1 -0
- package/dist/ui/loading-animation.d.ts +24 -0
- package/dist/ui/loading-animation.d.ts.map +1 -0
- package/dist/ui/loading-animation.js +123 -0
- package/dist/ui/loading-animation.js.map +1 -0
- package/dist/ui/markdown-stream.js +2 -2
- package/dist/ui/markdown-stream.js.map +1 -1
- package/dist/ui/prompt.d.ts +7 -0
- package/dist/ui/prompt.d.ts.map +1 -1
- package/dist/ui/prompt.js +461 -1143
- package/dist/ui/prompt.js.map +1 -1
- package/dist/ui/render-primitives.d.ts +6 -0
- package/dist/ui/render-primitives.d.ts.map +1 -1
- package/dist/ui/render-primitives.js +30 -13
- package/dist/ui/render-primitives.js.map +1 -1
- package/dist/ui/render.d.ts.map +1 -1
- package/dist/ui/render.js +2 -0
- package/dist/ui/render.js.map +1 -1
- package/dist/ui/session-header.d.ts +13 -0
- package/dist/ui/session-header.d.ts.map +1 -1
- package/dist/ui/session-header.js +6 -0
- package/dist/ui/session-header.js.map +1 -1
- package/package.json +22 -4
- package/scripts/check-vendor-wasm.js +55 -0
- package/vendor/tree-sitter-bash.wasm +0 -0
- package/vendor/tree-sitter-go.wasm +0 -0
- package/vendor/tree-sitter-javascript.wasm +0 -0
- package/vendor/tree-sitter-python.wasm +0 -0
- package/vendor/tree-sitter-rust.wasm +0 -0
- package/vendor/tree-sitter-tsx.wasm +0 -0
- package/vendor/tree-sitter-typescript.wasm +0 -0
- package/vendor/tree-sitter.wasm +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-commands.d.ts","sourceRoot":"","sources":["../../../src/ui/commands/task-commands.ts"],"names":[],"mappings":"AAsCA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,eAAO,MAAM,aAAa,EAAE,cAI3B,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,cAIzB,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,cAsE7B,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,cAI1B,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,cAYzB,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,cAsD5B,CAAC"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import { reviewWorkspace } from '../../review.js';
|
|
4
|
+
import { runProjectTests } from '../../test-runner.js';
|
|
5
|
+
import { loadPlan, renderPlan, savePlan } from '../../planner.js';
|
|
6
|
+
import { colors } from '../colors.js';
|
|
7
|
+
export const reviewCommand = async (ctx) => {
|
|
8
|
+
console.log(`\n${reviewWorkspace(ctx.cwd)}`);
|
|
9
|
+
return;
|
|
10
|
+
};
|
|
11
|
+
export const testCommand = async (ctx) => {
|
|
12
|
+
console.log(`\n${runProjectTests(ctx.cwd)}`);
|
|
13
|
+
return;
|
|
14
|
+
};
|
|
15
|
+
export const fixTestsCommand = async (ctx) => {
|
|
16
|
+
let testResult = runProjectTests(ctx.cwd);
|
|
17
|
+
if (testResult.includes('Status: 0')) {
|
|
18
|
+
console.log(`\n${colors.green}✓ All tests are passing!${colors.reset}`);
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
let attempt = 1;
|
|
22
|
+
const maxAttempts = 3;
|
|
23
|
+
const modifiedFiles = [];
|
|
24
|
+
while (attempt <= maxAttempts) {
|
|
25
|
+
console.log(`\n${colors.cyan}🔨 [Auto-Fix] Test failure detected (Attempt ${attempt}/${maxAttempts}). Invoking SingleAgent to repair...${colors.reset}`);
|
|
26
|
+
console.log(`${colors.dim}${testResult}${colors.reset}\n`);
|
|
27
|
+
const repairTask = `The project tests are failing. Here is the test runner output:\n\n${testResult}\n\nPlease identify the files causing the failure, modify them to fix the issues, verify using the test commands, and ensure they pass.`;
|
|
28
|
+
const context = {
|
|
29
|
+
task: repairTask,
|
|
30
|
+
model: ctx.state.currentModel,
|
|
31
|
+
cwd: ctx.cwd,
|
|
32
|
+
verbose: ctx.verbose,
|
|
33
|
+
selectedFiles: [...ctx.state.selectedFiles],
|
|
34
|
+
systemPromptOverride: ctx.projectConfig?.systemPrompt,
|
|
35
|
+
checkCommand: ctx.projectConfig?.checkCommand,
|
|
36
|
+
policy: ctx.projectConfig?.policy ?? ctx.config.preferences.policy,
|
|
37
|
+
mode: 'BUILD',
|
|
38
|
+
yes: true,
|
|
39
|
+
};
|
|
40
|
+
try {
|
|
41
|
+
ctx.state.isTaskRunning = true;
|
|
42
|
+
ctx.state.currentRunningAgent = ctx.agent;
|
|
43
|
+
const result = await ctx.agent.runStreaming(context, ctx.conversation, ctx.rl);
|
|
44
|
+
for (const file of result.modifiedFiles) {
|
|
45
|
+
if (!modifiedFiles.includes(file)) {
|
|
46
|
+
modifiedFiles.push(file);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
console.log(`\n${colors.red}✗ Repair ctx.agent failed on attempt ${attempt}: ${err.message || err}${colors.reset}`);
|
|
52
|
+
}
|
|
53
|
+
finally {
|
|
54
|
+
ctx.state.isTaskRunning = false;
|
|
55
|
+
ctx.state.currentRunningAgent = null;
|
|
56
|
+
ctx.agent.reset();
|
|
57
|
+
}
|
|
58
|
+
testResult = runProjectTests(ctx.cwd);
|
|
59
|
+
if (testResult.includes('Status: 0')) {
|
|
60
|
+
console.log(`\n${colors.green}✓ All tests passed after repair attempt ${attempt}!${colors.reset}`);
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
attempt++;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
if (!testResult.includes('Status: 0')) {
|
|
68
|
+
console.log(`\n${colors.red}✗ Auto-fix failed after ${maxAttempts} attempts. Remaining failures:${colors.reset}`);
|
|
69
|
+
console.log(`${colors.dim}${testResult}${colors.reset}`);
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
// Auto-commit if enabled and changes were made
|
|
73
|
+
if (ctx.config.preferences.autoCommit &&
|
|
74
|
+
(ctx.projectConfig?.autoCommit !== false) &&
|
|
75
|
+
modifiedFiles.length > 0) {
|
|
76
|
+
console.log(`\n${colors.green}✓ Auto-committing repaired test files...${colors.reset}`);
|
|
77
|
+
ctx.git.autoCommit('fix-tests: repair test failures', modifiedFiles);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return;
|
|
81
|
+
};
|
|
82
|
+
export const fixCiCommand = async (ctx) => {
|
|
83
|
+
console.log(`\n${colors.yellow}/fix-ci local mode: paste CI logs into a task or save them to a workspace file, then ask FixO to inspect that file.${colors.reset}`);
|
|
84
|
+
return;
|
|
85
|
+
};
|
|
86
|
+
export const planCommand = async (ctx) => {
|
|
87
|
+
{
|
|
88
|
+
const task = ctx.args.join(' ').trim();
|
|
89
|
+
if (!task) {
|
|
90
|
+
console.log(`\n${colors.yellow}Usage: /plan <task>${colors.reset}`);
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
const plan = savePlan(ctx.cwd, task);
|
|
94
|
+
console.log(`\n${renderPlan(plan)}`);
|
|
95
|
+
}
|
|
96
|
+
return;
|
|
97
|
+
};
|
|
98
|
+
export const runPlanCommand = async (ctx) => {
|
|
99
|
+
const dagFile = path.join(ctx.cwd, '.fixo', 'last-dag.json');
|
|
100
|
+
if (fs.existsSync(dagFile)) {
|
|
101
|
+
try {
|
|
102
|
+
const { task, dag } = JSON.parse(fs.readFileSync(dagFile, 'utf-8'));
|
|
103
|
+
console.log(`\n${colors.cyan}[Saved Plan] Executing saved subtasks DAG for task: ${colors.bold}${task}${colors.reset}`);
|
|
104
|
+
const { AgentPool } = await import('../../agent/agent-pool.js');
|
|
105
|
+
const pool = new AgentPool(3, ctx.projectConfig?.maxAttempts ?? 12);
|
|
106
|
+
const context = {
|
|
107
|
+
task,
|
|
108
|
+
model: ctx.state.currentModel,
|
|
109
|
+
cwd: ctx.cwd,
|
|
110
|
+
verbose: ctx.verbose,
|
|
111
|
+
selectedFiles: [...ctx.state.selectedFiles],
|
|
112
|
+
systemPromptOverride: ctx.projectConfig?.systemPrompt,
|
|
113
|
+
checkCommand: ctx.projectConfig?.checkCommand,
|
|
114
|
+
policy: ctx.projectConfig?.policy ?? ctx.config.preferences.policy,
|
|
115
|
+
mode: ctx.state.currentMode,
|
|
116
|
+
};
|
|
117
|
+
const success = await pool.execute(context, dag);
|
|
118
|
+
if (success) {
|
|
119
|
+
console.log(`\n${colors.green}✓ Successfully completed complex task via parallel agents.${colors.reset}`);
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
console.log(`\n${colors.red}✗ Parallel workers failed to complete all subtasks.${colors.reset}`);
|
|
123
|
+
if (ctx.git.isGitRepo()) {
|
|
124
|
+
// Phase 0.0 (Jun 21 incident): roll back only files the
|
|
125
|
+
// workers actually touched, not the entire workspace.
|
|
126
|
+
const { getModifiedFiles, getBranchPoint } = await import('../../agent/worker-agent.js');
|
|
127
|
+
const touched = getModifiedFiles(ctx.cwd, getBranchPoint(ctx.cwd));
|
|
128
|
+
if (touched.length > 0) {
|
|
129
|
+
console.log(`\n${colors.yellow}[Agent Pool] Rolling back ${touched.length} file(s) the workers touched...${colors.reset}`);
|
|
130
|
+
ctx.git.discardChangesIn(touched);
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
console.log(`\n${colors.dim}[Agent Pool] No worker-touched files detected — leaving workspace untouched.${colors.reset}`);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
catch (err) {
|
|
140
|
+
console.log(`\n${colors.red}✗ Failed to run saved DAG: ${err.message}${colors.reset}`);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
const plan = loadPlan(ctx.cwd);
|
|
144
|
+
if (!plan) {
|
|
145
|
+
console.log(`\n${colors.yellow}No saved plan or DAG. Generate one with /plan <task> or run a complex task in PLAN mode.${colors.reset}`);
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
console.log(`\n${colors.dim}Executing saved plan task: ${plan.task}${colors.reset}`);
|
|
149
|
+
await ctx.handleInput(plan.task);
|
|
150
|
+
return;
|
|
151
|
+
};
|
|
152
|
+
//# sourceMappingURL=task-commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-commands.js","sourceRoot":"","sources":["../../../src/ui/commands/task-commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import * as readline from 'readline';
|
|
2
|
+
import { type FreeLLMConfig } from '../../config.js';
|
|
3
|
+
import { type ProjectConfig } from '../../types.js';
|
|
4
|
+
import { type ConversationManager } from '../../agent/conversation.js';
|
|
5
|
+
import { type SingleAgent } from '../../agent/single-agent.js';
|
|
6
|
+
import { type GitManager } from '../../git/git-manager.js';
|
|
7
|
+
import { type WorkspaceGuard } from '../../workspace-guard.js';
|
|
8
|
+
import { type SessionStats } from '../prompt.js';
|
|
9
|
+
import { type ChatContentBlock } from '../../shared/types.js';
|
|
10
|
+
export interface CommandState {
|
|
11
|
+
currentModel: string;
|
|
12
|
+
currentMode: string;
|
|
13
|
+
currentSessionId: string;
|
|
14
|
+
currentSessionLabel: string | undefined;
|
|
15
|
+
sessionModifiedFiles: string[];
|
|
16
|
+
pendingAttachments: ChatContentBlock[];
|
|
17
|
+
selectedFiles: string[];
|
|
18
|
+
stats: SessionStats;
|
|
19
|
+
isTaskRunning: boolean;
|
|
20
|
+
currentRunningAgent: SingleAgent | null;
|
|
21
|
+
}
|
|
22
|
+
export interface CommandContext {
|
|
23
|
+
state: CommandState;
|
|
24
|
+
args: string[];
|
|
25
|
+
config: FreeLLMConfig;
|
|
26
|
+
projectConfig?: ProjectConfig;
|
|
27
|
+
cwd: string;
|
|
28
|
+
verbose: boolean;
|
|
29
|
+
conversation: ConversationManager;
|
|
30
|
+
agent: SingleAgent;
|
|
31
|
+
git: GitManager;
|
|
32
|
+
guard: WorkspaceGuard;
|
|
33
|
+
rl: readline.Interface;
|
|
34
|
+
handleInput: (input: string) => Promise<void>;
|
|
35
|
+
clearSuggestions: () => void;
|
|
36
|
+
refreshModelsForProvider: (name: string) => Promise<void>;
|
|
37
|
+
printStats?: (stats: SessionStats) => void;
|
|
38
|
+
listRuns?: (cwd: string) => void;
|
|
39
|
+
showRun?: (cwd: string, id: string) => void;
|
|
40
|
+
buildIndex?: (cwd: string) => void;
|
|
41
|
+
workspaceFiles?: string[];
|
|
42
|
+
findInIndex?: (cwd: string, q: string) => void;
|
|
43
|
+
explainIndexedTarget?: (cwd: string, q: string) => void;
|
|
44
|
+
}
|
|
45
|
+
export type CommandHandler = (ctx: CommandContext) => Promise<void> | void;
|
|
46
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/ui/commands/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,mBAAmB,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,kBAAkB,EAAE,gBAAgB,EAAE,CAAC;IACvC,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,KAAK,EAAE,YAAY,CAAC;IACpB,aAAa,EAAE,OAAO,CAAC;IACvB,mBAAmB,EAAE,WAAW,GAAG,IAAI,CAAC;CACzC;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,YAAY,CAAC;IACpB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,EAAE,aAAa,CAAC;IACtB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,mBAAmB,CAAC;IAClC,KAAK,EAAE,WAAW,CAAC;IACnB,GAAG,EAAE,UAAU,CAAC;IAChB,KAAK,EAAE,cAAc,CAAC;IACtB,EAAE,EAAE,QAAQ,CAAC,SAAS,CAAC;IAEvB,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,gBAAgB,EAAE,MAAM,IAAI,CAAC;IAC7B,wBAAwB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1D,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IAC3C,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C,oBAAoB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CACzD;AAED,MAAM,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/ui/commands/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type CommandHandler } from './types.js';
|
|
2
|
+
export declare const selectCommand: CommandHandler;
|
|
3
|
+
export declare const unselectCommand: CommandHandler;
|
|
4
|
+
export declare const diffCommand: CommandHandler;
|
|
5
|
+
export declare const undoCommand: CommandHandler;
|
|
6
|
+
export declare const imageCommand: CommandHandler;
|
|
7
|
+
export declare const modeCommand: CommandHandler;
|
|
8
|
+
//# sourceMappingURL=workspace-commands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-commands.d.ts","sourceRoot":"","sources":["../../../src/ui/commands/workspace-commands.ts"],"names":[],"mappings":"AAsCA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,eAAO,MAAM,aAAa,EAAE,cAiC3B,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,cAK7B,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,cAIzB,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,cAiBzB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,cAwC1B,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,cAoBzB,CAAC"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import * as p from '@clack/prompts';
|
|
4
|
+
import { loadImageAsBlock } from '../image-attach.js';
|
|
5
|
+
import { undoRun } from '../../runtime/task-session.js';
|
|
6
|
+
import { colors } from '../colors.js';
|
|
7
|
+
export const selectCommand = async (ctx) => {
|
|
8
|
+
if (ctx.args.length === 0) {
|
|
9
|
+
if (ctx.state.selectedFiles.length === 0) {
|
|
10
|
+
console.log(`\n${colors.dim}No files selected. Usage: /select <file-path>${colors.reset}`);
|
|
11
|
+
}
|
|
12
|
+
else {
|
|
13
|
+
console.log(`\n${colors.dim}Selected files:${colors.reset}`);
|
|
14
|
+
for (const f of ctx.state.selectedFiles) {
|
|
15
|
+
console.log(` ${colors.cyan}${path.basename(f)}${colors.reset} ${colors.dim}(${f})${colors.reset}`);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
let rawPath = ctx.args.join(' ');
|
|
21
|
+
if ((rawPath.startsWith("'") && rawPath.endsWith("'")) ||
|
|
22
|
+
(rawPath.startsWith('"') && rawPath.endsWith('"'))) {
|
|
23
|
+
rawPath = rawPath.slice(1, -1);
|
|
24
|
+
}
|
|
25
|
+
let filePath;
|
|
26
|
+
try {
|
|
27
|
+
filePath = ctx.guard.ensureFile(rawPath);
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
console.log(`\n${colors.red}✗ ${error instanceof Error ? error.message : String(error)}${colors.reset}`);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
if (!fs.existsSync(filePath)) {
|
|
34
|
+
console.log(`\n${colors.red}✗ File not found: ${rawPath}${colors.reset}`);
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
if (!ctx.state.selectedFiles.includes(filePath)) {
|
|
38
|
+
ctx.state.selectedFiles.push(filePath);
|
|
39
|
+
}
|
|
40
|
+
console.log(`\n${colors.green}✓ Pinned: ${colors.bold}${path.basename(filePath)}${colors.reset}`);
|
|
41
|
+
return;
|
|
42
|
+
};
|
|
43
|
+
export const unselectCommand = async (ctx) => {
|
|
44
|
+
ctx.state.selectedFiles = [];
|
|
45
|
+
console.log(`\n${colors.green}✓ All pinned files cleared${colors.reset}`);
|
|
46
|
+
return;
|
|
47
|
+
};
|
|
48
|
+
export const diffCommand = async (ctx) => {
|
|
49
|
+
console.log(`\n${ctx.git.getDiff()}`);
|
|
50
|
+
return;
|
|
51
|
+
};
|
|
52
|
+
export const undoCommand = async (ctx) => {
|
|
53
|
+
if (ctx.args[0]) {
|
|
54
|
+
console.log(`\n${undoRun(ctx.cwd, ctx.args[0])}`);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
ctx.rl.pause();
|
|
58
|
+
const confirmed = await p.confirm({
|
|
59
|
+
message: 'Are you sure you want to completely discard the last automated ctx.agent commit and restore all files?',
|
|
60
|
+
initialValue: false,
|
|
61
|
+
});
|
|
62
|
+
ctx.rl.resume();
|
|
63
|
+
if (p.isCancel(confirmed) || !confirmed) {
|
|
64
|
+
console.log(`\n${colors.yellow} ⚠ Undo cancelled.${colors.reset}`);
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
ctx.git.undoLastCommit();
|
|
68
|
+
return;
|
|
69
|
+
};
|
|
70
|
+
export const imageCommand = async (ctx) => {
|
|
71
|
+
// `/image <path>` — queue a local image for the next turn.
|
|
72
|
+
// `/image clear` — drop the queue.
|
|
73
|
+
// `/image list` — show what's queued.
|
|
74
|
+
const sub = ctx.args[0];
|
|
75
|
+
if (sub === 'clear') {
|
|
76
|
+
const n = ctx.state.pendingAttachments.length;
|
|
77
|
+
ctx.state.pendingAttachments = [];
|
|
78
|
+
console.log(`\n${colors.green}✓ Cleared ${n} pending image(s)${colors.reset}`);
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
if (sub === 'list') {
|
|
82
|
+
if (ctx.state.pendingAttachments.length === 0) {
|
|
83
|
+
console.log(`\n${colors.dim}No pending images.${colors.reset}`);
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
console.log(`\n${colors.bold}Pending images (sent on next prompt):${colors.reset}`);
|
|
87
|
+
for (let i = 0; i < ctx.state.pendingAttachments.length; i++) {
|
|
88
|
+
const block = ctx.state.pendingAttachments[i];
|
|
89
|
+
if (block.type === 'image' && block.source.kind === 'base64') {
|
|
90
|
+
const approxBytes = Math.floor((block.source.data.length * 3) / 4);
|
|
91
|
+
console.log(` ${i + 1}. ${block.source.mediaType} (~${approxBytes} bytes)`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
if (!sub) {
|
|
97
|
+
console.log(`\n${colors.yellow}Usage: /image <path> | /image list | /image clear${colors.reset}`);
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
const result = loadImageAsBlock(sub, ctx.cwd);
|
|
101
|
+
if (!result.ok) {
|
|
102
|
+
console.log(`\n${colors.red}✗ /image: ${result.error}${colors.reset}`);
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
ctx.state.pendingAttachments.push(result.block);
|
|
106
|
+
console.log(`\n${colors.green}✓ Attached${colors.reset} ${colors.dim}${result.mediaType}, ${result.bytes} bytes — will be sent with your next prompt${colors.reset}`);
|
|
107
|
+
return;
|
|
108
|
+
};
|
|
109
|
+
export const modeCommand = async (ctx) => {
|
|
110
|
+
ctx.rl.pause();
|
|
111
|
+
const selected = await p.select({
|
|
112
|
+
message: 'Select execution mode:',
|
|
113
|
+
options: [
|
|
114
|
+
{ value: 'PLAN', label: 'PLAN Mode (Read-only, dry-run simulation)' },
|
|
115
|
+
{ value: 'BUILD', label: 'BUILD Mode (Writing & modifying allowed)' },
|
|
116
|
+
{ value: 'EXPLORE', label: 'EXPLORE Mode (Code exploration & LSP, no modifying)' },
|
|
117
|
+
{ value: 'SCOUT', label: 'SCOUT Mode (Web search & fetch only)' },
|
|
118
|
+
],
|
|
119
|
+
initialValue: ctx.state.currentMode,
|
|
120
|
+
});
|
|
121
|
+
ctx.rl.resume();
|
|
122
|
+
if (!p.isCancel(selected) && selected) {
|
|
123
|
+
ctx.state.currentMode = selected;
|
|
124
|
+
console.log(`\n${colors.green}✓ Execution mode set to: ${colors.bold}${ctx.state.currentMode}${colors.reset}`);
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
console.log(`\n${colors.dim}Execution mode remains: ${colors.cyan}${ctx.state.currentMode}${colors.reset}`);
|
|
128
|
+
}
|
|
129
|
+
return;
|
|
130
|
+
};
|
|
131
|
+
//# sourceMappingURL=workspace-commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-commands.js","sourceRoot":"","sources":["../../../src/ui/commands/workspace-commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export interface LoadingPhase {
|
|
2
|
+
id: 'routing' | 'reasoning' | 'reading' | 'executing' | 'writing' | 'verifying' | 'searching' | 'completed';
|
|
3
|
+
label: string;
|
|
4
|
+
detail?: string;
|
|
5
|
+
icon: string;
|
|
6
|
+
}
|
|
7
|
+
export declare class LoadingAnimation {
|
|
8
|
+
private phase;
|
|
9
|
+
private timer;
|
|
10
|
+
private frame;
|
|
11
|
+
private hints;
|
|
12
|
+
private hintIndex;
|
|
13
|
+
private startedAt;
|
|
14
|
+
private turnCount;
|
|
15
|
+
private isTTY;
|
|
16
|
+
constructor();
|
|
17
|
+
start(): void;
|
|
18
|
+
setPhase(phase: Partial<LoadingPhase>): void;
|
|
19
|
+
setTurn(turn: number): void;
|
|
20
|
+
stop(): void;
|
|
21
|
+
markCancelled(): void;
|
|
22
|
+
private draw;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=loading-animation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loading-animation.d.ts","sourceRoot":"","sources":["../../src/ui/loading-animation.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,SAAS,GAAG,WAAW,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,GAAG,WAAW,GAAG,WAAW,GAAG,WAAW,CAAC;IAC5G,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AA6BD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,KAAK,CAAqE;IAClF,OAAO,CAAC,KAAK,CAA+B;IAC5C,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,KAAK,CAAW;IACxB,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,KAAK,CAAwB;;IAOrC,KAAK,IAAI,IAAI;IAeb,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,IAAI;IAQ5C,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI3B,IAAI,IAAI,IAAI;IASZ,aAAa,IAAI,IAAI;IAKrB,OAAO,CAAC,IAAI;CAoDb"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { C, visLen } from './colors.js';
|
|
2
|
+
import { safeWrite, safeWriteLine } from './render-primitives.js';
|
|
3
|
+
const HINTS = [
|
|
4
|
+
'Tip: Use /compact to free context tokens',
|
|
5
|
+
'Tip: Press Escape to cancel the current task',
|
|
6
|
+
'Tip: Use /plan to create a step-by-step execution plan',
|
|
7
|
+
'Tip: Use /mode PLAN for read-only exploration',
|
|
8
|
+
'Tip: Use /diff to see what FixO changed',
|
|
9
|
+
'Tip: Use /undo to revert the last change',
|
|
10
|
+
'Tip: Use /memory to teach FixO project conventions',
|
|
11
|
+
'Tip: Use /test to run project tests',
|
|
12
|
+
];
|
|
13
|
+
// Lava Flow Bar gradient
|
|
14
|
+
const GRADIENT = ['░', '▒', '▓', '█', '▓', '▒', '░'];
|
|
15
|
+
const GRADIENT_COLORS = [
|
|
16
|
+
C.LAVA_DIM,
|
|
17
|
+
C.LAVA,
|
|
18
|
+
'\x1b[38;2;255;160;60m', // LAVA_GLOW
|
|
19
|
+
C.SNOW, // white-hot center
|
|
20
|
+
'\x1b[38;2;255;160;60m', // LAVA_GLOW
|
|
21
|
+
C.LAVA,
|
|
22
|
+
C.LAVA_DIM,
|
|
23
|
+
];
|
|
24
|
+
const TRACK_LENGTH = 20;
|
|
25
|
+
const BAR_LENGTH = GRADIENT.length;
|
|
26
|
+
const MAX_OFFSET = TRACK_LENGTH - BAR_LENGTH;
|
|
27
|
+
export class LoadingAnimation {
|
|
28
|
+
phase = { id: 'reasoning', label: 'Reasoning…', icon: '⚡' };
|
|
29
|
+
timer = null;
|
|
30
|
+
frame = 0;
|
|
31
|
+
hints;
|
|
32
|
+
hintIndex = 0;
|
|
33
|
+
startedAt = 0;
|
|
34
|
+
turnCount = 1;
|
|
35
|
+
isTTY = process.stdout.isTTY;
|
|
36
|
+
constructor() {
|
|
37
|
+
// Shuffle hints on creation
|
|
38
|
+
this.hints = [...HINTS].sort(() => Math.random() - 0.5);
|
|
39
|
+
}
|
|
40
|
+
start() {
|
|
41
|
+
if (this.timer)
|
|
42
|
+
return;
|
|
43
|
+
this.startedAt = Date.now();
|
|
44
|
+
this.frame = 0;
|
|
45
|
+
if (this.isTTY) {
|
|
46
|
+
// Hide cursor
|
|
47
|
+
safeWrite('\x1b[?25l');
|
|
48
|
+
this.timer = setInterval(() => this.draw(), 60);
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
// Non-TTY fallback
|
|
52
|
+
safeWriteLine(` ${this.phase.icon} ${this.phase.label} ${this.phase.detail ? `· ${this.phase.detail}` : ''}`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
setPhase(phase) {
|
|
56
|
+
this.phase = { ...this.phase, ...phase };
|
|
57
|
+
if (!this.isTTY && this.timer === null) {
|
|
58
|
+
// In non-TTY, we only log when phase changes so the user isn't spammed, but knows it's doing something.
|
|
59
|
+
safeWriteLine(` ${this.phase.icon} ${this.phase.label} ${this.phase.detail ? `· ${this.phase.detail}` : ''}`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
setTurn(turn) {
|
|
63
|
+
this.turnCount = turn;
|
|
64
|
+
}
|
|
65
|
+
stop() {
|
|
66
|
+
if (this.timer) {
|
|
67
|
+
clearInterval(this.timer);
|
|
68
|
+
this.timer = null;
|
|
69
|
+
// Clear the two lines we used and restore cursor
|
|
70
|
+
safeWrite('\r\x1b[K\x1b[1B\r\x1b[K\x1b[1A\x1b[?25h');
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
markCancelled() {
|
|
74
|
+
this.stop();
|
|
75
|
+
safeWriteLine(`\r${C.YELLOW}⚠ Task cancelled${C.RESET}`);
|
|
76
|
+
}
|
|
77
|
+
draw() {
|
|
78
|
+
const elapsedMs = Date.now() - this.startedAt;
|
|
79
|
+
// Calculate slider position (ping-pong)
|
|
80
|
+
const cycle = Math.floor(this.frame / MAX_OFFSET);
|
|
81
|
+
const pos = this.frame % MAX_OFFSET;
|
|
82
|
+
const offset = cycle % 2 === 0 ? pos : MAX_OFFSET - pos;
|
|
83
|
+
this.frame++;
|
|
84
|
+
// Build the animated bar
|
|
85
|
+
let bar = '';
|
|
86
|
+
for (let i = 0; i < TRACK_LENGTH; i++) {
|
|
87
|
+
if (i >= offset && i < offset + BAR_LENGTH) {
|
|
88
|
+
const charIdx = i - offset;
|
|
89
|
+
bar += `${GRADIENT_COLORS[charIdx]}${GRADIENT[charIdx]}${C.RESET}`;
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
bar += ' ';
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
// Build main line
|
|
96
|
+
const phaseColor = C.LAVA;
|
|
97
|
+
const icon = `${phaseColor}${this.phase.icon}${C.RESET}`;
|
|
98
|
+
const label = `${C.BOLD}${phaseColor}${this.phase.label}${C.RESET}`;
|
|
99
|
+
const detail = this.phase.detail ? ` ${C.SNOW4}${this.phase.detail}${C.RESET}` : '';
|
|
100
|
+
const elapsedSecs = (elapsedMs / 1000).toFixed(1);
|
|
101
|
+
const meta = `${C.SNOW4}(turn ${this.turnCount}) ${elapsedSecs}s${C.RESET}`;
|
|
102
|
+
const mainText = ` ${bar} ${icon} ${label}${detail}`;
|
|
103
|
+
// Calculate padding to push meta to the right (assuming ~100 col terminal if not available)
|
|
104
|
+
const cols = process.stdout.columns ?? 100;
|
|
105
|
+
const paddingLen = Math.max(2, cols - visLen(mainText) - visLen(meta) - 2);
|
|
106
|
+
const paddedMainLine = mainText + ' '.repeat(paddingLen) + meta;
|
|
107
|
+
// Rotate hint every 8 seconds, but only show after 3 seconds
|
|
108
|
+
let hintLine = '';
|
|
109
|
+
if (elapsedMs > 3000) {
|
|
110
|
+
this.hintIndex = Math.floor((elapsedMs - 3000) / 8000) % this.hints.length;
|
|
111
|
+
const hint = this.hints[this.hintIndex];
|
|
112
|
+
hintLine = ` ${C.SNOW4}╰─ ${hint}${C.RESET}`;
|
|
113
|
+
}
|
|
114
|
+
// Draw using carriage return and ansi moves to prevent scrolling
|
|
115
|
+
// \r - return to start of line
|
|
116
|
+
// \x1b[K - clear line
|
|
117
|
+
// \n - move down
|
|
118
|
+
// \r\x1b[K - clear second line
|
|
119
|
+
// \x1b[1A - move back up
|
|
120
|
+
safeWrite(`\r\x1b[K${paddedMainLine}\n\r\x1b[K${hintLine}\x1b[1A`);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=loading-animation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loading-animation.js","sourceRoot":"","sources":["../../src/ui/loading-animation.ts"],"names":[],"mappings":"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"}
|
|
@@ -62,8 +62,8 @@ function inlineFormat(text) {
|
|
|
62
62
|
// Bold (**...**).
|
|
63
63
|
out = out.replace(/\*\*([^*]+)\*\*/g, (_m, c) => `${C.BOLD}${C.SNOW}${c}${C.RESET}`);
|
|
64
64
|
// Italic (*...* or _..._), skipping the bold escape we just emitted.
|
|
65
|
-
out = out.replace(/(?<![*\\])\*([^*\n]
|
|
66
|
-
out = out.replace(/(?<![_\\])_([^_\n]
|
|
65
|
+
out = out.replace(/(?<![*\\])\*([^*\n]{1,2000}?)\*(?!\*)/g, (_m, c) => `${ITALIC_ON}${C.SNOW3}${c}${C.RESET}`);
|
|
66
|
+
out = out.replace(/(?<![_\\])_([^_\n]{1,2000}?)_(?!_)/g, (_m, c) => `${ITALIC_ON}${C.SNOW3}${c}${C.RESET}`);
|
|
67
67
|
// Warning keywords.
|
|
68
68
|
out = out.replace(/\b(error|errors|failed|warning|warn)\b/gi, (m) => `${C.LAVA}${m}${C.RESET}`);
|
|
69
69
|
return out;
|