fixo-cli 1.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.
- package/LICENSE +201 -0
- package/README.md +530 -0
- package/dist/agent/agent-client.d.ts +108 -0
- package/dist/agent/agent-client.d.ts.map +1 -0
- package/dist/agent/agent-client.js +1247 -0
- package/dist/agent/agent-client.js.map +1 -0
- package/dist/agent/agent-pool.d.ts +20 -0
- package/dist/agent/agent-pool.d.ts.map +1 -0
- package/dist/agent/agent-pool.js +217 -0
- package/dist/agent/agent-pool.js.map +1 -0
- package/dist/agent/background-awareness.d.ts +55 -0
- package/dist/agent/background-awareness.d.ts.map +1 -0
- package/dist/agent/background-awareness.js +104 -0
- package/dist/agent/background-awareness.js.map +1 -0
- package/dist/agent/command-parser.d.ts +33 -0
- package/dist/agent/command-parser.d.ts.map +1 -0
- package/dist/agent/command-parser.js +120 -0
- package/dist/agent/command-parser.js.map +1 -0
- package/dist/agent/context-budget.d.ts +91 -0
- package/dist/agent/context-budget.d.ts.map +1 -0
- package/dist/agent/context-budget.js +219 -0
- package/dist/agent/context-budget.js.map +1 -0
- package/dist/agent/conversation.d.ts +190 -0
- package/dist/agent/conversation.d.ts.map +1 -0
- package/dist/agent/conversation.js +547 -0
- package/dist/agent/conversation.js.map +1 -0
- package/dist/agent/hooks.d.ts +72 -0
- package/dist/agent/hooks.d.ts.map +1 -0
- package/dist/agent/hooks.js +214 -0
- package/dist/agent/hooks.js.map +1 -0
- package/dist/agent/mcp-bridge.d.ts +13 -0
- package/dist/agent/mcp-bridge.d.ts.map +1 -0
- package/dist/agent/mcp-bridge.js +86 -0
- package/dist/agent/mcp-bridge.js.map +1 -0
- package/dist/agent/mcp-client.d.ts +24 -0
- package/dist/agent/mcp-client.d.ts.map +1 -0
- package/dist/agent/mcp-client.js +146 -0
- package/dist/agent/mcp-client.js.map +1 -0
- package/dist/agent/mcp-manager.d.ts +13 -0
- package/dist/agent/mcp-manager.d.ts.map +1 -0
- package/dist/agent/mcp-manager.js +84 -0
- package/dist/agent/mcp-manager.js.map +1 -0
- package/dist/agent/mcp-registry.d.ts +45 -0
- package/dist/agent/mcp-registry.d.ts.map +1 -0
- package/dist/agent/mcp-registry.js +98 -0
- package/dist/agent/mcp-registry.js.map +1 -0
- package/dist/agent/orchestrator.d.ts +14 -0
- package/dist/agent/orchestrator.d.ts.map +1 -0
- package/dist/agent/orchestrator.js +118 -0
- package/dist/agent/orchestrator.js.map +1 -0
- package/dist/agent/parser-adapter.d.ts +120 -0
- package/dist/agent/parser-adapter.d.ts.map +1 -0
- package/dist/agent/parser-adapter.js +265 -0
- package/dist/agent/parser-adapter.js.map +1 -0
- package/dist/agent/parsers/imports.d.ts +11 -0
- package/dist/agent/parsers/imports.d.ts.map +1 -0
- package/dist/agent/parsers/imports.js +94 -0
- package/dist/agent/parsers/imports.js.map +1 -0
- package/dist/agent/parsers/shell.d.ts +23 -0
- package/dist/agent/parsers/shell.d.ts.map +1 -0
- package/dist/agent/parsers/shell.js +200 -0
- package/dist/agent/parsers/shell.js.map +1 -0
- package/dist/agent/parsers/symbols.d.ts +17 -0
- package/dist/agent/parsers/symbols.d.ts.map +1 -0
- package/dist/agent/parsers/symbols.js +103 -0
- package/dist/agent/parsers/symbols.js.map +1 -0
- package/dist/agent/permissions.d.ts +65 -0
- package/dist/agent/permissions.d.ts.map +1 -0
- package/dist/agent/permissions.js +219 -0
- package/dist/agent/permissions.js.map +1 -0
- package/dist/agent/predictive-gate.d.ts +69 -0
- package/dist/agent/predictive-gate.d.ts.map +1 -0
- package/dist/agent/predictive-gate.js +128 -0
- package/dist/agent/predictive-gate.js.map +1 -0
- package/dist/agent/provider-cooldown.d.ts +144 -0
- package/dist/agent/provider-cooldown.d.ts.map +1 -0
- package/dist/agent/provider-cooldown.js +300 -0
- package/dist/agent/provider-cooldown.js.map +1 -0
- package/dist/agent/providers-manager.d.ts +109 -0
- package/dist/agent/providers-manager.d.ts.map +1 -0
- package/dist/agent/providers-manager.js +464 -0
- package/dist/agent/providers-manager.js.map +1 -0
- package/dist/agent/repo-map.d.ts +6 -0
- package/dist/agent/repo-map.d.ts.map +1 -0
- package/dist/agent/repo-map.js +221 -0
- package/dist/agent/repo-map.js.map +1 -0
- package/dist/agent/retry.d.ts +103 -0
- package/dist/agent/retry.d.ts.map +1 -0
- package/dist/agent/retry.js +276 -0
- package/dist/agent/retry.js.map +1 -0
- package/dist/agent/search/index.d.ts +61 -0
- package/dist/agent/search/index.d.ts.map +1 -0
- package/dist/agent/search/index.js +314 -0
- package/dist/agent/search/index.js.map +1 -0
- package/dist/agent/single-agent.d.ts +76 -0
- package/dist/agent/single-agent.d.ts.map +1 -0
- package/dist/agent/single-agent.js +697 -0
- package/dist/agent/single-agent.js.map +1 -0
- package/dist/agent/skills.d.ts +22 -0
- package/dist/agent/skills.d.ts.map +1 -0
- package/dist/agent/skills.js +139 -0
- package/dist/agent/skills.js.map +1 -0
- package/dist/agent/stream-glue.d.ts +85 -0
- package/dist/agent/stream-glue.d.ts.map +1 -0
- package/dist/agent/stream-glue.js +120 -0
- package/dist/agent/stream-glue.js.map +1 -0
- package/dist/agent/subagent.d.ts +72 -0
- package/dist/agent/subagent.d.ts.map +1 -0
- package/dist/agent/subagent.js +193 -0
- package/dist/agent/subagent.js.map +1 -0
- package/dist/agent/telemetry.d.ts +192 -0
- package/dist/agent/telemetry.d.ts.map +1 -0
- package/dist/agent/telemetry.js +400 -0
- package/dist/agent/telemetry.js.map +1 -0
- package/dist/agent/tokenizer.d.ts +42 -0
- package/dist/agent/tokenizer.d.ts.map +1 -0
- package/dist/agent/tokenizer.js +107 -0
- package/dist/agent/tokenizer.js.map +1 -0
- package/dist/agent/tool-executor.d.ts +289 -0
- package/dist/agent/tool-executor.d.ts.map +1 -0
- package/dist/agent/tool-executor.js +2519 -0
- package/dist/agent/tool-executor.js.map +1 -0
- package/dist/agent/web-impl.d.ts +2 -0
- package/dist/agent/web-impl.d.ts.map +1 -0
- package/dist/agent/web-impl.js +34 -0
- package/dist/agent/web-impl.js.map +1 -0
- package/dist/agent/web.d.ts +8 -0
- package/dist/agent/web.d.ts.map +1 -0
- package/dist/agent/web.js +8 -0
- package/dist/agent/web.js.map +1 -0
- package/dist/agent/worker-agent.d.ts +27 -0
- package/dist/agent/worker-agent.d.ts.map +1 -0
- package/dist/agent/worker-agent.js +503 -0
- package/dist/agent/worker-agent.js.map +1 -0
- package/dist/config.d.ts +162 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +138 -0
- package/dist/config.js.map +1 -0
- package/dist/context/fixo-md-watcher.d.ts +42 -0
- package/dist/context/fixo-md-watcher.d.ts.map +1 -0
- package/dist/context/fixo-md-watcher.js +126 -0
- package/dist/context/fixo-md-watcher.js.map +1 -0
- package/dist/context/fixo-md.d.ts +50 -0
- package/dist/context/fixo-md.d.ts.map +1 -0
- package/dist/context/fixo-md.js +118 -0
- package/dist/context/fixo-md.js.map +1 -0
- package/dist/context/todo.d.ts +65 -0
- package/dist/context/todo.d.ts.map +1 -0
- package/dist/context/todo.js +194 -0
- package/dist/context/todo.js.map +1 -0
- package/dist/git/git-manager.d.ts +33 -0
- package/dist/git/git-manager.d.ts.map +1 -0
- package/dist/git/git-manager.js +293 -0
- package/dist/git/git-manager.js.map +1 -0
- package/dist/git/git-ops.d.ts +10 -0
- package/dist/git/git-ops.d.ts.map +1 -0
- package/dist/git/git-ops.js +131 -0
- package/dist/git/git-ops.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +352 -0
- package/dist/index.js.map +1 -0
- package/dist/indexer.d.ts +30 -0
- package/dist/indexer.d.ts.map +1 -0
- package/dist/indexer.js +273 -0
- package/dist/indexer.js.map +1 -0
- package/dist/lsp/lsp-client.d.ts +24 -0
- package/dist/lsp/lsp-client.d.ts.map +1 -0
- package/dist/lsp/lsp-client.js +205 -0
- package/dist/lsp/lsp-client.js.map +1 -0
- package/dist/lsp/lsp-manager.d.ts +17 -0
- package/dist/lsp/lsp-manager.d.ts.map +1 -0
- package/dist/lsp/lsp-manager.js +154 -0
- package/dist/lsp/lsp-manager.js.map +1 -0
- package/dist/lsp/lsp-pre-save.d.ts +137 -0
- package/dist/lsp/lsp-pre-save.d.ts.map +1 -0
- package/dist/lsp/lsp-pre-save.js +245 -0
- package/dist/lsp/lsp-pre-save.js.map +1 -0
- package/dist/lsp/syntax-fallback.d.ts +83 -0
- package/dist/lsp/syntax-fallback.d.ts.map +1 -0
- package/dist/lsp/syntax-fallback.js +275 -0
- package/dist/lsp/syntax-fallback.js.map +1 -0
- package/dist/model-outcomes.d.ts +12 -0
- package/dist/model-outcomes.d.ts.map +1 -0
- package/dist/model-outcomes.js +46 -0
- package/dist/model-outcomes.js.map +1 -0
- package/dist/planner.d.ts +32 -0
- package/dist/planner.d.ts.map +1 -0
- package/dist/planner.js +163 -0
- package/dist/planner.js.map +1 -0
- package/dist/project-memory.d.ts +29 -0
- package/dist/project-memory.d.ts.map +1 -0
- package/dist/project-memory.js +349 -0
- package/dist/project-memory.js.map +1 -0
- package/dist/review.d.ts +2 -0
- package/dist/review.d.ts.map +1 -0
- package/dist/review.js +61 -0
- package/dist/review.js.map +1 -0
- package/dist/runtime/background-jobs.d.ts +97 -0
- package/dist/runtime/background-jobs.d.ts.map +1 -0
- package/dist/runtime/background-jobs.js +331 -0
- package/dist/runtime/background-jobs.js.map +1 -0
- package/dist/runtime/credential-vault.d.ts +124 -0
- package/dist/runtime/credential-vault.d.ts.map +1 -0
- package/dist/runtime/credential-vault.js +184 -0
- package/dist/runtime/credential-vault.js.map +1 -0
- package/dist/runtime/loop-trap.d.ts +197 -0
- package/dist/runtime/loop-trap.d.ts.map +1 -0
- package/dist/runtime/loop-trap.js +420 -0
- package/dist/runtime/loop-trap.js.map +1 -0
- package/dist/runtime/policy.d.ts +15 -0
- package/dist/runtime/policy.d.ts.map +1 -0
- package/dist/runtime/policy.js +60 -0
- package/dist/runtime/policy.js.map +1 -0
- package/dist/runtime/redaction.d.ts +66 -0
- package/dist/runtime/redaction.d.ts.map +1 -0
- package/dist/runtime/redaction.js +155 -0
- package/dist/runtime/redaction.js.map +1 -0
- package/dist/runtime/session-snapshots.d.ts +76 -0
- package/dist/runtime/session-snapshots.d.ts.map +1 -0
- package/dist/runtime/session-snapshots.js +166 -0
- package/dist/runtime/session-snapshots.js.map +1 -0
- package/dist/runtime/staging.d.ts +205 -0
- package/dist/runtime/staging.d.ts.map +1 -0
- package/dist/runtime/staging.js +526 -0
- package/dist/runtime/staging.js.map +1 -0
- package/dist/runtime/task-session.d.ts +95 -0
- package/dist/runtime/task-session.d.ts.map +1 -0
- package/dist/runtime/task-session.js +263 -0
- package/dist/runtime/task-session.js.map +1 -0
- package/dist/runtime/worktree.d.ts +55 -0
- package/dist/runtime/worktree.d.ts.map +1 -0
- package/dist/runtime/worktree.js +175 -0
- package/dist/runtime/worktree.js.map +1 -0
- package/dist/setup-wizard.d.ts +8 -0
- package/dist/setup-wizard.d.ts.map +1 -0
- package/dist/setup-wizard.js +73 -0
- package/dist/setup-wizard.js.map +1 -0
- package/dist/shared/content.d.ts +43 -0
- package/dist/shared/content.d.ts.map +1 -0
- package/dist/shared/content.js +61 -0
- package/dist/shared/content.js.map +1 -0
- package/dist/shared/types.d.ts +217 -0
- package/dist/shared/types.d.ts.map +1 -0
- package/dist/shared/types.js +3 -0
- package/dist/shared/types.js.map +1 -0
- package/dist/test-runner.d.ts +5 -0
- package/dist/test-runner.d.ts.map +1 -0
- package/dist/test-runner.js +42 -0
- package/dist/test-runner.js.map +1 -0
- package/dist/types.d.ts +85 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/ui/ascii.d.ts +23 -0
- package/dist/ui/ascii.d.ts.map +1 -0
- package/dist/ui/ascii.js +45 -0
- package/dist/ui/ascii.js.map +1 -0
- package/dist/ui/colors.d.ts +111 -0
- package/dist/ui/colors.d.ts.map +1 -0
- package/dist/ui/colors.js +166 -0
- package/dist/ui/colors.js.map +1 -0
- package/dist/ui/image-attach.d.ts +27 -0
- package/dist/ui/image-attach.d.ts.map +1 -0
- package/dist/ui/image-attach.js +100 -0
- package/dist/ui/image-attach.js.map +1 -0
- package/dist/ui/index.d.ts +18 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +18 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/markdown-stream.d.ts +91 -0
- package/dist/ui/markdown-stream.d.ts.map +1 -0
- package/dist/ui/markdown-stream.js +524 -0
- package/dist/ui/markdown-stream.js.map +1 -0
- package/dist/ui/plan-renderer.d.ts +36 -0
- package/dist/ui/plan-renderer.d.ts.map +1 -0
- package/dist/ui/plan-renderer.js +79 -0
- package/dist/ui/plan-renderer.js.map +1 -0
- package/dist/ui/prompt.d.ts +11 -0
- package/dist/ui/prompt.d.ts.map +1 -0
- package/dist/ui/prompt.js +1960 -0
- package/dist/ui/prompt.js.map +1 -0
- package/dist/ui/render-primitives.d.ts +117 -0
- package/dist/ui/render-primitives.d.ts.map +1 -0
- package/dist/ui/render-primitives.js +322 -0
- package/dist/ui/render-primitives.js.map +1 -0
- package/dist/ui/render.d.ts +133 -0
- package/dist/ui/render.d.ts.map +1 -0
- package/dist/ui/render.js +547 -0
- package/dist/ui/render.js.map +1 -0
- package/dist/ui/session-header.d.ts +30 -0
- package/dist/ui/session-header.d.ts.map +1 -0
- package/dist/ui/session-header.js +74 -0
- package/dist/ui/session-header.js.map +1 -0
- package/dist/workspace-guard.d.ts +68 -0
- package/dist/workspace-guard.d.ts.map +1 -0
- package/dist/workspace-guard.js +168 -0
- package/dist/workspace-guard.js.map +1 -0
- package/dist/workspace-lock.d.ts +27 -0
- package/dist/workspace-lock.d.ts.map +1 -0
- package/dist/workspace-lock.js +95 -0
- package/dist/workspace-lock.js.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1,547 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fixo UI render layer.
|
|
3
|
+
*
|
|
4
|
+
* This module owns:
|
|
5
|
+
* 1. The static, line-by-line helpers used by the REPL welcome /
|
|
6
|
+
* help screens (preserved verbatim for backwards compatibility).
|
|
7
|
+
* 2. A new type-safe, double-buffered, non-blocking dashboard
|
|
8
|
+
* renderer used during agent execution.
|
|
9
|
+
*
|
|
10
|
+
* The dashboard is opt-in: the default {@link dashboard} singleton is
|
|
11
|
+
* shared across the tool loop and the prompt REPL, but tests / CI
|
|
12
|
+
* environments that pipe stdout can call {@link Dashboard.deactivate}
|
|
13
|
+
* to force the single-line / off modes without touching the call
|
|
14
|
+
* sites that emit events.
|
|
15
|
+
*/
|
|
16
|
+
import fs from "fs";
|
|
17
|
+
import path from "path";
|
|
18
|
+
import { colors, renderStatusLabel } from "./colors.js";
|
|
19
|
+
const c = { ...colors, renderStatusLabel };
|
|
20
|
+
const MAX_LOG_ENTRIES = 5;
|
|
21
|
+
const DEFAULT_PROMPT_COST_USD_PER_1K = 3 / 1000;
|
|
22
|
+
const DEFAULT_COMPLETION_COST_USD_PER_1K = 15 / 1000;
|
|
23
|
+
/* ────────────────────────────────────────────────────────────────── */
|
|
24
|
+
/* Dashboard — state holder + typed event fan-out */
|
|
25
|
+
/* ────────────────────────────────────────────────────────────────── */
|
|
26
|
+
export class Dashboard {
|
|
27
|
+
state;
|
|
28
|
+
subs = new Set();
|
|
29
|
+
/** Errors thrown by subscribers are counted but never propagate. */
|
|
30
|
+
subscriberErrors = 0;
|
|
31
|
+
/** Wall-clock anchor for elapsedTimeMs. */
|
|
32
|
+
runStartedAt = Date.now();
|
|
33
|
+
constructor(initial) {
|
|
34
|
+
this.state = {
|
|
35
|
+
runId: initial?.runId ?? `run-${Date.now().toString(36)}`,
|
|
36
|
+
activeTask: initial?.activeTask ?? "",
|
|
37
|
+
executionMode: initial?.executionMode ?? "BUILD",
|
|
38
|
+
activeAgent: initial?.activeAgent ?? "single-agent",
|
|
39
|
+
modelId: initial?.modelId ?? "auto",
|
|
40
|
+
status: initial?.status ?? "Idle",
|
|
41
|
+
elapsedTimeMs: 0,
|
|
42
|
+
tokensConsumed: 0,
|
|
43
|
+
estimatedCostUsd: 0,
|
|
44
|
+
progressPercent: -1,
|
|
45
|
+
activeTool: null,
|
|
46
|
+
logs: [],
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/** Subscribe to the event stream. Returns an unsubscribe fn. */
|
|
50
|
+
subscribe(sub) {
|
|
51
|
+
this.subs.add(sub);
|
|
52
|
+
return () => {
|
|
53
|
+
this.subs.delete(sub);
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/** Number of active subscribers. Useful for tests. */
|
|
57
|
+
subscriberCount() {
|
|
58
|
+
return this.subs.size;
|
|
59
|
+
}
|
|
60
|
+
/** Type-safe accessor for the current frame. */
|
|
61
|
+
snapshot() {
|
|
62
|
+
return { ...this.state, logs: [...this.state.logs] };
|
|
63
|
+
}
|
|
64
|
+
/** Wipe state and start a fresh run with the given task. */
|
|
65
|
+
reset(task, mode, modelId, agentName = "single-agent") {
|
|
66
|
+
this.runStartedAt = Date.now();
|
|
67
|
+
this.state = {
|
|
68
|
+
runId: `run-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 6)}`,
|
|
69
|
+
activeTask: task,
|
|
70
|
+
executionMode: mode,
|
|
71
|
+
activeAgent: agentName,
|
|
72
|
+
modelId,
|
|
73
|
+
status: "Starting",
|
|
74
|
+
elapsedTimeMs: 0,
|
|
75
|
+
tokensConsumed: 0,
|
|
76
|
+
estimatedCostUsd: 0,
|
|
77
|
+
progressPercent: -1,
|
|
78
|
+
activeTool: null,
|
|
79
|
+
logs: [],
|
|
80
|
+
};
|
|
81
|
+
this.notify({ type: "turn-start", turnIndex: 0, task });
|
|
82
|
+
}
|
|
83
|
+
/** Apply a typed event, mutating the state. Pure — never throws. */
|
|
84
|
+
emit(event) {
|
|
85
|
+
try {
|
|
86
|
+
switch (event.type) {
|
|
87
|
+
case "turn-start":
|
|
88
|
+
this.state.activeTask = event.task;
|
|
89
|
+
this.state.status = `Thinking (turn ${event.turnIndex + 1})`;
|
|
90
|
+
this.state.activeTool = null;
|
|
91
|
+
this.state.progressPercent = -1;
|
|
92
|
+
break;
|
|
93
|
+
case "tool-start":
|
|
94
|
+
this.state.activeTool = {
|
|
95
|
+
name: event.tool,
|
|
96
|
+
target: event.target,
|
|
97
|
+
state: "executing",
|
|
98
|
+
};
|
|
99
|
+
this.state.status = `Running ${event.tool}`;
|
|
100
|
+
this.pushLog(`${event.tool} → ${event.target}`);
|
|
101
|
+
break;
|
|
102
|
+
case "tool-finish":
|
|
103
|
+
if (this.state.activeTool &&
|
|
104
|
+
this.state.activeTool.name === event.tool) {
|
|
105
|
+
this.state.activeTool = { ...this.state.activeTool, state: event.state };
|
|
106
|
+
}
|
|
107
|
+
this.state.status = event.state === "failed" ? `Failed ${event.tool}` : `Idle`;
|
|
108
|
+
break;
|
|
109
|
+
case "log":
|
|
110
|
+
this.pushLog(`[${event.level}] ${event.message}`);
|
|
111
|
+
break;
|
|
112
|
+
case "tokens":
|
|
113
|
+
this.state.tokensConsumed = event.total;
|
|
114
|
+
this.state.estimatedCostUsd =
|
|
115
|
+
(event.prompt / 1000) * DEFAULT_PROMPT_COST_USD_PER_1K +
|
|
116
|
+
(event.completion / 1000) * DEFAULT_COMPLETION_COST_USD_PER_1K;
|
|
117
|
+
break;
|
|
118
|
+
case "status":
|
|
119
|
+
this.state.status = event.message;
|
|
120
|
+
break;
|
|
121
|
+
case "mode":
|
|
122
|
+
this.state.executionMode = event.mode;
|
|
123
|
+
break;
|
|
124
|
+
case "done":
|
|
125
|
+
this.state.status = event.success ? "Completed" : "Failed";
|
|
126
|
+
this.state.activeTool = null;
|
|
127
|
+
this.state.progressPercent = event.success ? 100 : this.state.progressPercent;
|
|
128
|
+
break;
|
|
129
|
+
}
|
|
130
|
+
this.state.elapsedTimeMs = Date.now() - this.runStartedAt;
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
// Defensive — never let a state-mutation error crash the agent.
|
|
134
|
+
}
|
|
135
|
+
this.notify(event);
|
|
136
|
+
}
|
|
137
|
+
/** Same as {@link emit} but synchronous and silent — for hot paths. */
|
|
138
|
+
emitSilent(event) {
|
|
139
|
+
this.emit(event);
|
|
140
|
+
}
|
|
141
|
+
pushLog(line) {
|
|
142
|
+
const sanitized = line.length > 200 ? `${line.slice(0, 197)}…` : line;
|
|
143
|
+
const next = [...this.state.logs, sanitized];
|
|
144
|
+
this.state.logs =
|
|
145
|
+
next.length > MAX_LOG_ENTRIES ? next.slice(next.length - MAX_LOG_ENTRIES) : next;
|
|
146
|
+
}
|
|
147
|
+
notify(event) {
|
|
148
|
+
for (const sub of this.subs) {
|
|
149
|
+
try {
|
|
150
|
+
sub.onEvent(event);
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
this.subscriberErrors += 1;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
/** Process-wide default. All call sites emit to this instance. */
|
|
159
|
+
export const dashboard = new Dashboard();
|
|
160
|
+
/* ────────────────────────────────────────────────────────────────── */
|
|
161
|
+
/* AnsiRenderer — pure double-buffered screen math */
|
|
162
|
+
/* ────────────────────────────────────────────────────────────────── */
|
|
163
|
+
const HIDE_CURSOR = "\x1b[?25l";
|
|
164
|
+
const SHOW_CURSOR = "\x1b[?25h";
|
|
165
|
+
const SAVE_CURSOR = "\x1b[s";
|
|
166
|
+
const RESTORE_CURSOR = "\x1b[u";
|
|
167
|
+
const CURSOR_HOME = "\x1b[H";
|
|
168
|
+
const CLEAR_DOWN = "\x1b[J";
|
|
169
|
+
const CLEAR_LINE = "\x1b[K";
|
|
170
|
+
const RESET = "\x1b[0m";
|
|
171
|
+
/** Pick the active render mode based on TTY + terminal size. */
|
|
172
|
+
export function selectRenderMode(isTTY, columns, rows) {
|
|
173
|
+
if (!isTTY)
|
|
174
|
+
return "off";
|
|
175
|
+
if (columns < 80 || rows < 24)
|
|
176
|
+
return "single-line";
|
|
177
|
+
return "dashboard";
|
|
178
|
+
}
|
|
179
|
+
function pad(line, width) {
|
|
180
|
+
const visible = stripAnsi(line).length;
|
|
181
|
+
if (visible >= width)
|
|
182
|
+
return line;
|
|
183
|
+
return line + " ".repeat(width - visible);
|
|
184
|
+
}
|
|
185
|
+
function stripAnsi(s) {
|
|
186
|
+
return s.replace(/\x1b\[[0-9;?]*[A-Za-z]/g, "");
|
|
187
|
+
}
|
|
188
|
+
function shortStatus(s, max) {
|
|
189
|
+
return s.length <= max ? s : `${s.slice(0, max - 1)}…`;
|
|
190
|
+
}
|
|
191
|
+
function fmtMs(ms) {
|
|
192
|
+
if (ms < 1000)
|
|
193
|
+
return `${ms}ms`;
|
|
194
|
+
const s = ms / 1000;
|
|
195
|
+
if (s < 60)
|
|
196
|
+
return `${s.toFixed(1)}s`;
|
|
197
|
+
const m = Math.floor(s / 60);
|
|
198
|
+
const r = Math.floor(s - m * 60);
|
|
199
|
+
return `${m}m${r}s`;
|
|
200
|
+
}
|
|
201
|
+
function fmtUsd(usd) {
|
|
202
|
+
if (usd < 0.01)
|
|
203
|
+
return `$${usd.toFixed(4)}`;
|
|
204
|
+
return `$${usd.toFixed(2)}`;
|
|
205
|
+
}
|
|
206
|
+
export class AnsiRenderer {
|
|
207
|
+
isTTY;
|
|
208
|
+
columns;
|
|
209
|
+
rows;
|
|
210
|
+
mode = "off";
|
|
211
|
+
lastRenderedHeight = 0;
|
|
212
|
+
lastEventLine = "";
|
|
213
|
+
mounted = false;
|
|
214
|
+
exitHandlers = [];
|
|
215
|
+
constructor(isTTY = () => Boolean(process.stdout.isTTY), columns = () => process.stdout.columns ?? 80, rows = () => process.stdout.rows ?? 24) {
|
|
216
|
+
this.isTTY = isTTY;
|
|
217
|
+
this.columns = columns;
|
|
218
|
+
this.rows = rows;
|
|
219
|
+
}
|
|
220
|
+
setMode(mode) {
|
|
221
|
+
if (this.mode === mode)
|
|
222
|
+
return;
|
|
223
|
+
// Wipe any prior dashboard surface so the new mode starts clean.
|
|
224
|
+
this.wipePrevious();
|
|
225
|
+
this.mode = mode;
|
|
226
|
+
}
|
|
227
|
+
getMode() {
|
|
228
|
+
return this.mode;
|
|
229
|
+
}
|
|
230
|
+
/** Draw a single frame from the given dashboard state. */
|
|
231
|
+
render(state) {
|
|
232
|
+
this.mode = selectRenderMode(this.isTTY(), this.columns(), this.rows());
|
|
233
|
+
if (this.mode === "off") {
|
|
234
|
+
// Emit nothing — stdout is being captured (CI, tests, pipes).
|
|
235
|
+
this.lastRenderedHeight = 0;
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
if (this.mode === "single-line") {
|
|
239
|
+
this.renderSingleLine(state);
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
this.renderDashboard(state);
|
|
243
|
+
}
|
|
244
|
+
/** Render a transient event line (e.g. tool call progress) without
|
|
245
|
+
* re-painting the full dashboard. */
|
|
246
|
+
renderEventLine(line) {
|
|
247
|
+
if (this.mode === "off" || !this.isTTY())
|
|
248
|
+
return;
|
|
249
|
+
const trimmed = shortStatus(stripAnsi(line).replace(/\n/g, " ⏎ "), 200);
|
|
250
|
+
this.lastEventLine = trimmed;
|
|
251
|
+
if (this.mode === "single-line") {
|
|
252
|
+
this.write(`${HIDE_CURSOR}${SAVE_CURSOR}${trimmed}${RESET}${RESTORE_CURSOR}${SHOW_CURSOR}`);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
/** Mount: install exit hooks that restore the cursor. Idempotent. */
|
|
256
|
+
mount() {
|
|
257
|
+
if (this.mounted)
|
|
258
|
+
return;
|
|
259
|
+
this.mounted = true;
|
|
260
|
+
const restore = () => {
|
|
261
|
+
try {
|
|
262
|
+
process.stdout.write(`${SHOW_CURSOR}${RESET}`);
|
|
263
|
+
}
|
|
264
|
+
catch {
|
|
265
|
+
// ignore — process may already be tearing down
|
|
266
|
+
}
|
|
267
|
+
};
|
|
268
|
+
this.exitHandlers.push(restore);
|
|
269
|
+
process.on("exit", restore);
|
|
270
|
+
process.on("SIGINT", () => {
|
|
271
|
+
restore();
|
|
272
|
+
process.exit(130);
|
|
273
|
+
});
|
|
274
|
+
process.on("SIGTERM", () => {
|
|
275
|
+
restore();
|
|
276
|
+
process.exit(143);
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
/** Unmount: remove the exit hooks we installed and reset the
|
|
280
|
+
* `mounted` flag. Idempotent — safe to call twice. Primarily
|
|
281
|
+
* useful in tests so process.on() listeners don't pile up. */
|
|
282
|
+
unmount() {
|
|
283
|
+
if (!this.mounted)
|
|
284
|
+
return;
|
|
285
|
+
this.mounted = false;
|
|
286
|
+
for (const handler of this.exitHandlers) {
|
|
287
|
+
process.removeListener("exit", handler);
|
|
288
|
+
}
|
|
289
|
+
this.exitHandlers.length = 0;
|
|
290
|
+
}
|
|
291
|
+
/** Force-clear whatever was previously painted (e.g. on shutdown). */
|
|
292
|
+
wipePrevious() {
|
|
293
|
+
if (this.lastRenderedHeight === 0 || !this.isTTY())
|
|
294
|
+
return;
|
|
295
|
+
const out = [SAVE_CURSOR];
|
|
296
|
+
for (let i = 0; i < this.lastRenderedHeight; i++) {
|
|
297
|
+
out.push("\x1b[1A", CLEAR_LINE);
|
|
298
|
+
}
|
|
299
|
+
out.push(RESTORE_CURSOR, SHOW_CURSOR);
|
|
300
|
+
this.write(out.join(""));
|
|
301
|
+
this.lastRenderedHeight = 0;
|
|
302
|
+
}
|
|
303
|
+
/* ── private renderers ──────────────────────────────────────── */
|
|
304
|
+
renderSingleLine(state) {
|
|
305
|
+
const tool = state.activeTool
|
|
306
|
+
? `[${state.activeTool.name}:${state.activeTool.state}] ${state.activeTool.target}`
|
|
307
|
+
: "—";
|
|
308
|
+
const tokens = state.tokensConsumed > 0 ? `${state.tokensConsumed} tok` : "—";
|
|
309
|
+
const line = `${colors.cyan}[${state.executionMode}]${RESET} ` +
|
|
310
|
+
`${colors.bold}${shortStatus(state.activeTask, 60)}${RESET} ` +
|
|
311
|
+
`${colors.dim}${state.modelId}${RESET} · ${state.status} · ${tool} · ` +
|
|
312
|
+
`${tokens} · ${fmtMs(state.elapsedTimeMs)}`;
|
|
313
|
+
this.write(`${SAVE_CURSOR}${CLEAR_LINE}${line}${RESET}${RESTORE_CURSOR}`);
|
|
314
|
+
this.lastRenderedHeight = 1;
|
|
315
|
+
}
|
|
316
|
+
renderDashboard(state) {
|
|
317
|
+
const cols = Math.max(80, this.columns());
|
|
318
|
+
const width = Math.min(cols, 110);
|
|
319
|
+
const inner = width - 2; // for the two box characters
|
|
320
|
+
const out = [];
|
|
321
|
+
out.push(HIDE_CURSOR, SAVE_CURSOR, CURSOR_HOME, CLEAR_DOWN);
|
|
322
|
+
out.push(this.box(width, "─", "─", "─"));
|
|
323
|
+
out.push(`${colors.cyan}│${RESET}` +
|
|
324
|
+
` ${this.modeBadge(state.executionMode)} ` +
|
|
325
|
+
`${colors.bold}${shortStatus(state.activeTask, inner - 30)}${RESET}` +
|
|
326
|
+
` ${colors.dim}· run ${state.runId.slice(-8)} · ${state.modelId}${RESET}` +
|
|
327
|
+
`${" ".repeat(Math.max(0, inner - 50 - state.activeTask.length))}` +
|
|
328
|
+
`${colors.cyan}│${RESET}\n`);
|
|
329
|
+
out.push(this.box(width, "─", "─", "─"));
|
|
330
|
+
// Diagnostic metrics
|
|
331
|
+
out.push(`${colors.cyan}│${RESET} ${colors.dim}tokens${RESET} ${bold(String(state.tokensConsumed))}` +
|
|
332
|
+
` ${colors.dim}cost${RESET} ${bold(fmtUsd(state.estimatedCostUsd))}` +
|
|
333
|
+
` ${colors.dim}elapsed${RESET} ${bold(fmtMs(state.elapsedTimeMs))}` +
|
|
334
|
+
` ${colors.dim}progress${RESET} ${bold(this.progressLabel(state.progressPercent))}` +
|
|
335
|
+
`${" ".repeat(Math.max(0, inner - 65))}` +
|
|
336
|
+
`${colors.cyan}│${RESET}\n`);
|
|
337
|
+
// Action stream (single dynamic spinner line)
|
|
338
|
+
const tool = state.activeTool;
|
|
339
|
+
const actionText = tool
|
|
340
|
+
? `${spinnerFor(tool.state)} ${colors.cyan}[${tool.name.toUpperCase()}]${RESET} ` +
|
|
341
|
+
`${shortStatus(tool.target, inner - 24)} ${colors.dim}(${tool.state})${RESET}`
|
|
342
|
+
: `${colors.dim}${spinnerFor("thinking")} ${state.status}${RESET}`;
|
|
343
|
+
out.push(`${colors.cyan}│${RESET} ${actionText}` +
|
|
344
|
+
`${" ".repeat(Math.max(0, inner - stripAnsi(actionText).length - 2))}` +
|
|
345
|
+
`${colors.cyan}│${RESET}\n`);
|
|
346
|
+
out.push(this.box(width, "─", "─", "─"));
|
|
347
|
+
// Recent events box (5 entries)
|
|
348
|
+
out.push(`${colors.cyan}│${RESET} ${colors.dim}Recent events${RESET}` +
|
|
349
|
+
`${" ".repeat(Math.max(0, inner - 15))}` +
|
|
350
|
+
`${colors.cyan}│${RESET}\n`);
|
|
351
|
+
const logs = state.logs;
|
|
352
|
+
for (let i = 0; i < MAX_LOG_ENTRIES; i++) {
|
|
353
|
+
const line = logs[i] ?? "";
|
|
354
|
+
out.push(`${colors.cyan}│${RESET} ${pad(line ? `${colors.dim}•${RESET} ${shortStatus(line, inner - 4)}` : "", inner - 2)} ${colors.cyan}│${RESET}\n`);
|
|
355
|
+
}
|
|
356
|
+
out.push(this.box(width, "─", "─", "─"));
|
|
357
|
+
out.push(RESTORE_CURSOR, SHOW_CURSOR);
|
|
358
|
+
this.write(out.join(""));
|
|
359
|
+
this.lastRenderedHeight = 7 + MAX_LOG_ENTRIES;
|
|
360
|
+
}
|
|
361
|
+
modeBadge(mode) {
|
|
362
|
+
return mode === "BUILD"
|
|
363
|
+
? `${colors.bgCyan}${colors.bold} ${mode} ${RESET}`
|
|
364
|
+
: `${colors.bgLiquidLava}${colors.bold} ${mode} ${RESET}`;
|
|
365
|
+
}
|
|
366
|
+
progressLabel(p) {
|
|
367
|
+
if (p < 0)
|
|
368
|
+
return "—";
|
|
369
|
+
if (p > 100)
|
|
370
|
+
return "100%";
|
|
371
|
+
return `${p}%`;
|
|
372
|
+
}
|
|
373
|
+
box(width, _l, _m, _r) {
|
|
374
|
+
return `${colors.cyan}┌${"─".repeat(width - 2)}┐${RESET}\n`;
|
|
375
|
+
}
|
|
376
|
+
write(buf) {
|
|
377
|
+
try {
|
|
378
|
+
process.stdout.write(buf);
|
|
379
|
+
}
|
|
380
|
+
catch {
|
|
381
|
+
// pipe closed mid-write — nothing we can do
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
function bold(s) {
|
|
386
|
+
return `${colors.bold}${s}${RESET}`;
|
|
387
|
+
}
|
|
388
|
+
const SPINNER_FRAMES = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
|
|
389
|
+
let spinnerTick = 0;
|
|
390
|
+
function spinnerFor(state) {
|
|
391
|
+
spinnerTick = (spinnerTick + 1) % SPINNER_FRAMES.length;
|
|
392
|
+
const frame = SPINNER_FRAMES[spinnerTick] ?? "*";
|
|
393
|
+
switch (state) {
|
|
394
|
+
case "executing":
|
|
395
|
+
return `${colors.cyan}${frame}${RESET}`;
|
|
396
|
+
case "completed":
|
|
397
|
+
return `${colors.green}✓${RESET}`;
|
|
398
|
+
case "failed":
|
|
399
|
+
return `${colors.red}✗${RESET}`;
|
|
400
|
+
case "thinking":
|
|
401
|
+
default:
|
|
402
|
+
return `${colors.dim}${frame}${RESET}`;
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
/* ────────────────────────────────────────────────────────────────── */
|
|
406
|
+
/* Default renderer instance + auto-mount */
|
|
407
|
+
/* ────────────────────────────────────────────────────────────────── */
|
|
408
|
+
export const renderer = new AnsiRenderer();
|
|
409
|
+
renderer.mount();
|
|
410
|
+
/* ────────────────────────────────────────────────────────────────── */
|
|
411
|
+
/* Backwards-compatible exports (originals preserved verbatim) */
|
|
412
|
+
/* ────────────────────────────────────────────────────────────────── */
|
|
413
|
+
export const COMMANDS_WITH_DESC = [
|
|
414
|
+
// Core
|
|
415
|
+
{ cmd: '/help', desc: 'Show all commands and usage' },
|
|
416
|
+
{ cmd: '/exit', desc: 'Exit FixO CLI (alias: /quit)' },
|
|
417
|
+
// Model & Providers
|
|
418
|
+
{ cmd: '/model', desc: 'Interactive model picker or set model' },
|
|
419
|
+
{ cmd: '/providers', desc: 'Manage AI provider API keys (add/list/remove/test)' },
|
|
420
|
+
// Files & Context
|
|
421
|
+
{ cmd: '/select', desc: 'Pin a file for agent context' },
|
|
422
|
+
{ cmd: '/unselect', desc: 'Clear all pinned files' },
|
|
423
|
+
{ cmd: '/index', desc: 'Build the local repo index' },
|
|
424
|
+
{ cmd: '/find', desc: 'Search the repo index' },
|
|
425
|
+
{ cmd: '/explain', desc: 'Explain a file or symbol from index' },
|
|
426
|
+
// Conversation
|
|
427
|
+
{ cmd: '/clear', desc: 'Clear conversation history' },
|
|
428
|
+
{ cmd: '/compact', desc: 'Summarise & compress conversation (frees context tokens)' },
|
|
429
|
+
{ cmd: '/stats', desc: 'Show session token usage statistics' },
|
|
430
|
+
{ cmd: '/session', desc: 'Manage sessions: list | load <uuid> | new' },
|
|
431
|
+
{ cmd: '/todo', desc: 'Manage todo list: list | add <text> | done <id> | remove <id> | clear' },
|
|
432
|
+
{ cmd: '/mcp', desc: 'Manage MCP servers: list | add <name> <cmd> [args] | remove <name> | test <name>' },
|
|
433
|
+
// Agent modes & plans
|
|
434
|
+
{ cmd: '/mode', desc: 'Toggle or set PLAN / BUILD execution mode' },
|
|
435
|
+
{ cmd: '/plan', desc: 'Generate a task execution plan' },
|
|
436
|
+
{ cmd: '/run-plan', desc: 'Execute the last generated plan' },
|
|
437
|
+
// Git
|
|
438
|
+
{ cmd: '/diff', desc: 'Show git diff of workspace' },
|
|
439
|
+
{ cmd: '/undo', desc: 'Undo last AI change' },
|
|
440
|
+
{ cmd: '/log', desc: 'Show recent git commits' },
|
|
441
|
+
{ cmd: '/snapshot', desc: 'Create a named git snapshot' },
|
|
442
|
+
// Quality & review
|
|
443
|
+
{ cmd: '/review', desc: 'Review the current workspace diff' },
|
|
444
|
+
{ cmd: '/test', desc: 'Run detected project checks' },
|
|
445
|
+
{ cmd: '/fix-tests', desc: 'Run tests and auto-fix failures' },
|
|
446
|
+
{ cmd: '/fix-ci', desc: 'Fix CI failures (paste logs)' },
|
|
447
|
+
// Runs & memory
|
|
448
|
+
{ cmd: '/runs', desc: 'List task run ledgers' },
|
|
449
|
+
{ cmd: '/show-run', desc: 'Show details of a specific run' },
|
|
450
|
+
{ cmd: '/memory', desc: 'Show project memory facts' },
|
|
451
|
+
{ cmd: '/remember', desc: 'Add a project fact to memory' },
|
|
452
|
+
{ cmd: '/forget', desc: 'Clear all project memory' },
|
|
453
|
+
// Tools & skills
|
|
454
|
+
{ cmd: '/skills', desc: 'List all registered skill profiles' },
|
|
455
|
+
{ cmd: '/doctor', desc: 'Run FixO diagnostics / doctor checks' },
|
|
456
|
+
// Privacy
|
|
457
|
+
{ cmd: '/telemetry', desc: 'Toggle telemetry on/off or view status' },
|
|
458
|
+
// Theme
|
|
459
|
+
{ cmd: '/theme', desc: 'Toggle Dark Void / Inverted theme' },
|
|
460
|
+
{ cmd: '/variant', desc: 'Toggle theme color variant' },
|
|
461
|
+
];
|
|
462
|
+
export function printHelp() {
|
|
463
|
+
const w = 72;
|
|
464
|
+
const line = (cmd, args, desc) => {
|
|
465
|
+
const left = ` ${c.cyan}${cmd}${c.reset} ${c.dim}${args}${c.reset}`;
|
|
466
|
+
const stripped = ` ${cmd} ${args}`;
|
|
467
|
+
const pad = Math.max(1, 32 - stripped.length);
|
|
468
|
+
console.log(`${left}${' '.repeat(pad)}${desc}`);
|
|
469
|
+
};
|
|
470
|
+
console.log('');
|
|
471
|
+
console.log(`${c.bold}${c.cyan}FixO CLI — All Commands${c.reset}`);
|
|
472
|
+
console.log(`${c.dim}${'─'.repeat(w)}${c.reset}`);
|
|
473
|
+
console.log(`\n${c.snow}${c.bold}🤖 Model & Providers${c.reset}`);
|
|
474
|
+
line('/model', '[name|list]', 'Interactive model picker, or set model by name');
|
|
475
|
+
line('/providers', '<sub-command>', 'Manage provider API keys: list | add <name> | remove <name> | test <name>');
|
|
476
|
+
console.log(`\n${c.snow}${c.bold}📂 Files & Context${c.reset}`);
|
|
477
|
+
line('/select', '[file]', 'Pin a file for focused agent context');
|
|
478
|
+
line('/unselect', '', 'Clear all pinned files');
|
|
479
|
+
line('/index', '', 'Build / refresh the local repo index');
|
|
480
|
+
line('/find', '<query>', 'Search the repo index for symbols or files');
|
|
481
|
+
line('/explain', '<target>', 'Explain a file, symbol, or function from the index');
|
|
482
|
+
console.log(`\n${c.snow}${c.bold}💬 Conversation${c.reset}`);
|
|
483
|
+
line('/clear', '', 'Clear conversation history');
|
|
484
|
+
line('/compact', '', 'Summarise & compress conversation (frees context tokens)');
|
|
485
|
+
line('/stats', '', 'Show session token usage and cost savings');
|
|
486
|
+
line('/session', '<sub-command>', 'Manage sessions: list | load <uuid> | new');
|
|
487
|
+
console.log(`\n${c.snow}${c.bold}⚙️ Agent Modes & Plans${c.reset}`);
|
|
488
|
+
line('/mode', '[PLAN|BUILD]', 'Toggle or set execution mode (PLAN = read-only, BUILD = write)');
|
|
489
|
+
line('/plan', '<task>', 'Generate a structured multi-phase execution plan');
|
|
490
|
+
line('/run-plan', '', 'Execute the last saved plan via the Agent Pool');
|
|
491
|
+
console.log(`\n${c.snow}${c.bold}🌳 Git Operations${c.reset}`);
|
|
492
|
+
line('/diff', '', 'Show git diff of the workspace');
|
|
493
|
+
line('/undo', '', 'Undo the last FixO auto-committed change');
|
|
494
|
+
line('/log', '', 'Show recent git commits');
|
|
495
|
+
line('/snapshot', '[label]', 'Create a named git snapshot commit of current workspace');
|
|
496
|
+
console.log(`\n${c.snow}${c.bold}🔍 Quality & Review${c.reset}`);
|
|
497
|
+
line('/review', '', 'Review the current diff for issues');
|
|
498
|
+
line('/test', '', 'Run detected project tests');
|
|
499
|
+
line('/fix-tests', '', 'Run tests and automatically fix failures');
|
|
500
|
+
line('/fix-ci', '', 'Fix CI failures (paste CI logs into the task)');
|
|
501
|
+
console.log(`\n${c.snow}${c.bold}📋 Runs & Memory${c.reset}`);
|
|
502
|
+
line('/runs', '', 'List all recorded task run ledgers');
|
|
503
|
+
line('/show-run', '<id>', 'Show details of a specific run');
|
|
504
|
+
line('/memory', '', 'Show all project memory facts');
|
|
505
|
+
line('/remember', '<fact>', 'Add a project fact to persistent memory');
|
|
506
|
+
line('/forget', '', 'Clear all project memory');
|
|
507
|
+
console.log(`\n${c.snow}${c.bold}🛠 Tools & Skills${c.reset}`);
|
|
508
|
+
line('/skills', '', 'List all registered and auto-detected skill profiles');
|
|
509
|
+
line('/doctor', '', 'Run FixO diagnostics and troubleshooting checks');
|
|
510
|
+
console.log(`\n${c.snow}${c.bold}🔒 Privacy${c.reset}`);
|
|
511
|
+
line('/telemetry', '<on|off>', 'View or toggle telemetry collection');
|
|
512
|
+
console.log(`\n${c.snow}${c.bold}🎨 Theme${c.reset}`);
|
|
513
|
+
line('/theme', '', 'Toggle Dark Void Minimalist / High-Contrast Inverted theme');
|
|
514
|
+
line('/variant', '', 'Toggle theme color variant');
|
|
515
|
+
console.log(`\n${c.snow}${c.bold}🚪 Exit${c.reset}`);
|
|
516
|
+
line('/exit', '', 'Exit FixO CLI cleanly (alias: /quit)');
|
|
517
|
+
console.log(`\n${c.dim}${'─'.repeat(w)}${c.reset}`);
|
|
518
|
+
console.log(`${c.dim} Shell commands prefix with ! e.g. !npm test, !ls -la${c.reset}`);
|
|
519
|
+
console.log(`${c.dim} Autocomplete type / for commands, @ for files & agents${c.reset}`);
|
|
520
|
+
console.log(`${c.dim} Mode toggle press [TAB] on an empty line to switch PLAN ↔ BUILD${c.reset}`);
|
|
521
|
+
console.log('');
|
|
522
|
+
}
|
|
523
|
+
export function buildPromptString(cwd, model, branch) {
|
|
524
|
+
const dirName = path.basename(cwd);
|
|
525
|
+
const dirLabel = c.renderStatusLabel(`📂 ${dirName}`);
|
|
526
|
+
const branchLabel = branch ? ` ${c.renderStatusLabel(`🌳 ${branch}`)}` : '';
|
|
527
|
+
const modelLabel = ` ${c.renderStatusLabel(`🤖 ${model}`)}`;
|
|
528
|
+
return `\n${dirLabel}${branchLabel}${modelLabel}\n${c.cyan}❯${c.reset} `;
|
|
529
|
+
}
|
|
530
|
+
export function formatInputPaths(input, cwd) {
|
|
531
|
+
const commands = COMMANDS_WITH_DESC.map((item) => item.cmd);
|
|
532
|
+
return input.replace(/(?:\/[\w.-]+)+/g, (match) => {
|
|
533
|
+
if (match.startsWith('/')) {
|
|
534
|
+
const commandName = match.split(/\s+/)[0];
|
|
535
|
+
if (commands.includes(commandName) || commandName.length <= 4) {
|
|
536
|
+
return match;
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
const resolved = path.isAbsolute(match) ? match : path.resolve(cwd, match);
|
|
540
|
+
if (fs.existsSync(resolved)) {
|
|
541
|
+
const basename = path.basename(match);
|
|
542
|
+
return `${c.cyan}${c.bold}${basename}${c.reset}`;
|
|
543
|
+
}
|
|
544
|
+
return match;
|
|
545
|
+
});
|
|
546
|
+
}
|
|
547
|
+
//# sourceMappingURL=render.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/ui/render.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* session-header.ts — The boxed session summary rendered once
|
|
3
|
+
* when a session starts or is resumed.
|
|
4
|
+
*
|
|
5
|
+
* The header uses the lava top/bottom border and a SNOW4 side
|
|
6
|
+
* border so it sits inside the same visual family as the AI
|
|
7
|
+
* response frame and the plan renderer.
|
|
8
|
+
*/
|
|
9
|
+
export interface SessionHeaderOptions {
|
|
10
|
+
/** `New session` / `Resumed session` / `Imported session`. */
|
|
11
|
+
status: 'new' | 'resumed' | 'imported';
|
|
12
|
+
/** ISO-8601 timestamp. */
|
|
13
|
+
startedAt: string;
|
|
14
|
+
/** Provider display name (`Google (Gemini)`). */
|
|
15
|
+
provider: string;
|
|
16
|
+
/** Model id (`gemini-2.5-flash`). */
|
|
17
|
+
model: string;
|
|
18
|
+
/** `BUILD` / `PLAN` / `REVIEW`. */
|
|
19
|
+
mode: 'BUILD' | 'PLAN' | 'REVIEW';
|
|
20
|
+
/** `auto` / `single` / `multi`. */
|
|
21
|
+
routing: 'auto' | 'single' | 'multi';
|
|
22
|
+
/** Context window, e.g. `200k`. */
|
|
23
|
+
contextWindow: string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Print the session header box. The box width is `columns - 4`,
|
|
27
|
+
* capped at 100. Safe to call on a non-TTY.
|
|
28
|
+
*/
|
|
29
|
+
export declare function renderSessionHeader(opts: SessionHeaderOptions): void;
|
|
30
|
+
//# sourceMappingURL=session-header.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-header.d.ts","sourceRoot":"","sources":["../../src/ui/session-header.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,MAAM,WAAW,oBAAoB;IACnC,8DAA8D;IAC9D,MAAM,EAAE,KAAK,GAAG,SAAS,GAAG,UAAU,CAAC;IACvC,0BAA0B;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,iDAAiD;IACjD,QAAQ,EAAE,MAAM,CAAC;IACjB,qCAAqC;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,mCAAmC;IACnC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;IAClC,mCAAmC;IACnC,OAAO,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;IACrC,mCAAmC;IACnC,aAAa,EAAE,MAAM,CAAC;CACvB;AA4BD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,oBAAoB,GAAG,IAAI,CAmBpE"}
|