From 5d8c01d171bd9b0771f5723bdf4fde3ea3c4d955 Mon Sep 17 00:00:00 2001 From: Luhaozhu Date: Fri, 23 Oct 2026 20:48:42 -0700 Subject: [PATCH] Sync CE runtime and canvas preview improvements --- .../references/api-envelope.md | 6 +- .../references/architecture.md | 265 +- .../references/error-codes.md | 2 + .../scripts/scaffold_feature.sh | 145 +- .../templates/extension.py | 38 + .../hugagent-backend-dev/templates/model.py | 78 +- .../templates/repository.py | 70 +- .../hugagent-backend-dev/templates/route.py | 156 +- .../hugagent-backend-dev/templates/service.py | 138 +- .../hugagent-backend-dev/templates/test.py | 171 +- .../assets/design-v2/icons-ui/attachment.svg | 3 + .../assets/design-v2/icons-ui/automation.svg | 3 + .../assets/design-v2/icons-ui/check.svg | 3 + .../design-v2/icons-ui/chevron-right.svg | 3 + .../assets/design-v2/icons-ui/close.svg | 3 + .../assets/design-v2/icons-ui/knowledge.svg | 3 + .../assets/design-v2/icons-ui/my-space.svg | 3 + .../assets/design-v2/icons-ui/new-chat.svg | 3 + .../assets/design-v2/icons-ui/search.svg | 3 + .../assets/design-v2/icons-ui/send.svg | 3 + .../assets/design-v2/icons-ui/settings.svg | 3 + .../assets/design-v2/icons-ui/skill.svg | 3 + .../assets/design-v2/logo/favicon.svg | 5 + .../design-v2/logo/hugagentos-glyph-black.svg | 4 + .../design-v2/logo/hugagentos-glyph-blue.svg | 5 + .../design-v2/logo/hugagentos-glyph-white.svg | 4 + .../logo/hugagentos-mark-mono-black.svg | 5 + .../logo/hugagentos-mark-mono-white.svg | 5 + .../logo/hugagentos-mark-reverse.svg | 6 + .../design-v2/logo/hugagentos-mark-small.svg | 5 + .../assets/design-v2/logo/hugagentos-mark.svg | 6 + .../assets/design-v2/tokens/appTheme.v2.ts | 39 + .../design-v2/tokens/hugagentos-tokens.v2.css | 123 + .../tokens/hugagentos-tokens.v2.json | 223 + .../design-v2/tokens/motionTokens.v2.ts | 32 + .../references/css-variables.md | 277 +- .../references/icon-assets.md | 46 +- .../references/sse-events.md | 294 +- .../references/ui-design-spec.md | 667 ++- .../scripts/scaffold_component.sh | 5 +- .../templates/component.tsx | 115 +- .../templates/css-module.css | 114 +- .../hugagent-frontend-dev/templates/hook.ts | 98 +- .../hugagent-frontend-dev/templates/store.ts | 121 +- .env.example | 6 +- .gitignore | 10 +- Makefile | 6 +- README.md | 363 +- README_CN.md | 290 +- ...uirements-desktop-linux-aarch64-py311.lock | 50 +- ...quirements-desktop-linux-x86_64-py311.lock | 58 +- ...uirements-desktop-macos-aarch64-py311.lock | 58 +- ...quirements-desktop-macos-x86_64-py311.lock | 58 +- .../requirements-desktop-windows-py311.lock | 60 +- desktop/requirements-desktop.txt | 11 +- desktop/scripts/build-runtime.mjs | 3 + desktop/scripts/desktop-dependencies.test.mjs | 33 +- desktop/scripts/test-native-tools.py | 2 +- docker-compose.yml | 17 +- ...Dockerfile.opensandbox-server.dockerignore | 16 - docker/Dockerfile.personal-agent-test | 6 - .../compose.application-hosting.yml | 4 +- .../Dockerfile.object-storage | 0 .../compose.object-storage.yml | 4 +- .../init-object-storage.py | 0 .../Dockerfile.opensandbox-server | 11 +- ...Dockerfile.opensandbox-server.dockerignore | 18 + .../opensandbox-config.toml.tpl | 0 .../opensandbox_capacity.py | 31 + .../opensandbox_expirations.py | 0 .../opensandbox_mount_recovery.py | 22 +- .../opensandbox_mount_worker.py | 0 .../opensandbox_object_mounts.py | 0 .../patch_opensandbox_server.py | 11 + .../render-opensandbox-config.py | 0 .../Dockerfile.personal-agent | 8 +- .../compose.personal-agent.yml | 4 +- .../desktop}/helpers.rc | 0 .../desktop}/mimeapps.list | 0 .../desktop}/pa-browser | 0 .../desktop}/pa-browser-helper.desktop | 0 .../desktop}/pa-browser.desktop | 0 .../desktop}/pa-stream.py | 0 .../hugagent-cli-entrypoint.sh | 0 .../personal-agent-entrypoint.sh | 4 +- .../render-personal-agent-config.py | 0 docker/{ => sandbox}/Dockerfile.opensandbox | 27 +- docker/{ => sandbox}/Dockerfile.script-runner | 8 +- docker/{ => sandbox}/apt-skills.txt | 0 docker/{ => sandbox}/package-skills.json | 0 .../requirements-script-runner.txt | 0 docker/{ => sandbox}/requirements-skills.txt | 0 docker/sandbox/sandbox-init.c | 78 + .../site-template/init-react-site.sh | 0 .../site-template/react-vite/.npmrc | 0 .../site-template/react-vite/index.html | 0 .../react-vite/package-lock.json | 0 .../site-template/react-vite/package.json | 0 .../site-template/react-vite/src/App.jsx | 0 .../site-template/react-vite/src/index.css | 0 .../react-vite/src/lib/siteApi.js | 0 .../site-template/react-vite/src/main.jsx | 0 .../react-vite/src/pages/Home.jsx | 0 .../site-template/react-vite/vite.config.mjs | 0 .../{ => sandbox}/verify-browser-runtime.py | 0 document/README.md | 173 +- document/en/README.md | 129 +- document/en/api/overview.md | 8 +- document/en/architecture/backend.md | 18 +- document/en/architecture/data-model.md | 6 +- document/en/architecture/overview.md | 111 +- document/en/deployment/README.md | 4 - .../deployment/artifact-storage-key-repair.md | 55 - document/en/deployment/desktop-local-mode.md | 2 +- document/en/deployment/docker-compose.md | 16 +- .../en/deployment/environment-variables.md | 20 +- document/en/deployment/offline-production.md | 84 - document/en/deployment/quick-install.md | 6 +- document/en/deployment/space-files.md | 18 +- document/en/deployment/uos1070-desktop.md | 101 - document/en/development/backend.md | 16 +- document/en/development/container-layout.md | 28 - document/en/development/frontend.md | 9 + .../en/development/workbench-migration.md | 29 +- document/en/development/workbench-routing.md | 2 +- document/en/editions/build-ce.md | 12 +- document/en/getting-started/introduction.md | 170 +- document/en/getting-started/quick-start.md | 119 +- document/en/modules/admin-console.md | 16 +- document/en/modules/agent-skills.md | 38 +- document/en/modules/application-hosting.md | 32 +- document/en/modules/auth.md | 8 +- document/en/modules/automation.md | 50 +- document/en/modules/autonomous-loop.md | 6 +- document/en/modules/browser-automation.md | 2 +- document/en/modules/canvas-artifacts.md | 14 +- document/en/modules/catalog.md | 21 +- document/en/modules/chat.md | 58 +- document/en/modules/knowledge-base-wiki.md | 14 +- document/en/modules/knowledge-base.md | 44 +- document/en/modules/mcp-tools.md | 45 +- document/en/modules/memory.md | 8 +- document/en/modules/model-providers.md | 28 +- document/en/modules/personal-agent.md | 10 +- document/en/modules/projects-myspace.md | 31 +- document/en/modules/prompts.md | 31 +- document/en/modules/sandbox.md | 58 +- document/en/modules/sites.md | 14 +- document/en/modules/storage.md | 4 +- document/en/modules/workflow-jobs.md | 8 - document/zh-CN/README.md | 132 +- document/zh-CN/api/overview.md | 8 +- document/zh-CN/architecture/backend.md | 18 +- document/zh-CN/architecture/data-model.md | 6 +- document/zh-CN/architecture/overview.md | 99 +- document/zh-CN/deployment/README.md | 4 - .../deployment/artifact-storage-key-repair.md | 48 - .../zh-CN/deployment/desktop-local-mode.md | 3 +- document/zh-CN/deployment/docker-compose.md | 20 +- .../zh-CN/deployment/environment-variables.md | 20 +- .../zh-CN/deployment/offline-production.md | 84 - document/zh-CN/deployment/quick-install.md | 6 +- document/zh-CN/deployment/space-files.md | 28 +- document/zh-CN/deployment/uos1070-desktop.md | 87 - document/zh-CN/development/backend.md | 16 +- .../zh-CN/development/container-layout.md | 24 - document/zh-CN/development/frontend.md | 7 + .../zh-CN/development/workbench-migration.md | 29 +- .../zh-CN/development/workbench-routing.md | 2 +- document/zh-CN/editions/build-ce.md | 12 +- .../zh-CN/getting-started/introduction.md | 159 +- document/zh-CN/getting-started/quick-start.md | 108 +- document/zh-CN/modules/admin-console.md | 16 +- document/zh-CN/modules/agent-skills.md | 38 +- document/zh-CN/modules/application-hosting.md | 32 +- document/zh-CN/modules/auth.md | 8 +- document/zh-CN/modules/automation.md | 46 +- document/zh-CN/modules/autonomous-loop.md | 6 +- document/zh-CN/modules/browser-automation.md | 2 +- document/zh-CN/modules/canvas-artifacts.md | 14 +- document/zh-CN/modules/catalog.md | 21 +- document/zh-CN/modules/chat.md | 58 +- document/zh-CN/modules/knowledge-base-wiki.md | 14 +- document/zh-CN/modules/knowledge-base.md | 44 +- document/zh-CN/modules/mcp-tools.md | 45 +- document/zh-CN/modules/memory.md | 8 +- document/zh-CN/modules/model-providers.md | 28 +- document/zh-CN/modules/personal-agent.md | 10 +- document/zh-CN/modules/projects-myspace.md | 29 +- document/zh-CN/modules/prompts.md | 31 +- document/zh-CN/modules/sandbox.md | 49 +- document/zh-CN/modules/sites.md | 14 +- document/zh-CN/modules/storage.md | 4 +- document/zh-CN/modules/workflow-jobs.md | 8 - examples/customer-chat/.env.example | 6 - examples/customer-chat/.gitignore | 8 - examples/customer-chat/README.md | 37 - examples/customer-chat/debug.html | 1 - examples/customer-chat/index.html | 9 - examples/customer-chat/package-lock.json | 1224 ----- examples/customer-chat/package.json | 41 - examples/customer-chat/preview.html | 1 - .../customer-chat/scripts/build-component.mjs | 14 - .../customer-chat/scripts/developer-proxy.mjs | 43 - .../customer-chat/scripts/test-package.mjs | 30 - examples/customer-chat/scripts/test-proxy.mjs | 26 - examples/customer-chat/session.html | 1 - examples/customer-chat/src/controls.ts | 76 - examples/customer-chat/src/css.d.ts | 1 - examples/customer-chat/src/customization.tsx | 29 - examples/customer-chat/src/debug.ts | 32 - examples/customer-chat/src/developer.css | 3 - examples/customer-chat/src/login.ts | 11 - examples/customer-chat/src/preview.tsx | 5 - examples/customer-chat/src/session.ts | 20 - examples/customer-chat/src/standalone.css | 6 - examples/customer-chat/src/standalone.ts | 142 - examples/customer-chat/src/theme.css | 19 - examples/customer-chat/tsconfig.json | 25 - examples/customer-chat/vite.config.mjs | 30 - install.sh | 2 +- packages/cli/DESIGN.md | 164 + pyproject.toml | 14 +- requirements.txt | 17 +- scripts/performance/benchmark_preview.py | 2 +- scripts/performance/serve_fixture.py | 6 +- scripts/refactor/__init__.py | 1 + scripts/refactor/check_ce_paths.py | 79 + scripts/refactor/check_line_budget.py | 37 + scripts/refactor/check_test_baseline.py | 75 + scripts/refactor/import_contract.py | 209 + scripts/refactor/rewrite_imports.py | 357 ++ scripts/refactor/snapshot_routes.py | 35 + scripts/refactor/snapshot_schema.py | 81 + scripts/refactor/tests/test_edition_seams.py | 33 + scripts/refactor/tests/test_guards.py | 127 + .../refactor/tests/test_package_markers.py | 20 + .../refactor/tests/test_private_imports.py | 41 + .../refactor/tests/test_rewrite_imports.py | 142 + .../refactor/tests/test_snapshot_schema.py | 33 + .../refactor/tests/test_supplemental_moves.py | 47 + scripts/refactor/tests/test_test_baseline.py | 22 + scripts/refactor/tests/test_test_moves.py | 45 + scripts/repair_artifact_storage_keys.py | 4 +- scripts/sync-workbench-schema.mjs | 4 +- scripts/test-workbench-build.mjs | 2 +- src/backend/alembic/env.py | 4 + .../alembic/versions/ce_0001_initial.py | 2 +- .../versions/ce_0002_reconcile_schema.py | 2 +- .../versions/ce_0003_mcp_marketplace.py | 2 +- .../versions/ce_0009_desktop_delivery.py | 2 +- .../versions/ce_0010_desktop_channel_relay.py | 2 +- .../alembic/versions/ce_0012_model_steps.py | 3 +- .../alembic/versions/ce_0013_tool_media.py | 2 +- .../versions/ce_0014_site_access_password.py | 2 +- .../versions/ce_0019_history_display.py | 2 +- .../versions/ce_0020_plugin_resources.py | 2 +- .../versions/ce_0021_retire_site_storage.py | 2 +- .../versions/ce_0028_personal_agent.py | 4 +- .../ce_0031_automation_lease_token.py | 19 + .../versions/ce_0032_automation_queue.py | 25 + .../versions/ce_0033_automation_targets.py | 17 + src/backend/api/__init__.py | 19 +- src/backend/api/app.py | 28 +- src/backend/api/deps.py | 201 +- src/backend/api/edition.py | 13 + src/backend/api/health.py | 11 +- src/backend/api/lifecycle.py | 18 +- src/backend/api/middleware/agent_api_scope.py | 11 +- src/backend/api/middleware/logging.py | 2 +- src/backend/api/openapi.py | 2 +- .../v1/agents.py => personal_agents.py} | 28 +- src/backend/api/routes/__init__.py | 15 +- src/backend/api/routes/file_archive.py | 26 +- src/backend/api/routes/file_location.py | 2 +- src/backend/api/routes/files.py | 56 +- src/backend/api/routes/v1/__init__.py | 53 +- src/backend/api/routes/v1/agent_api_keys.py | 30 +- src/backend/api/routes/v1/agent_responses.py | 54 +- src/backend/api/routes/v1/api_keys.py | 12 +- src/backend/api/routes/v1/artifacts.py | 108 +- src/backend/api/routes/v1/audio.py | 15 +- src/backend/api/routes/v1/auth.py | 58 +- src/backend/api/routes/v1/catalog.py | 37 +- .../api/routes/v1/catalog_mutations.py | 12 +- src/backend/api/routes/v1/chat_forks.py | 2 +- src/backend/api/routes/v1/chat_modes.py | 2 +- src/backend/api/routes/v1/chat_runs.py | 17 +- src/backend/api/routes/v1/chats/confirms.py | 27 +- src/backend/api/routes/v1/chats/feedback.py | 14 +- src/backend/api/routes/v1/chats/history.py | 16 +- .../api/routes/v1/chats/pending_access.py | 8 +- src/backend/api/routes/v1/chats/questions.py | 28 +- src/backend/api/routes/v1/chats/reruns.py | 111 +- src/backend/api/routes/v1/chats/run_views.py | 40 +- src/backend/api/routes/v1/chats/sessions.py | 20 +- src/backend/api/routes/v1/chats/sidebar.py | 12 +- src/backend/api/routes/v1/classify.py | 2 +- src/backend/api/routes/v1/commands.py | 11 +- src/backend/api/routes/v1/content.py | 11 +- .../api/routes/v1/desktop_capability.py | 824 --- src/backend/api/routes/v1/evolution.py | 29 +- src/backend/api/routes/v1/file_parse.py | 3 +- src/backend/api/routes/v1/file_text.py | 2 +- src/backend/api/routes/v1/file_upload.py | 22 +- src/backend/api/routes/v1/internal_jobs.py | 15 +- .../api/routes/v1/job_callback_session.py | 2 +- src/backend/api/routes/v1/jobs.py | 4 +- src/backend/api/routes/v1/kb.py | 873 ---- src/backend/api/routes/v1/loops.py | 81 +- src/backend/api/routes/v1/me_capabilities.py | 70 +- src/backend/api/routes/v1/me_skill_files.py | 44 +- src/backend/api/routes/v1/me_system.py | 12 +- src/backend/api/routes/v1/memories.py | 81 +- src/backend/api/routes/v1/mock_sso.py | 31 +- src/backend/api/routes/v1/model_reasoning.py | 10 +- src/backend/api/routes/v1/models.py | 176 +- src/backend/api/routes/v1/myspace_folders.py | 4 +- src/backend/api/routes/v1/ontologies.py | 20 +- src/backend/api/routes/v1/plans.py | 199 +- src/backend/api/routes/v1/plugin_resources.py | 98 +- src/backend/api/routes/v1/plugins.py | 47 +- src/backend/api/routes/v1/project_api_keys.py | 30 +- .../api/routes/v1/project_environments.py | 8 +- src/backend/api/routes/v1/projects.py | 36 +- .../api/routes/v1/prompt_management.py | 95 +- src/backend/api/routes/v1/public_chats.py | 23 +- src/backend/api/routes/v1/space_files.py | 22 +- src/backend/api/routes/v1/space_previews.py | 11 +- src/backend/api/routes/v1/summary.py | 2 +- src/backend/api/routes/v1/tool_approval.py | 10 +- src/backend/api/routes/v1/users.py | 16 +- src/backend/api/startup/bootstrap.py | 72 +- src/backend/api/startup/commands.py | 8 +- src/backend/api/startup/memory.py | 10 +- src/backend/api/startup/plugins.py | 45 +- src/backend/api/startup/runtime.py | 87 +- src/backend/api/startup/workers.py | 63 +- .../content => api/transports}/__init__.py | 0 src/backend/api/transports/run_sse.py | 85 + src/backend/cli.py | 118 +- src/backend/core/agent_runtime/README.md | 18 + .../core/agent_runtime/README.zh-CN.md | 18 + .../resources => agent_runtime}/__init__.py | 0 src/backend/core/agent_runtime/budget.py | 74 + src/backend/core/agent_runtime/direct.py | 458 ++ .../core/agent_runtime/direct_state.py | 46 + src/backend/core/agent_runtime/events.py | 71 + src/backend/core/agent_runtime/host.py | 11 + .../agent_runtime/integrations}/__init__.py | 0 .../integrations}/compaction_stream.py | 8 +- .../agent_runtime/integrations/evolution.py | 160 + .../core/agent_runtime/integrations/memory.py | 304 ++ .../integrations/memory_budget.py | 34 + .../integrations/memory_identity.py | 74 + .../integrations/memory_session.py | 178 + .../integrations/memory_state.py | 23 + .../integrations/ontology_evidence.py | 229 + .../integrations/ontology_repair.py | 366 ++ src/backend/core/agent_runtime/main_state.py | 45 + .../agent_runtime}/plugin_visibility.py | 14 +- .../core/agent_runtime/prepare_direct.py | 126 + .../core/agent_runtime/prepare_main.py | 289 + src/backend/core/agent_runtime/runner.py | 444 ++ src/backend/core/agent_runtime/skills.py | 176 + .../agent_runtime}/strategy.py | 0 .../core/agent_runtime/stream_direct.py | 298 ++ src/backend/core/agent_runtime/stream_main.py | 354 ++ src/backend/core/agent_runtime/targets.py | 208 + .../core/agent_skills/backends/__init__.py | 14 - .../core/agent_skills/cache_refresh.py | 51 - src/backend/core/auth/__init__.py | 2 +- .../agent_api.py} | 2 +- src/backend/core/auth/agent_api_scope.py | 2 +- .../core/{services => auth}/api_key_runs.py | 33 +- .../api_key_service.py => auth/api_keys.py} | 12 +- src/backend/core/auth/backend.py | 275 +- src/backend/core/auth/bearer.py | 149 + src/backend/core/auth/capabilities.py | 4 +- src/backend/core/auth/edition.py | 5 + src/backend/core/auth/local_user_bootstrap.py | 83 + src/backend/core/auth/local_user_policy.py | 16 + .../local_users.py} | 155 +- .../core/auth/local_users_constants.py | 40 + src/backend/core/auth/mock_ticket_store.py | 26 +- src/backend/core/auth/model_selection.py | 52 + src/backend/core/auth/oa_ticket_store.py | 23 +- ...t_policy.py => personal_account_policy.py} | 0 ...count_view.py => personal_account_view.py} | 0 ...es.py => personal_edition_capabilities.py} | 0 ...iface.py => personal_permissions_iface.py} | 2 +- src/backend/core/auth/project_api_scope.py | 2 +- src/backend/core/auth/public_chat.py | 6 +- src/backend/core/auth/public_identity.py | 36 + src/backend/core/auth/session.py | 36 +- .../user_service.py => auth/users.py} | 11 +- src/backend/core/capabilities/__init__.py | 17 +- .../core/capabilities/agents/__init__.py | 1 + .../agents/available_resources.py | 273 + src/backend/core/capabilities/agents/base.py | 435 ++ .../capabilities/agents/base_constants.py | 33 + .../agents/builtin.py} | 4 +- .../agents/edition.py} | 2 +- .../agents/markdown.py} | 0 .../capabilities/agents/version_history.py | 180 + src/backend/core/capabilities/archive.py | 18 +- .../core/capabilities/catalog/__init__.py | 1 + .../catalog/api.py} | 14 +- .../catalog/common.py} | 4 +- .../catalog/details.py} | 20 +- .../catalog/loader.py} | 57 +- .../catalog/migration.py} | 4 +- .../catalog/overrides.py} | 0 .../catalog/resolver.py} | 78 +- .../catalog/runtime.py} | 53 +- .../core/capabilities/identity_rules.py | 36 + .../manifest_protocol.py} | 3 +- src/backend/core/capabilities/mcp/__init__.py | 1 + .../mcp/builtin_specs.py} | 4 - .../mcp/edition.py} | 0 .../mcp/management.py} | 64 +- src/backend/core/capabilities/mcp/oauth.py | 385 ++ .../core/capabilities/mcp/oauth_storage.py | 124 + .../mcp/service.py} | 60 +- .../core/capabilities/mcp/tool_metadata.py | 13 + .../core/capabilities/mcp/tool_schema.py | 20 + .../capabilities/mcp/tool_schema_backfill.py | 120 + .../core/capabilities/plugins/README.md | 23 + .../{ => capabilities}/plugins/__init__.py | 0 .../{ => capabilities}/plugins/connections.py | 2 +- .../plugins/management/__init__.py | 43 + .../plugins/management/admin_config.py | 18 +- .../plugins/management/bundle_upgrade.py} | 8 +- .../plugins/management/cloud.py} | 52 +- .../plugins/management/components.py | 32 +- .../plugins/management/contract.py} | 0 .../plugins/management/defaults.py | 2 +- .../plugins/management/details.py | 76 +- .../plugins/management/errors.py} | 0 .../plugins/management/installation.py | 72 +- .../plugins/management/lifecycle.py | 42 +- .../plugins/management/package.py} | 10 +- .../plugins/management/packages.py | 33 +- .../plugins/management/projection.py | 28 +- .../plugins/management/queries.py | 50 +- .../plugins/packaging/__init__.py | 0 .../plugins/packaging/archive.py | 4 +- .../plugins/packaging/definitions.py | 4 +- .../plugins/packaging/importer.py | 24 +- .../plugins/packaging/models.py | 0 .../plugins/packaging/presentation.py | 31 + .../plugins/packaging/runtime_assets.py | 0 .../plugins/packaging/skill_transform.py | 2 +- .../plugins/packaging/sources.py | 31 +- .../plugins/resources/__init__.py | 1 + .../plugins/resources/artifacts.py | 4 +- .../plugins/resources/authentication.py | 4 +- .../plugins/resources/configuration.py | 0 .../plugins/resources/confinement.py | 7 +- .../plugins/resources/crypto.py | 0 .../plugins/resources/deadlines.py | 53 + .../plugins/resources/installation.py | 41 +- .../plugins/resources/lifecycle.py | 64 +- .../capabilities/plugins/resources/owners.py | 66 + .../capabilities/plugins/resources/prewarm.py | 177 + .../plugins/resources/reservation.py | 84 + .../capabilities/plugins/resources/service.py | 460 ++ .../plugins/resources/store.py | 2 +- .../plugins/resources/stream.py | 58 +- .../plugins/resources/transport.py | 0 .../plugins/runtime/__init__.py | 28 +- .../plugins/runtime/activation_history.py | 2 +- .../plugins/runtime/models.py | 0 .../plugins/runtime/resolution.py | 27 +- .../plugins/runtime/sticky_selection.py | 35 +- .../capabilities/{ref.py => reference.py} | 2 +- .../core/capabilities/runtime/__init__.py | 37 - src/backend/core/capabilities/skills.py | 656 --- .../skills}/__init__.py | 1 - .../capabilities/skills/backends/__init__.py | 14 + .../skills}/backends/composite.py | 6 +- .../skills}/backends/database.py | 2 +- .../skills}/backends/filesystem.py | 2 +- .../skills}/backends/protocol.py | 0 .../skills}/binary_files.py | 0 .../core/capabilities/skills/cache_refresh.py | 50 + .../skills}/config.py | 56 +- .../core/capabilities/skills/deps/__init__.py | 1 + .../skills/deps/aggregator.py} | 20 +- .../skills/deps/detector.py} | 0 .../skills/deps/prober.py} | 4 +- .../skills/deps/requests.py} | 108 +- .../skills/icons.py} | 0 .../core/capabilities/skills/installation.py | 117 + .../skills}/loader.py | 165 +- .../capabilities/skills/loader_factory.py | 21 + .../skills/management.py} | 18 +- .../skills}/publication.py | 41 +- .../skills}/registry.py | 12 +- .../capabilities/skills/runtime_loader.py | 115 + .../capabilities/skills/script_discovery.py | 65 + .../skills}/selection_record.py | 4 +- .../skills}/skill_archive.py | 8 +- .../core/capabilities/skills/zip_reader.py | 124 + .../core/channels/adapters/dingtalk.py | 854 --- src/backend/core/channels/adapters/lark.py | 683 --- src/backend/core/channels/inbound.py | 1005 ---- .../{services => chat}/audio_transcription.py | 2 +- src/backend/core/chat/compaction/__init__.py | 1 + .../compaction/budget_checkpoint.py} | 4 +- .../compaction/coordinator.py} | 24 +- .../compaction/history.py} | 8 +- .../compaction/progress.py} | 0 .../compaction/service.py} | 20 +- .../compaction/summary.py} | 19 +- .../compaction/usage_projection.py} | 4 +- .../core/chat/compaction_checkpoints.py | 259 + src/backend/core/chat/compaction_snapshots.py | 265 + src/backend/core/chat/compaction_types.py | 36 + src/backend/core/chat/context.py | 94 +- .../chat_edition.py => chat/edition.py} | 0 .../{orchestration => core/chat}/followups.py | 57 +- .../chat_fork_service.py => chat/fork.py} | 2 +- src/backend/core/chat/history_operations.py | 49 + src/backend/core/chat/limits.py | 88 + .../chat}/message_parser.py | 5 +- src/backend/core/chat/message_queries.py | 91 + src/backend/core/chat/message_writes.py | 299 ++ src/backend/core/chat/mode_seed.py | 51 + src/backend/core/chat/mode_types.py | 48 + src/backend/core/chat/mode_validation.py | 107 + .../chat_mode_service.py => chat/modes.py} | 295 +- .../operations}/__init__.py | 0 src/backend/core/chat/operations/admission.py | 317 ++ .../operations}/admission_errors.py | 2 +- .../operations}/agent_targets.py | 16 +- .../operations}/commands.py | 18 +- .../operations}/history.py | 10 +- .../operations}/invocation.py | 31 +- .../operations}/projects.py | 6 +- .../operations}/request_context.py | 25 +- .../operations}/runs.py | 14 +- .../operations}/schemas.py | 0 .../operations}/session_context.py | 58 +- .../operations}/sessions.py | 40 +- .../plan_service.py => chat/plans.py} | 0 .../core/{services => chat}/project_init.py | 8 +- src/backend/core/chat/projection/__init__.py | 0 src/backend/core/chat/projection/codec.py | 8 + .../chat/projection/reducer.py} | 134 +- .../chat/projection/storage.py} | 8 +- .../chat/projection/subscription.py} | 32 +- .../public_chat_service.py => chat/public.py} | 43 +- .../references.py} | 6 +- src/backend/core/chat/runtime/__init__.py | 0 src/backend/core/chat/runtime/admission.py | 98 + src/backend/core/chat/runtime/chunks.py | 183 + .../chat/runtime/compaction.py} | 23 +- src/backend/core/chat/runtime/completion.py | 231 + src/backend/core/chat/runtime/followups.py | 64 + src/backend/core/chat/runtime/handoff.py | 272 + .../chat/runtime}/job_wakeup.py | 224 +- src/backend/core/chat/runtime/pauses.py | 58 + src/backend/core/chat/runtime/recovery.py | 179 + .../core/chat/runtime/recovery_snapshot.py | 204 + src/backend/core/chat/runtime/snapshots.py | 201 + src/backend/core/chat/runtime/steering.py | 199 + src/backend/core/chat/runtime/turn_state.py | 44 + src/backend/core/chat/runtime/worker.py | 405 ++ src/backend/core/chat/schemas.py | 31 +- .../chat_sequencer.py => chat/sequencer.py} | 41 +- src/backend/core/chat/service.py | 256 + src/backend/core/chat/session_operations.py | 284 + .../core/{services => chat}/sidebar_status.py | 0 .../chat_steer_service.py => chat/steer.py} | 7 +- src/backend/core/chat/steer_hook.py | 70 + .../core/{services => chat}/steer_queue.py | 0 .../subagent_routing.py} | 0 .../chat_titles.py => chat/titles.py} | 21 +- src/backend/core/chat/tool_log.py | 2 +- .../chat}/tool_payloads.py | 45 +- src/backend/core/config/__init__.py | 11 +- src/backend/core/config/display_names.py | 2 +- .../{edition_display_names.py => edition.py} | 8 + src/backend/core/config/environment.py | 3 - src/backend/core/config/identity_settings.py | 11 +- src/backend/core/config/mcp_config.py | 8 +- src/backend/core/config/product_settings.py | 5 +- src/backend/core/config/runtime_env.py | 49 +- src/backend/core/config/runtime_settings.py | 33 +- src/backend/core/config/sandbox_settings.py | 11 +- src/backend/core/config/settings.py | 7 +- src/backend/core/config/store/__init__.py | 1 + src/backend/core/config/store/config_keys.py | 12 + .../core/config/store/execution_options.py | 93 + src/backend/core/config/store/runtime_env.py | 52 + .../core/config/store/system_config.py | 120 + .../config/store/system_config_constants.py | 302 ++ src/backend/core/config/user_intros.py | 2 +- src/backend/core/content/content_blocks.py | 701 --- src/backend/core/content/file_parser.py | 752 --- src/backend/core/db/__init__.py | 28 +- src/backend/core/db/artifact_scope.py | 13 + src/backend/core/db/chat_search.py | 2 +- src/backend/core/db/edition.py | 27 + src/backend/core/db/engine.py | 45 +- src/backend/core/db/history_projection.py | 2 +- src/backend/core/db/models/__init__.py | 212 +- src/backend/core/db/models/admin.py | 338 +- src/backend/core/db/models/agent.py | 73 +- src/backend/core/db/models/artifact.py | 17 +- src/backend/core/db/models/channel_relay.py | 40 - src/backend/core/db/models/chat.py | 350 +- src/backend/core/db/models/chat_mode.py | 5 +- src/backend/core/db/models/chat_resources.py | 116 + src/backend/core/db/models/chat_runs.py | 199 + src/backend/core/db/models/column_types.py | 9 + src/backend/core/db/models/config.py | 12 +- src/backend/core/db/models/evolution.py | 10 +- src/backend/core/db/models/identity.py | 285 +- src/backend/core/db/models/job.py | 14 +- src/backend/core/db/models/kb_wiki.py | 224 - src/backend/core/db/models/knowledge.py | 182 +- src/backend/core/db/models/logs.py | 13 +- src/backend/core/db/models/memory.py | 15 +- src/backend/core/db/models/observability.py | 61 - src/backend/core/db/models/ontology.py | 6 +- src/backend/core/db/models/project.py | 14 +- src/backend/core/db/personal_file_names.py | 13 +- ...extensions.py => personal_model_fields.py} | 0 .../{edition_tables.py => personal_schema.py} | 6 +- src/backend/core/db/repository/__init__.py | 39 +- src/backend/core/db/repository/artifact.py | 8 +- src/backend/core/db/repository/catalog.py | 5 +- src/backend/core/db/repository/chat.py | 15 +- src/backend/core/db/repository/folder.py | 40 + .../{agent.py => personal_agent.py} | 0 .../{audit.py => personal_audit.py} | 2 +- src/backend/core/db/repository/user.py | 115 +- .../core/db/site_storage_retirement.py | 8 +- src/backend/core/db/system_configuration.py | 146 + src/backend/core/db/threads.py | 99 + src/backend/core/db/user_cleanup.py | 13 + src/backend/core/evolution/__init__.py | 6 +- src/backend/core/evolution/activation.py | 1502 ------ src/backend/core/evolution/agent_profile.py | 505 -- .../core/evolution/assessment/__init__.py | 1 + .../{ => assessment}/applicability.py | 2 +- .../evolution/{ => assessment}/benchmark.py | 6 +- .../evolution/{ => assessment}/evaluator.py | 0 .../evolution/{ => assessment}/experiments.py | 2 +- .../{ => assessment}/fault_injection.py | 15 +- .../evolution/{ => assessment}/metrics.py | 0 .../evolution/{ => assessment}/similarity.py | 9 +- .../evolution/{ => assessment}/sop_judge.py | 2 +- src/backend/core/evolution/backfill.py | 9 +- src/backend/core/evolution/contract.py | 4 +- src/backend/core/evolution/cycle/__init__.py | 1 + .../core/evolution/cycle/activation.py | 353 ++ .../evolution/cycle/activation_constants.py | 11 + .../core/evolution/cycle/activation_policy.py | 196 + .../core/evolution/cycle/activation_types.py | 9 + .../core/evolution/cycle/candidate_records.py | 197 + .../evolution/cycle/composition_candidates.py | 221 + .../core/evolution/cycle/cycle_extras.py | 32 + .../evolution/cycle/cycle_extras_constants.py | 20 + .../core/evolution/cycle/episode_views.py | 178 + .../core/evolution/cycle/evaluation.py | 153 + .../core/evolution/cycle/extra_findings.py | 166 + .../core/evolution/cycle/graph_candidates.py | 156 + src/backend/core/evolution/cycle/loop.py | 292 ++ .../core/evolution/cycle/memory_candidates.py | 286 + .../core/evolution/cycle/memory_findings.py | 109 + src/backend/core/evolution/cycle/ordering.py | 103 + src/backend/core/evolution/cycle/patterns.py | 113 + .../core/evolution/cycle/profile_release.py | 281 + src/backend/core/evolution/cycle/promotion.py | 317 ++ .../evolution/cycle/promotion_constants.py | 80 + .../core/evolution/cycle/promotion_types.py | 94 + .../core/evolution/cycle/prompt_candidates.py | 95 + .../core/evolution/{ => cycle}/readiness.py | 25 +- .../core/evolution/{ => cycle}/release.py | 0 .../core/evolution/cycle/retirement.py | 158 + .../evolution/{ => cycle}/runtime_binding.py | 85 +- .../core/evolution/cycle/skill_document.py | 298 ++ .../core/evolution/cycle/skill_release.py | 355 ++ .../core/evolution/{ => cycle}/timescales.py | 2 +- .../core/evolution/{ => cycle}/trigger.py | 77 +- .../core/evolution/cycle/usage_evidence.py | 283 + src/backend/core/evolution/cycle_extras.py | 653 --- .../core/evolution/evidence/__init__.py | 1 + .../core/evolution/{ => evidence}/cassette.py | 19 +- .../{ => evidence}/counterfactual.py | 2 +- .../core/evolution/{ => evidence}/credit.py | 2 +- .../core/evolution/{ => evidence}/events.py | 2 +- .../{ => evidence}/evidence_contract.py | 0 .../{ => evidence}/evidence_resolver.py | 8 +- .../core/evolution/{ => evidence}/exposure.py | 10 +- .../core/evolution/{ => evidence}/lineage.py | 2 +- .../core/evolution/{ => evidence}/outcomes.py | 0 .../core/evolution/{ => evidence}/replay.py | 0 .../{ => evidence}/trace_assembler.py | 6 +- .../evolution/{ => evidence}/trace_store.py | 4 +- .../core/evolution/generators/__init__.py | 1 + .../evolution/{ => generators}/graph_scan.py | 0 .../{ => generators}/memory_apply.py | 8 +- .../evolution/{ => generators}/memory_ops.py | 2 +- .../evolution/{ => generators}/memory_scan.py | 2 +- .../{ => generators}/ontology_bridge.py | 0 .../{ => generators}/orchestration_gen.py | 2 +- .../evolution/{ => generators}/prompt_gen.py | 0 .../skill_candidate_engine.py | 14 +- .../evolution/generators/skill_drafting.py | 185 + .../evolution/generators/skill_evidence.py | 124 + .../core/evolution/generators/skill_gen.py | 95 + .../generators/skill_gen_constants.py | 109 + src/backend/core/evolution/loop.py | 1576 ------ .../core/evolution/profiles/__init__.py | 1 + .../core/evolution/profiles/agent_profile.py | 259 + .../profiles/agent_profile_constants.py | 102 + .../core/evolution/profiles/change_preview.py | 85 + .../evolution/{ => profiles}/console_view.py | 2 - .../evolution/{ => profiles}/federation.py | 2 +- .../core/evolution/{ => profiles}/personal.py | 52 +- .../personal_review.py} | 219 +- .../core/evolution/{ => profiles}/policies.py | 22 +- .../core/evolution/{ => profiles}/prefs.py | 0 .../evolution/profiles/profile_selection.py | 147 + .../core/evolution/profiles/stall_hook.py | 103 + .../core/evolution/profiles/user_settings.py | 70 + .../profiles/user_settings_constants.py | 14 + src/backend/core/evolution/promotion.py | 890 ---- .../core/evolution/settlement/__init__.py | 1 + .../evolution/settlement/memory_service.py | 39 + .../evolution/{ => settlement}/settlement.py | 0 .../{ => settlement}/settlement_runner.py | 43 +- .../{ => settlement}/settlement_store.py | 2 +- src/backend/core/evolution/skill_gen.py | 521 -- src/backend/core/extensions/__init__.py | 69 - src/backend/core/extensions/registry.py | 107 - src/backend/core/files/__init__.py | 1 + src/backend/core/files/artifact_bytes.py | 75 + .../core/{ => files}/artifacts/__init__.py | 1 - .../artifacts/backfill.py} | 10 +- src/backend/core/files/artifacts/generated.py | 210 + .../artifacts/key_repair.py} | 0 .../{ => files}/artifacts/local_reference.py | 31 +- .../artifacts/location.py} | 24 +- .../artifacts/reader.py} | 19 +- .../artifacts/refs.py} | 10 +- .../artifacts/service.py} | 15 +- .../core/{ => files}/artifacts/store.py | 26 +- .../artifacts/summary.py} | 8 +- .../artifacts/text.py} | 15 +- src/backend/core/files/content/__init__.py | 1 + .../{ => files}/content/archive_browser.py | 2 +- .../{ => files}/content/archive_limits.py | 0 src/backend/core/files/content/branding.py | 299 ++ .../core/files/content/content_blocks.py | 183 + .../files/content/content_blocks_constants.py | 181 + .../core/files/content/file_formats.py | 33 + src/backend/core/files/content/file_parser.py | 41 + .../{ => files}/content/file_validation.py | 0 .../core/{ => files}/content/office.py | 0 .../content/office_preview_cache.py | 2 +- .../core/files/content/parser_config.py | 47 + src/backend/core/files/content/pdf_parser.py | 125 + .../core/files/content/presentation_parser.py | 63 + .../core/files/content/spreadsheet_parser.py | 332 ++ .../core/{ => files}/content/svg_fit.py | 5 +- src/backend/core/files/content/text_parser.py | 21 + src/backend/core/files/content/word_parser.py | 77 + src/backend/core/files/edition.py | 98 + .../core/{services => files}/folder_batch.py | 47 +- .../personal_operations.py} | 10 +- .../core/{ => files}/spaces/__init__.py | 0 src/backend/core/{ => files}/spaces/access.py | 4 +- src/backend/core/{ => files}/spaces/files.py | 8 +- src/backend/core/{ => files}/spaces/leases.py | 24 +- src/backend/core/{ => files}/spaces/mounts.py | 32 +- .../core/{ => files}/spaces/projects.py | 6 +- .../core/{ => files}/spaces/recovery.py | 4 +- .../core/{ => files}/spaces/sandbox.py | 26 +- src/backend/core/{ => files}/spaces/search.py | 2 +- src/backend/core/{ => files}/spaces/text.py | 4 +- src/backend/core/{ => files}/spaces/tree.py | 0 .../core/{ => files}/storage/__init__.py | 17 +- .../core/{ => files}/storage/entries.py | 0 .../core/{ => files}/storage/factory.py | 32 +- src/backend/core/{ => files}/storage/local.py | 8 +- .../{ => files}/storage/local_directory.py | 4 +- .../core/{ => files}/storage/local_paths.py | 2 +- .../core/{ => files}/storage/protocol.py | 0 src/backend/core/{ => files}/storage/s3.py | 4 +- .../core/{ => files}/storage/s3_directory.py | 2 +- .../core/{services => files}/upload_retry.py | 4 +- .../capability_errors.py} | 0 src/backend/core/harness/context_items.py | 6 + src/backend/core/harness/events.py | 67 +- .../{llm => harness}/execution_manifest.py | 2 +- src/backend/core/harness/hooks.py | 151 +- .../harness_ledger.py => harness/ledger.py} | 163 +- src/backend/core/harness/log_audit.py | 144 + src/backend/core/harness/log_context.py | 161 + src/backend/core/harness/log_records.py | 212 + src/backend/core/harness/log_writer.py | 121 + .../core/harness/log_writer_constants.py | 32 + .../core/harness/observation_writer.py | 134 + src/backend/core/harness/registry/__init__.py | 79 + .../core/harness/registry/authentication.py | 39 + .../core/harness/registry/build_governance.py | 51 + .../harness/registry/cache_invalidation.py | 27 + .../harness/registry/capability_management.py | 27 + .../harness/registry/capability_revisions.py | 34 + .../harness/registry/capability_runtime.py | 74 + .../core/harness/registry/catalog_options.py | 26 + .../core/harness/registry/chat_execution.py | 27 + .../core/harness/registry/chat_history.py | 21 + .../core/harness/registry/compaction.py | 62 + .../core/harness/registry/device_catalog.py | 79 + .../registry}/edition.py | 0 .../core/harness/registry/evaluation.py | 72 + .../harness/registry/execution_account.py | 35 + .../harness/registry/execution_catalog.py | 51 + .../harness/registry/execution_identity.py | 78 + .../core/harness/registry/hook_factories.py | 69 + .../core/harness/registry/host_runtime.py | 13 + .../core/harness/registry/job_operations.py | 21 + .../core/harness/registry/local_files.py | 65 + .../harness/registry/local_publication.py | 69 + .../harness/registry/marketplace_catalog.py | 44 + .../core/harness/registry/mcp_clients.py | 21 + .../harness/registry/model_credentials.py | 70 + .../core/harness/registry/model_services.py | 59 + .../core/harness/registry/package_sources.py | 48 + .../core/harness/registry/package_views.py | 66 + src/backend/core/harness/registry/registry.py | 169 + .../core/harness/registry/resource_owners.py | 48 + .../harness/registry/retrieval_context.py | 37 + .../core/harness/registry/run_cancellation.py | 37 + .../core/harness/registry/run_capabilities.py | 114 + .../core/harness/registry/schema_lifecycle.py | 36 + .../core/harness/registry/skill_content.py | 24 + .../harness/registry/system_configuration.py | 31 + .../core/harness/registry/tool_operations.py | 59 + .../registry/transfer_channels.py} | 64 +- .../core/harness/registry/user_cleanup.py | 27 + src/backend/core/harness/tool_call_context.py | 5 + .../core/harness/tool_effect_context.py | 18 + src/backend/core/harness/usage.py | 41 +- src/backend/core/infra/background.py | 18 +- src/backend/core/infra/byte_range.py | 71 + src/backend/core/infra/crypto.py | 28 +- .../junction.py => infra/directory_links.py} | 32 +- src/backend/core/infra/dns_cache.py | 58 +- src/backend/core/infra/failures.py | 13 + .../lockfile.py => infra/file_lock.py} | 0 src/backend/core/{ => infra}/immutable.py | 0 src/backend/core/infra/json_output.py | 49 + src/backend/core/infra/leader.py | 225 +- .../core/infra/local_runtime/__init__.py | 1 + .../infra/local_runtime/dynamic_servers.py | 64 + .../infra/local_runtime/lifecycle.py} | 33 +- .../local_runtime/runner_auth.py} | 0 .../infra/local_runtime/startup.py} | 95 +- src/backend/core/infra/model_output.py | 95 + src/backend/core/infra/probes/__init__.py | 1 + .../probes/edition.py} | 0 .../probes}/service_probes.py | 25 +- src/backend/core/infra/rate_limit.py | 21 - src/backend/core/infra/redis.py | 27 +- src/backend/core/infra/runtime_state.py | 24 +- .../text_bounds.py} | 0 src/backend/core/infra/time.py | 14 +- src/backend/core/infra/worker_count.py | 9 +- .../{orchestration => core}/jobs/__init__.py | 0 .../{orchestration => core}/jobs/agent.py | 14 +- .../{orchestration => core}/jobs/callback.py | 0 .../{orchestration => core}/jobs/files.py | 6 +- .../jobs/notifications.py | 22 +- .../{orchestration => core}/jobs/owner.py | 43 +- .../{orchestration => core}/jobs/process.py | 13 +- src/backend/core/jobs/reminder_hook.py | 80 + .../{orchestration => core}/jobs/runner.py | 0 .../job_runtime.py => core/jobs/runtime.py} | 41 +- .../{orchestration => core}/jobs/sdk.py | 0 .../{orchestration => core}/jobs/state.py | 2 +- .../job_service.py => jobs/store.py} | 0 .../jobs/supervisor.py | 38 +- src/backend/core/jobs/tool_operations.py | 410 ++ src/backend/core/kb/kb_assets.py | 567 -- src/backend/core/kb/kb_parser.py | 933 ---- src/backend/core/kb/kb_vector.py | 755 --- src/backend/core/kb/wiki/local_provider.py | 523 -- src/backend/core/llm/__init__.py | 14 +- src/backend/core/llm/_distill_shared.py | 156 - src/backend/core/llm/api_runtime/__init__.py | 1 + .../agent.py} | 6 +- .../agent_skills.py} | 2 +- .../agent_tools.py} | 27 +- .../project.py} | 2 +- src/backend/core/llm/capability_tools.py | 106 - src/backend/core/llm/citations/__init__.py | 1 + src/backend/core/llm/citations/allocator.py | 115 + src/backend/core/llm/citations/anchor.py | 63 + .../core/llm/citations/anchor_state.py | 101 + src/backend/core/llm/citations/extraction.py | 208 + src/backend/core/llm/citations/hook.py | 38 + src/backend/core/llm/citations/types.py | 63 + src/backend/core/llm/command_middleware.py | 39 - src/backend/core/llm/context/__init__.py | 1 + src/backend/core/llm/context/adapter.py | 362 ++ .../core/llm/context/attachment_hook.py | 81 + .../context/budget.py} | 2 +- .../llm/{ => context}/compacting_agent.py | 20 +- .../core/llm/{ => context}/compaction.py | 11 +- src/backend/core/llm/context/content.py | 212 + src/backend/core/llm/context/ir.py | 327 ++ src/backend/core/llm/context/ir_constants.py | 86 + src/backend/core/llm/context/items.py | 215 + .../core/llm/context/message_defaults.py | 78 + .../core/llm/{ => context}/offloader.py | 4 +- .../core/llm/context/provider_conversion.py | 239 + .../core/llm/context/reasoning_hooks.py | 49 + .../core/llm/context/reference_conversion.py | 79 + src/backend/core/llm/context/rendering.py | 114 + .../{context_safety.py => context/safety.py} | 16 +- .../core/llm/{ => context}/system_reminder.py | 4 +- .../{context_usage.py => context/usage.py} | 2 +- .../core/llm/context/workspace_hooks.py | 125 + src/backend/core/llm/context_adapter.py | 867 --- src/backend/core/llm/context_ir.py | 855 --- src/backend/core/llm/factory/README.md | 6 +- src/backend/core/llm/factory/__init__.py | 6 +- src/backend/core/llm/factory/assembly.py | 18 +- src/backend/core/llm/factory/build.py | 6 +- src/backend/core/llm/factory/defaults.py | 16 +- .../core/llm/factory/prompts/policy.py | 3 +- .../core/llm/factory/prompts/system.py | 39 +- src/backend/core/llm/factory/request.py | 4 +- .../llm/factory/runtime/agent_construction.py | 21 +- .../capability_bindings.py} | 11 +- .../llm/factory/runtime/execution_budget.py | 10 +- .../core/llm/factory/runtime/listeners.py | 33 +- .../llm/factory/runtime/manifest_binding.py | 4 +- .../llm/factory/runtime/middleware_stack.py | 130 +- .../llm/factory/runtime/model_selection.py | 20 +- .../llm/factory/selection/capabilities.py | 58 +- .../llm/factory/selection/entry_policy.py | 20 +- .../llm/factory/selection/mode_bindings.py | 7 +- .../factory/selection/profile_selection.py | 12 +- .../factory/selection/progressive_bindings.py | 24 +- .../llm/factory/selection/server_selection.py | 10 +- .../factory/selection/sticky_capabilities.py | 26 +- .../factory/selection/subagent_bindings.py | 8 +- .../registry.py => core/llm/factory/specs.py} | 2 - .../core/llm/factory/tools/definitions.py | 35 + .../core/llm/factory/tools/interactive.py | 2 +- .../core/llm/factory/tools/mcp_config.py | 55 +- .../core/llm/factory/tools/mcp_connections.py | 226 +- src/backend/core/llm/factory/tools/native.py | 82 +- .../llm/factory/tools/skill_registration.py | 26 +- .../core/llm/factory/tools/tool_surface.py | 46 +- src/backend/core/llm/finish_guard.py | 85 - src/backend/core/llm/hooks.py | 588 --- src/backend/core/llm/host_services.py | 31 + src/backend/core/llm/management_tool.py | 84 - src/backend/core/llm/mcp/__init__.py | 1 + src/backend/core/llm/mcp/callbacks.py | 168 + src/backend/core/llm/mcp/chat_sessions.py | 181 + src/backend/core/llm/mcp/client.py | 149 + src/backend/core/llm/mcp/context_tools.py | 69 + src/backend/core/llm/mcp/deadline.py | 40 + .../{mcp_invocation.py => mcp/invocation.py} | 10 +- src/backend/core/llm/mcp/lifetime.py | 68 + src/backend/core/llm/mcp/manager.py | 62 + src/backend/core/llm/mcp/results.py | 67 + src/backend/core/llm/mcp/session.py | 147 + src/backend/core/llm/mcp/tools.py | 113 + src/backend/core/llm/mcp_manager.py | 336 -- src/backend/core/llm/mcp_pool.py | 387 -- src/backend/core/llm/middleware/__init__.py | 1 + .../migration_map.py} | 67 +- src/backend/core/llm/middlewares.py | 1450 ----- src/backend/core/llm/persona_distiller.py | 226 - src/backend/core/llm/ports.py | 79 + .../llm/project_environment_middleware.py | 27 - src/backend/core/llm/prompt_files.py | 138 + src/backend/core/llm/prompt_kinds.py | 193 + src/backend/core/llm/prompt_rendering.py | 137 + src/backend/core/llm/prompt_storage.py | 99 + src/backend/core/llm/prompt_versions.py | 296 ++ src/backend/core/llm/prompt_versions_state.py | 30 + src/backend/core/llm/providers/__init__.py | 13 - src/backend/core/llm/runtime/__init__.py | 1 + .../{ => runtime}/agentscope_hook_adapter.py | 223 +- .../core/llm/runtime/context_hook_adapter.py | 80 + .../core/llm/runtime/delta_coalescer.py | 106 + src/backend/core/llm/runtime/file_context.py | 277 + src/backend/core/llm/runtime/finish_guard.py | 54 + .../core/llm/runtime/hooks_constants.py | 17 + .../llm/{ => runtime}/human_interaction.py | 4 +- .../llm/{ => runtime}/interaction_store.py | 0 .../core/llm/{ => runtime}/manifest_agent.py | 17 +- .../core/llm/{ => runtime}/message_compat.py | 16 +- src/backend/core/llm/runtime/model_cache.py | 133 + .../llm/runtime/model_selection_adapter.py | 28 + .../core/llm/{ => runtime}/model_steps.py | 5 +- .../llm/{ => runtime}/project_environment.py | 33 +- .../llm/runtime/project_environment_hook.py | 19 + .../core/llm/runtime/review_text_agent.py | 51 + .../llm/{ => runtime}/session_capabilities.py | 2 +- src/backend/core/llm/runtime/state.py | 75 + src/backend/core/llm/runtime/stream_events.py | 261 + src/backend/core/llm/runtime/stream_loop.py | 332 ++ src/backend/core/llm/runtime/stream_text.py | 63 + src/backend/core/llm/runtime/streaming.py | 287 + .../core/llm/runtime/streaming_constants.py | 20 + .../llm/runtime}/tool_callbacks.py | 24 +- .../llm/runtime/tool_execution_adapter.py | 210 + .../core/llm/runtime/tool_hook_adapter.py | 81 + .../llm/{ => runtime}/tool_media_store.py | 24 +- .../core/llm/runtime/tool_result_adapter.py | 53 + src/backend/core/llm/runtime/turn_state.py | 41 + .../core/llm/{ => runtime}/workspace.py | 0 .../selector.py => llm/skill_selection.py} | 23 +- src/backend/core/llm/steer_middleware.py | 96 - src/backend/core/llm/subagents/__init__.py | 1 + .../execution.py} | 48 +- .../prompts.py} | 0 .../sessions.py} | 2 +- .../stream.py} | 39 +- .../{subagent_tool.py => subagents/tool.py} | 72 +- src/backend/core/llm/tool_collector.py | 270 - .../core/llm/tool_permissions/__init__.py | 95 +- src/backend/core/llm/tool_permissions/hook.py | 71 + .../core/llm/tool_permissions/middleware.py | 86 - .../core/llm/tool_permissions/pending.py | 4 +- .../core/llm/tool_permissions/service.py | 35 +- src/backend/core/llm/tools/__init__.py | 9 +- src/backend/core/llm/tools/_common.py | 23 +- src/backend/core/llm/tools/_tool_helpers.py | 208 +- .../core/llm/tools/ask_user_question_tool.py | 11 +- .../core/llm/tools/chat_history_tool.py | 51 +- .../cloud_gateway.py} | 119 +- src/backend/core/llm/tools/cloud_manifest.py | 55 + .../__init__.py | 0 .../gate.py | 3 +- .../pending.py | 13 +- .../shared.py | 2 +- .../state.py | 104 +- .../core/llm/tools/data_context_tool.py | 96 - src/backend/core/llm/tools/edit_tool.py | 25 +- src/backend/core/llm/tools/glob_tool.py | 7 +- src/backend/core/llm/tools/grep_tool.py | 12 +- src/backend/core/llm/tools/job_tool.py | 383 +- src/backend/core/llm/tools/management.py | 45 + .../tools/ontology_toolkit.py} | 30 +- src/backend/core/llm/tools/pin_tool.py | 46 +- .../plan_update.py} | 19 +- .../tools/plugin_activation.py} | 122 +- .../llm/tools/project_instructions_tool.py | 30 +- .../core/llm/tools/project_source_access.py | 6 +- .../core/llm/tools/read_artifact_tool.py | 42 +- src/backend/core/llm/tools/read_image_tool.py | 34 +- src/backend/core/llm/tools/read_tool.py | 27 +- .../core/llm/tools/sandbox_artifact_tools.py | 34 +- src/backend/core/llm/tools/sandbox_tool.py | 75 +- src/backend/core/llm/tools/skill_tool.py | 51 +- src/backend/core/llm/tools/user_questions.py | 67 +- src/backend/core/llm/tools/write_tool.py | 30 +- src/backend/core/memory/access.py | 48 +- src/backend/core/memory/audit.py | 166 +- src/backend/core/memory/backend.py | 96 +- src/backend/core/memory/context.py | 2 +- src/backend/core/memory/edition.py | 4 + src/backend/core/memory/effect_lane.py | 75 +- src/backend/core/memory/executor.py | 5 +- src/backend/core/memory/extractors/_base.py | 49 +- src/backend/core/memory/extractors/graph.py | 2 +- src/backend/core/memory/extractors/writers.py | 10 +- src/backend/core/memory/graph.py | 345 +- src/backend/core/memory/graph_contract.py | 122 + src/backend/core/memory/graph_state.py | 141 + src/backend/core/memory/outbox/enqueue.py | 3 +- src/backend/core/memory/outbox/jobs.py | 35 +- src/backend/core/memory/outbox/leases.py | 6 +- src/backend/core/memory/outbox/settlement.py | 18 +- src/backend/core/memory/outbox/worker.py | 71 +- src/backend/core/memory/pipeline.py | 31 +- src/backend/core/memory/preview.py | 5 +- src/backend/core/memory/procedures.py | 3 +- src/backend/core/memory/queries.py | 3 +- src/backend/core/memory/sanitizer.py | 39 +- src/backend/core/memory/service.py | 9 +- src/backend/core/memory/session_snapshot.py | 2 +- .../settings.py} | 2 +- src/backend/core/memory/settlement_port.py | 33 + src/backend/core/memory/ttl_sweeper.py | 2 +- src/backend/core/memory/weights.py | 23 +- src/backend/core/models/__init__.py | 1 + src/backend/core/models/admission.py | 21 + .../core/models/api_protocol_backfill.py | 106 + .../core/{llm => models}/chat_models.py | 47 +- .../core/models/completions/__init__.py | 1 + .../{llm => models/completions}/classifier.py | 25 +- .../completions}/single_turn.py | 10 +- .../{llm => models/completions}/summarizer.py | 25 +- .../model_config.py => models/config.py} | 205 +- src/backend/core/models/constants.py | 5 + .../context_window.py} | 2 +- src/backend/core/models/embedding.py | 123 + src/backend/core/models/embedding_state.py | 20 + src/backend/core/{llm => models}/failover.py | 36 +- .../import_validation.py} | 4 +- src/backend/core/models/providers/__init__.py | 3 + .../providers/_image_tokens.py | 2 +- .../providers/context_probe.py | 2 +- .../providers/openai_compat.py | 20 +- .../providers/protocol_probe.py | 0 .../providers/reasoning_probe.py | 6 +- .../{llm => models}/providers/registry.py | 2 +- .../{llm => models}/providers/stream_retry.py | 4 +- .../providers/vendor_models.py | 12 +- .../core/{llm => models}/reasoning_effort.py | 0 .../core/{llm => models}/reasoning_replay.py | 0 .../repository.py} | 4 +- src/backend/core/models/reranking.py | 63 + .../responses.py} | 97 +- .../selection.py} | 46 +- src/backend/core/models/selection_hook.py | 20 + .../{llm => models}/tool_call_identity.py | 0 .../core/{llm => models}/tool_result_media.py | 63 +- .../{llm/model_usage.py => models/usage.py} | 4 +- src/backend/core/models/vision/__init__.py | 34 + .../core/{ => models}/vision/attachments.py | 18 +- .../core/{ => models}/vision/prompt.py | 2 +- .../core/{ => models}/vision/provider.py | 12 +- .../core/{ => models}/vision/render.py | 4 +- .../core/{ => models}/vision/schema.py | 0 .../core/{ => models}/vision/service.py | 14 +- src/backend/core/myspace/duplicate_cleanup.py | 63 - src/backend/core/ontology/__init__.py | 3 +- src/backend/core/ontology/audit_events.py | 71 + src/backend/core/ontology/build_validator.py | 6 +- .../evolution.py} | 115 +- src/backend/core/ontology/host.py | 13 + src/backend/core/ontology/manual_review.py | 85 + .../core/ontology/output_review_state.py | 60 + .../ontology_policy.py => ontology/policy.py} | 4 +- .../core/ontology/review_operations.py | 102 + src/backend/core/ontology/review_prompt.py | 99 + src/backend/core/ontology/reviewer.py | 319 ++ src/backend/core/ontology/reviewer_state.py | 19 + src/backend/core/ontology/runtime_gates.py | 157 + src/backend/core/ontology/runtime_pack.py | 357 ++ src/backend/core/ontology/runtime_policy.py | 158 + .../service.py} | 262 +- src/backend/core/ontology/tool_hook.py | 183 + .../core/ontology/validation_models.py | 33 + src/backend/core/ontology/validator.py | 634 +-- src/backend/core/plugins/README.md | 28 - .../core/plugins/management/__init__.py | 80 - .../core/plugins/resources/application.py | 152 - .../plugins/resources/application_cleanup.py | 48 - .../core/plugins/resources/deadlines.py | 125 - src/backend/core/plugins/resources/owners.py | 112 - src/backend/core/plugins/resources/prewarm.py | 142 - .../core/plugins/resources/reservation.py | 93 - src/backend/core/plugins/resources/service.py | 347 -- src/backend/core/projects/__init__.py | 1 + .../project_access.py => projects/access.py} | 2 +- .../api.py} | 2 +- .../project_service.py => projects/base.py} | 87 +- src/backend/core/projects/edition.py | 8 + .../environment}/__init__.py | 0 .../environment}/config.py | 0 .../environment}/dependencies.py | 2 +- .../environment/service.py} | 12 +- .../environment_resources.py} | 22 +- .../files.py} | 14 +- .../instructions.py} | 20 +- .../local_workspace.py} | 2 +- .../personal_scope.py} | 8 +- src/backend/core/projects/personal_summary.py | 44 + .../personal_transfer.py} | 0 src/backend/core/projects/project_names.py | 27 + .../project_source.py => projects/source.py} | 20 +- .../user_folders.py} | 23 +- src/backend/core/runs/__init__.py | 0 .../runs/api_recovery.py} | 6 +- .../run_binding.py => runs/binding.py} | 105 +- src/backend/core/runs/clock.py | 55 + src/backend/core/runs/events/__init__.py | 0 src/backend/core/runs/events/projection.py | 13 + .../runs/events/store.py} | 88 +- src/backend/core/runs/events/subscription.py | 81 + src/backend/core/runs/events/writer.py | 197 + src/backend/core/runs/host.py | 41 + .../run_journal.py => runs/journal.py} | 32 +- .../journal_domain.py} | 0 .../journal_lifecycle.py} | 20 +- .../journal_recovery.py} | 9 +- src/backend/core/runs/ownership.py | 276 + src/backend/core/runs/runtime.py | 296 ++ src/backend/core/runs/settings.py | 98 + src/backend/core/runs/tasks.py | 23 + .../runs}/tool_effect_recovery.py | 99 +- .../core/runs/tool_effects/__init__.py | 1 + .../core/runs/tool_effects/arguments.py | 65 + src/backend/core/runs/tool_effects/errors.py | 43 + src/backend/core/runs/tool_effects/gateway.py | 256 + src/backend/core/runs/tool_effects/hooks.py | 14 + src/backend/core/runs/tool_effects/host.py | 28 + .../runs/tool_effects/intent_transactions.py | 342 ++ .../runs/tool_effects/invocation_claims.py | 123 + src/backend/core/runs/tool_effects/journal.py | 223 + .../runs/tool_effects/journal_constants.py | 32 + .../core/runs/tool_effects/recovery.py | 176 + .../core/runs/tool_effects/recovery_claims.py | 166 + .../core/runs/tool_effects/registry.py | 95 + .../runs/tool_effects/result_transactions.py | 285 + .../core/runs/tool_effects/retention.py | 154 + src/backend/core/runs/tool_effects/types.py | 74 + src/backend/core/runs/watchdog.py | 322 ++ src/backend/core/sandbox/commands/__init__.py | 1 + .../core/sandbox/commands/completion_hook.py | 44 + .../{services => sandbox}/commands/context.py | 10 +- .../commands/delivery.py | 13 +- .../sandbox}/commands/events.py | 15 +- .../sandbox}/commands/notifications.py | 27 +- src/backend/core/sandbox/commands/runtime.py | 449 ++ .../{services => sandbox}/commands/store.py | 13 +- .../sandbox}/commands/subscription.py | 44 +- .../core/sandbox/credential_dispatch.py | 30 + src/backend/core/sandbox/factory.py | 33 +- .../core/sandbox/oslayer/windows_runtime.py | 36 +- .../permissions}/account.py | 4 +- .../permissions/approval.py} | 6 +- .../permissions/dispatch_models.py} | 4 +- .../core/sandbox/permissions/os_gate.py | 2 +- .../permissions/tool_specs.py} | 20 +- .../core/sandbox/permissions/vocabulary.py | 26 + src/backend/core/sandbox/processes/cloud.py | 28 +- .../core/sandbox/processes/completion.py | 10 +- .../core/sandbox/processes/dispatch.py | 2 +- .../core/sandbox/processes/interactive.py | 3 +- .../core/sandbox/providers/account_env.py | 27 +- src/backend/core/sandbox/providers/edition.py | 2 +- .../providers/opensandbox/account_volumes.py | 292 -- .../sandbox/providers/opensandbox/admin.py | 5 +- .../sandbox/providers/opensandbox/adoption.py | 242 +- .../sandbox/providers/opensandbox/binding.py | 2 +- .../sandbox/providers/opensandbox/creation.py | 74 +- .../providers/opensandbox/execution.py | 7 +- .../providers/opensandbox/lifecycle.py | 4 +- .../sandbox/providers/opensandbox/models.py | 9 +- .../sandbox/providers/opensandbox/pool.py | 3 +- .../sandbox/providers/opensandbox/provider.py | 59 +- .../providers/opensandbox/reclamation.py | 4 +- .../sandbox/providers/opensandbox/runtime.py | 25 +- .../providers/opensandbox/snapshots.py | 44 +- .../sandbox/providers/opensandbox/tracking.py | 31 + .../providers/opensandbox/user_pool.py | 6 +- .../sandbox/providers/opensandbox/volumes.py | 85 +- .../providers/script_runner/provider.py | 44 +- .../core/sandbox/runner/native_group.py | 28 +- src/backend/core/sandbox/runner/server.py | 2 +- src/backend/core/sandbox/sessions/registry.py | 21 +- src/backend/core/sandbox/sessions/router.py | 15 +- .../core/sandbox/workspace/container.py | 15 +- .../core/sandbox/workspace/credentials.py | 141 - src/backend/core/sandbox/workspace/desktop.py | 2 +- .../core/sandbox/workspace/identity.py | 2 +- .../workspace/resolution.py} | 14 +- src/backend/core/services/__init__.py | 19 - .../core/services/agent_market_categories.py | 77 - .../core/services/agent_market_service.py | 940 ---- .../core/services/api_protocol_backfill.py | 94 - src/backend/core/services/artifact_edition.py | 66 - .../core/services/automation_tool_routing.py | 106 - src/backend/core/services/chat_service.py | 1301 ----- .../core/services/commands/__init__.py | 1 - .../core/services/desktop_cloud_bridge.py | 960 ---- .../core/services/edition_system_config.py | 6 - .../core/services/edition_workspace.py | 52 - src/backend/core/services/kb_edition.py | 12 - src/backend/core/services/lark_service.py | 752 --- src/backend/core/services/log_service.py | 649 --- .../core/services/marketplace_service.py | 1400 ----- .../core/services/mcp_marketplace_service.py | 1772 ------- .../core/services/mcp_oauth_service.py | 529 -- .../core/services/mcp_tool_metadata.py | 19 - .../core/services/mcp_tool_schema_backfill.py | 110 - .../core/services/prompt_version_service.py | 889 ---- .../services/session_operations/admission.py | 262 - .../core/services/skill_draft_service.py | 192 - src/backend/core/services/system_config.py | 655 --- .../core/services/tool_effect_ledger.py | 1808 ------- src/backend/core/services/user_agent_base.py | 854 --- src/backend/core/spaces/edition_access.py | 17 - src/backend/core/spaces/edition_revocation.py | 3 - src/backend/core/vision/__init__.py | 45 - src/backend/extensions/README.md | 2 +- .../extensions/mcp_servers/_packaging.py | 6 +- src/backend/extensions/mcp_servers/_serve.py | 28 +- .../mcp_servers/agent_manager_mcp/impl.py | 48 +- .../mcp_servers/agent_manager_mcp/server.py | 4 +- .../mcp_servers/automation_task_mcp/impl.py | 18 +- .../mcp_servers/automation_task_mcp/server.py | 16 +- .../mcp_servers/browser_runtime_mcp/server.py | 8 +- .../internet_search_mcp/_selftest.py | 2 +- .../mcp_servers/internet_search_mcp/impl.py | 4 +- .../mcp_servers/internet_search_mcp/server.py | 35 +- .../mcp_servers/management_registration.py | 8 +- .../mcp_servers/plugin_manager_mcp/impl.py | 11 +- .../mcp_servers/plugin_manager_mcp/server.py | 4 +- .../retrieve_dataset_content_mcp/impl.py | 18 +- .../local_impl.py | 25 +- .../retrieve_dataset_content_mcp/server.py | 47 +- .../retrieve_dataset_content_mcp/wiki_impl.py | 12 +- .../mcp_servers/site_publish_mcp/server.py | 6 +- .../mcp_servers/skill_manager_mcp/impl.py | 21 +- .../mcp_servers/skill_manager_mcp/server.py | 4 +- .../space_files_mcp/permissions.py | 8 +- .../mcp_servers/space_files_mcp/server.py | 10 +- .../mcp_servers/web_fetch_mcp/server.py | 4 +- .../marketplace/agent-manager/mcp.json | 2 +- .../plugins/marketplace/automation/mcp.json | 2 +- .../marketplace/plugin-manager/mcp.json | 2 +- .../plugin-creator/scripts/validate_plugin.py | 2 +- .../plugins/marketplace/sites/mcp.json | 2 +- .../marketplace/skill-manager/mcp.json | 2 +- .../skill-creator/references/skill-anatomy.md | 2 +- .../skill-creator/scripts/quick_validate.py | 2 +- .../skills/marketplace/data-mask/config.yaml | 166 +- src/backend/features/__init__.py | 157 + src/backend/features/automation/README.md | 15 + src/backend/features/automation/__init__.py | 1 + src/backend/features/automation/admission.py | 80 + .../features/automation/api/__init__.py | 1 + .../automation/api}/automations.py | 27 +- .../automation}/delivery_targets.py | 19 +- .../automation/execution.py} | 4 +- src/backend/features/automation/extension.py | 28 + .../automation/loops.py} | 5 +- .../automation/models.py} | 59 +- .../automation/notifications.py} | 0 .../automation/remote_effect.py} | 3 +- src/backend/features/automation/runs.py | 66 + src/backend/features/automation/scheduling.py | 23 + src/backend/features/automation/schema.py | 59 + .../automation/service.py} | 155 +- .../features/automation/tool_routing.py | 116 + src/backend/features/desktop/README.md | 11 + src/backend/features/desktop/__init__.py | 1 + src/backend/features/desktop/api/__init__.py | 1 + .../features/desktop/api/capability_auth.py | 48 + .../features/desktop/api/capability_bridge.py | 92 + .../desktop/api/capability_dependencies.py | 107 + .../desktop/api/capability_manifests.py | 145 + .../desktop/api/capability_mcp_gateway.py | 79 + .../desktop/api/capability_model_gateway.py | 89 + .../features/desktop/api/capability_tools.py | 192 + .../desktop/api/capability_workcopies.py | 38 + .../v1 => features/desktop/api}/desktop.py | 2 +- .../desktop/api}/desktop_capabilities.py | 104 +- .../desktop/api/desktop_capability.py | 12 + .../desktop/api/desktop_capability_state.py | 52 + .../desktop/api}/desktop_login.py | 2 +- .../desktop/api}/desktop_observability.py | 8 +- .../desktop/api}/device_link.py | 6 +- .../v1 => features/desktop/api}/local.py | 20 +- .../desktop/api}/local_file_actions.py | 4 +- src/backend/features/desktop/auth/__init__.py | 1 + .../desktop/auth/bridge.py} | 13 +- .../desktop/auth/login_store.py} | 0 .../desktop/auth/ticket_store.py} | 0 .../features/desktop/bridge/__init__.py | 1 + .../desktop/bridge/bundles.py} | 42 +- src/backend/features/desktop/bridge/client.py | 214 + .../features/desktop/bridge/client_state.py | 48 + .../features/desktop/bridge/gateway.py | 225 + .../features/desktop/bridge/identity.py | 254 + .../desktop/bridge/managed_connectors.py | 144 + .../desktop/bridge/model_credentials.py} | 25 +- .../desktop/bridge/release_events.py} | 0 .../desktop/bridge/resource_plugins.py} | 19 +- .../desktop/bridge/skills.py} | 47 +- src/backend/features/desktop/bridge/status.py | 113 + .../features/desktop/capabilities/__init__.py | 16 + .../desktop}/capabilities/agents.py | 17 +- .../desktop}/capabilities/change_merge.py | 10 +- .../desktop}/capabilities/change_signal.py | 0 .../desktop}/capabilities/change_sync.py | 60 +- .../desktop}/capabilities/connectors.py | 12 +- .../desktop}/capabilities/credentials.py | 0 .../desktop}/capabilities/dependency.py | 28 +- .../capabilities/dependency_declarations.py | 0 .../desktop}/capabilities/device_catalog.py | 90 +- .../capabilities/device_plugin_catalog.py | 69 +- .../desktop}/capabilities/discovery.py | 6 +- .../desktop}/capabilities/invocation.py | 34 +- .../capabilities/local_plugin_runtime.py | 21 +- .../desktop}/capabilities/local_projection.py | 27 +- .../capabilities/management_context.py | 17 +- .../desktop}/capabilities/manifest_order.py | 2 +- .../desktop}/capabilities/mcp_json.py | 8 +- .../desktop}/capabilities/migration.py | 25 +- .../desktop}/capabilities/paths.py | 31 +- .../desktop}/capabilities/plugins.py | 47 +- .../desktop}/capabilities/preparation.py | 28 +- .../desktop}/capabilities/readiness.py | 24 +- .../desktop}/capabilities/registry.py | 115 +- .../desktop/capabilities/registry_types.py | 79 + .../desktop}/capabilities/resolver.py | 4 +- .../desktop/capabilities/runtime/__init__.py | 37 + .../capabilities/runtime/connectors.py | 23 +- .../capabilities/runtime/dependencies.py | 18 +- .../capabilities/runtime/preparation.py | 25 +- .../desktop}/capabilities/runtime/state.py | 52 +- .../capabilities/session_availability.py | 0 .../desktop/capabilities/skill_account.py | 54 + .../desktop/capabilities/skill_candidates.py | 140 + .../desktop/capabilities/skill_hashes.py | 101 + .../desktop/capabilities/skill_paths.py | 29 + .../desktop/capabilities/skill_publication.py | 88 + .../desktop/capabilities/skill_views.py | 62 + .../features/desktop/capabilities/skills.py | 161 + .../desktop/capabilities/skills_state.py | 35 + .../desktop}/capabilities/store.py | 17 +- .../desktop}/capabilities/view.py | 4 +- .../desktop}/capabilities/warmup.py | 17 +- .../features/desktop/capability/__init__.py | 1 + .../desktop/capability/configs.py} | 6 +- .../desktop/capability/credentials.py} | 2 +- .../desktop/capability/entities.py} | 24 +- .../desktop/capability/mcp.py} | 40 +- .../desktop/capability/models.py} | 16 +- .../desktop/capability/revision_provider.py | 22 + .../desktop/capability/security.py} | 9 +- .../desktop/capability/service.py} | 43 +- .../desktop/capability/skills.py} | 18 +- .../desktop/capability/sync_check.py} | 29 +- .../desktop/capability/workcopies.py} | 45 +- src/backend/features/desktop/edition.py | 23 + src/backend/features/desktop/extension.py | 4 + .../features/desktop/gateway/__init__.py | 1 + .../desktop/gateway/observability.py} | 4 +- .../features/desktop/local/__init__.py | 1 + .../desktop/local/file_actions.py} | 2 +- .../desktop/local/grants.py} | 0 .../desktop/local/management_migration.py} | 16 +- .../desktop/local/manager_execution.py | 51 + .../desktop/local/market_install.py} | 14 +- .../desktop/local}/native_app_icons.py | 0 .../desktop/local/plugins}/__init__.py | 0 .../desktop/local/plugins}/assets.py | 10 +- .../local/plugins}/legacy_migration.py | 27 +- .../desktop/local/plugins}/service.py | 66 +- .../desktop/local/plugins/sidecars.py | 33 + .../desktop/local/publication_provider.py | 101 + .../features/desktop/local/skills/__init__.py | 1 + .../desktop/local/skills/editor.py} | 28 +- .../desktop/local/skills/service.py} | 36 +- .../desktop/local/skills/upload.py} | 34 +- .../desktop/local/snapshots.py} | 0 .../desktop/models.py} | 69 +- .../desktop/observability/__init__.py | 1 + .../desktop/observability/context.py} | 8 +- .../desktop/observability/delivery.py} | 11 +- .../desktop/observability/fields.py} | 2 +- .../desktop/observability/projection.py} | 8 +- .../desktop/observability/sync.py} | 13 +- .../desktop/plugin_resolution.py} | 39 +- .../desktop/run_capabilities/__init__.py | 1 + .../desktop/run_capabilities/preparation.py} | 22 +- .../desktop/run_capabilities/provider.py | 118 + .../desktop/skill_backend.py} | 20 +- src/backend/features/evaluation/README.md | 7 + src/backend/features/evaluation/__init__.py | 1 + .../evaluation/admission.py} | 2 +- .../features/evaluation/api/__init__.py | 1 + .../evaluation/api}/evaluation_sandboxes.py | 2 +- src/backend/features/evaluation/extension.py | 23 + src/backend/features/evaluation/models.py | 1 + src/backend/features/evaluation/policy.py | 27 + .../features/evaluation/runtime/__init__.py | 1 + .../evaluation/runtime/paths.py} | 0 .../evaluation/runtime/process_tools.py} | 7 +- .../evaluation/runtime/runtime.py} | 0 .../evaluation/runtime/tools.py} | 59 +- .../evaluation/sandbox_provider}/__init__.py | 0 .../evaluation/sandbox_provider}/binding.py | 0 .../sandbox_provider}/process_guard.py | 0 .../evaluation/sandbox_provider}/provider.py | 4 +- .../evaluation/sandboxes.py} | 24 +- src/backend/features/hosted_apps/README.md | 9 + src/backend/features/hosted_apps/__init__.py | 1 + .../features/hosted_apps/api/__init__.py | 1 + .../api}/application_transports.py | 88 +- .../hosted_apps/api}/applications.py | 65 +- .../hosted_apps/collections.py} | 8 +- .../hosted_apps/config.py} | 2 +- .../hosted_apps/data.py} | 20 +- .../hosted_apps/deployments.py} | 13 +- .../hosted_apps/export.py} | 6 +- src/backend/features/hosted_apps/extension.py | 17 + .../hosted_apps/history.py} | 8 +- .../hosted_apps/hosting_setup.py} | 4 +- .../hosted_apps/industry.py} | 9 +- .../hosted_apps/lifecycle.py} | 14 +- .../hosted_apps/mcp.py} | 34 +- src/backend/features/hosted_apps/models.py | 5 + .../hosted_apps/operations.py} | 21 +- .../hosted_apps/projects.py} | 10 +- .../hosted_apps/publication.py} | 19 +- .../hosted_apps/relational.py} | 2 +- .../hosted_apps/resources/__init__.py | 1 + .../hosted_apps/resources/admission.py | 159 + .../features/hosted_apps/resources/cleanup.py | 71 + .../hosted_apps/schema.py} | 0 .../hosted_apps/sql_policy.py} | 2 +- .../hosted_apps/store.py} | 10 +- src/backend/features/installed.py | 3 + src/backend/features/knowledge/README.md | 11 + .../kb => features/knowledge}/__init__.py | 2 +- .../features/knowledge/api/__init__.py | 1 + src/backend/features/knowledge/api/kb.py | 7 + .../features/knowledge/api/kb_assets.py | 147 + .../features/knowledge/api/kb_chunks.py | 175 + .../features/knowledge/api/kb_documents.py | 254 + .../features/knowledge/api/kb_helpers.py | 105 + .../features/knowledge/api/kb_mutations.py | 117 + .../features/knowledge/api/kb_spaces.py | 116 + .../features/knowledge/api/kb_state.py | 8 + .../v1 => features/knowledge/api}/kb_wiki.py | 24 +- .../features/knowledge/asset_captions.py | 181 + .../features/knowledge/asset_indexing.py | 88 + .../features/knowledge/catalog_options.py | 7 + .../knowledge/disabled_provider.py} | 4 +- .../knowledge/disabled_retrieval.py} | 0 .../knowledge}/document_status.py | 0 src/backend/features/knowledge/edition.py | 33 + src/backend/features/knowledge/enrichment.py | 126 + src/backend/features/knowledge/extension.py | 19 + .../kb => features/knowledge}/index_queue.py | 4 +- .../kb => features/knowledge}/index_worker.py | 8 +- src/backend/features/knowledge/kb_assets.py | 231 + .../features/knowledge/kb_assets_state.py | 31 + src/backend/features/knowledge/kb_parser.py | 116 + .../features/knowledge/kb_parser_state.py | 34 + src/backend/features/knowledge/kb_vector.py | 149 + .../features/knowledge/kb_vector_state.py | 27 + src/backend/features/knowledge/models.py | 377 ++ .../features/knowledge/parser_chunks.py | 278 + .../features/knowledge/parser_extract.py | 302 ++ .../features/knowledge/parser_semantic.py | 130 + .../features/knowledge/parser_tokens.py | 26 + .../features/knowledge/parser_types.py | 43 + .../knowledge/personal_permissions.py} | 2 +- .../knowledge/personal_request_models.py} | 0 .../knowledge/processing.py} | 193 +- .../knowledge/repository.py} | 4 +- .../knowledge/service.py} | 34 +- .../features/knowledge/vector_client.py | 166 + .../features/knowledge/vector_fields.py | 16 + .../features/knowledge/vector_indexing.py | 204 + .../knowledge}/wiki/__init__.py | 2 +- .../kb => features/knowledge}/wiki/cite.py | 10 +- .../kb => features/knowledge}/wiki/config.py | 2 +- .../kb => features/knowledge}/wiki/dedup.py | 16 +- .../kb => features/knowledge}/wiki/extract.py | 12 +- .../knowledge}/wiki/finalize.py | 17 +- .../kb => features/knowledge}/wiki/jobs.py | 4 +- .../kb => features/knowledge}/wiki/linkify.py | 0 .../kb => features/knowledge}/wiki/llm.py | 10 +- .../features/knowledge/wiki/local_graph.py | 156 + .../knowledge/wiki/local_projection.py | 51 + .../features/knowledge/wiki/local_provider.py | 271 + .../knowledge/wiki/local_provider_state.py | 15 + .../knowledge}/wiki/pipeline.py | 26 +- .../kb => features/knowledge}/wiki/prompts.py | 0 .../kb => features/knowledge}/wiki/reduce.py | 17 +- .../kb => features/knowledge}/wiki/slug.py | 0 .../kb => features/knowledge}/wiki/store.py | 8 +- .../knowledge}/wiki/taxonomy.py | 14 +- .../kb => features/knowledge}/wiki/worker.py | 12 +- .../kb => features/knowledge}/wiki_router.py | 16 +- src/backend/features/marketplace/README.md | 15 + src/backend/features/marketplace/__init__.py | 1 + .../features/marketplace/agent_catalog.py | 119 + .../features/marketplace/agent_categories.py | 38 + .../marketplace/agent_installation.py | 240 + .../features/marketplace/agent_metadata.py | 101 + .../features/marketplace/agent_publishing.py | 165 + .../marketplace/agent_submission_data.py | 155 + .../features/marketplace/agent_submissions.py | 160 + .../marketplace/agent_versions.py} | 31 +- .../features/marketplace/agents_state.py | 14 + .../features/marketplace/api/__init__.py | 1 + .../marketplace/api}/agent_marketplace.py | 28 +- .../marketplace/api}/catalog_ownership.py | 9 +- .../marketplace/api}/marketplace.py | 27 +- .../marketplace/api}/mcp_marketplace.py | 59 +- .../features/marketplace/core_catalog.py | 108 + src/backend/features/marketplace/edition.py | 10 + src/backend/features/marketplace/extension.py | 4 + .../marketplace/mcp_administration.py | 291 ++ .../marketplace/mcp_catalog.py} | 0 .../features/marketplace/mcp_credentials.py | 130 + .../features/marketplace/mcp_curated.py | 127 + .../features/marketplace/mcp_installation.py | 267 + .../features/marketplace/mcp_listing.py | 142 + .../marketplace/mcp_monitor.py} | 41 +- .../features/marketplace/mcp_publishing.py | 193 + .../features/marketplace/mcp_revalidation.py | 146 + src/backend/features/marketplace/mcp_state.py | 17 + .../features/marketplace/mcp_submissions.py | 319 ++ .../features/marketplace/mcp_validation.py | 166 + .../features/marketplace/mcp_versions.py | 221 + src/backend/features/marketplace/models.py | 388 ++ .../features/marketplace/package_source.py | 35 + .../marketplace/personal_listing.py} | 2 +- .../marketplace/personal_visibility.py} | 0 .../marketplace/plugin_market.py} | 63 +- .../features/marketplace/skill_archives.py | 49 + .../features/marketplace/skill_catalog.py | 184 + .../marketplace/skill_installation.py | 199 + .../features/marketplace/skill_metadata.py | 174 + .../features/marketplace/skill_publishing.py | 231 + .../marketplace/skill_submission_data.py | 80 + .../features/marketplace/skill_submissions.py | 190 + .../marketplace/skill_versions.py} | 70 +- .../features/marketplace/skills_state.py | 56 + .../features/marketplace/versions/__init__.py | 1 + .../marketplace/versions/archive.py} | 0 .../marketplace/versions/config.py} | 4 +- .../marketplace/versions/sources.py} | 50 +- .../marketplace/versions/store.py} | 37 +- src/backend/features/sites/README.md | 11 + src/backend/features/sites/__init__.py | 1 + src/backend/features/sites/api/__init__.py | 1 + .../sites/api}/internal_site_auth.py | 0 .../sites/api}/internal_sites.py | 39 +- .../sites/api}/local_site_sources.py | 3 +- .../sites/api}/site_gate.py | 0 .../routes/v1 => features/sites/api}/sites.py | 11 +- .../sites/api}/sites_serve.py | 71 +- .../sites/builtin_upgrade.py} | 29 +- .../sites/desktop_publish.py} | 64 +- src/backend/features/sites/edition.py | 10 + src/backend/features/sites/extension.py | 34 + .../sites/listing.py} | 8 +- .../sites/local_sources.py} | 28 +- .../sites/management.py} | 14 +- .../site.py => features/sites/models.py} | 2 +- .../sites/packaging.py} | 17 +- .../sites/password.py} | 0 .../sites/personal_access.py} | 2 +- .../sites/personal_scope.py} | 0 .../sites/rate_limit.py} | 0 .../site.py => features/sites/repository.py} | 2 +- .../sites/service.py} | 17 +- src/backend/features/sites/tools/__init__.py | 1 + .../sites/tools/design_picker.py} | 46 +- src/backend/features/workbench/README.md | 9 + .../workbench}/__init__.py | 0 .../workbench}/activity.py | 6 +- .../features/workbench/api/__init__.py | 1 + .../workbench/api}/plugin_ui.py | 16 +- .../workbench/api}/workbench.py | 67 +- .../workbench/api}/workbench_activity.py | 38 +- .../api}/workbench_application_config.py | 14 +- .../workbench/api}/workbench_auth.py | 21 +- .../workbench/api}/workbench_capabilities.py | 104 +- .../workbench/api}/workbench_diagnostics.py | 6 +- .../workbench/api}/workbench_events.py | 9 +- .../workbench/api}/workbench_preferences.py | 2 +- .../workbench/api}/workbench_resources.py | 47 +- .../api}/workbench_revision_leases.py | 2 +- .../workbench/api}/workbench_state.py | 2 +- .../workbench/api}/workbench_upgrades.py | 2 +- .../workbench/api}/workbench_workspace.py | 12 +- .../workbench}/application_config.py | 14 +- .../workbench}/application_config_bindings.py | 26 +- .../workbench}/background.py | 124 +- .../workbench}/capabilities.py | 14 +- .../workbench}/catalog.py | 6 +- .../workbench}/coordination.py | 0 .../workbench}/diagnostic_probe.py | 2 +- .../workbench}/diagnostic_resources.py | 0 .../workbench}/diagnostics.py | 2 +- .../workbench}/directory_revision.py | 2 +- src/backend/features/workbench/edition.py | 10 + src/backend/features/workbench/extension.py | 4 + .../workbench}/external.py | 12 +- .../workbench}/external_auth.py | 4 +- .../workbench}/external_boundary.py | 2 +- .../workbench}/external_embed.py | 2 +- .../workbench}/installation_binding.py | 24 +- .../workbench}/local_plugin_upgrades.py | 32 +- .../workbench}/migration.py | 14 +- .../workbench}/migration_compat.py | 25 +- .../workbench}/migration_plan.py | 12 +- .../workbench}/migration_snapshot.py | 10 +- src/backend/features/workbench/models.py | 1 + .../workbench}/origin.py | 0 .../features/workbench/package_source.py | 19 + .../workbench}/plugin_candidate_storage.py | 33 +- .../workbench}/plugin_catalog.py | 10 +- .../workbench}/plugin_revisions.py | 36 +- .../workbench}/plugin_upgrades.py | 26 +- .../workbench}/policy.py | 6 +- .../workbench}/preferences.py | 4 +- .../workbench}/protocol.py | 0 .../features/workbench/resource_deadlines.py | 122 + .../features/workbench/resource_owner.py | 65 + .../workbench}/revocation.py | 54 +- .../workbench}/revocation_sweep.py | 30 +- .../schemas/application.schema.json | 0 .../workbench}/schemas/host.json | 0 .../workbench}/schemas/module.schema.json | 0 .../workbench}/state.py | 8 +- .../workbench}/state_recovery.py | 0 .../workbench}/ui/__init__.py | 0 .../workbench}/ui/contract.py | 2 +- .../workbench}/ui/contributions.py | 20 +- .../workbench}/ui/data_proxy.py | 12 +- .../workbench}/ui/declarations.py | 2 +- .../workbench}/ui/primitives.py | 2 +- .../workbench}/ui/workspace_enabled.py | 0 .../workbench}/workspace_page.py | 4 +- src/backend/hugagent_cli/schema.py | 20 + src/backend/integrations/__init__.py | 8 + src/backend/integrations/api/__init__.py | 1 + .../v1 => integrations/api}/integrations.py | 49 +- src/backend/integrations/channels/README.md | 9 + .../channels/__init__.py | 9 +- .../channels/adapters/__init__.py | 0 .../channels/adapters/dingtalk.py | 325 ++ .../channels/adapters/dingtalk_delivery.py | 213 + .../channels/adapters/dingtalk_history.py | 361 ++ .../channels/adapters/dingtalk_settings.py | 3 + .../integrations/channels/adapters/lark.py | 261 + .../channels/adapters/lark_delivery.py | 152 + .../channels/adapters/lark_messages.py | 317 ++ .../channels/adapters/lark_settings.py | 3 + .../channels/adapters/wecom.py | 2 +- .../channels/adapters/weixin.py | 2 +- .../integrations/channels/api/__init__.py | 1 + .../channels/api}/channel_desktop.py | 39 +- .../channels/api}/channels.py | 46 +- .../channels/desktop_worker.py} | 110 +- .../integrations/channels/extension.py | 7 + src/backend/integrations/channels/inbound.py | 368 ++ .../channels/inbound_attachments.py | 82 + .../integrations/channels/inbound_delivery.py | 118 + .../integrations/channels/inbound_history.py | 157 + .../channels/inbound_observation.py | 168 + .../integrations/channels/inbound_sessions.py | 131 + .../integrations/channels/inbound_state.py | 46 + .../channels/manager.py | 14 +- .../channels/markdown.py | 0 src/backend/integrations/channels/models.py | 133 + .../channels/outbound.py | 72 +- .../channels/protocol.py | 0 .../channels/registry.py | 10 +- .../channels/relay.py} | 4 +- .../channels/relay_dispatch.py} | 98 +- .../channels/relay_rpc.py} | 113 +- .../channels/repository.py} | 2 +- .../channels/service.py} | 242 +- .../integrations/channels/tools/__init__.py | 1 + .../channels/tools/attachment.py} | 163 +- src/backend/integrations/dingtalk/README.md | 5 + src/backend/integrations/dingtalk/__init__.py | 1 + .../integrations/dingtalk/cube_credentials.py | 129 + .../integrations/dingtalk/environment.py | 29 + .../integrations/dingtalk/extension.py | 10 + src/backend/integrations/dingtalk/models.py | 61 + src/backend/integrations/dingtalk/mounts.py | 77 + src/backend/integrations/dingtalk/parsing.py | 105 + .../integrations/dingtalk/repository.py | 39 + src/backend/integrations/dingtalk/sandbox.py | 15 + .../dingtalk/service.py} | 164 +- src/backend/integrations/dingtalk/storage.py | 34 + src/backend/integrations/email/README.md | 5 + src/backend/integrations/email/__init__.py | 1 + .../integrations/email/cube_credentials.py | 53 + src/backend/integrations/email/extension.py | 10 + src/backend/integrations/email/models.py | 65 + src/backend/integrations/email/mounts.py | 72 + src/backend/integrations/email/repository.py | 37 + src/backend/integrations/email/sandbox.py | 14 + .../email/service.py} | 65 +- src/backend/integrations/email/storage.py | 36 + src/backend/integrations/lark/README.md | 5 + src/backend/integrations/lark/__init__.py | 1 + .../integrations/lark/configuration.py | 200 + .../integrations/lark/cube_credentials.py | 90 + src/backend/integrations/lark/extension.py | 10 + src/backend/integrations/lark/login.py | 114 + src/backend/integrations/lark/models.py | 67 + src/backend/integrations/lark/mounts.py | 75 + src/backend/integrations/lark/parsing.py | 141 + src/backend/integrations/lark/process.py | 59 + src/backend/integrations/lark/repository.py | 37 + src/backend/integrations/lark/sandbox.py | 14 + src/backend/integrations/lark/service.py | 189 + src/backend/integrations/lark/state.py | 49 + src/backend/integrations/lark/storage.py | 51 + src/backend/integrations/yida/README.md | 5 + src/backend/integrations/yida/__init__.py | 1 + .../integrations/yida/cube_credentials.py | 152 + .../yida/execution.py} | 4 +- src/backend/integrations/yida/extension.py | 13 + src/backend/integrations/yida/models.py | 1 + src/backend/integrations/yida/mounts.py | 68 + src/backend/integrations/yida/sandbox.py | 18 + .../yida/service.py} | 6 +- .../integrations/yida/skill_content.py | 12 + src/backend/integrations/yida/storage.py | 52 + src/backend/orchestration/__init__.py | 5 +- .../orchestration/automations/__init__.py | 0 .../automation_artifacts.py | 3 +- .../automations/automation_conversation.py | 396 ++ .../automations/automation_delivery.py | 62 + .../automations/automation_dispatch.py | 306 ++ .../automations/automation_lease.py | 113 + .../automations/automation_recovery.py | 39 + .../automations/automation_scheduler.py | 136 + .../orchestration/chat_run_executor.py | 4651 ----------------- src/backend/orchestration/citation_anchor.py | 551 -- .../orchestration/commands/__init__.py | 1 - src/backend/orchestration/commands/runtime.py | 262 - src/backend/orchestration/configuration.py | 6 + .../orchestration/local_plugin_sidecars.py | 75 - src/backend/orchestration/loops/__init__.py | 0 src/backend/orchestration/loops/admission.py | 122 + .../{autonomous_loop.py => loops/driver.py} | 26 +- .../{loop_planner.py => loops/planner.py} | 14 +- .../orchestration/loops/presentation.py | 71 + src/backend/orchestration/loops/recovery.py | 93 + .../requirements.py} | 59 +- .../loop_reviewer.py => loops/reviewer.py} | 161 +- src/backend/orchestration/loops/run.py | 509 ++ .../orchestration/memory_integration.py | 576 -- src/backend/orchestration/pending.py | 36 + src/backend/orchestration/plans/__init__.py | 0 src/backend/orchestration/plans/admission.py | 171 + .../orchestration/plans/execute_run.py | 338 ++ .../orchestration/plans/generate_run.py | 278 + .../{subagents/plan_mode.py => plans/mode.py} | 272 +- .../schedulers/automation_conversation.py | 307 -- .../schedulers/automation_dispatch.py | 279 - .../schedulers/automation_lease.py | 58 - .../schedulers/automation_recovery.py | 45 - .../schedulers/automation_scheduler.py | 330 -- src/backend/orchestration/streaming.py | 999 ---- .../orchestration/subagents/__init__.py | 2 - .../subagents/ontology_reviewer.py | 656 --- .../{schedulers => workers}/__init__.py | 0 .../{schedulers => workers}/_worker_base.py | 12 +- .../workers}/edition_startup.py | 0 .../evolution_scheduler.py | 4 +- .../memory_ttl_scheduler.py | 6 +- .../persona_distill_worker.py | 6 +- .../orchestration/workers/run_recovery.py | 37 + src/backend/orchestration/workflow.py | 3463 ------------ src/backend/personal_agent/README.md | 2 +- src/backend/personal_agent/access.py | 2 +- .../personal_agent/api/conversation.py | 2 +- src/backend/personal_agent/api/sessions.py | 11 +- src/backend/personal_agent/background.py | 8 +- .../personal_agent/channels/channel_bridge.py | 64 +- .../personal_agent/computer/computer.py | 5 +- .../personal_agent/computer/devices.py | 45 +- .../personal_agent/computer/driver_install.py | 2 +- .../personal_agent/computer/live_stream.py | 27 +- .../personal_agent/computer/sandbox.py | 42 +- .../computer/screenshot_pruning.py | 72 +- .../conversation/conversations.py | 3 +- .../personal_agent/conversation/front.py | 41 +- .../personal_agent/delivery/delivery.py | 4 +- .../personal_agent/device_link/README.md | 3 + .../device_link/__init__.py | 2 +- .../device_link/driver.py | 0 .../device_link/local_api.py | 0 .../device_link/runner.py | 6 +- .../device_link/store.py | 0 src/backend/personal_agent/extension.py | 26 +- .../personal_agent/identity/capabilities.py | 8 +- src/backend/personal_agent/identity/config.py | 2 +- .../personal_agent/identity/service.py | 2 +- .../personal_agent/scheduling/schedules.py | 2 +- .../personal_agent/sessions/session_auth.py | 43 +- .../personal_agent/sessions/session_cloud.py | 89 +- .../sessions/session_manager.py | 151 +- .../personal_agent/sessions/session_tool.py | 37 +- .../personal_agent/sessions/session_watch.py | 2 +- .../personal_agent/tasks/attachments.py | 10 +- src/backend/personal_agent/tasks/runtime.py | 90 +- src/backend/personal_agent/tasks/service.py | 2 +- src/backend/personal_agent/tasks/steering.py | 6 +- .../personal_agent/tasks/task_threads.py | 6 +- src/backend/personal_agent/tasks/worker.py | 182 +- src/backend/personal_agent/tools/email.py | 5 +- .../personal_agent/tools/front_tools.py | 52 +- src/backend/personal_agent/tools/responses.py | 4 +- src/backend/personal_agent/tools/tools.py | 49 +- .../personal_agent/workspace/dream_plan.py | 4 +- .../personal_agent/workspace/dreaming.py | 8 +- .../personal_agent/workspace/prompting.py | 7 +- src/backend/prompts/desktop_templates.py | 5 +- src/backend/prompts/desktop_workspace.py | 6 +- src/backend/prompts/kb_lite_section.py | 4 +- src/backend/prompts/project_section.py | 7 +- src/backend/prompts/prompt_runtime.py | 20 +- src/backend/prompts/system_builder.py | 13 +- src/backend/scripts/_loop_convergence_unit.py | 147 - src/backend/scripts/_loop_db_resume_unit.py | 92 - .../scripts/_loop_evaluator_route_unit.py | 88 - src/backend/scripts/_loop_integration_test.py | 88 - src/backend/scripts/_loop_llmeval_smoke.py | 48 - src/backend/scripts/_loop_preflight.py | 73 - src/backend/scripts/_loop_selfverify_smoke.py | 66 - src/backend/scripts/_loop_smoke.py | 90 - src/backend/scripts/_loop_test_edgebench.py | 99 - src/backend/scripts/backend_entrypoint.sh | 4 +- src/backend/scripts/desktop_cloud_wrapper.py | 76 - src/backend/scripts/desktop_fixture_mcp.py | 50 - src/backend/scripts/dual_mode_e2e.py | 947 ---- src/backend/scripts/edgebench/ann_judge.py | 136 - .../scripts/edgebench/perm_opt_judge.py | 88 - src/backend/scripts/edit_chat_message.py | 198 - src/backend/scripts/evaluation_sandbox_e2e.py | 89 - src/backend/scripts/export_content.py | 317 -- .../scripts/harness_fault_injection.py | 637 --- src/backend/scripts/import_cherry_agents.py | 372 -- src/backend/scripts/import_content.py | 379 -- .../scripts/run_evolution_benchmark.py | 308 -- src/backend/scripts/run_evolution_llm_ab.py | 621 --- src/backend/scripts/workbench_migration.py | 66 - src/backend/tests/_capability_index.py | 11 +- .../tests/api/api_routes_v1_selftest.py | 2 +- src/backend/tests/api/catalog_api_selftest.py | 9 +- src/backend/tests/api/chat_fork_fixtures.py | 6 +- src/backend/tests/api/test_agent_api_keys.py | 9 +- .../api/test_agent_response_admission.py | 100 +- .../tests/api/test_agent_response_scope.py | 24 +- src/backend/tests/api/test_agent_responses.py | 14 +- .../test_api_key_run_lifecycle_postgres.py | 6 +- src/backend/tests/api/test_archive_files.py | 6 +- src/backend/tests/api/test_archive_safety.py | 4 +- .../tests/api/test_artifacts_backfill_once.py | 4 +- .../tests/api/test_cancel_continue_e2e.py | 34 +- .../tests/api/test_catalog_event_loop.py | 27 +- .../api/test_chat_connector_selection.py | 4 +- .../api/test_chat_event_loop_performance.py | 8 +- .../tests/api/test_chat_fork_derived_data.py | 5 +- src/backend/tests/api/test_chat_forks.py | 13 +- .../tests/api/test_chat_reference_api.py | 4 +- .../tests/api/test_chat_rerun_options.py | 22 +- .../api/test_chat_rerun_start_failure.py | 10 +- .../tests/api/test_chat_run_steer_api.py | 9 +- .../tests/api/test_chat_stream_sequencer.py | 61 +- .../tests/api/test_chat_thinking_mode.py | 4 +- .../tests/api/test_cross_turn_file_access.py | 10 +- .../tests/api/test_deep_folder_repair.py | 2 +- .../tests/api/test_evaluation_sandboxes.py | 2 +- src/backend/tests/api/test_file_location.py | 2 +- .../tests/api/test_file_open_browser_e2e.py | 4 +- .../tests/api/test_loop_cancel_scope.py | 41 + src/backend/tests/api/test_me_system.py | 2 +- .../api/test_model_reasoning_settings.py | 2 + .../tests/api/test_page_config_backfill.py | 6 +- .../tests/api/test_plugin_delete_isolation.py | 4 +- .../tests/api/test_project_environments.py | 7 +- src/backend/tests/api/test_public_chats.py | 42 +- .../auth/test_auth_dependencies_off_loop.py | 176 + .../tests/auth/test_bearer_identity.py | 180 + .../tests/browser_automation_server.py | 81 +- .../test_credential_continuity.py | 189 - .../ce_release/test_ce_api_key_lifecycle.py | 8 +- .../ce_release/test_ce_history_display.py | 2 +- .../ce_release/test_ce_release_regressions.py | 159 +- .../tests/ce_release/test_ce_tool_media.py | 8 +- .../test_desktop_capability_wiring.py | 6 +- .../ce_release/test_personal_agent_ce.py | 12 +- .../test_workbench_migration_snapshot.py | 6 +- src/backend/tests/chat/test_display_bounds.py | 2 +- .../tests/chat/test_quoted_follow_up.py | 93 + src/backend/tests/chat/test_sidebar_order.py | 14 +- .../chat/test_snapshot_transaction_cleanup.py | 23 + .../tests/chat/test_user_questions_api.py | 35 +- src/backend/tests/conftest.py | 48 +- .../tests/content/artifacts_selftest.py | 4 +- src/backend/tests/content/catalog_selftest.py | 5 +- .../tests/content/content_blocks_selftest.py | 2 +- .../tests/content/security_selftest.py | 28 +- .../content/test_artifact_default_path.py | 24 + .../content/test_artifact_record_store.py | 4 +- .../content/test_artifact_storage_keys.py | 10 +- src/backend/tests/content/test_extra_files.py | 42 +- .../tests/content/test_file_preview.py | 72 +- .../tests/content/test_local_file_location.py | 6 +- .../content/test_office_preview_cache.py | 6 +- .../test_storage_existence_is_strict.py | 6 +- .../runs/test_automation_journal_guard.py | 89 + src/backend/tests/db_support.py | 43 + .../tests/e2e/_e2e_regression_smoke.py | 2 +- src/backend/tests/e2e/agentscope_poc.py | 2 +- src/backend/tests/e2e/core_external_server.py | 4 +- src/backend/tests/e2e/core_refactor_server.py | 2 +- src/backend/tests/e2e/model_tests.py | 4 +- src/backend/tests/evolution/conftest.py | 2 +- .../test_benchmark_and_activation.py | 24 +- .../evolution/test_candidate_reasoning.py | 32 +- .../evolution/test_cassette_and_replay.py | 4 +- .../tests/evolution/test_compiler_v2.py | 73 +- .../evolution/test_console_and_metrics.py | 8 +- .../tests/evolution/test_credit_assigner.py | 2 +- .../evolution/test_engines_end_to_end.py | 71 +- .../tests/evolution/test_episode_assembler.py | 32 +- .../test_experiments_and_federation.py | 4 +- .../tests/evolution/test_exposure_and_ramp.py | 9 +- .../evolution/test_fault_injection_gate.py | 4 +- .../tests/evolution/test_mechanisms.py | 6 +- .../tests/evolution/test_ontology_bridge.py | 2 +- .../evolution/test_outcomes_and_backfill.py | 6 +- .../tests/evolution/test_personal_approval.py | 61 +- .../test_personal_cycle_and_prefs.py | 20 +- .../evolution/test_policies_and_memory_ops.py | 67 +- .../tests/evolution/test_promotion_chain.py | 98 +- .../evolution/test_react_intervention.py | 29 +- .../tests/evolution/test_readiness_gate.py | 18 +- .../tests/evolution/test_realistic_corpus.py | 46 +- .../evolution/test_release_state_machine.py | 2 +- .../tests/evolution/test_runtime_binding.py | 8 +- .../tests/evolution/test_settlement.py | 2 +- .../tests/evolution/test_settlement_runner.py | 4 +- .../evolution/test_skill_selection_record.py | 6 +- src/backend/tests/evolution/test_sop_judge.py | 2 +- .../tests/evolution/test_three_engines.py | 59 +- src/backend/tests/evolution/test_trigger.py | 9 +- .../tests/evolution/test_turn_card_edits.py | 4 +- .../tests/evolution/test_user_contribution.py | 72 +- src/backend/tests/features/__init__.py | 1 + .../tests/features/automation/__init__.py | 1 + .../tests/features/automation/run_fixtures.py | 15 + .../test_automation_delivery_deadline.py | 179 + .../test_automation_execution_location.py | 94 +- .../automation/test_automation_lease_close.py | 199 + .../test_automation_manual_trigger.py | 81 + .../test_automation_notifications.py | 2 +- .../test_automation_oneshot_finalize.py | 49 + .../test_automation_ownership_postgres.py | 173 + .../test_automation_remote_effect.py | 64 +- .../test_automation_run_ownership.py | 256 + .../test_delivery_target_migration.py | 31 + .../automation/test_durable_admission.py | 96 + .../automation}/test_loop_service_harness.py | 2 +- .../automation/test_queue_postgres.py | 94 + .../tests/features/desktop/__init__.py | 1 + .../features/desktop/capabilities/__init__.py | 1 + .../desktop}/capabilities/_cloud_identity.py | 0 .../desktop}/capabilities/conftest.py | 36 +- .../capabilities/management_browser_server.py | 17 +- .../capabilities/runtime_recovery_support.py | 19 +- .../test_account_authorization.py | 30 +- .../capabilities/test_agent_rerun_identity.py | 83 +- .../capabilities/test_agent_runtime_grants.py | 22 +- .../capabilities/test_agents_plugins.py | 42 +- .../test_autonomous_loop_scopes.py | 95 +- .../capabilities/test_available_runtime.py | 65 +- .../test_capability_change_sync.py | 56 +- .../test_catalog_cloud_only_in_hybrid.py | 41 +- .../test_catalog_plugin_components_hidden.py | 8 +- .../capabilities/test_change_merge.py | 4 +- .../capabilities/test_change_signal.py | 2 +- .../capabilities/test_cloud_identity.py | 2 +- .../capabilities/test_cloud_management.py | 17 +- .../test_cloud_parallel_preparation.py | 33 +- .../test_cloud_plugin_binding_runtime.py | 32 +- .../capabilities/test_cloud_sticky_plugins.py | 52 +- .../capabilities/test_cloud_workcopies.py | 25 +- .../desktop}/capabilities/test_core_layers.py | 13 +- .../test_credential_continuity.py | 193 + .../capabilities/test_dependency_closure.py | 53 +- .../test_desktop_capabilities_api.py | 52 +- .../test_desktop_content_safety.py | 67 +- .../test_desktop_declaration_export.py | 21 +- .../test_desktop_model_reasoning_safety.py | 21 +- .../test_desktop_resource_plugins.py | 28 +- .../test_desktop_token_security.py | 36 +- .../capabilities/test_desktop_warmup.py | 28 +- .../capabilities/test_device_api_contract.py | 58 +- .../test_device_catalog_projection.py | 34 +- .../test_dynamic_model_epoch_cache.py | 28 +- .../test_explicit_desktop_invocation.py | 27 +- .../test_gateway_invocation_proof.py | 16 +- .../test_gateway_unknown_outcome.py | 52 +- .../capabilities/test_hybrid_owned_plugins.py | 22 +- .../test_initial_sync_readiness.py | 30 +- .../test_junction_windows_paths.py | 10 +- .../capabilities/test_loader_store_mode.py | 34 +- .../test_local_folder_discovery.py | 4 +- .../test_local_management_migration.py | 22 +- .../test_local_skill_projection.py | 17 +- .../capabilities/test_management_readiness.py | 26 +- .../capabilities/test_management_tools.py | 61 +- .../capabilities/test_manager_lifecycle.py | 8 +- .../capabilities/test_manager_regressions.py | 29 +- .../capabilities/test_manifest_order.py | 32 +- .../capabilities/test_manifest_tool_schema.py | 27 +- .../desktop}/capabilities/test_mcp_json.py | 2 +- .../capabilities/test_mcp_json_consistency.py | 2 +- .../capabilities/test_memory_epoch_cache.py | 31 +- .../desktop}/capabilities/test_migration.py | 9 +- .../test_migration_preservation.py | 5 +- .../test_model_credential_reference.py | 13 +- .../test_model_error_diagnostics.py | 6 +- .../test_owned_connector_assembly.py | 38 +- .../test_partial_session_availability.py | 33 +- .../capabilities/test_plugin_connections.py | 12 +- .../capabilities/test_plugin_device_assets.py | 10 +- .../test_prepare_lock_not_held_over_io.py | 2 +- .../capabilities/test_progressive_plugins.py | 166 +- .../test_runtime_frozen_bindings.py | 142 +- .../test_runtime_publication_recovery.py | 120 +- .../capabilities/test_runtime_recovery.py | 72 +- .../test_runtime_scope_consumers.py | 40 +- .../capabilities/test_runtime_scopes.py | 104 +- .../test_runtime_selection_recovery.py | 99 +- .../test_runtime_session_recovery.py | 103 +- .../test_selection_dependency_sources.py | 36 +- .../capabilities/test_selection_readiness.py | 14 +- .../capabilities/test_store_file_integrity.py | 19 +- .../test_toolkit_runtime_alias.py | 40 +- .../capabilities/test_user_facing_errors.py | 11 +- .../capabilities/test_view_os_errors.py | 7 +- .../test_workbench_local_upgrades.py | 16 +- .../desktop}/desktop_login_browser_server.py | 6 +- .../tests/features/desktop/index_fixtures.py | 13 + .../features/desktop/observability_cases_1.py | 312 ++ .../features/desktop/observability_cases_2.py | 270 + .../features/desktop/observability_support.py | 32 + .../desktop}/run_desktop_browser_e2e.py | 2 +- .../desktop}/test_desktop_auth.py | 4 +- .../desktop}/test_desktop_bridge.py | 26 +- .../desktop}/test_desktop_capability.py | 101 +- .../test_desktop_capability_models.py | 27 +- .../desktop}/test_desktop_cloud_skills.py | 70 +- .../desktop}/test_desktop_device_login.py | 9 +- .../test_desktop_memory_persistence.py | 8 +- .../desktop}/test_desktop_model_gateway.py | 45 +- .../desktop/test_desktop_observability.py | 20 + ...op_observability_authenticated_delivery.py | 54 +- .../test_desktop_observability_delivery.py | 64 +- .../desktop}/test_desktop_release_events.py | 4 +- .../desktop}/test_desktop_sync_locking.py | 34 +- .../desktop}/test_desktop_updates.py | 4 +- .../desktop}/test_local_file_actions.py | 20 +- .../desktop}/test_local_grant_service.py | 2 +- .../desktop}/test_local_snapshot_service.py | 2 +- .../tests/features/evaluation/__init__.py | 1 + .../tests/features/evaluation/conftest.py | 9 + .../evaluation}/test_evaluation_admission.py | 4 +- .../evaluation}/test_evaluation_binding.py | 2 +- .../evaluation}/test_evaluation_factory.py | 15 +- .../test_evaluation_process_guard.py | 2 +- .../evaluation}/test_evaluation_provider.py | 10 +- .../evaluation}/test_evaluation_router.py | 38 +- .../evaluation}/test_evaluation_runtime.py | 36 +- .../evaluation}/test_evaluation_service.py | 7 +- .../tests/features/hosted_apps/__init__.py | 1 + .../application_hosting_support.py | 21 +- .../test_application_agent_contract.py | 14 +- .../test_application_collections.py | 18 +- .../hosted_apps}/test_application_desktop.py | 69 +- .../hosted_apps}/test_application_export.py | 2 +- .../hosted_apps}/test_application_hosting.py | 42 +- .../test_application_personal_mcp.py | 32 +- .../test_application_project_tools.py | 16 +- .../hosted_apps}/test_application_projects.py | 9 +- .../test_application_retirement.py | 10 +- .../hosted_apps}/test_hosting_remediation.py | 28 +- .../hosted_apps/test_schema_lifecycle.py | 60 + .../tests/features/knowledge/__init__.py | 1 + .../knowledge/kb_multimodal_assets_cases_1.py | 353 ++ .../knowledge/kb_multimodal_assets_cases_2.py | 120 + .../knowledge/kb_multimodal_assets_support.py | 235 + .../knowledge/kb_wiki_end_to_end_cases_1.py | 349 ++ .../knowledge/kb_wiki_end_to_end_cases_2.py | 175 + .../knowledge/kb_wiki_end_to_end_support.py | 197 + .../knowledge/test_host_contributions.py | 68 + .../knowledge}/test_kb_backend_routing.py | 59 +- .../knowledge}/test_kb_document_status.py | 7 +- .../knowledge}/test_kb_index_queue.py | 5 +- .../knowledge}/test_kb_index_worker.py | 12 +- .../knowledge/test_kb_multimodal_assets.py | 37 + .../knowledge}/test_kb_vector_safety.py | 51 +- .../knowledge}/test_kb_vector_timeouts.py | 27 +- .../knowledge/test_kb_wiki_end_to_end.py | 31 + .../knowledge}/test_kb_wiki_pipeline.py | 24 +- .../tests/features/marketplace/__init__.py | 1 + .../marketplace/mcp_marketplace_cases_1.py | 432 ++ .../marketplace/mcp_marketplace_cases_2.py | 460 ++ .../marketplace/mcp_marketplace_cases_3.py | 457 ++ .../marketplace/mcp_marketplace_cases_4.py | 418 ++ .../marketplace/mcp_marketplace_support.py | 275 + .../marketplace}/test_agent_marketplace.py | 49 +- .../marketplace}/test_marketplace_service.py | 83 +- .../test_marketplace_submission.py | 90 +- .../marketplace/test_mcp_marketplace.py | 69 + .../marketplace/test_oauth_sdk2_contract.py | 114 + src/backend/tests/features/sites/__init__.py | 1 + src/backend/tests/features/sites/conftest.py | 2 + .../sites}/test_cloud_site_publish.py | 38 +- .../sites}/test_design_pick.py | 2 +- .../sites}/test_desktop_site_paths.py | 20 +- .../sites}/test_local_project_site_publish.py | 18 +- .../sites}/test_local_site_sources.py | 56 +- .../sites}/test_site_access_password.py | 21 +- .../sites}/test_site_contention_postgres.py | 17 +- .../sites}/test_site_listing.py | 19 +- .../sites}/test_site_plugin_upgrade.py | 40 +- .../sites}/test_site_rate_limit.py | 2 +- .../test_execution_identity_contract.py | 44 + .../tests/features/test_host_runtime.py | 18 + .../tests/features/test_installed_modules.py | 63 + .../features/test_run_capability_host.py | 15 + .../tests/features/workbench/__init__.py | 1 + .../workbench}/test_plugin_ui_contract.py | 10 +- .../workbench}/test_plugin_ui_routes.py | 8 +- .../test_workbench_activity_routes.py | 13 +- .../test_workbench_actual_process_observer.py | 4 +- .../test_workbench_application_config_http.py | 12 +- .../test_workbench_approval_lease_http.py | 16 +- .../workbench}/test_workbench_auth_routes.py | 12 +- .../test_workbench_background_subpage_http.py | 8 +- .../test_workbench_candidate_storage.py | 12 +- .../test_workbench_capability_routes.py | 11 +- .../test_workbench_closing_isolation_http.py | 14 +- .../test_workbench_cookie_boundaries.py | 2 +- .../workbench}/test_workbench_coordination.py | 2 +- .../test_workbench_diagnostic_failure_http.py | 6 +- .../workbench}/test_workbench_diagnostics.py | 9 +- .../workbench}/test_workbench_embed_routes.py | 2 +- .../test_workbench_external_routes.py | 5 +- .../workbench}/test_workbench_invalidation.py | 14 +- .../workbench}/test_workbench_migration.py | 8 +- .../test_workbench_migration_auth_gate.py | 6 +- .../test_workbench_observer_paths.py | 2 +- ...st_workbench_official_capabilities_http.py | 4 +- .../workbench}/test_workbench_origins.py | 10 +- .../test_workbench_plugin_routes.py | 9 +- .../test_workbench_preferences_routes.py | 9 +- .../workbench}/test_workbench_protocol.py | 8 +- .../test_workbench_provider_scope_http.py | 4 +- ...est_workbench_resource_owner_migrations.py | 2 +- .../workbench}/test_workbench_resources.py | 58 +- .../test_workbench_revocation_failure_http.py | 30 +- .../test_workbench_routing_routes.py | 4 +- .../test_workbench_state_binding.py | 2 +- .../test_workbench_state_concurrency.py | 6 +- .../workbench}/test_workbench_state_routes.py | 6 +- .../test_workbench_upgrade_routes.py | 4 +- .../workbench_capabilities_http_fixture.py | 6 +- .../workbench_diagnostic_http_fixture.py | 2 +- .../workbench_embed_http_fixture.py | 2 +- .../workbench}/workbench_http_fixture.py | 2 +- .../workbench_observed_runner_fixture.py | 4 +- .../workbench}/workbench_observer_paths.py | 2 +- .../workbench_overflow_http_fixture.py | 2 +- .../workbench_plugin_http_fixture.py | 2 +- .../workbench}/workbench_plugin_support.py | 0 .../workbench}/workbench_resource_observer.py | 6 +- .../workbench_routing_http_fixture.py | 2 +- src/backend/tests/infra/test_byte_range.py | 56 + src/backend/tests/infra/test_core_cleanup.py | 23 +- .../infra/test_db_off_loop_call_sites.py | 115 + .../tests/infra/test_db_thread_budget.py | 120 + .../infra/test_no_session_on_event_loop.py | 100 + .../integration/background_command_server.py | 13 +- .../integration/job_agent_local_smoke.py | 15 +- .../tests/integration/job_local_smoke.py | 18 +- .../tests/integration/job_managed_smoke.py | 12 +- src/backend/tests/integrations/__init__.py | 1 + .../tests/integrations/channels/__init__.py | 1 + .../integrations/channels/bot_cases_1.py | 383 ++ .../integrations/channels/bot_cases_2.py | 362 ++ .../integrations/channels/bot_cases_3.py | 374 ++ .../integrations/channels/bot_cases_4.py | 383 ++ .../integrations/channels/bot_cases_5.py | 388 ++ .../integrations/channels/bot_cases_6.py | 145 + .../integrations/channels/bot_support.py | 187 + .../channels/test_adapter_method_binding.py | 16 + .../channels/test_channel_bots.py | 115 + .../channels}/test_channel_bots_api.py | 8 +- .../channels}/test_channel_desktop_e2e.py | 54 +- .../channels}/test_channel_desktop_http.py | 48 +- .../test_channel_desktop_migration.py | 2 +- .../channels}/test_channel_desktop_relay.py | 13 +- .../test_channel_desktop_relay_api.py | 36 +- .../channels}/test_channel_desktop_worker.py | 50 +- .../test_channel_receiver_lifecycle.py | 10 +- .../test_weixin_connection_health.py | 11 +- .../channels}/test_weixin_qr_protocol.py | 7 +- .../dingtalk}/test_dingtalk_integration.py | 51 +- .../email}/test_email_integration.py | 70 +- .../integrations/lark/test_app_lifecycle.py | 48 + .../lark}/test_lark_auth_status.py | 39 +- .../yida}/test_yida_integration.py | 29 +- src/backend/tests/llm/command_test_support.py | 15 +- .../tests/llm/e2e_multiturn_toolcall.py | 4 +- ...le_context_hook_user_id_gating_selftest.py | 8 +- .../tests/llm/local_project_test_support.py | 29 +- src/backend/tests/llm/mcp_env_debug.py | 6 +- .../tests/llm/test_agent_api_execution.py | 15 +- .../tests/llm/test_agent_api_runtime.py | 51 +- .../tests/llm/test_api_protocol_backfill.py | 8 +- src/backend/tests/llm/test_approval_modes.py | 24 +- src/backend/tests/llm/test_artifact_refs.py | 2 +- .../tests/llm/test_ask_user_question_tool.py | 14 +- .../tests/llm/test_bash_process_tools.py | 23 +- .../tests/llm/test_builtin_subagents.py | 19 +- .../tests/llm/test_cancelled_replay.py | 2 +- .../tests/llm/test_chat_history_tool.py | 18 +- .../tests/llm/test_chat_model_stream_retry.py | 8 +- src/backend/tests/llm/test_compaction.py | 2 +- src/backend/tests/llm/test_compaction_e2e.py | 14 +- .../tests/llm/test_compaction_integration.py | 22 +- .../tests/llm/test_compaction_mid_turn.py | 35 +- .../tests/llm/test_compaction_observation.py | 16 +- .../tests/llm/test_compaction_progress.py | 56 +- .../llm/test_compaction_summary_requests.py | 6 +- .../tests/llm/test_compaction_watermark.py | 38 +- .../llm/test_configured_reasoning_effort.py | 10 +- src/backend/tests/llm/test_context_adapter.py | 26 +- src/backend/tests/llm/test_context_ir.py | 8 +- .../llm/test_context_order_user_input.py | 16 +- src/backend/tests/llm/test_context_probe.py | 4 +- src/backend/tests/llm/test_context_safety.py | 28 +- .../tests/llm/test_context_step_units.py | 25 +- .../llm/test_context_usage_adversarial.py | 10 +- .../tests/llm/test_context_usage_snapshot.py | 13 +- src/backend/tests/llm/test_delta_coalescer.py | 145 + .../tests/llm/test_execution_manifest.py | 10 +- .../llm/test_execution_surface_limits.py | 37 +- .../llm/test_execution_surface_snapshot.py | 24 +- .../tests/llm/test_failover_context_safety.py | 8 +- ...st_file_context_offloads_blocking_parse.py | 25 +- .../tests/llm/test_file_context_preview.py | 18 +- .../llm/test_live_approval_integration.py | 8 +- .../tests/llm/test_live_approval_repair.py | 30 +- .../tests/llm/test_local_bash_permission.py | 52 +- .../llm/test_local_confinement_contract.py | 11 +- .../tests/llm/test_local_file_permission.py | 46 +- .../tests/llm/test_local_myspace_block.py | 2 +- .../tests/llm/test_local_project_cwd.py | 59 +- .../tests/llm/test_local_project_delivery.py | 73 +- .../tests/llm/test_local_project_pin.py | 80 +- .../tests/llm/test_local_session_reference.py | 32 +- .../tests/llm/test_manifest_mcp_client.py | 27 +- src/backend/tests/llm/test_mcp_factory_e2e.py | 88 + .../tests/llm/test_mcp_human_wait_timeout.py | 271 + .../tests/llm/test_mcp_native_adversarial.py | 219 + .../tests/llm/test_mcp_native_capabilities.py | 169 + .../tests/llm/test_mcp_parallel_execution.py | 36 +- src/backend/tests/llm/test_mcp_pool_cache.py | 203 - .../tests/llm/test_mcp_runtime_pool.py | 272 + .../tests/llm/test_mcp_session_ownership.py | 128 + src/backend/tests/llm/test_mcp_timeouts.py | 32 +- .../llm/test_migration_vendor_datasource.py | 114 + src/backend/tests/llm/test_model_failover.py | 27 +- src/backend/tests/llm/test_model_steps.py | 26 +- .../tests/llm/test_model_usage_extraction.py | 2 +- .../llm/test_model_usage_scope_teardown.py | 2 +- src/backend/tests/llm/test_offloader.py | 40 +- src/backend/tests/llm/test_openai_provider.py | 14 +- .../llm/test_permission_ticket_isolation.py | 21 +- .../llm/test_plan_update_tool_description.py | 10 +- .../llm/test_post_turn_measured_compaction.py | 14 +- .../llm/test_project_environment_factory.py | 32 +- .../llm/test_project_environment_policy.py | 14 +- src/backend/tests/llm/test_protocol_probe.py | 8 +- .../tests/llm/test_read_image_native.py | 26 +- .../tests/llm/test_reasoning_budget.py | 6 +- .../llm/test_reasoning_echo_formatter.py | 4 +- src/backend/tests/llm/test_reasoning_probe.py | 2 +- .../tests/llm/test_reasoning_replay_policy.py | 10 +- .../llm/test_reasoning_retained_in_history.py | 8 +- .../llm/test_responses_reasoning_replay.py | 7 +- .../llm/test_responses_thinking_stream.py | 94 +- .../tests/llm/test_responses_tool_call_id.py | 20 +- .../llm/test_sandbox_session_resolution.py | 8 +- .../llm/test_selected_model_context_window.py | 27 +- .../llm/test_shared_human_interactions.py | 8 +- .../tests/llm/test_single_turn_protocol.py | 2 +- .../tests/llm/test_stream_wrapper_cleanup.py | 30 + .../llm/test_structured_reasoning_flag.py | 4 +- .../tests/llm/test_subagent_cancellation.py | 25 +- .../tests/llm/test_subagent_model_config.py | 17 +- src/backend/tests/llm/test_subagent_resume.py | 10 +- .../tests/llm/test_subagent_tool_streaming.py | 17 +- src/backend/tests/llm/test_system_reminder.py | 7 +- .../test_thinking_modes_across_protocols.py | 10 +- .../tests/llm/test_tool_call_identity.py | 2 +- .../tests/llm/test_tool_media_no_disk.py | 10 +- .../llm/test_tool_permission_hardening.py | 17 +- .../tests/llm/test_tool_permissions.py | 43 +- .../tests/llm/test_tool_result_images.py | 46 +- src/backend/tests/llm/test_vendor_timeouts.py | 4 +- src/backend/tests/llm/test_vision_bridge.py | 20 +- .../tests/llm/test_vision_bridge_e2e.py | 6 +- .../tests/llm/test_vision_injection.py | 76 +- .../tests/llm/test_vision_progress_events.py | 44 +- .../tests/llm/test_vision_role_capability.py | 7 +- src/backend/tests/llm/test_workspace.py | 13 +- .../tests/llm/test_workspace_profiles.py | 99 +- src/backend/tests/llm/tool_call_debug.py | 4 + .../tests/llm/vision_fullstack_check.py | 4 +- src/backend/tests/llm/vision_live_check.py | 12 +- .../tests/llm/vision_role_live_check.py | 10 +- src/backend/tests/mcp/test_internet_search.py | 12 +- .../tests/mcp/test_wiki_tool_gating.py | 13 +- .../tests/mcp_servers/test_search_batch.py | 28 +- .../tests/mcp_servers/test_web_fetch.py | 3 +- .../tests/memory/outbox_test_support.py | 3 +- .../test_ce_overlay_memory_contracts.py | 41 +- src/backend/tests/memory/test_graph_memory.py | 22 +- .../memory/test_identity_frozen_block.py | 6 +- .../tests/memory/test_mem0_real_lifecycle.py | 1 + .../tests/memory/test_memory_outbox.py | 4 +- .../memory/test_memory_outbox_receipts.py | 8 +- .../memory/test_memory_outbox_recovery.py | 16 +- .../memory/test_memory_retrieval_lifecycle.py | 36 +- .../memory/test_session_frozen_snapshot.py | 34 +- .../misc/chat_metadata_merge_selftest.py | 2 +- src/backend/tests/misc/conftest.py | 15 +- src/backend/tests/misc/test_identity_dedup.py | 2 +- .../tests/ontology/test_ontology_reviewer.py | 40 +- .../ontology/test_ontology_revision_accept.py | 10 +- .../test_ontology_workflow_evidence.py | 17 +- .../agent_mention_parse_selftest.py | 2 +- .../orchestration/automation_test_support.py | 17 + .../orchestration/command_test_support.py | 2 +- .../tests/orchestration/hook_support.py | 53 + .../orchestration/recovery_test_support.py | 17 +- .../orchestration/router_strategy_selftest.py | 2 +- .../orchestration/routing_import_selftest.py | 2 +- .../orchestration/stream_protocol_selftest.py | 7 +- .../streaming_tool_call_dedupe_selftest.py | 15 +- .../orchestration/test_agent_api_recovery.py | 40 +- .../test_agent_runtime_resources.py | 20 + .../test_agentscope_hook_adapter.py | 31 +- .../test_automation_admission.py | 50 +- .../orchestration/test_automation_handoff.py | 50 +- .../test_automation_live_conversations.py | 125 +- .../orchestration/test_automation_reaper.py | 4 +- .../test_automation_unbounded.py | 65 +- .../test_autonomous_loop_driver.py | 12 +- .../orchestration/test_background_commands.py | 87 +- .../test_chat_resume_checkpoint.py | 18 +- .../test_chat_run_cancel_persistence.py | 57 +- .../test_chat_run_follow_recovery.py | 104 +- .../orchestration/test_chat_run_human_wait.py | 24 +- .../orchestration/test_chat_run_recovery.py | 37 +- .../test_chat_run_restart_recovery.py | 89 +- .../test_chat_run_worker_recovery.py | 56 +- .../tests/orchestration/test_chat_steer.py | 104 +- .../orchestration/test_command_events.py | 61 +- .../orchestration/test_command_recovery.py | 158 +- .../test_command_worker_lifecycle.py | 18 +- .../orchestration/test_context_budget_stop.py | 41 +- .../orchestration/test_context_provenance.py | 11 +- .../test_context_stats_finalization_race.py | 6 +- .../test_direct_subagent_routing.py | 79 +- .../test_event_offset_fencing.py | 11 +- .../test_execution_manifest_binding.py | 128 +- .../tests/orchestration/test_finish_guard.py | 79 +- .../test_harness_e2e_fault_matrix.py | 18 +- .../test_harness_ledger_postgres.py | 4 +- .../test_harness_process_restart.py | 52 - .../test_harness_usage_ledger.py | 57 +- .../tests/orchestration/test_hook_bus.py | 141 + .../orchestration/test_inactivity_watchdog.py | 2 +- .../orchestration/test_inflight_message.py | 40 +- .../test_job_callback_transport.py | 7 +- .../orchestration/test_job_conflict_policy.py | 13 +- .../orchestration/test_job_derived_agent.py | 56 +- .../tests/orchestration/test_job_failfast.py | 35 +- .../test_job_inherited_grants.py | 18 +- .../orchestration/test_job_local_callback.py | 5 +- .../orchestration/test_job_managed_runtime.py | 50 +- .../orchestration/test_job_orphan_reaper.py | 25 +- .../orchestration/test_job_resilience.py | 4 +- .../orchestration/test_job_sdk_ledger.py | 2 +- .../orchestration/test_job_ui_progress.py | 12 +- .../test_job_wake_delivery_format.py | 2 +- .../test_job_wake_message_visibility.py | 34 +- .../tests/orchestration/test_job_wake_mode.py | 36 +- .../test_job_windows_attempt_paths.py | 5 +- .../test_loop_reviewer_registry_tool.py | 4 +- .../test_missing_tool_call_synthesis.py | 4 +- .../test_model_progress_signal.py | 60 +- .../test_model_steps_pipeline.py | 25 +- .../test_model_steps_plan_projection.py | 66 +- .../orchestration/test_model_steps_worker.py | 47 +- .../orchestration/test_observation_writer.py | 146 + .../orchestration/test_pending_workflows.py | 68 + .../orchestration/test_plan_early_cancel.py | 84 + .../test_plan_progress_closeout.py | 9 +- .../orchestration/test_plan_stale_reminder.py | 57 +- .../test_project_api_recovery.py | 25 +- .../test_project_init_stream_input.py | 5 +- .../orchestration/test_run_event_stream.py | 16 +- .../tests/orchestration/test_run_journal.py | 9 +- .../test_run_journal_postgres.py | 15 +- .../test_runtime_phase_lifecycle.py | 203 + .../orchestration/test_site_mode_prompt.py | 11 +- .../tests/orchestration/test_stale_reaper.py | 123 +- .../tests/orchestration/test_steer_queue.py | 13 +- .../test_structured_reasoning_protocol.py | 2 +- .../test_thinking_block_persistence.py | 22 +- .../test_thinking_suppression.py | 2 +- .../orchestration/test_tool_effect_ledger.py | 1405 +---- .../test_tool_effect_ledger_2.py | 429 ++ .../test_tool_effect_ledger_3.py | 475 ++ .../test_tool_effect_ledger_4.py | 459 ++ .../test_tool_effect_ledger_5.py | 133 + .../test_user_question_passthrough.py | 42 +- .../tests/orchestration/test_worker_base.py | 3 +- .../test_workflow_hint_consistency.py | 2 +- .../test_workflow_model_runtime.py | 10 +- .../orchestration/tool_effect_support.py | 81 + .../{ => personal_agent}/test_device_link.py | 8 +- .../prompts/test_desktop_delivery_tools.py | 2 +- .../tests/prompts/test_desktop_environment.py | 13 +- .../prompts/test_desktop_prompt_versions.py | 57 +- ...est_local_mode_drops_container_sections.py | 16 +- .../prompts/test_local_project_section.py | 16 +- .../tests/prompts/test_project_isolation.py | 2 +- .../prompts/test_prompt_cache_full_hash.py | 4 +- .../test_prompt_parts_from_filesystem.py | 56 +- .../prompts/test_prompt_version_freshness.py | 44 +- .../tests/run_browser_opensandbox_e2e.py | 8 +- .../tests/run_command_opensandbox_e2e.py | 12 +- .../tests/run_personal_agent_cli_grant_e2e.py | 3 +- src/backend/tests/run_personal_agent_e2e.py | 6 +- .../tests/run_personal_agent_key_e2e.py | 2 +- ...run_personal_agent_project_sessions_e2e.py | 5 +- .../tests/sandbox/e2e_myspace_bulk_live.py | 6 +- .../tests/sandbox/fixtures/egress_gateway.py | 14 +- .../tests/sandbox/provider_test_support.py | 5 +- .../test_adopt_respects_session_binding.py | 3 - .../tests/sandbox/test_artifact_streaming.py | 8 +- .../sandbox/test_cloud_process_sessions.py | 12 +- .../tests/sandbox/test_controller_capacity.py | 37 + .../sandbox/test_creation_adoption_race.py | 9 +- .../test_credential_purge_preserves_mounts.py | 37 +- .../sandbox/test_cube_skill_push_ownership.py | 7 +- .../sandbox/test_idle_reclaim_snapshot.py | 3 +- .../sandbox/test_multiworker_lifecycle.py | 2 +- .../sandbox/test_multiworker_transactions.py | 2 +- .../test_opensandbox_controller_patch.py | 2 +- .../sandbox/test_opensandbox_expirations.py | 4 +- .../sandbox/test_opensandbox_provider.py | 30 + src/backend/tests/sandbox/test_os_sandbox.py | 4 +- .../sandbox/test_pool_retirement_guards.py | 18 +- .../sandbox/test_product_session_scope.py | 2 +- .../tests/sandbox/test_runner_package.py | 2 +- .../tests/sandbox/test_runtime_ownership.py | 61 + .../tests/sandbox/test_sandbox_accounting.py | 14 +- .../tests/sandbox/test_sandbox_init.py | 70 + .../tests/sandbox/test_sandbox_packaging.py | 18 +- .../sandbox/test_service_loop_affinity.py | 4 +- .../tests/sandbox/test_session_affinity.py | 2 +- .../sandbox/test_session_lock_cross_loop.py | 2 +- .../tests/sandbox/test_user_bound_sandbox.py | 21 - .../services/project_instructions_support.py | 5 +- .../tests/services/test_artifact_reader.py | 41 +- .../tests/services/test_artifact_summary.py | 20 +- src/backend/tests/services/test_audio_live.py | 2 +- .../tests/services/test_audio_models.py | 16 +- .../tests/services/test_audio_routes.py | 6 +- .../services/test_audio_transcription.py | 4 +- .../tests/services/test_chat_mode_service.py | 3 +- .../services/test_chat_reference_service.py | 11 +- .../tests/services/test_chat_sequencer.py | 74 +- .../tests/services/test_chat_titles.py | 35 +- .../services/test_kb_multimodal_assets.py | 657 --- .../tests/services/test_kb_wiki_end_to_end.py | 663 --- .../services/test_memory_settings_service.py | 16 +- .../services/test_model_config_consistency.py | 50 +- .../services/test_model_config_export.py | 8 +- .../services/test_plan_execution_snapshot.py | 2 +- .../test_project_context_no_inventory.py | 8 +- .../services/test_project_environment.py | 17 +- .../services/test_project_instructions.py | 39 +- .../test_project_instructions_dispatch.py | 26 +- .../tests/services/test_retire_chart_mcp.py | 2 +- .../services/test_turbo_capability_config.py | 14 +- .../services/test_user_model_selection.py | 13 +- .../services/user_folder_service_selftest.py | 6 +- .../tests/skills/agent_skills_selftest.py | 4 +- src/backend/tests/skills/backends_selftest.py | 6 +- src/backend/tests/skills/loader_selftest.py | 7 +- .../tests/skills/skill_loading_selftest.py | 2 +- .../tests/skills/skill_selection_selftest.py | 8 +- .../skills/test_database_backend_lazy.py | 10 +- .../tests/skills/test_deps_detector.py | 2 +- .../skills/test_read_artifact_pptx_xlsx.py | 54 +- src/backend/tests/skills/test_registry.py | 6 +- .../tests/skills/test_sandbox_skill_purge.py | 17 +- .../skills/test_skill_deps_aggregator.py | 20 +- .../tests/skills/test_skill_publication.py | 67 +- .../skills/test_skill_publication_docker.py | 2 +- .../skills/test_skill_selector_context_ir.py | 6 +- .../tests/skills/test_skill_zip_export.py | 20 +- .../tests/test_add_agent_permission.py | 4 +- .../tests/test_agent_manager_plugin.py | 13 +- src/backend/tests/test_agent_markdown.py | 7 +- .../tests/test_agent_version_history.py | 15 + .../tests/test_automation_manual_trigger.py | 77 - .../tests/test_automation_oneshot_finalize.py | 109 - src/backend/tests/test_browser_prewarm.py | 75 +- src/backend/tests/test_browser_remediation.py | 6 +- .../tests/test_browser_resource_assets.py | 6 +- .../tests/test_browser_resource_security.py | 39 +- .../tests/test_browser_resource_transport.py | 14 +- src/backend/tests/test_ce_agent_visibility.py | 6 +- .../tests/test_ce_runtime_contracts.py | 47 +- src/backend/tests/test_channel_bots.py | 2109 -------- src/backend/tests/test_citation_anchor.py | 16 +- src/backend/tests/test_cli_cold_bootstrap.py | 48 + .../tests/test_content_block_id_migration.py | 2 +- src/backend/tests/test_credential_registry.py | 44 + src/backend/tests/test_db_import_order.py | 103 + .../tests/test_default_plugin_bootstrap.py | 10 +- .../tests/test_desktop_observability.py | 633 --- .../test_explicit_capability_invocation.py | 21 +- src/backend/tests/test_extensions_layout.py | 28 +- src/backend/tests/test_hook_contributions.py | 47 + .../tests/test_iter_budget_middleware.py | 69 +- src/backend/tests/test_leader_election.py | 48 + .../tests/test_local_mcp_http_readiness.py | 33 + .../tests/test_local_memory_defaults.py | 3 +- src/backend/tests/test_local_onboarding.py | 95 + .../tests/test_local_plugin_sidecars.py | 75 +- src/backend/tests/test_local_profile.py | 158 +- src/backend/tests/test_local_subprocess.py | 95 +- src/backend/tests/test_management_failures.py | 8 +- src/backend/tests/test_mcp_canonical_url.py | 30 + src/backend/tests/test_mcp_marketplace.py | 1758 ------- src/backend/tests/test_package_boundaries.py | 16 +- src/backend/tests/test_package_sources.py | 23 + src/backend/tests/test_personal_agent.py | 16 +- .../tests/test_personal_agent_access.py | 10 +- .../tests/test_personal_agent_capabilities.py | 14 +- .../test_personal_agent_channel_files.py | 8 +- .../test_personal_agent_channel_sessions.py | 11 +- .../tests/test_personal_agent_cold_start.py | 10 +- .../test_personal_agent_computer_wait.py | 6 +- .../tests/test_personal_agent_delivery.py | 11 +- .../tests/test_personal_agent_dreaming.py | 4 +- .../tests/test_personal_agent_fixes.py | 35 +- .../tests/test_personal_agent_monitor.py | 3 +- .../tests/test_personal_agent_persona.py | 15 +- .../tests/test_personal_agent_prompt_cache.py | 22 + .../tests/test_personal_agent_routing.py | 28 +- .../tests/test_personal_agent_session_tool.py | 5 +- .../tests/test_personal_agent_sessions.py | 12 +- .../tests/test_personal_agent_steer.py | 21 +- .../test_personal_agent_tool_regressions.py | 30 +- .../tests/test_personal_canonical_history.py | 4 +- .../test_personal_task_transcript_order.py | 18 +- src/backend/tests/test_plugin_components.py | 73 +- .../tests/test_plugin_manager_plugin.py | 17 +- .../tests/test_plugin_progressive_loading.py | 89 +- .../tests/test_plugin_resource_contract.py | 2 +- src/backend/tests/test_plugin_system.py | 17 +- src/backend/tests/test_redis_stream_pool.py | 6 +- .../test_retired_batch_chat_admission_http.py | 32 +- src/backend/tests/test_route_import_order.py | 74 + .../test_script_runner_process_limits.py | 10 +- .../tests/test_session_capabilities.py | 4 +- .../tests/test_session_database_isolation.py | 23 + src/backend/tests/test_sidebar_task_status.py | 13 +- .../tests/test_skill_manager_plugin.py | 23 +- src/backend/tests/test_tool_contributions.py | 90 + .../tests/test_user_agent_resources.py | 16 +- src/backend/tests/test_user_cleanup.py | 34 + src/backend/tests/test_visualize_plugin.py | 18 +- src/backend/tests/test_yida_local_login.py | 12 +- src/frontend/Dockerfile | 3 +- src/frontend/Dockerfile.dockerignore | 8 +- src/frontend/package-lock.json | 263 + src/frontend/package.json | 3 + src/frontend/scripts/archive-e2e-fixtures.py | 4 +- .../scripts/chat-customization-environment.py | 2 +- .../scripts/component-e2e-environment.py | 2 +- .../scripts/customer-devkit-environment.py | 4 +- .../scripts/desktop-lint-baseline.json | 1 - .../scripts/grapheme-e2e-environment.py | 2 +- src/frontend/scripts/test-attachment-send.tsx | 4 +- .../scripts/test-canvas-quote-browser.mjs | 131 + .../scripts/test-canvas-viewers-browser.mjs | 213 + .../scripts/test-canvas-zoom-browser.mjs | 254 + src/frontend/scripts/test-chat-fork.tsx | 2 +- .../scripts/test-desktop-login-browser.mjs | 2 +- .../scripts/test-queued-invocation.ts | 12 + .../scripts/test-reference-motion-browser.mjs | 34 +- .../test-sidebar-task-status-browser.mjs | 16 +- .../scripts/test-subagent-canvas-browser.mjs | 3 +- .../scripts/test-turn-status-alignment.mjs | 2 +- .../test-workbench-capabilities-browser.mjs | 2 +- .../test-workbench-diagnostics-browser.mjs | 2 +- .../scripts/test-workbench-embed-browser.mjs | 2 +- .../scripts/test-workbench-plugin-browser.mjs | 4 +- .../scripts/test-workspace-http-browser.mjs | 4 +- .../automation/AutomationTaskSections.tsx | 6 +- .../automation/RunTimelinePanel.tsx | 64 +- .../components/automation/automationUtils.ts | 9 +- .../components/canvas/CanvasFileHeader.css | 6 + .../components/canvas/CanvasFileHeader.tsx | 2 + .../components/canvas/CanvasFileRenderers.tsx | 338 -- .../src/components/canvas/CanvasPanel.tsx | 45 +- .../components/canvas/CanvasZoomControl.tsx | 81 + .../src/components/canvas/FileTextPanel.tsx | 6 +- .../components/canvas/UniverSpreadsheet.tsx | 31 + .../src/components/canvas/canvasDocument.ts | 121 + .../components/canvas/canvasFileCategory.ts | 22 - .../src/components/canvas/canvasZoom.ts | 85 + .../src/components/canvas/find/CanvasFind.css | 45 + .../src/components/canvas/find/CanvasFind.tsx | 196 + .../components/canvas/find/domFindSource.ts | 17 + .../src/components/canvas/find/index.ts | 1 + .../src/components/canvas/find/textSearch.ts | 76 + .../canvas/outline/CanvasOutline.css | 143 + .../canvas/outline/CanvasOutline.tsx | 225 + .../components/canvas/outline/domOutline.ts | 54 + .../src/components/canvas/outline/index.ts | 1 + .../canvas/renderers/DocxRenderer.tsx | 100 + .../canvas/renderers/FallbackRenderers.tsx | 40 + .../canvas/renderers/HtmlRenderer.tsx | 62 + .../canvas/renderers/ImageRenderer.tsx | 102 + .../canvas/renderers/PdfRenderer.tsx | 60 + .../components/canvas/renderers/PdfViewer.css | 104 + .../components/canvas/renderers/PdfViewer.tsx | 399 ++ .../canvas/renderers/TextRenderers.css | 66 + .../canvas/renderers/TextRenderers.tsx | 138 + .../src/components/canvas/renderers/index.ts | 6 + .../src/components/canvas/renderers/pdfjs.ts | 68 + .../canvas/renderers/previewError.ts | 11 + .../selection/SpreadsheetQuoteButton.css | 56 + .../selection/SpreadsheetQuoteButton.tsx | 23 + .../components/canvas/selection/canvasChat.ts | 48 + .../canvas/selection/canvasLocator.ts | 37 + .../canvas/selection/useCanvasSelection.tsx | 33 + .../src/components/chat/AgentCursor.tsx | 72 + .../src/components/chat/InputArea.tsx | 22 +- .../src/components/chat/MessageBody.tsx | 111 +- .../src/components/chat/MessageBubble.tsx | 5 +- .../components/chat/OntologyRevisionPanel.tsx | 7 - .../components/chat/StreamWaitIndicator.tsx | 4 +- .../components/chat/TurnStatusIndicator.tsx | 56 +- .../components/chat/useMessageSelection.tsx | 298 +- .../src/components/common/AgentMark.tsx | 48 + .../src/components/common/ElapsedTimer.tsx | 8 +- .../src/components/common/RollingText.tsx | 105 + .../common/selection/SelectionToolbar.css | 79 + .../common/selection/useSelectionToolbar.tsx | 226 + .../src/components/file/FilePreviewPane.tsx | 80 +- .../components/file/FilePreviewViewers.tsx | 30 +- .../src/components/file/MediaPlayer.css | 84 + .../src/components/file/MediaPlayer.tsx | 66 + .../src/components/file/filePreviewUrls.ts | 5 - .../shared/PersonalAgentNavStatus.tsx | 9 +- .../personal-agent/shared/notifications.ts | 15 +- .../src/components/tool/CompactionStepRow.tsx | 10 +- .../src/components/tool/PendingStepRow.tsx | 34 - .../src/components/tool/ThinkingStepRow.tsx | 7 +- .../src/components/tool/ToolCallRow.tsx | 72 +- .../components/tool/ToolCapabilityIcon.tsx | 8 +- .../src/components/tool/ToolKindStack.tsx | 69 + .../src/components/tool/ToolRunShell.tsx | 151 +- .../src/components/tool/toolIcons.tsx | 68 + src/frontend/src/hooks/chatHistoryMessage.ts | 10 +- src/frontend/src/hooks/chatStream/consume.ts | 1 - .../src/hooks/chatStream/lifecycleAndTools.ts | 46 +- .../src/hooks/chatStream/messageStore.ts | 6 +- src/frontend/src/hooks/chatStream/snapshot.ts | 1 - src/frontend/src/hooks/chatStream/state.ts | 1 - .../hooks/chatStream/toolResultsAndMeta.ts | 1 - src/frontend/src/hooks/streamQueue.ts | 6 +- src/frontend/src/hooks/streamSend.ts | 17 +- src/frontend/src/hooks/useActivityAge.ts | 47 + src/frontend/src/hooks/useStallDetector.ts | 6 +- src/frontend/src/hooks/useToolCapability.ts | 18 +- src/frontend/src/i18n/en/canvas.ts | 39 + src/frontend/src/i18n/en/chat.ts | 5 +- src/frontend/src/i18n/en/lab.ts | 4 +- src/frontend/src/i18n/en/myspace.ts | 2 + src/frontend/src/i18n/en/panels.ts | 3 +- src/frontend/src/i18n/en/tool.ts | 27 +- src/frontend/src/plugin-ui/README.md | 4 +- .../src/stores/automationChatStore.ts | 35 +- src/frontend/src/stores/canvasStore.ts | 39 +- src/frontend/src/stores/composerStore.ts | 4 +- src/frontend/src/styles/canvas.css | 290 +- src/frontend/src/styles/chat.css | 1 + .../src/styles/chat/agent-activity.css | 226 + src/frontend/src/styles/chat/attachments.css | 18 +- .../src/styles/chat/import-browser.css | 54 - .../src/styles/chat/message-actions.css | 68 - src/frontend/src/styles/chat/messages.css | 12 +- src/frontend/src/styles/chat/turn-status.css | 28 +- src/frontend/src/styles/tool.css | 144 +- src/frontend/src/styles/variables.css | 15 + src/frontend/src/types/automations.ts | 2 +- src/frontend/src/types/conversations.ts | 23 +- src/frontend/src/types/messages.ts | 1 - src/frontend/src/utils/chatInvocation.ts | 10 + src/frontend/src/utils/elapsed.ts | 5 + src/frontend/src/utils/filePreviewKind.ts | 92 + src/frontend/src/utils/filePreviewSafety.ts | 24 +- src/frontend/src/utils/index.ts | 2 +- src/frontend/src/utils/quotedFollowUp.ts | 64 + src/frontend/src/utils/toolActionLabel.ts | 84 +- src/frontend/src/utils/toolIconKind.ts | 12 + src/frontend/src/utils/turnActivity.ts | 69 + 2834 files changed, 102814 insertions(+), 90978 deletions(-) create mode 100644 .claude/skills/hugagent-backend-dev/templates/extension.py create mode 100644 .claude/skills/hugagent-frontend-dev/assets/design-v2/icons-ui/attachment.svg create mode 100644 .claude/skills/hugagent-frontend-dev/assets/design-v2/icons-ui/automation.svg create mode 100644 .claude/skills/hugagent-frontend-dev/assets/design-v2/icons-ui/check.svg create mode 100644 .claude/skills/hugagent-frontend-dev/assets/design-v2/icons-ui/chevron-right.svg create mode 100644 .claude/skills/hugagent-frontend-dev/assets/design-v2/icons-ui/close.svg create mode 100644 .claude/skills/hugagent-frontend-dev/assets/design-v2/icons-ui/knowledge.svg create mode 100644 .claude/skills/hugagent-frontend-dev/assets/design-v2/icons-ui/my-space.svg create mode 100644 .claude/skills/hugagent-frontend-dev/assets/design-v2/icons-ui/new-chat.svg create mode 100644 .claude/skills/hugagent-frontend-dev/assets/design-v2/icons-ui/search.svg create mode 100644 .claude/skills/hugagent-frontend-dev/assets/design-v2/icons-ui/send.svg create mode 100644 .claude/skills/hugagent-frontend-dev/assets/design-v2/icons-ui/settings.svg create mode 100644 .claude/skills/hugagent-frontend-dev/assets/design-v2/icons-ui/skill.svg create mode 100644 .claude/skills/hugagent-frontend-dev/assets/design-v2/logo/favicon.svg create mode 100644 .claude/skills/hugagent-frontend-dev/assets/design-v2/logo/hugagentos-glyph-black.svg create mode 100644 .claude/skills/hugagent-frontend-dev/assets/design-v2/logo/hugagentos-glyph-blue.svg create mode 100644 .claude/skills/hugagent-frontend-dev/assets/design-v2/logo/hugagentos-glyph-white.svg create mode 100644 .claude/skills/hugagent-frontend-dev/assets/design-v2/logo/hugagentos-mark-mono-black.svg create mode 100644 .claude/skills/hugagent-frontend-dev/assets/design-v2/logo/hugagentos-mark-mono-white.svg create mode 100644 .claude/skills/hugagent-frontend-dev/assets/design-v2/logo/hugagentos-mark-reverse.svg create mode 100644 .claude/skills/hugagent-frontend-dev/assets/design-v2/logo/hugagentos-mark-small.svg create mode 100644 .claude/skills/hugagent-frontend-dev/assets/design-v2/logo/hugagentos-mark.svg create mode 100644 .claude/skills/hugagent-frontend-dev/assets/design-v2/tokens/appTheme.v2.ts create mode 100644 .claude/skills/hugagent-frontend-dev/assets/design-v2/tokens/hugagentos-tokens.v2.css create mode 100644 .claude/skills/hugagent-frontend-dev/assets/design-v2/tokens/hugagentos-tokens.v2.json create mode 100644 .claude/skills/hugagent-frontend-dev/assets/design-v2/tokens/motionTokens.v2.ts delete mode 100644 docker/Dockerfile.opensandbox-server.dockerignore delete mode 100644 docker/Dockerfile.personal-agent-test rename docker-compose.application-hosting.yml => docker/application-hosting/compose.application-hosting.yml (90%) rename docker/{ => object-storage}/Dockerfile.object-storage (100%) rename docker/{ => object-storage}/compose.object-storage.yml (91%) rename docker/{ => object-storage}/init-object-storage.py (100%) rename docker/{ => opensandbox-server}/Dockerfile.opensandbox-server (52%) create mode 100644 docker/opensandbox-server/Dockerfile.opensandbox-server.dockerignore rename docker/{ => opensandbox-server}/opensandbox-config.toml.tpl (100%) create mode 100644 docker/opensandbox-server/opensandbox_capacity.py rename docker/{ => opensandbox-server}/opensandbox_expirations.py (100%) rename docker/{ => opensandbox-server}/opensandbox_mount_recovery.py (91%) rename docker/{ => opensandbox-server}/opensandbox_mount_worker.py (100%) rename docker/{ => opensandbox-server}/opensandbox_object_mounts.py (100%) rename docker/{ => opensandbox-server}/patch_opensandbox_server.py (96%) rename docker/{ => opensandbox-server}/render-opensandbox-config.py (100%) rename docker/{ => personal-agent}/Dockerfile.personal-agent (86%) rename docker/{ => personal-agent}/compose.personal-agent.yml (91%) rename docker/{personal-agent-desktop => personal-agent/desktop}/helpers.rc (100%) rename docker/{personal-agent-desktop => personal-agent/desktop}/mimeapps.list (100%) rename docker/{personal-agent-desktop => personal-agent/desktop}/pa-browser (100%) rename docker/{personal-agent-desktop => personal-agent/desktop}/pa-browser-helper.desktop (100%) rename docker/{personal-agent-desktop => personal-agent/desktop}/pa-browser.desktop (100%) rename docker/{personal-agent-desktop => personal-agent/desktop}/pa-stream.py (100%) rename docker/{ => personal-agent}/hugagent-cli-entrypoint.sh (100%) rename docker/{ => personal-agent}/personal-agent-entrypoint.sh (94%) rename docker/{ => personal-agent}/render-personal-agent-config.py (100%) rename docker/{ => sandbox}/Dockerfile.opensandbox (92%) rename docker/{ => sandbox}/Dockerfile.script-runner (96%) rename docker/{ => sandbox}/apt-skills.txt (100%) rename docker/{ => sandbox}/package-skills.json (100%) rename docker/{ => sandbox}/requirements-script-runner.txt (100%) rename docker/{ => sandbox}/requirements-skills.txt (100%) create mode 100644 docker/sandbox/sandbox-init.c rename docker/{ => sandbox}/site-template/init-react-site.sh (100%) rename docker/{ => sandbox}/site-template/react-vite/.npmrc (100%) rename docker/{ => sandbox}/site-template/react-vite/index.html (100%) rename docker/{ => sandbox}/site-template/react-vite/package-lock.json (100%) rename docker/{ => sandbox}/site-template/react-vite/package.json (100%) rename docker/{ => sandbox}/site-template/react-vite/src/App.jsx (100%) rename docker/{ => sandbox}/site-template/react-vite/src/index.css (100%) rename docker/{ => sandbox}/site-template/react-vite/src/lib/siteApi.js (100%) rename docker/{ => sandbox}/site-template/react-vite/src/main.jsx (100%) rename docker/{ => sandbox}/site-template/react-vite/src/pages/Home.jsx (100%) rename docker/{ => sandbox}/site-template/react-vite/vite.config.mjs (100%) rename docker/{ => sandbox}/verify-browser-runtime.py (100%) delete mode 100644 document/en/deployment/artifact-storage-key-repair.md delete mode 100644 document/en/deployment/offline-production.md delete mode 100644 document/en/deployment/uos1070-desktop.md delete mode 100644 document/en/development/container-layout.md delete mode 100644 document/zh-CN/deployment/artifact-storage-key-repair.md delete mode 100644 document/zh-CN/deployment/offline-production.md delete mode 100644 document/zh-CN/deployment/uos1070-desktop.md delete mode 100644 document/zh-CN/development/container-layout.md delete mode 100644 examples/customer-chat/.env.example delete mode 100644 examples/customer-chat/.gitignore delete mode 100644 examples/customer-chat/README.md delete mode 100644 examples/customer-chat/debug.html delete mode 100644 examples/customer-chat/index.html delete mode 100644 examples/customer-chat/package-lock.json delete mode 100644 examples/customer-chat/package.json delete mode 100644 examples/customer-chat/preview.html delete mode 100644 examples/customer-chat/scripts/build-component.mjs delete mode 100644 examples/customer-chat/scripts/developer-proxy.mjs delete mode 100644 examples/customer-chat/scripts/test-package.mjs delete mode 100644 examples/customer-chat/scripts/test-proxy.mjs delete mode 100644 examples/customer-chat/session.html delete mode 100644 examples/customer-chat/src/controls.ts delete mode 100644 examples/customer-chat/src/css.d.ts delete mode 100644 examples/customer-chat/src/customization.tsx delete mode 100644 examples/customer-chat/src/debug.ts delete mode 100644 examples/customer-chat/src/developer.css delete mode 100644 examples/customer-chat/src/login.ts delete mode 100644 examples/customer-chat/src/preview.tsx delete mode 100644 examples/customer-chat/src/session.ts delete mode 100644 examples/customer-chat/src/standalone.css delete mode 100644 examples/customer-chat/src/standalone.ts delete mode 100644 examples/customer-chat/src/theme.css delete mode 100644 examples/customer-chat/tsconfig.json delete mode 100644 examples/customer-chat/vite.config.mjs create mode 100644 packages/cli/DESIGN.md create mode 100644 scripts/refactor/__init__.py create mode 100644 scripts/refactor/check_ce_paths.py create mode 100644 scripts/refactor/check_line_budget.py create mode 100644 scripts/refactor/check_test_baseline.py create mode 100644 scripts/refactor/import_contract.py create mode 100644 scripts/refactor/rewrite_imports.py create mode 100644 scripts/refactor/snapshot_routes.py create mode 100644 scripts/refactor/snapshot_schema.py create mode 100644 scripts/refactor/tests/test_edition_seams.py create mode 100644 scripts/refactor/tests/test_guards.py create mode 100644 scripts/refactor/tests/test_package_markers.py create mode 100644 scripts/refactor/tests/test_private_imports.py create mode 100644 scripts/refactor/tests/test_rewrite_imports.py create mode 100644 scripts/refactor/tests/test_snapshot_schema.py create mode 100644 scripts/refactor/tests/test_supplemental_moves.py create mode 100644 scripts/refactor/tests/test_test_baseline.py create mode 100644 scripts/refactor/tests/test_test_moves.py create mode 100644 src/backend/alembic/versions/ce_0031_automation_lease_token.py create mode 100644 src/backend/alembic/versions/ce_0032_automation_queue.py create mode 100644 src/backend/alembic/versions/ce_0033_automation_targets.py create mode 100644 src/backend/api/edition.py rename src/backend/api/{routes/v1/agents.py => personal_agents.py} (94%) delete mode 100644 src/backend/api/routes/v1/desktop_capability.py delete mode 100644 src/backend/api/routes/v1/kb.py rename src/backend/{core/content => api/transports}/__init__.py (100%) create mode 100644 src/backend/api/transports/run_sse.py create mode 100644 src/backend/core/agent_runtime/README.md create mode 100644 src/backend/core/agent_runtime/README.zh-CN.md rename src/backend/core/{plugins/resources => agent_runtime}/__init__.py (100%) create mode 100644 src/backend/core/agent_runtime/budget.py create mode 100644 src/backend/core/agent_runtime/direct.py create mode 100644 src/backend/core/agent_runtime/direct_state.py create mode 100644 src/backend/core/agent_runtime/events.py create mode 100644 src/backend/core/agent_runtime/host.py rename src/backend/{tests/capabilities => core/agent_runtime/integrations}/__init__.py (100%) rename src/backend/{orchestration => core/agent_runtime/integrations}/compaction_stream.py (95%) create mode 100644 src/backend/core/agent_runtime/integrations/evolution.py create mode 100644 src/backend/core/agent_runtime/integrations/memory.py create mode 100644 src/backend/core/agent_runtime/integrations/memory_budget.py create mode 100644 src/backend/core/agent_runtime/integrations/memory_identity.py create mode 100644 src/backend/core/agent_runtime/integrations/memory_session.py create mode 100644 src/backend/core/agent_runtime/integrations/memory_state.py create mode 100644 src/backend/core/agent_runtime/integrations/ontology_evidence.py create mode 100644 src/backend/core/agent_runtime/integrations/ontology_repair.py create mode 100644 src/backend/core/agent_runtime/main_state.py rename src/backend/{orchestration/subagents => core/agent_runtime}/plugin_visibility.py (91%) create mode 100644 src/backend/core/agent_runtime/prepare_direct.py create mode 100644 src/backend/core/agent_runtime/prepare_main.py create mode 100644 src/backend/core/agent_runtime/runner.py create mode 100644 src/backend/core/agent_runtime/skills.py rename src/backend/{orchestration => core/agent_runtime}/strategy.py (100%) create mode 100644 src/backend/core/agent_runtime/stream_direct.py create mode 100644 src/backend/core/agent_runtime/stream_main.py create mode 100644 src/backend/core/agent_runtime/targets.py delete mode 100644 src/backend/core/agent_skills/backends/__init__.py delete mode 100644 src/backend/core/agent_skills/cache_refresh.py rename src/backend/core/{services/agent_api_service.py => auth/agent_api.py} (99%) rename src/backend/core/{services => auth}/api_key_runs.py (85%) rename src/backend/core/{services/api_key_service.py => auth/api_keys.py} (95%) create mode 100644 src/backend/core/auth/bearer.py create mode 100644 src/backend/core/auth/edition.py create mode 100644 src/backend/core/auth/local_user_bootstrap.py create mode 100644 src/backend/core/auth/local_user_policy.py rename src/backend/core/{services/local_user_service.py => auth/local_users.py} (79%) create mode 100644 src/backend/core/auth/local_users_constants.py create mode 100644 src/backend/core/auth/model_selection.py rename src/backend/core/auth/{account_policy.py => personal_account_policy.py} (100%) rename src/backend/core/auth/{account_view.py => personal_account_view.py} (100%) rename src/backend/core/auth/{edition_capabilities.py => personal_edition_capabilities.py} (100%) rename src/backend/core/auth/{permissions_iface.py => personal_permissions_iface.py} (99%) create mode 100644 src/backend/core/auth/public_identity.py rename src/backend/core/{services/user_service.py => auth/users.py} (92%) create mode 100644 src/backend/core/capabilities/agents/__init__.py create mode 100644 src/backend/core/capabilities/agents/available_resources.py create mode 100644 src/backend/core/capabilities/agents/base.py create mode 100644 src/backend/core/capabilities/agents/base_constants.py rename src/backend/core/{llm/builtin_subagents.py => capabilities/agents/builtin.py} (98%) rename src/backend/core/{services/user_agent_service.py => capabilities/agents/edition.py} (64%) rename src/backend/core/{services/agent_markdown.py => capabilities/agents/markdown.py} (100%) create mode 100644 src/backend/core/capabilities/agents/version_history.py create mode 100644 src/backend/core/capabilities/catalog/__init__.py rename src/backend/core/{config/catalog.py => capabilities/catalog/api.py} (92%) rename src/backend/core/{config/catalog_common.py => capabilities/catalog/common.py} (90%) rename src/backend/core/{config/catalog_details.py => capabilities/catalog/details.py} (96%) rename src/backend/core/{config/catalog_loader.py => capabilities/catalog/loader.py} (85%) rename src/backend/core/{config/catalog_migration.py => capabilities/catalog/migration.py} (97%) rename src/backend/core/{services/catalog_service.py => capabilities/catalog/overrides.py} (100%) rename src/backend/core/{config/catalog_resolver.py => capabilities/catalog/resolver.py} (87%) rename src/backend/core/{config/catalog_runtime.py => capabilities/catalog/runtime.py} (87%) create mode 100644 src/backend/core/capabilities/identity_rules.py rename src/backend/core/{services/desktop_capability_protocol.py => capabilities/manifest_protocol.py} (99%) create mode 100644 src/backend/core/capabilities/mcp/__init__.py rename src/backend/core/{services/mcp_builtin_specs.py => capabilities/mcp/builtin_specs.py} (94%) rename src/backend/core/{services/edition_mcp.py => capabilities/mcp/edition.py} (100%) rename src/backend/core/{services/mcp_management_service.py => capabilities/mcp/management.py} (89%) create mode 100644 src/backend/core/capabilities/mcp/oauth.py create mode 100644 src/backend/core/capabilities/mcp/oauth_storage.py rename src/backend/core/{services/mcp_service.py => capabilities/mcp/service.py} (91%) create mode 100644 src/backend/core/capabilities/mcp/tool_metadata.py create mode 100644 src/backend/core/capabilities/mcp/tool_schema.py create mode 100644 src/backend/core/capabilities/mcp/tool_schema_backfill.py create mode 100644 src/backend/core/capabilities/plugins/README.md rename src/backend/core/{ => capabilities}/plugins/__init__.py (100%) rename src/backend/core/{ => capabilities}/plugins/connections.py (83%) create mode 100644 src/backend/core/capabilities/plugins/management/__init__.py rename src/backend/core/{ => capabilities}/plugins/management/admin_config.py (88%) rename src/backend/core/{services/manager_bundle_upgrade.py => capabilities/plugins/management/bundle_upgrade.py} (92%) rename src/backend/core/{services/cloud_management.py => capabilities/plugins/management/cloud.py} (78%) rename src/backend/core/{ => capabilities}/plugins/management/components.py (88%) rename src/backend/core/{services/management_contract.py => capabilities/plugins/management/contract.py} (100%) rename src/backend/core/{ => capabilities}/plugins/management/defaults.py (93%) rename src/backend/core/{ => capabilities}/plugins/management/details.py (58%) rename src/backend/core/{services/management_errors.py => capabilities/plugins/management/errors.py} (100%) rename src/backend/core/{ => capabilities}/plugins/management/installation.py (81%) rename src/backend/core/{ => capabilities}/plugins/management/lifecycle.py (87%) rename src/backend/core/{services/management_package.py => capabilities/plugins/management/package.py} (91%) rename src/backend/core/{ => capabilities}/plugins/management/packages.py (70%) rename src/backend/core/{ => capabilities}/plugins/management/projection.py (63%) rename src/backend/core/{ => capabilities}/plugins/management/queries.py (86%) rename src/backend/core/{ => capabilities}/plugins/packaging/__init__.py (100%) rename src/backend/core/{ => capabilities}/plugins/packaging/archive.py (96%) rename src/backend/core/{ => capabilities}/plugins/packaging/definitions.py (94%) rename src/backend/core/{ => capabilities}/plugins/packaging/importer.py (96%) rename src/backend/core/{ => capabilities}/plugins/packaging/models.py (100%) create mode 100644 src/backend/core/capabilities/plugins/packaging/presentation.py rename src/backend/core/{ => capabilities}/plugins/packaging/runtime_assets.py (100%) rename src/backend/core/{ => capabilities}/plugins/packaging/skill_transform.py (96%) rename src/backend/core/{ => capabilities}/plugins/packaging/sources.py (83%) create mode 100644 src/backend/core/capabilities/plugins/resources/__init__.py rename src/backend/core/{ => capabilities}/plugins/resources/artifacts.py (93%) rename src/backend/core/{ => capabilities}/plugins/resources/authentication.py (93%) rename src/backend/core/{ => capabilities}/plugins/resources/configuration.py (100%) rename src/backend/core/{ => capabilities}/plugins/resources/confinement.py (83%) rename src/backend/core/{ => capabilities}/plugins/resources/crypto.py (100%) create mode 100644 src/backend/core/capabilities/plugins/resources/deadlines.py rename src/backend/core/{ => capabilities}/plugins/resources/installation.py (56%) rename src/backend/core/{ => capabilities}/plugins/resources/lifecycle.py (59%) create mode 100644 src/backend/core/capabilities/plugins/resources/owners.py create mode 100644 src/backend/core/capabilities/plugins/resources/prewarm.py create mode 100644 src/backend/core/capabilities/plugins/resources/reservation.py create mode 100644 src/backend/core/capabilities/plugins/resources/service.py rename src/backend/core/{ => capabilities}/plugins/resources/store.py (97%) rename src/backend/core/{ => capabilities}/plugins/resources/stream.py (72%) rename src/backend/core/{ => capabilities}/plugins/resources/transport.py (100%) rename src/backend/core/{ => capabilities}/plugins/runtime/__init__.py (76%) rename src/backend/core/{ => capabilities}/plugins/runtime/activation_history.py (97%) rename src/backend/core/{ => capabilities}/plugins/runtime/models.py (100%) rename src/backend/core/{ => capabilities}/plugins/runtime/resolution.py (91%) rename src/backend/core/{ => capabilities}/plugins/runtime/sticky_selection.py (85%) rename src/backend/core/capabilities/{ref.py => reference.py} (98%) delete mode 100644 src/backend/core/capabilities/runtime/__init__.py delete mode 100644 src/backend/core/capabilities/skills.py rename src/backend/core/{agent_skills => capabilities/skills}/__init__.py (97%) create mode 100644 src/backend/core/capabilities/skills/backends/__init__.py rename src/backend/core/{agent_skills => capabilities/skills}/backends/composite.py (97%) rename src/backend/core/{agent_skills => capabilities/skills}/backends/database.py (99%) rename src/backend/core/{agent_skills => capabilities/skills}/backends/filesystem.py (98%) rename src/backend/core/{agent_skills => capabilities/skills}/backends/protocol.py (100%) rename src/backend/core/{agent_skills => capabilities/skills}/binary_files.py (100%) create mode 100644 src/backend/core/capabilities/skills/cache_refresh.py rename src/backend/core/{agent_skills => capabilities/skills}/config.py (89%) create mode 100644 src/backend/core/capabilities/skills/deps/__init__.py rename src/backend/core/{services/skill_deps_aggregator.py => capabilities/skills/deps/aggregator.py} (92%) rename src/backend/core/{agent_skills/deps_detector.py => capabilities/skills/deps/detector.py} (100%) rename src/backend/core/{services/skill_deps_prober.py => capabilities/skills/deps/prober.py} (98%) rename src/backend/core/{services/skill_deps_request_service.py => capabilities/skills/deps/requests.py} (81%) rename src/backend/core/{services/skill_icon_service.py => capabilities/skills/icons.py} (100%) create mode 100644 src/backend/core/capabilities/skills/installation.py rename src/backend/core/{agent_skills => capabilities/skills}/loader.py (77%) create mode 100644 src/backend/core/capabilities/skills/loader_factory.py rename src/backend/core/{services/skill_management_service.py => capabilities/skills/management.py} (93%) rename src/backend/core/{agent_skills => capabilities/skills}/publication.py (89%) rename src/backend/core/{agent_skills => capabilities/skills}/registry.py (97%) create mode 100644 src/backend/core/capabilities/skills/runtime_loader.py create mode 100644 src/backend/core/capabilities/skills/script_discovery.py rename src/backend/core/{agent_skills => capabilities/skills}/selection_record.py (98%) rename src/backend/core/{agent_skills => capabilities/skills}/skill_archive.py (88%) create mode 100644 src/backend/core/capabilities/skills/zip_reader.py delete mode 100644 src/backend/core/channels/adapters/dingtalk.py delete mode 100644 src/backend/core/channels/adapters/lark.py delete mode 100644 src/backend/core/channels/inbound.py rename src/backend/core/{services => chat}/audio_transcription.py (98%) create mode 100644 src/backend/core/chat/compaction/__init__.py rename src/backend/core/{services/context_budget_checkpoint.py => chat/compaction/budget_checkpoint.py} (97%) rename src/backend/core/{services/compaction_coordinator.py => chat/compaction/coordinator.py} (94%) rename src/backend/core/{services/compaction_history.py => chat/compaction/history.py} (93%) rename src/backend/core/{services/compaction_progress.py => chat/compaction/progress.py} (100%) rename src/backend/core/{services/compaction_service.py => chat/compaction/service.py} (96%) rename src/backend/core/{services/compaction_summary.py => chat/compaction/summary.py} (93%) rename src/backend/core/{services/context_usage_projection.py => chat/compaction/usage_projection.py} (97%) create mode 100644 src/backend/core/chat/compaction_checkpoints.py create mode 100644 src/backend/core/chat/compaction_snapshots.py create mode 100644 src/backend/core/chat/compaction_types.py rename src/backend/core/{services/chat_edition.py => chat/edition.py} (100%) rename src/backend/{orchestration => core/chat}/followups.py (83%) rename src/backend/core/{services/chat_fork_service.py => chat/fork.py} (99%) create mode 100644 src/backend/core/chat/history_operations.py create mode 100644 src/backend/core/chat/limits.py rename src/backend/{orchestration => core/chat}/message_parser.py (97%) create mode 100644 src/backend/core/chat/message_queries.py create mode 100644 src/backend/core/chat/message_writes.py create mode 100644 src/backend/core/chat/mode_seed.py create mode 100644 src/backend/core/chat/mode_types.py create mode 100644 src/backend/core/chat/mode_validation.py rename src/backend/core/{services/chat_mode_service.py => chat/modes.py} (62%) rename src/backend/core/{services/session_operations => chat/operations}/__init__.py (100%) create mode 100644 src/backend/core/chat/operations/admission.py rename src/backend/core/{services/session_operations => chat/operations}/admission_errors.py (92%) rename src/backend/core/{services/session_operations => chat/operations}/agent_targets.py (94%) rename src/backend/core/{services/session_operations => chat/operations}/commands.py (82%) rename src/backend/core/{services/session_operations => chat/operations}/history.py (92%) rename src/backend/core/{services/session_operations => chat/operations}/invocation.py (85%) rename src/backend/core/{services/session_operations => chat/operations}/projects.py (90%) rename src/backend/core/{services/session_operations => chat/operations}/request_context.py (91%) rename src/backend/core/{services/session_operations => chat/operations}/runs.py (90%) rename src/backend/core/{services/session_operations => chat/operations}/schemas.py (100%) rename src/backend/core/{services/session_operations => chat/operations}/session_context.py (69%) rename src/backend/core/{services/session_operations => chat/operations}/sessions.py (86%) rename src/backend/core/{services/plan_service.py => chat/plans.py} (100%) rename src/backend/core/{services => chat}/project_init.py (91%) create mode 100644 src/backend/core/chat/projection/__init__.py create mode 100644 src/backend/core/chat/projection/codec.py rename src/backend/{orchestration/run_projection.py => core/chat/projection/reducer.py} (62%) rename src/backend/{orchestration/run_projection_storage.py => core/chat/projection/storage.py} (89%) rename src/backend/{orchestration/run_subscription.py => core/chat/projection/subscription.py} (80%) rename src/backend/core/{services/public_chat_service.py => chat/public.py} (78%) rename src/backend/core/{services/chat_reference_service.py => chat/references.py} (98%) create mode 100644 src/backend/core/chat/runtime/__init__.py create mode 100644 src/backend/core/chat/runtime/admission.py create mode 100644 src/backend/core/chat/runtime/chunks.py rename src/backend/{orchestration/post_turn_compaction.py => core/chat/runtime/compaction.py} (84%) create mode 100644 src/backend/core/chat/runtime/completion.py create mode 100644 src/backend/core/chat/runtime/followups.py create mode 100644 src/backend/core/chat/runtime/handoff.py rename src/backend/{orchestration => core/chat/runtime}/job_wakeup.py (64%) create mode 100644 src/backend/core/chat/runtime/pauses.py create mode 100644 src/backend/core/chat/runtime/recovery.py create mode 100644 src/backend/core/chat/runtime/recovery_snapshot.py create mode 100644 src/backend/core/chat/runtime/snapshots.py create mode 100644 src/backend/core/chat/runtime/steering.py create mode 100644 src/backend/core/chat/runtime/turn_state.py create mode 100644 src/backend/core/chat/runtime/worker.py rename src/backend/core/{services/chat_sequencer.py => chat/sequencer.py} (92%) create mode 100644 src/backend/core/chat/service.py create mode 100644 src/backend/core/chat/session_operations.py rename src/backend/core/{services => chat}/sidebar_status.py (100%) rename src/backend/core/{services/chat_steer_service.py => chat/steer.py} (95%) create mode 100644 src/backend/core/chat/steer_hook.py rename src/backend/core/{services => chat}/steer_queue.py (100%) rename src/backend/core/{services/subagent_routing_service.py => chat/subagent_routing.py} (100%) rename src/backend/core/{services/chat_titles.py => chat/titles.py} (92%) rename src/backend/{orchestration => core/chat}/tool_payloads.py (92%) rename src/backend/core/config/{edition_display_names.py => edition.py} (78%) create mode 100644 src/backend/core/config/store/__init__.py create mode 100644 src/backend/core/config/store/config_keys.py create mode 100644 src/backend/core/config/store/execution_options.py create mode 100644 src/backend/core/config/store/runtime_env.py create mode 100644 src/backend/core/config/store/system_config.py create mode 100644 src/backend/core/config/store/system_config_constants.py delete mode 100644 src/backend/core/content/content_blocks.py delete mode 100644 src/backend/core/content/file_parser.py create mode 100644 src/backend/core/db/artifact_scope.py create mode 100644 src/backend/core/db/edition.py delete mode 100644 src/backend/core/db/models/channel_relay.py create mode 100644 src/backend/core/db/models/chat_resources.py create mode 100644 src/backend/core/db/models/chat_runs.py create mode 100644 src/backend/core/db/models/column_types.py delete mode 100644 src/backend/core/db/models/kb_wiki.py delete mode 100644 src/backend/core/db/models/observability.py rename src/backend/core/db/{model_extensions.py => personal_model_fields.py} (100%) rename src/backend/core/db/{edition_tables.py => personal_schema.py} (97%) create mode 100644 src/backend/core/db/repository/folder.py rename src/backend/core/db/repository/{agent.py => personal_agent.py} (100%) rename src/backend/core/db/repository/{audit.py => personal_audit.py} (96%) create mode 100644 src/backend/core/db/system_configuration.py create mode 100644 src/backend/core/db/threads.py create mode 100644 src/backend/core/db/user_cleanup.py delete mode 100644 src/backend/core/evolution/activation.py delete mode 100644 src/backend/core/evolution/agent_profile.py create mode 100644 src/backend/core/evolution/assessment/__init__.py rename src/backend/core/evolution/{ => assessment}/applicability.py (98%) rename src/backend/core/evolution/{ => assessment}/benchmark.py (98%) rename src/backend/core/evolution/{ => assessment}/evaluator.py (100%) rename src/backend/core/evolution/{ => assessment}/experiments.py (99%) rename src/backend/core/evolution/{ => assessment}/fault_injection.py (98%) rename src/backend/core/evolution/{ => assessment}/metrics.py (100%) rename src/backend/core/evolution/{ => assessment}/similarity.py (98%) rename src/backend/core/evolution/{ => assessment}/sop_judge.py (98%) create mode 100644 src/backend/core/evolution/cycle/__init__.py create mode 100644 src/backend/core/evolution/cycle/activation.py create mode 100644 src/backend/core/evolution/cycle/activation_constants.py create mode 100644 src/backend/core/evolution/cycle/activation_policy.py create mode 100644 src/backend/core/evolution/cycle/activation_types.py create mode 100644 src/backend/core/evolution/cycle/candidate_records.py create mode 100644 src/backend/core/evolution/cycle/composition_candidates.py create mode 100644 src/backend/core/evolution/cycle/cycle_extras.py create mode 100644 src/backend/core/evolution/cycle/cycle_extras_constants.py create mode 100644 src/backend/core/evolution/cycle/episode_views.py create mode 100644 src/backend/core/evolution/cycle/evaluation.py create mode 100644 src/backend/core/evolution/cycle/extra_findings.py create mode 100644 src/backend/core/evolution/cycle/graph_candidates.py create mode 100644 src/backend/core/evolution/cycle/loop.py create mode 100644 src/backend/core/evolution/cycle/memory_candidates.py create mode 100644 src/backend/core/evolution/cycle/memory_findings.py create mode 100644 src/backend/core/evolution/cycle/ordering.py create mode 100644 src/backend/core/evolution/cycle/patterns.py create mode 100644 src/backend/core/evolution/cycle/profile_release.py create mode 100644 src/backend/core/evolution/cycle/promotion.py create mode 100644 src/backend/core/evolution/cycle/promotion_constants.py create mode 100644 src/backend/core/evolution/cycle/promotion_types.py create mode 100644 src/backend/core/evolution/cycle/prompt_candidates.py rename src/backend/core/evolution/{ => cycle}/readiness.py (93%) rename src/backend/core/evolution/{ => cycle}/release.py (100%) create mode 100644 src/backend/core/evolution/cycle/retirement.py rename src/backend/core/evolution/{ => cycle}/runtime_binding.py (87%) create mode 100644 src/backend/core/evolution/cycle/skill_document.py create mode 100644 src/backend/core/evolution/cycle/skill_release.py rename src/backend/core/evolution/{ => cycle}/timescales.py (99%) rename src/backend/core/evolution/{ => cycle}/trigger.py (81%) create mode 100644 src/backend/core/evolution/cycle/usage_evidence.py delete mode 100644 src/backend/core/evolution/cycle_extras.py create mode 100644 src/backend/core/evolution/evidence/__init__.py rename src/backend/core/evolution/{ => evidence}/cassette.py (94%) rename src/backend/core/evolution/{ => evidence}/counterfactual.py (99%) rename src/backend/core/evolution/{ => evidence}/credit.py (99%) rename src/backend/core/evolution/{ => evidence}/events.py (99%) rename src/backend/core/evolution/{ => evidence}/evidence_contract.py (100%) rename src/backend/core/evolution/{ => evidence}/evidence_resolver.py (98%) rename src/backend/core/evolution/{ => evidence}/exposure.py (95%) rename src/backend/core/evolution/{ => evidence}/lineage.py (99%) rename src/backend/core/evolution/{ => evidence}/outcomes.py (100%) rename src/backend/core/evolution/{ => evidence}/replay.py (100%) rename src/backend/core/evolution/{ => evidence}/trace_assembler.py (98%) rename src/backend/core/evolution/{ => evidence}/trace_store.py (97%) create mode 100644 src/backend/core/evolution/generators/__init__.py rename src/backend/core/evolution/{ => generators}/graph_scan.py (100%) rename src/backend/core/evolution/{ => generators}/memory_apply.py (98%) rename src/backend/core/evolution/{ => generators}/memory_ops.py (99%) rename src/backend/core/evolution/{ => generators}/memory_scan.py (99%) rename src/backend/core/evolution/{ => generators}/ontology_bridge.py (100%) rename src/backend/core/evolution/{ => generators}/orchestration_gen.py (99%) rename src/backend/core/evolution/{ => generators}/prompt_gen.py (100%) rename src/backend/core/evolution/{ => generators}/skill_candidate_engine.py (96%) create mode 100644 src/backend/core/evolution/generators/skill_drafting.py create mode 100644 src/backend/core/evolution/generators/skill_evidence.py create mode 100644 src/backend/core/evolution/generators/skill_gen.py create mode 100644 src/backend/core/evolution/generators/skill_gen_constants.py delete mode 100644 src/backend/core/evolution/loop.py create mode 100644 src/backend/core/evolution/profiles/__init__.py create mode 100644 src/backend/core/evolution/profiles/agent_profile.py create mode 100644 src/backend/core/evolution/profiles/agent_profile_constants.py create mode 100644 src/backend/core/evolution/profiles/change_preview.py rename src/backend/core/evolution/{ => profiles}/console_view.py (99%) rename src/backend/core/evolution/{ => profiles}/federation.py (99%) rename src/backend/core/evolution/{ => profiles}/personal.py (88%) rename src/backend/core/evolution/{user_settings.py => profiles/personal_review.py} (60%) rename src/backend/core/evolution/{ => profiles}/policies.py (88%) rename src/backend/core/evolution/{ => profiles}/prefs.py (100%) create mode 100644 src/backend/core/evolution/profiles/profile_selection.py create mode 100644 src/backend/core/evolution/profiles/stall_hook.py create mode 100644 src/backend/core/evolution/profiles/user_settings.py create mode 100644 src/backend/core/evolution/profiles/user_settings_constants.py delete mode 100644 src/backend/core/evolution/promotion.py create mode 100644 src/backend/core/evolution/settlement/__init__.py create mode 100644 src/backend/core/evolution/settlement/memory_service.py rename src/backend/core/evolution/{ => settlement}/settlement.py (100%) rename src/backend/core/evolution/{ => settlement}/settlement_runner.py (88%) rename src/backend/core/evolution/{ => settlement}/settlement_store.py (98%) delete mode 100644 src/backend/core/evolution/skill_gen.py delete mode 100644 src/backend/core/extensions/__init__.py delete mode 100644 src/backend/core/extensions/registry.py create mode 100644 src/backend/core/files/__init__.py create mode 100644 src/backend/core/files/artifact_bytes.py rename src/backend/core/{ => files}/artifacts/__init__.py (96%) rename src/backend/core/{services/artifact_backfill.py => files/artifacts/backfill.py} (95%) create mode 100644 src/backend/core/files/artifacts/generated.py rename src/backend/core/{content/artifact_key_repair.py => files/artifacts/key_repair.py} (100%) rename src/backend/core/{ => files}/artifacts/local_reference.py (89%) rename src/backend/core/{services/artifact_location.py => files/artifacts/location.py} (52%) rename src/backend/core/{content/artifact_reader.py => files/artifacts/reader.py} (91%) rename src/backend/core/{content/artifact_refs.py => files/artifacts/refs.py} (93%) rename src/backend/core/{services/artifact_service.py => files/artifacts/service.py} (93%) rename src/backend/core/{ => files}/artifacts/store.py (96%) rename src/backend/core/{content/artifact_summary.py => files/artifacts/summary.py} (97%) rename src/backend/core/{services/artifact_text_service.py => files/artifacts/text.py} (92%) create mode 100644 src/backend/core/files/content/__init__.py rename src/backend/core/{ => files}/content/archive_browser.py (99%) rename src/backend/core/{ => files}/content/archive_limits.py (100%) create mode 100644 src/backend/core/files/content/branding.py create mode 100644 src/backend/core/files/content/content_blocks.py create mode 100644 src/backend/core/files/content/content_blocks_constants.py create mode 100644 src/backend/core/files/content/file_formats.py create mode 100644 src/backend/core/files/content/file_parser.py rename src/backend/core/{ => files}/content/file_validation.py (100%) rename src/backend/core/{ => files}/content/office.py (100%) rename src/backend/core/{ => files}/content/office_preview_cache.py (98%) create mode 100644 src/backend/core/files/content/parser_config.py create mode 100644 src/backend/core/files/content/pdf_parser.py create mode 100644 src/backend/core/files/content/presentation_parser.py create mode 100644 src/backend/core/files/content/spreadsheet_parser.py rename src/backend/core/{ => files}/content/svg_fit.py (97%) create mode 100644 src/backend/core/files/content/text_parser.py create mode 100644 src/backend/core/files/content/word_parser.py create mode 100644 src/backend/core/files/edition.py rename src/backend/core/{services => files}/folder_batch.py (69%) rename src/backend/core/{services/personal_file_operations.py => files/personal_operations.py} (86%) rename src/backend/core/{ => files}/spaces/__init__.py (100%) rename src/backend/core/{ => files}/spaces/access.py (95%) rename src/backend/core/{ => files}/spaces/files.py (96%) rename src/backend/core/{ => files}/spaces/leases.py (86%) rename src/backend/core/{ => files}/spaces/mounts.py (78%) rename src/backend/core/{ => files}/spaces/projects.py (94%) rename src/backend/core/{ => files}/spaces/recovery.py (94%) rename src/backend/core/{ => files}/spaces/sandbox.py (73%) rename src/backend/core/{ => files}/spaces/search.py (97%) rename src/backend/core/{ => files}/spaces/text.py (92%) rename src/backend/core/{ => files}/spaces/tree.py (100%) rename src/backend/core/{ => files}/storage/__init__.py (56%) rename src/backend/core/{ => files}/storage/entries.py (100%) rename src/backend/core/{ => files}/storage/factory.py (81%) rename src/backend/core/{ => files}/storage/local.py (96%) rename src/backend/core/{ => files}/storage/local_directory.py (94%) rename src/backend/core/{ => files}/storage/local_paths.py (98%) rename src/backend/core/{ => files}/storage/protocol.py (100%) rename src/backend/core/{ => files}/storage/s3.py (98%) rename src/backend/core/{ => files}/storage/s3_directory.py (96%) rename src/backend/core/{services => files}/upload_retry.py (92%) rename src/backend/core/{capabilities/errors.py => harness/capability_errors.py} (100%) create mode 100644 src/backend/core/harness/context_items.py rename src/backend/core/{llm => harness}/execution_manifest.py (99%) rename src/backend/core/{services/harness_ledger.py => harness/ledger.py} (53%) create mode 100644 src/backend/core/harness/log_audit.py create mode 100644 src/backend/core/harness/log_context.py create mode 100644 src/backend/core/harness/log_records.py create mode 100644 src/backend/core/harness/log_writer.py create mode 100644 src/backend/core/harness/log_writer_constants.py create mode 100644 src/backend/core/harness/observation_writer.py create mode 100644 src/backend/core/harness/registry/__init__.py create mode 100644 src/backend/core/harness/registry/authentication.py create mode 100644 src/backend/core/harness/registry/build_governance.py create mode 100644 src/backend/core/harness/registry/cache_invalidation.py create mode 100644 src/backend/core/harness/registry/capability_management.py create mode 100644 src/backend/core/harness/registry/capability_revisions.py create mode 100644 src/backend/core/harness/registry/capability_runtime.py create mode 100644 src/backend/core/harness/registry/catalog_options.py create mode 100644 src/backend/core/harness/registry/chat_execution.py create mode 100644 src/backend/core/harness/registry/chat_history.py create mode 100644 src/backend/core/harness/registry/compaction.py create mode 100644 src/backend/core/harness/registry/device_catalog.py rename src/backend/core/{extensions => harness/registry}/edition.py (100%) create mode 100644 src/backend/core/harness/registry/evaluation.py create mode 100644 src/backend/core/harness/registry/execution_account.py create mode 100644 src/backend/core/harness/registry/execution_catalog.py create mode 100644 src/backend/core/harness/registry/execution_identity.py create mode 100644 src/backend/core/harness/registry/hook_factories.py create mode 100644 src/backend/core/harness/registry/host_runtime.py create mode 100644 src/backend/core/harness/registry/job_operations.py create mode 100644 src/backend/core/harness/registry/local_files.py create mode 100644 src/backend/core/harness/registry/local_publication.py create mode 100644 src/backend/core/harness/registry/marketplace_catalog.py create mode 100644 src/backend/core/harness/registry/mcp_clients.py create mode 100644 src/backend/core/harness/registry/model_credentials.py create mode 100644 src/backend/core/harness/registry/model_services.py create mode 100644 src/backend/core/harness/registry/package_sources.py create mode 100644 src/backend/core/harness/registry/package_views.py create mode 100644 src/backend/core/harness/registry/registry.py create mode 100644 src/backend/core/harness/registry/resource_owners.py create mode 100644 src/backend/core/harness/registry/retrieval_context.py create mode 100644 src/backend/core/harness/registry/run_cancellation.py create mode 100644 src/backend/core/harness/registry/run_capabilities.py create mode 100644 src/backend/core/harness/registry/schema_lifecycle.py create mode 100644 src/backend/core/harness/registry/skill_content.py create mode 100644 src/backend/core/harness/registry/system_configuration.py create mode 100644 src/backend/core/harness/registry/tool_operations.py rename src/backend/core/{services/desktop_gateway_uploads.py => harness/registry/transfer_channels.py} (53%) create mode 100644 src/backend/core/harness/registry/user_cleanup.py create mode 100644 src/backend/core/harness/tool_call_context.py create mode 100644 src/backend/core/harness/tool_effect_context.py create mode 100644 src/backend/core/infra/byte_range.py rename src/backend/core/{capabilities/junction.py => infra/directory_links.py} (92%) create mode 100644 src/backend/core/infra/failures.py rename src/backend/core/{capabilities/lockfile.py => infra/file_lock.py} (100%) rename src/backend/core/{ => infra}/immutable.py (100%) create mode 100644 src/backend/core/infra/json_output.py create mode 100644 src/backend/core/infra/local_runtime/__init__.py create mode 100644 src/backend/core/infra/local_runtime/dynamic_servers.py rename src/backend/{orchestration/local_sidecar_lifecycle.py => core/infra/local_runtime/lifecycle.py} (89%) rename src/backend/core/{sandbox/providers/script_runner/auth.py => infra/local_runtime/runner_auth.py} (100%) rename src/backend/{orchestration/local_subprocess.py => core/infra/local_runtime/startup.py} (87%) create mode 100644 src/backend/core/infra/model_output.py create mode 100644 src/backend/core/infra/probes/__init__.py rename src/backend/core/{services/edition_service_probe.py => infra/probes/edition.py} (100%) rename src/backend/core/{services => infra/probes}/service_probes.py (89%) delete mode 100644 src/backend/core/infra/rate_limit.py rename src/backend/core/{chat/display_bounds.py => infra/text_bounds.py} (100%) rename src/backend/{orchestration => core}/jobs/__init__.py (100%) rename src/backend/{orchestration => core}/jobs/agent.py (94%) rename src/backend/{orchestration => core}/jobs/callback.py (100%) rename src/backend/{orchestration => core}/jobs/files.py (95%) rename src/backend/{orchestration => core}/jobs/notifications.py (81%) rename src/backend/{orchestration => core}/jobs/owner.py (62%) rename src/backend/{orchestration => core}/jobs/process.py (95%) create mode 100644 src/backend/core/jobs/reminder_hook.py rename src/backend/{orchestration => core}/jobs/runner.py (100%) rename src/backend/{orchestration/job_runtime.py => core/jobs/runtime.py} (85%) rename src/backend/{orchestration => core}/jobs/sdk.py (100%) rename src/backend/{orchestration => core}/jobs/state.py (98%) rename src/backend/core/{services/job_service.py => jobs/store.py} (100%) rename src/backend/{orchestration => core}/jobs/supervisor.py (88%) create mode 100644 src/backend/core/jobs/tool_operations.py delete mode 100644 src/backend/core/kb/kb_assets.py delete mode 100644 src/backend/core/kb/kb_parser.py delete mode 100644 src/backend/core/kb/kb_vector.py delete mode 100644 src/backend/core/kb/wiki/local_provider.py delete mode 100644 src/backend/core/llm/_distill_shared.py create mode 100644 src/backend/core/llm/api_runtime/__init__.py rename src/backend/core/llm/{agent_api_runtime.py => api_runtime/agent.py} (97%) rename src/backend/core/llm/{agent_api_skills.py => api_runtime/agent_skills.py} (96%) rename src/backend/core/llm/{agent_api_tools.py => api_runtime/agent_tools.py} (90%) rename src/backend/core/llm/{project_api_runtime.py => api_runtime/project.py} (94%) delete mode 100644 src/backend/core/llm/capability_tools.py create mode 100644 src/backend/core/llm/citations/__init__.py create mode 100644 src/backend/core/llm/citations/allocator.py create mode 100644 src/backend/core/llm/citations/anchor.py create mode 100644 src/backend/core/llm/citations/anchor_state.py create mode 100644 src/backend/core/llm/citations/extraction.py create mode 100644 src/backend/core/llm/citations/hook.py create mode 100644 src/backend/core/llm/citations/types.py delete mode 100644 src/backend/core/llm/command_middleware.py create mode 100644 src/backend/core/llm/context/__init__.py create mode 100644 src/backend/core/llm/context/adapter.py create mode 100644 src/backend/core/llm/context/attachment_hook.py rename src/backend/core/{services/compaction_budget.py => llm/context/budget.py} (98%) rename src/backend/core/llm/{ => context}/compacting_agent.py (96%) rename src/backend/core/llm/{ => context}/compaction.py (98%) create mode 100644 src/backend/core/llm/context/content.py create mode 100644 src/backend/core/llm/context/ir.py create mode 100644 src/backend/core/llm/context/ir_constants.py create mode 100644 src/backend/core/llm/context/items.py create mode 100644 src/backend/core/llm/context/message_defaults.py rename src/backend/core/llm/{ => context}/offloader.py (96%) create mode 100644 src/backend/core/llm/context/provider_conversion.py create mode 100644 src/backend/core/llm/context/reasoning_hooks.py create mode 100644 src/backend/core/llm/context/reference_conversion.py create mode 100644 src/backend/core/llm/context/rendering.py rename src/backend/core/llm/{context_safety.py => context/safety.py} (87%) rename src/backend/core/llm/{ => context}/system_reminder.py (94%) rename src/backend/core/llm/{context_usage.py => context/usage.py} (99%) create mode 100644 src/backend/core/llm/context/workspace_hooks.py delete mode 100644 src/backend/core/llm/context_adapter.py delete mode 100644 src/backend/core/llm/context_ir.py rename src/backend/core/llm/factory/{selection/device_bindings.py => runtime/capability_bindings.py} (93%) rename src/backend/{orchestration/registry.py => core/llm/factory/specs.py} (99%) create mode 100644 src/backend/core/llm/factory/tools/definitions.py delete mode 100644 src/backend/core/llm/finish_guard.py delete mode 100644 src/backend/core/llm/hooks.py create mode 100644 src/backend/core/llm/host_services.py delete mode 100644 src/backend/core/llm/management_tool.py create mode 100644 src/backend/core/llm/mcp/__init__.py create mode 100644 src/backend/core/llm/mcp/callbacks.py create mode 100644 src/backend/core/llm/mcp/chat_sessions.py create mode 100644 src/backend/core/llm/mcp/client.py create mode 100644 src/backend/core/llm/mcp/context_tools.py create mode 100644 src/backend/core/llm/mcp/deadline.py rename src/backend/core/llm/{mcp_invocation.py => mcp/invocation.py} (87%) create mode 100644 src/backend/core/llm/mcp/lifetime.py create mode 100644 src/backend/core/llm/mcp/manager.py create mode 100644 src/backend/core/llm/mcp/results.py create mode 100644 src/backend/core/llm/mcp/session.py create mode 100644 src/backend/core/llm/mcp/tools.py delete mode 100644 src/backend/core/llm/mcp_manager.py delete mode 100644 src/backend/core/llm/mcp_pool.py create mode 100644 src/backend/core/llm/middleware/__init__.py rename src/backend/core/llm/{middleware_migration.py => middleware/migration_map.py} (51%) delete mode 100644 src/backend/core/llm/middlewares.py delete mode 100644 src/backend/core/llm/persona_distiller.py create mode 100644 src/backend/core/llm/ports.py delete mode 100644 src/backend/core/llm/project_environment_middleware.py create mode 100644 src/backend/core/llm/prompt_files.py create mode 100644 src/backend/core/llm/prompt_kinds.py create mode 100644 src/backend/core/llm/prompt_rendering.py create mode 100644 src/backend/core/llm/prompt_storage.py create mode 100644 src/backend/core/llm/prompt_versions.py create mode 100644 src/backend/core/llm/prompt_versions_state.py delete mode 100644 src/backend/core/llm/providers/__init__.py create mode 100644 src/backend/core/llm/runtime/__init__.py rename src/backend/core/llm/{ => runtime}/agentscope_hook_adapter.py (63%) create mode 100644 src/backend/core/llm/runtime/context_hook_adapter.py create mode 100644 src/backend/core/llm/runtime/delta_coalescer.py create mode 100644 src/backend/core/llm/runtime/file_context.py create mode 100644 src/backend/core/llm/runtime/finish_guard.py create mode 100644 src/backend/core/llm/runtime/hooks_constants.py rename src/backend/core/llm/{ => runtime}/human_interaction.py (86%) rename src/backend/core/llm/{ => runtime}/interaction_store.py (100%) rename src/backend/core/llm/{ => runtime}/manifest_agent.py (93%) rename src/backend/core/llm/{ => runtime}/message_compat.py (93%) create mode 100644 src/backend/core/llm/runtime/model_cache.py create mode 100644 src/backend/core/llm/runtime/model_selection_adapter.py rename src/backend/core/llm/{ => runtime}/model_steps.py (98%) rename src/backend/core/llm/{ => runtime}/project_environment.py (88%) create mode 100644 src/backend/core/llm/runtime/project_environment_hook.py create mode 100644 src/backend/core/llm/runtime/review_text_agent.py rename src/backend/core/llm/{ => runtime}/session_capabilities.py (97%) create mode 100644 src/backend/core/llm/runtime/state.py create mode 100644 src/backend/core/llm/runtime/stream_events.py create mode 100644 src/backend/core/llm/runtime/stream_loop.py create mode 100644 src/backend/core/llm/runtime/stream_text.py create mode 100644 src/backend/core/llm/runtime/streaming.py create mode 100644 src/backend/core/llm/runtime/streaming_constants.py rename src/backend/{orchestration => core/llm/runtime}/tool_callbacks.py (70%) create mode 100644 src/backend/core/llm/runtime/tool_execution_adapter.py create mode 100644 src/backend/core/llm/runtime/tool_hook_adapter.py rename src/backend/core/llm/{ => runtime}/tool_media_store.py (95%) create mode 100644 src/backend/core/llm/runtime/tool_result_adapter.py create mode 100644 src/backend/core/llm/runtime/turn_state.py rename src/backend/core/llm/{ => runtime}/workspace.py (100%) rename src/backend/core/{agent_skills/selector.py => llm/skill_selection.py} (91%) delete mode 100644 src/backend/core/llm/steer_middleware.py create mode 100644 src/backend/core/llm/subagents/__init__.py rename src/backend/core/llm/{_subagent_execution.py => subagents/execution.py} (90%) rename src/backend/core/llm/{_subagent_prompts.py => subagents/prompts.py} (100%) rename src/backend/core/llm/{subagent_sessions.py => subagents/sessions.py} (98%) rename src/backend/core/llm/{_subagent_stream.py => subagents/stream.py} (80%) rename src/backend/core/llm/{subagent_tool.py => subagents/tool.py} (89%) delete mode 100644 src/backend/core/llm/tool_collector.py create mode 100644 src/backend/core/llm/tool_permissions/hook.py delete mode 100644 src/backend/core/llm/tool_permissions/middleware.py rename src/backend/core/llm/{gateway_mcp_tool.py => tools/cloud_gateway.py} (71%) create mode 100644 src/backend/core/llm/tools/cloud_manifest.py rename src/backend/core/llm/tools/{_tool_confirmation => confirmation}/__init__.py (100%) rename src/backend/core/llm/tools/{_tool_confirmation => confirmation}/gate.py (99%) rename src/backend/core/llm/tools/{_tool_confirmation => confirmation}/pending.py (96%) rename src/backend/core/llm/tools/{_tool_confirmation => confirmation}/shared.py (98%) rename src/backend/core/llm/tools/{_tool_confirmation => confirmation}/state.py (89%) delete mode 100644 src/backend/core/llm/tools/data_context_tool.py create mode 100644 src/backend/core/llm/tools/management.py rename src/backend/core/{ontology/toolkit.py => llm/tools/ontology_toolkit.py} (85%) rename src/backend/core/llm/{plan_update_tool.py => tools/plan_update.py} (92%) rename src/backend/core/{plugins/runtime/activation.py => llm/tools/plugin_activation.py} (78%) create mode 100644 src/backend/core/memory/edition.py create mode 100644 src/backend/core/memory/graph_contract.py create mode 100644 src/backend/core/memory/graph_state.py rename src/backend/core/{services/memory_settings_service.py => memory/settings.py} (98%) create mode 100644 src/backend/core/memory/settlement_port.py create mode 100644 src/backend/core/models/__init__.py create mode 100644 src/backend/core/models/admission.py create mode 100644 src/backend/core/models/api_protocol_backfill.py rename src/backend/core/{llm => models}/chat_models.py (92%) create mode 100644 src/backend/core/models/completions/__init__.py rename src/backend/core/{llm => models/completions}/classifier.py (84%) rename src/backend/core/{llm => models/completions}/single_turn.py (96%) rename src/backend/core/{llm => models/completions}/summarizer.py (86%) rename src/backend/core/{services/model_config.py => models/config.py} (59%) create mode 100644 src/backend/core/models/constants.py rename src/backend/core/{llm/context_manager.py => models/context_window.py} (97%) create mode 100644 src/backend/core/models/embedding.py create mode 100644 src/backend/core/models/embedding_state.py rename src/backend/core/{llm => models}/failover.py (94%) rename src/backend/core/{db/model_import_validation.py => models/import_validation.py} (93%) create mode 100644 src/backend/core/models/providers/__init__.py rename src/backend/core/{llm => models}/providers/_image_tokens.py (96%) rename src/backend/core/{llm => models}/providers/context_probe.py (99%) rename src/backend/core/{llm => models}/providers/openai_compat.py (96%) rename src/backend/core/{llm => models}/providers/protocol_probe.py (100%) rename src/backend/core/{llm => models}/providers/reasoning_probe.py (97%) rename src/backend/core/{llm => models}/providers/registry.py (99%) rename src/backend/core/{llm => models}/providers/stream_retry.py (96%) rename src/backend/core/{llm => models}/providers/vendor_models.py (97%) rename src/backend/core/{llm => models}/reasoning_effort.py (100%) rename src/backend/core/{llm => models}/reasoning_replay.py (100%) rename src/backend/core/{db/model_repository.py => models/repository.py} (99%) create mode 100644 src/backend/core/models/reranking.py rename src/backend/core/{llm/responses_models.py => models/responses.py} (80%) rename src/backend/core/{services/user_model_selection.py => models/selection.py} (63%) create mode 100644 src/backend/core/models/selection_hook.py rename src/backend/core/{llm => models}/tool_call_identity.py (100%) rename src/backend/core/{llm => models}/tool_result_media.py (69%) rename src/backend/core/{llm/model_usage.py => models/usage.py} (98%) create mode 100644 src/backend/core/models/vision/__init__.py rename src/backend/core/{ => models}/vision/attachments.py (83%) rename src/backend/core/{ => models}/vision/prompt.py (98%) rename src/backend/core/{ => models}/vision/provider.py (97%) rename src/backend/core/{ => models}/vision/render.py (98%) rename src/backend/core/{ => models}/vision/schema.py (100%) rename src/backend/core/{ => models}/vision/service.py (96%) delete mode 100644 src/backend/core/myspace/duplicate_cleanup.py create mode 100644 src/backend/core/ontology/audit_events.py rename src/backend/core/{services/ontology_evolution_service.py => ontology/evolution.py} (87%) create mode 100644 src/backend/core/ontology/host.py create mode 100644 src/backend/core/ontology/manual_review.py create mode 100644 src/backend/core/ontology/output_review_state.py rename src/backend/core/{services/ontology_policy.py => ontology/policy.py} (97%) create mode 100644 src/backend/core/ontology/review_operations.py create mode 100644 src/backend/core/ontology/review_prompt.py create mode 100644 src/backend/core/ontology/reviewer.py create mode 100644 src/backend/core/ontology/reviewer_state.py create mode 100644 src/backend/core/ontology/runtime_gates.py create mode 100644 src/backend/core/ontology/runtime_pack.py create mode 100644 src/backend/core/ontology/runtime_policy.py rename src/backend/core/{services/ontology_service.py => ontology/service.py} (68%) create mode 100644 src/backend/core/ontology/tool_hook.py create mode 100644 src/backend/core/ontology/validation_models.py delete mode 100644 src/backend/core/plugins/README.md delete mode 100644 src/backend/core/plugins/management/__init__.py delete mode 100644 src/backend/core/plugins/resources/application.py delete mode 100644 src/backend/core/plugins/resources/application_cleanup.py delete mode 100644 src/backend/core/plugins/resources/deadlines.py delete mode 100644 src/backend/core/plugins/resources/owners.py delete mode 100644 src/backend/core/plugins/resources/prewarm.py delete mode 100644 src/backend/core/plugins/resources/reservation.py delete mode 100644 src/backend/core/plugins/resources/service.py create mode 100644 src/backend/core/projects/__init__.py rename src/backend/core/{services/project_access.py => projects/access.py} (90%) rename src/backend/core/{services/project_api_service.py => projects/api.py} (97%) rename src/backend/core/{services/project_service.py => projects/base.py} (85%) create mode 100644 src/backend/core/projects/edition.py rename src/backend/core/{project_environment => projects/environment}/__init__.py (100%) rename src/backend/core/{project_environment => projects/environment}/config.py (100%) rename src/backend/core/{project_environment => projects/environment}/dependencies.py (96%) rename src/backend/core/{services/project_environment.py => projects/environment/service.py} (86%) rename src/backend/core/{services/project_environment_resources.py => projects/environment_resources.py} (90%) rename src/backend/core/{services/project_file_service.py => projects/files.py} (78%) rename src/backend/core/{services/project_instructions.py => projects/instructions.py} (95%) rename src/backend/core/{services/local_project_workspace.py => projects/local_workspace.py} (97%) rename src/backend/core/{services/project_scope.py => projects/personal_scope.py} (95%) create mode 100644 src/backend/core/projects/personal_summary.py rename src/backend/core/{services/project_transfer.py => projects/personal_transfer.py} (100%) create mode 100644 src/backend/core/projects/project_names.py rename src/backend/core/{services/project_source.py => projects/source.py} (91%) rename src/backend/core/{services/user_folder_service.py => projects/user_folders.py} (95%) create mode 100644 src/backend/core/runs/__init__.py rename src/backend/{orchestration/agent_api_recovery.py => core/runs/api_recovery.py} (94%) rename src/backend/core/{services/run_binding.py => runs/binding.py} (73%) create mode 100644 src/backend/core/runs/clock.py create mode 100644 src/backend/core/runs/events/__init__.py create mode 100644 src/backend/core/runs/events/projection.py rename src/backend/{orchestration/run_event_stream.py => core/runs/events/store.py} (84%) create mode 100644 src/backend/core/runs/events/subscription.py create mode 100644 src/backend/core/runs/events/writer.py create mode 100644 src/backend/core/runs/host.py rename src/backend/core/{services/run_journal.py => runs/journal.py} (94%) rename src/backend/core/{services/run_journal_domain.py => runs/journal_domain.py} (100%) rename src/backend/core/{services/run_journal_lifecycle.py => runs/journal_lifecycle.py} (93%) rename src/backend/core/{services/run_journal_recovery.py => runs/journal_recovery.py} (97%) create mode 100644 src/backend/core/runs/ownership.py create mode 100644 src/backend/core/runs/runtime.py create mode 100644 src/backend/core/runs/settings.py create mode 100644 src/backend/core/runs/tasks.py rename src/backend/{orchestration => core/runs}/tool_effect_recovery.py (68%) create mode 100644 src/backend/core/runs/tool_effects/__init__.py create mode 100644 src/backend/core/runs/tool_effects/arguments.py create mode 100644 src/backend/core/runs/tool_effects/errors.py create mode 100644 src/backend/core/runs/tool_effects/gateway.py create mode 100644 src/backend/core/runs/tool_effects/hooks.py create mode 100644 src/backend/core/runs/tool_effects/host.py create mode 100644 src/backend/core/runs/tool_effects/intent_transactions.py create mode 100644 src/backend/core/runs/tool_effects/invocation_claims.py create mode 100644 src/backend/core/runs/tool_effects/journal.py create mode 100644 src/backend/core/runs/tool_effects/journal_constants.py create mode 100644 src/backend/core/runs/tool_effects/recovery.py create mode 100644 src/backend/core/runs/tool_effects/recovery_claims.py create mode 100644 src/backend/core/runs/tool_effects/registry.py create mode 100644 src/backend/core/runs/tool_effects/result_transactions.py create mode 100644 src/backend/core/runs/tool_effects/retention.py create mode 100644 src/backend/core/runs/tool_effects/types.py create mode 100644 src/backend/core/runs/watchdog.py create mode 100644 src/backend/core/sandbox/commands/__init__.py create mode 100644 src/backend/core/sandbox/commands/completion_hook.py rename src/backend/core/{services => sandbox}/commands/context.py (85%) rename src/backend/core/{services => sandbox}/commands/delivery.py (92%) rename src/backend/{orchestration => core/sandbox}/commands/events.py (93%) rename src/backend/{orchestration => core/sandbox}/commands/notifications.py (77%) create mode 100644 src/backend/core/sandbox/commands/runtime.py rename src/backend/core/{services => sandbox}/commands/store.py (95%) rename src/backend/{orchestration => core/sandbox}/commands/subscription.py (66%) create mode 100644 src/backend/core/sandbox/credential_dispatch.py rename src/backend/core/{llm/tool_permissions => sandbox/permissions}/account.py (90%) rename src/backend/core/{llm/tool_permissions/preferences.py => sandbox/permissions/approval.py} (94%) rename src/backend/core/{llm/tool_permissions/models.py => sandbox/permissions/dispatch_models.py} (98%) rename src/backend/core/{llm/tool_permissions/specs.py => sandbox/permissions/tool_specs.py} (95%) create mode 100644 src/backend/core/sandbox/permissions/vocabulary.py delete mode 100644 src/backend/core/sandbox/providers/opensandbox/account_volumes.py rename src/backend/core/{llm/tools/_paths.py => sandbox/workspace/resolution.py} (88%) delete mode 100644 src/backend/core/services/__init__.py delete mode 100644 src/backend/core/services/agent_market_categories.py delete mode 100644 src/backend/core/services/agent_market_service.py delete mode 100644 src/backend/core/services/api_protocol_backfill.py delete mode 100644 src/backend/core/services/artifact_edition.py delete mode 100644 src/backend/core/services/automation_tool_routing.py delete mode 100644 src/backend/core/services/chat_service.py delete mode 100644 src/backend/core/services/commands/__init__.py delete mode 100644 src/backend/core/services/desktop_cloud_bridge.py delete mode 100644 src/backend/core/services/edition_system_config.py delete mode 100644 src/backend/core/services/edition_workspace.py delete mode 100644 src/backend/core/services/kb_edition.py delete mode 100644 src/backend/core/services/lark_service.py delete mode 100644 src/backend/core/services/log_service.py delete mode 100644 src/backend/core/services/marketplace_service.py delete mode 100644 src/backend/core/services/mcp_marketplace_service.py delete mode 100644 src/backend/core/services/mcp_oauth_service.py delete mode 100644 src/backend/core/services/mcp_tool_metadata.py delete mode 100644 src/backend/core/services/mcp_tool_schema_backfill.py delete mode 100644 src/backend/core/services/prompt_version_service.py delete mode 100644 src/backend/core/services/session_operations/admission.py delete mode 100644 src/backend/core/services/skill_draft_service.py delete mode 100644 src/backend/core/services/system_config.py delete mode 100644 src/backend/core/services/tool_effect_ledger.py delete mode 100644 src/backend/core/services/user_agent_base.py delete mode 100644 src/backend/core/spaces/edition_access.py delete mode 100644 src/backend/core/spaces/edition_revocation.py delete mode 100644 src/backend/core/vision/__init__.py create mode 100644 src/backend/features/__init__.py create mode 100644 src/backend/features/automation/README.md create mode 100644 src/backend/features/automation/__init__.py create mode 100644 src/backend/features/automation/admission.py create mode 100644 src/backend/features/automation/api/__init__.py rename src/backend/{api/routes/v1 => features/automation/api}/automations.py (94%) rename src/backend/{core/services => features/automation}/delivery_targets.py (75%) rename src/backend/{core/services/automation_execution.py => features/automation/execution.py} (96%) create mode 100644 src/backend/features/automation/extension.py rename src/backend/{core/services/loop_service.py => features/automation/loops.py} (99%) rename src/backend/{core/db/models/automation.py => features/automation/models.py} (64%) rename src/backend/{core/services/automation_notifications.py => features/automation/notifications.py} (100%) rename src/backend/{core/services/automation_remote_effect.py => features/automation/remote_effect.py} (97%) create mode 100644 src/backend/features/automation/runs.py create mode 100644 src/backend/features/automation/scheduling.py create mode 100644 src/backend/features/automation/schema.py rename src/backend/{core/services/automation_service.py => features/automation/service.py} (73%) create mode 100644 src/backend/features/automation/tool_routing.py create mode 100644 src/backend/features/desktop/README.md create mode 100644 src/backend/features/desktop/__init__.py create mode 100644 src/backend/features/desktop/api/__init__.py create mode 100644 src/backend/features/desktop/api/capability_auth.py create mode 100644 src/backend/features/desktop/api/capability_bridge.py create mode 100644 src/backend/features/desktop/api/capability_dependencies.py create mode 100644 src/backend/features/desktop/api/capability_manifests.py create mode 100644 src/backend/features/desktop/api/capability_mcp_gateway.py create mode 100644 src/backend/features/desktop/api/capability_model_gateway.py create mode 100644 src/backend/features/desktop/api/capability_tools.py create mode 100644 src/backend/features/desktop/api/capability_workcopies.py rename src/backend/{api/routes/v1 => features/desktop/api}/desktop.py (99%) rename src/backend/{api/routes/v1 => features/desktop/api}/desktop_capabilities.py (80%) create mode 100644 src/backend/features/desktop/api/desktop_capability.py create mode 100644 src/backend/features/desktop/api/desktop_capability_state.py rename src/backend/{api/routes/v1 => features/desktop/api}/desktop_login.py (99%) rename src/backend/{api/routes/v1 => features/desktop/api}/desktop_observability.py (90%) rename src/backend/{api/routes/v1 => features/desktop/api}/device_link.py (95%) rename src/backend/{api/routes/v1 => features/desktop/api}/local.py (82%) rename src/backend/{api/routes => features/desktop/api}/local_file_actions.py (93%) create mode 100644 src/backend/features/desktop/auth/__init__.py rename src/backend/{core/auth/desktop_bridge.py => features/desktop/auth/bridge.py} (92%) rename src/backend/{core/auth/desktop_login_store.py => features/desktop/auth/login_store.py} (100%) rename src/backend/{core/auth/desktop_ticket_store.py => features/desktop/auth/ticket_store.py} (100%) create mode 100644 src/backend/features/desktop/bridge/__init__.py rename src/backend/{core/services/desktop_cloud_bundles.py => features/desktop/bridge/bundles.py} (88%) create mode 100644 src/backend/features/desktop/bridge/client.py create mode 100644 src/backend/features/desktop/bridge/client_state.py create mode 100644 src/backend/features/desktop/bridge/gateway.py create mode 100644 src/backend/features/desktop/bridge/identity.py create mode 100644 src/backend/features/desktop/bridge/managed_connectors.py rename src/backend/{core/services/desktop_model_credentials.py => features/desktop/bridge/model_credentials.py} (86%) rename src/backend/{core/services/desktop_release_events.py => features/desktop/bridge/release_events.py} (100%) rename src/backend/{core/services/desktop_resource_plugins.py => features/desktop/bridge/resource_plugins.py} (86%) rename src/backend/{core/services/desktop_cloud_skills.py => features/desktop/bridge/skills.py} (86%) create mode 100644 src/backend/features/desktop/bridge/status.py create mode 100644 src/backend/features/desktop/capabilities/__init__.py rename src/backend/{core => features/desktop}/capabilities/agents.py (93%) rename src/backend/{core => features/desktop}/capabilities/change_merge.py (94%) rename src/backend/{core => features/desktop}/capabilities/change_signal.py (100%) rename src/backend/{core => features/desktop}/capabilities/change_sync.py (87%) rename src/backend/{core => features/desktop}/capabilities/connectors.py (90%) rename src/backend/{core => features/desktop}/capabilities/credentials.py (100%) rename src/backend/{core => features/desktop}/capabilities/dependency.py (94%) rename src/backend/{core => features/desktop}/capabilities/dependency_declarations.py (100%) rename src/backend/{core => features/desktop}/capabilities/device_catalog.py (81%) rename src/backend/{core => features/desktop}/capabilities/device_plugin_catalog.py (69%) rename src/backend/{core => features/desktop}/capabilities/discovery.py (85%) rename src/backend/{core => features/desktop}/capabilities/invocation.py (74%) rename src/backend/{core => features/desktop}/capabilities/local_plugin_runtime.py (72%) rename src/backend/{core => features/desktop}/capabilities/local_projection.py (79%) rename src/backend/{core => features/desktop}/capabilities/management_context.py (82%) rename src/backend/{core => features/desktop}/capabilities/manifest_order.py (96%) rename src/backend/{core => features/desktop}/capabilities/mcp_json.py (98%) rename src/backend/{core => features/desktop}/capabilities/migration.py (92%) rename src/backend/{core => features/desktop}/capabilities/paths.py (80%) rename src/backend/{core => features/desktop}/capabilities/plugins.py (87%) rename src/backend/{core => features/desktop}/capabilities/preparation.py (89%) rename src/backend/{core => features/desktop}/capabilities/readiness.py (92%) rename src/backend/{core => features/desktop}/capabilities/registry.py (84%) create mode 100644 src/backend/features/desktop/capabilities/registry_types.py rename src/backend/{core => features/desktop}/capabilities/resolver.py (98%) create mode 100644 src/backend/features/desktop/capabilities/runtime/__init__.py rename src/backend/{core => features/desktop}/capabilities/runtime/connectors.py (92%) rename src/backend/{core => features/desktop}/capabilities/runtime/dependencies.py (93%) rename src/backend/{core => features/desktop}/capabilities/runtime/preparation.py (86%) rename src/backend/{core => features/desktop}/capabilities/runtime/state.py (89%) rename src/backend/{core => features/desktop}/capabilities/session_availability.py (100%) create mode 100644 src/backend/features/desktop/capabilities/skill_account.py create mode 100644 src/backend/features/desktop/capabilities/skill_candidates.py create mode 100644 src/backend/features/desktop/capabilities/skill_hashes.py create mode 100644 src/backend/features/desktop/capabilities/skill_paths.py create mode 100644 src/backend/features/desktop/capabilities/skill_publication.py create mode 100644 src/backend/features/desktop/capabilities/skill_views.py create mode 100644 src/backend/features/desktop/capabilities/skills.py create mode 100644 src/backend/features/desktop/capabilities/skills_state.py rename src/backend/{core => features/desktop}/capabilities/store.py (94%) rename src/backend/{core => features/desktop}/capabilities/view.py (97%) rename src/backend/{core => features/desktop}/capabilities/warmup.py (72%) create mode 100644 src/backend/features/desktop/capability/__init__.py rename src/backend/{core/services/desktop_capability_configs.py => features/desktop/capability/configs.py} (91%) rename src/backend/{core/services/desktop_capability_credentials.py => features/desktop/capability/credentials.py} (98%) rename src/backend/{core/services/desktop_capability_entities.py => features/desktop/capability/entities.py} (91%) rename src/backend/{core/services/desktop_capability_mcp.py => features/desktop/capability/mcp.py} (85%) rename src/backend/{core/services/desktop_capability_models.py => features/desktop/capability/models.py} (93%) create mode 100644 src/backend/features/desktop/capability/revision_provider.py rename src/backend/{core/services/desktop_capability_security.py => features/desktop/capability/security.py} (96%) rename src/backend/{core/services/desktop_capability.py => features/desktop/capability/service.py} (90%) rename src/backend/{core/services/desktop_capability_skills.py => features/desktop/capability/skills.py} (86%) rename src/backend/{core/services/desktop_capability_sync_check.py => features/desktop/capability/sync_check.py} (79%) rename src/backend/{core/services/capability_workcopies.py => features/desktop/capability/workcopies.py} (89%) create mode 100644 src/backend/features/desktop/edition.py create mode 100644 src/backend/features/desktop/extension.py create mode 100644 src/backend/features/desktop/gateway/__init__.py rename src/backend/{core/services/desktop_gateway_observability.py => features/desktop/gateway/observability.py} (98%) create mode 100644 src/backend/features/desktop/local/__init__.py rename src/backend/{core/services/local_file_actions.py => features/desktop/local/file_actions.py} (99%) rename src/backend/{core/services/local_grant_service.py => features/desktop/local/grants.py} (100%) rename src/backend/{core/services/local_management_migration.py => features/desktop/local/management_migration.py} (85%) create mode 100644 src/backend/features/desktop/local/manager_execution.py rename src/backend/{core/services/local_market_install.py => features/desktop/local/market_install.py} (61%) rename src/backend/{core/services => features/desktop/local}/native_app_icons.py (100%) rename src/backend/{core/plugins/local => features/desktop/local/plugins}/__init__.py (100%) rename src/backend/{core/plugins/local => features/desktop/local/plugins}/assets.py (92%) rename src/backend/{core/plugins/local => features/desktop/local/plugins}/legacy_migration.py (87%) rename src/backend/{core/plugins/local => features/desktop/local/plugins}/service.py (85%) create mode 100644 src/backend/features/desktop/local/plugins/sidecars.py create mode 100644 src/backend/features/desktop/local/publication_provider.py create mode 100644 src/backend/features/desktop/local/skills/__init__.py rename src/backend/{core/services/local_skill_editor.py => features/desktop/local/skills/editor.py} (86%) rename src/backend/{core/services/local_skill_service.py => features/desktop/local/skills/service.py} (81%) rename src/backend/{core/services/local_skill_upload.py => features/desktop/local/skills/upload.py} (74%) rename src/backend/{core/services/local_snapshot_service.py => features/desktop/local/snapshots.py} (100%) rename src/backend/{core/db/models/capability.py => features/desktop/models.py} (60%) create mode 100644 src/backend/features/desktop/observability/__init__.py rename src/backend/{core/services/desktop_observation_context.py => features/desktop/observability/context.py} (78%) rename src/backend/{core/services/desktop_observability_delivery.py => features/desktop/observability/delivery.py} (86%) rename src/backend/{core/services/observability_projection.py => features/desktop/observability/fields.py} (96%) rename src/backend/{core/services/desktop_observability.py => features/desktop/observability/projection.py} (98%) rename src/backend/{core/services/desktop_observability_sync.py => features/desktop/observability/sync.py} (96%) rename src/backend/{core/plugins/runtime/desktop_resolution.py => features/desktop/plugin_resolution.py} (85%) create mode 100644 src/backend/features/desktop/run_capabilities/__init__.py rename src/backend/{core/llm/factory/selection/device_preparation.py => features/desktop/run_capabilities/preparation.py} (83%) create mode 100644 src/backend/features/desktop/run_capabilities/provider.py rename src/backend/{core/agent_skills/backends/capability_store.py => features/desktop/skill_backend.py} (86%) create mode 100644 src/backend/features/evaluation/README.md create mode 100644 src/backend/features/evaluation/__init__.py rename src/backend/{core/services/evaluation_admission.py => features/evaluation/admission.py} (93%) create mode 100644 src/backend/features/evaluation/api/__init__.py rename src/backend/{api/routes/v1 => features/evaluation/api}/evaluation_sandboxes.py (98%) create mode 100644 src/backend/features/evaluation/extension.py create mode 100644 src/backend/features/evaluation/models.py create mode 100644 src/backend/features/evaluation/policy.py create mode 100644 src/backend/features/evaluation/runtime/__init__.py rename src/backend/{core/llm/evaluation_paths.py => features/evaluation/runtime/paths.py} (100%) rename src/backend/{core/llm/evaluation_process_tools.py => features/evaluation/runtime/process_tools.py} (87%) rename src/backend/{core/llm/evaluation_runtime.py => features/evaluation/runtime/runtime.py} (100%) rename src/backend/{core/llm/evaluation_tools.py => features/evaluation/runtime/tools.py} (57%) rename src/backend/{core/sandbox/providers/evaluation => features/evaluation/sandbox_provider}/__init__.py (100%) rename src/backend/{core/sandbox/providers/evaluation => features/evaluation/sandbox_provider}/binding.py (100%) rename src/backend/{core/sandbox/providers/evaluation => features/evaluation/sandbox_provider}/process_guard.py (100%) rename src/backend/{core/sandbox/providers/evaluation => features/evaluation/sandbox_provider}/provider.py (98%) rename src/backend/{core/services/evaluation_sandbox_service.py => features/evaluation/sandboxes.py} (90%) create mode 100644 src/backend/features/hosted_apps/README.md create mode 100644 src/backend/features/hosted_apps/__init__.py create mode 100644 src/backend/features/hosted_apps/api/__init__.py rename src/backend/{api/routes/v1 => features/hosted_apps/api}/application_transports.py (68%) rename src/backend/{api/routes/v1 => features/hosted_apps/api}/applications.py (76%) rename src/backend/{core/services/application_collections.py => features/hosted_apps/collections.py} (92%) rename src/backend/{core/config/application_hosting.py => features/hosted_apps/config.py} (87%) rename src/backend/{core/services/application_data.py => features/hosted_apps/data.py} (95%) rename src/backend/{core/services/application_deployments.py => features/hosted_apps/deployments.py} (92%) rename src/backend/{core/services/application_export.py => features/hosted_apps/export.py} (89%) create mode 100644 src/backend/features/hosted_apps/extension.py rename src/backend/{core/services/application_history.py => features/hosted_apps/history.py} (91%) rename src/backend/{core/services/application_hosting_setup.py => features/hosted_apps/hosting_setup.py} (96%) rename src/backend/{core/services/application_industry.py => features/hosted_apps/industry.py} (95%) rename src/backend/{core/services/application_lifecycle.py => features/hosted_apps/lifecycle.py} (88%) rename src/backend/{core/services/application_mcp.py => features/hosted_apps/mcp.py} (82%) create mode 100644 src/backend/features/hosted_apps/models.py rename src/backend/{core/services/application_operations.py => features/hosted_apps/operations.py} (84%) rename src/backend/{core/services/application_projects.py => features/hosted_apps/projects.py} (95%) rename src/backend/{core/services/application_publication.py => features/hosted_apps/publication.py} (92%) rename src/backend/{core/services/application_relational.py => features/hosted_apps/relational.py} (98%) create mode 100644 src/backend/features/hosted_apps/resources/__init__.py create mode 100644 src/backend/features/hosted_apps/resources/admission.py create mode 100644 src/backend/features/hosted_apps/resources/cleanup.py rename src/backend/{core/services/application_schema.py => features/hosted_apps/schema.py} (100%) rename src/backend/{core/services/application_sql_policy.py => features/hosted_apps/sql_policy.py} (96%) rename src/backend/{core/services/application_store.py => features/hosted_apps/store.py} (94%) create mode 100644 src/backend/features/installed.py create mode 100644 src/backend/features/knowledge/README.md rename src/backend/{core/kb => features/knowledge}/__init__.py (64%) create mode 100644 src/backend/features/knowledge/api/__init__.py create mode 100644 src/backend/features/knowledge/api/kb.py create mode 100644 src/backend/features/knowledge/api/kb_assets.py create mode 100644 src/backend/features/knowledge/api/kb_chunks.py create mode 100644 src/backend/features/knowledge/api/kb_documents.py create mode 100644 src/backend/features/knowledge/api/kb_helpers.py create mode 100644 src/backend/features/knowledge/api/kb_mutations.py create mode 100644 src/backend/features/knowledge/api/kb_spaces.py create mode 100644 src/backend/features/knowledge/api/kb_state.py rename src/backend/{api/routes/v1 => features/knowledge/api}/kb_wiki.py (93%) create mode 100644 src/backend/features/knowledge/asset_captions.py create mode 100644 src/backend/features/knowledge/asset_indexing.py create mode 100644 src/backend/features/knowledge/catalog_options.py rename src/backend/{core/kb/external_provider.py => features/knowledge/disabled_provider.py} (85%) rename src/backend/{core/kb/external_retrieval.py => features/knowledge/disabled_retrieval.py} (100%) rename src/backend/{core/kb => features/knowledge}/document_status.py (100%) create mode 100644 src/backend/features/knowledge/edition.py create mode 100644 src/backend/features/knowledge/enrichment.py create mode 100644 src/backend/features/knowledge/extension.py rename src/backend/{core/kb => features/knowledge}/index_queue.py (99%) rename src/backend/{core/kb => features/knowledge}/index_worker.py (97%) create mode 100644 src/backend/features/knowledge/kb_assets.py create mode 100644 src/backend/features/knowledge/kb_assets_state.py create mode 100644 src/backend/features/knowledge/kb_parser.py create mode 100644 src/backend/features/knowledge/kb_parser_state.py create mode 100644 src/backend/features/knowledge/kb_vector.py create mode 100644 src/backend/features/knowledge/kb_vector_state.py create mode 100644 src/backend/features/knowledge/models.py create mode 100644 src/backend/features/knowledge/parser_chunks.py create mode 100644 src/backend/features/knowledge/parser_extract.py create mode 100644 src/backend/features/knowledge/parser_semantic.py create mode 100644 src/backend/features/knowledge/parser_tokens.py create mode 100644 src/backend/features/knowledge/parser_types.py rename src/backend/{core/auth/kb_permissions.py => features/knowledge/personal_permissions.py} (97%) rename src/backend/{api/routes/v1/kb_models.py => features/knowledge/personal_request_models.py} (100%) rename src/backend/{core/content/kb_processing.py => features/knowledge/processing.py} (67%) rename src/backend/{core/db/repository/kb.py => features/knowledge/repository.py} (97%) rename src/backend/{core/services/kb_service.py => features/knowledge/service.py} (95%) create mode 100644 src/backend/features/knowledge/vector_client.py create mode 100644 src/backend/features/knowledge/vector_fields.py create mode 100644 src/backend/features/knowledge/vector_indexing.py rename src/backend/{core/kb => features/knowledge}/wiki/__init__.py (92%) rename src/backend/{core/kb => features/knowledge}/wiki/cite.py (95%) rename src/backend/{core/kb => features/knowledge}/wiki/config.py (99%) rename src/backend/{core/kb => features/knowledge}/wiki/dedup.py (94%) rename src/backend/{core/kb => features/knowledge}/wiki/extract.py (93%) rename src/backend/{core/kb => features/knowledge}/wiki/finalize.py (92%) rename src/backend/{core/kb => features/knowledge}/wiki/jobs.py (99%) rename src/backend/{core/kb => features/knowledge}/wiki/linkify.py (100%) rename src/backend/{core/kb => features/knowledge}/wiki/llm.py (96%) create mode 100644 src/backend/features/knowledge/wiki/local_graph.py create mode 100644 src/backend/features/knowledge/wiki/local_projection.py create mode 100644 src/backend/features/knowledge/wiki/local_provider.py create mode 100644 src/backend/features/knowledge/wiki/local_provider_state.py rename src/backend/{core/kb => features/knowledge}/wiki/pipeline.py (95%) rename src/backend/{core/kb => features/knowledge}/wiki/prompts.py (100%) rename src/backend/{core/kb => features/knowledge}/wiki/reduce.py (93%) rename src/backend/{core/kb => features/knowledge}/wiki/slug.py (100%) rename src/backend/{core/kb => features/knowledge}/wiki/store.py (98%) rename src/backend/{core/kb => features/knowledge}/wiki/taxonomy.py (89%) rename src/backend/{core/kb => features/knowledge}/wiki/worker.py (94%) rename src/backend/{core/kb => features/knowledge}/wiki_router.py (88%) create mode 100644 src/backend/features/marketplace/README.md create mode 100644 src/backend/features/marketplace/__init__.py create mode 100644 src/backend/features/marketplace/agent_catalog.py create mode 100644 src/backend/features/marketplace/agent_categories.py create mode 100644 src/backend/features/marketplace/agent_installation.py create mode 100644 src/backend/features/marketplace/agent_metadata.py create mode 100644 src/backend/features/marketplace/agent_publishing.py create mode 100644 src/backend/features/marketplace/agent_submission_data.py create mode 100644 src/backend/features/marketplace/agent_submissions.py rename src/backend/{core/services/marketplace_agent_versions.py => features/marketplace/agent_versions.py} (88%) create mode 100644 src/backend/features/marketplace/agents_state.py create mode 100644 src/backend/features/marketplace/api/__init__.py rename src/backend/{api/routes/v1 => features/marketplace/api}/agent_marketplace.py (82%) rename src/backend/{api/routes/v1 => features/marketplace/api}/catalog_ownership.py (94%) rename src/backend/{api/routes/v1 => features/marketplace/api}/marketplace.py (84%) rename src/backend/{api/routes/v1 => features/marketplace/api}/mcp_marketplace.py (79%) create mode 100644 src/backend/features/marketplace/core_catalog.py create mode 100644 src/backend/features/marketplace/edition.py create mode 100644 src/backend/features/marketplace/extension.py create mode 100644 src/backend/features/marketplace/mcp_administration.py rename src/backend/{core/config/mcp_marketplace_catalog.py => features/marketplace/mcp_catalog.py} (100%) create mode 100644 src/backend/features/marketplace/mcp_credentials.py create mode 100644 src/backend/features/marketplace/mcp_curated.py create mode 100644 src/backend/features/marketplace/mcp_installation.py create mode 100644 src/backend/features/marketplace/mcp_listing.py rename src/backend/{core/services/mcp_marketplace_monitor.py => features/marketplace/mcp_monitor.py} (55%) create mode 100644 src/backend/features/marketplace/mcp_publishing.py create mode 100644 src/backend/features/marketplace/mcp_revalidation.py create mode 100644 src/backend/features/marketplace/mcp_state.py create mode 100644 src/backend/features/marketplace/mcp_submissions.py create mode 100644 src/backend/features/marketplace/mcp_validation.py create mode 100644 src/backend/features/marketplace/mcp_versions.py create mode 100644 src/backend/features/marketplace/models.py create mode 100644 src/backend/features/marketplace/package_source.py rename src/backend/{core/services/marketplace_listing.py => features/marketplace/personal_listing.py} (97%) rename src/backend/{core/auth/marketplace_visibility.py => features/marketplace/personal_visibility.py} (100%) rename src/backend/{core/plugins/management/market.py => features/marketplace/plugin_market.py} (73%) create mode 100644 src/backend/features/marketplace/skill_archives.py create mode 100644 src/backend/features/marketplace/skill_catalog.py create mode 100644 src/backend/features/marketplace/skill_installation.py create mode 100644 src/backend/features/marketplace/skill_metadata.py create mode 100644 src/backend/features/marketplace/skill_publishing.py create mode 100644 src/backend/features/marketplace/skill_submission_data.py create mode 100644 src/backend/features/marketplace/skill_submissions.py rename src/backend/{core/services/marketplace_skill_versions.py => features/marketplace/skill_versions.py} (72%) create mode 100644 src/backend/features/marketplace/skills_state.py create mode 100644 src/backend/features/marketplace/versions/__init__.py rename src/backend/{core/services/marketplace_version_archive.py => features/marketplace/versions/archive.py} (100%) rename src/backend/{core/services/marketplace_version_config.py => features/marketplace/versions/config.py} (95%) rename src/backend/{core/services/marketplace_version_sources.py => features/marketplace/versions/sources.py} (84%) rename src/backend/{core/services/marketplace_version_store.py => features/marketplace/versions/store.py} (90%) create mode 100644 src/backend/features/sites/README.md create mode 100644 src/backend/features/sites/__init__.py create mode 100644 src/backend/features/sites/api/__init__.py rename src/backend/{api/routes/v1 => features/sites/api}/internal_site_auth.py (100%) rename src/backend/{api/routes/v1 => features/sites/api}/internal_sites.py (94%) rename src/backend/{api/routes/v1 => features/sites/api}/local_site_sources.py (94%) rename src/backend/{api/routes => features/sites/api}/site_gate.py (100%) rename src/backend/{api/routes/v1 => features/sites/api}/sites.py (95%) rename src/backend/{api/routes => features/sites/api}/sites_serve.py (82%) rename src/backend/{core/plugins/local/site_upgrade.py => features/sites/builtin_upgrade.py} (83%) rename src/backend/{core/services/desktop_site_publish.py => features/sites/desktop_publish.py} (83%) create mode 100644 src/backend/features/sites/edition.py create mode 100644 src/backend/features/sites/extension.py rename src/backend/{core/services/site_listing.py => features/sites/listing.py} (94%) rename src/backend/{core/services/local_site_sources.py => features/sites/local_sources.py} (93%) rename src/backend/{core/services/site_management.py => features/sites/management.py} (95%) rename src/backend/{core/db/models/site.py => features/sites/models.py} (97%) rename src/backend/{core/services/site_packaging.py => features/sites/packaging.py} (92%) rename src/backend/{core/services/site_password.py => features/sites/password.py} (100%) rename src/backend/{core/services/site_access_policy.py => features/sites/personal_access.py} (97%) rename src/backend/{core/db/models/site_scope.py => features/sites/personal_scope.py} (100%) rename src/backend/{core/services/site_rate_limit.py => features/sites/rate_limit.py} (100%) rename src/backend/{core/db/repository/site.py => features/sites/repository.py} (98%) rename src/backend/{core/services/site_service.py => features/sites/service.py} (97%) create mode 100644 src/backend/features/sites/tools/__init__.py rename src/backend/{core/llm/tools/design_picker_tool.py => features/sites/tools/design_picker.py} (86%) create mode 100644 src/backend/features/workbench/README.md rename src/backend/{core/applications => features/workbench}/__init__.py (100%) rename src/backend/{core/applications => features/workbench}/activity.py (98%) create mode 100644 src/backend/features/workbench/api/__init__.py rename src/backend/{api/routes/v1 => features/workbench/api}/plugin_ui.py (91%) rename src/backend/{api/routes/v1 => features/workbench/api}/workbench.py (82%) rename src/backend/{api/routes/v1 => features/workbench/api}/workbench_activity.py (82%) rename src/backend/{api/routes/v1 => features/workbench/api}/workbench_application_config.py (88%) rename src/backend/{api/routes/v1 => features/workbench/api}/workbench_auth.py (92%) rename src/backend/{api/routes/v1 => features/workbench/api}/workbench_capabilities.py (81%) rename src/backend/{api/routes/v1 => features/workbench/api}/workbench_diagnostics.py (97%) rename src/backend/{api/routes/v1 => features/workbench/api}/workbench_events.py (85%) rename src/backend/{api/routes/v1 => features/workbench/api}/workbench_preferences.py (97%) rename src/backend/{api/routes/v1 => features/workbench/api}/workbench_resources.py (69%) rename src/backend/{api/routes/v1 => features/workbench/api}/workbench_revision_leases.py (97%) rename src/backend/{api/routes/v1 => features/workbench/api}/workbench_state.py (98%) rename src/backend/{api/routes/v1 => features/workbench/api}/workbench_upgrades.py (98%) rename src/backend/{api/routes/v1 => features/workbench/api}/workbench_workspace.py (83%) rename src/backend/{core/applications => features/workbench}/application_config.py (93%) rename src/backend/{core/applications => features/workbench}/application_config_bindings.py (82%) rename src/backend/{core/applications => features/workbench}/background.py (63%) rename src/backend/{core/applications => features/workbench}/capabilities.py (95%) rename src/backend/{core/applications => features/workbench}/catalog.py (96%) rename src/backend/{core/applications => features/workbench}/coordination.py (100%) rename src/backend/{core/applications => features/workbench}/diagnostic_probe.py (98%) rename src/backend/{core/applications => features/workbench}/diagnostic_resources.py (100%) rename src/backend/{core/applications => features/workbench}/diagnostics.py (99%) rename src/backend/{core/applications => features/workbench}/directory_revision.py (96%) create mode 100644 src/backend/features/workbench/edition.py create mode 100644 src/backend/features/workbench/extension.py rename src/backend/{core/applications => features/workbench}/external.py (94%) rename src/backend/{core/applications => features/workbench}/external_auth.py (99%) rename src/backend/{core/applications => features/workbench}/external_boundary.py (97%) rename src/backend/{core/applications => features/workbench}/external_embed.py (97%) rename src/backend/{core/applications => features/workbench}/installation_binding.py (77%) rename src/backend/{core/applications => features/workbench}/local_plugin_upgrades.py (86%) rename src/backend/{core/applications => features/workbench}/migration.py (97%) rename src/backend/{core/applications => features/workbench}/migration_compat.py (88%) rename src/backend/{core/applications => features/workbench}/migration_plan.py (96%) rename src/backend/{core/applications => features/workbench}/migration_snapshot.py (91%) create mode 100644 src/backend/features/workbench/models.py rename src/backend/{core/applications => features/workbench}/origin.py (100%) create mode 100644 src/backend/features/workbench/package_source.py rename src/backend/{core/applications => features/workbench}/plugin_candidate_storage.py (88%) rename src/backend/{core/applications => features/workbench}/plugin_catalog.py (95%) rename src/backend/{core/applications => features/workbench}/plugin_revisions.py (89%) rename src/backend/{core/applications => features/workbench}/plugin_upgrades.py (90%) rename src/backend/{core/applications => features/workbench}/policy.py (94%) rename src/backend/{core/applications => features/workbench}/preferences.py (96%) rename src/backend/{core/applications => features/workbench}/protocol.py (100%) create mode 100644 src/backend/features/workbench/resource_deadlines.py create mode 100644 src/backend/features/workbench/resource_owner.py rename src/backend/{core/applications => features/workbench}/revocation.py (87%) rename src/backend/{core/applications => features/workbench}/revocation_sweep.py (78%) rename src/backend/{core/applications => features/workbench}/schemas/application.schema.json (100%) rename src/backend/{core/applications => features/workbench}/schemas/host.json (100%) rename src/backend/{core/applications => features/workbench}/schemas/module.schema.json (100%) rename src/backend/{core/applications => features/workbench}/state.py (96%) rename src/backend/{core/applications => features/workbench}/state_recovery.py (100%) rename src/backend/{core/plugins => features/workbench}/ui/__init__.py (100%) rename src/backend/{core/plugins => features/workbench}/ui/contract.py (99%) rename src/backend/{core/plugins => features/workbench}/ui/contributions.py (87%) rename src/backend/{core/plugins => features/workbench}/ui/data_proxy.py (97%) rename src/backend/{core/plugins => features/workbench}/ui/declarations.py (99%) rename src/backend/{core/plugins => features/workbench}/ui/primitives.py (99%) rename src/backend/{core/plugins => features/workbench}/ui/workspace_enabled.py (100%) rename src/backend/{core/applications => features/workbench}/workspace_page.py (98%) create mode 100644 src/backend/hugagent_cli/schema.py create mode 100644 src/backend/integrations/__init__.py create mode 100644 src/backend/integrations/api/__init__.py rename src/backend/{api/routes/v1 => integrations/api}/integrations.py (86%) create mode 100644 src/backend/integrations/channels/README.md rename src/backend/{core => integrations}/channels/__init__.py (75%) rename src/backend/{core => integrations}/channels/adapters/__init__.py (100%) create mode 100644 src/backend/integrations/channels/adapters/dingtalk.py create mode 100644 src/backend/integrations/channels/adapters/dingtalk_delivery.py create mode 100644 src/backend/integrations/channels/adapters/dingtalk_history.py create mode 100644 src/backend/integrations/channels/adapters/dingtalk_settings.py create mode 100644 src/backend/integrations/channels/adapters/lark.py create mode 100644 src/backend/integrations/channels/adapters/lark_delivery.py create mode 100644 src/backend/integrations/channels/adapters/lark_messages.py create mode 100644 src/backend/integrations/channels/adapters/lark_settings.py rename src/backend/{core => integrations}/channels/adapters/wecom.py (99%) rename src/backend/{core => integrations}/channels/adapters/weixin.py (99%) create mode 100644 src/backend/integrations/channels/api/__init__.py rename src/backend/{api/routes/v1 => integrations/channels/api}/channel_desktop.py (75%) rename src/backend/{api/routes/v1 => integrations/channels/api}/channels.py (89%) rename src/backend/{core/services/channel_desktop_worker.py => integrations/channels/desktop_worker.py} (81%) create mode 100644 src/backend/integrations/channels/extension.py create mode 100644 src/backend/integrations/channels/inbound.py create mode 100644 src/backend/integrations/channels/inbound_attachments.py create mode 100644 src/backend/integrations/channels/inbound_delivery.py create mode 100644 src/backend/integrations/channels/inbound_history.py create mode 100644 src/backend/integrations/channels/inbound_observation.py create mode 100644 src/backend/integrations/channels/inbound_sessions.py create mode 100644 src/backend/integrations/channels/inbound_state.py rename src/backend/{core => integrations}/channels/manager.py (96%) rename src/backend/{core => integrations}/channels/markdown.py (100%) create mode 100644 src/backend/integrations/channels/models.py rename src/backend/{core => integrations}/channels/outbound.py (70%) rename src/backend/{core => integrations}/channels/protocol.py (100%) rename src/backend/{core => integrations}/channels/registry.py (88%) rename src/backend/{core/services/channel_relay.py => integrations/channels/relay.py} (98%) rename src/backend/{core/services/channel_relay_dispatch.py => integrations/channels/relay_dispatch.py} (54%) rename src/backend/{core/services/channel_relay_rpc.py => integrations/channels/relay_rpc.py} (63%) rename src/backend/{core/db/repository/channel.py => integrations/channels/repository.py} (98%) rename src/backend/{core/services/channel_service.py => integrations/channels/service.py} (70%) create mode 100644 src/backend/integrations/channels/tools/__init__.py rename src/backend/{core/llm/tools/channel_attachment_tool.py => integrations/channels/tools/attachment.py} (52%) create mode 100644 src/backend/integrations/dingtalk/README.md create mode 100644 src/backend/integrations/dingtalk/__init__.py create mode 100644 src/backend/integrations/dingtalk/cube_credentials.py create mode 100644 src/backend/integrations/dingtalk/environment.py create mode 100644 src/backend/integrations/dingtalk/extension.py create mode 100644 src/backend/integrations/dingtalk/models.py create mode 100644 src/backend/integrations/dingtalk/mounts.py create mode 100644 src/backend/integrations/dingtalk/parsing.py create mode 100644 src/backend/integrations/dingtalk/repository.py create mode 100644 src/backend/integrations/dingtalk/sandbox.py rename src/backend/{core/services/dingtalk_service.py => integrations/dingtalk/service.py} (75%) create mode 100644 src/backend/integrations/dingtalk/storage.py create mode 100644 src/backend/integrations/email/README.md create mode 100644 src/backend/integrations/email/__init__.py create mode 100644 src/backend/integrations/email/cube_credentials.py create mode 100644 src/backend/integrations/email/extension.py create mode 100644 src/backend/integrations/email/models.py create mode 100644 src/backend/integrations/email/mounts.py create mode 100644 src/backend/integrations/email/repository.py create mode 100644 src/backend/integrations/email/sandbox.py rename src/backend/{core/services/email_service.py => integrations/email/service.py} (91%) create mode 100644 src/backend/integrations/email/storage.py create mode 100644 src/backend/integrations/lark/README.md create mode 100644 src/backend/integrations/lark/__init__.py create mode 100644 src/backend/integrations/lark/configuration.py create mode 100644 src/backend/integrations/lark/cube_credentials.py create mode 100644 src/backend/integrations/lark/extension.py create mode 100644 src/backend/integrations/lark/login.py create mode 100644 src/backend/integrations/lark/models.py create mode 100644 src/backend/integrations/lark/mounts.py create mode 100644 src/backend/integrations/lark/parsing.py create mode 100644 src/backend/integrations/lark/process.py create mode 100644 src/backend/integrations/lark/repository.py create mode 100644 src/backend/integrations/lark/sandbox.py create mode 100644 src/backend/integrations/lark/service.py create mode 100644 src/backend/integrations/lark/state.py create mode 100644 src/backend/integrations/lark/storage.py create mode 100644 src/backend/integrations/yida/README.md create mode 100644 src/backend/integrations/yida/__init__.py create mode 100644 src/backend/integrations/yida/cube_credentials.py rename src/backend/{core/services/yida_execution.py => integrations/yida/execution.py} (97%) create mode 100644 src/backend/integrations/yida/extension.py create mode 100644 src/backend/integrations/yida/models.py create mode 100644 src/backend/integrations/yida/mounts.py create mode 100644 src/backend/integrations/yida/sandbox.py rename src/backend/{core/services/yida_service.py => integrations/yida/service.py} (99%) create mode 100644 src/backend/integrations/yida/skill_content.py create mode 100644 src/backend/integrations/yida/storage.py create mode 100644 src/backend/orchestration/automations/__init__.py rename src/backend/orchestration/{schedulers => automations}/automation_artifacts.py (97%) create mode 100644 src/backend/orchestration/automations/automation_conversation.py create mode 100644 src/backend/orchestration/automations/automation_delivery.py create mode 100644 src/backend/orchestration/automations/automation_dispatch.py create mode 100644 src/backend/orchestration/automations/automation_lease.py create mode 100644 src/backend/orchestration/automations/automation_recovery.py create mode 100644 src/backend/orchestration/automations/automation_scheduler.py delete mode 100644 src/backend/orchestration/chat_run_executor.py delete mode 100644 src/backend/orchestration/citation_anchor.py delete mode 100644 src/backend/orchestration/commands/__init__.py delete mode 100644 src/backend/orchestration/commands/runtime.py create mode 100644 src/backend/orchestration/configuration.py delete mode 100644 src/backend/orchestration/local_plugin_sidecars.py create mode 100644 src/backend/orchestration/loops/__init__.py create mode 100644 src/backend/orchestration/loops/admission.py rename src/backend/orchestration/{autonomous_loop.py => loops/driver.py} (98%) rename src/backend/orchestration/{loop_planner.py => loops/planner.py} (97%) create mode 100644 src/backend/orchestration/loops/presentation.py create mode 100644 src/backend/orchestration/loops/recovery.py rename src/backend/orchestration/{loop_evaluator.py => loops/requirements.py} (83%) rename src/backend/orchestration/{subagents/loop_reviewer.py => loops/reviewer.py} (78%) create mode 100644 src/backend/orchestration/loops/run.py delete mode 100644 src/backend/orchestration/memory_integration.py create mode 100644 src/backend/orchestration/pending.py create mode 100644 src/backend/orchestration/plans/__init__.py create mode 100644 src/backend/orchestration/plans/admission.py create mode 100644 src/backend/orchestration/plans/execute_run.py create mode 100644 src/backend/orchestration/plans/generate_run.py rename src/backend/orchestration/{subagents/plan_mode.py => plans/mode.py} (89%) delete mode 100644 src/backend/orchestration/schedulers/automation_conversation.py delete mode 100644 src/backend/orchestration/schedulers/automation_dispatch.py delete mode 100644 src/backend/orchestration/schedulers/automation_lease.py delete mode 100644 src/backend/orchestration/schedulers/automation_recovery.py delete mode 100644 src/backend/orchestration/schedulers/automation_scheduler.py delete mode 100644 src/backend/orchestration/streaming.py delete mode 100644 src/backend/orchestration/subagents/__init__.py delete mode 100644 src/backend/orchestration/subagents/ontology_reviewer.py rename src/backend/orchestration/{schedulers => workers}/__init__.py (100%) rename src/backend/orchestration/{schedulers => workers}/_worker_base.py (96%) rename src/backend/{core/services => orchestration/workers}/edition_startup.py (100%) rename src/backend/orchestration/{schedulers => workers}/evolution_scheduler.py (98%) rename src/backend/orchestration/{schedulers => workers}/memory_ttl_scheduler.py (95%) rename src/backend/orchestration/{schedulers => workers}/persona_distill_worker.py (94%) create mode 100644 src/backend/orchestration/workers/run_recovery.py delete mode 100644 src/backend/orchestration/workflow.py create mode 100644 src/backend/personal_agent/device_link/README.md rename src/backend/{core => personal_agent}/device_link/__init__.py (84%) rename src/backend/{core => personal_agent}/device_link/driver.py (100%) rename src/backend/{core => personal_agent}/device_link/local_api.py (100%) rename src/backend/{core => personal_agent}/device_link/runner.py (98%) rename src/backend/{core => personal_agent}/device_link/store.py (100%) delete mode 100644 src/backend/scripts/_loop_convergence_unit.py delete mode 100644 src/backend/scripts/_loop_db_resume_unit.py delete mode 100644 src/backend/scripts/_loop_evaluator_route_unit.py delete mode 100644 src/backend/scripts/_loop_integration_test.py delete mode 100644 src/backend/scripts/_loop_llmeval_smoke.py delete mode 100644 src/backend/scripts/_loop_preflight.py delete mode 100644 src/backend/scripts/_loop_selfverify_smoke.py delete mode 100644 src/backend/scripts/_loop_smoke.py delete mode 100644 src/backend/scripts/_loop_test_edgebench.py delete mode 100644 src/backend/scripts/desktop_cloud_wrapper.py delete mode 100644 src/backend/scripts/desktop_fixture_mcp.py delete mode 100644 src/backend/scripts/dual_mode_e2e.py delete mode 100644 src/backend/scripts/edgebench/ann_judge.py delete mode 100644 src/backend/scripts/edgebench/perm_opt_judge.py delete mode 100644 src/backend/scripts/edit_chat_message.py delete mode 100644 src/backend/scripts/evaluation_sandbox_e2e.py delete mode 100644 src/backend/scripts/export_content.py delete mode 100755 src/backend/scripts/harness_fault_injection.py delete mode 100644 src/backend/scripts/import_cherry_agents.py delete mode 100644 src/backend/scripts/import_content.py delete mode 100644 src/backend/scripts/run_evolution_benchmark.py delete mode 100644 src/backend/scripts/run_evolution_llm_ab.py delete mode 100644 src/backend/scripts/workbench_migration.py create mode 100644 src/backend/tests/api/test_loop_cancel_scope.py create mode 100644 src/backend/tests/auth/test_auth_dependencies_off_loop.py create mode 100644 src/backend/tests/auth/test_bearer_identity.py delete mode 100644 src/backend/tests/capabilities/test_credential_continuity.py create mode 100644 src/backend/tests/chat/test_quoted_follow_up.py create mode 100644 src/backend/tests/chat/test_snapshot_transaction_cleanup.py create mode 100644 src/backend/tests/content/test_artifact_default_path.py create mode 100644 src/backend/tests/core/runs/test_automation_journal_guard.py create mode 100644 src/backend/tests/db_support.py create mode 100644 src/backend/tests/features/__init__.py create mode 100644 src/backend/tests/features/automation/__init__.py create mode 100644 src/backend/tests/features/automation/run_fixtures.py create mode 100644 src/backend/tests/features/automation/test_automation_delivery_deadline.py rename src/backend/tests/{ => features/automation}/test_automation_execution_location.py (80%) create mode 100644 src/backend/tests/features/automation/test_automation_lease_close.py create mode 100644 src/backend/tests/features/automation/test_automation_manual_trigger.py rename src/backend/tests/{services => features/automation}/test_automation_notifications.py (98%) create mode 100644 src/backend/tests/features/automation/test_automation_oneshot_finalize.py create mode 100644 src/backend/tests/features/automation/test_automation_ownership_postgres.py rename src/backend/tests/{ => features/automation}/test_automation_remote_effect.py (74%) create mode 100644 src/backend/tests/features/automation/test_automation_run_ownership.py create mode 100644 src/backend/tests/features/automation/test_delivery_target_migration.py create mode 100644 src/backend/tests/features/automation/test_durable_admission.py rename src/backend/tests/{services => features/automation}/test_loop_service_harness.py (98%) create mode 100644 src/backend/tests/features/automation/test_queue_postgres.py create mode 100644 src/backend/tests/features/desktop/__init__.py create mode 100644 src/backend/tests/features/desktop/capabilities/__init__.py rename src/backend/tests/{ => features/desktop}/capabilities/_cloud_identity.py (100%) rename src/backend/tests/{ => features/desktop}/capabilities/conftest.py (65%) rename src/backend/tests/{ => features/desktop}/capabilities/management_browser_server.py (88%) rename src/backend/tests/{ => features/desktop}/capabilities/runtime_recovery_support.py (75%) rename src/backend/tests/{ => features/desktop}/capabilities/test_account_authorization.py (52%) rename src/backend/tests/{ => features/desktop}/capabilities/test_agent_rerun_identity.py (75%) rename src/backend/tests/{ => features/desktop}/capabilities/test_agent_runtime_grants.py (62%) rename src/backend/tests/{ => features/desktop}/capabilities/test_agents_plugins.py (90%) rename src/backend/tests/{ => features/desktop}/capabilities/test_autonomous_loop_scopes.py (73%) rename src/backend/tests/{ => features/desktop}/capabilities/test_available_runtime.py (82%) rename src/backend/tests/{ => features/desktop}/capabilities/test_capability_change_sync.py (81%) rename src/backend/tests/{ => features/desktop}/capabilities/test_catalog_cloud_only_in_hybrid.py (72%) rename src/backend/tests/{ => features/desktop}/capabilities/test_catalog_plugin_components_hidden.py (87%) rename src/backend/tests/{ => features/desktop}/capabilities/test_change_merge.py (90%) rename src/backend/tests/{ => features/desktop}/capabilities/test_change_signal.py (97%) rename src/backend/tests/{ => features/desktop}/capabilities/test_cloud_identity.py (96%) rename src/backend/tests/{ => features/desktop}/capabilities/test_cloud_management.py (88%) rename src/backend/tests/{ => features/desktop}/capabilities/test_cloud_parallel_preparation.py (68%) rename src/backend/tests/{ => features/desktop}/capabilities/test_cloud_plugin_binding_runtime.py (76%) rename src/backend/tests/{ => features/desktop}/capabilities/test_cloud_sticky_plugins.py (83%) rename src/backend/tests/{ => features/desktop}/capabilities/test_cloud_workcopies.py (91%) rename src/backend/tests/{ => features/desktop}/capabilities/test_core_layers.py (96%) create mode 100644 src/backend/tests/features/desktop/capabilities/test_credential_continuity.py rename src/backend/tests/{ => features/desktop}/capabilities/test_dependency_closure.py (87%) rename src/backend/tests/{ => features/desktop}/capabilities/test_desktop_capabilities_api.py (85%) rename src/backend/tests/{ => features/desktop}/capabilities/test_desktop_content_safety.py (87%) rename src/backend/tests/{ => features/desktop}/capabilities/test_desktop_declaration_export.py (89%) rename src/backend/tests/{ => features/desktop}/capabilities/test_desktop_model_reasoning_safety.py (88%) rename src/backend/tests/{ => features/desktop}/capabilities/test_desktop_resource_plugins.py (87%) rename src/backend/tests/{ => features/desktop}/capabilities/test_desktop_token_security.py (90%) rename src/backend/tests/{ => features/desktop}/capabilities/test_desktop_warmup.py (61%) rename src/backend/tests/{ => features/desktop}/capabilities/test_device_api_contract.py (74%) rename src/backend/tests/{ => features/desktop}/capabilities/test_device_catalog_projection.py (91%) rename src/backend/tests/{ => features/desktop}/capabilities/test_dynamic_model_epoch_cache.py (80%) rename src/backend/tests/{ => features/desktop}/capabilities/test_explicit_desktop_invocation.py (79%) rename src/backend/tests/{ => features/desktop}/capabilities/test_gateway_invocation_proof.py (78%) rename src/backend/tests/{ => features/desktop}/capabilities/test_gateway_unknown_outcome.py (61%) rename src/backend/tests/{ => features/desktop}/capabilities/test_hybrid_owned_plugins.py (50%) rename src/backend/tests/{ => features/desktop}/capabilities/test_initial_sync_readiness.py (51%) rename src/backend/tests/{ => features/desktop}/capabilities/test_junction_windows_paths.py (86%) rename src/backend/tests/{ => features/desktop}/capabilities/test_loader_store_mode.py (74%) rename src/backend/tests/{ => features/desktop}/capabilities/test_local_folder_discovery.py (90%) rename src/backend/tests/{ => features/desktop}/capabilities/test_local_management_migration.py (83%) rename src/backend/tests/{ => features/desktop}/capabilities/test_local_skill_projection.py (83%) rename src/backend/tests/{ => features/desktop}/capabilities/test_management_readiness.py (87%) rename src/backend/tests/{ => features/desktop}/capabilities/test_management_tools.py (56%) rename src/backend/tests/{ => features/desktop}/capabilities/test_manager_lifecycle.py (91%) rename src/backend/tests/{ => features/desktop}/capabilities/test_manager_regressions.py (85%) rename src/backend/tests/{ => features/desktop}/capabilities/test_manifest_order.py (85%) rename src/backend/tests/{ => features/desktop}/capabilities/test_manifest_tool_schema.py (76%) rename src/backend/tests/{ => features/desktop}/capabilities/test_mcp_json.py (98%) rename src/backend/tests/{ => features/desktop}/capabilities/test_mcp_json_consistency.py (99%) rename src/backend/tests/{ => features/desktop}/capabilities/test_memory_epoch_cache.py (79%) rename src/backend/tests/{ => features/desktop}/capabilities/test_migration.py (89%) rename src/backend/tests/{ => features/desktop}/capabilities/test_migration_preservation.py (96%) rename src/backend/tests/{ => features/desktop}/capabilities/test_model_credential_reference.py (86%) rename src/backend/tests/{ => features/desktop}/capabilities/test_model_error_diagnostics.py (83%) rename src/backend/tests/{ => features/desktop}/capabilities/test_owned_connector_assembly.py (55%) rename src/backend/tests/{ => features/desktop}/capabilities/test_partial_session_availability.py (73%) rename src/backend/tests/{ => features/desktop}/capabilities/test_plugin_connections.py (87%) rename src/backend/tests/{ => features/desktop}/capabilities/test_plugin_device_assets.py (89%) rename src/backend/tests/{ => features/desktop}/capabilities/test_prepare_lock_not_held_over_io.py (98%) rename src/backend/tests/{ => features/desktop}/capabilities/test_progressive_plugins.py (72%) rename src/backend/tests/{ => features/desktop}/capabilities/test_runtime_frozen_bindings.py (63%) rename src/backend/tests/{ => features/desktop}/capabilities/test_runtime_publication_recovery.py (70%) rename src/backend/tests/{ => features/desktop}/capabilities/test_runtime_recovery.py (58%) rename src/backend/tests/{ => features/desktop}/capabilities/test_runtime_scope_consumers.py (87%) rename src/backend/tests/{ => features/desktop}/capabilities/test_runtime_scopes.py (81%) rename src/backend/tests/{ => features/desktop}/capabilities/test_runtime_selection_recovery.py (66%) rename src/backend/tests/{ => features/desktop}/capabilities/test_runtime_session_recovery.py (68%) rename src/backend/tests/{ => features/desktop}/capabilities/test_selection_dependency_sources.py (79%) rename src/backend/tests/{ => features/desktop}/capabilities/test_selection_readiness.py (80%) rename src/backend/tests/{ => features/desktop}/capabilities/test_store_file_integrity.py (88%) rename src/backend/tests/{ => features/desktop}/capabilities/test_toolkit_runtime_alias.py (83%) rename src/backend/tests/{ => features/desktop}/capabilities/test_user_facing_errors.py (81%) rename src/backend/tests/{ => features/desktop}/capabilities/test_view_os_errors.py (95%) rename src/backend/tests/{ => features/desktop}/capabilities/test_workbench_local_upgrades.py (84%) rename src/backend/tests/{ => features/desktop}/desktop_login_browser_server.py (91%) create mode 100644 src/backend/tests/features/desktop/index_fixtures.py create mode 100644 src/backend/tests/features/desktop/observability_cases_1.py create mode 100644 src/backend/tests/features/desktop/observability_cases_2.py create mode 100644 src/backend/tests/features/desktop/observability_support.py rename src/backend/tests/{ => features/desktop}/run_desktop_browser_e2e.py (99%) rename src/backend/tests/{ => features/desktop}/test_desktop_auth.py (96%) rename src/backend/tests/{misc => features/desktop}/test_desktop_bridge.py (90%) rename src/backend/tests/{misc => features/desktop}/test_desktop_capability.py (81%) rename src/backend/tests/{misc => features/desktop}/test_desktop_capability_models.py (91%) rename src/backend/tests/{misc => features/desktop}/test_desktop_cloud_skills.py (84%) rename src/backend/tests/{ => features/desktop}/test_desktop_device_login.py (97%) rename src/backend/tests/{ => features/desktop}/test_desktop_memory_persistence.py (96%) rename src/backend/tests/{api => features/desktop}/test_desktop_model_gateway.py (88%) create mode 100644 src/backend/tests/features/desktop/test_desktop_observability.py rename src/backend/tests/{ => features/desktop}/test_desktop_observability_authenticated_delivery.py (77%) rename src/backend/tests/{ => features/desktop}/test_desktop_observability_delivery.py (75%) rename src/backend/tests/{api => features/desktop}/test_desktop_release_events.py (96%) rename src/backend/tests/{ => features/desktop}/test_desktop_sync_locking.py (74%) rename src/backend/tests/{api => features/desktop}/test_desktop_updates.py (98%) rename src/backend/tests/{api => features/desktop}/test_local_file_actions.py (89%) rename src/backend/tests/{services => features/desktop}/test_local_grant_service.py (98%) rename src/backend/tests/{services => features/desktop}/test_local_snapshot_service.py (96%) create mode 100644 src/backend/tests/features/evaluation/__init__.py create mode 100644 src/backend/tests/features/evaluation/conftest.py rename src/backend/tests/{sandbox => features/evaluation}/test_evaluation_admission.py (97%) rename src/backend/tests/{sandbox => features/evaluation}/test_evaluation_binding.py (98%) rename src/backend/tests/{llm => features/evaluation}/test_evaluation_factory.py (87%) rename src/backend/tests/{sandbox => features/evaluation}/test_evaluation_process_guard.py (97%) rename src/backend/tests/{sandbox => features/evaluation}/test_evaluation_provider.py (96%) rename src/backend/tests/{sandbox => features/evaluation}/test_evaluation_router.py (78%) rename src/backend/tests/{llm => features/evaluation}/test_evaluation_runtime.py (88%) rename src/backend/tests/{sandbox => features/evaluation}/test_evaluation_service.py (93%) create mode 100644 src/backend/tests/features/hosted_apps/__init__.py rename src/backend/tests/{api => features/hosted_apps}/application_hosting_support.py (75%) rename src/backend/tests/{api => features/hosted_apps}/test_application_agent_contract.py (76%) rename src/backend/tests/{api => features/hosted_apps}/test_application_collections.py (87%) rename src/backend/tests/{services => features/hosted_apps}/test_application_desktop.py (80%) rename src/backend/tests/{api => features/hosted_apps}/test_application_export.py (91%) rename src/backend/tests/{api => features/hosted_apps}/test_application_hosting.py (92%) rename src/backend/tests/{api => features/hosted_apps}/test_application_personal_mcp.py (91%) rename src/backend/tests/{api => features/hosted_apps}/test_application_project_tools.py (87%) rename src/backend/tests/{api => features/hosted_apps}/test_application_projects.py (94%) rename src/backend/tests/{api => features/hosted_apps}/test_application_retirement.py (94%) rename src/backend/tests/{api => features/hosted_apps}/test_hosting_remediation.py (82%) create mode 100644 src/backend/tests/features/hosted_apps/test_schema_lifecycle.py create mode 100644 src/backend/tests/features/knowledge/__init__.py create mode 100644 src/backend/tests/features/knowledge/kb_multimodal_assets_cases_1.py create mode 100644 src/backend/tests/features/knowledge/kb_multimodal_assets_cases_2.py create mode 100644 src/backend/tests/features/knowledge/kb_multimodal_assets_support.py create mode 100644 src/backend/tests/features/knowledge/kb_wiki_end_to_end_cases_1.py create mode 100644 src/backend/tests/features/knowledge/kb_wiki_end_to_end_cases_2.py create mode 100644 src/backend/tests/features/knowledge/kb_wiki_end_to_end_support.py create mode 100644 src/backend/tests/features/knowledge/test_host_contributions.py rename src/backend/tests/{mcp => features/knowledge}/test_kb_backend_routing.py (74%) rename src/backend/tests/{ => features/knowledge}/test_kb_document_status.py (89%) rename src/backend/tests/{services => features/knowledge}/test_kb_index_queue.py (98%) rename src/backend/tests/{services => features/knowledge}/test_kb_index_worker.py (88%) create mode 100644 src/backend/tests/features/knowledge/test_kb_multimodal_assets.py rename src/backend/tests/{mcp => features/knowledge}/test_kb_vector_safety.py (57%) rename src/backend/tests/{mcp => features/knowledge}/test_kb_vector_timeouts.py (68%) create mode 100644 src/backend/tests/features/knowledge/test_kb_wiki_end_to_end.py rename src/backend/tests/{services => features/knowledge}/test_kb_wiki_pipeline.py (96%) create mode 100644 src/backend/tests/features/marketplace/__init__.py create mode 100644 src/backend/tests/features/marketplace/mcp_marketplace_cases_1.py create mode 100644 src/backend/tests/features/marketplace/mcp_marketplace_cases_2.py create mode 100644 src/backend/tests/features/marketplace/mcp_marketplace_cases_3.py create mode 100644 src/backend/tests/features/marketplace/mcp_marketplace_cases_4.py create mode 100644 src/backend/tests/features/marketplace/mcp_marketplace_support.py rename src/backend/tests/{ => features/marketplace}/test_agent_marketplace.py (69%) rename src/backend/tests/{skills => features/marketplace}/test_marketplace_service.py (73%) rename src/backend/tests/{skills => features/marketplace}/test_marketplace_submission.py (54%) create mode 100644 src/backend/tests/features/marketplace/test_mcp_marketplace.py create mode 100644 src/backend/tests/features/marketplace/test_oauth_sdk2_contract.py create mode 100644 src/backend/tests/features/sites/__init__.py create mode 100644 src/backend/tests/features/sites/conftest.py rename src/backend/tests/{capabilities => features/sites}/test_cloud_site_publish.py (82%) rename src/backend/tests/{llm => features/sites}/test_design_pick.py (99%) rename src/backend/tests/{llm => features/sites}/test_desktop_site_paths.py (88%) rename src/backend/tests/{capabilities => features/sites}/test_local_project_site_publish.py (93%) rename src/backend/tests/{capabilities => features/sites}/test_local_site_sources.py (88%) rename src/backend/tests/{api => features/sites}/test_site_access_password.py (93%) rename src/backend/tests/{api => features/sites}/test_site_contention_postgres.py (92%) rename src/backend/tests/{capabilities => features/sites}/test_site_listing.py (90%) rename src/backend/tests/{capabilities => features/sites}/test_site_plugin_upgrade.py (85%) rename src/backend/tests/{services => features/sites}/test_site_rate_limit.py (97%) create mode 100644 src/backend/tests/features/test_execution_identity_contract.py create mode 100644 src/backend/tests/features/test_host_runtime.py create mode 100644 src/backend/tests/features/test_installed_modules.py create mode 100644 src/backend/tests/features/test_run_capability_host.py create mode 100644 src/backend/tests/features/workbench/__init__.py rename src/backend/tests/{ => features/workbench}/test_plugin_ui_contract.py (97%) rename src/backend/tests/{ => features/workbench}/test_plugin_ui_routes.py (96%) rename src/backend/tests/{ => features/workbench}/test_workbench_activity_routes.py (95%) rename src/backend/tests/{ => features/workbench}/test_workbench_actual_process_observer.py (93%) rename src/backend/tests/{ => features/workbench}/test_workbench_application_config_http.py (97%) rename src/backend/tests/{ => features/workbench}/test_workbench_approval_lease_http.py (95%) rename src/backend/tests/{ => features/workbench}/test_workbench_auth_routes.py (97%) rename src/backend/tests/{ => features/workbench}/test_workbench_background_subpage_http.py (96%) rename src/backend/tests/{ => features/workbench}/test_workbench_candidate_storage.py (91%) rename src/backend/tests/{ => features/workbench}/test_workbench_capability_routes.py (97%) rename src/backend/tests/{ => features/workbench}/test_workbench_closing_isolation_http.py (94%) rename src/backend/tests/{ => features/workbench}/test_workbench_cookie_boundaries.py (94%) rename src/backend/tests/{ => features/workbench}/test_workbench_coordination.py (97%) rename src/backend/tests/{ => features/workbench}/test_workbench_diagnostic_failure_http.py (95%) rename src/backend/tests/{ => features/workbench}/test_workbench_diagnostics.py (97%) rename src/backend/tests/{ => features/workbench}/test_workbench_embed_routes.py (96%) rename src/backend/tests/{ => features/workbench}/test_workbench_external_routes.py (98%) rename src/backend/tests/{ => features/workbench}/test_workbench_invalidation.py (94%) rename src/backend/tests/{ => features/workbench}/test_workbench_migration.py (98%) rename src/backend/tests/{ => features/workbench}/test_workbench_migration_auth_gate.py (95%) rename src/backend/tests/{ => features/workbench}/test_workbench_observer_paths.py (93%) rename src/backend/tests/{ => features/workbench}/test_workbench_official_capabilities_http.py (93%) rename src/backend/tests/{ => features/workbench}/test_workbench_origins.py (95%) rename src/backend/tests/{ => features/workbench}/test_workbench_plugin_routes.py (97%) rename src/backend/tests/{ => features/workbench}/test_workbench_preferences_routes.py (95%) rename src/backend/tests/{ => features/workbench}/test_workbench_protocol.py (95%) rename src/backend/tests/{ => features/workbench}/test_workbench_provider_scope_http.py (93%) rename src/backend/tests/{ => features/workbench}/test_workbench_resource_owner_migrations.py (99%) rename src/backend/tests/{ => features/workbench}/test_workbench_resources.py (85%) rename src/backend/tests/{ => features/workbench}/test_workbench_revocation_failure_http.py (90%) rename src/backend/tests/{ => features/workbench}/test_workbench_routing_routes.py (94%) rename src/backend/tests/{ => features/workbench}/test_workbench_state_binding.py (94%) rename src/backend/tests/{ => features/workbench}/test_workbench_state_concurrency.py (87%) rename src/backend/tests/{ => features/workbench}/test_workbench_state_routes.py (95%) rename src/backend/tests/{ => features/workbench}/test_workbench_upgrade_routes.py (97%) rename src/backend/tests/{ => features/workbench}/workbench_capabilities_http_fixture.py (96%) rename src/backend/tests/{ => features/workbench}/workbench_diagnostic_http_fixture.py (95%) rename src/backend/tests/{ => features/workbench}/workbench_embed_http_fixture.py (95%) rename src/backend/tests/{ => features/workbench}/workbench_http_fixture.py (95%) rename src/backend/tests/{ => features/workbench}/workbench_observed_runner_fixture.py (90%) rename src/backend/tests/{ => features/workbench}/workbench_observer_paths.py (98%) rename src/backend/tests/{ => features/workbench}/workbench_overflow_http_fixture.py (95%) rename src/backend/tests/{ => features/workbench}/workbench_plugin_http_fixture.py (96%) rename src/backend/tests/{ => features/workbench}/workbench_plugin_support.py (100%) rename src/backend/tests/{ => features/workbench}/workbench_resource_observer.py (92%) rename src/backend/tests/{ => features/workbench}/workbench_routing_http_fixture.py (88%) create mode 100644 src/backend/tests/infra/test_byte_range.py create mode 100644 src/backend/tests/infra/test_db_off_loop_call_sites.py create mode 100644 src/backend/tests/infra/test_db_thread_budget.py create mode 100644 src/backend/tests/infra/test_no_session_on_event_loop.py create mode 100644 src/backend/tests/integrations/__init__.py create mode 100644 src/backend/tests/integrations/channels/__init__.py create mode 100644 src/backend/tests/integrations/channels/bot_cases_1.py create mode 100644 src/backend/tests/integrations/channels/bot_cases_2.py create mode 100644 src/backend/tests/integrations/channels/bot_cases_3.py create mode 100644 src/backend/tests/integrations/channels/bot_cases_4.py create mode 100644 src/backend/tests/integrations/channels/bot_cases_5.py create mode 100644 src/backend/tests/integrations/channels/bot_cases_6.py create mode 100644 src/backend/tests/integrations/channels/bot_support.py create mode 100644 src/backend/tests/integrations/channels/test_adapter_method_binding.py create mode 100644 src/backend/tests/integrations/channels/test_channel_bots.py rename src/backend/tests/{ => integrations/channels}/test_channel_bots_api.py (93%) rename src/backend/tests/{ => integrations/channels}/test_channel_desktop_e2e.py (84%) rename src/backend/tests/{ => integrations/channels}/test_channel_desktop_http.py (84%) rename src/backend/tests/{ => integrations/channels}/test_channel_desktop_migration.py (97%) rename src/backend/tests/{ => integrations/channels}/test_channel_desktop_relay.py (88%) rename src/backend/tests/{ => integrations/channels}/test_channel_desktop_relay_api.py (83%) rename src/backend/tests/{ => integrations/channels}/test_channel_desktop_worker.py (75%) rename src/backend/tests/{ => integrations/channels}/test_channel_receiver_lifecycle.py (94%) rename src/backend/tests/{ => integrations/channels}/test_weixin_connection_health.py (95%) rename src/backend/tests/{ => integrations/channels}/test_weixin_qr_protocol.py (95%) rename src/backend/tests/{ => integrations/dingtalk}/test_dingtalk_integration.py (91%) rename src/backend/tests/{ => integrations/email}/test_email_integration.py (87%) create mode 100644 src/backend/tests/integrations/lark/test_app_lifecycle.py rename src/backend/tests/{ => integrations/lark}/test_lark_auth_status.py (79%) rename src/backend/tests/{ => integrations/yida}/test_yida_integration.py (94%) create mode 100644 src/backend/tests/llm/test_delta_coalescer.py create mode 100644 src/backend/tests/llm/test_mcp_factory_e2e.py create mode 100644 src/backend/tests/llm/test_mcp_human_wait_timeout.py create mode 100644 src/backend/tests/llm/test_mcp_native_adversarial.py create mode 100644 src/backend/tests/llm/test_mcp_native_capabilities.py delete mode 100644 src/backend/tests/llm/test_mcp_pool_cache.py create mode 100644 src/backend/tests/llm/test_mcp_runtime_pool.py create mode 100644 src/backend/tests/llm/test_mcp_session_ownership.py create mode 100644 src/backend/tests/llm/test_migration_vendor_datasource.py create mode 100644 src/backend/tests/llm/test_stream_wrapper_cleanup.py create mode 100644 src/backend/tests/orchestration/automation_test_support.py create mode 100644 src/backend/tests/orchestration/hook_support.py create mode 100644 src/backend/tests/orchestration/test_agent_runtime_resources.py delete mode 100644 src/backend/tests/orchestration/test_harness_process_restart.py create mode 100644 src/backend/tests/orchestration/test_observation_writer.py create mode 100644 src/backend/tests/orchestration/test_pending_workflows.py create mode 100644 src/backend/tests/orchestration/test_plan_early_cancel.py create mode 100644 src/backend/tests/orchestration/test_runtime_phase_lifecycle.py create mode 100644 src/backend/tests/orchestration/test_tool_effect_ledger_2.py create mode 100644 src/backend/tests/orchestration/test_tool_effect_ledger_3.py create mode 100644 src/backend/tests/orchestration/test_tool_effect_ledger_4.py create mode 100644 src/backend/tests/orchestration/test_tool_effect_ledger_5.py create mode 100644 src/backend/tests/orchestration/tool_effect_support.py rename src/backend/tests/{ => personal_agent}/test_device_link.py (97%) create mode 100644 src/backend/tests/sandbox/test_controller_capacity.py create mode 100644 src/backend/tests/sandbox/test_runtime_ownership.py create mode 100644 src/backend/tests/sandbox/test_sandbox_init.py delete mode 100644 src/backend/tests/services/test_kb_multimodal_assets.py delete mode 100644 src/backend/tests/services/test_kb_wiki_end_to_end.py create mode 100644 src/backend/tests/test_agent_version_history.py delete mode 100644 src/backend/tests/test_automation_manual_trigger.py delete mode 100644 src/backend/tests/test_automation_oneshot_finalize.py delete mode 100644 src/backend/tests/test_channel_bots.py create mode 100644 src/backend/tests/test_cli_cold_bootstrap.py create mode 100644 src/backend/tests/test_credential_registry.py create mode 100644 src/backend/tests/test_db_import_order.py delete mode 100644 src/backend/tests/test_desktop_observability.py create mode 100644 src/backend/tests/test_hook_contributions.py create mode 100644 src/backend/tests/test_local_mcp_http_readiness.py create mode 100644 src/backend/tests/test_local_onboarding.py create mode 100644 src/backend/tests/test_mcp_canonical_url.py delete mode 100644 src/backend/tests/test_mcp_marketplace.py create mode 100644 src/backend/tests/test_package_sources.py create mode 100644 src/backend/tests/test_personal_agent_prompt_cache.py create mode 100644 src/backend/tests/test_route_import_order.py create mode 100644 src/backend/tests/test_session_database_isolation.py create mode 100644 src/backend/tests/test_tool_contributions.py create mode 100644 src/backend/tests/test_user_cleanup.py create mode 100644 src/frontend/scripts/test-canvas-quote-browser.mjs create mode 100644 src/frontend/scripts/test-canvas-viewers-browser.mjs create mode 100644 src/frontend/scripts/test-canvas-zoom-browser.mjs delete mode 100644 src/frontend/src/components/canvas/CanvasFileRenderers.tsx create mode 100644 src/frontend/src/components/canvas/CanvasZoomControl.tsx create mode 100644 src/frontend/src/components/canvas/canvasDocument.ts delete mode 100644 src/frontend/src/components/canvas/canvasFileCategory.ts create mode 100644 src/frontend/src/components/canvas/canvasZoom.ts create mode 100644 src/frontend/src/components/canvas/find/CanvasFind.css create mode 100644 src/frontend/src/components/canvas/find/CanvasFind.tsx create mode 100644 src/frontend/src/components/canvas/find/domFindSource.ts create mode 100644 src/frontend/src/components/canvas/find/index.ts create mode 100644 src/frontend/src/components/canvas/find/textSearch.ts create mode 100644 src/frontend/src/components/canvas/outline/CanvasOutline.css create mode 100644 src/frontend/src/components/canvas/outline/CanvasOutline.tsx create mode 100644 src/frontend/src/components/canvas/outline/domOutline.ts create mode 100644 src/frontend/src/components/canvas/outline/index.ts create mode 100644 src/frontend/src/components/canvas/renderers/DocxRenderer.tsx create mode 100644 src/frontend/src/components/canvas/renderers/FallbackRenderers.tsx create mode 100644 src/frontend/src/components/canvas/renderers/HtmlRenderer.tsx create mode 100644 src/frontend/src/components/canvas/renderers/ImageRenderer.tsx create mode 100644 src/frontend/src/components/canvas/renderers/PdfRenderer.tsx create mode 100644 src/frontend/src/components/canvas/renderers/PdfViewer.css create mode 100644 src/frontend/src/components/canvas/renderers/PdfViewer.tsx create mode 100644 src/frontend/src/components/canvas/renderers/TextRenderers.css create mode 100644 src/frontend/src/components/canvas/renderers/TextRenderers.tsx create mode 100644 src/frontend/src/components/canvas/renderers/index.ts create mode 100644 src/frontend/src/components/canvas/renderers/pdfjs.ts create mode 100644 src/frontend/src/components/canvas/renderers/previewError.ts create mode 100644 src/frontend/src/components/canvas/selection/SpreadsheetQuoteButton.css create mode 100644 src/frontend/src/components/canvas/selection/SpreadsheetQuoteButton.tsx create mode 100644 src/frontend/src/components/canvas/selection/canvasChat.ts create mode 100644 src/frontend/src/components/canvas/selection/canvasLocator.ts create mode 100644 src/frontend/src/components/canvas/selection/useCanvasSelection.tsx create mode 100644 src/frontend/src/components/chat/AgentCursor.tsx create mode 100644 src/frontend/src/components/common/AgentMark.tsx create mode 100644 src/frontend/src/components/common/RollingText.tsx create mode 100644 src/frontend/src/components/common/selection/SelectionToolbar.css create mode 100644 src/frontend/src/components/common/selection/useSelectionToolbar.tsx create mode 100644 src/frontend/src/components/file/MediaPlayer.css create mode 100644 src/frontend/src/components/file/MediaPlayer.tsx delete mode 100644 src/frontend/src/components/tool/PendingStepRow.tsx create mode 100644 src/frontend/src/components/tool/ToolKindStack.tsx create mode 100644 src/frontend/src/components/tool/toolIcons.tsx create mode 100644 src/frontend/src/hooks/useActivityAge.ts create mode 100644 src/frontend/src/styles/chat/agent-activity.css create mode 100644 src/frontend/src/utils/elapsed.ts create mode 100644 src/frontend/src/utils/filePreviewKind.ts create mode 100644 src/frontend/src/utils/quotedFollowUp.ts create mode 100644 src/frontend/src/utils/toolIconKind.ts create mode 100644 src/frontend/src/utils/turnActivity.ts diff --git a/.claude/skills/hugagent-backend-dev/references/api-envelope.md b/.claude/skills/hugagent-backend-dev/references/api-envelope.md index 841012ce..a0d9525c 100644 --- a/.claude/skills/hugagent-backend-dev/references/api-envelope.md +++ b/.claude/skills/hugagent-backend-dev/references/api-envelope.md @@ -78,4 +78,8 @@ return error_response(code=20001, message="Bad request", status_code=400) 1. **路由中只用 `success_response` / `created_response` / `paginated_response`** 2. **错误通过抛 `AppException` 子类,由全局 handler 转 `error_response`** 3. **trace_id 默认自动生成,无需手动传** -4. **SSE 端点(流式聊天)不使用信封,直接发 SSE 事件** +4. **SSE 端点不使用信封**:用 `sse_response(generator, extra_headers=...)` 返回(自带 `Cache-Control: no-cache`、 + `X-Accel-Buffering: no` 等 `SSE_HEADERS`);聊天回合的 SSE 输出统一走 `api/transports/run_sse.py`,不要自写一套 +5. **License 402** 只来自 `edition_ee/licensing/features.py` 的 `FeatureNotLicensed`(40201)/ `SeatLimitExceeded`(40202), + 路由与服务层不要手搓 402 +6. 时间字段序列化用 `.isoformat()`(模型存的是带时区的 UTC),不要输出无时区字符串 diff --git a/.claude/skills/hugagent-backend-dev/references/architecture.md b/.claude/skills/hugagent-backend-dev/references/architecture.md index 34c6a766..306f4283 100644 --- a/.claude/skills/hugagent-backend-dev/references/architecture.md +++ b/.claude/skills/hugagent-backend-dev/references/architecture.md @@ -1,129 +1,164 @@ # 后端架构参考 -## 请求流转 +## 1. 顶层布局与依赖方向 ``` -Browser → Nginx (:3000 /api/ proxy) → FastAPI (api/app.py) - → api/middleware/ (CORS → Logging → Error Handler → license_gate) - → api/routes/v1/*.py (路由层;CE 注册表 api/routes/v1/__init__.py,EE 注册表 edition_ee/routes/registry.py) - → core/services/*.py (服务层 — 业务逻辑) - → core/db/repository/ (仓库层 — 数据访问,按领域分文件) - → core/db/models/ (ORM 包 → PostgreSQL/SQLite) +src/backend/ +├── api/ HTTP 协议层:app.py(组装)、deps.py、middleware/、routes/v1/(CE_ROUTERS)、transports/run_sse.py、startup/ +├── core/ 内核:领域逻辑与可复用运行时(不导入 features / integrations / personal_agent / orchestration) +├── orchestration/ 模式编排:plans/、loops/、automations/、workers/(周期任务与恢复) +├── features/ 可安装的产品功能模块(各自 README + extension.py + models.py + api/) +├── integrations/ 外部系统集成:channels(IM 机器人框架)、dingtalk、lark、email、yida、api +├── personal_agent/ Personal Agent 模块(同样经 extension.py 接入) +├── edition_ee/ 商业版专属:路由注册表、License、Team/RBAC、EE 表、KB provider、EE 服务(CE 树物理删除) +├── extensions/ 随包资源:skills/、agents/、plugins/(default + marketplace)、mcp_servers/;根路径唯一来源 paths.py +├── prompts/ 提示词装配运行时 + prompt_text/ 文件兜底 +├── hugagent_cli/ 命令行客户端 +├── alembic/ 迁移(EE 主链;CE 用独立 ce_0001 基线) +└── tests/ pytest(按领域子目录:api/ chat/ core/ features// infra/ llm/ orchestration/ …) ``` -## 分层职责 +``` +api ──► orchestration ──► core + │ │ ▲ + └──► features / integrations / personal_agent ──┘ (通过 core.harness.registry 注册钩子接入) +edition_ee ──► core / features (CE 派生树中不存在) +``` + +- **core 永远不导入功能模块的实现**。功能模块在 `extension.setup()` 里调用 `core.harness.registry.register_*` 把能力挂进来; + 关闭时什么也不注册,core 的行为等同于未安装。 +- **不保留转发垫片**:模块搬家时直接改所有调用方的 import,不留旧路径 re-export(ADR 20261021)。 +- 单个模块 ≤ 500 行(存量超限文件已登记为例外,不要新增)。 + +## 2. core/ 子包职责 + +| 子包 | 职责 | +|---|---| +| `agent_runtime/` | 一次普通智能体回合:`runner.astream_chat_workflow` 选主智能体 / 直连路径;`prepare_*`(建 agent、组装输入)、`stream_*`(模型与工具事件 → 既有事件协议)、`*_state`(单轮有类型状态)、`integrations/`(记忆、压缩、本体证据/修复、演化) | +| `runs/` | 持久化执行所有权:租约 / 心跳、取消、事件日志与续播(`events/`)、看门狗、工具副作用账本(`tool_effects/`)、恢复 | +| `chat/` | 会话与消息读写、模式(modes)、分叉、引用、追问、压缩;`runtime/`(聊天 worker:消费回合事件、在 runs 租约下持久化输出、排队 / 插话 / 暂停 / 恢复);`operations/`、`projection/` | +| `llm/` | AgentScope 适配与智能体装配:`factory/`(build / assembly / tools / prompts)、`runtime/`(流式循环、钩子适配、工具执行、人机交互)、`citations/`(锚点发号)、`mcp/`、`subagents/`、`tools/`、`tool_permissions/`、提示词版本池 | +| `models/` | 模型供应商与选择:chat_models、providers、failover、reasoning effort、embedding / reranking、vision、用量 | +| `capabilities/` | 能力生命周期:`catalog/`、`skills/`、`plugins/`(含插件资源)、`mcp/`、`agents/`、manifest 协议 | +| `harness/` | 宿主接缝:`registry/`(功能模块注册钩子的唯一入口)、执行清单、观测事件、日志写入、用量 | +| `auth/` | `backend.py`(`get_current_user` / `UserContext`)、`bearer.py`(mock/remote Bearer 异步校验 + 共享缓存)、session、本地账号、API Key、能力位、权限接口 | +| `db/` | `engine.py`(Base / SessionLocal / `get_db` / 线程预算)、`threads.py`(`run_db` / `run_in_session` / `off_loop`)、`models/`(核心 ORM 包)、`repository/`、`utc_datetime.py`、各类升级 / 修复脚本 | +| `config/` | `settings.py`(`settings` 冻结 dataclass:deploy / auth / sso / db / llm / memory / storage / kb / redis / server / sandbox / edition / branding …)、`catalog.json`、`mcp_config.py`、`display_names.py`、`runtime_env.py` | +| `infra/` | `responses.py`、`exceptions.py`、`logging.py`、`time.py`(`utc_now`)、`background.py`(`spawn`)、redis、metrics、限流 / 熔断、leader 选举、加密、脱敏 | +| `files/` | 产物(artifacts)、内容解析(content)、空间文件(spaces)、存储协议(storage:local / s3 / oss) | +| `projects/` | 项目、项目环境、指令、本地工作区、个人项目作用域 | +| `memory/` | 分层记忆(L1 画像 / L2 向量 / L3 图谱)、抽取流水线、outbox、脱敏、TTL | +| `ontology/` | 本体治理:schema、校验、运行时闸门、输出评审、修订 | +| `evolution/` | 协同进化共享契约与证据(控制面在 EE) | +| `jobs/` | 后台作业运行时(作业 SDK、监督、通知、文件) | +| `sandbox/` | 沙箱协议 / 工厂 / providers(script_runner、opensandbox、cube[EE])、runner 进程服务、进程 / 会话 / 工作区 / 权限 / OS 隔离 | + +## 3. 功能模块(features / integrations / personal_agent) + +`features/installed.py::INSTALLED_FEATURES` 是全量安装清单(CE 由 `ce/overlay/src/backend/features/installed.py` 覆盖)。 + +| 模块 | 内容 | +|---|---| +| `features/automation` | 定时任务:调度、执行、投递目标、通知、远程副作用 | +| `features/knowledge` | 自建知识库:解析、分块、向量、资产索引、Wiki;外部 provider 接缝 | +| `features/marketplace` | 技能 / 智能体 / MCP 市场:目录、安装、发布、版本、导出 | +| `features/workbench` | 可扩展工作台:应用目录、外部应用 / 嵌入 / 外部认证、插件 UI、资源实例、偏好、诊断、迁移 | +| `features/hosted_apps` | 托管业务应用(SQL / MCP):部署、数据、发布、资源 | +| `features/sites` | 站点托管与发布(静态服务、访问密码、打包、本机发布) | +| `features/desktop` | 桌面双端:能力桥、网关、本机能力、登录桥接、可观测性 | +| `features/evaluation` | 评测沙箱(严格 OpenSandbox) | +| `features/distillation` · `security_console` · `datasources` · `sandbox_ops` | EE:技能 / 人格蒸馏、安全台、数据源、沙箱运维 | +| `integrations/channels` + `dingtalk` / `lark` / `email` / `yida` | 入站渠道机器人框架与各平台适配 | +| `personal_agent` | Personal Agent:会话、渠道、调度、投递、设备连接、工作区人格 | + +模块约定: ``` -┌─────────────────────────────────────────┐ -│ Routes (api/routes/v1/) │ ← HTTP 入口、参数校验、响应包装 -│ - 依赖注入: auth, db │ -│ - Pydantic 请求模型 │ -│ - _to_dict() 转换函数 │ -│ - 调用 Service │ -├─────────────────────────────────────────┤ -│ Services (core/services/) │ ← 业务逻辑、权限校验、审计 -│ - 构造函数接收 db: Session │ -│ - 内部创建 Repository │ -│ - 幂等操作 (ensure_xxx) │ -│ - 抛 AppException │ -├─────────────────────────────────────────┤ -│ Repository (core/db/repository/) │ ← 数据访问抽象(包,10 个领域文件) -│ - CRUD 操作 │ -│ - 分页查询 │ -│ - 软删除过滤 │ -│ - 不含业务逻辑 │ -├─────────────────────────────────────────┤ -│ Models (core/db/models/) │ ← ORM 定义(包,17 个领域文件) -│ - SQLAlchemy declarative │ -│ - 索引、约束、关系 │ -│ - EE 专属表登记 edition_ee/db/edition_tables.py │ -│ - Alembic 迁移 │ -└─────────────────────────────────────────┘ +features// +├── README.md 负责什么、公开入口、依赖方向、版本差异 +├── extension.py NAME + setup() -> bool;可选 register_tools / register_gateway_contributions / +│ register_catalog_options / register_retrieval_context +├── models.py ORM(按安装清单加载,与运行开关无关) +├── edition.py (可选)CE/EE 差异唯一入口,CE overlay 只覆盖它 +├── service.py / repository.py / <领域>.py +└── api/ 路由文件(多数进 CE_ROUTERS / EE_ROUTERS,可关闭的由 setup() 内 register_router 挂载) ``` -## 聊天流式请求流转 +## 4. 启动与路由装配(api/app.py) + +1. `orchestration.configuration.register_configuration()`、`features.register_run_capabilities()`、 + `register_model_credentials()`、`integrations.register_credentials()` +2. 挂 health、`api/routes` 文件下载路由 +3. `iter_edition_routers(CE_ROUTERS)` 全部 include;`iter_edition_routers(EE_ROUTERS)` include 并附加 + `edition_router_dependencies(policy_key)`(License 能力位,未授权 402) +4. `register_product_tools()` / `register_catalog_options()` / `register_package_sources()` / `register_resource_owners()` +5. `load_extensions(INSTALLED_FEATURES)`:先 `load_models`,再逐个 `.extension.setup()`;然后挂 + `core.harness.registry.routers()` 里登记的模块路由 +6. `sites_serve_router`(静态站点兜底)→ 登录路由 → mock SSO(按登录模式)→ 本地模式前端静态托管(最后) + +注册表规则: + +- `CE_ROUTERS`(`api/routes/v1/__init__.py`):二元组 `(module, attr)`;短名解析为 `api.routes.v1.`, + 含点号的写绝对路径(`"features.sites.api.sites"`)。**顺序即注册顺序**,同前缀族的先后有语义(例:`plugin_ui` 必须在 + `plugins` 之前,否则 `/v1/plugins/{slug}` 会吞掉 `/v1/plugins/ui-contributions`) +- `EE_ROUTERS`(`edition_ee/routes/registry.py`):三元组 `(module, attr, policy_key)`;`policy_key` 取 + `edition_ee/licensing/features.py::Feature` 的值(`content_admin` / `audit` / `multi_tenancy` / `system_config` / + `billing` / `model_gateway` / `evolution_control` …);`None` 仅用于 License 失效时也必须可达的入口(登录、换证) +- `api.edition.EE_ROUTERS` 是懒加载接缝;CE overlay 把它换成空表 +- **不要**在 `app.py` 手工 `include_router()` + +## 5. 一次聊天回合的流转 ``` -POST /v1/agents/responses - → api/routes/v1/chats/__init__.py - → orchestration/chat_run_executor.py # ChatRun + Redis Stream(后台 run,SSE 跟随,断线续播) - → orchestration/workflow.py # 流式编排主入口 - → core/services/chat_mode_service.py # 解析对话模式 ChatModeSpec(standard/turbo/市场模式;装配契约) - → orchestration/memory_integration.py # 检索分层记忆并注入(user-role 冻结块,600ms 预算) - → core/llm/factory/build.py # 构建 AgentScope 2.0 ReActAgent(按 ChatModeSpec 收窄工具面) - → core/llm/mcp_manager.py # MCP 客户端池(streamable-http → mcp 容器) - → core/config/mcp_config.py # MCP server 定义(端口真源 mcp_servers/_ports.py) - → core/llm/middlewares.py # AS2 中间件(动态模型、文件上下文、CitationAnchorMiddleware、OntologyGateMiddleware) - → prompts/prompt_runtime.py # 装配系统提示词(DB 版本池优先,prompt_text/ 兜底) - → orchestration/streaming.py # StreamingAgent:把 AS2 事件流映射为内部块事件 - → orchestration/citation_anchor.py # 引用锚点唯一发号(AnchorAllocator,e1/e2/…,经中间件回注工具结果) - → core/memory/service.py # 流结束后后台保存记忆(L1/L2/L3) - → orchestration/followups.py # 流结束后后台生成追问建议(写入消息 extra_data) +POST /v1/agents/responses api/routes/v1/agent_responses.py(+ chats/ 子路由) + → 准入与回合登记 core/chat/runtime/admission.py · core/runs(租约、事件日志) + → 聊天 worker core/chat/runtime/worker.py(消费事件、按顺序持久化输出) + → core/agent_runtime/runner.astream_chat_workflow + → prepare_main / prepare_direct 建 agent、组装输入(模式 core/chat/modes.py、记忆 integrations/memory.py) + → core/llm/factory/build.py AgentScope agent:模型选择、工具集、MCP(core/llm/mcp)、技能、提示词 + → stream_main / stream_direct 模型与工具事件 → 事件协议(core/llm/runtime/streaming.py、stream_events.py) + → core/llm/citations/ 引用锚点发号(e1/e2…) + → 结束后:本体评审、记忆 / 演化结算、追问(core/chat/runtime/followups.py) + → SSE 输出 api/transports/run_sse.py(跟随事件日志;续播 GET /v1/chats/stream/{run_id}/subscription) ``` -> `orchestration/strategy.py` 仍在但已退化为占位符(两个分支都返回 MainOnlyStrategy),不再是主链路环节。 - -**平级编排入口**(不走普通 chat run 的独立驱动): - -| 入口 | 文件 | 说明 | -|------|------|------| -| 自主循环 | `orchestration/autonomous_loop.py` + `loop_planner.py` / `loop_evaluator.py` + `subagents/loop_reviewer.py` | driver 持有需求台账 feature_list.json,逐条注入 + 只读 reviewer 验收;路由 `v1/loops.py` | -| 批量执行 | `orchestration/batch_orchestrator.py` | batch_confirm 确认后逐行执行 | -| 计划模式 | `orchestration/subagents/plan_mode.py` | plan_generate / plan_execute run | -| 渠道入站 | `core/channels/`(protocol/registry/manager/inbound/outbound) | IM 消息归一为 InboundMsg 后复用聊天编排,回复经 markdown.py 降级回发 | -| 定时任务 | `orchestration/schedulers/`(automation / distillation_cron / evolution / memory_ttl) | croniter 调度 | - -SSE 事件(前端解析真源 `src/frontend/src/hooks/chatStream.ts`): - -- 生命周期:`run_started`(首帧,携带续播 run_id)、`meta`、`error`、`end` / `data: [DONE]`(终止)、心跳为 SSE 注释行 -- 正文/思考:`content`(delta 增量;别名 ai_message/text/delta)、`content_replace`、`thinking`、`compaction_notice`、`steer_applied` -- 工具:`tool_call_start`、`tool_call_delta`(参数流式)、`tool_call`、`tool_result`、`tool_pending`、`model_progress`(活性信号) -- 交互确认:`batch_confirm`、`file_confirm`、`design_pick` -- 计划/子智能体:`plan_update`、`subagent_event` -- 本体治理:`ontology_activation` / `ontology_gate` / `ontology_review` / `ontology_repair` / `ontology_revision` / `ontology_revision_thinking` - -断线续播:`GET /v1/chats/stream/{run_id}`。追问建议(follow_up_questions)流结束后后台生成,也可能以 `follow_up` 事件流内直送。 - -## 模块索引 - -| 模块 | 路径 | 职责 | -|------|------|------| -| App 入口 | `api/app.py` | FastAPI 实例、中间件;路由按注册表自动注册 | -| CE 路由注册表 | `api/routes/v1/__init__.py` | **CE_ROUTERS 单一真源**(二元组);re-export EE_ROUTERS | -| EE 路由注册表 | `edition_ee/routes/registry.py` | **EE_ROUTERS 单一真源**(三元组,带 license 能力位) | -| 依赖注入 | `api/deps.py` | require_admin(ADMIN_TOKEN)、require_config(CONFIG_TOKEN)、require_admin_or_config、require_system_settings、require_super_admin | -| 用户认证 | `core/auth/backend.py` | get_current_user / UserContext(桌面桥接 → session → API-Key → mock/remote) | -| 健康检查 | `api/health.py` | /health, /ready, /live | -| Schema | `api/schemas.py` | 请求/响应 Pydantic 模型 | -| 路由 | `api/routes/v1/` | 66 个路由文件 | -| 技能引擎 | `core/agent_skills/` | SKILL.md 解析、多源加载、{dir} 沙箱路径注入 | -| 生成物 | `core/artifacts/` | 注册与下载(store.py,local/oss 双模) | -| 认证 | `core/auth/` | backend.py, session.py, sso.py, permissions_iface.py(CE/EE 接缝) | -| 渠道 | `core/channels/` | 入站机器人框架:钉钉/飞书/企微/微信 adapter;加渠道 = 写 adapter + registry.py 注册 | -| 聊天 | `core/chat/` | context.py, tool_log.py | -| 配置 | `core/config/` | settings.py + catalog 五件套(catalog.json/catalog.py/loader/resolver/migration)+ mcp_config.py | -| 内容 | `core/content/` | 内容块、file_parser.py | -| 数据库 | `core/db/` | engine.py, models/(17 领域文件), repository/(10 领域文件), model_extensions.py, edition_tables.py(垫片) | -| 进化 | `core/evolution/` | GCE 共享契约(Episode/候选/结算);控制面在 edition_ee/evolution | -| 基础设施 | `core/infra/` | exceptions, responses, logging, metrics, 限流, Redis, crypto | -| 知识库 | `core/kb/` | 分块、向量化、混合检索 + wiki/(LLM-Wiki 管线)+ wiki_router.py + external_provider.py(外接接缝) | -| License | `core/licensing/` | features.py(能力位+402)、manager.py(状态机) | -| LLM | `core/llm/` | agent_factory(含 turbo 参数), chat_models, middlewares, mcp_manager/mcp_pool, offloader, subagent_tool, tools/ | -| 记忆 | `core/memory/` | service.py(mem0)、pipeline.py、profile.py(L1)、sanitizer.py、audit.py | -| 本体 | `core/ontology/` | Domain Pack 校验、运行时选取、工具闸(schemas/validator/revision/toolkit) | -| 沙箱 | `core/sandbox/` | protocol.py + script_runner / opensandbox / cube 三实现 | -| 服务 | `core/services/` | 70+ 业务服务(user/chat/chat_mode/channel/loop/kb/plugin/prompt_version/marketplace…) | -| 存储 | `core/storage/` | protocol, local, s3, oss | -| 编排 | `orchestration/` | workflow, chat_run_executor, streaming, citation_anchor, autonomous_loop, followups, batch_orchestrator, schedulers/, subagents/ | -| 提示词 | `prompts/` | prompt_runtime + provider + prompt_text/{default,code_exec,distillation,plan_mode,subagents,turbo}/ | -| MCP 服务器 | `mcp_servers/` | 12 个 server 目录、11 个在役(端口 9100–9114,真源 _ports.py;9105/9109-9111 为退役保留位) | -| 技能资产 | `skill_bundles/` | default/(5 内置)+ marketplace/(40+ 可安装) | -| EE 树 | `edition_ee/` | EE 专属路由/模型/KB provider(dify/fastgpt/weknora)/evolution 控制面;CE 派生树物理删除 | - -## 新路由注册步骤 - -1. 创建 `api/routes/v1/my_feature.py`(EE 专属则放 `edition_ee/routes/`),文件内定义 `router = APIRouter(prefix="/v1/xxx", tags=["Xxx"])` -2. 注册进对应注册表: - - 通用功能 → `api/routes/v1/__init__.py` 的 `CE_ROUTERS` 加 `("my_feature", "router")` - - 企业版功能 → `edition_ee/routes/registry.py` 的 `EE_ROUTERS` 加 `("edition_ee.routes.my_feature", "router", "")`(能力位 `None` 表示显式豁免 feature 守卫) -3. **不要**在 `api/app.py` 手工 `include_router()` —— app 启动时经 `iter_edition_routers()` 按表自动注册,模块缺失(CE 派生树物理删除了 EE 文件)会被静默跳过 +平级编排入口(不走普通回合): + +| 入口 | 位置 | +|---|---| +| 计划模式 | `orchestration/plans/`(generate_run / execute_run / mode) | +| 自主循环 | `orchestration/loops/`(driver / planner / reviewer / requirements / recovery) | +| 定时任务派发 | `orchestration/automations/` + `features/automation` | +| 周期任务 / 恢复 | `orchestration/workers/`(`_worker_base.py`、run_recovery、memory_ttl、evolution、蒸馏 cron) | +| 渠道入站 | `integrations/channels/`(归一为入站消息后复用聊天回合) | + +## 6. 数据访问与事件循环 + +- 同步 SQLAlchemy Session 的每次查询都是阻塞 I/O。 +- **只用 Session 不 await 的路由写 `def`**(FastAPI 线程池执行);`def` 路由里没有事件循环,不能 `create_task` / `get_running_loop`。 +- **要 await 网络的 async 代码不持有 Session**:每段 DB 工作写成同步函数,用 `await run_in_session(fn, ...)`(新开并关闭会话) + 或 `await run_db(fn, ...)`(已有会话)在线程里跑;需要 async 接口的纯 DB 函数用 `@off_loop` 包装。 +- 线程池与连接池按 `core.db.engine.thread_budget()` 同一预算配置(`apply_thread_budget()`)。 +- 跨请求存活的工作:落库交给 worker(`orchestration/workers/_worker_base.py`);事件循环上的临时任务用 `core.infra.background.spawn(coro, name=...)`。 +- 守卫测试:`tests/test_no_blocking_async_routes.py`、`tests/test_no_event_loop_in_sync_routes.py`、 + `tests/infra/test_no_session_on_event_loop.py`(全仓零例外:任何 async 函数都不收 `db` / `Session` / `Depends(get_db)`、 + 不调 `SessionLocal()`、不 `with … as db`;测试里覆盖 `get_db` 时同时用 `tests/db_support.py` 让 `run_in_session` 指向同一个库)。 + +## 7. 模块索引(常用入口) + +| 主题 | 路径 | +|---|---| +| 应用组装 | `api/app.py`、`api/lifecycle.py`、`api/startup/` | +| 路由注册表 | `api/routes/v1/__init__.py`(CE)、`edition_ee/routes/registry.py`(EE)、`core/harness/registry`(模块路由) | +| 依赖注入 | `api/deps.py`(require_admin / require_config / require_admin_or_config / require_system_settings / require_ontology_governance / require_super_admin / console_actor) | +| 认证 | `core/auth/backend.py`(get_current_user / UserContext)、`core/auth/bearer.py` | +| DB | `core/db/engine.py`(get_db)、`core/db/threads.py`、`core/db/models/`、`core/db/repository/` | +| 信封 / 异常 | `core/infra/responses.py`、`core/infra/exceptions.py`、`api/middleware/error_handler.py` | +| 配置 | `core/config/settings.py`、`core/config/catalog.json` | +| 智能体回合 | `core/agent_runtime/`、`core/llm/factory/`、`core/llm/runtime/` | +| 运行与续播 | `core/runs/`、`core/chat/runtime/`、`api/transports/run_sse.py` | +| MCP 服务 | `extensions/mcp_servers/`(`registry.py`、`_ports.py` 端口稳定契约、`_launcher.py`)、`core/config/mcp_config.py` | +| 技能 / 插件 / 智能体资源 | `extensions/{skills,plugins,agents}/{default,marketplace}`、`core/capabilities/` | +| 提示词 | `prompts/prompt_runtime.py`(DB 版本池优先,`prompt_text/` 兜底)、`core/llm/prompt_*.py` | +| License | `edition_ee/licensing/`(features / deps / gate / manager)、`api/middleware/edition.py` | +| CE 派生 | `ce/manifest.yaml`(排除)、`ce/overlay/`(覆盖接缝文件) | diff --git a/.claude/skills/hugagent-backend-dev/references/error-codes.md b/.claude/skills/hugagent-backend-dev/references/error-codes.md index 18149924..73d26851 100644 --- a/.claude/skills/hugagent-backend-dev/references/error-codes.md +++ b/.claude/skills/hugagent-backend-dev/references/error-codes.md @@ -35,6 +35,8 @@ |------|------|----------------|------| | 40001 | 404 | `ResourceNotFoundError` | 资源未找到 | | 40002 | 404 | `EndpointNotFoundError` | API 端点不存在 | +| 40201 | 402 | `FeatureNotLicensed`(`edition_ee/licensing/features.py`) | License 未授权该能力(EE 路由能力位守卫) | +| 40202 | 402 | `SeatLimitExceeded`(同上) | 席位不足 / License 无效,无法新增用户 | | 41001 | 409 | `ResourceAlreadyExistsError` | 资源已存在 | | 41002 | 409 | `ConcurrentModificationError` | 并发修改冲突 | | 42001 | 429 | `RateLimitExceededError` | 速率限制 | diff --git a/.claude/skills/hugagent-backend-dev/scripts/scaffold_feature.sh b/.claude/skills/hugagent-backend-dev/scripts/scaffold_feature.sh index 313654df..ff2ca623 100755 --- a/.claude/skills/hugagent-backend-dev/scripts/scaffold_feature.sh +++ b/.claude/skills/hugagent-backend-dev/scripts/scaffold_feature.sh @@ -1,83 +1,108 @@ #!/usr/bin/env bash # -# 后端新功能脚手架生成器 +# 后端功能模块脚手架:生成 features// 完整骨架 # # 用法: -# bash .claude/skills/hugagent-backend-dev/scripts/scaffold_feature.sh +# bash .claude/skills/hugagent-backend-dev/scripts/scaffold_feature.sh # # 示例: # bash .claude/skills/hugagent-backend-dev/scripts/scaffold_feature.sh bookmark Bookmark bookmarks # -# 生成文件: -# - src/backend/api/routes/v1/s.py (路由) -# - src/backend/core/services/_service.py (服务) -# - src/backend/tests/test_.py (测试) +# 生成: +# src/backend/features//__init__.py +# src/backend/features//README.md 职责、公开入口、依赖方向 +# src/backend/features//extension.py NAME + setup() +# src/backend/features//models.py ORM(UTCDateTime + utc_now + JSONType) +# src/backend/features//repository.py +# src/backend/features//service.py +# src/backend/features//api/__init__.py +# src/backend/features//api/s.py 路由(同步 def + run_in_session 示例) +# src/backend/tests/features//__init__.py +# src/backend/tests/features//test_.py # -# 注意: model 和 repository 需手动合并到对应领域文件中 -# - core/db/models/<领域>.py ← 添加 ORM 类(并在包 __init__.py re-export) -# - core/db/repository/<领域>.py ← 添加 Repository 类 -# - api/routes/v1/__init__.py ← 注册进 CE_ROUTERS / EE_ROUTERS 注册表 -# - 运行: alembic revision --autogenerate -m "add ${table_name} table" +# 只建新文件,已存在的文件跳过;不改任何注册表(手动步骤见脚本末尾输出)。 +# 不是所有新功能都该进 features/:先按 SKILL.md「放哪里」判断。 set -euo pipefail -FEATURE="${1:?Usage: $0 }" -FEATURE_CAP="${2:?Usage: $0 }" -TABLE="${3:?Usage: $0 }" +FEATURE="${1:?Usage: $0 }" +FEATURE_CAP="${2:?Usage: $0 }" +TABLE="${3:?Usage: $0 }" +FEATURE_UPPER="$(echo "$FEATURE" | tr '[:lower:]' '[:upper:]')" SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" TEMPLATE_DIR="$SCRIPT_DIR/../templates" PROJECT_ROOT="$(cd "$SCRIPT_DIR/../../../../" && pwd)" BACKEND="$PROJECT_ROOT/src/backend" +PKG="$BACKEND/features/$FEATURE" +TESTS="$BACKEND/tests/features/$FEATURE" -echo "=== HugAgentOS Backend Scaffold ===" -echo "Feature: $FEATURE / $FEATURE_CAP" -echo "Table: $TABLE" -echo "" - -# Route file -ROUTE_FILE="$BACKEND/api/routes/v1/${FEATURE}s.py" -if [ ! -f "$ROUTE_FILE" ]; then +render() { # render