amd-gaia 0.14.1__py3-none-any.whl

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 (800) hide show
  1. amd_gaia-0.14.1.dist-info/METADATA +768 -0
  2. amd_gaia-0.14.1.dist-info/RECORD +800 -0
  3. amd_gaia-0.14.1.dist-info/WHEEL +5 -0
  4. amd_gaia-0.14.1.dist-info/entry_points.txt +5 -0
  5. amd_gaia-0.14.1.dist-info/licenses/LICENSE.md +21 -0
  6. amd_gaia-0.14.1.dist-info/top_level.txt +1 -0
  7. gaia/__init__.py +2 -0
  8. gaia/agents/__init__.py +19 -0
  9. gaia/agents/base/__init__.py +9 -0
  10. gaia/agents/base/agent.py +2072 -0
  11. gaia/agents/base/api_agent.py +120 -0
  12. gaia/agents/base/console.py +1457 -0
  13. gaia/agents/base/mcp_agent.py +86 -0
  14. gaia/agents/base/tools.py +83 -0
  15. gaia/agents/blender/agent.py +556 -0
  16. gaia/agents/blender/agent_simple.py +135 -0
  17. gaia/agents/blender/app.py +211 -0
  18. gaia/agents/blender/app_simple.py +41 -0
  19. gaia/agents/blender/core/__init__.py +16 -0
  20. gaia/agents/blender/core/materials.py +506 -0
  21. gaia/agents/blender/core/objects.py +316 -0
  22. gaia/agents/blender/core/rendering.py +225 -0
  23. gaia/agents/blender/core/scene.py +220 -0
  24. gaia/agents/blender/core/view.py +146 -0
  25. gaia/agents/chat/__init__.py +9 -0
  26. gaia/agents/chat/agent.py +975 -0
  27. gaia/agents/chat/app.py +1058 -0
  28. gaia/agents/chat/session.py +508 -0
  29. gaia/agents/chat/tools/__init__.py +15 -0
  30. gaia/agents/chat/tools/file_tools.py +96 -0
  31. gaia/agents/chat/tools/rag_tools.py +1729 -0
  32. gaia/agents/chat/tools/shell_tools.py +436 -0
  33. gaia/agents/code/__init__.py +7 -0
  34. gaia/agents/code/agent.py +547 -0
  35. gaia/agents/code/app.py +266 -0
  36. gaia/agents/code/models.py +135 -0
  37. gaia/agents/code/orchestration/__init__.py +24 -0
  38. gaia/agents/code/orchestration/checklist_executor.py +1739 -0
  39. gaia/agents/code/orchestration/checklist_generator.py +709 -0
  40. gaia/agents/code/orchestration/factories/__init__.py +9 -0
  41. gaia/agents/code/orchestration/factories/base.py +63 -0
  42. gaia/agents/code/orchestration/factories/nextjs_factory.py +118 -0
  43. gaia/agents/code/orchestration/factories/python_factory.py +106 -0
  44. gaia/agents/code/orchestration/orchestrator.py +610 -0
  45. gaia/agents/code/orchestration/project_analyzer.py +391 -0
  46. gaia/agents/code/orchestration/steps/__init__.py +67 -0
  47. gaia/agents/code/orchestration/steps/base.py +188 -0
  48. gaia/agents/code/orchestration/steps/error_handler.py +314 -0
  49. gaia/agents/code/orchestration/steps/nextjs.py +828 -0
  50. gaia/agents/code/orchestration/steps/python.py +307 -0
  51. gaia/agents/code/orchestration/template_catalog.py +463 -0
  52. gaia/agents/code/orchestration/workflows/__init__.py +14 -0
  53. gaia/agents/code/orchestration/workflows/base.py +80 -0
  54. gaia/agents/code/orchestration/workflows/nextjs.py +186 -0
  55. gaia/agents/code/orchestration/workflows/python.py +94 -0
  56. gaia/agents/code/prompts/__init__.py +11 -0
  57. gaia/agents/code/prompts/base_prompt.py +77 -0
  58. gaia/agents/code/prompts/code_patterns.py +1925 -0
  59. gaia/agents/code/prompts/nextjs_prompt.py +40 -0
  60. gaia/agents/code/prompts/python_prompt.py +109 -0
  61. gaia/agents/code/schema_inference.py +365 -0
  62. gaia/agents/code/system_prompt.py +41 -0
  63. gaia/agents/code/tools/__init__.py +42 -0
  64. gaia/agents/code/tools/cli_tools.py +1138 -0
  65. gaia/agents/code/tools/code_formatting.py +319 -0
  66. gaia/agents/code/tools/code_tools.py +769 -0
  67. gaia/agents/code/tools/error_fixing.py +1347 -0
  68. gaia/agents/code/tools/external_tools.py +180 -0
  69. gaia/agents/code/tools/file_io.py +845 -0
  70. gaia/agents/code/tools/prisma_tools.py +190 -0
  71. gaia/agents/code/tools/project_management.py +1016 -0
  72. gaia/agents/code/tools/testing.py +321 -0
  73. gaia/agents/code/tools/typescript_tools.py +122 -0
  74. gaia/agents/code/tools/validation_parsing.py +461 -0
  75. gaia/agents/code/tools/validation_tools.py +803 -0
  76. gaia/agents/code/tools/web_dev_tools.py +1744 -0
  77. gaia/agents/code/validators/__init__.py +16 -0
  78. gaia/agents/code/validators/antipattern_checker.py +241 -0
  79. gaia/agents/code/validators/ast_analyzer.py +197 -0
  80. gaia/agents/code/validators/requirements_validator.py +145 -0
  81. gaia/agents/code/validators/syntax_validator.py +171 -0
  82. gaia/agents/docker/__init__.py +7 -0
  83. gaia/agents/docker/agent.py +642 -0
  84. gaia/agents/jira/__init__.py +11 -0
  85. gaia/agents/jira/agent.py +894 -0
  86. gaia/agents/jira/jql_templates.py +299 -0
  87. gaia/agents/routing/__init__.py +7 -0
  88. gaia/agents/routing/agent.py +512 -0
  89. gaia/agents/routing/system_prompt.py +75 -0
  90. gaia/api/__init__.py +23 -0
  91. gaia/api/agent_registry.py +238 -0
  92. gaia/api/app.py +305 -0
  93. gaia/api/openai_server.py +575 -0
  94. gaia/api/schemas.py +186 -0
  95. gaia/api/sse_handler.py +370 -0
  96. gaia/apps/__init__.py +4 -0
  97. gaia/apps/llm/__init__.py +6 -0
  98. gaia/apps/llm/app.py +169 -0
  99. gaia/apps/summarize/app.py +633 -0
  100. gaia/apps/summarize/html_viewer.py +133 -0
  101. gaia/apps/summarize/pdf_formatter.py +284 -0
  102. gaia/audio/__init__.py +2 -0
  103. gaia/audio/audio_client.py +439 -0
  104. gaia/audio/audio_recorder.py +269 -0
  105. gaia/audio/kokoro_tts.py +599 -0
  106. gaia/audio/whisper_asr.py +432 -0
  107. gaia/chat/__init__.py +16 -0
  108. gaia/chat/app.py +430 -0
  109. gaia/chat/prompts.py +522 -0
  110. gaia/chat/sdk.py +1200 -0
  111. gaia/cli.py +5621 -0
  112. gaia/eval/batch_experiment.py +2332 -0
  113. gaia/eval/claude.py +542 -0
  114. gaia/eval/config.py +37 -0
  115. gaia/eval/email_generator.py +512 -0
  116. gaia/eval/eval.py +3179 -0
  117. gaia/eval/groundtruth.py +1130 -0
  118. gaia/eval/transcript_generator.py +582 -0
  119. gaia/eval/webapp/README.md +168 -0
  120. gaia/eval/webapp/node_modules/.bin/mime +16 -0
  121. gaia/eval/webapp/node_modules/.bin/mime.cmd +17 -0
  122. gaia/eval/webapp/node_modules/.bin/mime.ps1 +28 -0
  123. gaia/eval/webapp/node_modules/.package-lock.json +865 -0
  124. gaia/eval/webapp/node_modules/accepts/HISTORY.md +243 -0
  125. gaia/eval/webapp/node_modules/accepts/LICENSE +23 -0
  126. gaia/eval/webapp/node_modules/accepts/README.md +140 -0
  127. gaia/eval/webapp/node_modules/accepts/index.js +238 -0
  128. gaia/eval/webapp/node_modules/accepts/package.json +47 -0
  129. gaia/eval/webapp/node_modules/array-flatten/LICENSE +21 -0
  130. gaia/eval/webapp/node_modules/array-flatten/README.md +43 -0
  131. gaia/eval/webapp/node_modules/array-flatten/array-flatten.js +64 -0
  132. gaia/eval/webapp/node_modules/array-flatten/package.json +39 -0
  133. gaia/eval/webapp/node_modules/body-parser/HISTORY.md +672 -0
  134. gaia/eval/webapp/node_modules/body-parser/LICENSE +23 -0
  135. gaia/eval/webapp/node_modules/body-parser/README.md +476 -0
  136. gaia/eval/webapp/node_modules/body-parser/SECURITY.md +25 -0
  137. gaia/eval/webapp/node_modules/body-parser/index.js +156 -0
  138. gaia/eval/webapp/node_modules/body-parser/lib/read.js +205 -0
  139. gaia/eval/webapp/node_modules/body-parser/lib/types/json.js +247 -0
  140. gaia/eval/webapp/node_modules/body-parser/lib/types/raw.js +101 -0
  141. gaia/eval/webapp/node_modules/body-parser/lib/types/text.js +121 -0
  142. gaia/eval/webapp/node_modules/body-parser/lib/types/urlencoded.js +307 -0
  143. gaia/eval/webapp/node_modules/body-parser/package.json +56 -0
  144. gaia/eval/webapp/node_modules/bytes/History.md +97 -0
  145. gaia/eval/webapp/node_modules/bytes/LICENSE +23 -0
  146. gaia/eval/webapp/node_modules/bytes/Readme.md +152 -0
  147. gaia/eval/webapp/node_modules/bytes/index.js +170 -0
  148. gaia/eval/webapp/node_modules/bytes/package.json +42 -0
  149. gaia/eval/webapp/node_modules/call-bind-apply-helpers/.eslintrc +17 -0
  150. gaia/eval/webapp/node_modules/call-bind-apply-helpers/.github/FUNDING.yml +12 -0
  151. gaia/eval/webapp/node_modules/call-bind-apply-helpers/.nycrc +9 -0
  152. gaia/eval/webapp/node_modules/call-bind-apply-helpers/CHANGELOG.md +30 -0
  153. gaia/eval/webapp/node_modules/call-bind-apply-helpers/LICENSE +21 -0
  154. gaia/eval/webapp/node_modules/call-bind-apply-helpers/README.md +62 -0
  155. gaia/eval/webapp/node_modules/call-bind-apply-helpers/actualApply.d.ts +1 -0
  156. gaia/eval/webapp/node_modules/call-bind-apply-helpers/actualApply.js +10 -0
  157. gaia/eval/webapp/node_modules/call-bind-apply-helpers/applyBind.d.ts +19 -0
  158. gaia/eval/webapp/node_modules/call-bind-apply-helpers/applyBind.js +10 -0
  159. gaia/eval/webapp/node_modules/call-bind-apply-helpers/functionApply.d.ts +1 -0
  160. gaia/eval/webapp/node_modules/call-bind-apply-helpers/functionApply.js +4 -0
  161. gaia/eval/webapp/node_modules/call-bind-apply-helpers/functionCall.d.ts +1 -0
  162. gaia/eval/webapp/node_modules/call-bind-apply-helpers/functionCall.js +4 -0
  163. gaia/eval/webapp/node_modules/call-bind-apply-helpers/index.d.ts +64 -0
  164. gaia/eval/webapp/node_modules/call-bind-apply-helpers/index.js +15 -0
  165. gaia/eval/webapp/node_modules/call-bind-apply-helpers/package.json +85 -0
  166. gaia/eval/webapp/node_modules/call-bind-apply-helpers/reflectApply.d.ts +3 -0
  167. gaia/eval/webapp/node_modules/call-bind-apply-helpers/reflectApply.js +4 -0
  168. gaia/eval/webapp/node_modules/call-bind-apply-helpers/test/index.js +63 -0
  169. gaia/eval/webapp/node_modules/call-bind-apply-helpers/tsconfig.json +9 -0
  170. gaia/eval/webapp/node_modules/call-bound/.eslintrc +13 -0
  171. gaia/eval/webapp/node_modules/call-bound/.github/FUNDING.yml +12 -0
  172. gaia/eval/webapp/node_modules/call-bound/.nycrc +9 -0
  173. gaia/eval/webapp/node_modules/call-bound/CHANGELOG.md +42 -0
  174. gaia/eval/webapp/node_modules/call-bound/LICENSE +21 -0
  175. gaia/eval/webapp/node_modules/call-bound/README.md +53 -0
  176. gaia/eval/webapp/node_modules/call-bound/index.d.ts +94 -0
  177. gaia/eval/webapp/node_modules/call-bound/index.js +19 -0
  178. gaia/eval/webapp/node_modules/call-bound/package.json +99 -0
  179. gaia/eval/webapp/node_modules/call-bound/test/index.js +61 -0
  180. gaia/eval/webapp/node_modules/call-bound/tsconfig.json +10 -0
  181. gaia/eval/webapp/node_modules/content-disposition/HISTORY.md +60 -0
  182. gaia/eval/webapp/node_modules/content-disposition/LICENSE +22 -0
  183. gaia/eval/webapp/node_modules/content-disposition/README.md +142 -0
  184. gaia/eval/webapp/node_modules/content-disposition/index.js +458 -0
  185. gaia/eval/webapp/node_modules/content-disposition/package.json +44 -0
  186. gaia/eval/webapp/node_modules/content-type/HISTORY.md +29 -0
  187. gaia/eval/webapp/node_modules/content-type/LICENSE +22 -0
  188. gaia/eval/webapp/node_modules/content-type/README.md +94 -0
  189. gaia/eval/webapp/node_modules/content-type/index.js +225 -0
  190. gaia/eval/webapp/node_modules/content-type/package.json +42 -0
  191. gaia/eval/webapp/node_modules/cookie/LICENSE +24 -0
  192. gaia/eval/webapp/node_modules/cookie/README.md +317 -0
  193. gaia/eval/webapp/node_modules/cookie/SECURITY.md +25 -0
  194. gaia/eval/webapp/node_modules/cookie/index.js +334 -0
  195. gaia/eval/webapp/node_modules/cookie/package.json +44 -0
  196. gaia/eval/webapp/node_modules/cookie-signature/.npmignore +4 -0
  197. gaia/eval/webapp/node_modules/cookie-signature/History.md +38 -0
  198. gaia/eval/webapp/node_modules/cookie-signature/Readme.md +42 -0
  199. gaia/eval/webapp/node_modules/cookie-signature/index.js +51 -0
  200. gaia/eval/webapp/node_modules/cookie-signature/package.json +18 -0
  201. gaia/eval/webapp/node_modules/debug/.coveralls.yml +1 -0
  202. gaia/eval/webapp/node_modules/debug/.eslintrc +11 -0
  203. gaia/eval/webapp/node_modules/debug/.npmignore +9 -0
  204. gaia/eval/webapp/node_modules/debug/.travis.yml +14 -0
  205. gaia/eval/webapp/node_modules/debug/CHANGELOG.md +362 -0
  206. gaia/eval/webapp/node_modules/debug/LICENSE +19 -0
  207. gaia/eval/webapp/node_modules/debug/Makefile +50 -0
  208. gaia/eval/webapp/node_modules/debug/README.md +312 -0
  209. gaia/eval/webapp/node_modules/debug/component.json +19 -0
  210. gaia/eval/webapp/node_modules/debug/karma.conf.js +70 -0
  211. gaia/eval/webapp/node_modules/debug/node.js +1 -0
  212. gaia/eval/webapp/node_modules/debug/package.json +49 -0
  213. gaia/eval/webapp/node_modules/debug/src/browser.js +185 -0
  214. gaia/eval/webapp/node_modules/debug/src/debug.js +202 -0
  215. gaia/eval/webapp/node_modules/debug/src/index.js +10 -0
  216. gaia/eval/webapp/node_modules/debug/src/inspector-log.js +15 -0
  217. gaia/eval/webapp/node_modules/debug/src/node.js +248 -0
  218. gaia/eval/webapp/node_modules/depd/History.md +103 -0
  219. gaia/eval/webapp/node_modules/depd/LICENSE +22 -0
  220. gaia/eval/webapp/node_modules/depd/Readme.md +280 -0
  221. gaia/eval/webapp/node_modules/depd/index.js +538 -0
  222. gaia/eval/webapp/node_modules/depd/lib/browser/index.js +77 -0
  223. gaia/eval/webapp/node_modules/depd/package.json +45 -0
  224. gaia/eval/webapp/node_modules/destroy/LICENSE +23 -0
  225. gaia/eval/webapp/node_modules/destroy/README.md +63 -0
  226. gaia/eval/webapp/node_modules/destroy/index.js +209 -0
  227. gaia/eval/webapp/node_modules/destroy/package.json +48 -0
  228. gaia/eval/webapp/node_modules/dunder-proto/.eslintrc +5 -0
  229. gaia/eval/webapp/node_modules/dunder-proto/.github/FUNDING.yml +12 -0
  230. gaia/eval/webapp/node_modules/dunder-proto/.nycrc +13 -0
  231. gaia/eval/webapp/node_modules/dunder-proto/CHANGELOG.md +24 -0
  232. gaia/eval/webapp/node_modules/dunder-proto/LICENSE +21 -0
  233. gaia/eval/webapp/node_modules/dunder-proto/README.md +54 -0
  234. gaia/eval/webapp/node_modules/dunder-proto/get.d.ts +5 -0
  235. gaia/eval/webapp/node_modules/dunder-proto/get.js +30 -0
  236. gaia/eval/webapp/node_modules/dunder-proto/package.json +76 -0
  237. gaia/eval/webapp/node_modules/dunder-proto/set.d.ts +5 -0
  238. gaia/eval/webapp/node_modules/dunder-proto/set.js +35 -0
  239. gaia/eval/webapp/node_modules/dunder-proto/test/get.js +34 -0
  240. gaia/eval/webapp/node_modules/dunder-proto/test/index.js +4 -0
  241. gaia/eval/webapp/node_modules/dunder-proto/test/set.js +50 -0
  242. gaia/eval/webapp/node_modules/dunder-proto/tsconfig.json +9 -0
  243. gaia/eval/webapp/node_modules/ee-first/LICENSE +22 -0
  244. gaia/eval/webapp/node_modules/ee-first/README.md +80 -0
  245. gaia/eval/webapp/node_modules/ee-first/index.js +95 -0
  246. gaia/eval/webapp/node_modules/ee-first/package.json +29 -0
  247. gaia/eval/webapp/node_modules/encodeurl/LICENSE +22 -0
  248. gaia/eval/webapp/node_modules/encodeurl/README.md +109 -0
  249. gaia/eval/webapp/node_modules/encodeurl/index.js +60 -0
  250. gaia/eval/webapp/node_modules/encodeurl/package.json +40 -0
  251. gaia/eval/webapp/node_modules/es-define-property/.eslintrc +13 -0
  252. gaia/eval/webapp/node_modules/es-define-property/.github/FUNDING.yml +12 -0
  253. gaia/eval/webapp/node_modules/es-define-property/.nycrc +9 -0
  254. gaia/eval/webapp/node_modules/es-define-property/CHANGELOG.md +29 -0
  255. gaia/eval/webapp/node_modules/es-define-property/LICENSE +21 -0
  256. gaia/eval/webapp/node_modules/es-define-property/README.md +49 -0
  257. gaia/eval/webapp/node_modules/es-define-property/index.d.ts +3 -0
  258. gaia/eval/webapp/node_modules/es-define-property/index.js +14 -0
  259. gaia/eval/webapp/node_modules/es-define-property/package.json +81 -0
  260. gaia/eval/webapp/node_modules/es-define-property/test/index.js +56 -0
  261. gaia/eval/webapp/node_modules/es-define-property/tsconfig.json +10 -0
  262. gaia/eval/webapp/node_modules/es-errors/.eslintrc +5 -0
  263. gaia/eval/webapp/node_modules/es-errors/.github/FUNDING.yml +12 -0
  264. gaia/eval/webapp/node_modules/es-errors/CHANGELOG.md +40 -0
  265. gaia/eval/webapp/node_modules/es-errors/LICENSE +21 -0
  266. gaia/eval/webapp/node_modules/es-errors/README.md +55 -0
  267. gaia/eval/webapp/node_modules/es-errors/eval.d.ts +3 -0
  268. gaia/eval/webapp/node_modules/es-errors/eval.js +4 -0
  269. gaia/eval/webapp/node_modules/es-errors/index.d.ts +3 -0
  270. gaia/eval/webapp/node_modules/es-errors/index.js +4 -0
  271. gaia/eval/webapp/node_modules/es-errors/package.json +80 -0
  272. gaia/eval/webapp/node_modules/es-errors/range.d.ts +3 -0
  273. gaia/eval/webapp/node_modules/es-errors/range.js +4 -0
  274. gaia/eval/webapp/node_modules/es-errors/ref.d.ts +3 -0
  275. gaia/eval/webapp/node_modules/es-errors/ref.js +4 -0
  276. gaia/eval/webapp/node_modules/es-errors/syntax.d.ts +3 -0
  277. gaia/eval/webapp/node_modules/es-errors/syntax.js +4 -0
  278. gaia/eval/webapp/node_modules/es-errors/test/index.js +19 -0
  279. gaia/eval/webapp/node_modules/es-errors/tsconfig.json +49 -0
  280. gaia/eval/webapp/node_modules/es-errors/type.d.ts +3 -0
  281. gaia/eval/webapp/node_modules/es-errors/type.js +4 -0
  282. gaia/eval/webapp/node_modules/es-errors/uri.d.ts +3 -0
  283. gaia/eval/webapp/node_modules/es-errors/uri.js +4 -0
  284. gaia/eval/webapp/node_modules/es-object-atoms/.eslintrc +16 -0
  285. gaia/eval/webapp/node_modules/es-object-atoms/.github/FUNDING.yml +12 -0
  286. gaia/eval/webapp/node_modules/es-object-atoms/CHANGELOG.md +37 -0
  287. gaia/eval/webapp/node_modules/es-object-atoms/LICENSE +21 -0
  288. gaia/eval/webapp/node_modules/es-object-atoms/README.md +63 -0
  289. gaia/eval/webapp/node_modules/es-object-atoms/RequireObjectCoercible.d.ts +3 -0
  290. gaia/eval/webapp/node_modules/es-object-atoms/RequireObjectCoercible.js +11 -0
  291. gaia/eval/webapp/node_modules/es-object-atoms/ToObject.d.ts +7 -0
  292. gaia/eval/webapp/node_modules/es-object-atoms/ToObject.js +10 -0
  293. gaia/eval/webapp/node_modules/es-object-atoms/index.d.ts +3 -0
  294. gaia/eval/webapp/node_modules/es-object-atoms/index.js +4 -0
  295. gaia/eval/webapp/node_modules/es-object-atoms/isObject.d.ts +3 -0
  296. gaia/eval/webapp/node_modules/es-object-atoms/isObject.js +6 -0
  297. gaia/eval/webapp/node_modules/es-object-atoms/package.json +80 -0
  298. gaia/eval/webapp/node_modules/es-object-atoms/test/index.js +38 -0
  299. gaia/eval/webapp/node_modules/es-object-atoms/tsconfig.json +6 -0
  300. gaia/eval/webapp/node_modules/escape-html/LICENSE +24 -0
  301. gaia/eval/webapp/node_modules/escape-html/Readme.md +43 -0
  302. gaia/eval/webapp/node_modules/escape-html/index.js +78 -0
  303. gaia/eval/webapp/node_modules/escape-html/package.json +24 -0
  304. gaia/eval/webapp/node_modules/etag/HISTORY.md +83 -0
  305. gaia/eval/webapp/node_modules/etag/LICENSE +22 -0
  306. gaia/eval/webapp/node_modules/etag/README.md +159 -0
  307. gaia/eval/webapp/node_modules/etag/index.js +131 -0
  308. gaia/eval/webapp/node_modules/etag/package.json +47 -0
  309. gaia/eval/webapp/node_modules/express/History.md +3656 -0
  310. gaia/eval/webapp/node_modules/express/LICENSE +24 -0
  311. gaia/eval/webapp/node_modules/express/Readme.md +260 -0
  312. gaia/eval/webapp/node_modules/express/index.js +11 -0
  313. gaia/eval/webapp/node_modules/express/lib/application.js +661 -0
  314. gaia/eval/webapp/node_modules/express/lib/express.js +116 -0
  315. gaia/eval/webapp/node_modules/express/lib/middleware/init.js +43 -0
  316. gaia/eval/webapp/node_modules/express/lib/middleware/query.js +47 -0
  317. gaia/eval/webapp/node_modules/express/lib/request.js +525 -0
  318. gaia/eval/webapp/node_modules/express/lib/response.js +1179 -0
  319. gaia/eval/webapp/node_modules/express/lib/router/index.js +673 -0
  320. gaia/eval/webapp/node_modules/express/lib/router/layer.js +181 -0
  321. gaia/eval/webapp/node_modules/express/lib/router/route.js +230 -0
  322. gaia/eval/webapp/node_modules/express/lib/utils.js +303 -0
  323. gaia/eval/webapp/node_modules/express/lib/view.js +182 -0
  324. gaia/eval/webapp/node_modules/express/package.json +102 -0
  325. gaia/eval/webapp/node_modules/finalhandler/HISTORY.md +210 -0
  326. gaia/eval/webapp/node_modules/finalhandler/LICENSE +22 -0
  327. gaia/eval/webapp/node_modules/finalhandler/README.md +147 -0
  328. gaia/eval/webapp/node_modules/finalhandler/SECURITY.md +25 -0
  329. gaia/eval/webapp/node_modules/finalhandler/index.js +341 -0
  330. gaia/eval/webapp/node_modules/finalhandler/package.json +47 -0
  331. gaia/eval/webapp/node_modules/forwarded/HISTORY.md +21 -0
  332. gaia/eval/webapp/node_modules/forwarded/LICENSE +22 -0
  333. gaia/eval/webapp/node_modules/forwarded/README.md +57 -0
  334. gaia/eval/webapp/node_modules/forwarded/index.js +90 -0
  335. gaia/eval/webapp/node_modules/forwarded/package.json +45 -0
  336. gaia/eval/webapp/node_modules/fresh/HISTORY.md +70 -0
  337. gaia/eval/webapp/node_modules/fresh/LICENSE +23 -0
  338. gaia/eval/webapp/node_modules/fresh/README.md +119 -0
  339. gaia/eval/webapp/node_modules/fresh/index.js +137 -0
  340. gaia/eval/webapp/node_modules/fresh/package.json +46 -0
  341. gaia/eval/webapp/node_modules/fs/README.md +9 -0
  342. gaia/eval/webapp/node_modules/fs/package.json +20 -0
  343. gaia/eval/webapp/node_modules/function-bind/.eslintrc +21 -0
  344. gaia/eval/webapp/node_modules/function-bind/.github/FUNDING.yml +12 -0
  345. gaia/eval/webapp/node_modules/function-bind/.github/SECURITY.md +3 -0
  346. gaia/eval/webapp/node_modules/function-bind/.nycrc +13 -0
  347. gaia/eval/webapp/node_modules/function-bind/CHANGELOG.md +136 -0
  348. gaia/eval/webapp/node_modules/function-bind/LICENSE +20 -0
  349. gaia/eval/webapp/node_modules/function-bind/README.md +46 -0
  350. gaia/eval/webapp/node_modules/function-bind/implementation.js +84 -0
  351. gaia/eval/webapp/node_modules/function-bind/index.js +5 -0
  352. gaia/eval/webapp/node_modules/function-bind/package.json +87 -0
  353. gaia/eval/webapp/node_modules/function-bind/test/.eslintrc +9 -0
  354. gaia/eval/webapp/node_modules/function-bind/test/index.js +252 -0
  355. gaia/eval/webapp/node_modules/get-intrinsic/.eslintrc +42 -0
  356. gaia/eval/webapp/node_modules/get-intrinsic/.github/FUNDING.yml +12 -0
  357. gaia/eval/webapp/node_modules/get-intrinsic/.nycrc +9 -0
  358. gaia/eval/webapp/node_modules/get-intrinsic/CHANGELOG.md +186 -0
  359. gaia/eval/webapp/node_modules/get-intrinsic/LICENSE +21 -0
  360. gaia/eval/webapp/node_modules/get-intrinsic/README.md +71 -0
  361. gaia/eval/webapp/node_modules/get-intrinsic/index.js +378 -0
  362. gaia/eval/webapp/node_modules/get-intrinsic/package.json +97 -0
  363. gaia/eval/webapp/node_modules/get-intrinsic/test/GetIntrinsic.js +274 -0
  364. gaia/eval/webapp/node_modules/get-proto/.eslintrc +10 -0
  365. gaia/eval/webapp/node_modules/get-proto/.github/FUNDING.yml +12 -0
  366. gaia/eval/webapp/node_modules/get-proto/.nycrc +9 -0
  367. gaia/eval/webapp/node_modules/get-proto/CHANGELOG.md +21 -0
  368. gaia/eval/webapp/node_modules/get-proto/LICENSE +21 -0
  369. gaia/eval/webapp/node_modules/get-proto/Object.getPrototypeOf.d.ts +5 -0
  370. gaia/eval/webapp/node_modules/get-proto/Object.getPrototypeOf.js +6 -0
  371. gaia/eval/webapp/node_modules/get-proto/README.md +50 -0
  372. gaia/eval/webapp/node_modules/get-proto/Reflect.getPrototypeOf.d.ts +3 -0
  373. gaia/eval/webapp/node_modules/get-proto/Reflect.getPrototypeOf.js +4 -0
  374. gaia/eval/webapp/node_modules/get-proto/index.d.ts +5 -0
  375. gaia/eval/webapp/node_modules/get-proto/index.js +27 -0
  376. gaia/eval/webapp/node_modules/get-proto/package.json +81 -0
  377. gaia/eval/webapp/node_modules/get-proto/test/index.js +68 -0
  378. gaia/eval/webapp/node_modules/get-proto/tsconfig.json +9 -0
  379. gaia/eval/webapp/node_modules/gopd/.eslintrc +16 -0
  380. gaia/eval/webapp/node_modules/gopd/.github/FUNDING.yml +12 -0
  381. gaia/eval/webapp/node_modules/gopd/CHANGELOG.md +45 -0
  382. gaia/eval/webapp/node_modules/gopd/LICENSE +21 -0
  383. gaia/eval/webapp/node_modules/gopd/README.md +40 -0
  384. gaia/eval/webapp/node_modules/gopd/gOPD.d.ts +1 -0
  385. gaia/eval/webapp/node_modules/gopd/gOPD.js +4 -0
  386. gaia/eval/webapp/node_modules/gopd/index.d.ts +5 -0
  387. gaia/eval/webapp/node_modules/gopd/index.js +15 -0
  388. gaia/eval/webapp/node_modules/gopd/package.json +77 -0
  389. gaia/eval/webapp/node_modules/gopd/test/index.js +36 -0
  390. gaia/eval/webapp/node_modules/gopd/tsconfig.json +9 -0
  391. gaia/eval/webapp/node_modules/has-symbols/.eslintrc +11 -0
  392. gaia/eval/webapp/node_modules/has-symbols/.github/FUNDING.yml +12 -0
  393. gaia/eval/webapp/node_modules/has-symbols/.nycrc +9 -0
  394. gaia/eval/webapp/node_modules/has-symbols/CHANGELOG.md +91 -0
  395. gaia/eval/webapp/node_modules/has-symbols/LICENSE +21 -0
  396. gaia/eval/webapp/node_modules/has-symbols/README.md +46 -0
  397. gaia/eval/webapp/node_modules/has-symbols/index.d.ts +3 -0
  398. gaia/eval/webapp/node_modules/has-symbols/index.js +14 -0
  399. gaia/eval/webapp/node_modules/has-symbols/package.json +111 -0
  400. gaia/eval/webapp/node_modules/has-symbols/shams.d.ts +3 -0
  401. gaia/eval/webapp/node_modules/has-symbols/shams.js +45 -0
  402. gaia/eval/webapp/node_modules/has-symbols/test/index.js +22 -0
  403. gaia/eval/webapp/node_modules/has-symbols/test/shams/core-js.js +29 -0
  404. gaia/eval/webapp/node_modules/has-symbols/test/shams/get-own-property-symbols.js +29 -0
  405. gaia/eval/webapp/node_modules/has-symbols/test/tests.js +58 -0
  406. gaia/eval/webapp/node_modules/has-symbols/tsconfig.json +10 -0
  407. gaia/eval/webapp/node_modules/hasown/.eslintrc +5 -0
  408. gaia/eval/webapp/node_modules/hasown/.github/FUNDING.yml +12 -0
  409. gaia/eval/webapp/node_modules/hasown/.nycrc +13 -0
  410. gaia/eval/webapp/node_modules/hasown/CHANGELOG.md +40 -0
  411. gaia/eval/webapp/node_modules/hasown/LICENSE +21 -0
  412. gaia/eval/webapp/node_modules/hasown/README.md +40 -0
  413. gaia/eval/webapp/node_modules/hasown/index.d.ts +3 -0
  414. gaia/eval/webapp/node_modules/hasown/index.js +8 -0
  415. gaia/eval/webapp/node_modules/hasown/package.json +92 -0
  416. gaia/eval/webapp/node_modules/hasown/tsconfig.json +6 -0
  417. gaia/eval/webapp/node_modules/http-errors/HISTORY.md +180 -0
  418. gaia/eval/webapp/node_modules/http-errors/LICENSE +23 -0
  419. gaia/eval/webapp/node_modules/http-errors/README.md +169 -0
  420. gaia/eval/webapp/node_modules/http-errors/index.js +289 -0
  421. gaia/eval/webapp/node_modules/http-errors/package.json +50 -0
  422. gaia/eval/webapp/node_modules/iconv-lite/Changelog.md +162 -0
  423. gaia/eval/webapp/node_modules/iconv-lite/LICENSE +21 -0
  424. gaia/eval/webapp/node_modules/iconv-lite/README.md +156 -0
  425. gaia/eval/webapp/node_modules/iconv-lite/encodings/dbcs-codec.js +555 -0
  426. gaia/eval/webapp/node_modules/iconv-lite/encodings/dbcs-data.js +176 -0
  427. gaia/eval/webapp/node_modules/iconv-lite/encodings/index.js +22 -0
  428. gaia/eval/webapp/node_modules/iconv-lite/encodings/internal.js +188 -0
  429. gaia/eval/webapp/node_modules/iconv-lite/encodings/sbcs-codec.js +72 -0
  430. gaia/eval/webapp/node_modules/iconv-lite/encodings/sbcs-data-generated.js +451 -0
  431. gaia/eval/webapp/node_modules/iconv-lite/encodings/sbcs-data.js +174 -0
  432. gaia/eval/webapp/node_modules/iconv-lite/encodings/tables/big5-added.json +122 -0
  433. gaia/eval/webapp/node_modules/iconv-lite/encodings/tables/cp936.json +264 -0
  434. gaia/eval/webapp/node_modules/iconv-lite/encodings/tables/cp949.json +273 -0
  435. gaia/eval/webapp/node_modules/iconv-lite/encodings/tables/cp950.json +177 -0
  436. gaia/eval/webapp/node_modules/iconv-lite/encodings/tables/eucjp.json +182 -0
  437. gaia/eval/webapp/node_modules/iconv-lite/encodings/tables/gb18030-ranges.json +1 -0
  438. gaia/eval/webapp/node_modules/iconv-lite/encodings/tables/gbk-added.json +55 -0
  439. gaia/eval/webapp/node_modules/iconv-lite/encodings/tables/shiftjis.json +125 -0
  440. gaia/eval/webapp/node_modules/iconv-lite/encodings/utf16.js +177 -0
  441. gaia/eval/webapp/node_modules/iconv-lite/encodings/utf7.js +290 -0
  442. gaia/eval/webapp/node_modules/iconv-lite/lib/bom-handling.js +52 -0
  443. gaia/eval/webapp/node_modules/iconv-lite/lib/extend-node.js +217 -0
  444. gaia/eval/webapp/node_modules/iconv-lite/lib/index.d.ts +24 -0
  445. gaia/eval/webapp/node_modules/iconv-lite/lib/index.js +153 -0
  446. gaia/eval/webapp/node_modules/iconv-lite/lib/streams.js +121 -0
  447. gaia/eval/webapp/node_modules/iconv-lite/package.json +46 -0
  448. gaia/eval/webapp/node_modules/inherits/LICENSE +16 -0
  449. gaia/eval/webapp/node_modules/inherits/README.md +42 -0
  450. gaia/eval/webapp/node_modules/inherits/inherits.js +9 -0
  451. gaia/eval/webapp/node_modules/inherits/inherits_browser.js +27 -0
  452. gaia/eval/webapp/node_modules/inherits/package.json +29 -0
  453. gaia/eval/webapp/node_modules/ipaddr.js/LICENSE +19 -0
  454. gaia/eval/webapp/node_modules/ipaddr.js/README.md +233 -0
  455. gaia/eval/webapp/node_modules/ipaddr.js/ipaddr.min.js +1 -0
  456. gaia/eval/webapp/node_modules/ipaddr.js/lib/ipaddr.js +673 -0
  457. gaia/eval/webapp/node_modules/ipaddr.js/lib/ipaddr.js.d.ts +68 -0
  458. gaia/eval/webapp/node_modules/ipaddr.js/package.json +35 -0
  459. gaia/eval/webapp/node_modules/math-intrinsics/.eslintrc +16 -0
  460. gaia/eval/webapp/node_modules/math-intrinsics/.github/FUNDING.yml +12 -0
  461. gaia/eval/webapp/node_modules/math-intrinsics/CHANGELOG.md +24 -0
  462. gaia/eval/webapp/node_modules/math-intrinsics/LICENSE +21 -0
  463. gaia/eval/webapp/node_modules/math-intrinsics/README.md +50 -0
  464. gaia/eval/webapp/node_modules/math-intrinsics/abs.d.ts +1 -0
  465. gaia/eval/webapp/node_modules/math-intrinsics/abs.js +4 -0
  466. gaia/eval/webapp/node_modules/math-intrinsics/constants/maxArrayLength.d.ts +3 -0
  467. gaia/eval/webapp/node_modules/math-intrinsics/constants/maxArrayLength.js +4 -0
  468. gaia/eval/webapp/node_modules/math-intrinsics/constants/maxSafeInteger.d.ts +3 -0
  469. gaia/eval/webapp/node_modules/math-intrinsics/constants/maxSafeInteger.js +5 -0
  470. gaia/eval/webapp/node_modules/math-intrinsics/constants/maxValue.d.ts +3 -0
  471. gaia/eval/webapp/node_modules/math-intrinsics/constants/maxValue.js +5 -0
  472. gaia/eval/webapp/node_modules/math-intrinsics/floor.d.ts +1 -0
  473. gaia/eval/webapp/node_modules/math-intrinsics/floor.js +4 -0
  474. gaia/eval/webapp/node_modules/math-intrinsics/isFinite.d.ts +3 -0
  475. gaia/eval/webapp/node_modules/math-intrinsics/isFinite.js +12 -0
  476. gaia/eval/webapp/node_modules/math-intrinsics/isInteger.d.ts +3 -0
  477. gaia/eval/webapp/node_modules/math-intrinsics/isInteger.js +16 -0
  478. gaia/eval/webapp/node_modules/math-intrinsics/isNaN.d.ts +1 -0
  479. gaia/eval/webapp/node_modules/math-intrinsics/isNaN.js +6 -0
  480. gaia/eval/webapp/node_modules/math-intrinsics/isNegativeZero.d.ts +3 -0
  481. gaia/eval/webapp/node_modules/math-intrinsics/isNegativeZero.js +6 -0
  482. gaia/eval/webapp/node_modules/math-intrinsics/max.d.ts +1 -0
  483. gaia/eval/webapp/node_modules/math-intrinsics/max.js +4 -0
  484. gaia/eval/webapp/node_modules/math-intrinsics/min.d.ts +1 -0
  485. gaia/eval/webapp/node_modules/math-intrinsics/min.js +4 -0
  486. gaia/eval/webapp/node_modules/math-intrinsics/mod.d.ts +3 -0
  487. gaia/eval/webapp/node_modules/math-intrinsics/mod.js +9 -0
  488. gaia/eval/webapp/node_modules/math-intrinsics/package.json +86 -0
  489. gaia/eval/webapp/node_modules/math-intrinsics/pow.d.ts +1 -0
  490. gaia/eval/webapp/node_modules/math-intrinsics/pow.js +4 -0
  491. gaia/eval/webapp/node_modules/math-intrinsics/round.d.ts +1 -0
  492. gaia/eval/webapp/node_modules/math-intrinsics/round.js +4 -0
  493. gaia/eval/webapp/node_modules/math-intrinsics/sign.d.ts +3 -0
  494. gaia/eval/webapp/node_modules/math-intrinsics/sign.js +11 -0
  495. gaia/eval/webapp/node_modules/math-intrinsics/test/index.js +192 -0
  496. gaia/eval/webapp/node_modules/math-intrinsics/tsconfig.json +3 -0
  497. gaia/eval/webapp/node_modules/media-typer/HISTORY.md +22 -0
  498. gaia/eval/webapp/node_modules/media-typer/LICENSE +22 -0
  499. gaia/eval/webapp/node_modules/media-typer/README.md +81 -0
  500. gaia/eval/webapp/node_modules/media-typer/index.js +270 -0
  501. gaia/eval/webapp/node_modules/media-typer/package.json +26 -0
  502. gaia/eval/webapp/node_modules/merge-descriptors/HISTORY.md +21 -0
  503. gaia/eval/webapp/node_modules/merge-descriptors/LICENSE +23 -0
  504. gaia/eval/webapp/node_modules/merge-descriptors/README.md +49 -0
  505. gaia/eval/webapp/node_modules/merge-descriptors/index.js +60 -0
  506. gaia/eval/webapp/node_modules/merge-descriptors/package.json +39 -0
  507. gaia/eval/webapp/node_modules/methods/HISTORY.md +29 -0
  508. gaia/eval/webapp/node_modules/methods/LICENSE +24 -0
  509. gaia/eval/webapp/node_modules/methods/README.md +51 -0
  510. gaia/eval/webapp/node_modules/methods/index.js +69 -0
  511. gaia/eval/webapp/node_modules/methods/package.json +36 -0
  512. gaia/eval/webapp/node_modules/mime/.npmignore +0 -0
  513. gaia/eval/webapp/node_modules/mime/CHANGELOG.md +164 -0
  514. gaia/eval/webapp/node_modules/mime/LICENSE +21 -0
  515. gaia/eval/webapp/node_modules/mime/README.md +90 -0
  516. gaia/eval/webapp/node_modules/mime/cli.js +8 -0
  517. gaia/eval/webapp/node_modules/mime/mime.js +108 -0
  518. gaia/eval/webapp/node_modules/mime/package.json +44 -0
  519. gaia/eval/webapp/node_modules/mime/src/build.js +53 -0
  520. gaia/eval/webapp/node_modules/mime/src/test.js +60 -0
  521. gaia/eval/webapp/node_modules/mime/types.json +1 -0
  522. gaia/eval/webapp/node_modules/mime-db/HISTORY.md +507 -0
  523. gaia/eval/webapp/node_modules/mime-db/LICENSE +23 -0
  524. gaia/eval/webapp/node_modules/mime-db/README.md +100 -0
  525. gaia/eval/webapp/node_modules/mime-db/db.json +8519 -0
  526. gaia/eval/webapp/node_modules/mime-db/index.js +12 -0
  527. gaia/eval/webapp/node_modules/mime-db/package.json +60 -0
  528. gaia/eval/webapp/node_modules/mime-types/HISTORY.md +397 -0
  529. gaia/eval/webapp/node_modules/mime-types/LICENSE +23 -0
  530. gaia/eval/webapp/node_modules/mime-types/README.md +113 -0
  531. gaia/eval/webapp/node_modules/mime-types/index.js +188 -0
  532. gaia/eval/webapp/node_modules/mime-types/package.json +44 -0
  533. gaia/eval/webapp/node_modules/ms/index.js +152 -0
  534. gaia/eval/webapp/node_modules/ms/license.md +21 -0
  535. gaia/eval/webapp/node_modules/ms/package.json +37 -0
  536. gaia/eval/webapp/node_modules/ms/readme.md +51 -0
  537. gaia/eval/webapp/node_modules/negotiator/HISTORY.md +108 -0
  538. gaia/eval/webapp/node_modules/negotiator/LICENSE +24 -0
  539. gaia/eval/webapp/node_modules/negotiator/README.md +203 -0
  540. gaia/eval/webapp/node_modules/negotiator/index.js +82 -0
  541. gaia/eval/webapp/node_modules/negotiator/lib/charset.js +169 -0
  542. gaia/eval/webapp/node_modules/negotiator/lib/encoding.js +184 -0
  543. gaia/eval/webapp/node_modules/negotiator/lib/language.js +179 -0
  544. gaia/eval/webapp/node_modules/negotiator/lib/mediaType.js +294 -0
  545. gaia/eval/webapp/node_modules/negotiator/package.json +42 -0
  546. gaia/eval/webapp/node_modules/object-inspect/.eslintrc +53 -0
  547. gaia/eval/webapp/node_modules/object-inspect/.github/FUNDING.yml +12 -0
  548. gaia/eval/webapp/node_modules/object-inspect/.nycrc +13 -0
  549. gaia/eval/webapp/node_modules/object-inspect/CHANGELOG.md +424 -0
  550. gaia/eval/webapp/node_modules/object-inspect/LICENSE +21 -0
  551. gaia/eval/webapp/node_modules/object-inspect/example/all.js +23 -0
  552. gaia/eval/webapp/node_modules/object-inspect/example/circular.js +6 -0
  553. gaia/eval/webapp/node_modules/object-inspect/example/fn.js +5 -0
  554. gaia/eval/webapp/node_modules/object-inspect/example/inspect.js +10 -0
  555. gaia/eval/webapp/node_modules/object-inspect/index.js +544 -0
  556. gaia/eval/webapp/node_modules/object-inspect/package-support.json +20 -0
  557. gaia/eval/webapp/node_modules/object-inspect/package.json +105 -0
  558. gaia/eval/webapp/node_modules/object-inspect/readme.markdown +84 -0
  559. gaia/eval/webapp/node_modules/object-inspect/test/bigint.js +58 -0
  560. gaia/eval/webapp/node_modules/object-inspect/test/browser/dom.js +15 -0
  561. gaia/eval/webapp/node_modules/object-inspect/test/circular.js +16 -0
  562. gaia/eval/webapp/node_modules/object-inspect/test/deep.js +12 -0
  563. gaia/eval/webapp/node_modules/object-inspect/test/element.js +53 -0
  564. gaia/eval/webapp/node_modules/object-inspect/test/err.js +48 -0
  565. gaia/eval/webapp/node_modules/object-inspect/test/fakes.js +29 -0
  566. gaia/eval/webapp/node_modules/object-inspect/test/fn.js +76 -0
  567. gaia/eval/webapp/node_modules/object-inspect/test/global.js +17 -0
  568. gaia/eval/webapp/node_modules/object-inspect/test/has.js +15 -0
  569. gaia/eval/webapp/node_modules/object-inspect/test/holes.js +15 -0
  570. gaia/eval/webapp/node_modules/object-inspect/test/indent-option.js +271 -0
  571. gaia/eval/webapp/node_modules/object-inspect/test/inspect.js +139 -0
  572. gaia/eval/webapp/node_modules/object-inspect/test/lowbyte.js +12 -0
  573. gaia/eval/webapp/node_modules/object-inspect/test/number.js +58 -0
  574. gaia/eval/webapp/node_modules/object-inspect/test/quoteStyle.js +26 -0
  575. gaia/eval/webapp/node_modules/object-inspect/test/toStringTag.js +40 -0
  576. gaia/eval/webapp/node_modules/object-inspect/test/undef.js +12 -0
  577. gaia/eval/webapp/node_modules/object-inspect/test/values.js +261 -0
  578. gaia/eval/webapp/node_modules/object-inspect/test-core-js.js +26 -0
  579. gaia/eval/webapp/node_modules/object-inspect/util.inspect.js +1 -0
  580. gaia/eval/webapp/node_modules/on-finished/HISTORY.md +98 -0
  581. gaia/eval/webapp/node_modules/on-finished/LICENSE +23 -0
  582. gaia/eval/webapp/node_modules/on-finished/README.md +162 -0
  583. gaia/eval/webapp/node_modules/on-finished/index.js +234 -0
  584. gaia/eval/webapp/node_modules/on-finished/package.json +39 -0
  585. gaia/eval/webapp/node_modules/parseurl/HISTORY.md +58 -0
  586. gaia/eval/webapp/node_modules/parseurl/LICENSE +24 -0
  587. gaia/eval/webapp/node_modules/parseurl/README.md +133 -0
  588. gaia/eval/webapp/node_modules/parseurl/index.js +158 -0
  589. gaia/eval/webapp/node_modules/parseurl/package.json +40 -0
  590. gaia/eval/webapp/node_modules/path/.npmignore +1 -0
  591. gaia/eval/webapp/node_modules/path/LICENSE +18 -0
  592. gaia/eval/webapp/node_modules/path/README.md +15 -0
  593. gaia/eval/webapp/node_modules/path/package.json +24 -0
  594. gaia/eval/webapp/node_modules/path/path.js +628 -0
  595. gaia/eval/webapp/node_modules/path-to-regexp/LICENSE +21 -0
  596. gaia/eval/webapp/node_modules/path-to-regexp/Readme.md +35 -0
  597. gaia/eval/webapp/node_modules/path-to-regexp/index.js +156 -0
  598. gaia/eval/webapp/node_modules/path-to-regexp/package.json +30 -0
  599. gaia/eval/webapp/node_modules/process/.eslintrc +21 -0
  600. gaia/eval/webapp/node_modules/process/LICENSE +22 -0
  601. gaia/eval/webapp/node_modules/process/README.md +26 -0
  602. gaia/eval/webapp/node_modules/process/browser.js +184 -0
  603. gaia/eval/webapp/node_modules/process/index.js +2 -0
  604. gaia/eval/webapp/node_modules/process/package.json +27 -0
  605. gaia/eval/webapp/node_modules/process/test.js +199 -0
  606. gaia/eval/webapp/node_modules/proxy-addr/HISTORY.md +161 -0
  607. gaia/eval/webapp/node_modules/proxy-addr/LICENSE +22 -0
  608. gaia/eval/webapp/node_modules/proxy-addr/README.md +139 -0
  609. gaia/eval/webapp/node_modules/proxy-addr/index.js +327 -0
  610. gaia/eval/webapp/node_modules/proxy-addr/package.json +47 -0
  611. gaia/eval/webapp/node_modules/qs/.editorconfig +46 -0
  612. gaia/eval/webapp/node_modules/qs/.eslintrc +38 -0
  613. gaia/eval/webapp/node_modules/qs/.github/FUNDING.yml +12 -0
  614. gaia/eval/webapp/node_modules/qs/.nycrc +13 -0
  615. gaia/eval/webapp/node_modules/qs/CHANGELOG.md +600 -0
  616. gaia/eval/webapp/node_modules/qs/LICENSE.md +29 -0
  617. gaia/eval/webapp/node_modules/qs/README.md +709 -0
  618. gaia/eval/webapp/node_modules/qs/dist/qs.js +90 -0
  619. gaia/eval/webapp/node_modules/qs/lib/formats.js +23 -0
  620. gaia/eval/webapp/node_modules/qs/lib/index.js +11 -0
  621. gaia/eval/webapp/node_modules/qs/lib/parse.js +296 -0
  622. gaia/eval/webapp/node_modules/qs/lib/stringify.js +351 -0
  623. gaia/eval/webapp/node_modules/qs/lib/utils.js +265 -0
  624. gaia/eval/webapp/node_modules/qs/package.json +91 -0
  625. gaia/eval/webapp/node_modules/qs/test/empty-keys-cases.js +267 -0
  626. gaia/eval/webapp/node_modules/qs/test/parse.js +1170 -0
  627. gaia/eval/webapp/node_modules/qs/test/stringify.js +1298 -0
  628. gaia/eval/webapp/node_modules/qs/test/utils.js +136 -0
  629. gaia/eval/webapp/node_modules/range-parser/HISTORY.md +56 -0
  630. gaia/eval/webapp/node_modules/range-parser/LICENSE +23 -0
  631. gaia/eval/webapp/node_modules/range-parser/README.md +84 -0
  632. gaia/eval/webapp/node_modules/range-parser/index.js +162 -0
  633. gaia/eval/webapp/node_modules/range-parser/package.json +44 -0
  634. gaia/eval/webapp/node_modules/raw-body/HISTORY.md +308 -0
  635. gaia/eval/webapp/node_modules/raw-body/LICENSE +22 -0
  636. gaia/eval/webapp/node_modules/raw-body/README.md +223 -0
  637. gaia/eval/webapp/node_modules/raw-body/SECURITY.md +24 -0
  638. gaia/eval/webapp/node_modules/raw-body/index.d.ts +87 -0
  639. gaia/eval/webapp/node_modules/raw-body/index.js +336 -0
  640. gaia/eval/webapp/node_modules/raw-body/package.json +49 -0
  641. gaia/eval/webapp/node_modules/safe-buffer/LICENSE +21 -0
  642. gaia/eval/webapp/node_modules/safe-buffer/README.md +584 -0
  643. gaia/eval/webapp/node_modules/safe-buffer/index.d.ts +187 -0
  644. gaia/eval/webapp/node_modules/safe-buffer/index.js +65 -0
  645. gaia/eval/webapp/node_modules/safe-buffer/package.json +51 -0
  646. gaia/eval/webapp/node_modules/safer-buffer/LICENSE +21 -0
  647. gaia/eval/webapp/node_modules/safer-buffer/Porting-Buffer.md +268 -0
  648. gaia/eval/webapp/node_modules/safer-buffer/Readme.md +156 -0
  649. gaia/eval/webapp/node_modules/safer-buffer/dangerous.js +58 -0
  650. gaia/eval/webapp/node_modules/safer-buffer/package.json +34 -0
  651. gaia/eval/webapp/node_modules/safer-buffer/safer.js +77 -0
  652. gaia/eval/webapp/node_modules/safer-buffer/tests.js +406 -0
  653. gaia/eval/webapp/node_modules/send/HISTORY.md +526 -0
  654. gaia/eval/webapp/node_modules/send/LICENSE +23 -0
  655. gaia/eval/webapp/node_modules/send/README.md +327 -0
  656. gaia/eval/webapp/node_modules/send/SECURITY.md +24 -0
  657. gaia/eval/webapp/node_modules/send/index.js +1142 -0
  658. gaia/eval/webapp/node_modules/send/node_modules/encodeurl/HISTORY.md +14 -0
  659. gaia/eval/webapp/node_modules/send/node_modules/encodeurl/LICENSE +22 -0
  660. gaia/eval/webapp/node_modules/send/node_modules/encodeurl/README.md +128 -0
  661. gaia/eval/webapp/node_modules/send/node_modules/encodeurl/index.js +60 -0
  662. gaia/eval/webapp/node_modules/send/node_modules/encodeurl/package.json +40 -0
  663. gaia/eval/webapp/node_modules/send/node_modules/ms/index.js +162 -0
  664. gaia/eval/webapp/node_modules/send/node_modules/ms/license.md +21 -0
  665. gaia/eval/webapp/node_modules/send/node_modules/ms/package.json +38 -0
  666. gaia/eval/webapp/node_modules/send/node_modules/ms/readme.md +59 -0
  667. gaia/eval/webapp/node_modules/send/package.json +62 -0
  668. gaia/eval/webapp/node_modules/serve-static/HISTORY.md +487 -0
  669. gaia/eval/webapp/node_modules/serve-static/LICENSE +25 -0
  670. gaia/eval/webapp/node_modules/serve-static/README.md +257 -0
  671. gaia/eval/webapp/node_modules/serve-static/index.js +209 -0
  672. gaia/eval/webapp/node_modules/serve-static/package.json +42 -0
  673. gaia/eval/webapp/node_modules/setprototypeof/LICENSE +13 -0
  674. gaia/eval/webapp/node_modules/setprototypeof/README.md +31 -0
  675. gaia/eval/webapp/node_modules/setprototypeof/index.d.ts +2 -0
  676. gaia/eval/webapp/node_modules/setprototypeof/index.js +17 -0
  677. gaia/eval/webapp/node_modules/setprototypeof/package.json +38 -0
  678. gaia/eval/webapp/node_modules/setprototypeof/test/index.js +24 -0
  679. gaia/eval/webapp/node_modules/side-channel/.editorconfig +9 -0
  680. gaia/eval/webapp/node_modules/side-channel/.eslintrc +12 -0
  681. gaia/eval/webapp/node_modules/side-channel/.github/FUNDING.yml +12 -0
  682. gaia/eval/webapp/node_modules/side-channel/.nycrc +13 -0
  683. gaia/eval/webapp/node_modules/side-channel/CHANGELOG.md +110 -0
  684. gaia/eval/webapp/node_modules/side-channel/LICENSE +21 -0
  685. gaia/eval/webapp/node_modules/side-channel/README.md +61 -0
  686. gaia/eval/webapp/node_modules/side-channel/index.d.ts +14 -0
  687. gaia/eval/webapp/node_modules/side-channel/index.js +43 -0
  688. gaia/eval/webapp/node_modules/side-channel/package.json +85 -0
  689. gaia/eval/webapp/node_modules/side-channel/test/index.js +104 -0
  690. gaia/eval/webapp/node_modules/side-channel/tsconfig.json +9 -0
  691. gaia/eval/webapp/node_modules/side-channel-list/.editorconfig +9 -0
  692. gaia/eval/webapp/node_modules/side-channel-list/.eslintrc +11 -0
  693. gaia/eval/webapp/node_modules/side-channel-list/.github/FUNDING.yml +12 -0
  694. gaia/eval/webapp/node_modules/side-channel-list/.nycrc +13 -0
  695. gaia/eval/webapp/node_modules/side-channel-list/CHANGELOG.md +15 -0
  696. gaia/eval/webapp/node_modules/side-channel-list/LICENSE +21 -0
  697. gaia/eval/webapp/node_modules/side-channel-list/README.md +62 -0
  698. gaia/eval/webapp/node_modules/side-channel-list/index.d.ts +13 -0
  699. gaia/eval/webapp/node_modules/side-channel-list/index.js +113 -0
  700. gaia/eval/webapp/node_modules/side-channel-list/list.d.ts +14 -0
  701. gaia/eval/webapp/node_modules/side-channel-list/package.json +77 -0
  702. gaia/eval/webapp/node_modules/side-channel-list/test/index.js +104 -0
  703. gaia/eval/webapp/node_modules/side-channel-list/tsconfig.json +9 -0
  704. gaia/eval/webapp/node_modules/side-channel-map/.editorconfig +9 -0
  705. gaia/eval/webapp/node_modules/side-channel-map/.eslintrc +11 -0
  706. gaia/eval/webapp/node_modules/side-channel-map/.github/FUNDING.yml +12 -0
  707. gaia/eval/webapp/node_modules/side-channel-map/.nycrc +13 -0
  708. gaia/eval/webapp/node_modules/side-channel-map/CHANGELOG.md +22 -0
  709. gaia/eval/webapp/node_modules/side-channel-map/LICENSE +21 -0
  710. gaia/eval/webapp/node_modules/side-channel-map/README.md +62 -0
  711. gaia/eval/webapp/node_modules/side-channel-map/index.d.ts +15 -0
  712. gaia/eval/webapp/node_modules/side-channel-map/index.js +68 -0
  713. gaia/eval/webapp/node_modules/side-channel-map/package.json +80 -0
  714. gaia/eval/webapp/node_modules/side-channel-map/test/index.js +114 -0
  715. gaia/eval/webapp/node_modules/side-channel-map/tsconfig.json +9 -0
  716. gaia/eval/webapp/node_modules/side-channel-weakmap/.editorconfig +9 -0
  717. gaia/eval/webapp/node_modules/side-channel-weakmap/.eslintrc +12 -0
  718. gaia/eval/webapp/node_modules/side-channel-weakmap/.github/FUNDING.yml +12 -0
  719. gaia/eval/webapp/node_modules/side-channel-weakmap/.nycrc +13 -0
  720. gaia/eval/webapp/node_modules/side-channel-weakmap/CHANGELOG.md +28 -0
  721. gaia/eval/webapp/node_modules/side-channel-weakmap/LICENSE +21 -0
  722. gaia/eval/webapp/node_modules/side-channel-weakmap/README.md +62 -0
  723. gaia/eval/webapp/node_modules/side-channel-weakmap/index.d.ts +15 -0
  724. gaia/eval/webapp/node_modules/side-channel-weakmap/index.js +84 -0
  725. gaia/eval/webapp/node_modules/side-channel-weakmap/package.json +87 -0
  726. gaia/eval/webapp/node_modules/side-channel-weakmap/test/index.js +114 -0
  727. gaia/eval/webapp/node_modules/side-channel-weakmap/tsconfig.json +9 -0
  728. gaia/eval/webapp/node_modules/statuses/HISTORY.md +82 -0
  729. gaia/eval/webapp/node_modules/statuses/LICENSE +23 -0
  730. gaia/eval/webapp/node_modules/statuses/README.md +136 -0
  731. gaia/eval/webapp/node_modules/statuses/codes.json +65 -0
  732. gaia/eval/webapp/node_modules/statuses/index.js +146 -0
  733. gaia/eval/webapp/node_modules/statuses/package.json +49 -0
  734. gaia/eval/webapp/node_modules/toidentifier/HISTORY.md +9 -0
  735. gaia/eval/webapp/node_modules/toidentifier/LICENSE +21 -0
  736. gaia/eval/webapp/node_modules/toidentifier/README.md +61 -0
  737. gaia/eval/webapp/node_modules/toidentifier/index.js +32 -0
  738. gaia/eval/webapp/node_modules/toidentifier/package.json +38 -0
  739. gaia/eval/webapp/node_modules/type-is/HISTORY.md +259 -0
  740. gaia/eval/webapp/node_modules/type-is/LICENSE +23 -0
  741. gaia/eval/webapp/node_modules/type-is/README.md +170 -0
  742. gaia/eval/webapp/node_modules/type-is/index.js +266 -0
  743. gaia/eval/webapp/node_modules/type-is/package.json +45 -0
  744. gaia/eval/webapp/node_modules/unpipe/HISTORY.md +4 -0
  745. gaia/eval/webapp/node_modules/unpipe/LICENSE +22 -0
  746. gaia/eval/webapp/node_modules/unpipe/README.md +43 -0
  747. gaia/eval/webapp/node_modules/unpipe/index.js +69 -0
  748. gaia/eval/webapp/node_modules/unpipe/package.json +27 -0
  749. gaia/eval/webapp/node_modules/util/LICENSE +18 -0
  750. gaia/eval/webapp/node_modules/util/README.md +15 -0
  751. gaia/eval/webapp/node_modules/util/node_modules/inherits/LICENSE +16 -0
  752. gaia/eval/webapp/node_modules/util/node_modules/inherits/README.md +42 -0
  753. gaia/eval/webapp/node_modules/util/node_modules/inherits/inherits.js +7 -0
  754. gaia/eval/webapp/node_modules/util/node_modules/inherits/inherits_browser.js +23 -0
  755. gaia/eval/webapp/node_modules/util/node_modules/inherits/package.json +29 -0
  756. gaia/eval/webapp/node_modules/util/package.json +35 -0
  757. gaia/eval/webapp/node_modules/util/support/isBuffer.js +3 -0
  758. gaia/eval/webapp/node_modules/util/support/isBufferBrowser.js +6 -0
  759. gaia/eval/webapp/node_modules/util/util.js +586 -0
  760. gaia/eval/webapp/node_modules/utils-merge/.npmignore +9 -0
  761. gaia/eval/webapp/node_modules/utils-merge/LICENSE +20 -0
  762. gaia/eval/webapp/node_modules/utils-merge/README.md +34 -0
  763. gaia/eval/webapp/node_modules/utils-merge/index.js +23 -0
  764. gaia/eval/webapp/node_modules/utils-merge/package.json +40 -0
  765. gaia/eval/webapp/node_modules/vary/HISTORY.md +39 -0
  766. gaia/eval/webapp/node_modules/vary/LICENSE +22 -0
  767. gaia/eval/webapp/node_modules/vary/README.md +101 -0
  768. gaia/eval/webapp/node_modules/vary/index.js +149 -0
  769. gaia/eval/webapp/node_modules/vary/package.json +43 -0
  770. gaia/eval/webapp/package-lock.json +875 -0
  771. gaia/eval/webapp/package.json +21 -0
  772. gaia/eval/webapp/public/app.js +3403 -0
  773. gaia/eval/webapp/public/index.html +88 -0
  774. gaia/eval/webapp/public/styles.css +3661 -0
  775. gaia/eval/webapp/server.js +416 -0
  776. gaia/eval/webapp/test-setup.js +73 -0
  777. gaia/llm/__init__.py +2 -0
  778. gaia/llm/lemonade_client.py +3083 -0
  779. gaia/llm/lemonade_manager.py +269 -0
  780. gaia/llm/llm_client.py +729 -0
  781. gaia/llm/vlm_client.py +307 -0
  782. gaia/logger.py +189 -0
  783. gaia/mcp/agent_mcp_server.py +245 -0
  784. gaia/mcp/blender_mcp_client.py +138 -0
  785. gaia/mcp/blender_mcp_server.py +648 -0
  786. gaia/mcp/context7_cache.py +332 -0
  787. gaia/mcp/external_services.py +518 -0
  788. gaia/mcp/mcp_bridge.py +550 -0
  789. gaia/mcp/servers/__init__.py +6 -0
  790. gaia/mcp/servers/docker_mcp.py +83 -0
  791. gaia/rag/__init__.py +10 -0
  792. gaia/rag/app.py +293 -0
  793. gaia/rag/demo.py +304 -0
  794. gaia/rag/pdf_utils.py +235 -0
  795. gaia/rag/sdk.py +2194 -0
  796. gaia/security.py +163 -0
  797. gaia/talk/app.py +289 -0
  798. gaia/talk/sdk.py +538 -0
  799. gaia/util.py +46 -0
  800. gaia/version.py +100 -0
@@ -0,0 +1,1347 @@
1
+ # Copyright(C) 2024-2025 Advanced Micro Devices, Inc. All rights reserved.
2
+ # SPDX-License-Identifier: MIT
3
+ """Error fixing tools mixin for Code Agent."""
4
+
5
+ import ast
6
+ import logging
7
+ import os
8
+ from datetime import datetime
9
+ from pathlib import Path
10
+ from typing import Any, Dict, List
11
+
12
+ logger = logging.getLogger(__name__)
13
+
14
+
15
+ class ErrorFixingMixin:
16
+ """Mixin providing error fixing, correction, and workflow planning tools.
17
+
18
+ This mixin provides tools for:
19
+ - Automatic syntax error detection and fixing
20
+ - Fixing code based on error messages
21
+ - Fixing pylint linting errors
22
+ - Fixing Python runtime errors
23
+ - Creating architectural plans (PLAN.md)
24
+ - Creating project structures from plans
25
+ - Creating workflow plans for complex tasks
26
+ - Initializing and updating GAIA.md project context
27
+
28
+ Tools provided:
29
+ - auto_fix_syntax_errors: Scan and fix syntax errors in Python files
30
+ - fix_code: Fix code based on error description
31
+ - fix_linting_errors: Fix pylint issues in code
32
+ - fix_python_errors: Fix runtime errors in Python code
33
+ - create_architectural_plan: Generate PLAN.md for projects
34
+ - create_project_structure: Create folder structure from plan
35
+ - create_workflow_plan: Plan complex multi-step workflows
36
+ - init_gaia_md: Initialize GAIA.md from codebase analysis
37
+ - update_gaia_md: Update GAIA.md with new information
38
+ """
39
+
40
+ def register_error_fixing_tools(self) -> None:
41
+ """Register error fixing tools."""
42
+ from gaia.agents.base.tools import tool
43
+
44
+ @tool
45
+ def auto_fix_syntax_errors(project_path: str) -> Dict[str, Any]:
46
+ """Automatically detect and fix syntax errors in Python files.
47
+
48
+ Args:
49
+ project_path: Path to the project directory to scan and fix
50
+
51
+ Returns:
52
+ Dictionary with fix results
53
+ """
54
+ try:
55
+ import glob
56
+
57
+ fixed_files = []
58
+ errors_found = []
59
+
60
+ # Find all Python files in the project
61
+ python_files = glob.glob(
62
+ os.path.join(project_path, "**/*.py"), recursive=True
63
+ )
64
+
65
+ for file_path in python_files:
66
+ # Read and analyze the file
67
+ try:
68
+ with open(file_path, "r", encoding="utf-8") as f:
69
+ content = f.read()
70
+
71
+ # Check syntax using AST
72
+ try:
73
+ ast.parse(content)
74
+ is_valid = True
75
+ errors = []
76
+ except SyntaxError as e:
77
+ is_valid = False
78
+ errors = [f"Line {e.lineno}: {e.msg}"]
79
+
80
+ result = {
81
+ "status": "success",
82
+ "is_valid": is_valid,
83
+ "errors": errors,
84
+ }
85
+ except Exception as e:
86
+ result = {"status": "error", "error": str(e)}
87
+
88
+ if result.get("status") == "success" and not result.get(
89
+ "is_valid", True
90
+ ):
91
+ errors = result.get("errors", [])
92
+ self.console.print_warning(
93
+ f"🔧 Fixing syntax errors in {os.path.basename(file_path)}"
94
+ )
95
+
96
+ # Read the file content
97
+ with open(file_path, "r", encoding="utf-8") as f:
98
+ content = f.read()
99
+
100
+ # Use LLM to fix the code with context
101
+ error_msg = "; ".join(errors)
102
+ fixed_content = self._fix_code_with_llm(
103
+ content, file_path, error_msg
104
+ )
105
+
106
+ if fixed_content != content:
107
+ # Write the fixed content
108
+ with open(file_path, "w", encoding="utf-8") as f:
109
+ f.write(fixed_content)
110
+
111
+ fixed_files.append(
112
+ {"file": file_path, "errors_fixed": errors}
113
+ )
114
+ self.console.print_success(
115
+ f"✓ Fixed {os.path.basename(file_path)}"
116
+ )
117
+ else:
118
+ errors_found.append({"file": file_path, "errors": errors})
119
+
120
+ return {
121
+ "status": "success",
122
+ "files_fixed": len(fixed_files),
123
+ "errors_remaining": len(errors_found),
124
+ "fixed_files": fixed_files,
125
+ "errors_found": errors_found,
126
+ "message": f"🔧 Fixed {len(fixed_files)} files, {len(errors_found)} files still have errors",
127
+ }
128
+
129
+ except Exception as e:
130
+ return {"status": "error", "error": str(e)}
131
+
132
+ @tool
133
+ def fix_code(file_path: str, error_description: str = "") -> Dict[str, Any]:
134
+ """Fix Python code using LLM-driven analysis and correction.
135
+
136
+ Args:
137
+ file_path: Path to the Python file to fix
138
+ error_description: Optional description of the error to fix
139
+
140
+ Returns:
141
+ Dictionary with fix results
142
+ """
143
+ try:
144
+ # Verify file exists
145
+ if not os.path.exists(file_path):
146
+ return {
147
+ "status": "error",
148
+ "error": f"File not found: {file_path}. Use list_files to see available files.",
149
+ }
150
+
151
+ # Read the file
152
+ with open(file_path, "r", encoding="utf-8") as f:
153
+ content = f.read()
154
+
155
+ # If no error description provided, try to detect it
156
+ if not error_description:
157
+ try:
158
+ ast.parse(content)
159
+ return {
160
+ "status": "success",
161
+ "message": "No syntax errors found",
162
+ "file_modified": False,
163
+ }
164
+ except SyntaxError as e:
165
+ error_description = f"Line {e.lineno}: {e.msg}"
166
+
167
+ # Use LLM to fix the code
168
+ fixed_content = self._fix_code_with_llm(
169
+ content, file_path, error_description
170
+ )
171
+
172
+ if fixed_content != content:
173
+ # Generate diff before writing
174
+ import difflib
175
+
176
+ diff = "\n".join(
177
+ difflib.unified_diff(
178
+ content.splitlines(keepends=True),
179
+ fixed_content.splitlines(keepends=True),
180
+ fromfile=f"a/{os.path.basename(file_path)}",
181
+ tofile=f"b/{os.path.basename(file_path)}",
182
+ lineterm="",
183
+ )
184
+ )
185
+
186
+ # Display diff
187
+ if diff:
188
+ self.console.print_diff(diff, os.path.basename(file_path))
189
+
190
+ # Write the fixed content
191
+ with open(file_path, "w", encoding="utf-8") as f:
192
+ f.write(fixed_content)
193
+
194
+ return {
195
+ "status": "success",
196
+ "file_modified": True,
197
+ "original_lines": len(content.splitlines()),
198
+ "fixed_lines": len(fixed_content.splitlines()),
199
+ "diff": diff,
200
+ "message": f"Fixed {os.path.basename(file_path)}",
201
+ }
202
+ else:
203
+ console = getattr(self, "console", None)
204
+ if console:
205
+ console.print_info(
206
+ f"fix_code: No changes were made to {os.path.basename(file_path)}"
207
+ )
208
+ return {
209
+ "status": "info",
210
+ "file_modified": False,
211
+ "message": "No changes needed",
212
+ }
213
+
214
+ except Exception as e:
215
+ return {"status": "error", "error": str(e)}
216
+
217
+ @tool
218
+ def create_architectural_plan(
219
+ query: str, project_type: str = "application"
220
+ ) -> Dict[str, Any]:
221
+ """Create a detailed architectural plan for a project.
222
+
223
+ Args:
224
+ query: The user's project requirements
225
+ project_type: Type of project (application, library, game, etc.)
226
+
227
+ Returns:
228
+ Dictionary with architectural plan
229
+ """
230
+ try:
231
+
232
+ # Analyze the query to extract key components
233
+ query_lower = query.lower()
234
+
235
+ # Default project structure based on type
236
+ if "game" in query_lower or "arcade" in query_lower:
237
+ project_type = "game"
238
+ elif "api" in query_lower or "server" in query_lower:
239
+ project_type = "api"
240
+ elif "library" in query_lower or "package" in query_lower:
241
+ project_type = "library"
242
+
243
+ # Create the architecture based on analysis
244
+ plan = {
245
+ "project_name": "",
246
+ "project_type": project_type,
247
+ "description": query,
248
+ "created": datetime.now().isoformat(),
249
+ "architecture": {
250
+ "overview": "",
251
+ "components": [],
252
+ "folder_structure": {},
253
+ "files": [],
254
+ "classes": [],
255
+ "functions": [],
256
+ "dependencies": [],
257
+ },
258
+ "implementation_order": [],
259
+ }
260
+
261
+ # Analyze query to generate dynamic architecture
262
+ # Extract project name from query
263
+ if "create" in query_lower:
264
+ words = query.split()
265
+ idx = words.index("create") if "create" in words else 0
266
+ if idx + 1 < len(words):
267
+ project_words = words[idx + 1 : idx + 3]
268
+ plan["project_name"] = "_".join(
269
+ [w.lower() for w in project_words if w.isalpha()]
270
+ )
271
+ else:
272
+ plan["project_name"] = "project"
273
+ else:
274
+ # Try to extract a meaningful name
275
+ import re
276
+
277
+ nouns = re.findall(r"\b[A-Za-z]+\b", query)
278
+ plan["project_name"] = (
279
+ "_".join(nouns[:2]).lower() if nouns else "project"
280
+ )
281
+
282
+ plan["architecture"][
283
+ "overview"
284
+ ] = f"A {project_type} implementing: {query}"
285
+
286
+ # Generate dynamic folder structure based on project type
287
+ root_folder = plan["project_name"] + "/"
288
+
289
+ if project_type == "game":
290
+ plan["architecture"]["folder_structure"] = {
291
+ root_folder: {
292
+ "main.py": "Entry point and main loop",
293
+ "core/": {
294
+ "__init__.py": "Core package initialization",
295
+ "game.py": "Main game logic",
296
+ "entities.py": "Game entities and objects",
297
+ "physics.py": "Physics and collision detection",
298
+ },
299
+ "ui/": {
300
+ "__init__.py": "UI package initialization",
301
+ "renderer.py": "Rendering and display",
302
+ "menu.py": "Menu screens",
303
+ "hud.py": "HUD and score display",
304
+ },
305
+ "utils/": {
306
+ "__init__.py": "Utils package initialization",
307
+ "constants.py": "Game constants and settings",
308
+ "helpers.py": "Utility functions",
309
+ },
310
+ "assets/": "Game assets (images, sounds, etc.)",
311
+ "requirements.txt": "Python dependencies",
312
+ "README.md": "Project documentation",
313
+ "GAIA.md": "GAIA agent guidance",
314
+ }
315
+ }
316
+ # Dependencies will be determined based on actual game requirements
317
+ plan["architecture"]["dependencies"] = []
318
+ elif project_type == "api":
319
+ plan["architecture"]["folder_structure"] = {
320
+ root_folder: {
321
+ "main.py": "Application entry point",
322
+ "api/": {
323
+ "__init__.py": "API package initialization",
324
+ "routes.py": "API route definitions",
325
+ "models.py": "Data models",
326
+ "handlers.py": "Request handlers",
327
+ },
328
+ "core/": {
329
+ "__init__.py": "Core logic package",
330
+ "services.py": "Business logic services",
331
+ "database.py": "Database connections",
332
+ },
333
+ "utils/": {
334
+ "__init__.py": "Utilities package",
335
+ "validators.py": "Input validators",
336
+ "helpers.py": "Helper functions",
337
+ },
338
+ "tests/": {
339
+ "__init__.py": "Test package",
340
+ "test_api.py": "API tests",
341
+ "test_services.py": "Service tests",
342
+ },
343
+ "requirements.txt": "Python dependencies",
344
+ "README.md": "API documentation",
345
+ "GAIA.md": "GAIA agent guidance",
346
+ }
347
+ }
348
+ plan["architecture"]["dependencies"] = [
349
+ "fastapi>=0.100.0",
350
+ "uvicorn>=0.23.0",
351
+ ]
352
+ else:
353
+ # Default application structure
354
+ plan["architecture"]["folder_structure"] = {
355
+ root_folder: {
356
+ "main.py": "Application entry point",
357
+ "core/": {
358
+ "__init__.py": "Core package initialization",
359
+ "app.py": "Main application logic",
360
+ "models.py": "Data models",
361
+ "services.py": "Business logic",
362
+ },
363
+ "utils/": {
364
+ "__init__.py": "Utilities package",
365
+ "config.py": "Configuration management",
366
+ "helpers.py": "Helper functions",
367
+ },
368
+ "tests/": {
369
+ "__init__.py": "Test package",
370
+ "test_app.py": "Application tests",
371
+ "test_models.py": "Model tests",
372
+ },
373
+ "requirements.txt": "Python dependencies",
374
+ "README.md": "Project documentation",
375
+ "GAIA.md": "GAIA agent guidance",
376
+ }
377
+ }
378
+ plan["architecture"]["dependencies"] = []
379
+
380
+ # Generate dynamic class list based on project analysis
381
+ plan["architecture"][
382
+ "classes"
383
+ ] = [] # Will be populated based on actual requirements
384
+
385
+ # Generate implementation order
386
+ plan["implementation_order"] = [
387
+ "Create project structure",
388
+ "Set up configuration and constants",
389
+ "Implement core data models",
390
+ "Build main application logic",
391
+ "Add UI/API layer if needed",
392
+ "Implement utilities and helpers",
393
+ "Write unit tests",
394
+ "Add documentation",
395
+ "Test and refine",
396
+ ]
397
+
398
+ # Save the plan to PLAN.md
399
+ plan_content = f"# {plan['project_name']} - Architecture Plan\n\n"
400
+ plan_content += f"**Created:** {plan['created']}\n"
401
+ plan_content += f"**Type:** {plan['project_type']}\n\n"
402
+ plan_content += f"## Overview\n{plan['architecture']['overview']}\n\n"
403
+ plan_content += "## Project Structure\n```\n"
404
+
405
+ def format_structure(structure, indent=""):
406
+ result = ""
407
+ for key, value in structure.items():
408
+ if isinstance(value, dict):
409
+ result += f"{indent}{key}\\n"
410
+ result += format_structure(value, indent + " ")
411
+ else:
412
+ result += f"{indent}{key} - {value}\\n"
413
+ return result
414
+
415
+ plan_content += format_structure(
416
+ plan["architecture"]["folder_structure"]
417
+ )
418
+ plan_content += "```\n\n"
419
+
420
+ if plan["architecture"]["classes"]:
421
+ plan_content += "## Classes\n"
422
+ for cls in plan["architecture"]["classes"]:
423
+ plan_content += (
424
+ f"- **{cls['name']}** ({cls['file']}): {cls['purpose']}\n"
425
+ )
426
+ plan_content += "\n"
427
+
428
+ if plan["implementation_order"]:
429
+ plan_content += "## Implementation Order\n"
430
+ for i, step in enumerate(plan["implementation_order"], 1):
431
+ plan_content += f"{i}. {step}\n"
432
+ plan_content += "\n"
433
+
434
+ # Add execution steps with checkboxes to track progress
435
+ execution_steps = [
436
+ {
437
+ "step": 1,
438
+ "action": "create_plan",
439
+ "description": "Create architectural plan",
440
+ "completed": True,
441
+ },
442
+ {
443
+ "step": 2,
444
+ "action": "create_structure",
445
+ "description": "Create project folders and files",
446
+ "completed": False,
447
+ },
448
+ {
449
+ "step": 3,
450
+ "action": "implement",
451
+ "description": "Generate code for all components",
452
+ "completed": False,
453
+ },
454
+ {
455
+ "step": 4,
456
+ "action": "validate",
457
+ "description": "Lint and validate all code",
458
+ "completed": False,
459
+ },
460
+ {
461
+ "step": 5,
462
+ "action": "test",
463
+ "description": "Test and fix any issues",
464
+ "completed": False,
465
+ },
466
+ {
467
+ "step": 6,
468
+ "action": "finalize",
469
+ "description": "Verify complete implementation",
470
+ "completed": False,
471
+ },
472
+ ]
473
+
474
+ # Add execution steps to content
475
+ plan_content = plan_content.replace(
476
+ "## Implementation Order",
477
+ "## Execution Progress\n"
478
+ + "\n".join(
479
+ [
480
+ f"- [{'x' if step['completed'] else ' '}] Step {step['step']}: {step['description']}"
481
+ for step in execution_steps
482
+ ]
483
+ )
484
+ + "\n\n## Implementation Order",
485
+ )
486
+
487
+ # Write PLAN.md with checkboxes
488
+ plan_path = os.path.abspath("PLAN.md")
489
+ with open(plan_path, "w", encoding="utf-8") as f:
490
+ f.write(plan_content)
491
+
492
+ # Store the plan for later use (NOT the agent's execution plan)
493
+ self.plan = plan
494
+ self.plan["execution_steps"] = execution_steps
495
+ self.project_root = os.path.abspath(plan["project_name"])
496
+
497
+ return {
498
+ "status": "success",
499
+ "plan_created": True,
500
+ "plan_file": plan_path,
501
+ "project_name": plan["project_name"],
502
+ "num_files": len(
503
+ [
504
+ f
505
+ for f in str(
506
+ plan["architecture"]["folder_structure"]
507
+ ).split()
508
+ if "." in f
509
+ ]
510
+ ),
511
+ "num_classes": len(plan["architecture"]["classes"]),
512
+ "message": f"✅ Step 1/6: Created architectural plan for {plan['project_name']}",
513
+ }
514
+ except Exception as e:
515
+ return {"status": "error", "error": str(e)}
516
+
517
+ @tool
518
+ def create_project_structure() -> Dict[str, Any]:
519
+ """Create the project folder structure based on the current plan.
520
+
521
+ Returns:
522
+ Dictionary with creation results
523
+ """
524
+ try:
525
+ if not hasattr(self, "plan") or not self.plan:
526
+ return {
527
+ "status": "error",
528
+ "error": "No architectural plan found. Create a plan first.",
529
+ }
530
+
531
+ created_dirs = []
532
+ created_files = []
533
+
534
+ def create_structure(structure, base_path=""):
535
+ for name, content in structure.items():
536
+ full_path = os.path.join(base_path, name)
537
+
538
+ if name.endswith("/"):
539
+ # It's a directory
540
+ dir_path = full_path[:-1] # Remove trailing slash
541
+ os.makedirs(dir_path, exist_ok=True)
542
+ created_dirs.append(dir_path)
543
+
544
+ if isinstance(content, dict):
545
+ create_structure(content, dir_path)
546
+ else:
547
+ # It's a file
548
+ dir_name = os.path.dirname(full_path)
549
+ if dir_name:
550
+ os.makedirs(dir_name, exist_ok=True)
551
+
552
+ # Create empty file or with initial content
553
+ if not os.path.exists(full_path):
554
+ with open(full_path, "w", encoding="utf-8") as f:
555
+ if name == "__init__.py":
556
+ f.write('"""Package initialization."""\n')
557
+ elif name == "requirements.txt":
558
+ deps = self.plan["architecture"].get(
559
+ "dependencies", []
560
+ )
561
+ f.write("\n".join(deps))
562
+ elif name == "README.md":
563
+ f.write(f"# {self.plan['project_name']}\n\n")
564
+ f.write(
565
+ f"{self.plan['architecture']['overview']}\n"
566
+ )
567
+ elif name == "GAIA.md":
568
+ # Create GAIA.md for the project
569
+ # Note: This would be handled by update_gaia_md tool at runtime
570
+ f.write(
571
+ f"# GAIA.md\\n\\nProject: {self.plan['project_name']}\\n"
572
+ )
573
+ else:
574
+ f.write(
575
+ f'"""\n{content if isinstance(content, str) else "Module implementation"}\n"""\n'
576
+ )
577
+ created_files.append(full_path)
578
+
579
+ # Create the project structure
580
+ structure = self.plan["architecture"]["folder_structure"]
581
+ create_structure(structure)
582
+
583
+ # Update execution steps
584
+ if (
585
+ hasattr(self, "current_plan")
586
+ and self.plan
587
+ and "execution_steps" in self.plan
588
+ ):
589
+ self.plan["execution_steps"][1]["completed"] = True
590
+ # Update PLAN.md to reflect progress
591
+ self._update_plan_progress()
592
+
593
+ return {
594
+ "status": "success",
595
+ "project_root": self.project_root,
596
+ "dirs_created": len(created_dirs),
597
+ "files_created": len(created_files),
598
+ "created_dirs": created_dirs[:10], # First 10 dirs
599
+ "created_files": created_files[:10], # First 10 files
600
+ "message": f"✅ Step 2/6: Created {len(created_dirs)} directories and {len(created_files)} files",
601
+ }
602
+ except Exception as e:
603
+ return {"status": "error", "error": str(e)}
604
+
605
+ @tool
606
+ def implement_from_plan(
607
+ component: str = None, auto_implement_all: bool = False
608
+ ) -> Dict[str, Any]:
609
+ """Implement components based on the architectural plan.
610
+
611
+ Args:
612
+ component: Specific component to implement (e.g., "Snake", "game/snake.py")
613
+ auto_implement_all: Implement all components automatically
614
+
615
+ Returns:
616
+ Dictionary with implementation results
617
+ """
618
+ # component parameter reserved for future single-component implementation
619
+ _ = component # Will be used in future versions
620
+ try:
621
+ if not hasattr(self, "plan") or not self.plan:
622
+ return {
623
+ "status": "error",
624
+ "error": "No architectural plan found. Create a plan first.",
625
+ }
626
+
627
+ implemented = []
628
+ errors = []
629
+
630
+ # Get classes to implement
631
+ classes = self.plan["architecture"].get("classes", [])
632
+
633
+ # Generate implementations for all files in the project structure
634
+ if auto_implement_all and hasattr(self, "plan") and self.plan:
635
+ # Get list of Python files from the project structure
636
+ structure = self.plan.get("architecture", {}).get(
637
+ "folder_structure", {}
638
+ )
639
+ python_files = self._extract_python_files(structure)
640
+
641
+ # Generate code for each file based on its purpose
642
+ if not python_files:
643
+ logger.warning("No Python files found in project structure")
644
+
645
+ for file_info in python_files:
646
+ try:
647
+ file_path = os.path.join(
648
+ self.project_root or "", file_info["path"]
649
+ )
650
+
651
+ logger.info(f"Generating code for {file_path}")
652
+
653
+ # Generate contextual code based on filename and project type
654
+ code = self._generate_code_for_file(
655
+ filename=file_info["name"],
656
+ purpose=file_info["purpose"],
657
+ context=self.plan.get("description", ""),
658
+ )
659
+
660
+ # Ensure directory exists
661
+ dir_path = os.path.dirname(file_path)
662
+ if dir_path:
663
+ os.makedirs(dir_path, exist_ok=True)
664
+
665
+ # Write the generated code
666
+ with open(file_path, "w", encoding="utf-8") as f:
667
+ f.write(code)
668
+
669
+ implemented.append(
670
+ {
671
+ "file": file_path,
672
+ "status": "success",
673
+ "lines": len(code.splitlines()),
674
+ }
675
+ )
676
+ logger.info(f"Successfully generated {file_path}")
677
+ except Exception as e:
678
+ logger.error(
679
+ f"Failed to generate {file_info['path']}: {str(e)}"
680
+ )
681
+ errors.append({"file": file_info["path"], "error": str(e)})
682
+
683
+ elif auto_implement_all and classes:
684
+ # Original class implementation logic
685
+ for cls_info in classes:
686
+ try:
687
+ # Generate class implementation
688
+ file_path = os.path.join(
689
+ self.project_root or "", cls_info["file"]
690
+ )
691
+
692
+ # Generate generic class implementation based on purpose
693
+ code = f'''"""Implementation of {cls_info['name']}."""
694
+
695
+
696
+ class {cls_info['name']}:
697
+ """{cls_info['purpose']}"""
698
+
699
+ def __init__(self):
700
+ """Initialize {cls_info['name']}."""
701
+ # TODO: Add initialization logic based on requirements
702
+ pass
703
+
704
+ # TODO: Add methods based on class purpose
705
+ '''
706
+
707
+ # Create directories if needed
708
+ os.makedirs(os.path.dirname(file_path), exist_ok=True)
709
+
710
+ # Write the implementation
711
+ with open(file_path, "w", encoding="utf-8") as f:
712
+ f.write(code)
713
+
714
+ implemented.append(
715
+ {
716
+ "class": cls_info["name"],
717
+ "file": file_path,
718
+ "status": "success",
719
+ }
720
+ )
721
+ except Exception as e:
722
+ errors.append({"class": cls_info["name"], "error": str(e)})
723
+
724
+ # Update execution steps
725
+ if (
726
+ hasattr(self, "current_plan")
727
+ and self.plan
728
+ and "execution_steps" in self.plan
729
+ ):
730
+ self.plan["execution_steps"][2]["completed"] = True
731
+ # Update PLAN.md to reflect progress
732
+ self._update_plan_progress()
733
+
734
+ return {
735
+ "status": "success",
736
+ "implemented": implemented,
737
+ "errors": errors,
738
+ "total_implemented": len(implemented),
739
+ "total_errors": len(errors),
740
+ "message": f"✅ Step 3/6: Implemented {len(implemented)} components",
741
+ }
742
+ except Exception as e:
743
+ return {"status": "error", "error": str(e)}
744
+
745
+ @tool
746
+ def create_workflow_plan(query: str) -> Dict[str, Any]:
747
+ """Create a comprehensive workflow plan for a complex query.
748
+
749
+ Args:
750
+ query: The user's request or requirements
751
+
752
+ Returns:
753
+ Dictionary with workflow plan
754
+ """
755
+ # Analyze the query to determine required steps
756
+ steps = []
757
+
758
+ # Always start with understanding and generation
759
+ steps.append(
760
+ {
761
+ "step": 1,
762
+ "action": "analyze",
763
+ "description": "Understand requirements",
764
+ }
765
+ )
766
+ steps.append(
767
+ {
768
+ "step": 2,
769
+ "action": "generate",
770
+ "description": "Generate code solution",
771
+ }
772
+ )
773
+
774
+ # Add file operations if needed
775
+ if (
776
+ "file" in query.lower()
777
+ or "save" in query.lower()
778
+ or "write" in query.lower()
779
+ ):
780
+ steps.append(
781
+ {"step": 3, "action": "write", "description": "Save code to file"}
782
+ )
783
+
784
+ # Add validation steps
785
+ steps.append(
786
+ {
787
+ "step": len(steps) + 1,
788
+ "action": "validate",
789
+ "description": "Validate syntax",
790
+ }
791
+ )
792
+ steps.append(
793
+ {
794
+ "step": len(steps) + 1,
795
+ "action": "lint",
796
+ "description": "Check code quality",
797
+ }
798
+ )
799
+ steps.append(
800
+ {
801
+ "step": len(steps) + 1,
802
+ "action": "fix_linting",
803
+ "description": "Fix linting errors",
804
+ }
805
+ )
806
+
807
+ # Add test generation after implementation and linting
808
+ steps.append(
809
+ {
810
+ "step": len(steps) + 1,
811
+ "action": "generate_tests",
812
+ "description": "Generate unit tests",
813
+ }
814
+ )
815
+
816
+ # Add execution if it's a complete program
817
+ if (
818
+ "calculator" in query.lower()
819
+ or "program" in query.lower()
820
+ or "main" in query.lower()
821
+ ):
822
+ steps.append(
823
+ {
824
+ "step": len(steps) + 1,
825
+ "action": "execute",
826
+ "description": "Test execution",
827
+ }
828
+ )
829
+ steps.append(
830
+ {
831
+ "step": len(steps) + 1,
832
+ "action": "fix",
833
+ "description": "Fix any errors",
834
+ }
835
+ )
836
+ steps.append(
837
+ {
838
+ "step": len(steps) + 1,
839
+ "action": "test_execution",
840
+ "description": "Run unit tests",
841
+ }
842
+ )
843
+
844
+ # Always end with verification
845
+ steps.append(
846
+ {
847
+ "step": len(steps) + 1,
848
+ "action": "verify",
849
+ "description": "Verify results",
850
+ }
851
+ )
852
+ steps.append(
853
+ {
854
+ "step": len(steps) + 1,
855
+ "action": "summarize",
856
+ "description": "Summarize accomplishments",
857
+ }
858
+ )
859
+
860
+ return {
861
+ "status": "success",
862
+ "query": query,
863
+ "workflow_steps": steps,
864
+ "total_steps": len(steps),
865
+ "estimated_time": len(steps) * 2, # Rough estimate in seconds
866
+ "plan_created": True,
867
+ }
868
+
869
+ @tool
870
+ def fix_linting_errors(
871
+ file_path: str, lint_issues: List[Dict[str, Any]]
872
+ ) -> Dict[str, Any]:
873
+ """Fix linting errors based on pylint output.
874
+
875
+ Args:
876
+ file_path: Path to the Python file with linting issues
877
+ lint_issues: List of linting issues from pylint
878
+
879
+ Returns:
880
+ Dictionary with fix results
881
+ """
882
+ return self._fix_linting_errors(file_path, lint_issues)
883
+
884
+ @tool
885
+ def init_gaia_md(project_root: str = ".") -> Dict[str, Any]:
886
+ """Initialize GAIA.md by analyzing the current codebase.
887
+
888
+ Args:
889
+ project_root: Root directory to analyze (default: current directory)
890
+
891
+ Returns:
892
+ Dictionary with initialization results
893
+ """
894
+ try:
895
+
896
+ # Analyze project structure
897
+ project_name = os.path.basename(os.path.abspath(project_root))
898
+ structure = {}
899
+ python_files = []
900
+ classes_found = []
901
+ functions_found = []
902
+
903
+ # Walk through the directory
904
+ for root, dirs, files in os.walk(project_root):
905
+ # Skip hidden directories and common ignore patterns
906
+ dirs[:] = [
907
+ d for d in dirs if not d.startswith(".") and d != "__pycache__"
908
+ ]
909
+
910
+ rel_path = os.path.relpath(root, project_root)
911
+ if rel_path == ".":
912
+ current_level = structure
913
+ else:
914
+ current_level = structure
915
+ for part in rel_path.split(os.sep):
916
+ if part + "/" not in current_level:
917
+ current_level[part + "/"] = {}
918
+ current_level = current_level[part + "/"]
919
+
920
+ for file in files:
921
+ file_path = os.path.join(root, file)
922
+ rel_file_path = os.path.relpath(file_path, project_root)
923
+
924
+ if file.endswith(".py"):
925
+ python_files.append(rel_file_path)
926
+ # Try to parse Python file
927
+ try:
928
+ with open(file_path, "r", encoding="utf-8") as f:
929
+ content = f.read()
930
+ tree = ast.parse(content)
931
+
932
+ # Extract classes and functions
933
+ for node in ast.walk(tree):
934
+ if isinstance(node, ast.ClassDef):
935
+ docstring = ast.get_docstring(node)
936
+ classes_found.append(
937
+ {
938
+ "name": node.name,
939
+ "file": rel_file_path,
940
+ "docstring": (
941
+ docstring
942
+ if docstring
943
+ else "No description"
944
+ ),
945
+ }
946
+ )
947
+ elif isinstance(node, ast.FunctionDef):
948
+ if (
949
+ node.col_offset == 0
950
+ ): # Module-level function
951
+ docstring = ast.get_docstring(node)
952
+ functions_found.append(
953
+ {
954
+ "name": node.name,
955
+ "file": rel_file_path,
956
+ "docstring": (
957
+ docstring
958
+ if docstring
959
+ else "No description"
960
+ ),
961
+ }
962
+ )
963
+
964
+ current_level[file] = "Python module"
965
+ except Exception:
966
+ current_level[file] = "Python file"
967
+ elif file.endswith((".md", ".txt", ".json", ".yml", ".yaml")):
968
+ current_level[file] = "Configuration/Documentation"
969
+ elif file in ["requirements.txt", "setup.py", "pyproject.toml"]:
970
+ current_level[file] = "Project configuration"
971
+ else:
972
+ current_level[file] = "Resource file"
973
+
974
+ # Detect project type
975
+ project_type = "application"
976
+ if any(f.startswith("test") for f in python_files):
977
+ project_type = "library/application with tests"
978
+ if "setup.py" in [os.path.basename(f) for f in python_files]:
979
+ project_type = "Python package"
980
+ if any("game" in f.lower() for f in python_files):
981
+ project_type = "game"
982
+ if any(
983
+ "api" in f.lower() or "server" in f.lower() for f in python_files
984
+ ):
985
+ project_type = "API/server"
986
+
987
+ # Generate description
988
+ description = (
989
+ f"A {project_type} project with {len(python_files)} Python files"
990
+ )
991
+ if classes_found:
992
+ description += f", {len(classes_found)} classes"
993
+ if functions_found:
994
+ description += (
995
+ f", and {len(functions_found)} module-level functions"
996
+ )
997
+
998
+ # Build instructions based on analysis
999
+ instructions = []
1000
+ if "test" in project_name.lower() or any(
1001
+ "test" in f for f in python_files
1002
+ ):
1003
+ instructions.append("- Run tests before making changes")
1004
+ if any("main.py" in f for f in python_files):
1005
+ instructions.append("- main.py is the entry point")
1006
+ if classes_found:
1007
+ instructions.append(
1008
+ "- Maintain existing class structure and interfaces"
1009
+ )
1010
+ instructions.append("- Follow existing code style and patterns")
1011
+
1012
+ # Create GAIA.md content
1013
+ content = "# GAIA.md\n\n"
1014
+ content += "This file provides guidance to GAIA Code Agent when working with code in this project.\n\n"
1015
+ content += f"## Project: {project_name}\n\n"
1016
+ content += f"## Description\n{description}\n\n"
1017
+ content += f"## Project Type\n{project_type}\n\n"
1018
+
1019
+ if structure:
1020
+ content += "## Project Structure\n```\n"
1021
+
1022
+ def format_structure(struct, indent=""):
1023
+ result = ""
1024
+ for key, value in struct.items():
1025
+ if isinstance(value, dict):
1026
+ result += f"{indent}{key}\n"
1027
+ result += format_structure(value, indent + " ")
1028
+ else:
1029
+ result += f"{indent}{key} - {value}\n"
1030
+ return result
1031
+
1032
+ content += format_structure(structure)
1033
+ content += "```\n\n"
1034
+
1035
+ if classes_found:
1036
+ content += "## Main Classes\n"
1037
+ for cls in classes_found[:10]: # Limit to first 10
1038
+ content += f"- **{cls['name']}** ({cls['file']}): {cls['docstring'].split('.')[0] if cls['docstring'] else 'No description'}.\n"
1039
+ content += "\n"
1040
+
1041
+ if functions_found:
1042
+ content += "## Main Functions\n"
1043
+ for func in functions_found[:10]: # Limit to first 10
1044
+ content += f"- **{func['name']}** ({func['file']}): {func['docstring'].split('.')[0] if func['docstring'] else 'No description'}.\n"
1045
+ content += "\n"
1046
+
1047
+ content += "## Development Guidelines\n"
1048
+ for instruction in instructions:
1049
+ content += f"{instruction}\n"
1050
+ content += "- Follow PEP 8 style guidelines\n"
1051
+ content += "- Add docstrings to all functions and classes\n"
1052
+ content += "- Include type hints where appropriate\n\n"
1053
+
1054
+ content += "## Code Quality\n"
1055
+ content += "- All code should pass pylint checks\n"
1056
+ content += "- Use Black formatter for consistent style\n"
1057
+ content += "- Ensure proper error handling\n\n"
1058
+
1059
+ # Write GAIA.md
1060
+ gaia_path = os.path.join(project_root, "GAIA.md")
1061
+ with open(gaia_path, "w", encoding="utf-8") as f:
1062
+ f.write(content)
1063
+
1064
+ return {
1065
+ "status": "success",
1066
+ "file_path": gaia_path,
1067
+ "project_name": project_name,
1068
+ "project_type": project_type,
1069
+ "python_files": len(python_files),
1070
+ "classes_found": len(classes_found),
1071
+ "functions_found": len(functions_found),
1072
+ "message": f"GAIA.md initialized for {project_name} with {len(python_files)} Python files analyzed",
1073
+ }
1074
+ except Exception as e:
1075
+ return {"status": "error", "error": str(e)}
1076
+
1077
+ @tool
1078
+ def fix_python_errors(file_path: str, error_message: str) -> Dict[str, Any]:
1079
+ """Attempt to fix Python runtime errors based on error messages.
1080
+
1081
+ Args:
1082
+ file_path: Path to the Python file with errors
1083
+ error_message: The error message from execution
1084
+
1085
+ Returns:
1086
+ Dictionary with fix results
1087
+ """
1088
+ try:
1089
+ path = Path(file_path)
1090
+ if not path.exists():
1091
+ return {"status": "error", "error": f"File not found: {file_path}"}
1092
+
1093
+ content = path.read_text(encoding="utf-8")
1094
+ original_content = content
1095
+ fixes_applied = []
1096
+
1097
+ # Common error fixes
1098
+ if "NameError" in error_message and "not defined" in error_message:
1099
+ # Extract the undefined name
1100
+ import re
1101
+
1102
+ match = re.search(r"name '(\w+)' is not defined", error_message)
1103
+ if match:
1104
+ undefined_name = match.group(1)
1105
+ # Add import if it's a common module
1106
+ if undefined_name in ["Dict", "List", "Optional", "Tuple"]:
1107
+ if "from typing import" not in content:
1108
+ content = (
1109
+ f"from typing import {undefined_name}\n" + content
1110
+ )
1111
+ fixes_applied.append(
1112
+ f"Added import for {undefined_name}"
1113
+ )
1114
+
1115
+ if "IndentationError" in error_message:
1116
+ # Try to fix indentation
1117
+ lines = content.split("\n")
1118
+ fixed_lines = []
1119
+ for line in lines:
1120
+ # Ensure consistent 4-space indentation
1121
+ if line.startswith(" ") and not line.startswith(" "):
1122
+ spaces = len(line) - len(line.lstrip())
1123
+ tabs = spaces // 4
1124
+ line = " " * tabs + line.lstrip()
1125
+ fixed_lines.append(line)
1126
+ content = "\n".join(fixed_lines)
1127
+ fixes_applied.append("Fixed indentation")
1128
+
1129
+ if "TypeError" in error_message:
1130
+ # Add type checking
1131
+ if "float() argument" in error_message:
1132
+ # Wrap float conversions in try-except
1133
+ content = content.replace(
1134
+ "float(input(", "float(input("
1135
+ ) # This would need more sophisticated replacement
1136
+ fixes_applied.append("Added type handling")
1137
+
1138
+ # Write the fixed content if changes were made
1139
+ if content != original_content:
1140
+ # Skip backup creation - not needed for generated code
1141
+ # backup_path = path.with_suffix(path.suffix + ".bak")
1142
+ # backup_path.write_text(original_content, encoding="utf-8")
1143
+
1144
+ # Write fixed content
1145
+ path.write_text(content, encoding="utf-8")
1146
+
1147
+ return {
1148
+ "status": "success",
1149
+ "fixes_applied": fixes_applied,
1150
+ # "backup_created": str(backup_path),
1151
+ "file_modified": True,
1152
+ }
1153
+ else:
1154
+ return {
1155
+ "status": "info",
1156
+ "message": "No automatic fixes available for this error",
1157
+ "error_type": (
1158
+ error_message.split(":")[0]
1159
+ if ":" in error_message
1160
+ else "Unknown"
1161
+ ),
1162
+ "file_modified": False,
1163
+ }
1164
+
1165
+ except Exception as e:
1166
+ return {"status": "error", "error": str(e)}
1167
+
1168
+ def _fix_linting_errors(
1169
+ self,
1170
+ file_path: str,
1171
+ lint_issues: List[Dict[str, Any]],
1172
+ max_iterations: int = 3,
1173
+ create_backup: bool = False,
1174
+ ) -> Dict[str, Any]:
1175
+ """Fix linting errors using LLM to intelligently correct issues.
1176
+
1177
+ Iteratively fixes linting errors until all are resolved or max iterations reached.
1178
+
1179
+ Args:
1180
+ file_path: Path to the Python file with linting issues
1181
+ lint_issues: List of linting issues from pylint
1182
+ max_iterations: Maximum number of fix attempts (default: 3)
1183
+ create_backup: Create .bak file before modifying (default: False)
1184
+
1185
+ Returns:
1186
+ Dictionary with fix results
1187
+ """
1188
+ try:
1189
+ path = Path(file_path)
1190
+ if not path.exists():
1191
+ return {"status": "error", "error": f"File not found: {file_path}"}
1192
+
1193
+ original_content = path.read_text(encoding="utf-8")
1194
+ current_content = original_content
1195
+ all_fixes_applied = []
1196
+ iteration = 0
1197
+ remaining_issues = lint_issues
1198
+
1199
+ while remaining_issues and iteration < max_iterations:
1200
+ iteration += 1
1201
+ logger.info(
1202
+ f"Lint fix iteration {iteration}/{max_iterations} for {file_path}: "
1203
+ f"{len(remaining_issues)} issues"
1204
+ )
1205
+
1206
+ # Format lint issues for LLM (limit to first 10 per iteration)
1207
+ issues_to_fix = remaining_issues[:10]
1208
+ issues_text = "\n".join(
1209
+ [
1210
+ f"Line {issue.get('line', 0)}: [{issue.get('symbol', 'unknown')}] "
1211
+ f"{issue.get('message', '')}"
1212
+ for issue in issues_to_fix
1213
+ ]
1214
+ )
1215
+
1216
+ # Use LLM to fix the code
1217
+ prompt = f"""Fix the following pylint linting issues in this Python code:
1218
+
1219
+ Linting Issues:
1220
+ {issues_text}
1221
+
1222
+ Current Code:
1223
+ ```python
1224
+ {current_content}
1225
+ ```
1226
+
1227
+ Fix the linting issues while preserving the code's functionality.
1228
+ Return ONLY the corrected Python code, no explanations."""
1229
+
1230
+ try:
1231
+ response = self.chat.send(prompt)
1232
+ fixed_code = response.text.strip()
1233
+
1234
+ # Extract code from markdown blocks if present
1235
+ if "```python" in fixed_code:
1236
+ fixed_code = (
1237
+ fixed_code.split("```python")[1].split("```")[0].strip()
1238
+ )
1239
+ elif "```" in fixed_code:
1240
+ fixed_code = fixed_code.split("```")[1].split("```")[0].strip()
1241
+
1242
+ # Validate the fixed code
1243
+ validation = self.syntax_validator.validate_dict(fixed_code)
1244
+ if not validation["is_valid"]:
1245
+ logger.warning(
1246
+ f"LLM fix produced invalid syntax, skipping iteration {iteration}"
1247
+ )
1248
+ break
1249
+
1250
+ # Write to file and re-check with pylint
1251
+ path.write_text(fixed_code, encoding="utf-8")
1252
+ current_content = fixed_code
1253
+
1254
+ # Re-run pylint to check remaining issues
1255
+ import json
1256
+ import subprocess
1257
+
1258
+ result = subprocess.run(
1259
+ ["python", "-m", "pylint", "--output-format=json", str(path)],
1260
+ capture_output=True,
1261
+ text=True,
1262
+ timeout=30,
1263
+ check=False,
1264
+ )
1265
+
1266
+ if result.stdout:
1267
+ try:
1268
+ remaining_issues = json.loads(result.stdout)
1269
+ all_fixes_applied.append(
1270
+ f"Iteration {iteration}: Fixed {len(issues_to_fix)} issues"
1271
+ )
1272
+
1273
+ if not remaining_issues:
1274
+ logger.info(
1275
+ f"All linting issues resolved after {iteration} iterations"
1276
+ )
1277
+ break
1278
+ except json.JSONDecodeError:
1279
+ break
1280
+
1281
+ except Exception as e:
1282
+ logger.warning(f"LLM-based fix iteration {iteration} failed: {e}")
1283
+ break
1284
+
1285
+ # Final result
1286
+ if current_content != original_content:
1287
+ result = {
1288
+ "status": "success",
1289
+ "fixes_applied": all_fixes_applied,
1290
+ "file_modified": True,
1291
+ "total_fixes": len(all_fixes_applied),
1292
+ "iterations": iteration,
1293
+ "remaining_issues": (
1294
+ len(remaining_issues) if remaining_issues else 0
1295
+ ),
1296
+ }
1297
+
1298
+ # Create backup if requested
1299
+ if create_backup:
1300
+ backup_path = path.with_suffix(path.suffix + ".bak")
1301
+ backup_path.write_text(original_content, encoding="utf-8")
1302
+ result["backup_created"] = str(backup_path)
1303
+
1304
+ return result
1305
+ else:
1306
+ return {
1307
+ "status": "info",
1308
+ "message": "No fixes could be applied",
1309
+ "file_modified": False,
1310
+ }
1311
+
1312
+ except Exception as e:
1313
+ return {"status": "error", "error": str(e)}
1314
+
1315
+ def _update_plan_progress(self):
1316
+ """Update PLAN.md file with current execution progress.
1317
+
1318
+ Updates checkboxes in PLAN.md to reflect completed steps.
1319
+ """
1320
+ try:
1321
+ if (
1322
+ not hasattr(self, "plan")
1323
+ or not self.plan
1324
+ or "execution_steps" not in self.plan
1325
+ ):
1326
+ return
1327
+
1328
+ plan_path = os.path.abspath("PLAN.md")
1329
+ if os.path.exists(plan_path):
1330
+ # Read existing content
1331
+ with open(plan_path, "r", encoding="utf-8") as f:
1332
+ content = f.read()
1333
+
1334
+ # Update checkboxes
1335
+ for step in self.plan["execution_steps"]:
1336
+ old_line = f"- [ ] Step {step['step']}: {step['description']}"
1337
+ new_line = (
1338
+ f"- [{'x' if step['completed'] else ' '}] "
1339
+ f"Step {step['step']}: {step['description']}"
1340
+ )
1341
+ content = content.replace(old_line, new_line)
1342
+
1343
+ # Write back
1344
+ with open(plan_path, "w", encoding="utf-8") as f:
1345
+ f.write(content)
1346
+ except Exception as e:
1347
+ logger.warning(f"Could not update plan progress: {e}")