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,894 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
# Copyright(C) 2024-2025 Advanced Micro Devices, Inc. All rights reserved.
|
|
3
|
+
# SPDX-License-Identifier: MIT
|
|
4
|
+
"""
|
|
5
|
+
Jira Agent for GAIA.
|
|
6
|
+
|
|
7
|
+
This agent provides an intelligent natural language interface to Jira with automatic
|
|
8
|
+
configuration discovery. It can adapt to any Jira instance by discovering available
|
|
9
|
+
projects, issue types, statuses, and priorities dynamically.
|
|
10
|
+
|
|
11
|
+
Key Features:
|
|
12
|
+
- Automatic Jira instance discovery and configuration
|
|
13
|
+
- Natural language to JQL query translation
|
|
14
|
+
- Robust error handling for invalid configurations
|
|
15
|
+
- Portable across different Jira instances
|
|
16
|
+
- JSON API support for web application integration
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
import asyncio
|
|
20
|
+
import base64
|
|
21
|
+
import logging
|
|
22
|
+
import os
|
|
23
|
+
from dataclasses import dataclass
|
|
24
|
+
from typing import Any, Dict, List, Optional
|
|
25
|
+
|
|
26
|
+
import aiohttp
|
|
27
|
+
|
|
28
|
+
from gaia.agents.base.agent import Agent
|
|
29
|
+
from gaia.agents.base.console import AgentConsole, SilentConsole
|
|
30
|
+
from gaia.agents.base.tools import tool
|
|
31
|
+
|
|
32
|
+
logger = logging.getLogger(__name__)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
@dataclass
|
|
36
|
+
class JiraIssue:
|
|
37
|
+
"""Represents a Jira issue."""
|
|
38
|
+
|
|
39
|
+
key: str
|
|
40
|
+
summary: str
|
|
41
|
+
status: str
|
|
42
|
+
priority: str
|
|
43
|
+
issue_type: str
|
|
44
|
+
assignee: str
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
@dataclass
|
|
48
|
+
class JiraSearchResult:
|
|
49
|
+
"""Represents search results from Jira."""
|
|
50
|
+
|
|
51
|
+
issues: List[JiraIssue]
|
|
52
|
+
total: int
|
|
53
|
+
jql: str
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
class JiraAgent(Agent):
|
|
57
|
+
"""
|
|
58
|
+
Intelligent Jira agent with automatic configuration discovery.
|
|
59
|
+
|
|
60
|
+
This agent provides a natural language interface to Jira that automatically
|
|
61
|
+
adapts to any Jira instance by discovering its configuration (projects,
|
|
62
|
+
issue types, statuses, priorities) and generating appropriate JQL queries.
|
|
63
|
+
|
|
64
|
+
Capabilities:
|
|
65
|
+
- Search for issues using natural language or JQL
|
|
66
|
+
- Create new issues with intelligent parameter detection
|
|
67
|
+
- Update existing issues
|
|
68
|
+
- Generate proper JQL queries from natural language
|
|
69
|
+
- Automatic Jira instance configuration discovery
|
|
70
|
+
- Robust error handling and validation
|
|
71
|
+
|
|
72
|
+
Usage:
|
|
73
|
+
# Basic usage with discovery
|
|
74
|
+
agent = JiraAgent()
|
|
75
|
+
config = agent.initialize() # Discovers Jira configuration
|
|
76
|
+
result = agent.process_query("Show me my high priority issues")
|
|
77
|
+
|
|
78
|
+
# Advanced usage with pre-configured setup
|
|
79
|
+
agent = JiraAgent(jira_config=pre_discovered_config)
|
|
80
|
+
result = agent.process_query("Create a new idea called 'AI Integration'")
|
|
81
|
+
|
|
82
|
+
Environment Variables Required:
|
|
83
|
+
ATLASSIAN_SITE_URL: Your Jira site URL (e.g., https://company.atlassian.net)
|
|
84
|
+
ATLASSIAN_API_KEY: Your Jira API token
|
|
85
|
+
ATLASSIAN_USER_EMAIL: Your Jira account email
|
|
86
|
+
"""
|
|
87
|
+
|
|
88
|
+
def __init__(self, jira_config: Dict[str, Any] = None, **kwargs):
|
|
89
|
+
"""Initialize the Jira agent.
|
|
90
|
+
|
|
91
|
+
Args:
|
|
92
|
+
jira_config: Optional pre-discovered Jira configuration containing:
|
|
93
|
+
- projects: List of {'key': str, 'name': str} project dictionaries
|
|
94
|
+
- issue_types: List of available issue type names
|
|
95
|
+
- statuses: List of available status names
|
|
96
|
+
- priorities: List of available priority names
|
|
97
|
+
**kwargs: Other agent initialization parameters:
|
|
98
|
+
- max_steps: Maximum conversation steps (default: 10)
|
|
99
|
+
- model_id: LLM model to use (default: Qwen3-Coder-30B-A3B-Instruct-GGUF)
|
|
100
|
+
- silent_mode: Suppress console output (default: False)
|
|
101
|
+
- debug: Enable debug logging (default: False)
|
|
102
|
+
- show_prompts: Display prompts sent to LLM (default: False)
|
|
103
|
+
|
|
104
|
+
Example:
|
|
105
|
+
# Without config (will use defaults until initialize() is called)
|
|
106
|
+
agent = JiraAgent(silent_mode=True)
|
|
107
|
+
|
|
108
|
+
# With pre-discovered config
|
|
109
|
+
config = {
|
|
110
|
+
"projects": [{"key": "PROJ", "name": "My Project"}],
|
|
111
|
+
"issue_types": ["Bug", "Task", "Story"],
|
|
112
|
+
"statuses": ["To Do", "In Progress", "Done"],
|
|
113
|
+
"priorities": ["High", "Medium", "Low"]
|
|
114
|
+
}
|
|
115
|
+
agent = JiraAgent(jira_config=config)
|
|
116
|
+
"""
|
|
117
|
+
# Increase max steps to allow for completion
|
|
118
|
+
if "max_steps" not in kwargs:
|
|
119
|
+
kwargs["max_steps"] = 10
|
|
120
|
+
# Use the larger coding model by default for reliable JSON parsing
|
|
121
|
+
if "model_id" not in kwargs:
|
|
122
|
+
kwargs["model_id"] = "Qwen3-Coder-30B-A3B-Instruct-GGUF"
|
|
123
|
+
|
|
124
|
+
# Store config before calling super() so system prompt can use it
|
|
125
|
+
self._jira_config = jira_config
|
|
126
|
+
self._jira_credentials = None
|
|
127
|
+
|
|
128
|
+
super().__init__(**kwargs)
|
|
129
|
+
|
|
130
|
+
def _get_system_prompt(self) -> str:
|
|
131
|
+
"""Generate the system prompt for the Jira agent.
|
|
132
|
+
|
|
133
|
+
Creates a dynamic system prompt that adapts to the discovered Jira configuration.
|
|
134
|
+
If configuration has been discovered via initialize(), it will include:
|
|
135
|
+
- Actual project keys available in the instance
|
|
136
|
+
- Real issue types, priorities, and statuses
|
|
137
|
+
- Proper JQL syntax guidance with instance-specific values
|
|
138
|
+
|
|
139
|
+
Returns:
|
|
140
|
+
str: System prompt tailored to the Jira instance configuration
|
|
141
|
+
"""
|
|
142
|
+
# Try to get discovered configuration for dynamic prompt
|
|
143
|
+
jira_config = None
|
|
144
|
+
if hasattr(self, "_jira_config") and self._jira_config:
|
|
145
|
+
jira_config = self._jira_config
|
|
146
|
+
|
|
147
|
+
# Base prompt - strict JSON-only output for better compatibility
|
|
148
|
+
prompt = """You are a Jira assistant that responds ONLY in JSON format.
|
|
149
|
+
|
|
150
|
+
**CRITICAL RULES:**
|
|
151
|
+
1. Output ONLY valid JSON - nothing else
|
|
152
|
+
2. Do NOT add any text before the opening {
|
|
153
|
+
3. Do NOT add any text after the closing }
|
|
154
|
+
4. Your ENTIRE response must be parseable JSON
|
|
155
|
+
|
|
156
|
+
Capabilities:
|
|
157
|
+
- Search issues (JQL queries)
|
|
158
|
+
- Create issues
|
|
159
|
+
- Update issues
|
|
160
|
+
|
|
161
|
+
JQL basics:
|
|
162
|
+
- Current user: assignee = currentUser()
|
|
163
|
+
- By key: key = "PROJ-123"
|
|
164
|
+
- Operators: AND, OR, NOT"""
|
|
165
|
+
|
|
166
|
+
# Add discovered configuration if available
|
|
167
|
+
if jira_config:
|
|
168
|
+
if jira_config.get("projects"):
|
|
169
|
+
project_keys = [p["key"] for p in jira_config["projects"]]
|
|
170
|
+
prompt += (
|
|
171
|
+
f"\n- Projects: Available projects are {', '.join(project_keys)}"
|
|
172
|
+
)
|
|
173
|
+
|
|
174
|
+
if jira_config.get("issue_types"):
|
|
175
|
+
types = jira_config["issue_types"]
|
|
176
|
+
prompt += f"\n- Types: Available issue types are {', '.join(types)}"
|
|
177
|
+
|
|
178
|
+
if jira_config.get("priorities"):
|
|
179
|
+
priorities = jira_config["priorities"]
|
|
180
|
+
prompt += (
|
|
181
|
+
f"\n- Priority: Available priorities are {', '.join(priorities)}"
|
|
182
|
+
)
|
|
183
|
+
|
|
184
|
+
if jira_config.get("statuses"):
|
|
185
|
+
statuses = jira_config["statuses"]
|
|
186
|
+
prompt += f"\n- Status: Available statuses are {', '.join(statuses)}"
|
|
187
|
+
else:
|
|
188
|
+
# Fallback to default values if discovery hasn't run yet
|
|
189
|
+
prompt += """
|
|
190
|
+
- Types: issuetype = "Idea" (Note: This Jira instance uses "Idea" not "Bug"/"Task"/"Story")
|
|
191
|
+
- Priority: priority = "Critical", priority = "High", priority = "Medium"
|
|
192
|
+
- Status: status = "Parking lot", status = "In Progress", status = "Done"
|
|
193
|
+
"""
|
|
194
|
+
|
|
195
|
+
prompt += """
|
|
196
|
+
- Time: created >= -7d, created >= startOfWeek()
|
|
197
|
+
|
|
198
|
+
JQL QUOTING RULES (CRITICAL):
|
|
199
|
+
- Single words: NO quotes → status = Done, issuetype = Story
|
|
200
|
+
- Multiple words: DOUBLE quotes → status = "In Progress", summary ~ "user story"
|
|
201
|
+
- NEVER use single quotes ('') in JQL
|
|
202
|
+
- Functions: NO quotes → assignee = currentUser(), sprint in openSprints()
|
|
203
|
+
|
|
204
|
+
RESPONSE FORMAT - Use EXACTLY this structure:
|
|
205
|
+
|
|
206
|
+
For SEARCH (most common):
|
|
207
|
+
{"thought": "User wants X, I'll search for Y", "goal": "Search Jira", "plan": [{"tool": "jira_search", "tool_args": {"jql": "YOUR_JQL_HERE"}}]}
|
|
208
|
+
|
|
209
|
+
For CREATE:
|
|
210
|
+
{"thought": "User wants to create X", "goal": "Create issue", "plan": [{"tool": "jira_create", "tool_args": {"summary": "Title", "description": "Details", "issue_type": "Task"}}]}
|
|
211
|
+
|
|
212
|
+
For FINAL ANSWER (after tool execution):
|
|
213
|
+
{"thought": "Search completed", "goal": "Report results", "answer": "Found X issues: [specific details]"}
|
|
214
|
+
|
|
215
|
+
EXAMPLES - Copy these patterns exactly:
|
|
216
|
+
|
|
217
|
+
User: "show my issues"
|
|
218
|
+
{"thought": "User wants their assigned issues", "goal": "Search Jira", "plan": [{"tool": "jira_search", "tool_args": {"jql": "assignee = currentUser()"}}]}
|
|
219
|
+
|
|
220
|
+
User: "high priority bugs"
|
|
221
|
+
{"thought": "User wants high priority bugs", "goal": "Search Jira", "plan": [{"tool": "jira_search", "tool_args": {"jql": "priority = High AND issuetype = Bug"}}]}
|
|
222
|
+
|
|
223
|
+
User: "stories in progress"
|
|
224
|
+
{"thought": "User wants in progress stories", "goal": "Search Jira", "plan": [{"tool": "jira_search", "tool_args": {"jql": "status = \\"In Progress\\" AND issuetype = Story"}}]}
|
|
225
|
+
|
|
226
|
+
User: "issues created this week"
|
|
227
|
+
{"thought": "User wants recent issues", "goal": "Search Jira", "plan": [{"tool": "jira_search", "tool_args": {"jql": "created >= startOfWeek()"}}]}
|
|
228
|
+
|
|
229
|
+
User: "current sprint stories"
|
|
230
|
+
{"thought": "User wants stories in current sprint", "goal": "Search Jira", "plan": [{"tool": "jira_search", "tool_args": {"jql": "issuetype = Story AND sprint in openSprints()"}}]}
|
|
231
|
+
|
|
232
|
+
RULES:
|
|
233
|
+
1. Response MUST be valid JSON only
|
|
234
|
+
2. Use double quotes for ALL JSON strings
|
|
235
|
+
3. In JQL: NO quotes for single words, DOUBLE quotes for phrases
|
|
236
|
+
4. Escape quotes in JQL with backslash: \\"In Progress\\"
|
|
237
|
+
5. Copy the exact format from examples"""
|
|
238
|
+
|
|
239
|
+
return prompt
|
|
240
|
+
|
|
241
|
+
def _create_console(self):
|
|
242
|
+
"""Create console for Jira agent output.
|
|
243
|
+
|
|
244
|
+
Returns:
|
|
245
|
+
AgentConsole or SilentConsole: Console instance based on silent_mode setting
|
|
246
|
+
"""
|
|
247
|
+
if self.silent_mode:
|
|
248
|
+
return SilentConsole()
|
|
249
|
+
return AgentConsole()
|
|
250
|
+
|
|
251
|
+
def initialize(self) -> Dict[str, Any]:
|
|
252
|
+
"""
|
|
253
|
+
Discover and cache Jira instance configuration.
|
|
254
|
+
|
|
255
|
+
This method connects to your Jira instance and discovers:
|
|
256
|
+
- Available projects (keys and names)
|
|
257
|
+
- Available issue types (excluding subtasks)
|
|
258
|
+
- Available statuses
|
|
259
|
+
- Available priorities
|
|
260
|
+
|
|
261
|
+
The discovered configuration is cached and used to generate dynamic
|
|
262
|
+
system prompts that help the LLM understand your specific Jira setup.
|
|
263
|
+
|
|
264
|
+
Returns:
|
|
265
|
+
Dictionary containing discovered Jira configuration:
|
|
266
|
+
{
|
|
267
|
+
"projects": [{"key": "PROJ", "name": "Project Name"}, ...],
|
|
268
|
+
"issue_types": ["Bug", "Task", "Story", ...],
|
|
269
|
+
"statuses": ["To Do", "In Progress", "Done", ...],
|
|
270
|
+
"priorities": ["Highest", "High", "Medium", "Low", "Lowest"]
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
Raises:
|
|
274
|
+
Exception: If Jira credentials are invalid or API calls fail
|
|
275
|
+
|
|
276
|
+
Example:
|
|
277
|
+
agent = JiraAgent()
|
|
278
|
+
config = agent.initialize()
|
|
279
|
+
print(f"Found {len(config['projects'])} projects")
|
|
280
|
+
|
|
281
|
+
Note:
|
|
282
|
+
This method should be called once after creating the agent and before
|
|
283
|
+
making queries. The configuration is cached for subsequent use.
|
|
284
|
+
"""
|
|
285
|
+
try:
|
|
286
|
+
import concurrent.futures
|
|
287
|
+
|
|
288
|
+
with concurrent.futures.ThreadPoolExecutor() as executor:
|
|
289
|
+
future = executor.submit(asyncio.run, self._discover_jira_config())
|
|
290
|
+
self._jira_config = future.result(timeout=10)
|
|
291
|
+
|
|
292
|
+
logger.info(
|
|
293
|
+
f"Jira configuration discovered: {len(self._jira_config.get('projects', []))} projects, "
|
|
294
|
+
f"{len(self._jira_config.get('issue_types', []))} issue types, "
|
|
295
|
+
f"{len(self._jira_config.get('statuses', []))} statuses"
|
|
296
|
+
)
|
|
297
|
+
|
|
298
|
+
return self._jira_config
|
|
299
|
+
|
|
300
|
+
except Exception as e:
|
|
301
|
+
logger.error(f"Jira discovery failed: {e}")
|
|
302
|
+
# Set empty config so we don't retry
|
|
303
|
+
self._jira_config = {
|
|
304
|
+
"projects": [],
|
|
305
|
+
"issue_types": [],
|
|
306
|
+
"statuses": [],
|
|
307
|
+
"priorities": [],
|
|
308
|
+
}
|
|
309
|
+
return self._jira_config
|
|
310
|
+
|
|
311
|
+
def get_config(self) -> Optional[Dict[str, Any]]:
|
|
312
|
+
"""Get the current Jira configuration.
|
|
313
|
+
|
|
314
|
+
Returns:
|
|
315
|
+
Optional[Dict[str, Any]]: The cached Jira configuration if discovered,
|
|
316
|
+
None if initialize() hasn't been called yet
|
|
317
|
+
"""
|
|
318
|
+
return self._jira_config
|
|
319
|
+
|
|
320
|
+
def _register_tools(self):
|
|
321
|
+
"""Register Jira-specific tools.
|
|
322
|
+
|
|
323
|
+
Registers three main tools for Jira interaction:
|
|
324
|
+
- jira_search: Search issues using JQL queries
|
|
325
|
+
- jira_create: Create new issues with specified fields
|
|
326
|
+
- jira_update: Update existing issues by key
|
|
327
|
+
|
|
328
|
+
These tools are exposed to the LLM for natural language processing
|
|
329
|
+
and are automatically invoked based on user intent.
|
|
330
|
+
"""
|
|
331
|
+
|
|
332
|
+
@tool
|
|
333
|
+
def jira_search(
|
|
334
|
+
jql: str = "created >= -30d ORDER BY updated DESC",
|
|
335
|
+
max_results: int = None,
|
|
336
|
+
fields: str = None,
|
|
337
|
+
) -> Dict[str, Any]:
|
|
338
|
+
"""Search Jira issues using JQL query.
|
|
339
|
+
|
|
340
|
+
Args:
|
|
341
|
+
jql: JQL query string for searching issues
|
|
342
|
+
max_results: Maximum number of results to return (default: 50)
|
|
343
|
+
fields: Comma-separated list of fields to return (optional)
|
|
344
|
+
|
|
345
|
+
Returns:
|
|
346
|
+
Dictionary containing search results
|
|
347
|
+
"""
|
|
348
|
+
return self._execute_jira_search(jql, max_results, fields)
|
|
349
|
+
|
|
350
|
+
@tool
|
|
351
|
+
def jira_create(
|
|
352
|
+
summary: str,
|
|
353
|
+
description: str = "",
|
|
354
|
+
issue_type: str = "Task",
|
|
355
|
+
priority: str = None,
|
|
356
|
+
project: str = None,
|
|
357
|
+
) -> Dict[str, Any]:
|
|
358
|
+
"""Create a new Jira issue.
|
|
359
|
+
|
|
360
|
+
Args:
|
|
361
|
+
summary: Issue title/summary
|
|
362
|
+
description: Detailed description of the issue
|
|
363
|
+
issue_type: Type of issue (Bug, Task, Story, etc.)
|
|
364
|
+
priority: Priority level (Critical, High, Medium, Low)
|
|
365
|
+
project: Project key (optional)
|
|
366
|
+
|
|
367
|
+
Returns:
|
|
368
|
+
Dictionary containing created issue details
|
|
369
|
+
"""
|
|
370
|
+
return self._execute_jira_create(
|
|
371
|
+
summary, description, issue_type, priority, project
|
|
372
|
+
)
|
|
373
|
+
|
|
374
|
+
@tool
|
|
375
|
+
def jira_update(
|
|
376
|
+
issue_key: str,
|
|
377
|
+
summary: str = None,
|
|
378
|
+
description: str = None,
|
|
379
|
+
priority: str = None,
|
|
380
|
+
status: str = None,
|
|
381
|
+
) -> Dict[str, Any]:
|
|
382
|
+
"""Update an existing Jira issue.
|
|
383
|
+
|
|
384
|
+
Args:
|
|
385
|
+
issue_key: Key of the issue to update (e.g., PROJ-123)
|
|
386
|
+
summary: New summary/title
|
|
387
|
+
description: New description
|
|
388
|
+
priority: New priority level
|
|
389
|
+
status: New status
|
|
390
|
+
|
|
391
|
+
Returns:
|
|
392
|
+
Dictionary containing update result
|
|
393
|
+
"""
|
|
394
|
+
return self._execute_jira_update(
|
|
395
|
+
issue_key, summary, description, priority, status
|
|
396
|
+
)
|
|
397
|
+
|
|
398
|
+
def _get_jira_credentials(self) -> tuple[str, str, str]:
|
|
399
|
+
"""Get Jira credentials from environment.
|
|
400
|
+
|
|
401
|
+
Retrieves and validates Jira credentials from environment variables.
|
|
402
|
+
Caches credentials after first retrieval for performance.
|
|
403
|
+
|
|
404
|
+
Returns:
|
|
405
|
+
tuple[str, str, str]: Tuple of (site_url, api_key, user_email)
|
|
406
|
+
|
|
407
|
+
Raises:
|
|
408
|
+
ValueError: If any required environment variable is missing
|
|
409
|
+
"""
|
|
410
|
+
if self._jira_credentials is None:
|
|
411
|
+
site_url = os.getenv("ATLASSIAN_SITE_URL")
|
|
412
|
+
api_key = os.getenv("ATLASSIAN_API_KEY")
|
|
413
|
+
user_email = os.getenv("ATLASSIAN_USER_EMAIL")
|
|
414
|
+
|
|
415
|
+
if not all([site_url, api_key, user_email]):
|
|
416
|
+
raise ValueError(
|
|
417
|
+
"Missing Jira credentials - set ATLASSIAN_SITE_URL, ATLASSIAN_API_KEY, ATLASSIAN_USER_EMAIL"
|
|
418
|
+
)
|
|
419
|
+
|
|
420
|
+
# Clean up credentials
|
|
421
|
+
site_url = site_url.rstrip("/")
|
|
422
|
+
if not site_url.startswith(("http://", "https://")):
|
|
423
|
+
site_url = f"https://{site_url}"
|
|
424
|
+
|
|
425
|
+
self._jira_credentials = (site_url, api_key, user_email)
|
|
426
|
+
|
|
427
|
+
return self._jira_credentials
|
|
428
|
+
|
|
429
|
+
async def _discover_jira_config(self) -> Dict[str, Any]:
|
|
430
|
+
"""
|
|
431
|
+
Internal method to discover Jira instance configuration via API calls.
|
|
432
|
+
|
|
433
|
+
Makes concurrent API calls to discover:
|
|
434
|
+
- /rest/api/3/project - Available projects
|
|
435
|
+
- /rest/api/3/issuetype - Available issue types (excluding subtasks)
|
|
436
|
+
- /rest/api/3/status - Available statuses
|
|
437
|
+
- /rest/api/3/priority - Available priorities
|
|
438
|
+
|
|
439
|
+
Returns:
|
|
440
|
+
Dictionary containing discovered configuration
|
|
441
|
+
|
|
442
|
+
Note:
|
|
443
|
+
This is an internal async method. Use initialize() instead.
|
|
444
|
+
"""
|
|
445
|
+
if self._jira_config is not None:
|
|
446
|
+
return self._jira_config
|
|
447
|
+
|
|
448
|
+
logger.debug("Discovering Jira instance configuration...")
|
|
449
|
+
|
|
450
|
+
site_url, api_key, user_email = self._get_jira_credentials()
|
|
451
|
+
auth_string = f"{user_email}:{api_key}"
|
|
452
|
+
auth_header = base64.b64encode(auth_string.encode()).decode()
|
|
453
|
+
|
|
454
|
+
headers = {
|
|
455
|
+
"Authorization": f"Basic {auth_header}",
|
|
456
|
+
"Content-Type": "application/json",
|
|
457
|
+
"Accept": "application/json",
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
config = {"projects": [], "issue_types": [], "statuses": [], "priorities": []}
|
|
461
|
+
|
|
462
|
+
async with aiohttp.ClientSession() as session:
|
|
463
|
+
try:
|
|
464
|
+
# Get projects
|
|
465
|
+
projects_url = f"{site_url}/rest/api/3/project"
|
|
466
|
+
async with session.get(projects_url, headers=headers) as response:
|
|
467
|
+
if response.status == 200:
|
|
468
|
+
projects = await response.json()
|
|
469
|
+
config["projects"] = [
|
|
470
|
+
{"key": p["key"], "name": p["name"]} for p in projects
|
|
471
|
+
]
|
|
472
|
+
|
|
473
|
+
# Get issue types
|
|
474
|
+
types_url = f"{site_url}/rest/api/3/issuetype"
|
|
475
|
+
async with session.get(types_url, headers=headers) as response:
|
|
476
|
+
if response.status == 200:
|
|
477
|
+
types = await response.json()
|
|
478
|
+
config["issue_types"] = [
|
|
479
|
+
t["name"] for t in types if not t.get("subtask", False)
|
|
480
|
+
]
|
|
481
|
+
|
|
482
|
+
# Get statuses
|
|
483
|
+
statuses_url = f"{site_url}/rest/api/3/status"
|
|
484
|
+
async with session.get(statuses_url, headers=headers) as response:
|
|
485
|
+
if response.status == 200:
|
|
486
|
+
statuses = await response.json()
|
|
487
|
+
config["statuses"] = [s["name"] for s in statuses]
|
|
488
|
+
|
|
489
|
+
# Get priorities
|
|
490
|
+
priorities_url = f"{site_url}/rest/api/3/priority"
|
|
491
|
+
async with session.get(priorities_url, headers=headers) as response:
|
|
492
|
+
if response.status == 200:
|
|
493
|
+
priorities = await response.json()
|
|
494
|
+
config["priorities"] = [p["name"] for p in priorities]
|
|
495
|
+
|
|
496
|
+
except Exception as e:
|
|
497
|
+
logger.warning(f"Failed to discover some Jira configuration: {e}")
|
|
498
|
+
|
|
499
|
+
self._jira_config = config
|
|
500
|
+
logger.debug(f"Discovered Jira config: {config}")
|
|
501
|
+
return config
|
|
502
|
+
|
|
503
|
+
def _execute_jira_search(
|
|
504
|
+
self, jql: str, max_results: int = None, fields: str = None
|
|
505
|
+
) -> Dict[str, Any]:
|
|
506
|
+
"""Execute Jira search synchronously.
|
|
507
|
+
|
|
508
|
+
Wrapper method that runs the async search in a thread pool executor.
|
|
509
|
+
|
|
510
|
+
Args:
|
|
511
|
+
jql: JQL query string for searching issues
|
|
512
|
+
max_results: Maximum number of results to return (default: 50)
|
|
513
|
+
fields: Comma-separated list of fields to return (optional)
|
|
514
|
+
|
|
515
|
+
Returns:
|
|
516
|
+
Dict[str, Any]: Search results containing 'issues', 'total', and 'jql' keys,
|
|
517
|
+
or error dict with 'status' and 'error' keys on failure
|
|
518
|
+
"""
|
|
519
|
+
try:
|
|
520
|
+
import concurrent.futures
|
|
521
|
+
|
|
522
|
+
with concurrent.futures.ThreadPoolExecutor() as executor:
|
|
523
|
+
future = executor.submit(
|
|
524
|
+
asyncio.run,
|
|
525
|
+
self._execute_jira_search_async(jql, max_results, fields),
|
|
526
|
+
)
|
|
527
|
+
return future.result(timeout=30)
|
|
528
|
+
except Exception as e:
|
|
529
|
+
return {"status": "error", "error": f"Async execution failed: {str(e)}"}
|
|
530
|
+
|
|
531
|
+
def _execute_jira_create(
|
|
532
|
+
self,
|
|
533
|
+
summary: str,
|
|
534
|
+
description: str,
|
|
535
|
+
issue_type: str,
|
|
536
|
+
priority: str,
|
|
537
|
+
project: str,
|
|
538
|
+
) -> Dict[str, Any]:
|
|
539
|
+
"""Execute Jira issue creation synchronously.
|
|
540
|
+
|
|
541
|
+
Wrapper method that runs the async creation in a thread pool executor.
|
|
542
|
+
|
|
543
|
+
Args:
|
|
544
|
+
summary: Issue title/summary
|
|
545
|
+
description: Detailed description of the issue
|
|
546
|
+
issue_type: Type of issue (Bug, Task, Story, etc.)
|
|
547
|
+
priority: Priority level (Critical, High, Medium, Low)
|
|
548
|
+
project: Project key (uses first available if not specified)
|
|
549
|
+
|
|
550
|
+
Returns:
|
|
551
|
+
Dict[str, Any]: Creation result with 'status', 'created', 'key', 'id', and 'url' keys,
|
|
552
|
+
or error dict with 'status' and 'error' keys on failure
|
|
553
|
+
"""
|
|
554
|
+
try:
|
|
555
|
+
import concurrent.futures
|
|
556
|
+
|
|
557
|
+
with concurrent.futures.ThreadPoolExecutor() as executor:
|
|
558
|
+
future = executor.submit(
|
|
559
|
+
asyncio.run,
|
|
560
|
+
self._execute_jira_create_async(
|
|
561
|
+
summary, description, issue_type, priority, project
|
|
562
|
+
),
|
|
563
|
+
)
|
|
564
|
+
return future.result(timeout=30)
|
|
565
|
+
except Exception as e:
|
|
566
|
+
return {"status": "error", "error": f"Async execution failed: {str(e)}"}
|
|
567
|
+
|
|
568
|
+
def _execute_jira_update(
|
|
569
|
+
self, issue_key: str, summary: str, description: str, priority: str, status: str
|
|
570
|
+
) -> Dict[str, Any]:
|
|
571
|
+
"""Execute Jira issue update synchronously.
|
|
572
|
+
|
|
573
|
+
Wrapper method that runs the async update in a thread pool executor.
|
|
574
|
+
|
|
575
|
+
Args:
|
|
576
|
+
issue_key: Key of the issue to update (e.g., PROJ-123)
|
|
577
|
+
summary: New summary/title (optional)
|
|
578
|
+
description: New description (optional)
|
|
579
|
+
priority: New priority level (optional)
|
|
580
|
+
status: New status (optional)
|
|
581
|
+
|
|
582
|
+
Returns:
|
|
583
|
+
Dict[str, Any]: Update result with 'status', 'updated', 'key', and 'url' keys,
|
|
584
|
+
or error dict with 'status' and 'error' keys on failure
|
|
585
|
+
"""
|
|
586
|
+
try:
|
|
587
|
+
import concurrent.futures
|
|
588
|
+
|
|
589
|
+
with concurrent.futures.ThreadPoolExecutor() as executor:
|
|
590
|
+
future = executor.submit(
|
|
591
|
+
asyncio.run,
|
|
592
|
+
self._execute_jira_update_async(
|
|
593
|
+
issue_key, summary, description, priority, status
|
|
594
|
+
),
|
|
595
|
+
)
|
|
596
|
+
return future.result(timeout=30)
|
|
597
|
+
except Exception as e:
|
|
598
|
+
return {"status": "error", "error": f"Async execution failed: {str(e)}"}
|
|
599
|
+
|
|
600
|
+
async def _execute_jira_search_async(
|
|
601
|
+
self, jql: str, max_results: int = None, fields: str = None
|
|
602
|
+
) -> Dict[str, Any]:
|
|
603
|
+
"""Execute Jira search API call.
|
|
604
|
+
|
|
605
|
+
Makes an async HTTP request to Jira's search API endpoint.
|
|
606
|
+
|
|
607
|
+
Args:
|
|
608
|
+
jql: JQL query string for searching issues
|
|
609
|
+
max_results: Maximum number of results to return (default: 50)
|
|
610
|
+
fields: Comma-separated list of fields to return (optional)
|
|
611
|
+
|
|
612
|
+
Returns:
|
|
613
|
+
Dict[str, Any]: Dictionary containing:
|
|
614
|
+
- issues: List of issue dictionaries with key, summary, status, priority, type, assignee
|
|
615
|
+
- total: Total number of matching issues
|
|
616
|
+
- jql: The JQL query used
|
|
617
|
+
|
|
618
|
+
Raises:
|
|
619
|
+
aiohttp.ClientResponseError: If the API request fails
|
|
620
|
+
"""
|
|
621
|
+
logger.debug(
|
|
622
|
+
f"Executing Jira search with JQL: {jql}, max_results: {max_results}, fields: {fields}"
|
|
623
|
+
)
|
|
624
|
+
|
|
625
|
+
site_url, api_key, user_email = self._get_jira_credentials()
|
|
626
|
+
|
|
627
|
+
# Create auth header
|
|
628
|
+
auth_string = f"{user_email}:{api_key}"
|
|
629
|
+
auth_header = base64.b64encode(auth_string.encode()).decode()
|
|
630
|
+
|
|
631
|
+
headers = {
|
|
632
|
+
"Authorization": f"Basic {auth_header}",
|
|
633
|
+
"Content-Type": "application/json",
|
|
634
|
+
"Accept": "application/json",
|
|
635
|
+
}
|
|
636
|
+
|
|
637
|
+
async with aiohttp.ClientSession() as session:
|
|
638
|
+
# Using the new Enhanced JQL Service endpoint
|
|
639
|
+
url = f"{site_url}/rest/api/3/search/jql"
|
|
640
|
+
params = {"jql": jql}
|
|
641
|
+
|
|
642
|
+
# Add optional parameters
|
|
643
|
+
if max_results is not None:
|
|
644
|
+
params["maxResults"] = max_results
|
|
645
|
+
|
|
646
|
+
# Always request the basic fields we need unless specific fields are requested
|
|
647
|
+
if fields is not None:
|
|
648
|
+
params["fields"] = fields
|
|
649
|
+
else:
|
|
650
|
+
params["fields"] = "key,summary,status,priority,issuetype,assignee"
|
|
651
|
+
|
|
652
|
+
logger.debug(f"Making API request to: {url}")
|
|
653
|
+
|
|
654
|
+
async with session.get(url, headers=headers, params=params) as response:
|
|
655
|
+
response.raise_for_status()
|
|
656
|
+
data = await response.json()
|
|
657
|
+
|
|
658
|
+
issues = []
|
|
659
|
+
for issue in data.get("issues", []):
|
|
660
|
+
fields = issue.get("fields", {})
|
|
661
|
+
issues.append(
|
|
662
|
+
{
|
|
663
|
+
"key": issue.get("key"),
|
|
664
|
+
"summary": fields.get("summary"),
|
|
665
|
+
"status": (
|
|
666
|
+
fields.get("status", {}).get("name")
|
|
667
|
+
if fields.get("status")
|
|
668
|
+
else None
|
|
669
|
+
),
|
|
670
|
+
"priority": (
|
|
671
|
+
fields.get("priority", {}).get("name")
|
|
672
|
+
if fields.get("priority")
|
|
673
|
+
else None
|
|
674
|
+
),
|
|
675
|
+
"type": (
|
|
676
|
+
fields.get("issuetype", {}).get("name")
|
|
677
|
+
if fields.get("issuetype")
|
|
678
|
+
else None
|
|
679
|
+
),
|
|
680
|
+
"assignee": (
|
|
681
|
+
fields.get("assignee", {}).get("displayName")
|
|
682
|
+
if fields.get("assignee")
|
|
683
|
+
else "Unassigned"
|
|
684
|
+
),
|
|
685
|
+
}
|
|
686
|
+
)
|
|
687
|
+
|
|
688
|
+
result = {
|
|
689
|
+
"issues": issues,
|
|
690
|
+
"total": data.get("total", len(issues)),
|
|
691
|
+
"jql": jql,
|
|
692
|
+
}
|
|
693
|
+
|
|
694
|
+
logger.debug(f"Found {len(issues)} issues")
|
|
695
|
+
return result
|
|
696
|
+
|
|
697
|
+
async def _execute_jira_create_async(
|
|
698
|
+
self,
|
|
699
|
+
summary: str,
|
|
700
|
+
description: str = "",
|
|
701
|
+
issue_type: str = "Task",
|
|
702
|
+
priority: str = None,
|
|
703
|
+
project: str = None,
|
|
704
|
+
) -> Dict[str, Any]:
|
|
705
|
+
"""Execute Jira issue creation API call.
|
|
706
|
+
|
|
707
|
+
Makes an async HTTP POST request to create a new Jira issue.
|
|
708
|
+
If no project is specified, uses the first available project.
|
|
709
|
+
|
|
710
|
+
Args:
|
|
711
|
+
summary: Issue title/summary (required)
|
|
712
|
+
description: Detailed description (defaults to "Created via GAIA")
|
|
713
|
+
issue_type: Type of issue (defaults to "Task")
|
|
714
|
+
priority: Priority level (optional)
|
|
715
|
+
project: Project key (optional, auto-selected if not provided)
|
|
716
|
+
|
|
717
|
+
Returns:
|
|
718
|
+
Dict[str, Any]: Dictionary containing:
|
|
719
|
+
- status: "success" or "error"
|
|
720
|
+
- created: True if successful
|
|
721
|
+
- key: Issue key (e.g., PROJ-123)
|
|
722
|
+
- id: Issue ID
|
|
723
|
+
- url: Direct link to the issue
|
|
724
|
+
Or on error:
|
|
725
|
+
- status: "error"
|
|
726
|
+
- error: Error message
|
|
727
|
+
|
|
728
|
+
Raises:
|
|
729
|
+
aiohttp.ClientResponseError: If the API request fails
|
|
730
|
+
"""
|
|
731
|
+
logger.debug(f"Creating Jira issue: {summary}")
|
|
732
|
+
|
|
733
|
+
site_url, api_key, user_email = self._get_jira_credentials()
|
|
734
|
+
|
|
735
|
+
# Create auth header
|
|
736
|
+
auth_string = f"{user_email}:{api_key}"
|
|
737
|
+
auth_header = base64.b64encode(auth_string.encode()).decode()
|
|
738
|
+
|
|
739
|
+
headers = {
|
|
740
|
+
"Authorization": f"Basic {auth_header}",
|
|
741
|
+
"Content-Type": "application/json",
|
|
742
|
+
"Accept": "application/json",
|
|
743
|
+
}
|
|
744
|
+
|
|
745
|
+
async with aiohttp.ClientSession() as session:
|
|
746
|
+
# Get project if not specified
|
|
747
|
+
if not project:
|
|
748
|
+
projects_url = f"{site_url}/rest/api/3/project"
|
|
749
|
+
async with session.get(projects_url, headers=headers) as resp:
|
|
750
|
+
resp.raise_for_status()
|
|
751
|
+
projects = await resp.json()
|
|
752
|
+
if projects:
|
|
753
|
+
project = projects[0]["key"]
|
|
754
|
+
else:
|
|
755
|
+
return {"status": "error", "error": "No projects available"}
|
|
756
|
+
|
|
757
|
+
payload = {
|
|
758
|
+
"fields": {
|
|
759
|
+
"project": {"key": project},
|
|
760
|
+
"summary": summary,
|
|
761
|
+
"description": description or "Created via GAIA",
|
|
762
|
+
"issuetype": {"name": issue_type},
|
|
763
|
+
}
|
|
764
|
+
}
|
|
765
|
+
|
|
766
|
+
if priority:
|
|
767
|
+
payload["fields"]["priority"] = {"name": priority}
|
|
768
|
+
|
|
769
|
+
url = f"{site_url}/rest/api/3/issue"
|
|
770
|
+
logger.debug(f"Creating issue with payload: {payload}")
|
|
771
|
+
|
|
772
|
+
async with session.post(url, headers=headers, json=payload) as response:
|
|
773
|
+
if response.status == 400:
|
|
774
|
+
# Parse the error response to provide more context
|
|
775
|
+
try:
|
|
776
|
+
error_data = await response.json()
|
|
777
|
+
error_msg = error_data.get("errorMessages", [])
|
|
778
|
+
if error_msg:
|
|
779
|
+
detailed_error = f"Bad Request: {'; '.join(error_msg)}"
|
|
780
|
+
else:
|
|
781
|
+
detailed_error = f"Bad Request (400): Invalid issue type '{issue_type}' or other field validation failed"
|
|
782
|
+
|
|
783
|
+
return {
|
|
784
|
+
"status": "error",
|
|
785
|
+
"error": f"{detailed_error}. Available issue types for this Jira instance may be different (try 'Idea', 'Bug', 'Story', 'Task', or 'Subtask'). Use jira_search with 'project IS NOT EMPTY' to discover valid issue types.",
|
|
786
|
+
}
|
|
787
|
+
except Exception:
|
|
788
|
+
return {
|
|
789
|
+
"status": "error",
|
|
790
|
+
"error": f"Bad Request (400): Issue creation failed. The issue type '{issue_type}' may not be valid for this Jira instance. Try using 'Idea' instead, or check available issue types first.",
|
|
791
|
+
}
|
|
792
|
+
|
|
793
|
+
response.raise_for_status() # For other HTTP errors
|
|
794
|
+
result = await response.json()
|
|
795
|
+
|
|
796
|
+
return {
|
|
797
|
+
"status": "success",
|
|
798
|
+
"created": True,
|
|
799
|
+
"key": result.get("key"),
|
|
800
|
+
"id": result.get("id"),
|
|
801
|
+
"url": f"{site_url}/browse/{result.get('key')}",
|
|
802
|
+
"metadata": {
|
|
803
|
+
"project": project,
|
|
804
|
+
"issue_type": issue_type,
|
|
805
|
+
"priority": priority,
|
|
806
|
+
"summary": summary,
|
|
807
|
+
},
|
|
808
|
+
}
|
|
809
|
+
|
|
810
|
+
async def _execute_jira_update_async(
|
|
811
|
+
self,
|
|
812
|
+
issue_key: str,
|
|
813
|
+
summary: str = None,
|
|
814
|
+
description: str = None,
|
|
815
|
+
priority: str = None,
|
|
816
|
+
status: str = None,
|
|
817
|
+
) -> Dict[str, Any]:
|
|
818
|
+
"""Execute Jira issue update API call.
|
|
819
|
+
|
|
820
|
+
Makes an async HTTP PUT request to update an existing Jira issue.
|
|
821
|
+
Only updates fields that are provided (non-None).
|
|
822
|
+
|
|
823
|
+
Args:
|
|
824
|
+
issue_key: Key of the issue to update (e.g., PROJ-123) (required)
|
|
825
|
+
summary: New summary/title (optional)
|
|
826
|
+
description: New description (optional)
|
|
827
|
+
priority: New priority level (optional)
|
|
828
|
+
status: New status (optional)
|
|
829
|
+
|
|
830
|
+
Returns:
|
|
831
|
+
Dict[str, Any]: Dictionary containing:
|
|
832
|
+
- status: "success" or "error"
|
|
833
|
+
- updated: True if successful
|
|
834
|
+
- key: Issue key that was updated
|
|
835
|
+
- url: Direct link to the issue
|
|
836
|
+
Or on error:
|
|
837
|
+
- status: "error"
|
|
838
|
+
- error: Error message
|
|
839
|
+
|
|
840
|
+
Raises:
|
|
841
|
+
aiohttp.ClientResponseError: If the API request fails
|
|
842
|
+
"""
|
|
843
|
+
if not issue_key:
|
|
844
|
+
return {"status": "error", "error": "Issue key is required"}
|
|
845
|
+
|
|
846
|
+
logger.debug(f"Updating Jira issue: {issue_key}")
|
|
847
|
+
|
|
848
|
+
site_url, api_key, user_email = self._get_jira_credentials()
|
|
849
|
+
|
|
850
|
+
# Create auth header
|
|
851
|
+
auth_string = f"{user_email}:{api_key}"
|
|
852
|
+
auth_header = base64.b64encode(auth_string.encode()).decode()
|
|
853
|
+
|
|
854
|
+
headers = {
|
|
855
|
+
"Authorization": f"Basic {auth_header}",
|
|
856
|
+
"Content-Type": "application/json",
|
|
857
|
+
"Accept": "application/json",
|
|
858
|
+
}
|
|
859
|
+
|
|
860
|
+
# Build update payload
|
|
861
|
+
fields = {}
|
|
862
|
+
if summary:
|
|
863
|
+
fields["summary"] = summary
|
|
864
|
+
if description:
|
|
865
|
+
fields["description"] = description
|
|
866
|
+
if priority:
|
|
867
|
+
fields["priority"] = {"name": priority}
|
|
868
|
+
if status:
|
|
869
|
+
fields["status"] = {"name": status}
|
|
870
|
+
|
|
871
|
+
if not fields:
|
|
872
|
+
return {"status": "error", "error": "No fields to update"}
|
|
873
|
+
|
|
874
|
+
payload = {"fields": fields}
|
|
875
|
+
|
|
876
|
+
async with aiohttp.ClientSession() as session:
|
|
877
|
+
url = f"{site_url}/rest/api/3/issue/{issue_key}"
|
|
878
|
+
logger.debug(f"Updating issue {issue_key} with payload: {payload}")
|
|
879
|
+
|
|
880
|
+
async with session.put(url, headers=headers, json=payload) as response:
|
|
881
|
+
response.raise_for_status()
|
|
882
|
+
|
|
883
|
+
return {
|
|
884
|
+
"status": "success",
|
|
885
|
+
"updated": True,
|
|
886
|
+
"key": issue_key,
|
|
887
|
+
"url": f"{site_url}/browse/{issue_key}",
|
|
888
|
+
"metadata": {
|
|
889
|
+
"updated_fields": list(fields.keys()),
|
|
890
|
+
"summary": summary,
|
|
891
|
+
"priority": priority,
|
|
892
|
+
"status": status,
|
|
893
|
+
},
|
|
894
|
+
}
|