From 012548741a1344713619cb2e2ecddd35d90d5d4b Mon Sep 17 00:00:00 2001 From: Krishna Date: Fri, 24 Apr 2026 22:21:19 -0700 Subject: [PATCH 1/2] =?UTF-8?q?=E2=9C=A8=20feat:=20widget-builder=20builti?= =?UTF-8?q?n=20plugin=20with=20stlite=20console=20rendering,=20capability?= =?UTF-8?q?=20gating,=20and=20SessionTool=20protocol?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add `builtin_plugins/widget_builder` as a bundled plugin: `SubmitWidgetTool`, extensible AST lint pipeline, `st-widget-builder` agent + skill, Jinja2 prompt template, and reusable Streamlit component library (PlantUMLCard, GitHub repo card, stock ticker, search result card) - Add `capabilities.py`: pure `parse_capabilities`, `filter_by_capabilities`, and `overlay_capabilities` helpers for frontmatter-driven capability gating across agents, skills, and plugins - Add `session_tools.py`: `SessionTool` Protocol and `SessionToolRegistry`; retrofit `ExitPlanModeTool` to satisfy the protocol; replace single `_exit_plan_mode_tool` slot in `ToolUseLoop` with a `_session_tools` list built from registry + allowed_tools - Extend `AgentRegistry.register()` with `capabilities=` and `plugin_root=` params; `get()` and `render_catalog()` accept `session_capabilities` for gated visibility; add `visible_for()` - Add `substitute_agent_body()` in `spawn_agent.py` for `${SESSION_ID}` / `${CLAUDE_PLUGIN_ROOT}` / bash-style `${VAR:-default}` expansion in agent bodies; registered agent types' model is now authoritative (ignores LLM-supplied model arg) - Auto-scan `builtin_plugins/` at plugin discovery; propagate `plugin_root` and capability tuples through `Orchestrator` → `AgentRegistry` / `SkillRegistry` / `SessionToolRegistry` - Parse `X-Meeseeks-Capabilities` request header in API backend; thread `session_capabilities` end-to-end through `Orchestrator` → `SpawnAgentTool` → `ToolUseLoop` - Add `StliteWidgetPanel`, `CheckAgentsCard`, `SpawnAgentCard`, `FiveLeafBloomLoader`, and `WidgetCard` to the console; wire `widget_ready` event parsing and render inline stlite widgets in the conversation timeline - Persist completed child handles in `AgentHypervisor` so `check_agents` surfaces results; add `list_visible()` helper; emit structured `check_agents` payload in tool card - Fix: skip CWD root injection for non-registry tools; thread session_capabilities into slash-command skill lookup; reject path traversal in `widget_id`; scope `submit_widget` schema to widget-builder sessions only; force full PWA refresh on service-worker update - Migrate docs screenshots to PNG; add Capabilities, Widgets, and core-orchestration docs pages; refresh plugins, skills, web-api, and landing pages --- .claude/scheduled_tasks.lock | 1 + .../SKILL.md | 24 +- .devin/wiki.json | 86 +- .dockerignore | 2 +- .env.example | 34 +- .github/dependabot.yml | 12 +- .github/git-commit-instructions.md | 2 +- .github/workflows/console.yml | 14 +- .github/workflows/coverage.yml | 6 +- .github/workflows/docker-buildx.yml | 20 +- .github/workflows/docs-cleanup.yml | 82 ++ .github/workflows/docs.yml | 10 +- .gitignore | 12 +- .pre-commit-config.yaml | 4 +- AGENTS.md | 2 +- CLAUDE.md | 58 +- Makefile | 6 +- README.md | 208 +---- .../meeseeks_api/src/meeseeks_api/__init__.py | 2 - .../src/meeseeks_api/api/__init__.py | 2 - .../meeseeks_cli/src/meeseeks_cli/__init__.py | 1 - .../src/components/ConversationTimeline.tsx | 346 ------- .../src/components/FileList.tsx | 53 -- .../src/components/ScrollToBottom.tsx | 21 - .../src/components/WorkspacePanel.tsx | 83 -- apps/meeseeks_console/src/index.css | 294 ------ apps/{meeseeks_api => mewbo_api}/AGENTS.md | 2 +- apps/{meeseeks_api => mewbo_api}/CLAUDE.md | 16 +- apps/{meeseeks_api => mewbo_api}/Makefile | 2 +- apps/{meeseeks_api => mewbo_api}/README.md | 8 +- .../docker-compose.yml | 0 .../pyproject.toml | 14 +- apps/mewbo_api/src/mewbo_api/__init__.py | 2 + .../src/mewbo_api/agentic_search/__init__.py | 9 + .../src/mewbo_api/agentic_search/fixtures.py | 384 ++++++++ .../src/mewbo_api/agentic_search/routes.py | 159 ++++ .../src/mewbo_api/agentic_search/store.py | 154 +++ apps/mewbo_api/src/mewbo_api/api/__init__.py | 2 + .../src/mewbo_api}/backend.py | 371 ++++++-- .../src/mewbo_api}/channels/__init__.py | 2 +- .../src/mewbo_api}/channels/base.py | 0 .../src/mewbo_api}/channels/email_adapter.py | 18 +- .../channels/email_template.html.j2 | 6 +- .../src/mewbo_api}/channels/nextcloud_talk.py | 12 +- .../src/mewbo_api}/channels/routes.py | 34 +- .../src/mewbo_api}/ide.py | 22 +- .../src/mewbo_api}/ide_routes.py | 6 +- apps/mewbo_api/tests/test_agentic_search.py | 167 ++++ .../tests/test_backend.py | 52 +- .../mewbo_api/tests/test_capability_header.py | 93 ++ apps/mewbo_api/tests/test_commands_api.py | 430 +++++++++ .../tests/test_config_api.py | 4 +- .../tests/test_ide_manager.py | 20 +- .../tests/test_ide_routes.py | 6 +- apps/{meeseeks_cli => mewbo_cli}/AGENTS.md | 2 +- apps/{meeseeks_cli => mewbo_cli}/CLAUDE.md | 24 +- apps/{meeseeks_cli => mewbo_cli}/Makefile | 2 +- apps/{meeseeks_cli => mewbo_cli}/README.md | 8 +- .../pyproject.toml | 14 +- apps/mewbo_cli/src/mewbo_cli/__init__.py | 1 + .../src/mewbo_cli}/aider_ui.py | 2 +- .../src/mewbo_cli}/cli_agent_display.py | 6 +- .../src/mewbo_cli}/cli_commands.py | 39 +- .../src/mewbo_cli}/cli_context.py | 8 +- .../src/mewbo_cli}/cli_dialogs.py | 2 +- .../src/mewbo_cli}/cli_keys.py | 0 .../src/mewbo_cli}/cli_master.py | 66 +- .../tests/test_aider_ui.py | 2 +- .../tests/test_cli.py | 66 +- .../tests/test_cli_commands.py | 21 +- .../tests/test_cli_dialogs.py | 2 +- .../.env.example | 0 .../.eslintrc.cjs | 0 .../.gitignore | 0 .../CLAUDE.md | 129 ++- .../Makefile | 0 .../README.md | 6 +- .../components.json | 0 .../docker-compose.yml | 0 .../index.html | 2 +- .../package-lock.json | 159 ++-- .../package.json | 7 +- .../playwright.config.ts | 0 .../postcss.config.js | 0 .../public/android-chrome-192x192.png | Bin .../public/android-chrome-512x512.png | Bin .../public/apple-touch-icon.png | Bin .../public/favicon-16x16.png | Bin .../public/favicon-32x32.png | Bin .../public/favicon.ico | Bin .../public/icons/Icon-100.png | Bin .../public/icons/Icon-1024.png | Bin .../public/icons/Icon-114.png | Bin .../public/icons/Icon-120.png | Bin .../public/icons/Icon-144.png | Bin .../public/icons/Icon-152.png | Bin .../public/icons/Icon-16.png | Bin .../public/icons/Icon-167.png | Bin .../public/icons/Icon-180.png | Bin .../public/icons/Icon-192.png | Bin .../public/icons/Icon-20.png | Bin .../public/icons/Icon-29.png | Bin .../public/icons/Icon-32.png | Bin .../public/icons/Icon-40.png | Bin .../public/icons/Icon-50.png | Bin .../public/icons/Icon-512.png | Bin .../public/icons/Icon-57.png | Bin .../public/icons/Icon-58.png | Bin .../public/icons/Icon-60.png | Bin .../public/icons/Icon-72.png | Bin .../public/icons/Icon-76.png | Bin .../public/icons/Icon-80.png | Bin .../public/icons/Icon-87.png | Bin .../public/logo-bg.svg | 0 .../public/logo-icon.svg | 0 .../public/logo-transparent.svg | 0 ...ession-ide-floral-background-animation.svg | 0 .../src/App.tsx | 34 +- .../src/__tests__/EditableTitle.test.tsx | 0 .../src/__tests__/app.test.tsx | 2 + .../src/__tests__/commands.test.ts | 40 + .../src/__tests__/fixtures/mockData.ts | 0 .../src/__tests__/timeline.test.ts | 138 ++- .../src/api/INTEGRATIONS.md | 2 +- apps/mewbo_console/src/api/agenticSearch.ts | 102 ++ .../src/api/client.ts | 14 +- .../src/api/contracts.ts | 8 + .../src/api/ide.ts | 0 .../src/api/realClient.ts | 34 +- .../src/components/AppLayout.tsx | 0 apps/mewbo_console/src/components/ChatRow.tsx | 61 ++ .../src/components/CheckAgentsCard.tsx | 253 +++++ .../src/components/CommandDialog.tsx | 39 + .../src/components/CommandPalette.tsx | 80 ++ .../src/components/ConfigMenu.tsx | 0 .../src/components/ContextWindowBar.tsx | 0 .../src/components/ConversationTimeline.tsx | 512 ++++++++++ .../src/components/CopyButton.tsx | 0 .../src/components/DiffCard.tsx | 4 +- .../src/components/DiffStats.tsx | 0 .../src/components/EditableTitle.tsx | 0 .../mewbo_console/src/components/FileList.tsx | 77 ++ .../src/components/FileReadCard.tsx | 0 .../src/components/ForkFromHereButton.tsx | 0 .../src/components/HighlightedCode.tsx | 0 .../src/components/HomeView.tsx | 12 +- .../src/components/IdeLoader.tsx | 2 +- .../src/components/InputBar.tsx | 217 ++++- .../src/components/InputComposerBody.tsx | 171 +++- .../src/components/LangfuseIcon.tsx | 0 .../src/components/LogEventCard.tsx | 12 +- .../src/components/LogsView.tsx | 226 +++-- .../src/components/MessageBubble.tsx | 4 +- .../src/components/ModelBrandIcon.tsx | 0 .../src/components/ModelLabel.tsx | 0 .../src/components/NavBar.tsx | 15 +- .../src/components/NewProjectForm.tsx | 0 .../src/components/NotificationBalloon.tsx | 59 ++ .../src/components/NotificationPanel.tsx | 34 +- .../src/components/PlanCard.tsx | 0 .../src/components/PluginsView.tsx | 0 .../src/components/ProjectCard.tsx | 0 .../src/components/ProjectsView.tsx | 0 .../src/components/RetryFromHereButton.tsx | 0 .../src/components/ReviewPane.tsx | 0 .../src/components/RunTelemetry.tsx | 98 ++ .../src/components/ScrollToBottom.tsx | 46 + .../src/components/SessionDetailView.tsx | 76 +- .../src/components/SessionItem.tsx | 0 .../src/components/SettingsView.tsx | 0 .../src/components/SpawnAgentCard.tsx | 242 +++++ .../src/components/StatusBadge.tsx | 0 .../src/components/StliteWidgetPanel.tsx | 287 ++++++ .../src/components/SummaryBlock.tsx | 0 .../src/components/TerminalCard.tsx | 0 .../src/components/TurnScroller.tsx | 166 ++++ .../src/components/TypewriterGreeting.tsx | 0 .../src/components/UpdatePrompt.tsx | 48 +- .../src/components/WidgetCard.tsx | 341 +++++++ .../src/components/WorkspacePanel.tsx | 171 ++++ .../__tests__/CheckAgentsCard.test.tsx | 156 ++++ .../__tests__/NewProjectForm.test.tsx | 0 .../__tests__/SpawnAgentCard.test.tsx | 103 ++ .../agentic_search/AgenticSearchView.tsx | 201 ++++ .../components/agentic_search/AnswerCard.tsx | 172 ++++ .../agentic_search/LandingPanel.tsx | 194 ++++ .../components/agentic_search/ResultCard.tsx | 217 +++++ .../agentic_search/ResultsPanel.tsx | 372 ++++++++ .../components/agentic_search/RightRail.tsx | 135 +++ .../components/agentic_search/SearchBar.tsx | 446 +++++++++ .../components/agentic_search/SrcAvatar.tsx | 33 + .../components/agentic_search/TraceDrawer.tsx | 145 +++ .../agentic_search/WorkspaceModal.tsx | 186 ++++ .../src/components/agentic_search/utils.ts | 27 + apps/mewbo_console/src/components/agents.tsx | 71 ++ .../src/components/settings/RjsfTheme.tsx | 2 +- .../src/components/ui/alert.tsx | 0 .../src/components/ui/button.tsx | 0 .../src/components/ui/command.tsx | 0 .../src/components/ui/dialog.tsx | 0 .../src/components/ui/dropdown-menu.tsx | 0 .../src/components/ui/form.tsx | 0 .../src/components/ui/input.tsx | 0 .../src/components/ui/label.tsx | 0 .../src/components/ui/popover.tsx | 0 .../src/components/ui/scroll-area.tsx | 0 .../mewbo_console/src/components/ui/sheet.tsx | 109 +++ .../src/components/ui/switch.tsx | 58 ++ .../src/components/ui/tabs.tsx | 0 .../src/components/ui/textarea.tsx | 0 .../src/hooks/useAgenticSearch.ts | 96 ++ .../src/hooks/useAutoScroll.ts | 0 apps/mewbo_console/src/hooks/useCommands.ts | 26 + .../src/hooks/useConfig.ts | 0 .../src/hooks/useContainerCompact.ts | 0 apps/mewbo_console/src/hooks/useElapsed.ts | 30 + .../src/hooks/useGitDiff.ts | 0 .../src/hooks/useIdeStatus.ts | 0 .../src/hooks/useIsMobile.ts | 0 .../src/hooks/useMcpTools.ts | 0 .../src/hooks/useModels.ts | 0 .../src/hooks/useNotifications.ts | 0 .../src/hooks/useProjects.ts | 0 .../src/hooks/useSessionEvents.ts | 0 .../src/hooks/useSessionQuery.tsx | 0 .../src/hooks/useSessionStream.ts | 2 +- .../src/hooks/useSessionUsage.ts | 0 .../src/hooks/useSessions.ts | 0 .../src/hooks/useSkills.ts | 0 .../src/hooks/useVirtualProjects.ts | 0 .../src/hooks/useWebIdeEnabled.ts | 0 apps/mewbo_console/src/index.css | 760 +++++++++++++++ .../src/index.tsx | 0 apps/mewbo_console/src/lib/commands.ts | 20 + apps/mewbo_console/src/lib/notifications.ts | 65 ++ .../src/lib/utils.ts | 0 .../src/setupTests.ts | 0 .../src/types.ts | 81 +- apps/mewbo_console/src/types/agenticSearch.ts | 122 +++ apps/mewbo_console/src/utils/agentStatus.ts | 81 ++ apps/mewbo_console/src/utils/agents.ts | 28 + .../src/utils/clipboard.ts | 0 .../src/utils/cn.ts | 0 .../src/utils/diff.ts | 0 .../src/utils/diffCard.ts | 0 .../src/utils/errors.ts | 0 .../src/utils/highlight.ts | 0 .../src/utils/json.ts | 0 .../src/utils/logs.ts | 140 ++- .../src/utils/model.ts | 0 .../src/utils/modelIcon.ts | 0 .../src/utils/modelSupport.ts | 0 .../src/utils/time.ts | 0 .../src/utils/timeline.ts | 32 +- .../src/vite-env.d.ts | 0 .../tailwind.config.js | 0 .../tests/e2e/app.spec.ts | 0 .../tsconfig.json | 0 .../tsconfig.node.json | 0 .../vite.config.ts | 35 +- build-install.sh | 18 +- codecov.yml | 12 +- configs/app.example.json | 14 +- configs/app.schema.json | 32 +- conftest.py | 12 +- coverage.json | 2 +- docker-compose.yml | 36 +- docker.example.env | 6 +- docker/Dockerfile.api | 29 +- docker/Dockerfile.base | 16 +- docker/Dockerfile.console | 8 +- docker/console-entrypoint.sh | 2 +- docker/entrypoint-api.sh | 8 +- docker/nginx-ide-proxy.conf | 2 +- docker/nginx-reverse-proxy.conf | 8 +- docs/clients-cli.md | 12 +- docs/clients-email.md | 14 +- docs/clients-home-assistant.md | 16 +- docs/clients-nextcloud-talk.md | 32 +- docs/clients-web-api.md | 47 +- docs/configuration.md | 12 +- docs/core-orchestration.md | 178 +++- docs/deployment-docker.md | 20 +- docs/deployment-production.md | 18 +- docs/deployment-storage.md | 44 +- docs/developer-guide.md | 70 +- docs/features-agents.md | 4 +- docs/features-builtin-tools.md | 14 +- docs/features-compaction.md | 6 +- docs/features-lsp.md | 2 +- docs/features-mcp.md | 14 +- docs/features-permissions-hooks.md | 28 +- docs/features-plan-mode.md | 12 +- docs/features-plugins.md | 121 ++- docs/features-skills.md | 27 +- docs/features-token-usage.md | 8 +- docs/features-web-ide.md | 16 +- docs/features-widgets.md | 52 ++ docs/getting-started.md | 22 +- docs/hooks/schema_to_md.py | 2 +- docs/index.md | 52 +- docs/llm-setup.md | 6 +- docs/meeseeks-console-01-front.jpg | Bin 100684 -> 0 bytes docs/meeseeks-console-02-tasks.jpg | Bin 356317 -> 0 bytes docs/meeseeks-console-05-plugins.jpg | Bin 95294 -> 0 bytes docs/meeseeks-console-06-projects.jpg | Bin 29151 -> 0 bytes docs/meeseeks-nctalk-01.jpg | Bin 194592 -> 0 bytes ...li-01-video.mp4 => mewbo-cli-01-video.mp4} | Bin docs/mewbo-console-01-front.png | Bin 0 -> 381893 bytes docs/mewbo-console-02-tasks.png | Bin 0 -> 1417664 bytes ...jpg => mewbo-console-03-plan-approval.jpg} | Bin ...dit.jpg => mewbo-console-04-file-edit.jpg} | Bin docs/mewbo-console-05-plugins.png | Bin 0 -> 840607 bytes docs/mewbo-console-06-projects.png | Bin 0 -> 507002 bytes docs/mewbo-console-07-widgets.png | Bin 0 -> 398785 bytes ...le-banner.gif => mewbo-console-banner.gif} | Bin ...o-1.mp4 => mewbo-console-coder-demo-1.mp4} | Bin ...og.jpg => mewbo-console-file-read-log.jpg} | Bin ...ll-log.jpg => mewbo-console-shell-log.jpg} | Bin ...eseeks-email-01.jpg => mewbo-email-01.jpg} | Bin docs/mewbo-nctalk-01.png | Bin 0 -> 662433 bytes docs/project-configuration.md | 24 +- docs/reference.md | 86 +- docs/screenshot_ha_assist_1.png | Bin 93994 -> 279772 bytes docs/screenshot_ha_assist_2.png | Bin 100752 -> 306212 bytes docs/session-runtime.md | 4 +- docs/stylesheets/extra.css | 78 +- docs/troubleshooting.md | 14 +- .../AGENTS.md | 2 +- .../CLAUDE.md | 12 +- .../README.md | 10 +- .../__init__.py | 40 +- .../api.py | 26 +- .../config_flow.py | 22 +- .../const.py | 8 +- .../coordinator.py | 10 +- .../exceptions.py | 0 .../helpers.py | 2 +- .../manifest.json | 4 +- .../pyproject.toml | 8 +- .../strings.json | 0 .../translations/en.json | 0 mkdocs.yml | 17 +- overrides/components/_nav_icon_map.html | 3 +- overrides/components/sidebar_item.html | 8 +- overrides/components/sidebar_section.html | 6 +- overrides/templates/bottom_sidebar.html | 13 + overrides/templates/seo.html | 6 +- overrides/templates/sidebar.html | 4 +- .../src/meeseeks_core/__init__.py | 2 - .../src/meeseeks_tools/__init__.py | 2 - .../meeseeks_tools/integration/__init__.py | 2 - .../src/meeseeks_tools/vendor/__init__.py | 1 - .../meeseeks_tools/vendor/aider/__init__.py | 1 - .../{meeseeks_core => mewbo_core}/README.md | 6 +- .../pyproject.toml | 13 +- .../mewbo_core/src/mewbo_core/__init__.py | 2 + .../src/mewbo_core}/agent_context.py | 6 +- .../src/mewbo_core}/agent_registry.py | 97 +- .../src/mewbo_core}/built_in_agents.py | 0 .../src/mewbo_core/builtin_plugins/.keep | 0 .../mewbo_core/builtin_plugins/__init__.py | 1 + .../widget_builder/.claude-plugin/plugin.json | 14 + .../widget_builder/__init__.py | 1 + .../agents/st-widget-builder.md | 98 ++ .../widget_builder/examples/README.md | 53 ++ .../examples/components/README.md | 151 +++ .../examples/components/github_repo_card.py | 118 +++ .../examples/components/plantuml_card.py | 173 ++++ .../examples/components/search_result_card.py | 124 +++ .../examples/components/stock_ticker_card.py | 139 +++ .../widget_builder/examples/data_table/app.py | 21 + .../examples/data_table/data.json | 10 + .../examples/finance_chart/app.py | 19 + .../examples/finance_chart/data.json | 10 + .../widget_builder/examples/ruff.toml | 74 ++ .../builtin_plugins/widget_builder/linter.py | 239 +++++ .../skills/st-widget-builder/SKILL.md | 67 ++ .../widget_builder/submit_widget.py | 226 +++++ .../themes/warm_terracotta.toml | 104 +++ .../mewbo_core/src/mewbo_core/capabilities.py | 80 ++ .../src/mewbo_core}/classes.py | 16 +- .../mewbo_core/src/mewbo_core/commands.py | 316 +++++++ .../src/mewbo_core}/common.py | 96 +- .../src/mewbo_core}/compact.py | 74 +- .../src/mewbo_core}/compaction.py | 4 +- .../src/mewbo_core}/components.py | 8 +- .../src/mewbo_core}/config.py | 114 ++- .../src/mewbo_core}/context.py | 32 +- .../src/mewbo_core}/errors.py | 0 .../src/mewbo_core}/exit_plan_mode.py | 21 +- .../src/mewbo_core}/extras/__init__.py | 0 .../src/mewbo_core}/hooks.py | 26 +- .../src/mewbo_core}/hypervisor.py | 7 +- .../src/mewbo_core}/llm.py | 4 +- .../src/mewbo_core}/notifications.py | 4 +- .../src/mewbo_core}/orchestrator.py | 226 +++-- .../src/mewbo_core}/permissions.py | 8 +- .../src/mewbo_core}/planning.py | 16 +- .../src/mewbo_core}/plugins.py | 164 +++- .../src/mewbo_core}/project_store.py | 8 +- .../mewbo_core}/prompts/action-planner.txt | 2 +- .../prompts/homeassistant-get-state.txt | 0 .../prompts/homeassistant-set-state.txt | 0 .../mewbo_core}/prompts/plan_hypervisor.txt | 0 .../prompts/plan_mode_reminder.txt | 0 .../src/mewbo_core}/prompts/system.txt | 2 +- .../prompts/tools/aider-edit-blocks.txt | 0 .../prompts/tools/aider-list-dir.txt | 0 .../mewbo_core}/prompts/tools/aider-shell.txt | 0 .../mewbo_core}/prompts/tools/file-edit.txt | 0 .../prompts/tools/home-assistant.txt | 0 .../src/mewbo_core}/prompts/tools/lsp.txt | 0 .../mewbo_core}/prompts/tools/read-file.txt | 0 .../src/mewbo_core}/session_runtime.py | 50 +- .../src/mewbo_core}/session_store.py | 14 +- .../src/mewbo_core}/session_store_mongo.py | 12 +- .../src/mewbo_core/session_tools.py | 154 +++ .../src/mewbo_core}/share_store.py | 2 +- .../src/mewbo_core}/skills.py | 114 ++- .../src/mewbo_core}/spawn_agent.py | 191 +++- .../src/mewbo_core}/task_master.py | 26 +- .../templates/project_claude_md.j2 | 2 +- .../src/mewbo_core}/title_generator.py | 8 +- .../src/mewbo_core}/token_budget.py | 6 +- .../src/mewbo_core}/tool_registry.py | 179 +++- .../src/mewbo_core}/tool_use_loop.py | 333 +++++-- .../src/mewbo_core}/types.py | 0 .../{meeseeks_tools => mewbo_tools}/README.md | 4 +- .../pyproject.toml | 10 +- .../mewbo_tools/src/mewbo_tools/__init__.py | 2 + .../src/mewbo_tools}/aider_bridge/__init__.py | 2 +- .../mewbo_tools}/aider_bridge/edit_blocks.py | 2 +- .../src/mewbo_tools}/core/__init__.py | 16 +- .../src/mewbo_tools/integration/__init__.py | 2 + .../integration/aider_edit_blocks.py | 12 +- .../integration/aider_file_tools.py | 10 +- .../integration/aider_shell_tool.py | 8 +- .../mewbo_tools}/integration/edit_common.py | 4 +- .../integration/file_edit_tool.py | 8 +- .../mewbo_tools}/integration/homeassistant.py | 6 +- .../mewbo_tools}/integration/lsp/__init__.py | 10 +- .../mewbo_tools}/integration/lsp/manager.py | 6 +- .../mewbo_tools}/integration/lsp/servers.py | 0 .../src/mewbo_tools}/integration/lsp/tool.py | 6 +- .../src/mewbo_tools}/integration/mcp.py | 22 +- .../src/mewbo_tools}/integration/mcp_pool.py | 10 +- .../mewbo_tools/integration/tool_search.py | 202 ++++ .../src/mewbo_tools/vendor/__init__.py | 1 + .../src/mewbo_tools}/vendor/aider/LICENSE.txt | 0 .../src/mewbo_tools}/vendor/aider/README.md | 0 .../src/mewbo_tools/vendor/aider/__init__.py | 1 + .../src/mewbo_tools}/vendor/aider/dump.py | 0 .../src/mewbo_tools}/vendor/aider/editor.py | 0 .../src/mewbo_tools}/vendor/aider/file_ops.py | 0 .../src/mewbo_tools}/vendor/aider/io.py | 0 .../src/mewbo_tools}/vendor/aider/mdstream.py | 0 .../src/mewbo_tools}/vendor/aider/run_cmd.py | 0 .../src/mewbo_tools}/vendor/aider/utils.py | 0 pyproject.toml | 53 +- scripts/ci/check.sh | 4 +- scripts/ci/generate_config_schema.py | 4 +- scripts/vendor_aider.sh | 2 +- scripts/vulture.sh | 2 +- src/meeseeks_workspace/__init__.py | 1 - src/mewbo_workspace/__init__.py | 1 + tests/AGENTS.md | 2 +- tests/CLAUDE.md | 6 +- tests/builtin_plugins/__init__.py | 0 .../test_widget_builder_plugin.py | 216 +++++ .../builtin_plugins/test_widget_components.py | 262 ++++++ tests/builtin_plugins/test_widget_linter.py | 326 +++++++ tests/conftest.py | 14 +- tests/test_agent_context.py | 10 +- tests/test_agent_registry.py | 59 +- tests/test_aider_edit_blocks.py | 8 +- tests/test_aider_shell_tool.py | 10 +- tests/test_capabilities.py | 84 ++ tests/test_channels.py | 10 +- tests/test_cli_agent_display.py | 8 +- tests/test_cli_keys.py | 34 +- tests/test_commands.py | 382 ++++++++ tests/test_common.py | 4 +- tests/test_compact.py | 199 +++- tests/test_compaction.py | 2 +- tests/test_components.py | 4 +- tests/test_config.py | 44 +- tests/test_context.py | 91 +- tests/test_core_classes.py | 14 +- tests/test_email_channel.py | 70 +- tests/test_ha_conversation.py | 68 +- tests/test_hooks.py | 32 +- tests/test_hooks_http.py | 24 +- tests/test_llm.py | 6 +- tests/test_lsp.py | 42 +- tests/test_mcp_pool.py | 16 +- tests/test_notification_share_store.py | 6 +- tests/test_orchestrator_closure.py | 6 +- tests/test_orchestrator_compact.py | 111 ++- tests/test_orchestrator_title.py | 12 +- tests/test_permissions.py | 8 +- tests/test_plan_mode.py | 74 +- tests/test_planning_examples.py | 8 +- tests/test_plugin_builtin_scan.py | 216 +++++ tests/test_plugin_hooks.py | 4 +- tests/test_plugin_integration.py | 12 +- tests/test_plugins.py | 10 +- tests/test_project_instructions.py | 2 +- tests/test_prompt_injection.py | 18 +- tests/test_pydantic_to_openai_tool.py | 39 + tests/test_read_file.py | 4 +- tests/test_render_jinja_prompt.py | 16 + tests/test_resolve_safe_path_symlinks.py | 30 +- tests/test_session_runtime.py | 4 +- tests/test_session_store.py | 19 +- tests/test_session_store_mongo.py | 8 +- tests/test_session_tools.py | 239 +++++ tests/test_skills.py | 40 +- tests/test_spawn_agent.py | 249 ++++- tests/test_title_generator.py | 28 +- tests/test_token_budget.py | 6 +- tests/test_tool_partitioning.py | 8 +- tests/test_tool_registry.py | 50 +- tests/test_tool_search.py | 566 +++++++++++ tests/test_tool_use_loop.py | 116 ++- tests/test_tools_integration.py | 42 +- uv.lock | 884 +++++++++++++----- vendor/aider/README.md | 2 +- 528 files changed, 19099 insertions(+), 3470 deletions(-) create mode 100644 .claude/scheduled_tasks.lock rename .claude/skills/{meeseeks-cli-smoketest => mewbo-cli-smoketest}/SKILL.md (84%) create mode 100644 .github/workflows/docs-cleanup.yml delete mode 100644 apps/meeseeks_api/src/meeseeks_api/__init__.py delete mode 100644 apps/meeseeks_api/src/meeseeks_api/api/__init__.py delete mode 100644 apps/meeseeks_cli/src/meeseeks_cli/__init__.py delete mode 100644 apps/meeseeks_console/src/components/ConversationTimeline.tsx delete mode 100644 apps/meeseeks_console/src/components/FileList.tsx delete mode 100644 apps/meeseeks_console/src/components/ScrollToBottom.tsx delete mode 100644 apps/meeseeks_console/src/components/WorkspacePanel.tsx delete mode 100644 apps/meeseeks_console/src/index.css rename apps/{meeseeks_api => mewbo_api}/AGENTS.md (85%) rename apps/{meeseeks_api => mewbo_api}/CLAUDE.md (85%) rename apps/{meeseeks_api => mewbo_api}/Makefile (92%) rename apps/{meeseeks_api => mewbo_api}/README.md (87%) rename apps/{meeseeks_api => mewbo_api}/docker-compose.yml (100%) rename apps/{meeseeks_api => mewbo_api}/pyproject.toml (66%) create mode 100644 apps/mewbo_api/src/mewbo_api/__init__.py create mode 100644 apps/mewbo_api/src/mewbo_api/agentic_search/__init__.py create mode 100644 apps/mewbo_api/src/mewbo_api/agentic_search/fixtures.py create mode 100644 apps/mewbo_api/src/mewbo_api/agentic_search/routes.py create mode 100644 apps/mewbo_api/src/mewbo_api/agentic_search/store.py create mode 100644 apps/mewbo_api/src/mewbo_api/api/__init__.py rename apps/{meeseeks_api/src/meeseeks_api => mewbo_api/src/mewbo_api}/backend.py (83%) rename apps/{meeseeks_api/src/meeseeks_api => mewbo_api/src/mewbo_api}/channels/__init__.py (86%) rename apps/{meeseeks_api/src/meeseeks_api => mewbo_api/src/mewbo_api}/channels/base.py (100%) rename apps/{meeseeks_api/src/meeseeks_api => mewbo_api/src/mewbo_api}/channels/email_adapter.py (97%) rename apps/{meeseeks_api/src/meeseeks_api => mewbo_api/src/mewbo_api}/channels/email_template.html.j2 (76%) rename apps/{meeseeks_api/src/meeseeks_api => mewbo_api/src/mewbo_api}/channels/nextcloud_talk.py (96%) rename apps/{meeseeks_api/src/meeseeks_api => mewbo_api/src/mewbo_api}/channels/routes.py (94%) rename apps/{meeseeks_api/src/meeseeks_api => mewbo_api/src/mewbo_api}/ide.py (97%) rename apps/{meeseeks_api/src/meeseeks_api => mewbo_api/src/mewbo_api}/ide_routes.py (98%) create mode 100644 apps/mewbo_api/tests/test_agentic_search.py rename apps/{meeseeks_api => mewbo_api}/tests/test_backend.py (96%) create mode 100644 apps/mewbo_api/tests/test_capability_header.py create mode 100644 apps/mewbo_api/tests/test_commands_api.py rename apps/{meeseeks_api => mewbo_api}/tests/test_config_api.py (98%) rename apps/{meeseeks_api => mewbo_api}/tests/test_ide_manager.py (96%) rename apps/{meeseeks_api => mewbo_api}/tests/test_ide_routes.py (98%) rename apps/{meeseeks_cli => mewbo_cli}/AGENTS.md (85%) rename apps/{meeseeks_cli => mewbo_cli}/CLAUDE.md (82%) rename apps/{meeseeks_cli => mewbo_cli}/Makefile (93%) rename apps/{meeseeks_cli => mewbo_cli}/README.md (88%) rename apps/{meeseeks_cli => mewbo_cli}/pyproject.toml (62%) create mode 100644 apps/mewbo_cli/src/mewbo_cli/__init__.py rename apps/{meeseeks_cli/src/meeseeks_cli => mewbo_cli/src/mewbo_cli}/aider_ui.py (96%) rename apps/{meeseeks_cli/src/meeseeks_cli => mewbo_cli/src/mewbo_cli}/cli_agent_display.py (98%) rename apps/{meeseeks_cli/src/meeseeks_cli => mewbo_cli/src/mewbo_cli}/cli_commands.py (95%) rename apps/{meeseeks_cli/src/meeseeks_cli => mewbo_cli/src/mewbo_cli}/cli_context.py (78%) rename apps/{meeseeks_cli/src/meeseeks_cli => mewbo_cli/src/mewbo_cli}/cli_dialogs.py (99%) rename apps/{meeseeks_cli/src/meeseeks_cli => mewbo_cli/src/mewbo_cli}/cli_keys.py (100%) rename apps/{meeseeks_cli/src/meeseeks_cli => mewbo_cli/src/mewbo_cli}/cli_master.py (95%) rename apps/{meeseeks_cli => mewbo_cli}/tests/test_aider_ui.py (97%) rename apps/{meeseeks_cli => mewbo_cli}/tests/test_cli.py (88%) rename apps/{meeseeks_cli => mewbo_cli}/tests/test_cli_commands.py (93%) rename apps/{meeseeks_cli => mewbo_cli}/tests/test_cli_dialogs.py (99%) rename apps/{meeseeks_console => mewbo_console}/.env.example (100%) rename apps/{meeseeks_console => mewbo_console}/.eslintrc.cjs (100%) rename apps/{meeseeks_console => mewbo_console}/.gitignore (100%) rename apps/{meeseeks_console => mewbo_console}/CLAUDE.md (65%) rename apps/{meeseeks_console => mewbo_console}/Makefile (100%) rename apps/{meeseeks_console => mewbo_console}/README.md (88%) rename apps/{meeseeks_console => mewbo_console}/components.json (100%) rename apps/{meeseeks_console => mewbo_console}/docker-compose.yml (100%) rename apps/{meeseeks_console => mewbo_console}/index.html (96%) rename apps/{meeseeks_console => mewbo_console}/package-lock.json (99%) rename apps/{meeseeks_console => mewbo_console}/package.json (94%) rename apps/{meeseeks_console => mewbo_console}/playwright.config.ts (100%) rename apps/{meeseeks_console => mewbo_console}/postcss.config.js (100%) rename apps/{meeseeks_console => mewbo_console}/public/android-chrome-192x192.png (100%) rename apps/{meeseeks_console => mewbo_console}/public/android-chrome-512x512.png (100%) rename apps/{meeseeks_console => mewbo_console}/public/apple-touch-icon.png (100%) rename apps/{meeseeks_console => mewbo_console}/public/favicon-16x16.png (100%) rename apps/{meeseeks_console => mewbo_console}/public/favicon-32x32.png (100%) rename apps/{meeseeks_console => mewbo_console}/public/favicon.ico (100%) rename apps/{meeseeks_console => mewbo_console}/public/icons/Icon-100.png (100%) rename apps/{meeseeks_console => mewbo_console}/public/icons/Icon-1024.png (100%) rename apps/{meeseeks_console => mewbo_console}/public/icons/Icon-114.png (100%) rename apps/{meeseeks_console => mewbo_console}/public/icons/Icon-120.png (100%) rename apps/{meeseeks_console => mewbo_console}/public/icons/Icon-144.png (100%) rename apps/{meeseeks_console => mewbo_console}/public/icons/Icon-152.png (100%) rename apps/{meeseeks_console => mewbo_console}/public/icons/Icon-16.png (100%) rename apps/{meeseeks_console => mewbo_console}/public/icons/Icon-167.png (100%) rename apps/{meeseeks_console => mewbo_console}/public/icons/Icon-180.png (100%) rename apps/{meeseeks_console => mewbo_console}/public/icons/Icon-192.png (100%) rename apps/{meeseeks_console => mewbo_console}/public/icons/Icon-20.png (100%) rename apps/{meeseeks_console => mewbo_console}/public/icons/Icon-29.png (100%) rename apps/{meeseeks_console => mewbo_console}/public/icons/Icon-32.png (100%) rename apps/{meeseeks_console => mewbo_console}/public/icons/Icon-40.png (100%) rename apps/{meeseeks_console => mewbo_console}/public/icons/Icon-50.png (100%) rename apps/{meeseeks_console => mewbo_console}/public/icons/Icon-512.png (100%) rename apps/{meeseeks_console => mewbo_console}/public/icons/Icon-57.png (100%) rename apps/{meeseeks_console => mewbo_console}/public/icons/Icon-58.png (100%) rename apps/{meeseeks_console => mewbo_console}/public/icons/Icon-60.png (100%) rename apps/{meeseeks_console => mewbo_console}/public/icons/Icon-72.png (100%) rename apps/{meeseeks_console => mewbo_console}/public/icons/Icon-76.png (100%) rename apps/{meeseeks_console => mewbo_console}/public/icons/Icon-80.png (100%) rename apps/{meeseeks_console => mewbo_console}/public/icons/Icon-87.png (100%) rename apps/{meeseeks_console => mewbo_console}/public/logo-bg.svg (100%) rename apps/{meeseeks_console => mewbo_console}/public/logo-icon.svg (100%) rename apps/{meeseeks_console => mewbo_console}/public/logo-transparent.svg (100%) rename apps/{meeseeks_console => mewbo_console}/public/session-ide-floral-background-animation.svg (100%) rename apps/{meeseeks_console => mewbo_console}/src/App.tsx (91%) rename apps/{meeseeks_console => mewbo_console}/src/__tests__/EditableTitle.test.tsx (100%) rename apps/{meeseeks_console => mewbo_console}/src/__tests__/app.test.tsx (99%) create mode 100644 apps/mewbo_console/src/__tests__/commands.test.ts rename apps/{meeseeks_console => mewbo_console}/src/__tests__/fixtures/mockData.ts (100%) rename apps/{meeseeks_console => mewbo_console}/src/__tests__/timeline.test.ts (77%) rename apps/{meeseeks_console => mewbo_console}/src/api/INTEGRATIONS.md (95%) create mode 100644 apps/mewbo_console/src/api/agenticSearch.ts rename apps/{meeseeks_console => mewbo_console}/src/api/client.ts (94%) rename apps/{meeseeks_console => mewbo_console}/src/api/contracts.ts (96%) rename apps/{meeseeks_console => mewbo_console}/src/api/ide.ts (100%) rename apps/{meeseeks_console => mewbo_console}/src/api/realClient.ts (93%) rename apps/{meeseeks_console => mewbo_console}/src/components/AppLayout.tsx (100%) create mode 100644 apps/mewbo_console/src/components/ChatRow.tsx create mode 100644 apps/mewbo_console/src/components/CheckAgentsCard.tsx create mode 100644 apps/mewbo_console/src/components/CommandDialog.tsx create mode 100644 apps/mewbo_console/src/components/CommandPalette.tsx rename apps/{meeseeks_console => mewbo_console}/src/components/ConfigMenu.tsx (100%) rename apps/{meeseeks_console => mewbo_console}/src/components/ContextWindowBar.tsx (100%) create mode 100644 apps/mewbo_console/src/components/ConversationTimeline.tsx rename apps/{meeseeks_console => mewbo_console}/src/components/CopyButton.tsx (100%) rename apps/{meeseeks_console => mewbo_console}/src/components/DiffCard.tsx (96%) rename apps/{meeseeks_console => mewbo_console}/src/components/DiffStats.tsx (100%) rename apps/{meeseeks_console => mewbo_console}/src/components/EditableTitle.tsx (100%) create mode 100644 apps/mewbo_console/src/components/FileList.tsx rename apps/{meeseeks_console => mewbo_console}/src/components/FileReadCard.tsx (100%) rename apps/{meeseeks_console => mewbo_console}/src/components/ForkFromHereButton.tsx (100%) rename apps/{meeseeks_console => mewbo_console}/src/components/HighlightedCode.tsx (100%) rename apps/{meeseeks_console => mewbo_console}/src/components/HomeView.tsx (98%) rename apps/{meeseeks_console => mewbo_console}/src/components/IdeLoader.tsx (99%) rename apps/{meeseeks_console => mewbo_console}/src/components/InputBar.tsx (68%) rename apps/{meeseeks_console => mewbo_console}/src/components/InputComposerBody.tsx (55%) rename apps/{meeseeks_console => mewbo_console}/src/components/LangfuseIcon.tsx (100%) rename apps/{meeseeks_console => mewbo_console}/src/components/LogEventCard.tsx (78%) rename apps/{meeseeks_console => mewbo_console}/src/components/LogsView.tsx (79%) rename apps/{meeseeks_console => mewbo_console}/src/components/MessageBubble.tsx (93%) rename apps/{meeseeks_console => mewbo_console}/src/components/ModelBrandIcon.tsx (100%) rename apps/{meeseeks_console => mewbo_console}/src/components/ModelLabel.tsx (100%) rename apps/{meeseeks_console => mewbo_console}/src/components/NavBar.tsx (97%) rename apps/{meeseeks_console => mewbo_console}/src/components/NewProjectForm.tsx (100%) create mode 100644 apps/mewbo_console/src/components/NotificationBalloon.tsx rename apps/{meeseeks_console => mewbo_console}/src/components/NotificationPanel.tsx (80%) rename apps/{meeseeks_console => mewbo_console}/src/components/PlanCard.tsx (100%) rename apps/{meeseeks_console => mewbo_console}/src/components/PluginsView.tsx (100%) rename apps/{meeseeks_console => mewbo_console}/src/components/ProjectCard.tsx (100%) rename apps/{meeseeks_console => mewbo_console}/src/components/ProjectsView.tsx (100%) rename apps/{meeseeks_console => mewbo_console}/src/components/RetryFromHereButton.tsx (100%) rename apps/{meeseeks_console => mewbo_console}/src/components/ReviewPane.tsx (100%) create mode 100644 apps/mewbo_console/src/components/RunTelemetry.tsx create mode 100644 apps/mewbo_console/src/components/ScrollToBottom.tsx rename apps/{meeseeks_console => mewbo_console}/src/components/SessionDetailView.tsx (78%) rename apps/{meeseeks_console => mewbo_console}/src/components/SessionItem.tsx (100%) rename apps/{meeseeks_console => mewbo_console}/src/components/SettingsView.tsx (100%) create mode 100644 apps/mewbo_console/src/components/SpawnAgentCard.tsx rename apps/{meeseeks_console => mewbo_console}/src/components/StatusBadge.tsx (100%) create mode 100644 apps/mewbo_console/src/components/StliteWidgetPanel.tsx rename apps/{meeseeks_console => mewbo_console}/src/components/SummaryBlock.tsx (100%) rename apps/{meeseeks_console => mewbo_console}/src/components/TerminalCard.tsx (100%) create mode 100644 apps/mewbo_console/src/components/TurnScroller.tsx rename apps/{meeseeks_console => mewbo_console}/src/components/TypewriterGreeting.tsx (100%) rename apps/{meeseeks_console => mewbo_console}/src/components/UpdatePrompt.tsx (53%) create mode 100644 apps/mewbo_console/src/components/WidgetCard.tsx create mode 100644 apps/mewbo_console/src/components/WorkspacePanel.tsx create mode 100644 apps/mewbo_console/src/components/__tests__/CheckAgentsCard.test.tsx rename apps/{meeseeks_console => mewbo_console}/src/components/__tests__/NewProjectForm.test.tsx (100%) create mode 100644 apps/mewbo_console/src/components/__tests__/SpawnAgentCard.test.tsx create mode 100644 apps/mewbo_console/src/components/agentic_search/AgenticSearchView.tsx create mode 100644 apps/mewbo_console/src/components/agentic_search/AnswerCard.tsx create mode 100644 apps/mewbo_console/src/components/agentic_search/LandingPanel.tsx create mode 100644 apps/mewbo_console/src/components/agentic_search/ResultCard.tsx create mode 100644 apps/mewbo_console/src/components/agentic_search/ResultsPanel.tsx create mode 100644 apps/mewbo_console/src/components/agentic_search/RightRail.tsx create mode 100644 apps/mewbo_console/src/components/agentic_search/SearchBar.tsx create mode 100644 apps/mewbo_console/src/components/agentic_search/SrcAvatar.tsx create mode 100644 apps/mewbo_console/src/components/agentic_search/TraceDrawer.tsx create mode 100644 apps/mewbo_console/src/components/agentic_search/WorkspaceModal.tsx create mode 100644 apps/mewbo_console/src/components/agentic_search/utils.ts create mode 100644 apps/mewbo_console/src/components/agents.tsx rename apps/{meeseeks_console => mewbo_console}/src/components/settings/RjsfTheme.tsx (98%) rename apps/{meeseeks_console => mewbo_console}/src/components/ui/alert.tsx (100%) rename apps/{meeseeks_console => mewbo_console}/src/components/ui/button.tsx (100%) rename apps/{meeseeks_console => mewbo_console}/src/components/ui/command.tsx (100%) rename apps/{meeseeks_console => mewbo_console}/src/components/ui/dialog.tsx (100%) rename apps/{meeseeks_console => mewbo_console}/src/components/ui/dropdown-menu.tsx (100%) rename apps/{meeseeks_console => mewbo_console}/src/components/ui/form.tsx (100%) rename apps/{meeseeks_console => mewbo_console}/src/components/ui/input.tsx (100%) rename apps/{meeseeks_console => mewbo_console}/src/components/ui/label.tsx (100%) rename apps/{meeseeks_console => mewbo_console}/src/components/ui/popover.tsx (100%) rename apps/{meeseeks_console => mewbo_console}/src/components/ui/scroll-area.tsx (100%) create mode 100644 apps/mewbo_console/src/components/ui/sheet.tsx create mode 100644 apps/mewbo_console/src/components/ui/switch.tsx rename apps/{meeseeks_console => mewbo_console}/src/components/ui/tabs.tsx (100%) rename apps/{meeseeks_console => mewbo_console}/src/components/ui/textarea.tsx (100%) create mode 100644 apps/mewbo_console/src/hooks/useAgenticSearch.ts rename apps/{meeseeks_console => mewbo_console}/src/hooks/useAutoScroll.ts (100%) create mode 100644 apps/mewbo_console/src/hooks/useCommands.ts rename apps/{meeseeks_console => mewbo_console}/src/hooks/useConfig.ts (100%) rename apps/{meeseeks_console => mewbo_console}/src/hooks/useContainerCompact.ts (100%) create mode 100644 apps/mewbo_console/src/hooks/useElapsed.ts rename apps/{meeseeks_console => mewbo_console}/src/hooks/useGitDiff.ts (100%) rename apps/{meeseeks_console => mewbo_console}/src/hooks/useIdeStatus.ts (100%) rename apps/{meeseeks_console => mewbo_console}/src/hooks/useIsMobile.ts (100%) rename apps/{meeseeks_console => mewbo_console}/src/hooks/useMcpTools.ts (100%) rename apps/{meeseeks_console => mewbo_console}/src/hooks/useModels.ts (100%) rename apps/{meeseeks_console => mewbo_console}/src/hooks/useNotifications.ts (100%) rename apps/{meeseeks_console => mewbo_console}/src/hooks/useProjects.ts (100%) rename apps/{meeseeks_console => mewbo_console}/src/hooks/useSessionEvents.ts (100%) rename apps/{meeseeks_console => mewbo_console}/src/hooks/useSessionQuery.tsx (100%) rename apps/{meeseeks_console => mewbo_console}/src/hooks/useSessionStream.ts (95%) rename apps/{meeseeks_console => mewbo_console}/src/hooks/useSessionUsage.ts (100%) rename apps/{meeseeks_console => mewbo_console}/src/hooks/useSessions.ts (100%) rename apps/{meeseeks_console => mewbo_console}/src/hooks/useSkills.ts (100%) rename apps/{meeseeks_console => mewbo_console}/src/hooks/useVirtualProjects.ts (100%) rename apps/{meeseeks_console => mewbo_console}/src/hooks/useWebIdeEnabled.ts (100%) create mode 100644 apps/mewbo_console/src/index.css rename apps/{meeseeks_console => mewbo_console}/src/index.tsx (100%) create mode 100644 apps/mewbo_console/src/lib/commands.ts create mode 100644 apps/mewbo_console/src/lib/notifications.ts rename apps/{meeseeks_console => mewbo_console}/src/lib/utils.ts (100%) rename apps/{meeseeks_console => mewbo_console}/src/setupTests.ts (100%) rename apps/{meeseeks_console => mewbo_console}/src/types.ts (77%) create mode 100644 apps/mewbo_console/src/types/agenticSearch.ts create mode 100644 apps/mewbo_console/src/utils/agentStatus.ts create mode 100644 apps/mewbo_console/src/utils/agents.ts rename apps/{meeseeks_console => mewbo_console}/src/utils/clipboard.ts (100%) rename apps/{meeseeks_console => mewbo_console}/src/utils/cn.ts (100%) rename apps/{meeseeks_console => mewbo_console}/src/utils/diff.ts (100%) rename apps/{meeseeks_console => mewbo_console}/src/utils/diffCard.ts (100%) rename apps/{meeseeks_console => mewbo_console}/src/utils/errors.ts (100%) rename apps/{meeseeks_console => mewbo_console}/src/utils/highlight.ts (100%) rename apps/{meeseeks_console => mewbo_console}/src/utils/json.ts (100%) rename apps/{meeseeks_console => mewbo_console}/src/utils/logs.ts (76%) rename apps/{meeseeks_console => mewbo_console}/src/utils/model.ts (100%) rename apps/{meeseeks_console => mewbo_console}/src/utils/modelIcon.ts (100%) rename apps/{meeseeks_console => mewbo_console}/src/utils/modelSupport.ts (100%) rename apps/{meeseeks_console => mewbo_console}/src/utils/time.ts (100%) rename apps/{meeseeks_console => mewbo_console}/src/utils/timeline.ts (89%) rename apps/{meeseeks_console => mewbo_console}/src/vite-env.d.ts (100%) rename apps/{meeseeks_console => mewbo_console}/tailwind.config.js (100%) rename apps/{meeseeks_console => mewbo_console}/tests/e2e/app.spec.ts (100%) rename apps/{meeseeks_console => mewbo_console}/tsconfig.json (100%) rename apps/{meeseeks_console => mewbo_console}/tsconfig.node.json (100%) rename apps/{meeseeks_console => mewbo_console}/vite.config.ts (71%) create mode 100644 docs/features-widgets.md delete mode 100755 docs/meeseeks-console-01-front.jpg delete mode 100755 docs/meeseeks-console-02-tasks.jpg delete mode 100755 docs/meeseeks-console-05-plugins.jpg delete mode 100755 docs/meeseeks-console-06-projects.jpg delete mode 100755 docs/meeseeks-nctalk-01.jpg rename docs/{meeseeks-cli-01-video.mp4 => mewbo-cli-01-video.mp4} (100%) create mode 100755 docs/mewbo-console-01-front.png create mode 100644 docs/mewbo-console-02-tasks.png rename docs/{meeseeks-console-03-plan-approval.jpg => mewbo-console-03-plan-approval.jpg} (100%) rename docs/{meeseeks-console-04-file-edit.jpg => mewbo-console-04-file-edit.jpg} (100%) create mode 100755 docs/mewbo-console-05-plugins.png create mode 100755 docs/mewbo-console-06-projects.png create mode 100755 docs/mewbo-console-07-widgets.png rename docs/{meeseeks-console-banner.gif => mewbo-console-banner.gif} (100%) rename docs/{meeseeks-console-coder-demo-1.mp4 => mewbo-console-coder-demo-1.mp4} (100%) rename docs/{meeseeks-console-file-read-log.jpg => mewbo-console-file-read-log.jpg} (100%) rename docs/{meeseeks-console-shell-log.jpg => mewbo-console-shell-log.jpg} (100%) rename docs/{meeseeks-email-01.jpg => mewbo-email-01.jpg} (100%) create mode 100644 docs/mewbo-nctalk-01.png rename {meeseeks_ha_conversation => mewbo_ha_conversation}/AGENTS.md (85%) rename {meeseeks_ha_conversation => mewbo_ha_conversation}/CLAUDE.md (71%) rename {meeseeks_ha_conversation => mewbo_ha_conversation}/README.md (75%) rename {meeseeks_ha_conversation => mewbo_ha_conversation}/__init__.py (87%) rename {meeseeks_ha_conversation => mewbo_ha_conversation}/api.py (90%) rename {meeseeks_ha_conversation => mewbo_ha_conversation}/config_flow.py (90%) rename {meeseeks_ha_conversation => mewbo_ha_conversation}/const.py (87%) rename {meeseeks_ha_conversation => mewbo_ha_conversation}/coordinator.py (85%) rename {meeseeks_ha_conversation => mewbo_ha_conversation}/exceptions.py (100%) rename {meeseeks_ha_conversation => mewbo_ha_conversation}/helpers.py (97%) rename {meeseeks_ha_conversation => mewbo_ha_conversation}/manifest.json (84%) rename {meeseeks_ha_conversation => mewbo_ha_conversation}/pyproject.toml (76%) rename {meeseeks_ha_conversation => mewbo_ha_conversation}/strings.json (100%) rename {meeseeks_ha_conversation => mewbo_ha_conversation}/translations/en.json (100%) create mode 100644 overrides/templates/bottom_sidebar.html delete mode 100644 packages/meeseeks_core/src/meeseeks_core/__init__.py delete mode 100644 packages/meeseeks_tools/src/meeseeks_tools/__init__.py delete mode 100644 packages/meeseeks_tools/src/meeseeks_tools/integration/__init__.py delete mode 100644 packages/meeseeks_tools/src/meeseeks_tools/vendor/__init__.py delete mode 100644 packages/meeseeks_tools/src/meeseeks_tools/vendor/aider/__init__.py rename packages/{meeseeks_core => mewbo_core}/README.md (85%) rename packages/{meeseeks_core => mewbo_core}/pyproject.toml (74%) create mode 100644 packages/mewbo_core/src/mewbo_core/__init__.py rename packages/{meeseeks_core/src/meeseeks_core => mewbo_core/src/mewbo_core}/agent_context.py (96%) rename packages/{meeseeks_core/src/meeseeks_core => mewbo_core/src/mewbo_core}/agent_registry.py (70%) rename packages/{meeseeks_core/src/meeseeks_core => mewbo_core/src/mewbo_core}/built_in_agents.py (100%) create mode 100644 packages/mewbo_core/src/mewbo_core/builtin_plugins/.keep create mode 100644 packages/mewbo_core/src/mewbo_core/builtin_plugins/__init__.py create mode 100644 packages/mewbo_core/src/mewbo_core/builtin_plugins/widget_builder/.claude-plugin/plugin.json create mode 100644 packages/mewbo_core/src/mewbo_core/builtin_plugins/widget_builder/__init__.py create mode 100644 packages/mewbo_core/src/mewbo_core/builtin_plugins/widget_builder/agents/st-widget-builder.md create mode 100644 packages/mewbo_core/src/mewbo_core/builtin_plugins/widget_builder/examples/README.md create mode 100644 packages/mewbo_core/src/mewbo_core/builtin_plugins/widget_builder/examples/components/README.md create mode 100644 packages/mewbo_core/src/mewbo_core/builtin_plugins/widget_builder/examples/components/github_repo_card.py create mode 100644 packages/mewbo_core/src/mewbo_core/builtin_plugins/widget_builder/examples/components/plantuml_card.py create mode 100644 packages/mewbo_core/src/mewbo_core/builtin_plugins/widget_builder/examples/components/search_result_card.py create mode 100644 packages/mewbo_core/src/mewbo_core/builtin_plugins/widget_builder/examples/components/stock_ticker_card.py create mode 100644 packages/mewbo_core/src/mewbo_core/builtin_plugins/widget_builder/examples/data_table/app.py create mode 100644 packages/mewbo_core/src/mewbo_core/builtin_plugins/widget_builder/examples/data_table/data.json create mode 100644 packages/mewbo_core/src/mewbo_core/builtin_plugins/widget_builder/examples/finance_chart/app.py create mode 100644 packages/mewbo_core/src/mewbo_core/builtin_plugins/widget_builder/examples/finance_chart/data.json create mode 100644 packages/mewbo_core/src/mewbo_core/builtin_plugins/widget_builder/examples/ruff.toml create mode 100644 packages/mewbo_core/src/mewbo_core/builtin_plugins/widget_builder/linter.py create mode 100644 packages/mewbo_core/src/mewbo_core/builtin_plugins/widget_builder/skills/st-widget-builder/SKILL.md create mode 100644 packages/mewbo_core/src/mewbo_core/builtin_plugins/widget_builder/submit_widget.py create mode 100644 packages/mewbo_core/src/mewbo_core/builtin_plugins/widget_builder/themes/warm_terracotta.toml create mode 100644 packages/mewbo_core/src/mewbo_core/capabilities.py rename packages/{meeseeks_core/src/meeseeks_core => mewbo_core/src/mewbo_core}/classes.py (95%) create mode 100644 packages/mewbo_core/src/mewbo_core/commands.py rename packages/{meeseeks_core/src/meeseeks_core => mewbo_core/src/mewbo_core}/common.py (82%) rename packages/{meeseeks_core/src/meeseeks_core => mewbo_core/src/mewbo_core}/compact.py (83%) rename packages/{meeseeks_core/src/meeseeks_core => mewbo_core/src/mewbo_core}/compaction.py (95%) rename packages/{meeseeks_core/src/meeseeks_core => mewbo_core/src/mewbo_core}/components.py (98%) rename packages/{meeseeks_core/src/meeseeks_core => mewbo_core/src/mewbo_core}/config.py (95%) rename packages/{meeseeks_core/src/meeseeks_core => mewbo_core/src/mewbo_core}/context.py (88%) rename packages/{meeseeks_core/src/meeseeks_core => mewbo_core/src/mewbo_core}/errors.py (100%) rename packages/{meeseeks_core/src/meeseeks_core => mewbo_core/src/mewbo_core}/exit_plan_mode.py (96%) rename packages/{meeseeks_core/src/meeseeks_core => mewbo_core/src/mewbo_core}/extras/__init__.py (100%) rename packages/{meeseeks_core/src/meeseeks_core => mewbo_core/src/mewbo_core}/hooks.py (95%) rename packages/{meeseeks_core/src/meeseeks_core => mewbo_core/src/mewbo_core}/hypervisor.py (98%) rename packages/{meeseeks_core/src/meeseeks_core => mewbo_core/src/mewbo_core}/llm.py (99%) rename packages/{meeseeks_core/src/meeseeks_core => mewbo_core/src/mewbo_core}/notifications.py (97%) rename packages/{meeseeks_core/src/meeseeks_core => mewbo_core/src/mewbo_core}/orchestrator.py (73%) rename packages/{meeseeks_core/src/meeseeks_core => mewbo_core/src/mewbo_core}/permissions.py (96%) rename packages/{meeseeks_core/src/meeseeks_core => mewbo_core/src/mewbo_core}/planning.py (95%) rename packages/{meeseeks_core/src/meeseeks_core => mewbo_core/src/mewbo_core}/plugins.py (78%) rename packages/{meeseeks_core/src/meeseeks_core => mewbo_core/src/mewbo_core}/project_store.py (98%) rename packages/{meeseeks_core/src/meeseeks_core => mewbo_core/src/mewbo_core}/prompts/action-planner.txt (85%) rename packages/{meeseeks_core/src/meeseeks_core => mewbo_core/src/mewbo_core}/prompts/homeassistant-get-state.txt (100%) rename packages/{meeseeks_core/src/meeseeks_core => mewbo_core/src/mewbo_core}/prompts/homeassistant-set-state.txt (100%) rename packages/{meeseeks_core/src/meeseeks_core => mewbo_core/src/mewbo_core}/prompts/plan_hypervisor.txt (100%) rename packages/{meeseeks_core/src/meeseeks_core => mewbo_core/src/mewbo_core}/prompts/plan_mode_reminder.txt (100%) rename packages/{meeseeks_core/src/meeseeks_core => mewbo_core/src/mewbo_core}/prompts/system.txt (92%) rename packages/{meeseeks_core/src/meeseeks_core => mewbo_core/src/mewbo_core}/prompts/tools/aider-edit-blocks.txt (100%) rename packages/{meeseeks_core/src/meeseeks_core => mewbo_core/src/mewbo_core}/prompts/tools/aider-list-dir.txt (100%) rename packages/{meeseeks_core/src/meeseeks_core => mewbo_core/src/mewbo_core}/prompts/tools/aider-shell.txt (100%) rename packages/{meeseeks_core/src/meeseeks_core => mewbo_core/src/mewbo_core}/prompts/tools/file-edit.txt (100%) rename packages/{meeseeks_core/src/meeseeks_core => mewbo_core/src/mewbo_core}/prompts/tools/home-assistant.txt (100%) rename packages/{meeseeks_core/src/meeseeks_core => mewbo_core/src/mewbo_core}/prompts/tools/lsp.txt (100%) rename packages/{meeseeks_core/src/meeseeks_core => mewbo_core/src/mewbo_core}/prompts/tools/read-file.txt (100%) rename packages/{meeseeks_core/src/meeseeks_core => mewbo_core/src/mewbo_core}/session_runtime.py (92%) rename packages/{meeseeks_core/src/meeseeks_core => mewbo_core/src/mewbo_core}/session_store.py (97%) rename packages/{meeseeks_core/src/meeseeks_core => mewbo_core/src/mewbo_core}/session_store_mongo.py (96%) create mode 100644 packages/mewbo_core/src/mewbo_core/session_tools.py rename packages/{meeseeks_core/src/meeseeks_core => mewbo_core/src/mewbo_core}/share_store.py (98%) rename packages/{meeseeks_core/src/meeseeks_core => mewbo_core/src/mewbo_core}/skills.py (78%) rename packages/{meeseeks_core/src/meeseeks_core => mewbo_core/src/mewbo_core}/spawn_agent.py (80%) rename packages/{meeseeks_core/src/meeseeks_core => mewbo_core/src/mewbo_core}/task_master.py (84%) rename packages/{meeseeks_core/src/meeseeks_core => mewbo_core/src/mewbo_core}/templates/project_claude_md.j2 (86%) rename packages/{meeseeks_core/src/meeseeks_core => mewbo_core/src/mewbo_core}/title_generator.py (95%) rename packages/{meeseeks_core/src/meeseeks_core => mewbo_core/src/mewbo_core}/token_budget.py (98%) rename packages/{meeseeks_core/src/meeseeks_core => mewbo_core/src/mewbo_core}/tool_registry.py (82%) rename packages/{meeseeks_core/src/meeseeks_core => mewbo_core/src/mewbo_core}/tool_use_loop.py (87%) rename packages/{meeseeks_core/src/meeseeks_core => mewbo_core/src/mewbo_core}/types.py (100%) rename packages/{meeseeks_tools => mewbo_tools}/README.md (88%) rename packages/{meeseeks_tools => mewbo_tools}/pyproject.toml (78%) create mode 100644 packages/mewbo_tools/src/mewbo_tools/__init__.py rename packages/{meeseeks_tools/src/meeseeks_tools => mewbo_tools/src/mewbo_tools}/aider_bridge/__init__.py (87%) rename packages/{meeseeks_tools/src/meeseeks_tools => mewbo_tools/src/mewbo_tools}/aider_bridge/edit_blocks.py (99%) rename packages/{meeseeks_tools/src/meeseeks_tools => mewbo_tools/src/mewbo_tools}/core/__init__.py (83%) create mode 100644 packages/mewbo_tools/src/mewbo_tools/integration/__init__.py rename packages/{meeseeks_tools/src/meeseeks_tools => mewbo_tools/src/mewbo_tools}/integration/aider_edit_blocks.py (94%) rename packages/{meeseeks_tools/src/meeseeks_tools => mewbo_tools/src/mewbo_tools}/integration/aider_file_tools.py (96%) rename packages/{meeseeks_tools/src/meeseeks_tools => mewbo_tools/src/mewbo_tools}/integration/aider_shell_tool.py (92%) rename packages/{meeseeks_tools/src/meeseeks_tools => mewbo_tools/src/mewbo_tools}/integration/edit_common.py (95%) rename packages/{meeseeks_tools/src/meeseeks_tools => mewbo_tools/src/mewbo_tools}/integration/file_edit_tool.py (95%) rename packages/{meeseeks_tools/src/meeseeks_tools => mewbo_tools/src/mewbo_tools}/integration/homeassistant.py (99%) rename packages/{meeseeks_tools/src/meeseeks_tools => mewbo_tools/src/mewbo_tools}/integration/lsp/__init__.py (93%) rename packages/{meeseeks_tools/src/meeseeks_tools => mewbo_tools/src/mewbo_tools}/integration/lsp/manager.py (97%) rename packages/{meeseeks_tools/src/meeseeks_tools => mewbo_tools/src/mewbo_tools}/integration/lsp/servers.py (100%) rename packages/{meeseeks_tools/src/meeseeks_tools => mewbo_tools/src/mewbo_tools}/integration/lsp/tool.py (98%) rename packages/{meeseeks_tools/src/meeseeks_tools => mewbo_tools/src/mewbo_tools}/integration/mcp.py (95%) rename packages/{meeseeks_tools/src/meeseeks_tools => mewbo_tools/src/mewbo_tools}/integration/mcp_pool.py (97%) create mode 100644 packages/mewbo_tools/src/mewbo_tools/integration/tool_search.py create mode 100644 packages/mewbo_tools/src/mewbo_tools/vendor/__init__.py rename packages/{meeseeks_tools/src/meeseeks_tools => mewbo_tools/src/mewbo_tools}/vendor/aider/LICENSE.txt (100%) rename packages/{meeseeks_tools/src/meeseeks_tools => mewbo_tools/src/mewbo_tools}/vendor/aider/README.md (100%) create mode 100644 packages/mewbo_tools/src/mewbo_tools/vendor/aider/__init__.py rename packages/{meeseeks_tools/src/meeseeks_tools => mewbo_tools/src/mewbo_tools}/vendor/aider/dump.py (100%) rename packages/{meeseeks_tools/src/meeseeks_tools => mewbo_tools/src/mewbo_tools}/vendor/aider/editor.py (100%) rename packages/{meeseeks_tools/src/meeseeks_tools => mewbo_tools/src/mewbo_tools}/vendor/aider/file_ops.py (100%) rename packages/{meeseeks_tools/src/meeseeks_tools => mewbo_tools/src/mewbo_tools}/vendor/aider/io.py (100%) rename packages/{meeseeks_tools/src/meeseeks_tools => mewbo_tools/src/mewbo_tools}/vendor/aider/mdstream.py (100%) rename packages/{meeseeks_tools/src/meeseeks_tools => mewbo_tools/src/mewbo_tools}/vendor/aider/run_cmd.py (100%) rename packages/{meeseeks_tools/src/meeseeks_tools => mewbo_tools/src/mewbo_tools}/vendor/aider/utils.py (100%) delete mode 100644 src/meeseeks_workspace/__init__.py create mode 100644 src/mewbo_workspace/__init__.py create mode 100644 tests/builtin_plugins/__init__.py create mode 100644 tests/builtin_plugins/test_widget_builder_plugin.py create mode 100644 tests/builtin_plugins/test_widget_components.py create mode 100644 tests/builtin_plugins/test_widget_linter.py create mode 100644 tests/test_capabilities.py create mode 100644 tests/test_commands.py create mode 100644 tests/test_plugin_builtin_scan.py create mode 100644 tests/test_pydantic_to_openai_tool.py create mode 100644 tests/test_render_jinja_prompt.py create mode 100644 tests/test_session_tools.py create mode 100644 tests/test_tool_search.py diff --git a/.claude/scheduled_tasks.lock b/.claude/scheduled_tasks.lock new file mode 100644 index 00000000..bd2fb0a2 --- /dev/null +++ b/.claude/scheduled_tasks.lock @@ -0,0 +1 @@ +{"sessionId":"57f44d3f-2540-472d-bc33-d4a87322ae05","pid":1372647,"procStart":"48543280","acquiredAt":1777290170782} \ No newline at end of file diff --git a/.claude/skills/meeseeks-cli-smoketest/SKILL.md b/.claude/skills/mewbo-cli-smoketest/SKILL.md similarity index 84% rename from .claude/skills/meeseeks-cli-smoketest/SKILL.md rename to .claude/skills/mewbo-cli-smoketest/SKILL.md index 6952e481..da7419bb 100644 --- a/.claude/skills/meeseeks-cli-smoketest/SKILL.md +++ b/.claude/skills/mewbo-cli-smoketest/SKILL.md @@ -1,11 +1,11 @@ --- -name: meeseeks-cli-smoketest -description: End-to-end smoke testing of the Meeseeks CLI via tmux. Use this skill when asked to test the CLI, verify CLI behavior after changes, smoke-test the agent loop, check for regressions, or validate MCP/plugin/session features work correctly through the terminal interface. Also use when debugging CLI crashes, MCP connection issues, or session lifecycle problems that need live reproduction. +name: mewbo-cli-smoketest +description: End-to-end smoke testing of the Mewbo CLI via tmux. Use this skill when asked to test the CLI, verify CLI behavior after changes, smoke-test the agent loop, check for regressions, or validate MCP/plugin/session features work correctly through the terminal interface. Also use when debugging CLI crashes, MCP connection issues, or session lifecycle problems that need live reproduction. --- -# Meeseeks CLI Smoke Test via Tmux +# Mewbo CLI Smoke Test via Tmux -Automate end-to-end CLI testing by running `meeseeks` inside a tmux pane, sending commands/queries, and analyzing verbose output for errors, warnings, and regressions. +Automate end-to-end CLI testing by running `mewbo` inside a tmux pane, sending commands/queries, and analyzing verbose output for errors, warnings, and regressions. ## Why tmux @@ -17,22 +17,22 @@ Find a running tmux session and create a new window: ```bash tmux list-sessions -tmux new-window -t : -n meeseeks-test +tmux new-window -t : -n mewbo-test ``` Launch with maximum verbosity and auto-approve (skips permission prompts): ```bash -tmux send-keys -t :meeseeks-test "uv run meeseeks -vv --auto-approve" Enter +tmux send-keys -t :mewbo-test "uv run mewbo -vv --auto-approve" Enter ``` Wait for startup (MCP connections, plugin loading, skill discovery). Startup typically takes 5-10 seconds depending on MCP server count. Capture and verify the banner appears: ```bash -sleep 10 && tmux capture-pane -t :meeseeks-test -p -S -100 +sleep 10 && tmux capture-pane -t :mewbo-test -p -S -100 ``` -Look for the ready banner showing model, session ID, tool counts, and `meeseeks>` prompt. If the prompt hasn't appeared, wait longer — MCP servers may take time to connect. +Look for the ready banner showing model, session ID, tool counts, and `mewbo>` prompt. If the prompt hasn't appeared, wait longer — MCP servers may take time to connect. ## Capture timing @@ -151,11 +151,11 @@ Failed to — connection/reconnection failures When you see MCP reconnection errors, the root cause is usually in the config merge pipeline: -1. **Multiple config formats**: `configs/mcp.json` (Meeseeks native: `servers` + `transport`) vs `.mcp.json` (Claude Code: `mcpServers` + `type`) vs plugin `.mcp.json` (varies) +1. **Multiple config formats**: `configs/mcp.json` (Mewbo native: `servers` + `transport`) vs `.mcp.json` (Claude Code: `mcpServers` + `type`) vs plugin `.mcp.json` (varies) 2. **Deep merge collision**: `_deep_merge` on individual server configs can produce entries with BOTH `type` and `transport` when CWD overrides global 3. **Plugin config normalization**: Plugin `.mcp.json` files may use `mcpServers` wrapper or bare server format without `transport` -To trace: read the MCP configs (`configs/mcp.json`, `.mcp.json`, and plugin `.mcp.json` files), then check `_normalize_mcp_config` in `meeseeks_tools/integration/mcp.py` and `load_all_plugin_components` in `meeseeks_core/plugins.py`. +To trace: read the MCP configs (`configs/mcp.json`, `.mcp.json`, and plugin `.mcp.json` files), then check `_normalize_mcp_config` in `mewbo_tools/integration/mcp.py` and `load_all_plugin_components` in `mewbo_core/plugins.py`. ### Session verification @@ -173,9 +173,9 @@ For deeper verification, check Langfuse traces (trace_id == session_id) and Mong When done testing, exit cleanly: ```bash -tmux send-keys -t :meeseeks-test "/exit" Enter +tmux send-keys -t :mewbo-test "/exit" Enter sleep 2 -tmux kill-window -t :meeseeks-test +tmux kill-window -t :mewbo-test ``` ## Non-obvious gotchas diff --git a/.devin/wiki.json b/.devin/wiki.json index 1ba13576..9aae7aa3 100644 --- a/.devin/wiki.json +++ b/.devin/wiki.json @@ -1,117 +1,117 @@ { "repo_notes": [ { - "content": "Developer documentation only. Mirror the repo structure and module boundaries (packages/, apps/, meeseeks_ha_conversation/) with minimal redundancy. Every page must include a meaningful Mermaid diagram that matches the page purpose. Name exact classes, functions, and module paths. Clarify that the API exposes polling; the CLI runs the runtime in-process (no polling); the web console connects via the REST API. Focus on system behavior, abstractions, and integration contracts rather than usage tips. Avoid anthropomorphic language when describing LLM behavior (use 'the model generates' not 'the AI decides')." + "content": "Developer documentation only. Mirror the repo structure and module boundaries (packages/, apps/, mewbo_ha_conversation/) with minimal redundancy. Every page must include a meaningful Mermaid diagram that matches the page purpose. Name exact classes, functions, and module paths. Clarify that the API exposes polling; the CLI runs the runtime in-process (no polling); the web console connects via the REST API. Focus on system behavior, abstractions, and integration contracts rather than usage tips. Avoid anthropomorphic language when describing LLM behavior (use 'the model generates' not 'the AI decides')." } ], "pages": [ { "title": "Overview & Repo Map", - "purpose": "Single entry point: repo goals, module boundaries (packages/, apps/, meeseeks_ha_conversation/), and top-level folder ownership. Highlights the shared-host model. New in v0.0.10: plugin system (plugins.py, agent_registry.py in meeseeks_core), Web IDE integration (ide.py/ide_routes.py in meeseeks_api), LSP code intelligence (meeseeks_tools/integration/lsp/), chat platform channel adapters (Nextcloud Talk + Email), and conversation fork/edit/regenerate." + "purpose": "Single entry point: repo goals, module boundaries (packages/, apps/, mewbo_ha_conversation/), and top-level folder ownership. Highlights the shared-host model. New in v0.0.10: plugin system (plugins.py, agent_registry.py in mewbo_core), Web IDE integration (ide.py/ide_routes.py in mewbo_api), LSP code intelligence (mewbo_tools/integration/lsp/), chat platform channel adapters (Nextcloud Talk + Email), and conversation fork/edit/regenerate." }, { - "title": "Core Runtime & Orchestration (meeseeks_core)", + "title": "Core Runtime & Orchestration (mewbo_core)", "purpose": "How the shared core runtime and orchestration engine work: SessionRuntime as the facade, Orchestrator as the session driver, ToolUseLoop as the execution engine. Covers the single-async-loop architecture where the LLM drives all tool calls via native bind_tools.", "parent": "Overview & Repo Map" }, { "title": "Session Runtime, Store & Event Log", "purpose": "SessionRuntime facade, RunRegistry (thread tracking), SessionStore (JSONL transcripts, tags, archives, attachments). Fork-from-message: resolve_session(fork_from=id_or_tag, fork_at_ts=iso_ts) creates a new session with only events up to the given timestamp \u2014 enables edit-and-regenerate from any point in history. Per-session temporary directory as default CWD (assigned at session creation). Polling is API-only; CLI runs in-process.", - "parent": "Core Runtime & Orchestration (meeseeks_core)" + "parent": "Core Runtime & Orchestration (mewbo_core)" }, { "title": "Tool-Use Loop Execution Engine", "purpose": "ToolUseLoop.run() as the single async execution engine: message construction (_build_messages with system prompt, project instructions, context, attachments, tool guidance, skill catalog, depth guidance), LLM invocation via bind_tools, tool dispatch with concurrency-safe partitioning (_partition_tool_calls batches concurrent-safe tools vs exclusive tools), per-tool timeout (asyncio.wait_for with configurable ToolSpec.timeout), non-blocking spawn for root agent (returns immediately with agent_id), check_agents/steer_agent management tools (root-only), user steering (message_queue drain and interrupt_step check), step budget tracking with graduated enforcement (NL warnings, not kill), forced synthesis with pending children at step limit, and cancellation.", - "parent": "Core Runtime & Orchestration (meeseeks_core)" + "parent": "Core Runtime & Orchestration (mewbo_core)" }, { "title": "Agent Hypervisor & Sub-Agent Lifecycle", "purpose": "AgentHypervisor as a dual-layer autonomous system: reflexes (code-level step tracking, stall detection via background _watchdog, budget enforcement via NL warning injection) and brain (root LLM sees global agent tree via render_agent_tree(), uses check_agents and steer_agent tools). 6-state lifecycle (submitted \u2192 running \u2192 completed/failed/cancelled/rejected per A2A v1.0). AgentResult as structured Communication Units (content, status, steps_used, summary, warnings, artifacts). Non-blocking spawn for root (epoll model \u2014 react to notifications, don't poll) vs blocking spawn for sub-agents. Bidirectional messaging (parent\u2192child via send_message/steer_agent, child\u2192parent via _run_child_lifecycle on completion). AgentHandle (per-agent runtime state with progress_note, result, message_queue). 3-phase graceful cleanup (cancel \u2192 wait \u2192 force-mark). SpawnAgentTool with filter_specs() for tool scoping.", - "parent": "Core Runtime & Orchestration (meeseeks_core)" + "parent": "Core Runtime & Orchestration (mewbo_core)" }, { "title": "LLM Abstraction & Model Routing", "purpose": "ChatModel protocol, build_chat_model(), LiteLLM multi-provider gateway, provider-qualified model names, per-role model selection (plan/tool/default), reasoning-effort configuration (reasoning_effort field with model allowlist), proxy_model_prefix (default 'openai' \u2014 prepended to bare model names when llm.api_base is set for proxy routing, configurable to match proxy's expected prefix), and model_prefers_structured_patch() (returns bool for edit tool auto-selection). specs_to_langchain_tools() for converting ToolSpecs to LLM-bindable schemas.", - "parent": "Core Runtime & Orchestration (meeseeks_core)" + "parent": "Core Runtime & Orchestration (mewbo_core)" }, { "title": "Context Builder, Summaries & Compaction", "purpose": "ContextBuilder.build() pipeline: transcript loading, event filtering, recent event selection, attachment reading, token budget tracking, auto-compaction triggers. Token budget now accounts for tool schema + system prompt overhead (~20-25k tokens). context_compacted events emitted at both proactive (pre-limit) and reactive (post-ContextWindowExceededError) compaction \u2014 visible in Console and CLI. Mid-loop reactive compaction prevents crashes. Two-mode compaction: FULL (summarizes everything) and PARTIAL (keeps recent events verbatim). Post-compact file restoration re-injects recently referenced files within token budgets. Micro-compaction (ANSI stripping + truncation) via pre_compact hook. AgentHandle.compaction_count tracked for hypervisor tree visibility.", - "parent": "Core Runtime & Orchestration (meeseeks_core)" + "parent": "Core Runtime & Orchestration (mewbo_core)" }, { "title": "Permissions, Hooks & Tool Execution Gates", "purpose": "PermissionPolicy (allow/deny/ask rules, fnmatch on tool_id and operation), approval callbacks (auto_approve, config-driven, interactive). HookManager with error isolation (all hooks wrapped in try/except \u2014 failing hook logs warning but doesn't block execution). Lifecycle hooks: on_session_start, on_session_end, on_compact. External command hooks via HooksConfig with fnmatch-based tool matcher filtering. Pre/post tool use hooks. Agent lifecycle hooks (on_agent_start, on_agent_stop).", - "parent": "Core Runtime & Orchestration (meeseeks_core)" + "parent": "Core Runtime & Orchestration (mewbo_core)" }, { "title": "Data Models, Event Types & Payload Schemas", "purpose": "ActionStep (tool_id/operation/tool_input), PlanStep, TaskQueue, OrchestrationState, EventRecord, ToolResult (content/success/error/truncated), and typed payload schemas (UserPayload, AssistantPayload, ToolResultPayload with kind discriminator, ActionPlanPayload, CompletionPayload, PermissionPayload, SubAgentPayload with lifecycle state, AgentMessagePayload). Event type discrimination and JSONL serialization. Structured tool results with kind field ('shell', 'diff', 'file', 'dir') for frontend routing.", - "parent": "Core Runtime & Orchestration (meeseeks_core)" + "parent": "Core Runtime & Orchestration (mewbo_core)" }, { "title": "Skills System", "purpose": "SkillRegistry discovers SKILL.md files from ~/.claude/skills/ and .claude/skills/. Plugin skill loading via load_extra_dir(path) (adds skills from plugin directories) and load_command_file(path) (loads skills from plugin commands.json). No-override semantics: installed plugins cannot shadow user-defined skills. Skill catalog injected into system prompt for LLM auto-invocation via activate_skill. User /skill-name invocations detected in Orchestrator. Skills scope tools via allowed-tools (filter_specs()). merge_plugin_hooks() translates Claude Code plugin hooks.json format into HookManager callbacks with ${CLAUDE_PLUGIN_ROOT} substitution.", - "parent": "Core Runtime & Orchestration (meeseeks_core)" + "parent": "Core Runtime & Orchestration (mewbo_core)" }, { - "title": "Tool Layer (meeseeks_tools)", - "purpose": "Tool layer boundaries: local tools (edit, shell, file read/list), MCP tools, LSP code intelligence. AbstractTool base class with get_state/set_state/run dispatch. MockSpeaker result container. Tool results use kind-discriminated dicts (kind: 'shell'|'diff'|'file'|'dir'|'lsp') for structured frontend rendering. LSP tool (lsp_tool in meeseeks_tools/integration/lsp/): graceful absence when pygls/lsprotocol not installed.", + "title": "Tool Layer (mewbo_tools)", + "purpose": "Tool layer boundaries: local tools (edit, shell, file read/list), MCP tools, LSP code intelligence. AbstractTool base class with get_state/set_state/run dispatch. MockSpeaker result container. Tool results use kind-discriminated dicts (kind: 'shell'|'diff'|'file'|'dir'|'lsp') for structured frontend rendering. LSP tool (lsp_tool in mewbo_tools/integration/lsp/): graceful absence when pygls/lsprotocol not installed.", "parent": "Overview & Repo Map" }, { "title": "Tool Registry & Spec System", "purpose": "ToolRegistry, ToolSpec (tool_id, kind, metadata with schema/capabilities/reflect, factory for lazy instantiation), filter_specs() for allowlist/denylist filtering (shared by Orchestrator, SpawnAgentTool, and skills), specs_to_langchain_tools() conversion, and tool disabling with reasons. Conditional tool registration pattern: _edit_tool_spec_and_manifest() reads AgentConfig.edit_tool and returns matching ToolSpec + manifest entry for both _default_registry() and _built_in_manifest_entries() \u2014 single conditional, two consumers. Capabilities metadata (e.g. 'file_write') enables intent-based tool filtering in planning.", - "parent": "Tool Layer (meeseeks_tools)" + "parent": "Tool Layer (mewbo_tools)" }, { "title": "Configurable Edit Tool Mechanism", "purpose": "Two edit tool mechanisms selectable via AgentConfig.edit_tool: 'search_replace_block' (Aider-style) and 'structured_patch' (per-file exact). When edit_tool is empty (default), ToolUseLoop._configured_edit_tool_id() auto-selects via llm.model_prefers_structured_patch(model_name) \u2014 checking the model name string against a known list of structured-patch-preferring models. Explicit config always overrides auto-detection. Shared utilities in edit_common.py. Both tools output {'kind': 'diff'} for DiffCard compatibility. End-to-end consistency: ToolSpec bundles schema + prompt_path + factory.", - "parent": "Tool Layer (meeseeks_tools)" + "parent": "Tool Layer (mewbo_tools)" }, { "title": "Local Tools (File Edit, Shell, Read)", "purpose": "AiderEditBlockTool (SEARCH/REPLACE format with aider_bridge parsing, fuzzy matching, diff generation), FileEditTool (per-file exact string replacement, strict matching, ambiguity rejection), shared edit_common.py utilities (path resolution, before-state reading, unified diff computation via difflib, canonical result formatting). AiderShellTool (command execution with structured {kind: 'shell'} results including exit_code, stdout, stderr, duration_ms). AiderReadFileTool and AiderListDirTool (read-only tools with {kind: 'file'}/{kind: 'dir'} results). All tools use resolve_safe_path() to prevent directory traversal. Approval gating for set operations.", - "parent": "Tool Layer (meeseeks_tools)" + "parent": "Tool Layer (mewbo_tools)" }, { "title": "MCP Tool Discovery & Schema Validation", "purpose": "MCP config (configs/mcp.json global, .mcp.json project-scoped), server discovery with project CWD propagation, schema normalization, per-server failure isolation, _coerce_mcp_tool_input validation, and manifest caching. MCPConnectionPool (persistent MCP connections with memoization, automatic reconnection after 3 consecutive errors, per-request 60s timeout, config change detection). MCPToolRunner uses pool as primary path with legacy one-shot client as fallback.", - "parent": "Tool Layer (meeseeks_tools)" + "parent": "Tool Layer (mewbo_tools)" }, { - "title": "REST API (meeseeks_api)", + "title": "REST API (mewbo_api)", "purpose": "Flask-restx API: route structure, authentication (X-API-Key from docker.env MASTER_API_TOKEN), CORS, how handlers bind to SessionRuntime, NotificationStore, ShareStore, and the tool registry. Config API endpoints for reading/patching app.json at runtime.", "parent": "Overview & Repo Map" }, { "title": "API Endpoints, Polling & Steering", "purpose": "Session CRUD, async query execution (start_async + 202), event polling (/events?after=), SSE streaming (/stream), user steering (/message, /interrupt), agent tree (/agents), attachments, share tokens, export, notifications, config API (GET/PATCH /config), legacy sync /query. Plugin management: GET /api/plugins, GET/POST /api/plugins/marketplace, DELETE /api/plugins/. Web IDE lifecycle: POST/DELETE /api/sessions/{id}/ide, POST /api/sessions/{id}/ide/extend. Git diff: GET /api/sessions/{id}/git-diff?scope=uncommitted|branch. Session fork: POST /api/sessions/{id}/fork with from_ts, model, compact, tag params. Includes allowed_tools passthrough from context.mcp_tools through SessionRuntime \u2192 Orchestrator \u2192 ToolUseLoop.", - "parent": "REST API (meeseeks_api)" + "parent": "REST API (mewbo_api)" }, { - "title": "Web Console (meeseeks_console)", + "title": "Web Console (mewbo_console)", "purpose": "React 18 + Vite + Tailwind CSS frontend. Session management with polling (1s interval). Conversation timeline with turn grouping. ReviewPane accordion: scope selector (last-turn / uncommitted / branch) backed by GET /api/sessions/{id}/git-diff, replaces old single-file DiffView. ForkFromHereButton and inline edit on user messages for edit-and-regenerate with model override. PluginsView: marketplace browser + install/uninstall. IdeLoader: per-session code-server container launch with floral background animation.