opalacoder 0.1.20__tar.gz → 0.1.22__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 (100) hide show
  1. {opalacoder-0.1.20 → opalacoder-0.1.22}/PKG-INFO +1 -1
  2. opalacoder-0.1.20/opalacoder/gui/assets/index-BLhtmpm0.js → opalacoder-0.1.22/opalacoder/gui/assets/index-BCdp1z3q.js +1 -1
  3. {opalacoder-0.1.20 → opalacoder-0.1.22}/opalacoder/gui/index.html +1 -1
  4. {opalacoder-0.1.20 → opalacoder-0.1.22}/pyproject.toml +1 -1
  5. {opalacoder-0.1.20 → opalacoder-0.1.22}/.claude/rules/RULES.md +0 -0
  6. {opalacoder-0.1.20 → opalacoder-0.1.22}/.claude/settings.json +0 -0
  7. {opalacoder-0.1.20 → opalacoder-0.1.22}/.github/workflows/publish.yml +0 -0
  8. {opalacoder-0.1.20 → opalacoder-0.1.22}/.gitignore +0 -0
  9. {opalacoder-0.1.20 → opalacoder-0.1.22}/AGENTS.md +0 -0
  10. {opalacoder-0.1.20 → opalacoder-0.1.22}/CLAUDE.md +0 -0
  11. {opalacoder-0.1.20 → opalacoder-0.1.22}/GEMINI.md +0 -0
  12. {opalacoder-0.1.20 → opalacoder-0.1.22}/README.md +0 -0
  13. {opalacoder-0.1.20 → opalacoder-0.1.22}/agents.yaml +0 -0
  14. {opalacoder-0.1.20 → opalacoder-0.1.22}/config.yaml +0 -0
  15. {opalacoder-0.1.20 → opalacoder-0.1.22}/debug/scratch_tail.py +0 -0
  16. {opalacoder-0.1.20 → opalacoder-0.1.22}/docs/guide/analysis_results.md +0 -0
  17. {opalacoder-0.1.20 → opalacoder-0.1.22}/docs/guide/figs/logotipo.png +0 -0
  18. {opalacoder-0.1.20 → opalacoder-0.1.22}/docs/guide/paper_memplan.md +0 -0
  19. {opalacoder-0.1.20 → opalacoder-0.1.22}/docs/guide/skills-plugin-system.md +0 -0
  20. {opalacoder-0.1.20 → opalacoder-0.1.22}/docs/specs/01-arquitetura.md +0 -0
  21. {opalacoder-0.1.20 → opalacoder-0.1.22}/docs/specs/02-memgpt-orquestrador.md +0 -0
  22. {opalacoder-0.1.20 → opalacoder-0.1.22}/docs/specs/03-skill-implement-feature.md +0 -0
  23. {opalacoder-0.1.20 → opalacoder-0.1.22}/docs/specs/04-memoria.md +0 -0
  24. {opalacoder-0.1.20 → opalacoder-0.1.22}/docs/specs/05-vcs-sombra.md +0 -0
  25. {opalacoder-0.1.20 → opalacoder-0.1.22}/docs/specs/06-skills-e-plugins.md +0 -0
  26. {opalacoder-0.1.20 → opalacoder-0.1.22}/docs/specs/07-configuracao.md +0 -0
  27. {opalacoder-0.1.20 → opalacoder-0.1.22}/docs/specs/08-ide.md +0 -0
  28. {opalacoder-0.1.20 → opalacoder-0.1.22}/docs/specs/09-ide-projectcreationinterface.md +0 -0
  29. {opalacoder-0.1.20 → opalacoder-0.1.22}/docs/specs/README.md +0 -0
  30. {opalacoder-0.1.20 → opalacoder-0.1.22}/docs/specs/backlog_register.md +0 -0
  31. {opalacoder-0.1.20 → opalacoder-0.1.22}/gui_src/index.html +0 -0
  32. {opalacoder-0.1.20 → opalacoder-0.1.22}/gui_src/package-lock.json +0 -0
  33. {opalacoder-0.1.20 → opalacoder-0.1.22}/gui_src/package.json +0 -0
  34. {opalacoder-0.1.20 → opalacoder-0.1.22}/gui_src/src/App.jsx +6 -6
  35. {opalacoder-0.1.20 → opalacoder-0.1.22}/gui_src/src/index.css +0 -0
  36. {opalacoder-0.1.20 → opalacoder-0.1.22}/gui_src/src/main.jsx +0 -0
  37. {opalacoder-0.1.20 → opalacoder-0.1.22}/gui_src/vite.config.js +0 -0
  38. {opalacoder-0.1.20 → opalacoder-0.1.22}/main.py +0 -0
  39. {opalacoder-0.1.20 → opalacoder-0.1.22}/opalacoder/__init__.py +0 -0
  40. {opalacoder-0.1.20 → opalacoder-0.1.22}/opalacoder/agent_stdin.py +0 -0
  41. {opalacoder-0.1.20 → opalacoder-0.1.22}/opalacoder/agents.py +0 -0
  42. {opalacoder-0.1.20 → opalacoder-0.1.22}/opalacoder/api_keys.py +0 -0
  43. {opalacoder-0.1.20 → opalacoder-0.1.22}/opalacoder/archival.py +0 -0
  44. {opalacoder-0.1.20 → opalacoder-0.1.22}/opalacoder/cli.py +0 -0
  45. {opalacoder-0.1.20 → opalacoder-0.1.22}/opalacoder/cli_commands.py +0 -0
  46. {opalacoder-0.1.20 → opalacoder-0.1.22}/opalacoder/code_index.py +0 -0
  47. {opalacoder-0.1.20 → opalacoder-0.1.22}/opalacoder/config.py +0 -0
  48. {opalacoder-0.1.20 → opalacoder-0.1.22}/opalacoder/copy_gui.py +0 -0
  49. {opalacoder-0.1.20 → opalacoder-0.1.22}/opalacoder/embeddings.py +0 -0
  50. {opalacoder-0.1.20 → opalacoder-0.1.22}/opalacoder/gui/assets/index-fY3LKaOS.css +0 -0
  51. {opalacoder-0.1.20 → opalacoder-0.1.22}/opalacoder/i18n.py +0 -0
  52. {opalacoder-0.1.20 → opalacoder-0.1.22}/opalacoder/ide_server.py +0 -0
  53. {opalacoder-0.1.20 → opalacoder-0.1.22}/opalacoder/memgpt_runtime.py +0 -0
  54. {opalacoder-0.1.20 → opalacoder-0.1.22}/opalacoder/orchestrator.py +0 -0
  55. {opalacoder-0.1.20 → opalacoder-0.1.22}/opalacoder/planner.py +0 -0
  56. {opalacoder-0.1.20 → opalacoder-0.1.22}/opalacoder/plugins/__init__.py +0 -0
  57. {opalacoder-0.1.20 → opalacoder-0.1.22}/opalacoder/plugins/html_css_js_tools.py +0 -0
  58. {opalacoder-0.1.20 → opalacoder-0.1.22}/opalacoder/project.py +0 -0
  59. {opalacoder-0.1.20 → opalacoder-0.1.22}/opalacoder/session.py +0 -0
  60. {opalacoder-0.1.20 → opalacoder-0.1.22}/opalacoder/skills.py +0 -0
  61. {opalacoder-0.1.20 → opalacoder-0.1.22}/opalacoder/structured.py +0 -0
  62. {opalacoder-0.1.20 → opalacoder-0.1.22}/opalacoder/terminal.py +0 -0
  63. {opalacoder-0.1.20 → opalacoder-0.1.22}/opalacoder/terminal_manager.py +0 -0
  64. {opalacoder-0.1.20 → opalacoder-0.1.22}/opalacoder/tools.py +0 -0
  65. {opalacoder-0.1.20 → opalacoder-0.1.22}/opalacoder/vcs.py +0 -0
  66. {opalacoder-0.1.20 → opalacoder-0.1.22}/opalacoder/vector_index.py +0 -0
  67. {opalacoder-0.1.20 → opalacoder-0.1.22}/opalacoder/workflow_orchestrator.py +0 -0
  68. {opalacoder-0.1.20 → opalacoder-0.1.22}/opalacoder/workflow_tools.py +0 -0
  69. {opalacoder-0.1.20 → opalacoder-0.1.22}/pytest.ini +0 -0
  70. {opalacoder-0.1.20 → opalacoder-0.1.22}/requirements.txt +0 -0
  71. {opalacoder-0.1.20 → opalacoder-0.1.22}/skills/chat-orchestrator/SKILL.md +0 -0
  72. {opalacoder-0.1.20 → opalacoder-0.1.22}/skills/command-line/SKILL.md +0 -0
  73. {opalacoder-0.1.20 → opalacoder-0.1.22}/skills/command-line/scripts/command_executor.py +0 -0
  74. {opalacoder-0.1.20 → opalacoder-0.1.22}/skills/skills_store/html-css-js/SKILL.md +0 -0
  75. {opalacoder-0.1.20 → opalacoder-0.1.22}/skills/skills_store/html-css-js/scripts/check_contracts.py +0 -0
  76. {opalacoder-0.1.20 → opalacoder-0.1.22}/skills/skills_store/implement-feature/SKILL.md +0 -0
  77. {opalacoder-0.1.20 → opalacoder-0.1.22}/skills/skills_store/implement-feature/scripts/run_workflow.py +0 -0
  78. {opalacoder-0.1.20 → opalacoder-0.1.22}/skills/view-editor/SKILL.md +0 -0
  79. {opalacoder-0.1.20 → opalacoder-0.1.22}/skills/view-editor/scripts/run_view_editor.py +0 -0
  80. {opalacoder-0.1.20 → opalacoder-0.1.22}/tests/test_agent_config.py +0 -0
  81. {opalacoder-0.1.20 → opalacoder-0.1.22}/tests/test_agent_stdin.py +0 -0
  82. {opalacoder-0.1.20 → opalacoder-0.1.22}/tests/test_code_index_integration.py +0 -0
  83. {opalacoder-0.1.20 → opalacoder-0.1.22}/tests/test_command_line_skill.py +0 -0
  84. {opalacoder-0.1.20 → opalacoder-0.1.22}/tests/test_complexity_evaluator.py +0 -0
  85. {opalacoder-0.1.20 → opalacoder-0.1.22}/tests/test_context_guard.py +0 -0
  86. {opalacoder-0.1.20 → opalacoder-0.1.22}/tests/test_file_delete.py +0 -0
  87. {opalacoder-0.1.20 → opalacoder-0.1.22}/tests/test_i18n_coverage.py +0 -0
  88. {opalacoder-0.1.20 → opalacoder-0.1.22}/tests/test_implement_feature_script.py +0 -0
  89. {opalacoder-0.1.20 → opalacoder-0.1.22}/tests/test_memgpt_runtime.py +0 -0
  90. {opalacoder-0.1.20 → opalacoder-0.1.22}/tests/test_model_commands.py +0 -0
  91. {opalacoder-0.1.20 → opalacoder-0.1.22}/tests/test_planner_oracle_live.py +0 -0
  92. {opalacoder-0.1.20 → opalacoder-0.1.22}/tests/test_planner_output.py +0 -0
  93. {opalacoder-0.1.20 → opalacoder-0.1.22}/tests/test_project_store.py +0 -0
  94. {opalacoder-0.1.20 → opalacoder-0.1.22}/tests/test_refinement_loop.py +0 -0
  95. {opalacoder-0.1.20 → opalacoder-0.1.22}/tests/test_search_bugs.py +0 -0
  96. {opalacoder-0.1.20 → opalacoder-0.1.22}/tests/test_skills_directory_loader.py +0 -0
  97. {opalacoder-0.1.20 → opalacoder-0.1.22}/tests/test_unhashable_dict_bug.py +0 -0
  98. {opalacoder-0.1.20 → opalacoder-0.1.22}/tests/test_verification_strategies.py +0 -0
  99. {opalacoder-0.1.20 → opalacoder-0.1.22}/tests/test_view_editor_skill.py +0 -0
  100. {opalacoder-0.1.20 → opalacoder-0.1.22}/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.20
3
+ Version: 0.1.22
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
@@ -209,7 +209,7 @@ WARNING: This link could potentially be dangerous`)){let r=window.open();if(r){t
209
209
  * Fabrice Bellard's javascript vt100 for jslinux:
210
210
  * http://bellard.org/jslinux/
211
211
  * Copyright (c) 2011 Fabrice Bellard
212
- */var Hx=2,Ux=1,Kx=class{activate(e){this._terminal=e}dispose(){}fit(){let e=this.proposeDimensions();if(!e||!this._terminal||isNaN(e.cols)||isNaN(e.rows))return;let t=this._terminal._core;(this._terminal.rows!==e.rows||this._terminal.cols!==e.cols)&&(t._renderService.clear(),this._terminal.resize(e.cols,e.rows))}proposeDimensions(){var u;if(!this._terminal||!this._terminal.element||!this._terminal.element.parentElement)return;let e=this._terminal._core._renderService.dimensions;if(e.css.cell.width===0||e.css.cell.height===0)return;let t=this._terminal.options.scrollback===0?0:((u=this._terminal.options.overviewRuler)==null?void 0:u.width)||14,r=window.getComputedStyle(this._terminal.element.parentElement),i=parseInt(r.getPropertyValue("height")),s=Math.max(0,parseInt(r.getPropertyValue("width"))),n=window.getComputedStyle(this._terminal.element),o={top:parseInt(n.getPropertyValue("padding-top")),bottom:parseInt(n.getPropertyValue("padding-bottom")),right:parseInt(n.getPropertyValue("padding-right")),left:parseInt(n.getPropertyValue("padding-left"))},l=o.top+o.bottom,c=o.right+o.left,a=i-l,d=s-c-t;return{cols:Math.max(Hx,Math.floor(d/e.css.cell.width)),rows:Math.max(Ux,Math.floor(a/e.css.cell.height))}}};const lo=(e,t)=>{try{const r=localStorage.getItem(e);return r!==null?r:t}catch{return t}},ki=(e,t)=>{try{localStorage.setItem(e,t)}catch{}};function Vx(){var Lu,Tu,Nu,Bu,Ou,Au;const[e,t]=R.useState([]),[r,i]=R.useState(null),[s,n]=R.useState([]),[o,l]=R.useState(null),[c,a]=R.useState(""),[d,u]=R.useState([]),[f,v]=R.useState({}),[g,S]=R.useState(null),[T,m]=R.useState(!1),[_,y]=R.useState([]),[x,b]=R.useState(""),[M,B]=R.useState(!1),[$,G]=R.useState([]),[F,Q]=R.useState(!1),[z,L]=R.useState(!0),[j,E]=R.useState("explorer"),[N,V]=R.useState("output"),[C,I]=R.useState([]),[K,H]=R.useState([]),[Y,re]=R.useState(!1),[le,ue]=R.useState("");R.useEffect(()=>{Nl||ue("")},[Nl]);const[be,Ve]=R.useState(!1),[zt,Dt]=R.useState("preferences"),[Gt,Gr]=R.useState(()=>lo("theme","dark")),[$t,ie]=R.useState(()=>Number(lo("editorFontSize",13))),[wi,fg]=R.useState(()=>Number(lo("editorTabSize",4))),[nu,pg]=R.useState(()=>lo("editorWordWrap","on")),[ns,ou]=R.useState([]),[os,lu]=R.useState(""),[kl,au]=R.useState(!1),[El,cu]=R.useState(!1),[Cn,bn]=R.useState(""),[hu,Pl]=R.useState(""),[_g,kn]=R.useState(!1),ls=R.useRef(null),as=R.useRef(null),En=R.useRef(null),Pn=R.useRef(null),[uu,mg]=R.useState(260),[du,gg]=R.useState(320),[Dl,vg]=R.useState(240),[Ml,Rl]=R.useState(null),[Dn,fu]=R.useState(null),[ae,Qe]=R.useState(null);R.useEffect(()=>{ae||re(!1)},[ae]);const Ll=async()=>{if(r)try{const p=await fetch(`/api/opalacoder/problems?projectPath=${encodeURIComponent(r.project_path)}`);if(p.ok){const w=await p.json();I(w.problems||[])}}catch(p){console.error("Failed to fetch problems",p)}},Tl=(p,w)=>{p.preventDefault();const k=p.clientX,P=p.clientY,q=uu,oe=du,se=Dl,ve=Ft=>{if(w==="left"){const dt=Ft.clientX-k,xr=Math.max(150,Math.min(600,q+dt));mg(xr)}else if(w==="right"){const dt=Ft.clientX-k,xr=Math.max(200,Math.min(600,oe-dt));gg(xr)}else if(w==="bottom"){const dt=Ft.clientY-P,xr=Math.max(100,Math.min(600,se-dt));vg(xr)}},Ze=()=>{document.removeEventListener("mousemove",ve),document.removeEventListener("mouseup",Ze)};document.addEventListener("mousemove",ve),document.addEventListener("mouseup",Ze)},[Nl,Mn]=R.useState(!1),[Rn,pu]=R.useState(""),[Bl,_u]=R.useState(""),[mu,gu]=R.useState(""),[vu,yg]=R.useState("gemini/gemini-2.5-flash"),[yu,Sg]=R.useState("auto"),[Su,wu]=R.useState(""),[xu,Cu]=R.useState("http://localhost:11434/v1"),bu=R.useRef(null),ku=R.useRef(null),Ln=R.useRef(null),wg=(p,w)=>{Ln.current=p};R.useEffect(()=>{Tn(),(async()=>{try{const w=await fetch("/api/settings/check-dependencies");w.ok&&((await w.json()).installed||kn(!0))}catch(w){console.error("Failed to check optional dependencies",w)}})()},[]),R.useEffect(()=>{r?(cs(),Ll(),y([{role:"assistant",content:`Olá! Estou pronto para auxiliar no projeto **${r.project_name||r.name}**.`}])):(n([]),l(null),a(""),u([]),v({}),I([]))},[r]),R.useEffect(()=>{const p=k=>{k.preventDefault()};document.addEventListener("contextmenu",p);const w=()=>{Rl(null)};return document.addEventListener("click",w),()=>{document.removeEventListener("contextmenu",p),document.removeEventListener("click",w)}},[]),R.useEffect(()=>{var p;(p=bu.current)==null||p.scrollIntoView({behavior:"smooth"})},[_]),R.useEffect(()=>{var p;(p=ku.current)==null||p.scrollIntoView({behavior:"smooth"})},[$]),R.useEffect(()=>{const p=w=>{(w.ctrlKey||w.metaKey)&&w.key==="s"?(w.preventDefault(),Du()):(w.ctrlKey||w.metaKey)&&(w.key==="+"||w.key==="=")?(w.preventDefault(),ie(k=>{const P=Math.min(30,k+1);return ki("editorFontSize",P),P})):(w.ctrlKey||w.metaKey)&&w.key==="-"&&(w.preventDefault(),ie(k=>{const P=Math.max(10,k-1);return ki("editorFontSize",P),P}))};return window.addEventListener("keydown",p),()=>window.removeEventListener("keydown",p)},[o,c,r]),R.useEffect(()=>{if(!r){En.current&&(En.current.close(),En.current=null);return}if(!ls.current)return;const p=new Wx({cursorBlink:!0,fontSize:13,fontFamily:'Consolas, "Courier New", monospace',theme:{background:"#1e1e1e",foreground:"#cccccc"}}),w=new Kx;p.loadAddon(w),ls.current.innerHTML="",p.open(ls.current);try{w.fit()}catch{}as.current=p,Pn.current=w;const k=r.project_path,P=`/api/terminal/stream?projectPath=${encodeURIComponent(k)}`,q=new EventSource(P);En.current=q,q.onmessage=se=>{try{const ve=se.data,Ze=atob(ve),Ft=new Uint8Array(Ze.length);for(let dt=0;dt<Ze.length;dt++)Ft[dt]=Ze.charCodeAt(dt);p.write(Ft)}catch(ve){console.error("Error decoding terminal stream data",ve)}},q.onerror=se=>{console.error("Terminal event source error",se),p.write(`\r
212
+ */var Hx=2,Ux=1,Kx=class{activate(e){this._terminal=e}dispose(){}fit(){let e=this.proposeDimensions();if(!e||!this._terminal||isNaN(e.cols)||isNaN(e.rows))return;let t=this._terminal._core;(this._terminal.rows!==e.rows||this._terminal.cols!==e.cols)&&(t._renderService.clear(),this._terminal.resize(e.cols,e.rows))}proposeDimensions(){var u;if(!this._terminal||!this._terminal.element||!this._terminal.element.parentElement)return;let e=this._terminal._core._renderService.dimensions;if(e.css.cell.width===0||e.css.cell.height===0)return;let t=this._terminal.options.scrollback===0?0:((u=this._terminal.options.overviewRuler)==null?void 0:u.width)||14,r=window.getComputedStyle(this._terminal.element.parentElement),i=parseInt(r.getPropertyValue("height")),s=Math.max(0,parseInt(r.getPropertyValue("width"))),n=window.getComputedStyle(this._terminal.element),o={top:parseInt(n.getPropertyValue("padding-top")),bottom:parseInt(n.getPropertyValue("padding-bottom")),right:parseInt(n.getPropertyValue("padding-right")),left:parseInt(n.getPropertyValue("padding-left"))},l=o.top+o.bottom,c=o.right+o.left,a=i-l,d=s-c-t;return{cols:Math.max(Hx,Math.floor(d/e.css.cell.width)),rows:Math.max(Ux,Math.floor(a/e.css.cell.height))}}};const lo=(e,t)=>{try{const r=localStorage.getItem(e);return r!==null?r:t}catch{return t}},ki=(e,t)=>{try{localStorage.setItem(e,t)}catch{}};function Vx(){var Lu,Tu,Nu,Bu,Ou,Au;const[e,t]=R.useState([]),[r,i]=R.useState(null),[s,n]=R.useState([]),[o,l]=R.useState(null),[c,a]=R.useState(""),[d,u]=R.useState([]),[f,v]=R.useState({}),[g,S]=R.useState(null),[T,m]=R.useState(!1),[_,y]=R.useState([]),[x,b]=R.useState(""),[M,B]=R.useState(!1),[$,G]=R.useState([]),[F,Q]=R.useState(!1),[z,L]=R.useState(!0),[j,E]=R.useState("explorer"),[N,V]=R.useState("output"),[C,I]=R.useState([]),[K,H]=R.useState([]),[Y,re]=R.useState(!1),[le,ue]=R.useState(""),[be,Ve]=R.useState(!1),[zt,Dt]=R.useState("preferences"),[Gt,Gr]=R.useState(()=>lo("theme","dark")),[$t,ie]=R.useState(()=>Number(lo("editorFontSize",13))),[wi,fg]=R.useState(()=>Number(lo("editorTabSize",4))),[nu,pg]=R.useState(()=>lo("editorWordWrap","on")),[ns,ou]=R.useState([]),[os,lu]=R.useState(""),[kl,au]=R.useState(!1),[El,cu]=R.useState(!1),[Cn,bn]=R.useState(""),[hu,Pl]=R.useState(""),[_g,kn]=R.useState(!1),ls=R.useRef(null),as=R.useRef(null),En=R.useRef(null),Pn=R.useRef(null),[uu,mg]=R.useState(260),[du,gg]=R.useState(320),[Dl,vg]=R.useState(240),[Ml,Rl]=R.useState(null),[Dn,fu]=R.useState(null),[ae,Qe]=R.useState(null);R.useEffect(()=>{ae||re(!1)},[ae]);const Ll=async()=>{if(r)try{const p=await fetch(`/api/opalacoder/problems?projectPath=${encodeURIComponent(r.project_path)}`);if(p.ok){const w=await p.json();I(w.problems||[])}}catch(p){console.error("Failed to fetch problems",p)}},Tl=(p,w)=>{p.preventDefault();const k=p.clientX,P=p.clientY,q=uu,oe=du,se=Dl,ve=Ft=>{if(w==="left"){const dt=Ft.clientX-k,xr=Math.max(150,Math.min(600,q+dt));mg(xr)}else if(w==="right"){const dt=Ft.clientX-k,xr=Math.max(200,Math.min(600,oe-dt));gg(xr)}else if(w==="bottom"){const dt=Ft.clientY-P,xr=Math.max(100,Math.min(600,se-dt));vg(xr)}},Ze=()=>{document.removeEventListener("mousemove",ve),document.removeEventListener("mouseup",Ze)};document.addEventListener("mousemove",ve),document.addEventListener("mouseup",Ze)},[Nl,Mn]=R.useState(!1),[Rn,pu]=R.useState(""),[Bl,_u]=R.useState(""),[mu,gu]=R.useState(""),[vu,yg]=R.useState("gemini/gemini-2.5-flash"),[yu,Sg]=R.useState("auto"),[Su,wu]=R.useState(""),[xu,Cu]=R.useState("http://localhost:11434/v1"),bu=R.useRef(null),ku=R.useRef(null),Ln=R.useRef(null),wg=(p,w)=>{Ln.current=p};R.useEffect(()=>{Nl||ue("")},[Nl]),R.useEffect(()=>{Tn(),(async()=>{try{const w=await fetch("/api/settings/check-dependencies");w.ok&&((await w.json()).installed||kn(!0))}catch(w){console.error("Failed to check optional dependencies",w)}})()},[]),R.useEffect(()=>{r?(cs(),Ll(),y([{role:"assistant",content:`Olá! Estou pronto para auxiliar no projeto **${r.project_name||r.name}**.`}])):(n([]),l(null),a(""),u([]),v({}),I([]))},[r]),R.useEffect(()=>{const p=k=>{k.preventDefault()};document.addEventListener("contextmenu",p);const w=()=>{Rl(null)};return document.addEventListener("click",w),()=>{document.removeEventListener("contextmenu",p),document.removeEventListener("click",w)}},[]),R.useEffect(()=>{var p;(p=bu.current)==null||p.scrollIntoView({behavior:"smooth"})},[_]),R.useEffect(()=>{var p;(p=ku.current)==null||p.scrollIntoView({behavior:"smooth"})},[$]),R.useEffect(()=>{const p=w=>{(w.ctrlKey||w.metaKey)&&w.key==="s"?(w.preventDefault(),Du()):(w.ctrlKey||w.metaKey)&&(w.key==="+"||w.key==="=")?(w.preventDefault(),ie(k=>{const P=Math.min(30,k+1);return ki("editorFontSize",P),P})):(w.ctrlKey||w.metaKey)&&w.key==="-"&&(w.preventDefault(),ie(k=>{const P=Math.max(10,k-1);return ki("editorFontSize",P),P}))};return window.addEventListener("keydown",p),()=>window.removeEventListener("keydown",p)},[o,c,r]),R.useEffect(()=>{if(!r){En.current&&(En.current.close(),En.current=null);return}if(!ls.current)return;const p=new Wx({cursorBlink:!0,fontSize:13,fontFamily:'Consolas, "Courier New", monospace',theme:{background:"#1e1e1e",foreground:"#cccccc"}}),w=new Kx;p.loadAddon(w),ls.current.innerHTML="",p.open(ls.current);try{w.fit()}catch{}as.current=p,Pn.current=w;const k=r.project_path,P=`/api/terminal/stream?projectPath=${encodeURIComponent(k)}`,q=new EventSource(P);En.current=q,q.onmessage=se=>{try{const ve=se.data,Ze=atob(ve),Ft=new Uint8Array(Ze.length);for(let dt=0;dt<Ze.length;dt++)Ft[dt]=Ze.charCodeAt(dt);p.write(Ft)}catch(ve){console.error("Error decoding terminal stream data",ve)}},q.onerror=se=>{console.error("Terminal event source error",se),p.write(`\r
213
213
  \x1B[31m[OpalaCoder] Conexão com o terminal perdida. Reconectando...\x1B[0m\r
214
214
  `)},p.onData(se=>{fetch("/api/terminal/input",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"input",text:se,projectPath:r.project_path})}).catch(ve=>console.error("Failed to send terminal input",ve))});const oe=new ResizeObserver(()=>{if(w)try{w.fit();const{cols:se,rows:ve}=p;fetch("/api/terminal/input",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"resize",cols:se,rows:ve,projectPath:r.project_path})}).catch(Ze=>console.error("Failed to send terminal resize",Ze))}catch{}});return oe.observe(ls.current),()=>{oe.disconnect(),q&&q.close(),p.dispose(),as.current=null,Pn.current=null}},[r]),R.useEffect(()=>{ki("theme",Gt),Gt==="light"?document.body.classList.add("light-theme"):document.body.classList.remove("light-theme")},[Gt]),R.useEffect(()=>{N==="terminal"&&as.current&&Pn.current&&r&&setTimeout(()=>{try{Pn.current.fit();const{cols:p,rows:w}=as.current;fetch("/api/terminal/input",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"resize",cols:p,rows:w,projectPath:r.project_path})}).catch(k=>console.error("Failed to send terminal resize",k)),as.current.focus()}catch{}},50)},[N,Dl,r]),R.useEffect(()=>{r?Nn():ou([])},[r]),R.useEffect(()=>{j==="git"&&r&&Nn()},[j,r]);const Tn=async()=>{try{const p=await fetch("/api/opalacoder/list-projects");if(p.ok){const w=await p.json();t(w.projects||[]),w.projects&&w.projects.length>0&&!r&&Pu(w.projects[0])}}catch(p){X("error",`Falha ao carregar projetos: ${p.message}`)}},Nn=async()=>{if(r)try{const p=await fetch(`/api/git/status?projectPath=${encodeURIComponent(r.project_path)}`);if(p.ok){const w=await p.json();ou(w.files||[])}}catch(p){console.error("Failed to fetch git status",p)}},xg=async p=>{if(p&&p.preventDefault(),!(!r||!os.trim()||kl)){au(!0),X("info",`Criando commit com a mensagem: "${os}"...`);try{const w=await fetch("/api/git/commit",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({projectPath:r.project_path,message:os})});if(w.ok)X("info","Commit criado com sucesso!"),lu(""),Nn();else{const k=await w.json();X("error",`Falha ao fazer commit: ${k.error||"Erro desconhecido"}`)}}catch(w){X("error",`Erro ao fazer commit: ${w.message}`)}finally{au(!1)}}},Eu=async()=>{if(!El){cu(!0),bn("Instalando..."),Pl(`Iniciando pip install...
215
215
  `);try{const p=await fetch("/api/settings/install-dependencies",{method:"POST"});if(!p.ok)throw new Error("Falha ao iniciar instalação");const w=p.body.getReader(),k=new TextDecoder("utf-8");let P="";for(;;){const{value:q,done:oe}=await w.read();if(oe)break;P+=k.decode(q,{stream:!0});const se=P.split(`
@@ -9,7 +9,7 @@
9
9
  <link rel="preconnect" href="https://fonts.googleapis.com">
10
10
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
11
  <link href="https://fonts.googleapis.com/css2?family=Fira+Code:wght@300;400;500;600;700&family=Inter:wght@300;400;500;600;700&family=Outfit:wght@300;400;500;600;700;800&display=swap" rel="stylesheet">
12
- <script type="module" crossorigin src="/assets/index-BLhtmpm0.js"></script>
12
+ <script type="module" crossorigin src="/assets/index-BCdp1z3q.js"></script>
13
13
  <link rel="stylesheet" crossorigin href="/assets/index-fY3LKaOS.css">
14
14
  </head>
15
15
  <body>
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "opalacoder"
7
- version = "0.1.20"
7
+ version = "0.1.22"
8
8
  description = "Autonomous coding agent with interactive planning and modular execution"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -71,12 +71,6 @@ export default function App() {
71
71
  const [thinkingLogs, setThinkingLogs] = useState([]);
72
72
  const [showAdvancedParams, setShowAdvancedParams] = useState(false);
73
73
  const [newProjError, setNewProjError] = useState('');
74
-
75
- useEffect(() => {
76
- if (!showNewProjectModal) {
77
- setNewProjError('');
78
- }
79
- }, [showNewProjectModal]);
80
74
 
81
75
  // IDE Settings States
82
76
  const [isSettingsOpen, setIsSettingsOpen] = useState(false);
@@ -190,6 +184,12 @@ export default function App() {
190
184
  editorRef.current = editor;
191
185
  };
192
186
 
187
+ useEffect(() => {
188
+ if (!showNewProjectModal) {
189
+ setNewProjError('');
190
+ }
191
+ }, [showNewProjectModal]);
192
+
193
193
  // Initial load
194
194
  useEffect(() => {
195
195
  fetchProjects();
File without changes
File without changes