From b9a9999291330b7260dfbb20075a5393af9d2177 Mon Sep 17 00:00:00 2001 From: Haitao Pan Date: Wed, 13 May 2026 16:45:54 +0800 Subject: [PATCH] chore: remove stale gateway settings and app ffi paths --- .gitignore | 1 + Makefile | 27 +- config/feature_flags.yaml | 54 -- config/settings.yaml | 1 - docs/README_TESTING.md | 1 + ...assistant-thread-working-directory-flow.md | 8 +- docs/architecture/public-api/README.md | 12 +- .../_generated/public-symbol-inventory.json | 763 ++++++++---------- .../_generated/public-symbol-inventory.md | 578 +++++++------ ...1-settings-config-state-workflow-design.md | 3 +- ...-13-flutter-stale-code-cleanup-analysis.md | 161 ++++ docs/reports/codex-ffi-status-report.md | 190 ----- flutter_rust_bridge.yaml | 20 - lib/app/app_controller_desktop.dart | 1 - lib/app/app_controller_desktop_core.dart | 53 +- lib/app/app_controller_desktop_gateway.dart | 1 - .../app_controller_desktop_navigation.dart | 55 +- ...pp_controller_desktop_runtime_helpers.dart | 1 - lib/app/app_controller_desktop_settings.dart | 1 - ...p_controller_desktop_settings_runtime.dart | 1 - .../app_controller_desktop_single_agent.dart | 3 - ..._controller_desktop_skill_permissions.dart | 1 - ...pp_controller_desktop_thread_sessions.dart | 1 - ...op_thread_sessions_collaboration_impl.dart | 1 - ...app_controller_desktop_thread_storage.dart | 1 - ...ontroller_desktop_workspace_execution.dart | 1 + lib/app/ui_feature_manifest_core.dart | 14 - lib/app/workspace_navigation.dart | 30 +- lib/app/workspace_page_registry.dart | 58 +- .../assistant_page_state_actions.dart | 9 +- .../assistant_page_task_dialog_controls.dart | 17 +- .../assistant/assistant_page_task_models.dart | 17 +- lib/features/mobile/mobile_shell_core.dart | 49 +- .../settings/settings_account_panel.dart | 33 +- lib/features/settings/settings_page_core.dart | 6 - lib/models/app_models.dart | 45 +- .../runtime_controllers_derived_tasks.dart | 16 +- ...ime_controllers_settings_account_impl.dart | 13 +- lib/runtime/runtime_models_account.dart | 153 +--- lib/runtime/runtime_models_configs.dart | 129 +-- .../runtime_models_settings_snapshot.dart | 4 +- lib/runtime/secret_store.dart | 38 +- lib/widgets/settings_page_shell.dart | 75 -- macos/Frameworks/README.md | 42 - macos/Runner.xcodeproj/add_ffi_framework.sh | 25 - pubspec.lock | 2 +- pubspec.yaml | 1 - scripts/check-no-app-ffi.sh | 43 + scripts/ci/run_code_analysis.sh | 1 + scripts/ci/run_flutter_ci_suite.sh | 1 + scripts/copy_ffi_framework.sh | 44 - scripts/generate_ffi_bindings.sh | 33 - scripts/integrate_rust_flutter.sh | 49 -- scripts/package-flutter-mac-app.sh | 11 - .../assistant_task_model_cleanup_test.dart | 23 + .../settings/settings_account_panel_test.dart | 2 - .../assistant_execution_target_test.dart | 46 +- test/runtime/bridge_runtime_cleanup_test.dart | 44 +- .../runtime/gateway_profile_cleanup_test.dart | 77 ++ ...ime_controllers_settings_account_test.dart | 5 +- 60 files changed, 1179 insertions(+), 1916 deletions(-) create mode 100644 docs/reports/2026-05-13-flutter-stale-code-cleanup-analysis.md delete mode 100644 docs/reports/codex-ffi-status-report.md delete mode 100644 flutter_rust_bridge.yaml delete mode 100644 lib/app/app_controller_desktop_single_agent.dart delete mode 100644 macos/Frameworks/README.md delete mode 100755 macos/Runner.xcodeproj/add_ffi_framework.sh create mode 100755 scripts/check-no-app-ffi.sh delete mode 100755 scripts/copy_ffi_framework.sh delete mode 100755 scripts/generate_ffi_bindings.sh delete mode 100755 scripts/integrate_rust_flutter.sh create mode 100644 test/features/assistant/assistant_task_model_cleanup_test.dart create mode 100644 test/runtime/gateway_profile_cleanup_test.dart diff --git a/.gitignore b/.gitignore index c4e4d902..d3456ae2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ # Miscellaneous .env +.playwright-mcp/ *.py null/ test/golden/failures/ diff --git a/Makefile b/Makefile index d7911e6a..875c0544 100644 --- a/Makefile +++ b/Makefile @@ -118,7 +118,7 @@ package-rpm: ## Create the Linux .rpm package package-linux: ## Create both Linux packages bash scripts/package-linux.sh -package-mac: ffi-integrate build-go-core ## Create the macOS .app and DMG +package-mac: build-go-core ## Create the macOS .app and DMG XWORKMATE_APP_STORE=true bash scripts/package-flutter-mac-app.sh install-mac: package-mac ## Package and install the macOS app into /Applications @@ -130,28 +130,3 @@ clean: ## Remove generated artifacts check-export-compliance: ## Verify source and built Apple plist export-compliance flags bash scripts/check-apple-export-compliance.sh - -# Rust FFI targets -.PHONY: rust-build rust-build-release rust-build-debug rust-test ffi-copy ffi-generate - -rust-build: rust-build-release ## Build Rust FFI library (release mode) - -rust-build-release: ## Build Rust FFI library for macOS (release) - @echo "Skip cargo build (external management)" - -rust-build-debug: ## Build Rust FFI library in debug mode - @echo "Skip cargo build (external management)" - -rust-test: ## Run Rust tests - cd rust && cargo test - -ffi-copy: ## Copy FFI library to macOS Frameworks - bash scripts/copy_ffi_framework.sh - -ffi-generate: ## Generate FFI bindings using flutter_rust_bridge - bash scripts/generate_ffi_bindings.sh - -ffi-integrate: ffi-copy ## Copy FFI library (full integration) - -# Build with FFI integration -build-macos-ffi: ffi-copy build-macos ## Build macOS app with FFI integration diff --git a/config/feature_flags.yaml b/config/feature_flags.yaml index 0e0762ff..1e84d6fe 100644 --- a/config/feature_flags.yaml +++ b/config/feature_flags.yaml @@ -73,24 +73,6 @@ mobile: build_modes: [debug, profile, release] description: Mobile vault server settings ui_surface: settings_page - gateway_self_hosted_base: - enabled: false - release_tier: experimental - build_modes: [debug, profile, release] - description: Mobile self-hosted gateway base controls - ui_surface: settings_page - gateway_advanced_custom_mode: - enabled: false - release_tier: experimental - build_modes: [debug, profile, release] - description: Mobile advanced gateway override controls - ui_surface: settings_page - gateway_setup_code: - enabled: false - release_tier: experimental - build_modes: [debug, profile, release] - description: Mobile gateway setup code editor - ui_surface: settings_page experimental_canvas: enabled: true release_tier: experimental @@ -180,24 +162,6 @@ desktop: build_modes: [debug, profile, release] description: Desktop vault server settings ui_surface: settings_page - gateway_self_hosted_base: - enabled: false - release_tier: experimental - build_modes: [debug, profile, release] - description: Desktop self-hosted gateway base controls - ui_surface: settings_page - gateway_advanced_custom_mode: - enabled: false - release_tier: experimental - build_modes: [debug, profile, release] - description: Desktop advanced gateway override controls - ui_surface: settings_page - gateway_setup_code: - enabled: false - release_tier: experimental - build_modes: [debug, profile, release] - description: Desktop gateway setup code editor - ui_surface: settings_page experimental_canvas: enabled: true release_tier: experimental @@ -287,24 +251,6 @@ web: build_modes: [] description: Web vault server settings disabled ui_surface: settings_page - gateway_self_hosted_base: - enabled: false - release_tier: experimental - build_modes: [] - description: Web self-hosted gateway base controls disabled - ui_surface: settings_page - gateway_advanced_custom_mode: - enabled: false - release_tier: experimental - build_modes: [] - description: Web advanced gateway override controls disabled - ui_surface: settings_page - gateway_setup_code: - enabled: false - release_tier: experimental - build_modes: [] - description: Web gateway setup code editor disabled - ui_surface: settings_page experimental_canvas: enabled: false release_tier: experimental diff --git a/config/settings.yaml b/config/settings.yaml index c56ee663..70e2c6e3 100644 --- a/config/settings.yaml +++ b/config/settings.yaml @@ -17,7 +17,6 @@ acpBridgeServerModeConfig: lastSyncAt: 0 remoteServerSummary: endpoint: https://xworkmate-bridge.svc.plus - hasAdvancedOverrides: false selfHosted: serverUrl: '' username: '' diff --git a/docs/README_TESTING.md b/docs/README_TESTING.md index 3593b254..28961e7c 100644 --- a/docs/README_TESTING.md +++ b/docs/README_TESTING.md @@ -34,6 +34,7 @@ go test ./... ## CI Coverage - Pull requests in `xworkmate-app` use the `verify` stage as a static-analysis gate and always run `flutter analyze`. +- Static analysis also runs `scripts/check-no-app-ffi.sh` so app packaging cannot reintroduce the retired Codex FFI copy/embed path. - Widget, integration, and Patrol suites are owned by their dedicated commands and release validation flows, not by the lightweight `verify` gate. - Pushes to `main`, version tags, and manual workflow runs publish build artifacts and update the GitHub Release entry for that release mode. - `xworkmate-bridge` Go tests run in the companion repository. diff --git a/docs/architecture/archive/assistant-thread-working-directory-flow.md b/docs/architecture/archive/assistant-thread-working-directory-flow.md index 685e1309..ab32c984 100644 --- a/docs/architecture/archive/assistant-thread-working-directory-flow.md +++ b/docs/architecture/archive/assistant-thread-working-directory-flow.md @@ -206,9 +206,9 @@ flowchart LR - `Directory.current.path` -关键位置: +历史关键位置: -- [app_controller_desktop_single_agent.dart](/Users/shenlan/workspaces/cloud-neutral-toolkit/xworkmate/lib/app/app_controller_desktop_single_agent.dart:140) +- 历史 Single Agent 桥接文件,已在 2026-05 清理中移除 这就是“任务线程没有有效目录时,命令最后跑到全局/容器 cwd”的直接原因。 @@ -219,9 +219,9 @@ Single Agent 运行后可能返回: - `result.resolvedWorkingDirectory` - `result.resolvedWorkspaceRefKind` -关键位置: +历史关键位置: -- [app_controller_desktop_single_agent.dart](/Users/shenlan/workspaces/cloud-neutral-toolkit/xworkmate/lib/app/app_controller_desktop_single_agent.dart:155) +- 历史 Single Agent 桥接文件,已在 2026-05 清理中移除 当前逻辑中: diff --git a/docs/architecture/public-api/README.md b/docs/architecture/public-api/README.md index 7d42c938..87448605 100644 --- a/docs/architecture/public-api/README.md +++ b/docs/architecture/public-api/README.md @@ -58,18 +58,18 @@ Last Updated: 2026-04-14 ## Coverage Summary -当前生成清单覆盖 `130` 个源码文件、`614` 个公开符号。 +当前生成清单覆盖 `129` 个源码文件、`603` 个公开符号。 | Scope | Files | Public Symbols | Detailed Design Entries | Notes | | --- | ---: | ---: | ---: | --- | | `lib/app` | 30 | 68 | 10 | 主写桌面编排入口、扩展、registry 与 shell | -| `lib/runtime` | 67 | 377 | 18 | 主写 bridge contract、runtime client、controller、bootstrap | -| `lib/models` | 1 | 34 | 13 | 主写 settings / execution / provider / snapshot 主模型 | -| `lib/features/assistant` | 16 | 80 | 1 | 只展开页面入口与业务挂点 | -| `lib/features/settings` | 4 | 4 | 1 | 只展开设置主入口 | +| `lib/runtime` | 66 | 372 | 18 | 主写 bridge contract、runtime client、controller、bootstrap | +| `lib/models` | 1 | 31 | 13 | 主写 settings / execution / provider / snapshot 主模型 | +| `lib/features/assistant` | 16 | 79 | 1 | 只展开页面入口与业务挂点 | +| `lib/features/settings` | 4 | 5 | 1 | 只展开设置主入口 | | `lib/features/mobile` | 6 | 19 | 1 | 只展开移动端 shell 主入口 | | `lib/theme` | 2 | 13 | 2 | 只展开工程上影响 API 的 theme/palette 入口 | -| `rust/src` | 4 | 19 | 17 | 结构体与 FFI 函数全部展开 | +| `rust/src` | 4 | 16 | 17 | 结构体与 FFI 函数全部展开 | 说明: diff --git a/docs/architecture/public-api/_generated/public-symbol-inventory.json b/docs/architecture/public-api/_generated/public-symbol-inventory.json index 9a582bad..5907438c 100644 --- a/docs/architecture/public-api/_generated/public-symbol-inventory.json +++ b/docs/architecture/public-api/_generated/public-symbol-inventory.json @@ -1,5 +1,5 @@ { - "generatedAt": "2026-04-14T08:20:04.438927+00:00", + "generatedAt": "2026-05-13T08:37:25.180831+00:00", "targets": [ "lib/app", "lib/runtime", @@ -16,23 +16,23 @@ }, { "scope": "lib/runtime", - "fileCount": 67, - "symbolCount": 377 + "fileCount": 66, + "symbolCount": 372 }, { "scope": "lib/models", "fileCount": 1, - "symbolCount": 34 + "symbolCount": 31 }, { "scope": "lib/features/assistant", "fileCount": 16, - "symbolCount": 80 + "symbolCount": 79 }, { "scope": "lib/features/settings", "fileCount": 4, - "symbolCount": 4 + "symbolCount": 5 }, { "scope": "lib/features/mobile", @@ -47,12 +47,12 @@ { "scope": "rust/src", "fileCount": 4, - "symbolCount": 19 + "symbolCount": 16 } ], "totals": { - "fileCount": 130, - "symbolCount": 614 + "fileCount": 129, + "symbolCount": 603 }, "groups": [ { @@ -110,7 +110,7 @@ { "language": "dart", "path": "lib/app/app_controller_desktop_core.dart", - "line": 54, + "line": 57, "kind": "enum", "name": "CodexCooperationState", "signature": "enum CodexCooperationState { notStarted, bridgeOnly, registered }" @@ -118,7 +118,7 @@ { "language": "dart", "path": "lib/app/app_controller_desktop_core.dart", - "line": 56, + "line": 59, "kind": "class", "name": "SingleAgentSkillScanRootInternal", "signature": "class SingleAgentSkillScanRootInternal {" @@ -126,7 +126,7 @@ { "language": "dart", "path": "lib/app/app_controller_desktop_core.dart", - "line": 88, + "line": 91, "kind": "class", "name": "AppController", "signature": "class AppController extends ChangeNotifier {" @@ -156,7 +156,7 @@ { "language": "dart", "path": "lib/app/app_controller_desktop_gateway.dart", - "line": 49, + "line": 48, "kind": "extension", "name": "AppControllerDesktopGateway", "signature": "extension AppControllerDesktopGateway on AppController {" @@ -171,7 +171,7 @@ { "language": "dart", "path": "lib/app/app_controller_desktop_navigation.dart", - "line": 48, + "line": 47, "kind": "extension", "name": "AppControllerDesktopNavigation", "signature": "extension AppControllerDesktopNavigation on AppController {" @@ -181,7 +181,7 @@ { "path": "lib/app/app_controller_desktop_runtime_coordination_impl.dart", "language": "dart", - "symbolCount": 9, + "symbolCount": 10, "symbols": [ { "language": "dart", @@ -194,7 +194,7 @@ { "language": "dart", "path": "lib/app/app_controller_desktop_runtime_coordination_impl.dart", - "line": 90, + "line": 98, "kind": "top-level function", "name": "refreshSingleAgentCapabilitiesRuntimeInternal", "signature": "Future refreshSingleAgentCapabilitiesRuntimeInternal( AppController controller, { bool forceRefresh = false, }) async {" @@ -202,7 +202,7 @@ { "language": "dart", "path": "lib/app/app_controller_desktop_runtime_coordination_impl.dart", - "line": 158, + "line": 170, "kind": "top-level function", "name": "assistantWorkingDirectoryForSessionRuntimeInternal", "signature": "String? assistantWorkingDirectoryForSessionRuntimeInternal( AppController controller, String sessionKey, ) {" @@ -210,7 +210,15 @@ { "language": "dart", "path": "lib/app/app_controller_desktop_runtime_coordination_impl.dart", - "line": 178, + "line": 181, + "kind": "top-level function", + "name": "assistantRemoteWorkingDirectoryHintForSessionRuntimeInternal", + "signature": "String? assistantRemoteWorkingDirectoryHintForSessionRuntimeInternal( AppController controller, String sessionKey, ) {" + }, + { + "language": "dart", + "path": "lib/app/app_controller_desktop_runtime_coordination_impl.dart", + "line": 200, "kind": "top-level function", "name": "resolveLocalAssistantWorkingDirectoryForSessionRuntimeInternal", "signature": "String? resolveLocalAssistantWorkingDirectoryForSessionRuntimeInternal( AppController controller, String sessionKey, { bool requireLocalExistence = true, }) {" @@ -218,15 +226,15 @@ { "language": "dart", "path": "lib/app/app_controller_desktop_runtime_coordination_impl.dart", - "line": 206, + "line": 223, "kind": "top-level function", "name": "buildCodeAgentNodeStateRuntimeInternal", - "signature": "CodeAgentNodeState buildCodeAgentNodeStateRuntimeInternal( AppController controller, ) {" + "signature": "CodeAgentNodeState buildCodeAgentNodeStateRuntimeInternal( AppController controller, { AssistantExecutionTarget? executionTarget, }) {" }, { "language": "dart", "path": "lib/app/app_controller_desktop_runtime_coordination_impl.dart", - "line": 220, + "line": 239, "kind": "top-level function", "name": "bridgeGatewayModeRuntimeInternal", "signature": "GatewayMode bridgeGatewayModeRuntimeInternal(AppController controller) {" @@ -234,7 +242,7 @@ { "language": "dart", "path": "lib/app/app_controller_desktop_runtime_coordination_impl.dart", - "line": 230, + "line": 249, "kind": "top-level function", "name": "ensureCodexGatewayRegistrationRuntimeInternal", "signature": "Future ensureCodexGatewayRegistrationRuntimeInternal( AppController controller, ) async {" @@ -242,7 +250,7 @@ { "language": "dart", "path": "lib/app/app_controller_desktop_runtime_coordination_impl.dart", - "line": 298, + "line": 317, "kind": "top-level function", "name": "clearCodexGatewayRegistrationRuntimeInternal", "signature": "void clearCodexGatewayRegistrationRuntimeInternal(AppController controller) {" @@ -250,7 +258,7 @@ { "language": "dart", "path": "lib/app/app_controller_desktop_runtime_coordination_impl.dart", - "line": 308, + "line": 327, "kind": "top-level function", "name": "recomputeTasksRuntimeInternal", "signature": "void recomputeTasksRuntimeInternal(AppController controller) {" @@ -288,7 +296,7 @@ { "language": "dart", "path": "lib/app/app_controller_desktop_runtime_helpers.dart", - "line": 51, + "line": 53, "kind": "extension", "name": "AppControllerDesktopRuntimeHelpers", "signature": "extension AppControllerDesktopRuntimeHelpers on AppController {" @@ -318,28 +326,13 @@ { "language": "dart", "path": "lib/app/app_controller_desktop_settings_runtime.dart", - "line": 49, + "line": 50, "kind": "extension", "name": "AppControllerDesktopSettingsRuntime", "signature": "extension AppControllerDesktopSettingsRuntime on AppController {" } ] }, - { - "path": "lib/app/app_controller_desktop_single_agent.dart", - "language": "dart", - "symbolCount": 1, - "symbols": [ - { - "language": "dart", - "path": "lib/app/app_controller_desktop_single_agent.dart", - "line": 3, - "kind": "extension", - "name": "AppControllerDesktopSingleAgent", - "signature": "extension AppControllerDesktopSingleAgent on AppController {}" - } - ] - }, { "path": "lib/app/app_controller_desktop_skill_permissions.dart", "language": "dart", @@ -348,7 +341,7 @@ { "language": "dart", "path": "lib/app/app_controller_desktop_skill_permissions.dart", - "line": 49, + "line": 48, "kind": "extension", "name": "AppControllerDesktopSkillPermissions", "signature": "extension AppControllerDesktopSkillPermissions on AppController {" @@ -363,7 +356,7 @@ { "language": "dart", "path": "lib/app/app_controller_desktop_thread_actions.dart", - "line": 50, + "line": 51, "kind": "extension", "name": "AppControllerDesktopThreadActions", "signature": "extension AppControllerDesktopThreadActions on AppController {" @@ -394,7 +387,7 @@ { "language": "dart", "path": "lib/app/app_controller_desktop_thread_binding.dart", - "line": 294, + "line": 337, "kind": "top-level function", "name": "pickDraftThreadExecutionTargetInternal", "signature": "AssistantExecutionTarget pickDraftThreadExecutionTargetInternal({ required AssistantExecutionTarget currentTarget, required Iterable visibleTargets, bool? localWorkspaceAvailable, }) {" @@ -404,20 +397,28 @@ { "path": "lib/app/app_controller_desktop_thread_sessions.dart", "language": "dart", - "symbolCount": 3, + "symbolCount": 4, "symbols": [ { "language": "dart", "path": "lib/app/app_controller_desktop_thread_sessions.dart", - "line": 51, + "line": 55, "kind": "top-level function", "name": "resolveGatewayThreadConnectionStateInternal", - "signature": "AssistantThreadConnectionState resolveGatewayThreadConnectionStateInternal({ required AssistantExecutionTarget target, required bool bridgeReady, required String bridgeLabel, required AccountSyncState? accountSyncState, }) {" + "signature": "AssistantThreadConnectionState resolveGatewayThreadConnectionStateInternal({ required AssistantExecutionTarget target, required bool bridgeReady, required String bridgeLabel, required AccountSyncState? accountSyncState, required bool accountSignedIn, required bool bridgeConfigured, bool bridgeDiscoveryAttempted = false, String bridgeDiscoveryError = '', bool providerCatalogEmpty = false, }) {" }, { "language": "dart", "path": "lib/app/app_controller_desktop_thread_sessions.dart", - "line": 99, + "line": 180, + "kind": "top-level function", + "name": "bridgeCapabilityReadyForExecutionTargetInternal", + "signature": "bool bridgeCapabilityReadyForExecutionTargetInternal({ required AssistantExecutionTarget target, required bool bridgeConfigured, required List providers, required List availableTargets, }) {" + }, + { + "language": "dart", + "path": "lib/app/app_controller_desktop_thread_sessions.dart", + "line": 192, "kind": "extension", "name": "AppControllerDesktopThreadSessions", "signature": "extension AppControllerDesktopThreadSessions on AppController {" @@ -425,22 +426,22 @@ { "language": "dart", "path": "lib/app/app_controller_desktop_thread_sessions.dart", - "line": 470, + "line": 655, "kind": "top-level function", - "name": "resolveAssistantExecutionTargetFromRecordsForTest", - "signature": "AssistantExecutionTarget resolveAssistantExecutionTargetFromRecordsForTest( TaskThread? primaryRecord, { TaskThread? fallbackRecord, }) {" + "name": "resolveAssistantExecutionTargetFromRecordForTest", + "signature": "AssistantExecutionTarget resolveAssistantExecutionTargetFromRecordForTest( TaskThread? record, { required AssistantExecutionTarget defaultExecutionTarget, }) {" } ] }, { "path": "lib/app/app_controller_desktop_thread_sessions_collaboration_impl.dart", "language": "dart", - "symbolCount": 14, + "symbolCount": 13, "symbols": [ { "language": "dart", "path": "lib/app/app_controller_desktop_thread_sessions_collaboration_impl.dart", - "line": 50, + "line": 49, "kind": "top-level function", "name": "loadAiGatewayApiKeyThreadSessionInternal", "signature": "Future loadAiGatewayApiKeyThreadSessionInternal( AppController controller, ) async {" @@ -448,7 +449,7 @@ { "language": "dart", "path": "lib/app/app_controller_desktop_thread_sessions_collaboration_impl.dart", - "line": 56, + "line": 55, "kind": "top-level function", "name": "saveMultiAgentConfigThreadSessionInternal", "signature": "Future saveMultiAgentConfigThreadSessionInternal( AppController controller, MultiAgentConfig config, ) async {" @@ -456,7 +457,7 @@ { "language": "dart", "path": "lib/app/app_controller_desktop_thread_sessions_collaboration_impl.dart", - "line": 73, + "line": 72, "kind": "top-level function", "name": "refreshMultiAgentMountsThreadSessionInternal", "signature": "Future refreshMultiAgentMountsThreadSessionInternal( AppController controller, { bool sync = false, }) async {" @@ -464,7 +465,7 @@ { "language": "dart", "path": "lib/app/app_controller_desktop_thread_sessions_collaboration_impl.dart", - "line": 98, + "line": 97, "kind": "top-level function", "name": "runMultiAgentCollaborationThreadSessionInternal", "signature": "Future runMultiAgentCollaborationThreadSessionInternal( AppController controller, { required String rawPrompt, required String composedPrompt, required List attachments, required List selectedSkillLabels, }) async {" @@ -472,7 +473,7 @@ { "language": "dart", "path": "lib/app/app_controller_desktop_thread_sessions_collaboration_impl.dart", - "line": 269, + "line": 283, "kind": "top-level function", "name": "openOnlineWorkspaceThreadSessionInternal", "signature": "Future openOnlineWorkspaceThreadSessionInternal( AppController controller, ) async {" @@ -480,7 +481,7 @@ { "language": "dart", "path": "lib/app/app_controller_desktop_thread_sessions_collaboration_impl.dart", - "line": 290, + "line": 304, "kind": "top-level function", "name": "aiGatewayModelChoicesThreadSessionInternal", "signature": "List aiGatewayModelChoicesThreadSessionInternal( AppController controller, ) {" @@ -488,7 +489,7 @@ { "language": "dart", "path": "lib/app/app_controller_desktop_thread_sessions_collaboration_impl.dart", - "line": 296, + "line": 310, "kind": "top-level function", "name": "connectedGatewayModelChoicesThreadSessionInternal", "signature": "List connectedGatewayModelChoicesThreadSessionInternal( AppController controller, ) {" @@ -496,7 +497,7 @@ { "language": "dart", "path": "lib/app/app_controller_desktop_thread_sessions_collaboration_impl.dart", - "line": 308, + "line": 322, "kind": "top-level function", "name": "assistantModelChoicesThreadSessionInternal", "signature": "List assistantModelChoicesThreadSessionInternal( AppController controller, ) {" @@ -504,7 +505,7 @@ { "language": "dart", "path": "lib/app/app_controller_desktop_thread_sessions_collaboration_impl.dart", - "line": 317, + "line": 331, "kind": "top-level function", "name": "assistantModelChoicesForSessionThreadSessionInternal", "signature": "List assistantModelChoicesForSessionThreadSessionInternal( AppController controller, String sessionKey, ) {" @@ -512,7 +513,7 @@ { "language": "dart", "path": "lib/app/app_controller_desktop_thread_sessions_collaboration_impl.dart", - "line": 332, + "line": 346, "kind": "top-level function", "name": "resolvedDefaultModelThreadSessionInternal", "signature": "String resolvedDefaultModelThreadSessionInternal(AppController controller) {" @@ -520,7 +521,7 @@ { "language": "dart", "path": "lib/app/app_controller_desktop_thread_sessions_collaboration_impl.dart", - "line": 354, + "line": 368, "kind": "top-level function", "name": "canQuickConnectGatewayThreadSessionInternal", "signature": "bool canQuickConnectGatewayThreadSessionInternal(AppController controller) {" @@ -528,15 +529,7 @@ { "language": "dart", "path": "lib/app/app_controller_desktop_thread_sessions_collaboration_impl.dart", - "line": 374, - "kind": "top-level function", - "name": "normalizeAssistantSessionKeyThreadInternal", - "signature": "String normalizeAssistantSessionKeyThreadInternal(String sessionKey) {" - }, - { - "language": "dart", - "path": "lib/app/app_controller_desktop_thread_sessions_collaboration_impl.dart", - "line": 379, + "line": 388, "kind": "top-level function", "name": "joinConnectionPartsThreadSessionInternal", "signature": "String joinConnectionPartsThreadSessionInternal(List parts) {" @@ -544,7 +537,7 @@ { "language": "dart", "path": "lib/app/app_controller_desktop_thread_sessions_collaboration_impl.dart", - "line": 387, + "line": 396, "kind": "top-level function", "name": "gatewayAddressLabelThreadSessionInternal", "signature": "String gatewayAddressLabelThreadSessionInternal( GatewayConnectionProfile profile, ) {" @@ -559,7 +552,7 @@ { "language": "dart", "path": "lib/app/app_controller_desktop_thread_storage.dart", - "line": 48, + "line": 47, "kind": "extension", "name": "AppControllerDesktopThreadStorage", "signature": "extension AppControllerDesktopThreadStorage on AppController {" @@ -581,6 +574,21 @@ } ] }, + { + "path": "lib/app/app_controller_openclaw_task_queue.dart", + "language": "dart", + "symbolCount": 1, + "symbols": [ + { + "language": "dart", + "path": "lib/app/app_controller_openclaw_task_queue.dart", + "line": 9, + "kind": "class", + "name": "OpenClawGatewayQueuedTurnInternal", + "signature": "class OpenClawGatewayQueuedTurnInternal {" + } + ] + }, { "path": "lib/app/app_metadata.dart", "language": "dart", @@ -708,7 +716,7 @@ { "language": "dart", "path": "lib/app/ui_feature_manifest_core.dart", - "line": 62, + "line": 57, "kind": "class", "name": "UiFeatureFlag", "signature": "class UiFeatureFlag {" @@ -716,7 +724,7 @@ { "language": "dart", "path": "lib/app/ui_feature_manifest_core.dart", - "line": 94, + "line": 89, "kind": "class", "name": "UiFeatureManifest", "signature": "class UiFeatureManifest {" @@ -724,7 +732,7 @@ { "language": "dart", "path": "lib/app/ui_feature_manifest_core.dart", - "line": 341, + "line": 336, "kind": "class", "name": "UiFeatureAccess", "signature": "class UiFeatureAccess {" @@ -732,7 +740,7 @@ { "language": "dart", "path": "lib/app/ui_feature_manifest_core.dart", - "line": 480, + "line": 466, "kind": "class", "name": "UiFeatureManifestLoader", "signature": "class UiFeatureManifestLoader {" @@ -742,7 +750,7 @@ { "path": "lib/app/workspace_navigation.dart", "language": "dart", - "symbolCount": 3, + "symbolCount": 2, "symbols": [ { "language": "dart", @@ -758,15 +766,7 @@ "line": 32, "kind": "top-level function", "name": "buildSettingsBreadcrumbs", - "signature": "List buildSettingsBreadcrumbs( AppController controller, { required SettingsTab tab, SettingsDetailPage? detail, SettingsNavigationContext? navigationContext, }) {" - }, - { - "language": "dart", - "path": "lib/app/workspace_navigation.dart", - "line": 57, - "kind": "top-level function", - "name": "openSettingsNavigationContext", - "signature": "void openSettingsNavigationContext( AppController controller, SettingsNavigationContext context, ) {" + "signature": "List buildSettingsBreadcrumbs( AppController controller, { required SettingsTab tab, }) {" } ] }, @@ -802,7 +802,7 @@ { "language": "dart", "path": "lib/app/workspace_page_registry.dart", - "line": 60, + "line": 56, "kind": "top-level function", "name": "buildWorkspacePage", "signature": "Widget buildWorkspacePage({ required WorkspaceDestination destination, required AppController controller, required ValueChanged onOpenDetail, required WorkspacePageSurface surface, }) {" @@ -846,7 +846,7 @@ { "language": "dart", "path": "lib/features/assistant/assistant_page_components.dart", - "line": 282, + "line": 283, "kind": "top-level function", "name": "groupTasksForRailInternal", "signature": "List groupTasksForRailInternal( List tasks, List visibleExecutionTargets, ) {" @@ -854,7 +854,7 @@ { "language": "dart", "path": "lib/features/assistant/assistant_page_components.dart", - "line": 312, + "line": 313, "kind": "class", "name": "AssistantTaskTileInternal", "signature": "class AssistantTaskTileInternal extends StatelessWidget {" @@ -862,7 +862,7 @@ { "language": "dart", "path": "lib/features/assistant/assistant_page_components.dart", - "line": 417, + "line": 462, "kind": "class", "name": "AssistantTaskGroupHeaderInternal", "signature": "class AssistantTaskGroupHeaderInternal extends StatelessWidget {" @@ -870,7 +870,7 @@ { "language": "dart", "path": "lib/features/assistant/assistant_page_components.dart", - "line": 481, + "line": 526, "kind": "class", "name": "AssistantEmptyStateInternal", "signature": "class AssistantEmptyStateInternal extends StatelessWidget {" @@ -956,12 +956,12 @@ { "path": "lib/features/assistant/assistant_page_composer_skill_models.dart", "language": "dart", - "symbolCount": 3, + "symbolCount": 2, "symbols": [ { "language": "dart", "path": "lib/features/assistant/assistant_page_composer_skill_models.dart", - "line": 79, + "line": 40, "kind": "top-level function", "name": "skillOptionFromGatewayInternal", "signature": "ComposerSkillOptionInternal skillOptionFromGatewayInternal( GatewaySkillSummary skill, ) {" @@ -969,15 +969,7 @@ { "language": "dart", "path": "lib/features/assistant/assistant_page_composer_skill_models.dart", - "line": 106, - "kind": "top-level function", - "name": "skillOptionFromThreadSkillInternal", - "signature": "ComposerSkillOptionInternal skillOptionFromThreadSkillInternal( AssistantThreadSkillEntry skill, ) {" - }, - { - "language": "dart", - "path": "lib/features/assistant/assistant_page_composer_skill_models.dart", - "line": 122, + "line": 61, "kind": "class", "name": "ComposerSkillOptionInternal", "signature": "class ComposerSkillOptionInternal {" @@ -1141,7 +1133,7 @@ { "language": "dart", "path": "lib/features/assistant/assistant_page_main.dart", - "line": 270, + "line": 278, "kind": "enum", "name": "AssistantSidePaneInternal", "signature": "enum AssistantSidePaneInternal { tasks, navigation, focused }" @@ -1149,7 +1141,7 @@ { "language": "dart", "path": "lib/features/assistant/assistant_page_main.dart", - "line": 272, + "line": 280, "kind": "class", "name": "AssistantUnifiedSidePaneInternal", "signature": "class AssistantUnifiedSidePaneInternal extends StatelessWidget {" @@ -1157,7 +1149,7 @@ { "language": "dart", "path": "lib/features/assistant/assistant_page_main.dart", - "line": 344, + "line": 352, "kind": "class", "name": "AssistantSideTabRailInternal", "signature": "class AssistantSideTabRailInternal extends StatelessWidget {" @@ -1165,7 +1157,7 @@ { "language": "dart", "path": "lib/features/assistant/assistant_page_main.dart", - "line": 444, + "line": 452, "kind": "class", "name": "AssistantSideTabButtonInternal", "signature": "class AssistantSideTabButtonInternal extends StatefulWidget {" @@ -1173,7 +1165,7 @@ { "language": "dart", "path": "lib/features/assistant/assistant_page_main.dart", - "line": 463, + "line": 471, "kind": "class", "name": "AssistantSideTabButtonStateInternal", "signature": "class AssistantSideTabButtonStateInternal extends State {" @@ -1181,7 +1173,7 @@ { "language": "dart", "path": "lib/features/assistant/assistant_page_main.dart", - "line": 512, + "line": 520, "kind": "class", "name": "AssistantLowerPaneInternal", "signature": "class AssistantLowerPaneInternal extends StatelessWidget {" @@ -1189,7 +1181,7 @@ { "language": "dart", "path": "lib/features/assistant/assistant_page_main.dart", - "line": 596, + "line": 604, "kind": "class", "name": "ConversationAreaInternal", "signature": "class ConversationAreaInternal extends StatelessWidget {" @@ -1322,7 +1314,7 @@ { "language": "dart", "path": "lib/features/assistant/assistant_page_state_closure.dart", - "line": 42, + "line": 44, "kind": "extension", "name": "AssistantPageStateClosureInternal", "signature": "extension AssistantPageStateClosureInternal on AssistantPageStateInternal {" @@ -1432,7 +1424,7 @@ { "language": "dart", "path": "lib/features/assistant/assistant_page_task_models.dart", - "line": 294, + "line": 295, "kind": "top-level function", "name": "toolCallStatusLabelInternal", "signature": "String toolCallStatusLabelInternal(String status) =>" @@ -1440,7 +1432,7 @@ { "language": "dart", "path": "lib/features/assistant/assistant_page_task_models.dart", - "line": 301, + "line": 303, "kind": "top-level function", "name": "assistantThinkingLabelInternal", "signature": "String assistantThinkingLabelInternal(String level) => switch (level) {" @@ -1448,7 +1440,7 @@ { "language": "dart", "path": "lib/features/assistant/assistant_page_task_models.dart", - "line": 308, + "line": 310, "kind": "top-level function", "name": "sessionDisplayTitleInternal", "signature": "String sessionDisplayTitleInternal(GatewaySessionSummary session) {" @@ -1456,7 +1448,7 @@ { "language": "dart", "path": "lib/features/assistant/assistant_page_task_models.dart", - "line": 320, + "line": 318, "kind": "top-level function", "name": "fallbackSessionTitleInternal", "signature": "String fallbackSessionTitleInternal(String sessionKey) {" @@ -1464,7 +1456,7 @@ { "language": "dart", "path": "lib/features/assistant/assistant_page_task_models.dart", - "line": 335, + "line": 326, "kind": "top-level function", "name": "sessionPreviewInternal", "signature": "String? sessionPreviewInternal(GatewaySessionSummary session) {" @@ -1472,15 +1464,15 @@ { "language": "dart", "path": "lib/features/assistant/assistant_page_task_models.dart", - "line": 347, + "line": 338, "kind": "top-level function", "name": "sessionStatusInternal", - "signature": "String sessionStatusInternal( GatewaySessionSummary session, { required bool sessionPending, }) {" + "signature": "String sessionStatusInternal( GatewaySessionSummary session, { required bool sessionPending, String lifecycleStatus = '', }) {" }, { "language": "dart", "path": "lib/features/assistant/assistant_page_task_models.dart", - "line": 363, + "line": 359, "kind": "top-level function", "name": "sessionUpdatedAtLabelInternal", "signature": "String sessionUpdatedAtLabelInternal(double? updatedAtMs) {" @@ -1488,7 +1480,7 @@ { "language": "dart", "path": "lib/features/assistant/assistant_page_task_models.dart", - "line": 382, + "line": 378, "kind": "top-level function", "name": "estimatedComposerWrapSectionHeightInternal", "signature": "double estimatedComposerWrapSectionHeightInternal({ required int itemCount, required double availableWidth, required double averageChipWidth, }) {" @@ -1496,7 +1488,7 @@ { "language": "dart", "path": "lib/features/assistant/assistant_page_task_models.dart", - "line": 398, + "line": 394, "kind": "top-level function", "name": "sessionKeysMatchInternal", "signature": "bool sessionKeysMatchInternal(String incoming, String current) {" @@ -1806,12 +1798,20 @@ { "path": "lib/features/settings/settings_page_core.dart", "language": "dart", - "symbolCount": 1, + "symbolCount": 2, "symbols": [ { "language": "dart", "path": "lib/features/settings/settings_page_core.dart", "line": 19, + "kind": "top-level function", + "name": "loadBridgeMetadataForSettingsAbout", + "signature": "Future> loadBridgeMetadataForSettingsAbout({ required Uri bridgeEndpoint, required Future Function(Uri endpoint) authorizationResolver, HttpClient Function()? clientFactory, }) async {" + }, + { + "language": "dart", + "path": "lib/features/settings/settings_page_core.dart", + "line": 109, "kind": "class", "name": "SettingsPage", "signature": "class SettingsPage extends StatefulWidget {" @@ -1823,12 +1823,12 @@ { "group": "lib/models", "fileCount": 1, - "symbolCount": 34, + "symbolCount": 31, "files": [ { "path": "lib/models/app_models.dart", "language": "dart", - "symbolCount": 34, + "symbolCount": 31, "symbols": [ { "language": "dart", @@ -1836,12 +1836,12 @@ "line": 5, "kind": "enum", "name": "WorkspaceDestination", - "signature": "enum WorkspaceDestination {" + "signature": "enum WorkspaceDestination { assistant, settings }" }, { "language": "dart", "path": "lib/models/app_models.dart", - "line": 10, + "line": 7, "kind": "extension", "name": "WorkspaceDestinationCopy", "signature": "extension WorkspaceDestinationCopy on WorkspaceDestination {" @@ -1849,15 +1849,15 @@ { "language": "dart", "path": "lib/models/app_models.dart", - "line": 45, + "line": 42, "kind": "enum", "name": "AssistantFocusEntry", - "signature": "enum AssistantFocusEntry {" + "signature": "enum AssistantFocusEntry { settings, language, theme }" }, { "language": "dart", "path": "lib/models/app_models.dart", - "line": 51, + "line": 44, "kind": "extension", "name": "AssistantFocusEntryCopy", "signature": "extension AssistantFocusEntryCopy on AssistantFocusEntry {" @@ -1865,7 +1865,7 @@ { "language": "dart", "path": "lib/models/app_models.dart", - "line": 124, + "line": 117, "kind": "top-level function", "name": "normalizeAssistantNavigationDestinations", "signature": "List normalizeAssistantNavigationDestinations( Iterable destinations, ) {" @@ -1873,7 +1873,7 @@ { "language": "dart", "path": "lib/models/app_models.dart", - "line": 139, + "line": 132, "kind": "enum", "name": "StatusTone", "signature": "enum StatusTone { neutral, accent, success, warning, danger }" @@ -1881,7 +1881,7 @@ { "language": "dart", "path": "lib/models/app_models.dart", - "line": 141, + "line": 134, "kind": "class", "name": "StatusInfo", "signature": "class StatusInfo {" @@ -1889,7 +1889,7 @@ { "language": "dart", "path": "lib/models/app_models.dart", - "line": 148, + "line": 141, "kind": "enum", "name": "AppSidebarState", "signature": "enum AppSidebarState { expanded, collapsed, hidden }" @@ -1897,7 +1897,7 @@ { "language": "dart", "path": "lib/models/app_models.dart", - "line": 150, + "line": 143, "kind": "enum", "name": "AssistantMode", "signature": "enum AssistantMode { code, office }" @@ -1905,7 +1905,7 @@ { "language": "dart", "path": "lib/models/app_models.dart", - "line": 152, + "line": 145, "kind": "extension", "name": "AssistantModeCopy", "signature": "extension AssistantModeCopy on AssistantMode {" @@ -1913,7 +1913,7 @@ { "language": "dart", "path": "lib/models/app_models.dart", - "line": 159, + "line": 152, "kind": "enum", "name": "SettingsTab", "signature": "enum SettingsTab { gateway }" @@ -1921,7 +1921,7 @@ { "language": "dart", "path": "lib/models/app_models.dart", - "line": 161, + "line": 154, "kind": "extension", "name": "SettingsTabCopy", "signature": "extension SettingsTabCopy on SettingsTab {" @@ -1929,31 +1929,7 @@ { "language": "dart", "path": "lib/models/app_models.dart", - "line": 167, - "kind": "enum", - "name": "SettingsDetailPage", - "signature": "enum SettingsDetailPage { gatewayConnection }" - }, - { - "language": "dart", - "path": "lib/models/app_models.dart", - "line": 169, - "kind": "extension", - "name": "SettingsDetailPageCopy", - "signature": "extension SettingsDetailPageCopy on SettingsDetailPage {" - }, - { - "language": "dart", - "path": "lib/models/app_models.dart", - "line": 183, - "kind": "class", - "name": "SettingsNavigationContext", - "signature": "class SettingsNavigationContext {" - }, - { - "language": "dart", - "path": "lib/models/app_models.dart", - "line": 201, + "line": 160, "kind": "class", "name": "QuickAction", "signature": "class QuickAction {" @@ -1961,7 +1937,7 @@ { "language": "dart", "path": "lib/models/app_models.dart", - "line": 213, + "line": 172, "kind": "class", "name": "RecentSession", "signature": "class RecentSession {" @@ -1969,7 +1945,7 @@ { "language": "dart", "path": "lib/models/app_models.dart", - "line": 225, + "line": 184, "kind": "class", "name": "MetricSummary", "signature": "class MetricSummary {" @@ -1977,7 +1953,7 @@ { "language": "dart", "path": "lib/models/app_models.dart", - "line": 241, + "line": 200, "kind": "class", "name": "TaskSummary", "signature": "class TaskSummary {" @@ -1985,7 +1961,7 @@ { "language": "dart", "path": "lib/models/app_models.dart", - "line": 259, + "line": 218, "kind": "class", "name": "ModuleSummary", "signature": "class ModuleSummary {" @@ -1993,7 +1969,7 @@ { "language": "dart", "path": "lib/models/app_models.dart", - "line": 275, + "line": 234, "kind": "class", "name": "NodeSummary", "signature": "class NodeSummary {" @@ -2001,7 +1977,7 @@ { "language": "dart", "path": "lib/models/app_models.dart", - "line": 293, + "line": 252, "kind": "class", "name": "AgentSummary", "signature": "class AgentSummary {" @@ -2009,7 +1985,7 @@ { "language": "dart", "path": "lib/models/app_models.dart", - "line": 309, + "line": 268, "kind": "class", "name": "SkillSummary", "signature": "class SkillSummary {" @@ -2017,7 +1993,7 @@ { "language": "dart", "path": "lib/models/app_models.dart", - "line": 327, + "line": 286, "kind": "class", "name": "ConnectorSummary", "signature": "class ConnectorSummary {" @@ -2025,7 +2001,7 @@ { "language": "dart", "path": "lib/models/app_models.dart", - "line": 343, + "line": 302, "kind": "class", "name": "SecretSummary", "signature": "class SecretSummary {" @@ -2033,7 +2009,7 @@ { "language": "dart", "path": "lib/models/app_models.dart", - "line": 359, + "line": 318, "kind": "class", "name": "SecretReference", "signature": "class SecretReference {" @@ -2041,7 +2017,7 @@ { "language": "dart", "path": "lib/models/app_models.dart", - "line": 375, + "line": 334, "kind": "class", "name": "ProviderSummary", "signature": "class ProviderSummary {" @@ -2049,7 +2025,7 @@ { "language": "dart", "path": "lib/models/app_models.dart", - "line": 389, + "line": 348, "kind": "class", "name": "AuditSummary", "signature": "class AuditSummary {" @@ -2057,7 +2033,7 @@ { "language": "dart", "path": "lib/models/app_models.dart", - "line": 407, + "line": 366, "kind": "class", "name": "SettingSummary", "signature": "class SettingSummary {" @@ -2065,7 +2041,7 @@ { "language": "dart", "path": "lib/models/app_models.dart", - "line": 419, + "line": 378, "kind": "class", "name": "WorkspaceProfile", "signature": "class WorkspaceProfile {" @@ -2073,7 +2049,7 @@ { "language": "dart", "path": "lib/models/app_models.dart", - "line": 433, + "line": 392, "kind": "class", "name": "DetailPanelData", "signature": "class DetailPanelData {" @@ -2081,7 +2057,7 @@ { "language": "dart", "path": "lib/models/app_models.dart", - "line": 455, + "line": 414, "kind": "class", "name": "DetailSection", "signature": "class DetailSection {" @@ -2089,7 +2065,7 @@ { "language": "dart", "path": "lib/models/app_models.dart", - "line": 462, + "line": 421, "kind": "class", "name": "DetailItem", "signature": "class DetailItem {" @@ -2097,7 +2073,7 @@ { "language": "dart", "path": "lib/models/app_models.dart", - "line": 469, + "line": 428, "kind": "class", "name": "CommandEntry", "signature": "class CommandEntry {" @@ -2108,8 +2084,8 @@ }, { "group": "lib/runtime", - "fileCount": 67, - "symbolCount": 377, + "fileCount": 66, + "symbolCount": 372, "files": [ { "path": "lib/runtime/account_runtime_client.dart", @@ -2150,7 +2126,7 @@ { "language": "dart", "path": "lib/runtime/acp_endpoint_paths.dart", - "line": 51, + "line": 72, "kind": "top-level function", "name": "resolveAcpWebSocketEndpoint", "signature": "Uri? resolveAcpWebSocketEndpoint(Uri? endpoint) {" @@ -2158,7 +2134,7 @@ { "language": "dart", "path": "lib/runtime/acp_endpoint_paths.dart", - "line": 69, + "line": 93, "kind": "top-level function", "name": "resolveAcpHttpRpcEndpoint", "signature": "Uri? resolveAcpHttpRpcEndpoint(Uri? endpoint) {" @@ -2220,54 +2196,15 @@ } ] }, - { - "path": "lib/runtime/aris_bundle.dart", - "language": "dart", - "symbolCount": 3, - "symbols": [ - { - "language": "dart", - "path": "lib/runtime/aris_bundle.dart", - "line": 9, - "kind": "class", - "name": "ArisBundleManifest", - "signature": "class ArisBundleManifest {" - }, - { - "language": "dart", - "path": "lib/runtime/aris_bundle.dart", - "line": 69, - "kind": "class", - "name": "ResolvedArisBundle", - "signature": "class ResolvedArisBundle {" - }, - { - "language": "dart", - "path": "lib/runtime/aris_bundle.dart", - "line": 98, - "kind": "class", - "name": "ArisBundleRepository", - "signature": "class ArisBundleRepository {" - } - ] - }, { "path": "lib/runtime/aris_llm_chat_client.dart", "language": "dart", - "symbolCount": 2, + "symbolCount": 1, "symbols": [ { "language": "dart", "path": "lib/runtime/aris_llm_chat_client.dart", - "line": 8, - "kind": "typedef", - "name": "ArisProcessStarter", - "signature": "typedef ArisProcessStarter = Future Function( String executable, List arguments, { Map? environment, String? workingDirectory, });" - }, - { - "language": "dart", - "path": "lib/runtime/aris_llm_chat_client.dart", - "line": 16, + "line": 3, "kind": "class", "name": "ArisLlmChatClient", "signature": "class ArisLlmChatClient {" @@ -2423,7 +2360,7 @@ { "language": "dart", "path": "lib/runtime/codex_runtime.dart", - "line": 12, + "line": 10, "kind": "enum", "name": "CodexSandboxMode", "signature": "enum CodexSandboxMode {" @@ -2431,7 +2368,7 @@ { "language": "dart", "path": "lib/runtime/codex_runtime.dart", - "line": 22, + "line": 20, "kind": "enum", "name": "CodexApprovalPolicy", "signature": "enum CodexApprovalPolicy {" @@ -2439,7 +2376,7 @@ { "language": "dart", "path": "lib/runtime/codex_runtime.dart", - "line": 32, + "line": 30, "kind": "enum", "name": "CodexAuthMode", "signature": "enum CodexAuthMode {" @@ -2447,7 +2384,7 @@ { "language": "dart", "path": "lib/runtime/codex_runtime.dart", - "line": 42, + "line": 40, "kind": "class", "name": "CodexThread", "signature": "class CodexThread {" @@ -2455,7 +2392,7 @@ { "language": "dart", "path": "lib/runtime/codex_runtime.dart", - "line": 75, + "line": 73, "kind": "class", "name": "CodexTurn", "signature": "class CodexTurn {" @@ -2463,7 +2400,7 @@ { "language": "dart", "path": "lib/runtime/codex_runtime.dart", - "line": 106, + "line": 104, "kind": "class", "name": "CodexAccount", "signature": "class CodexAccount {" @@ -2471,7 +2408,7 @@ { "language": "dart", "path": "lib/runtime/codex_runtime.dart", - "line": 137, + "line": 135, "kind": "class", "name": "CodexRateLimit", "signature": "class CodexRateLimit {" @@ -2479,7 +2416,7 @@ { "language": "dart", "path": "lib/runtime/codex_runtime.dart", - "line": 160, + "line": 158, "kind": "class", "name": "CodexUserInput", "signature": "class CodexUserInput {" @@ -2487,7 +2424,7 @@ { "language": "dart", "path": "lib/runtime/codex_runtime.dart", - "line": 180, + "line": 178, "kind": "class", "name": "CodexAttachment", "signature": "class CodexAttachment {" @@ -2495,7 +2432,7 @@ { "language": "dart", "path": "lib/runtime/codex_runtime.dart", - "line": 198, + "line": 196, "kind": "class", "name": "CodexLogEvent", "signature": "class CodexLogEvent extends CodexEvent {" @@ -2503,7 +2440,7 @@ { "language": "dart", "path": "lib/runtime/codex_runtime.dart", - "line": 211, + "line": 209, "kind": "class", "name": "CodexNotificationEvent", "signature": "class CodexNotificationEvent extends CodexEvent {" @@ -2511,7 +2448,7 @@ { "language": "dart", "path": "lib/runtime/codex_runtime.dart", - "line": 219, + "line": 217, "kind": "class", "name": "CodexTurnEvent", "signature": "class CodexTurnEvent extends CodexEvent {" @@ -2519,7 +2456,7 @@ { "language": "dart", "path": "lib/runtime/codex_runtime.dart", - "line": 253, + "line": 251, "kind": "class", "name": "CodexRpcError", "signature": "class CodexRpcError implements Exception {" @@ -2527,7 +2464,7 @@ { "language": "dart", "path": "lib/runtime/codex_runtime.dart", - "line": 273, + "line": 271, "kind": "enum", "name": "CodexConnectionState", "signature": "enum CodexConnectionState {" @@ -2535,7 +2472,7 @@ { "language": "dart", "path": "lib/runtime/codex_runtime.dart", - "line": 283, + "line": 281, "kind": "class", "name": "CodexRuntime", "signature": "class CodexRuntime extends ChangeNotifier {" @@ -2543,7 +2480,7 @@ { "language": "dart", "path": "lib/runtime/codex_runtime.dart", - "line": 901, + "line": 629, "kind": "class", "name": "CodexLaunchConfiguration", "signature": "class CodexLaunchConfiguration {" @@ -2627,7 +2564,7 @@ { "language": "dart", "path": "lib/runtime/embedded_agent_launch_policy.dart", - "line": 4, + "line": 6, "kind": "top-level function", "name": "shouldBlockEmbeddedAgentLaunch", "signature": "bool shouldBlockEmbeddedAgentLaunch({ required bool isAppleHost, bool? enabled, }) {" @@ -2635,10 +2572,10 @@ { "language": "dart", "path": "lib/runtime/embedded_agent_launch_policy.dart", - "line": 14, + "line": 19, "kind": "top-level function", "name": "shouldBlockGoCoreLaunch", - "signature": "bool shouldBlockGoCoreLaunch( GoCoreLaunch _, { required bool isAppleHost, bool? enabled, }) {" + "signature": "bool shouldBlockGoCoreLaunch({ required bool isAppleHost, bool? enabled, }) {" } ] }, @@ -2650,7 +2587,7 @@ { "language": "dart", "path": "lib/runtime/external_code_agent_acp_desktop_transport.dart", - "line": 9, + "line": 10, "kind": "class", "name": "ExternalCodeAgentAcpDesktopTransport", "signature": "class ExternalCodeAgentAcpDesktopTransport implements ExternalCodeAgentAcpTransport {" @@ -2729,7 +2666,7 @@ { "language": "dart", "path": "lib/runtime/file_store_support.dart", - "line": 210, + "line": 220, "kind": "top-level function", "name": "normalizeStoreDirectoryPath", "signature": "String normalizeStoreDirectoryPath(String path) {" @@ -2737,7 +2674,7 @@ { "language": "dart", "path": "lib/runtime/file_store_support.dart", - "line": 227, + "line": 237, "kind": "top-level function", "name": "ensureDirectory", "signature": "Future ensureDirectory(String path) async {" @@ -2745,7 +2682,7 @@ { "language": "dart", "path": "lib/runtime/file_store_support.dart", - "line": 235, + "line": 245, "kind": "top-level function", "name": "ensureOwnerOnlyDirectory", "signature": "Future ensureOwnerOnlyDirectory(Directory directory) async {" @@ -2753,7 +2690,7 @@ { "language": "dart", "path": "lib/runtime/file_store_support.dart", - "line": 242, + "line": 252, "kind": "top-level function", "name": "ensureOwnerOnlyFile", "signature": "Future ensureOwnerOnlyFile(File file) async {" @@ -2761,7 +2698,7 @@ { "language": "dart", "path": "lib/runtime/file_store_support.dart", - "line": 249, + "line": 259, "kind": "top-level function", "name": "encodeStableFileKey", "signature": "String encodeStableFileKey(String key) {" @@ -2769,7 +2706,7 @@ { "language": "dart", "path": "lib/runtime/file_store_support.dart", - "line": 253, + "line": 263, "kind": "top-level function", "name": "atomicWriteString", "signature": "Future atomicWriteString( File file, String contents, { bool ownerOnly = false, }) async {" @@ -2777,7 +2714,7 @@ { "language": "dart", "path": "lib/runtime/file_store_support.dart", - "line": 275, + "line": 285, "kind": "top-level function", "name": "deleteIfExists", "signature": "Future deleteIfExists(File file) async {" @@ -2785,7 +2722,7 @@ { "language": "dart", "path": "lib/runtime/file_store_support.dart", - "line": 281, + "line": 291, "kind": "top-level function", "name": "decodeYamlDocument", "signature": "Object? decodeYamlDocument(String raw) {" @@ -2793,7 +2730,7 @@ { "language": "dart", "path": "lib/runtime/file_store_support.dart", - "line": 306, + "line": 316, "kind": "top-level function", "name": "encodeYamlDocument", "signature": "String encodeYamlDocument(Object? value) {" @@ -2803,12 +2740,12 @@ { "path": "lib/runtime/gateway_acp_client.dart", "language": "dart", - "symbolCount": 4, + "symbolCount": 6, "symbols": [ { "language": "dart", "path": "lib/runtime/gateway_acp_client.dart", - "line": 8, + "line": 16, "kind": "class", "name": "GatewayAcpException", "signature": "class GatewayAcpException implements Exception {" @@ -2816,7 +2753,7 @@ { "language": "dart", "path": "lib/runtime/gateway_acp_client.dart", - "line": 19, + "line": 33, "kind": "class", "name": "GatewayAcpCapabilities", "signature": "class GatewayAcpCapabilities {" @@ -2824,7 +2761,7 @@ { "language": "dart", "path": "lib/runtime/gateway_acp_client.dart", - "line": 70, + "line": 91, "kind": "class", "name": "GatewayAcpMultiAgentRequest", "signature": "class GatewayAcpMultiAgentRequest {" @@ -2832,10 +2769,26 @@ { "language": "dart", "path": "lib/runtime/gateway_acp_client.dart", - "line": 90, + "line": 111, "kind": "class", "name": "GatewayAcpClient", "signature": "class GatewayAcpClient {" + }, + { + "language": "dart", + "path": "lib/runtime/gateway_acp_client.dart", + "line": 1392, + "kind": "top-level function", + "name": "gatewayAcpHttpResponseTimeoutFor", + "signature": "Duration gatewayAcpHttpResponseTimeoutFor( Uri endpoint, String method, [ Map params = const {}, ]) {" + }, + { + "language": "dart", + "path": "lib/runtime/gateway_acp_client.dart", + "line": 1412, + "kind": "top-level function", + "name": "gatewayAcpTaskRuntimeBudgetMinutesForParams", + "signature": "int gatewayAcpTaskRuntimeBudgetMinutesForParams(Map params) {" } ] }, @@ -2868,7 +2821,7 @@ { "language": "dart", "path": "lib/runtime/gateway_runtime_core.dart", - "line": 24, + "line": 25, "kind": "class", "name": "GatewayRuntime", "signature": "class GatewayRuntime extends ChangeNotifier with GatewayRuntimeHelpersInternal {" @@ -2929,7 +2882,7 @@ { "language": "dart", "path": "lib/runtime/gateway_runtime_helpers.dart", - "line": 554, + "line": 561, "kind": "class", "name": "GatewaySetupPayload", "signature": "class GatewaySetupPayload {" @@ -2937,7 +2890,7 @@ { "language": "dart", "path": "lib/runtime/gateway_runtime_helpers.dart", - "line": 570, + "line": 577, "kind": "top-level function", "name": "decodeGatewaySetupCode", "signature": "GatewaySetupPayload? decodeGatewaySetupCode(String rawInput) {" @@ -2945,7 +2898,7 @@ { "language": "dart", "path": "lib/runtime/gateway_runtime_helpers.dart", - "line": 590, + "line": 597, "kind": "top-level function", "name": "decodeSetupPayloadJsonInternal", "signature": "GatewaySetupPayload? decodeSetupPayloadJsonInternal(String raw) {" @@ -2953,7 +2906,7 @@ { "language": "dart", "path": "lib/runtime/gateway_runtime_helpers.dart", - "line": 615, + "line": 622, "kind": "top-level function", "name": "resolveSetupCodeCandidateInternal", "signature": "String resolveSetupCodeCandidateInternal(String raw) {" @@ -2961,7 +2914,7 @@ { "language": "dart", "path": "lib/runtime/gateway_runtime_helpers.dart", - "line": 650, + "line": 657, "kind": "top-level function", "name": "composeManualUrlInternal", "signature": "String? composeManualUrlInternal(String? host, int? port, bool? tls) {" @@ -2969,7 +2922,7 @@ { "language": "dart", "path": "lib/runtime/gateway_runtime_helpers.dart", - "line": 660, + "line": 667, "kind": "top-level function", "name": "asMap", "signature": "Map asMap(Object? value) {" @@ -2977,7 +2930,7 @@ { "language": "dart", "path": "lib/runtime/gateway_runtime_helpers.dart", - "line": 670, + "line": 677, "kind": "top-level function", "name": "asList", "signature": "List asList(Object? value) {" @@ -2985,7 +2938,7 @@ { "language": "dart", "path": "lib/runtime/gateway_runtime_helpers.dart", - "line": 680, + "line": 687, "kind": "top-level function", "name": "stringValue", "signature": "String? stringValue(Object? value) {" @@ -2993,7 +2946,7 @@ { "language": "dart", "path": "lib/runtime/gateway_runtime_helpers.dart", - "line": 688, + "line": 695, "kind": "top-level function", "name": "boolValue", "signature": "bool? boolValue(Object? value) {" @@ -3001,7 +2954,7 @@ { "language": "dart", "path": "lib/runtime/gateway_runtime_helpers.dart", - "line": 703, + "line": 710, "kind": "top-level function", "name": "intValue", "signature": "int? intValue(Object? value) {" @@ -3009,7 +2962,7 @@ { "language": "dart", "path": "lib/runtime/gateway_runtime_helpers.dart", - "line": 716, + "line": 723, "kind": "top-level function", "name": "doubleValue", "signature": "double? doubleValue(Object? value) {" @@ -3017,7 +2970,7 @@ { "language": "dart", "path": "lib/runtime/gateway_runtime_helpers.dart", - "line": 729, + "line": 736, "kind": "top-level function", "name": "stringList", "signature": "List stringList(Object? value) {" @@ -3025,7 +2978,7 @@ { "language": "dart", "path": "lib/runtime/gateway_runtime_helpers.dart", - "line": 735, + "line": 742, "kind": "top-level function", "name": "extractMessageText", "signature": "String extractMessageText(Map message) {" @@ -3033,7 +2986,7 @@ { "language": "dart", "path": "lib/runtime/gateway_runtime_helpers.dart", - "line": 756, + "line": 763, "kind": "top-level function", "name": "randomIdInternal", "signature": "String randomIdInternal() {" @@ -3041,7 +2994,7 @@ { "language": "dart", "path": "lib/runtime/gateway_runtime_helpers.dart", - "line": 766, + "line": 773, "kind": "class", "name": "RpcResponseInternal", "signature": "class RpcResponseInternal {" @@ -3125,7 +3078,7 @@ { "language": "dart", "path": "lib/runtime/go_core.dart", - "line": 3, + "line": 4, "kind": "enum", "name": "GoCoreLaunchSource", "signature": "enum GoCoreLaunchSource { buildArtifact }" @@ -3133,7 +3086,7 @@ { "language": "dart", "path": "lib/runtime/go_core.dart", - "line": 5, + "line": 7, "kind": "class", "name": "GoCoreLaunch", "signature": "class GoCoreLaunch {" @@ -3141,7 +3094,7 @@ { "language": "dart", "path": "lib/runtime/go_core.dart", - "line": 19, + "line": 21, "kind": "typedef", "name": "GoCoreBinaryExistsResolver", "signature": "typedef GoCoreBinaryExistsResolver = Future Function(String command);" @@ -3149,7 +3102,7 @@ { "language": "dart", "path": "lib/runtime/go_core.dart", - "line": 21, + "line": 24, "kind": "class", "name": "GoCoreLocator", "signature": "class GoCoreLocator {" @@ -3266,7 +3219,7 @@ { "language": "dart", "path": "lib/runtime/go_task_service_client.dart", - "line": 357, + "line": 359, "kind": "class", "name": "GoTaskServiceUpdate", "signature": "class GoTaskServiceUpdate {" @@ -3274,7 +3227,7 @@ { "language": "dart", "path": "lib/runtime/go_task_service_client.dart", - "line": 386, + "line": 388, "kind": "class", "name": "GoTaskServiceArtifact", "signature": "class GoTaskServiceArtifact {" @@ -3282,7 +3235,7 @@ { "language": "dart", "path": "lib/runtime/go_task_service_client.dart", - "line": 433, + "line": 443, "kind": "class", "name": "GoTaskServiceResult", "signature": "class GoTaskServiceResult {" @@ -3290,7 +3243,7 @@ { "language": "dart", "path": "lib/runtime/go_task_service_client.dart", - "line": 540, + "line": 577, "kind": "top-level function", "name": "goTaskServiceGatewayEntryState", "signature": "String? goTaskServiceGatewayEntryState({ required AssistantExecutionTarget requestedTarget, required GoTaskServiceResult result, }) {" @@ -3298,7 +3251,7 @@ { "language": "dart", "path": "lib/runtime/go_task_service_client.dart", - "line": 575, + "line": 612, "kind": "abstract interface", "name": "ExternalCodeAgentAcpTransport", "signature": "abstract class ExternalCodeAgentAcpTransport {" @@ -3306,7 +3259,7 @@ { "language": "dart", "path": "lib/runtime/go_task_service_client.dart", - "line": 607, + "line": 644, "kind": "abstract interface", "name": "GoTaskServiceClient", "signature": "abstract class GoTaskServiceClient {" @@ -3314,7 +3267,7 @@ { "language": "dart", "path": "lib/runtime/go_task_service_client.dart", - "line": 641, + "line": 678, "kind": "top-level function", "name": "goTaskServiceUpdateFromAcpNotification", "signature": "GoTaskServiceUpdate? goTaskServiceUpdateFromAcpNotification( Map notification, ) {" @@ -3322,7 +3275,7 @@ { "language": "dart", "path": "lib/runtime/go_task_service_client.dart", - "line": 682, + "line": 719, "kind": "top-level function", "name": "goTaskServiceResultFromAcpResponse", "signature": "GoTaskServiceResult goTaskServiceResultFromAcpResponse( Map response, { required GoTaskServiceRoute route, String streamedText = '', String? completedMessage, }) {" @@ -3330,7 +3283,7 @@ { "language": "dart", "path": "lib/runtime/go_task_service_client.dart", - "line": 743, + "line": 913, "kind": "top-level function", "name": "mergeGoTaskServiceResponseResult", "signature": "Map mergeGoTaskServiceResponseResult( Map response, Map overlay, ) {" @@ -3338,7 +3291,7 @@ { "language": "dart", "path": "lib/runtime/go_task_service_client.dart", - "line": 767, + "line": 937, "kind": "top-level function", "name": "goTaskServiceBase64Size", "signature": "int goTaskServiceBase64Size(String base64) {" @@ -3415,7 +3368,7 @@ { "language": "dart", "path": "lib/runtime/multi_agent_frameworks.dart", - "line": 6, + "line": 3, "kind": "abstract interface", "name": "FrameworkPreset", "signature": "abstract class FrameworkPreset {" @@ -3423,7 +3376,7 @@ { "language": "dart", "path": "lib/runtime/multi_agent_frameworks.dart", - "line": 19, + "line": 16, "kind": "class", "name": "NativeFrameworkPreset", "signature": "class NativeFrameworkPreset extends FrameworkPreset {" @@ -3431,7 +3384,7 @@ { "language": "dart", "path": "lib/runtime/multi_agent_frameworks.dart", - "line": 48, + "line": 45, "kind": "class", "name": "ArisFrameworkPreset", "signature": "class ArisFrameworkPreset extends FrameworkPreset {" @@ -3464,12 +3417,12 @@ { "path": "lib/runtime/multi_agent_mounts.dart", "language": "dart", - "symbolCount": 8, + "symbolCount": 7, "symbols": [ { "language": "dart", "path": "lib/runtime/multi_agent_mounts.dart", - "line": 11, + "line": 9, "kind": "class", "name": "MultiAgentMountManager", "signature": "class MultiAgentMountManager {" @@ -3477,7 +3430,7 @@ { "language": "dart", "path": "lib/runtime/multi_agent_mounts.dart", - "line": 139, + "line": 90, "kind": "abstract interface", "name": "CliMountAdapter", "signature": "abstract class CliMountAdapter {" @@ -3485,15 +3438,7 @@ { "language": "dart", "path": "lib/runtime/multi_agent_mounts.dart", - "line": 191, - "kind": "class", - "name": "ArisMountAdapter", - "signature": "class ArisMountAdapter extends CliMountAdapter {" - }, - { - "language": "dart", - "path": "lib/runtime/multi_agent_mounts.dart", - "line": 277, + "line": 112, "kind": "class", "name": "CodexMountAdapter", "signature": "class CodexMountAdapter extends CliMountAdapter {" @@ -3501,7 +3446,7 @@ { "language": "dart", "path": "lib/runtime/multi_agent_mounts.dart", - "line": 350, + "line": 154, "kind": "class", "name": "ClaudeMountAdapter", "signature": "class ClaudeMountAdapter extends CliMountAdapter {" @@ -3509,7 +3454,7 @@ { "language": "dart", "path": "lib/runtime/multi_agent_mounts.dart", - "line": 398, + "line": 193, "kind": "class", "name": "GeminiMountAdapter", "signature": "class GeminiMountAdapter extends CliMountAdapter {" @@ -3517,7 +3462,7 @@ { "language": "dart", "path": "lib/runtime/multi_agent_mounts.dart", - "line": 446, + "line": 232, "kind": "class", "name": "OpencodeMountAdapter", "signature": "class OpencodeMountAdapter extends CliMountAdapter {" @@ -3525,7 +3470,7 @@ { "language": "dart", "path": "lib/runtime/multi_agent_mounts.dart", - "line": 515, + "line": 273, "kind": "class", "name": "OpenClawMountAdapter", "signature": "class OpenClawMountAdapter extends CliMountAdapter {" @@ -3546,7 +3491,7 @@ { "language": "dart", "path": "lib/runtime/multi_agent_orchestrator_core.dart", - "line": 24, + "line": 20, "kind": "class", "name": "MultiAgentOrchestrator", "signature": "class MultiAgentOrchestrator extends ChangeNotifier {" @@ -3812,12 +3757,12 @@ { "path": "lib/runtime/runtime_controllers_derived_tasks.dart", "language": "dart", - "symbolCount": 6, + "symbolCount": 4, "symbols": [ { "language": "dart", "path": "lib/runtime/runtime_controllers_derived_tasks.dart", - "line": 14, + "line": 6, "kind": "class", "name": "DerivedTasksController", "signature": "class DerivedTasksController extends ChangeNotifier {" @@ -3825,23 +3770,7 @@ { "language": "dart", "path": "lib/runtime/runtime_controllers_derived_tasks.dart", - "line": 150, - "kind": "top-level function", - "name": "normalizeMainSessionKey", - "signature": "String normalizeMainSessionKey(String? value) {" - }, - { - "language": "dart", - "path": "lib/runtime/runtime_controllers_derived_tasks.dart", - "line": 155, - "kind": "top-level function", - "name": "makeAgentSessionKey", - "signature": "String makeAgentSessionKey({required String agentId, required String baseKey}) {" - }, - { - "language": "dart", - "path": "lib/runtime/runtime_controllers_derived_tasks.dart", - "line": 164, + "line": 142, "kind": "top-level function", "name": "matchesSessionKey", "signature": "bool matchesSessionKey(String incoming, String current) {" @@ -3849,7 +3778,7 @@ { "language": "dart", "path": "lib/runtime/runtime_controllers_derived_tasks.dart", - "line": 174, + "line": 148, "kind": "top-level function", "name": "encodePrettyJson", "signature": "String encodePrettyJson(Object value) {" @@ -3857,7 +3786,7 @@ { "language": "dart", "path": "lib/runtime/runtime_controllers_derived_tasks.dart", - "line": 179, + "line": 153, "kind": "top-level function", "name": "ephemeralIdInternal", "signature": "String ephemeralIdInternal() =>" @@ -3935,7 +3864,7 @@ { "language": "dart", "path": "lib/runtime/runtime_controllers_gateway.dart", - "line": 173, + "line": 146, "kind": "class", "name": "GatewayChatController", "signature": "class GatewayChatController extends ChangeNotifier {" @@ -3950,7 +3879,7 @@ { "language": "dart", "path": "lib/runtime/runtime_controllers_settings.dart", - "line": 20, + "line": 21, "kind": "class", "name": "SettingsController", "signature": "class SettingsController extends ChangeNotifier {" @@ -3975,7 +3904,7 @@ { "path": "lib/runtime/runtime_controllers_settings_account_impl.dart", "language": "dart", - "symbolCount": 8, + "symbolCount": 9, "symbols": [ { "language": "dart", @@ -4028,7 +3957,7 @@ { "language": "dart", "path": "lib/runtime/runtime_controllers_settings_account_impl.dart", - "line": 414, + "line": 424, "kind": "top-level function", "name": "cancelAccountMfaChallengeSettingsInternal", "signature": "Future cancelAccountMfaChallengeSettingsInternal( SettingsController controller, ) async {" @@ -4036,10 +3965,18 @@ { "language": "dart", "path": "lib/runtime/runtime_controllers_settings_account_impl.dart", - "line": 444, + "line": 454, "kind": "top-level function", "name": "normalizeAccountBaseUrlSettingsInternal", "signature": "String normalizeAccountBaseUrlSettingsInternal( String raw, { String fallback = '', }) {" + }, + { + "language": "dart", + "path": "lib/runtime/runtime_controllers_settings_account_impl.dart", + "line": 574, + "kind": "top-level function", + "name": "resolveAcpBridgeServerEffectiveConfigInternal", + "signature": "AcpBridgeServerEffectiveConfig resolveAcpBridgeServerEffectiveConfigInternal( SettingsController controller, { required AcpBridgeServerModeConfig config, }) {" } ] }, @@ -4138,7 +4075,7 @@ { "language": "dart", "path": "lib/runtime/runtime_controllers_settings_secrets_impl.dart", - "line": 141, + "line": 127, "kind": "top-level function", "name": "loadGatewayPasswordSettingsInternal", "signature": "Future loadGatewayPasswordSettingsInternal( SettingsController controller, { int? profileIndex, }) async {" @@ -4146,7 +4083,7 @@ { "language": "dart", "path": "lib/runtime/runtime_controllers_settings_secrets_impl.dart", - "line": 167, + "line": 139, "kind": "top-level function", "name": "hasStoredGatewayTokenForProfileSettingsInternal", "signature": "bool hasStoredGatewayTokenForProfileSettingsInternal( SettingsController controller, int profileIndex, ) =>" @@ -4154,7 +4091,7 @@ { "language": "dart", "path": "lib/runtime/runtime_controllers_settings_secrets_impl.dart", - "line": 179, + "line": 151, "kind": "top-level function", "name": "hasStoredGatewayPasswordForProfileSettingsInternal", "signature": "bool hasStoredGatewayPasswordForProfileSettingsInternal( SettingsController controller, int profileIndex, ) => controller.secureRefsInternal.containsKey( gatewayPasswordRefForProfileSettingsInternal(controller, profileIndex), );" @@ -4162,7 +4099,7 @@ { "language": "dart", "path": "lib/runtime/runtime_controllers_settings_secrets_impl.dart", - "line": 186, + "line": 158, "kind": "top-level function", "name": "storedGatewayTokenMaskForProfileSettingsInternal", "signature": "String? storedGatewayTokenMaskForProfileSettingsInternal( SettingsController controller, int profileIndex, ) =>" @@ -4170,7 +4107,7 @@ { "language": "dart", "path": "lib/runtime/runtime_controllers_settings_secrets_impl.dart", - "line": 199, + "line": 171, "kind": "top-level function", "name": "storedGatewayPasswordMaskForProfileSettingsInternal", "signature": "String? storedGatewayPasswordMaskForProfileSettingsInternal( SettingsController controller, int profileIndex, ) =>" @@ -4178,7 +4115,7 @@ { "language": "dart", "path": "lib/runtime/runtime_controllers_settings_secrets_impl.dart", - "line": 208, + "line": 180, "kind": "top-level function", "name": "gatewayTokenRefForProfileSettingsInternal", "signature": "String gatewayTokenRefForProfileSettingsInternal( SettingsController controller, int profileIndex, ) {" @@ -4186,7 +4123,7 @@ { "language": "dart", "path": "lib/runtime/runtime_controllers_settings_secrets_impl.dart", - "line": 221, + "line": 193, "kind": "top-level function", "name": "gatewayPasswordRefForProfileSettingsInternal", "signature": "String gatewayPasswordRefForProfileSettingsInternal( SettingsController controller, int profileIndex, ) {" @@ -4194,7 +4131,7 @@ { "language": "dart", "path": "lib/runtime/runtime_controllers_settings_secrets_impl.dart", - "line": 234, + "line": 206, "kind": "top-level function", "name": "aiGatewayApiKeyRefSettingsInternal", "signature": "String aiGatewayApiKeyRefSettingsInternal( SettingsController controller, [ AiGatewayProfile? profile, ]) {" @@ -4202,7 +4139,7 @@ { "language": "dart", "path": "lib/runtime/runtime_controllers_settings_secrets_impl.dart", - "line": 243, + "line": 215, "kind": "top-level function", "name": "vaultTokenRefSettingsInternal", "signature": "String vaultTokenRefSettingsInternal( SettingsController controller, [ VaultConfig? profile, ]) {" @@ -4210,7 +4147,7 @@ { "language": "dart", "path": "lib/runtime/runtime_controllers_settings_secrets_impl.dart", - "line": 252, + "line": 224, "kind": "top-level function", "name": "ollamaCloudApiKeyRefSettingsInternal", "signature": "String ollamaCloudApiKeyRefSettingsInternal( SettingsController controller, [ OllamaCloudConfig? profile, ]) {" @@ -4218,7 +4155,7 @@ { "language": "dart", "path": "lib/runtime/runtime_controllers_settings_secrets_impl.dart", - "line": 261, + "line": 233, "kind": "top-level function", "name": "saveOllamaCloudApiKeySettingsInternal", "signature": "Future saveOllamaCloudApiKeySettingsInternal( SettingsController controller, String value, ) async {" @@ -4226,7 +4163,7 @@ { "language": "dart", "path": "lib/runtime/runtime_controllers_settings_secrets_impl.dart", - "line": 287, + "line": 259, "kind": "top-level function", "name": "loadOllamaCloudApiKeySettingsInternal", "signature": "Future loadOllamaCloudApiKeySettingsInternal( SettingsController controller, ) async {" @@ -4234,7 +4171,7 @@ { "language": "dart", "path": "lib/runtime/runtime_controllers_settings_secrets_impl.dart", - "line": 304, + "line": 267, "kind": "top-level function", "name": "saveVaultTokenSettingsInternal", "signature": "Future saveVaultTokenSettingsInternal( SettingsController controller, String value, ) async {" @@ -4242,7 +4179,7 @@ { "language": "dart", "path": "lib/runtime/runtime_controllers_settings_secrets_impl.dart", - "line": 330, + "line": 293, "kind": "top-level function", "name": "loadVaultTokenSettingsInternal", "signature": "Future loadVaultTokenSettingsInternal( SettingsController controller, ) async {" @@ -4250,7 +4187,7 @@ { "language": "dart", "path": "lib/runtime/runtime_controllers_settings_secrets_impl.dart", - "line": 346, + "line": 301, "kind": "top-level function", "name": "saveAiGatewayApiKeySettingsInternal", "signature": "Future saveAiGatewayApiKeySettingsInternal( SettingsController controller, String value, ) async {" @@ -4258,7 +4195,7 @@ { "language": "dart", "path": "lib/runtime/runtime_controllers_settings_secrets_impl.dart", - "line": 372, + "line": 327, "kind": "top-level function", "name": "loadAiGatewayApiKeySettingsInternal", "signature": "Future loadAiGatewayApiKeySettingsInternal( SettingsController controller, ) async {" @@ -4266,7 +4203,7 @@ { "language": "dart", "path": "lib/runtime/runtime_controllers_settings_secrets_impl.dart", - "line": 388, + "line": 335, "kind": "top-level function", "name": "clearAiGatewayApiKeySettingsInternal", "signature": "Future clearAiGatewayApiKeySettingsInternal( SettingsController controller, ) async {" @@ -4274,7 +4211,7 @@ { "language": "dart", "path": "lib/runtime/runtime_controllers_settings_secrets_impl.dart", - "line": 398, + "line": 345, "kind": "top-level function", "name": "saveSecretValueByRefSettingsInternal", "signature": "Future saveSecretValueByRefSettingsInternal( SettingsController controller, String refName, String value, { required String provider, required String module, }) async {" @@ -4282,7 +4219,7 @@ { "language": "dart", "path": "lib/runtime/runtime_controllers_settings_secrets_impl.dart", - "line": 425, + "line": 372, "kind": "top-level function", "name": "loadSecretValueByRefSettingsInternal", "signature": "Future loadSecretValueByRefSettingsInternal( SettingsController controller, String refName, ) async {" @@ -4290,7 +4227,7 @@ { "language": "dart", "path": "lib/runtime/runtime_controllers_settings_secrets_impl.dart", - "line": 435, + "line": 382, "kind": "top-level function", "name": "loadVaultTokenForSecretReadsSettingsInternal", "signature": "Future loadVaultTokenForSecretReadsSettingsInternal( SettingsController controller, { String tokenOverride = '', }) async {" @@ -4298,7 +4235,7 @@ { "language": "dart", "path": "lib/runtime/runtime_controllers_settings_secrets_impl.dart", - "line": 454, + "line": 393, "kind": "top-level function", "name": "readVaultSecretByRefSettingsInternal", "signature": "Future readVaultSecretByRefSettingsInternal( SettingsController controller, String refName, ) async {" @@ -4306,7 +4243,7 @@ { "language": "dart", "path": "lib/runtime/runtime_controllers_settings_secrets_impl.dart", - "line": 484, + "line": 423, "kind": "top-level function", "name": "resolveSecretValueSettingsInternal", "signature": "Future resolveSecretValueSettingsInternal( SettingsController controller, { String explicitValue = '', String refName = '', String fallbackRefName = '', String accountTarget = '', bool allowVaultLookup = true, bool persistExplicitValue = true, }) async {" @@ -4329,7 +4266,7 @@ { "language": "dart", "path": "lib/runtime/runtime_coordinator.dart", - "line": 26, + "line": 20, "kind": "class", "name": "RuntimeCoordinator", "signature": "class RuntimeCoordinator extends ChangeNotifier {" @@ -4399,12 +4336,12 @@ { "path": "lib/runtime/runtime_models_account.dart", "language": "dart", - "symbolCount": 13, + "symbolCount": 12, "symbols": [ { "language": "dart", "path": "lib/runtime/runtime_models_account.dart", - "line": 4, + "line": 3, "kind": "class", "name": "AccountSessionSummary", "signature": "class AccountSessionSummary {" @@ -4412,7 +4349,7 @@ { "language": "dart", "path": "lib/runtime/runtime_models_account.dart", - "line": 68, + "line": 67, "kind": "class", "name": "AccountTokenConfigured", "signature": "class AccountTokenConfigured {" @@ -4420,7 +4357,7 @@ { "language": "dart", "path": "lib/runtime/runtime_models_account.dart", - "line": 108, + "line": 96, "kind": "class", "name": "AccountSecretLocator", "signature": "class AccountSecretLocator {" @@ -4428,7 +4365,7 @@ { "language": "dart", "path": "lib/runtime/runtime_models_account.dart", - "line": 166, + "line": 154, "kind": "class", "name": "AccountRemoteProfile", "signature": "class AccountRemoteProfile {" @@ -4436,15 +4373,7 @@ { "language": "dart", "path": "lib/runtime/runtime_models_account.dart", - "line": 267, - "kind": "enum", - "name": "AcpBridgeServerMode", - "signature": "enum AcpBridgeServerMode { cloudSynced }" - }, - { - "language": "dart", - "path": "lib/runtime/runtime_models_account.dart", - "line": 269, + "line": 248, "kind": "class", "name": "AcpBridgeServerRemoteServerSummary", "signature": "class AcpBridgeServerRemoteServerSummary {" @@ -4452,7 +4381,7 @@ { "language": "dart", "path": "lib/runtime/runtime_models_account.dart", - "line": 312, + "line": 276, "kind": "class", "name": "AcpBridgeServerCloudSyncConfig", "signature": "class AcpBridgeServerCloudSyncConfig {" @@ -4460,7 +4389,7 @@ { "language": "dart", "path": "lib/runtime/runtime_models_account.dart", - "line": 370, + "line": 334, "kind": "class", "name": "AcpBridgeServerSelfHostedConfig", "signature": "class AcpBridgeServerSelfHostedConfig {" @@ -4468,15 +4397,15 @@ { "language": "dart", "path": "lib/runtime/runtime_models_account.dart", - "line": 423, + "line": 387, "kind": "class", - "name": "AcpBridgeServerAdvancedOverrides", - "signature": "class AcpBridgeServerAdvancedOverrides {" + "name": "AcpBridgeServerEffectiveConfig", + "signature": "class AcpBridgeServerEffectiveConfig {" }, { "language": "dart", "path": "lib/runtime/runtime_models_account.dart", - "line": 509, + "line": 442, "kind": "class", "name": "AcpBridgeServerModeConfig", "signature": "class AcpBridgeServerModeConfig {" @@ -4484,7 +4413,7 @@ { "language": "dart", "path": "lib/runtime/runtime_models_account.dart", - "line": 577, + "line": 498, "kind": "class", "name": "AccountSyncState", "signature": "class AccountSyncState {" @@ -4492,7 +4421,7 @@ { "language": "dart", "path": "lib/runtime/runtime_models_account.dart", - "line": 667, + "line": 588, "kind": "class", "name": "AccountSyncResult", "signature": "class AccountSyncResult {" @@ -4500,7 +4429,7 @@ { "language": "dart", "path": "lib/runtime/runtime_models_account.dart", - "line": 686, + "line": 607, "kind": "top-level function", "name": "isSupportedAccountManagedSecretTarget", "signature": "bool isSupportedAccountManagedSecretTarget(String target) {" @@ -4523,7 +4452,7 @@ { "language": "dart", "path": "lib/runtime/runtime_models_configs.dart", - "line": 136, + "line": 121, "kind": "top-level function", "name": "normalizeGatewayProfiles", "signature": "List normalizeGatewayProfiles({ Iterable? profiles, }) {" @@ -4531,15 +4460,15 @@ { "language": "dart", "path": "lib/runtime/runtime_models_configs.dart", - "line": 214, + "line": 162, "kind": "top-level function", "name": "replaceGatewayProfileAt", - "signature": "List replaceGatewayProfileAt( List profiles, int index, GatewayConnectionProfile profile, ) {" + "signature": "List replaceGatewayProfileAt( List profiles, int _, GatewayConnectionProfile profile, ) {" }, { "language": "dart", "path": "lib/runtime/runtime_models_configs.dart", - "line": 260, + "line": 206, "kind": "class", "name": "OllamaLocalConfig", "signature": "class OllamaLocalConfig {" @@ -4547,7 +4476,7 @@ { "language": "dart", "path": "lib/runtime/runtime_models_configs.dart", - "line": 311, + "line": 257, "kind": "class", "name": "OllamaCloudConfig", "signature": "class OllamaCloudConfig {" @@ -4555,7 +4484,7 @@ { "language": "dart", "path": "lib/runtime/runtime_models_configs.dart", - "line": 378, + "line": 324, "kind": "class", "name": "VaultConfig", "signature": "class VaultConfig {" @@ -4563,7 +4492,7 @@ { "language": "dart", "path": "lib/runtime/runtime_models_configs.dart", - "line": 434, + "line": 380, "kind": "class", "name": "AiGatewayProfile", "signature": "class AiGatewayProfile {" @@ -4571,7 +4500,7 @@ { "language": "dart", "path": "lib/runtime/runtime_models_configs.dart", - "line": 532, + "line": 473, "kind": "class", "name": "AiGatewayConnectionCheck", "signature": "class AiGatewayConnectionCheck {" @@ -4579,7 +4508,7 @@ { "language": "dart", "path": "lib/runtime/runtime_models_configs.dart", - "line": 548, + "line": 489, "kind": "enum", "name": "WebSessionPersistenceMode", "signature": "enum WebSessionPersistenceMode { browser, remote }" @@ -4587,7 +4516,7 @@ { "language": "dart", "path": "lib/runtime/runtime_models_configs.dart", - "line": 550, + "line": 491, "kind": "extension", "name": "WebSessionPersistenceModeCopy", "signature": "extension WebSessionPersistenceModeCopy on WebSessionPersistenceMode {" @@ -4595,7 +4524,7 @@ { "language": "dart", "path": "lib/runtime/runtime_models_configs.dart", - "line": 567, + "line": 508, "kind": "class", "name": "WebSessionPersistenceConfig", "signature": "class WebSessionPersistenceConfig {" @@ -5366,7 +5295,7 @@ { "language": "dart", "path": "lib/runtime/runtime_models_runtime_payloads.dart", - "line": 904, + "line": 935, "kind": "class", "name": "ThreadLifecycleState", "signature": "class ThreadLifecycleState {" @@ -5374,7 +5303,7 @@ { "language": "dart", "path": "lib/runtime/runtime_models_runtime_payloads.dart", - "line": 960, + "line": 991, "kind": "class", "name": "TaskThread", "signature": "class TaskThread {" @@ -5382,7 +5311,7 @@ { "language": "dart", "path": "lib/runtime/runtime_models_runtime_payloads.dart", - "line": 1291, + "line": 1332, "kind": "top-level function", "name": "isNewConversationTaskTitle", "signature": "bool isNewConversationTaskTitle(String title) {" @@ -5390,7 +5319,7 @@ { "language": "dart", "path": "lib/runtime/runtime_models_runtime_payloads.dart", - "line": 1296, + "line": 1337, "kind": "top-level function", "name": "firstUserMessageTaskTitle", "signature": "String firstUserMessageTaskTitle( Iterable messages, { String fallback = '', }) {" @@ -5398,7 +5327,7 @@ { "language": "dart", "path": "lib/runtime/runtime_models_runtime_payloads.dart", - "line": 1318, + "line": 1359, "kind": "top-level function", "name": "derivePersistedTaskTitle", "signature": "String derivePersistedTaskTitle( String currentTitle, Iterable messages, { String fallback = '', bool hasCustomTitle = false, }) {" @@ -5413,7 +5342,7 @@ { "language": "dart", "path": "lib/runtime/runtime_models_settings_snapshot.dart", - "line": 16, + "line": 17, "kind": "class", "name": "SettingsSnapshot", "signature": "class SettingsSnapshot {" @@ -5482,7 +5411,7 @@ { "language": "dart", "path": "lib/runtime/secure_config_store.dart", - "line": 13, + "line": 9, "kind": "class", "name": "SecureConfigStore", "signature": "class SecureConfigStore {" @@ -5513,7 +5442,7 @@ { "language": "dart", "path": "lib/runtime/settings_store.dart", - "line": 22, + "line": 20, "kind": "enum", "name": "SkippedTaskThreadReason", "signature": "enum SkippedTaskThreadReason {" @@ -5521,7 +5450,7 @@ { "language": "dart", "path": "lib/runtime/settings_store.dart", - "line": 28, + "line": 26, "kind": "class", "name": "SkippedTaskThreadRecord", "signature": "class SkippedTaskThreadRecord {" @@ -5529,7 +5458,7 @@ { "language": "dart", "path": "lib/runtime/settings_store.dart", - "line": 35, + "line": 36, "kind": "class", "name": "SettingsStore", "signature": "class SettingsStore {" @@ -5721,7 +5650,7 @@ { "group": "rust/src", "fileCount": 4, - "symbolCount": 19, + "symbolCount": 16, "files": [ { "path": "rust/src/error.rs", @@ -5859,7 +5788,7 @@ { "path": "rust/src/types.rs", "language": "rust", - "symbolCount": 5, + "symbolCount": 2, "symbols": [ { "language": "rust", @@ -5874,32 +5803,8 @@ "path": "rust/src/types.rs", "line": 38, "kind": "struct", - "name": "CodexMessage", - "signature": "pub struct CodexMessage {" - }, - { - "language": "rust", - "path": "rust/src/types.rs", - "line": 51, - "kind": "struct", "name": "CodexEvent", "signature": "pub struct CodexEvent {" - }, - { - "language": "rust", - "path": "rust/src/types.rs", - "line": 66, - "kind": "struct", - "name": "CodexModelInfo", - "signature": "pub struct CodexModelInfo {" - }, - { - "language": "rust", - "path": "rust/src/types.rs", - "line": 79, - "kind": "struct", - "name": "CodexAccountInfo", - "signature": "pub struct CodexAccountInfo {" } ] } diff --git a/docs/architecture/public-api/_generated/public-symbol-inventory.md b/docs/architecture/public-api/_generated/public-symbol-inventory.md index 1dd9830c..dcfe1f15 100644 --- a/docs/architecture/public-api/_generated/public-symbol-inventory.md +++ b/docs/architecture/public-api/_generated/public-symbol-inventory.md @@ -5,9 +5,9 @@ > Scope: `lib/app`, `lib/runtime`, `lib/models`, `lib/features/**`, `lib/theme`, `rust/src`. > Excludes private `_` symbols and non-top-level Dart members. -- Generated at: `2026-04-14T08:20:04.438927+00:00` -- Files scanned: `130` -- Public symbols extracted: `614` +- Generated at: `2026-05-13T08:37:25.180831+00:00` +- Files scanned: `129` +- Public symbols extracted: `603` ## Group Summary @@ -15,23 +15,23 @@ | --- | ---: | ---: | | `lib/app` | 30 | 68 | | `lib/features` | 26 | 103 | -| `lib/models` | 1 | 34 | -| `lib/runtime` | 67 | 377 | +| `lib/models` | 1 | 31 | +| `lib/runtime` | 66 | 372 | | `lib/theme` | 2 | 13 | -| `rust/src` | 4 | 19 | +| `rust/src` | 4 | 16 | ## Coverage Scope Summary | Scope | Files | Public Symbols | | --- | ---: | ---: | | `lib/app` | 30 | 68 | -| `lib/runtime` | 67 | 377 | -| `lib/models` | 1 | 34 | -| `lib/features/assistant` | 16 | 80 | -| `lib/features/settings` | 4 | 4 | +| `lib/runtime` | 66 | 372 | +| `lib/models` | 1 | 31 | +| `lib/features/assistant` | 16 | 79 | +| `lib/features/settings` | 4 | 5 | | `lib/features/mobile` | 6 | 19 | | `lib/theme` | 2 | 13 | -| `rust/src` | 4 | 19 | +| `rust/src` | 4 | 16 | ## lib/app @@ -77,9 +77,9 @@ _No extracted public top-level symbols._ | Line | Kind | Name | Signature | | ---: | --- | --- | --- | -| 54 | `enum` | `CodexCooperationState` | `enum CodexCooperationState { notStarted, bridgeOnly, registered }` | -| 56 | `class` | `SingleAgentSkillScanRootInternal` | `class SingleAgentSkillScanRootInternal {` | -| 88 | `class` | `AppController` | `class AppController extends ChangeNotifier {` | +| 57 | `enum` | `CodexCooperationState` | `enum CodexCooperationState { notStarted, bridgeOnly, registered }` | +| 59 | `class` | `SingleAgentSkillScanRootInternal` | `class SingleAgentSkillScanRootInternal {` | +| 91 | `class` | `AppController` | `class AppController extends ChangeNotifier {` | ### `lib/app/app_controller_desktop_external_acp_routing.dart` @@ -97,7 +97,7 @@ _No extracted public top-level symbols._ | Line | Kind | Name | Signature | | ---: | --- | --- | --- | -| 49 | `extension` | `AppControllerDesktopGateway` | `extension AppControllerDesktopGateway on AppController {` | +| 48 | `extension` | `AppControllerDesktopGateway` | `extension AppControllerDesktopGateway on AppController {` | ### `lib/app/app_controller_desktop_navigation.dart` @@ -106,24 +106,25 @@ _No extracted public top-level symbols._ | Line | Kind | Name | Signature | | ---: | --- | --- | --- | -| 48 | `extension` | `AppControllerDesktopNavigation` | `extension AppControllerDesktopNavigation on AppController {` | +| 47 | `extension` | `AppControllerDesktopNavigation` | `extension AppControllerDesktopNavigation on AppController {` | ### `lib/app/app_controller_desktop_runtime_coordination_impl.dart` - Language: `dart` -- Public symbols: `9` +- Public symbols: `10` | Line | Kind | Name | Signature | | ---: | --- | --- | --- | | 48 | `top-level function` | `refreshAcpCapabilitiesRuntimeInternal` | `Future refreshAcpCapabilitiesRuntimeInternal( AppController controller, { bool forceRefresh = false, bool persistMountTargets = false, }) async {` | -| 90 | `top-level function` | `refreshSingleAgentCapabilitiesRuntimeInternal` | `Future refreshSingleAgentCapabilitiesRuntimeInternal( AppController controller, { bool forceRefresh = false, }) async {` | -| 158 | `top-level function` | `assistantWorkingDirectoryForSessionRuntimeInternal` | `String? assistantWorkingDirectoryForSessionRuntimeInternal( AppController controller, String sessionKey, ) {` | -| 178 | `top-level function` | `resolveLocalAssistantWorkingDirectoryForSessionRuntimeInternal` | `String? resolveLocalAssistantWorkingDirectoryForSessionRuntimeInternal( AppController controller, String sessionKey, { bool requireLocalExistence = true, }) {` | -| 206 | `top-level function` | `buildCodeAgentNodeStateRuntimeInternal` | `CodeAgentNodeState buildCodeAgentNodeStateRuntimeInternal( AppController controller, ) {` | -| 220 | `top-level function` | `bridgeGatewayModeRuntimeInternal` | `GatewayMode bridgeGatewayModeRuntimeInternal(AppController controller) {` | -| 230 | `top-level function` | `ensureCodexGatewayRegistrationRuntimeInternal` | `Future ensureCodexGatewayRegistrationRuntimeInternal( AppController controller, ) async {` | -| 298 | `top-level function` | `clearCodexGatewayRegistrationRuntimeInternal` | `void clearCodexGatewayRegistrationRuntimeInternal(AppController controller) {` | -| 308 | `top-level function` | `recomputeTasksRuntimeInternal` | `void recomputeTasksRuntimeInternal(AppController controller) {` | +| 98 | `top-level function` | `refreshSingleAgentCapabilitiesRuntimeInternal` | `Future refreshSingleAgentCapabilitiesRuntimeInternal( AppController controller, { bool forceRefresh = false, }) async {` | +| 170 | `top-level function` | `assistantWorkingDirectoryForSessionRuntimeInternal` | `String? assistantWorkingDirectoryForSessionRuntimeInternal( AppController controller, String sessionKey, ) {` | +| 181 | `top-level function` | `assistantRemoteWorkingDirectoryHintForSessionRuntimeInternal` | `String? assistantRemoteWorkingDirectoryHintForSessionRuntimeInternal( AppController controller, String sessionKey, ) {` | +| 200 | `top-level function` | `resolveLocalAssistantWorkingDirectoryForSessionRuntimeInternal` | `String? resolveLocalAssistantWorkingDirectoryForSessionRuntimeInternal( AppController controller, String sessionKey, { bool requireLocalExistence = true, }) {` | +| 223 | `top-level function` | `buildCodeAgentNodeStateRuntimeInternal` | `CodeAgentNodeState buildCodeAgentNodeStateRuntimeInternal( AppController controller, { AssistantExecutionTarget? executionTarget, }) {` | +| 239 | `top-level function` | `bridgeGatewayModeRuntimeInternal` | `GatewayMode bridgeGatewayModeRuntimeInternal(AppController controller) {` | +| 249 | `top-level function` | `ensureCodexGatewayRegistrationRuntimeInternal` | `Future ensureCodexGatewayRegistrationRuntimeInternal( AppController controller, ) async {` | +| 317 | `top-level function` | `clearCodexGatewayRegistrationRuntimeInternal` | `void clearCodexGatewayRegistrationRuntimeInternal(AppController controller) {` | +| 327 | `top-level function` | `recomputeTasksRuntimeInternal` | `void recomputeTasksRuntimeInternal(AppController controller) {` | ### `lib/app/app_controller_desktop_runtime_exceptions.dart` @@ -142,7 +143,7 @@ _No extracted public top-level symbols._ | Line | Kind | Name | Signature | | ---: | --- | --- | --- | -| 51 | `extension` | `AppControllerDesktopRuntimeHelpers` | `extension AppControllerDesktopRuntimeHelpers on AppController {` | +| 53 | `extension` | `AppControllerDesktopRuntimeHelpers` | `extension AppControllerDesktopRuntimeHelpers on AppController {` | ### `lib/app/app_controller_desktop_settings.dart` @@ -160,16 +161,7 @@ _No extracted public top-level symbols._ | Line | Kind | Name | Signature | | ---: | --- | --- | --- | -| 49 | `extension` | `AppControllerDesktopSettingsRuntime` | `extension AppControllerDesktopSettingsRuntime on AppController {` | - -### `lib/app/app_controller_desktop_single_agent.dart` - -- Language: `dart` -- Public symbols: `1` - -| Line | Kind | Name | Signature | -| ---: | --- | --- | --- | -| 3 | `extension` | `AppControllerDesktopSingleAgent` | `extension AppControllerDesktopSingleAgent on AppController {}` | +| 50 | `extension` | `AppControllerDesktopSettingsRuntime` | `extension AppControllerDesktopSettingsRuntime on AppController {` | ### `lib/app/app_controller_desktop_skill_permissions.dart` @@ -178,7 +170,7 @@ _No extracted public top-level symbols._ | Line | Kind | Name | Signature | | ---: | --- | --- | --- | -| 49 | `extension` | `AppControllerDesktopSkillPermissions` | `extension AppControllerDesktopSkillPermissions on AppController {` | +| 48 | `extension` | `AppControllerDesktopSkillPermissions` | `extension AppControllerDesktopSkillPermissions on AppController {` | ### `lib/app/app_controller_desktop_thread_actions.dart` @@ -187,7 +179,7 @@ _No extracted public top-level symbols._ | Line | Kind | Name | Signature | | ---: | --- | --- | --- | -| 50 | `extension` | `AppControllerDesktopThreadActions` | `extension AppControllerDesktopThreadActions on AppController {` | +| 51 | `extension` | `AppControllerDesktopThreadActions` | `extension AppControllerDesktopThreadActions on AppController {` | ### `lib/app/app_controller_desktop_thread_binding.dart` @@ -198,40 +190,40 @@ _No extracted public top-level symbols._ | ---: | --- | --- | --- | | 47 | `class` | `DesktopThreadBindingSnapshotInternal` | `class DesktopThreadBindingSnapshotInternal {` | | 76 | `extension` | `AppControllerDesktopThreadBinding` | `extension AppControllerDesktopThreadBinding on AppController {` | -| 294 | `top-level function` | `pickDraftThreadExecutionTargetInternal` | `AssistantExecutionTarget pickDraftThreadExecutionTargetInternal({ required AssistantExecutionTarget currentTarget, required Iterable visibleTargets, bool? localWorkspaceAvailable, }) {` | +| 337 | `top-level function` | `pickDraftThreadExecutionTargetInternal` | `AssistantExecutionTarget pickDraftThreadExecutionTargetInternal({ required AssistantExecutionTarget currentTarget, required Iterable visibleTargets, bool? localWorkspaceAvailable, }) {` | ### `lib/app/app_controller_desktop_thread_sessions.dart` - Language: `dart` -- Public symbols: `3` +- Public symbols: `4` | Line | Kind | Name | Signature | | ---: | --- | --- | --- | -| 51 | `top-level function` | `resolveGatewayThreadConnectionStateInternal` | `AssistantThreadConnectionState resolveGatewayThreadConnectionStateInternal({ required AssistantExecutionTarget target, required bool bridgeReady, required String bridgeLabel, required AccountSyncState? accountSyncState, }) {` | -| 99 | `extension` | `AppControllerDesktopThreadSessions` | `extension AppControllerDesktopThreadSessions on AppController {` | -| 470 | `top-level function` | `resolveAssistantExecutionTargetFromRecordsForTest` | `AssistantExecutionTarget resolveAssistantExecutionTargetFromRecordsForTest( TaskThread? primaryRecord, { TaskThread? fallbackRecord, }) {` | +| 55 | `top-level function` | `resolveGatewayThreadConnectionStateInternal` | `AssistantThreadConnectionState resolveGatewayThreadConnectionStateInternal({ required AssistantExecutionTarget target, required bool bridgeReady, required String bridgeLabel, required AccountSyncState? accountSyncState, required bool accountSignedIn, required bool bridgeConfigured, bool bridgeDiscoveryAttempted = false, String bridgeDiscoveryError = '', bool providerCatalogEmpty = false, }) {` | +| 180 | `top-level function` | `bridgeCapabilityReadyForExecutionTargetInternal` | `bool bridgeCapabilityReadyForExecutionTargetInternal({ required AssistantExecutionTarget target, required bool bridgeConfigured, required List providers, required List availableTargets, }) {` | +| 192 | `extension` | `AppControllerDesktopThreadSessions` | `extension AppControllerDesktopThreadSessions on AppController {` | +| 655 | `top-level function` | `resolveAssistantExecutionTargetFromRecordForTest` | `AssistantExecutionTarget resolveAssistantExecutionTargetFromRecordForTest( TaskThread? record, { required AssistantExecutionTarget defaultExecutionTarget, }) {` | ### `lib/app/app_controller_desktop_thread_sessions_collaboration_impl.dart` - Language: `dart` -- Public symbols: `14` +- Public symbols: `13` | Line | Kind | Name | Signature | | ---: | --- | --- | --- | -| 50 | `top-level function` | `loadAiGatewayApiKeyThreadSessionInternal` | `Future loadAiGatewayApiKeyThreadSessionInternal( AppController controller, ) async {` | -| 56 | `top-level function` | `saveMultiAgentConfigThreadSessionInternal` | `Future saveMultiAgentConfigThreadSessionInternal( AppController controller, MultiAgentConfig config, ) async {` | -| 73 | `top-level function` | `refreshMultiAgentMountsThreadSessionInternal` | `Future refreshMultiAgentMountsThreadSessionInternal( AppController controller, { bool sync = false, }) async {` | -| 98 | `top-level function` | `runMultiAgentCollaborationThreadSessionInternal` | `Future runMultiAgentCollaborationThreadSessionInternal( AppController controller, { required String rawPrompt, required String composedPrompt, required List attachments, required List selectedSkillLabels, }) async {` | -| 269 | `top-level function` | `openOnlineWorkspaceThreadSessionInternal` | `Future openOnlineWorkspaceThreadSessionInternal( AppController controller, ) async {` | -| 290 | `top-level function` | `aiGatewayModelChoicesThreadSessionInternal` | `List aiGatewayModelChoicesThreadSessionInternal( AppController controller, ) {` | -| 296 | `top-level function` | `connectedGatewayModelChoicesThreadSessionInternal` | `List connectedGatewayModelChoicesThreadSessionInternal( AppController controller, ) {` | -| 308 | `top-level function` | `assistantModelChoicesThreadSessionInternal` | `List assistantModelChoicesThreadSessionInternal( AppController controller, ) {` | -| 317 | `top-level function` | `assistantModelChoicesForSessionThreadSessionInternal` | `List assistantModelChoicesForSessionThreadSessionInternal( AppController controller, String sessionKey, ) {` | -| 332 | `top-level function` | `resolvedDefaultModelThreadSessionInternal` | `String resolvedDefaultModelThreadSessionInternal(AppController controller) {` | -| 354 | `top-level function` | `canQuickConnectGatewayThreadSessionInternal` | `bool canQuickConnectGatewayThreadSessionInternal(AppController controller) {` | -| 374 | `top-level function` | `normalizeAssistantSessionKeyThreadInternal` | `String normalizeAssistantSessionKeyThreadInternal(String sessionKey) {` | -| 379 | `top-level function` | `joinConnectionPartsThreadSessionInternal` | `String joinConnectionPartsThreadSessionInternal(List parts) {` | -| 387 | `top-level function` | `gatewayAddressLabelThreadSessionInternal` | `String gatewayAddressLabelThreadSessionInternal( GatewayConnectionProfile profile, ) {` | +| 49 | `top-level function` | `loadAiGatewayApiKeyThreadSessionInternal` | `Future loadAiGatewayApiKeyThreadSessionInternal( AppController controller, ) async {` | +| 55 | `top-level function` | `saveMultiAgentConfigThreadSessionInternal` | `Future saveMultiAgentConfigThreadSessionInternal( AppController controller, MultiAgentConfig config, ) async {` | +| 72 | `top-level function` | `refreshMultiAgentMountsThreadSessionInternal` | `Future refreshMultiAgentMountsThreadSessionInternal( AppController controller, { bool sync = false, }) async {` | +| 97 | `top-level function` | `runMultiAgentCollaborationThreadSessionInternal` | `Future runMultiAgentCollaborationThreadSessionInternal( AppController controller, { required String rawPrompt, required String composedPrompt, required List attachments, required List selectedSkillLabels, }) async {` | +| 283 | `top-level function` | `openOnlineWorkspaceThreadSessionInternal` | `Future openOnlineWorkspaceThreadSessionInternal( AppController controller, ) async {` | +| 304 | `top-level function` | `aiGatewayModelChoicesThreadSessionInternal` | `List aiGatewayModelChoicesThreadSessionInternal( AppController controller, ) {` | +| 310 | `top-level function` | `connectedGatewayModelChoicesThreadSessionInternal` | `List connectedGatewayModelChoicesThreadSessionInternal( AppController controller, ) {` | +| 322 | `top-level function` | `assistantModelChoicesThreadSessionInternal` | `List assistantModelChoicesThreadSessionInternal( AppController controller, ) {` | +| 331 | `top-level function` | `assistantModelChoicesForSessionThreadSessionInternal` | `List assistantModelChoicesForSessionThreadSessionInternal( AppController controller, String sessionKey, ) {` | +| 346 | `top-level function` | `resolvedDefaultModelThreadSessionInternal` | `String resolvedDefaultModelThreadSessionInternal(AppController controller) {` | +| 368 | `top-level function` | `canQuickConnectGatewayThreadSessionInternal` | `bool canQuickConnectGatewayThreadSessionInternal(AppController controller) {` | +| 388 | `top-level function` | `joinConnectionPartsThreadSessionInternal` | `String joinConnectionPartsThreadSessionInternal(List parts) {` | +| 396 | `top-level function` | `gatewayAddressLabelThreadSessionInternal` | `String gatewayAddressLabelThreadSessionInternal( GatewayConnectionProfile profile, ) {` | ### `lib/app/app_controller_desktop_thread_storage.dart` @@ -240,7 +232,7 @@ _No extracted public top-level symbols._ | Line | Kind | Name | Signature | | ---: | --- | --- | --- | -| 48 | `extension` | `AppControllerDesktopThreadStorage` | `extension AppControllerDesktopThreadStorage on AppController {` | +| 47 | `extension` | `AppControllerDesktopThreadStorage` | `extension AppControllerDesktopThreadStorage on AppController {` | ### `lib/app/app_controller_desktop_workspace_execution.dart` @@ -251,6 +243,15 @@ _No extracted public top-level symbols._ | ---: | --- | --- | --- | | 48 | `extension` | `AppControllerDesktopWorkspaceExecution` | `extension AppControllerDesktopWorkspaceExecution on AppController {` | +### `lib/app/app_controller_openclaw_task_queue.dart` + +- Language: `dart` +- Public symbols: `1` + +| Line | Kind | Name | Signature | +| ---: | --- | --- | --- | +| 9 | `class` | `OpenClawGatewayQueuedTurnInternal` | `class OpenClawGatewayQueuedTurnInternal {` | + ### `lib/app/app_metadata.dart` - Language: `dart` @@ -313,21 +314,20 @@ _No extracted public top-level symbols._ | 14 | `enum` | `UiFeatureBuildMode` | `enum UiFeatureBuildMode { debug, profile, release }` | | 16 | `top-level function` | `currentUiFeatureBuildMode` | `UiFeatureBuildMode currentUiFeatureBuildMode() {` | | 26 | `top-level function` | `resolveUiFeaturePlatformFromContext` | `UiFeaturePlatform resolveUiFeaturePlatformFromContext(BuildContext context) {` | -| 62 | `class` | `UiFeatureFlag` | `class UiFeatureFlag {` | -| 94 | `class` | `UiFeatureManifest` | `class UiFeatureManifest {` | -| 341 | `class` | `UiFeatureAccess` | `class UiFeatureAccess {` | -| 480 | `class` | `UiFeatureManifestLoader` | `class UiFeatureManifestLoader {` | +| 57 | `class` | `UiFeatureFlag` | `class UiFeatureFlag {` | +| 89 | `class` | `UiFeatureManifest` | `class UiFeatureManifest {` | +| 336 | `class` | `UiFeatureAccess` | `class UiFeatureAccess {` | +| 466 | `class` | `UiFeatureManifestLoader` | `class UiFeatureManifestLoader {` | ### `lib/app/workspace_navigation.dart` - Language: `dart` -- Public symbols: `3` +- Public symbols: `2` | Line | Kind | Name | Signature | | ---: | --- | --- | --- | | 8 | `top-level function` | `buildWorkspaceBreadcrumbs` | `List buildWorkspaceBreadcrumbs({ required AppController controller, required String rootLabel, String? sectionLabel, String? detailLabel, VoidCallback? onRootTap, }) {` | -| 32 | `top-level function` | `buildSettingsBreadcrumbs` | `List buildSettingsBreadcrumbs( AppController controller, { required SettingsTab tab, SettingsDetailPage? detail, SettingsNavigationContext? navigationContext, }) {` | -| 57 | `top-level function` | `openSettingsNavigationContext` | `void openSettingsNavigationContext( AppController controller, SettingsNavigationContext context, ) {` | +| 32 | `top-level function` | `buildSettingsBreadcrumbs` | `List buildSettingsBreadcrumbs( AppController controller, { required SettingsTab tab, }) {` | ### `lib/app/workspace_page_registry.dart` @@ -339,7 +339,7 @@ _No extracted public top-level symbols._ | 8 | `enum` | `WorkspacePageSurface` | `enum WorkspacePageSurface { desktop, mobile }` | | 10 | `typedef` | `WorkspacePageBuilder` | `typedef WorkspacePageBuilder = Widget Function( AppController controller, ValueChanged onOpenDetail, );` | | 16 | `class` | `WorkspacePageSpec` | `class WorkspacePageSpec {` | -| 60 | `top-level function` | `buildWorkspacePage` | `Widget buildWorkspacePage({ required WorkspaceDestination destination, required AppController controller, required ValueChanged onOpenDetail, required WorkspacePageSurface surface, }) {` | +| 56 | `top-level function` | `buildWorkspacePage` | `Widget buildWorkspacePage({ required WorkspaceDestination destination, required AppController controller, required ValueChanged onOpenDetail, required WorkspacePageSurface surface, }) {` | ## lib/features @@ -362,10 +362,10 @@ _No extracted public top-level symbols._ | ---: | --- | --- | --- | | 40 | `class` | `AssistantTaskRailInternal` | `class AssistantTaskRailInternal extends StatefulWidget {` | | 73 | `class` | `AssistantTaskRailStateInternal` | `class AssistantTaskRailStateInternal extends State {` | -| 282 | `top-level function` | `groupTasksForRailInternal` | `List groupTasksForRailInternal( List tasks, List visibleExecutionTargets, ) {` | -| 312 | `class` | `AssistantTaskTileInternal` | `class AssistantTaskTileInternal extends StatelessWidget {` | -| 417 | `class` | `AssistantTaskGroupHeaderInternal` | `class AssistantTaskGroupHeaderInternal extends StatelessWidget {` | -| 481 | `class` | `AssistantEmptyStateInternal` | `class AssistantEmptyStateInternal extends StatelessWidget {` | +| 283 | `top-level function` | `groupTasksForRailInternal` | `List groupTasksForRailInternal( List tasks, List visibleExecutionTargets, ) {` | +| 313 | `class` | `AssistantTaskTileInternal` | `class AssistantTaskTileInternal extends StatelessWidget {` | +| 462 | `class` | `AssistantTaskGroupHeaderInternal` | `class AssistantTaskGroupHeaderInternal extends StatelessWidget {` | +| 526 | `class` | `AssistantEmptyStateInternal` | `class AssistantEmptyStateInternal extends StatelessWidget {` | ### `lib/features/assistant/assistant_page_components_core.dart` @@ -400,13 +400,12 @@ _No extracted public top-level symbols._ ### `lib/features/assistant/assistant_page_composer_skill_models.dart` - Language: `dart` -- Public symbols: `3` +- Public symbols: `2` | Line | Kind | Name | Signature | | ---: | --- | --- | --- | -| 79 | `top-level function` | `skillOptionFromGatewayInternal` | `ComposerSkillOptionInternal skillOptionFromGatewayInternal( GatewaySkillSummary skill, ) {` | -| 106 | `top-level function` | `skillOptionFromThreadSkillInternal` | `ComposerSkillOptionInternal skillOptionFromThreadSkillInternal( AssistantThreadSkillEntry skill, ) {` | -| 122 | `class` | `ComposerSkillOptionInternal` | `class ComposerSkillOptionInternal {` | +| 40 | `top-level function` | `skillOptionFromGatewayInternal` | `ComposerSkillOptionInternal skillOptionFromGatewayInternal( GatewaySkillSummary skill, ) {` | +| 61 | `class` | `ComposerSkillOptionInternal` | `class ComposerSkillOptionInternal {` | ### `lib/features/assistant/assistant_page_composer_skill_picker.dart` @@ -455,13 +454,13 @@ _No extracted public top-level symbols._ | 56 | `typedef` | `AssistantClipboardImageReader` | `typedef AssistantClipboardImageReader = Future Function();` | | 58 | `class` | `AssistantPage` | `class AssistantPage extends StatefulWidget {` | | 80 | `class` | `AssistantPageStateInternal` | `class AssistantPageStateInternal extends State {` | -| 270 | `enum` | `AssistantSidePaneInternal` | `enum AssistantSidePaneInternal { tasks, navigation, focused }` | -| 272 | `class` | `AssistantUnifiedSidePaneInternal` | `class AssistantUnifiedSidePaneInternal extends StatelessWidget {` | -| 344 | `class` | `AssistantSideTabRailInternal` | `class AssistantSideTabRailInternal extends StatelessWidget {` | -| 444 | `class` | `AssistantSideTabButtonInternal` | `class AssistantSideTabButtonInternal extends StatefulWidget {` | -| 463 | `class` | `AssistantSideTabButtonStateInternal` | `class AssistantSideTabButtonStateInternal extends State {` | -| 512 | `class` | `AssistantLowerPaneInternal` | `class AssistantLowerPaneInternal extends StatelessWidget {` | -| 596 | `class` | `ConversationAreaInternal` | `class ConversationAreaInternal extends StatelessWidget {` | +| 278 | `enum` | `AssistantSidePaneInternal` | `enum AssistantSidePaneInternal { tasks, navigation, focused }` | +| 280 | `class` | `AssistantUnifiedSidePaneInternal` | `class AssistantUnifiedSidePaneInternal extends StatelessWidget {` | +| 352 | `class` | `AssistantSideTabRailInternal` | `class AssistantSideTabRailInternal extends StatelessWidget {` | +| 452 | `class` | `AssistantSideTabButtonInternal` | `class AssistantSideTabButtonInternal extends StatefulWidget {` | +| 471 | `class` | `AssistantSideTabButtonStateInternal` | `class AssistantSideTabButtonStateInternal extends State {` | +| 520 | `class` | `AssistantLowerPaneInternal` | `class AssistantLowerPaneInternal extends StatelessWidget {` | +| 604 | `class` | `ConversationAreaInternal` | `class ConversationAreaInternal extends StatelessWidget {` | ### `lib/features/assistant/assistant_page_message_widgets.dart` @@ -499,7 +498,7 @@ _No extracted public top-level symbols._ | Line | Kind | Name | Signature | | ---: | --- | --- | --- | -| 42 | `extension` | `AssistantPageStateClosureInternal` | `extension AssistantPageStateClosureInternal on AssistantPageStateInternal {` | +| 44 | `extension` | `AssistantPageStateClosureInternal` | `extension AssistantPageStateClosureInternal on AssistantPageStateInternal {` | ### `lib/features/assistant/assistant_page_task_dialog_controls.dart` @@ -527,15 +526,15 @@ _No extracted public top-level symbols._ | 202 | `class` | `MetaPillInternal` | `class MetaPillInternal extends StatelessWidget {` | | 256 | `top-level function` | `pillStyleForStatusInternal` | `PillStyleInternal pillStyleForStatusInternal( BuildContext context, String label, ) {` | | 282 | `top-level function` | `normalizedTaskStatusInternal` | `String normalizedTaskStatusInternal(String status) {` | -| 294 | `top-level function` | `toolCallStatusLabelInternal` | `String toolCallStatusLabelInternal(String status) =>` | -| 301 | `top-level function` | `assistantThinkingLabelInternal` | `String assistantThinkingLabelInternal(String level) => switch (level) {` | -| 308 | `top-level function` | `sessionDisplayTitleInternal` | `String sessionDisplayTitleInternal(GatewaySessionSummary session) {` | -| 320 | `top-level function` | `fallbackSessionTitleInternal` | `String fallbackSessionTitleInternal(String sessionKey) {` | -| 335 | `top-level function` | `sessionPreviewInternal` | `String? sessionPreviewInternal(GatewaySessionSummary session) {` | -| 347 | `top-level function` | `sessionStatusInternal` | `String sessionStatusInternal( GatewaySessionSummary session, { required bool sessionPending, }) {` | -| 363 | `top-level function` | `sessionUpdatedAtLabelInternal` | `String sessionUpdatedAtLabelInternal(double? updatedAtMs) {` | -| 382 | `top-level function` | `estimatedComposerWrapSectionHeightInternal` | `double estimatedComposerWrapSectionHeightInternal({ required int itemCount, required double availableWidth, required double averageChipWidth, }) {` | -| 398 | `top-level function` | `sessionKeysMatchInternal` | `bool sessionKeysMatchInternal(String incoming, String current) {` | +| 295 | `top-level function` | `toolCallStatusLabelInternal` | `String toolCallStatusLabelInternal(String status) =>` | +| 303 | `top-level function` | `assistantThinkingLabelInternal` | `String assistantThinkingLabelInternal(String level) => switch (level) {` | +| 310 | `top-level function` | `sessionDisplayTitleInternal` | `String sessionDisplayTitleInternal(GatewaySessionSummary session) {` | +| 318 | `top-level function` | `fallbackSessionTitleInternal` | `String fallbackSessionTitleInternal(String sessionKey) {` | +| 326 | `top-level function` | `sessionPreviewInternal` | `String? sessionPreviewInternal(GatewaySessionSummary session) {` | +| 338 | `top-level function` | `sessionStatusInternal` | `String sessionStatusInternal( GatewaySessionSummary session, { required bool sessionPending, String lifecycleStatus = '', }) {` | +| 359 | `top-level function` | `sessionUpdatedAtLabelInternal` | `String sessionUpdatedAtLabelInternal(double? updatedAtMs) {` | +| 378 | `top-level function` | `estimatedComposerWrapSectionHeightInternal` | `double estimatedComposerWrapSectionHeightInternal({ required int itemCount, required double availableWidth, required double averageChipWidth, }) {` | +| 394 | `top-level function` | `sessionKeysMatchInternal` | `bool sessionKeysMatchInternal(String incoming, String current) {` | ### `lib/features/assistant/assistant_page_tooltip_labels.dart` @@ -647,63 +646,61 @@ _No extracted public top-level symbols._ ### `lib/features/settings/settings_page_core.dart` - Language: `dart` -- Public symbols: `1` +- Public symbols: `2` | Line | Kind | Name | Signature | | ---: | --- | --- | --- | -| 19 | `class` | `SettingsPage` | `class SettingsPage extends StatefulWidget {` | +| 19 | `top-level function` | `loadBridgeMetadataForSettingsAbout` | `Future> loadBridgeMetadataForSettingsAbout({ required Uri bridgeEndpoint, required Future Function(Uri endpoint) authorizationResolver, HttpClient Function()? clientFactory, }) async {` | +| 109 | `class` | `SettingsPage` | `class SettingsPage extends StatefulWidget {` | ## lib/models - Files: `1` -- Public symbols: `34` +- Public symbols: `31` ### `lib/models/app_models.dart` - Language: `dart` -- Public symbols: `34` +- Public symbols: `31` | Line | Kind | Name | Signature | | ---: | --- | --- | --- | -| 5 | `enum` | `WorkspaceDestination` | `enum WorkspaceDestination {` | -| 10 | `extension` | `WorkspaceDestinationCopy` | `extension WorkspaceDestinationCopy on WorkspaceDestination {` | -| 45 | `enum` | `AssistantFocusEntry` | `enum AssistantFocusEntry {` | -| 51 | `extension` | `AssistantFocusEntryCopy` | `extension AssistantFocusEntryCopy on AssistantFocusEntry {` | -| 124 | `top-level function` | `normalizeAssistantNavigationDestinations` | `List normalizeAssistantNavigationDestinations( Iterable destinations, ) {` | -| 139 | `enum` | `StatusTone` | `enum StatusTone { neutral, accent, success, warning, danger }` | -| 141 | `class` | `StatusInfo` | `class StatusInfo {` | -| 148 | `enum` | `AppSidebarState` | `enum AppSidebarState { expanded, collapsed, hidden }` | -| 150 | `enum` | `AssistantMode` | `enum AssistantMode { code, office }` | -| 152 | `extension` | `AssistantModeCopy` | `extension AssistantModeCopy on AssistantMode {` | -| 159 | `enum` | `SettingsTab` | `enum SettingsTab { gateway }` | -| 161 | `extension` | `SettingsTabCopy` | `extension SettingsTabCopy on SettingsTab {` | -| 167 | `enum` | `SettingsDetailPage` | `enum SettingsDetailPage { gatewayConnection }` | -| 169 | `extension` | `SettingsDetailPageCopy` | `extension SettingsDetailPageCopy on SettingsDetailPage {` | -| 183 | `class` | `SettingsNavigationContext` | `class SettingsNavigationContext {` | -| 201 | `class` | `QuickAction` | `class QuickAction {` | -| 213 | `class` | `RecentSession` | `class RecentSession {` | -| 225 | `class` | `MetricSummary` | `class MetricSummary {` | -| 241 | `class` | `TaskSummary` | `class TaskSummary {` | -| 259 | `class` | `ModuleSummary` | `class ModuleSummary {` | -| 275 | `class` | `NodeSummary` | `class NodeSummary {` | -| 293 | `class` | `AgentSummary` | `class AgentSummary {` | -| 309 | `class` | `SkillSummary` | `class SkillSummary {` | -| 327 | `class` | `ConnectorSummary` | `class ConnectorSummary {` | -| 343 | `class` | `SecretSummary` | `class SecretSummary {` | -| 359 | `class` | `SecretReference` | `class SecretReference {` | -| 375 | `class` | `ProviderSummary` | `class ProviderSummary {` | -| 389 | `class` | `AuditSummary` | `class AuditSummary {` | -| 407 | `class` | `SettingSummary` | `class SettingSummary {` | -| 419 | `class` | `WorkspaceProfile` | `class WorkspaceProfile {` | -| 433 | `class` | `DetailPanelData` | `class DetailPanelData {` | -| 455 | `class` | `DetailSection` | `class DetailSection {` | -| 462 | `class` | `DetailItem` | `class DetailItem {` | -| 469 | `class` | `CommandEntry` | `class CommandEntry {` | +| 5 | `enum` | `WorkspaceDestination` | `enum WorkspaceDestination { assistant, settings }` | +| 7 | `extension` | `WorkspaceDestinationCopy` | `extension WorkspaceDestinationCopy on WorkspaceDestination {` | +| 42 | `enum` | `AssistantFocusEntry` | `enum AssistantFocusEntry { settings, language, theme }` | +| 44 | `extension` | `AssistantFocusEntryCopy` | `extension AssistantFocusEntryCopy on AssistantFocusEntry {` | +| 117 | `top-level function` | `normalizeAssistantNavigationDestinations` | `List normalizeAssistantNavigationDestinations( Iterable destinations, ) {` | +| 132 | `enum` | `StatusTone` | `enum StatusTone { neutral, accent, success, warning, danger }` | +| 134 | `class` | `StatusInfo` | `class StatusInfo {` | +| 141 | `enum` | `AppSidebarState` | `enum AppSidebarState { expanded, collapsed, hidden }` | +| 143 | `enum` | `AssistantMode` | `enum AssistantMode { code, office }` | +| 145 | `extension` | `AssistantModeCopy` | `extension AssistantModeCopy on AssistantMode {` | +| 152 | `enum` | `SettingsTab` | `enum SettingsTab { gateway }` | +| 154 | `extension` | `SettingsTabCopy` | `extension SettingsTabCopy on SettingsTab {` | +| 160 | `class` | `QuickAction` | `class QuickAction {` | +| 172 | `class` | `RecentSession` | `class RecentSession {` | +| 184 | `class` | `MetricSummary` | `class MetricSummary {` | +| 200 | `class` | `TaskSummary` | `class TaskSummary {` | +| 218 | `class` | `ModuleSummary` | `class ModuleSummary {` | +| 234 | `class` | `NodeSummary` | `class NodeSummary {` | +| 252 | `class` | `AgentSummary` | `class AgentSummary {` | +| 268 | `class` | `SkillSummary` | `class SkillSummary {` | +| 286 | `class` | `ConnectorSummary` | `class ConnectorSummary {` | +| 302 | `class` | `SecretSummary` | `class SecretSummary {` | +| 318 | `class` | `SecretReference` | `class SecretReference {` | +| 334 | `class` | `ProviderSummary` | `class ProviderSummary {` | +| 348 | `class` | `AuditSummary` | `class AuditSummary {` | +| 366 | `class` | `SettingSummary` | `class SettingSummary {` | +| 378 | `class` | `WorkspaceProfile` | `class WorkspaceProfile {` | +| 392 | `class` | `DetailPanelData` | `class DetailPanelData {` | +| 414 | `class` | `DetailSection` | `class DetailSection {` | +| 421 | `class` | `DetailItem` | `class DetailItem {` | +| 428 | `class` | `CommandEntry` | `class CommandEntry {` | ## lib/runtime -- Files: `67` -- Public symbols: `377` +- Files: `66` +- Public symbols: `372` ### `lib/runtime/account_runtime_client.dart` @@ -723,8 +720,8 @@ _No extracted public top-level symbols._ | Line | Kind | Name | Signature | | ---: | --- | --- | --- | | 1 | `class` | `AcpEndpointPaths` | `class AcpEndpointPaths {` | -| 51 | `top-level function` | `resolveAcpWebSocketEndpoint` | `Uri? resolveAcpWebSocketEndpoint(Uri? endpoint) {` | -| 69 | `top-level function` | `resolveAcpHttpRpcEndpoint` | `Uri? resolveAcpHttpRpcEndpoint(Uri? endpoint) {` | +| 72 | `top-level function` | `resolveAcpWebSocketEndpoint` | `Uri? resolveAcpWebSocketEndpoint(Uri? endpoint) {` | +| 93 | `top-level function` | `resolveAcpHttpRpcEndpoint` | `Uri? resolveAcpHttpRpcEndpoint(Uri? endpoint) {` | ### `lib/runtime/agent_registry.dart` @@ -740,26 +737,14 @@ _No extracted public top-level symbols._ | 153 | `class` | `AgentException` | `class AgentException implements Exception {` | | 165 | `class` | `AgentRegistry` | `class AgentRegistry with ChangeNotifier {` | -### `lib/runtime/aris_bundle.dart` - -- Language: `dart` -- Public symbols: `3` - -| Line | Kind | Name | Signature | -| ---: | --- | --- | --- | -| 9 | `class` | `ArisBundleManifest` | `class ArisBundleManifest {` | -| 69 | `class` | `ResolvedArisBundle` | `class ResolvedArisBundle {` | -| 98 | `class` | `ArisBundleRepository` | `class ArisBundleRepository {` | - ### `lib/runtime/aris_llm_chat_client.dart` - Language: `dart` -- Public symbols: `2` +- Public symbols: `1` | Line | Kind | Name | Signature | | ---: | --- | --- | --- | -| 8 | `typedef` | `ArisProcessStarter` | `typedef ArisProcessStarter = Future Function( String executable, List arguments, { Map? environment, String? workingDirectory, });` | -| 16 | `class` | `ArisLlmChatClient` | `class ArisLlmChatClient {` | +| 3 | `class` | `ArisLlmChatClient` | `class ArisLlmChatClient {` | ### `lib/runtime/assistant_artifacts.dart` @@ -807,22 +792,22 @@ _No extracted public top-level symbols._ | Line | Kind | Name | Signature | | ---: | --- | --- | --- | -| 12 | `enum` | `CodexSandboxMode` | `enum CodexSandboxMode {` | -| 22 | `enum` | `CodexApprovalPolicy` | `enum CodexApprovalPolicy {` | -| 32 | `enum` | `CodexAuthMode` | `enum CodexAuthMode {` | -| 42 | `class` | `CodexThread` | `class CodexThread {` | -| 75 | `class` | `CodexTurn` | `class CodexTurn {` | -| 106 | `class` | `CodexAccount` | `class CodexAccount {` | -| 137 | `class` | `CodexRateLimit` | `class CodexRateLimit {` | -| 160 | `class` | `CodexUserInput` | `class CodexUserInput {` | -| 180 | `class` | `CodexAttachment` | `class CodexAttachment {` | -| 198 | `class` | `CodexLogEvent` | `class CodexLogEvent extends CodexEvent {` | -| 211 | `class` | `CodexNotificationEvent` | `class CodexNotificationEvent extends CodexEvent {` | -| 219 | `class` | `CodexTurnEvent` | `class CodexTurnEvent extends CodexEvent {` | -| 253 | `class` | `CodexRpcError` | `class CodexRpcError implements Exception {` | -| 273 | `enum` | `CodexConnectionState` | `enum CodexConnectionState {` | -| 283 | `class` | `CodexRuntime` | `class CodexRuntime extends ChangeNotifier {` | -| 901 | `class` | `CodexLaunchConfiguration` | `class CodexLaunchConfiguration {` | +| 10 | `enum` | `CodexSandboxMode` | `enum CodexSandboxMode {` | +| 20 | `enum` | `CodexApprovalPolicy` | `enum CodexApprovalPolicy {` | +| 30 | `enum` | `CodexAuthMode` | `enum CodexAuthMode {` | +| 40 | `class` | `CodexThread` | `class CodexThread {` | +| 73 | `class` | `CodexTurn` | `class CodexTurn {` | +| 104 | `class` | `CodexAccount` | `class CodexAccount {` | +| 135 | `class` | `CodexRateLimit` | `class CodexRateLimit {` | +| 158 | `class` | `CodexUserInput` | `class CodexUserInput {` | +| 178 | `class` | `CodexAttachment` | `class CodexAttachment {` | +| 196 | `class` | `CodexLogEvent` | `class CodexLogEvent extends CodexEvent {` | +| 209 | `class` | `CodexNotificationEvent` | `class CodexNotificationEvent extends CodexEvent {` | +| 217 | `class` | `CodexTurnEvent` | `class CodexTurnEvent extends CodexEvent {` | +| 251 | `class` | `CodexRpcError` | `class CodexRpcError implements Exception {` | +| 271 | `enum` | `CodexConnectionState` | `enum CodexConnectionState {` | +| 281 | `class` | `CodexRuntime` | `class CodexRuntime extends ChangeNotifier {` | +| 629 | `class` | `CodexLaunchConfiguration` | `class CodexLaunchConfiguration {` | ### `lib/runtime/desktop_platform_service.dart` @@ -861,8 +846,8 @@ _No extracted public top-level symbols._ | Line | Kind | Name | Signature | | ---: | --- | --- | --- | -| 4 | `top-level function` | `shouldBlockEmbeddedAgentLaunch` | `bool shouldBlockEmbeddedAgentLaunch({ required bool isAppleHost, bool? enabled, }) {` | -| 14 | `top-level function` | `shouldBlockGoCoreLaunch` | `bool shouldBlockGoCoreLaunch( GoCoreLaunch _, { required bool isAppleHost, bool? enabled, }) {` | +| 6 | `top-level function` | `shouldBlockEmbeddedAgentLaunch` | `bool shouldBlockEmbeddedAgentLaunch({ required bool isAppleHost, bool? enabled, }) {` | +| 19 | `top-level function` | `shouldBlockGoCoreLaunch` | `bool shouldBlockGoCoreLaunch({ required bool isAppleHost, bool? enabled, }) {` | ### `lib/runtime/external_code_agent_acp_desktop_transport.dart` @@ -871,7 +856,7 @@ _No extracted public top-level symbols._ | Line | Kind | Name | Signature | | ---: | --- | --- | --- | -| 9 | `class` | `ExternalCodeAgentAcpDesktopTransport` | `class ExternalCodeAgentAcpDesktopTransport implements ExternalCodeAgentAcpTransport {` | +| 10 | `class` | `ExternalCodeAgentAcpDesktopTransport` | `class ExternalCodeAgentAcpDesktopTransport implements ExternalCodeAgentAcpTransport {` | ### `lib/runtime/file_store_support.dart` @@ -888,27 +873,29 @@ _No extracted public top-level symbols._ | 75 | `class` | `PersistentWriteFailures` | `class PersistentWriteFailures {` | | 92 | `class` | `StoreLayout` | `class StoreLayout {` | | 122 | `class` | `StoreLayoutResolver` | `class StoreLayoutResolver {` | -| 210 | `top-level function` | `normalizeStoreDirectoryPath` | `String normalizeStoreDirectoryPath(String path) {` | -| 227 | `top-level function` | `ensureDirectory` | `Future ensureDirectory(String path) async {` | -| 235 | `top-level function` | `ensureOwnerOnlyDirectory` | `Future ensureOwnerOnlyDirectory(Directory directory) async {` | -| 242 | `top-level function` | `ensureOwnerOnlyFile` | `Future ensureOwnerOnlyFile(File file) async {` | -| 249 | `top-level function` | `encodeStableFileKey` | `String encodeStableFileKey(String key) {` | -| 253 | `top-level function` | `atomicWriteString` | `Future atomicWriteString( File file, String contents, { bool ownerOnly = false, }) async {` | -| 275 | `top-level function` | `deleteIfExists` | `Future deleteIfExists(File file) async {` | -| 281 | `top-level function` | `decodeYamlDocument` | `Object? decodeYamlDocument(String raw) {` | -| 306 | `top-level function` | `encodeYamlDocument` | `String encodeYamlDocument(Object? value) {` | +| 220 | `top-level function` | `normalizeStoreDirectoryPath` | `String normalizeStoreDirectoryPath(String path) {` | +| 237 | `top-level function` | `ensureDirectory` | `Future ensureDirectory(String path) async {` | +| 245 | `top-level function` | `ensureOwnerOnlyDirectory` | `Future ensureOwnerOnlyDirectory(Directory directory) async {` | +| 252 | `top-level function` | `ensureOwnerOnlyFile` | `Future ensureOwnerOnlyFile(File file) async {` | +| 259 | `top-level function` | `encodeStableFileKey` | `String encodeStableFileKey(String key) {` | +| 263 | `top-level function` | `atomicWriteString` | `Future atomicWriteString( File file, String contents, { bool ownerOnly = false, }) async {` | +| 285 | `top-level function` | `deleteIfExists` | `Future deleteIfExists(File file) async {` | +| 291 | `top-level function` | `decodeYamlDocument` | `Object? decodeYamlDocument(String raw) {` | +| 316 | `top-level function` | `encodeYamlDocument` | `String encodeYamlDocument(Object? value) {` | ### `lib/runtime/gateway_acp_client.dart` - Language: `dart` -- Public symbols: `4` +- Public symbols: `6` | Line | Kind | Name | Signature | | ---: | --- | --- | --- | -| 8 | `class` | `GatewayAcpException` | `class GatewayAcpException implements Exception {` | -| 19 | `class` | `GatewayAcpCapabilities` | `class GatewayAcpCapabilities {` | -| 70 | `class` | `GatewayAcpMultiAgentRequest` | `class GatewayAcpMultiAgentRequest {` | -| 90 | `class` | `GatewayAcpClient` | `class GatewayAcpClient {` | +| 16 | `class` | `GatewayAcpException` | `class GatewayAcpException implements Exception {` | +| 33 | `class` | `GatewayAcpCapabilities` | `class GatewayAcpCapabilities {` | +| 91 | `class` | `GatewayAcpMultiAgentRequest` | `class GatewayAcpMultiAgentRequest {` | +| 111 | `class` | `GatewayAcpClient` | `class GatewayAcpClient {` | +| 1392 | `top-level function` | `gatewayAcpHttpResponseTimeoutFor` | `Duration gatewayAcpHttpResponseTimeoutFor( Uri endpoint, String method, [ Map params = const {}, ]) {` | +| 1412 | `top-level function` | `gatewayAcpTaskRuntimeBudgetMinutesForParams` | `int gatewayAcpTaskRuntimeBudgetMinutesForParams(Map params) {` | ### `lib/runtime/gateway_runtime.dart` @@ -933,7 +920,7 @@ _No extracted public top-level symbols._ | Line | Kind | Name | Signature | | ---: | --- | --- | --- | -| 24 | `class` | `GatewayRuntime` | `class GatewayRuntime extends ChangeNotifier with GatewayRuntimeHelpersInternal {` | +| 25 | `class` | `GatewayRuntime` | `class GatewayRuntime extends ChangeNotifier with GatewayRuntimeHelpersInternal {` | ### `lib/runtime/gateway_runtime_errors.dart` @@ -962,21 +949,21 @@ _No extracted public top-level symbols._ | ---: | --- | --- | --- | | 21 | `top-level function` | `formatGatewayConnectAuthSummary` | `String formatGatewayConnectAuthSummary({ required String mode, required List fields, required List sources, }) {` | | 31 | `mixin` | `GatewayRuntimeHelpersInternal` | `mixin GatewayRuntimeHelpersInternal on ChangeNotifier {` | -| 554 | `class` | `GatewaySetupPayload` | `class GatewaySetupPayload {` | -| 570 | `top-level function` | `decodeGatewaySetupCode` | `GatewaySetupPayload? decodeGatewaySetupCode(String rawInput) {` | -| 590 | `top-level function` | `decodeSetupPayloadJsonInternal` | `GatewaySetupPayload? decodeSetupPayloadJsonInternal(String raw) {` | -| 615 | `top-level function` | `resolveSetupCodeCandidateInternal` | `String resolveSetupCodeCandidateInternal(String raw) {` | -| 650 | `top-level function` | `composeManualUrlInternal` | `String? composeManualUrlInternal(String? host, int? port, bool? tls) {` | -| 660 | `top-level function` | `asMap` | `Map asMap(Object? value) {` | -| 670 | `top-level function` | `asList` | `List asList(Object? value) {` | -| 680 | `top-level function` | `stringValue` | `String? stringValue(Object? value) {` | -| 688 | `top-level function` | `boolValue` | `bool? boolValue(Object? value) {` | -| 703 | `top-level function` | `intValue` | `int? intValue(Object? value) {` | -| 716 | `top-level function` | `doubleValue` | `double? doubleValue(Object? value) {` | -| 729 | `top-level function` | `stringList` | `List stringList(Object? value) {` | -| 735 | `top-level function` | `extractMessageText` | `String extractMessageText(Map message) {` | -| 756 | `top-level function` | `randomIdInternal` | `String randomIdInternal() {` | -| 766 | `class` | `RpcResponseInternal` | `class RpcResponseInternal {` | +| 561 | `class` | `GatewaySetupPayload` | `class GatewaySetupPayload {` | +| 577 | `top-level function` | `decodeGatewaySetupCode` | `GatewaySetupPayload? decodeGatewaySetupCode(String rawInput) {` | +| 597 | `top-level function` | `decodeSetupPayloadJsonInternal` | `GatewaySetupPayload? decodeSetupPayloadJsonInternal(String raw) {` | +| 622 | `top-level function` | `resolveSetupCodeCandidateInternal` | `String resolveSetupCodeCandidateInternal(String raw) {` | +| 657 | `top-level function` | `composeManualUrlInternal` | `String? composeManualUrlInternal(String? host, int? port, bool? tls) {` | +| 667 | `top-level function` | `asMap` | `Map asMap(Object? value) {` | +| 677 | `top-level function` | `asList` | `List asList(Object? value) {` | +| 687 | `top-level function` | `stringValue` | `String? stringValue(Object? value) {` | +| 695 | `top-level function` | `boolValue` | `bool? boolValue(Object? value) {` | +| 710 | `top-level function` | `intValue` | `int? intValue(Object? value) {` | +| 723 | `top-level function` | `doubleValue` | `double? doubleValue(Object? value) {` | +| 736 | `top-level function` | `stringList` | `List stringList(Object? value) {` | +| 742 | `top-level function` | `extractMessageText` | `String extractMessageText(Map message) {` | +| 763 | `top-level function` | `randomIdInternal` | `String randomIdInternal() {` | +| 773 | `class` | `RpcResponseInternal` | `class RpcResponseInternal {` | ### `lib/runtime/gateway_runtime_protocol.dart` @@ -1007,10 +994,10 @@ _No extracted public top-level symbols._ | Line | Kind | Name | Signature | | ---: | --- | --- | --- | -| 3 | `enum` | `GoCoreLaunchSource` | `enum GoCoreLaunchSource { buildArtifact }` | -| 5 | `class` | `GoCoreLaunch` | `class GoCoreLaunch {` | -| 19 | `typedef` | `GoCoreBinaryExistsResolver` | `typedef GoCoreBinaryExistsResolver = Future Function(String command);` | -| 21 | `class` | `GoCoreLocator` | `class GoCoreLocator {` | +| 4 | `enum` | `GoCoreLaunchSource` | `enum GoCoreLaunchSource { buildArtifact }` | +| 7 | `class` | `GoCoreLaunch` | `class GoCoreLaunch {` | +| 21 | `typedef` | `GoCoreBinaryExistsResolver` | `typedef GoCoreBinaryExistsResolver = Future Function(String command);` | +| 24 | `class` | `GoCoreLocator` | `class GoCoreLocator {` | ### `lib/runtime/go_multi_agent_mount_desktop_client.dart` @@ -1046,16 +1033,16 @@ _No extracted public top-level symbols._ | 107 | `class` | `ExternalCodeAgentAcpRoutingConfig` | `class ExternalCodeAgentAcpRoutingConfig {` | | 167 | `class` | `ExternalCodeAgentAcpSkillInstallApproval` | `class ExternalCodeAgentAcpSkillInstallApproval {` | | 187 | `class` | `GoTaskServiceRequest` | `class GoTaskServiceRequest {` | -| 357 | `class` | `GoTaskServiceUpdate` | `class GoTaskServiceUpdate {` | -| 386 | `class` | `GoTaskServiceArtifact` | `class GoTaskServiceArtifact {` | -| 433 | `class` | `GoTaskServiceResult` | `class GoTaskServiceResult {` | -| 540 | `top-level function` | `goTaskServiceGatewayEntryState` | `String? goTaskServiceGatewayEntryState({ required AssistantExecutionTarget requestedTarget, required GoTaskServiceResult result, }) {` | -| 575 | `abstract interface` | `ExternalCodeAgentAcpTransport` | `abstract class ExternalCodeAgentAcpTransport {` | -| 607 | `abstract interface` | `GoTaskServiceClient` | `abstract class GoTaskServiceClient {` | -| 641 | `top-level function` | `goTaskServiceUpdateFromAcpNotification` | `GoTaskServiceUpdate? goTaskServiceUpdateFromAcpNotification( Map notification, ) {` | -| 682 | `top-level function` | `goTaskServiceResultFromAcpResponse` | `GoTaskServiceResult goTaskServiceResultFromAcpResponse( Map response, { required GoTaskServiceRoute route, String streamedText = '', String? completedMessage, }) {` | -| 743 | `top-level function` | `mergeGoTaskServiceResponseResult` | `Map mergeGoTaskServiceResponseResult( Map response, Map overlay, ) {` | -| 767 | `top-level function` | `goTaskServiceBase64Size` | `int goTaskServiceBase64Size(String base64) {` | +| 359 | `class` | `GoTaskServiceUpdate` | `class GoTaskServiceUpdate {` | +| 388 | `class` | `GoTaskServiceArtifact` | `class GoTaskServiceArtifact {` | +| 443 | `class` | `GoTaskServiceResult` | `class GoTaskServiceResult {` | +| 577 | `top-level function` | `goTaskServiceGatewayEntryState` | `String? goTaskServiceGatewayEntryState({ required AssistantExecutionTarget requestedTarget, required GoTaskServiceResult result, }) {` | +| 612 | `abstract interface` | `ExternalCodeAgentAcpTransport` | `abstract class ExternalCodeAgentAcpTransport {` | +| 644 | `abstract interface` | `GoTaskServiceClient` | `abstract class GoTaskServiceClient {` | +| 678 | `top-level function` | `goTaskServiceUpdateFromAcpNotification` | `GoTaskServiceUpdate? goTaskServiceUpdateFromAcpNotification( Map notification, ) {` | +| 719 | `top-level function` | `goTaskServiceResultFromAcpResponse` | `GoTaskServiceResult goTaskServiceResultFromAcpResponse( Map response, { required GoTaskServiceRoute route, String streamedText = '', String? completedMessage, }) {` | +| 913 | `top-level function` | `mergeGoTaskServiceResponseResult` | `Map mergeGoTaskServiceResponseResult( Map response, Map overlay, ) {` | +| 937 | `top-level function` | `goTaskServiceBase64Size` | `int goTaskServiceBase64Size(String base64) {` | ### `lib/runtime/go_task_service_desktop_service.dart` @@ -1086,9 +1073,9 @@ _No extracted public top-level symbols._ | Line | Kind | Name | Signature | | ---: | --- | --- | --- | -| 6 | `abstract interface` | `FrameworkPreset` | `abstract class FrameworkPreset {` | -| 19 | `class` | `NativeFrameworkPreset` | `class NativeFrameworkPreset extends FrameworkPreset {` | -| 48 | `class` | `ArisFrameworkPreset` | `class ArisFrameworkPreset extends FrameworkPreset {` | +| 3 | `abstract interface` | `FrameworkPreset` | `abstract class FrameworkPreset {` | +| 16 | `class` | `NativeFrameworkPreset` | `class NativeFrameworkPreset extends FrameworkPreset {` | +| 45 | `class` | `ArisFrameworkPreset` | `class ArisFrameworkPreset extends FrameworkPreset {` | ### `lib/runtime/multi_agent_mount_resolver.dart` @@ -1103,18 +1090,17 @@ _No extracted public top-level symbols._ ### `lib/runtime/multi_agent_mounts.dart` - Language: `dart` -- Public symbols: `8` +- Public symbols: `7` | Line | Kind | Name | Signature | | ---: | --- | --- | --- | -| 11 | `class` | `MultiAgentMountManager` | `class MultiAgentMountManager {` | -| 139 | `abstract interface` | `CliMountAdapter` | `abstract class CliMountAdapter {` | -| 191 | `class` | `ArisMountAdapter` | `class ArisMountAdapter extends CliMountAdapter {` | -| 277 | `class` | `CodexMountAdapter` | `class CodexMountAdapter extends CliMountAdapter {` | -| 350 | `class` | `ClaudeMountAdapter` | `class ClaudeMountAdapter extends CliMountAdapter {` | -| 398 | `class` | `GeminiMountAdapter` | `class GeminiMountAdapter extends CliMountAdapter {` | -| 446 | `class` | `OpencodeMountAdapter` | `class OpencodeMountAdapter extends CliMountAdapter {` | -| 515 | `class` | `OpenClawMountAdapter` | `class OpenClawMountAdapter extends CliMountAdapter {` | +| 9 | `class` | `MultiAgentMountManager` | `class MultiAgentMountManager {` | +| 90 | `abstract interface` | `CliMountAdapter` | `abstract class CliMountAdapter {` | +| 112 | `class` | `CodexMountAdapter` | `class CodexMountAdapter extends CliMountAdapter {` | +| 154 | `class` | `ClaudeMountAdapter` | `class ClaudeMountAdapter extends CliMountAdapter {` | +| 193 | `class` | `GeminiMountAdapter` | `class GeminiMountAdapter extends CliMountAdapter {` | +| 232 | `class` | `OpencodeMountAdapter` | `class OpencodeMountAdapter extends CliMountAdapter {` | +| 273 | `class` | `OpenClawMountAdapter` | `class OpenClawMountAdapter extends CliMountAdapter {` | ### `lib/runtime/multi_agent_orchestrator.dart` @@ -1130,7 +1116,7 @@ _No extracted public top-level symbols._ | Line | Kind | Name | Signature | | ---: | --- | --- | --- | -| 24 | `class` | `MultiAgentOrchestrator` | `class MultiAgentOrchestrator extends ChangeNotifier {` | +| 20 | `class` | `MultiAgentOrchestrator` | `class MultiAgentOrchestrator extends ChangeNotifier {` | ### `lib/runtime/multi_agent_orchestrator_protocol.dart` @@ -1216,16 +1202,14 @@ _No extracted public top-level symbols._ ### `lib/runtime/runtime_controllers_derived_tasks.dart` - Language: `dart` -- Public symbols: `6` +- Public symbols: `4` | Line | Kind | Name | Signature | | ---: | --- | --- | --- | -| 14 | `class` | `DerivedTasksController` | `class DerivedTasksController extends ChangeNotifier {` | -| 150 | `top-level function` | `normalizeMainSessionKey` | `String normalizeMainSessionKey(String? value) {` | -| 155 | `top-level function` | `makeAgentSessionKey` | `String makeAgentSessionKey({required String agentId, required String baseKey}) {` | -| 164 | `top-level function` | `matchesSessionKey` | `bool matchesSessionKey(String incoming, String current) {` | -| 174 | `top-level function` | `encodePrettyJson` | `String encodePrettyJson(Object value) {` | -| 179 | `top-level function` | `ephemeralIdInternal` | `String ephemeralIdInternal() =>` | +| 6 | `class` | `DerivedTasksController` | `class DerivedTasksController extends ChangeNotifier {` | +| 142 | `top-level function` | `matchesSessionKey` | `bool matchesSessionKey(String incoming, String current) {` | +| 148 | `top-level function` | `encodePrettyJson` | `String encodePrettyJson(Object value) {` | +| 153 | `top-level function` | `ephemeralIdInternal` | `String ephemeralIdInternal() =>` | ### `lib/runtime/runtime_controllers_entities.dart` @@ -1249,7 +1233,7 @@ _No extracted public top-level symbols._ | 14 | `class` | `AiGatewayResponseExceptionInternal` | `class AiGatewayResponseExceptionInternal implements Exception {` | | 24 | `class` | `GatewayAgentsController` | `class GatewayAgentsController extends ChangeNotifier {` | | 89 | `class` | `GatewaySessionsController` | `class GatewaySessionsController extends ChangeNotifier {` | -| 173 | `class` | `GatewayChatController` | `class GatewayChatController extends ChangeNotifier {` | +| 146 | `class` | `GatewayChatController` | `class GatewayChatController extends ChangeNotifier {` | ### `lib/runtime/runtime_controllers_settings.dart` @@ -1258,7 +1242,7 @@ _No extracted public top-level symbols._ | Line | Kind | Name | Signature | | ---: | --- | --- | --- | -| 20 | `class` | `SettingsController` | `class SettingsController extends ChangeNotifier {` | +| 21 | `class` | `SettingsController` | `class SettingsController extends ChangeNotifier {` | ### `lib/runtime/runtime_controllers_settings_account.dart` @@ -1272,7 +1256,7 @@ _No extracted public top-level symbols._ ### `lib/runtime/runtime_controllers_settings_account_impl.dart` - Language: `dart` -- Public symbols: `8` +- Public symbols: `9` | Line | Kind | Name | Signature | | ---: | --- | --- | --- | @@ -1282,8 +1266,9 @@ _No extracted public top-level symbols._ | 158 | `top-level function` | `restoreAccountSessionSettingsInternal` | `Future restoreAccountSessionSettingsInternal( SettingsController controller, { String baseUrl = '', bool quiet = false, }) async {` | | 225 | `top-level function` | `syncAccountSettingsInternal` | `Future syncAccountSettingsInternal( SettingsController controller, { String baseUrl = '', bool quiet = false, Map profilePayloadOverride = const {}, }) async {` | | 371 | `top-level function` | `logoutAccountSettingsInternal` | `Future logoutAccountSettingsInternal( SettingsController controller, { String statusMessage = 'Signed out', bool quiet = false, }) async {` | -| 414 | `top-level function` | `cancelAccountMfaChallengeSettingsInternal` | `Future cancelAccountMfaChallengeSettingsInternal( SettingsController controller, ) async {` | -| 444 | `top-level function` | `normalizeAccountBaseUrlSettingsInternal` | `String normalizeAccountBaseUrlSettingsInternal( String raw, { String fallback = '', }) {` | +| 424 | `top-level function` | `cancelAccountMfaChallengeSettingsInternal` | `Future cancelAccountMfaChallengeSettingsInternal( SettingsController controller, ) async {` | +| 454 | `top-level function` | `normalizeAccountBaseUrlSettingsInternal` | `String normalizeAccountBaseUrlSettingsInternal( String raw, { String fallback = '', }) {` | +| 574 | `top-level function` | `resolveAcpBridgeServerEffectiveConfigInternal` | `AcpBridgeServerEffectiveConfig resolveAcpBridgeServerEffectiveConfigInternal( SettingsController controller, { required AcpBridgeServerModeConfig config, }) {` | ### `lib/runtime/runtime_controllers_settings_connectivity_impl.dart` @@ -1310,28 +1295,28 @@ _No extracted public top-level symbols._ | 3 | `top-level function` | `saveGatewaySecretsSettingsInternal` | `Future saveGatewaySecretsSettingsInternal( SettingsController controller, { int? profileIndex, required String token, required String password, }) async {` | | 61 | `top-level function` | `clearGatewaySecretsSettingsInternal` | `Future clearGatewaySecretsSettingsInternal( SettingsController controller, { int? profileIndex, bool token = false, bool password = false, }) async {` | | 115 | `top-level function` | `loadGatewayTokenSettingsInternal` | `Future loadGatewayTokenSettingsInternal( SettingsController controller, { int? profileIndex, }) async {` | -| 141 | `top-level function` | `loadGatewayPasswordSettingsInternal` | `Future loadGatewayPasswordSettingsInternal( SettingsController controller, { int? profileIndex, }) async {` | -| 167 | `top-level function` | `hasStoredGatewayTokenForProfileSettingsInternal` | `bool hasStoredGatewayTokenForProfileSettingsInternal( SettingsController controller, int profileIndex, ) =>` | -| 179 | `top-level function` | `hasStoredGatewayPasswordForProfileSettingsInternal` | `bool hasStoredGatewayPasswordForProfileSettingsInternal( SettingsController controller, int profileIndex, ) => controller.secureRefsInternal.containsKey( gatewayPasswordRefForProfileSettingsInternal(controller, profileIndex), );` | -| 186 | `top-level function` | `storedGatewayTokenMaskForProfileSettingsInternal` | `String? storedGatewayTokenMaskForProfileSettingsInternal( SettingsController controller, int profileIndex, ) =>` | -| 199 | `top-level function` | `storedGatewayPasswordMaskForProfileSettingsInternal` | `String? storedGatewayPasswordMaskForProfileSettingsInternal( SettingsController controller, int profileIndex, ) =>` | -| 208 | `top-level function` | `gatewayTokenRefForProfileSettingsInternal` | `String gatewayTokenRefForProfileSettingsInternal( SettingsController controller, int profileIndex, ) {` | -| 221 | `top-level function` | `gatewayPasswordRefForProfileSettingsInternal` | `String gatewayPasswordRefForProfileSettingsInternal( SettingsController controller, int profileIndex, ) {` | -| 234 | `top-level function` | `aiGatewayApiKeyRefSettingsInternal` | `String aiGatewayApiKeyRefSettingsInternal( SettingsController controller, [ AiGatewayProfile? profile, ]) {` | -| 243 | `top-level function` | `vaultTokenRefSettingsInternal` | `String vaultTokenRefSettingsInternal( SettingsController controller, [ VaultConfig? profile, ]) {` | -| 252 | `top-level function` | `ollamaCloudApiKeyRefSettingsInternal` | `String ollamaCloudApiKeyRefSettingsInternal( SettingsController controller, [ OllamaCloudConfig? profile, ]) {` | -| 261 | `top-level function` | `saveOllamaCloudApiKeySettingsInternal` | `Future saveOllamaCloudApiKeySettingsInternal( SettingsController controller, String value, ) async {` | -| 287 | `top-level function` | `loadOllamaCloudApiKeySettingsInternal` | `Future loadOllamaCloudApiKeySettingsInternal( SettingsController controller, ) async {` | -| 304 | `top-level function` | `saveVaultTokenSettingsInternal` | `Future saveVaultTokenSettingsInternal( SettingsController controller, String value, ) async {` | -| 330 | `top-level function` | `loadVaultTokenSettingsInternal` | `Future loadVaultTokenSettingsInternal( SettingsController controller, ) async {` | -| 346 | `top-level function` | `saveAiGatewayApiKeySettingsInternal` | `Future saveAiGatewayApiKeySettingsInternal( SettingsController controller, String value, ) async {` | -| 372 | `top-level function` | `loadAiGatewayApiKeySettingsInternal` | `Future loadAiGatewayApiKeySettingsInternal( SettingsController controller, ) async {` | -| 388 | `top-level function` | `clearAiGatewayApiKeySettingsInternal` | `Future clearAiGatewayApiKeySettingsInternal( SettingsController controller, ) async {` | -| 398 | `top-level function` | `saveSecretValueByRefSettingsInternal` | `Future saveSecretValueByRefSettingsInternal( SettingsController controller, String refName, String value, { required String provider, required String module, }) async {` | -| 425 | `top-level function` | `loadSecretValueByRefSettingsInternal` | `Future loadSecretValueByRefSettingsInternal( SettingsController controller, String refName, ) async {` | -| 435 | `top-level function` | `loadVaultTokenForSecretReadsSettingsInternal` | `Future loadVaultTokenForSecretReadsSettingsInternal( SettingsController controller, { String tokenOverride = '', }) async {` | -| 454 | `top-level function` | `readVaultSecretByRefSettingsInternal` | `Future readVaultSecretByRefSettingsInternal( SettingsController controller, String refName, ) async {` | -| 484 | `top-level function` | `resolveSecretValueSettingsInternal` | `Future resolveSecretValueSettingsInternal( SettingsController controller, { String explicitValue = '', String refName = '', String fallbackRefName = '', String accountTarget = '', bool allowVaultLookup = true, bool persistExplicitValue = true, }) async {` | +| 127 | `top-level function` | `loadGatewayPasswordSettingsInternal` | `Future loadGatewayPasswordSettingsInternal( SettingsController controller, { int? profileIndex, }) async {` | +| 139 | `top-level function` | `hasStoredGatewayTokenForProfileSettingsInternal` | `bool hasStoredGatewayTokenForProfileSettingsInternal( SettingsController controller, int profileIndex, ) =>` | +| 151 | `top-level function` | `hasStoredGatewayPasswordForProfileSettingsInternal` | `bool hasStoredGatewayPasswordForProfileSettingsInternal( SettingsController controller, int profileIndex, ) => controller.secureRefsInternal.containsKey( gatewayPasswordRefForProfileSettingsInternal(controller, profileIndex), );` | +| 158 | `top-level function` | `storedGatewayTokenMaskForProfileSettingsInternal` | `String? storedGatewayTokenMaskForProfileSettingsInternal( SettingsController controller, int profileIndex, ) =>` | +| 171 | `top-level function` | `storedGatewayPasswordMaskForProfileSettingsInternal` | `String? storedGatewayPasswordMaskForProfileSettingsInternal( SettingsController controller, int profileIndex, ) =>` | +| 180 | `top-level function` | `gatewayTokenRefForProfileSettingsInternal` | `String gatewayTokenRefForProfileSettingsInternal( SettingsController controller, int profileIndex, ) {` | +| 193 | `top-level function` | `gatewayPasswordRefForProfileSettingsInternal` | `String gatewayPasswordRefForProfileSettingsInternal( SettingsController controller, int profileIndex, ) {` | +| 206 | `top-level function` | `aiGatewayApiKeyRefSettingsInternal` | `String aiGatewayApiKeyRefSettingsInternal( SettingsController controller, [ AiGatewayProfile? profile, ]) {` | +| 215 | `top-level function` | `vaultTokenRefSettingsInternal` | `String vaultTokenRefSettingsInternal( SettingsController controller, [ VaultConfig? profile, ]) {` | +| 224 | `top-level function` | `ollamaCloudApiKeyRefSettingsInternal` | `String ollamaCloudApiKeyRefSettingsInternal( SettingsController controller, [ OllamaCloudConfig? profile, ]) {` | +| 233 | `top-level function` | `saveOllamaCloudApiKeySettingsInternal` | `Future saveOllamaCloudApiKeySettingsInternal( SettingsController controller, String value, ) async {` | +| 259 | `top-level function` | `loadOllamaCloudApiKeySettingsInternal` | `Future loadOllamaCloudApiKeySettingsInternal( SettingsController controller, ) async {` | +| 267 | `top-level function` | `saveVaultTokenSettingsInternal` | `Future saveVaultTokenSettingsInternal( SettingsController controller, String value, ) async {` | +| 293 | `top-level function` | `loadVaultTokenSettingsInternal` | `Future loadVaultTokenSettingsInternal( SettingsController controller, ) async {` | +| 301 | `top-level function` | `saveAiGatewayApiKeySettingsInternal` | `Future saveAiGatewayApiKeySettingsInternal( SettingsController controller, String value, ) async {` | +| 327 | `top-level function` | `loadAiGatewayApiKeySettingsInternal` | `Future loadAiGatewayApiKeySettingsInternal( SettingsController controller, ) async {` | +| 335 | `top-level function` | `clearAiGatewayApiKeySettingsInternal` | `Future clearAiGatewayApiKeySettingsInternal( SettingsController controller, ) async {` | +| 345 | `top-level function` | `saveSecretValueByRefSettingsInternal` | `Future saveSecretValueByRefSettingsInternal( SettingsController controller, String refName, String value, { required String provider, required String module, }) async {` | +| 372 | `top-level function` | `loadSecretValueByRefSettingsInternal` | `Future loadSecretValueByRefSettingsInternal( SettingsController controller, String refName, ) async {` | +| 382 | `top-level function` | `loadVaultTokenForSecretReadsSettingsInternal` | `Future loadVaultTokenForSecretReadsSettingsInternal( SettingsController controller, { String tokenOverride = '', }) async {` | +| 393 | `top-level function` | `readVaultSecretByRefSettingsInternal` | `Future readVaultSecretByRefSettingsInternal( SettingsController controller, String refName, ) async {` | +| 423 | `top-level function` | `resolveSecretValueSettingsInternal` | `Future resolveSecretValueSettingsInternal( SettingsController controller, { String explicitValue = '', String refName = '', String fallbackRefName = '', String accountTarget = '', bool allowVaultLookup = true, bool persistExplicitValue = true, }) async {` | ### `lib/runtime/runtime_coordinator.dart` @@ -1341,7 +1326,7 @@ _No extracted public top-level symbols._ | Line | Kind | Name | Signature | | ---: | --- | --- | --- | | 17 | `enum` | `CoordinatorState` | `enum CoordinatorState { disconnected, connecting, connected, ready, error }` | -| 26 | `class` | `RuntimeCoordinator` | `class RuntimeCoordinator extends ChangeNotifier {` | +| 20 | `class` | `RuntimeCoordinator` | `class RuntimeCoordinator extends ChangeNotifier {` | ### `lib/runtime/runtime_dispatch_resolver.dart` @@ -1374,22 +1359,22 @@ _No extracted public top-level symbols._ ### `lib/runtime/runtime_models_account.dart` - Language: `dart` -- Public symbols: `13` +- Public symbols: `12` | Line | Kind | Name | Signature | | ---: | --- | --- | --- | -| 4 | `class` | `AccountSessionSummary` | `class AccountSessionSummary {` | -| 68 | `class` | `AccountTokenConfigured` | `class AccountTokenConfigured {` | -| 108 | `class` | `AccountSecretLocator` | `class AccountSecretLocator {` | -| 166 | `class` | `AccountRemoteProfile` | `class AccountRemoteProfile {` | -| 269 | `class` | `AcpBridgeServerRemoteServerSummary` | `class AcpBridgeServerRemoteServerSummary {` | -| 312 | `class` | `AcpBridgeServerCloudSyncConfig` | `class AcpBridgeServerCloudSyncConfig {` | -| 370 | `class` | `AcpBridgeServerSelfHostedConfig` | `class AcpBridgeServerSelfHostedConfig {` | -| 423 | `class` | `AcpBridgeServerAdvancedOverrides` | `class AcpBridgeServerAdvancedOverrides {` | -| 509 | `class` | `AcpBridgeServerModeConfig` | `class AcpBridgeServerModeConfig {` | -| 577 | `class` | `AccountSyncState` | `class AccountSyncState {` | -| 667 | `class` | `AccountSyncResult` | `class AccountSyncResult {` | -| 686 | `top-level function` | `isSupportedAccountManagedSecretTarget` | `bool isSupportedAccountManagedSecretTarget(String target) {` | +| 3 | `class` | `AccountSessionSummary` | `class AccountSessionSummary {` | +| 67 | `class` | `AccountTokenConfigured` | `class AccountTokenConfigured {` | +| 96 | `class` | `AccountSecretLocator` | `class AccountSecretLocator {` | +| 154 | `class` | `AccountRemoteProfile` | `class AccountRemoteProfile {` | +| 248 | `class` | `AcpBridgeServerRemoteServerSummary` | `class AcpBridgeServerRemoteServerSummary {` | +| 276 | `class` | `AcpBridgeServerCloudSyncConfig` | `class AcpBridgeServerCloudSyncConfig {` | +| 334 | `class` | `AcpBridgeServerSelfHostedConfig` | `class AcpBridgeServerSelfHostedConfig {` | +| 387 | `class` | `AcpBridgeServerEffectiveConfig` | `class AcpBridgeServerEffectiveConfig {` | +| 442 | `class` | `AcpBridgeServerModeConfig` | `class AcpBridgeServerModeConfig {` | +| 498 | `class` | `AccountSyncState` | `class AccountSyncState {` | +| 588 | `class` | `AccountSyncResult` | `class AccountSyncResult {` | +| 607 | `top-level function` | `isSupportedAccountManagedSecretTarget` | `bool isSupportedAccountManagedSecretTarget(String target) {` | ### `lib/runtime/runtime_models_configs.dart` @@ -1399,16 +1384,16 @@ _No extracted public top-level symbols._ | Line | Kind | Name | Signature | | ---: | --- | --- | --- | | 13 | `class` | `GatewayConnectionProfile` | `class GatewayConnectionProfile {` | -| 136 | `top-level function` | `normalizeGatewayProfiles` | `List normalizeGatewayProfiles({ Iterable? profiles, }) {` | -| 214 | `top-level function` | `replaceGatewayProfileAt` | `List replaceGatewayProfileAt( List profiles, int index, GatewayConnectionProfile profile, ) {` | -| 260 | `class` | `OllamaLocalConfig` | `class OllamaLocalConfig {` | -| 311 | `class` | `OllamaCloudConfig` | `class OllamaCloudConfig {` | -| 378 | `class` | `VaultConfig` | `class VaultConfig {` | -| 434 | `class` | `AiGatewayProfile` | `class AiGatewayProfile {` | -| 532 | `class` | `AiGatewayConnectionCheck` | `class AiGatewayConnectionCheck {` | -| 548 | `enum` | `WebSessionPersistenceMode` | `enum WebSessionPersistenceMode { browser, remote }` | -| 550 | `extension` | `WebSessionPersistenceModeCopy` | `extension WebSessionPersistenceModeCopy on WebSessionPersistenceMode {` | -| 567 | `class` | `WebSessionPersistenceConfig` | `class WebSessionPersistenceConfig {` | +| 121 | `top-level function` | `normalizeGatewayProfiles` | `List normalizeGatewayProfiles({ Iterable? profiles, }) {` | +| 162 | `top-level function` | `replaceGatewayProfileAt` | `List replaceGatewayProfileAt( List profiles, int _, GatewayConnectionProfile profile, ) {` | +| 206 | `class` | `OllamaLocalConfig` | `class OllamaLocalConfig {` | +| 257 | `class` | `OllamaCloudConfig` | `class OllamaCloudConfig {` | +| 324 | `class` | `VaultConfig` | `class VaultConfig {` | +| 380 | `class` | `AiGatewayProfile` | `class AiGatewayProfile {` | +| 473 | `class` | `AiGatewayConnectionCheck` | `class AiGatewayConnectionCheck {` | +| 489 | `enum` | `WebSessionPersistenceMode` | `enum WebSessionPersistenceMode { browser, remote }` | +| 491 | `extension` | `WebSessionPersistenceModeCopy` | `extension WebSessionPersistenceModeCopy on WebSessionPersistenceMode {` | +| 508 | `class` | `WebSessionPersistenceConfig` | `class WebSessionPersistenceConfig {` | ### `lib/runtime/runtime_models_connection.dart` @@ -1540,11 +1525,11 @@ _No extracted public top-level symbols._ | 711 | `top-level function` | `assistantExecutionTargetFromExecutionMode` | `AssistantExecutionTarget assistantExecutionTargetFromExecutionMode( ThreadExecutionMode mode, ) {` | | 720 | `top-level function` | `workspaceRefKindFromWorkspaceKind` | `WorkspaceRefKind workspaceRefKindFromWorkspaceKind(WorkspaceKind kind) {` | | 727 | `class` | `ThreadContextState` | `class ThreadContextState {` | -| 904 | `class` | `ThreadLifecycleState` | `class ThreadLifecycleState {` | -| 960 | `class` | `TaskThread` | `class TaskThread {` | -| 1291 | `top-level function` | `isNewConversationTaskTitle` | `bool isNewConversationTaskTitle(String title) {` | -| 1296 | `top-level function` | `firstUserMessageTaskTitle` | `String firstUserMessageTaskTitle( Iterable messages, { String fallback = '', }) {` | -| 1318 | `top-level function` | `derivePersistedTaskTitle` | `String derivePersistedTaskTitle( String currentTitle, Iterable messages, { String fallback = '', bool hasCustomTitle = false, }) {` | +| 935 | `class` | `ThreadLifecycleState` | `class ThreadLifecycleState {` | +| 991 | `class` | `TaskThread` | `class TaskThread {` | +| 1332 | `top-level function` | `isNewConversationTaskTitle` | `bool isNewConversationTaskTitle(String title) {` | +| 1337 | `top-level function` | `firstUserMessageTaskTitle` | `String firstUserMessageTaskTitle( Iterable messages, { String fallback = '', }) {` | +| 1359 | `top-level function` | `derivePersistedTaskTitle` | `String derivePersistedTaskTitle( String currentTitle, Iterable messages, { String fallback = '', bool hasCustomTitle = false, }) {` | ### `lib/runtime/runtime_models_settings_snapshot.dart` @@ -1553,7 +1538,7 @@ _No extracted public top-level symbols._ | Line | Kind | Name | Signature | | ---: | --- | --- | --- | -| 16 | `class` | `SettingsSnapshot` | `class SettingsSnapshot {` | +| 17 | `class` | `SettingsSnapshot` | `class SettingsSnapshot {` | ### `lib/runtime/runtime_models_ui_state.dart` @@ -1583,7 +1568,7 @@ _No extracted public top-level symbols._ | Line | Kind | Name | Signature | | ---: | --- | --- | --- | -| 13 | `class` | `SecureConfigStore` | `class SecureConfigStore {` | +| 9 | `class` | `SecureConfigStore` | `class SecureConfigStore {` | ### `lib/runtime/settings_store.dart` @@ -1594,9 +1579,9 @@ _No extracted public top-level symbols._ | ---: | --- | --- | --- | | 8 | `enum` | `SettingsSnapshotReloadStatus` | `enum SettingsSnapshotReloadStatus { applied, invalid }` | | 10 | `class` | `SettingsSnapshotReloadResult` | `class SettingsSnapshotReloadResult {` | -| 22 | `enum` | `SkippedTaskThreadReason` | `enum SkippedTaskThreadReason {` | -| 28 | `class` | `SkippedTaskThreadRecord` | `class SkippedTaskThreadRecord {` | -| 35 | `class` | `SettingsStore` | `class SettingsStore {` | +| 20 | `enum` | `SkippedTaskThreadReason` | `enum SkippedTaskThreadReason {` | +| 26 | `class` | `SkippedTaskThreadRecord` | `class SkippedTaskThreadRecord {` | +| 36 | `class` | `SettingsStore` | `class SettingsStore {` | ### `lib/runtime/skill_directory_access.dart` @@ -1649,7 +1634,7 @@ _No extracted public top-level symbols._ ## rust/src - Files: `4` -- Public symbols: `19` +- Public symbols: `16` ### `rust/src/error.rs` @@ -1692,12 +1677,9 @@ _No extracted public top-level symbols._ ### `rust/src/types.rs` - Language: `rust` -- Public symbols: `5` +- Public symbols: `2` | Line | Kind | Name | Signature | | ---: | --- | --- | --- | | 8 | `struct` | `CodexResult` | `pub struct CodexResult {` | -| 38 | `struct` | `CodexMessage` | `pub struct CodexMessage {` | -| 51 | `struct` | `CodexEvent` | `pub struct CodexEvent {` | -| 66 | `struct` | `CodexModelInfo` | `pub struct CodexModelInfo {` | -| 79 | `struct` | `CodexAccountInfo` | `pub struct CodexAccountInfo {` | +| 38 | `struct` | `CodexEvent` | `pub struct CodexEvent {` | diff --git a/docs/plans/2026-04-11-settings-config-state-workflow-design.md b/docs/plans/2026-04-11-settings-config-state-workflow-design.md index e9a1221c..f4d34038 100644 --- a/docs/plans/2026-04-11-settings-config-state-workflow-design.md +++ b/docs/plans/2026-04-11-settings-config-state-workflow-design.md @@ -56,7 +56,6 @@ The app only talks to: - no production `xworkmate.providers.sync` - no production provider catalog from `providerSyncDefinitions` - no execution-time use of account-synced `openclawUrl` -- no execution-time use of account-synced `apisixUrl` - no direct app calls to `xworkmate-bridge.svc.plus/*` - no direct app calls to `openclaw.svc.plus` @@ -71,7 +70,7 @@ The app only talks to: `account/sync_state.json` - stores synced account metadata only -- may retain `openclawUrl` / `apisixUrl` as account profile metadata +- may retain `openclawUrl` as account profile metadata - does not overwrite executable cloud routing targets `acpBridgeServerModeConfig.effective` diff --git a/docs/reports/2026-05-13-flutter-stale-code-cleanup-analysis.md b/docs/reports/2026-05-13-flutter-stale-code-cleanup-analysis.md new file mode 100644 index 00000000..7b881c58 --- /dev/null +++ b/docs/reports/2026-05-13-flutter-stale-code-cleanup-analysis.md @@ -0,0 +1,161 @@ +# Flutter/Dart 孤立代码与陈旧代码清理分析 + +日期:2026-05-13 + +范围: + +- `lib/settings/mobile/runtime`:目录不存在 +- `lib/gateway`:目录不存在 +- `lib/profile`:目录不存在 +- `lib/shared/shell`:目录不存在 +- `lib/widgets/layout`:目录不存在 +- `lib/core/helper`:目录不存在 +- `lib/core/utils`:目录不存在 +- 已扫描仍存在的重点路径:`lib/runtime`、`lib/features/settings`、`lib/features/mobile`、`lib/widgets`、`lib/app` + +## 已执行扫描 + +- `rg "^export " lib test` +- `find lib -name "*.dart"` +- `rg "^class |^typedef |^extension |^mixin "` +- `rg "register|registry|routes:|GoRoute|GetIt|Provider|Riverpod|dispatch|mount|factory|builder:|runtimeType"` +- `rg "legacy|deprecated|old|helper|tmp|unused|v1|backup|compat|fallback"` + +## Safe To Remove + +本轮已删除: + +- `lib/app/app_controller_desktop_single_agent.dart` + - 空 extension:`AppControllerDesktopSingleAgent` + - 无方法、无动态注册、无 route/provider/ACP 入口 + - 同步移除 `lib/app/app_controller_desktop.dart` export 与所有 app controller import +- `SettingsGlobalApplyCard` + - 定义于 `lib/widgets/settings_page_shell.dart` + - 无引用、未进入 Settings widget tree +- `buildOrderedSettingsSections` + - 定义于 `lib/widgets/settings_page_shell.dart` + - 无引用,旧多分区 Settings shell helper +- `AcpBridgeServerAdvancedOverrides` + - 定义于 `lib/runtime/runtime_models_account.dart` + - 仅被 `AcpBridgeServerModeConfig` 自身序列化引用,无 runtime usage + - 属于旧本地/高级配置中心残留 +- `AcpBridgeServerRemoteServerSummary.hasAdvancedOverrides` + - 仅写入固定 false,无业务消费 +- `AccountTokenConfigured.apisix` 与 `AccountRemoteProfile.apisixUrl` + - 旧 APISIX/AI Gateway 账号同步字段 + - 当前 OpenClaw/Gateway task 链路不再消费 +- `AiGatewayProfile.fromJson(filePath -> baseUrl)` fallback + - 旧字段兼容路径 +- `SettingsSnapshot.fromJson(apisix -> aiGateway)` fallback + - 旧字段兼容路径 +- `main` / `agent:main:main` 会话 key alias + - 移除于 `runtime_controllers_derived_tasks.dart` + - 移除于 `assistant_page_task_models.dart` + +## Probably Removable + +以下仍需按业务闭包继续拆,不建议一次性自动删除: + +- `lib/data/mock_data.dart` + - stem 引用为 0,疑似旧展示数据 + - caution:可能被 dev/demo surface 间接引用,删除前需确认应用入口和测试 fixture +- `lib/widgets/metric_card.dart` + - stem 引用为 0 + - 看起来是旧 dashboard card,当前重点 UI 未挂载 +- `lib/widgets/section_header.dart` + - stem 引用为 0 + - 可能是旧页面布局 helper +- `lib/widgets/app_brand_logo.dart` + - stem 引用为 0 + - caution:可能由 launch/splash/brand 测试或外部 import 使用 +- `lib/runtime/aris_llm_chat_client.dart` + - 注释标记本地 Go core execution deprecated + - caution:仍被 multi-agent orchestrator protocol/workflow/support import +- `lib/runtime/mode_switcher.dart` + - 仍被 runtime coordinator 与 app controller 多处使用 + - 不应直接删,后续应评估 Gateway mode 是否还需要 app-side mode switcher + +## Dynamic Runtime Bound + +以下存在动态入口或 runtime 注册,不应自动删除: + +- `lib/app/workspace_page_registry.dart` + - Workspace route/page registry +- `lib/app/app_controller_desktop_runtime_helpers.dart` + - `registerCodexExternalProviderInternal` + - runtime provider registration +- `lib/runtime/runtime_coordinator.dart` + - external code agent registry + - dispatch resolver +- `lib/runtime/gateway_acp_client.dart` + - ACP capability/provider catalog parsing + - Gateway/OpenClaw dispatch routing +- `lib/runtime/go_task_service_client.dart` + - OpenClaw/Gateway task request/result contract +- `lib/runtime/external_code_agent_acp_desktop_transport.dart` + - ACP transport capability parse path +- `lib/runtime/agent_registry.dart` + - Gateway agent register/unregister/list path +- `lib/runtime/multi_agent_mounts.dart` + - mount adapter registration and reconcile path + +## Legacy Compatibility Layer + +已清理: + +- `AcpBridgeServerAdvancedOverrides` +- APISIX account sync fields +- AiGateway old `filePath` fallback +- SettingsSnapshot old `apisix` fallback +- runtime `main`/`agent:main:main` session alias + +保留但标记 caution: + +- `SecretStore.legacyLocalStateKey` + - 安全/本地持久化恢复路径,AGENTS 明确这类 legacy recovery 不自动扩张也不自动删除 +- secret `fallbackRefName` + - 用于 secure-store ref resolution,不属于 UI 本地配置中心入口 +- `go_task_service_client.dart` 的 failure text fallback + - task terminal-state 文本兜底,后续应继续收敛到结构化 code + +## Export Cleanup + +当前 barrel 扫描: + +- `lib/app/app_controller_desktop.dart`:仍是 app controller extension 聚合入口,内部 import 为 0 属于 barrel 预期 +- `lib/features/settings/settings_page.dart`:settings feature public entry,内部 import 为 0 属于 barrel 预期 +- `lib/features/mobile/mobile_shell.dart`:mobile feature public entry,内部 import 为 0 属于 barrel 预期 +- `lib/runtime/gateway_runtime.dart`、`lib/runtime/multi_agent_orchestrator.dart`、`lib/runtime/runtime_models.dart`:runtime public barrel,动态/测试入口仍依赖 + +本轮已清理的 export: + +- `lib/app/app_controller_desktop.dart` 不再 export `app_controller_desktop_single_agent.dart` + +## Unreachable Widget Tree + +已删除: + +- Settings 全局 apply card +- Settings 多分区排序 helper + +仍在 widget tree: + +- `SettingsPage` + - 通过 `workspace_page_registry.dart` 挂载 +- `SettingsAccountPanel` + - 通过 `SettingsPage` 挂载 +- `SettingsAboutPanel` + - 通过 `SettingsPage` 挂载 +- `MobileShell` + - 通过 `AppShell` responsive surface 挂载 +- `MobileGatewayPairingGuidePage` + - 通过 `MobileShell` pairing flow 挂载 +- `AssistantFocusPanel` + - 预览组件仍由 assistant focus panel 内部分发 + +## Refactor Suggestions + +- 继续收敛 `SettingsSnapshot`:把不再有 UI 的 Vault/Ollama/AiGateway 配置按实际 runtime 使用拆分,避免 Settings model 继续承担旧配置中心职责。 +- 后续单独评估 `lib/data/mock_data.dart`、`MetricCard`、`SectionHeader`、`AppBrandLogo` 是否仍有真实入口。 +- 对 `runtime_controllers_settings*.dart` 继续拆闭包:account sync、secret resolution、connectivity check 三条路径应独立,避免 SettingsController 成为旧配置中心聚合点。 +- 对 `go_task_service_client.dart` terminal-state fallback 继续结构化,减少文本兜底。 diff --git a/docs/reports/codex-ffi-status-report.md b/docs/reports/codex-ffi-status-report.md deleted file mode 100644 index a21aa996..00000000 --- a/docs/reports/codex-ffi-status-report.md +++ /dev/null @@ -1,190 +0,0 @@ -# Codex Agent FFI 集成状态报告 - -## 测试执行时间 -2026-03-14 10:20 - -## FFI 库状态 -**文件路径:** `/Applications/XWorkmate.app/Contents/Frameworks/libcodex_ffi.dylib` -**大小:** 302 KB (ARM64) -**架构:** Mach-O 64-bit dynamically linked shared library arm64 - -## FFI 函数可用性测试 - -### ✅ 可用的 FFI 函数(已导出) - -| 函数名 | 状态 | 说明 | -|--------|------|------| -| `codex_init()` | ✅ 可用 | 初始化库,返回 0 表示成功 | -| `codex_runtime_create()` | ✅ 可用 | 创建运行时实例,返回有效指针 | -| `codex_runtime_destroy()` | ✅ 可用 | 销毁运行时实例,清理内存 | -| `codex_start_thread()` | ✅ 可用 | 启动线程,返回 ThreadHandle (id=0 表示空句柄) | -| `codex_send_message()` | ✅ 可用 | 发送消息,返回 0 表示成功 | -| `codex_poll_events()` | ✅ 可用 | 轮询事件,返回 0 (未实现) | -| `codex_shutdown()` | ✅ 可用 | 关闭运行时,返回 0 表示成功 | -| `codex_last_error()` | ✅ 可用 | 获取最后错误信息 | - -### ❌ 核心功能实现状态 - -根据 Rust 源码分析 (`rust/src/lib.rs` 和 `rust/src/runtime.rs`): - -| 功能 | 实现状态 | 代码位置 | -|------|----------|----------| -| Codex CLI 进程启动 | ❌ **未实现** | `runtime.rs:235` - `// TODO: Start process` | -| 异步消息发送 | ❌ **未实现** | `lib.rs:87` - `// TODO: Implement async message sending` | -| 事件轮询机制 | ❌ **未实现** | `lib.rs:108` - `// TODO: Implement event polling` | -| 响应流处理 | ❌ **未实现** | 无相关代码 | -| 进程停止管理 | ❌ **未实现** | `runtime.rs:247` - `// TODO: Stop process` | -| Codex 二进制查找 | ✅ **已实现** | `runtime.rs:202-221` | - -## 对话功能测试结果 - -### 测试尝试 -尝试通过 FFI 发送消息并轮询响应: - -```dart -// 1. 创建运行时 ✅ -runtime = codex_runtime_create(config); -// 结果: 成功,返回有效指针 - -// 2. 启动线程 ✅ -thread = codex_start_thread(runtime, cwd); -// 结果: 返回 ThreadHandle,但 id=0 (空句柄) - -// 3. 发送消息 ✅ -result = codex_send_message(runtime, thread, message); -// 结果: 返回 0 (成功),但消息实际上未发送 - -// 4. 轮询响应 ❌ -events = codex_poll_events(runtime, buffer, bufferSize); -// 结果: 返回 0 (无事件) -// 原因: 未实现事件队列和处理逻辑 -``` - -### 结论 -**❌ 无法进行真正的 Codex agent 对话** - -原因: -1. Codex CLI 进程从未启动 -2. FFI 函数只是桩代码(stubs),返回预定义值 -3. 没有实际的消息处理和响应机制 -4. 事件轮询返回 0,因为没有事件队列 - -## 执行功能测试结果 - -### 虽拟执行测试 -尝试通过 FFI 执行类似 "创建文件" 的操作: - -```dart -// 发送执行指令 -codex_send_message(runtime, thread, "Create a file named test.txt"); -// 结果: 返回 0 (成功),但: -// 1. Codex 进程未启动,无法接收指令 -// 2. 没有执行管道和输出捕获 -// 3. 没有文件系统操作的实际代码 -``` - -### 结论 -**❌ 无法执行任何 Codex agent 操作** - -原因: -- 没有进程管理代码 -- 没有 stdio 管道建立 -- 没有输出流处理 -- 没有文件系统操作接口 - -## 当前架构评估 - -### ✅ 已完成的部分 -1. **FFI 接口定义** - 所有必要的函数签名已定义 -2. **内存管理** - Box 智能指针正确用于 FFI 边界 -3. **类型安全** - Rust Struct 和 Dart FFI 类型对应正确 -4. **编译构建** - dylib 成功编译并可加载 -5. **基础测试** - 简单的 FFI 调用可以成功执行 - -### ❌ 缺失的关键部分 -1. **进程管理** - 无子进程启动、监控、停止机制 -2. **IPC 通信** - 无消息队列、事件通知机制 -3. **异步处理** - Rust 端无异步代码,Dart 端无回调接口 -4. **Codex 集成** - 无实际调用 Codex CLI 的代码 -5. **错误处理** - 所有错误都被忽略,返回固定值 - -## 离线模式实际工作原理 - -由于 Codex FFI 未完全实现,当前应用在"离线模式"下: - -### 实际使用的是 -- **Stdio 桥接模式** - 通过 `CodexRuntime` Dart 类直接调用外部 Codex CLI -- **外部 CLI 模式** - 启动独立的 `codex` 可执行文件进程,通过 stdin/stdout 通信 - -### 不是使用 -- ❌ 内置 FFI Rust 库 (`libcodex_ffi.dylib`) -- ❌ 内存内的 Codex 实现 -- ❌ Rust 嵌入式 Codex - -## 完整对话和执行的实现路径 - -要使 libcodex_ffi.dylib 能够进行真正的对话和执行,需要: - -### 1. Rust 端实现 -```rust -// 需要实现的核心组件: -- ProcessManager: 启动/停止 Codex CLI 进程 -- MessageQueue: 异步消息队列 -- EventStream: 事件流输出 (响应、日志、错误) -- StdioHandler: stdin/stdout/stderr 处理 -- TaskScheduler: 任务执行调度 -``` - -### 2. FFI 接口扩展 -```rust -// 新增需要的函数: -- codex_execute_command() - 执行 shell 命令 -- codex_read_file() - 读取文件内容 -- codex_write_file() - 写入文件 -- codex_list_directory() - 列出目录 -- codex_get_response() - 获取 AI 响应流 -``` - -### 3. Dart 端实现 -```dart -// 需要实现: -- StreamController: 处理响应流 -- CallbackHandler: Rust 回调转 Dart -- ErrorHandler: 错误传播 -- TimeoutManager: 超时管理 -``` - -## 建议 - -### 短期(当前可行) -继续使用**外部 CLI 模式**: -- 通过 `CodexRuntime.dart` 直接启动 `codex` 可执行文件 -- 使用 Stdio 进行通信 -- 不依赖 FFI Rust 库 - -### 中期(需要开发) -实现基本 FFI 功能: -1. 进程管理(启动/停止 Codex) -2. 基础消息传递 -3. 简单响应接收 - -### 长期(完整功能) -完整 Rust FFI 实现: -1. 嵌入式 Codex(无需外部 CLI) -2. 异步事件流 -3. 文件系统操作 -4. 任务执行和监控 - -## 总结 - -| 测试项 | 结果 | 说明 | -|--------|------|------| -| FFI 库加载 | ✅ 通过 | dylib 可正常加载 | -| FFI 函数调用 | ✅ 通过 | 所有函数可调用 | -| 对话功能 | ❌ 失败 | 未实现,Codex 进程未启动 | -| 执行功能 | ❌ 失败 | 未实现,无 IPC 机制 | -| 响应接收 | ❌ 失败 | 未实现,无事件流 | - -**当前状态:** libcodex_ffi.dylib 提供了 FFI 接口的**骨架**,但缺乏实现对话和执行所需的**核心逻辑**。 - -**实际可用方案:** 应用当前通过外部 Codex CLI(Stdio 模式)在离线模式下运行,不依赖 Rust FFI 库。 diff --git a/flutter_rust_bridge.yaml b/flutter_rust_bridge.yaml deleted file mode 100644 index 176762a6..00000000 --- a/flutter_rust_bridge.yaml +++ /dev/null @@ -1,20 +0,0 @@ -# Flutter Rust Bridge Configuration -# This file configures code generation for FFI bindings - -rust_input: - - rust/src/lib.rs - -dart_output: - - lib/runtime/codex_ffi_generated.dart - -# Class names for generated Dart code -rust_root_namespace: codex_ffi - -# Output configuration -dart_format_line_length: 120 - -# FFI library name (without extension) -c_symbol_prefix: codex_ - -# Generate documentation -dart_type_name_length_limit: 60 diff --git a/lib/app/app_controller_desktop.dart b/lib/app/app_controller_desktop.dart index c26dac5d..cc1b0384 100644 --- a/lib/app/app_controller_desktop.dart +++ b/lib/app/app_controller_desktop.dart @@ -2,7 +2,6 @@ export 'app_controller_desktop_core.dart'; export 'app_controller_desktop_navigation.dart'; export 'app_controller_desktop_gateway.dart'; export 'app_controller_desktop_settings.dart'; -export 'app_controller_desktop_single_agent.dart'; export 'app_controller_desktop_thread_sessions.dart'; export 'app_controller_desktop_thread_actions.dart'; export 'app_controller_desktop_workspace_execution.dart'; diff --git a/lib/app/app_controller_desktop_core.dart b/lib/app/app_controller_desktop_core.dart index 275c60a6..323890cd 100644 --- a/lib/app/app_controller_desktop_core.dart +++ b/lib/app/app_controller_desktop_core.dart @@ -356,8 +356,6 @@ class AppController extends ChangeNotifier { ThemeMode themeModeInternal = ThemeMode.light; AppSidebarState sidebarStateInternal = AppSidebarState.expanded; SettingsTab settingsTabInternal = SettingsTab.gateway; - SettingsDetailPage? settingsDetailInternal; - SettingsNavigationContext? settingsNavigationContextInternal; DetailPanelData? detailPanelInternal; AppUiState appUiStateInternal = AppUiState.defaults(); SettingsSnapshot settingsDraftInternal = SettingsSnapshot.defaults(); @@ -425,9 +423,6 @@ class AppController extends ChangeNotifier { ThemeMode get themeMode => themeModeInternal; AppSidebarState get sidebarState => sidebarStateInternal; SettingsTab get settingsTab => settingsTabInternal; - SettingsDetailPage? get settingsDetail => settingsDetailInternal; - SettingsNavigationContext? get settingsNavigationContext => - settingsNavigationContextInternal; DetailPanelData? get detailPanel => detailPanelInternal; bool get initializing => initializingInternal; String? get bootstrapError => bootstrapErrorInternal; @@ -576,13 +571,42 @@ class AppController extends ChangeNotifier { ]); List get assistantProviderCatalog => - normalizeSingleAgentProviderList(bridgeAgentProviderCatalogInternal); + normalizeSingleAgentProviderList( + bridgeAgentProviderCatalogInternal.where( + (provider) => + provider.providerId != kCanonicalGatewayProviderId && + !provider.supportedTargets.contains( + AssistantExecutionTarget.gateway, + ), + ), + ); List get gatewayProviderCatalog => - normalizeSingleAgentProviderList(bridgeGatewayProviderCatalogInternal); + normalizeSingleAgentProviderList([ + ...bridgeGatewayProviderCatalogInternal, + ...bridgeAgentProviderCatalogInternal.where( + (provider) => + provider.providerId == kCanonicalGatewayProviderId || + provider.supportedTargets.contains( + AssistantExecutionTarget.gateway, + ), + ), + ]); - List get bridgeAvailableExecutionTargets => - compactAssistantExecutionTargets(bridgeAvailableExecutionTargetsInternal); + List get bridgeAvailableExecutionTargets { + final targets = [ + ...bridgeAvailableExecutionTargetsInternal, + ]; + if (assistantProviderCatalog.isNotEmpty && + !targets.contains(AssistantExecutionTarget.agent)) { + targets.add(AssistantExecutionTarget.agent); + } + if (gatewayProviderCatalog.isNotEmpty && + !targets.contains(AssistantExecutionTarget.gateway)) { + targets.add(AssistantExecutionTarget.gateway); + } + return compactAssistantExecutionTargets(targets); + } List providerCatalogForExecutionTarget( AssistantExecutionTarget executionTarget, @@ -665,15 +689,8 @@ class AppController extends ChangeNotifier { void navigateHome() => AppControllerDesktopNavigation(this).navigateHome(); - void openSettings({ - SettingsTab tab = SettingsTab.gateway, - SettingsDetailPage? detail, - SettingsNavigationContext? navigationContext, - }) => AppControllerDesktopNavigation(this).openSettings( - tab: tab, - detail: detail, - navigationContext: navigationContext, - ); + void openSettings({SettingsTab tab = SettingsTab.gateway}) => + AppControllerDesktopNavigation(this).openSettings(tab: tab); void openDetail(DetailPanelData detailPanel) => AppControllerDesktopNavigation(this).openDetail(detailPanel); diff --git a/lib/app/app_controller_desktop_gateway.dart b/lib/app/app_controller_desktop_gateway.dart index 569813f7..f5f66bec 100644 --- a/lib/app/app_controller_desktop_gateway.dart +++ b/lib/app/app_controller_desktop_gateway.dart @@ -36,7 +36,6 @@ import '../runtime/account_runtime_client.dart'; import 'app_controller_desktop_core.dart'; import 'app_controller_desktop_navigation.dart'; import 'app_controller_desktop_settings.dart'; -import 'app_controller_desktop_single_agent.dart'; import 'app_controller_desktop_thread_binding.dart'; import 'app_controller_desktop_thread_sessions.dart'; import 'app_controller_desktop_thread_actions.dart'; diff --git a/lib/app/app_controller_desktop_navigation.dart b/lib/app/app_controller_desktop_navigation.dart index d939a386..48aceaab 100644 --- a/lib/app/app_controller_desktop_navigation.dart +++ b/lib/app/app_controller_desktop_navigation.dart @@ -35,7 +35,6 @@ import '../runtime/skill_directory_access.dart'; import 'app_controller_desktop_core.dart'; import 'app_controller_desktop_gateway.dart'; import 'app_controller_desktop_settings.dart'; -import 'app_controller_desktop_single_agent.dart'; import 'app_controller_desktop_thread_sessions.dart'; import 'app_controller_desktop_thread_actions.dart'; import 'app_controller_desktop_workspace_execution.dart'; @@ -50,19 +49,12 @@ extension AppControllerDesktopNavigation on AppController { if (!capabilities.supportsDestination(destination)) { return; } - final shouldClearSettingsDrillIn = - settingsDetailInternal != null || - settingsNavigationContextInternal != null; final changed = - destinationInternal != destination || - detailPanelInternal != null || - shouldClearSettingsDrillIn; + destinationInternal != destination || detailPanelInternal != null; if (!changed) { return; } destinationInternal = destination; - settingsDetailInternal = null; - settingsNavigationContextInternal = null; detailPanelInternal = null; notifyListeners(); } @@ -76,14 +68,9 @@ extension AppControllerDesktopNavigation on AppController { : capabilities.allowedDestinations.first); final destinationChanged = destinationInternal != homeDestination; final detailChanged = detailPanelInternal != null; - final settingsDrillInChanged = - settingsDetailInternal != null || - settingsNavigationContextInternal != null; destinationInternal = homeDestination; - settingsDetailInternal = null; - settingsNavigationContextInternal = null; detailPanelInternal = null; - if (destinationChanged || detailChanged || settingsDrillInChanged) { + if (destinationChanged || detailChanged) { notifyListeners(); } if (!isAppOwnedAssistantSessionKeyInternal(currentSessionKey)) { @@ -91,63 +78,31 @@ extension AppControllerDesktopNavigation on AppController { } } - void openSettings({ - SettingsTab tab = SettingsTab.gateway, - SettingsDetailPage? detail, - SettingsNavigationContext? navigationContext, - }) { + void openSettings({SettingsTab tab = SettingsTab.gateway}) { if (!capabilities.supportsDestination(WorkspaceDestination.settings)) { return; } - final requestedTab = detail?.tab ?? tab; - final resolvedTab = sanitizeSettingsTabInternal(requestedTab); - final resolvedDetail = detail != null && resolvedTab == detail.tab - ? detail - : null; + final resolvedTab = sanitizeSettingsTabInternal(tab); final changed = destinationInternal != WorkspaceDestination.settings || settingsTabInternal != resolvedTab || - settingsDetailInternal != resolvedDetail || - settingsNavigationContextInternal != navigationContext || detailPanelInternal != null; if (!changed) { return; } destinationInternal = WorkspaceDestination.settings; settingsTabInternal = resolvedTab; - settingsDetailInternal = resolvedDetail; - settingsNavigationContextInternal = resolvedDetail == null - ? null - : navigationContext; detailPanelInternal = null; notifyListeners(); } void setSettingsTab(SettingsTab tab, {bool clearDetail = true}) { final resolvedTab = sanitizeSettingsTabInternal(tab); - final changed = - settingsTabInternal != resolvedTab || - (clearDetail && - (settingsDetailInternal != null || - settingsNavigationContextInternal != null)); + final changed = settingsTabInternal != resolvedTab; if (!changed) { return; } settingsTabInternal = resolvedTab; - if (clearDetail) { - settingsDetailInternal = null; - settingsNavigationContextInternal = null; - } - notifyListeners(); - } - - void closeSettingsDetail() { - if (settingsDetailInternal == null && - settingsNavigationContextInternal == null) { - return; - } - settingsDetailInternal = null; - settingsNavigationContextInternal = null; notifyListeners(); } diff --git a/lib/app/app_controller_desktop_runtime_helpers.dart b/lib/app/app_controller_desktop_runtime_helpers.dart index 64f01429..69611f0e 100644 --- a/lib/app/app_controller_desktop_runtime_helpers.dart +++ b/lib/app/app_controller_desktop_runtime_helpers.dart @@ -40,7 +40,6 @@ import 'app_controller_desktop_core.dart'; import 'app_controller_desktop_navigation.dart'; import 'app_controller_desktop_gateway.dart'; import 'app_controller_desktop_settings.dart'; -import 'app_controller_desktop_single_agent.dart'; import 'app_controller_desktop_thread_sessions.dart'; import 'app_controller_desktop_thread_actions.dart'; import 'app_controller_desktop_workspace_execution.dart'; diff --git a/lib/app/app_controller_desktop_settings.dart b/lib/app/app_controller_desktop_settings.dart index 78febf1a..3c78f903 100644 --- a/lib/app/app_controller_desktop_settings.dart +++ b/lib/app/app_controller_desktop_settings.dart @@ -36,7 +36,6 @@ import '../runtime/skill_directory_access.dart'; import 'app_controller_desktop_core.dart'; import 'app_controller_desktop_navigation.dart'; import 'app_controller_desktop_gateway.dart'; -import 'app_controller_desktop_single_agent.dart'; import 'app_controller_desktop_thread_sessions.dart'; import 'app_controller_desktop_thread_actions.dart'; import 'app_controller_desktop_workspace_execution.dart'; diff --git a/lib/app/app_controller_desktop_settings_runtime.dart b/lib/app/app_controller_desktop_settings_runtime.dart index 4007c24c..1c2cd66d 100644 --- a/lib/app/app_controller_desktop_settings_runtime.dart +++ b/lib/app/app_controller_desktop_settings_runtime.dart @@ -39,7 +39,6 @@ import 'app_controller_desktop_navigation.dart'; import 'app_controller_desktop_gateway.dart'; import 'app_controller_desktop_settings.dart'; import 'app_controller_desktop_thread_binding.dart'; -import 'app_controller_desktop_single_agent.dart'; import 'app_controller_desktop_thread_sessions.dart'; import 'app_controller_desktop_thread_actions.dart'; import 'app_controller_desktop_workspace_execution.dart'; diff --git a/lib/app/app_controller_desktop_single_agent.dart b/lib/app/app_controller_desktop_single_agent.dart deleted file mode 100644 index 3ed0e568..00000000 --- a/lib/app/app_controller_desktop_single_agent.dart +++ /dev/null @@ -1,3 +0,0 @@ -import 'app_controller_desktop_core.dart'; - -extension AppControllerDesktopSingleAgent on AppController {} diff --git a/lib/app/app_controller_desktop_skill_permissions.dart b/lib/app/app_controller_desktop_skill_permissions.dart index 0c570940..8c848394 100644 --- a/lib/app/app_controller_desktop_skill_permissions.dart +++ b/lib/app/app_controller_desktop_skill_permissions.dart @@ -36,7 +36,6 @@ import 'app_controller_desktop_core.dart'; import 'app_controller_desktop_navigation.dart'; import 'app_controller_desktop_gateway.dart'; import 'app_controller_desktop_settings.dart'; -import 'app_controller_desktop_single_agent.dart'; import 'app_controller_desktop_thread_sessions.dart'; import 'app_controller_desktop_thread_actions.dart'; import 'app_controller_desktop_thread_binding.dart'; diff --git a/lib/app/app_controller_desktop_thread_sessions.dart b/lib/app/app_controller_desktop_thread_sessions.dart index 6b9e70ef..19bc1d37 100644 --- a/lib/app/app_controller_desktop_thread_sessions.dart +++ b/lib/app/app_controller_desktop_thread_sessions.dart @@ -36,7 +36,6 @@ import 'app_controller_desktop_core.dart'; import 'app_controller_desktop_navigation.dart'; import 'app_controller_desktop_gateway.dart'; import 'app_controller_desktop_settings.dart'; -import 'app_controller_desktop_single_agent.dart'; import 'app_controller_desktop_thread_binding.dart'; import 'app_controller_desktop_thread_actions.dart'; import 'app_controller_desktop_workspace_execution.dart'; diff --git a/lib/app/app_controller_desktop_thread_sessions_collaboration_impl.dart b/lib/app/app_controller_desktop_thread_sessions_collaboration_impl.dart index 062094c7..8999e21b 100644 --- a/lib/app/app_controller_desktop_thread_sessions_collaboration_impl.dart +++ b/lib/app/app_controller_desktop_thread_sessions_collaboration_impl.dart @@ -37,7 +37,6 @@ import 'app_controller_desktop_core.dart'; import 'app_controller_desktop_navigation.dart'; import 'app_controller_desktop_gateway.dart'; import 'app_controller_desktop_settings.dart'; -import 'app_controller_desktop_single_agent.dart'; import 'app_controller_desktop_thread_binding.dart'; import 'app_controller_desktop_thread_sessions.dart'; import 'app_controller_desktop_thread_actions.dart'; diff --git a/lib/app/app_controller_desktop_thread_storage.dart b/lib/app/app_controller_desktop_thread_storage.dart index ad31452b..963a74c6 100644 --- a/lib/app/app_controller_desktop_thread_storage.dart +++ b/lib/app/app_controller_desktop_thread_storage.dart @@ -36,7 +36,6 @@ import 'app_controller_desktop_core.dart'; import 'app_controller_desktop_navigation.dart'; import 'app_controller_desktop_gateway.dart'; import 'app_controller_desktop_settings.dart'; -import 'app_controller_desktop_single_agent.dart'; import 'app_controller_desktop_thread_sessions.dart'; import 'app_controller_desktop_thread_actions.dart'; import 'app_controller_desktop_workspace_execution.dart'; diff --git a/lib/app/app_controller_desktop_workspace_execution.dart b/lib/app/app_controller_desktop_workspace_execution.dart index a3238105..d53c4aa5 100644 --- a/lib/app/app_controller_desktop_workspace_execution.dart +++ b/lib/app/app_controller_desktop_workspace_execution.dart @@ -87,6 +87,7 @@ extension AppControllerDesktopWorkspaceExecution on AppController { sessionsControllerInternal.currentSessionKey, )?.executionBinding.providerId, executionTarget: resolvedTarget, + defaultToCatalog: resolvedTarget.isGateway, ), selectedProviderSource: ThreadSelectionSource.explicit, gatewayEntryState: gatewayEntryStateForTargetInternal(resolvedTarget), diff --git a/lib/app/ui_feature_manifest_core.dart b/lib/app/ui_feature_manifest_core.dart index 217f7d2a..129c26f9 100644 --- a/lib/app/ui_feature_manifest_core.dart +++ b/lib/app/ui_feature_manifest_core.dart @@ -48,11 +48,6 @@ abstract final class UiFeatureKeys { static const settingsGateway = 'settings.gateway'; static const settingsAccountAccess = 'settings.account_access'; static const settingsVaultServer = 'settings.vault_server'; - static const settingsGatewaySelfHostedBase = - 'settings.gateway_self_hosted_base'; - static const settingsGatewayAdvancedCustomMode = - 'settings.gateway_advanced_custom_mode'; - static const settingsGatewaySetupCode = 'settings.gateway_setup_code'; static const settingsExperimentalCanvas = 'settings.experimental_canvas'; static const settingsExperimentalBridge = 'settings.experimental_bridge'; static const settingsExperimentalDebug = 'settings.experimental_debug'; @@ -423,18 +418,9 @@ class UiFeatureAccess { bool get supportsAccountAccess => isEnabledPath(UiFeatureKeys.settingsAccountAccess); - bool get supportsGatewaySetupCode => - isEnabledPath(UiFeatureKeys.settingsGatewaySetupCode); - bool get supportsVaultServer => isEnabledPath(UiFeatureKeys.settingsVaultServer); - bool get supportsGatewaySelfHostedBase => - isEnabledPath(UiFeatureKeys.settingsGatewaySelfHostedBase); - - bool get supportsGatewayAdvancedCustomMode => - isEnabledPath(UiFeatureKeys.settingsGatewayAdvancedCustomMode); - List get availableSettingsTabs { return SettingsTab.values .where( diff --git a/lib/app/workspace_navigation.dart b/lib/app/workspace_navigation.dart index d3f4a0c3..554561eb 100644 --- a/lib/app/workspace_navigation.dart +++ b/lib/app/workspace_navigation.dart @@ -32,36 +32,10 @@ List buildWorkspaceBreadcrumbs({ List buildSettingsBreadcrumbs( AppController controller, { required SettingsTab tab, - SettingsDetailPage? detail, - SettingsNavigationContext? navigationContext, }) { - if (detail == null) { - return buildWorkspaceBreadcrumbs( - controller: controller, - rootLabel: appText('设置', 'Settings'), - sectionLabel: tab.label, - ); - } - return buildWorkspaceBreadcrumbs( controller: controller, - rootLabel: navigationContext?.rootLabel ?? appText('设置', 'Settings'), - sectionLabel: navigationContext?.sectionLabel ?? tab.label, - detailLabel: detail.label, - onRootTap: navigationContext == null - ? () => controller.openSettings(tab: tab) - : () => openSettingsNavigationContext(controller, navigationContext), + rootLabel: appText('设置', 'Settings'), + sectionLabel: tab.label, ); } - -void openSettingsNavigationContext( - AppController controller, - SettingsNavigationContext context, -) { - if (context.settingsTab != null || - context.destination == WorkspaceDestination.settings) { - controller.openSettings(tab: context.settingsTab ?? SettingsTab.gateway); - return; - } - controller.navigateTo(context.destination); -} diff --git a/lib/app/workspace_page_registry.dart b/lib/app/workspace_page_registry.dart index 39072140..7d5152b7 100644 --- a/lib/app/workspace_page_registry.dart +++ b/lib/app/workspace_page_registry.dart @@ -25,37 +25,33 @@ class WorkspacePageSpec { final WorkspacePageBuilder mobileBuilder; } -final Map -workspacePageSpecsInternal = { - WorkspaceDestination.assistant: WorkspacePageSpec( - destination: WorkspaceDestination.assistant, - desktopBuilder: (controller, onOpenDetail) => AssistantPage( - controller: controller, - onOpenDetail: onOpenDetail, - showStandaloneTaskRail: false, - ), - mobileBuilder: (controller, onOpenDetail) => AssistantPage( - controller: controller, - onOpenDetail: onOpenDetail, - showStandaloneTaskRail: false, - ), - ), - WorkspaceDestination.settings: WorkspacePageSpec( - destination: WorkspaceDestination.settings, - desktopBuilder: (controller, onOpenDetail) => SettingsPage( - controller: controller, - initialTab: controller.settingsTab, - initialDetail: controller.settingsDetail, - navigationContext: controller.settingsNavigationContext, - ), - mobileBuilder: (controller, onOpenDetail) => SettingsPage( - controller: controller, - initialTab: controller.settingsTab, - initialDetail: controller.settingsDetail, - navigationContext: controller.settingsNavigationContext, - ), - ), -}; +final Map workspacePageSpecsInternal = + { + WorkspaceDestination.assistant: WorkspacePageSpec( + destination: WorkspaceDestination.assistant, + desktopBuilder: (controller, onOpenDetail) => AssistantPage( + controller: controller, + onOpenDetail: onOpenDetail, + showStandaloneTaskRail: false, + ), + mobileBuilder: (controller, onOpenDetail) => AssistantPage( + controller: controller, + onOpenDetail: onOpenDetail, + showStandaloneTaskRail: false, + ), + ), + WorkspaceDestination.settings: WorkspacePageSpec( + destination: WorkspaceDestination.settings, + desktopBuilder: (controller, onOpenDetail) => SettingsPage( + controller: controller, + initialTab: controller.settingsTab, + ), + mobileBuilder: (controller, onOpenDetail) => SettingsPage( + controller: controller, + initialTab: controller.settingsTab, + ), + ), + }; Widget buildWorkspacePage({ required WorkspaceDestination destination, diff --git a/lib/features/assistant/assistant_page_state_actions.dart b/lib/features/assistant/assistant_page_state_actions.dart index 7ddbd39b..f1b7f60b 100644 --- a/lib/features/assistant/assistant_page_state_actions.dart +++ b/lib/features/assistant/assistant_page_state_actions.dart @@ -322,14 +322,7 @@ extension AssistantPageStateActionsInternal on AssistantPageStateInternal { } void openGatewaySettingsInternal() { - widget.controller.openSettings( - detail: SettingsDetailPage.gatewayConnection, - navigationContext: SettingsNavigationContext( - rootLabel: appText('助手', 'Assistant'), - destination: WorkspaceDestination.assistant, - sectionLabel: appText('集成', 'Integrations'), - ), - ); + widget.controller.openSettings(tab: SettingsTab.gateway); } Future connectFromSavedSettingsOrShowDialogInternal() async { diff --git a/lib/features/assistant/assistant_page_task_dialog_controls.dart b/lib/features/assistant/assistant_page_task_dialog_controls.dart index 1a6dc8f6..03a9beaf 100644 --- a/lib/features/assistant/assistant_page_task_dialog_controls.dart +++ b/lib/features/assistant/assistant_page_task_dialog_controls.dart @@ -47,6 +47,13 @@ class AssistantTaskDialogModeControlsInternal extends StatelessWidget { final providerMenuProviders = controller.providerCatalogForExecutionTarget( executionTarget, ); + final selectedProvider = controller.resolveProviderForExecutionTarget( + controller + .assistantProviderForSession(controller.currentSessionKey) + .providerId, + executionTarget: executionTarget, + defaultToCatalog: executionTarget.isGateway, + ); return Wrap( spacing: 4, @@ -61,9 +68,7 @@ class AssistantTaskDialogModeControlsInternal extends StatelessWidget { ), _TaskDialogProviderMenuButtonInternal( controller: controller, - selectedProvider: controller.assistantProviderForSession( - controller.currentSessionKey, - ), + selectedProvider: selectedProvider, providers: providerMenuProviders, ), ], @@ -187,7 +192,11 @@ class _TaskDialogProviderMenuButtonInternal extends StatelessWidget { key: const Key('assistant-provider-badge'), provider: selectedProvider, ) - : Icon(Icons.hub_outlined, size: 14, color: context.palette.textMuted), + : Icon( + Icons.hub_outlined, + size: 14, + color: context.palette.textMuted, + ), label: label, tooltip: appText('智能体 Provider', 'Agent Provider'), ), diff --git a/lib/features/assistant/assistant_page_task_models.dart b/lib/features/assistant/assistant_page_task_models.dart index b7cb53c2..896528a5 100644 --- a/lib/features/assistant/assistant_page_task_models.dart +++ b/lib/features/assistant/assistant_page_task_models.dart @@ -312,25 +312,14 @@ String sessionDisplayTitleInternal(GatewaySessionSummary session) { if (label.isEmpty || label == session.key) { return fallbackSessionTitleInternal(session.key); } - if ((label == 'main' || label == 'agent:main:main') && - (session.derivedTitle ?? '').trim().toLowerCase() == 'main') { - return fallbackSessionTitleInternal(session.key); - } return label; } String fallbackSessionTitleInternal(String sessionKey) { final trimmed = sessionKey.trim(); - if (trimmed == 'main' || trimmed == 'agent:main:main') { - return appText('默认任务', 'Default task'); - } if (trimmed.startsWith('draft:')) { return appText('新对话', 'New conversation'); } - final parts = trimmed.split(':'); - if (parts.length >= 3 && parts.first == 'agent' && parts.last == 'main') { - return appText('默认任务', 'Default task'); - } return trimmed.isEmpty ? appText('未命名对话', 'Untitled conversation') : trimmed; } @@ -405,9 +394,5 @@ double estimatedComposerWrapSectionHeightInternal({ bool sessionKeysMatchInternal(String incoming, String current) { final left = incoming.trim().toLowerCase(); final right = current.trim().toLowerCase(); - if (left == right) { - return true; - } - return (left == 'agent:main:main' && right == 'main') || - (left == 'main' && right == 'agent:main:main'); + return left == right; } diff --git a/lib/features/mobile/mobile_shell_core.dart b/lib/features/mobile/mobile_shell_core.dart index b19ee968..77d7e9fd 100644 --- a/lib/features/mobile/mobile_shell_core.dart +++ b/lib/features/mobile/mobile_shell_core.dart @@ -73,46 +73,18 @@ class MobileShellStateInternal extends State { } void showConnectSheetInternal() { - widget.controller.openSettings( - detail: SettingsDetailPage.gatewayConnection, - navigationContext: SettingsNavigationContext( - rootLabel: appText('移动端', 'Mobile'), - destination: WorkspaceDestination.settings, - sectionLabel: appText('集成', 'Integrations'), - settingsTab: SettingsTab.gateway, - gatewayProfileIndex: kGatewayRemoteProfileIndex, - prefersGatewaySetupCode: false, - ), - ); + widget.controller.openSettings(tab: SettingsTab.gateway); } Future openGatewaySetupCodeEntryInternal({ String? prefilledSetupCode, }) async { final setupCode = prefilledSetupCode?.trim() ?? ''; - if (setupCode.isNotEmpty) { - final current = widget - .controller - .settingsDraft - .gatewayProfiles[kGatewayRemoteProfileIndex]; - await widget.controller.saveSettingsDraft( - widget.controller.settingsDraft.copyWithGatewayProfileAt( - kGatewayRemoteProfileIndex, - current.copyWith(useSetupCode: true, setupCode: setupCode), - ), - ); + if (setupCode.isEmpty) { + await promptBridgeVerificationCodeInternal(); + return; } - widget.controller.openSettings( - detail: SettingsDetailPage.gatewayConnection, - navigationContext: SettingsNavigationContext( - rootLabel: appText('移动端', 'Mobile'), - destination: WorkspaceDestination.settings, - sectionLabel: appText('集成', 'Integrations'), - settingsTab: SettingsTab.gateway, - gatewayProfileIndex: kGatewayRemoteProfileIndex, - prefersGatewaySetupCode: true, - ), - ); + await widget.controller.connectWithSetupCode(setupCode: setupCode); } Future connectWithScannedSetupCodeInternal(String setupCode) async { @@ -134,10 +106,6 @@ class MobileShellStateInternal extends State { ), ); } catch (error) { - if (!mounted) { - return; - } - await openGatewaySetupCodeEntryInternal(prefilledSetupCode: setupCode); if (!mounted) { return; } @@ -146,8 +114,8 @@ class MobileShellStateInternal extends State { SnackBar( content: Text( appText( - '扫码成功,但自动连接失败。已为你填入配置码,请检查后重试。\n$message', - 'QR captured, but automatic connect failed. The setup code has been prefilled for review.\n$message', + '扫码成功,但自动连接失败。请重新输入配置码或检查 Bridge 状态。\n$message', + 'QR captured, but automatic connect failed. Re-enter the setup code or check Bridge status.\n$message', ), ), ), @@ -204,7 +172,8 @@ class MobileShellStateInternal extends State { fullscreenDialog: true, builder: (_) => MobileGatewayPairingGuidePage( supportsQrScan: supportsQrScan, - onManualInput: () => unawaited(openGatewaySetupCodeEntryInternal()), + onManualInput: () => + unawaited(promptBridgeVerificationCodeInternal()), onManualCodeInput: () => unawaited(promptBridgeVerificationCodeInternal()), onScannedSetupCode: (setupCode) async { diff --git a/lib/features/settings/settings_account_panel.dart b/lib/features/settings/settings_account_panel.dart index a9a6681d..398c3239 100644 --- a/lib/features/settings/settings_account_panel.dart +++ b/lib/features/settings/settings_account_panel.dart @@ -53,7 +53,8 @@ class SettingsAccountPanel extends StatelessWidget { if (!accountSignedIn && !accountMfaRequired) { return DefaultTabController( length: 2, - initialIndex: settings.acpBridgeServerModeConfig.effective.source == 'bridge' + initialIndex: + settings.acpBridgeServerModeConfig.effective.source == 'bridge' ? 1 : 0, child: Column( @@ -466,14 +467,18 @@ class _SignedInAccountPanel extends StatelessWidget { ? accountState!.syncMessage.trim() : appText('尚未同步远端配置', 'Remote config not synced yet'); final modeStateLabel = accountBusy - ? (isAccountSyncMode ? appText('同步中', 'Syncing') : appText('保存中', 'Saving')) + ? (isAccountSyncMode + ? appText('同步中', 'Syncing') + : appText('保存中', 'Saving')) : (isAccountSyncMode ? _describeAccountSyncState(syncState) : _describeBridgeSaveState(settings)); final modeStatusLabel = accountBusy && accountStatus.trim().isNotEmpty ? accountStatus.trim() : syncMessage; - final modeIcon = isAccountSyncMode ? Icons.cloud_outlined : Icons.link_outlined; + final modeIcon = isAccountSyncMode + ? Icons.cloud_outlined + : Icons.link_outlined; final modeTitle = isAccountSyncMode ? appText('账号同步', 'Account Sync') : appText('手动 Bridge', 'Manual Bridge'); @@ -541,9 +546,14 @@ class _SignedInAccountPanel extends StatelessWidget { accountSession?.email.trim().isNotEmpty == true ? accountSession!.email.trim() : appText('当前账号', 'Current account'), - style: Theme.of(context).textTheme.bodySmall?.copyWith( - color: Theme.of(context).textTheme.bodySmall?.color?.withValues(alpha: 0.78), - ), + style: Theme.of(context).textTheme.bodySmall + ?.copyWith( + color: Theme.of(context) + .textTheme + .bodySmall + ?.color + ?.withValues(alpha: 0.78), + ), ), ], ), @@ -596,7 +606,9 @@ class _SignedInAccountPanel extends StatelessWidget { ? '${appText('同步说明', 'Sync Summary')}: $modeStatusLabel' : '${appText('保存说明', 'Save Summary')}: $modeStatusLabel', style: Theme.of(context).textTheme.bodySmall?.copyWith( - color: Theme.of(context).textTheme.bodySmall?.color?.withValues(alpha: 0.78), + color: Theme.of( + context, + ).textTheme.bodySmall?.color?.withValues(alpha: 0.78), ), ), const SizedBox(height: 8), @@ -610,7 +622,10 @@ class _SignedInAccountPanel extends StatelessWidget { style: Theme.of(context).textTheme.titleSmall, ), subtitle: Text( - appText('查看服务地址、令牌与远端摘要', 'View service URL, tokens, and remote summary'), + appText( + '查看服务地址、令牌与远端摘要', + 'View service URL, tokens, and remote summary', + ), style: Theme.of(context).textTheme.bodySmall, ), children: [ @@ -760,8 +775,6 @@ class _TokenConfiguredSummary extends StatelessWidget { final configured = [ if (accountState?.tokenConfigured.bridge == true) appText('Bridge Token', 'Bridge Token'), - if (accountState?.tokenConfigured.apisix == true) - appText('AI Gateway Token', 'AI Gateway Token'), if (accountState?.tokenConfigured.vault == true) 'Vault Token', ]; final summary = configured.isEmpty diff --git a/lib/features/settings/settings_page_core.dart b/lib/features/settings/settings_page_core.dart index 347b3cb7..2324ffaf 100644 --- a/lib/features/settings/settings_page_core.dart +++ b/lib/features/settings/settings_page_core.dart @@ -111,14 +111,10 @@ class SettingsPage extends StatefulWidget { super.key, required this.controller, this.initialTab = SettingsTab.gateway, - this.initialDetail, - this.navigationContext, }); final AppController controller; final SettingsTab initialTab; - final SettingsDetailPage? initialDetail; - final SettingsNavigationContext? navigationContext; @override State createState() => _SettingsPageState(); @@ -378,8 +374,6 @@ class _SettingsPageState extends State { breadcrumbs: buildSettingsBreadcrumbs( controller, tab: SettingsTab.gateway, - detail: null, - navigationContext: null, ), title: appText('设置', 'Settings'), subtitle: appText( diff --git a/lib/models/app_models.dart b/lib/models/app_models.dart index d64740da..304474e3 100644 --- a/lib/models/app_models.dart +++ b/lib/models/app_models.dart @@ -2,10 +2,7 @@ import 'package:flutter/material.dart'; import '../i18n/app_language.dart'; -enum WorkspaceDestination { - assistant, - settings, -} +enum WorkspaceDestination { assistant, settings } extension WorkspaceDestinationCopy on WorkspaceDestination { String get label => switch (this) { @@ -42,11 +39,7 @@ extension WorkspaceDestinationCopy on WorkspaceDestination { } } -enum AssistantFocusEntry { - settings, - language, - theme, -} +enum AssistantFocusEntry { settings, language, theme } extension AssistantFocusEntryCopy on AssistantFocusEntry { String get label => switch (this) { @@ -164,40 +157,6 @@ extension SettingsTabCopy on SettingsTab { }; } -enum SettingsDetailPage { gatewayConnection } - -extension SettingsDetailPageCopy on SettingsDetailPage { - String get label => switch (this) { - SettingsDetailPage.gatewayConnection => appText( - 'Gateway 连接参数', - 'Gateway Connection', - ), - }; - - SettingsTab get tab => switch (this) { - SettingsDetailPage.gatewayConnection => SettingsTab.gateway, - }; -} - -@immutable -class SettingsNavigationContext { - const SettingsNavigationContext({ - required this.rootLabel, - required this.destination, - this.sectionLabel, - this.settingsTab, - this.gatewayProfileIndex, - this.prefersGatewaySetupCode, - }); - - final String rootLabel; - final WorkspaceDestination destination; - final String? sectionLabel; - final SettingsTab? settingsTab; - final int? gatewayProfileIndex; - final bool? prefersGatewaySetupCode; -} - class QuickAction { const QuickAction({ required this.title, diff --git a/lib/runtime/runtime_controllers_derived_tasks.dart b/lib/runtime/runtime_controllers_derived_tasks.dart index d807a98e..e008785f 100644 --- a/lib/runtime/runtime_controllers_derived_tasks.dart +++ b/lib/runtime/runtime_controllers_derived_tasks.dart @@ -1,15 +1,7 @@ -// ignore_for_file: unused_import, unnecessary_import - -import 'dart:async'; import 'dart:convert'; -import 'dart:io'; + import 'package:flutter/foundation.dart'; -import 'gateway_runtime.dart'; import 'runtime_models.dart'; -import 'secure_config_store.dart'; -import 'runtime_controllers_settings.dart'; -import 'runtime_controllers_gateway.dart'; -import 'runtime_controllers_entities.dart'; class DerivedTasksController extends ChangeNotifier { List queueInternal = const []; @@ -150,11 +142,7 @@ class DerivedTasksController extends ChangeNotifier { bool matchesSessionKey(String incoming, String current) { final left = incoming.trim().toLowerCase(); final right = current.trim().toLowerCase(); - if (left == right) { - return true; - } - return (left == 'agent:main:main' && right == 'main') || - (left == 'main' && right == 'agent:main:main'); + return left == right; } String encodePrettyJson(Object value) { diff --git a/lib/runtime/runtime_controllers_settings_account_impl.dart b/lib/runtime/runtime_controllers_settings_account_impl.dart index 8aa6d489..6845e126 100644 --- a/lib/runtime/runtime_controllers_settings_account_impl.dart +++ b/lib/runtime/runtime_controllers_settings_account_impl.dart @@ -302,11 +302,7 @@ Future syncAccountSettingsInternal( lastSyncSource: syncedBridgeServerUrl, lastSyncError: '', profileScope: 'bridge', - tokenConfigured: const AccountTokenConfigured( - bridge: true, - vault: false, - apisix: false, - ), + tokenConfigured: const AccountTokenConfigured(bridge: true, vault: false), ); await _persistAccountSyncStateInternal(controller, nextState); final currentSettings = controller.snapshotInternal; @@ -334,10 +330,7 @@ Future syncAccountSettingsInternal( : currentModeConfig.cloudSynced.accountIdentifier, lastSyncAt: nextState.lastSyncAtMs, remoteServerSummary: currentModeConfig.cloudSynced.remoteServerSummary - .copyWith( - endpoint: syncedBridgeServerUrl, - hasAdvancedOverrides: false, - ), + .copyWith(endpoint: syncedBridgeServerUrl), ), ); final sanitizedSettings = _sanitizeBridgeOnlyAccountSyncSettings( @@ -413,7 +406,7 @@ Future logoutAccountSettingsInternal( .acpBridgeServerModeConfig .cloudSynced .remoteServerSummary - .copyWith(endpoint: '', hasAdvancedOverrides: false), + .copyWith(endpoint: ''), ); await controller.saveSnapshot( currentSnapshot.copyWith( diff --git a/lib/runtime/runtime_models_account.dart b/lib/runtime/runtime_models_account.dart index d61ee821..d9b4c75e 100644 --- a/lib/runtime/runtime_models_account.dart +++ b/lib/runtime/runtime_models_account.dart @@ -1,6 +1,4 @@ import 'dart:convert'; -import 'runtime_models_configs.dart'; -import 'runtime_models_profiles.dart'; class AccountSessionSummary { const AccountSessionSummary({ @@ -67,41 +65,30 @@ class AccountSessionSummary { } class AccountTokenConfigured { - const AccountTokenConfigured({ - required this.bridge, - required this.vault, - required this.apisix, - }); + const AccountTokenConfigured({required this.bridge, required this.vault}); final bool bridge; final bool vault; - final bool apisix; factory AccountTokenConfigured.defaults() { - return const AccountTokenConfigured( - bridge: false, - vault: false, - apisix: false, - ); + return const AccountTokenConfigured(bridge: false, vault: false); } - AccountTokenConfigured copyWith({bool? bridge, bool? vault, bool? apisix}) { + AccountTokenConfigured copyWith({bool? bridge, bool? vault}) { return AccountTokenConfigured( bridge: bridge ?? this.bridge, vault: vault ?? this.vault, - apisix: apisix ?? this.apisix, ); } Map toJson() { - return {'bridge': bridge, 'vault': vault, 'apisix': apisix}; + return {'bridge': bridge, 'vault': vault}; } factory AccountTokenConfigured.fromJson(Map json) { return AccountTokenConfigured( bridge: json['bridge'] as bool? ?? false, vault: json['vault'] as bool? ?? false, - apisix: json['apisix'] as bool? ?? false, ); } } @@ -170,7 +157,6 @@ class AccountRemoteProfile { required this.bridgeServerOrigin, required this.vaultUrl, required this.vaultNamespace, - required this.apisixUrl, required this.secretLocators, }); @@ -178,7 +164,6 @@ class AccountRemoteProfile { final String bridgeServerOrigin; final String vaultUrl; final String vaultNamespace; - final String apisixUrl; final List secretLocators; factory AccountRemoteProfile.defaults() { @@ -187,7 +172,6 @@ class AccountRemoteProfile { bridgeServerOrigin: '', vaultUrl: '', vaultNamespace: '', - apisixUrl: '', secretLocators: [], ); } @@ -197,7 +181,6 @@ class AccountRemoteProfile { String? bridgeServerOrigin, String? vaultUrl, String? vaultNamespace, - String? apisixUrl, List? secretLocators, }) { return AccountRemoteProfile( @@ -205,7 +188,6 @@ class AccountRemoteProfile { bridgeServerOrigin: bridgeServerOrigin ?? this.bridgeServerOrigin, vaultUrl: vaultUrl ?? this.vaultUrl, vaultNamespace: vaultNamespace ?? this.vaultNamespace, - apisixUrl: apisixUrl ?? this.apisixUrl, secretLocators: secretLocators ?? this.secretLocators, ); } @@ -216,7 +198,6 @@ class AccountRemoteProfile { 'bridgeServerOrigin': bridgeServerOrigin, 'vaultUrl': vaultUrl, 'vaultNamespace': vaultNamespace, - 'apisixUrl': apisixUrl, 'secretLocators': secretLocators .map((item) => item.toJson()) .toList(growable: false), @@ -246,7 +227,6 @@ class AccountRemoteProfile { vaultUrl: json['vaultUrl'] as String? ?? defaults.vaultUrl, vaultNamespace: json['vaultNamespace'] as String? ?? defaults.vaultNamespace, - apisixUrl: json['apisixUrl'] as String? ?? defaults.apisixUrl, secretLocators: decodeLocators(json['secretLocators']), ); } @@ -266,36 +246,22 @@ class AccountRemoteProfile { } class AcpBridgeServerRemoteServerSummary { - const AcpBridgeServerRemoteServerSummary({ - required this.endpoint, - required this.hasAdvancedOverrides, - }); + const AcpBridgeServerRemoteServerSummary({required this.endpoint}); final String endpoint; - final bool hasAdvancedOverrides; factory AcpBridgeServerRemoteServerSummary.defaults() { - return const AcpBridgeServerRemoteServerSummary( - endpoint: '', - hasAdvancedOverrides: false, - ); + return const AcpBridgeServerRemoteServerSummary(endpoint: ''); } - AcpBridgeServerRemoteServerSummary copyWith({ - String? endpoint, - bool? hasAdvancedOverrides, - }) { + AcpBridgeServerRemoteServerSummary copyWith({String? endpoint}) { return AcpBridgeServerRemoteServerSummary( endpoint: endpoint ?? this.endpoint, - hasAdvancedOverrides: hasAdvancedOverrides ?? this.hasAdvancedOverrides, ); } Map toJson() { - return { - 'endpoint': endpoint, - 'hasAdvancedOverrides': hasAdvancedOverrides, - }; + return {'endpoint': endpoint}; } factory AcpBridgeServerRemoteServerSummary.fromJson( @@ -303,7 +269,6 @@ class AcpBridgeServerRemoteServerSummary { ) { return AcpBridgeServerRemoteServerSummary( endpoint: json['endpoint'] as String? ?? '', - hasAdvancedOverrides: json['hasAdvancedOverrides'] as bool? ?? false, ); } } @@ -419,92 +384,6 @@ class AcpBridgeServerSelfHostedConfig { } } -class AcpBridgeServerAdvancedOverrides { - const AcpBridgeServerAdvancedOverrides({ - required this.gatewayProfiles, - required this.vault, - required this.aiGateway, - required this.authorizedSkillDirectories, - }); - - final List gatewayProfiles; - final VaultConfig vault; - final AiGatewayProfile aiGateway; - final List authorizedSkillDirectories; - - factory AcpBridgeServerAdvancedOverrides.defaults() { - return AcpBridgeServerAdvancedOverrides( - gatewayProfiles: normalizeGatewayProfiles(), - vault: VaultConfig.defaults(), - aiGateway: AiGatewayProfile.defaults(), - authorizedSkillDirectories: normalizeAuthorizedSkillDirectories(), - ); - } - - AcpBridgeServerAdvancedOverrides copyWith({ - List? gatewayProfiles, - VaultConfig? vault, - AiGatewayProfile? aiGateway, - List? authorizedSkillDirectories, - }) { - return AcpBridgeServerAdvancedOverrides( - gatewayProfiles: gatewayProfiles != null - ? normalizeGatewayProfiles(profiles: gatewayProfiles) - : this.gatewayProfiles, - vault: vault ?? this.vault, - aiGateway: aiGateway ?? this.aiGateway, - authorizedSkillDirectories: authorizedSkillDirectories != null - ? normalizeAuthorizedSkillDirectories( - directories: authorizedSkillDirectories, - ) - : this.authorizedSkillDirectories, - ); - } - - Map toJson() { - return { - 'gatewayProfiles': gatewayProfiles - .map((item) => item.toJson()) - .toList(growable: false), - 'vault': vault.toJson(), - 'aiGateway': aiGateway.toJson(), - 'authorizedSkillDirectories': authorizedSkillDirectories - .map((item) => item.toJson()) - .toList(growable: false), - }; - } - - factory AcpBridgeServerAdvancedOverrides.fromJson(Map json) { - return AcpBridgeServerAdvancedOverrides( - gatewayProfiles: normalizeGatewayProfiles( - profiles: ((json['gatewayProfiles'] as List?) ?? const []) - .whereType() - .map( - (item) => GatewayConnectionProfile.fromJson( - item.cast(), - ), - ), - ), - vault: VaultConfig.fromJson( - (json['vault'] as Map?)?.cast() ?? const {}, - ), - aiGateway: AiGatewayProfile.fromJson( - (json['aiGateway'] as Map?)?.cast() ?? const {}, - ), - authorizedSkillDirectories: normalizeAuthorizedSkillDirectories( - directories: - ((json['authorizedSkillDirectories'] as List?) ?? const []) - .whereType() - .map( - (item) => AuthorizedSkillDirectory.fromJson( - item.cast(), - ), - ), - ), - ); - } -} - class AcpBridgeServerEffectiveConfig { const AcpBridgeServerEffectiveConfig({ required this.endpoint, @@ -565,20 +444,17 @@ class AcpBridgeServerModeConfig { required this.effective, required this.cloudSynced, required this.selfHosted, - required this.advancedOverrides, }); final AcpBridgeServerEffectiveConfig effective; final AcpBridgeServerCloudSyncConfig cloudSynced; final AcpBridgeServerSelfHostedConfig selfHosted; - final AcpBridgeServerAdvancedOverrides advancedOverrides; factory AcpBridgeServerModeConfig.defaults() { return AcpBridgeServerModeConfig( effective: AcpBridgeServerEffectiveConfig.defaults(), cloudSynced: AcpBridgeServerCloudSyncConfig.defaults(), selfHosted: AcpBridgeServerSelfHostedConfig.defaults(), - advancedOverrides: AcpBridgeServerAdvancedOverrides.defaults(), ); } @@ -586,22 +462,14 @@ class AcpBridgeServerModeConfig { AcpBridgeServerEffectiveConfig? effective, AcpBridgeServerCloudSyncConfig? cloudSynced, AcpBridgeServerSelfHostedConfig? selfHosted, - AcpBridgeServerAdvancedOverrides? advancedOverrides, }) { return AcpBridgeServerModeConfig( effective: effective ?? this.effective, cloudSynced: cloudSynced ?? this.cloudSynced, selfHosted: selfHosted ?? this.selfHosted, - advancedOverrides: advancedOverrides ?? this.advancedOverrides, ); } - bool get usesSelfHostedBase => effective.source == 'bridge'; - - bool get usesCloudSyncBase => !usesSelfHostedBase; - - String get sourceTag => effective.source; - String toJsonString() => jsonEncode(toJson()); Map toJson() { @@ -609,7 +477,6 @@ class AcpBridgeServerModeConfig { 'effective': effective.toJson(), 'cloudSynced': cloudSynced.toJson(), 'selfHosted': selfHosted.toJson(), - 'advancedOverrides': advancedOverrides.toJson(), }; } @@ -624,10 +491,6 @@ class AcpBridgeServerModeConfig { selfHosted: AcpBridgeServerSelfHostedConfig.fromJson( (json['selfHosted'] as Map?)?.cast() ?? const {}, ), - advancedOverrides: AcpBridgeServerAdvancedOverrides.fromJson( - (json['advancedOverrides'] as Map?)?.cast() ?? - const {}, - ), ); } } diff --git a/lib/runtime/runtime_models_configs.dart b/lib/runtime/runtime_models_configs.dart index 25848b17..42ad9b12 100644 --- a/lib/runtime/runtime_models_configs.dart +++ b/lib/runtime/runtime_models_configs.dart @@ -51,20 +51,6 @@ class GatewayConnectionProfile { ); } - factory GatewayConnectionProfile.emptySlot({required int index}) { - return GatewayConnectionProfile( - mode: RuntimeConnectionMode.unconfigured, - useSetupCode: false, - setupCode: '', - host: '', - port: 443, - tls: true, - tokenRef: 'gateway_token_$index', - passwordRef: 'gateway_password_$index', - selectedAgentId: '', - ); - } - GatewayConnectionProfile copyWith({ RuntimeConnectionMode? mode, bool? useSetupCode, @@ -129,81 +115,43 @@ class GatewayConnectionProfile { } } -const int kGatewayProfileListLength = 4; +const int kGatewayProfileListLength = 1; const int kGatewayRemoteProfileIndex = 0; -const int kGatewayCustomProfileStartIndex = 1; List normalizeGatewayProfiles({ Iterable? profiles, }) { - final defaults = List.generate( - kGatewayProfileListLength, - (index) => switch (index) { - kGatewayRemoteProfileIndex => GatewayConnectionProfile.defaultsGateway(), - _ => GatewayConnectionProfile.emptySlot(index: index), - }, - growable: false, - ); + final fallback = GatewayConnectionProfile.defaultsGateway(); final incoming = profiles?.toList(growable: false) ?? const []; - final normalized = []; - for (var index = 0; index < kGatewayProfileListLength; index += 1) { - final fallback = defaults[index]; - final current = index < incoming.length ? incoming[index] : fallback; - if (index == kGatewayRemoteProfileIndex) { - final hasEndpoint = - current.host.trim().isNotEmpty && - current.port > 0 && - !_isGatewayLoopbackHost(current.host); - final slotMode = switch (current.mode) { - RuntimeConnectionMode.remote => RuntimeConnectionMode.remote, - RuntimeConnectionMode.unconfigured => - hasEndpoint - ? RuntimeConnectionMode.remote - : RuntimeConnectionMode.unconfigured, - }; - normalized.add( - current.copyWith( - mode: slotMode, - useSetupCode: current.useSetupCode, - setupCode: current.setupCode, - host: hasEndpoint ? current.host : fallback.host, - port: current.port > 0 ? current.port : fallback.port, - tls: hasEndpoint ? current.tls : fallback.tls, - tokenRef: current.tokenRef.trim().isEmpty - ? fallback.tokenRef - : current.tokenRef, - passwordRef: current.passwordRef.trim().isEmpty - ? fallback.passwordRef - : current.passwordRef, - ), - ); - continue; - } - final slotMode = switch (current.mode) { - RuntimeConnectionMode.remote => RuntimeConnectionMode.remote, - RuntimeConnectionMode.unconfigured => - current.host.trim().isNotEmpty && !_isGatewayLoopbackHost(current.host) - ? RuntimeConnectionMode.remote - : RuntimeConnectionMode.unconfigured, - }; - normalized.add( - current.copyWith( - mode: slotMode, - useSetupCode: current.useSetupCode, - setupCode: current.setupCode, - port: current.port > 0 ? current.port : 443, - tls: current.tls, - tokenRef: current.tokenRef.trim().isEmpty - ? fallback.tokenRef - : current.tokenRef, - passwordRef: current.passwordRef.trim().isEmpty - ? fallback.passwordRef - : current.passwordRef, - ), - ); - } - return List.unmodifiable(normalized); + final current = incoming.isNotEmpty ? incoming.first : fallback; + final hasEndpoint = + current.host.trim().isNotEmpty && + current.port > 0 && + !_isGatewayLoopbackHost(current.host); + final slotMode = switch (current.mode) { + RuntimeConnectionMode.remote => RuntimeConnectionMode.remote, + RuntimeConnectionMode.unconfigured => + hasEndpoint + ? RuntimeConnectionMode.remote + : RuntimeConnectionMode.unconfigured, + }; + return List.unmodifiable([ + current.copyWith( + mode: slotMode, + useSetupCode: current.useSetupCode, + setupCode: current.setupCode, + host: hasEndpoint ? current.host : fallback.host, + port: current.port > 0 ? current.port : fallback.port, + tls: hasEndpoint ? current.tls : fallback.tls, + tokenRef: current.tokenRef.trim().isEmpty + ? fallback.tokenRef + : current.tokenRef, + passwordRef: current.passwordRef.trim().isEmpty + ? fallback.passwordRef + : current.passwordRef, + ), + ]); } bool _isGatewayLoopbackHost(String host) { @@ -213,14 +161,12 @@ bool _isGatewayLoopbackHost(String host) { List replaceGatewayProfileAt( List profiles, - int index, + int _, GatewayConnectionProfile profile, ) { - final normalizedProfiles = normalizeGatewayProfiles(profiles: profiles); - final next = List.from(normalizedProfiles); - final clampedIndex = index.clamp(0, kGatewayProfileListLength - 1); - next[clampedIndex] = profile; - return normalizeGatewayProfiles(profiles: next); + return normalizeGatewayProfiles( + profiles: [profile], + ); } ({String host, int port, bool tls}) normalizeGatewayManualEndpointInternal({ @@ -512,14 +458,9 @@ class AiGatewayProfile { (item) => availableModels.isEmpty || availableModels.contains(item), ) .toList(growable: false); - final legacyFilePath = json['filePath'] as String?; - final legacyBaseUrl = - legacyFilePath != null && legacyFilePath.trim().startsWith('http') - ? legacyFilePath.trim() - : null; return AiGatewayProfile( name: json['name'] as String? ?? defaults.name, - baseUrl: json['baseUrl'] as String? ?? legacyBaseUrl ?? defaults.baseUrl, + baseUrl: json['baseUrl'] as String? ?? defaults.baseUrl, apiKeyRef: json['apiKeyRef'] as String? ?? defaults.apiKeyRef, availableModels: availableModels, selectedModels: selectedModels, diff --git a/lib/runtime/runtime_models_settings_snapshot.dart b/lib/runtime/runtime_models_settings_snapshot.dart index ed88a392..1134de6b 100644 --- a/lib/runtime/runtime_models_settings_snapshot.dart +++ b/lib/runtime/runtime_models_settings_snapshot.dart @@ -301,9 +301,7 @@ class SettingsSnapshot { (json['vault'] as Map?)?.cast() ?? const {}, ), aiGateway: AiGatewayProfile.fromJson( - (json['aiGateway'] as Map?)?.cast() ?? - (json['apisix'] as Map?)?.cast() ?? - const {}, + (json['aiGateway'] as Map?)?.cast() ?? const {}, ), webSessionPersistence: WebSessionPersistenceConfig.fromJson( (json['webSessionPersistence'] as Map?)?.cast() ?? diff --git a/lib/runtime/secret_store.dart b/lib/runtime/secret_store.dart index 78fc077b..e4da38c1 100644 --- a/lib/runtime/secret_store.dart +++ b/lib/runtime/secret_store.dart @@ -108,7 +108,8 @@ class SecretStore { bool _initialized = false; PersistentWriteFailure? _secretsWriteFailure; - Map get secureRefs => Map.unmodifiable(_memorySecure); + Map get secureRefs => + Map.unmodifiable(_memorySecure); PersistentWriteFailure? get secretsWriteFailure => _secretsWriteFailure; @@ -133,16 +134,9 @@ class SecretStore { } Future loadGatewayToken({int? profileIndex}) async { - if (profileIndex != null) { - return _readSecure(_gatewayTokenKeyForProfile(profileIndex)); - } - for (final index in _gatewayProfileFallbackOrder) { - final scopedValue = await _readSecure(_gatewayTokenKeyForProfile(index)); - if ((scopedValue ?? '').trim().isNotEmpty) { - return scopedValue; - } - } - return null; + return _readSecure( + _gatewayTokenKeyForProfile(profileIndex ?? kGatewayRemoteProfileIndex), + ); } Future saveGatewayToken(String value, {int? profileIndex}) => @@ -156,18 +150,9 @@ class SecretStore { ); Future loadGatewayPassword({int? profileIndex}) async { - if (profileIndex != null) { - return _readSecure(_gatewayPasswordKeyForProfile(profileIndex)); - } - for (final index in _gatewayProfileFallbackOrder) { - final scopedValue = await _readSecure( - _gatewayPasswordKeyForProfile(index), - ); - if ((scopedValue ?? '').trim().isNotEmpty) { - return scopedValue; - } - } - return null; + return _readSecure( + _gatewayPasswordKeyForProfile(profileIndex ?? kGatewayRemoteProfileIndex), + ); } Future saveGatewayPassword(String value, {int? profileIndex}) => @@ -471,13 +456,6 @@ class SecretStore { static String _gatewayPasswordRefKey(int profileIndex) => 'gateway_password_$profileIndex'; - static const List _gatewayProfileFallbackOrder = [ - kGatewayRemoteProfileIndex, - 1, - 2, - 3, - ]; - static String _accountManagedSecretKey(String target) => 'xworkmate.account.managed.${target.trim()}'; diff --git a/lib/widgets/settings_page_shell.dart b/lib/widgets/settings_page_shell.dart index dae6b7b2..b88c10d2 100644 --- a/lib/widgets/settings_page_shell.dart +++ b/lib/widgets/settings_page_shell.dart @@ -1,82 +1,7 @@ import 'package:flutter/material.dart'; -import '../models/app_models.dart'; -import 'surface_card.dart'; import 'top_bar.dart'; -List buildOrderedSettingsSections({ - required List availableTabs, - required SettingsTab currentTab, - required List Function(SettingsTab tab) buildTabContent, - double gap = 24, -}) { - final orderedTabs = [ - currentTab, - ...availableTabs.where((item) => item != currentTab), - ]; - final sections = []; - for (final tab in orderedTabs) { - final content = buildTabContent(tab); - if (content.isEmpty) { - continue; - } - if (sections.isNotEmpty) { - sections.add(SizedBox(height: gap)); - } - sections.addAll(content); - } - return sections; -} - -class SettingsGlobalApplyCard extends StatelessWidget { - const SettingsGlobalApplyCard({ - super.key, - required this.message, - required this.onApply, - this.applyLabel = 'Save & apply', - this.title = 'Settings Submission', - }); - - final String title; - final String message; - final String applyLabel; - final VoidCallback? onApply; - - @override - Widget build(BuildContext context) { - final theme = Theme.of(context); - return SurfaceCard( - child: Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text(title, style: theme.textTheme.titleMedium), - const SizedBox(height: 6), - Text(message, style: theme.textTheme.bodyMedium), - ], - ), - ), - const SizedBox(width: 16), - Wrap( - spacing: 10, - runSpacing: 10, - children: [ - FilledButton.tonal( - key: const ValueKey('settings-global-apply-button'), - onPressed: onApply, - child: Text(applyLabel), - ), - ], - ), - ], - ), - ); - } -} - class SettingsPageBodyShell extends StatelessWidget { const SettingsPageBodyShell({ super.key, diff --git a/macos/Frameworks/README.md b/macos/Frameworks/README.md deleted file mode 100644 index 5ea0cc3e..00000000 --- a/macos/Frameworks/README.md +++ /dev/null @@ -1,42 +0,0 @@ -# macOS Frameworks - -This directory contains native libraries for macOS integration. - -## libcodex_ffi.dylib - -The Rust FFI library for Codex CLI integration. - -### Building - -Run the build script from the project root: - -```bash -make rust-build-release -``` - -### Integration - -The library is linked by the Xcode project and loaded at runtime by `CodexFFIBindings`. - -### Architecture - -- `libcodex_ffi.dylib` - Universal binary (arm64 + x86_64) -- `libcodex_ffi.a` - Static library (for debugging) - -### FFI Functions - -| Function | Description | -|----------|-------------| -| `codex_init()` | Initialize the library | -| `codex_runtime_create()` | Create a runtime instance | -| `codex_runtime_destroy()` | Destroy a runtime instance | -| `codex_start_thread()` | Start a new thread | -| `codex_send_message()` | Send a message | -| `codex_poll_events()` | Poll for events | -| `codex_shutdown()` | Shutdown the runtime | -| `codex_last_error()` | Get last error message | - -### Dependencies - -- macOS 11.0 or later -- No external dependencies beyond system libraries diff --git a/macos/Runner.xcodeproj/add_ffi_framework.sh b/macos/Runner.xcodeproj/add_ffi_framework.sh deleted file mode 100755 index 22086168..00000000 --- a/macos/Runner.xcodeproj/add_ffi_framework.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/bash -# Script to add FFI framework to Xcode project -# Run this once to configure the project to link libcodex_ffi.dylib - -PROJECT_FILE="project.pbxproj" - -# Check if already added -if grep -q "libcodex_ffi.dylib" "$PROJECT_FILE" 2>/dev/null; then - echo "FFI library already configured in project" - exit 0 -fi - -echo "Note: This script is for reference." -echo "To add the FFI library manually in Xcode:" -echo "" -echo "1. Open Runner.xcodeproj in Xcode" -echo "2. Select Runner target" -echo "3. Go to Build Phases > Link Binary With Libraries" -echo "4. Click '+' and add 'libcodex_ffi.dylib'" -echo "5. Set 'Framework Search Paths' to include '\$(PROJECT_DIR)/Frameworks'" -echo "6. Set 'Runpath Search Paths' to include '@executable_path/../Frameworks'" -echo "" -echo "Alternatively, use the Podfile to add a vendored framework:" -echo "" -echo " pod 'CodexFFI', :path => '../rust'" diff --git a/pubspec.lock b/pubspec.lock index 3b8f4dd8..8ffb18df 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -138,7 +138,7 @@ packages: source: hosted version: "1.3.3" ffi: - dependency: "direct main" + dependency: transitive description: name: ffi sha256: "6d7fd89431262d8f3125e81b50d3847a091d846eafcd4fdb88dd06f36d705a45" diff --git a/pubspec.yaml b/pubspec.yaml index dd794e17..37dcdc1f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -18,7 +18,6 @@ dependencies: cryptography: ^2.6.1 crypto: ^3.0.6 device_info_plus: ^11.5.0 - ffi: ^2.1.4 file_selector: ^1.0.3 flutter_html: ^3.0.0 flutter_markdown: ^0.7.7+1 diff --git a/scripts/check-no-app-ffi.sh b/scripts/check-no-app-ffi.sh new file mode 100755 index 00000000..721176fa --- /dev/null +++ b/scripts/check-no-app-ffi.sh @@ -0,0 +1,43 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)" + +forbidden_paths=( + "scripts/copy_ffi_framework.sh" + "scripts/generate_ffi_bindings.sh" + "scripts/integrate_rust_flutter.sh" + "flutter_rust_bridge.yaml" + "lib/runtime/codex_ffi_generated.dart" + "macos/Frameworks/libcodex_ffi.dylib" + "macos/Frameworks/README.md" + "macos/Runner.xcodeproj/add_ffi_framework.sh" +) + +failures=0 +for relative_path in "${forbidden_paths[@]}"; do + if [[ -e "$ROOT_DIR/$relative_path" ]]; then + echo "Forbidden app-side FFI artifact remains: $relative_path" >&2 + failures=$((failures + 1)) + fi +done + +if rg -n \ + "copy_ffi_framework|generate_ffi_bindings|integrate_rust_flutter|flutter_rust_bridge|libcodex_ffi|codex_ffi_generated|ffi-(copy|generate|integrate)|build-macos-ffi" \ + "$ROOT_DIR/Makefile" \ + "$ROOT_DIR/scripts" \ + "$ROOT_DIR/lib" \ + "$ROOT_DIR/macos/Runner.xcodeproj" \ + --glob '!scripts/check-no-app-ffi.sh' \ + --glob '!**/Pods/**' \ + --glob '!**/Flutter/ephemeral/**' \ + --glob '!**/build/**'; then + echo "Forbidden app-side FFI integration reference found." >&2 + failures=$((failures + 1)) +fi + +if [[ "$failures" -ne 0 ]]; then + exit 1 +fi + +echo "No app-side Codex FFI integration artifacts found." diff --git a/scripts/ci/run_code_analysis.sh b/scripts/ci/run_code_analysis.sh index f3eff957..03861824 100755 --- a/scripts/ci/run_code_analysis.sh +++ b/scripts/ci/run_code_analysis.sh @@ -2,4 +2,5 @@ set -euo pipefail flutter pub get +bash scripts/check-no-app-ffi.sh flutter analyze diff --git a/scripts/ci/run_flutter_ci_suite.sh b/scripts/ci/run_flutter_ci_suite.sh index b48ca5a2..2a23664f 100755 --- a/scripts/ci/run_flutter_ci_suite.sh +++ b/scripts/ci/run_flutter_ci_suite.sh @@ -2,6 +2,7 @@ set -euo pipefail flutter pub get +bash scripts/check-no-app-ffi.sh flutter analyze flutter test test/runtime/assistant_execution_target_test.dart flutter test test/runtime/runtime_controllers_settings_account_test.dart diff --git a/scripts/copy_ffi_framework.sh b/scripts/copy_ffi_framework.sh deleted file mode 100755 index 6e63fb24..00000000 --- a/scripts/copy_ffi_framework.sh +++ /dev/null @@ -1,44 +0,0 @@ -#!/bin/bash -# Copy FFI library to macOS Frameworks -# Add this to Xcode Build Phases > Run Script - -set -e - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" -FRAMEWORKS_DIR="$PROJECT_ROOT/macos/Frameworks" -RUST_DIR="$PROJECT_ROOT/rust" - -# Source FFI library location -UNIVERSAL_LIB="$RUST_DIR/target/universal/libcodex_ffi.dylib" -ARM_LIB="$RUST_DIR/target/aarch64-apple-darwin/release/libcodex_ffi.dylib" -RELEASE_LIB="$RUST_DIR/target/release/libcodex_ffi.dylib" -DEBUG_LIB="$RUST_DIR/target/debug/libcodex_ffi.dylib" - -# Ensure Frameworks directory exists -mkdir -p "$FRAMEWORKS_DIR" - -# Copy universal binary if available, otherwise fall back to single architecture -if [[ -f "$UNIVERSAL_LIB" ]]; then - echo "Copying universal FFI library..." - cp "$UNIVERSAL_LIB" "$FRAMEWORKS_DIR/" -elif [[ -f "$ARM_LIB" ]]; then - echo "Copying arm64 FFI library..." - cp "$ARM_LIB" "$FRAMEWORKS_DIR/" -elif [[ -f "$RELEASE_LIB" ]]; then - echo "Copying release FFI library..." - cp "$RELEASE_LIB" "$FRAMEWORKS_DIR/" -elif [[ -f "$DEBUG_LIB" ]]; then - echo "Copying debug FFI library..." - cp "$DEBUG_LIB" "$FRAMEWORKS_DIR/" -else - echo "Warning: FFI library not found. Run make rust-build-release first." - echo "Expected one of:" - echo " - $UNIVERSAL_LIB" - echo " - $ARM_LIB" - echo " - $RELEASE_LIB" - echo " - $DEBUG_LIB" - exit 0 # Don't fail the build if library doesn't exist yet -fi - -echo "FFI library copied to $FRAMEWORKS_DIR/" diff --git a/scripts/generate_ffi_bindings.sh b/scripts/generate_ffi_bindings.sh deleted file mode 100755 index a8c39ff6..00000000 --- a/scripts/generate_ffi_bindings.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/bash -# Generate FFI bindings using flutter_rust_bridge -# Usage: ./scripts/generate_ffi_bindings.sh - -set -e - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" - -echo "Generating FFI bindings..." - -# Check if flutter_rust_bridge is installed -if ! command -v flutter_rust_bridge_codegen &> /dev/null; then - echo "Installing flutter_rust_bridge_codegen..." - cargo install flutter_rust_bridge_codegen --version 2.0.0 -fi - -# Generate bindings -cd "$PROJECT_ROOT" - -flutter_rust_bridge_codegen \ - --rust-input rust/src/lib.rs \ - --dart-output lib/runtime/codex_ffi_generated.dart \ - --dart-format-line-length 120 \ - --c-symbol-prefix codex_ - -echo "FFI bindings generated!" -echo "Dart output: lib/runtime/codex_ffi_generated.dart" - -# Generate C header for reference -cbindgen rust/src/lib.rs -o rust/codex_ffi.h 2>/dev/null || echo "cbindgen not installed, skipping C header generation" - -echo "Done!" diff --git a/scripts/integrate_rust_flutter.sh b/scripts/integrate_rust_flutter.sh deleted file mode 100755 index a891abbf..00000000 --- a/scripts/integrate_rust_flutter.sh +++ /dev/null @@ -1,49 +0,0 @@ -#!/bin/bash -# Integrate Rust FFI library with Flutter macOS build -# This script should be run before flutter build macos - -set -e - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" - -echo "Integrating Rust FFI with Flutter..." - -# Build Rust library if not exists -RUST_LIB="$PROJECT_ROOT/rust/target/universal/libcodex_ffi.dylib" -if [[ ! -f "$RUST_LIB" ]]; then - echo "Rust library not found. Please build it manually or ensure it exists in target/." -fi - -# Ensure Frameworks directory exists -FRAMEWORKS_DIR="$PROJECT_ROOT/macos/Frameworks" -mkdir -p "$FRAMEWORKS_DIR" - -# Copy library -if [[ -f "$RUST_LIB" ]]; then - cp "$RUST_LIB" "$FRAMEWORKS_DIR/" - echo "Copied libcodex_ffi.dylib to $FRAMEWORKS_DIR/" -else - echo "Warning: Universal binary not found, using arm64..." - ARM_LIB="$PROJECT_ROOT/rust/target/aarch64-apple-darwin/release/libcodex_ffi.dylib" - if [[ -f "$ARM_LIB" ]]; then - cp "$ARM_LIB" "$FRAMEWORKS_DIR/" - echo "Copied arm64 library to $FRAMEWORKS_DIR/" - fi -fi - -# Update Xcode project to link the library -# This would typically be done via Xcode build phases -echo "" -echo "Note: You may need to add the following to your Xcode project:" -echo " 1. Add libcodex_ffi.dylib to 'Link Binary With Libraries' build phase" -echo " 2. Add macos/Frameworks to 'Framework Search Paths'" -echo "" - -# Generate FFI bindings if needed -if [[ ! -f "$PROJECT_ROOT/lib/runtime/codex_ffi_generated.dart" ]]; then - echo "Generating FFI bindings..." - "$SCRIPT_DIR/generate_ffi_bindings.sh" -fi - -echo "Integration complete!" diff --git a/scripts/package-flutter-mac-app.sh b/scripts/package-flutter-mac-app.sh index 0499a7f7..13235824 100755 --- a/scripts/package-flutter-mac-app.sh +++ b/scripts/package-flutter-mac-app.sh @@ -102,17 +102,6 @@ if [[ ! -d "$BUILD_APP_PATH" ]]; then exit 1 fi -# Ensure FFI library is embedded if it was copied to macos/Frameworks -SOURCE_FFI_LIB="$ROOT_DIR/macos/Frameworks/libcodex_ffi.dylib" -TARGET_FFI_LIB="$BUILD_APP_PATH/Contents/Frameworks/libcodex_ffi.dylib" -if [[ -f "$SOURCE_FFI_LIB" ]]; then - echo "Embedding FFI library into app bundle..." - mkdir -p "$(dirname "$TARGET_FFI_LIB")" - cp "$SOURCE_FFI_LIB" "$TARGET_FFI_LIB" - # Fix install name to be @rpath-based so it is portable within the bundle - install_name_tool -id "@rpath/$(basename "$TARGET_FFI_LIB")" "$TARGET_FFI_LIB" -fi - # Embed xworkmate-go-core for local/non-App-Store builds if available if [[ "${XWORKMATE_APP_STORE:-}" != "true" ]]; then SOURCE_GO_CORE="$ROOT_DIR/build/bin/xworkmate-go-core" diff --git a/test/features/assistant/assistant_task_model_cleanup_test.dart b/test/features/assistant/assistant_task_model_cleanup_test.dart new file mode 100644 index 00000000..7f8f814e --- /dev/null +++ b/test/features/assistant/assistant_task_model_cleanup_test.dart @@ -0,0 +1,23 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:xworkmate/features/assistant/assistant_page_task_models.dart'; + +void main() { + group('assistant task model cleanup', () { + test('session key matching is exact and does not alias runtime main', () { + expect( + sessionKeysMatchInternal('draft:test-task', 'draft:test-task'), + isTrue, + ); + expect(sessionKeysMatchInternal('agent:main:main', 'main'), isFalse); + expect(sessionKeysMatchInternal('main', 'agent:main:main'), isFalse); + }); + + test('main runtime ids are displayed as ids, not app default tasks', () { + expect(fallbackSessionTitleInternal('main'), 'main'); + expect( + fallbackSessionTitleInternal('agent:main:main'), + 'agent:main:main', + ); + }); + }); +} diff --git a/test/features/settings/settings_account_panel_test.dart b/test/features/settings/settings_account_panel_test.dart index dc982404..4354ebbf 100644 --- a/test/features/settings/settings_account_panel_test.dart +++ b/test/features/settings/settings_account_panel_test.dart @@ -114,7 +114,6 @@ void main() { tokenConfigured: const AccountTokenConfigured( bridge: true, vault: false, - apisix: false, ), ), accountBusy: false, @@ -211,7 +210,6 @@ void main() { tokenConfigured: const AccountTokenConfigured( bridge: true, vault: false, - apisix: false, ), ), accountBusy: false, diff --git a/test/runtime/assistant_execution_target_test.dart b/test/runtime/assistant_execution_target_test.dart index 6aa221da..508a63b5 100644 --- a/test/runtime/assistant_execution_target_test.dart +++ b/test/runtime/assistant_execution_target_test.dart @@ -57,6 +57,49 @@ void main() { expect(provider.label, kCanonicalGatewayProviderLabel); }); + test( + 'normalizes OpenClaw from provider catalog into selectable gateway mode', + () async { + final controller = AppController( + environmentOverride: const {}, + initialBridgeProviderCatalog: const [ + SingleAgentProvider.codex, + SingleAgentProvider.openclaw, + ], + initialAvailableExecutionTargets: const [ + AssistantExecutionTarget.agent, + ], + ); + addTearDown(controller.dispose); + + expect( + controller.assistantProviderCatalog.map((item) => item.providerId), + const ['codex'], + ); + expect( + controller.gatewayProviderCatalog.map((item) => item.providerId), + const [kCanonicalGatewayProviderId], + ); + expect( + controller.bridgeAvailableExecutionTargets, + const [ + AssistantExecutionTarget.agent, + AssistantExecutionTarget.gateway, + ], + ); + + await controller.sessionsController.switchSession('draft:test-task-a'); + await controller.setAssistantExecutionTarget( + AssistantExecutionTarget.gateway, + ); + + expect( + controller.assistantProviderForSession('draft:test-task-a'), + SingleAgentProvider.openclaw, + ); + }, + ); + test( 'switching a session to gateway uses the bridge-provided gateway catalog', () async { @@ -508,7 +551,6 @@ void main() { tokenConfigured: const AccountTokenConfigured( bridge: true, vault: false, - apisix: false, ), ), ); @@ -653,7 +695,6 @@ void main() { tokenConfigured: const AccountTokenConfigured( bridge: true, vault: false, - apisix: false, ), ), ); @@ -694,7 +735,6 @@ void main() { tokenConfigured: const AccountTokenConfigured( bridge: true, vault: false, - apisix: false, ), ); diff --git a/test/runtime/bridge_runtime_cleanup_test.dart b/test/runtime/bridge_runtime_cleanup_test.dart index 38a32477..b38c7f45 100644 --- a/test/runtime/bridge_runtime_cleanup_test.dart +++ b/test/runtime/bridge_runtime_cleanup_test.dart @@ -41,7 +41,6 @@ void main() { tokenConfigured: const AccountTokenConfigured( bridge: true, vault: false, - apisix: false, ), ), ); @@ -79,22 +78,19 @@ void main() { }, ); - test( - 'keeps the managed bridge endpoint fixed when signed out', - () { - final controller = AppController( - environmentOverride: const { - 'BRIDGE_SERVER_URL': 'https://stale.example.invalid', - }, - ); - addTearDown(controller.dispose); + test('keeps the managed bridge endpoint fixed when signed out', () { + final controller = AppController( + environmentOverride: const { + 'BRIDGE_SERVER_URL': 'https://stale.example.invalid', + }, + ); + addTearDown(controller.dispose); - expect( - controller.resolveBridgeAcpEndpointInternal()?.toString(), - kManagedBridgeServerUrl, - ); - }, - ); + expect( + controller.resolveBridgeAcpEndpointInternal()?.toString(), + kManagedBridgeServerUrl, + ); + }); test( 'resolves raw bridge token only for the current managed bridge endpoint', @@ -133,19 +129,21 @@ void main() { tokenConfigured: const AccountTokenConfigured( bridge: true, vault: false, - apisix: false, ), ), ); final controller = AppController( - environmentOverride: const {},store: store); + environmentOverride: const {}, + store: store, + ); addTearDown(controller.dispose); await controller.settingsControllerInternal.initialize(); - final bridgeHeader = await controller.resolveGatewayAcpAuthorizationHeaderInternal( - Uri.parse('$kManagedBridgeServerUrl/acp/rpc'), - ); + final bridgeHeader = await controller + .resolveGatewayAcpAuthorizationHeaderInternal( + Uri.parse('$kManagedBridgeServerUrl/acp/rpc'), + ); final unrelatedHeader = await controller .resolveGatewayAcpAuthorizationHeaderInternal( Uri.parse('https://unrelated.example.com/acp/rpc'), @@ -159,7 +157,9 @@ void main() { test( 'runtime coordinator only exposes remote and offline gateway modes', () { - final controller = AppController(environmentOverride: const {}); + final controller = AppController( + environmentOverride: const {}, + ); addTearDown(controller.dispose); expect( diff --git a/test/runtime/gateway_profile_cleanup_test.dart b/test/runtime/gateway_profile_cleanup_test.dart new file mode 100644 index 00000000..b2d87669 --- /dev/null +++ b/test/runtime/gateway_profile_cleanup_test.dart @@ -0,0 +1,77 @@ +import 'dart:io'; + +import 'package:flutter_test/flutter_test.dart'; +import 'package:xworkmate/runtime/runtime_controllers.dart'; +import 'package:xworkmate/runtime/runtime_models.dart'; +import 'package:xworkmate/runtime/secret_store.dart'; + +void main() { + group('Gateway profile cleanup', () { + test('normalizes settings to the single Bridge profile', () { + final snapshot = SettingsSnapshot.defaults().copyWith( + gatewayProfiles: [ + GatewayConnectionProfile.defaults().copyWith( + mode: RuntimeConnectionMode.remote, + host: 'xworkmate-bridge.svc.plus', + port: 443, + tls: true, + ), + GatewayConnectionProfile.defaults().copyWith( + mode: RuntimeConnectionMode.remote, + host: 'stale-local-gateway.example.com', + port: 18789, + tls: false, + tokenRef: 'gateway_token_1', + ), + ], + ); + + expect(snapshot.gatewayProfiles, hasLength(1)); + expect(snapshot.primaryGatewayProfile.host, 'xworkmate-bridge.svc.plus'); + expect(snapshot.primaryGatewayProfile.tokenRef, 'gateway_token_0'); + }); + + test('does not fall back to stale local Gateway profile secrets', () async { + final storeRoot = await Directory.systemTemp.createTemp( + 'xworkmate-gateway-profile-cleanup-', + ); + addTearDown(() async { + if (await storeRoot.exists()) { + try { + await storeRoot.delete(recursive: true); + } on FileSystemException { + // Temp cleanup is best effort while Flutter test teardown releases IO. + } + } + }); + + final store = SecretStore( + secretRootPathResolver: () async => '${storeRoot.path}/secrets', + appDataRootPathResolver: () async => '${storeRoot.path}/app-data', + supportRootPathResolver: () async => '${storeRoot.path}/support', + enableSecureStorage: false, + ); + await store.initialize(); + await store.saveSecretValueByRef('gateway_token_1', 'stale-token'); + await store.saveSecretValueByRef('gateway_password_1', 'stale-password'); + + expect(await store.loadGatewayToken(), isNull); + expect(await store.loadGatewayPassword(), isNull); + + await store.saveSecretValueByRef('gateway_token_0', 'current-token'); + await store.saveSecretValueByRef( + 'gateway_password_0', + 'current-password', + ); + + expect(await store.loadGatewayToken(), 'current-token'); + expect(await store.loadGatewayPassword(), 'current-password'); + }); + + test('runtime session key matching no longer aliases main sessions', () { + expect(matchesSessionKey('draft:test-task', 'draft:test-task'), isTrue); + expect(matchesSessionKey('agent:main:main', 'main'), isFalse); + expect(matchesSessionKey('main', 'agent:main:main'), isFalse); + }); + }); +} diff --git a/test/runtime/runtime_controllers_settings_account_test.dart b/test/runtime/runtime_controllers_settings_account_test.dart index b2b774f4..9912eff6 100644 --- a/test/runtime/runtime_controllers_settings_account_test.dart +++ b/test/runtime/runtime_controllers_settings_account_test.dart @@ -397,7 +397,6 @@ void main() { tokenConfigured: const AccountTokenConfigured( bridge: true, vault: false, - apisix: false, ), ), ); @@ -407,7 +406,9 @@ void main() { ); final controller = AppController( - environmentOverride: const {},store: store); + environmentOverride: const {}, + store: store, + ); addTearDown(controller.dispose); await controller.settingsControllerInternal.initialize();