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,131 @@
|
|
|
1
|
+
import { execFileSync } from 'child_process';
|
|
2
|
+
function runGit(cwd, args) {
|
|
3
|
+
try {
|
|
4
|
+
return execFileSync('git', args, {
|
|
5
|
+
cwd,
|
|
6
|
+
encoding: 'utf-8',
|
|
7
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
8
|
+
}).trim();
|
|
9
|
+
}
|
|
10
|
+
catch (error) {
|
|
11
|
+
const stderr = error.stderr?.trim() || error.message;
|
|
12
|
+
throw new Error(`Git error (git ${args.join(' ')}): ${stderr}`);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export function createBranch(cwd, branchName) {
|
|
16
|
+
runGit(cwd, ['checkout', '-b', branchName]);
|
|
17
|
+
return `Successfully created and checked out branch: ${branchName}`;
|
|
18
|
+
}
|
|
19
|
+
export function commitChanges(cwd, message) {
|
|
20
|
+
runGit(cwd, ['add', '-A']);
|
|
21
|
+
runGit(cwd, ['commit', '-m', message]);
|
|
22
|
+
const hash = runGit(cwd, ['rev-parse', '--short', 'HEAD']);
|
|
23
|
+
return `Successfully committed changes as ${hash}`;
|
|
24
|
+
}
|
|
25
|
+
export function pushBranch(cwd, remote = 'origin') {
|
|
26
|
+
const currentBranch = runGit(cwd, ['branch', '--show-current']);
|
|
27
|
+
if (!currentBranch) {
|
|
28
|
+
throw new Error('Not currently on any branch (detached HEAD?)');
|
|
29
|
+
}
|
|
30
|
+
runGit(cwd, ['push', '-u', remote, currentBranch]);
|
|
31
|
+
return `Successfully pushed branch ${currentBranch} to ${remote}`;
|
|
32
|
+
}
|
|
33
|
+
export async function generatePrDescription(cwd, client, model, baseBranch = 'main') {
|
|
34
|
+
const currentBranch = runGit(cwd, ['branch', '--show-current']);
|
|
35
|
+
let diff = '';
|
|
36
|
+
try {
|
|
37
|
+
diff = runGit(cwd, ['diff', `${baseBranch}...${currentBranch}`]);
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
// Fallback to local diff against HEAD~1 if comparison fails
|
|
41
|
+
try {
|
|
42
|
+
diff = runGit(cwd, ['diff', 'HEAD~1']);
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
diff = runGit(cwd, ['diff']);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// Max diff size to send to model is 40k chars (~10k tokens)
|
|
49
|
+
if (diff.length > 40_000) {
|
|
50
|
+
diff = diff.slice(0, 40_000) + '\n\n... (diff truncated for length)';
|
|
51
|
+
}
|
|
52
|
+
if (!diff.trim()) {
|
|
53
|
+
return {
|
|
54
|
+
title: `work on ${currentBranch}`,
|
|
55
|
+
body: `Automated PR description for branch ${currentBranch}. No changes detected in comparison to ${baseBranch}.`
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
const systemPrompt = `You are a pull request description generator. Given the git diff of changes, write a clean, detailed semantic PR description.
|
|
59
|
+
Your output must be a single valid JSON object matching this schema with NO markdown formatting, NO backticks, and NO conversational text:
|
|
60
|
+
{
|
|
61
|
+
"title": "concise semantic PR title",
|
|
62
|
+
"body": "detailed markdown body containing: summary of changes, motivation, and tests completed."
|
|
63
|
+
}`;
|
|
64
|
+
try {
|
|
65
|
+
const response = await client.chat([
|
|
66
|
+
{ role: 'system', content: systemPrompt },
|
|
67
|
+
{ role: 'user', content: `Here is the diff:\n\n${diff}` }
|
|
68
|
+
], model, { agent_task_type: 'investigation', required_capabilities: ['fast'] });
|
|
69
|
+
const content = response.content?.trim() || '';
|
|
70
|
+
const jsonMatch = content.match(/\{[\s\S]*\}/);
|
|
71
|
+
const parsed = JSON.parse(jsonMatch ? jsonMatch[0] : content);
|
|
72
|
+
if (parsed && typeof parsed.title === 'string' && typeof parsed.body === 'string') {
|
|
73
|
+
return parsed;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
catch (err) {
|
|
77
|
+
// Fallback on error
|
|
78
|
+
}
|
|
79
|
+
return {
|
|
80
|
+
title: `updates on branch ${currentBranch}`,
|
|
81
|
+
body: `## Summary\nAutomated updates on branch ${currentBranch}.\n\n## Changes\n- Code modifications applied by FixO.`
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
export async function createPullRequest(cwd, client, model, baseBranch = 'main') {
|
|
85
|
+
const currentBranch = runGit(cwd, ['branch', '--show-current']);
|
|
86
|
+
if (!currentBranch || currentBranch === 'main' || currentBranch === 'master') {
|
|
87
|
+
throw new Error(`Cannot create pull request from branch "${currentBranch}"`);
|
|
88
|
+
}
|
|
89
|
+
// 1. Generate title and body
|
|
90
|
+
const { title, body } = await generatePrDescription(cwd, client, model, baseBranch);
|
|
91
|
+
// 2. Check if GitHub CLI is installed and try to run it
|
|
92
|
+
try {
|
|
93
|
+
const ghCheck = execFileSync('which', ['gh'], { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();
|
|
94
|
+
if (ghCheck) {
|
|
95
|
+
const prUrl = execFileSync('gh', ['pr', 'create', '--base', baseBranch, '--head', currentBranch, '--title', title, '--body', body], { cwd, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();
|
|
96
|
+
return `Pull request created successfully via GitHub CLI:\n${prUrl}`;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
// GitHub CLI not found or failed (not logged in, etc.)
|
|
101
|
+
}
|
|
102
|
+
// 3. Fallback: Generate comparison URL
|
|
103
|
+
let remoteUrl = '';
|
|
104
|
+
try {
|
|
105
|
+
remoteUrl = runGit(cwd, ['remote', 'get-url', 'origin']);
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
// No remote
|
|
109
|
+
}
|
|
110
|
+
let webUrl = '';
|
|
111
|
+
if (remoteUrl) {
|
|
112
|
+
// Parse git@github.com:owner/repo.git or https://github.com/owner/repo.git
|
|
113
|
+
let cleanUrl = remoteUrl;
|
|
114
|
+
if (cleanUrl.startsWith('git@')) {
|
|
115
|
+
cleanUrl = cleanUrl.replace(':', '/').replace('git@', 'https://');
|
|
116
|
+
}
|
|
117
|
+
if (cleanUrl.endsWith('.git')) {
|
|
118
|
+
cleanUrl = cleanUrl.slice(0, -4);
|
|
119
|
+
}
|
|
120
|
+
const titleEscaped = encodeURIComponent(title);
|
|
121
|
+
const bodyEscaped = encodeURIComponent(body);
|
|
122
|
+
webUrl = `${cleanUrl}/compare/${baseBranch}...${currentBranch}?expand=1&title=${titleEscaped}&body=${bodyEscaped}`;
|
|
123
|
+
}
|
|
124
|
+
return [
|
|
125
|
+
`GitHub CLI (gh) was not found or not authenticated. Here is the generated PR details:`,
|
|
126
|
+
`\nPR Title: ${title}`,
|
|
127
|
+
`\nPR Body:\n${body}`,
|
|
128
|
+
webUrl ? `\nYou can create the pull request manually by opening this URL in your browser:\n${webUrl}` : ''
|
|
129
|
+
].filter(Boolean).join('\n');
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=git-ops.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-ops.js","sourceRoot":"","sources":["../../src/git/git-ops.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,352 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* FixO CLI — Entry Point
|
|
4
|
+
*
|
|
5
|
+
* Boot sequence:
|
|
6
|
+
* 1. Print the lava logo + command grid (new UI is the only UI).
|
|
7
|
+
* 2. Load global config (~/.fixocli/config.json)
|
|
8
|
+
* 3. If first run → run setup wizard
|
|
9
|
+
* 4. Load project config (.freellmapi.yml) if present
|
|
10
|
+
* 5. Ensure proxy server is running on the configured port
|
|
11
|
+
* 6. Print the session header
|
|
12
|
+
* 7. Launch interactive REPL
|
|
13
|
+
*/
|
|
14
|
+
import fs from 'fs';
|
|
15
|
+
import path from 'path';
|
|
16
|
+
import { loadConfig, saveConfig } from './config.js';
|
|
17
|
+
import { runSetupWizard } from './setup-wizard.js';
|
|
18
|
+
import { startREPL } from './ui/prompt.js';
|
|
19
|
+
import yaml from 'js-yaml';
|
|
20
|
+
import { C } from './ui/colors.js';
|
|
21
|
+
import { renderLogo, renderCommandGrid, renderSessionHeader } from './ui/index.js';
|
|
22
|
+
/* ──────────────────────── CLI Args ──────────────────────── */
|
|
23
|
+
function parseArgs() {
|
|
24
|
+
const args = process.argv.slice(2);
|
|
25
|
+
const result = {
|
|
26
|
+
help: false,
|
|
27
|
+
version: false,
|
|
28
|
+
verbose: false,
|
|
29
|
+
yes: false,
|
|
30
|
+
model: undefined,
|
|
31
|
+
port: undefined,
|
|
32
|
+
task: undefined,
|
|
33
|
+
resume: undefined,
|
|
34
|
+
};
|
|
35
|
+
for (let i = 0; i < args.length; i++) {
|
|
36
|
+
const arg = args[i];
|
|
37
|
+
switch (arg) {
|
|
38
|
+
case '--help':
|
|
39
|
+
case '-h':
|
|
40
|
+
result.help = true;
|
|
41
|
+
break;
|
|
42
|
+
case '--version':
|
|
43
|
+
case '-V':
|
|
44
|
+
result.version = true;
|
|
45
|
+
break;
|
|
46
|
+
case '--verbose':
|
|
47
|
+
case '-v':
|
|
48
|
+
result.verbose = true;
|
|
49
|
+
break;
|
|
50
|
+
case '--yes':
|
|
51
|
+
case '-y':
|
|
52
|
+
result.yes = true;
|
|
53
|
+
break;
|
|
54
|
+
case '--model':
|
|
55
|
+
case '-m':
|
|
56
|
+
if (i + 1 < args.length)
|
|
57
|
+
result.model = args[++i];
|
|
58
|
+
break;
|
|
59
|
+
case '--port':
|
|
60
|
+
case '-p':
|
|
61
|
+
if (i + 1 < args.length)
|
|
62
|
+
result.port = parseInt(args[++i], 10);
|
|
63
|
+
break;
|
|
64
|
+
case '--resume':
|
|
65
|
+
case '-r':
|
|
66
|
+
if (i + 1 < args.length)
|
|
67
|
+
result.resume = args[++i];
|
|
68
|
+
break;
|
|
69
|
+
case '--task':
|
|
70
|
+
case '-t':
|
|
71
|
+
if (i + 1 < args.length && !result.task) {
|
|
72
|
+
result.task = args.slice(i + 1).join(' ');
|
|
73
|
+
i = args.length; // consume rest
|
|
74
|
+
}
|
|
75
|
+
break;
|
|
76
|
+
default:
|
|
77
|
+
// If no flag, treat rest as task
|
|
78
|
+
if (!arg.startsWith('-') && !result.task) {
|
|
79
|
+
result.task = args.slice(i).join(' ');
|
|
80
|
+
i = args.length;
|
|
81
|
+
}
|
|
82
|
+
break;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return result;
|
|
86
|
+
}
|
|
87
|
+
function printHelpMessage() {
|
|
88
|
+
console.log(`
|
|
89
|
+
${C.LAVA}${C.BOLD}FixO CLI${C.RESET} — Autonomous Free Multi-Provider LLM Coding Tool
|
|
90
|
+
|
|
91
|
+
${C.BOLD}USAGE${C.RESET}
|
|
92
|
+
fixo Start interactive REPL
|
|
93
|
+
fixo "fix the bug" Run a one-shot task
|
|
94
|
+
fixo --help Show this help
|
|
95
|
+
|
|
96
|
+
${C.BOLD}OPTIONS${C.RESET}
|
|
97
|
+
-h, --help Show help
|
|
98
|
+
-V, --version Show version
|
|
99
|
+
-v, --verbose Enable verbose/debug output
|
|
100
|
+
-y, --yes Allow low-risk actions without repeated prompts
|
|
101
|
+
-m, --model <name> Set the model (default: auto)
|
|
102
|
+
-p, --port <port> Proxy server port (default: 3001)
|
|
103
|
+
-t, --task <text> Run a one-shot task
|
|
104
|
+
-r, --resume <id> Resume a previous session snapshot by id
|
|
105
|
+
|
|
106
|
+
${C.BOLD}INTERACTIVE COMMANDS${C.RESET}
|
|
107
|
+
/help Show all commands
|
|
108
|
+
/model [name|list] Set model or list available models
|
|
109
|
+
/providers Manage AI provider API keys
|
|
110
|
+
/mode [mode] Set PLAN/BUILD/EXPLORE/SCOUT mode
|
|
111
|
+
/select [file] Pin a file for agent context
|
|
112
|
+
/unselect Clear all pinned files
|
|
113
|
+
/plan <task> Generate a structured execution plan
|
|
114
|
+
/run-plan Execute the last saved plan
|
|
115
|
+
/diff Show git diff
|
|
116
|
+
/undo Undo last AI change
|
|
117
|
+
/snapshot [label] Create a named git snapshot
|
|
118
|
+
/log Show recent git commits
|
|
119
|
+
/clear Clear conversation
|
|
120
|
+
/compact Summarise & compress conversation
|
|
121
|
+
/stats Show usage statistics
|
|
122
|
+
/session Manage sessions (list|load|new)
|
|
123
|
+
/runs List recent FixO task ledgers
|
|
124
|
+
/show-run <id> Show details of a specific run
|
|
125
|
+
/review Review current git diff
|
|
126
|
+
/test Run detected project checks
|
|
127
|
+
/fix-ci Fix CI failures (paste logs)
|
|
128
|
+
/memory Show project memory
|
|
129
|
+
/remember <fact> Add a project fact to memory
|
|
130
|
+
/forget Clear all project memory
|
|
131
|
+
/index Build local repo index
|
|
132
|
+
/find <query> Search the repo index
|
|
133
|
+
/explain <target> Explain a file or symbol
|
|
134
|
+
/skills List registered skill profiles
|
|
135
|
+
/doctor Run FixO diagnostics
|
|
136
|
+
/theme Toggle Dark Void / Inverted theme
|
|
137
|
+
/exit Exit
|
|
138
|
+
|
|
139
|
+
${C.BOLD}EXAMPLES${C.RESET}
|
|
140
|
+
${C.SNOW4}# Start interactive mode${C.RESET}
|
|
141
|
+
fixo
|
|
142
|
+
|
|
143
|
+
${C.SNOW4}# One-shot task${C.RESET}
|
|
144
|
+
fixo "add input validation to user.ts"
|
|
145
|
+
|
|
146
|
+
${C.SNOW4}# Use a specific model${C.RESET}
|
|
147
|
+
fixo -m gemini-2.5-flash "explain this codebase"
|
|
148
|
+
`);
|
|
149
|
+
}
|
|
150
|
+
/* ──────────────────────── Project Config ──────────────────────── */
|
|
151
|
+
const KNOWN_CONFIG_KEYS = new Set(['model', 'checkCommand', 'autoCommit', 'policy', 'executionMode', 'maxAttempts', 'systemPrompt', 'plugins', 'trustedPlugins']);
|
|
152
|
+
function loadProjectConfig(cwd) {
|
|
153
|
+
const yamlPath = path.join(cwd, '.freellmapi.yml');
|
|
154
|
+
const yamlAltPath = path.join(cwd, '.freellmapi.yaml');
|
|
155
|
+
let configPath;
|
|
156
|
+
if (fs.existsSync(yamlPath))
|
|
157
|
+
configPath = yamlPath;
|
|
158
|
+
else if (fs.existsSync(yamlAltPath))
|
|
159
|
+
configPath = yamlAltPath;
|
|
160
|
+
if (!configPath)
|
|
161
|
+
return undefined;
|
|
162
|
+
try {
|
|
163
|
+
const content = fs.readFileSync(configPath, 'utf-8');
|
|
164
|
+
const doc = yaml.load(content);
|
|
165
|
+
if (!doc || typeof doc !== 'object')
|
|
166
|
+
return undefined;
|
|
167
|
+
for (const key of Object.keys(doc)) {
|
|
168
|
+
if (!KNOWN_CONFIG_KEYS.has(key)) {
|
|
169
|
+
console.warn(`${C.YELLOW}⚠ Unknown config key "${key}" in ${path.basename(configPath)}${C.RESET}`);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
const config = {};
|
|
173
|
+
if (typeof doc.model === 'string')
|
|
174
|
+
config.model = doc.model;
|
|
175
|
+
if (typeof doc.checkCommand === 'string')
|
|
176
|
+
config.checkCommand = doc.checkCommand;
|
|
177
|
+
if (doc.autoCommit !== undefined)
|
|
178
|
+
config.autoCommit = Boolean(doc.autoCommit);
|
|
179
|
+
if (typeof doc.policy === 'string')
|
|
180
|
+
config.policy = doc.policy;
|
|
181
|
+
if (typeof doc.executionMode === 'string')
|
|
182
|
+
config.executionMode = doc.executionMode;
|
|
183
|
+
if (doc.maxAttempts !== undefined)
|
|
184
|
+
config.maxAttempts = parseInt(String(doc.maxAttempts), 10);
|
|
185
|
+
if (typeof doc.systemPrompt === 'string')
|
|
186
|
+
config.systemPrompt = doc.systemPrompt;
|
|
187
|
+
if (Array.isArray(doc.plugins))
|
|
188
|
+
config.plugins = doc.plugins.map(String);
|
|
189
|
+
if (Array.isArray(doc.trustedPlugins))
|
|
190
|
+
config.trustedPlugins = doc.trustedPlugins.map(String);
|
|
191
|
+
return config;
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
return undefined;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
/* ──────────────────────── Main ──────────────────────── */
|
|
198
|
+
async function main() {
|
|
199
|
+
// ──── Step 0: Print the lava logo (the new UI is the only UI) ────
|
|
200
|
+
renderLogo();
|
|
201
|
+
renderCommandGrid();
|
|
202
|
+
// Node version check (major >= 24)
|
|
203
|
+
const nodeMajor = parseInt(process.versions.node.split('.')[0], 10);
|
|
204
|
+
if (nodeMajor < 24) {
|
|
205
|
+
console.error(`${C.RED}Error: FixO CLI requires Node.js version 24.0.0 or higher (current version: ${process.version}).${C.RESET}`);
|
|
206
|
+
process.exit(1);
|
|
207
|
+
}
|
|
208
|
+
const args = parseArgs();
|
|
209
|
+
if (args.help) {
|
|
210
|
+
printHelpMessage();
|
|
211
|
+
process.exit(0);
|
|
212
|
+
}
|
|
213
|
+
if (args.version) {
|
|
214
|
+
try {
|
|
215
|
+
const pkgPath = new URL('../package.json', import.meta.url);
|
|
216
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
|
|
217
|
+
console.log(`fixo-cli v${pkg.version}`);
|
|
218
|
+
}
|
|
219
|
+
catch {
|
|
220
|
+
console.log('fixo-cli v1.0.0');
|
|
221
|
+
}
|
|
222
|
+
process.exit(0);
|
|
223
|
+
}
|
|
224
|
+
// ──── Step 1: Load config ────
|
|
225
|
+
let config = loadConfig();
|
|
226
|
+
// Pillar 3 — LSP pre-flight. Run a synchronous PATH check for
|
|
227
|
+
// common language servers and warn (not block) the user if
|
|
228
|
+
// none are present. The full pre-save gate is still wired in
|
|
229
|
+
// via the `LspPreSaveGate` and falls back to a brace-balance
|
|
230
|
+
// check when `FIXO_LSP_FALLBACK=syntax-only` is set.
|
|
231
|
+
try {
|
|
232
|
+
const { checkLspSanity } = await import('./lsp/syntax-fallback.js');
|
|
233
|
+
const sanity = checkLspSanity(process.env);
|
|
234
|
+
if (!sanity.ok) {
|
|
235
|
+
console.warn(`${C.YELLOW}⚠ ${sanity.reason}${C.RESET}\n` +
|
|
236
|
+
`${C.SNOW4} Set FIXO_LSP_FALLBACK=syntax-only to enable brace-balance fallback.${C.RESET}`);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
catch {
|
|
240
|
+
// best-effort — never block boot on this check
|
|
241
|
+
}
|
|
242
|
+
// ──── Step 2: First-run wizard & Validation ────
|
|
243
|
+
if (!config._firstRunComplete || !config.freellmapi_api_key || !config.apiUrl) {
|
|
244
|
+
config = await runSetupWizard();
|
|
245
|
+
saveConfig(config);
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
// Validate API Key
|
|
249
|
+
try {
|
|
250
|
+
const controller = new AbortController();
|
|
251
|
+
const timeoutId = setTimeout(() => controller.abort(), 5000);
|
|
252
|
+
const res = await fetch(`${config.apiUrl}/models`, {
|
|
253
|
+
headers: { Authorization: `Bearer ${config.freellmapi_api_key}` },
|
|
254
|
+
signal: controller.signal
|
|
255
|
+
});
|
|
256
|
+
clearTimeout(timeoutId);
|
|
257
|
+
if (res.status === 401 || res.status === 403) {
|
|
258
|
+
console.warn(`${C.YELLOW}⚠ Warning: API Key appears invalid (HTTP ${res.status}). You may need to re-run setup.${C.RESET}`);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
catch (err) {
|
|
262
|
+
console.warn(`${C.YELLOW}⚠ Warning: Could not validate API key (connection failed). Proceeding in offline mode or assuming temporary network issue.${C.RESET}`);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
// ──── Apply CLI port override ────
|
|
266
|
+
if (args.port) {
|
|
267
|
+
if (config.apiUrl) {
|
|
268
|
+
try {
|
|
269
|
+
const url = new URL(config.apiUrl);
|
|
270
|
+
url.port = args.port.toString();
|
|
271
|
+
config.apiUrl = url.toString();
|
|
272
|
+
}
|
|
273
|
+
catch {
|
|
274
|
+
config.apiUrl = `http://localhost:${args.port}/v1`;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
else {
|
|
278
|
+
config.apiUrl = `http://localhost:${args.port}/v1`;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
// ──── Step 3: Load project config ────
|
|
282
|
+
const cwd = process.cwd();
|
|
283
|
+
const projectConfig = loadProjectConfig(cwd);
|
|
284
|
+
// ──── Step 3.5: Initialize MCP & Plugins ────
|
|
285
|
+
const { mcpManager, mcpBridgeManager, initializePlugins } = await import('./agent/tool-executor.js');
|
|
286
|
+
await mcpManager.initialize();
|
|
287
|
+
await mcpBridgeManager.initialize(cwd);
|
|
288
|
+
const { skillsManager } = await import('./agent/skills.js');
|
|
289
|
+
skillsManager.initialize(cwd);
|
|
290
|
+
await initializePlugins(cwd, projectConfig);
|
|
291
|
+
// Register shutdown hook
|
|
292
|
+
process.on('exit', () => {
|
|
293
|
+
mcpManager.shutdown();
|
|
294
|
+
mcpBridgeManager.shutdown();
|
|
295
|
+
});
|
|
296
|
+
// ──── Apply CLI overrides ────
|
|
297
|
+
const model = args.model ?? projectConfig?.model ?? config.defaultModel;
|
|
298
|
+
const verbose = args.verbose;
|
|
299
|
+
// ──── Step 4: Launch ────
|
|
300
|
+
if (args.task) {
|
|
301
|
+
// One-shot mode: run task and exit
|
|
302
|
+
const { SingleAgent } = await import('./agent/single-agent.js');
|
|
303
|
+
const { ConversationManager } = await import('./agent/conversation.js');
|
|
304
|
+
const agent = new SingleAgent(verbose);
|
|
305
|
+
const conversation = new ConversationManager();
|
|
306
|
+
const result = await agent.runStreaming({
|
|
307
|
+
task: args.task,
|
|
308
|
+
model: model ?? 'auto',
|
|
309
|
+
cwd,
|
|
310
|
+
verbose,
|
|
311
|
+
selectedFiles: [],
|
|
312
|
+
systemPromptOverride: projectConfig?.systemPrompt,
|
|
313
|
+
checkCommand: projectConfig?.checkCommand,
|
|
314
|
+
policy: projectConfig?.policy ?? config.preferences.policy,
|
|
315
|
+
yes: args.yes,
|
|
316
|
+
}, conversation);
|
|
317
|
+
// Print final stats
|
|
318
|
+
const modelPart = result.model ? `${result.model} · ` : '';
|
|
319
|
+
console.log(`\n${C.SNOW4}${modelPart}${result.tokensUsed.total_tokens} tokens · ${result.toolCallCount} tool calls · ${(result.durationMs / 1000).toFixed(1)}s${C.RESET}`);
|
|
320
|
+
const { stopLspManager } = await import('./agent/tool-executor.js');
|
|
321
|
+
await stopLspManager();
|
|
322
|
+
process.exit(result.success ? 0 : 1);
|
|
323
|
+
}
|
|
324
|
+
// Interactive REPL mode — print the session header before
|
|
325
|
+
// handing off to startREPL so the boot sequence is:
|
|
326
|
+
// logo → command grid → session header → › prompt.
|
|
327
|
+
const sessionModel = model ?? 'auto';
|
|
328
|
+
renderSessionHeader({
|
|
329
|
+
status: 'new',
|
|
330
|
+
startedAt: new Date().toISOString(),
|
|
331
|
+
provider: 'auto',
|
|
332
|
+
model: sessionModel,
|
|
333
|
+
mode: 'BUILD',
|
|
334
|
+
routing: 'auto',
|
|
335
|
+
contextWindow: '200k',
|
|
336
|
+
});
|
|
337
|
+
await startREPL({
|
|
338
|
+
config,
|
|
339
|
+
projectConfig,
|
|
340
|
+
cwd,
|
|
341
|
+
verbose,
|
|
342
|
+
resume: args.resume,
|
|
343
|
+
});
|
|
344
|
+
const { stopLspManager } = await import('./agent/tool-executor.js');
|
|
345
|
+
await stopLspManager();
|
|
346
|
+
}
|
|
347
|
+
// ──── Run ────
|
|
348
|
+
main().catch((error) => {
|
|
349
|
+
console.error(`${C.RED}Fatal error: ${error.message ?? error}${C.RESET}`);
|
|
350
|
+
process.exit(1);
|
|
351
|
+
});
|
|
352
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export interface IndexedFile {
|
|
2
|
+
path: string;
|
|
3
|
+
hash: string;
|
|
4
|
+
symbols: string[];
|
|
5
|
+
imports: string[];
|
|
6
|
+
resolvedImports?: string[];
|
|
7
|
+
dependents?: string[];
|
|
8
|
+
importance?: number;
|
|
9
|
+
}
|
|
10
|
+
export interface RepoIndex {
|
|
11
|
+
updatedAt: string;
|
|
12
|
+
files: IndexedFile[];
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Builds a fresh `RepoIndex` for the workspace at `cwd` and persists it
|
|
16
|
+
* to `.fixo/index/repo-index.json`. Routes symbol and import extraction
|
|
17
|
+
* through the `ParserFactory` so the same call site transparently uses
|
|
18
|
+
* tree-sitter when the WASM is available and the regex fallback when
|
|
19
|
+
* it is not.
|
|
20
|
+
*/
|
|
21
|
+
export declare function buildIndex(cwd: string): Promise<RepoIndex>;
|
|
22
|
+
/**
|
|
23
|
+
* Loads the cached `RepoIndex` for `cwd`. If no cache exists, builds one
|
|
24
|
+
* first (sharing the in-flight promise with any concurrent caller).
|
|
25
|
+
*/
|
|
26
|
+
export declare function loadIndex(cwd: string): Promise<RepoIndex>;
|
|
27
|
+
export declare function findInIndex(cwd: string, query: string): Promise<string>;
|
|
28
|
+
export declare function explainIndexedTarget(cwd: string, query: string): Promise<string>;
|
|
29
|
+
export declare function findCodebaseDependencies(cwd: string, targetPath: string): Promise<string>;
|
|
30
|
+
//# sourceMappingURL=indexer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"indexer.d.ts","sourceRoot":"","sources":["../src/indexer.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,WAAW,EAAE,CAAC;CACtB;AA6FD;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAuF1D;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAmBzD;AAED,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAkB7E;AAED,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgBtF;AAED,wBAAsB,wBAAwB,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA+B/F"}
|