amd-gaia 0.14.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (800) hide show
  1. amd_gaia-0.14.1.dist-info/METADATA +768 -0
  2. amd_gaia-0.14.1.dist-info/RECORD +800 -0
  3. amd_gaia-0.14.1.dist-info/WHEEL +5 -0
  4. amd_gaia-0.14.1.dist-info/entry_points.txt +5 -0
  5. amd_gaia-0.14.1.dist-info/licenses/LICENSE.md +21 -0
  6. amd_gaia-0.14.1.dist-info/top_level.txt +1 -0
  7. gaia/__init__.py +2 -0
  8. gaia/agents/__init__.py +19 -0
  9. gaia/agents/base/__init__.py +9 -0
  10. gaia/agents/base/agent.py +2072 -0
  11. gaia/agents/base/api_agent.py +120 -0
  12. gaia/agents/base/console.py +1457 -0
  13. gaia/agents/base/mcp_agent.py +86 -0
  14. gaia/agents/base/tools.py +83 -0
  15. gaia/agents/blender/agent.py +556 -0
  16. gaia/agents/blender/agent_simple.py +135 -0
  17. gaia/agents/blender/app.py +211 -0
  18. gaia/agents/blender/app_simple.py +41 -0
  19. gaia/agents/blender/core/__init__.py +16 -0
  20. gaia/agents/blender/core/materials.py +506 -0
  21. gaia/agents/blender/core/objects.py +316 -0
  22. gaia/agents/blender/core/rendering.py +225 -0
  23. gaia/agents/blender/core/scene.py +220 -0
  24. gaia/agents/blender/core/view.py +146 -0
  25. gaia/agents/chat/__init__.py +9 -0
  26. gaia/agents/chat/agent.py +975 -0
  27. gaia/agents/chat/app.py +1058 -0
  28. gaia/agents/chat/session.py +508 -0
  29. gaia/agents/chat/tools/__init__.py +15 -0
  30. gaia/agents/chat/tools/file_tools.py +96 -0
  31. gaia/agents/chat/tools/rag_tools.py +1729 -0
  32. gaia/agents/chat/tools/shell_tools.py +436 -0
  33. gaia/agents/code/__init__.py +7 -0
  34. gaia/agents/code/agent.py +547 -0
  35. gaia/agents/code/app.py +266 -0
  36. gaia/agents/code/models.py +135 -0
  37. gaia/agents/code/orchestration/__init__.py +24 -0
  38. gaia/agents/code/orchestration/checklist_executor.py +1739 -0
  39. gaia/agents/code/orchestration/checklist_generator.py +709 -0
  40. gaia/agents/code/orchestration/factories/__init__.py +9 -0
  41. gaia/agents/code/orchestration/factories/base.py +63 -0
  42. gaia/agents/code/orchestration/factories/nextjs_factory.py +118 -0
  43. gaia/agents/code/orchestration/factories/python_factory.py +106 -0
  44. gaia/agents/code/orchestration/orchestrator.py +610 -0
  45. gaia/agents/code/orchestration/project_analyzer.py +391 -0
  46. gaia/agents/code/orchestration/steps/__init__.py +67 -0
  47. gaia/agents/code/orchestration/steps/base.py +188 -0
  48. gaia/agents/code/orchestration/steps/error_handler.py +314 -0
  49. gaia/agents/code/orchestration/steps/nextjs.py +828 -0
  50. gaia/agents/code/orchestration/steps/python.py +307 -0
  51. gaia/agents/code/orchestration/template_catalog.py +463 -0
  52. gaia/agents/code/orchestration/workflows/__init__.py +14 -0
  53. gaia/agents/code/orchestration/workflows/base.py +80 -0
  54. gaia/agents/code/orchestration/workflows/nextjs.py +186 -0
  55. gaia/agents/code/orchestration/workflows/python.py +94 -0
  56. gaia/agents/code/prompts/__init__.py +11 -0
  57. gaia/agents/code/prompts/base_prompt.py +77 -0
  58. gaia/agents/code/prompts/code_patterns.py +1925 -0
  59. gaia/agents/code/prompts/nextjs_prompt.py +40 -0
  60. gaia/agents/code/prompts/python_prompt.py +109 -0
  61. gaia/agents/code/schema_inference.py +365 -0
  62. gaia/agents/code/system_prompt.py +41 -0
  63. gaia/agents/code/tools/__init__.py +42 -0
  64. gaia/agents/code/tools/cli_tools.py +1138 -0
  65. gaia/agents/code/tools/code_formatting.py +319 -0
  66. gaia/agents/code/tools/code_tools.py +769 -0
  67. gaia/agents/code/tools/error_fixing.py +1347 -0
  68. gaia/agents/code/tools/external_tools.py +180 -0
  69. gaia/agents/code/tools/file_io.py +845 -0
  70. gaia/agents/code/tools/prisma_tools.py +190 -0
  71. gaia/agents/code/tools/project_management.py +1016 -0
  72. gaia/agents/code/tools/testing.py +321 -0
  73. gaia/agents/code/tools/typescript_tools.py +122 -0
  74. gaia/agents/code/tools/validation_parsing.py +461 -0
  75. gaia/agents/code/tools/validation_tools.py +803 -0
  76. gaia/agents/code/tools/web_dev_tools.py +1744 -0
  77. gaia/agents/code/validators/__init__.py +16 -0
  78. gaia/agents/code/validators/antipattern_checker.py +241 -0
  79. gaia/agents/code/validators/ast_analyzer.py +197 -0
  80. gaia/agents/code/validators/requirements_validator.py +145 -0
  81. gaia/agents/code/validators/syntax_validator.py +171 -0
  82. gaia/agents/docker/__init__.py +7 -0
  83. gaia/agents/docker/agent.py +642 -0
  84. gaia/agents/jira/__init__.py +11 -0
  85. gaia/agents/jira/agent.py +894 -0
  86. gaia/agents/jira/jql_templates.py +299 -0
  87. gaia/agents/routing/__init__.py +7 -0
  88. gaia/agents/routing/agent.py +512 -0
  89. gaia/agents/routing/system_prompt.py +75 -0
  90. gaia/api/__init__.py +23 -0
  91. gaia/api/agent_registry.py +238 -0
  92. gaia/api/app.py +305 -0
  93. gaia/api/openai_server.py +575 -0
  94. gaia/api/schemas.py +186 -0
  95. gaia/api/sse_handler.py +370 -0
  96. gaia/apps/__init__.py +4 -0
  97. gaia/apps/llm/__init__.py +6 -0
  98. gaia/apps/llm/app.py +169 -0
  99. gaia/apps/summarize/app.py +633 -0
  100. gaia/apps/summarize/html_viewer.py +133 -0
  101. gaia/apps/summarize/pdf_formatter.py +284 -0
  102. gaia/audio/__init__.py +2 -0
  103. gaia/audio/audio_client.py +439 -0
  104. gaia/audio/audio_recorder.py +269 -0
  105. gaia/audio/kokoro_tts.py +599 -0
  106. gaia/audio/whisper_asr.py +432 -0
  107. gaia/chat/__init__.py +16 -0
  108. gaia/chat/app.py +430 -0
  109. gaia/chat/prompts.py +522 -0
  110. gaia/chat/sdk.py +1200 -0
  111. gaia/cli.py +5621 -0
  112. gaia/eval/batch_experiment.py +2332 -0
  113. gaia/eval/claude.py +542 -0
  114. gaia/eval/config.py +37 -0
  115. gaia/eval/email_generator.py +512 -0
  116. gaia/eval/eval.py +3179 -0
  117. gaia/eval/groundtruth.py +1130 -0
  118. gaia/eval/transcript_generator.py +582 -0
  119. gaia/eval/webapp/README.md +168 -0
  120. gaia/eval/webapp/node_modules/.bin/mime +16 -0
  121. gaia/eval/webapp/node_modules/.bin/mime.cmd +17 -0
  122. gaia/eval/webapp/node_modules/.bin/mime.ps1 +28 -0
  123. gaia/eval/webapp/node_modules/.package-lock.json +865 -0
  124. gaia/eval/webapp/node_modules/accepts/HISTORY.md +243 -0
  125. gaia/eval/webapp/node_modules/accepts/LICENSE +23 -0
  126. gaia/eval/webapp/node_modules/accepts/README.md +140 -0
  127. gaia/eval/webapp/node_modules/accepts/index.js +238 -0
  128. gaia/eval/webapp/node_modules/accepts/package.json +47 -0
  129. gaia/eval/webapp/node_modules/array-flatten/LICENSE +21 -0
  130. gaia/eval/webapp/node_modules/array-flatten/README.md +43 -0
  131. gaia/eval/webapp/node_modules/array-flatten/array-flatten.js +64 -0
  132. gaia/eval/webapp/node_modules/array-flatten/package.json +39 -0
  133. gaia/eval/webapp/node_modules/body-parser/HISTORY.md +672 -0
  134. gaia/eval/webapp/node_modules/body-parser/LICENSE +23 -0
  135. gaia/eval/webapp/node_modules/body-parser/README.md +476 -0
  136. gaia/eval/webapp/node_modules/body-parser/SECURITY.md +25 -0
  137. gaia/eval/webapp/node_modules/body-parser/index.js +156 -0
  138. gaia/eval/webapp/node_modules/body-parser/lib/read.js +205 -0
  139. gaia/eval/webapp/node_modules/body-parser/lib/types/json.js +247 -0
  140. gaia/eval/webapp/node_modules/body-parser/lib/types/raw.js +101 -0
  141. gaia/eval/webapp/node_modules/body-parser/lib/types/text.js +121 -0
  142. gaia/eval/webapp/node_modules/body-parser/lib/types/urlencoded.js +307 -0
  143. gaia/eval/webapp/node_modules/body-parser/package.json +56 -0
  144. gaia/eval/webapp/node_modules/bytes/History.md +97 -0
  145. gaia/eval/webapp/node_modules/bytes/LICENSE +23 -0
  146. gaia/eval/webapp/node_modules/bytes/Readme.md +152 -0
  147. gaia/eval/webapp/node_modules/bytes/index.js +170 -0
  148. gaia/eval/webapp/node_modules/bytes/package.json +42 -0
  149. gaia/eval/webapp/node_modules/call-bind-apply-helpers/.eslintrc +17 -0
  150. gaia/eval/webapp/node_modules/call-bind-apply-helpers/.github/FUNDING.yml +12 -0
  151. gaia/eval/webapp/node_modules/call-bind-apply-helpers/.nycrc +9 -0
  152. gaia/eval/webapp/node_modules/call-bind-apply-helpers/CHANGELOG.md +30 -0
  153. gaia/eval/webapp/node_modules/call-bind-apply-helpers/LICENSE +21 -0
  154. gaia/eval/webapp/node_modules/call-bind-apply-helpers/README.md +62 -0
  155. gaia/eval/webapp/node_modules/call-bind-apply-helpers/actualApply.d.ts +1 -0
  156. gaia/eval/webapp/node_modules/call-bind-apply-helpers/actualApply.js +10 -0
  157. gaia/eval/webapp/node_modules/call-bind-apply-helpers/applyBind.d.ts +19 -0
  158. gaia/eval/webapp/node_modules/call-bind-apply-helpers/applyBind.js +10 -0
  159. gaia/eval/webapp/node_modules/call-bind-apply-helpers/functionApply.d.ts +1 -0
  160. gaia/eval/webapp/node_modules/call-bind-apply-helpers/functionApply.js +4 -0
  161. gaia/eval/webapp/node_modules/call-bind-apply-helpers/functionCall.d.ts +1 -0
  162. gaia/eval/webapp/node_modules/call-bind-apply-helpers/functionCall.js +4 -0
  163. gaia/eval/webapp/node_modules/call-bind-apply-helpers/index.d.ts +64 -0
  164. gaia/eval/webapp/node_modules/call-bind-apply-helpers/index.js +15 -0
  165. gaia/eval/webapp/node_modules/call-bind-apply-helpers/package.json +85 -0
  166. gaia/eval/webapp/node_modules/call-bind-apply-helpers/reflectApply.d.ts +3 -0
  167. gaia/eval/webapp/node_modules/call-bind-apply-helpers/reflectApply.js +4 -0
  168. gaia/eval/webapp/node_modules/call-bind-apply-helpers/test/index.js +63 -0
  169. gaia/eval/webapp/node_modules/call-bind-apply-helpers/tsconfig.json +9 -0
  170. gaia/eval/webapp/node_modules/call-bound/.eslintrc +13 -0
  171. gaia/eval/webapp/node_modules/call-bound/.github/FUNDING.yml +12 -0
  172. gaia/eval/webapp/node_modules/call-bound/.nycrc +9 -0
  173. gaia/eval/webapp/node_modules/call-bound/CHANGELOG.md +42 -0
  174. gaia/eval/webapp/node_modules/call-bound/LICENSE +21 -0
  175. gaia/eval/webapp/node_modules/call-bound/README.md +53 -0
  176. gaia/eval/webapp/node_modules/call-bound/index.d.ts +94 -0
  177. gaia/eval/webapp/node_modules/call-bound/index.js +19 -0
  178. gaia/eval/webapp/node_modules/call-bound/package.json +99 -0
  179. gaia/eval/webapp/node_modules/call-bound/test/index.js +61 -0
  180. gaia/eval/webapp/node_modules/call-bound/tsconfig.json +10 -0
  181. gaia/eval/webapp/node_modules/content-disposition/HISTORY.md +60 -0
  182. gaia/eval/webapp/node_modules/content-disposition/LICENSE +22 -0
  183. gaia/eval/webapp/node_modules/content-disposition/README.md +142 -0
  184. gaia/eval/webapp/node_modules/content-disposition/index.js +458 -0
  185. gaia/eval/webapp/node_modules/content-disposition/package.json +44 -0
  186. gaia/eval/webapp/node_modules/content-type/HISTORY.md +29 -0
  187. gaia/eval/webapp/node_modules/content-type/LICENSE +22 -0
  188. gaia/eval/webapp/node_modules/content-type/README.md +94 -0
  189. gaia/eval/webapp/node_modules/content-type/index.js +225 -0
  190. gaia/eval/webapp/node_modules/content-type/package.json +42 -0
  191. gaia/eval/webapp/node_modules/cookie/LICENSE +24 -0
  192. gaia/eval/webapp/node_modules/cookie/README.md +317 -0
  193. gaia/eval/webapp/node_modules/cookie/SECURITY.md +25 -0
  194. gaia/eval/webapp/node_modules/cookie/index.js +334 -0
  195. gaia/eval/webapp/node_modules/cookie/package.json +44 -0
  196. gaia/eval/webapp/node_modules/cookie-signature/.npmignore +4 -0
  197. gaia/eval/webapp/node_modules/cookie-signature/History.md +38 -0
  198. gaia/eval/webapp/node_modules/cookie-signature/Readme.md +42 -0
  199. gaia/eval/webapp/node_modules/cookie-signature/index.js +51 -0
  200. gaia/eval/webapp/node_modules/cookie-signature/package.json +18 -0
  201. gaia/eval/webapp/node_modules/debug/.coveralls.yml +1 -0
  202. gaia/eval/webapp/node_modules/debug/.eslintrc +11 -0
  203. gaia/eval/webapp/node_modules/debug/.npmignore +9 -0
  204. gaia/eval/webapp/node_modules/debug/.travis.yml +14 -0
  205. gaia/eval/webapp/node_modules/debug/CHANGELOG.md +362 -0
  206. gaia/eval/webapp/node_modules/debug/LICENSE +19 -0
  207. gaia/eval/webapp/node_modules/debug/Makefile +50 -0
  208. gaia/eval/webapp/node_modules/debug/README.md +312 -0
  209. gaia/eval/webapp/node_modules/debug/component.json +19 -0
  210. gaia/eval/webapp/node_modules/debug/karma.conf.js +70 -0
  211. gaia/eval/webapp/node_modules/debug/node.js +1 -0
  212. gaia/eval/webapp/node_modules/debug/package.json +49 -0
  213. gaia/eval/webapp/node_modules/debug/src/browser.js +185 -0
  214. gaia/eval/webapp/node_modules/debug/src/debug.js +202 -0
  215. gaia/eval/webapp/node_modules/debug/src/index.js +10 -0
  216. gaia/eval/webapp/node_modules/debug/src/inspector-log.js +15 -0
  217. gaia/eval/webapp/node_modules/debug/src/node.js +248 -0
  218. gaia/eval/webapp/node_modules/depd/History.md +103 -0
  219. gaia/eval/webapp/node_modules/depd/LICENSE +22 -0
  220. gaia/eval/webapp/node_modules/depd/Readme.md +280 -0
  221. gaia/eval/webapp/node_modules/depd/index.js +538 -0
  222. gaia/eval/webapp/node_modules/depd/lib/browser/index.js +77 -0
  223. gaia/eval/webapp/node_modules/depd/package.json +45 -0
  224. gaia/eval/webapp/node_modules/destroy/LICENSE +23 -0
  225. gaia/eval/webapp/node_modules/destroy/README.md +63 -0
  226. gaia/eval/webapp/node_modules/destroy/index.js +209 -0
  227. gaia/eval/webapp/node_modules/destroy/package.json +48 -0
  228. gaia/eval/webapp/node_modules/dunder-proto/.eslintrc +5 -0
  229. gaia/eval/webapp/node_modules/dunder-proto/.github/FUNDING.yml +12 -0
  230. gaia/eval/webapp/node_modules/dunder-proto/.nycrc +13 -0
  231. gaia/eval/webapp/node_modules/dunder-proto/CHANGELOG.md +24 -0
  232. gaia/eval/webapp/node_modules/dunder-proto/LICENSE +21 -0
  233. gaia/eval/webapp/node_modules/dunder-proto/README.md +54 -0
  234. gaia/eval/webapp/node_modules/dunder-proto/get.d.ts +5 -0
  235. gaia/eval/webapp/node_modules/dunder-proto/get.js +30 -0
  236. gaia/eval/webapp/node_modules/dunder-proto/package.json +76 -0
  237. gaia/eval/webapp/node_modules/dunder-proto/set.d.ts +5 -0
  238. gaia/eval/webapp/node_modules/dunder-proto/set.js +35 -0
  239. gaia/eval/webapp/node_modules/dunder-proto/test/get.js +34 -0
  240. gaia/eval/webapp/node_modules/dunder-proto/test/index.js +4 -0
  241. gaia/eval/webapp/node_modules/dunder-proto/test/set.js +50 -0
  242. gaia/eval/webapp/node_modules/dunder-proto/tsconfig.json +9 -0
  243. gaia/eval/webapp/node_modules/ee-first/LICENSE +22 -0
  244. gaia/eval/webapp/node_modules/ee-first/README.md +80 -0
  245. gaia/eval/webapp/node_modules/ee-first/index.js +95 -0
  246. gaia/eval/webapp/node_modules/ee-first/package.json +29 -0
  247. gaia/eval/webapp/node_modules/encodeurl/LICENSE +22 -0
  248. gaia/eval/webapp/node_modules/encodeurl/README.md +109 -0
  249. gaia/eval/webapp/node_modules/encodeurl/index.js +60 -0
  250. gaia/eval/webapp/node_modules/encodeurl/package.json +40 -0
  251. gaia/eval/webapp/node_modules/es-define-property/.eslintrc +13 -0
  252. gaia/eval/webapp/node_modules/es-define-property/.github/FUNDING.yml +12 -0
  253. gaia/eval/webapp/node_modules/es-define-property/.nycrc +9 -0
  254. gaia/eval/webapp/node_modules/es-define-property/CHANGELOG.md +29 -0
  255. gaia/eval/webapp/node_modules/es-define-property/LICENSE +21 -0
  256. gaia/eval/webapp/node_modules/es-define-property/README.md +49 -0
  257. gaia/eval/webapp/node_modules/es-define-property/index.d.ts +3 -0
  258. gaia/eval/webapp/node_modules/es-define-property/index.js +14 -0
  259. gaia/eval/webapp/node_modules/es-define-property/package.json +81 -0
  260. gaia/eval/webapp/node_modules/es-define-property/test/index.js +56 -0
  261. gaia/eval/webapp/node_modules/es-define-property/tsconfig.json +10 -0
  262. gaia/eval/webapp/node_modules/es-errors/.eslintrc +5 -0
  263. gaia/eval/webapp/node_modules/es-errors/.github/FUNDING.yml +12 -0
  264. gaia/eval/webapp/node_modules/es-errors/CHANGELOG.md +40 -0
  265. gaia/eval/webapp/node_modules/es-errors/LICENSE +21 -0
  266. gaia/eval/webapp/node_modules/es-errors/README.md +55 -0
  267. gaia/eval/webapp/node_modules/es-errors/eval.d.ts +3 -0
  268. gaia/eval/webapp/node_modules/es-errors/eval.js +4 -0
  269. gaia/eval/webapp/node_modules/es-errors/index.d.ts +3 -0
  270. gaia/eval/webapp/node_modules/es-errors/index.js +4 -0
  271. gaia/eval/webapp/node_modules/es-errors/package.json +80 -0
  272. gaia/eval/webapp/node_modules/es-errors/range.d.ts +3 -0
  273. gaia/eval/webapp/node_modules/es-errors/range.js +4 -0
  274. gaia/eval/webapp/node_modules/es-errors/ref.d.ts +3 -0
  275. gaia/eval/webapp/node_modules/es-errors/ref.js +4 -0
  276. gaia/eval/webapp/node_modules/es-errors/syntax.d.ts +3 -0
  277. gaia/eval/webapp/node_modules/es-errors/syntax.js +4 -0
  278. gaia/eval/webapp/node_modules/es-errors/test/index.js +19 -0
  279. gaia/eval/webapp/node_modules/es-errors/tsconfig.json +49 -0
  280. gaia/eval/webapp/node_modules/es-errors/type.d.ts +3 -0
  281. gaia/eval/webapp/node_modules/es-errors/type.js +4 -0
  282. gaia/eval/webapp/node_modules/es-errors/uri.d.ts +3 -0
  283. gaia/eval/webapp/node_modules/es-errors/uri.js +4 -0
  284. gaia/eval/webapp/node_modules/es-object-atoms/.eslintrc +16 -0
  285. gaia/eval/webapp/node_modules/es-object-atoms/.github/FUNDING.yml +12 -0
  286. gaia/eval/webapp/node_modules/es-object-atoms/CHANGELOG.md +37 -0
  287. gaia/eval/webapp/node_modules/es-object-atoms/LICENSE +21 -0
  288. gaia/eval/webapp/node_modules/es-object-atoms/README.md +63 -0
  289. gaia/eval/webapp/node_modules/es-object-atoms/RequireObjectCoercible.d.ts +3 -0
  290. gaia/eval/webapp/node_modules/es-object-atoms/RequireObjectCoercible.js +11 -0
  291. gaia/eval/webapp/node_modules/es-object-atoms/ToObject.d.ts +7 -0
  292. gaia/eval/webapp/node_modules/es-object-atoms/ToObject.js +10 -0
  293. gaia/eval/webapp/node_modules/es-object-atoms/index.d.ts +3 -0
  294. gaia/eval/webapp/node_modules/es-object-atoms/index.js +4 -0
  295. gaia/eval/webapp/node_modules/es-object-atoms/isObject.d.ts +3 -0
  296. gaia/eval/webapp/node_modules/es-object-atoms/isObject.js +6 -0
  297. gaia/eval/webapp/node_modules/es-object-atoms/package.json +80 -0
  298. gaia/eval/webapp/node_modules/es-object-atoms/test/index.js +38 -0
  299. gaia/eval/webapp/node_modules/es-object-atoms/tsconfig.json +6 -0
  300. gaia/eval/webapp/node_modules/escape-html/LICENSE +24 -0
  301. gaia/eval/webapp/node_modules/escape-html/Readme.md +43 -0
  302. gaia/eval/webapp/node_modules/escape-html/index.js +78 -0
  303. gaia/eval/webapp/node_modules/escape-html/package.json +24 -0
  304. gaia/eval/webapp/node_modules/etag/HISTORY.md +83 -0
  305. gaia/eval/webapp/node_modules/etag/LICENSE +22 -0
  306. gaia/eval/webapp/node_modules/etag/README.md +159 -0
  307. gaia/eval/webapp/node_modules/etag/index.js +131 -0
  308. gaia/eval/webapp/node_modules/etag/package.json +47 -0
  309. gaia/eval/webapp/node_modules/express/History.md +3656 -0
  310. gaia/eval/webapp/node_modules/express/LICENSE +24 -0
  311. gaia/eval/webapp/node_modules/express/Readme.md +260 -0
  312. gaia/eval/webapp/node_modules/express/index.js +11 -0
  313. gaia/eval/webapp/node_modules/express/lib/application.js +661 -0
  314. gaia/eval/webapp/node_modules/express/lib/express.js +116 -0
  315. gaia/eval/webapp/node_modules/express/lib/middleware/init.js +43 -0
  316. gaia/eval/webapp/node_modules/express/lib/middleware/query.js +47 -0
  317. gaia/eval/webapp/node_modules/express/lib/request.js +525 -0
  318. gaia/eval/webapp/node_modules/express/lib/response.js +1179 -0
  319. gaia/eval/webapp/node_modules/express/lib/router/index.js +673 -0
  320. gaia/eval/webapp/node_modules/express/lib/router/layer.js +181 -0
  321. gaia/eval/webapp/node_modules/express/lib/router/route.js +230 -0
  322. gaia/eval/webapp/node_modules/express/lib/utils.js +303 -0
  323. gaia/eval/webapp/node_modules/express/lib/view.js +182 -0
  324. gaia/eval/webapp/node_modules/express/package.json +102 -0
  325. gaia/eval/webapp/node_modules/finalhandler/HISTORY.md +210 -0
  326. gaia/eval/webapp/node_modules/finalhandler/LICENSE +22 -0
  327. gaia/eval/webapp/node_modules/finalhandler/README.md +147 -0
  328. gaia/eval/webapp/node_modules/finalhandler/SECURITY.md +25 -0
  329. gaia/eval/webapp/node_modules/finalhandler/index.js +341 -0
  330. gaia/eval/webapp/node_modules/finalhandler/package.json +47 -0
  331. gaia/eval/webapp/node_modules/forwarded/HISTORY.md +21 -0
  332. gaia/eval/webapp/node_modules/forwarded/LICENSE +22 -0
  333. gaia/eval/webapp/node_modules/forwarded/README.md +57 -0
  334. gaia/eval/webapp/node_modules/forwarded/index.js +90 -0
  335. gaia/eval/webapp/node_modules/forwarded/package.json +45 -0
  336. gaia/eval/webapp/node_modules/fresh/HISTORY.md +70 -0
  337. gaia/eval/webapp/node_modules/fresh/LICENSE +23 -0
  338. gaia/eval/webapp/node_modules/fresh/README.md +119 -0
  339. gaia/eval/webapp/node_modules/fresh/index.js +137 -0
  340. gaia/eval/webapp/node_modules/fresh/package.json +46 -0
  341. gaia/eval/webapp/node_modules/fs/README.md +9 -0
  342. gaia/eval/webapp/node_modules/fs/package.json +20 -0
  343. gaia/eval/webapp/node_modules/function-bind/.eslintrc +21 -0
  344. gaia/eval/webapp/node_modules/function-bind/.github/FUNDING.yml +12 -0
  345. gaia/eval/webapp/node_modules/function-bind/.github/SECURITY.md +3 -0
  346. gaia/eval/webapp/node_modules/function-bind/.nycrc +13 -0
  347. gaia/eval/webapp/node_modules/function-bind/CHANGELOG.md +136 -0
  348. gaia/eval/webapp/node_modules/function-bind/LICENSE +20 -0
  349. gaia/eval/webapp/node_modules/function-bind/README.md +46 -0
  350. gaia/eval/webapp/node_modules/function-bind/implementation.js +84 -0
  351. gaia/eval/webapp/node_modules/function-bind/index.js +5 -0
  352. gaia/eval/webapp/node_modules/function-bind/package.json +87 -0
  353. gaia/eval/webapp/node_modules/function-bind/test/.eslintrc +9 -0
  354. gaia/eval/webapp/node_modules/function-bind/test/index.js +252 -0
  355. gaia/eval/webapp/node_modules/get-intrinsic/.eslintrc +42 -0
  356. gaia/eval/webapp/node_modules/get-intrinsic/.github/FUNDING.yml +12 -0
  357. gaia/eval/webapp/node_modules/get-intrinsic/.nycrc +9 -0
  358. gaia/eval/webapp/node_modules/get-intrinsic/CHANGELOG.md +186 -0
  359. gaia/eval/webapp/node_modules/get-intrinsic/LICENSE +21 -0
  360. gaia/eval/webapp/node_modules/get-intrinsic/README.md +71 -0
  361. gaia/eval/webapp/node_modules/get-intrinsic/index.js +378 -0
  362. gaia/eval/webapp/node_modules/get-intrinsic/package.json +97 -0
  363. gaia/eval/webapp/node_modules/get-intrinsic/test/GetIntrinsic.js +274 -0
  364. gaia/eval/webapp/node_modules/get-proto/.eslintrc +10 -0
  365. gaia/eval/webapp/node_modules/get-proto/.github/FUNDING.yml +12 -0
  366. gaia/eval/webapp/node_modules/get-proto/.nycrc +9 -0
  367. gaia/eval/webapp/node_modules/get-proto/CHANGELOG.md +21 -0
  368. gaia/eval/webapp/node_modules/get-proto/LICENSE +21 -0
  369. gaia/eval/webapp/node_modules/get-proto/Object.getPrototypeOf.d.ts +5 -0
  370. gaia/eval/webapp/node_modules/get-proto/Object.getPrototypeOf.js +6 -0
  371. gaia/eval/webapp/node_modules/get-proto/README.md +50 -0
  372. gaia/eval/webapp/node_modules/get-proto/Reflect.getPrototypeOf.d.ts +3 -0
  373. gaia/eval/webapp/node_modules/get-proto/Reflect.getPrototypeOf.js +4 -0
  374. gaia/eval/webapp/node_modules/get-proto/index.d.ts +5 -0
  375. gaia/eval/webapp/node_modules/get-proto/index.js +27 -0
  376. gaia/eval/webapp/node_modules/get-proto/package.json +81 -0
  377. gaia/eval/webapp/node_modules/get-proto/test/index.js +68 -0
  378. gaia/eval/webapp/node_modules/get-proto/tsconfig.json +9 -0
  379. gaia/eval/webapp/node_modules/gopd/.eslintrc +16 -0
  380. gaia/eval/webapp/node_modules/gopd/.github/FUNDING.yml +12 -0
  381. gaia/eval/webapp/node_modules/gopd/CHANGELOG.md +45 -0
  382. gaia/eval/webapp/node_modules/gopd/LICENSE +21 -0
  383. gaia/eval/webapp/node_modules/gopd/README.md +40 -0
  384. gaia/eval/webapp/node_modules/gopd/gOPD.d.ts +1 -0
  385. gaia/eval/webapp/node_modules/gopd/gOPD.js +4 -0
  386. gaia/eval/webapp/node_modules/gopd/index.d.ts +5 -0
  387. gaia/eval/webapp/node_modules/gopd/index.js +15 -0
  388. gaia/eval/webapp/node_modules/gopd/package.json +77 -0
  389. gaia/eval/webapp/node_modules/gopd/test/index.js +36 -0
  390. gaia/eval/webapp/node_modules/gopd/tsconfig.json +9 -0
  391. gaia/eval/webapp/node_modules/has-symbols/.eslintrc +11 -0
  392. gaia/eval/webapp/node_modules/has-symbols/.github/FUNDING.yml +12 -0
  393. gaia/eval/webapp/node_modules/has-symbols/.nycrc +9 -0
  394. gaia/eval/webapp/node_modules/has-symbols/CHANGELOG.md +91 -0
  395. gaia/eval/webapp/node_modules/has-symbols/LICENSE +21 -0
  396. gaia/eval/webapp/node_modules/has-symbols/README.md +46 -0
  397. gaia/eval/webapp/node_modules/has-symbols/index.d.ts +3 -0
  398. gaia/eval/webapp/node_modules/has-symbols/index.js +14 -0
  399. gaia/eval/webapp/node_modules/has-symbols/package.json +111 -0
  400. gaia/eval/webapp/node_modules/has-symbols/shams.d.ts +3 -0
  401. gaia/eval/webapp/node_modules/has-symbols/shams.js +45 -0
  402. gaia/eval/webapp/node_modules/has-symbols/test/index.js +22 -0
  403. gaia/eval/webapp/node_modules/has-symbols/test/shams/core-js.js +29 -0
  404. gaia/eval/webapp/node_modules/has-symbols/test/shams/get-own-property-symbols.js +29 -0
  405. gaia/eval/webapp/node_modules/has-symbols/test/tests.js +58 -0
  406. gaia/eval/webapp/node_modules/has-symbols/tsconfig.json +10 -0
  407. gaia/eval/webapp/node_modules/hasown/.eslintrc +5 -0
  408. gaia/eval/webapp/node_modules/hasown/.github/FUNDING.yml +12 -0
  409. gaia/eval/webapp/node_modules/hasown/.nycrc +13 -0
  410. gaia/eval/webapp/node_modules/hasown/CHANGELOG.md +40 -0
  411. gaia/eval/webapp/node_modules/hasown/LICENSE +21 -0
  412. gaia/eval/webapp/node_modules/hasown/README.md +40 -0
  413. gaia/eval/webapp/node_modules/hasown/index.d.ts +3 -0
  414. gaia/eval/webapp/node_modules/hasown/index.js +8 -0
  415. gaia/eval/webapp/node_modules/hasown/package.json +92 -0
  416. gaia/eval/webapp/node_modules/hasown/tsconfig.json +6 -0
  417. gaia/eval/webapp/node_modules/http-errors/HISTORY.md +180 -0
  418. gaia/eval/webapp/node_modules/http-errors/LICENSE +23 -0
  419. gaia/eval/webapp/node_modules/http-errors/README.md +169 -0
  420. gaia/eval/webapp/node_modules/http-errors/index.js +289 -0
  421. gaia/eval/webapp/node_modules/http-errors/package.json +50 -0
  422. gaia/eval/webapp/node_modules/iconv-lite/Changelog.md +162 -0
  423. gaia/eval/webapp/node_modules/iconv-lite/LICENSE +21 -0
  424. gaia/eval/webapp/node_modules/iconv-lite/README.md +156 -0
  425. gaia/eval/webapp/node_modules/iconv-lite/encodings/dbcs-codec.js +555 -0
  426. gaia/eval/webapp/node_modules/iconv-lite/encodings/dbcs-data.js +176 -0
  427. gaia/eval/webapp/node_modules/iconv-lite/encodings/index.js +22 -0
  428. gaia/eval/webapp/node_modules/iconv-lite/encodings/internal.js +188 -0
  429. gaia/eval/webapp/node_modules/iconv-lite/encodings/sbcs-codec.js +72 -0
  430. gaia/eval/webapp/node_modules/iconv-lite/encodings/sbcs-data-generated.js +451 -0
  431. gaia/eval/webapp/node_modules/iconv-lite/encodings/sbcs-data.js +174 -0
  432. gaia/eval/webapp/node_modules/iconv-lite/encodings/tables/big5-added.json +122 -0
  433. gaia/eval/webapp/node_modules/iconv-lite/encodings/tables/cp936.json +264 -0
  434. gaia/eval/webapp/node_modules/iconv-lite/encodings/tables/cp949.json +273 -0
  435. gaia/eval/webapp/node_modules/iconv-lite/encodings/tables/cp950.json +177 -0
  436. gaia/eval/webapp/node_modules/iconv-lite/encodings/tables/eucjp.json +182 -0
  437. gaia/eval/webapp/node_modules/iconv-lite/encodings/tables/gb18030-ranges.json +1 -0
  438. gaia/eval/webapp/node_modules/iconv-lite/encodings/tables/gbk-added.json +55 -0
  439. gaia/eval/webapp/node_modules/iconv-lite/encodings/tables/shiftjis.json +125 -0
  440. gaia/eval/webapp/node_modules/iconv-lite/encodings/utf16.js +177 -0
  441. gaia/eval/webapp/node_modules/iconv-lite/encodings/utf7.js +290 -0
  442. gaia/eval/webapp/node_modules/iconv-lite/lib/bom-handling.js +52 -0
  443. gaia/eval/webapp/node_modules/iconv-lite/lib/extend-node.js +217 -0
  444. gaia/eval/webapp/node_modules/iconv-lite/lib/index.d.ts +24 -0
  445. gaia/eval/webapp/node_modules/iconv-lite/lib/index.js +153 -0
  446. gaia/eval/webapp/node_modules/iconv-lite/lib/streams.js +121 -0
  447. gaia/eval/webapp/node_modules/iconv-lite/package.json +46 -0
  448. gaia/eval/webapp/node_modules/inherits/LICENSE +16 -0
  449. gaia/eval/webapp/node_modules/inherits/README.md +42 -0
  450. gaia/eval/webapp/node_modules/inherits/inherits.js +9 -0
  451. gaia/eval/webapp/node_modules/inherits/inherits_browser.js +27 -0
  452. gaia/eval/webapp/node_modules/inherits/package.json +29 -0
  453. gaia/eval/webapp/node_modules/ipaddr.js/LICENSE +19 -0
  454. gaia/eval/webapp/node_modules/ipaddr.js/README.md +233 -0
  455. gaia/eval/webapp/node_modules/ipaddr.js/ipaddr.min.js +1 -0
  456. gaia/eval/webapp/node_modules/ipaddr.js/lib/ipaddr.js +673 -0
  457. gaia/eval/webapp/node_modules/ipaddr.js/lib/ipaddr.js.d.ts +68 -0
  458. gaia/eval/webapp/node_modules/ipaddr.js/package.json +35 -0
  459. gaia/eval/webapp/node_modules/math-intrinsics/.eslintrc +16 -0
  460. gaia/eval/webapp/node_modules/math-intrinsics/.github/FUNDING.yml +12 -0
  461. gaia/eval/webapp/node_modules/math-intrinsics/CHANGELOG.md +24 -0
  462. gaia/eval/webapp/node_modules/math-intrinsics/LICENSE +21 -0
  463. gaia/eval/webapp/node_modules/math-intrinsics/README.md +50 -0
  464. gaia/eval/webapp/node_modules/math-intrinsics/abs.d.ts +1 -0
  465. gaia/eval/webapp/node_modules/math-intrinsics/abs.js +4 -0
  466. gaia/eval/webapp/node_modules/math-intrinsics/constants/maxArrayLength.d.ts +3 -0
  467. gaia/eval/webapp/node_modules/math-intrinsics/constants/maxArrayLength.js +4 -0
  468. gaia/eval/webapp/node_modules/math-intrinsics/constants/maxSafeInteger.d.ts +3 -0
  469. gaia/eval/webapp/node_modules/math-intrinsics/constants/maxSafeInteger.js +5 -0
  470. gaia/eval/webapp/node_modules/math-intrinsics/constants/maxValue.d.ts +3 -0
  471. gaia/eval/webapp/node_modules/math-intrinsics/constants/maxValue.js +5 -0
  472. gaia/eval/webapp/node_modules/math-intrinsics/floor.d.ts +1 -0
  473. gaia/eval/webapp/node_modules/math-intrinsics/floor.js +4 -0
  474. gaia/eval/webapp/node_modules/math-intrinsics/isFinite.d.ts +3 -0
  475. gaia/eval/webapp/node_modules/math-intrinsics/isFinite.js +12 -0
  476. gaia/eval/webapp/node_modules/math-intrinsics/isInteger.d.ts +3 -0
  477. gaia/eval/webapp/node_modules/math-intrinsics/isInteger.js +16 -0
  478. gaia/eval/webapp/node_modules/math-intrinsics/isNaN.d.ts +1 -0
  479. gaia/eval/webapp/node_modules/math-intrinsics/isNaN.js +6 -0
  480. gaia/eval/webapp/node_modules/math-intrinsics/isNegativeZero.d.ts +3 -0
  481. gaia/eval/webapp/node_modules/math-intrinsics/isNegativeZero.js +6 -0
  482. gaia/eval/webapp/node_modules/math-intrinsics/max.d.ts +1 -0
  483. gaia/eval/webapp/node_modules/math-intrinsics/max.js +4 -0
  484. gaia/eval/webapp/node_modules/math-intrinsics/min.d.ts +1 -0
  485. gaia/eval/webapp/node_modules/math-intrinsics/min.js +4 -0
  486. gaia/eval/webapp/node_modules/math-intrinsics/mod.d.ts +3 -0
  487. gaia/eval/webapp/node_modules/math-intrinsics/mod.js +9 -0
  488. gaia/eval/webapp/node_modules/math-intrinsics/package.json +86 -0
  489. gaia/eval/webapp/node_modules/math-intrinsics/pow.d.ts +1 -0
  490. gaia/eval/webapp/node_modules/math-intrinsics/pow.js +4 -0
  491. gaia/eval/webapp/node_modules/math-intrinsics/round.d.ts +1 -0
  492. gaia/eval/webapp/node_modules/math-intrinsics/round.js +4 -0
  493. gaia/eval/webapp/node_modules/math-intrinsics/sign.d.ts +3 -0
  494. gaia/eval/webapp/node_modules/math-intrinsics/sign.js +11 -0
  495. gaia/eval/webapp/node_modules/math-intrinsics/test/index.js +192 -0
  496. gaia/eval/webapp/node_modules/math-intrinsics/tsconfig.json +3 -0
  497. gaia/eval/webapp/node_modules/media-typer/HISTORY.md +22 -0
  498. gaia/eval/webapp/node_modules/media-typer/LICENSE +22 -0
  499. gaia/eval/webapp/node_modules/media-typer/README.md +81 -0
  500. gaia/eval/webapp/node_modules/media-typer/index.js +270 -0
  501. gaia/eval/webapp/node_modules/media-typer/package.json +26 -0
  502. gaia/eval/webapp/node_modules/merge-descriptors/HISTORY.md +21 -0
  503. gaia/eval/webapp/node_modules/merge-descriptors/LICENSE +23 -0
  504. gaia/eval/webapp/node_modules/merge-descriptors/README.md +49 -0
  505. gaia/eval/webapp/node_modules/merge-descriptors/index.js +60 -0
  506. gaia/eval/webapp/node_modules/merge-descriptors/package.json +39 -0
  507. gaia/eval/webapp/node_modules/methods/HISTORY.md +29 -0
  508. gaia/eval/webapp/node_modules/methods/LICENSE +24 -0
  509. gaia/eval/webapp/node_modules/methods/README.md +51 -0
  510. gaia/eval/webapp/node_modules/methods/index.js +69 -0
  511. gaia/eval/webapp/node_modules/methods/package.json +36 -0
  512. gaia/eval/webapp/node_modules/mime/.npmignore +0 -0
  513. gaia/eval/webapp/node_modules/mime/CHANGELOG.md +164 -0
  514. gaia/eval/webapp/node_modules/mime/LICENSE +21 -0
  515. gaia/eval/webapp/node_modules/mime/README.md +90 -0
  516. gaia/eval/webapp/node_modules/mime/cli.js +8 -0
  517. gaia/eval/webapp/node_modules/mime/mime.js +108 -0
  518. gaia/eval/webapp/node_modules/mime/package.json +44 -0
  519. gaia/eval/webapp/node_modules/mime/src/build.js +53 -0
  520. gaia/eval/webapp/node_modules/mime/src/test.js +60 -0
  521. gaia/eval/webapp/node_modules/mime/types.json +1 -0
  522. gaia/eval/webapp/node_modules/mime-db/HISTORY.md +507 -0
  523. gaia/eval/webapp/node_modules/mime-db/LICENSE +23 -0
  524. gaia/eval/webapp/node_modules/mime-db/README.md +100 -0
  525. gaia/eval/webapp/node_modules/mime-db/db.json +8519 -0
  526. gaia/eval/webapp/node_modules/mime-db/index.js +12 -0
  527. gaia/eval/webapp/node_modules/mime-db/package.json +60 -0
  528. gaia/eval/webapp/node_modules/mime-types/HISTORY.md +397 -0
  529. gaia/eval/webapp/node_modules/mime-types/LICENSE +23 -0
  530. gaia/eval/webapp/node_modules/mime-types/README.md +113 -0
  531. gaia/eval/webapp/node_modules/mime-types/index.js +188 -0
  532. gaia/eval/webapp/node_modules/mime-types/package.json +44 -0
  533. gaia/eval/webapp/node_modules/ms/index.js +152 -0
  534. gaia/eval/webapp/node_modules/ms/license.md +21 -0
  535. gaia/eval/webapp/node_modules/ms/package.json +37 -0
  536. gaia/eval/webapp/node_modules/ms/readme.md +51 -0
  537. gaia/eval/webapp/node_modules/negotiator/HISTORY.md +108 -0
  538. gaia/eval/webapp/node_modules/negotiator/LICENSE +24 -0
  539. gaia/eval/webapp/node_modules/negotiator/README.md +203 -0
  540. gaia/eval/webapp/node_modules/negotiator/index.js +82 -0
  541. gaia/eval/webapp/node_modules/negotiator/lib/charset.js +169 -0
  542. gaia/eval/webapp/node_modules/negotiator/lib/encoding.js +184 -0
  543. gaia/eval/webapp/node_modules/negotiator/lib/language.js +179 -0
  544. gaia/eval/webapp/node_modules/negotiator/lib/mediaType.js +294 -0
  545. gaia/eval/webapp/node_modules/negotiator/package.json +42 -0
  546. gaia/eval/webapp/node_modules/object-inspect/.eslintrc +53 -0
  547. gaia/eval/webapp/node_modules/object-inspect/.github/FUNDING.yml +12 -0
  548. gaia/eval/webapp/node_modules/object-inspect/.nycrc +13 -0
  549. gaia/eval/webapp/node_modules/object-inspect/CHANGELOG.md +424 -0
  550. gaia/eval/webapp/node_modules/object-inspect/LICENSE +21 -0
  551. gaia/eval/webapp/node_modules/object-inspect/example/all.js +23 -0
  552. gaia/eval/webapp/node_modules/object-inspect/example/circular.js +6 -0
  553. gaia/eval/webapp/node_modules/object-inspect/example/fn.js +5 -0
  554. gaia/eval/webapp/node_modules/object-inspect/example/inspect.js +10 -0
  555. gaia/eval/webapp/node_modules/object-inspect/index.js +544 -0
  556. gaia/eval/webapp/node_modules/object-inspect/package-support.json +20 -0
  557. gaia/eval/webapp/node_modules/object-inspect/package.json +105 -0
  558. gaia/eval/webapp/node_modules/object-inspect/readme.markdown +84 -0
  559. gaia/eval/webapp/node_modules/object-inspect/test/bigint.js +58 -0
  560. gaia/eval/webapp/node_modules/object-inspect/test/browser/dom.js +15 -0
  561. gaia/eval/webapp/node_modules/object-inspect/test/circular.js +16 -0
  562. gaia/eval/webapp/node_modules/object-inspect/test/deep.js +12 -0
  563. gaia/eval/webapp/node_modules/object-inspect/test/element.js +53 -0
  564. gaia/eval/webapp/node_modules/object-inspect/test/err.js +48 -0
  565. gaia/eval/webapp/node_modules/object-inspect/test/fakes.js +29 -0
  566. gaia/eval/webapp/node_modules/object-inspect/test/fn.js +76 -0
  567. gaia/eval/webapp/node_modules/object-inspect/test/global.js +17 -0
  568. gaia/eval/webapp/node_modules/object-inspect/test/has.js +15 -0
  569. gaia/eval/webapp/node_modules/object-inspect/test/holes.js +15 -0
  570. gaia/eval/webapp/node_modules/object-inspect/test/indent-option.js +271 -0
  571. gaia/eval/webapp/node_modules/object-inspect/test/inspect.js +139 -0
  572. gaia/eval/webapp/node_modules/object-inspect/test/lowbyte.js +12 -0
  573. gaia/eval/webapp/node_modules/object-inspect/test/number.js +58 -0
  574. gaia/eval/webapp/node_modules/object-inspect/test/quoteStyle.js +26 -0
  575. gaia/eval/webapp/node_modules/object-inspect/test/toStringTag.js +40 -0
  576. gaia/eval/webapp/node_modules/object-inspect/test/undef.js +12 -0
  577. gaia/eval/webapp/node_modules/object-inspect/test/values.js +261 -0
  578. gaia/eval/webapp/node_modules/object-inspect/test-core-js.js +26 -0
  579. gaia/eval/webapp/node_modules/object-inspect/util.inspect.js +1 -0
  580. gaia/eval/webapp/node_modules/on-finished/HISTORY.md +98 -0
  581. gaia/eval/webapp/node_modules/on-finished/LICENSE +23 -0
  582. gaia/eval/webapp/node_modules/on-finished/README.md +162 -0
  583. gaia/eval/webapp/node_modules/on-finished/index.js +234 -0
  584. gaia/eval/webapp/node_modules/on-finished/package.json +39 -0
  585. gaia/eval/webapp/node_modules/parseurl/HISTORY.md +58 -0
  586. gaia/eval/webapp/node_modules/parseurl/LICENSE +24 -0
  587. gaia/eval/webapp/node_modules/parseurl/README.md +133 -0
  588. gaia/eval/webapp/node_modules/parseurl/index.js +158 -0
  589. gaia/eval/webapp/node_modules/parseurl/package.json +40 -0
  590. gaia/eval/webapp/node_modules/path/.npmignore +1 -0
  591. gaia/eval/webapp/node_modules/path/LICENSE +18 -0
  592. gaia/eval/webapp/node_modules/path/README.md +15 -0
  593. gaia/eval/webapp/node_modules/path/package.json +24 -0
  594. gaia/eval/webapp/node_modules/path/path.js +628 -0
  595. gaia/eval/webapp/node_modules/path-to-regexp/LICENSE +21 -0
  596. gaia/eval/webapp/node_modules/path-to-regexp/Readme.md +35 -0
  597. gaia/eval/webapp/node_modules/path-to-regexp/index.js +156 -0
  598. gaia/eval/webapp/node_modules/path-to-regexp/package.json +30 -0
  599. gaia/eval/webapp/node_modules/process/.eslintrc +21 -0
  600. gaia/eval/webapp/node_modules/process/LICENSE +22 -0
  601. gaia/eval/webapp/node_modules/process/README.md +26 -0
  602. gaia/eval/webapp/node_modules/process/browser.js +184 -0
  603. gaia/eval/webapp/node_modules/process/index.js +2 -0
  604. gaia/eval/webapp/node_modules/process/package.json +27 -0
  605. gaia/eval/webapp/node_modules/process/test.js +199 -0
  606. gaia/eval/webapp/node_modules/proxy-addr/HISTORY.md +161 -0
  607. gaia/eval/webapp/node_modules/proxy-addr/LICENSE +22 -0
  608. gaia/eval/webapp/node_modules/proxy-addr/README.md +139 -0
  609. gaia/eval/webapp/node_modules/proxy-addr/index.js +327 -0
  610. gaia/eval/webapp/node_modules/proxy-addr/package.json +47 -0
  611. gaia/eval/webapp/node_modules/qs/.editorconfig +46 -0
  612. gaia/eval/webapp/node_modules/qs/.eslintrc +38 -0
  613. gaia/eval/webapp/node_modules/qs/.github/FUNDING.yml +12 -0
  614. gaia/eval/webapp/node_modules/qs/.nycrc +13 -0
  615. gaia/eval/webapp/node_modules/qs/CHANGELOG.md +600 -0
  616. gaia/eval/webapp/node_modules/qs/LICENSE.md +29 -0
  617. gaia/eval/webapp/node_modules/qs/README.md +709 -0
  618. gaia/eval/webapp/node_modules/qs/dist/qs.js +90 -0
  619. gaia/eval/webapp/node_modules/qs/lib/formats.js +23 -0
  620. gaia/eval/webapp/node_modules/qs/lib/index.js +11 -0
  621. gaia/eval/webapp/node_modules/qs/lib/parse.js +296 -0
  622. gaia/eval/webapp/node_modules/qs/lib/stringify.js +351 -0
  623. gaia/eval/webapp/node_modules/qs/lib/utils.js +265 -0
  624. gaia/eval/webapp/node_modules/qs/package.json +91 -0
  625. gaia/eval/webapp/node_modules/qs/test/empty-keys-cases.js +267 -0
  626. gaia/eval/webapp/node_modules/qs/test/parse.js +1170 -0
  627. gaia/eval/webapp/node_modules/qs/test/stringify.js +1298 -0
  628. gaia/eval/webapp/node_modules/qs/test/utils.js +136 -0
  629. gaia/eval/webapp/node_modules/range-parser/HISTORY.md +56 -0
  630. gaia/eval/webapp/node_modules/range-parser/LICENSE +23 -0
  631. gaia/eval/webapp/node_modules/range-parser/README.md +84 -0
  632. gaia/eval/webapp/node_modules/range-parser/index.js +162 -0
  633. gaia/eval/webapp/node_modules/range-parser/package.json +44 -0
  634. gaia/eval/webapp/node_modules/raw-body/HISTORY.md +308 -0
  635. gaia/eval/webapp/node_modules/raw-body/LICENSE +22 -0
  636. gaia/eval/webapp/node_modules/raw-body/README.md +223 -0
  637. gaia/eval/webapp/node_modules/raw-body/SECURITY.md +24 -0
  638. gaia/eval/webapp/node_modules/raw-body/index.d.ts +87 -0
  639. gaia/eval/webapp/node_modules/raw-body/index.js +336 -0
  640. gaia/eval/webapp/node_modules/raw-body/package.json +49 -0
  641. gaia/eval/webapp/node_modules/safe-buffer/LICENSE +21 -0
  642. gaia/eval/webapp/node_modules/safe-buffer/README.md +584 -0
  643. gaia/eval/webapp/node_modules/safe-buffer/index.d.ts +187 -0
  644. gaia/eval/webapp/node_modules/safe-buffer/index.js +65 -0
  645. gaia/eval/webapp/node_modules/safe-buffer/package.json +51 -0
  646. gaia/eval/webapp/node_modules/safer-buffer/LICENSE +21 -0
  647. gaia/eval/webapp/node_modules/safer-buffer/Porting-Buffer.md +268 -0
  648. gaia/eval/webapp/node_modules/safer-buffer/Readme.md +156 -0
  649. gaia/eval/webapp/node_modules/safer-buffer/dangerous.js +58 -0
  650. gaia/eval/webapp/node_modules/safer-buffer/package.json +34 -0
  651. gaia/eval/webapp/node_modules/safer-buffer/safer.js +77 -0
  652. gaia/eval/webapp/node_modules/safer-buffer/tests.js +406 -0
  653. gaia/eval/webapp/node_modules/send/HISTORY.md +526 -0
  654. gaia/eval/webapp/node_modules/send/LICENSE +23 -0
  655. gaia/eval/webapp/node_modules/send/README.md +327 -0
  656. gaia/eval/webapp/node_modules/send/SECURITY.md +24 -0
  657. gaia/eval/webapp/node_modules/send/index.js +1142 -0
  658. gaia/eval/webapp/node_modules/send/node_modules/encodeurl/HISTORY.md +14 -0
  659. gaia/eval/webapp/node_modules/send/node_modules/encodeurl/LICENSE +22 -0
  660. gaia/eval/webapp/node_modules/send/node_modules/encodeurl/README.md +128 -0
  661. gaia/eval/webapp/node_modules/send/node_modules/encodeurl/index.js +60 -0
  662. gaia/eval/webapp/node_modules/send/node_modules/encodeurl/package.json +40 -0
  663. gaia/eval/webapp/node_modules/send/node_modules/ms/index.js +162 -0
  664. gaia/eval/webapp/node_modules/send/node_modules/ms/license.md +21 -0
  665. gaia/eval/webapp/node_modules/send/node_modules/ms/package.json +38 -0
  666. gaia/eval/webapp/node_modules/send/node_modules/ms/readme.md +59 -0
  667. gaia/eval/webapp/node_modules/send/package.json +62 -0
  668. gaia/eval/webapp/node_modules/serve-static/HISTORY.md +487 -0
  669. gaia/eval/webapp/node_modules/serve-static/LICENSE +25 -0
  670. gaia/eval/webapp/node_modules/serve-static/README.md +257 -0
  671. gaia/eval/webapp/node_modules/serve-static/index.js +209 -0
  672. gaia/eval/webapp/node_modules/serve-static/package.json +42 -0
  673. gaia/eval/webapp/node_modules/setprototypeof/LICENSE +13 -0
  674. gaia/eval/webapp/node_modules/setprototypeof/README.md +31 -0
  675. gaia/eval/webapp/node_modules/setprototypeof/index.d.ts +2 -0
  676. gaia/eval/webapp/node_modules/setprototypeof/index.js +17 -0
  677. gaia/eval/webapp/node_modules/setprototypeof/package.json +38 -0
  678. gaia/eval/webapp/node_modules/setprototypeof/test/index.js +24 -0
  679. gaia/eval/webapp/node_modules/side-channel/.editorconfig +9 -0
  680. gaia/eval/webapp/node_modules/side-channel/.eslintrc +12 -0
  681. gaia/eval/webapp/node_modules/side-channel/.github/FUNDING.yml +12 -0
  682. gaia/eval/webapp/node_modules/side-channel/.nycrc +13 -0
  683. gaia/eval/webapp/node_modules/side-channel/CHANGELOG.md +110 -0
  684. gaia/eval/webapp/node_modules/side-channel/LICENSE +21 -0
  685. gaia/eval/webapp/node_modules/side-channel/README.md +61 -0
  686. gaia/eval/webapp/node_modules/side-channel/index.d.ts +14 -0
  687. gaia/eval/webapp/node_modules/side-channel/index.js +43 -0
  688. gaia/eval/webapp/node_modules/side-channel/package.json +85 -0
  689. gaia/eval/webapp/node_modules/side-channel/test/index.js +104 -0
  690. gaia/eval/webapp/node_modules/side-channel/tsconfig.json +9 -0
  691. gaia/eval/webapp/node_modules/side-channel-list/.editorconfig +9 -0
  692. gaia/eval/webapp/node_modules/side-channel-list/.eslintrc +11 -0
  693. gaia/eval/webapp/node_modules/side-channel-list/.github/FUNDING.yml +12 -0
  694. gaia/eval/webapp/node_modules/side-channel-list/.nycrc +13 -0
  695. gaia/eval/webapp/node_modules/side-channel-list/CHANGELOG.md +15 -0
  696. gaia/eval/webapp/node_modules/side-channel-list/LICENSE +21 -0
  697. gaia/eval/webapp/node_modules/side-channel-list/README.md +62 -0
  698. gaia/eval/webapp/node_modules/side-channel-list/index.d.ts +13 -0
  699. gaia/eval/webapp/node_modules/side-channel-list/index.js +113 -0
  700. gaia/eval/webapp/node_modules/side-channel-list/list.d.ts +14 -0
  701. gaia/eval/webapp/node_modules/side-channel-list/package.json +77 -0
  702. gaia/eval/webapp/node_modules/side-channel-list/test/index.js +104 -0
  703. gaia/eval/webapp/node_modules/side-channel-list/tsconfig.json +9 -0
  704. gaia/eval/webapp/node_modules/side-channel-map/.editorconfig +9 -0
  705. gaia/eval/webapp/node_modules/side-channel-map/.eslintrc +11 -0
  706. gaia/eval/webapp/node_modules/side-channel-map/.github/FUNDING.yml +12 -0
  707. gaia/eval/webapp/node_modules/side-channel-map/.nycrc +13 -0
  708. gaia/eval/webapp/node_modules/side-channel-map/CHANGELOG.md +22 -0
  709. gaia/eval/webapp/node_modules/side-channel-map/LICENSE +21 -0
  710. gaia/eval/webapp/node_modules/side-channel-map/README.md +62 -0
  711. gaia/eval/webapp/node_modules/side-channel-map/index.d.ts +15 -0
  712. gaia/eval/webapp/node_modules/side-channel-map/index.js +68 -0
  713. gaia/eval/webapp/node_modules/side-channel-map/package.json +80 -0
  714. gaia/eval/webapp/node_modules/side-channel-map/test/index.js +114 -0
  715. gaia/eval/webapp/node_modules/side-channel-map/tsconfig.json +9 -0
  716. gaia/eval/webapp/node_modules/side-channel-weakmap/.editorconfig +9 -0
  717. gaia/eval/webapp/node_modules/side-channel-weakmap/.eslintrc +12 -0
  718. gaia/eval/webapp/node_modules/side-channel-weakmap/.github/FUNDING.yml +12 -0
  719. gaia/eval/webapp/node_modules/side-channel-weakmap/.nycrc +13 -0
  720. gaia/eval/webapp/node_modules/side-channel-weakmap/CHANGELOG.md +28 -0
  721. gaia/eval/webapp/node_modules/side-channel-weakmap/LICENSE +21 -0
  722. gaia/eval/webapp/node_modules/side-channel-weakmap/README.md +62 -0
  723. gaia/eval/webapp/node_modules/side-channel-weakmap/index.d.ts +15 -0
  724. gaia/eval/webapp/node_modules/side-channel-weakmap/index.js +84 -0
  725. gaia/eval/webapp/node_modules/side-channel-weakmap/package.json +87 -0
  726. gaia/eval/webapp/node_modules/side-channel-weakmap/test/index.js +114 -0
  727. gaia/eval/webapp/node_modules/side-channel-weakmap/tsconfig.json +9 -0
  728. gaia/eval/webapp/node_modules/statuses/HISTORY.md +82 -0
  729. gaia/eval/webapp/node_modules/statuses/LICENSE +23 -0
  730. gaia/eval/webapp/node_modules/statuses/README.md +136 -0
  731. gaia/eval/webapp/node_modules/statuses/codes.json +65 -0
  732. gaia/eval/webapp/node_modules/statuses/index.js +146 -0
  733. gaia/eval/webapp/node_modules/statuses/package.json +49 -0
  734. gaia/eval/webapp/node_modules/toidentifier/HISTORY.md +9 -0
  735. gaia/eval/webapp/node_modules/toidentifier/LICENSE +21 -0
  736. gaia/eval/webapp/node_modules/toidentifier/README.md +61 -0
  737. gaia/eval/webapp/node_modules/toidentifier/index.js +32 -0
  738. gaia/eval/webapp/node_modules/toidentifier/package.json +38 -0
  739. gaia/eval/webapp/node_modules/type-is/HISTORY.md +259 -0
  740. gaia/eval/webapp/node_modules/type-is/LICENSE +23 -0
  741. gaia/eval/webapp/node_modules/type-is/README.md +170 -0
  742. gaia/eval/webapp/node_modules/type-is/index.js +266 -0
  743. gaia/eval/webapp/node_modules/type-is/package.json +45 -0
  744. gaia/eval/webapp/node_modules/unpipe/HISTORY.md +4 -0
  745. gaia/eval/webapp/node_modules/unpipe/LICENSE +22 -0
  746. gaia/eval/webapp/node_modules/unpipe/README.md +43 -0
  747. gaia/eval/webapp/node_modules/unpipe/index.js +69 -0
  748. gaia/eval/webapp/node_modules/unpipe/package.json +27 -0
  749. gaia/eval/webapp/node_modules/util/LICENSE +18 -0
  750. gaia/eval/webapp/node_modules/util/README.md +15 -0
  751. gaia/eval/webapp/node_modules/util/node_modules/inherits/LICENSE +16 -0
  752. gaia/eval/webapp/node_modules/util/node_modules/inherits/README.md +42 -0
  753. gaia/eval/webapp/node_modules/util/node_modules/inherits/inherits.js +7 -0
  754. gaia/eval/webapp/node_modules/util/node_modules/inherits/inherits_browser.js +23 -0
  755. gaia/eval/webapp/node_modules/util/node_modules/inherits/package.json +29 -0
  756. gaia/eval/webapp/node_modules/util/package.json +35 -0
  757. gaia/eval/webapp/node_modules/util/support/isBuffer.js +3 -0
  758. gaia/eval/webapp/node_modules/util/support/isBufferBrowser.js +6 -0
  759. gaia/eval/webapp/node_modules/util/util.js +586 -0
  760. gaia/eval/webapp/node_modules/utils-merge/.npmignore +9 -0
  761. gaia/eval/webapp/node_modules/utils-merge/LICENSE +20 -0
  762. gaia/eval/webapp/node_modules/utils-merge/README.md +34 -0
  763. gaia/eval/webapp/node_modules/utils-merge/index.js +23 -0
  764. gaia/eval/webapp/node_modules/utils-merge/package.json +40 -0
  765. gaia/eval/webapp/node_modules/vary/HISTORY.md +39 -0
  766. gaia/eval/webapp/node_modules/vary/LICENSE +22 -0
  767. gaia/eval/webapp/node_modules/vary/README.md +101 -0
  768. gaia/eval/webapp/node_modules/vary/index.js +149 -0
  769. gaia/eval/webapp/node_modules/vary/package.json +43 -0
  770. gaia/eval/webapp/package-lock.json +875 -0
  771. gaia/eval/webapp/package.json +21 -0
  772. gaia/eval/webapp/public/app.js +3403 -0
  773. gaia/eval/webapp/public/index.html +88 -0
  774. gaia/eval/webapp/public/styles.css +3661 -0
  775. gaia/eval/webapp/server.js +416 -0
  776. gaia/eval/webapp/test-setup.js +73 -0
  777. gaia/llm/__init__.py +2 -0
  778. gaia/llm/lemonade_client.py +3083 -0
  779. gaia/llm/lemonade_manager.py +269 -0
  780. gaia/llm/llm_client.py +729 -0
  781. gaia/llm/vlm_client.py +307 -0
  782. gaia/logger.py +189 -0
  783. gaia/mcp/agent_mcp_server.py +245 -0
  784. gaia/mcp/blender_mcp_client.py +138 -0
  785. gaia/mcp/blender_mcp_server.py +648 -0
  786. gaia/mcp/context7_cache.py +332 -0
  787. gaia/mcp/external_services.py +518 -0
  788. gaia/mcp/mcp_bridge.py +550 -0
  789. gaia/mcp/servers/__init__.py +6 -0
  790. gaia/mcp/servers/docker_mcp.py +83 -0
  791. gaia/rag/__init__.py +10 -0
  792. gaia/rag/app.py +293 -0
  793. gaia/rag/demo.py +304 -0
  794. gaia/rag/pdf_utils.py +235 -0
  795. gaia/rag/sdk.py +2194 -0
  796. gaia/security.py +163 -0
  797. gaia/talk/app.py +289 -0
  798. gaia/talk/sdk.py +538 -0
  799. gaia/util.py +46 -0
  800. gaia/version.py +100 -0
@@ -0,0 +1,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
+ }