amd-gaia 0.14.1__py3-none-any.whl → 0.14.3__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 (794) hide show
  1. amd_gaia-0.14.3.dist-info/METADATA +223 -0
  2. amd_gaia-0.14.3.dist-info/RECORD +168 -0
  3. {amd_gaia-0.14.1.dist-info → amd_gaia-0.14.3.dist-info}/entry_points.txt +1 -0
  4. gaia/__init__.py +28 -1
  5. gaia/agents/__init__.py +1 -1
  6. gaia/agents/base/__init__.py +1 -1
  7. gaia/agents/base/agent.py +142 -37
  8. gaia/agents/base/api_agent.py +1 -1
  9. gaia/agents/base/console.py +400 -16
  10. gaia/agents/base/errors.py +237 -0
  11. gaia/agents/base/mcp_agent.py +1 -1
  12. gaia/agents/base/tools.py +1 -1
  13. gaia/agents/blender/agent.py +1 -1
  14. gaia/agents/blender/agent_simple.py +1 -1
  15. gaia/agents/blender/app.py +1 -1
  16. gaia/agents/blender/app_simple.py +1 -1
  17. gaia/agents/blender/core/__init__.py +1 -1
  18. gaia/agents/blender/core/materials.py +1 -1
  19. gaia/agents/blender/core/objects.py +1 -1
  20. gaia/agents/blender/core/rendering.py +1 -1
  21. gaia/agents/blender/core/scene.py +1 -1
  22. gaia/agents/blender/core/view.py +1 -1
  23. gaia/agents/chat/__init__.py +1 -1
  24. gaia/agents/chat/agent.py +41 -181
  25. gaia/agents/chat/app.py +1 -1
  26. gaia/agents/chat/session.py +1 -1
  27. gaia/agents/chat/tools/__init__.py +1 -1
  28. gaia/agents/chat/tools/file_tools.py +1 -1
  29. gaia/agents/chat/tools/rag_tools.py +1 -1
  30. gaia/agents/chat/tools/shell_tools.py +1 -1
  31. gaia/agents/code/__init__.py +1 -1
  32. gaia/agents/code/agent.py +3 -1
  33. gaia/agents/code/orchestration/__init__.py +1 -1
  34. gaia/agents/code/orchestration/checklist_executor.py +27 -3
  35. gaia/agents/code/orchestration/checklist_generator.py +8 -4
  36. gaia/agents/code/orchestration/factories/__init__.py +1 -1
  37. gaia/agents/code/orchestration/factories/base.py +1 -1
  38. gaia/agents/code/orchestration/factories/nextjs_factory.py +1 -1
  39. gaia/agents/code/orchestration/factories/python_factory.py +1 -1
  40. gaia/agents/code/orchestration/orchestrator.py +276 -45
  41. gaia/agents/code/orchestration/project_analyzer.py +1 -1
  42. gaia/agents/code/orchestration/steps/__init__.py +1 -1
  43. gaia/agents/code/orchestration/steps/base.py +1 -1
  44. gaia/agents/code/orchestration/steps/error_handler.py +2 -2
  45. gaia/agents/code/orchestration/steps/nextjs.py +1 -1
  46. gaia/agents/code/orchestration/steps/python.py +1 -1
  47. gaia/agents/code/orchestration/template_catalog.py +8 -2
  48. gaia/agents/code/orchestration/workflows/__init__.py +1 -1
  49. gaia/agents/code/orchestration/workflows/base.py +1 -1
  50. gaia/agents/code/orchestration/workflows/nextjs.py +1 -1
  51. gaia/agents/code/orchestration/workflows/python.py +1 -1
  52. gaia/agents/code/prompts/__init__.py +1 -1
  53. gaia/agents/code/prompts/base_prompt.py +1 -1
  54. gaia/agents/code/prompts/code_patterns.py +129 -18
  55. gaia/agents/code/prompts/nextjs_prompt.py +1 -1
  56. gaia/agents/code/prompts/python_prompt.py +1 -1
  57. gaia/agents/code/schema_inference.py +1 -1
  58. gaia/agents/code/system_prompt.py +1 -1
  59. gaia/agents/code/tools/__init__.py +1 -1
  60. gaia/agents/code/tools/cli_tools.py +1 -1
  61. gaia/agents/code/tools/code_formatting.py +2 -2
  62. gaia/agents/code/tools/code_tools.py +2 -2
  63. gaia/agents/code/tools/error_fixing.py +1 -1
  64. gaia/agents/code/tools/external_tools.py +1 -1
  65. gaia/agents/code/tools/prisma_tools.py +1 -1
  66. gaia/agents/code/tools/project_management.py +1 -1
  67. gaia/agents/code/tools/testing.py +1 -1
  68. gaia/agents/code/tools/typescript_tools.py +1 -1
  69. gaia/agents/code/tools/validation_parsing.py +1 -1
  70. gaia/agents/code/tools/validation_tools.py +5 -2
  71. gaia/agents/code/tools/web_dev_tools.py +17 -3
  72. gaia/agents/docker/__init__.py +1 -1
  73. gaia/agents/emr/__init__.py +8 -0
  74. gaia/agents/emr/agent.py +1506 -0
  75. gaia/agents/emr/cli.py +1322 -0
  76. gaia/agents/emr/constants.py +475 -0
  77. gaia/agents/emr/dashboard/__init__.py +4 -0
  78. gaia/agents/emr/dashboard/server.py +1974 -0
  79. gaia/agents/routing/__init__.py +1 -1
  80. gaia/agents/routing/agent.py +65 -7
  81. gaia/agents/routing/system_prompt.py +1 -1
  82. gaia/api/__init__.py +1 -1
  83. gaia/api/agent_registry.py +1 -1
  84. gaia/api/app.py +1 -1
  85. gaia/api/openai_server.py +1 -1
  86. gaia/api/schemas.py +1 -1
  87. gaia/api/sse_handler.py +5 -2
  88. gaia/apps/__init__.py +1 -1
  89. gaia/apps/llm/__init__.py +1 -1
  90. gaia/apps/summarize/pdf_formatter.py +1 -1
  91. gaia/audio/__init__.py +1 -1
  92. gaia/audio/audio_client.py +3 -3
  93. gaia/audio/audio_recorder.py +1 -1
  94. gaia/audio/kokoro_tts.py +3 -3
  95. gaia/audio/whisper_asr.py +3 -3
  96. gaia/chat/__init__.py +1 -1
  97. gaia/chat/prompts.py +1 -1
  98. gaia/chat/sdk.py +26 -1
  99. gaia/cli.py +18 -18
  100. gaia/database/__init__.py +10 -0
  101. gaia/database/agent.py +176 -0
  102. gaia/database/mixin.py +290 -0
  103. gaia/database/testing.py +64 -0
  104. gaia/eval/batch_experiment.py +2 -2
  105. gaia/eval/claude.py +5 -5
  106. gaia/eval/config.py +1 -1
  107. gaia/eval/email_generator.py +1 -1
  108. gaia/eval/eval.py +1 -1
  109. gaia/eval/groundtruth.py +1 -1
  110. gaia/eval/transcript_generator.py +1 -1
  111. gaia/eval/webapp/public/app.js +1 -1
  112. gaia/eval/webapp/server.js +1 -1
  113. gaia/eval/webapp/test-setup.js +1 -1
  114. gaia/llm/__init__.py +1 -1
  115. gaia/llm/lemonade_client.py +149 -11
  116. gaia/llm/lemonade_manager.py +36 -11
  117. gaia/llm/llm_client.py +2 -2
  118. gaia/llm/vlm_client.py +93 -18
  119. gaia/logger.py +1 -1
  120. gaia/mcp/agent_mcp_server.py +1 -1
  121. gaia/mcp/blender_mcp_client.py +1 -1
  122. gaia/mcp/blender_mcp_server.py +1 -1
  123. gaia/mcp/context7_cache.py +1 -1
  124. gaia/mcp/servers/__init__.py +1 -1
  125. gaia/mcp/servers/docker_mcp.py +1 -1
  126. gaia/rag/demo.py +5 -5
  127. gaia/rag/pdf_utils.py +1 -1
  128. gaia/rag/sdk.py +2 -2
  129. gaia/security.py +1 -1
  130. gaia/talk/sdk.py +1 -1
  131. gaia/testing/__init__.py +87 -0
  132. gaia/testing/assertions.py +330 -0
  133. gaia/testing/fixtures.py +333 -0
  134. gaia/testing/mocks.py +493 -0
  135. gaia/util.py +1 -1
  136. gaia/utils/__init__.py +33 -0
  137. gaia/utils/file_watcher.py +675 -0
  138. gaia/utils/parsing.py +223 -0
  139. gaia/version.py +2 -2
  140. amd_gaia-0.14.1.dist-info/METADATA +0 -768
  141. amd_gaia-0.14.1.dist-info/RECORD +0 -800
  142. gaia/eval/webapp/node_modules/.bin/mime +0 -16
  143. gaia/eval/webapp/node_modules/.bin/mime.cmd +0 -17
  144. gaia/eval/webapp/node_modules/.bin/mime.ps1 +0 -28
  145. gaia/eval/webapp/node_modules/.package-lock.json +0 -865
  146. gaia/eval/webapp/node_modules/accepts/HISTORY.md +0 -243
  147. gaia/eval/webapp/node_modules/accepts/LICENSE +0 -23
  148. gaia/eval/webapp/node_modules/accepts/README.md +0 -140
  149. gaia/eval/webapp/node_modules/accepts/index.js +0 -238
  150. gaia/eval/webapp/node_modules/accepts/package.json +0 -47
  151. gaia/eval/webapp/node_modules/array-flatten/LICENSE +0 -21
  152. gaia/eval/webapp/node_modules/array-flatten/README.md +0 -43
  153. gaia/eval/webapp/node_modules/array-flatten/array-flatten.js +0 -64
  154. gaia/eval/webapp/node_modules/array-flatten/package.json +0 -39
  155. gaia/eval/webapp/node_modules/body-parser/HISTORY.md +0 -672
  156. gaia/eval/webapp/node_modules/body-parser/LICENSE +0 -23
  157. gaia/eval/webapp/node_modules/body-parser/README.md +0 -476
  158. gaia/eval/webapp/node_modules/body-parser/SECURITY.md +0 -25
  159. gaia/eval/webapp/node_modules/body-parser/index.js +0 -156
  160. gaia/eval/webapp/node_modules/body-parser/lib/read.js +0 -205
  161. gaia/eval/webapp/node_modules/body-parser/lib/types/json.js +0 -247
  162. gaia/eval/webapp/node_modules/body-parser/lib/types/raw.js +0 -101
  163. gaia/eval/webapp/node_modules/body-parser/lib/types/text.js +0 -121
  164. gaia/eval/webapp/node_modules/body-parser/lib/types/urlencoded.js +0 -307
  165. gaia/eval/webapp/node_modules/body-parser/package.json +0 -56
  166. gaia/eval/webapp/node_modules/bytes/History.md +0 -97
  167. gaia/eval/webapp/node_modules/bytes/LICENSE +0 -23
  168. gaia/eval/webapp/node_modules/bytes/Readme.md +0 -152
  169. gaia/eval/webapp/node_modules/bytes/index.js +0 -170
  170. gaia/eval/webapp/node_modules/bytes/package.json +0 -42
  171. gaia/eval/webapp/node_modules/call-bind-apply-helpers/.eslintrc +0 -17
  172. gaia/eval/webapp/node_modules/call-bind-apply-helpers/.github/FUNDING.yml +0 -12
  173. gaia/eval/webapp/node_modules/call-bind-apply-helpers/.nycrc +0 -9
  174. gaia/eval/webapp/node_modules/call-bind-apply-helpers/CHANGELOG.md +0 -30
  175. gaia/eval/webapp/node_modules/call-bind-apply-helpers/LICENSE +0 -21
  176. gaia/eval/webapp/node_modules/call-bind-apply-helpers/README.md +0 -62
  177. gaia/eval/webapp/node_modules/call-bind-apply-helpers/actualApply.d.ts +0 -1
  178. gaia/eval/webapp/node_modules/call-bind-apply-helpers/actualApply.js +0 -10
  179. gaia/eval/webapp/node_modules/call-bind-apply-helpers/applyBind.d.ts +0 -19
  180. gaia/eval/webapp/node_modules/call-bind-apply-helpers/applyBind.js +0 -10
  181. gaia/eval/webapp/node_modules/call-bind-apply-helpers/functionApply.d.ts +0 -1
  182. gaia/eval/webapp/node_modules/call-bind-apply-helpers/functionApply.js +0 -4
  183. gaia/eval/webapp/node_modules/call-bind-apply-helpers/functionCall.d.ts +0 -1
  184. gaia/eval/webapp/node_modules/call-bind-apply-helpers/functionCall.js +0 -4
  185. gaia/eval/webapp/node_modules/call-bind-apply-helpers/index.d.ts +0 -64
  186. gaia/eval/webapp/node_modules/call-bind-apply-helpers/index.js +0 -15
  187. gaia/eval/webapp/node_modules/call-bind-apply-helpers/package.json +0 -85
  188. gaia/eval/webapp/node_modules/call-bind-apply-helpers/reflectApply.d.ts +0 -3
  189. gaia/eval/webapp/node_modules/call-bind-apply-helpers/reflectApply.js +0 -4
  190. gaia/eval/webapp/node_modules/call-bind-apply-helpers/test/index.js +0 -63
  191. gaia/eval/webapp/node_modules/call-bind-apply-helpers/tsconfig.json +0 -9
  192. gaia/eval/webapp/node_modules/call-bound/.eslintrc +0 -13
  193. gaia/eval/webapp/node_modules/call-bound/.github/FUNDING.yml +0 -12
  194. gaia/eval/webapp/node_modules/call-bound/.nycrc +0 -9
  195. gaia/eval/webapp/node_modules/call-bound/CHANGELOG.md +0 -42
  196. gaia/eval/webapp/node_modules/call-bound/LICENSE +0 -21
  197. gaia/eval/webapp/node_modules/call-bound/README.md +0 -53
  198. gaia/eval/webapp/node_modules/call-bound/index.d.ts +0 -94
  199. gaia/eval/webapp/node_modules/call-bound/index.js +0 -19
  200. gaia/eval/webapp/node_modules/call-bound/package.json +0 -99
  201. gaia/eval/webapp/node_modules/call-bound/test/index.js +0 -61
  202. gaia/eval/webapp/node_modules/call-bound/tsconfig.json +0 -10
  203. gaia/eval/webapp/node_modules/content-disposition/HISTORY.md +0 -60
  204. gaia/eval/webapp/node_modules/content-disposition/LICENSE +0 -22
  205. gaia/eval/webapp/node_modules/content-disposition/README.md +0 -142
  206. gaia/eval/webapp/node_modules/content-disposition/index.js +0 -458
  207. gaia/eval/webapp/node_modules/content-disposition/package.json +0 -44
  208. gaia/eval/webapp/node_modules/content-type/HISTORY.md +0 -29
  209. gaia/eval/webapp/node_modules/content-type/LICENSE +0 -22
  210. gaia/eval/webapp/node_modules/content-type/README.md +0 -94
  211. gaia/eval/webapp/node_modules/content-type/index.js +0 -225
  212. gaia/eval/webapp/node_modules/content-type/package.json +0 -42
  213. gaia/eval/webapp/node_modules/cookie/LICENSE +0 -24
  214. gaia/eval/webapp/node_modules/cookie/README.md +0 -317
  215. gaia/eval/webapp/node_modules/cookie/SECURITY.md +0 -25
  216. gaia/eval/webapp/node_modules/cookie/index.js +0 -334
  217. gaia/eval/webapp/node_modules/cookie/package.json +0 -44
  218. gaia/eval/webapp/node_modules/cookie-signature/.npmignore +0 -4
  219. gaia/eval/webapp/node_modules/cookie-signature/History.md +0 -38
  220. gaia/eval/webapp/node_modules/cookie-signature/Readme.md +0 -42
  221. gaia/eval/webapp/node_modules/cookie-signature/index.js +0 -51
  222. gaia/eval/webapp/node_modules/cookie-signature/package.json +0 -18
  223. gaia/eval/webapp/node_modules/debug/.coveralls.yml +0 -1
  224. gaia/eval/webapp/node_modules/debug/.eslintrc +0 -11
  225. gaia/eval/webapp/node_modules/debug/.npmignore +0 -9
  226. gaia/eval/webapp/node_modules/debug/.travis.yml +0 -14
  227. gaia/eval/webapp/node_modules/debug/CHANGELOG.md +0 -362
  228. gaia/eval/webapp/node_modules/debug/LICENSE +0 -19
  229. gaia/eval/webapp/node_modules/debug/Makefile +0 -50
  230. gaia/eval/webapp/node_modules/debug/README.md +0 -312
  231. gaia/eval/webapp/node_modules/debug/component.json +0 -19
  232. gaia/eval/webapp/node_modules/debug/karma.conf.js +0 -70
  233. gaia/eval/webapp/node_modules/debug/node.js +0 -1
  234. gaia/eval/webapp/node_modules/debug/package.json +0 -49
  235. gaia/eval/webapp/node_modules/debug/src/browser.js +0 -185
  236. gaia/eval/webapp/node_modules/debug/src/debug.js +0 -202
  237. gaia/eval/webapp/node_modules/debug/src/index.js +0 -10
  238. gaia/eval/webapp/node_modules/debug/src/inspector-log.js +0 -15
  239. gaia/eval/webapp/node_modules/debug/src/node.js +0 -248
  240. gaia/eval/webapp/node_modules/depd/History.md +0 -103
  241. gaia/eval/webapp/node_modules/depd/LICENSE +0 -22
  242. gaia/eval/webapp/node_modules/depd/Readme.md +0 -280
  243. gaia/eval/webapp/node_modules/depd/index.js +0 -538
  244. gaia/eval/webapp/node_modules/depd/lib/browser/index.js +0 -77
  245. gaia/eval/webapp/node_modules/depd/package.json +0 -45
  246. gaia/eval/webapp/node_modules/destroy/LICENSE +0 -23
  247. gaia/eval/webapp/node_modules/destroy/README.md +0 -63
  248. gaia/eval/webapp/node_modules/destroy/index.js +0 -209
  249. gaia/eval/webapp/node_modules/destroy/package.json +0 -48
  250. gaia/eval/webapp/node_modules/dunder-proto/.eslintrc +0 -5
  251. gaia/eval/webapp/node_modules/dunder-proto/.github/FUNDING.yml +0 -12
  252. gaia/eval/webapp/node_modules/dunder-proto/.nycrc +0 -13
  253. gaia/eval/webapp/node_modules/dunder-proto/CHANGELOG.md +0 -24
  254. gaia/eval/webapp/node_modules/dunder-proto/LICENSE +0 -21
  255. gaia/eval/webapp/node_modules/dunder-proto/README.md +0 -54
  256. gaia/eval/webapp/node_modules/dunder-proto/get.d.ts +0 -5
  257. gaia/eval/webapp/node_modules/dunder-proto/get.js +0 -30
  258. gaia/eval/webapp/node_modules/dunder-proto/package.json +0 -76
  259. gaia/eval/webapp/node_modules/dunder-proto/set.d.ts +0 -5
  260. gaia/eval/webapp/node_modules/dunder-proto/set.js +0 -35
  261. gaia/eval/webapp/node_modules/dunder-proto/test/get.js +0 -34
  262. gaia/eval/webapp/node_modules/dunder-proto/test/index.js +0 -4
  263. gaia/eval/webapp/node_modules/dunder-proto/test/set.js +0 -50
  264. gaia/eval/webapp/node_modules/dunder-proto/tsconfig.json +0 -9
  265. gaia/eval/webapp/node_modules/ee-first/LICENSE +0 -22
  266. gaia/eval/webapp/node_modules/ee-first/README.md +0 -80
  267. gaia/eval/webapp/node_modules/ee-first/index.js +0 -95
  268. gaia/eval/webapp/node_modules/ee-first/package.json +0 -29
  269. gaia/eval/webapp/node_modules/encodeurl/LICENSE +0 -22
  270. gaia/eval/webapp/node_modules/encodeurl/README.md +0 -109
  271. gaia/eval/webapp/node_modules/encodeurl/index.js +0 -60
  272. gaia/eval/webapp/node_modules/encodeurl/package.json +0 -40
  273. gaia/eval/webapp/node_modules/es-define-property/.eslintrc +0 -13
  274. gaia/eval/webapp/node_modules/es-define-property/.github/FUNDING.yml +0 -12
  275. gaia/eval/webapp/node_modules/es-define-property/.nycrc +0 -9
  276. gaia/eval/webapp/node_modules/es-define-property/CHANGELOG.md +0 -29
  277. gaia/eval/webapp/node_modules/es-define-property/LICENSE +0 -21
  278. gaia/eval/webapp/node_modules/es-define-property/README.md +0 -49
  279. gaia/eval/webapp/node_modules/es-define-property/index.d.ts +0 -3
  280. gaia/eval/webapp/node_modules/es-define-property/index.js +0 -14
  281. gaia/eval/webapp/node_modules/es-define-property/package.json +0 -81
  282. gaia/eval/webapp/node_modules/es-define-property/test/index.js +0 -56
  283. gaia/eval/webapp/node_modules/es-define-property/tsconfig.json +0 -10
  284. gaia/eval/webapp/node_modules/es-errors/.eslintrc +0 -5
  285. gaia/eval/webapp/node_modules/es-errors/.github/FUNDING.yml +0 -12
  286. gaia/eval/webapp/node_modules/es-errors/CHANGELOG.md +0 -40
  287. gaia/eval/webapp/node_modules/es-errors/LICENSE +0 -21
  288. gaia/eval/webapp/node_modules/es-errors/README.md +0 -55
  289. gaia/eval/webapp/node_modules/es-errors/eval.d.ts +0 -3
  290. gaia/eval/webapp/node_modules/es-errors/eval.js +0 -4
  291. gaia/eval/webapp/node_modules/es-errors/index.d.ts +0 -3
  292. gaia/eval/webapp/node_modules/es-errors/index.js +0 -4
  293. gaia/eval/webapp/node_modules/es-errors/package.json +0 -80
  294. gaia/eval/webapp/node_modules/es-errors/range.d.ts +0 -3
  295. gaia/eval/webapp/node_modules/es-errors/range.js +0 -4
  296. gaia/eval/webapp/node_modules/es-errors/ref.d.ts +0 -3
  297. gaia/eval/webapp/node_modules/es-errors/ref.js +0 -4
  298. gaia/eval/webapp/node_modules/es-errors/syntax.d.ts +0 -3
  299. gaia/eval/webapp/node_modules/es-errors/syntax.js +0 -4
  300. gaia/eval/webapp/node_modules/es-errors/test/index.js +0 -19
  301. gaia/eval/webapp/node_modules/es-errors/tsconfig.json +0 -49
  302. gaia/eval/webapp/node_modules/es-errors/type.d.ts +0 -3
  303. gaia/eval/webapp/node_modules/es-errors/type.js +0 -4
  304. gaia/eval/webapp/node_modules/es-errors/uri.d.ts +0 -3
  305. gaia/eval/webapp/node_modules/es-errors/uri.js +0 -4
  306. gaia/eval/webapp/node_modules/es-object-atoms/.eslintrc +0 -16
  307. gaia/eval/webapp/node_modules/es-object-atoms/.github/FUNDING.yml +0 -12
  308. gaia/eval/webapp/node_modules/es-object-atoms/CHANGELOG.md +0 -37
  309. gaia/eval/webapp/node_modules/es-object-atoms/LICENSE +0 -21
  310. gaia/eval/webapp/node_modules/es-object-atoms/README.md +0 -63
  311. gaia/eval/webapp/node_modules/es-object-atoms/RequireObjectCoercible.d.ts +0 -3
  312. gaia/eval/webapp/node_modules/es-object-atoms/RequireObjectCoercible.js +0 -11
  313. gaia/eval/webapp/node_modules/es-object-atoms/ToObject.d.ts +0 -7
  314. gaia/eval/webapp/node_modules/es-object-atoms/ToObject.js +0 -10
  315. gaia/eval/webapp/node_modules/es-object-atoms/index.d.ts +0 -3
  316. gaia/eval/webapp/node_modules/es-object-atoms/index.js +0 -4
  317. gaia/eval/webapp/node_modules/es-object-atoms/isObject.d.ts +0 -3
  318. gaia/eval/webapp/node_modules/es-object-atoms/isObject.js +0 -6
  319. gaia/eval/webapp/node_modules/es-object-atoms/package.json +0 -80
  320. gaia/eval/webapp/node_modules/es-object-atoms/test/index.js +0 -38
  321. gaia/eval/webapp/node_modules/es-object-atoms/tsconfig.json +0 -6
  322. gaia/eval/webapp/node_modules/escape-html/LICENSE +0 -24
  323. gaia/eval/webapp/node_modules/escape-html/Readme.md +0 -43
  324. gaia/eval/webapp/node_modules/escape-html/index.js +0 -78
  325. gaia/eval/webapp/node_modules/escape-html/package.json +0 -24
  326. gaia/eval/webapp/node_modules/etag/HISTORY.md +0 -83
  327. gaia/eval/webapp/node_modules/etag/LICENSE +0 -22
  328. gaia/eval/webapp/node_modules/etag/README.md +0 -159
  329. gaia/eval/webapp/node_modules/etag/index.js +0 -131
  330. gaia/eval/webapp/node_modules/etag/package.json +0 -47
  331. gaia/eval/webapp/node_modules/express/History.md +0 -3656
  332. gaia/eval/webapp/node_modules/express/LICENSE +0 -24
  333. gaia/eval/webapp/node_modules/express/Readme.md +0 -260
  334. gaia/eval/webapp/node_modules/express/index.js +0 -11
  335. gaia/eval/webapp/node_modules/express/lib/application.js +0 -661
  336. gaia/eval/webapp/node_modules/express/lib/express.js +0 -116
  337. gaia/eval/webapp/node_modules/express/lib/middleware/init.js +0 -43
  338. gaia/eval/webapp/node_modules/express/lib/middleware/query.js +0 -47
  339. gaia/eval/webapp/node_modules/express/lib/request.js +0 -525
  340. gaia/eval/webapp/node_modules/express/lib/response.js +0 -1179
  341. gaia/eval/webapp/node_modules/express/lib/router/index.js +0 -673
  342. gaia/eval/webapp/node_modules/express/lib/router/layer.js +0 -181
  343. gaia/eval/webapp/node_modules/express/lib/router/route.js +0 -230
  344. gaia/eval/webapp/node_modules/express/lib/utils.js +0 -303
  345. gaia/eval/webapp/node_modules/express/lib/view.js +0 -182
  346. gaia/eval/webapp/node_modules/express/package.json +0 -102
  347. gaia/eval/webapp/node_modules/finalhandler/HISTORY.md +0 -210
  348. gaia/eval/webapp/node_modules/finalhandler/LICENSE +0 -22
  349. gaia/eval/webapp/node_modules/finalhandler/README.md +0 -147
  350. gaia/eval/webapp/node_modules/finalhandler/SECURITY.md +0 -25
  351. gaia/eval/webapp/node_modules/finalhandler/index.js +0 -341
  352. gaia/eval/webapp/node_modules/finalhandler/package.json +0 -47
  353. gaia/eval/webapp/node_modules/forwarded/HISTORY.md +0 -21
  354. gaia/eval/webapp/node_modules/forwarded/LICENSE +0 -22
  355. gaia/eval/webapp/node_modules/forwarded/README.md +0 -57
  356. gaia/eval/webapp/node_modules/forwarded/index.js +0 -90
  357. gaia/eval/webapp/node_modules/forwarded/package.json +0 -45
  358. gaia/eval/webapp/node_modules/fresh/HISTORY.md +0 -70
  359. gaia/eval/webapp/node_modules/fresh/LICENSE +0 -23
  360. gaia/eval/webapp/node_modules/fresh/README.md +0 -119
  361. gaia/eval/webapp/node_modules/fresh/index.js +0 -137
  362. gaia/eval/webapp/node_modules/fresh/package.json +0 -46
  363. gaia/eval/webapp/node_modules/fs/README.md +0 -9
  364. gaia/eval/webapp/node_modules/fs/package.json +0 -20
  365. gaia/eval/webapp/node_modules/function-bind/.eslintrc +0 -21
  366. gaia/eval/webapp/node_modules/function-bind/.github/FUNDING.yml +0 -12
  367. gaia/eval/webapp/node_modules/function-bind/.github/SECURITY.md +0 -3
  368. gaia/eval/webapp/node_modules/function-bind/.nycrc +0 -13
  369. gaia/eval/webapp/node_modules/function-bind/CHANGELOG.md +0 -136
  370. gaia/eval/webapp/node_modules/function-bind/LICENSE +0 -20
  371. gaia/eval/webapp/node_modules/function-bind/README.md +0 -46
  372. gaia/eval/webapp/node_modules/function-bind/implementation.js +0 -84
  373. gaia/eval/webapp/node_modules/function-bind/index.js +0 -5
  374. gaia/eval/webapp/node_modules/function-bind/package.json +0 -87
  375. gaia/eval/webapp/node_modules/function-bind/test/.eslintrc +0 -9
  376. gaia/eval/webapp/node_modules/function-bind/test/index.js +0 -252
  377. gaia/eval/webapp/node_modules/get-intrinsic/.eslintrc +0 -42
  378. gaia/eval/webapp/node_modules/get-intrinsic/.github/FUNDING.yml +0 -12
  379. gaia/eval/webapp/node_modules/get-intrinsic/.nycrc +0 -9
  380. gaia/eval/webapp/node_modules/get-intrinsic/CHANGELOG.md +0 -186
  381. gaia/eval/webapp/node_modules/get-intrinsic/LICENSE +0 -21
  382. gaia/eval/webapp/node_modules/get-intrinsic/README.md +0 -71
  383. gaia/eval/webapp/node_modules/get-intrinsic/index.js +0 -378
  384. gaia/eval/webapp/node_modules/get-intrinsic/package.json +0 -97
  385. gaia/eval/webapp/node_modules/get-intrinsic/test/GetIntrinsic.js +0 -274
  386. gaia/eval/webapp/node_modules/get-proto/.eslintrc +0 -10
  387. gaia/eval/webapp/node_modules/get-proto/.github/FUNDING.yml +0 -12
  388. gaia/eval/webapp/node_modules/get-proto/.nycrc +0 -9
  389. gaia/eval/webapp/node_modules/get-proto/CHANGELOG.md +0 -21
  390. gaia/eval/webapp/node_modules/get-proto/LICENSE +0 -21
  391. gaia/eval/webapp/node_modules/get-proto/Object.getPrototypeOf.d.ts +0 -5
  392. gaia/eval/webapp/node_modules/get-proto/Object.getPrototypeOf.js +0 -6
  393. gaia/eval/webapp/node_modules/get-proto/README.md +0 -50
  394. gaia/eval/webapp/node_modules/get-proto/Reflect.getPrototypeOf.d.ts +0 -3
  395. gaia/eval/webapp/node_modules/get-proto/Reflect.getPrototypeOf.js +0 -4
  396. gaia/eval/webapp/node_modules/get-proto/index.d.ts +0 -5
  397. gaia/eval/webapp/node_modules/get-proto/index.js +0 -27
  398. gaia/eval/webapp/node_modules/get-proto/package.json +0 -81
  399. gaia/eval/webapp/node_modules/get-proto/test/index.js +0 -68
  400. gaia/eval/webapp/node_modules/get-proto/tsconfig.json +0 -9
  401. gaia/eval/webapp/node_modules/gopd/.eslintrc +0 -16
  402. gaia/eval/webapp/node_modules/gopd/.github/FUNDING.yml +0 -12
  403. gaia/eval/webapp/node_modules/gopd/CHANGELOG.md +0 -45
  404. gaia/eval/webapp/node_modules/gopd/LICENSE +0 -21
  405. gaia/eval/webapp/node_modules/gopd/README.md +0 -40
  406. gaia/eval/webapp/node_modules/gopd/gOPD.d.ts +0 -1
  407. gaia/eval/webapp/node_modules/gopd/gOPD.js +0 -4
  408. gaia/eval/webapp/node_modules/gopd/index.d.ts +0 -5
  409. gaia/eval/webapp/node_modules/gopd/index.js +0 -15
  410. gaia/eval/webapp/node_modules/gopd/package.json +0 -77
  411. gaia/eval/webapp/node_modules/gopd/test/index.js +0 -36
  412. gaia/eval/webapp/node_modules/gopd/tsconfig.json +0 -9
  413. gaia/eval/webapp/node_modules/has-symbols/.eslintrc +0 -11
  414. gaia/eval/webapp/node_modules/has-symbols/.github/FUNDING.yml +0 -12
  415. gaia/eval/webapp/node_modules/has-symbols/.nycrc +0 -9
  416. gaia/eval/webapp/node_modules/has-symbols/CHANGELOG.md +0 -91
  417. gaia/eval/webapp/node_modules/has-symbols/LICENSE +0 -21
  418. gaia/eval/webapp/node_modules/has-symbols/README.md +0 -46
  419. gaia/eval/webapp/node_modules/has-symbols/index.d.ts +0 -3
  420. gaia/eval/webapp/node_modules/has-symbols/index.js +0 -14
  421. gaia/eval/webapp/node_modules/has-symbols/package.json +0 -111
  422. gaia/eval/webapp/node_modules/has-symbols/shams.d.ts +0 -3
  423. gaia/eval/webapp/node_modules/has-symbols/shams.js +0 -45
  424. gaia/eval/webapp/node_modules/has-symbols/test/index.js +0 -22
  425. gaia/eval/webapp/node_modules/has-symbols/test/shams/core-js.js +0 -29
  426. gaia/eval/webapp/node_modules/has-symbols/test/shams/get-own-property-symbols.js +0 -29
  427. gaia/eval/webapp/node_modules/has-symbols/test/tests.js +0 -58
  428. gaia/eval/webapp/node_modules/has-symbols/tsconfig.json +0 -10
  429. gaia/eval/webapp/node_modules/hasown/.eslintrc +0 -5
  430. gaia/eval/webapp/node_modules/hasown/.github/FUNDING.yml +0 -12
  431. gaia/eval/webapp/node_modules/hasown/.nycrc +0 -13
  432. gaia/eval/webapp/node_modules/hasown/CHANGELOG.md +0 -40
  433. gaia/eval/webapp/node_modules/hasown/LICENSE +0 -21
  434. gaia/eval/webapp/node_modules/hasown/README.md +0 -40
  435. gaia/eval/webapp/node_modules/hasown/index.d.ts +0 -3
  436. gaia/eval/webapp/node_modules/hasown/index.js +0 -8
  437. gaia/eval/webapp/node_modules/hasown/package.json +0 -92
  438. gaia/eval/webapp/node_modules/hasown/tsconfig.json +0 -6
  439. gaia/eval/webapp/node_modules/http-errors/HISTORY.md +0 -180
  440. gaia/eval/webapp/node_modules/http-errors/LICENSE +0 -23
  441. gaia/eval/webapp/node_modules/http-errors/README.md +0 -169
  442. gaia/eval/webapp/node_modules/http-errors/index.js +0 -289
  443. gaia/eval/webapp/node_modules/http-errors/package.json +0 -50
  444. gaia/eval/webapp/node_modules/iconv-lite/Changelog.md +0 -162
  445. gaia/eval/webapp/node_modules/iconv-lite/LICENSE +0 -21
  446. gaia/eval/webapp/node_modules/iconv-lite/README.md +0 -156
  447. gaia/eval/webapp/node_modules/iconv-lite/encodings/dbcs-codec.js +0 -555
  448. gaia/eval/webapp/node_modules/iconv-lite/encodings/dbcs-data.js +0 -176
  449. gaia/eval/webapp/node_modules/iconv-lite/encodings/index.js +0 -22
  450. gaia/eval/webapp/node_modules/iconv-lite/encodings/internal.js +0 -188
  451. gaia/eval/webapp/node_modules/iconv-lite/encodings/sbcs-codec.js +0 -72
  452. gaia/eval/webapp/node_modules/iconv-lite/encodings/sbcs-data-generated.js +0 -451
  453. gaia/eval/webapp/node_modules/iconv-lite/encodings/sbcs-data.js +0 -174
  454. gaia/eval/webapp/node_modules/iconv-lite/encodings/tables/big5-added.json +0 -122
  455. gaia/eval/webapp/node_modules/iconv-lite/encodings/tables/cp936.json +0 -264
  456. gaia/eval/webapp/node_modules/iconv-lite/encodings/tables/cp949.json +0 -273
  457. gaia/eval/webapp/node_modules/iconv-lite/encodings/tables/cp950.json +0 -177
  458. gaia/eval/webapp/node_modules/iconv-lite/encodings/tables/eucjp.json +0 -182
  459. gaia/eval/webapp/node_modules/iconv-lite/encodings/tables/gb18030-ranges.json +0 -1
  460. gaia/eval/webapp/node_modules/iconv-lite/encodings/tables/gbk-added.json +0 -55
  461. gaia/eval/webapp/node_modules/iconv-lite/encodings/tables/shiftjis.json +0 -125
  462. gaia/eval/webapp/node_modules/iconv-lite/encodings/utf16.js +0 -177
  463. gaia/eval/webapp/node_modules/iconv-lite/encodings/utf7.js +0 -290
  464. gaia/eval/webapp/node_modules/iconv-lite/lib/bom-handling.js +0 -52
  465. gaia/eval/webapp/node_modules/iconv-lite/lib/extend-node.js +0 -217
  466. gaia/eval/webapp/node_modules/iconv-lite/lib/index.d.ts +0 -24
  467. gaia/eval/webapp/node_modules/iconv-lite/lib/index.js +0 -153
  468. gaia/eval/webapp/node_modules/iconv-lite/lib/streams.js +0 -121
  469. gaia/eval/webapp/node_modules/iconv-lite/package.json +0 -46
  470. gaia/eval/webapp/node_modules/inherits/LICENSE +0 -16
  471. gaia/eval/webapp/node_modules/inherits/README.md +0 -42
  472. gaia/eval/webapp/node_modules/inherits/inherits.js +0 -9
  473. gaia/eval/webapp/node_modules/inherits/inherits_browser.js +0 -27
  474. gaia/eval/webapp/node_modules/inherits/package.json +0 -29
  475. gaia/eval/webapp/node_modules/ipaddr.js/LICENSE +0 -19
  476. gaia/eval/webapp/node_modules/ipaddr.js/README.md +0 -233
  477. gaia/eval/webapp/node_modules/ipaddr.js/ipaddr.min.js +0 -1
  478. gaia/eval/webapp/node_modules/ipaddr.js/lib/ipaddr.js +0 -673
  479. gaia/eval/webapp/node_modules/ipaddr.js/lib/ipaddr.js.d.ts +0 -68
  480. gaia/eval/webapp/node_modules/ipaddr.js/package.json +0 -35
  481. gaia/eval/webapp/node_modules/math-intrinsics/.eslintrc +0 -16
  482. gaia/eval/webapp/node_modules/math-intrinsics/.github/FUNDING.yml +0 -12
  483. gaia/eval/webapp/node_modules/math-intrinsics/CHANGELOG.md +0 -24
  484. gaia/eval/webapp/node_modules/math-intrinsics/LICENSE +0 -21
  485. gaia/eval/webapp/node_modules/math-intrinsics/README.md +0 -50
  486. gaia/eval/webapp/node_modules/math-intrinsics/abs.d.ts +0 -1
  487. gaia/eval/webapp/node_modules/math-intrinsics/abs.js +0 -4
  488. gaia/eval/webapp/node_modules/math-intrinsics/constants/maxArrayLength.d.ts +0 -3
  489. gaia/eval/webapp/node_modules/math-intrinsics/constants/maxArrayLength.js +0 -4
  490. gaia/eval/webapp/node_modules/math-intrinsics/constants/maxSafeInteger.d.ts +0 -3
  491. gaia/eval/webapp/node_modules/math-intrinsics/constants/maxSafeInteger.js +0 -5
  492. gaia/eval/webapp/node_modules/math-intrinsics/constants/maxValue.d.ts +0 -3
  493. gaia/eval/webapp/node_modules/math-intrinsics/constants/maxValue.js +0 -5
  494. gaia/eval/webapp/node_modules/math-intrinsics/floor.d.ts +0 -1
  495. gaia/eval/webapp/node_modules/math-intrinsics/floor.js +0 -4
  496. gaia/eval/webapp/node_modules/math-intrinsics/isFinite.d.ts +0 -3
  497. gaia/eval/webapp/node_modules/math-intrinsics/isFinite.js +0 -12
  498. gaia/eval/webapp/node_modules/math-intrinsics/isInteger.d.ts +0 -3
  499. gaia/eval/webapp/node_modules/math-intrinsics/isInteger.js +0 -16
  500. gaia/eval/webapp/node_modules/math-intrinsics/isNaN.d.ts +0 -1
  501. gaia/eval/webapp/node_modules/math-intrinsics/isNaN.js +0 -6
  502. gaia/eval/webapp/node_modules/math-intrinsics/isNegativeZero.d.ts +0 -3
  503. gaia/eval/webapp/node_modules/math-intrinsics/isNegativeZero.js +0 -6
  504. gaia/eval/webapp/node_modules/math-intrinsics/max.d.ts +0 -1
  505. gaia/eval/webapp/node_modules/math-intrinsics/max.js +0 -4
  506. gaia/eval/webapp/node_modules/math-intrinsics/min.d.ts +0 -1
  507. gaia/eval/webapp/node_modules/math-intrinsics/min.js +0 -4
  508. gaia/eval/webapp/node_modules/math-intrinsics/mod.d.ts +0 -3
  509. gaia/eval/webapp/node_modules/math-intrinsics/mod.js +0 -9
  510. gaia/eval/webapp/node_modules/math-intrinsics/package.json +0 -86
  511. gaia/eval/webapp/node_modules/math-intrinsics/pow.d.ts +0 -1
  512. gaia/eval/webapp/node_modules/math-intrinsics/pow.js +0 -4
  513. gaia/eval/webapp/node_modules/math-intrinsics/round.d.ts +0 -1
  514. gaia/eval/webapp/node_modules/math-intrinsics/round.js +0 -4
  515. gaia/eval/webapp/node_modules/math-intrinsics/sign.d.ts +0 -3
  516. gaia/eval/webapp/node_modules/math-intrinsics/sign.js +0 -11
  517. gaia/eval/webapp/node_modules/math-intrinsics/test/index.js +0 -192
  518. gaia/eval/webapp/node_modules/math-intrinsics/tsconfig.json +0 -3
  519. gaia/eval/webapp/node_modules/media-typer/HISTORY.md +0 -22
  520. gaia/eval/webapp/node_modules/media-typer/LICENSE +0 -22
  521. gaia/eval/webapp/node_modules/media-typer/README.md +0 -81
  522. gaia/eval/webapp/node_modules/media-typer/index.js +0 -270
  523. gaia/eval/webapp/node_modules/media-typer/package.json +0 -26
  524. gaia/eval/webapp/node_modules/merge-descriptors/HISTORY.md +0 -21
  525. gaia/eval/webapp/node_modules/merge-descriptors/LICENSE +0 -23
  526. gaia/eval/webapp/node_modules/merge-descriptors/README.md +0 -49
  527. gaia/eval/webapp/node_modules/merge-descriptors/index.js +0 -60
  528. gaia/eval/webapp/node_modules/merge-descriptors/package.json +0 -39
  529. gaia/eval/webapp/node_modules/methods/HISTORY.md +0 -29
  530. gaia/eval/webapp/node_modules/methods/LICENSE +0 -24
  531. gaia/eval/webapp/node_modules/methods/README.md +0 -51
  532. gaia/eval/webapp/node_modules/methods/index.js +0 -69
  533. gaia/eval/webapp/node_modules/methods/package.json +0 -36
  534. gaia/eval/webapp/node_modules/mime/.npmignore +0 -0
  535. gaia/eval/webapp/node_modules/mime/CHANGELOG.md +0 -164
  536. gaia/eval/webapp/node_modules/mime/LICENSE +0 -21
  537. gaia/eval/webapp/node_modules/mime/README.md +0 -90
  538. gaia/eval/webapp/node_modules/mime/cli.js +0 -8
  539. gaia/eval/webapp/node_modules/mime/mime.js +0 -108
  540. gaia/eval/webapp/node_modules/mime/package.json +0 -44
  541. gaia/eval/webapp/node_modules/mime/src/build.js +0 -53
  542. gaia/eval/webapp/node_modules/mime/src/test.js +0 -60
  543. gaia/eval/webapp/node_modules/mime/types.json +0 -1
  544. gaia/eval/webapp/node_modules/mime-db/HISTORY.md +0 -507
  545. gaia/eval/webapp/node_modules/mime-db/LICENSE +0 -23
  546. gaia/eval/webapp/node_modules/mime-db/README.md +0 -100
  547. gaia/eval/webapp/node_modules/mime-db/db.json +0 -8519
  548. gaia/eval/webapp/node_modules/mime-db/index.js +0 -12
  549. gaia/eval/webapp/node_modules/mime-db/package.json +0 -60
  550. gaia/eval/webapp/node_modules/mime-types/HISTORY.md +0 -397
  551. gaia/eval/webapp/node_modules/mime-types/LICENSE +0 -23
  552. gaia/eval/webapp/node_modules/mime-types/README.md +0 -113
  553. gaia/eval/webapp/node_modules/mime-types/index.js +0 -188
  554. gaia/eval/webapp/node_modules/mime-types/package.json +0 -44
  555. gaia/eval/webapp/node_modules/ms/index.js +0 -152
  556. gaia/eval/webapp/node_modules/ms/license.md +0 -21
  557. gaia/eval/webapp/node_modules/ms/package.json +0 -37
  558. gaia/eval/webapp/node_modules/ms/readme.md +0 -51
  559. gaia/eval/webapp/node_modules/negotiator/HISTORY.md +0 -108
  560. gaia/eval/webapp/node_modules/negotiator/LICENSE +0 -24
  561. gaia/eval/webapp/node_modules/negotiator/README.md +0 -203
  562. gaia/eval/webapp/node_modules/negotiator/index.js +0 -82
  563. gaia/eval/webapp/node_modules/negotiator/lib/charset.js +0 -169
  564. gaia/eval/webapp/node_modules/negotiator/lib/encoding.js +0 -184
  565. gaia/eval/webapp/node_modules/negotiator/lib/language.js +0 -179
  566. gaia/eval/webapp/node_modules/negotiator/lib/mediaType.js +0 -294
  567. gaia/eval/webapp/node_modules/negotiator/package.json +0 -42
  568. gaia/eval/webapp/node_modules/object-inspect/.eslintrc +0 -53
  569. gaia/eval/webapp/node_modules/object-inspect/.github/FUNDING.yml +0 -12
  570. gaia/eval/webapp/node_modules/object-inspect/.nycrc +0 -13
  571. gaia/eval/webapp/node_modules/object-inspect/CHANGELOG.md +0 -424
  572. gaia/eval/webapp/node_modules/object-inspect/LICENSE +0 -21
  573. gaia/eval/webapp/node_modules/object-inspect/example/all.js +0 -23
  574. gaia/eval/webapp/node_modules/object-inspect/example/circular.js +0 -6
  575. gaia/eval/webapp/node_modules/object-inspect/example/fn.js +0 -5
  576. gaia/eval/webapp/node_modules/object-inspect/example/inspect.js +0 -10
  577. gaia/eval/webapp/node_modules/object-inspect/index.js +0 -544
  578. gaia/eval/webapp/node_modules/object-inspect/package-support.json +0 -20
  579. gaia/eval/webapp/node_modules/object-inspect/package.json +0 -105
  580. gaia/eval/webapp/node_modules/object-inspect/readme.markdown +0 -84
  581. gaia/eval/webapp/node_modules/object-inspect/test/bigint.js +0 -58
  582. gaia/eval/webapp/node_modules/object-inspect/test/browser/dom.js +0 -15
  583. gaia/eval/webapp/node_modules/object-inspect/test/circular.js +0 -16
  584. gaia/eval/webapp/node_modules/object-inspect/test/deep.js +0 -12
  585. gaia/eval/webapp/node_modules/object-inspect/test/element.js +0 -53
  586. gaia/eval/webapp/node_modules/object-inspect/test/err.js +0 -48
  587. gaia/eval/webapp/node_modules/object-inspect/test/fakes.js +0 -29
  588. gaia/eval/webapp/node_modules/object-inspect/test/fn.js +0 -76
  589. gaia/eval/webapp/node_modules/object-inspect/test/global.js +0 -17
  590. gaia/eval/webapp/node_modules/object-inspect/test/has.js +0 -15
  591. gaia/eval/webapp/node_modules/object-inspect/test/holes.js +0 -15
  592. gaia/eval/webapp/node_modules/object-inspect/test/indent-option.js +0 -271
  593. gaia/eval/webapp/node_modules/object-inspect/test/inspect.js +0 -139
  594. gaia/eval/webapp/node_modules/object-inspect/test/lowbyte.js +0 -12
  595. gaia/eval/webapp/node_modules/object-inspect/test/number.js +0 -58
  596. gaia/eval/webapp/node_modules/object-inspect/test/quoteStyle.js +0 -26
  597. gaia/eval/webapp/node_modules/object-inspect/test/toStringTag.js +0 -40
  598. gaia/eval/webapp/node_modules/object-inspect/test/undef.js +0 -12
  599. gaia/eval/webapp/node_modules/object-inspect/test/values.js +0 -261
  600. gaia/eval/webapp/node_modules/object-inspect/test-core-js.js +0 -26
  601. gaia/eval/webapp/node_modules/object-inspect/util.inspect.js +0 -1
  602. gaia/eval/webapp/node_modules/on-finished/HISTORY.md +0 -98
  603. gaia/eval/webapp/node_modules/on-finished/LICENSE +0 -23
  604. gaia/eval/webapp/node_modules/on-finished/README.md +0 -162
  605. gaia/eval/webapp/node_modules/on-finished/index.js +0 -234
  606. gaia/eval/webapp/node_modules/on-finished/package.json +0 -39
  607. gaia/eval/webapp/node_modules/parseurl/HISTORY.md +0 -58
  608. gaia/eval/webapp/node_modules/parseurl/LICENSE +0 -24
  609. gaia/eval/webapp/node_modules/parseurl/README.md +0 -133
  610. gaia/eval/webapp/node_modules/parseurl/index.js +0 -158
  611. gaia/eval/webapp/node_modules/parseurl/package.json +0 -40
  612. gaia/eval/webapp/node_modules/path/.npmignore +0 -1
  613. gaia/eval/webapp/node_modules/path/LICENSE +0 -18
  614. gaia/eval/webapp/node_modules/path/README.md +0 -15
  615. gaia/eval/webapp/node_modules/path/package.json +0 -24
  616. gaia/eval/webapp/node_modules/path/path.js +0 -628
  617. gaia/eval/webapp/node_modules/path-to-regexp/LICENSE +0 -21
  618. gaia/eval/webapp/node_modules/path-to-regexp/Readme.md +0 -35
  619. gaia/eval/webapp/node_modules/path-to-regexp/index.js +0 -156
  620. gaia/eval/webapp/node_modules/path-to-regexp/package.json +0 -30
  621. gaia/eval/webapp/node_modules/process/.eslintrc +0 -21
  622. gaia/eval/webapp/node_modules/process/LICENSE +0 -22
  623. gaia/eval/webapp/node_modules/process/README.md +0 -26
  624. gaia/eval/webapp/node_modules/process/browser.js +0 -184
  625. gaia/eval/webapp/node_modules/process/index.js +0 -2
  626. gaia/eval/webapp/node_modules/process/package.json +0 -27
  627. gaia/eval/webapp/node_modules/process/test.js +0 -199
  628. gaia/eval/webapp/node_modules/proxy-addr/HISTORY.md +0 -161
  629. gaia/eval/webapp/node_modules/proxy-addr/LICENSE +0 -22
  630. gaia/eval/webapp/node_modules/proxy-addr/README.md +0 -139
  631. gaia/eval/webapp/node_modules/proxy-addr/index.js +0 -327
  632. gaia/eval/webapp/node_modules/proxy-addr/package.json +0 -47
  633. gaia/eval/webapp/node_modules/qs/.editorconfig +0 -46
  634. gaia/eval/webapp/node_modules/qs/.eslintrc +0 -38
  635. gaia/eval/webapp/node_modules/qs/.github/FUNDING.yml +0 -12
  636. gaia/eval/webapp/node_modules/qs/.nycrc +0 -13
  637. gaia/eval/webapp/node_modules/qs/CHANGELOG.md +0 -600
  638. gaia/eval/webapp/node_modules/qs/LICENSE.md +0 -29
  639. gaia/eval/webapp/node_modules/qs/README.md +0 -709
  640. gaia/eval/webapp/node_modules/qs/dist/qs.js +0 -90
  641. gaia/eval/webapp/node_modules/qs/lib/formats.js +0 -23
  642. gaia/eval/webapp/node_modules/qs/lib/index.js +0 -11
  643. gaia/eval/webapp/node_modules/qs/lib/parse.js +0 -296
  644. gaia/eval/webapp/node_modules/qs/lib/stringify.js +0 -351
  645. gaia/eval/webapp/node_modules/qs/lib/utils.js +0 -265
  646. gaia/eval/webapp/node_modules/qs/package.json +0 -91
  647. gaia/eval/webapp/node_modules/qs/test/empty-keys-cases.js +0 -267
  648. gaia/eval/webapp/node_modules/qs/test/parse.js +0 -1170
  649. gaia/eval/webapp/node_modules/qs/test/stringify.js +0 -1298
  650. gaia/eval/webapp/node_modules/qs/test/utils.js +0 -136
  651. gaia/eval/webapp/node_modules/range-parser/HISTORY.md +0 -56
  652. gaia/eval/webapp/node_modules/range-parser/LICENSE +0 -23
  653. gaia/eval/webapp/node_modules/range-parser/README.md +0 -84
  654. gaia/eval/webapp/node_modules/range-parser/index.js +0 -162
  655. gaia/eval/webapp/node_modules/range-parser/package.json +0 -44
  656. gaia/eval/webapp/node_modules/raw-body/HISTORY.md +0 -308
  657. gaia/eval/webapp/node_modules/raw-body/LICENSE +0 -22
  658. gaia/eval/webapp/node_modules/raw-body/README.md +0 -223
  659. gaia/eval/webapp/node_modules/raw-body/SECURITY.md +0 -24
  660. gaia/eval/webapp/node_modules/raw-body/index.d.ts +0 -87
  661. gaia/eval/webapp/node_modules/raw-body/index.js +0 -336
  662. gaia/eval/webapp/node_modules/raw-body/package.json +0 -49
  663. gaia/eval/webapp/node_modules/safe-buffer/LICENSE +0 -21
  664. gaia/eval/webapp/node_modules/safe-buffer/README.md +0 -584
  665. gaia/eval/webapp/node_modules/safe-buffer/index.d.ts +0 -187
  666. gaia/eval/webapp/node_modules/safe-buffer/index.js +0 -65
  667. gaia/eval/webapp/node_modules/safe-buffer/package.json +0 -51
  668. gaia/eval/webapp/node_modules/safer-buffer/LICENSE +0 -21
  669. gaia/eval/webapp/node_modules/safer-buffer/Porting-Buffer.md +0 -268
  670. gaia/eval/webapp/node_modules/safer-buffer/Readme.md +0 -156
  671. gaia/eval/webapp/node_modules/safer-buffer/dangerous.js +0 -58
  672. gaia/eval/webapp/node_modules/safer-buffer/package.json +0 -34
  673. gaia/eval/webapp/node_modules/safer-buffer/safer.js +0 -77
  674. gaia/eval/webapp/node_modules/safer-buffer/tests.js +0 -406
  675. gaia/eval/webapp/node_modules/send/HISTORY.md +0 -526
  676. gaia/eval/webapp/node_modules/send/LICENSE +0 -23
  677. gaia/eval/webapp/node_modules/send/README.md +0 -327
  678. gaia/eval/webapp/node_modules/send/SECURITY.md +0 -24
  679. gaia/eval/webapp/node_modules/send/index.js +0 -1142
  680. gaia/eval/webapp/node_modules/send/node_modules/encodeurl/HISTORY.md +0 -14
  681. gaia/eval/webapp/node_modules/send/node_modules/encodeurl/LICENSE +0 -22
  682. gaia/eval/webapp/node_modules/send/node_modules/encodeurl/README.md +0 -128
  683. gaia/eval/webapp/node_modules/send/node_modules/encodeurl/index.js +0 -60
  684. gaia/eval/webapp/node_modules/send/node_modules/encodeurl/package.json +0 -40
  685. gaia/eval/webapp/node_modules/send/node_modules/ms/index.js +0 -162
  686. gaia/eval/webapp/node_modules/send/node_modules/ms/license.md +0 -21
  687. gaia/eval/webapp/node_modules/send/node_modules/ms/package.json +0 -38
  688. gaia/eval/webapp/node_modules/send/node_modules/ms/readme.md +0 -59
  689. gaia/eval/webapp/node_modules/send/package.json +0 -62
  690. gaia/eval/webapp/node_modules/serve-static/HISTORY.md +0 -487
  691. gaia/eval/webapp/node_modules/serve-static/LICENSE +0 -25
  692. gaia/eval/webapp/node_modules/serve-static/README.md +0 -257
  693. gaia/eval/webapp/node_modules/serve-static/index.js +0 -209
  694. gaia/eval/webapp/node_modules/serve-static/package.json +0 -42
  695. gaia/eval/webapp/node_modules/setprototypeof/LICENSE +0 -13
  696. gaia/eval/webapp/node_modules/setprototypeof/README.md +0 -31
  697. gaia/eval/webapp/node_modules/setprototypeof/index.d.ts +0 -2
  698. gaia/eval/webapp/node_modules/setprototypeof/index.js +0 -17
  699. gaia/eval/webapp/node_modules/setprototypeof/package.json +0 -38
  700. gaia/eval/webapp/node_modules/setprototypeof/test/index.js +0 -24
  701. gaia/eval/webapp/node_modules/side-channel/.editorconfig +0 -9
  702. gaia/eval/webapp/node_modules/side-channel/.eslintrc +0 -12
  703. gaia/eval/webapp/node_modules/side-channel/.github/FUNDING.yml +0 -12
  704. gaia/eval/webapp/node_modules/side-channel/.nycrc +0 -13
  705. gaia/eval/webapp/node_modules/side-channel/CHANGELOG.md +0 -110
  706. gaia/eval/webapp/node_modules/side-channel/LICENSE +0 -21
  707. gaia/eval/webapp/node_modules/side-channel/README.md +0 -61
  708. gaia/eval/webapp/node_modules/side-channel/index.d.ts +0 -14
  709. gaia/eval/webapp/node_modules/side-channel/index.js +0 -43
  710. gaia/eval/webapp/node_modules/side-channel/package.json +0 -85
  711. gaia/eval/webapp/node_modules/side-channel/test/index.js +0 -104
  712. gaia/eval/webapp/node_modules/side-channel/tsconfig.json +0 -9
  713. gaia/eval/webapp/node_modules/side-channel-list/.editorconfig +0 -9
  714. gaia/eval/webapp/node_modules/side-channel-list/.eslintrc +0 -11
  715. gaia/eval/webapp/node_modules/side-channel-list/.github/FUNDING.yml +0 -12
  716. gaia/eval/webapp/node_modules/side-channel-list/.nycrc +0 -13
  717. gaia/eval/webapp/node_modules/side-channel-list/CHANGELOG.md +0 -15
  718. gaia/eval/webapp/node_modules/side-channel-list/LICENSE +0 -21
  719. gaia/eval/webapp/node_modules/side-channel-list/README.md +0 -62
  720. gaia/eval/webapp/node_modules/side-channel-list/index.d.ts +0 -13
  721. gaia/eval/webapp/node_modules/side-channel-list/index.js +0 -113
  722. gaia/eval/webapp/node_modules/side-channel-list/list.d.ts +0 -14
  723. gaia/eval/webapp/node_modules/side-channel-list/package.json +0 -77
  724. gaia/eval/webapp/node_modules/side-channel-list/test/index.js +0 -104
  725. gaia/eval/webapp/node_modules/side-channel-list/tsconfig.json +0 -9
  726. gaia/eval/webapp/node_modules/side-channel-map/.editorconfig +0 -9
  727. gaia/eval/webapp/node_modules/side-channel-map/.eslintrc +0 -11
  728. gaia/eval/webapp/node_modules/side-channel-map/.github/FUNDING.yml +0 -12
  729. gaia/eval/webapp/node_modules/side-channel-map/.nycrc +0 -13
  730. gaia/eval/webapp/node_modules/side-channel-map/CHANGELOG.md +0 -22
  731. gaia/eval/webapp/node_modules/side-channel-map/LICENSE +0 -21
  732. gaia/eval/webapp/node_modules/side-channel-map/README.md +0 -62
  733. gaia/eval/webapp/node_modules/side-channel-map/index.d.ts +0 -15
  734. gaia/eval/webapp/node_modules/side-channel-map/index.js +0 -68
  735. gaia/eval/webapp/node_modules/side-channel-map/package.json +0 -80
  736. gaia/eval/webapp/node_modules/side-channel-map/test/index.js +0 -114
  737. gaia/eval/webapp/node_modules/side-channel-map/tsconfig.json +0 -9
  738. gaia/eval/webapp/node_modules/side-channel-weakmap/.editorconfig +0 -9
  739. gaia/eval/webapp/node_modules/side-channel-weakmap/.eslintrc +0 -12
  740. gaia/eval/webapp/node_modules/side-channel-weakmap/.github/FUNDING.yml +0 -12
  741. gaia/eval/webapp/node_modules/side-channel-weakmap/.nycrc +0 -13
  742. gaia/eval/webapp/node_modules/side-channel-weakmap/CHANGELOG.md +0 -28
  743. gaia/eval/webapp/node_modules/side-channel-weakmap/LICENSE +0 -21
  744. gaia/eval/webapp/node_modules/side-channel-weakmap/README.md +0 -62
  745. gaia/eval/webapp/node_modules/side-channel-weakmap/index.d.ts +0 -15
  746. gaia/eval/webapp/node_modules/side-channel-weakmap/index.js +0 -84
  747. gaia/eval/webapp/node_modules/side-channel-weakmap/package.json +0 -87
  748. gaia/eval/webapp/node_modules/side-channel-weakmap/test/index.js +0 -114
  749. gaia/eval/webapp/node_modules/side-channel-weakmap/tsconfig.json +0 -9
  750. gaia/eval/webapp/node_modules/statuses/HISTORY.md +0 -82
  751. gaia/eval/webapp/node_modules/statuses/LICENSE +0 -23
  752. gaia/eval/webapp/node_modules/statuses/README.md +0 -136
  753. gaia/eval/webapp/node_modules/statuses/codes.json +0 -65
  754. gaia/eval/webapp/node_modules/statuses/index.js +0 -146
  755. gaia/eval/webapp/node_modules/statuses/package.json +0 -49
  756. gaia/eval/webapp/node_modules/toidentifier/HISTORY.md +0 -9
  757. gaia/eval/webapp/node_modules/toidentifier/LICENSE +0 -21
  758. gaia/eval/webapp/node_modules/toidentifier/README.md +0 -61
  759. gaia/eval/webapp/node_modules/toidentifier/index.js +0 -32
  760. gaia/eval/webapp/node_modules/toidentifier/package.json +0 -38
  761. gaia/eval/webapp/node_modules/type-is/HISTORY.md +0 -259
  762. gaia/eval/webapp/node_modules/type-is/LICENSE +0 -23
  763. gaia/eval/webapp/node_modules/type-is/README.md +0 -170
  764. gaia/eval/webapp/node_modules/type-is/index.js +0 -266
  765. gaia/eval/webapp/node_modules/type-is/package.json +0 -45
  766. gaia/eval/webapp/node_modules/unpipe/HISTORY.md +0 -4
  767. gaia/eval/webapp/node_modules/unpipe/LICENSE +0 -22
  768. gaia/eval/webapp/node_modules/unpipe/README.md +0 -43
  769. gaia/eval/webapp/node_modules/unpipe/index.js +0 -69
  770. gaia/eval/webapp/node_modules/unpipe/package.json +0 -27
  771. gaia/eval/webapp/node_modules/util/LICENSE +0 -18
  772. gaia/eval/webapp/node_modules/util/README.md +0 -15
  773. gaia/eval/webapp/node_modules/util/node_modules/inherits/LICENSE +0 -16
  774. gaia/eval/webapp/node_modules/util/node_modules/inherits/README.md +0 -42
  775. gaia/eval/webapp/node_modules/util/node_modules/inherits/inherits.js +0 -7
  776. gaia/eval/webapp/node_modules/util/node_modules/inherits/inherits_browser.js +0 -23
  777. gaia/eval/webapp/node_modules/util/node_modules/inherits/package.json +0 -29
  778. gaia/eval/webapp/node_modules/util/package.json +0 -35
  779. gaia/eval/webapp/node_modules/util/support/isBuffer.js +0 -3
  780. gaia/eval/webapp/node_modules/util/support/isBufferBrowser.js +0 -6
  781. gaia/eval/webapp/node_modules/util/util.js +0 -586
  782. gaia/eval/webapp/node_modules/utils-merge/.npmignore +0 -9
  783. gaia/eval/webapp/node_modules/utils-merge/LICENSE +0 -20
  784. gaia/eval/webapp/node_modules/utils-merge/README.md +0 -34
  785. gaia/eval/webapp/node_modules/utils-merge/index.js +0 -23
  786. gaia/eval/webapp/node_modules/utils-merge/package.json +0 -40
  787. gaia/eval/webapp/node_modules/vary/HISTORY.md +0 -39
  788. gaia/eval/webapp/node_modules/vary/LICENSE +0 -22
  789. gaia/eval/webapp/node_modules/vary/README.md +0 -101
  790. gaia/eval/webapp/node_modules/vary/index.js +0 -149
  791. gaia/eval/webapp/node_modules/vary/package.json +0 -43
  792. {amd_gaia-0.14.1.dist-info → amd_gaia-0.14.3.dist-info}/WHEEL +0 -0
  793. {amd_gaia-0.14.1.dist-info → amd_gaia-0.14.3.dist-info}/licenses/LICENSE.md +0 -0
  794. {amd_gaia-0.14.1.dist-info → amd_gaia-0.14.3.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,675 @@
1
+ # Copyright(C) 2025-2026 Advanced Micro Devices, Inc. All rights reserved.
2
+ # SPDX-License-Identifier: MIT
3
+
4
+ """
5
+ Generic file watching utilities for GAIA agents.
6
+
7
+ Provides FileChangeHandler and FileWatcher for monitoring directories
8
+ and responding to file system events with callbacks.
9
+
10
+ Also provides file hashing utilities for duplicate detection.
11
+
12
+ Example:
13
+ from gaia.utils import FileChangeHandler, FileWatcher, compute_file_hash
14
+
15
+ def on_new_file(path: str):
16
+ print(f"New file: {path}")
17
+ file_hash = compute_file_hash(path)
18
+ print(f"Hash: {file_hash}")
19
+
20
+ watcher = FileWatcher(
21
+ directory="./data",
22
+ on_created=on_new_file,
23
+ extensions=[".pdf", ".txt"],
24
+ )
25
+ watcher.start()
26
+ """
27
+
28
+ import hashlib
29
+ import logging
30
+ import time
31
+ from pathlib import Path
32
+ from typing import Any, Callable, Dict, List, Optional, Set, Union
33
+
34
+ try:
35
+ from watchdog.events import FileSystemEvent, FileSystemEventHandler
36
+ from watchdog.observers import Observer
37
+
38
+ WATCHDOG_AVAILABLE = True
39
+ except ImportError:
40
+ # Create dummy base class when watchdog is not available
41
+ class FileSystemEventHandler:
42
+ """Dummy base class when watchdog is not installed."""
43
+
44
+ class FileSystemEvent:
45
+ """Dummy event class when watchdog is not installed."""
46
+
47
+ src_path: str = ""
48
+ dest_path: str = ""
49
+ is_directory: bool = False
50
+
51
+ Observer = None
52
+ WATCHDOG_AVAILABLE = False
53
+
54
+ logger = logging.getLogger(__name__)
55
+
56
+ # Type alias for event callbacks
57
+ EventCallback = Callable[[str], None]
58
+ MoveCallback = Callable[[str, str], None] # (src_path, dest_path)
59
+ FilterCallback = Callable[[str], bool]
60
+
61
+ # Default chunk size for file hashing (64KB)
62
+ HASH_CHUNK_SIZE = 65536
63
+
64
+
65
+ def compute_file_hash(
66
+ path: Union[str, Path],
67
+ algorithm: str = "sha256",
68
+ chunk_size: int = HASH_CHUNK_SIZE,
69
+ ) -> Optional[str]:
70
+ """
71
+ Compute a hash of a file's contents.
72
+
73
+ Uses chunked reading to handle large files efficiently without
74
+ loading the entire file into memory.
75
+
76
+ Args:
77
+ path: Path to the file to hash.
78
+ algorithm: Hash algorithm to use (default: sha256).
79
+ Supports any algorithm from hashlib.
80
+ chunk_size: Size of chunks to read at a time (default: 64KB).
81
+
82
+ Returns:
83
+ Hex-encoded hash string, or None if file cannot be read.
84
+
85
+ Example:
86
+ from gaia.utils import compute_file_hash
87
+
88
+ # Check if file was already processed
89
+ file_hash = compute_file_hash("intake_form.pdf")
90
+ if file_hash in processed_hashes:
91
+ print("Already processed")
92
+ else:
93
+ process_file("intake_form.pdf")
94
+ processed_hashes.add(file_hash)
95
+ """
96
+ try:
97
+ file_path = Path(path)
98
+ if not file_path.exists() or not file_path.is_file():
99
+ return None
100
+
101
+ hasher = hashlib.new(algorithm)
102
+ with open(file_path, "rb") as f:
103
+ while chunk := f.read(chunk_size):
104
+ hasher.update(chunk)
105
+ return hasher.hexdigest()
106
+ except (OSError, IOError, ValueError) as e:
107
+ logger.warning(f"Could not compute hash for {path}: {e}")
108
+ return None
109
+
110
+
111
+ def compute_bytes_hash(
112
+ data: bytes,
113
+ algorithm: str = "sha256",
114
+ ) -> str:
115
+ """
116
+ Compute a hash of bytes data.
117
+
118
+ Useful when the file content is already loaded in memory.
119
+
120
+ Args:
121
+ data: Bytes to hash.
122
+ algorithm: Hash algorithm to use (default: sha256).
123
+
124
+ Returns:
125
+ Hex-encoded hash string.
126
+
127
+ Example:
128
+ from gaia.utils import compute_bytes_hash
129
+
130
+ with open("file.pdf", "rb") as f:
131
+ content = f.read()
132
+ file_hash = compute_bytes_hash(content)
133
+ """
134
+ hasher = hashlib.new(algorithm)
135
+ hasher.update(data)
136
+ return hasher.hexdigest()
137
+
138
+
139
+ class FileChangeHandler(FileSystemEventHandler):
140
+ """
141
+ Generic handler for file system events.
142
+
143
+ A flexible, callback-based file system event handler that can be used
144
+ with any agent or application. Supports:
145
+ - Callbacks for created, modified, deleted, and moved events
146
+ - File extension filtering
147
+ - Custom filter predicates
148
+ - Debouncing to prevent duplicate events
149
+ - Telemetry tracking
150
+
151
+ Example:
152
+ from gaia.utils import FileChangeHandler
153
+ from watchdog.observers import Observer
154
+
155
+ def handle_new_file(path: str):
156
+ print(f"Processing: {path}")
157
+
158
+ handler = FileChangeHandler(
159
+ on_created=handle_new_file,
160
+ extensions=[".pdf", ".png", ".jpg"],
161
+ debounce_seconds=2.0,
162
+ )
163
+
164
+ observer = Observer()
165
+ observer.schedule(handler, "./intake_forms", recursive=False)
166
+ observer.start()
167
+ """
168
+
169
+ # Default extensions for document processing
170
+ DEFAULT_EXTENSIONS: List[str] = [
171
+ ".pdf",
172
+ ".txt",
173
+ ".md",
174
+ ".markdown",
175
+ ".csv",
176
+ ".json",
177
+ ".py",
178
+ ".js",
179
+ ".ts",
180
+ ".java",
181
+ ".cpp",
182
+ ".c",
183
+ ".html",
184
+ ".css",
185
+ ".yaml",
186
+ ".yml",
187
+ ".xml",
188
+ ".rst",
189
+ ".log",
190
+ ]
191
+
192
+ def __init__(
193
+ self,
194
+ on_created: Optional[EventCallback] = None,
195
+ on_modified: Optional[EventCallback] = None,
196
+ on_deleted: Optional[EventCallback] = None,
197
+ on_moved: Optional[MoveCallback] = None,
198
+ extensions: Optional[List[str]] = None,
199
+ filter_func: Optional[FilterCallback] = None,
200
+ debounce_seconds: float = 2.0,
201
+ ignore_directories: bool = True,
202
+ ):
203
+ """
204
+ Initialize FileChangeHandler.
205
+
206
+ Args:
207
+ on_created: Callback for file creation. Receives file path.
208
+ on_modified: Callback for file modification. Receives file path.
209
+ on_deleted: Callback for file deletion. Receives file path.
210
+ on_moved: Callback for file move/rename. Receives (src_path, dest_path).
211
+ extensions: List of file extensions to watch (e.g., [".pdf", ".txt"]).
212
+ If None, uses DEFAULT_EXTENSIONS.
213
+ If empty list [], watches all files.
214
+ filter_func: Custom filter function. If provided, called with file path
215
+ and should return True to process the event.
216
+ Takes precedence over extensions filter.
217
+ debounce_seconds: Minimum time between processing same file.
218
+ ignore_directories: If True, ignores directory events.
219
+
220
+ Example:
221
+ # Watch only PDFs and images
222
+ handler = FileChangeHandler(
223
+ on_created=process_file,
224
+ extensions=[".pdf", ".png", ".jpg"],
225
+ )
226
+
227
+ # Watch all files with custom filter
228
+ handler = FileChangeHandler(
229
+ on_created=process_file,
230
+ extensions=[], # Watch all
231
+ filter_func=lambda p: not p.startswith("."), # Exclude hidden
232
+ )
233
+ """
234
+ super().__init__()
235
+ self._on_created = on_created
236
+ self._on_modified = on_modified
237
+ self._on_deleted = on_deleted
238
+ self._on_moved = on_moved
239
+
240
+ # Set up extensions filter
241
+ if extensions is None:
242
+ self._extensions: Set[str] = set(self.DEFAULT_EXTENSIONS)
243
+ else:
244
+ # Normalize extensions to lowercase with leading dot
245
+ self._extensions = {
246
+ ext.lower() if ext.startswith(".") else f".{ext.lower()}"
247
+ for ext in extensions
248
+ }
249
+
250
+ self._filter_func = filter_func
251
+ self._debounce_seconds = debounce_seconds
252
+ self._ignore_directories = ignore_directories
253
+
254
+ # Debounce tracking
255
+ self._last_processed: Dict[str, float] = {}
256
+ self._max_cache_size = 1000
257
+
258
+ # Telemetry
259
+ self._telemetry: Dict[str, Any] = {
260
+ "files_created": 0,
261
+ "files_modified": 0,
262
+ "files_deleted": 0,
263
+ "files_moved": 0,
264
+ "total_events": 0,
265
+ "last_event_time": None,
266
+ }
267
+
268
+ def _should_process(self, file_path: str) -> bool:
269
+ """Check if file should be processed based on filters."""
270
+ # Custom filter takes precedence
271
+ if self._filter_func is not None:
272
+ return self._filter_func(file_path)
273
+
274
+ # Empty extensions list means watch all files
275
+ if not self._extensions:
276
+ return True
277
+
278
+ # Check extension
279
+ file_lower = file_path.lower()
280
+ return any(file_lower.endswith(ext) for ext in self._extensions)
281
+
282
+ def _is_debounced(self, file_path: str) -> bool:
283
+ """Check if file was recently processed (within debounce window)."""
284
+ current_time = time.time()
285
+ last_time = self._last_processed.get(file_path, 0)
286
+
287
+ if current_time - last_time <= self._debounce_seconds:
288
+ return True
289
+
290
+ # Update last processed time
291
+ self._last_processed[file_path] = current_time
292
+
293
+ # LRU cache eviction to prevent memory leaks
294
+ if len(self._last_processed) > self._max_cache_size:
295
+ num_to_remove = self._max_cache_size // 10
296
+ sorted_items = sorted(self._last_processed.items(), key=lambda x: x[1])
297
+ for path, _ in sorted_items[:num_to_remove]:
298
+ del self._last_processed[path]
299
+ logger.debug(f"Cleaned up {num_to_remove} old entries from debounce cache")
300
+
301
+ return False
302
+
303
+ def _update_telemetry(self, event_type: str) -> None:
304
+ """Update telemetry statistics."""
305
+ self._telemetry[event_type] += 1
306
+ self._telemetry["total_events"] += 1
307
+ self._telemetry["last_event_time"] = time.time()
308
+
309
+ # Log telemetry periodically
310
+ if self._telemetry["total_events"] % 10 == 0:
311
+ logger.debug(
312
+ f"File Watch Telemetry: "
313
+ f"Created: {self._telemetry['files_created']}, "
314
+ f"Modified: {self._telemetry['files_modified']}, "
315
+ f"Deleted: {self._telemetry['files_deleted']}, "
316
+ f"Moved: {self._telemetry['files_moved']}, "
317
+ f"Total: {self._telemetry['total_events']}"
318
+ )
319
+
320
+ def on_created(self, event: FileSystemEvent) -> None:
321
+ """Handle file creation."""
322
+ if self._ignore_directories and event.is_directory:
323
+ return
324
+
325
+ if self._on_created and self._should_process(event.src_path):
326
+ if not self._is_debounced(event.src_path):
327
+ logger.debug(f"File created: {event.src_path}")
328
+ try:
329
+ self._on_created(event.src_path)
330
+ self._update_telemetry("files_created")
331
+ except Exception as e:
332
+ logger.error(
333
+ f"Error in on_created callback for {event.src_path}: {e}"
334
+ )
335
+
336
+ def on_modified(self, event: FileSystemEvent) -> None:
337
+ """Handle file modification."""
338
+ if self._ignore_directories and event.is_directory:
339
+ return
340
+
341
+ if self._on_modified and self._should_process(event.src_path):
342
+ if not self._is_debounced(event.src_path):
343
+ logger.debug(f"File modified: {event.src_path}")
344
+ try:
345
+ self._on_modified(event.src_path)
346
+ self._update_telemetry("files_modified")
347
+ except Exception as e:
348
+ logger.error(
349
+ f"Error in on_modified callback for {event.src_path}: {e}"
350
+ )
351
+
352
+ def on_deleted(self, event: FileSystemEvent) -> None:
353
+ """Handle file deletion."""
354
+ if self._ignore_directories and event.is_directory:
355
+ return
356
+
357
+ if self._on_deleted and self._should_process(event.src_path):
358
+ logger.debug(f"File deleted: {event.src_path}")
359
+ try:
360
+ self._on_deleted(event.src_path)
361
+ self._update_telemetry("files_deleted")
362
+ # Clean up from debounce cache
363
+ self._last_processed.pop(event.src_path, None)
364
+ except Exception as e:
365
+ logger.error(f"Error in on_deleted callback for {event.src_path}: {e}")
366
+
367
+ def on_moved(self, event: FileSystemEvent) -> None:
368
+ """Handle file move/rename."""
369
+ if self._ignore_directories and event.is_directory:
370
+ return
371
+
372
+ src_path = event.src_path
373
+ dest_path = getattr(event, "dest_path", None)
374
+
375
+ if self._on_moved and dest_path:
376
+ # Process if either source or destination matches filter
377
+ if self._should_process(src_path) or self._should_process(dest_path):
378
+ logger.debug(f"File moved: {src_path} -> {dest_path}")
379
+ try:
380
+ self._on_moved(src_path, dest_path)
381
+ self._update_telemetry("files_moved")
382
+ # Update debounce cache
383
+ self._last_processed.pop(src_path, None)
384
+ except Exception as e:
385
+ logger.error(f"Error in on_moved callback for {src_path}: {e}")
386
+
387
+ @property
388
+ def telemetry(self) -> Dict[str, Any]:
389
+ """Get current telemetry statistics."""
390
+ return self._telemetry.copy()
391
+
392
+ def reset_telemetry(self) -> None:
393
+ """Reset telemetry counters."""
394
+ self._telemetry = {
395
+ "files_created": 0,
396
+ "files_modified": 0,
397
+ "files_deleted": 0,
398
+ "files_moved": 0,
399
+ "total_events": 0,
400
+ "last_event_time": None,
401
+ }
402
+
403
+
404
+ class FileWatcher:
405
+ """
406
+ Convenience wrapper for watching a directory with FileChangeHandler.
407
+
408
+ Combines Observer and FileChangeHandler for easy directory watching.
409
+ Handles start/stop lifecycle and provides a clean API.
410
+
411
+ Example:
412
+ from gaia.utils import FileWatcher
413
+
414
+ def process_intake(path: str):
415
+ print(f"Processing intake form: {path}")
416
+
417
+ watcher = FileWatcher(
418
+ directory="./intake_forms",
419
+ on_created=process_intake,
420
+ extensions=[".pdf", ".png", ".jpg"],
421
+ )
422
+
423
+ watcher.start()
424
+ # ... do work ...
425
+ watcher.stop()
426
+
427
+ # Or use as context manager:
428
+ with FileWatcher("./data", on_created=process) as watcher:
429
+ # watcher is running
430
+ pass
431
+ # watcher is stopped
432
+ """
433
+
434
+ def __init__(
435
+ self,
436
+ directory: Union[str, Path],
437
+ on_created: Optional[EventCallback] = None,
438
+ on_modified: Optional[EventCallback] = None,
439
+ on_deleted: Optional[EventCallback] = None,
440
+ on_moved: Optional[MoveCallback] = None,
441
+ extensions: Optional[List[str]] = None,
442
+ filter_func: Optional[FilterCallback] = None,
443
+ debounce_seconds: float = 2.0,
444
+ recursive: bool = False,
445
+ ):
446
+ """
447
+ Initialize FileWatcher.
448
+
449
+ Args:
450
+ directory: Directory path to watch.
451
+ on_created: Callback for file creation.
452
+ on_modified: Callback for file modification.
453
+ on_deleted: Callback for file deletion.
454
+ on_moved: Callback for file move/rename.
455
+ extensions: File extensions to watch. None uses defaults, [] watches all.
456
+ filter_func: Custom filter predicate.
457
+ debounce_seconds: Debounce time between processing same file.
458
+ recursive: If True, watch subdirectories recursively.
459
+
460
+ Raises:
461
+ ImportError: If watchdog package is not installed.
462
+ FileNotFoundError: If directory does not exist.
463
+ """
464
+ if not WATCHDOG_AVAILABLE:
465
+ raise ImportError(
466
+ "FileWatcher requires the 'watchdog' package.\n"
467
+ "Install with: pip install 'watchdog>=2.1.0'\n"
468
+ "Or: uv pip install -e '.[dev]'"
469
+ )
470
+
471
+ self._directory = Path(directory)
472
+ if not self._directory.exists():
473
+ raise FileNotFoundError(f"Directory does not exist: {directory}")
474
+
475
+ self._recursive = recursive
476
+ self._observer: Optional[Observer] = None
477
+
478
+ self._handler = FileChangeHandler(
479
+ on_created=on_created,
480
+ on_modified=on_modified,
481
+ on_deleted=on_deleted,
482
+ on_moved=on_moved,
483
+ extensions=extensions,
484
+ filter_func=filter_func,
485
+ debounce_seconds=debounce_seconds,
486
+ )
487
+
488
+ def start(self) -> None:
489
+ """
490
+ Start watching the directory.
491
+
492
+ Safe to call multiple times - will not start multiple observers.
493
+ """
494
+ if self._observer is not None:
495
+ logger.warning("FileWatcher already running")
496
+ return
497
+
498
+ self._observer = Observer()
499
+ self._observer.schedule(
500
+ self._handler,
501
+ str(self._directory),
502
+ recursive=self._recursive,
503
+ )
504
+ self._observer.start()
505
+ logger.info(
506
+ f"Started watching: {self._directory} " f"(recursive={self._recursive})"
507
+ )
508
+
509
+ def stop(self) -> None:
510
+ """
511
+ Stop watching the directory.
512
+
513
+ Safe to call multiple times.
514
+ """
515
+ if self._observer is not None:
516
+ self._observer.stop()
517
+ self._observer.join(timeout=5.0)
518
+ self._observer = None
519
+ logger.info(f"Stopped watching: {self._directory}")
520
+
521
+ @property
522
+ def is_running(self) -> bool:
523
+ """True if watcher is currently running."""
524
+ return self._observer is not None and self._observer.is_alive()
525
+
526
+ @property
527
+ def directory(self) -> Path:
528
+ """Directory being watched."""
529
+ return self._directory
530
+
531
+ @property
532
+ def telemetry(self) -> Dict[str, Any]:
533
+ """Get telemetry from the handler."""
534
+ return self._handler.telemetry
535
+
536
+ def __enter__(self) -> "FileWatcher":
537
+ """Context manager entry - starts watching."""
538
+ self.start()
539
+ return self
540
+
541
+ def __exit__(self, exc_type, exc_val, exc_tb) -> None:
542
+ """Context manager exit - stops watching."""
543
+ self.stop()
544
+
545
+
546
+ def check_watchdog_available() -> bool:
547
+ """Check if watchdog package is available."""
548
+ return WATCHDOG_AVAILABLE
549
+
550
+
551
+ class FileWatcherMixin:
552
+ """
553
+ Mixin providing file watching capabilities for GAIA agents.
554
+
555
+ Manages multiple FileWatcher instances with automatic cleanup.
556
+
557
+ Example:
558
+ from gaia import Agent, FileWatcherMixin
559
+
560
+ class IntakeAgent(Agent, FileWatcherMixin):
561
+ def __init__(self, **kwargs):
562
+ super().__init__(**kwargs)
563
+
564
+ self.watch_directory(
565
+ "./intake_forms",
566
+ on_created=self._process_form,
567
+ extensions=[".pdf", ".png"],
568
+ )
569
+
570
+ def _process_form(self, path: str):
571
+ print(f"Processing: {path}")
572
+ """
573
+
574
+ _watchers: List[FileWatcher]
575
+
576
+ def watch_directory(
577
+ self,
578
+ directory: Union[str, Path],
579
+ on_created: Optional[EventCallback] = None,
580
+ on_modified: Optional[EventCallback] = None,
581
+ on_deleted: Optional[EventCallback] = None,
582
+ on_moved: Optional[MoveCallback] = None,
583
+ extensions: Optional[List[str]] = None,
584
+ filter_func: Optional[FilterCallback] = None,
585
+ debounce_seconds: float = 2.0,
586
+ recursive: bool = False,
587
+ auto_start: bool = True,
588
+ ) -> FileWatcher:
589
+ """
590
+ Watch a directory for file changes.
591
+
592
+ Args:
593
+ directory: Directory path to watch.
594
+ on_created: Callback for file creation.
595
+ on_modified: Callback for file modification.
596
+ on_deleted: Callback for file deletion.
597
+ on_moved: Callback for file move/rename.
598
+ extensions: File extensions to watch. None uses defaults, [] watches all.
599
+ filter_func: Custom filter predicate.
600
+ debounce_seconds: Debounce time between processing same file.
601
+ recursive: If True, watch subdirectories recursively.
602
+ auto_start: If True, start watching immediately.
603
+
604
+ Returns:
605
+ The FileWatcher instance.
606
+
607
+ Example:
608
+ self.watch_directory(
609
+ "./data",
610
+ on_created=self.handle_new_file,
611
+ extensions=[".pdf", ".txt"],
612
+ )
613
+ """
614
+ # Initialize watchers list if needed
615
+ if not hasattr(self, "_watchers"):
616
+ self._watchers = []
617
+
618
+ watcher = FileWatcher(
619
+ directory=directory,
620
+ on_created=on_created,
621
+ on_modified=on_modified,
622
+ on_deleted=on_deleted,
623
+ on_moved=on_moved,
624
+ extensions=extensions,
625
+ filter_func=filter_func,
626
+ debounce_seconds=debounce_seconds,
627
+ recursive=recursive,
628
+ )
629
+
630
+ self._watchers.append(watcher)
631
+
632
+ if auto_start:
633
+ watcher.start()
634
+
635
+ return watcher
636
+
637
+ def stop_all_watchers(self) -> None:
638
+ """Stop all file watchers."""
639
+ if hasattr(self, "_watchers"):
640
+ for watcher in self._watchers:
641
+ watcher.stop()
642
+ logger.info(f"Stopped {len(self._watchers)} file watcher(s)")
643
+
644
+ @property
645
+ def watchers(self) -> List[FileWatcher]:
646
+ """List of active file watchers."""
647
+ if not hasattr(self, "_watchers"):
648
+ self._watchers = []
649
+ return self._watchers
650
+
651
+ @property
652
+ def watching_directories(self) -> List[Path]:
653
+ """List of directories being watched."""
654
+ return [w.directory for w in self.watchers if w.is_running]
655
+
656
+ @property
657
+ def watcher_telemetry(self) -> Dict[str, Any]:
658
+ """Combined telemetry from all watchers."""
659
+ combined = {
660
+ "files_created": 0,
661
+ "files_modified": 0,
662
+ "files_deleted": 0,
663
+ "files_moved": 0,
664
+ "total_events": 0,
665
+ "watcher_count": len(self.watchers),
666
+ "active_count": sum(1 for w in self.watchers if w.is_running),
667
+ }
668
+ for watcher in self.watchers:
669
+ t = watcher.telemetry
670
+ combined["files_created"] += t.get("files_created", 0)
671
+ combined["files_modified"] += t.get("files_modified", 0)
672
+ combined["files_deleted"] += t.get("files_deleted", 0)
673
+ combined["files_moved"] += t.get("files_moved", 0)
674
+ combined["total_events"] += t.get("total_events", 0)
675
+ return combined