opalacoder 0.1.24__tar.gz → 0.1.25__tar.gz
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.
- {opalacoder-0.1.24 → opalacoder-0.1.25}/PKG-INFO +2 -2
- {opalacoder-0.1.24 → opalacoder-0.1.25}/README.md +1 -1
- {opalacoder-0.1.24 → opalacoder-0.1.25}/gui_src/src/App.jsx +27 -1
- {opalacoder-0.1.24 → opalacoder-0.1.25}/opalacoder/__init__.py +1 -1
- {opalacoder-0.1.24 → opalacoder-0.1.25}/opalacoder/agent_stdin.py +56 -1
- opalacoder-0.1.24/opalacoder/gui/assets/index-DGc3pIxk.js → opalacoder-0.1.25/opalacoder/gui/assets/index-BQg8XLlL.js +17 -17
- {opalacoder-0.1.24 → opalacoder-0.1.25}/opalacoder/gui/index.html +1 -1
- {opalacoder-0.1.24 → opalacoder-0.1.25}/opalacoder/ide_server.py +7 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/opalacoder/project.py +72 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/pyproject.toml +1 -1
- {opalacoder-0.1.24 → opalacoder-0.1.25}/.claude/rules/RULES.md +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/.claude/settings.json +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/.github/workflows/publish.yml +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/.gitignore +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/AGENTS.md +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/AppIcons/Assets.xcassets/AppIcon.appiconset/100.png +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/AppIcons/Assets.xcassets/AppIcon.appiconset/102.png +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/AppIcons/Assets.xcassets/AppIcon.appiconset/1024.png +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/AppIcons/Assets.xcassets/AppIcon.appiconset/108.png +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/AppIcons/Assets.xcassets/AppIcon.appiconset/114.png +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/AppIcons/Assets.xcassets/AppIcon.appiconset/120.png +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/AppIcons/Assets.xcassets/AppIcon.appiconset/128.png +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/AppIcons/Assets.xcassets/AppIcon.appiconset/144.png +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/AppIcons/Assets.xcassets/AppIcon.appiconset/152.png +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/AppIcons/Assets.xcassets/AppIcon.appiconset/16.png +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/AppIcons/Assets.xcassets/AppIcon.appiconset/167.png +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/AppIcons/Assets.xcassets/AppIcon.appiconset/172.png +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/AppIcons/Assets.xcassets/AppIcon.appiconset/180.png +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/AppIcons/Assets.xcassets/AppIcon.appiconset/196.png +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/AppIcons/Assets.xcassets/AppIcon.appiconset/20.png +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/AppIcons/Assets.xcassets/AppIcon.appiconset/216.png +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/AppIcons/Assets.xcassets/AppIcon.appiconset/234.png +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/AppIcons/Assets.xcassets/AppIcon.appiconset/256.png +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/AppIcons/Assets.xcassets/AppIcon.appiconset/258.png +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/AppIcons/Assets.xcassets/AppIcon.appiconset/29.png +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/AppIcons/Assets.xcassets/AppIcon.appiconset/32.png +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/AppIcons/Assets.xcassets/AppIcon.appiconset/40.png +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/AppIcons/Assets.xcassets/AppIcon.appiconset/48.png +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/AppIcons/Assets.xcassets/AppIcon.appiconset/50.png +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/AppIcons/Assets.xcassets/AppIcon.appiconset/512.png +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/AppIcons/Assets.xcassets/AppIcon.appiconset/55.png +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/AppIcons/Assets.xcassets/AppIcon.appiconset/57.png +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/AppIcons/Assets.xcassets/AppIcon.appiconset/58.png +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/AppIcons/Assets.xcassets/AppIcon.appiconset/60.png +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/AppIcons/Assets.xcassets/AppIcon.appiconset/64.png +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/AppIcons/Assets.xcassets/AppIcon.appiconset/66.png +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/AppIcons/Assets.xcassets/AppIcon.appiconset/72.png +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/AppIcons/Assets.xcassets/AppIcon.appiconset/76.png +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/AppIcons/Assets.xcassets/AppIcon.appiconset/80.png +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/AppIcons/Assets.xcassets/AppIcon.appiconset/87.png +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/AppIcons/Assets.xcassets/AppIcon.appiconset/88.png +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/AppIcons/Assets.xcassets/AppIcon.appiconset/92.png +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/AppIcons/Assets.xcassets/AppIcon.appiconset/Contents.json +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/AppIcons/android/mipmap-hdpi/ic_launcher.png +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/AppIcons/android/mipmap-mdpi/ic_launcher.png +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/AppIcons/android/mipmap-xhdpi/ic_launcher.png +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/AppIcons/android/mipmap-xxhdpi/ic_launcher.png +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/AppIcons/android/mipmap-xxxhdpi/ic_launcher.png +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/AppIcons/appstore.png +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/AppIcons/playstore.png +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/CLAUDE.md +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/GEMINI.md +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/agents.yaml +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/config.yaml +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/debug/scratch_tail.py +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/docs/guide/analysis_results.md +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/docs/guide/figs/logotipo.png +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/docs/guide/paper_memplan.md +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/docs/guide/skills-plugin-system.md +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/docs/specs/01-arquitetura.md +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/docs/specs/02-memgpt-orquestrador.md +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/docs/specs/03-skill-implement-feature.md +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/docs/specs/04-memoria.md +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/docs/specs/05-vcs-sombra.md +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/docs/specs/06-skills-e-plugins.md +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/docs/specs/07-configuracao.md +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/docs/specs/08-ide.md +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/docs/specs/09-ide-projectcreationinterface.md +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/docs/specs/README.md +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/docs/specs/backlog_register.md +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/gui_src/index.html +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/gui_src/package-lock.json +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/gui_src/package.json +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/gui_src/src/index.css +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/gui_src/src/main.jsx +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/gui_src/vite.config.js +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/main.py +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/opalacoder/agents.py +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/opalacoder/api_keys.py +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/opalacoder/archival.py +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/opalacoder/cli.py +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/opalacoder/cli_commands.py +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/opalacoder/code_index.py +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/opalacoder/config.py +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/opalacoder/copy_gui.py +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/opalacoder/embeddings.py +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/opalacoder/gui/assets/index-_ON06SYj.css +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/opalacoder/i18n.py +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/opalacoder/icon.png +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/opalacoder/memgpt_runtime.py +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/opalacoder/orchestrator.py +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/opalacoder/planner.py +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/opalacoder/plugins/__init__.py +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/opalacoder/plugins/html_css_js_tools.py +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/opalacoder/session.py +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/opalacoder/skills.py +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/opalacoder/structured.py +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/opalacoder/terminal.py +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/opalacoder/terminal_manager.py +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/opalacoder/tools.py +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/opalacoder/vcs.py +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/opalacoder/vector_index.py +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/opalacoder/workflow_orchestrator.py +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/opalacoder/workflow_tools.py +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/pytest.ini +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/requirements.txt +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/skills/chat-orchestrator/SKILL.md +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/skills/command-line/SKILL.md +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/skills/command-line/scripts/command_executor.py +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/skills/skills_store/html-css-js/SKILL.md +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/skills/skills_store/html-css-js/scripts/check_contracts.py +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/skills/skills_store/implement-feature/SKILL.md +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/skills/skills_store/implement-feature/scripts/run_workflow.py +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/skills/view-editor/SKILL.md +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/skills/view-editor/scripts/run_view_editor.py +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/tests/test_agent_config.py +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/tests/test_agent_stdin.py +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/tests/test_code_index_integration.py +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/tests/test_command_line_skill.py +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/tests/test_complexity_evaluator.py +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/tests/test_context_guard.py +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/tests/test_file_delete.py +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/tests/test_i18n_coverage.py +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/tests/test_implement_feature_script.py +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/tests/test_memgpt_runtime.py +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/tests/test_model_commands.py +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/tests/test_planner_oracle_live.py +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/tests/test_planner_output.py +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/tests/test_project_store.py +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/tests/test_refinement_loop.py +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/tests/test_search_bugs.py +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/tests/test_skills_directory_loader.py +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/tests/test_unhashable_dict_bug.py +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/tests/test_verification_strategies.py +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/tests/test_view_editor_skill.py +0 -0
- {opalacoder-0.1.24 → opalacoder-0.1.25}/tests/test_workflow_pipeline.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: opalacoder
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.25
|
|
4
4
|
Summary: Autonomous coding agent with interactive planning and modular execution
|
|
5
5
|
Project-URL: Homepage, https://github.com/gilzamir/OpalaCoder
|
|
6
6
|
Project-URL: Bug Tracker, https://github.com/gilzamir/OpalaCoder/issues
|
|
@@ -60,7 +60,7 @@ OpalaCoder features an integrated desktop GUI built using React, Vite, and `pywe
|
|
|
60
60
|
- **Integrated Terminal**: Includes a real-time xterm.js terminal with shell/PTY integration for running and inspecting commands natively.
|
|
61
61
|
- **Git Source Control Sidebar**: A dedicated panel that tracks file modifications (color-coded as Modified/Untracked/Deleted) and provides a commit interface.
|
|
62
62
|
- **Global Settings Panel**: Customize the editor font size, tab size, and word wrapping, with dynamic toggle support for Light and Dark themes.
|
|
63
|
-
- **About Tab**: Version tracking (currently `0.1.
|
|
63
|
+
- **About Tab**: Version tracking (currently `0.1.25 alfa`), licensing, and developer details in the settings panel.
|
|
64
64
|
|
|
65
65
|
### 6. Persistent Projects and CLI Commands
|
|
66
66
|
|
|
@@ -30,7 +30,7 @@ OpalaCoder features an integrated desktop GUI built using React, Vite, and `pywe
|
|
|
30
30
|
- **Integrated Terminal**: Includes a real-time xterm.js terminal with shell/PTY integration for running and inspecting commands natively.
|
|
31
31
|
- **Git Source Control Sidebar**: A dedicated panel that tracks file modifications (color-coded as Modified/Untracked/Deleted) and provides a commit interface.
|
|
32
32
|
- **Global Settings Panel**: Customize the editor font size, tab size, and word wrapping, with dynamic toggle support for Light and Dark themes.
|
|
33
|
-
- **About Tab**: Version tracking (currently `0.1.
|
|
33
|
+
- **About Tab**: Version tracking (currently `0.1.25 alfa`), licensing, and developer details in the settings panel.
|
|
34
34
|
|
|
35
35
|
### 6. Persistent Projects and CLI Commands
|
|
36
36
|
|
|
@@ -1041,6 +1041,8 @@ export default function App() {
|
|
|
1041
1041
|
mode: proj.mode || 'auto',
|
|
1042
1042
|
description: proj.description || '',
|
|
1043
1043
|
model_params: proj.model_params || {},
|
|
1044
|
+
api_key: proj.api_key || '',
|
|
1045
|
+
api_base: proj.api_base || '',
|
|
1044
1046
|
});
|
|
1045
1047
|
};
|
|
1046
1048
|
|
|
@@ -1060,6 +1062,8 @@ export default function App() {
|
|
|
1060
1062
|
mode: editingProject.mode,
|
|
1061
1063
|
description: editingProject.description,
|
|
1062
1064
|
model_params: editingProject.model_params,
|
|
1065
|
+
api_key: editingProject.api_key,
|
|
1066
|
+
api_base: editingProject.api_base,
|
|
1063
1067
|
})
|
|
1064
1068
|
});
|
|
1065
1069
|
if (res.ok) {
|
|
@@ -2257,6 +2261,28 @@ export default function App() {
|
|
|
2257
2261
|
</datalist>
|
|
2258
2262
|
</div>
|
|
2259
2263
|
|
|
2264
|
+
{/* API Key and API Base */}
|
|
2265
|
+
<div style={{ display: 'flex', gap: '12px' }}>
|
|
2266
|
+
<div className="flex flex-col flex-1" style={{ gap: '4px' }}>
|
|
2267
|
+
<label className="vscode-sidebar-section-title" style={{ padding: 0 }}>Chave de API (Opcional)</label>
|
|
2268
|
+
<input
|
|
2269
|
+
type="password"
|
|
2270
|
+
value={editingProject.api_key}
|
|
2271
|
+
onChange={e => setEditingProject(p => ({ ...p, api_key: e.target.value }))}
|
|
2272
|
+
placeholder="Ex: sk-..."
|
|
2273
|
+
/>
|
|
2274
|
+
</div>
|
|
2275
|
+
<div className="flex flex-col flex-1" style={{ gap: '4px' }}>
|
|
2276
|
+
<label className="vscode-sidebar-section-title" style={{ padding: 0 }}>URL Base da API (Opcional)</label>
|
|
2277
|
+
<input
|
|
2278
|
+
type="text"
|
|
2279
|
+
value={editingProject.api_base}
|
|
2280
|
+
onChange={e => setEditingProject(p => ({ ...p, api_base: e.target.value }))}
|
|
2281
|
+
placeholder="Ex: http://localhost:11434/v1"
|
|
2282
|
+
/>
|
|
2283
|
+
</div>
|
|
2284
|
+
</div>
|
|
2285
|
+
|
|
2260
2286
|
{/* Description */}
|
|
2261
2287
|
<div className="flex flex-col" style={{ gap: '4px' }}>
|
|
2262
2288
|
<label className="vscode-sidebar-section-title" style={{ padding: 0 }}>Descrição</label>
|
|
@@ -2681,7 +2707,7 @@ export default function App() {
|
|
|
2681
2707
|
<div style={{ display: 'flex', flexDirection: 'column', gap: '14px', color: '#cccccc' }}>
|
|
2682
2708
|
<div style={{ display: 'flex', flexDirection: 'column', gap: '4px' }}>
|
|
2683
2709
|
<span className="vscode-sidebar-section-title" style={{ padding: 0 }}>Versão</span>
|
|
2684
|
-
<span style={{ fontSize: '13px', fontWeight: 'bold', color: '#ffffff' }}>0.1.
|
|
2710
|
+
<span style={{ fontSize: '13px', fontWeight: 'bold', color: '#ffffff' }}>0.1.25 alfa</span>
|
|
2685
2711
|
</div>
|
|
2686
2712
|
<div style={{ display: 'flex', flexDirection: 'column', gap: '4px' }}>
|
|
2687
2713
|
<span className="vscode-sidebar-section-title" style={{ padding: 0 }}>Autor</span>
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"""OpalaCoder – AI coding agent with session management and modular execution."""
|
|
2
|
-
__version__ = "0.1.
|
|
2
|
+
__version__ = "0.1.25"
|
|
@@ -482,6 +482,8 @@ async def handle_create_project(data: dict):
|
|
|
482
482
|
model = data.get("model") or DEFAULT_MODEL
|
|
483
483
|
mode = data.get("mode") or "auto"
|
|
484
484
|
skills = data.get("skills", [])
|
|
485
|
+
api_key = data.get("api_key")
|
|
486
|
+
api_base = data.get("api_base")
|
|
485
487
|
|
|
486
488
|
db_key = project_name.replace(" ", "_").lower()
|
|
487
489
|
if store.exists(db_key):
|
|
@@ -495,11 +497,62 @@ async def handle_create_project(data: dict):
|
|
|
495
497
|
project_path=os.path.abspath(project_path),
|
|
496
498
|
skills=skills,
|
|
497
499
|
description=description,
|
|
500
|
+
api_key=api_key,
|
|
501
|
+
api_base=api_base,
|
|
498
502
|
)
|
|
499
503
|
print_event("project_created", {
|
|
500
504
|
"project_name": project.project_name,
|
|
501
505
|
"project_path": project.project_path,
|
|
502
|
-
"skills": project.skills
|
|
506
|
+
"skills": project.skills,
|
|
507
|
+
"api_key": project.api_key,
|
|
508
|
+
"api_base": project.api_base,
|
|
509
|
+
})
|
|
510
|
+
|
|
511
|
+
async def handle_update_project(data: dict):
|
|
512
|
+
db_path = data.get("db") or DEFAULT_DB_PATH
|
|
513
|
+
store = ProjectStore(db_path=db_path)
|
|
514
|
+
|
|
515
|
+
project_name = data.get("project_name")
|
|
516
|
+
if not project_name:
|
|
517
|
+
print_event("error", {"message": "project_name is required"})
|
|
518
|
+
return
|
|
519
|
+
|
|
520
|
+
if not store.exists(project_name):
|
|
521
|
+
print_event("error", {"message": f"Project '{project_name}' not found"})
|
|
522
|
+
return
|
|
523
|
+
|
|
524
|
+
project = store.load(project_name)
|
|
525
|
+
if "display_name" in data:
|
|
526
|
+
project.project_name = data["display_name"]
|
|
527
|
+
if "model" in data and data["model"]:
|
|
528
|
+
project.model = data["model"]
|
|
529
|
+
if "alternative_model" in data:
|
|
530
|
+
project.alternative_model = data["alternative_model"]
|
|
531
|
+
if "description" in data:
|
|
532
|
+
project.description = data["description"]
|
|
533
|
+
if "mode" in data and data["mode"]:
|
|
534
|
+
project.mode = data["mode"]
|
|
535
|
+
if "project_path" in data and data["project_path"]:
|
|
536
|
+
project.project_path = os.path.abspath(data["project_path"])
|
|
537
|
+
if "api_key" in data:
|
|
538
|
+
project.api_key = data["api_key"]
|
|
539
|
+
if "api_base" in data:
|
|
540
|
+
project.api_base = data["api_base"]
|
|
541
|
+
if "model_params" in data:
|
|
542
|
+
project.model_params = data["model_params"]
|
|
543
|
+
|
|
544
|
+
store.save(project)
|
|
545
|
+
print_event("project_updated", {
|
|
546
|
+
"name": project.name,
|
|
547
|
+
"project_name": project.project_name,
|
|
548
|
+
"project_path": project.project_path,
|
|
549
|
+
"model": project.model,
|
|
550
|
+
"alternative_model": project.alternative_model,
|
|
551
|
+
"mode": project.mode,
|
|
552
|
+
"description": project.description,
|
|
553
|
+
"api_key": project.api_key,
|
|
554
|
+
"api_base": project.api_base,
|
|
555
|
+
"model_params": project.model_params,
|
|
503
556
|
})
|
|
504
557
|
|
|
505
558
|
async def handle_delete_project(data: dict):
|
|
@@ -552,6 +605,8 @@ async def stdin_server_loop():
|
|
|
552
605
|
await handle_list_projects(data)
|
|
553
606
|
elif cmd == "create_project":
|
|
554
607
|
await handle_create_project(data)
|
|
608
|
+
elif cmd == "update_project":
|
|
609
|
+
await handle_update_project(data)
|
|
555
610
|
elif cmd == "delete_project":
|
|
556
611
|
await handle_delete_project(data)
|
|
557
612
|
else:
|