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.
- amd_gaia-0.14.1.dist-info/METADATA +768 -0
- amd_gaia-0.14.1.dist-info/RECORD +800 -0
- amd_gaia-0.14.1.dist-info/WHEEL +5 -0
- amd_gaia-0.14.1.dist-info/entry_points.txt +5 -0
- amd_gaia-0.14.1.dist-info/licenses/LICENSE.md +21 -0
- amd_gaia-0.14.1.dist-info/top_level.txt +1 -0
- gaia/__init__.py +2 -0
- gaia/agents/__init__.py +19 -0
- gaia/agents/base/__init__.py +9 -0
- gaia/agents/base/agent.py +2072 -0
- gaia/agents/base/api_agent.py +120 -0
- gaia/agents/base/console.py +1457 -0
- gaia/agents/base/mcp_agent.py +86 -0
- gaia/agents/base/tools.py +83 -0
- gaia/agents/blender/agent.py +556 -0
- gaia/agents/blender/agent_simple.py +135 -0
- gaia/agents/blender/app.py +211 -0
- gaia/agents/blender/app_simple.py +41 -0
- gaia/agents/blender/core/__init__.py +16 -0
- gaia/agents/blender/core/materials.py +506 -0
- gaia/agents/blender/core/objects.py +316 -0
- gaia/agents/blender/core/rendering.py +225 -0
- gaia/agents/blender/core/scene.py +220 -0
- gaia/agents/blender/core/view.py +146 -0
- gaia/agents/chat/__init__.py +9 -0
- gaia/agents/chat/agent.py +975 -0
- gaia/agents/chat/app.py +1058 -0
- gaia/agents/chat/session.py +508 -0
- gaia/agents/chat/tools/__init__.py +15 -0
- gaia/agents/chat/tools/file_tools.py +96 -0
- gaia/agents/chat/tools/rag_tools.py +1729 -0
- gaia/agents/chat/tools/shell_tools.py +436 -0
- gaia/agents/code/__init__.py +7 -0
- gaia/agents/code/agent.py +547 -0
- gaia/agents/code/app.py +266 -0
- gaia/agents/code/models.py +135 -0
- gaia/agents/code/orchestration/__init__.py +24 -0
- gaia/agents/code/orchestration/checklist_executor.py +1739 -0
- gaia/agents/code/orchestration/checklist_generator.py +709 -0
- gaia/agents/code/orchestration/factories/__init__.py +9 -0
- gaia/agents/code/orchestration/factories/base.py +63 -0
- gaia/agents/code/orchestration/factories/nextjs_factory.py +118 -0
- gaia/agents/code/orchestration/factories/python_factory.py +106 -0
- gaia/agents/code/orchestration/orchestrator.py +610 -0
- gaia/agents/code/orchestration/project_analyzer.py +391 -0
- gaia/agents/code/orchestration/steps/__init__.py +67 -0
- gaia/agents/code/orchestration/steps/base.py +188 -0
- gaia/agents/code/orchestration/steps/error_handler.py +314 -0
- gaia/agents/code/orchestration/steps/nextjs.py +828 -0
- gaia/agents/code/orchestration/steps/python.py +307 -0
- gaia/agents/code/orchestration/template_catalog.py +463 -0
- gaia/agents/code/orchestration/workflows/__init__.py +14 -0
- gaia/agents/code/orchestration/workflows/base.py +80 -0
- gaia/agents/code/orchestration/workflows/nextjs.py +186 -0
- gaia/agents/code/orchestration/workflows/python.py +94 -0
- gaia/agents/code/prompts/__init__.py +11 -0
- gaia/agents/code/prompts/base_prompt.py +77 -0
- gaia/agents/code/prompts/code_patterns.py +1925 -0
- gaia/agents/code/prompts/nextjs_prompt.py +40 -0
- gaia/agents/code/prompts/python_prompt.py +109 -0
- gaia/agents/code/schema_inference.py +365 -0
- gaia/agents/code/system_prompt.py +41 -0
- gaia/agents/code/tools/__init__.py +42 -0
- gaia/agents/code/tools/cli_tools.py +1138 -0
- gaia/agents/code/tools/code_formatting.py +319 -0
- gaia/agents/code/tools/code_tools.py +769 -0
- gaia/agents/code/tools/error_fixing.py +1347 -0
- gaia/agents/code/tools/external_tools.py +180 -0
- gaia/agents/code/tools/file_io.py +845 -0
- gaia/agents/code/tools/prisma_tools.py +190 -0
- gaia/agents/code/tools/project_management.py +1016 -0
- gaia/agents/code/tools/testing.py +321 -0
- gaia/agents/code/tools/typescript_tools.py +122 -0
- gaia/agents/code/tools/validation_parsing.py +461 -0
- gaia/agents/code/tools/validation_tools.py +803 -0
- gaia/agents/code/tools/web_dev_tools.py +1744 -0
- gaia/agents/code/validators/__init__.py +16 -0
- gaia/agents/code/validators/antipattern_checker.py +241 -0
- gaia/agents/code/validators/ast_analyzer.py +197 -0
- gaia/agents/code/validators/requirements_validator.py +145 -0
- gaia/agents/code/validators/syntax_validator.py +171 -0
- gaia/agents/docker/__init__.py +7 -0
- gaia/agents/docker/agent.py +642 -0
- gaia/agents/jira/__init__.py +11 -0
- gaia/agents/jira/agent.py +894 -0
- gaia/agents/jira/jql_templates.py +299 -0
- gaia/agents/routing/__init__.py +7 -0
- gaia/agents/routing/agent.py +512 -0
- gaia/agents/routing/system_prompt.py +75 -0
- gaia/api/__init__.py +23 -0
- gaia/api/agent_registry.py +238 -0
- gaia/api/app.py +305 -0
- gaia/api/openai_server.py +575 -0
- gaia/api/schemas.py +186 -0
- gaia/api/sse_handler.py +370 -0
- gaia/apps/__init__.py +4 -0
- gaia/apps/llm/__init__.py +6 -0
- gaia/apps/llm/app.py +169 -0
- gaia/apps/summarize/app.py +633 -0
- gaia/apps/summarize/html_viewer.py +133 -0
- gaia/apps/summarize/pdf_formatter.py +284 -0
- gaia/audio/__init__.py +2 -0
- gaia/audio/audio_client.py +439 -0
- gaia/audio/audio_recorder.py +269 -0
- gaia/audio/kokoro_tts.py +599 -0
- gaia/audio/whisper_asr.py +432 -0
- gaia/chat/__init__.py +16 -0
- gaia/chat/app.py +430 -0
- gaia/chat/prompts.py +522 -0
- gaia/chat/sdk.py +1200 -0
- gaia/cli.py +5621 -0
- gaia/eval/batch_experiment.py +2332 -0
- gaia/eval/claude.py +542 -0
- gaia/eval/config.py +37 -0
- gaia/eval/email_generator.py +512 -0
- gaia/eval/eval.py +3179 -0
- gaia/eval/groundtruth.py +1130 -0
- gaia/eval/transcript_generator.py +582 -0
- gaia/eval/webapp/README.md +168 -0
- gaia/eval/webapp/node_modules/.bin/mime +16 -0
- gaia/eval/webapp/node_modules/.bin/mime.cmd +17 -0
- gaia/eval/webapp/node_modules/.bin/mime.ps1 +28 -0
- gaia/eval/webapp/node_modules/.package-lock.json +865 -0
- gaia/eval/webapp/node_modules/accepts/HISTORY.md +243 -0
- gaia/eval/webapp/node_modules/accepts/LICENSE +23 -0
- gaia/eval/webapp/node_modules/accepts/README.md +140 -0
- gaia/eval/webapp/node_modules/accepts/index.js +238 -0
- gaia/eval/webapp/node_modules/accepts/package.json +47 -0
- gaia/eval/webapp/node_modules/array-flatten/LICENSE +21 -0
- gaia/eval/webapp/node_modules/array-flatten/README.md +43 -0
- gaia/eval/webapp/node_modules/array-flatten/array-flatten.js +64 -0
- gaia/eval/webapp/node_modules/array-flatten/package.json +39 -0
- gaia/eval/webapp/node_modules/body-parser/HISTORY.md +672 -0
- gaia/eval/webapp/node_modules/body-parser/LICENSE +23 -0
- gaia/eval/webapp/node_modules/body-parser/README.md +476 -0
- gaia/eval/webapp/node_modules/body-parser/SECURITY.md +25 -0
- gaia/eval/webapp/node_modules/body-parser/index.js +156 -0
- gaia/eval/webapp/node_modules/body-parser/lib/read.js +205 -0
- gaia/eval/webapp/node_modules/body-parser/lib/types/json.js +247 -0
- gaia/eval/webapp/node_modules/body-parser/lib/types/raw.js +101 -0
- gaia/eval/webapp/node_modules/body-parser/lib/types/text.js +121 -0
- gaia/eval/webapp/node_modules/body-parser/lib/types/urlencoded.js +307 -0
- gaia/eval/webapp/node_modules/body-parser/package.json +56 -0
- gaia/eval/webapp/node_modules/bytes/History.md +97 -0
- gaia/eval/webapp/node_modules/bytes/LICENSE +23 -0
- gaia/eval/webapp/node_modules/bytes/Readme.md +152 -0
- gaia/eval/webapp/node_modules/bytes/index.js +170 -0
- gaia/eval/webapp/node_modules/bytes/package.json +42 -0
- gaia/eval/webapp/node_modules/call-bind-apply-helpers/.eslintrc +17 -0
- gaia/eval/webapp/node_modules/call-bind-apply-helpers/.github/FUNDING.yml +12 -0
- gaia/eval/webapp/node_modules/call-bind-apply-helpers/.nycrc +9 -0
- gaia/eval/webapp/node_modules/call-bind-apply-helpers/CHANGELOG.md +30 -0
- gaia/eval/webapp/node_modules/call-bind-apply-helpers/LICENSE +21 -0
- gaia/eval/webapp/node_modules/call-bind-apply-helpers/README.md +62 -0
- gaia/eval/webapp/node_modules/call-bind-apply-helpers/actualApply.d.ts +1 -0
- gaia/eval/webapp/node_modules/call-bind-apply-helpers/actualApply.js +10 -0
- gaia/eval/webapp/node_modules/call-bind-apply-helpers/applyBind.d.ts +19 -0
- gaia/eval/webapp/node_modules/call-bind-apply-helpers/applyBind.js +10 -0
- gaia/eval/webapp/node_modules/call-bind-apply-helpers/functionApply.d.ts +1 -0
- gaia/eval/webapp/node_modules/call-bind-apply-helpers/functionApply.js +4 -0
- gaia/eval/webapp/node_modules/call-bind-apply-helpers/functionCall.d.ts +1 -0
- gaia/eval/webapp/node_modules/call-bind-apply-helpers/functionCall.js +4 -0
- gaia/eval/webapp/node_modules/call-bind-apply-helpers/index.d.ts +64 -0
- gaia/eval/webapp/node_modules/call-bind-apply-helpers/index.js +15 -0
- gaia/eval/webapp/node_modules/call-bind-apply-helpers/package.json +85 -0
- gaia/eval/webapp/node_modules/call-bind-apply-helpers/reflectApply.d.ts +3 -0
- gaia/eval/webapp/node_modules/call-bind-apply-helpers/reflectApply.js +4 -0
- gaia/eval/webapp/node_modules/call-bind-apply-helpers/test/index.js +63 -0
- gaia/eval/webapp/node_modules/call-bind-apply-helpers/tsconfig.json +9 -0
- gaia/eval/webapp/node_modules/call-bound/.eslintrc +13 -0
- gaia/eval/webapp/node_modules/call-bound/.github/FUNDING.yml +12 -0
- gaia/eval/webapp/node_modules/call-bound/.nycrc +9 -0
- gaia/eval/webapp/node_modules/call-bound/CHANGELOG.md +42 -0
- gaia/eval/webapp/node_modules/call-bound/LICENSE +21 -0
- gaia/eval/webapp/node_modules/call-bound/README.md +53 -0
- gaia/eval/webapp/node_modules/call-bound/index.d.ts +94 -0
- gaia/eval/webapp/node_modules/call-bound/index.js +19 -0
- gaia/eval/webapp/node_modules/call-bound/package.json +99 -0
- gaia/eval/webapp/node_modules/call-bound/test/index.js +61 -0
- gaia/eval/webapp/node_modules/call-bound/tsconfig.json +10 -0
- gaia/eval/webapp/node_modules/content-disposition/HISTORY.md +60 -0
- gaia/eval/webapp/node_modules/content-disposition/LICENSE +22 -0
- gaia/eval/webapp/node_modules/content-disposition/README.md +142 -0
- gaia/eval/webapp/node_modules/content-disposition/index.js +458 -0
- gaia/eval/webapp/node_modules/content-disposition/package.json +44 -0
- gaia/eval/webapp/node_modules/content-type/HISTORY.md +29 -0
- gaia/eval/webapp/node_modules/content-type/LICENSE +22 -0
- gaia/eval/webapp/node_modules/content-type/README.md +94 -0
- gaia/eval/webapp/node_modules/content-type/index.js +225 -0
- gaia/eval/webapp/node_modules/content-type/package.json +42 -0
- gaia/eval/webapp/node_modules/cookie/LICENSE +24 -0
- gaia/eval/webapp/node_modules/cookie/README.md +317 -0
- gaia/eval/webapp/node_modules/cookie/SECURITY.md +25 -0
- gaia/eval/webapp/node_modules/cookie/index.js +334 -0
- gaia/eval/webapp/node_modules/cookie/package.json +44 -0
- gaia/eval/webapp/node_modules/cookie-signature/.npmignore +4 -0
- gaia/eval/webapp/node_modules/cookie-signature/History.md +38 -0
- gaia/eval/webapp/node_modules/cookie-signature/Readme.md +42 -0
- gaia/eval/webapp/node_modules/cookie-signature/index.js +51 -0
- gaia/eval/webapp/node_modules/cookie-signature/package.json +18 -0
- gaia/eval/webapp/node_modules/debug/.coveralls.yml +1 -0
- gaia/eval/webapp/node_modules/debug/.eslintrc +11 -0
- gaia/eval/webapp/node_modules/debug/.npmignore +9 -0
- gaia/eval/webapp/node_modules/debug/.travis.yml +14 -0
- gaia/eval/webapp/node_modules/debug/CHANGELOG.md +362 -0
- gaia/eval/webapp/node_modules/debug/LICENSE +19 -0
- gaia/eval/webapp/node_modules/debug/Makefile +50 -0
- gaia/eval/webapp/node_modules/debug/README.md +312 -0
- gaia/eval/webapp/node_modules/debug/component.json +19 -0
- gaia/eval/webapp/node_modules/debug/karma.conf.js +70 -0
- gaia/eval/webapp/node_modules/debug/node.js +1 -0
- gaia/eval/webapp/node_modules/debug/package.json +49 -0
- gaia/eval/webapp/node_modules/debug/src/browser.js +185 -0
- gaia/eval/webapp/node_modules/debug/src/debug.js +202 -0
- gaia/eval/webapp/node_modules/debug/src/index.js +10 -0
- gaia/eval/webapp/node_modules/debug/src/inspector-log.js +15 -0
- gaia/eval/webapp/node_modules/debug/src/node.js +248 -0
- gaia/eval/webapp/node_modules/depd/History.md +103 -0
- gaia/eval/webapp/node_modules/depd/LICENSE +22 -0
- gaia/eval/webapp/node_modules/depd/Readme.md +280 -0
- gaia/eval/webapp/node_modules/depd/index.js +538 -0
- gaia/eval/webapp/node_modules/depd/lib/browser/index.js +77 -0
- gaia/eval/webapp/node_modules/depd/package.json +45 -0
- gaia/eval/webapp/node_modules/destroy/LICENSE +23 -0
- gaia/eval/webapp/node_modules/destroy/README.md +63 -0
- gaia/eval/webapp/node_modules/destroy/index.js +209 -0
- gaia/eval/webapp/node_modules/destroy/package.json +48 -0
- gaia/eval/webapp/node_modules/dunder-proto/.eslintrc +5 -0
- gaia/eval/webapp/node_modules/dunder-proto/.github/FUNDING.yml +12 -0
- gaia/eval/webapp/node_modules/dunder-proto/.nycrc +13 -0
- gaia/eval/webapp/node_modules/dunder-proto/CHANGELOG.md +24 -0
- gaia/eval/webapp/node_modules/dunder-proto/LICENSE +21 -0
- gaia/eval/webapp/node_modules/dunder-proto/README.md +54 -0
- gaia/eval/webapp/node_modules/dunder-proto/get.d.ts +5 -0
- gaia/eval/webapp/node_modules/dunder-proto/get.js +30 -0
- gaia/eval/webapp/node_modules/dunder-proto/package.json +76 -0
- gaia/eval/webapp/node_modules/dunder-proto/set.d.ts +5 -0
- gaia/eval/webapp/node_modules/dunder-proto/set.js +35 -0
- gaia/eval/webapp/node_modules/dunder-proto/test/get.js +34 -0
- gaia/eval/webapp/node_modules/dunder-proto/test/index.js +4 -0
- gaia/eval/webapp/node_modules/dunder-proto/test/set.js +50 -0
- gaia/eval/webapp/node_modules/dunder-proto/tsconfig.json +9 -0
- gaia/eval/webapp/node_modules/ee-first/LICENSE +22 -0
- gaia/eval/webapp/node_modules/ee-first/README.md +80 -0
- gaia/eval/webapp/node_modules/ee-first/index.js +95 -0
- gaia/eval/webapp/node_modules/ee-first/package.json +29 -0
- gaia/eval/webapp/node_modules/encodeurl/LICENSE +22 -0
- gaia/eval/webapp/node_modules/encodeurl/README.md +109 -0
- gaia/eval/webapp/node_modules/encodeurl/index.js +60 -0
- gaia/eval/webapp/node_modules/encodeurl/package.json +40 -0
- gaia/eval/webapp/node_modules/es-define-property/.eslintrc +13 -0
- gaia/eval/webapp/node_modules/es-define-property/.github/FUNDING.yml +12 -0
- gaia/eval/webapp/node_modules/es-define-property/.nycrc +9 -0
- gaia/eval/webapp/node_modules/es-define-property/CHANGELOG.md +29 -0
- gaia/eval/webapp/node_modules/es-define-property/LICENSE +21 -0
- gaia/eval/webapp/node_modules/es-define-property/README.md +49 -0
- gaia/eval/webapp/node_modules/es-define-property/index.d.ts +3 -0
- gaia/eval/webapp/node_modules/es-define-property/index.js +14 -0
- gaia/eval/webapp/node_modules/es-define-property/package.json +81 -0
- gaia/eval/webapp/node_modules/es-define-property/test/index.js +56 -0
- gaia/eval/webapp/node_modules/es-define-property/tsconfig.json +10 -0
- gaia/eval/webapp/node_modules/es-errors/.eslintrc +5 -0
- gaia/eval/webapp/node_modules/es-errors/.github/FUNDING.yml +12 -0
- gaia/eval/webapp/node_modules/es-errors/CHANGELOG.md +40 -0
- gaia/eval/webapp/node_modules/es-errors/LICENSE +21 -0
- gaia/eval/webapp/node_modules/es-errors/README.md +55 -0
- gaia/eval/webapp/node_modules/es-errors/eval.d.ts +3 -0
- gaia/eval/webapp/node_modules/es-errors/eval.js +4 -0
- gaia/eval/webapp/node_modules/es-errors/index.d.ts +3 -0
- gaia/eval/webapp/node_modules/es-errors/index.js +4 -0
- gaia/eval/webapp/node_modules/es-errors/package.json +80 -0
- gaia/eval/webapp/node_modules/es-errors/range.d.ts +3 -0
- gaia/eval/webapp/node_modules/es-errors/range.js +4 -0
- gaia/eval/webapp/node_modules/es-errors/ref.d.ts +3 -0
- gaia/eval/webapp/node_modules/es-errors/ref.js +4 -0
- gaia/eval/webapp/node_modules/es-errors/syntax.d.ts +3 -0
- gaia/eval/webapp/node_modules/es-errors/syntax.js +4 -0
- gaia/eval/webapp/node_modules/es-errors/test/index.js +19 -0
- gaia/eval/webapp/node_modules/es-errors/tsconfig.json +49 -0
- gaia/eval/webapp/node_modules/es-errors/type.d.ts +3 -0
- gaia/eval/webapp/node_modules/es-errors/type.js +4 -0
- gaia/eval/webapp/node_modules/es-errors/uri.d.ts +3 -0
- gaia/eval/webapp/node_modules/es-errors/uri.js +4 -0
- gaia/eval/webapp/node_modules/es-object-atoms/.eslintrc +16 -0
- gaia/eval/webapp/node_modules/es-object-atoms/.github/FUNDING.yml +12 -0
- gaia/eval/webapp/node_modules/es-object-atoms/CHANGELOG.md +37 -0
- gaia/eval/webapp/node_modules/es-object-atoms/LICENSE +21 -0
- gaia/eval/webapp/node_modules/es-object-atoms/README.md +63 -0
- gaia/eval/webapp/node_modules/es-object-atoms/RequireObjectCoercible.d.ts +3 -0
- gaia/eval/webapp/node_modules/es-object-atoms/RequireObjectCoercible.js +11 -0
- gaia/eval/webapp/node_modules/es-object-atoms/ToObject.d.ts +7 -0
- gaia/eval/webapp/node_modules/es-object-atoms/ToObject.js +10 -0
- gaia/eval/webapp/node_modules/es-object-atoms/index.d.ts +3 -0
- gaia/eval/webapp/node_modules/es-object-atoms/index.js +4 -0
- gaia/eval/webapp/node_modules/es-object-atoms/isObject.d.ts +3 -0
- gaia/eval/webapp/node_modules/es-object-atoms/isObject.js +6 -0
- gaia/eval/webapp/node_modules/es-object-atoms/package.json +80 -0
- gaia/eval/webapp/node_modules/es-object-atoms/test/index.js +38 -0
- gaia/eval/webapp/node_modules/es-object-atoms/tsconfig.json +6 -0
- gaia/eval/webapp/node_modules/escape-html/LICENSE +24 -0
- gaia/eval/webapp/node_modules/escape-html/Readme.md +43 -0
- gaia/eval/webapp/node_modules/escape-html/index.js +78 -0
- gaia/eval/webapp/node_modules/escape-html/package.json +24 -0
- gaia/eval/webapp/node_modules/etag/HISTORY.md +83 -0
- gaia/eval/webapp/node_modules/etag/LICENSE +22 -0
- gaia/eval/webapp/node_modules/etag/README.md +159 -0
- gaia/eval/webapp/node_modules/etag/index.js +131 -0
- gaia/eval/webapp/node_modules/etag/package.json +47 -0
- gaia/eval/webapp/node_modules/express/History.md +3656 -0
- gaia/eval/webapp/node_modules/express/LICENSE +24 -0
- gaia/eval/webapp/node_modules/express/Readme.md +260 -0
- gaia/eval/webapp/node_modules/express/index.js +11 -0
- gaia/eval/webapp/node_modules/express/lib/application.js +661 -0
- gaia/eval/webapp/node_modules/express/lib/express.js +116 -0
- gaia/eval/webapp/node_modules/express/lib/middleware/init.js +43 -0
- gaia/eval/webapp/node_modules/express/lib/middleware/query.js +47 -0
- gaia/eval/webapp/node_modules/express/lib/request.js +525 -0
- gaia/eval/webapp/node_modules/express/lib/response.js +1179 -0
- gaia/eval/webapp/node_modules/express/lib/router/index.js +673 -0
- gaia/eval/webapp/node_modules/express/lib/router/layer.js +181 -0
- gaia/eval/webapp/node_modules/express/lib/router/route.js +230 -0
- gaia/eval/webapp/node_modules/express/lib/utils.js +303 -0
- gaia/eval/webapp/node_modules/express/lib/view.js +182 -0
- gaia/eval/webapp/node_modules/express/package.json +102 -0
- gaia/eval/webapp/node_modules/finalhandler/HISTORY.md +210 -0
- gaia/eval/webapp/node_modules/finalhandler/LICENSE +22 -0
- gaia/eval/webapp/node_modules/finalhandler/README.md +147 -0
- gaia/eval/webapp/node_modules/finalhandler/SECURITY.md +25 -0
- gaia/eval/webapp/node_modules/finalhandler/index.js +341 -0
- gaia/eval/webapp/node_modules/finalhandler/package.json +47 -0
- gaia/eval/webapp/node_modules/forwarded/HISTORY.md +21 -0
- gaia/eval/webapp/node_modules/forwarded/LICENSE +22 -0
- gaia/eval/webapp/node_modules/forwarded/README.md +57 -0
- gaia/eval/webapp/node_modules/forwarded/index.js +90 -0
- gaia/eval/webapp/node_modules/forwarded/package.json +45 -0
- gaia/eval/webapp/node_modules/fresh/HISTORY.md +70 -0
- gaia/eval/webapp/node_modules/fresh/LICENSE +23 -0
- gaia/eval/webapp/node_modules/fresh/README.md +119 -0
- gaia/eval/webapp/node_modules/fresh/index.js +137 -0
- gaia/eval/webapp/node_modules/fresh/package.json +46 -0
- gaia/eval/webapp/node_modules/fs/README.md +9 -0
- gaia/eval/webapp/node_modules/fs/package.json +20 -0
- gaia/eval/webapp/node_modules/function-bind/.eslintrc +21 -0
- gaia/eval/webapp/node_modules/function-bind/.github/FUNDING.yml +12 -0
- gaia/eval/webapp/node_modules/function-bind/.github/SECURITY.md +3 -0
- gaia/eval/webapp/node_modules/function-bind/.nycrc +13 -0
- gaia/eval/webapp/node_modules/function-bind/CHANGELOG.md +136 -0
- gaia/eval/webapp/node_modules/function-bind/LICENSE +20 -0
- gaia/eval/webapp/node_modules/function-bind/README.md +46 -0
- gaia/eval/webapp/node_modules/function-bind/implementation.js +84 -0
- gaia/eval/webapp/node_modules/function-bind/index.js +5 -0
- gaia/eval/webapp/node_modules/function-bind/package.json +87 -0
- gaia/eval/webapp/node_modules/function-bind/test/.eslintrc +9 -0
- gaia/eval/webapp/node_modules/function-bind/test/index.js +252 -0
- gaia/eval/webapp/node_modules/get-intrinsic/.eslintrc +42 -0
- gaia/eval/webapp/node_modules/get-intrinsic/.github/FUNDING.yml +12 -0
- gaia/eval/webapp/node_modules/get-intrinsic/.nycrc +9 -0
- gaia/eval/webapp/node_modules/get-intrinsic/CHANGELOG.md +186 -0
- gaia/eval/webapp/node_modules/get-intrinsic/LICENSE +21 -0
- gaia/eval/webapp/node_modules/get-intrinsic/README.md +71 -0
- gaia/eval/webapp/node_modules/get-intrinsic/index.js +378 -0
- gaia/eval/webapp/node_modules/get-intrinsic/package.json +97 -0
- gaia/eval/webapp/node_modules/get-intrinsic/test/GetIntrinsic.js +274 -0
- gaia/eval/webapp/node_modules/get-proto/.eslintrc +10 -0
- gaia/eval/webapp/node_modules/get-proto/.github/FUNDING.yml +12 -0
- gaia/eval/webapp/node_modules/get-proto/.nycrc +9 -0
- gaia/eval/webapp/node_modules/get-proto/CHANGELOG.md +21 -0
- gaia/eval/webapp/node_modules/get-proto/LICENSE +21 -0
- gaia/eval/webapp/node_modules/get-proto/Object.getPrototypeOf.d.ts +5 -0
- gaia/eval/webapp/node_modules/get-proto/Object.getPrototypeOf.js +6 -0
- gaia/eval/webapp/node_modules/get-proto/README.md +50 -0
- gaia/eval/webapp/node_modules/get-proto/Reflect.getPrototypeOf.d.ts +3 -0
- gaia/eval/webapp/node_modules/get-proto/Reflect.getPrototypeOf.js +4 -0
- gaia/eval/webapp/node_modules/get-proto/index.d.ts +5 -0
- gaia/eval/webapp/node_modules/get-proto/index.js +27 -0
- gaia/eval/webapp/node_modules/get-proto/package.json +81 -0
- gaia/eval/webapp/node_modules/get-proto/test/index.js +68 -0
- gaia/eval/webapp/node_modules/get-proto/tsconfig.json +9 -0
- gaia/eval/webapp/node_modules/gopd/.eslintrc +16 -0
- gaia/eval/webapp/node_modules/gopd/.github/FUNDING.yml +12 -0
- gaia/eval/webapp/node_modules/gopd/CHANGELOG.md +45 -0
- gaia/eval/webapp/node_modules/gopd/LICENSE +21 -0
- gaia/eval/webapp/node_modules/gopd/README.md +40 -0
- gaia/eval/webapp/node_modules/gopd/gOPD.d.ts +1 -0
- gaia/eval/webapp/node_modules/gopd/gOPD.js +4 -0
- gaia/eval/webapp/node_modules/gopd/index.d.ts +5 -0
- gaia/eval/webapp/node_modules/gopd/index.js +15 -0
- gaia/eval/webapp/node_modules/gopd/package.json +77 -0
- gaia/eval/webapp/node_modules/gopd/test/index.js +36 -0
- gaia/eval/webapp/node_modules/gopd/tsconfig.json +9 -0
- gaia/eval/webapp/node_modules/has-symbols/.eslintrc +11 -0
- gaia/eval/webapp/node_modules/has-symbols/.github/FUNDING.yml +12 -0
- gaia/eval/webapp/node_modules/has-symbols/.nycrc +9 -0
- gaia/eval/webapp/node_modules/has-symbols/CHANGELOG.md +91 -0
- gaia/eval/webapp/node_modules/has-symbols/LICENSE +21 -0
- gaia/eval/webapp/node_modules/has-symbols/README.md +46 -0
- gaia/eval/webapp/node_modules/has-symbols/index.d.ts +3 -0
- gaia/eval/webapp/node_modules/has-symbols/index.js +14 -0
- gaia/eval/webapp/node_modules/has-symbols/package.json +111 -0
- gaia/eval/webapp/node_modules/has-symbols/shams.d.ts +3 -0
- gaia/eval/webapp/node_modules/has-symbols/shams.js +45 -0
- gaia/eval/webapp/node_modules/has-symbols/test/index.js +22 -0
- gaia/eval/webapp/node_modules/has-symbols/test/shams/core-js.js +29 -0
- gaia/eval/webapp/node_modules/has-symbols/test/shams/get-own-property-symbols.js +29 -0
- gaia/eval/webapp/node_modules/has-symbols/test/tests.js +58 -0
- gaia/eval/webapp/node_modules/has-symbols/tsconfig.json +10 -0
- gaia/eval/webapp/node_modules/hasown/.eslintrc +5 -0
- gaia/eval/webapp/node_modules/hasown/.github/FUNDING.yml +12 -0
- gaia/eval/webapp/node_modules/hasown/.nycrc +13 -0
- gaia/eval/webapp/node_modules/hasown/CHANGELOG.md +40 -0
- gaia/eval/webapp/node_modules/hasown/LICENSE +21 -0
- gaia/eval/webapp/node_modules/hasown/README.md +40 -0
- gaia/eval/webapp/node_modules/hasown/index.d.ts +3 -0
- gaia/eval/webapp/node_modules/hasown/index.js +8 -0
- gaia/eval/webapp/node_modules/hasown/package.json +92 -0
- gaia/eval/webapp/node_modules/hasown/tsconfig.json +6 -0
- gaia/eval/webapp/node_modules/http-errors/HISTORY.md +180 -0
- gaia/eval/webapp/node_modules/http-errors/LICENSE +23 -0
- gaia/eval/webapp/node_modules/http-errors/README.md +169 -0
- gaia/eval/webapp/node_modules/http-errors/index.js +289 -0
- gaia/eval/webapp/node_modules/http-errors/package.json +50 -0
- gaia/eval/webapp/node_modules/iconv-lite/Changelog.md +162 -0
- gaia/eval/webapp/node_modules/iconv-lite/LICENSE +21 -0
- gaia/eval/webapp/node_modules/iconv-lite/README.md +156 -0
- gaia/eval/webapp/node_modules/iconv-lite/encodings/dbcs-codec.js +555 -0
- gaia/eval/webapp/node_modules/iconv-lite/encodings/dbcs-data.js +176 -0
- gaia/eval/webapp/node_modules/iconv-lite/encodings/index.js +22 -0
- gaia/eval/webapp/node_modules/iconv-lite/encodings/internal.js +188 -0
- gaia/eval/webapp/node_modules/iconv-lite/encodings/sbcs-codec.js +72 -0
- gaia/eval/webapp/node_modules/iconv-lite/encodings/sbcs-data-generated.js +451 -0
- gaia/eval/webapp/node_modules/iconv-lite/encodings/sbcs-data.js +174 -0
- gaia/eval/webapp/node_modules/iconv-lite/encodings/tables/big5-added.json +122 -0
- gaia/eval/webapp/node_modules/iconv-lite/encodings/tables/cp936.json +264 -0
- gaia/eval/webapp/node_modules/iconv-lite/encodings/tables/cp949.json +273 -0
- gaia/eval/webapp/node_modules/iconv-lite/encodings/tables/cp950.json +177 -0
- gaia/eval/webapp/node_modules/iconv-lite/encodings/tables/eucjp.json +182 -0
- gaia/eval/webapp/node_modules/iconv-lite/encodings/tables/gb18030-ranges.json +1 -0
- gaia/eval/webapp/node_modules/iconv-lite/encodings/tables/gbk-added.json +55 -0
- gaia/eval/webapp/node_modules/iconv-lite/encodings/tables/shiftjis.json +125 -0
- gaia/eval/webapp/node_modules/iconv-lite/encodings/utf16.js +177 -0
- gaia/eval/webapp/node_modules/iconv-lite/encodings/utf7.js +290 -0
- gaia/eval/webapp/node_modules/iconv-lite/lib/bom-handling.js +52 -0
- gaia/eval/webapp/node_modules/iconv-lite/lib/extend-node.js +217 -0
- gaia/eval/webapp/node_modules/iconv-lite/lib/index.d.ts +24 -0
- gaia/eval/webapp/node_modules/iconv-lite/lib/index.js +153 -0
- gaia/eval/webapp/node_modules/iconv-lite/lib/streams.js +121 -0
- gaia/eval/webapp/node_modules/iconv-lite/package.json +46 -0
- gaia/eval/webapp/node_modules/inherits/LICENSE +16 -0
- gaia/eval/webapp/node_modules/inherits/README.md +42 -0
- gaia/eval/webapp/node_modules/inherits/inherits.js +9 -0
- gaia/eval/webapp/node_modules/inherits/inherits_browser.js +27 -0
- gaia/eval/webapp/node_modules/inherits/package.json +29 -0
- gaia/eval/webapp/node_modules/ipaddr.js/LICENSE +19 -0
- gaia/eval/webapp/node_modules/ipaddr.js/README.md +233 -0
- gaia/eval/webapp/node_modules/ipaddr.js/ipaddr.min.js +1 -0
- gaia/eval/webapp/node_modules/ipaddr.js/lib/ipaddr.js +673 -0
- gaia/eval/webapp/node_modules/ipaddr.js/lib/ipaddr.js.d.ts +68 -0
- gaia/eval/webapp/node_modules/ipaddr.js/package.json +35 -0
- gaia/eval/webapp/node_modules/math-intrinsics/.eslintrc +16 -0
- gaia/eval/webapp/node_modules/math-intrinsics/.github/FUNDING.yml +12 -0
- gaia/eval/webapp/node_modules/math-intrinsics/CHANGELOG.md +24 -0
- gaia/eval/webapp/node_modules/math-intrinsics/LICENSE +21 -0
- gaia/eval/webapp/node_modules/math-intrinsics/README.md +50 -0
- gaia/eval/webapp/node_modules/math-intrinsics/abs.d.ts +1 -0
- gaia/eval/webapp/node_modules/math-intrinsics/abs.js +4 -0
- gaia/eval/webapp/node_modules/math-intrinsics/constants/maxArrayLength.d.ts +3 -0
- gaia/eval/webapp/node_modules/math-intrinsics/constants/maxArrayLength.js +4 -0
- gaia/eval/webapp/node_modules/math-intrinsics/constants/maxSafeInteger.d.ts +3 -0
- gaia/eval/webapp/node_modules/math-intrinsics/constants/maxSafeInteger.js +5 -0
- gaia/eval/webapp/node_modules/math-intrinsics/constants/maxValue.d.ts +3 -0
- gaia/eval/webapp/node_modules/math-intrinsics/constants/maxValue.js +5 -0
- gaia/eval/webapp/node_modules/math-intrinsics/floor.d.ts +1 -0
- gaia/eval/webapp/node_modules/math-intrinsics/floor.js +4 -0
- gaia/eval/webapp/node_modules/math-intrinsics/isFinite.d.ts +3 -0
- gaia/eval/webapp/node_modules/math-intrinsics/isFinite.js +12 -0
- gaia/eval/webapp/node_modules/math-intrinsics/isInteger.d.ts +3 -0
- gaia/eval/webapp/node_modules/math-intrinsics/isInteger.js +16 -0
- gaia/eval/webapp/node_modules/math-intrinsics/isNaN.d.ts +1 -0
- gaia/eval/webapp/node_modules/math-intrinsics/isNaN.js +6 -0
- gaia/eval/webapp/node_modules/math-intrinsics/isNegativeZero.d.ts +3 -0
- gaia/eval/webapp/node_modules/math-intrinsics/isNegativeZero.js +6 -0
- gaia/eval/webapp/node_modules/math-intrinsics/max.d.ts +1 -0
- gaia/eval/webapp/node_modules/math-intrinsics/max.js +4 -0
- gaia/eval/webapp/node_modules/math-intrinsics/min.d.ts +1 -0
- gaia/eval/webapp/node_modules/math-intrinsics/min.js +4 -0
- gaia/eval/webapp/node_modules/math-intrinsics/mod.d.ts +3 -0
- gaia/eval/webapp/node_modules/math-intrinsics/mod.js +9 -0
- gaia/eval/webapp/node_modules/math-intrinsics/package.json +86 -0
- gaia/eval/webapp/node_modules/math-intrinsics/pow.d.ts +1 -0
- gaia/eval/webapp/node_modules/math-intrinsics/pow.js +4 -0
- gaia/eval/webapp/node_modules/math-intrinsics/round.d.ts +1 -0
- gaia/eval/webapp/node_modules/math-intrinsics/round.js +4 -0
- gaia/eval/webapp/node_modules/math-intrinsics/sign.d.ts +3 -0
- gaia/eval/webapp/node_modules/math-intrinsics/sign.js +11 -0
- gaia/eval/webapp/node_modules/math-intrinsics/test/index.js +192 -0
- gaia/eval/webapp/node_modules/math-intrinsics/tsconfig.json +3 -0
- gaia/eval/webapp/node_modules/media-typer/HISTORY.md +22 -0
- gaia/eval/webapp/node_modules/media-typer/LICENSE +22 -0
- gaia/eval/webapp/node_modules/media-typer/README.md +81 -0
- gaia/eval/webapp/node_modules/media-typer/index.js +270 -0
- gaia/eval/webapp/node_modules/media-typer/package.json +26 -0
- gaia/eval/webapp/node_modules/merge-descriptors/HISTORY.md +21 -0
- gaia/eval/webapp/node_modules/merge-descriptors/LICENSE +23 -0
- gaia/eval/webapp/node_modules/merge-descriptors/README.md +49 -0
- gaia/eval/webapp/node_modules/merge-descriptors/index.js +60 -0
- gaia/eval/webapp/node_modules/merge-descriptors/package.json +39 -0
- gaia/eval/webapp/node_modules/methods/HISTORY.md +29 -0
- gaia/eval/webapp/node_modules/methods/LICENSE +24 -0
- gaia/eval/webapp/node_modules/methods/README.md +51 -0
- gaia/eval/webapp/node_modules/methods/index.js +69 -0
- gaia/eval/webapp/node_modules/methods/package.json +36 -0
- gaia/eval/webapp/node_modules/mime/.npmignore +0 -0
- gaia/eval/webapp/node_modules/mime/CHANGELOG.md +164 -0
- gaia/eval/webapp/node_modules/mime/LICENSE +21 -0
- gaia/eval/webapp/node_modules/mime/README.md +90 -0
- gaia/eval/webapp/node_modules/mime/cli.js +8 -0
- gaia/eval/webapp/node_modules/mime/mime.js +108 -0
- gaia/eval/webapp/node_modules/mime/package.json +44 -0
- gaia/eval/webapp/node_modules/mime/src/build.js +53 -0
- gaia/eval/webapp/node_modules/mime/src/test.js +60 -0
- gaia/eval/webapp/node_modules/mime/types.json +1 -0
- gaia/eval/webapp/node_modules/mime-db/HISTORY.md +507 -0
- gaia/eval/webapp/node_modules/mime-db/LICENSE +23 -0
- gaia/eval/webapp/node_modules/mime-db/README.md +100 -0
- gaia/eval/webapp/node_modules/mime-db/db.json +8519 -0
- gaia/eval/webapp/node_modules/mime-db/index.js +12 -0
- gaia/eval/webapp/node_modules/mime-db/package.json +60 -0
- gaia/eval/webapp/node_modules/mime-types/HISTORY.md +397 -0
- gaia/eval/webapp/node_modules/mime-types/LICENSE +23 -0
- gaia/eval/webapp/node_modules/mime-types/README.md +113 -0
- gaia/eval/webapp/node_modules/mime-types/index.js +188 -0
- gaia/eval/webapp/node_modules/mime-types/package.json +44 -0
- gaia/eval/webapp/node_modules/ms/index.js +152 -0
- gaia/eval/webapp/node_modules/ms/license.md +21 -0
- gaia/eval/webapp/node_modules/ms/package.json +37 -0
- gaia/eval/webapp/node_modules/ms/readme.md +51 -0
- gaia/eval/webapp/node_modules/negotiator/HISTORY.md +108 -0
- gaia/eval/webapp/node_modules/negotiator/LICENSE +24 -0
- gaia/eval/webapp/node_modules/negotiator/README.md +203 -0
- gaia/eval/webapp/node_modules/negotiator/index.js +82 -0
- gaia/eval/webapp/node_modules/negotiator/lib/charset.js +169 -0
- gaia/eval/webapp/node_modules/negotiator/lib/encoding.js +184 -0
- gaia/eval/webapp/node_modules/negotiator/lib/language.js +179 -0
- gaia/eval/webapp/node_modules/negotiator/lib/mediaType.js +294 -0
- gaia/eval/webapp/node_modules/negotiator/package.json +42 -0
- gaia/eval/webapp/node_modules/object-inspect/.eslintrc +53 -0
- gaia/eval/webapp/node_modules/object-inspect/.github/FUNDING.yml +12 -0
- gaia/eval/webapp/node_modules/object-inspect/.nycrc +13 -0
- gaia/eval/webapp/node_modules/object-inspect/CHANGELOG.md +424 -0
- gaia/eval/webapp/node_modules/object-inspect/LICENSE +21 -0
- gaia/eval/webapp/node_modules/object-inspect/example/all.js +23 -0
- gaia/eval/webapp/node_modules/object-inspect/example/circular.js +6 -0
- gaia/eval/webapp/node_modules/object-inspect/example/fn.js +5 -0
- gaia/eval/webapp/node_modules/object-inspect/example/inspect.js +10 -0
- gaia/eval/webapp/node_modules/object-inspect/index.js +544 -0
- gaia/eval/webapp/node_modules/object-inspect/package-support.json +20 -0
- gaia/eval/webapp/node_modules/object-inspect/package.json +105 -0
- gaia/eval/webapp/node_modules/object-inspect/readme.markdown +84 -0
- gaia/eval/webapp/node_modules/object-inspect/test/bigint.js +58 -0
- gaia/eval/webapp/node_modules/object-inspect/test/browser/dom.js +15 -0
- gaia/eval/webapp/node_modules/object-inspect/test/circular.js +16 -0
- gaia/eval/webapp/node_modules/object-inspect/test/deep.js +12 -0
- gaia/eval/webapp/node_modules/object-inspect/test/element.js +53 -0
- gaia/eval/webapp/node_modules/object-inspect/test/err.js +48 -0
- gaia/eval/webapp/node_modules/object-inspect/test/fakes.js +29 -0
- gaia/eval/webapp/node_modules/object-inspect/test/fn.js +76 -0
- gaia/eval/webapp/node_modules/object-inspect/test/global.js +17 -0
- gaia/eval/webapp/node_modules/object-inspect/test/has.js +15 -0
- gaia/eval/webapp/node_modules/object-inspect/test/holes.js +15 -0
- gaia/eval/webapp/node_modules/object-inspect/test/indent-option.js +271 -0
- gaia/eval/webapp/node_modules/object-inspect/test/inspect.js +139 -0
- gaia/eval/webapp/node_modules/object-inspect/test/lowbyte.js +12 -0
- gaia/eval/webapp/node_modules/object-inspect/test/number.js +58 -0
- gaia/eval/webapp/node_modules/object-inspect/test/quoteStyle.js +26 -0
- gaia/eval/webapp/node_modules/object-inspect/test/toStringTag.js +40 -0
- gaia/eval/webapp/node_modules/object-inspect/test/undef.js +12 -0
- gaia/eval/webapp/node_modules/object-inspect/test/values.js +261 -0
- gaia/eval/webapp/node_modules/object-inspect/test-core-js.js +26 -0
- gaia/eval/webapp/node_modules/object-inspect/util.inspect.js +1 -0
- gaia/eval/webapp/node_modules/on-finished/HISTORY.md +98 -0
- gaia/eval/webapp/node_modules/on-finished/LICENSE +23 -0
- gaia/eval/webapp/node_modules/on-finished/README.md +162 -0
- gaia/eval/webapp/node_modules/on-finished/index.js +234 -0
- gaia/eval/webapp/node_modules/on-finished/package.json +39 -0
- gaia/eval/webapp/node_modules/parseurl/HISTORY.md +58 -0
- gaia/eval/webapp/node_modules/parseurl/LICENSE +24 -0
- gaia/eval/webapp/node_modules/parseurl/README.md +133 -0
- gaia/eval/webapp/node_modules/parseurl/index.js +158 -0
- gaia/eval/webapp/node_modules/parseurl/package.json +40 -0
- gaia/eval/webapp/node_modules/path/.npmignore +1 -0
- gaia/eval/webapp/node_modules/path/LICENSE +18 -0
- gaia/eval/webapp/node_modules/path/README.md +15 -0
- gaia/eval/webapp/node_modules/path/package.json +24 -0
- gaia/eval/webapp/node_modules/path/path.js +628 -0
- gaia/eval/webapp/node_modules/path-to-regexp/LICENSE +21 -0
- gaia/eval/webapp/node_modules/path-to-regexp/Readme.md +35 -0
- gaia/eval/webapp/node_modules/path-to-regexp/index.js +156 -0
- gaia/eval/webapp/node_modules/path-to-regexp/package.json +30 -0
- gaia/eval/webapp/node_modules/process/.eslintrc +21 -0
- gaia/eval/webapp/node_modules/process/LICENSE +22 -0
- gaia/eval/webapp/node_modules/process/README.md +26 -0
- gaia/eval/webapp/node_modules/process/browser.js +184 -0
- gaia/eval/webapp/node_modules/process/index.js +2 -0
- gaia/eval/webapp/node_modules/process/package.json +27 -0
- gaia/eval/webapp/node_modules/process/test.js +199 -0
- gaia/eval/webapp/node_modules/proxy-addr/HISTORY.md +161 -0
- gaia/eval/webapp/node_modules/proxy-addr/LICENSE +22 -0
- gaia/eval/webapp/node_modules/proxy-addr/README.md +139 -0
- gaia/eval/webapp/node_modules/proxy-addr/index.js +327 -0
- gaia/eval/webapp/node_modules/proxy-addr/package.json +47 -0
- gaia/eval/webapp/node_modules/qs/.editorconfig +46 -0
- gaia/eval/webapp/node_modules/qs/.eslintrc +38 -0
- gaia/eval/webapp/node_modules/qs/.github/FUNDING.yml +12 -0
- gaia/eval/webapp/node_modules/qs/.nycrc +13 -0
- gaia/eval/webapp/node_modules/qs/CHANGELOG.md +600 -0
- gaia/eval/webapp/node_modules/qs/LICENSE.md +29 -0
- gaia/eval/webapp/node_modules/qs/README.md +709 -0
- gaia/eval/webapp/node_modules/qs/dist/qs.js +90 -0
- gaia/eval/webapp/node_modules/qs/lib/formats.js +23 -0
- gaia/eval/webapp/node_modules/qs/lib/index.js +11 -0
- gaia/eval/webapp/node_modules/qs/lib/parse.js +296 -0
- gaia/eval/webapp/node_modules/qs/lib/stringify.js +351 -0
- gaia/eval/webapp/node_modules/qs/lib/utils.js +265 -0
- gaia/eval/webapp/node_modules/qs/package.json +91 -0
- gaia/eval/webapp/node_modules/qs/test/empty-keys-cases.js +267 -0
- gaia/eval/webapp/node_modules/qs/test/parse.js +1170 -0
- gaia/eval/webapp/node_modules/qs/test/stringify.js +1298 -0
- gaia/eval/webapp/node_modules/qs/test/utils.js +136 -0
- gaia/eval/webapp/node_modules/range-parser/HISTORY.md +56 -0
- gaia/eval/webapp/node_modules/range-parser/LICENSE +23 -0
- gaia/eval/webapp/node_modules/range-parser/README.md +84 -0
- gaia/eval/webapp/node_modules/range-parser/index.js +162 -0
- gaia/eval/webapp/node_modules/range-parser/package.json +44 -0
- gaia/eval/webapp/node_modules/raw-body/HISTORY.md +308 -0
- gaia/eval/webapp/node_modules/raw-body/LICENSE +22 -0
- gaia/eval/webapp/node_modules/raw-body/README.md +223 -0
- gaia/eval/webapp/node_modules/raw-body/SECURITY.md +24 -0
- gaia/eval/webapp/node_modules/raw-body/index.d.ts +87 -0
- gaia/eval/webapp/node_modules/raw-body/index.js +336 -0
- gaia/eval/webapp/node_modules/raw-body/package.json +49 -0
- gaia/eval/webapp/node_modules/safe-buffer/LICENSE +21 -0
- gaia/eval/webapp/node_modules/safe-buffer/README.md +584 -0
- gaia/eval/webapp/node_modules/safe-buffer/index.d.ts +187 -0
- gaia/eval/webapp/node_modules/safe-buffer/index.js +65 -0
- gaia/eval/webapp/node_modules/safe-buffer/package.json +51 -0
- gaia/eval/webapp/node_modules/safer-buffer/LICENSE +21 -0
- gaia/eval/webapp/node_modules/safer-buffer/Porting-Buffer.md +268 -0
- gaia/eval/webapp/node_modules/safer-buffer/Readme.md +156 -0
- gaia/eval/webapp/node_modules/safer-buffer/dangerous.js +58 -0
- gaia/eval/webapp/node_modules/safer-buffer/package.json +34 -0
- gaia/eval/webapp/node_modules/safer-buffer/safer.js +77 -0
- gaia/eval/webapp/node_modules/safer-buffer/tests.js +406 -0
- gaia/eval/webapp/node_modules/send/HISTORY.md +526 -0
- gaia/eval/webapp/node_modules/send/LICENSE +23 -0
- gaia/eval/webapp/node_modules/send/README.md +327 -0
- gaia/eval/webapp/node_modules/send/SECURITY.md +24 -0
- gaia/eval/webapp/node_modules/send/index.js +1142 -0
- gaia/eval/webapp/node_modules/send/node_modules/encodeurl/HISTORY.md +14 -0
- gaia/eval/webapp/node_modules/send/node_modules/encodeurl/LICENSE +22 -0
- gaia/eval/webapp/node_modules/send/node_modules/encodeurl/README.md +128 -0
- gaia/eval/webapp/node_modules/send/node_modules/encodeurl/index.js +60 -0
- gaia/eval/webapp/node_modules/send/node_modules/encodeurl/package.json +40 -0
- gaia/eval/webapp/node_modules/send/node_modules/ms/index.js +162 -0
- gaia/eval/webapp/node_modules/send/node_modules/ms/license.md +21 -0
- gaia/eval/webapp/node_modules/send/node_modules/ms/package.json +38 -0
- gaia/eval/webapp/node_modules/send/node_modules/ms/readme.md +59 -0
- gaia/eval/webapp/node_modules/send/package.json +62 -0
- gaia/eval/webapp/node_modules/serve-static/HISTORY.md +487 -0
- gaia/eval/webapp/node_modules/serve-static/LICENSE +25 -0
- gaia/eval/webapp/node_modules/serve-static/README.md +257 -0
- gaia/eval/webapp/node_modules/serve-static/index.js +209 -0
- gaia/eval/webapp/node_modules/serve-static/package.json +42 -0
- gaia/eval/webapp/node_modules/setprototypeof/LICENSE +13 -0
- gaia/eval/webapp/node_modules/setprototypeof/README.md +31 -0
- gaia/eval/webapp/node_modules/setprototypeof/index.d.ts +2 -0
- gaia/eval/webapp/node_modules/setprototypeof/index.js +17 -0
- gaia/eval/webapp/node_modules/setprototypeof/package.json +38 -0
- gaia/eval/webapp/node_modules/setprototypeof/test/index.js +24 -0
- gaia/eval/webapp/node_modules/side-channel/.editorconfig +9 -0
- gaia/eval/webapp/node_modules/side-channel/.eslintrc +12 -0
- gaia/eval/webapp/node_modules/side-channel/.github/FUNDING.yml +12 -0
- gaia/eval/webapp/node_modules/side-channel/.nycrc +13 -0
- gaia/eval/webapp/node_modules/side-channel/CHANGELOG.md +110 -0
- gaia/eval/webapp/node_modules/side-channel/LICENSE +21 -0
- gaia/eval/webapp/node_modules/side-channel/README.md +61 -0
- gaia/eval/webapp/node_modules/side-channel/index.d.ts +14 -0
- gaia/eval/webapp/node_modules/side-channel/index.js +43 -0
- gaia/eval/webapp/node_modules/side-channel/package.json +85 -0
- gaia/eval/webapp/node_modules/side-channel/test/index.js +104 -0
- gaia/eval/webapp/node_modules/side-channel/tsconfig.json +9 -0
- gaia/eval/webapp/node_modules/side-channel-list/.editorconfig +9 -0
- gaia/eval/webapp/node_modules/side-channel-list/.eslintrc +11 -0
- gaia/eval/webapp/node_modules/side-channel-list/.github/FUNDING.yml +12 -0
- gaia/eval/webapp/node_modules/side-channel-list/.nycrc +13 -0
- gaia/eval/webapp/node_modules/side-channel-list/CHANGELOG.md +15 -0
- gaia/eval/webapp/node_modules/side-channel-list/LICENSE +21 -0
- gaia/eval/webapp/node_modules/side-channel-list/README.md +62 -0
- gaia/eval/webapp/node_modules/side-channel-list/index.d.ts +13 -0
- gaia/eval/webapp/node_modules/side-channel-list/index.js +113 -0
- gaia/eval/webapp/node_modules/side-channel-list/list.d.ts +14 -0
- gaia/eval/webapp/node_modules/side-channel-list/package.json +77 -0
- gaia/eval/webapp/node_modules/side-channel-list/test/index.js +104 -0
- gaia/eval/webapp/node_modules/side-channel-list/tsconfig.json +9 -0
- gaia/eval/webapp/node_modules/side-channel-map/.editorconfig +9 -0
- gaia/eval/webapp/node_modules/side-channel-map/.eslintrc +11 -0
- gaia/eval/webapp/node_modules/side-channel-map/.github/FUNDING.yml +12 -0
- gaia/eval/webapp/node_modules/side-channel-map/.nycrc +13 -0
- gaia/eval/webapp/node_modules/side-channel-map/CHANGELOG.md +22 -0
- gaia/eval/webapp/node_modules/side-channel-map/LICENSE +21 -0
- gaia/eval/webapp/node_modules/side-channel-map/README.md +62 -0
- gaia/eval/webapp/node_modules/side-channel-map/index.d.ts +15 -0
- gaia/eval/webapp/node_modules/side-channel-map/index.js +68 -0
- gaia/eval/webapp/node_modules/side-channel-map/package.json +80 -0
- gaia/eval/webapp/node_modules/side-channel-map/test/index.js +114 -0
- gaia/eval/webapp/node_modules/side-channel-map/tsconfig.json +9 -0
- gaia/eval/webapp/node_modules/side-channel-weakmap/.editorconfig +9 -0
- gaia/eval/webapp/node_modules/side-channel-weakmap/.eslintrc +12 -0
- gaia/eval/webapp/node_modules/side-channel-weakmap/.github/FUNDING.yml +12 -0
- gaia/eval/webapp/node_modules/side-channel-weakmap/.nycrc +13 -0
- gaia/eval/webapp/node_modules/side-channel-weakmap/CHANGELOG.md +28 -0
- gaia/eval/webapp/node_modules/side-channel-weakmap/LICENSE +21 -0
- gaia/eval/webapp/node_modules/side-channel-weakmap/README.md +62 -0
- gaia/eval/webapp/node_modules/side-channel-weakmap/index.d.ts +15 -0
- gaia/eval/webapp/node_modules/side-channel-weakmap/index.js +84 -0
- gaia/eval/webapp/node_modules/side-channel-weakmap/package.json +87 -0
- gaia/eval/webapp/node_modules/side-channel-weakmap/test/index.js +114 -0
- gaia/eval/webapp/node_modules/side-channel-weakmap/tsconfig.json +9 -0
- gaia/eval/webapp/node_modules/statuses/HISTORY.md +82 -0
- gaia/eval/webapp/node_modules/statuses/LICENSE +23 -0
- gaia/eval/webapp/node_modules/statuses/README.md +136 -0
- gaia/eval/webapp/node_modules/statuses/codes.json +65 -0
- gaia/eval/webapp/node_modules/statuses/index.js +146 -0
- gaia/eval/webapp/node_modules/statuses/package.json +49 -0
- gaia/eval/webapp/node_modules/toidentifier/HISTORY.md +9 -0
- gaia/eval/webapp/node_modules/toidentifier/LICENSE +21 -0
- gaia/eval/webapp/node_modules/toidentifier/README.md +61 -0
- gaia/eval/webapp/node_modules/toidentifier/index.js +32 -0
- gaia/eval/webapp/node_modules/toidentifier/package.json +38 -0
- gaia/eval/webapp/node_modules/type-is/HISTORY.md +259 -0
- gaia/eval/webapp/node_modules/type-is/LICENSE +23 -0
- gaia/eval/webapp/node_modules/type-is/README.md +170 -0
- gaia/eval/webapp/node_modules/type-is/index.js +266 -0
- gaia/eval/webapp/node_modules/type-is/package.json +45 -0
- gaia/eval/webapp/node_modules/unpipe/HISTORY.md +4 -0
- gaia/eval/webapp/node_modules/unpipe/LICENSE +22 -0
- gaia/eval/webapp/node_modules/unpipe/README.md +43 -0
- gaia/eval/webapp/node_modules/unpipe/index.js +69 -0
- gaia/eval/webapp/node_modules/unpipe/package.json +27 -0
- gaia/eval/webapp/node_modules/util/LICENSE +18 -0
- gaia/eval/webapp/node_modules/util/README.md +15 -0
- gaia/eval/webapp/node_modules/util/node_modules/inherits/LICENSE +16 -0
- gaia/eval/webapp/node_modules/util/node_modules/inherits/README.md +42 -0
- gaia/eval/webapp/node_modules/util/node_modules/inherits/inherits.js +7 -0
- gaia/eval/webapp/node_modules/util/node_modules/inherits/inherits_browser.js +23 -0
- gaia/eval/webapp/node_modules/util/node_modules/inherits/package.json +29 -0
- gaia/eval/webapp/node_modules/util/package.json +35 -0
- gaia/eval/webapp/node_modules/util/support/isBuffer.js +3 -0
- gaia/eval/webapp/node_modules/util/support/isBufferBrowser.js +6 -0
- gaia/eval/webapp/node_modules/util/util.js +586 -0
- gaia/eval/webapp/node_modules/utils-merge/.npmignore +9 -0
- gaia/eval/webapp/node_modules/utils-merge/LICENSE +20 -0
- gaia/eval/webapp/node_modules/utils-merge/README.md +34 -0
- gaia/eval/webapp/node_modules/utils-merge/index.js +23 -0
- gaia/eval/webapp/node_modules/utils-merge/package.json +40 -0
- gaia/eval/webapp/node_modules/vary/HISTORY.md +39 -0
- gaia/eval/webapp/node_modules/vary/LICENSE +22 -0
- gaia/eval/webapp/node_modules/vary/README.md +101 -0
- gaia/eval/webapp/node_modules/vary/index.js +149 -0
- gaia/eval/webapp/node_modules/vary/package.json +43 -0
- gaia/eval/webapp/package-lock.json +875 -0
- gaia/eval/webapp/package.json +21 -0
- gaia/eval/webapp/public/app.js +3403 -0
- gaia/eval/webapp/public/index.html +88 -0
- gaia/eval/webapp/public/styles.css +3661 -0
- gaia/eval/webapp/server.js +416 -0
- gaia/eval/webapp/test-setup.js +73 -0
- gaia/llm/__init__.py +2 -0
- gaia/llm/lemonade_client.py +3083 -0
- gaia/llm/lemonade_manager.py +269 -0
- gaia/llm/llm_client.py +729 -0
- gaia/llm/vlm_client.py +307 -0
- gaia/logger.py +189 -0
- gaia/mcp/agent_mcp_server.py +245 -0
- gaia/mcp/blender_mcp_client.py +138 -0
- gaia/mcp/blender_mcp_server.py +648 -0
- gaia/mcp/context7_cache.py +332 -0
- gaia/mcp/external_services.py +518 -0
- gaia/mcp/mcp_bridge.py +550 -0
- gaia/mcp/servers/__init__.py +6 -0
- gaia/mcp/servers/docker_mcp.py +83 -0
- gaia/rag/__init__.py +10 -0
- gaia/rag/app.py +293 -0
- gaia/rag/demo.py +304 -0
- gaia/rag/pdf_utils.py +235 -0
- gaia/rag/sdk.py +2194 -0
- gaia/security.py +163 -0
- gaia/talk/app.py +289 -0
- gaia/talk/sdk.py +538 -0
- gaia/util.py +46 -0
- 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}")
|