aida-workbench 0.1.0__tar.gz

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 (332) hide show
  1. aida_workbench-0.1.0/.git-blame-ignore-revs +14 -0
  2. aida_workbench-0.1.0/.github/workflows/ci.yml +135 -0
  3. aida_workbench-0.1.0/.github/workflows/publish.yml +51 -0
  4. aida_workbench-0.1.0/.gitignore +40 -0
  5. aida_workbench-0.1.0/CHANGELOG.md +827 -0
  6. aida_workbench-0.1.0/CONTRIBUTING.md +46 -0
  7. aida_workbench-0.1.0/Claude outputs/fig-a-workspace-anatomy.png +0 -0
  8. aida_workbench-0.1.0/Claude outputs/fig-b-what-the-model-sees.png +0 -0
  9. aida_workbench-0.1.0/Claude outputs/fig-c-three-workspaces.png +0 -0
  10. aida_workbench-0.1.0/Claude outputs/fig-d-coming-from-chatgpt.png +0 -0
  11. aida_workbench-0.1.0/Claude outputs/pyirena_theme_before_after.png +0 -0
  12. aida_workbench-0.1.0/Claude outputs/usaxs-expert-diagram.png +0 -0
  13. aida_workbench-0.1.0/Claude outputs/usaxs-expert-diagram.svg +2 -0
  14. aida_workbench-0.1.0/Claude outputs/usaxs-instrument-ecosystem-1.md +89 -0
  15. aida_workbench-0.1.0/Claude outputs/usaxs-instrument-ecosystem.md +97 -0
  16. aida_workbench-0.1.0/Claude outputs/usaxs-user-diagram.png +0 -0
  17. aida_workbench-0.1.0/Claude outputs/usaxs-user-diagram.svg +2 -0
  18. aida_workbench-0.1.0/LICENSE +21 -0
  19. aida_workbench-0.1.0/PKG-INFO +174 -0
  20. aida_workbench-0.1.0/PLAN.md +433 -0
  21. aida_workbench-0.1.0/README.md +133 -0
  22. aida_workbench-0.1.0/docs/README.md +42 -0
  23. aida_workbench-0.1.0/docs/coding-and-scripting.md +189 -0
  24. aida_workbench-0.1.0/docs/concepts.md +382 -0
  25. aida_workbench-0.1.0/docs/context-and-limits.md +130 -0
  26. aida_workbench-0.1.0/docs/documents.md +119 -0
  27. aida_workbench-0.1.0/docs/figures/fig-a-workspace-anatomy.png +0 -0
  28. aida_workbench-0.1.0/docs/figures/fig-a-workspace-anatomy.svg +98 -0
  29. aida_workbench-0.1.0/docs/figures/fig-b-what-the-model-sees.png +0 -0
  30. aida_workbench-0.1.0/docs/figures/fig-b-what-the-model-sees.svg +85 -0
  31. aida_workbench-0.1.0/docs/figures/fig-c-three-workspaces.png +0 -0
  32. aida_workbench-0.1.0/docs/figures/fig-c-three-workspaces.svg +113 -0
  33. aida_workbench-0.1.0/docs/figures/fig-d-coming-from-chatgpt.png +0 -0
  34. aida_workbench-0.1.0/docs/figures/fig-d-coming-from-chatgpt.svg +44 -0
  35. aida_workbench-0.1.0/docs/figures/make_figures.py +648 -0
  36. aida_workbench-0.1.0/docs/gui-overview.md +213 -0
  37. aida_workbench-0.1.0/docs/installation.md +233 -0
  38. aida_workbench-0.1.0/docs/knowledge-bases.md +174 -0
  39. aida_workbench-0.1.0/docs/mcp-servers.md +377 -0
  40. aida_workbench-0.1.0/docs/moving-and-sharing.md +229 -0
  41. aida_workbench-0.1.0/docs/organizing-conversations.md +109 -0
  42. aida_workbench-0.1.0/docs/providers-and-secrets.md +236 -0
  43. aida_workbench-0.1.0/docs/pyirena.md +165 -0
  44. aida_workbench-0.1.0/docs/safety-and-permissions.md +195 -0
  45. aida_workbench-0.1.0/docs/talk-intro-slide.md +62 -0
  46. aida_workbench-0.1.0/docs/workflows.md +286 -0
  47. aida_workbench-0.1.0/docs/workspaces.md +127 -0
  48. aida_workbench-0.1.0/environment.yml +8 -0
  49. aida_workbench-0.1.0/examples/config/config.yaml +35 -0
  50. aida_workbench-0.1.0/examples/config/mcp.json +20 -0
  51. aida_workbench-0.1.0/examples/config/providers.yaml +60 -0
  52. aida_workbench-0.1.0/examples/config/workspaces.yaml +61 -0
  53. aida_workbench-0.1.0/planning/AIEVALUATOR_EPICS_MCP_SETUP.md +312 -0
  54. aida_workbench-0.1.0/planning/COMPLETED.md +546 -0
  55. aida_workbench-0.1.0/planning/DESIGN.md +402 -0
  56. aida_workbench-0.1.0/planning/PLAN_INSTRUMENT_INTEGRATION.md +525 -0
  57. aida_workbench-0.1.0/planning/context_management.md +312 -0
  58. aida_workbench-0.1.0/planning/credentials_and_browser_automation.md +174 -0
  59. aida_workbench-0.1.0/planning/document_images.md +270 -0
  60. aida_workbench-0.1.0/planning/documents_implementation.md +523 -0
  61. aida_workbench-0.1.0/planning/gui_implementation_guide.md +451 -0
  62. aida_workbench-0.1.0/planning/improvement_plan_2026-08.md +1150 -0
  63. aida_workbench-0.1.0/planning/improvement_plan_2026-09.md +256 -0
  64. aida_workbench-0.1.0/planning/local_scientific_ai_agent_proposal.md +938 -0
  65. aida_workbench-0.1.0/planning/mcp_tool_scaling.md +187 -0
  66. aida_workbench-0.1.0/planning/multiuser_plan.md +524 -0
  67. aida_workbench-0.1.0/planning/phase01_foundation.md +96 -0
  68. aida_workbench-0.1.0/planning/phase02_agent_core.md +154 -0
  69. aida_workbench-0.1.0/planning/phase03_mcp.md +183 -0
  70. aida_workbench-0.1.0/planning/phase04_persistence_workspaces.md +113 -0
  71. aida_workbench-0.1.0/planning/phase05_gui.md +190 -0
  72. aida_workbench-0.1.0/planning/phase06_documents.md +438 -0
  73. aida_workbench-0.1.0/planning/phase07_mcp_management.md +386 -0
  74. aida_workbench-0.1.0/planning/phase08_rag.md +241 -0
  75. aida_workbench-0.1.0/planning/phase09_coding_scripting.md +126 -0
  76. aida_workbench-0.1.0/planning/phase10_automation_distribution.md +127 -0
  77. aida_workbench-0.1.0/planning/phase10_scheduling_design.md +459 -0
  78. aida_workbench-0.1.0/planning/phase_future.md +84 -0
  79. aida_workbench-0.1.0/planning/portability.md +462 -0
  80. aida_workbench-0.1.0/pyproject.toml +129 -0
  81. aida_workbench-0.1.0/skills/README.md +52 -0
  82. aida_workbench-0.1.0/skills/pyirena-usage.md +75 -0
  83. aida_workbench-0.1.0/skills/review-checklist.md +93 -0
  84. aida_workbench-0.1.0/skills/saxs-basics.md +70 -0
  85. aida_workbench-0.1.0/src/aida/__init__.py +7 -0
  86. aida_workbench-0.1.0/src/aida/artifacts/__init__.py +30 -0
  87. aida_workbench-0.1.0/src/aida/artifacts/base.py +96 -0
  88. aida_workbench-0.1.0/src/aida/artifacts/policy.py +83 -0
  89. aida_workbench-0.1.0/src/aida/artifacts/store.py +156 -0
  90. aida_workbench-0.1.0/src/aida/cli/__init__.py +6 -0
  91. aida_workbench-0.1.0/src/aida/cli/__main__.py +134 -0
  92. aida_workbench-0.1.0/src/aida/cli/_gui_diagnosis.py +48 -0
  93. aida_workbench-0.1.0/src/aida/cli/chat.py +388 -0
  94. aida_workbench-0.1.0/src/aida/cli/config_cmds.py +363 -0
  95. aida_workbench-0.1.0/src/aida/cli/conversations.py +407 -0
  96. aida_workbench-0.1.0/src/aida/cli/doctor.py +517 -0
  97. aida_workbench-0.1.0/src/aida/cli/documents_cmds.py +183 -0
  98. aida_workbench-0.1.0/src/aida/cli/kb_cmds.py +416 -0
  99. aida_workbench-0.1.0/src/aida/cli/mcp_cmds.py +927 -0
  100. aida_workbench-0.1.0/src/aida/cli/run.py +216 -0
  101. aida_workbench-0.1.0/src/aida/cli/schedule_cmds.py +222 -0
  102. aida_workbench-0.1.0/src/aida/cli/workflow_cmds.py +232 -0
  103. aida_workbench-0.1.0/src/aida/cli/workspace_cmds.py +283 -0
  104. aida_workbench-0.1.0/src/aida/coding/__init__.py +9 -0
  105. aida_workbench-0.1.0/src/aida/coding/runner.py +312 -0
  106. aida_workbench-0.1.0/src/aida/coding/templates.py +65 -0
  107. aida_workbench-0.1.0/src/aida/coding/tools.py +239 -0
  108. aida_workbench-0.1.0/src/aida/config/__init__.py +4 -0
  109. aida_workbench-0.1.0/src/aida/config/logging_setup.py +86 -0
  110. aida_workbench-0.1.0/src/aida/config/paths.py +244 -0
  111. aida_workbench-0.1.0/src/aida/config/secrets.py +101 -0
  112. aida_workbench-0.1.0/src/aida/config/settings.py +1642 -0
  113. aida_workbench-0.1.0/src/aida/config/users.py +168 -0
  114. aida_workbench-0.1.0/src/aida/core/__init__.py +1 -0
  115. aida_workbench-0.1.0/src/aida/core/agent.py +400 -0
  116. aida_workbench-0.1.0/src/aida/core/confirmation.py +172 -0
  117. aida_workbench-0.1.0/src/aida/core/context.py +684 -0
  118. aida_workbench-0.1.0/src/aida/core/cost.py +45 -0
  119. aida_workbench-0.1.0/src/aida/core/events.py +297 -0
  120. aida_workbench-0.1.0/src/aida/core/headless.py +46 -0
  121. aida_workbench-0.1.0/src/aida/core/proc_lock.py +70 -0
  122. aida_workbench-0.1.0/src/aida/core/scheduler_runtime.py +367 -0
  123. aida_workbench-0.1.0/src/aida/core/scheduling.py +151 -0
  124. aida_workbench-0.1.0/src/aida/core/session.py +1415 -0
  125. aida_workbench-0.1.0/src/aida/core/tools.py +109 -0
  126. aida_workbench-0.1.0/src/aida/core/workflows.py +279 -0
  127. aida_workbench-0.1.0/src/aida/documents/__init__.py +7 -0
  128. aida_workbench-0.1.0/src/aida/documents/attachments.py +159 -0
  129. aida_workbench-0.1.0/src/aida/documents/figure_tools.py +382 -0
  130. aida_workbench-0.1.0/src/aida/documents/figures.py +527 -0
  131. aida_workbench-0.1.0/src/aida/documents/ocr/__init__.py +22 -0
  132. aida_workbench-0.1.0/src/aida/documents/ocr/mistral.py +346 -0
  133. aida_workbench-0.1.0/src/aida/documents/readers.py +485 -0
  134. aida_workbench-0.1.0/src/aida/documents/tools.py +207 -0
  135. aida_workbench-0.1.0/src/aida/documents/writers/__init__.py +2 -0
  136. aida_workbench-0.1.0/src/aida/documents/writers/docx_writer.py +68 -0
  137. aida_workbench-0.1.0/src/aida/documents/writers/md_obsidian.py +152 -0
  138. aida_workbench-0.1.0/src/aida/knowledge/__init__.py +1 -0
  139. aida_workbench-0.1.0/src/aida/knowledge/rag/__init__.py +12 -0
  140. aida_workbench-0.1.0/src/aida/knowledge/rag/chunking.py +159 -0
  141. aida_workbench-0.1.0/src/aida/knowledge/rag/index.py +208 -0
  142. aida_workbench-0.1.0/src/aida/knowledge/rag/ingest.py +394 -0
  143. aida_workbench-0.1.0/src/aida/knowledge/rag/retrieval.py +141 -0
  144. aida_workbench-0.1.0/src/aida/mcp/__init__.py +22 -0
  145. aida_workbench-0.1.0/src/aida/mcp/aievaluator_setup.py +129 -0
  146. aida_workbench-0.1.0/src/aida/mcp/argument_coercion.py +198 -0
  147. aida_workbench-0.1.0/src/aida/mcp/config_io.py +88 -0
  148. aida_workbench-0.1.0/src/aida/mcp/env_discovery.py +238 -0
  149. aida_workbench-0.1.0/src/aida/mcp/epics_mcp_setup.py +197 -0
  150. aida_workbench-0.1.0/src/aida/mcp/groups.py +125 -0
  151. aida_workbench-0.1.0/src/aida/mcp/manager.py +544 -0
  152. aida_workbench-0.1.0/src/aida/mcp/pyirena_setup.py +396 -0
  153. aida_workbench-0.1.0/src/aida/mcp/results.py +137 -0
  154. aida_workbench-0.1.0/src/aida/mcp/server.py +606 -0
  155. aida_workbench-0.1.0/src/aida/mcp/tool_grouping.py +133 -0
  156. aida_workbench-0.1.0/src/aida/persistence/__init__.py +24 -0
  157. aida_workbench-0.1.0/src/aida/persistence/cleanup.py +302 -0
  158. aida_workbench-0.1.0/src/aida/persistence/db.py +224 -0
  159. aida_workbench-0.1.0/src/aida/persistence/recorder.py +343 -0
  160. aida_workbench-0.1.0/src/aida/persistence/records.py +230 -0
  161. aida_workbench-0.1.0/src/aida/persistence/store.py +648 -0
  162. aida_workbench-0.1.0/src/aida/portability/__init__.py +81 -0
  163. aida_workbench-0.1.0/src/aida/portability/bundle.py +1097 -0
  164. aida_workbench-0.1.0/src/aida/portability/closure.py +253 -0
  165. aida_workbench-0.1.0/src/aida/portability/contents.py +274 -0
  166. aida_workbench-0.1.0/src/aida/portability/path_issues.py +185 -0
  167. aida_workbench-0.1.0/src/aida/portability/paths_map.py +395 -0
  168. aida_workbench-0.1.0/src/aida/portability/report.py +207 -0
  169. aida_workbench-0.1.0/src/aida/providers/__init__.py +1 -0
  170. aida_workbench-0.1.0/src/aida/providers/anthropic_.py +582 -0
  171. aida_workbench-0.1.0/src/aida/providers/base.py +253 -0
  172. aida_workbench-0.1.0/src/aida/providers/embeddings_base.py +51 -0
  173. aida_workbench-0.1.0/src/aida/providers/mock.py +114 -0
  174. aida_workbench-0.1.0/src/aida/providers/mock_embeddings.py +60 -0
  175. aida_workbench-0.1.0/src/aida/providers/openai_compat.py +452 -0
  176. aida_workbench-0.1.0/src/aida/providers/openai_compat_embeddings.py +54 -0
  177. aida_workbench-0.1.0/src/aida/providers/profiles.py +169 -0
  178. aida_workbench-0.1.0/src/aida/providers/vision.py +121 -0
  179. aida_workbench-0.1.0/src/aida/ui/__init__.py +6 -0
  180. aida_workbench-0.1.0/src/aida/ui/qt/__init__.py +5 -0
  181. aida_workbench-0.1.0/src/aida/ui/qt/_qt.py +164 -0
  182. aida_workbench-0.1.0/src/aida/ui/qt/app.py +85 -0
  183. aida_workbench-0.1.0/src/aida/ui/qt/artifact_widgets.py +198 -0
  184. aida_workbench-0.1.0/src/aida/ui/qt/bridge.py +815 -0
  185. aida_workbench-0.1.0/src/aida/ui/qt/chat_panel.py +942 -0
  186. aida_workbench-0.1.0/src/aida/ui/qt/code_editor_dialog.py +218 -0
  187. aida_workbench-0.1.0/src/aida/ui/qt/collapsible.py +108 -0
  188. aida_workbench-0.1.0/src/aida/ui/qt/conversations_sidebar.py +526 -0
  189. aida_workbench-0.1.0/src/aida/ui/qt/icon.py +23 -0
  190. aida_workbench-0.1.0/src/aida/ui/qt/input_box.py +481 -0
  191. aida_workbench-0.1.0/src/aida/ui/qt/knowledge_management_dialog.py +433 -0
  192. aida_workbench-0.1.0/src/aida/ui/qt/main_window.py +2478 -0
  193. aida_workbench-0.1.0/src/aida/ui/qt/mcp_management_dialog.py +1582 -0
  194. aida_workbench-0.1.0/src/aida/ui/qt/notes_panel.py +134 -0
  195. aida_workbench-0.1.0/src/aida/ui/qt/onboarding_dialog.py +151 -0
  196. aida_workbench-0.1.0/src/aida/ui/qt/portability_dialog.py +532 -0
  197. aida_workbench-0.1.0/src/aida/ui/qt/profiles_dialog.py +705 -0
  198. aida_workbench-0.1.0/src/aida/ui/qt/python_highlighter.py +63 -0
  199. aida_workbench-0.1.0/src/aida/ui/qt/quick_tasks_panel.py +229 -0
  200. aida_workbench-0.1.0/src/aida/ui/qt/resources/app_icon.png +0 -0
  201. aida_workbench-0.1.0/src/aida/ui/qt/resources/app_icon_old.png +0 -0
  202. aida_workbench-0.1.0/src/aida/ui/qt/retrieval_widget.py +75 -0
  203. aida_workbench-0.1.0/src/aida/ui/qt/schedule_management_dialog.py +414 -0
  204. aida_workbench-0.1.0/src/aida/ui/qt/scheduler_bridge.py +136 -0
  205. aida_workbench-0.1.0/src/aida/ui/qt/selectors.py +543 -0
  206. aida_workbench-0.1.0/src/aida/ui/qt/settings_dialog.py +379 -0
  207. aida_workbench-0.1.0/src/aida/ui/qt/tool_call_group.py +225 -0
  208. aida_workbench-0.1.0/src/aida/ui/qt/tool_call_widget.py +187 -0
  209. aida_workbench-0.1.0/src/aida/ui/qt/users_dialog.py +253 -0
  210. aida_workbench-0.1.0/src/aida/ui/qt/window_state.py +58 -0
  211. aida_workbench-0.1.0/src/aida/ui/qt/workflow_management_dialog.py +471 -0
  212. aida_workbench-0.1.0/src/aida/ui/qt/workspace_management_dialog.py +575 -0
  213. aida_workbench-0.1.0/src/aida/workspace/__init__.py +29 -0
  214. aida_workbench-0.1.0/src/aida/workspace/command_allowlist.py +93 -0
  215. aida_workbench-0.1.0/src/aida/workspace/files.py +987 -0
  216. aida_workbench-0.1.0/src/aida/workspace/safety.py +432 -0
  217. aida_workbench-0.1.0/src/aida/workspace/web.py +151 -0
  218. aida_workbench-0.1.0/src/aida/workspace/workspaces.py +232 -0
  219. aida_workbench-0.1.0/tests/__init__.py +0 -0
  220. aida_workbench-0.1.0/tests/conftest.py +28 -0
  221. aida_workbench-0.1.0/tests/mock_mcp_server.py +126 -0
  222. aida_workbench-0.1.0/tests/test_agent_loop.py +837 -0
  223. aida_workbench-0.1.0/tests/test_aievaluator_setup.py +132 -0
  224. aida_workbench-0.1.0/tests/test_anthropic_provider_ping.py +75 -0
  225. aida_workbench-0.1.0/tests/test_artifacts.py +171 -0
  226. aida_workbench-0.1.0/tests/test_attachments.py +375 -0
  227. aida_workbench-0.1.0/tests/test_chat_cli.py +1040 -0
  228. aida_workbench-0.1.0/tests/test_chunking.py +116 -0
  229. aida_workbench-0.1.0/tests/test_coding_runner.py +89 -0
  230. aida_workbench-0.1.0/tests/test_coding_templates.py +66 -0
  231. aida_workbench-0.1.0/tests/test_coding_tools.py +379 -0
  232. aida_workbench-0.1.0/tests/test_command_allowlist.py +59 -0
  233. aida_workbench-0.1.0/tests/test_compaction.py +265 -0
  234. aida_workbench-0.1.0/tests/test_config_cmds.py +451 -0
  235. aida_workbench-0.1.0/tests/test_confirmation.py +152 -0
  236. aida_workbench-0.1.0/tests/test_context.py +660 -0
  237. aida_workbench-0.1.0/tests/test_contract_layering.py +44 -0
  238. aida_workbench-0.1.0/tests/test_conversations_cli.py +354 -0
  239. aida_workbench-0.1.0/tests/test_cost.py +45 -0
  240. aida_workbench-0.1.0/tests/test_doctor.py +545 -0
  241. aida_workbench-0.1.0/tests/test_document_readers.py +424 -0
  242. aida_workbench-0.1.0/tests/test_document_tools.py +235 -0
  243. aida_workbench-0.1.0/tests/test_document_writers.py +252 -0
  244. aida_workbench-0.1.0/tests/test_docx_figures.py +258 -0
  245. aida_workbench-0.1.0/tests/test_env_discovery.py +176 -0
  246. aida_workbench-0.1.0/tests/test_epics_mcp_setup.py +141 -0
  247. aida_workbench-0.1.0/tests/test_events.py +60 -0
  248. aida_workbench-0.1.0/tests/test_figures.py +306 -0
  249. aida_workbench-0.1.0/tests/test_headless.py +115 -0
  250. aida_workbench-0.1.0/tests/test_kb_cmds.py +437 -0
  251. aida_workbench-0.1.0/tests/test_keystone_image_roundtrip.py +152 -0
  252. aida_workbench-0.1.0/tests/test_knowledge_index.py +151 -0
  253. aida_workbench-0.1.0/tests/test_knowledge_ingest.py +432 -0
  254. aida_workbench-0.1.0/tests/test_knowledge_retrieval.py +127 -0
  255. aida_workbench-0.1.0/tests/test_logging_setup.py +55 -0
  256. aida_workbench-0.1.0/tests/test_main_cli_dispatch.py +76 -0
  257. aida_workbench-0.1.0/tests/test_mcp_argument_coercion.py +160 -0
  258. aida_workbench-0.1.0/tests/test_mcp_cmds.py +736 -0
  259. aida_workbench-0.1.0/tests/test_mcp_config_io.py +103 -0
  260. aida_workbench-0.1.0/tests/test_mcp_groups.py +152 -0
  261. aida_workbench-0.1.0/tests/test_mcp_manager.py +829 -0
  262. aida_workbench-0.1.0/tests/test_mcp_results.py +236 -0
  263. aida_workbench-0.1.0/tests/test_mcp_server.py +642 -0
  264. aida_workbench-0.1.0/tests/test_mcp_tool_grouping.py +184 -0
  265. aida_workbench-0.1.0/tests/test_mock_embeddings.py +71 -0
  266. aida_workbench-0.1.0/tests/test_ocr.py +469 -0
  267. aida_workbench-0.1.0/tests/test_paths.py +103 -0
  268. aida_workbench-0.1.0/tests/test_persistence_cleanup.py +230 -0
  269. aida_workbench-0.1.0/tests/test_persistence_db.py +223 -0
  270. aida_workbench-0.1.0/tests/test_persistence_recorder.py +269 -0
  271. aida_workbench-0.1.0/tests/test_persistence_records.py +223 -0
  272. aida_workbench-0.1.0/tests/test_persistence_store.py +372 -0
  273. aida_workbench-0.1.0/tests/test_phase4_acceptance.py +245 -0
  274. aida_workbench-0.1.0/tests/test_phase6_acceptance.py +216 -0
  275. aida_workbench-0.1.0/tests/test_portability.py +1076 -0
  276. aida_workbench-0.1.0/tests/test_proc_lock.py +51 -0
  277. aida_workbench-0.1.0/tests/test_profiles.py +177 -0
  278. aida_workbench-0.1.0/tests/test_provider_lifecycle.py +179 -0
  279. aida_workbench-0.1.0/tests/test_provider_param_fallback.py +338 -0
  280. aida_workbench-0.1.0/tests/test_provider_translation.py +1097 -0
  281. aida_workbench-0.1.0/tests/test_pyirena_setup.py +270 -0
  282. aida_workbench-0.1.0/tests/test_regressions_phase6.py +332 -0
  283. aida_workbench-0.1.0/tests/test_review_2026_08_findings.py +556 -0
  284. aida_workbench-0.1.0/tests/test_run_cli.py +219 -0
  285. aida_workbench-0.1.0/tests/test_schedule_cmds.py +128 -0
  286. aida_workbench-0.1.0/tests/test_scheduler_runtime.py +465 -0
  287. aida_workbench-0.1.0/tests/test_scheduling.py +159 -0
  288. aida_workbench-0.1.0/tests/test_secrets.py +65 -0
  289. aida_workbench-0.1.0/tests/test_settings.py +1021 -0
  290. aida_workbench-0.1.0/tests/test_start_session.py +1342 -0
  291. aida_workbench-0.1.0/tests/test_users.py +457 -0
  292. aida_workbench-0.1.0/tests/test_web_tools.py +192 -0
  293. aida_workbench-0.1.0/tests/test_workflow_cmds.py +185 -0
  294. aida_workbench-0.1.0/tests/test_workflows.py +338 -0
  295. aida_workbench-0.1.0/tests/test_workspace.py +259 -0
  296. aida_workbench-0.1.0/tests/test_workspace_cmds.py +478 -0
  297. aida_workbench-0.1.0/tests/test_workspace_files.py +726 -0
  298. aida_workbench-0.1.0/tests/test_workspace_safety.py +602 -0
  299. aida_workbench-0.1.0/tests/ui/__init__.py +0 -0
  300. aida_workbench-0.1.0/tests/ui/_qt_test_utils.py +40 -0
  301. aida_workbench-0.1.0/tests/ui/conftest.py +148 -0
  302. aida_workbench-0.1.0/tests/ui/test_app.py +67 -0
  303. aida_workbench-0.1.0/tests/ui/test_artifact_widgets.py +162 -0
  304. aida_workbench-0.1.0/tests/ui/test_bridge.py +524 -0
  305. aida_workbench-0.1.0/tests/ui/test_bridge_lifecycle.py +323 -0
  306. aida_workbench-0.1.0/tests/ui/test_chat_panel.py +989 -0
  307. aida_workbench-0.1.0/tests/ui/test_code_editor_dialog.py +218 -0
  308. aida_workbench-0.1.0/tests/ui/test_collapsible.py +67 -0
  309. aida_workbench-0.1.0/tests/ui/test_conversations_sidebar.py +778 -0
  310. aida_workbench-0.1.0/tests/ui/test_icon.py +17 -0
  311. aida_workbench-0.1.0/tests/ui/test_input_box.py +528 -0
  312. aida_workbench-0.1.0/tests/ui/test_knowledge_management_dialog.py +504 -0
  313. aida_workbench-0.1.0/tests/ui/test_main_window.py +3903 -0
  314. aida_workbench-0.1.0/tests/ui/test_mcp_management_dialog.py +988 -0
  315. aida_workbench-0.1.0/tests/ui/test_notes_panel.py +113 -0
  316. aida_workbench-0.1.0/tests/ui/test_onboarding_dialog.py +104 -0
  317. aida_workbench-0.1.0/tests/ui/test_portability_dialog.py +279 -0
  318. aida_workbench-0.1.0/tests/ui/test_profiles_dialog.py +408 -0
  319. aida_workbench-0.1.0/tests/ui/test_python_highlighter.py +61 -0
  320. aida_workbench-0.1.0/tests/ui/test_qt_contract.py +127 -0
  321. aida_workbench-0.1.0/tests/ui/test_quick_tasks_panel.py +197 -0
  322. aida_workbench-0.1.0/tests/ui/test_schedule_management_dialog.py +325 -0
  323. aida_workbench-0.1.0/tests/ui/test_scheduler_bridge.py +274 -0
  324. aida_workbench-0.1.0/tests/ui/test_selectors.py +572 -0
  325. aida_workbench-0.1.0/tests/ui/test_settings_dialog.py +381 -0
  326. aida_workbench-0.1.0/tests/ui/test_tool_call_group.py +155 -0
  327. aida_workbench-0.1.0/tests/ui/test_tool_call_widget.py +122 -0
  328. aida_workbench-0.1.0/tests/ui/test_users_dialog.py +206 -0
  329. aida_workbench-0.1.0/tests/ui/test_window_state.py +47 -0
  330. aida_workbench-0.1.0/tests/ui/test_workflow_management_dialog.py +338 -0
  331. aida_workbench-0.1.0/tests/ui/test_workspace_management_dialog.py +451 -0
  332. aida_workbench-0.1.0/uv.lock +1622 -0
@@ -0,0 +1,14 @@
1
+ # Revisions `git blame` should look through rather than at.
2
+ #
3
+ # Enable it once per clone:
4
+ # git config blame.ignoreRevsFile .git-blame-ignore-revs
5
+ # (GitHub's blame view honours this file automatically.)
6
+ #
7
+ # Only ever add a commit that changed *no behaviour*. A mixed commit cannot
8
+ # be un-mixed later, which is why the formatting pass below was kept
9
+ # deliberately separate from the work around it.
10
+
11
+ # Formatting: ruff format across the tree, 2026-09-05.
12
+ # Verified AST-identical before and after, except 14 files where only
13
+ # docstring indentation changed.
14
+ 70d5d0b90f53ba32333a2db864c77c0387de199b
@@ -0,0 +1,135 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+
9
+ jobs:
10
+ test:
11
+ strategy:
12
+ fail-fast: false
13
+ matrix:
14
+ os: [ubuntu-latest, macos-latest, windows-latest]
15
+ python-version: ["3.11", "3.13"]
16
+ runs-on: ${{ matrix.os }}
17
+ steps:
18
+ - uses: actions/checkout@v4
19
+
20
+ - name: Set up Python ${{ matrix.python-version }}
21
+ uses: actions/setup-python@v5
22
+ with:
23
+ python-version: ${{ matrix.python-version }}
24
+
25
+ # PySide6's QtGui module dynamically links these at import time even
26
+ # under QT_QPA_PLATFORM=offscreen (set in tests/ui/conftest.py) — the
27
+ # offscreen platform plugin avoids needing a real display, but the
28
+ # shared libraries themselves still have to be present. A bare
29
+ # ubuntu-latest runner has none of them, so tests/ui's whole
30
+ # collection failed at `import PySide6.QtGui` with
31
+ # "ImportError: libEGL.so.1: cannot open shared object file".
32
+ - name: Install Qt runtime libraries (Linux, headless)
33
+ if: runner.os == 'Linux'
34
+ run: |
35
+ # The runner image ships a Google Chrome apt source this job never
36
+ # installs from, and dl.google.com regularly serves a stale index
37
+ # for it ("Hash Sum mismatch" on chrome-stable's Packages.gz),
38
+ # which makes `apt-get update` exit 100 and fails the whole Linux
39
+ # matrix leg over a repo we do not use. Drop just that source —
40
+ # not all of sources.list.d, which on 24.04 also holds Ubuntu's
41
+ # own archive in ubuntu.sources.
42
+ sudo rm -f /etc/apt/sources.list.d/*google-chrome*
43
+ sudo apt-get update
44
+ sudo apt-get install -y \
45
+ libegl1 libgl1 \
46
+ libxkbcommon0 libxkbcommon-x11-0 \
47
+ libxcb-cursor0 libxcb-icccm4 libxcb-image0 libxcb-keysyms1 \
48
+ libxcb-randr0 libxcb-render-util0 libxcb-shape0 libxcb-xinerama0 \
49
+ libdbus-1-3
50
+
51
+ - name: Install package (dev, gui, docs, ocr extras)
52
+ # `ocr` is only httpx, which the openai/anthropic SDKs already pull
53
+ # in — installing it explicitly means CI exercises the real
54
+ # optional-import path rather than the stubs alone.
55
+ run: pip install -e ".[dev,gui,docs,ocr]"
56
+
57
+ - name: Ruff lint
58
+ run: ruff check .
59
+
60
+ # Added after a one-off `ruff format` pass over the whole tree
61
+ # (see .git-blame-ignore-revs). Gating it only made sense once the
62
+ # tree was already clean: doing it the other way round turns main red
63
+ # on the very commit that fixes it.
64
+ - name: Ruff format check
65
+ run: ruff format --check .
66
+
67
+ # Two invocations, not one `pytest -v` over the whole tree: every GUI
68
+ # test shares a single process-wide QApplication (Qt disallows more
69
+ # than one) plus a fresh QThread+asyncio loop per test
70
+ # (tests/ui/conftest.py's `loop_thread`), and the non-GUI suite spawns
71
+ # its own real subprocesses (MCP manager/server tests, coding-tool
72
+ # tests). Combined into one pytest process, the two together push
73
+ # cumulative Qt object/thread churn on one long-lived QApplication
74
+ # high enough to occasionally hit a native crash deep in Qt's own
75
+ # event/timer dispatch — a segfault on Linux, an access violation on
76
+ # Windows, at a different call site each time, always somewhere under
77
+ # ChatBridge's background loop or later Qt event delivery, never at a
78
+ # line this project owns. Splitting the run in two roughly halves the
79
+ # cumulative churn either half accumulates and has not reproduced the
80
+ # crash across many repeated local runs (see
81
+ # planning/improvement_plan_2026-08.md's "Known issues" section for
82
+ # the full writeup and the longer-term follow-up options).
83
+ - name: Pytest (non-GUI)
84
+ run: pytest -v --ignore=tests/ui
85
+
86
+ - name: Pytest (GUI)
87
+ run: pytest -v tests/ui
88
+
89
+ # Validates the artifact users actually install, which the test job above
90
+ # does not: it runs against an editable install of the source tree, so a
91
+ # packaging mistake — a subpackage missing from the wheel, a bundled
92
+ # skills file not included, a dependency declared but unresolvable —
93
+ # passes every test and still breaks `pip install aida-workbench`. One
94
+ # cheap job, one OS: packaging errors of this kind are not
95
+ # platform-specific.
96
+ package:
97
+ runs-on: ubuntu-latest
98
+ steps:
99
+ - uses: actions/checkout@v4
100
+
101
+ - name: Set up Python
102
+ uses: actions/setup-python@v5
103
+ with:
104
+ python-version: "3.11"
105
+
106
+ - name: Build the wheel and sdist
107
+ run: |
108
+ pip install build
109
+ python -m build
110
+
111
+ - name: Install the built wheel into a clean environment
112
+ run: |
113
+ python -m venv /tmp/wheel-check
114
+ /tmp/wheel-check/bin/pip install dist/*.whl
115
+
116
+ - name: Verify the installed package imports and its console script runs
117
+ run: |
118
+ /tmp/wheel-check/bin/python -c "import aida; print(aida.__version__ if hasattr(aida, '__version__') else 'ok')"
119
+ /tmp/wheel-check/bin/aida --help > /dev/null
120
+
121
+ - name: Verify the bundled skills travelled inside the wheel
122
+ # `pip install aida-workbench` users have no repo to copy these
123
+ # from — see the hatch build config's note on why they are packaged.
124
+ run: |
125
+ /tmp/wheel-check/bin/python -c "
126
+ from aida.config.paths import bundled_skills_dir
127
+ source = bundled_skills_dir()
128
+ assert source is not None, 'bundled skills are missing from the wheel'
129
+ entries = list(source.iterdir())
130
+ assert entries, f'{source} is present but empty'
131
+ print(f'{len(entries)} bundled skill entr(ies) present')
132
+ "
133
+
134
+ - name: pip check (declared dependencies actually resolve)
135
+ run: /tmp/wheel-check/bin/pip check
@@ -0,0 +1,51 @@
1
+ name: Publish to PyPI
2
+
3
+ on:
4
+ release:
5
+ types: [published]
6
+
7
+ jobs:
8
+ build:
9
+ name: Build distribution
10
+ runs-on: ubuntu-latest
11
+
12
+ steps:
13
+ - uses: actions/checkout@v4
14
+
15
+ - uses: actions/setup-python@v5
16
+ with:
17
+ python-version: "3.13"
18
+
19
+ - name: Install build
20
+ run: python -m pip install --upgrade build
21
+
22
+ - name: Build package
23
+ run: python -m build
24
+
25
+ - name: Upload distributions
26
+ uses: actions/upload-artifact@v4
27
+ with:
28
+ name: python-package-distributions
29
+ path: dist/
30
+
31
+ publish:
32
+ name: Publish to PyPI
33
+ needs: build
34
+ runs-on: ubuntu-latest
35
+
36
+ environment:
37
+ name: pypi
38
+ url: https://pypi.org/p/aida-workbench
39
+
40
+ permissions:
41
+ id-token: write
42
+
43
+ steps:
44
+ - name: Download distributions
45
+ uses: actions/download-artifact@v4
46
+ with:
47
+ name: python-package-distributions
48
+ path: dist/
49
+
50
+ - name: Publish to PyPI
51
+ uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,40 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *.egg-info/
5
+ .eggs/
6
+ build/
7
+ dist/
8
+ .venv/
9
+ venv/
10
+
11
+ # AIDA on-device state must never live in the repo.
12
+ # NOTE: intentionally NOT a bare `secrets*` glob — that pattern also matches
13
+ # (and silently drops from git / from built wheels) src/aida/config/secrets.py,
14
+ # the module that *implements* the no-secrets-on-disk guarantee. Real secrets
15
+ # never reach YAML/JSON in the first place (see aida.config.secrets +
16
+ # tests/test_secrets.py); these entries only guard against a stray file.
17
+ .aida/
18
+ *.db
19
+ logs/
20
+ secrets.yaml
21
+ secrets.json
22
+ secrets.env
23
+ .env
24
+ .env.*
25
+
26
+ # Editors / OS
27
+ .DS_Store
28
+ .idea/
29
+ .vscode/
30
+ *.swp
31
+
32
+ # Test / coverage
33
+ .pytest_cache/
34
+ .ruff_cache/
35
+ htmlcov/
36
+ .coverage
37
+ .playwright-mcp/*
38
+
39
+ #to delete
40
+ _to_delete/*