opalacoder 0.1.26__tar.gz → 0.2.2__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.
Files changed (165) hide show
  1. opalacoder-0.2.2/AppIcons/icon.png +0 -0
  2. opalacoder-0.2.2/AppIcons/opalaicon.png +0 -0
  3. {opalacoder-0.1.26 → opalacoder-0.2.2}/CLAUDE.md +4 -1
  4. {opalacoder-0.1.26 → opalacoder-0.2.2}/GEMINI.md +4 -0
  5. {opalacoder-0.1.26 → opalacoder-0.2.2}/PKG-INFO +1 -1
  6. opalacoder-0.2.2/debug/debug_litellm_callbacks.py +43 -0
  7. opalacoder-0.2.2/debug/test_thought_stream.py +47 -0
  8. {opalacoder-0.1.26 → opalacoder-0.2.2}/docs/specs/07-configuracao.md +217 -1
  9. {opalacoder-0.1.26 → opalacoder-0.2.2}/gui_src/src/App.jsx +447 -189
  10. {opalacoder-0.1.26 → opalacoder-0.2.2}/gui_src/src/index.css +5 -0
  11. {opalacoder-0.1.26 → opalacoder-0.2.2}/gui_src/vite.config.js +10 -1
  12. opalacoder-0.2.2/icon.png +0 -0
  13. {opalacoder-0.1.26 → opalacoder-0.2.2}/opalacoder/agent_stdin.py +289 -202
  14. {opalacoder-0.1.26 → opalacoder-0.2.2}/opalacoder/agents.py +10 -4
  15. opalacoder-0.2.2/opalacoder/assetstore/modelconfigs/gpt_oss__latest.metadata +4 -0
  16. opalacoder-0.2.2/opalacoder/assetstore/modelconfigs/gpt_oss__latest.zip +0 -0
  17. opalacoder-0.2.2/opalacoder/assetstore/skills/skill_html_css_js.metadata +4 -0
  18. opalacoder-0.2.2/opalacoder/assetstore/skills/skill_html_css_js.zip +0 -0
  19. opalacoder-0.2.2/opalacoder/assetstore/skills/skill_implement_feature.metadata +4 -0
  20. opalacoder-0.2.2/opalacoder/assetstore/skills/skill_implement_feature.zip +0 -0
  21. opalacoder-0.2.2/opalacoder/assetstore.py +179 -0
  22. {opalacoder-0.1.26 → opalacoder-0.2.2}/opalacoder/cli_commands.py +129 -30
  23. {opalacoder-0.1.26 → opalacoder-0.2.2}/opalacoder/config.py +46 -2
  24. {opalacoder-0.1.26 → opalacoder-0.2.2}/opalacoder/embeddings.py +0 -2
  25. opalacoder-0.2.2/opalacoder/gui/assets/index-CD7_Sjss.css +32 -0
  26. opalacoder-0.2.2/opalacoder/gui/assets/index-D2mJbeF2.js +159 -0
  27. opalacoder-0.2.2/opalacoder/gui/assets/vendor-monaco-BkbU5OES.js +19 -0
  28. opalacoder-0.2.2/opalacoder/gui/assets/vendor-react-B2vUwPEE.js +24 -0
  29. opalacoder-0.2.2/opalacoder/gui/assets/vendor-xterm-3VOAfa_q.js +38 -0
  30. {opalacoder-0.1.26 → opalacoder-0.2.2}/opalacoder/gui/index.html +5 -2
  31. opalacoder-0.2.2/opalacoder/icon.png +0 -0
  32. {opalacoder-0.1.26 → opalacoder-0.2.2}/opalacoder/ide_server.py +130 -44
  33. {opalacoder-0.1.26 → opalacoder-0.2.2}/opalacoder/memgpt_runtime.py +16 -4
  34. {opalacoder-0.1.26 → opalacoder-0.2.2}/opalacoder/project.py +8 -2
  35. opalacoder-0.2.2/opalacoder/structured.py +56 -0
  36. {opalacoder-0.1.26 → opalacoder-0.2.2}/opalacoder/tools.py +105 -25
  37. {opalacoder-0.1.26 → opalacoder-0.2.2}/opalacoder/workflow_orchestrator.py +4 -47
  38. {opalacoder-0.1.26 → opalacoder-0.2.2}/pyproject.toml +1 -1
  39. {opalacoder-0.1.26 → opalacoder-0.2.2}/skills/command-line/SKILL.md +5 -5
  40. {opalacoder-0.1.26 → opalacoder-0.2.2}/skills/view-editor/SKILL.md +1 -1
  41. {opalacoder-0.1.26 → opalacoder-0.2.2}/tests/test_agent_stdin.py +78 -0
  42. {opalacoder-0.1.26 → opalacoder-0.2.2}/tests/test_code_index_integration.py +6 -2
  43. {opalacoder-0.1.26 → opalacoder-0.2.2}/tests/test_model_commands.py +24 -10
  44. {opalacoder-0.1.26 → opalacoder-0.2.2}/tests/test_search_bugs.py +18 -12
  45. {opalacoder-0.1.26 → opalacoder-0.2.2}/tests/test_workflow_pipeline.py +14 -7
  46. opalacoder-0.1.26/opalacoder/copy_gui.py +0 -20
  47. opalacoder-0.1.26/opalacoder/gui/assets/index-Bp5KKCcR.js +0 -225
  48. opalacoder-0.1.26/opalacoder/gui/assets/index-_ON06SYj.css +0 -32
  49. opalacoder-0.1.26/opalacoder/icon.png +0 -0
  50. opalacoder-0.1.26/opalacoder/structured.py +0 -104
  51. {opalacoder-0.1.26 → opalacoder-0.2.2}/.claude/rules/RULES.md +0 -0
  52. {opalacoder-0.1.26 → opalacoder-0.2.2}/.claude/settings.json +0 -0
  53. {opalacoder-0.1.26 → opalacoder-0.2.2}/.github/workflows/publish.yml +0 -0
  54. {opalacoder-0.1.26 → opalacoder-0.2.2}/.gitignore +0 -0
  55. {opalacoder-0.1.26 → opalacoder-0.2.2}/AGENTS.md +0 -0
  56. {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/100.png +0 -0
  57. {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/102.png +0 -0
  58. {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/1024.png +0 -0
  59. {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/108.png +0 -0
  60. {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/114.png +0 -0
  61. {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/120.png +0 -0
  62. {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/128.png +0 -0
  63. {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/144.png +0 -0
  64. {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/152.png +0 -0
  65. {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/16.png +0 -0
  66. {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/167.png +0 -0
  67. {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/172.png +0 -0
  68. {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/180.png +0 -0
  69. {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/196.png +0 -0
  70. {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/20.png +0 -0
  71. {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/216.png +0 -0
  72. {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/234.png +0 -0
  73. {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/256.png +0 -0
  74. {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/258.png +0 -0
  75. {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/29.png +0 -0
  76. {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/32.png +0 -0
  77. {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/40.png +0 -0
  78. {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/48.png +0 -0
  79. {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/50.png +0 -0
  80. {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/512.png +0 -0
  81. {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/55.png +0 -0
  82. {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/57.png +0 -0
  83. {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/58.png +0 -0
  84. {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/60.png +0 -0
  85. {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/64.png +0 -0
  86. {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/66.png +0 -0
  87. {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/72.png +0 -0
  88. {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/76.png +0 -0
  89. {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/80.png +0 -0
  90. {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/87.png +0 -0
  91. {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/88.png +0 -0
  92. {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/92.png +0 -0
  93. {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/Assets.xcassets/AppIcon.appiconset/Contents.json +0 -0
  94. {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/android/mipmap-hdpi/ic_launcher.png +0 -0
  95. {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/android/mipmap-mdpi/ic_launcher.png +0 -0
  96. {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/android/mipmap-xhdpi/ic_launcher.png +0 -0
  97. {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/android/mipmap-xxhdpi/ic_launcher.png +0 -0
  98. {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/android/mipmap-xxxhdpi/ic_launcher.png +0 -0
  99. {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/appstore.png +0 -0
  100. {opalacoder-0.1.26 → opalacoder-0.2.2}/AppIcons/playstore.png +0 -0
  101. {opalacoder-0.1.26 → opalacoder-0.2.2}/README.md +0 -0
  102. {opalacoder-0.1.26 → opalacoder-0.2.2}/agents.yaml +0 -0
  103. {opalacoder-0.1.26 → opalacoder-0.2.2}/config.yaml +0 -0
  104. {opalacoder-0.1.26 → opalacoder-0.2.2}/debug/scratch_tail.py +0 -0
  105. {opalacoder-0.1.26 → opalacoder-0.2.2}/docs/guide/analysis_results.md +0 -0
  106. {opalacoder-0.1.26 → opalacoder-0.2.2}/docs/guide/figs/logotipo.png +0 -0
  107. {opalacoder-0.1.26 → opalacoder-0.2.2}/docs/guide/paper_memplan.md +0 -0
  108. {opalacoder-0.1.26 → opalacoder-0.2.2}/docs/guide/skills-plugin-system.md +0 -0
  109. {opalacoder-0.1.26 → opalacoder-0.2.2}/docs/specs/01-arquitetura.md +0 -0
  110. {opalacoder-0.1.26 → opalacoder-0.2.2}/docs/specs/02-memgpt-orquestrador.md +0 -0
  111. {opalacoder-0.1.26 → opalacoder-0.2.2}/docs/specs/03-skill-implement-feature.md +0 -0
  112. {opalacoder-0.1.26 → opalacoder-0.2.2}/docs/specs/04-memoria.md +0 -0
  113. {opalacoder-0.1.26 → opalacoder-0.2.2}/docs/specs/05-vcs-sombra.md +0 -0
  114. {opalacoder-0.1.26 → opalacoder-0.2.2}/docs/specs/06-skills-e-plugins.md +0 -0
  115. {opalacoder-0.1.26 → opalacoder-0.2.2}/docs/specs/08-ide.md +0 -0
  116. {opalacoder-0.1.26 → opalacoder-0.2.2}/docs/specs/09-ide-projectcreationinterface.md +0 -0
  117. {opalacoder-0.1.26 → opalacoder-0.2.2}/docs/specs/README.md +0 -0
  118. {opalacoder-0.1.26 → opalacoder-0.2.2}/docs/specs/backlog_register.md +0 -0
  119. {opalacoder-0.1.26 → opalacoder-0.2.2}/gui_src/index.html +0 -0
  120. {opalacoder-0.1.26 → opalacoder-0.2.2}/gui_src/package-lock.json +0 -0
  121. {opalacoder-0.1.26 → opalacoder-0.2.2}/gui_src/package.json +0 -0
  122. {opalacoder-0.1.26 → opalacoder-0.2.2}/gui_src/src/main.jsx +0 -0
  123. {opalacoder-0.1.26 → opalacoder-0.2.2}/main.py +0 -0
  124. {opalacoder-0.1.26 → opalacoder-0.2.2}/opalacoder/__init__.py +0 -0
  125. {opalacoder-0.1.26 → opalacoder-0.2.2}/opalacoder/api_keys.py +0 -0
  126. {opalacoder-0.1.26 → opalacoder-0.2.2}/opalacoder/archival.py +0 -0
  127. {opalacoder-0.1.26 → opalacoder-0.2.2}/opalacoder/cli.py +0 -0
  128. {opalacoder-0.1.26 → opalacoder-0.2.2}/opalacoder/code_index.py +0 -0
  129. {opalacoder-0.1.26 → opalacoder-0.2.2}/opalacoder/i18n.py +0 -0
  130. {opalacoder-0.1.26 → opalacoder-0.2.2}/opalacoder/orchestrator.py +0 -0
  131. {opalacoder-0.1.26 → opalacoder-0.2.2}/opalacoder/planner.py +0 -0
  132. {opalacoder-0.1.26 → opalacoder-0.2.2}/opalacoder/plugins/__init__.py +0 -0
  133. {opalacoder-0.1.26 → opalacoder-0.2.2}/opalacoder/plugins/html_css_js_tools.py +0 -0
  134. {opalacoder-0.1.26 → opalacoder-0.2.2}/opalacoder/session.py +0 -0
  135. {opalacoder-0.1.26 → opalacoder-0.2.2}/opalacoder/skills.py +0 -0
  136. {opalacoder-0.1.26 → opalacoder-0.2.2}/opalacoder/terminal.py +0 -0
  137. {opalacoder-0.1.26 → opalacoder-0.2.2}/opalacoder/terminal_manager.py +0 -0
  138. {opalacoder-0.1.26 → opalacoder-0.2.2}/opalacoder/vcs.py +0 -0
  139. {opalacoder-0.1.26 → opalacoder-0.2.2}/opalacoder/vector_index.py +0 -0
  140. {opalacoder-0.1.26 → opalacoder-0.2.2}/opalacoder/workflow_tools.py +0 -0
  141. {opalacoder-0.1.26 → opalacoder-0.2.2}/pytest.ini +0 -0
  142. {opalacoder-0.1.26 → opalacoder-0.2.2}/requirements.txt +0 -0
  143. {opalacoder-0.1.26 → opalacoder-0.2.2}/skills/chat-orchestrator/SKILL.md +0 -0
  144. {opalacoder-0.1.26 → opalacoder-0.2.2}/skills/command-line/scripts/command_executor.py +0 -0
  145. {opalacoder-0.1.26 → opalacoder-0.2.2}/skills/skills_store/html-css-js/SKILL.md +0 -0
  146. {opalacoder-0.1.26 → opalacoder-0.2.2}/skills/skills_store/html-css-js/scripts/check_contracts.py +0 -0
  147. {opalacoder-0.1.26 → opalacoder-0.2.2}/skills/skills_store/implement-feature/SKILL.md +0 -0
  148. {opalacoder-0.1.26 → opalacoder-0.2.2}/skills/skills_store/implement-feature/scripts/run_workflow.py +0 -0
  149. {opalacoder-0.1.26 → opalacoder-0.2.2}/skills/view-editor/scripts/run_view_editor.py +0 -0
  150. {opalacoder-0.1.26 → opalacoder-0.2.2}/tests/test_agent_config.py +0 -0
  151. {opalacoder-0.1.26 → opalacoder-0.2.2}/tests/test_command_line_skill.py +0 -0
  152. {opalacoder-0.1.26 → opalacoder-0.2.2}/tests/test_complexity_evaluator.py +0 -0
  153. {opalacoder-0.1.26 → opalacoder-0.2.2}/tests/test_context_guard.py +0 -0
  154. {opalacoder-0.1.26 → opalacoder-0.2.2}/tests/test_file_delete.py +0 -0
  155. {opalacoder-0.1.26 → opalacoder-0.2.2}/tests/test_i18n_coverage.py +0 -0
  156. {opalacoder-0.1.26 → opalacoder-0.2.2}/tests/test_implement_feature_script.py +0 -0
  157. {opalacoder-0.1.26 → opalacoder-0.2.2}/tests/test_memgpt_runtime.py +0 -0
  158. {opalacoder-0.1.26 → opalacoder-0.2.2}/tests/test_planner_oracle_live.py +0 -0
  159. {opalacoder-0.1.26 → opalacoder-0.2.2}/tests/test_planner_output.py +0 -0
  160. {opalacoder-0.1.26 → opalacoder-0.2.2}/tests/test_project_store.py +0 -0
  161. {opalacoder-0.1.26 → opalacoder-0.2.2}/tests/test_refinement_loop.py +0 -0
  162. {opalacoder-0.1.26 → opalacoder-0.2.2}/tests/test_skills_directory_loader.py +0 -0
  163. {opalacoder-0.1.26 → opalacoder-0.2.2}/tests/test_unhashable_dict_bug.py +0 -0
  164. {opalacoder-0.1.26 → opalacoder-0.2.2}/tests/test_verification_strategies.py +0 -0
  165. {opalacoder-0.1.26 → opalacoder-0.2.2}/tests/test_view_editor_skill.py +0 -0
Binary file
Binary file
@@ -2,10 +2,13 @@
2
2
 
3
3
  1. Don't make baseless assumptions; before drawing any conclusions, conduct tests and analysis to gather as much information as possible.
4
4
 
5
+ 2. Dever apply direct patch ou modifications in external lib without user authorization.
6
+
7
+ 3. Dont call directly litellm (always use agenticblocks). If need same feature dont supported by agenticblocks, alert me and ask me about to do.
8
+
5
9
  # Project Guide
6
10
 
7
11
  ## Language
8
-
9
12
  All code, comments, and documentation must be written in **English**.
10
13
 
11
14
  ## Architecture
@@ -2,6 +2,10 @@
2
2
 
3
3
  1. Don't make baseless assumptions; before drawing any conclusions, conduct tests and analysis to gather as much information as possible.
4
4
 
5
+ 2. Dever apply direct patch ou modifications in external lib without user authorization.
6
+
7
+ 3. Dont call directly litellm (always use agenticblocks). If need same feature dont supported by agenticblocks, alert me and ask me about to do.
8
+
5
9
  # Project Guide
6
10
 
7
11
  ## Language
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: opalacoder
3
- Version: 0.1.26
3
+ Version: 0.2.2
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
@@ -0,0 +1,43 @@
1
+ import asyncio
2
+ import os
3
+ import litellm
4
+ from litellm.integrations.custom_logger import CustomLogger
5
+
6
+ class MyCustomHandler(CustomLogger):
7
+ def log_success_event(self, kwargs, response_obj, start_time, end_time):
8
+ print("--- log_success_event triggered! ---")
9
+
10
+ async def async_log_success_event(self, kwargs, response_obj, start_time, end_time):
11
+ print("--- async_log_success_event triggered! ---")
12
+
13
+ litellm.callbacks = [MyCustomHandler()]
14
+ # Set environment variables for debug logging
15
+ os.environ['LITELLM_LOG'] = 'DEBUG'
16
+
17
+ async def main():
18
+ # We will use the same router setup as agenticblocks
19
+ router = litellm.Router(
20
+ model_list=[{
21
+ "model_name": "openai/unsloth/gpt-oss-20b-GGUF:Q4_1",
22
+ "litellm_params": {
23
+ "model": "openai/unsloth/gpt-oss-20b-GGUF:Q4_1",
24
+ "api_base": "http://localhost:8080/v1",
25
+ "api_key": "test"
26
+ },
27
+ }]
28
+ )
29
+ print("Callbacks in litellm:", litellm.callbacks)
30
+ try:
31
+ # Call via router
32
+ response = await router.acompletion(
33
+ model="openai/unsloth/gpt-oss-20b-GGUF:Q4_1",
34
+ messages=[{"role": "user", "content": "hello"}],
35
+ api_base="http://localhost:8080/v1",
36
+ api_key="test",
37
+ mock_response="Hello back!"
38
+ )
39
+ print("Response received:", response)
40
+ except Exception as e:
41
+ print("Error during completion:", e)
42
+
43
+ asyncio.run(main())
@@ -0,0 +1,47 @@
1
+ import asyncio
2
+ import httpx
3
+
4
+ async def main():
5
+ # Start the IDE server in a background task
6
+ from opalacoder.ide_server import start_gui_server
7
+
8
+ # We will patch start_gui_server or run it directly on port 3005
9
+ print("Starting GUI server on port 3005...")
10
+ # Run the server startup in a separate thread/task
11
+
12
+ # Set up project path
13
+ project_path = "/home/gilzamir/projetos/OpalaCoder"
14
+ project_name = "bobenglish"
15
+
16
+ # Make a run request
17
+ url = "http://127.0.0.1:3005/api/opalacoder/run"
18
+ payload = {
19
+ "command": "run",
20
+ "agent": "chat_orchestrator",
21
+ "prompt": "Olá",
22
+ "project_name": project_name,
23
+ "project_path": project_path,
24
+ "model": "ollama/gemma4:latest", # or any dummy/mock model
25
+ }
26
+
27
+ # We'll start the server and wait 2 seconds
28
+ server_task = asyncio.create_task(asyncio.to_thread(start_gui_server, "127.0.0.1", 3005))
29
+ await asyncio.sleep(3)
30
+
31
+ print("Sending request to /api/opalacoder/run...")
32
+ try:
33
+ async with httpx.AsyncClient(timeout=60.0) as client:
34
+ async with client.stream("POST", url, json=payload) as response:
35
+ print("Response status:", response.status_code)
36
+ async for line in response.aiter_lines():
37
+ if line.strip():
38
+ print("STREAM LINE:", line)
39
+ except Exception as e:
40
+ print("Error during request:", e)
41
+ finally:
42
+ server_task.cancel()
43
+
44
+ try:
45
+ asyncio.run(main())
46
+ except Exception as e:
47
+ print("Finished:", e)
@@ -141,7 +141,223 @@ De `build_parser` ([cli.py:419](../../opalacoder/cli.py#L419)):
141
141
 
142
142
  ---
143
143
 
144
- ## 5. Comandos do REPL
144
+ ## 5. AssetStore Repositório de Assets Reutilizáveis
145
+
146
+ > **Estado: IMPLEMENTADO**
147
+
148
+ ### Conceito
149
+
150
+ A AssetStore é um **repositório local de assets reutilizáveis** empacotados com o OpalaCoder. Ela serve como banco de dados de casos bem-sucedidos de configuração para modelos locais e como biblioteca de skills extras que podem ser instaladas sob demanda em qualquer projeto.
151
+
152
+ ```
153
+ opalacoder/assetstore/ ← instalado junto com o pacote pip
154
+ skills/
155
+ <ID>.zip ← árvore completa da skill
156
+ <ID>.metadata ← metadados YAML
157
+ modelconfigs/
158
+ <ID>.zip ← único arquivo .yaml de configuração
159
+ <ID>.metadata ← metadados YAML
160
+ ```
161
+
162
+ O caminho base é sempre `Path(__file__).parent / "assetstore"`, portanto funciona corretamente quando instalado via `pip install opalacoder` em qualquer máquina.
163
+
164
+ ### Formato dos metadados (`.metadata`)
165
+
166
+ Arquivo YAML com os campos:
167
+
168
+ | Campo | Obrigatório | Descrição |
169
+ |---|---|---|
170
+ | `id` | ✓ | Identificador único do asset (ex: `skill_implement_feature`) |
171
+ | `type` | ✓ | `skill` ou `modelconfig` |
172
+ | `desc` | ✓ | Descrição legível usada como critério de busca |
173
+ | `name` | skill | Nome da skill (igual ao diretório dentro do zip) |
174
+ | `model` | modelconfig | Identificador do modelo (ex: `ollama/gpt-oss:latest`) |
175
+
176
+ **Exemplo — skill:**
177
+ ```yaml
178
+ id: skill_implement_feature
179
+ type: skill
180
+ name: implement-feature
181
+ desc: Plan-Execute-Verify loop for implementing features and fixing bugs in project files
182
+ ```
183
+
184
+ **Exemplo — modelconfig:**
185
+ ```yaml
186
+ id: model_ollama_gpt_oss__latest
187
+ type: modelconfig
188
+ desc: gpt-oss:latest via Ollama — think=false, tool calling stable
189
+ model: ollama/gpt-oss:latest
190
+ ```
191
+
192
+ ### Destino de instalação
193
+
194
+ | Tipo | Destino no projeto |
195
+ |---|---|
196
+ | `skill` | `<projeto>/.opalacoder/skills/<name>/` |
197
+ | `modelconfig` | `<projeto>/.opalacoder/modelsconfig/<provider>/<modelo>.yaml` |
198
+
199
+ Para modelconfigs, o provider é normalizado: `ollama_chat/` e `ollama/` → diretório `ollama/`. Os dois pontos no nome do modelo viram `__`.
200
+
201
+ ### Comandos REPL
202
+
203
+ ```
204
+ /list_assets [tipo] — lista todos os assets (ou só do tipo especificado)
205
+ /load_asset <tipo> <desc|id|*> — instala asset(s) no projeto ativo
206
+ ```
207
+
208
+ `<desc>` pode ser o `id` exato ou o valor do campo `desc`. Usar `*` instala todos os assets do tipo.
209
+
210
+ **Exemplos:**
211
+ ```
212
+ /list_assets
213
+ /list_assets modelconfig
214
+ /load_asset skill skill_implement_feature
215
+ /load_asset modelconfig model_ollama_gpt_oss__latest
216
+ /load_asset skill *
217
+ ```
218
+
219
+ Após instalar uma skill, ativá-la no projeto com `/addskill <name>`.
220
+
221
+ ---
222
+
223
+ ## 5.1. Banco de Configurações Refinadas de Modelos
224
+
225
+ > **Estado: IMPLEMENTADO**
226
+
227
+ ### Conceito
228
+
229
+ O diretório `.opalacoder/modelsconfig/` dentro de cada projeto funciona como um
230
+ **banco de dados de casos bem-sucedidos de configuração para modelos locais**. Cada
231
+ arquivo YAML registra os parâmetros que produziram comportamento correto e estável
232
+ para um modelo específico naquele projeto — resultado de testes empíricos, não de
233
+ valores genéricos.
234
+
235
+ A motivação é que modelos locais (Ollama, LM Studio, etc.) exigem combinações
236
+ precisas de parâmetros para funcionar bem: `think` e `stream` podem quebrar
237
+ tool calling em certos modelos; `num_ctx` muito baixo degrada o raciocínio;
238
+ `temperature` alta pode destabilizar modelos de instrução. Esses parâmetros
239
+ **não são portáveis** — o que funciona para `deepseek-r1:14b` não funciona para
240
+ `ministral-3:14b`. O banco de configurações resolve isso por projeto.
241
+
242
+ ### Estrutura de diretórios
243
+
244
+ ```
245
+ <projeto>/
246
+ └── .opalacoder/
247
+ └── modelsconfig/
248
+ └── <provider>/
249
+ └── <nome_do_modelo>.yaml
250
+ ```
251
+
252
+ - **`<provider>`**: prefixo do modelo, com normalização — `ollama_chat/` e `ollama/`
253
+ mapeiam ambos para o diretório `ollama/`.
254
+ - **`<nome_do_modelo>.yaml`**: nome do modelo com `:` substituído por `__`
255
+ (hífens mantidos).
256
+
257
+ **Exemplos de mapeamento:**
258
+
259
+ | Modelo digitado | Diretório | Arquivo |
260
+ |---|---|---|
261
+ | `ollama/deepseek-r1:14b` | `ollama/` | `deepseek-r1__14b.yaml` |
262
+ | `ollama_chat/deepseek-r1:14b` | `ollama/` | `deepseek-r1__14b.yaml` |
263
+ | `ollama/ministral-3:14b` | `ollama/` | `ministral-3__14b.yaml` |
264
+ | `ollama/qwen3:14b` | `ollama/` | `qwen3__14b.yaml` |
265
+
266
+ ### Formato do arquivo YAML
267
+
268
+ O arquivo pode conter qualquer chave de `model_params` aceita pelo sistema, mais
269
+ uma chave especial `provider`:
270
+
271
+ ```yaml
272
+ # .opalacoder/modelsconfig/ollama/deepseek-r1__14b.yaml
273
+ # Configuração refinada para DeepSeek-R1 14B via Ollama
274
+ # Obtida empiricamente — funciona com tool calling e thinking em tempo real
275
+
276
+ provider: ollama_chat # opcional: substitui o prefixo do modelo na sessão
277
+ # aqui muda de ollama/ para ollama_chat/ para habilitar
278
+ # o endpoint nativo do Ollama com thinking por chunk
279
+
280
+ # LiteLLM / model_kwargs
281
+ think: true
282
+ stream: true
283
+ temperature: 0.6
284
+ num_ctx: 32768
285
+ max_tokens: 8192
286
+
287
+ # Parâmetros do agente
288
+ max_heartbeats: 15
289
+ ```
290
+
291
+ ```yaml
292
+ # .opalacoder/modelsconfig/ollama/ministral-3__14b.yaml
293
+ # Ministral 3 14B — sem thinking (não suportado), tool calling estável
294
+
295
+ think: false
296
+ stream: false
297
+ temperature: 0.7
298
+ num_ctx: 16384
299
+ max_tokens: 8128
300
+ max_heartbeats: 20
301
+ ```
302
+
303
+ **Chave `provider`** (opcional): quando presente, substitui o prefixo do modelo
304
+ na interface. Útil para forçar `ollama_chat/` em modelos com suporte a thinking
305
+ nativo, sem o usuário precisar digitar o prefixo correto.
306
+
307
+ ### Como usar
308
+
309
+ Na janela de **criação** ou **configuração** de projeto, após definir o modelo,
310
+ clique em **Load Refined Config**:
311
+
312
+ - Se existir um arquivo para o modelo: carrega e substitui completamente o
313
+ `model_params` do projeto. Se o YAML tiver `provider:`, atualiza o campo
314
+ modelo com o novo prefixo.
315
+ - Se não existir: exibe `--- ainda não temos parâmetros refinados para este modelo`.
316
+
317
+ O backend resolve o arquivo via `GET/POST /api/opalacoder/model-config`
318
+ ([ide_server.py](../../opalacoder/ide_server.py)).
319
+
320
+ ### Critério para adicionar uma entrada
321
+
322
+ Uma entrada deve ser adicionada ao banco quando:
323
+
324
+ 1. O modelo foi testado com a configuração e **tool calling funciona** sem erros.
325
+ 2. O comportamento de **thinking/reflection** (se aplicável) está correto.
326
+ 3. Os valores de **contexto e tokens** são adequados ao hardware disponível.
327
+
328
+ O arquivo é mantido manualmente pelo usuário/equipe e versionado junto com o
329
+ projeto. Não é gerado automaticamente.
330
+
331
+ ### Exemplo completo — `gpt-oss:latest` (Ollama)
332
+
333
+ ```yaml
334
+ # .opalacoder/modelsconfig/ollama/gpt-oss__latest.yaml
335
+ #
336
+ # Configuração refinada para gpt-oss:latest via Ollama
337
+ # Testado em: 2026-06-02 | Hardware: RTX 4090 24GB
338
+ # Status: tool calling OK, thinking OK, stream OK
339
+ #
340
+ provider: ollama_chat # endpoint nativo: thinking por chunk em tempo real
341
+
342
+ # LiteLLM / model_kwargs
343
+ think: false # desativar thinking evita bug de tool_calls vazio (ollama #15288)
344
+ stream: false # stream false: mais estável com tool calling
345
+ temperature: 0.1 # baixo para respostas determinísticas em tarefas de código
346
+ num_ctx: 32768 # contexto amplo para projetos grandes
347
+ max_tokens: 8192
348
+
349
+ # Parâmetros do agente MemGPT (chat-orquestrador)
350
+ max_heartbeats: 20
351
+ max_context_tokens: 32768
352
+
353
+ # Parâmetros do agente LLMAgentBlock (workers)
354
+ max_tool_calls: 10
355
+ debug: false
356
+ ```
357
+
358
+ ---
359
+
360
+ ## 6. Comandos do REPL
145
361
 
146
362
  Registrados em [cli_commands.py](../../opalacoder/cli_commands.py):
147
363