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