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,803 @@
|
|
|
1
|
+
# Copyright(C) 2024-2025 Advanced Micro Devices, Inc. All rights reserved.
|
|
2
|
+
# SPDX-License-Identifier: MIT
|
|
3
|
+
"""Validation tools for Code Agent.
|
|
4
|
+
|
|
5
|
+
This module provides tools for testing and validating generated applications.
|
|
6
|
+
Uses curl-based testing to avoid temporary files and complex setup.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import json
|
|
10
|
+
import logging
|
|
11
|
+
import subprocess
|
|
12
|
+
import time
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
from typing import Any, Dict
|
|
15
|
+
|
|
16
|
+
from gaia.agents.base.tools import tool
|
|
17
|
+
from gaia.agents.code.prompts.code_patterns import pluralize
|
|
18
|
+
from gaia.agents.code.tools.cli_tools import is_port_available
|
|
19
|
+
from gaia.agents.code.tools.web_dev_tools import read_prisma_model
|
|
20
|
+
|
|
21
|
+
logger = logging.getLogger(__name__)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def generate_test_payload(fields: Dict[str, str]) -> Dict[str, Any]:
|
|
25
|
+
"""Generate test payload data from field definitions.
|
|
26
|
+
|
|
27
|
+
Creates appropriate test values for each field type.
|
|
28
|
+
This is used by test_crud_api to generate realistic test data
|
|
29
|
+
based on the actual Prisma schema.
|
|
30
|
+
|
|
31
|
+
Args:
|
|
32
|
+
fields: Dictionary mapping field names to their types
|
|
33
|
+
|
|
34
|
+
Returns:
|
|
35
|
+
Dictionary with field names mapped to test values
|
|
36
|
+
"""
|
|
37
|
+
payload = {}
|
|
38
|
+
for field_name, field_type in fields.items():
|
|
39
|
+
# Skip auto-generated fields
|
|
40
|
+
if field_name.lower() in {"id", "createdat", "updatedat"}:
|
|
41
|
+
continue
|
|
42
|
+
|
|
43
|
+
# Generate appropriate test values based on type
|
|
44
|
+
field_type_lower = field_type.lower()
|
|
45
|
+
if field_type_lower in ("string", "text"):
|
|
46
|
+
payload[field_name] = f"Test {field_name.replace('_', ' ').title()}"
|
|
47
|
+
elif field_type_lower in ("int", "number", "integer"):
|
|
48
|
+
payload[field_name] = 42
|
|
49
|
+
elif field_type_lower == "float":
|
|
50
|
+
payload[field_name] = 3.14
|
|
51
|
+
elif field_type_lower == "boolean":
|
|
52
|
+
# Default to false for most boolean fields, true for common patterns
|
|
53
|
+
if field_name.lower() in ("active", "enabled", "visible"):
|
|
54
|
+
payload[field_name] = True
|
|
55
|
+
else:
|
|
56
|
+
payload[field_name] = False
|
|
57
|
+
elif field_type_lower in ("datetime", "date", "timestamp"):
|
|
58
|
+
payload[field_name] = "2025-01-01T00:00:00.000Z"
|
|
59
|
+
else:
|
|
60
|
+
# Default to string for unknown types
|
|
61
|
+
payload[field_name] = f"Test {field_name}"
|
|
62
|
+
|
|
63
|
+
return payload
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
class ValidationToolsMixin:
|
|
67
|
+
"""Mixin providing validation and testing tools for the Code Agent."""
|
|
68
|
+
|
|
69
|
+
def register_validation_tools(self) -> None:
|
|
70
|
+
"""Register validation tools with the agent."""
|
|
71
|
+
|
|
72
|
+
@tool
|
|
73
|
+
def test_crud_api(
|
|
74
|
+
project_dir: str, model_name: str, port: int = 3000
|
|
75
|
+
) -> Dict[str, Any]:
|
|
76
|
+
"""Test CRUD API endpoints using curl.
|
|
77
|
+
|
|
78
|
+
Validates that all CRUD operations work correctly by:
|
|
79
|
+
- Creating a test record (POST)
|
|
80
|
+
- Listing all records (GET list)
|
|
81
|
+
- Getting single record (GET single)
|
|
82
|
+
- Updating record (PATCH)
|
|
83
|
+
- Deleting record (DELETE)
|
|
84
|
+
|
|
85
|
+
Ensures dev server is running before testing.
|
|
86
|
+
|
|
87
|
+
Args:
|
|
88
|
+
project_dir: Path to the Next.js project directory
|
|
89
|
+
model_name: Model name to test (e.g., "Todo", "Post")
|
|
90
|
+
port: Port where dev server is running (default: 3000)
|
|
91
|
+
|
|
92
|
+
Returns:
|
|
93
|
+
{
|
|
94
|
+
"success": bool,
|
|
95
|
+
"result": {
|
|
96
|
+
"tests_passed": int,
|
|
97
|
+
"tests_failed": int,
|
|
98
|
+
"results": {
|
|
99
|
+
"POST": {"status": int, "pass": bool},
|
|
100
|
+
"GET_LIST": {"status": int, "pass": bool},
|
|
101
|
+
"GET_SINGLE": {"status": int, "pass": bool},
|
|
102
|
+
"PATCH": {"status": int, "pass": bool},
|
|
103
|
+
"DELETE": {"status": int, "pass": bool}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
On error:
|
|
109
|
+
{
|
|
110
|
+
"success": False,
|
|
111
|
+
"error": str,
|
|
112
|
+
"error_type": "endpoint_missing" | "validation_error" | "database_error" | "runtime_error"
|
|
113
|
+
}
|
|
114
|
+
"""
|
|
115
|
+
server_started_by_us = False
|
|
116
|
+
server_pid = None
|
|
117
|
+
|
|
118
|
+
try:
|
|
119
|
+
logger.info(f"Testing CRUD API for {model_name}")
|
|
120
|
+
|
|
121
|
+
# Check if dev server is running (port in use = server running)
|
|
122
|
+
server_was_running = not is_port_available(port)
|
|
123
|
+
|
|
124
|
+
if not server_was_running:
|
|
125
|
+
logger.info(f"Dev server not running on port {port}, starting...")
|
|
126
|
+
|
|
127
|
+
# Start dev server in background using CLI tools mixin
|
|
128
|
+
start_result = self._run_background_command(
|
|
129
|
+
command="npm run dev",
|
|
130
|
+
work_path=Path(project_dir),
|
|
131
|
+
startup_timeout=15,
|
|
132
|
+
expected_port=port,
|
|
133
|
+
auto_respond="",
|
|
134
|
+
)
|
|
135
|
+
|
|
136
|
+
if not start_result.get("success"):
|
|
137
|
+
return {
|
|
138
|
+
"success": False,
|
|
139
|
+
"error": "Failed to start dev server",
|
|
140
|
+
"details": start_result,
|
|
141
|
+
"error_type": "runtime_error",
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
server_started_by_us = True
|
|
145
|
+
server_pid = start_result.get("pid")
|
|
146
|
+
logger.info(f"Dev server started with PID {server_pid}")
|
|
147
|
+
|
|
148
|
+
# Give Next.js a moment to fully initialize
|
|
149
|
+
time.sleep(3)
|
|
150
|
+
else:
|
|
151
|
+
logger.info(f"Dev server already running on port {port}")
|
|
152
|
+
|
|
153
|
+
base_url = f"http://localhost:{port}"
|
|
154
|
+
resource = model_name.lower()
|
|
155
|
+
resource_plural = pluralize(resource)
|
|
156
|
+
api_url = f"{base_url}/api/{resource_plural}"
|
|
157
|
+
|
|
158
|
+
# Phase 2 Fix (Issue #885): Read schema to get actual fields
|
|
159
|
+
# instead of using hardcoded {"name": "Test Item"}
|
|
160
|
+
model_info = read_prisma_model(project_dir, model_name)
|
|
161
|
+
if model_info["success"]:
|
|
162
|
+
# Convert Prisma types to our field types
|
|
163
|
+
prisma_to_field_type = {
|
|
164
|
+
"String": "string",
|
|
165
|
+
"Int": "number",
|
|
166
|
+
"Float": "float",
|
|
167
|
+
"Boolean": "boolean",
|
|
168
|
+
"DateTime": "datetime",
|
|
169
|
+
}
|
|
170
|
+
schema_fields = {}
|
|
171
|
+
for field_name, prisma_type in model_info["fields"].items():
|
|
172
|
+
if field_name.lower() not in {"id", "createdat", "updatedat"}:
|
|
173
|
+
schema_fields[field_name] = prisma_to_field_type.get(
|
|
174
|
+
prisma_type, "string"
|
|
175
|
+
)
|
|
176
|
+
test_payload = generate_test_payload(schema_fields)
|
|
177
|
+
logger.info(f"Generated test payload from schema: {test_payload}")
|
|
178
|
+
else:
|
|
179
|
+
# Fallback: Use generic test payload but log warning
|
|
180
|
+
logger.warning(
|
|
181
|
+
f"Could not read Prisma schema for {model_name}, "
|
|
182
|
+
f"using generic test payload. Error: {model_info.get('error')}"
|
|
183
|
+
)
|
|
184
|
+
test_payload = {
|
|
185
|
+
"title": "Test Item",
|
|
186
|
+
"description": "Test description",
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
# Escape the payload for shell
|
|
190
|
+
test_payload_json = json.dumps(test_payload)
|
|
191
|
+
|
|
192
|
+
results = {}
|
|
193
|
+
created_id = None
|
|
194
|
+
|
|
195
|
+
# Test 1: POST (create)
|
|
196
|
+
logger.info("Testing POST (create)...")
|
|
197
|
+
post_result = self._run_foreground_command(
|
|
198
|
+
command=(
|
|
199
|
+
f"curl -s -w '\\n%{{http_code}}' -X POST "
|
|
200
|
+
f"-H 'Content-Type: application/json' "
|
|
201
|
+
f"-d '{test_payload_json}' '{api_url}'"
|
|
202
|
+
),
|
|
203
|
+
work_path=Path(project_dir) if project_dir else Path.cwd(),
|
|
204
|
+
timeout=10,
|
|
205
|
+
auto_respond="y\n",
|
|
206
|
+
)
|
|
207
|
+
|
|
208
|
+
if post_result.get("status") == "success":
|
|
209
|
+
output = post_result.get("stdout", "")
|
|
210
|
+
lines = output.strip().split("\n")
|
|
211
|
+
status_code = int(lines[-1]) if lines else 0
|
|
212
|
+
results["POST"] = {
|
|
213
|
+
"status": status_code,
|
|
214
|
+
"pass": status_code == 201,
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
# Extract created ID from response
|
|
218
|
+
if status_code == 201 and len(lines) > 1:
|
|
219
|
+
try:
|
|
220
|
+
response_data = json.loads(lines[0])
|
|
221
|
+
created_id = response_data.get("id")
|
|
222
|
+
except Exception:
|
|
223
|
+
logger.warning(
|
|
224
|
+
"Could not parse POST response to extract ID"
|
|
225
|
+
)
|
|
226
|
+
else:
|
|
227
|
+
results["POST"] = {
|
|
228
|
+
"status": 0,
|
|
229
|
+
"pass": False,
|
|
230
|
+
"error": "Command failed",
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
# Test 2: GET (list)
|
|
234
|
+
logger.info("Testing GET (list)...")
|
|
235
|
+
get_list_result = self._run_foreground_command(
|
|
236
|
+
command=f"curl -s -w '\\n%{{http_code}}' '{api_url}'",
|
|
237
|
+
work_path=Path(project_dir) if project_dir else Path.cwd(),
|
|
238
|
+
timeout=10,
|
|
239
|
+
auto_respond="y\n",
|
|
240
|
+
)
|
|
241
|
+
|
|
242
|
+
if get_list_result.get("status") == "success":
|
|
243
|
+
output = get_list_result.get("stdout", "")
|
|
244
|
+
lines = output.strip().split("\n")
|
|
245
|
+
status_code = int(lines[-1]) if lines else 0
|
|
246
|
+
results["GET_LIST"] = {
|
|
247
|
+
"status": status_code,
|
|
248
|
+
"pass": status_code == 200,
|
|
249
|
+
}
|
|
250
|
+
else:
|
|
251
|
+
results["GET_LIST"] = {
|
|
252
|
+
"status": 0,
|
|
253
|
+
"pass": False,
|
|
254
|
+
"error": "Command failed",
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
# Test 3: GET (single) - only if we have an ID
|
|
258
|
+
if created_id:
|
|
259
|
+
logger.info(f"Testing GET (single) with ID {created_id}...")
|
|
260
|
+
get_single_result = self._run_foreground_command(
|
|
261
|
+
command=f"curl -s -w '\\n%{{http_code}}' '{api_url}/{created_id}'",
|
|
262
|
+
work_path=Path(project_dir) if project_dir else Path.cwd(),
|
|
263
|
+
timeout=10,
|
|
264
|
+
auto_respond="y\n",
|
|
265
|
+
)
|
|
266
|
+
|
|
267
|
+
if get_single_result.get("status") == "success":
|
|
268
|
+
output = get_single_result.get("stdout", "")
|
|
269
|
+
lines = output.strip().split("\n")
|
|
270
|
+
status_code = int(lines[-1]) if lines else 0
|
|
271
|
+
results["GET_SINGLE"] = {
|
|
272
|
+
"status": status_code,
|
|
273
|
+
"pass": status_code == 200,
|
|
274
|
+
}
|
|
275
|
+
else:
|
|
276
|
+
results["GET_SINGLE"] = {
|
|
277
|
+
"status": 0,
|
|
278
|
+
"pass": False,
|
|
279
|
+
"error": "Command failed",
|
|
280
|
+
}
|
|
281
|
+
else:
|
|
282
|
+
results["GET_SINGLE"] = {
|
|
283
|
+
"status": 0,
|
|
284
|
+
"pass": False,
|
|
285
|
+
"error": "No ID to test",
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
# Test 4: PATCH (update) - only if we have an ID
|
|
289
|
+
if created_id:
|
|
290
|
+
logger.info(f"Testing PATCH (update) with ID {created_id}...")
|
|
291
|
+
# Generate update payload - modify the first string field
|
|
292
|
+
update_payload = {}
|
|
293
|
+
for key, value in test_payload.items():
|
|
294
|
+
if isinstance(value, str):
|
|
295
|
+
update_payload[key] = f"Updated {value}"
|
|
296
|
+
break
|
|
297
|
+
if not update_payload:
|
|
298
|
+
# Fallback: use first field with "Updated" prefix
|
|
299
|
+
first_key = next(iter(test_payload), None)
|
|
300
|
+
if first_key:
|
|
301
|
+
update_payload[first_key] = "Updated Value"
|
|
302
|
+
update_payload_json = json.dumps(update_payload)
|
|
303
|
+
|
|
304
|
+
patch_result = self._run_foreground_command(
|
|
305
|
+
command=(
|
|
306
|
+
f"curl -s -w '\\n%{{http_code}}' -X PATCH "
|
|
307
|
+
f"-H 'Content-Type: application/json' "
|
|
308
|
+
f"-d '{update_payload_json}' '{api_url}/{created_id}'"
|
|
309
|
+
),
|
|
310
|
+
work_path=Path(project_dir) if project_dir else Path.cwd(),
|
|
311
|
+
timeout=10,
|
|
312
|
+
auto_respond="y\n",
|
|
313
|
+
)
|
|
314
|
+
|
|
315
|
+
if patch_result.get("status") == "success":
|
|
316
|
+
output = patch_result.get("stdout", "")
|
|
317
|
+
lines = output.strip().split("\n")
|
|
318
|
+
status_code = int(lines[-1]) if lines else 0
|
|
319
|
+
results["PATCH"] = {
|
|
320
|
+
"status": status_code,
|
|
321
|
+
"pass": status_code == 200,
|
|
322
|
+
}
|
|
323
|
+
else:
|
|
324
|
+
results["PATCH"] = {
|
|
325
|
+
"status": 0,
|
|
326
|
+
"pass": False,
|
|
327
|
+
"error": "Command failed",
|
|
328
|
+
}
|
|
329
|
+
else:
|
|
330
|
+
results["PATCH"] = {
|
|
331
|
+
"status": 0,
|
|
332
|
+
"pass": False,
|
|
333
|
+
"error": "No ID to test",
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
# Test 5: DELETE - only if we have an ID
|
|
337
|
+
if created_id:
|
|
338
|
+
logger.info(f"Testing DELETE with ID {created_id}...")
|
|
339
|
+
delete_result = self._run_foreground_command(
|
|
340
|
+
command=f"curl -s -w '\\n%{{http_code}}' -X DELETE '{api_url}/{created_id}'",
|
|
341
|
+
work_path=Path(project_dir) if project_dir else Path.cwd(),
|
|
342
|
+
timeout=10,
|
|
343
|
+
auto_respond="y\n",
|
|
344
|
+
)
|
|
345
|
+
|
|
346
|
+
if delete_result.get("status") == "success":
|
|
347
|
+
output = delete_result.get("stdout", "")
|
|
348
|
+
lines = output.strip().split("\n")
|
|
349
|
+
status_code = int(lines[-1]) if lines else 0
|
|
350
|
+
results["DELETE"] = {
|
|
351
|
+
"status": status_code,
|
|
352
|
+
"pass": status_code == 200,
|
|
353
|
+
}
|
|
354
|
+
else:
|
|
355
|
+
results["DELETE"] = {
|
|
356
|
+
"status": 0,
|
|
357
|
+
"pass": False,
|
|
358
|
+
"error": "Command failed",
|
|
359
|
+
}
|
|
360
|
+
else:
|
|
361
|
+
results["DELETE"] = {
|
|
362
|
+
"status": 0,
|
|
363
|
+
"pass": False,
|
|
364
|
+
"error": "No ID to test",
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
# Calculate summary
|
|
368
|
+
passed = sum(1 for r in results.values() if r.get("pass", False))
|
|
369
|
+
failed = len(results) - passed
|
|
370
|
+
|
|
371
|
+
logger.info(f"Tests completed: {passed} passed, {failed} failed")
|
|
372
|
+
|
|
373
|
+
return {
|
|
374
|
+
"success": passed == len(results),
|
|
375
|
+
"result": {
|
|
376
|
+
"tests_passed": passed,
|
|
377
|
+
"tests_failed": failed,
|
|
378
|
+
"results": results,
|
|
379
|
+
},
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
except Exception as e:
|
|
383
|
+
logger.error(f"Error in test_crud_api: {e}", exc_info=True)
|
|
384
|
+
return {
|
|
385
|
+
"success": False,
|
|
386
|
+
"error": str(e),
|
|
387
|
+
"error_type": "runtime_error",
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
finally:
|
|
391
|
+
# Clean up: stop dev server if we started it
|
|
392
|
+
if server_started_by_us and server_pid:
|
|
393
|
+
logger.info(f"Stopping dev server (PID {server_pid})...")
|
|
394
|
+
try:
|
|
395
|
+
self._stop_process(server_pid, force=False)
|
|
396
|
+
logger.info("Dev server stopped successfully")
|
|
397
|
+
except Exception as cleanup_error:
|
|
398
|
+
logger.warning(f"Error stopping dev server: {cleanup_error}")
|
|
399
|
+
|
|
400
|
+
@tool
|
|
401
|
+
def validate_typescript(project_dir: str) -> Dict[str, Any]:
|
|
402
|
+
"""Validate TypeScript code before declaring success.
|
|
403
|
+
|
|
404
|
+
Runs TypeScript compiler in no-emit mode to check for type errors
|
|
405
|
+
without generating output files. This is the ultimate guardrail to
|
|
406
|
+
catch import errors, missing types, and other TypeScript issues
|
|
407
|
+
before they reach npm run build.
|
|
408
|
+
|
|
409
|
+
TIER 4 ERROR MESSAGING: When validation fails, this tool returns
|
|
410
|
+
specific rule citations to teach the LLM what went wrong.
|
|
411
|
+
|
|
412
|
+
Args:
|
|
413
|
+
project_dir: Path to the Next.js project directory
|
|
414
|
+
|
|
415
|
+
Returns:
|
|
416
|
+
On success:
|
|
417
|
+
{
|
|
418
|
+
"success": True,
|
|
419
|
+
"message": "TypeScript validation passed"
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
On failure:
|
|
423
|
+
{
|
|
424
|
+
"success": False,
|
|
425
|
+
"error": "TypeScript validation failed",
|
|
426
|
+
"errors": str, # Full tsc error output
|
|
427
|
+
"rule": str, # Which rule was violated
|
|
428
|
+
"violation": str, # Specific violation
|
|
429
|
+
"fix": str, # How to fix it
|
|
430
|
+
"hint": "Fix the type errors listed above, then run validate_typescript again"
|
|
431
|
+
}
|
|
432
|
+
"""
|
|
433
|
+
try:
|
|
434
|
+
logger.debug(f"Validating TypeScript in {project_dir}")
|
|
435
|
+
|
|
436
|
+
result = subprocess.run(
|
|
437
|
+
["npx", "tsc", "--noEmit", "--skipLibCheck"],
|
|
438
|
+
cwd=project_dir,
|
|
439
|
+
capture_output=True,
|
|
440
|
+
text=True,
|
|
441
|
+
timeout=60,
|
|
442
|
+
check=False,
|
|
443
|
+
)
|
|
444
|
+
|
|
445
|
+
if result.returncode == 0:
|
|
446
|
+
logger.info("TypeScript validation passed")
|
|
447
|
+
return {
|
|
448
|
+
"success": True,
|
|
449
|
+
"message": "TypeScript validation passed - no type errors found",
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
# Parse errors to provide specific guidance
|
|
453
|
+
error_output = result.stderr if result.stderr else result.stdout
|
|
454
|
+
logger.warning(f"TypeScript validation failed:\n{error_output}")
|
|
455
|
+
|
|
456
|
+
# Detect common error patterns and provide rule citations
|
|
457
|
+
rule = None
|
|
458
|
+
violation = None
|
|
459
|
+
fix = None
|
|
460
|
+
|
|
461
|
+
if "Cannot find name" in error_output:
|
|
462
|
+
violation = "Missing type import"
|
|
463
|
+
rule = "Client components must use: import type { X } from '@prisma/client'"
|
|
464
|
+
fix = "Add the missing type import at the top of the file"
|
|
465
|
+
elif "Cannot find module '@/lib/prisma'" in error_output:
|
|
466
|
+
violation = "Missing prisma singleton"
|
|
467
|
+
rule = "Server components must import: import { prisma } from '@/lib/prisma'"
|
|
468
|
+
fix = "Ensure src/lib/prisma.ts exists with the Prisma singleton"
|
|
469
|
+
elif (
|
|
470
|
+
"Module '\"@prisma/client\"' has no exported member" in error_output
|
|
471
|
+
):
|
|
472
|
+
violation = "Prisma types not generated"
|
|
473
|
+
rule = "Run prisma generate after schema changes"
|
|
474
|
+
fix = "Run: npx prisma generate"
|
|
475
|
+
elif (
|
|
476
|
+
"'prisma' is not defined" in error_output
|
|
477
|
+
or "Cannot find name 'prisma'" in error_output
|
|
478
|
+
):
|
|
479
|
+
violation = "Direct prisma import in client component"
|
|
480
|
+
rule = "NEVER import prisma client directly in client components"
|
|
481
|
+
fix = "Use API routes for database access from client components"
|
|
482
|
+
|
|
483
|
+
response = {
|
|
484
|
+
"success": False,
|
|
485
|
+
"error": "TypeScript validation failed",
|
|
486
|
+
"errors": error_output,
|
|
487
|
+
"hint": "Fix the type errors listed above, then run validate_typescript again",
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
# Add Tier 4 teaching if we detected a specific violation
|
|
491
|
+
if rule and violation and fix:
|
|
492
|
+
response.update({"violation": violation, "rule": rule, "fix": fix})
|
|
493
|
+
|
|
494
|
+
return response
|
|
495
|
+
|
|
496
|
+
except subprocess.TimeoutExpired:
|
|
497
|
+
logger.error("TypeScript validation timed out")
|
|
498
|
+
return {
|
|
499
|
+
"success": False,
|
|
500
|
+
"error": "TypeScript validation timed out after 60 seconds",
|
|
501
|
+
"hint": "Check for infinite type recursion or very large project",
|
|
502
|
+
}
|
|
503
|
+
except FileNotFoundError:
|
|
504
|
+
logger.error("TypeScript compiler not found")
|
|
505
|
+
return {
|
|
506
|
+
"success": False,
|
|
507
|
+
"error": "TypeScript compiler (tsc) not found",
|
|
508
|
+
"hint": "Ensure TypeScript is installed: npm install --save-dev typescript",
|
|
509
|
+
}
|
|
510
|
+
except Exception as e:
|
|
511
|
+
logger.error(f"Error in validate_typescript: {e}", exc_info=True)
|
|
512
|
+
return {
|
|
513
|
+
"success": False,
|
|
514
|
+
"error": f"Validation error: {str(e)}",
|
|
515
|
+
"hint": "Check that project_dir is valid and contains a Next.js project",
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
@tool
|
|
519
|
+
def validate_crud_structure(
|
|
520
|
+
project_dir: str, resource_name: str
|
|
521
|
+
) -> Dict[str, Any]:
|
|
522
|
+
"""Validate that all required CRUD files exist before declaring success.
|
|
523
|
+
|
|
524
|
+
Checks for a complete CRUD application structure including:
|
|
525
|
+
- List page, New page, Detail page
|
|
526
|
+
- Form component, Actions component
|
|
527
|
+
- API routes (collection and item)
|
|
528
|
+
|
|
529
|
+
This should be called AFTER building a CRUD app to ensure nothing was skipped.
|
|
530
|
+
|
|
531
|
+
Args:
|
|
532
|
+
project_dir: Path to the Next.js project directory
|
|
533
|
+
resource_name: Resource name in singular form (e.g., "todo", "post")
|
|
534
|
+
|
|
535
|
+
Returns:
|
|
536
|
+
Dictionary with:
|
|
537
|
+
- success: bool
|
|
538
|
+
- missing_files: list of missing file paths
|
|
539
|
+
- message: summary of validation result
|
|
540
|
+
"""
|
|
541
|
+
try:
|
|
542
|
+
project_path = Path(project_dir)
|
|
543
|
+
resource_plural = resource_name.lower() + "s" # Simple pluralization
|
|
544
|
+
resource_capitalized = resource_name.capitalize()
|
|
545
|
+
|
|
546
|
+
# Define all required files for a complete CRUD app
|
|
547
|
+
required_files = {
|
|
548
|
+
"List page": f"src/app/{resource_plural}/page.tsx",
|
|
549
|
+
"New page": f"src/app/{resource_plural}/new/page.tsx",
|
|
550
|
+
"Detail page": f"src/app/{resource_plural}/[id]/page.tsx",
|
|
551
|
+
"Form component": f"src/components/{resource_capitalized}Form.tsx",
|
|
552
|
+
"Actions component": f"src/components/{resource_capitalized}Actions.tsx",
|
|
553
|
+
"Collection API": f"src/app/api/{resource_plural}/route.ts",
|
|
554
|
+
"Item API": f"src/app/api/{resource_plural}/[id]/route.ts",
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
missing_files = []
|
|
558
|
+
existing_files = []
|
|
559
|
+
|
|
560
|
+
for description, file_path in required_files.items():
|
|
561
|
+
full_path = project_path / file_path
|
|
562
|
+
if full_path.exists():
|
|
563
|
+
existing_files.append(f"✅ {description}: {file_path}")
|
|
564
|
+
else:
|
|
565
|
+
missing_files.append(
|
|
566
|
+
{
|
|
567
|
+
"description": description,
|
|
568
|
+
"path": file_path,
|
|
569
|
+
"create_with": self._get_create_command(
|
|
570
|
+
description, resource_name
|
|
571
|
+
),
|
|
572
|
+
}
|
|
573
|
+
)
|
|
574
|
+
|
|
575
|
+
if not missing_files:
|
|
576
|
+
logger.info(f"CRUD structure validation passed for {resource_name}")
|
|
577
|
+
return {
|
|
578
|
+
"success": True,
|
|
579
|
+
"message": f"Complete CRUD structure validated for {resource_name}",
|
|
580
|
+
"existing_files": existing_files,
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
# Build detailed error message with fix instructions
|
|
584
|
+
error_details = f"Missing {len(missing_files)} required file(s) for {resource_name} CRUD app:\n\n"
|
|
585
|
+
for item in missing_files:
|
|
586
|
+
error_details += f"❌ {item['description']}: {item['path']}\n"
|
|
587
|
+
error_details += f" Fix: {item['create_with']}\n\n"
|
|
588
|
+
|
|
589
|
+
logger.warning(
|
|
590
|
+
f"CRUD structure validation failed: {len(missing_files)} files missing"
|
|
591
|
+
)
|
|
592
|
+
|
|
593
|
+
return {
|
|
594
|
+
"success": False,
|
|
595
|
+
"error": f"Incomplete CRUD structure: {len(missing_files)} file(s) missing",
|
|
596
|
+
"missing_files": missing_files,
|
|
597
|
+
"existing_files": existing_files,
|
|
598
|
+
"details": error_details,
|
|
599
|
+
"hint": "Create the missing files using the fix commands listed above",
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
except Exception as e:
|
|
603
|
+
logger.error(f"Error in validate_crud_structure: {e}", exc_info=True)
|
|
604
|
+
return {
|
|
605
|
+
"success": False,
|
|
606
|
+
"error": f"Validation error: {str(e)}",
|
|
607
|
+
"hint": "Check that project_dir is valid and resource_name is correct",
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
@tool
|
|
611
|
+
def validate_styles(
|
|
612
|
+
project_dir: str, _resource_name: str = None
|
|
613
|
+
) -> Dict[str, Any]:
|
|
614
|
+
"""Validate CSS files and design system consistency.
|
|
615
|
+
|
|
616
|
+
This tool validates:
|
|
617
|
+
1. CSS files contain valid CSS (not TypeScript/JavaScript) - CRITICAL
|
|
618
|
+
2. globals.css has Tailwind directives
|
|
619
|
+
3. layout.tsx imports globals.css
|
|
620
|
+
4. (Optional) Custom classes used in components are defined
|
|
621
|
+
|
|
622
|
+
Addresses Issue #1002: CSS file written with TypeScript code.
|
|
623
|
+
|
|
624
|
+
Args:
|
|
625
|
+
project_dir: Path to the Next.js project directory
|
|
626
|
+
resource_name: Optional resource name for component class checks
|
|
627
|
+
|
|
628
|
+
Returns:
|
|
629
|
+
On success:
|
|
630
|
+
{
|
|
631
|
+
"success": True,
|
|
632
|
+
"is_valid": True,
|
|
633
|
+
"message": "Styling validated successfully",
|
|
634
|
+
"files_checked": [list of files]
|
|
635
|
+
}
|
|
636
|
+
|
|
637
|
+
On failure:
|
|
638
|
+
{
|
|
639
|
+
"success": False,
|
|
640
|
+
"is_valid": False,
|
|
641
|
+
"errors": [list of CRITICAL errors],
|
|
642
|
+
"warnings": [list of warnings],
|
|
643
|
+
"hint": "How to fix"
|
|
644
|
+
}
|
|
645
|
+
"""
|
|
646
|
+
import re
|
|
647
|
+
|
|
648
|
+
try:
|
|
649
|
+
project_path = Path(project_dir)
|
|
650
|
+
errors = []
|
|
651
|
+
warnings = []
|
|
652
|
+
files_checked = []
|
|
653
|
+
|
|
654
|
+
# 1. Check globals.css for TypeScript content (CRITICAL)
|
|
655
|
+
globals_css = project_path / "src" / "app" / "globals.css"
|
|
656
|
+
if globals_css.exists():
|
|
657
|
+
files_checked.append("src/app/globals.css")
|
|
658
|
+
content = globals_css.read_text()
|
|
659
|
+
|
|
660
|
+
# TypeScript/JavaScript detection patterns
|
|
661
|
+
typescript_indicators = [
|
|
662
|
+
(r"^\s*import\s+.*from", "import statement"),
|
|
663
|
+
(
|
|
664
|
+
r"^\s*export\s+(default|const|function|class|async)",
|
|
665
|
+
"export statement",
|
|
666
|
+
),
|
|
667
|
+
(r'"use client"|\'use client\'', "React client directive"),
|
|
668
|
+
(r"^\s*interface\s+\w+", "TypeScript interface"),
|
|
669
|
+
(r"^\s*type\s+\w+\s*=", "TypeScript type alias"),
|
|
670
|
+
(r"^\s*const\s+\w+\s*[=:]", "const declaration"),
|
|
671
|
+
(r"^\s*let\s+\w+\s*[=:]", "let declaration"),
|
|
672
|
+
(r"^\s*function\s+\w+", "function declaration"),
|
|
673
|
+
(r"^\s*async\s+function", "async function"),
|
|
674
|
+
(r"<[A-Z][a-zA-Z]*[\s/>]", "JSX component tag"),
|
|
675
|
+
(r"useState|useEffect|useRouter|usePathname", "React hook"),
|
|
676
|
+
]
|
|
677
|
+
|
|
678
|
+
for pattern, description in typescript_indicators:
|
|
679
|
+
if re.search(pattern, content, re.MULTILINE):
|
|
680
|
+
errors.append(
|
|
681
|
+
f"CRITICAL: globals.css contains {description}. "
|
|
682
|
+
f"This file has TypeScript/JSX code instead of CSS."
|
|
683
|
+
)
|
|
684
|
+
|
|
685
|
+
# Check for balanced braces
|
|
686
|
+
if content.count("{") != content.count("}"):
|
|
687
|
+
errors.append("globals.css has mismatched braces")
|
|
688
|
+
|
|
689
|
+
# Check for Tailwind directives
|
|
690
|
+
has_tailwind = (
|
|
691
|
+
"@tailwind" in content or '@import "tailwindcss' in content
|
|
692
|
+
)
|
|
693
|
+
if not has_tailwind and len(content.strip()) > 50:
|
|
694
|
+
warnings.append(
|
|
695
|
+
"globals.css is missing Tailwind directives "
|
|
696
|
+
"(@tailwind base/components/utilities)"
|
|
697
|
+
)
|
|
698
|
+
else:
|
|
699
|
+
errors.append("globals.css not found at src/app/globals.css")
|
|
700
|
+
|
|
701
|
+
# 2. Check layout.tsx imports globals.css
|
|
702
|
+
layout_tsx = project_path / "src" / "app" / "layout.tsx"
|
|
703
|
+
if layout_tsx.exists():
|
|
704
|
+
files_checked.append("src/app/layout.tsx")
|
|
705
|
+
layout_content = layout_tsx.read_text()
|
|
706
|
+
|
|
707
|
+
# Check for globals.css import
|
|
708
|
+
globals_import = (
|
|
709
|
+
'./globals.css"' in layout_content
|
|
710
|
+
or "./globals.css'" in layout_content
|
|
711
|
+
or "@/app/globals.css" in layout_content
|
|
712
|
+
)
|
|
713
|
+
if not globals_import:
|
|
714
|
+
warnings.append(
|
|
715
|
+
"layout.tsx does not import globals.css. "
|
|
716
|
+
"Global styles may not be applied to pages."
|
|
717
|
+
)
|
|
718
|
+
else:
|
|
719
|
+
warnings.append("layout.tsx not found at src/app/layout.tsx")
|
|
720
|
+
|
|
721
|
+
# 3. Check all CSS files for TypeScript content
|
|
722
|
+
for css_file in project_path.glob("**/*.css"):
|
|
723
|
+
if css_file == globals_css:
|
|
724
|
+
continue # Already checked
|
|
725
|
+
|
|
726
|
+
files_checked.append(str(css_file.relative_to(project_path)))
|
|
727
|
+
css_content = css_file.read_text()
|
|
728
|
+
|
|
729
|
+
# Quick check for obvious TypeScript patterns
|
|
730
|
+
if re.search(r"^\s*import\s+", css_content, re.MULTILINE):
|
|
731
|
+
errors.append(
|
|
732
|
+
f"CRITICAL: {css_file.name} contains import statement. "
|
|
733
|
+
f"This is TypeScript, not CSS."
|
|
734
|
+
)
|
|
735
|
+
if re.search(r"^\s*export\s+", css_content, re.MULTILINE):
|
|
736
|
+
errors.append(
|
|
737
|
+
f"CRITICAL: {css_file.name} contains export statement. "
|
|
738
|
+
f"This is TypeScript, not CSS."
|
|
739
|
+
)
|
|
740
|
+
|
|
741
|
+
# Build result
|
|
742
|
+
is_valid = len(errors) == 0
|
|
743
|
+
if is_valid:
|
|
744
|
+
logger.info("Styling validation passed")
|
|
745
|
+
result = {
|
|
746
|
+
"success": True,
|
|
747
|
+
"is_valid": True,
|
|
748
|
+
"message": "Styling validated successfully",
|
|
749
|
+
"files_checked": files_checked,
|
|
750
|
+
}
|
|
751
|
+
if warnings:
|
|
752
|
+
result["warnings"] = warnings
|
|
753
|
+
return result
|
|
754
|
+
|
|
755
|
+
logger.warning(f"Styling validation failed: {errors}")
|
|
756
|
+
return {
|
|
757
|
+
"success": False,
|
|
758
|
+
"is_valid": False,
|
|
759
|
+
"errors": errors,
|
|
760
|
+
"warnings": warnings,
|
|
761
|
+
"files_checked": files_checked,
|
|
762
|
+
"hint": (
|
|
763
|
+
"CRITICAL errors indicate CSS files contain TypeScript code. "
|
|
764
|
+
"Regenerate globals.css with valid CSS content including "
|
|
765
|
+
"Tailwind directives (@tailwind base/components/utilities)."
|
|
766
|
+
),
|
|
767
|
+
}
|
|
768
|
+
|
|
769
|
+
except Exception as e:
|
|
770
|
+
logger.error(f"Error in validate_styles: {e}", exc_info=True)
|
|
771
|
+
return {
|
|
772
|
+
"success": False,
|
|
773
|
+
"is_valid": False,
|
|
774
|
+
"error": f"Validation error: {str(e)}",
|
|
775
|
+
"hint": "Check that project_dir is valid and contains a Next.js project",
|
|
776
|
+
}
|
|
777
|
+
|
|
778
|
+
def _get_create_command(self, description: str, resource_name: str) -> str:
|
|
779
|
+
"""Get the tool command needed to create a missing file.
|
|
780
|
+
|
|
781
|
+
This is a helper method used by validate_crud_structure to provide
|
|
782
|
+
fix instructions for missing CRUD files.
|
|
783
|
+
|
|
784
|
+
Args:
|
|
785
|
+
description: Human-readable description of the file type
|
|
786
|
+
resource_name: Singular resource name (e.g., "todo", "post")
|
|
787
|
+
|
|
788
|
+
Returns:
|
|
789
|
+
Tool command string to create the missing file
|
|
790
|
+
"""
|
|
791
|
+
if "Detail page" in description:
|
|
792
|
+
return f'manage_react_component(variant="detail", resource_name="{resource_name}")'
|
|
793
|
+
elif "Actions component" in description:
|
|
794
|
+
return f'manage_react_component(variant="actions", resource_name="{resource_name}")'
|
|
795
|
+
elif "List page" in description:
|
|
796
|
+
return f'manage_react_component(variant="list", resource_name="{resource_name}")'
|
|
797
|
+
elif "New page" in description:
|
|
798
|
+
return f'manage_react_component(variant="new", resource_name="{resource_name}")'
|
|
799
|
+
elif "Form component" in description:
|
|
800
|
+
return f'manage_react_component(variant="form", resource_name="{resource_name}")'
|
|
801
|
+
elif "API" in description:
|
|
802
|
+
return f'manage_api_endpoint(resource_name="{resource_name}", operations=["GET", "POST", "PATCH", "DELETE"])'
|
|
803
|
+
return "Unknown - check documentation"
|