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.
- aida_workbench-0.1.0/.git-blame-ignore-revs +14 -0
- aida_workbench-0.1.0/.github/workflows/ci.yml +135 -0
- aida_workbench-0.1.0/.github/workflows/publish.yml +51 -0
- aida_workbench-0.1.0/.gitignore +40 -0
- aida_workbench-0.1.0/CHANGELOG.md +827 -0
- aida_workbench-0.1.0/CONTRIBUTING.md +46 -0
- aida_workbench-0.1.0/Claude outputs/fig-a-workspace-anatomy.png +0 -0
- aida_workbench-0.1.0/Claude outputs/fig-b-what-the-model-sees.png +0 -0
- aida_workbench-0.1.0/Claude outputs/fig-c-three-workspaces.png +0 -0
- aida_workbench-0.1.0/Claude outputs/fig-d-coming-from-chatgpt.png +0 -0
- aida_workbench-0.1.0/Claude outputs/pyirena_theme_before_after.png +0 -0
- aida_workbench-0.1.0/Claude outputs/usaxs-expert-diagram.png +0 -0
- aida_workbench-0.1.0/Claude outputs/usaxs-expert-diagram.svg +2 -0
- aida_workbench-0.1.0/Claude outputs/usaxs-instrument-ecosystem-1.md +89 -0
- aida_workbench-0.1.0/Claude outputs/usaxs-instrument-ecosystem.md +97 -0
- aida_workbench-0.1.0/Claude outputs/usaxs-user-diagram.png +0 -0
- aida_workbench-0.1.0/Claude outputs/usaxs-user-diagram.svg +2 -0
- aida_workbench-0.1.0/LICENSE +21 -0
- aida_workbench-0.1.0/PKG-INFO +174 -0
- aida_workbench-0.1.0/PLAN.md +433 -0
- aida_workbench-0.1.0/README.md +133 -0
- aida_workbench-0.1.0/docs/README.md +42 -0
- aida_workbench-0.1.0/docs/coding-and-scripting.md +189 -0
- aida_workbench-0.1.0/docs/concepts.md +382 -0
- aida_workbench-0.1.0/docs/context-and-limits.md +130 -0
- aida_workbench-0.1.0/docs/documents.md +119 -0
- aida_workbench-0.1.0/docs/figures/fig-a-workspace-anatomy.png +0 -0
- aida_workbench-0.1.0/docs/figures/fig-a-workspace-anatomy.svg +98 -0
- aida_workbench-0.1.0/docs/figures/fig-b-what-the-model-sees.png +0 -0
- aida_workbench-0.1.0/docs/figures/fig-b-what-the-model-sees.svg +85 -0
- aida_workbench-0.1.0/docs/figures/fig-c-three-workspaces.png +0 -0
- aida_workbench-0.1.0/docs/figures/fig-c-three-workspaces.svg +113 -0
- aida_workbench-0.1.0/docs/figures/fig-d-coming-from-chatgpt.png +0 -0
- aida_workbench-0.1.0/docs/figures/fig-d-coming-from-chatgpt.svg +44 -0
- aida_workbench-0.1.0/docs/figures/make_figures.py +648 -0
- aida_workbench-0.1.0/docs/gui-overview.md +213 -0
- aida_workbench-0.1.0/docs/installation.md +233 -0
- aida_workbench-0.1.0/docs/knowledge-bases.md +174 -0
- aida_workbench-0.1.0/docs/mcp-servers.md +377 -0
- aida_workbench-0.1.0/docs/moving-and-sharing.md +229 -0
- aida_workbench-0.1.0/docs/organizing-conversations.md +109 -0
- aida_workbench-0.1.0/docs/providers-and-secrets.md +236 -0
- aida_workbench-0.1.0/docs/pyirena.md +165 -0
- aida_workbench-0.1.0/docs/safety-and-permissions.md +195 -0
- aida_workbench-0.1.0/docs/talk-intro-slide.md +62 -0
- aida_workbench-0.1.0/docs/workflows.md +286 -0
- aida_workbench-0.1.0/docs/workspaces.md +127 -0
- aida_workbench-0.1.0/environment.yml +8 -0
- aida_workbench-0.1.0/examples/config/config.yaml +35 -0
- aida_workbench-0.1.0/examples/config/mcp.json +20 -0
- aida_workbench-0.1.0/examples/config/providers.yaml +60 -0
- aida_workbench-0.1.0/examples/config/workspaces.yaml +61 -0
- aida_workbench-0.1.0/planning/AIEVALUATOR_EPICS_MCP_SETUP.md +312 -0
- aida_workbench-0.1.0/planning/COMPLETED.md +546 -0
- aida_workbench-0.1.0/planning/DESIGN.md +402 -0
- aida_workbench-0.1.0/planning/PLAN_INSTRUMENT_INTEGRATION.md +525 -0
- aida_workbench-0.1.0/planning/context_management.md +312 -0
- aida_workbench-0.1.0/planning/credentials_and_browser_automation.md +174 -0
- aida_workbench-0.1.0/planning/document_images.md +270 -0
- aida_workbench-0.1.0/planning/documents_implementation.md +523 -0
- aida_workbench-0.1.0/planning/gui_implementation_guide.md +451 -0
- aida_workbench-0.1.0/planning/improvement_plan_2026-08.md +1150 -0
- aida_workbench-0.1.0/planning/improvement_plan_2026-09.md +256 -0
- aida_workbench-0.1.0/planning/local_scientific_ai_agent_proposal.md +938 -0
- aida_workbench-0.1.0/planning/mcp_tool_scaling.md +187 -0
- aida_workbench-0.1.0/planning/multiuser_plan.md +524 -0
- aida_workbench-0.1.0/planning/phase01_foundation.md +96 -0
- aida_workbench-0.1.0/planning/phase02_agent_core.md +154 -0
- aida_workbench-0.1.0/planning/phase03_mcp.md +183 -0
- aida_workbench-0.1.0/planning/phase04_persistence_workspaces.md +113 -0
- aida_workbench-0.1.0/planning/phase05_gui.md +190 -0
- aida_workbench-0.1.0/planning/phase06_documents.md +438 -0
- aida_workbench-0.1.0/planning/phase07_mcp_management.md +386 -0
- aida_workbench-0.1.0/planning/phase08_rag.md +241 -0
- aida_workbench-0.1.0/planning/phase09_coding_scripting.md +126 -0
- aida_workbench-0.1.0/planning/phase10_automation_distribution.md +127 -0
- aida_workbench-0.1.0/planning/phase10_scheduling_design.md +459 -0
- aida_workbench-0.1.0/planning/phase_future.md +84 -0
- aida_workbench-0.1.0/planning/portability.md +462 -0
- aida_workbench-0.1.0/pyproject.toml +129 -0
- aida_workbench-0.1.0/skills/README.md +52 -0
- aida_workbench-0.1.0/skills/pyirena-usage.md +75 -0
- aida_workbench-0.1.0/skills/review-checklist.md +93 -0
- aida_workbench-0.1.0/skills/saxs-basics.md +70 -0
- aida_workbench-0.1.0/src/aida/__init__.py +7 -0
- aida_workbench-0.1.0/src/aida/artifacts/__init__.py +30 -0
- aida_workbench-0.1.0/src/aida/artifacts/base.py +96 -0
- aida_workbench-0.1.0/src/aida/artifacts/policy.py +83 -0
- aida_workbench-0.1.0/src/aida/artifacts/store.py +156 -0
- aida_workbench-0.1.0/src/aida/cli/__init__.py +6 -0
- aida_workbench-0.1.0/src/aida/cli/__main__.py +134 -0
- aida_workbench-0.1.0/src/aida/cli/_gui_diagnosis.py +48 -0
- aida_workbench-0.1.0/src/aida/cli/chat.py +388 -0
- aida_workbench-0.1.0/src/aida/cli/config_cmds.py +363 -0
- aida_workbench-0.1.0/src/aida/cli/conversations.py +407 -0
- aida_workbench-0.1.0/src/aida/cli/doctor.py +517 -0
- aida_workbench-0.1.0/src/aida/cli/documents_cmds.py +183 -0
- aida_workbench-0.1.0/src/aida/cli/kb_cmds.py +416 -0
- aida_workbench-0.1.0/src/aida/cli/mcp_cmds.py +927 -0
- aida_workbench-0.1.0/src/aida/cli/run.py +216 -0
- aida_workbench-0.1.0/src/aida/cli/schedule_cmds.py +222 -0
- aida_workbench-0.1.0/src/aida/cli/workflow_cmds.py +232 -0
- aida_workbench-0.1.0/src/aida/cli/workspace_cmds.py +283 -0
- aida_workbench-0.1.0/src/aida/coding/__init__.py +9 -0
- aida_workbench-0.1.0/src/aida/coding/runner.py +312 -0
- aida_workbench-0.1.0/src/aida/coding/templates.py +65 -0
- aida_workbench-0.1.0/src/aida/coding/tools.py +239 -0
- aida_workbench-0.1.0/src/aida/config/__init__.py +4 -0
- aida_workbench-0.1.0/src/aida/config/logging_setup.py +86 -0
- aida_workbench-0.1.0/src/aida/config/paths.py +244 -0
- aida_workbench-0.1.0/src/aida/config/secrets.py +101 -0
- aida_workbench-0.1.0/src/aida/config/settings.py +1642 -0
- aida_workbench-0.1.0/src/aida/config/users.py +168 -0
- aida_workbench-0.1.0/src/aida/core/__init__.py +1 -0
- aida_workbench-0.1.0/src/aida/core/agent.py +400 -0
- aida_workbench-0.1.0/src/aida/core/confirmation.py +172 -0
- aida_workbench-0.1.0/src/aida/core/context.py +684 -0
- aida_workbench-0.1.0/src/aida/core/cost.py +45 -0
- aida_workbench-0.1.0/src/aida/core/events.py +297 -0
- aida_workbench-0.1.0/src/aida/core/headless.py +46 -0
- aida_workbench-0.1.0/src/aida/core/proc_lock.py +70 -0
- aida_workbench-0.1.0/src/aida/core/scheduler_runtime.py +367 -0
- aida_workbench-0.1.0/src/aida/core/scheduling.py +151 -0
- aida_workbench-0.1.0/src/aida/core/session.py +1415 -0
- aida_workbench-0.1.0/src/aida/core/tools.py +109 -0
- aida_workbench-0.1.0/src/aida/core/workflows.py +279 -0
- aida_workbench-0.1.0/src/aida/documents/__init__.py +7 -0
- aida_workbench-0.1.0/src/aida/documents/attachments.py +159 -0
- aida_workbench-0.1.0/src/aida/documents/figure_tools.py +382 -0
- aida_workbench-0.1.0/src/aida/documents/figures.py +527 -0
- aida_workbench-0.1.0/src/aida/documents/ocr/__init__.py +22 -0
- aida_workbench-0.1.0/src/aida/documents/ocr/mistral.py +346 -0
- aida_workbench-0.1.0/src/aida/documents/readers.py +485 -0
- aida_workbench-0.1.0/src/aida/documents/tools.py +207 -0
- aida_workbench-0.1.0/src/aida/documents/writers/__init__.py +2 -0
- aida_workbench-0.1.0/src/aida/documents/writers/docx_writer.py +68 -0
- aida_workbench-0.1.0/src/aida/documents/writers/md_obsidian.py +152 -0
- aida_workbench-0.1.0/src/aida/knowledge/__init__.py +1 -0
- aida_workbench-0.1.0/src/aida/knowledge/rag/__init__.py +12 -0
- aida_workbench-0.1.0/src/aida/knowledge/rag/chunking.py +159 -0
- aida_workbench-0.1.0/src/aida/knowledge/rag/index.py +208 -0
- aida_workbench-0.1.0/src/aida/knowledge/rag/ingest.py +394 -0
- aida_workbench-0.1.0/src/aida/knowledge/rag/retrieval.py +141 -0
- aida_workbench-0.1.0/src/aida/mcp/__init__.py +22 -0
- aida_workbench-0.1.0/src/aida/mcp/aievaluator_setup.py +129 -0
- aida_workbench-0.1.0/src/aida/mcp/argument_coercion.py +198 -0
- aida_workbench-0.1.0/src/aida/mcp/config_io.py +88 -0
- aida_workbench-0.1.0/src/aida/mcp/env_discovery.py +238 -0
- aida_workbench-0.1.0/src/aida/mcp/epics_mcp_setup.py +197 -0
- aida_workbench-0.1.0/src/aida/mcp/groups.py +125 -0
- aida_workbench-0.1.0/src/aida/mcp/manager.py +544 -0
- aida_workbench-0.1.0/src/aida/mcp/pyirena_setup.py +396 -0
- aida_workbench-0.1.0/src/aida/mcp/results.py +137 -0
- aida_workbench-0.1.0/src/aida/mcp/server.py +606 -0
- aida_workbench-0.1.0/src/aida/mcp/tool_grouping.py +133 -0
- aida_workbench-0.1.0/src/aida/persistence/__init__.py +24 -0
- aida_workbench-0.1.0/src/aida/persistence/cleanup.py +302 -0
- aida_workbench-0.1.0/src/aida/persistence/db.py +224 -0
- aida_workbench-0.1.0/src/aida/persistence/recorder.py +343 -0
- aida_workbench-0.1.0/src/aida/persistence/records.py +230 -0
- aida_workbench-0.1.0/src/aida/persistence/store.py +648 -0
- aida_workbench-0.1.0/src/aida/portability/__init__.py +81 -0
- aida_workbench-0.1.0/src/aida/portability/bundle.py +1097 -0
- aida_workbench-0.1.0/src/aida/portability/closure.py +253 -0
- aida_workbench-0.1.0/src/aida/portability/contents.py +274 -0
- aida_workbench-0.1.0/src/aida/portability/path_issues.py +185 -0
- aida_workbench-0.1.0/src/aida/portability/paths_map.py +395 -0
- aida_workbench-0.1.0/src/aida/portability/report.py +207 -0
- aida_workbench-0.1.0/src/aida/providers/__init__.py +1 -0
- aida_workbench-0.1.0/src/aida/providers/anthropic_.py +582 -0
- aida_workbench-0.1.0/src/aida/providers/base.py +253 -0
- aida_workbench-0.1.0/src/aida/providers/embeddings_base.py +51 -0
- aida_workbench-0.1.0/src/aida/providers/mock.py +114 -0
- aida_workbench-0.1.0/src/aida/providers/mock_embeddings.py +60 -0
- aida_workbench-0.1.0/src/aida/providers/openai_compat.py +452 -0
- aida_workbench-0.1.0/src/aida/providers/openai_compat_embeddings.py +54 -0
- aida_workbench-0.1.0/src/aida/providers/profiles.py +169 -0
- aida_workbench-0.1.0/src/aida/providers/vision.py +121 -0
- aida_workbench-0.1.0/src/aida/ui/__init__.py +6 -0
- aida_workbench-0.1.0/src/aida/ui/qt/__init__.py +5 -0
- aida_workbench-0.1.0/src/aida/ui/qt/_qt.py +164 -0
- aida_workbench-0.1.0/src/aida/ui/qt/app.py +85 -0
- aida_workbench-0.1.0/src/aida/ui/qt/artifact_widgets.py +198 -0
- aida_workbench-0.1.0/src/aida/ui/qt/bridge.py +815 -0
- aida_workbench-0.1.0/src/aida/ui/qt/chat_panel.py +942 -0
- aida_workbench-0.1.0/src/aida/ui/qt/code_editor_dialog.py +218 -0
- aida_workbench-0.1.0/src/aida/ui/qt/collapsible.py +108 -0
- aida_workbench-0.1.0/src/aida/ui/qt/conversations_sidebar.py +526 -0
- aida_workbench-0.1.0/src/aida/ui/qt/icon.py +23 -0
- aida_workbench-0.1.0/src/aida/ui/qt/input_box.py +481 -0
- aida_workbench-0.1.0/src/aida/ui/qt/knowledge_management_dialog.py +433 -0
- aida_workbench-0.1.0/src/aida/ui/qt/main_window.py +2478 -0
- aida_workbench-0.1.0/src/aida/ui/qt/mcp_management_dialog.py +1582 -0
- aida_workbench-0.1.0/src/aida/ui/qt/notes_panel.py +134 -0
- aida_workbench-0.1.0/src/aida/ui/qt/onboarding_dialog.py +151 -0
- aida_workbench-0.1.0/src/aida/ui/qt/portability_dialog.py +532 -0
- aida_workbench-0.1.0/src/aida/ui/qt/profiles_dialog.py +705 -0
- aida_workbench-0.1.0/src/aida/ui/qt/python_highlighter.py +63 -0
- aida_workbench-0.1.0/src/aida/ui/qt/quick_tasks_panel.py +229 -0
- aida_workbench-0.1.0/src/aida/ui/qt/resources/app_icon.png +0 -0
- aida_workbench-0.1.0/src/aida/ui/qt/resources/app_icon_old.png +0 -0
- aida_workbench-0.1.0/src/aida/ui/qt/retrieval_widget.py +75 -0
- aida_workbench-0.1.0/src/aida/ui/qt/schedule_management_dialog.py +414 -0
- aida_workbench-0.1.0/src/aida/ui/qt/scheduler_bridge.py +136 -0
- aida_workbench-0.1.0/src/aida/ui/qt/selectors.py +543 -0
- aida_workbench-0.1.0/src/aida/ui/qt/settings_dialog.py +379 -0
- aida_workbench-0.1.0/src/aida/ui/qt/tool_call_group.py +225 -0
- aida_workbench-0.1.0/src/aida/ui/qt/tool_call_widget.py +187 -0
- aida_workbench-0.1.0/src/aida/ui/qt/users_dialog.py +253 -0
- aida_workbench-0.1.0/src/aida/ui/qt/window_state.py +58 -0
- aida_workbench-0.1.0/src/aida/ui/qt/workflow_management_dialog.py +471 -0
- aida_workbench-0.1.0/src/aida/ui/qt/workspace_management_dialog.py +575 -0
- aida_workbench-0.1.0/src/aida/workspace/__init__.py +29 -0
- aida_workbench-0.1.0/src/aida/workspace/command_allowlist.py +93 -0
- aida_workbench-0.1.0/src/aida/workspace/files.py +987 -0
- aida_workbench-0.1.0/src/aida/workspace/safety.py +432 -0
- aida_workbench-0.1.0/src/aida/workspace/web.py +151 -0
- aida_workbench-0.1.0/src/aida/workspace/workspaces.py +232 -0
- aida_workbench-0.1.0/tests/__init__.py +0 -0
- aida_workbench-0.1.0/tests/conftest.py +28 -0
- aida_workbench-0.1.0/tests/mock_mcp_server.py +126 -0
- aida_workbench-0.1.0/tests/test_agent_loop.py +837 -0
- aida_workbench-0.1.0/tests/test_aievaluator_setup.py +132 -0
- aida_workbench-0.1.0/tests/test_anthropic_provider_ping.py +75 -0
- aida_workbench-0.1.0/tests/test_artifacts.py +171 -0
- aida_workbench-0.1.0/tests/test_attachments.py +375 -0
- aida_workbench-0.1.0/tests/test_chat_cli.py +1040 -0
- aida_workbench-0.1.0/tests/test_chunking.py +116 -0
- aida_workbench-0.1.0/tests/test_coding_runner.py +89 -0
- aida_workbench-0.1.0/tests/test_coding_templates.py +66 -0
- aida_workbench-0.1.0/tests/test_coding_tools.py +379 -0
- aida_workbench-0.1.0/tests/test_command_allowlist.py +59 -0
- aida_workbench-0.1.0/tests/test_compaction.py +265 -0
- aida_workbench-0.1.0/tests/test_config_cmds.py +451 -0
- aida_workbench-0.1.0/tests/test_confirmation.py +152 -0
- aida_workbench-0.1.0/tests/test_context.py +660 -0
- aida_workbench-0.1.0/tests/test_contract_layering.py +44 -0
- aida_workbench-0.1.0/tests/test_conversations_cli.py +354 -0
- aida_workbench-0.1.0/tests/test_cost.py +45 -0
- aida_workbench-0.1.0/tests/test_doctor.py +545 -0
- aida_workbench-0.1.0/tests/test_document_readers.py +424 -0
- aida_workbench-0.1.0/tests/test_document_tools.py +235 -0
- aida_workbench-0.1.0/tests/test_document_writers.py +252 -0
- aida_workbench-0.1.0/tests/test_docx_figures.py +258 -0
- aida_workbench-0.1.0/tests/test_env_discovery.py +176 -0
- aida_workbench-0.1.0/tests/test_epics_mcp_setup.py +141 -0
- aida_workbench-0.1.0/tests/test_events.py +60 -0
- aida_workbench-0.1.0/tests/test_figures.py +306 -0
- aida_workbench-0.1.0/tests/test_headless.py +115 -0
- aida_workbench-0.1.0/tests/test_kb_cmds.py +437 -0
- aida_workbench-0.1.0/tests/test_keystone_image_roundtrip.py +152 -0
- aida_workbench-0.1.0/tests/test_knowledge_index.py +151 -0
- aida_workbench-0.1.0/tests/test_knowledge_ingest.py +432 -0
- aida_workbench-0.1.0/tests/test_knowledge_retrieval.py +127 -0
- aida_workbench-0.1.0/tests/test_logging_setup.py +55 -0
- aida_workbench-0.1.0/tests/test_main_cli_dispatch.py +76 -0
- aida_workbench-0.1.0/tests/test_mcp_argument_coercion.py +160 -0
- aida_workbench-0.1.0/tests/test_mcp_cmds.py +736 -0
- aida_workbench-0.1.0/tests/test_mcp_config_io.py +103 -0
- aida_workbench-0.1.0/tests/test_mcp_groups.py +152 -0
- aida_workbench-0.1.0/tests/test_mcp_manager.py +829 -0
- aida_workbench-0.1.0/tests/test_mcp_results.py +236 -0
- aida_workbench-0.1.0/tests/test_mcp_server.py +642 -0
- aida_workbench-0.1.0/tests/test_mcp_tool_grouping.py +184 -0
- aida_workbench-0.1.0/tests/test_mock_embeddings.py +71 -0
- aida_workbench-0.1.0/tests/test_ocr.py +469 -0
- aida_workbench-0.1.0/tests/test_paths.py +103 -0
- aida_workbench-0.1.0/tests/test_persistence_cleanup.py +230 -0
- aida_workbench-0.1.0/tests/test_persistence_db.py +223 -0
- aida_workbench-0.1.0/tests/test_persistence_recorder.py +269 -0
- aida_workbench-0.1.0/tests/test_persistence_records.py +223 -0
- aida_workbench-0.1.0/tests/test_persistence_store.py +372 -0
- aida_workbench-0.1.0/tests/test_phase4_acceptance.py +245 -0
- aida_workbench-0.1.0/tests/test_phase6_acceptance.py +216 -0
- aida_workbench-0.1.0/tests/test_portability.py +1076 -0
- aida_workbench-0.1.0/tests/test_proc_lock.py +51 -0
- aida_workbench-0.1.0/tests/test_profiles.py +177 -0
- aida_workbench-0.1.0/tests/test_provider_lifecycle.py +179 -0
- aida_workbench-0.1.0/tests/test_provider_param_fallback.py +338 -0
- aida_workbench-0.1.0/tests/test_provider_translation.py +1097 -0
- aida_workbench-0.1.0/tests/test_pyirena_setup.py +270 -0
- aida_workbench-0.1.0/tests/test_regressions_phase6.py +332 -0
- aida_workbench-0.1.0/tests/test_review_2026_08_findings.py +556 -0
- aida_workbench-0.1.0/tests/test_run_cli.py +219 -0
- aida_workbench-0.1.0/tests/test_schedule_cmds.py +128 -0
- aida_workbench-0.1.0/tests/test_scheduler_runtime.py +465 -0
- aida_workbench-0.1.0/tests/test_scheduling.py +159 -0
- aida_workbench-0.1.0/tests/test_secrets.py +65 -0
- aida_workbench-0.1.0/tests/test_settings.py +1021 -0
- aida_workbench-0.1.0/tests/test_start_session.py +1342 -0
- aida_workbench-0.1.0/tests/test_users.py +457 -0
- aida_workbench-0.1.0/tests/test_web_tools.py +192 -0
- aida_workbench-0.1.0/tests/test_workflow_cmds.py +185 -0
- aida_workbench-0.1.0/tests/test_workflows.py +338 -0
- aida_workbench-0.1.0/tests/test_workspace.py +259 -0
- aida_workbench-0.1.0/tests/test_workspace_cmds.py +478 -0
- aida_workbench-0.1.0/tests/test_workspace_files.py +726 -0
- aida_workbench-0.1.0/tests/test_workspace_safety.py +602 -0
- aida_workbench-0.1.0/tests/ui/__init__.py +0 -0
- aida_workbench-0.1.0/tests/ui/_qt_test_utils.py +40 -0
- aida_workbench-0.1.0/tests/ui/conftest.py +148 -0
- aida_workbench-0.1.0/tests/ui/test_app.py +67 -0
- aida_workbench-0.1.0/tests/ui/test_artifact_widgets.py +162 -0
- aida_workbench-0.1.0/tests/ui/test_bridge.py +524 -0
- aida_workbench-0.1.0/tests/ui/test_bridge_lifecycle.py +323 -0
- aida_workbench-0.1.0/tests/ui/test_chat_panel.py +989 -0
- aida_workbench-0.1.0/tests/ui/test_code_editor_dialog.py +218 -0
- aida_workbench-0.1.0/tests/ui/test_collapsible.py +67 -0
- aida_workbench-0.1.0/tests/ui/test_conversations_sidebar.py +778 -0
- aida_workbench-0.1.0/tests/ui/test_icon.py +17 -0
- aida_workbench-0.1.0/tests/ui/test_input_box.py +528 -0
- aida_workbench-0.1.0/tests/ui/test_knowledge_management_dialog.py +504 -0
- aida_workbench-0.1.0/tests/ui/test_main_window.py +3903 -0
- aida_workbench-0.1.0/tests/ui/test_mcp_management_dialog.py +988 -0
- aida_workbench-0.1.0/tests/ui/test_notes_panel.py +113 -0
- aida_workbench-0.1.0/tests/ui/test_onboarding_dialog.py +104 -0
- aida_workbench-0.1.0/tests/ui/test_portability_dialog.py +279 -0
- aida_workbench-0.1.0/tests/ui/test_profiles_dialog.py +408 -0
- aida_workbench-0.1.0/tests/ui/test_python_highlighter.py +61 -0
- aida_workbench-0.1.0/tests/ui/test_qt_contract.py +127 -0
- aida_workbench-0.1.0/tests/ui/test_quick_tasks_panel.py +197 -0
- aida_workbench-0.1.0/tests/ui/test_schedule_management_dialog.py +325 -0
- aida_workbench-0.1.0/tests/ui/test_scheduler_bridge.py +274 -0
- aida_workbench-0.1.0/tests/ui/test_selectors.py +572 -0
- aida_workbench-0.1.0/tests/ui/test_settings_dialog.py +381 -0
- aida_workbench-0.1.0/tests/ui/test_tool_call_group.py +155 -0
- aida_workbench-0.1.0/tests/ui/test_tool_call_widget.py +122 -0
- aida_workbench-0.1.0/tests/ui/test_users_dialog.py +206 -0
- aida_workbench-0.1.0/tests/ui/test_window_state.py +47 -0
- aida_workbench-0.1.0/tests/ui/test_workflow_management_dialog.py +338 -0
- aida_workbench-0.1.0/tests/ui/test_workspace_management_dialog.py +451 -0
- 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/*
|