diff --git a/apps/api/.pi-lens/cache/review-graph.json b/apps/api/.pi-lens/cache/review-graph.json new file mode 100644 index 0000000..a9a12e4 --- /dev/null +++ b/apps/api/.pi-lens/cache/review-graph.json @@ -0,0 +1 @@ +{"version":"v2","builtAt":"2026-06-03T20:42:18.668Z","signature":"/workspace/apps/api/alembic/env.py:1566:1780400866882.228|/workspace/apps/api/alembic/versions/0001_initial_schema.py:4658:1780400866882.7947|/workspace/apps/api/alembic/versions/0002_refresh_tokens.py:2405:1780400866883.1057|/workspace/apps/api/alembic/versions/0003_user_configs.py:1101:1780400866883.1057|/workspace/apps/api/alembic/versions/0004_tool_types.py:1575:1780400866883.1057|/workspace/apps/api/alembic/versions/0005_ssh_keys_timestamps.py:1039:1780400866883.1057|/workspace/apps/api/alembic/versions/0006_tool_instances.py:2716:1780400866883.1057|/workspace/apps/api/alembic/versions/0007_instance_container_name.py:715:1780400866883.1057|/workspace/apps/api/alembic/versions/0008_tool_type_category.py:911:1780400866883.1057|/workspace/apps/api/alembic/versions/0009_tool_configs.py:2039:1780400866883.1057|/workspace/apps/api/alembic/versions/0010_tool_type_default_port.py:689:1780400866883.1057|/workspace/apps/api/alembic/versions/0011_tool_instance_tunnel_fields.py:894:1780400866883.654|/workspace/apps/api/alembic/versions/0012_default_port_req.py:1229:1780400866883.654|/workspace/apps/api/alembic/versions/0013_add_config_profiles.py:5007:1780477243149.7742|/workspace/apps/api/alembic/versions/0013_add_probe_result.py:743:1780476434285.8416|/workspace/apps/api/alembic/versions/0014_add_profile_resolver_fields.py:4079:1780477243150.7742|/workspace/apps/api/alembic/versions/0014_merge_heads.py:525:1780476434285.8416|/workspace/apps/api/alembic/versions/0015_single_interface.py:3832:1780476434285.8416|/workspace/apps/api/alembic/versions/069d3da4dc9b_add_ssh_key_id_to_config_profiles.py:686:1780476434285.8416|/workspace/apps/api/alembic/versions/2026_05_22_add_clone_mode.py:1312:1780476434285.8416|/workspace/apps/api/alembic/versions/2026_05_23_remove_is_builtin.py:698:1780476434285.8416|/workspace/apps/api/alembic/versions/2026_05_24_220141_add_startup_command.py:683:1780476434285.8416|/workspace/apps/api/alembic/versions/2026_05_24_add_config_profiles.py:4826:1780476434285.8416|/workspace/apps/api/alembic/versions/2026_05_26_add_git_mounts.py:716:1780476434285.8416|/workspace/apps/api/alembic/versions/2026_05_27_external_repos.py:1150:1780476434285.8416|/workspace/apps/api/alembic/versions/2026_05_28_add_monitoring_tables.py:3745:1780476434285.8416|/workspace/apps/api/alembic/versions/2026_05_28_add_terminal_sessions_table.py:1838:1780476434285.8416|/workspace/apps/api/alembic/versions/2026_05_28_add_tool_definition_manifests.py:13649:1780476434285.8416|/workspace/apps/api/alembic/versions/2026_05_28_drop_tool_configs_and_config_folders.py:3261:1780476434285.8416|/workspace/apps/api/alembic/versions/2026_05_29_add_notifications_table.py:2231:1780476434285.8416|/workspace/apps/api/alembic/versions/2026_05_29_add_ssh_key_ids_to_tool_instances.py:666:1780476434285.8416|/workspace/apps/api/alembic/versions/2026_05_29_drop_ssh_key_id_from_config_profiles.py:715:1780476434285.8416|/workspace/apps/api/alembic/versions/2026_05_29_fix_code_server_bind_addr_port.py:4433:1780476434285.989|/workspace/apps/api/alembic/versions/2026_05_29_fix_code_server_bind_addr.py:1488:1780476434285.8416|/workspace/apps/api/alembic/versions/2026_05_29_fix_web_tool_bind_address.py:4154:1780476434285.989|/workspace/apps/api/alembic/versions/2026_05_29_remove_lsio_command_override.py:3672:1780476434285.989|/workspace/apps/api/alembic/versions/2026_05_29_remove_ssh_keys_mount_from_manifest.py:2838:1780476434285.989|/workspace/apps/api/alembic/versions/2026_06_01_add_workspaces.py:2635:1780476434285.989|/workspace/apps/api/alembic/versions/20260527160017_add_pi_agent_tool_type.py:3794:1780476434285.8416|/workspace/apps/api/alembic/versions/398082499c30_add_tool_config_fields.py:1576:1780400866883.654|/workspace/apps/api/alembic/versions/6fc7bfcf199f_merge_remove_is_builtin_and_add_config_.py:455:1780476434285.989|/workspace/apps/api/alembic/versions/8ed7dd80973d_create_config_folders_table.py:1770:1780400866883.654|/workspace/apps/api/alembic/versions/af8512103d67_add_tool_type_fields.py:1432:1780400866883.654|/workspace/apps/api/alembic/versions/f3d2dc90ba3a_merge_single_interface_and_clone_mode.py:559:1780476434285.989|/workspace/apps/api/src/__init__.py:31:1780400866883.654|/workspace/apps/api/src/api/__init__.py:296:1780477234880.8684|/workspace/apps/api/src/api/auth.py:7944:1780477234880.8684|/workspace/apps/api/src/api/config_folders.py:10380:1780477243150.7742|/workspace/apps/api/src/api/config_profiles.py:11128:1780477473663.148|/workspace/apps/api/src/api/dashboard.py:2121:1780400866885.6538|/workspace/apps/api/src/api/events.py:2711:1780476434285.989|/workspace/apps/api/src/api/git_repositories.py:10532:1780477473663.148|/workspace/apps/api/src/api/health.py:3187:1780477473663.148|/workspace/apps/api/src/api/instance_proxy.py:4233:1780477234880.8684|/workspace/apps/api/src/api/notifications.py:5079:1780476434286.989|/workspace/apps/api/src/api/projects.py:5944:1780477473663.148|/workspace/apps/api/src/api/shared_validators.py:2682:1780476434286.989|/workspace/apps/api/src/api/ssh_keys.py:4280:1780477473663.148|/workspace/apps/api/src/api/terminal.py:4968:1780477473664.148|/workspace/apps/api/src/api/tool_configs.py:7858:1780477243151.7742|/workspace/apps/api/src/api/tool_definitions.py:13721:1780476434286.989|/workspace/apps/api/src/api/tool_instances.py:13133:1780477473664.148|/workspace/apps/api/src/api/tool_types_validation.py:2608:1780476434287.989|/workspace/apps/api/src/api/tool_types.py:13182:1780477473664.148|/workspace/apps/api/src/api/user_config.py:2862:1780477473664.148|/workspace/apps/api/src/api/users.py:5466:1780477473664.148|/workspace/apps/api/src/api/workspace_files.py:3409:1780476434287.989|/workspace/apps/api/src/api/workspace_git.py:5934:1780476434287.989|/workspace/apps/api/src/api/workspace_instances.py:1789:1780476434288.989|/workspace/apps/api/src/api/workspaces.py:14761:1780476434288.989|/workspace/apps/api/src/auth/__init__.py:308:1780400866887.6538|/workspace/apps/api/src/auth/cookies.py:287:1780400866888.8645|/workspace/apps/api/src/auth/dependencies.py:2625:1780477473664.148|/workspace/apps/api/src/auth/oidc.py:1650:1780400866888.8645|/workspace/apps/api/src/auth/session.py:2228:1780400866888.8645|/workspace/apps/api/src/config.py:4705:1780400866888.8645|/workspace/apps/api/src/database.py:3904:1780400866888.8645|/workspace/apps/api/src/logging_config.py:4054:1780477234882.8682|/workspace/apps/api/src/main.py:4801:1780477473664.148|/workspace/apps/api/src/models/__init__.py:759:1780477473665.148|/workspace/apps/api/src/models/base.py:640:1780400866890.1287|/workspace/apps/api/src/models/config_folder.py:1360:1780477243152.7742|/workspace/apps/api/src/models/config_include.py:1247:1780477243152.7742|/workspace/apps/api/src/models/config_mount.py:1086:1780477243152.7742|/workspace/apps/api/src/models/config_profile.py:2442:1780477473665.148|/workspace/apps/api/src/models/git_repository.py:1415:1780477234882.8682|/workspace/apps/api/src/models/health_check.py:1166:1780476434288.989|/workspace/apps/api/src/models/instance_event.py:1248:1780476434288.989|/workspace/apps/api/src/models/notification.py:1567:1780476434288.989|/workspace/apps/api/src/models/project.py:1241:1780400866890.1287|/workspace/apps/api/src/models/ssh_key.py:993:1780400866890.1287|/workspace/apps/api/src/models/terminal_session.py:1074:1780476434288.989|/workspace/apps/api/src/models/tool_definition_manifest.py:2449:1780476434288.989|/workspace/apps/api/src/models/tool_instance.py:2682:1780477473665.148|/workspace/apps/api/src/models/tool_type.py:2196:1780477234882.8682|/workspace/apps/api/src/models/user_config.py:1418:1780477243152.7742|/workspace/apps/api/src/models/user.py:981:1780400866890.6538|/workspace/apps/api/src/models/workspace.py:1740:1780476434289.989|/workspace/apps/api/src/schemas/__init__.py:41:1780477243152.7742|/workspace/apps/api/src/schemas/config_folder.py:1346:1780477243152.7742|/workspace/apps/api/src/schemas/config_profile.py:4228:1780477243152.7742|/workspace/apps/api/src/schemas/git_repository.py:2241:1780477243152.7742|/workspace/apps/api/src/schemas/health.py:1638:1780477243152.7742|/workspace/apps/api/src/schemas/project.py:446:1780477243152.7742|/workspace/apps/api/src/schemas/ssh_key.py:261:1780477243152.7742|/workspace/apps/api/src/schemas/tool_config.py:1697:1780477243152.7742|/workspace/apps/api/src/schemas/tool_instance.py:1611:1780477243152.7742|/workspace/apps/api/src/schemas/tool_type.py:7459:1780477243152.7742|/workspace/apps/api/src/schemas/user_config.py:576:1780477243153.7742|/workspace/apps/api/src/schemas/user.py:356:1780477243152.7742|/workspace/apps/api/src/scripts/__init__.py:43:1780400866890.6538|/workspace/apps/api/src/scripts/seed.py:1099:1780400866891.52|/workspace/apps/api/src/seeds/__init__.py:0:1780477243153.7742|/workspace/apps/api/src/seeds/builtin_tool_types.py:5781:1780477243153.7742|/workspace/apps/api/src/services/clone.py:2697:1780476434289.989|/workspace/apps/api/src/services/config_profile_resolver.py:18008:1780476434289.989|/workspace/apps/api/src/services/config_profiles.py:10145:1780477243153.7742|/workspace/apps/api/src/services/correlation.py:1032:1780476434289.989|/workspace/apps/api/src/services/docker_build.py:3000:1780477234882.8682|/workspace/apps/api/src/services/docker/__init__.py:1090:1780477243153.7742|/workspace/apps/api/src/services/docker/compose.py:7768:1780477243153.7742|/workspace/apps/api/src/services/docker/config_staging.py:2811:1780477243153.7742|/workspace/apps/api/src/services/docker/container.py:3163:1780477243153.7742|/workspace/apps/api/src/services/docker/tunnel.py:4506:1780519193243.8071|/workspace/apps/api/src/services/event_bus.py:3390:1780476434289.989|/workspace/apps/api/src/services/file_service.py:4083:1780476434289.989|/workspace/apps/api/src/services/git_operations.py:6996:1780476434289.989|/workspace/apps/api/src/services/git_service.py:6072:1780476434289.989|/workspace/apps/api/src/services/git/__init__.py:28:1780477243153.7742|/workspace/apps/api/src/services/git/control.py:5958:1780477243153.7742|/workspace/apps/api/src/services/git/files.py:4510:1780477243153.7742|/workspace/apps/api/src/services/git/repository.py:6913:1780477243153.7742|/workspace/apps/api/src/services/health_monitor.py:9048:1780476434289.989|/workspace/apps/api/src/services/instance_lifecycle.py:14945:1780519571049.4849|/workspace/apps/api/src/services/lifecycle_hooks.py:5163:1780476434290.989|/workspace/apps/api/src/services/manifest_compiler.py:14744:1780476434290.989|/workspace/apps/api/src/services/notification_service.py:8322:1780476434290.989|/workspace/apps/api/src/services/permission_fixer.py:9003:1780476434290.989|/workspace/apps/api/src/services/profile_resolver.py:8328:1780477243153.7742|/workspace/apps/api/src/services/readiness_probe.py:2120:1780400866891.6538|/workspace/apps/api/src/services/ssh_keys.py:6091:1780476434290.989|/workspace/apps/api/src/services/terminal_manager.py:6889:1780477473665.148|/workspace/apps/api/src/services/terminal_session.py:5056:1780477473665.148|/workspace/apps/api/src/services/tunnel.py:8675:1780519337069.1616|/workspace/apps/api/src/services/workspace_manager.py:8779:1780476434290.989|/workspace/apps/api/src/utils/git_control.py:8284:1780477234883.8682|/workspace/apps/api/src/utils/git_files.py:13552:1780477234883.8682|/workspace/apps/api/src/utils/git_history.py:12196:1780477243154.7742|/workspace/apps/api/src/utils/git_url_parser.py:6437:1780400866892.6538|/workspace/apps/api/tests/api/test_terminal_ws_multi.py:2663:1780476434291.989|/workspace/apps/api/tests/conftest.py:7687:1780477234883.8682|/workspace/apps/api/tests/integration/__init__.py:0:1780400866893.6538|/workspace/apps/api/tests/integration/test_auth_api.py:3813:1780400866894.065|/workspace/apps/api/tests/integration/test_auth_services.py:2447:1780400866894.065|/workspace/apps/api/tests/integration/test_config_profiles_api.py:18035:1780477473665.148|/workspace/apps/api/tests/integration/test_events.py:8017:1780476434291.989|/workspace/apps/api/tests/integration/test_git_control.py:5257:1780477234883.8682|/workspace/apps/api/tests/integration/test_models.py:3340:1780477234883.8682|/workspace/apps/api/tests/integration/test_notifications_api.py:9277:1780476434291.989|/workspace/apps/api/tests/integration/test_notifications_lifecycle.py:12090:1780476434291.989|/workspace/apps/api/tests/integration/test_projects_api.py:8554:1780477243154.7742|/workspace/apps/api/tests/integration/test_seed.py:864:1780400866894.6538|/workspace/apps/api/tests/integration/test_ssh_keys_api.py:689:1780400866894.6538|/workspace/apps/api/tests/integration/test_tool_types_api_extended.py:12616:1780477234883.8682|/workspace/apps/api/tests/integration/test_tool_types_api.py:12524:1780477243154.7742|/workspace/apps/api/tests/integration/test_users_api.py:6630:1780477243154.7742|/workspace/apps/api/tests/integration/test_workspaces_api.py:11820:1780476434292.989|/workspace/apps/api/tests/services/test_terminal_manager_multi.py:6887:1780476434292.989|/workspace/apps/api/tests/system/__init__.py:0:1780400866895.6538|/workspace/apps/api/tests/unit/__init__.py:0:1780400866895.6538|/workspace/apps/api/tests/unit/test_config_profile_resolver.py:21896:1780476434292.989|/workspace/apps/api/tests/unit/test_config.py:2316:1780400866896.6306|/workspace/apps/api/tests/unit/test_docker_build.py:5738:1780400866896.6306|/workspace/apps/api/tests/unit/test_docker_service.py:3888:1780476434292.989|/workspace/apps/api/tests/unit/test_event_bus.py:4369:1780476434292.989|/workspace/apps/api/tests/unit/test_file_service.py:3135:1780476434292.989|/workspace/apps/api/tests/unit/test_git_mount_resolution.py:4797:1780476434292.989|/workspace/apps/api/tests/unit/test_git_mounts.py:8601:1780476434292.989|/workspace/apps/api/tests/unit/test_git_repository_clone_preflight.py:1109:1780400866896.6538|/workspace/apps/api/tests/unit/test_git_repository_working_clones.py:2843:1780400866896.6538|/workspace/apps/api/tests/unit/test_git_service.py:4938:1780476434293.989|/workspace/apps/api/tests/unit/test_git_url_parser.py:5471:1780477234884.8682|/workspace/apps/api/tests/unit/test_health_monitor.py:9089:1780476434293.989|/workspace/apps/api/tests/unit/test_home_path_expansion.py:4529:1780476434293.989|/workspace/apps/api/tests/unit/test_lifecycle_hooks.py:2010:1780476434293.989|/workspace/apps/api/tests/unit/test_manifest_compiler.py:13078:1780476434293.989|/workspace/apps/api/tests/unit/test_migration_metadata.py:1713:1780477243154.7742|/workspace/apps/api/tests/unit/test_monitoring_models.py:3966:1780476434293.989|/workspace/apps/api/tests/unit/test_notification_service.py:11662:1780476434293.989|/workspace/apps/api/tests/unit/test_notifications_api_routes.py:1461:1780476434293.989|/workspace/apps/api/tests/unit/test_permission_fixer.py:8160:1780476434293.989|/workspace/apps/api/tests/unit/test_profile_resolver.py:15446:1780477243154.7742|/workspace/apps/api/tests/unit/test_readiness_probe.py:7321:1780477234884.8682|/workspace/apps/api/tests/unit/test_session_branch_selection.py:6346:1780476434293.989|/workspace/apps/api/tests/unit/test_ssh_keys.py:2340:1780476434293.989|/workspace/apps/api/tests/unit/test_terminal_manager.py:4081:1780477243154.7742|/workspace/apps/api/tests/unit/test_terminal_session.py:5770:1780477243154.7742|/workspace/apps/api/tests/unit/test_tool_instances_legacy.py:39437:1780476434293.989","fileSignatures":[["/workspace/apps/api/alembic/env.py","1566:1780400866882.228"],["/workspace/apps/api/alembic/versions/0001_initial_schema.py","4658:1780400866882.7947"],["/workspace/apps/api/alembic/versions/0002_refresh_tokens.py","2405:1780400866883.1057"],["/workspace/apps/api/alembic/versions/0003_user_configs.py","1101:1780400866883.1057"],["/workspace/apps/api/alembic/versions/0004_tool_types.py","1575:1780400866883.1057"],["/workspace/apps/api/alembic/versions/0005_ssh_keys_timestamps.py","1039:1780400866883.1057"],["/workspace/apps/api/alembic/versions/0006_tool_instances.py","2716:1780400866883.1057"],["/workspace/apps/api/alembic/versions/0007_instance_container_name.py","715:1780400866883.1057"],["/workspace/apps/api/alembic/versions/0008_tool_type_category.py","911:1780400866883.1057"],["/workspace/apps/api/alembic/versions/0009_tool_configs.py","2039:1780400866883.1057"],["/workspace/apps/api/alembic/versions/0010_tool_type_default_port.py","689:1780400866883.1057"],["/workspace/apps/api/alembic/versions/0011_tool_instance_tunnel_fields.py","894:1780400866883.654"],["/workspace/apps/api/alembic/versions/0012_default_port_req.py","1229:1780400866883.654"],["/workspace/apps/api/alembic/versions/0013_add_config_profiles.py","5007:1780477243149.7742"],["/workspace/apps/api/alembic/versions/0013_add_probe_result.py","743:1780476434285.8416"],["/workspace/apps/api/alembic/versions/0014_add_profile_resolver_fields.py","4079:1780477243150.7742"],["/workspace/apps/api/alembic/versions/0014_merge_heads.py","525:1780476434285.8416"],["/workspace/apps/api/alembic/versions/0015_single_interface.py","3832:1780476434285.8416"],["/workspace/apps/api/alembic/versions/069d3da4dc9b_add_ssh_key_id_to_config_profiles.py","686:1780476434285.8416"],["/workspace/apps/api/alembic/versions/20260527160017_add_pi_agent_tool_type.py","3794:1780476434285.8416"],["/workspace/apps/api/alembic/versions/2026_05_22_add_clone_mode.py","1312:1780476434285.8416"],["/workspace/apps/api/alembic/versions/2026_05_23_remove_is_builtin.py","698:1780476434285.8416"],["/workspace/apps/api/alembic/versions/2026_05_24_220141_add_startup_command.py","683:1780476434285.8416"],["/workspace/apps/api/alembic/versions/2026_05_24_add_config_profiles.py","4826:1780476434285.8416"],["/workspace/apps/api/alembic/versions/2026_05_26_add_git_mounts.py","716:1780476434285.8416"],["/workspace/apps/api/alembic/versions/2026_05_27_external_repos.py","1150:1780476434285.8416"],["/workspace/apps/api/alembic/versions/2026_05_28_add_monitoring_tables.py","3745:1780476434285.8416"],["/workspace/apps/api/alembic/versions/2026_05_28_add_terminal_sessions_table.py","1838:1780476434285.8416"],["/workspace/apps/api/alembic/versions/2026_05_28_add_tool_definition_manifests.py","13649:1780476434285.8416"],["/workspace/apps/api/alembic/versions/2026_05_28_drop_tool_configs_and_config_folders.py","3261:1780476434285.8416"],["/workspace/apps/api/alembic/versions/2026_05_29_add_notifications_table.py","2231:1780476434285.8416"],["/workspace/apps/api/alembic/versions/2026_05_29_add_ssh_key_ids_to_tool_instances.py","666:1780476434285.8416"],["/workspace/apps/api/alembic/versions/2026_05_29_drop_ssh_key_id_from_config_profiles.py","715:1780476434285.8416"],["/workspace/apps/api/alembic/versions/2026_05_29_fix_code_server_bind_addr.py","1488:1780476434285.8416"],["/workspace/apps/api/alembic/versions/2026_05_29_fix_code_server_bind_addr_port.py","4433:1780476434285.989"],["/workspace/apps/api/alembic/versions/2026_05_29_fix_web_tool_bind_address.py","4154:1780476434285.989"],["/workspace/apps/api/alembic/versions/2026_05_29_remove_lsio_command_override.py","3672:1780476434285.989"],["/workspace/apps/api/alembic/versions/2026_05_29_remove_ssh_keys_mount_from_manifest.py","2838:1780476434285.989"],["/workspace/apps/api/alembic/versions/2026_06_01_add_workspaces.py","2635:1780476434285.989"],["/workspace/apps/api/alembic/versions/398082499c30_add_tool_config_fields.py","1576:1780400866883.654"],["/workspace/apps/api/alembic/versions/6fc7bfcf199f_merge_remove_is_builtin_and_add_config_.py","455:1780476434285.989"],["/workspace/apps/api/alembic/versions/8ed7dd80973d_create_config_folders_table.py","1770:1780400866883.654"],["/workspace/apps/api/alembic/versions/af8512103d67_add_tool_type_fields.py","1432:1780400866883.654"],["/workspace/apps/api/alembic/versions/f3d2dc90ba3a_merge_single_interface_and_clone_mode.py","559:1780476434285.989"],["/workspace/apps/api/src/__init__.py","31:1780400866883.654"],["/workspace/apps/api/src/api/__init__.py","296:1780477234880.8684"],["/workspace/apps/api/src/api/auth.py","7944:1780477234880.8684"],["/workspace/apps/api/src/api/config_folders.py","10380:1780477243150.7742"],["/workspace/apps/api/src/api/config_profiles.py","11128:1780477473663.148"],["/workspace/apps/api/src/api/dashboard.py","2121:1780400866885.6538"],["/workspace/apps/api/src/api/events.py","2711:1780476434285.989"],["/workspace/apps/api/src/api/git_repositories.py","10532:1780477473663.148"],["/workspace/apps/api/src/api/health.py","3187:1780477473663.148"],["/workspace/apps/api/src/api/instance_proxy.py","4233:1780477234880.8684"],["/workspace/apps/api/src/api/notifications.py","5079:1780476434286.989"],["/workspace/apps/api/src/api/projects.py","5944:1780477473663.148"],["/workspace/apps/api/src/api/shared_validators.py","2682:1780476434286.989"],["/workspace/apps/api/src/api/ssh_keys.py","4280:1780477473663.148"],["/workspace/apps/api/src/api/terminal.py","4968:1780477473664.148"],["/workspace/apps/api/src/api/tool_configs.py","7858:1780477243151.7742"],["/workspace/apps/api/src/api/tool_definitions.py","13721:1780476434286.989"],["/workspace/apps/api/src/api/tool_instances.py","13133:1780477473664.148"],["/workspace/apps/api/src/api/tool_types.py","13182:1780477473664.148"],["/workspace/apps/api/src/api/tool_types_validation.py","2608:1780476434287.989"],["/workspace/apps/api/src/api/user_config.py","2862:1780477473664.148"],["/workspace/apps/api/src/api/users.py","5466:1780477473664.148"],["/workspace/apps/api/src/api/workspace_files.py","3409:1780476434287.989"],["/workspace/apps/api/src/api/workspace_git.py","5934:1780476434287.989"],["/workspace/apps/api/src/api/workspace_instances.py","1789:1780476434288.989"],["/workspace/apps/api/src/api/workspaces.py","14761:1780476434288.989"],["/workspace/apps/api/src/auth/__init__.py","308:1780400866887.6538"],["/workspace/apps/api/src/auth/cookies.py","287:1780400866888.8645"],["/workspace/apps/api/src/auth/dependencies.py","2625:1780477473664.148"],["/workspace/apps/api/src/auth/oidc.py","1650:1780400866888.8645"],["/workspace/apps/api/src/auth/session.py","2228:1780400866888.8645"],["/workspace/apps/api/src/config.py","4705:1780400866888.8645"],["/workspace/apps/api/src/database.py","3904:1780400866888.8645"],["/workspace/apps/api/src/logging_config.py","4054:1780477234882.8682"],["/workspace/apps/api/src/main.py","4801:1780477473664.148"],["/workspace/apps/api/src/models/__init__.py","759:1780477473665.148"],["/workspace/apps/api/src/models/base.py","640:1780400866890.1287"],["/workspace/apps/api/src/models/config_folder.py","1360:1780477243152.7742"],["/workspace/apps/api/src/models/config_include.py","1247:1780477243152.7742"],["/workspace/apps/api/src/models/config_mount.py","1086:1780477243152.7742"],["/workspace/apps/api/src/models/config_profile.py","2442:1780477473665.148"],["/workspace/apps/api/src/models/git_repository.py","1415:1780477234882.8682"],["/workspace/apps/api/src/models/health_check.py","1166:1780476434288.989"],["/workspace/apps/api/src/models/instance_event.py","1248:1780476434288.989"],["/workspace/apps/api/src/models/notification.py","1567:1780476434288.989"],["/workspace/apps/api/src/models/project.py","1241:1780400866890.1287"],["/workspace/apps/api/src/models/ssh_key.py","993:1780400866890.1287"],["/workspace/apps/api/src/models/terminal_session.py","1074:1780476434288.989"],["/workspace/apps/api/src/models/tool_definition_manifest.py","2449:1780476434288.989"],["/workspace/apps/api/src/models/tool_instance.py","2682:1780477473665.148"],["/workspace/apps/api/src/models/tool_type.py","2196:1780477234882.8682"],["/workspace/apps/api/src/models/user.py","981:1780400866890.6538"],["/workspace/apps/api/src/models/user_config.py","1418:1780477243152.7742"],["/workspace/apps/api/src/models/workspace.py","1740:1780476434289.989"],["/workspace/apps/api/src/schemas/__init__.py","41:1780477243152.7742"],["/workspace/apps/api/src/schemas/config_folder.py","1346:1780477243152.7742"],["/workspace/apps/api/src/schemas/config_profile.py","4228:1780477243152.7742"],["/workspace/apps/api/src/schemas/git_repository.py","2241:1780477243152.7742"],["/workspace/apps/api/src/schemas/health.py","1638:1780477243152.7742"],["/workspace/apps/api/src/schemas/project.py","446:1780477243152.7742"],["/workspace/apps/api/src/schemas/ssh_key.py","261:1780477243152.7742"],["/workspace/apps/api/src/schemas/tool_config.py","1697:1780477243152.7742"],["/workspace/apps/api/src/schemas/tool_instance.py","1611:1780477243152.7742"],["/workspace/apps/api/src/schemas/tool_type.py","7459:1780477243152.7742"],["/workspace/apps/api/src/schemas/user.py","356:1780477243152.7742"],["/workspace/apps/api/src/schemas/user_config.py","576:1780477243153.7742"],["/workspace/apps/api/src/scripts/__init__.py","43:1780400866890.6538"],["/workspace/apps/api/src/scripts/seed.py","1099:1780400866891.52"],["/workspace/apps/api/src/seeds/__init__.py","0:1780477243153.7742"],["/workspace/apps/api/src/seeds/builtin_tool_types.py","5781:1780477243153.7742"],["/workspace/apps/api/src/services/clone.py","2697:1780476434289.989"],["/workspace/apps/api/src/services/config_profile_resolver.py","18008:1780476434289.989"],["/workspace/apps/api/src/services/config_profiles.py","10145:1780477243153.7742"],["/workspace/apps/api/src/services/correlation.py","1032:1780476434289.989"],["/workspace/apps/api/src/services/docker/__init__.py","1090:1780477243153.7742"],["/workspace/apps/api/src/services/docker/compose.py","7768:1780477243153.7742"],["/workspace/apps/api/src/services/docker/config_staging.py","2811:1780477243153.7742"],["/workspace/apps/api/src/services/docker/container.py","3163:1780477243153.7742"],["/workspace/apps/api/src/services/docker/tunnel.py","4506:1780519193243.8071"],["/workspace/apps/api/src/services/docker_build.py","3000:1780477234882.8682"],["/workspace/apps/api/src/services/event_bus.py","3390:1780476434289.989"],["/workspace/apps/api/src/services/file_service.py","4083:1780476434289.989"],["/workspace/apps/api/src/services/git/__init__.py","28:1780477243153.7742"],["/workspace/apps/api/src/services/git/control.py","5958:1780477243153.7742"],["/workspace/apps/api/src/services/git/files.py","4510:1780477243153.7742"],["/workspace/apps/api/src/services/git/repository.py","6913:1780477243153.7742"],["/workspace/apps/api/src/services/git_operations.py","6996:1780476434289.989"],["/workspace/apps/api/src/services/git_service.py","6072:1780476434289.989"],["/workspace/apps/api/src/services/health_monitor.py","9048:1780476434289.989"],["/workspace/apps/api/src/services/instance_lifecycle.py","14945:1780519571049.4849"],["/workspace/apps/api/src/services/lifecycle_hooks.py","5163:1780476434290.989"],["/workspace/apps/api/src/services/manifest_compiler.py","14744:1780476434290.989"],["/workspace/apps/api/src/services/notification_service.py","8322:1780476434290.989"],["/workspace/apps/api/src/services/permission_fixer.py","9003:1780476434290.989"],["/workspace/apps/api/src/services/profile_resolver.py","8328:1780477243153.7742"],["/workspace/apps/api/src/services/readiness_probe.py","2120:1780400866891.6538"],["/workspace/apps/api/src/services/ssh_keys.py","6091:1780476434290.989"],["/workspace/apps/api/src/services/terminal_manager.py","6889:1780477473665.148"],["/workspace/apps/api/src/services/terminal_session.py","5056:1780477473665.148"],["/workspace/apps/api/src/services/tunnel.py","8675:1780519337069.1616"],["/workspace/apps/api/src/services/workspace_manager.py","8779:1780476434290.989"],["/workspace/apps/api/src/utils/git_control.py","8284:1780477234883.8682"],["/workspace/apps/api/src/utils/git_files.py","13552:1780477234883.8682"],["/workspace/apps/api/src/utils/git_history.py","12196:1780477243154.7742"],["/workspace/apps/api/src/utils/git_url_parser.py","6437:1780400866892.6538"],["/workspace/apps/api/tests/api/test_terminal_ws_multi.py","2663:1780476434291.989"],["/workspace/apps/api/tests/conftest.py","7687:1780477234883.8682"],["/workspace/apps/api/tests/integration/__init__.py","0:1780400866893.6538"],["/workspace/apps/api/tests/integration/test_auth_api.py","3813:1780400866894.065"],["/workspace/apps/api/tests/integration/test_auth_services.py","2447:1780400866894.065"],["/workspace/apps/api/tests/integration/test_config_profiles_api.py","18035:1780477473665.148"],["/workspace/apps/api/tests/integration/test_events.py","8017:1780476434291.989"],["/workspace/apps/api/tests/integration/test_git_control.py","5257:1780477234883.8682"],["/workspace/apps/api/tests/integration/test_models.py","3340:1780477234883.8682"],["/workspace/apps/api/tests/integration/test_notifications_api.py","9277:1780476434291.989"],["/workspace/apps/api/tests/integration/test_notifications_lifecycle.py","12090:1780476434291.989"],["/workspace/apps/api/tests/integration/test_projects_api.py","8554:1780477243154.7742"],["/workspace/apps/api/tests/integration/test_seed.py","864:1780400866894.6538"],["/workspace/apps/api/tests/integration/test_ssh_keys_api.py","689:1780400866894.6538"],["/workspace/apps/api/tests/integration/test_tool_types_api.py","12524:1780477243154.7742"],["/workspace/apps/api/tests/integration/test_tool_types_api_extended.py","12616:1780477234883.8682"],["/workspace/apps/api/tests/integration/test_users_api.py","6630:1780477243154.7742"],["/workspace/apps/api/tests/integration/test_workspaces_api.py","11820:1780476434292.989"],["/workspace/apps/api/tests/services/test_terminal_manager_multi.py","6887:1780476434292.989"],["/workspace/apps/api/tests/system/__init__.py","0:1780400866895.6538"],["/workspace/apps/api/tests/unit/__init__.py","0:1780400866895.6538"],["/workspace/apps/api/tests/unit/test_config.py","2316:1780400866896.6306"],["/workspace/apps/api/tests/unit/test_config_profile_resolver.py","21896:1780476434292.989"],["/workspace/apps/api/tests/unit/test_docker_build.py","5738:1780400866896.6306"],["/workspace/apps/api/tests/unit/test_docker_service.py","3888:1780476434292.989"],["/workspace/apps/api/tests/unit/test_event_bus.py","4369:1780476434292.989"],["/workspace/apps/api/tests/unit/test_file_service.py","3135:1780476434292.989"],["/workspace/apps/api/tests/unit/test_git_mount_resolution.py","4797:1780476434292.989"],["/workspace/apps/api/tests/unit/test_git_mounts.py","8601:1780476434292.989"],["/workspace/apps/api/tests/unit/test_git_repository_clone_preflight.py","1109:1780400866896.6538"],["/workspace/apps/api/tests/unit/test_git_repository_working_clones.py","2843:1780400866896.6538"],["/workspace/apps/api/tests/unit/test_git_service.py","4938:1780476434293.989"],["/workspace/apps/api/tests/unit/test_git_url_parser.py","5471:1780477234884.8682"],["/workspace/apps/api/tests/unit/test_health_monitor.py","9089:1780476434293.989"],["/workspace/apps/api/tests/unit/test_home_path_expansion.py","4529:1780476434293.989"],["/workspace/apps/api/tests/unit/test_lifecycle_hooks.py","2010:1780476434293.989"],["/workspace/apps/api/tests/unit/test_manifest_compiler.py","13078:1780476434293.989"],["/workspace/apps/api/tests/unit/test_migration_metadata.py","1713:1780477243154.7742"],["/workspace/apps/api/tests/unit/test_monitoring_models.py","3966:1780476434293.989"],["/workspace/apps/api/tests/unit/test_notification_service.py","11662:1780476434293.989"],["/workspace/apps/api/tests/unit/test_notifications_api_routes.py","1461:1780476434293.989"],["/workspace/apps/api/tests/unit/test_permission_fixer.py","8160:1780476434293.989"],["/workspace/apps/api/tests/unit/test_profile_resolver.py","15446:1780477243154.7742"],["/workspace/apps/api/tests/unit/test_readiness_probe.py","7321:1780477234884.8682"],["/workspace/apps/api/tests/unit/test_session_branch_selection.py","6346:1780476434293.989"],["/workspace/apps/api/tests/unit/test_ssh_keys.py","2340:1780476434293.989"],["/workspace/apps/api/tests/unit/test_terminal_manager.py","4081:1780477243154.7742"],["/workspace/apps/api/tests/unit/test_terminal_session.py","5770:1780477243154.7742"],["/workspace/apps/api/tests/unit/test_tool_instances_legacy.py","39437:1780476434293.989"]],"nodes":[["file:/workspace/apps/api/alembic/env.py",{"id":"file:/workspace/apps/api/alembic/env.py","kind":"file","language":"python","filePath":"/workspace/apps/api/alembic/env.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/alembic/versions/0001_initial_schema.py",{"id":"file:/workspace/apps/api/alembic/versions/0001_initial_schema.py","kind":"file","language":"python","filePath":"/workspace/apps/api/alembic/versions/0001_initial_schema.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/alembic/versions/0002_refresh_tokens.py",{"id":"file:/workspace/apps/api/alembic/versions/0002_refresh_tokens.py","kind":"file","language":"python","filePath":"/workspace/apps/api/alembic/versions/0002_refresh_tokens.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization","auth","user-input"]}}],["file:/workspace/apps/api/alembic/versions/0003_user_configs.py",{"id":"file:/workspace/apps/api/alembic/versions/0003_user_configs.py","kind":"file","language":"python","filePath":"/workspace/apps/api/alembic/versions/0003_user_configs.py","metadata":{"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/workspace/apps/api/alembic/versions/0004_tool_types.py",{"id":"file:/workspace/apps/api/alembic/versions/0004_tool_types.py","kind":"file","language":"python","filePath":"/workspace/apps/api/alembic/versions/0004_tool_types.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/alembic/versions/0005_ssh_keys_timestamps.py",{"id":"file:/workspace/apps/api/alembic/versions/0005_ssh_keys_timestamps.py","kind":"file","language":"python","filePath":"/workspace/apps/api/alembic/versions/0005_ssh_keys_timestamps.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/alembic/versions/0006_tool_instances.py",{"id":"file:/workspace/apps/api/alembic/versions/0006_tool_instances.py","kind":"file","language":"python","filePath":"/workspace/apps/api/alembic/versions/0006_tool_instances.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/alembic/versions/0007_instance_container_name.py",{"id":"file:/workspace/apps/api/alembic/versions/0007_instance_container_name.py","kind":"file","language":"python","filePath":"/workspace/apps/api/alembic/versions/0007_instance_container_name.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/alembic/versions/0008_tool_type_category.py",{"id":"file:/workspace/apps/api/alembic/versions/0008_tool_type_category.py","kind":"file","language":"python","filePath":"/workspace/apps/api/alembic/versions/0008_tool_type_category.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/alembic/versions/0009_tool_configs.py",{"id":"file:/workspace/apps/api/alembic/versions/0009_tool_configs.py","kind":"file","language":"python","filePath":"/workspace/apps/api/alembic/versions/0009_tool_configs.py","metadata":{"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/workspace/apps/api/alembic/versions/0010_tool_type_default_port.py",{"id":"file:/workspace/apps/api/alembic/versions/0010_tool_type_default_port.py","kind":"file","language":"python","filePath":"/workspace/apps/api/alembic/versions/0010_tool_type_default_port.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/alembic/versions/0011_tool_instance_tunnel_fields.py",{"id":"file:/workspace/apps/api/alembic/versions/0011_tool_instance_tunnel_fields.py","kind":"file","language":"python","filePath":"/workspace/apps/api/alembic/versions/0011_tool_instance_tunnel_fields.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/alembic/versions/0012_default_port_req.py",{"id":"file:/workspace/apps/api/alembic/versions/0012_default_port_req.py","kind":"file","language":"python","filePath":"/workspace/apps/api/alembic/versions/0012_default_port_req.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/alembic/versions/0013_add_config_profiles.py",{"id":"file:/workspace/apps/api/alembic/versions/0013_add_config_profiles.py","kind":"file","language":"python","filePath":"/workspace/apps/api/alembic/versions/0013_add_config_profiles.py","metadata":{"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/workspace/apps/api/alembic/versions/0013_add_probe_result.py",{"id":"file:/workspace/apps/api/alembic/versions/0013_add_probe_result.py","kind":"file","language":"python","filePath":"/workspace/apps/api/alembic/versions/0013_add_probe_result.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/alembic/versions/0014_add_profile_resolver_fields.py",{"id":"file:/workspace/apps/api/alembic/versions/0014_add_profile_resolver_fields.py","kind":"file","language":"python","filePath":"/workspace/apps/api/alembic/versions/0014_add_profile_resolver_fields.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/alembic/versions/0014_merge_heads.py",{"id":"file:/workspace/apps/api/alembic/versions/0014_merge_heads.py","kind":"file","language":"python","filePath":"/workspace/apps/api/alembic/versions/0014_merge_heads.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/alembic/versions/0015_single_interface.py",{"id":"file:/workspace/apps/api/alembic/versions/0015_single_interface.py","kind":"file","language":"python","filePath":"/workspace/apps/api/alembic/versions/0015_single_interface.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/alembic/versions/069d3da4dc9b_add_ssh_key_id_to_config_profiles.py",{"id":"file:/workspace/apps/api/alembic/versions/069d3da4dc9b_add_ssh_key_id_to_config_profiles.py","kind":"file","language":"python","filePath":"/workspace/apps/api/alembic/versions/069d3da4dc9b_add_ssh_key_id_to_config_profiles.py","metadata":{"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/workspace/apps/api/alembic/versions/20260527160017_add_pi_agent_tool_type.py",{"id":"file:/workspace/apps/api/alembic/versions/20260527160017_add_pi_agent_tool_type.py","kind":"file","language":"python","filePath":"/workspace/apps/api/alembic/versions/20260527160017_add_pi_agent_tool_type.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/alembic/versions/2026_05_22_add_clone_mode.py",{"id":"file:/workspace/apps/api/alembic/versions/2026_05_22_add_clone_mode.py","kind":"file","language":"python","filePath":"/workspace/apps/api/alembic/versions/2026_05_22_add_clone_mode.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/alembic/versions/2026_05_23_remove_is_builtin.py",{"id":"file:/workspace/apps/api/alembic/versions/2026_05_23_remove_is_builtin.py","kind":"file","language":"python","filePath":"/workspace/apps/api/alembic/versions/2026_05_23_remove_is_builtin.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/alembic/versions/2026_05_24_220141_add_startup_command.py",{"id":"file:/workspace/apps/api/alembic/versions/2026_05_24_220141_add_startup_command.py","kind":"file","language":"python","filePath":"/workspace/apps/api/alembic/versions/2026_05_24_220141_add_startup_command.py","metadata":{"featureKind":"cli-command","trustBoundaries":["network","external-api","serialization","user-input","process-exec"]}}],["file:/workspace/apps/api/alembic/versions/2026_05_24_add_config_profiles.py",{"id":"file:/workspace/apps/api/alembic/versions/2026_05_24_add_config_profiles.py","kind":"file","language":"python","filePath":"/workspace/apps/api/alembic/versions/2026_05_24_add_config_profiles.py","metadata":{"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/workspace/apps/api/alembic/versions/2026_05_26_add_git_mounts.py",{"id":"file:/workspace/apps/api/alembic/versions/2026_05_26_add_git_mounts.py","kind":"file","language":"python","filePath":"/workspace/apps/api/alembic/versions/2026_05_26_add_git_mounts.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/alembic/versions/2026_05_27_external_repos.py",{"id":"file:/workspace/apps/api/alembic/versions/2026_05_27_external_repos.py","kind":"file","language":"python","filePath":"/workspace/apps/api/alembic/versions/2026_05_27_external_repos.py","metadata":{"featureKind":"library","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/workspace/apps/api/alembic/versions/2026_05_28_add_monitoring_tables.py",{"id":"file:/workspace/apps/api/alembic/versions/2026_05_28_add_monitoring_tables.py","kind":"file","language":"python","filePath":"/workspace/apps/api/alembic/versions/2026_05_28_add_monitoring_tables.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/alembic/versions/2026_05_28_add_terminal_sessions_table.py",{"id":"file:/workspace/apps/api/alembic/versions/2026_05_28_add_terminal_sessions_table.py","kind":"file","language":"python","filePath":"/workspace/apps/api/alembic/versions/2026_05_28_add_terminal_sessions_table.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization","auth","user-input"]}}],["file:/workspace/apps/api/alembic/versions/2026_05_28_add_tool_definition_manifests.py",{"id":"file:/workspace/apps/api/alembic/versions/2026_05_28_add_tool_definition_manifests.py","kind":"file","language":"python","filePath":"/workspace/apps/api/alembic/versions/2026_05_28_add_tool_definition_manifests.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/alembic/versions/2026_05_28_drop_tool_configs_and_config_folders.py",{"id":"file:/workspace/apps/api/alembic/versions/2026_05_28_drop_tool_configs_and_config_folders.py","kind":"file","language":"python","filePath":"/workspace/apps/api/alembic/versions/2026_05_28_drop_tool_configs_and_config_folders.py","metadata":{"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/workspace/apps/api/alembic/versions/2026_05_29_add_notifications_table.py",{"id":"file:/workspace/apps/api/alembic/versions/2026_05_29_add_notifications_table.py","kind":"file","language":"python","filePath":"/workspace/apps/api/alembic/versions/2026_05_29_add_notifications_table.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/alembic/versions/2026_05_29_add_ssh_key_ids_to_tool_instances.py",{"id":"file:/workspace/apps/api/alembic/versions/2026_05_29_add_ssh_key_ids_to_tool_instances.py","kind":"file","language":"python","filePath":"/workspace/apps/api/alembic/versions/2026_05_29_add_ssh_key_ids_to_tool_instances.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/alembic/versions/2026_05_29_drop_ssh_key_id_from_config_profiles.py",{"id":"file:/workspace/apps/api/alembic/versions/2026_05_29_drop_ssh_key_id_from_config_profiles.py","kind":"file","language":"python","filePath":"/workspace/apps/api/alembic/versions/2026_05_29_drop_ssh_key_id_from_config_profiles.py","metadata":{"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/workspace/apps/api/alembic/versions/2026_05_29_fix_code_server_bind_addr.py",{"id":"file:/workspace/apps/api/alembic/versions/2026_05_29_fix_code_server_bind_addr.py","kind":"file","language":"python","filePath":"/workspace/apps/api/alembic/versions/2026_05_29_fix_code_server_bind_addr.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/alembic/versions/2026_05_29_fix_code_server_bind_addr_port.py",{"id":"file:/workspace/apps/api/alembic/versions/2026_05_29_fix_code_server_bind_addr_port.py","kind":"file","language":"python","filePath":"/workspace/apps/api/alembic/versions/2026_05_29_fix_code_server_bind_addr_port.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/alembic/versions/2026_05_29_fix_web_tool_bind_address.py",{"id":"file:/workspace/apps/api/alembic/versions/2026_05_29_fix_web_tool_bind_address.py","kind":"file","language":"python","filePath":"/workspace/apps/api/alembic/versions/2026_05_29_fix_web_tool_bind_address.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/alembic/versions/2026_05_29_remove_lsio_command_override.py",{"id":"file:/workspace/apps/api/alembic/versions/2026_05_29_remove_lsio_command_override.py","kind":"file","language":"python","filePath":"/workspace/apps/api/alembic/versions/2026_05_29_remove_lsio_command_override.py","metadata":{"featureKind":"cli-command","trustBoundaries":["network","external-api","serialization","user-input","process-exec"]}}],["file:/workspace/apps/api/alembic/versions/2026_05_29_remove_ssh_keys_mount_from_manifest.py",{"id":"file:/workspace/apps/api/alembic/versions/2026_05_29_remove_ssh_keys_mount_from_manifest.py","kind":"file","language":"python","filePath":"/workspace/apps/api/alembic/versions/2026_05_29_remove_ssh_keys_mount_from_manifest.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/alembic/versions/2026_06_01_add_workspaces.py",{"id":"file:/workspace/apps/api/alembic/versions/2026_06_01_add_workspaces.py","kind":"file","language":"python","filePath":"/workspace/apps/api/alembic/versions/2026_06_01_add_workspaces.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/alembic/versions/398082499c30_add_tool_config_fields.py",{"id":"file:/workspace/apps/api/alembic/versions/398082499c30_add_tool_config_fields.py","kind":"file","language":"python","filePath":"/workspace/apps/api/alembic/versions/398082499c30_add_tool_config_fields.py","metadata":{"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/workspace/apps/api/alembic/versions/6fc7bfcf199f_merge_remove_is_builtin_and_add_config_.py",{"id":"file:/workspace/apps/api/alembic/versions/6fc7bfcf199f_merge_remove_is_builtin_and_add_config_.py","kind":"file","language":"python","filePath":"/workspace/apps/api/alembic/versions/6fc7bfcf199f_merge_remove_is_builtin_and_add_config_.py","metadata":{"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/workspace/apps/api/alembic/versions/8ed7dd80973d_create_config_folders_table.py",{"id":"file:/workspace/apps/api/alembic/versions/8ed7dd80973d_create_config_folders_table.py","kind":"file","language":"python","filePath":"/workspace/apps/api/alembic/versions/8ed7dd80973d_create_config_folders_table.py","metadata":{"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/workspace/apps/api/alembic/versions/af8512103d67_add_tool_type_fields.py",{"id":"file:/workspace/apps/api/alembic/versions/af8512103d67_add_tool_type_fields.py","kind":"file","language":"python","filePath":"/workspace/apps/api/alembic/versions/af8512103d67_add_tool_type_fields.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/alembic/versions/f3d2dc90ba3a_merge_single_interface_and_clone_mode.py",{"id":"file:/workspace/apps/api/alembic/versions/f3d2dc90ba3a_merge_single_interface_and_clone_mode.py","kind":"file","language":"python","filePath":"/workspace/apps/api/alembic/versions/f3d2dc90ba3a_merge_single_interface_and_clone_mode.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/src/__init__.py",{"id":"file:/workspace/apps/api/src/__init__.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/__init__.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/src/api/__init__.py",{"id":"file:/workspace/apps/api/src/api/__init__.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/api/__init__.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/src/api/auth.py",{"id":"file:/workspace/apps/api/src/api/auth.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/api/auth.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization","auth","user-input"]}}],["file:/workspace/apps/api/src/api/config_folders.py",{"id":"file:/workspace/apps/api/src/api/config_folders.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/api/config_folders.py","metadata":{"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/workspace/apps/api/src/api/config_profiles.py",{"id":"file:/workspace/apps/api/src/api/config_profiles.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/api/config_profiles.py","metadata":{"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/workspace/apps/api/src/api/dashboard.py",{"id":"file:/workspace/apps/api/src/api/dashboard.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/api/dashboard.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/src/api/events.py",{"id":"file:/workspace/apps/api/src/api/events.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/api/events.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/src/api/git_repositories.py",{"id":"file:/workspace/apps/api/src/api/git_repositories.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/api/git_repositories.py","metadata":{"featureKind":"library","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/workspace/apps/api/src/api/health.py",{"id":"file:/workspace/apps/api/src/api/health.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/api/health.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/src/api/instance_proxy.py",{"id":"file:/workspace/apps/api/src/api/instance_proxy.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/api/instance_proxy.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/src/api/notifications.py",{"id":"file:/workspace/apps/api/src/api/notifications.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/api/notifications.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/src/api/projects.py",{"id":"file:/workspace/apps/api/src/api/projects.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/api/projects.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/src/api/shared_validators.py",{"id":"file:/workspace/apps/api/src/api/shared_validators.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/api/shared_validators.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/src/api/ssh_keys.py",{"id":"file:/workspace/apps/api/src/api/ssh_keys.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/api/ssh_keys.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/src/api/terminal.py",{"id":"file:/workspace/apps/api/src/api/terminal.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/api/terminal.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/src/api/tool_configs.py",{"id":"file:/workspace/apps/api/src/api/tool_configs.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/api/tool_configs.py","metadata":{"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/workspace/apps/api/src/api/tool_definitions.py",{"id":"file:/workspace/apps/api/src/api/tool_definitions.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/api/tool_definitions.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/src/api/tool_instances.py",{"id":"file:/workspace/apps/api/src/api/tool_instances.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/api/tool_instances.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/src/api/tool_types.py",{"id":"file:/workspace/apps/api/src/api/tool_types.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/api/tool_types.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/src/api/tool_types_validation.py",{"id":"file:/workspace/apps/api/src/api/tool_types_validation.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/api/tool_types_validation.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/src/api/user_config.py",{"id":"file:/workspace/apps/api/src/api/user_config.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/api/user_config.py","metadata":{"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/workspace/apps/api/src/api/users.py",{"id":"file:/workspace/apps/api/src/api/users.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/api/users.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/src/api/workspace_files.py",{"id":"file:/workspace/apps/api/src/api/workspace_files.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/api/workspace_files.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/src/api/workspace_git.py",{"id":"file:/workspace/apps/api/src/api/workspace_git.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/api/workspace_git.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/src/api/workspace_instances.py",{"id":"file:/workspace/apps/api/src/api/workspace_instances.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/api/workspace_instances.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/src/api/workspaces.py",{"id":"file:/workspace/apps/api/src/api/workspaces.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/api/workspaces.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/src/auth/__init__.py",{"id":"file:/workspace/apps/api/src/auth/__init__.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/auth/__init__.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization","auth","user-input"]}}],["file:/workspace/apps/api/src/auth/cookies.py",{"id":"file:/workspace/apps/api/src/auth/cookies.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/auth/cookies.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization","auth","user-input"]}}],["file:/workspace/apps/api/src/auth/dependencies.py",{"id":"file:/workspace/apps/api/src/auth/dependencies.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/auth/dependencies.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization","auth","user-input"]}}],["file:/workspace/apps/api/src/auth/oidc.py",{"id":"file:/workspace/apps/api/src/auth/oidc.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/auth/oidc.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization","auth","user-input"]}}],["file:/workspace/apps/api/src/auth/session.py",{"id":"file:/workspace/apps/api/src/auth/session.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/auth/session.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization","auth","user-input"]}}],["file:/workspace/apps/api/src/config.py",{"id":"file:/workspace/apps/api/src/config.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/config.py","metadata":{"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/workspace/apps/api/src/database.py",{"id":"file:/workspace/apps/api/src/database.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/database.py","metadata":{"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/workspace/apps/api/src/logging_config.py",{"id":"file:/workspace/apps/api/src/logging_config.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/logging_config.py","metadata":{"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/workspace/apps/api/src/main.py",{"id":"file:/workspace/apps/api/src/main.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/main.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/src/models/__init__.py",{"id":"file:/workspace/apps/api/src/models/__init__.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/models/__init__.py","metadata":{"featureKind":"library","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/workspace/apps/api/src/models/base.py",{"id":"file:/workspace/apps/api/src/models/base.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/models/base.py","metadata":{"featureKind":"library","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/workspace/apps/api/src/models/config_folder.py",{"id":"file:/workspace/apps/api/src/models/config_folder.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/models/config_folder.py","metadata":{"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/workspace/apps/api/src/models/config_include.py",{"id":"file:/workspace/apps/api/src/models/config_include.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/models/config_include.py","metadata":{"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/workspace/apps/api/src/models/config_mount.py",{"id":"file:/workspace/apps/api/src/models/config_mount.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/models/config_mount.py","metadata":{"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/workspace/apps/api/src/models/config_profile.py",{"id":"file:/workspace/apps/api/src/models/config_profile.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/models/config_profile.py","metadata":{"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/workspace/apps/api/src/models/git_repository.py",{"id":"file:/workspace/apps/api/src/models/git_repository.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/models/git_repository.py","metadata":{"featureKind":"library","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/workspace/apps/api/src/models/health_check.py",{"id":"file:/workspace/apps/api/src/models/health_check.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/models/health_check.py","metadata":{"featureKind":"library","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/workspace/apps/api/src/models/instance_event.py",{"id":"file:/workspace/apps/api/src/models/instance_event.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/models/instance_event.py","metadata":{"featureKind":"library","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/workspace/apps/api/src/models/notification.py",{"id":"file:/workspace/apps/api/src/models/notification.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/models/notification.py","metadata":{"featureKind":"library","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/workspace/apps/api/src/models/project.py",{"id":"file:/workspace/apps/api/src/models/project.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/models/project.py","metadata":{"featureKind":"library","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/workspace/apps/api/src/models/ssh_key.py",{"id":"file:/workspace/apps/api/src/models/ssh_key.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/models/ssh_key.py","metadata":{"featureKind":"library","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/workspace/apps/api/src/models/terminal_session.py",{"id":"file:/workspace/apps/api/src/models/terminal_session.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/models/terminal_session.py","metadata":{"featureKind":"library","trustBoundaries":["filesystem","database","network","external-api","serialization","auth","user-input"]}}],["file:/workspace/apps/api/src/models/tool_definition_manifest.py",{"id":"file:/workspace/apps/api/src/models/tool_definition_manifest.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/models/tool_definition_manifest.py","metadata":{"featureKind":"library","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/workspace/apps/api/src/models/tool_instance.py",{"id":"file:/workspace/apps/api/src/models/tool_instance.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/models/tool_instance.py","metadata":{"featureKind":"library","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/workspace/apps/api/src/models/tool_type.py",{"id":"file:/workspace/apps/api/src/models/tool_type.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/models/tool_type.py","metadata":{"featureKind":"library","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/workspace/apps/api/src/models/user.py",{"id":"file:/workspace/apps/api/src/models/user.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/models/user.py","metadata":{"featureKind":"library","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/workspace/apps/api/src/models/user_config.py",{"id":"file:/workspace/apps/api/src/models/user_config.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/models/user_config.py","metadata":{"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/workspace/apps/api/src/models/workspace.py",{"id":"file:/workspace/apps/api/src/models/workspace.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/models/workspace.py","metadata":{"featureKind":"library","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/workspace/apps/api/src/schemas/__init__.py",{"id":"file:/workspace/apps/api/src/schemas/__init__.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/schemas/__init__.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/src/schemas/config_folder.py",{"id":"file:/workspace/apps/api/src/schemas/config_folder.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/schemas/config_folder.py","metadata":{"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/workspace/apps/api/src/schemas/config_profile.py",{"id":"file:/workspace/apps/api/src/schemas/config_profile.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/schemas/config_profile.py","metadata":{"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/workspace/apps/api/src/schemas/git_repository.py",{"id":"file:/workspace/apps/api/src/schemas/git_repository.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/schemas/git_repository.py","metadata":{"featureKind":"library","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/workspace/apps/api/src/schemas/health.py",{"id":"file:/workspace/apps/api/src/schemas/health.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/schemas/health.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/src/schemas/project.py",{"id":"file:/workspace/apps/api/src/schemas/project.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/schemas/project.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/src/schemas/ssh_key.py",{"id":"file:/workspace/apps/api/src/schemas/ssh_key.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/schemas/ssh_key.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/src/schemas/tool_config.py",{"id":"file:/workspace/apps/api/src/schemas/tool_config.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/schemas/tool_config.py","metadata":{"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/workspace/apps/api/src/schemas/tool_instance.py",{"id":"file:/workspace/apps/api/src/schemas/tool_instance.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/schemas/tool_instance.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/src/schemas/tool_type.py",{"id":"file:/workspace/apps/api/src/schemas/tool_type.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/schemas/tool_type.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/src/schemas/user.py",{"id":"file:/workspace/apps/api/src/schemas/user.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/schemas/user.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/src/schemas/user_config.py",{"id":"file:/workspace/apps/api/src/schemas/user_config.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/schemas/user_config.py","metadata":{"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/workspace/apps/api/src/scripts/__init__.py",{"id":"file:/workspace/apps/api/src/scripts/__init__.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/scripts/__init__.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/src/scripts/seed.py",{"id":"file:/workspace/apps/api/src/scripts/seed.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/scripts/seed.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/src/seeds/__init__.py",{"id":"file:/workspace/apps/api/src/seeds/__init__.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/seeds/__init__.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/src/seeds/builtin_tool_types.py",{"id":"file:/workspace/apps/api/src/seeds/builtin_tool_types.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/seeds/builtin_tool_types.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/src/services/clone.py",{"id":"file:/workspace/apps/api/src/services/clone.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/services/clone.py","metadata":{"featureKind":"service","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/src/services/config_profile_resolver.py",{"id":"file:/workspace/apps/api/src/services/config_profile_resolver.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/services/config_profile_resolver.py","metadata":{"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/workspace/apps/api/src/services/config_profiles.py",{"id":"file:/workspace/apps/api/src/services/config_profiles.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/services/config_profiles.py","metadata":{"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/workspace/apps/api/src/services/correlation.py",{"id":"file:/workspace/apps/api/src/services/correlation.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/services/correlation.py","metadata":{"featureKind":"service","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/src/services/docker/__init__.py",{"id":"file:/workspace/apps/api/src/services/docker/__init__.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/services/docker/__init__.py","metadata":{"featureKind":"service","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/src/services/docker/compose.py",{"id":"file:/workspace/apps/api/src/services/docker/compose.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/services/docker/compose.py","metadata":{"featureKind":"service","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/src/services/docker/config_staging.py",{"id":"file:/workspace/apps/api/src/services/docker/config_staging.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/services/docker/config_staging.py","metadata":{"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/workspace/apps/api/src/services/docker/container.py",{"id":"file:/workspace/apps/api/src/services/docker/container.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/services/docker/container.py","metadata":{"featureKind":"service","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/src/services/docker/tunnel.py",{"id":"file:/workspace/apps/api/src/services/docker/tunnel.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/services/docker/tunnel.py","metadata":{"featureKind":"service","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/src/services/docker_build.py",{"id":"file:/workspace/apps/api/src/services/docker_build.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/services/docker_build.py","metadata":{"featureKind":"service","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/src/services/event_bus.py",{"id":"file:/workspace/apps/api/src/services/event_bus.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/services/event_bus.py","metadata":{"featureKind":"service","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/src/services/file_service.py",{"id":"file:/workspace/apps/api/src/services/file_service.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/services/file_service.py","metadata":{"featureKind":"service","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/src/services/git/__init__.py",{"id":"file:/workspace/apps/api/src/services/git/__init__.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/services/git/__init__.py","metadata":{"featureKind":"service","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/src/services/git/control.py",{"id":"file:/workspace/apps/api/src/services/git/control.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/services/git/control.py","metadata":{"featureKind":"service","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/src/services/git/files.py",{"id":"file:/workspace/apps/api/src/services/git/files.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/services/git/files.py","metadata":{"featureKind":"service","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/src/services/git/repository.py",{"id":"file:/workspace/apps/api/src/services/git/repository.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/services/git/repository.py","metadata":{"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/workspace/apps/api/src/services/git_operations.py",{"id":"file:/workspace/apps/api/src/services/git_operations.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/services/git_operations.py","metadata":{"featureKind":"service","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/src/services/git_service.py",{"id":"file:/workspace/apps/api/src/services/git_service.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/services/git_service.py","metadata":{"featureKind":"service","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/src/services/health_monitor.py",{"id":"file:/workspace/apps/api/src/services/health_monitor.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/services/health_monitor.py","metadata":{"featureKind":"service","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/src/services/lifecycle_hooks.py",{"id":"file:/workspace/apps/api/src/services/lifecycle_hooks.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/services/lifecycle_hooks.py","metadata":{"featureKind":"service","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/src/services/manifest_compiler.py",{"id":"file:/workspace/apps/api/src/services/manifest_compiler.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/services/manifest_compiler.py","metadata":{"featureKind":"service","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/src/services/notification_service.py",{"id":"file:/workspace/apps/api/src/services/notification_service.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/services/notification_service.py","metadata":{"featureKind":"service","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/src/services/permission_fixer.py",{"id":"file:/workspace/apps/api/src/services/permission_fixer.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/services/permission_fixer.py","metadata":{"featureKind":"service","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/src/services/profile_resolver.py",{"id":"file:/workspace/apps/api/src/services/profile_resolver.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/services/profile_resolver.py","metadata":{"featureKind":"service","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/src/services/readiness_probe.py",{"id":"file:/workspace/apps/api/src/services/readiness_probe.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/services/readiness_probe.py","metadata":{"featureKind":"service","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/src/services/ssh_keys.py",{"id":"file:/workspace/apps/api/src/services/ssh_keys.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/services/ssh_keys.py","metadata":{"featureKind":"service","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/src/services/terminal_manager.py",{"id":"file:/workspace/apps/api/src/services/terminal_manager.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/services/terminal_manager.py","metadata":{"featureKind":"service","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/src/services/terminal_session.py",{"id":"file:/workspace/apps/api/src/services/terminal_session.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/services/terminal_session.py","metadata":{"featureKind":"service","trustBoundaries":["network","external-api","serialization","auth","user-input"]}}],["file:/workspace/apps/api/src/services/tunnel.py",{"id":"file:/workspace/apps/api/src/services/tunnel.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/services/tunnel.py","metadata":{"featureKind":"service","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/src/services/workspace_manager.py",{"id":"file:/workspace/apps/api/src/services/workspace_manager.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/services/workspace_manager.py","metadata":{"featureKind":"service","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/src/utils/git_control.py",{"id":"file:/workspace/apps/api/src/utils/git_control.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/utils/git_control.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/src/utils/git_files.py",{"id":"file:/workspace/apps/api/src/utils/git_files.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/utils/git_files.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/src/utils/git_history.py",{"id":"file:/workspace/apps/api/src/utils/git_history.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/utils/git_history.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/src/utils/git_url_parser.py",{"id":"file:/workspace/apps/api/src/utils/git_url_parser.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/utils/git_url_parser.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/tests/api/test_terminal_ws_multi.py",{"id":"file:/workspace/apps/api/tests/api/test_terminal_ws_multi.py","kind":"file","language":"python","filePath":"/workspace/apps/api/tests/api/test_terminal_ws_multi.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/tests/conftest.py",{"id":"file:/workspace/apps/api/tests/conftest.py","kind":"file","language":"python","filePath":"/workspace/apps/api/tests/conftest.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/tests/integration/__init__.py",{"id":"file:/workspace/apps/api/tests/integration/__init__.py","kind":"file","language":"python","filePath":"/workspace/apps/api/tests/integration/__init__.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/tests/integration/test_auth_api.py",{"id":"file:/workspace/apps/api/tests/integration/test_auth_api.py","kind":"file","language":"python","filePath":"/workspace/apps/api/tests/integration/test_auth_api.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization","auth","user-input"]}}],["file:/workspace/apps/api/tests/integration/test_auth_services.py",{"id":"file:/workspace/apps/api/tests/integration/test_auth_services.py","kind":"file","language":"python","filePath":"/workspace/apps/api/tests/integration/test_auth_services.py","metadata":{"featureKind":"service","trustBoundaries":["network","external-api","serialization","auth","user-input"]}}],["file:/workspace/apps/api/tests/integration/test_config_profiles_api.py",{"id":"file:/workspace/apps/api/tests/integration/test_config_profiles_api.py","kind":"file","language":"python","filePath":"/workspace/apps/api/tests/integration/test_config_profiles_api.py","metadata":{"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/workspace/apps/api/tests/integration/test_events.py",{"id":"file:/workspace/apps/api/tests/integration/test_events.py","kind":"file","language":"python","filePath":"/workspace/apps/api/tests/integration/test_events.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/tests/integration/test_git_control.py",{"id":"file:/workspace/apps/api/tests/integration/test_git_control.py","kind":"file","language":"python","filePath":"/workspace/apps/api/tests/integration/test_git_control.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/tests/integration/test_models.py",{"id":"file:/workspace/apps/api/tests/integration/test_models.py","kind":"file","language":"python","filePath":"/workspace/apps/api/tests/integration/test_models.py","metadata":{"featureKind":"library","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/workspace/apps/api/tests/integration/test_notifications_api.py",{"id":"file:/workspace/apps/api/tests/integration/test_notifications_api.py","kind":"file","language":"python","filePath":"/workspace/apps/api/tests/integration/test_notifications_api.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/tests/integration/test_notifications_lifecycle.py",{"id":"file:/workspace/apps/api/tests/integration/test_notifications_lifecycle.py","kind":"file","language":"python","filePath":"/workspace/apps/api/tests/integration/test_notifications_lifecycle.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/tests/integration/test_projects_api.py",{"id":"file:/workspace/apps/api/tests/integration/test_projects_api.py","kind":"file","language":"python","filePath":"/workspace/apps/api/tests/integration/test_projects_api.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/tests/integration/test_seed.py",{"id":"file:/workspace/apps/api/tests/integration/test_seed.py","kind":"file","language":"python","filePath":"/workspace/apps/api/tests/integration/test_seed.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/tests/integration/test_ssh_keys_api.py",{"id":"file:/workspace/apps/api/tests/integration/test_ssh_keys_api.py","kind":"file","language":"python","filePath":"/workspace/apps/api/tests/integration/test_ssh_keys_api.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/tests/integration/test_tool_types_api.py",{"id":"file:/workspace/apps/api/tests/integration/test_tool_types_api.py","kind":"file","language":"python","filePath":"/workspace/apps/api/tests/integration/test_tool_types_api.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/tests/integration/test_tool_types_api_extended.py",{"id":"file:/workspace/apps/api/tests/integration/test_tool_types_api_extended.py","kind":"file","language":"python","filePath":"/workspace/apps/api/tests/integration/test_tool_types_api_extended.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/tests/integration/test_users_api.py",{"id":"file:/workspace/apps/api/tests/integration/test_users_api.py","kind":"file","language":"python","filePath":"/workspace/apps/api/tests/integration/test_users_api.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/tests/integration/test_workspaces_api.py",{"id":"file:/workspace/apps/api/tests/integration/test_workspaces_api.py","kind":"file","language":"python","filePath":"/workspace/apps/api/tests/integration/test_workspaces_api.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/tests/services/test_terminal_manager_multi.py",{"id":"file:/workspace/apps/api/tests/services/test_terminal_manager_multi.py","kind":"file","language":"python","filePath":"/workspace/apps/api/tests/services/test_terminal_manager_multi.py","metadata":{"featureKind":"service","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/tests/system/__init__.py",{"id":"file:/workspace/apps/api/tests/system/__init__.py","kind":"file","language":"python","filePath":"/workspace/apps/api/tests/system/__init__.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/tests/unit/__init__.py",{"id":"file:/workspace/apps/api/tests/unit/__init__.py","kind":"file","language":"python","filePath":"/workspace/apps/api/tests/unit/__init__.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/tests/unit/test_config.py",{"id":"file:/workspace/apps/api/tests/unit/test_config.py","kind":"file","language":"python","filePath":"/workspace/apps/api/tests/unit/test_config.py","metadata":{"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/workspace/apps/api/tests/unit/test_config_profile_resolver.py",{"id":"file:/workspace/apps/api/tests/unit/test_config_profile_resolver.py","kind":"file","language":"python","filePath":"/workspace/apps/api/tests/unit/test_config_profile_resolver.py","metadata":{"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/workspace/apps/api/tests/unit/test_docker_build.py",{"id":"file:/workspace/apps/api/tests/unit/test_docker_build.py","kind":"file","language":"python","filePath":"/workspace/apps/api/tests/unit/test_docker_build.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/tests/unit/test_docker_service.py",{"id":"file:/workspace/apps/api/tests/unit/test_docker_service.py","kind":"file","language":"python","filePath":"/workspace/apps/api/tests/unit/test_docker_service.py","metadata":{"featureKind":"service","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/tests/unit/test_event_bus.py",{"id":"file:/workspace/apps/api/tests/unit/test_event_bus.py","kind":"file","language":"python","filePath":"/workspace/apps/api/tests/unit/test_event_bus.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/tests/unit/test_file_service.py",{"id":"file:/workspace/apps/api/tests/unit/test_file_service.py","kind":"file","language":"python","filePath":"/workspace/apps/api/tests/unit/test_file_service.py","metadata":{"featureKind":"service","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/tests/unit/test_git_mount_resolution.py",{"id":"file:/workspace/apps/api/tests/unit/test_git_mount_resolution.py","kind":"file","language":"python","filePath":"/workspace/apps/api/tests/unit/test_git_mount_resolution.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/tests/unit/test_git_mounts.py",{"id":"file:/workspace/apps/api/tests/unit/test_git_mounts.py","kind":"file","language":"python","filePath":"/workspace/apps/api/tests/unit/test_git_mounts.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/tests/unit/test_git_repository_clone_preflight.py",{"id":"file:/workspace/apps/api/tests/unit/test_git_repository_clone_preflight.py","kind":"file","language":"python","filePath":"/workspace/apps/api/tests/unit/test_git_repository_clone_preflight.py","metadata":{"featureKind":"library","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/workspace/apps/api/tests/unit/test_git_repository_working_clones.py",{"id":"file:/workspace/apps/api/tests/unit/test_git_repository_working_clones.py","kind":"file","language":"python","filePath":"/workspace/apps/api/tests/unit/test_git_repository_working_clones.py","metadata":{"featureKind":"library","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/workspace/apps/api/tests/unit/test_git_service.py",{"id":"file:/workspace/apps/api/tests/unit/test_git_service.py","kind":"file","language":"python","filePath":"/workspace/apps/api/tests/unit/test_git_service.py","metadata":{"featureKind":"service","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/tests/unit/test_git_url_parser.py",{"id":"file:/workspace/apps/api/tests/unit/test_git_url_parser.py","kind":"file","language":"python","filePath":"/workspace/apps/api/tests/unit/test_git_url_parser.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/tests/unit/test_health_monitor.py",{"id":"file:/workspace/apps/api/tests/unit/test_health_monitor.py","kind":"file","language":"python","filePath":"/workspace/apps/api/tests/unit/test_health_monitor.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/tests/unit/test_home_path_expansion.py",{"id":"file:/workspace/apps/api/tests/unit/test_home_path_expansion.py","kind":"file","language":"python","filePath":"/workspace/apps/api/tests/unit/test_home_path_expansion.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/tests/unit/test_lifecycle_hooks.py",{"id":"file:/workspace/apps/api/tests/unit/test_lifecycle_hooks.py","kind":"file","language":"python","filePath":"/workspace/apps/api/tests/unit/test_lifecycle_hooks.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/tests/unit/test_manifest_compiler.py",{"id":"file:/workspace/apps/api/tests/unit/test_manifest_compiler.py","kind":"file","language":"python","filePath":"/workspace/apps/api/tests/unit/test_manifest_compiler.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/tests/unit/test_migration_metadata.py",{"id":"file:/workspace/apps/api/tests/unit/test_migration_metadata.py","kind":"file","language":"python","filePath":"/workspace/apps/api/tests/unit/test_migration_metadata.py","metadata":{"featureKind":"library","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/workspace/apps/api/tests/unit/test_monitoring_models.py",{"id":"file:/workspace/apps/api/tests/unit/test_monitoring_models.py","kind":"file","language":"python","filePath":"/workspace/apps/api/tests/unit/test_monitoring_models.py","metadata":{"featureKind":"library","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/workspace/apps/api/tests/unit/test_notification_service.py",{"id":"file:/workspace/apps/api/tests/unit/test_notification_service.py","kind":"file","language":"python","filePath":"/workspace/apps/api/tests/unit/test_notification_service.py","metadata":{"featureKind":"service","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/tests/unit/test_notifications_api_routes.py",{"id":"file:/workspace/apps/api/tests/unit/test_notifications_api_routes.py","kind":"file","language":"python","filePath":"/workspace/apps/api/tests/unit/test_notifications_api_routes.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/tests/unit/test_permission_fixer.py",{"id":"file:/workspace/apps/api/tests/unit/test_permission_fixer.py","kind":"file","language":"python","filePath":"/workspace/apps/api/tests/unit/test_permission_fixer.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/tests/unit/test_profile_resolver.py",{"id":"file:/workspace/apps/api/tests/unit/test_profile_resolver.py","kind":"file","language":"python","filePath":"/workspace/apps/api/tests/unit/test_profile_resolver.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/tests/unit/test_readiness_probe.py",{"id":"file:/workspace/apps/api/tests/unit/test_readiness_probe.py","kind":"file","language":"python","filePath":"/workspace/apps/api/tests/unit/test_readiness_probe.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/tests/unit/test_session_branch_selection.py",{"id":"file:/workspace/apps/api/tests/unit/test_session_branch_selection.py","kind":"file","language":"python","filePath":"/workspace/apps/api/tests/unit/test_session_branch_selection.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization","auth","user-input"]}}],["file:/workspace/apps/api/tests/unit/test_ssh_keys.py",{"id":"file:/workspace/apps/api/tests/unit/test_ssh_keys.py","kind":"file","language":"python","filePath":"/workspace/apps/api/tests/unit/test_ssh_keys.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/tests/unit/test_terminal_manager.py",{"id":"file:/workspace/apps/api/tests/unit/test_terminal_manager.py","kind":"file","language":"python","filePath":"/workspace/apps/api/tests/unit/test_terminal_manager.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/tests/unit/test_terminal_session.py",{"id":"file:/workspace/apps/api/tests/unit/test_terminal_session.py","kind":"file","language":"python","filePath":"/workspace/apps/api/tests/unit/test_terminal_session.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization","auth","user-input"]}}],["file:/workspace/apps/api/tests/unit/test_tool_instances_legacy.py",{"id":"file:/workspace/apps/api/tests/unit/test_tool_instances_legacy.py","kind":"file","language":"python","filePath":"/workspace/apps/api/tests/unit/test_tool_instances_legacy.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/workspace/apps/api/src/services/instance_lifecycle.py",{"id":"file:/workspace/apps/api/src/services/instance_lifecycle.py","kind":"file","language":"python","filePath":"/workspace/apps/api/src/services/instance_lifecycle.py","metadata":{"featureKind":"service","trustBoundaries":["network","external-api","serialization"]}}]],"edges":[]} \ No newline at end of file diff --git a/apps/api/alembic/versions/0013_add_config_profiles.py b/apps/api/alembic/versions/0013_add_config_profiles.py index d042419..bf0262d 100644 --- a/apps/api/alembic/versions/0013_add_config_profiles.py +++ b/apps/api/alembic/versions/0013_add_config_profiles.py @@ -5,7 +5,7 @@ Revises: 0012_default_port_req Create Date: 2026-05-24 12:00:00.000000 """ -from typing import Sequence, Union +from collections.abc import Sequence from alembic import op import sqlalchemy as sa @@ -13,81 +13,181 @@ from sqlalchemy.dialects import postgresql # revision identifiers, used by Alembic. revision: str = "0013_add_config_profiles" -down_revision: Union[str, None] = "0012_default_port_req" -branch_labels: Union[str, Sequence[str], None] = None -depends_on: Union[str, Sequence[str], None] = None +down_revision: str | None = "0012_default_port_req" +branch_labels: str | Sequence[str] | None = None +depends_on: str | Sequence[str] | None = None + + +def _table_exists(table_name: str) -> bool: + return sa.inspect(op.get_bind()).has_table(table_name) + + +def _column_exists(table_name: str, column_name: str) -> bool: + if not _table_exists(table_name): + return False + return column_name in { + column["name"] for column in sa.inspect(op.get_bind()).get_columns(table_name) + } + + +def _index_exists(table_name: str, index_name: str) -> bool: + if not _table_exists(table_name): + return False + return index_name in { + index["name"] for index in sa.inspect(op.get_bind()).get_indexes(table_name) + } + + +def _foreign_key_exists( + table_name: str, + constrained_columns: list[str], + referred_table: str, +) -> bool: + if not _table_exists(table_name): + return False + for foreign_key in sa.inspect(op.get_bind()).get_foreign_keys(table_name): + if ( + foreign_key.get("constrained_columns") == constrained_columns + and foreign_key.get("referred_table") == referred_table + ): + return True + return False def upgrade() -> None: - # Create config_profiles table - op.create_table( - "config_profiles", - sa.Column("id", postgresql.UUID(as_uuid=True), nullable=False), - sa.Column("user_id", postgresql.UUID(as_uuid=True), nullable=False), - sa.Column("name", sa.String(length=255), nullable=False), - sa.Column("description", sa.Text(), nullable=True), - sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.text("NOW()"), nullable=False), - sa.Column("updated_at", sa.DateTime(timezone=True), server_default=sa.text("NOW()"), nullable=False), - sa.ForeignKeyConstraint(["user_id"], ["users.id"], ondelete="CASCADE"), - sa.PrimaryKeyConstraint("id"), - sa.UniqueConstraint("user_id", "name", name="uq_config_profiles_user_name"), - ) - op.create_index("idx_config_profiles_user", "config_profiles", ["user_id"]) + # Earlier branches may already have created config_profiles. Keep this + # migration defensive so databases can converge onto the current graph. + if not _table_exists("config_profiles"): + op.create_table( + "config_profiles", + sa.Column("id", postgresql.UUID(as_uuid=True), nullable=False), + sa.Column("user_id", postgresql.UUID(as_uuid=True), nullable=False), + sa.Column("name", sa.String(length=255), nullable=False), + sa.Column("description", sa.Text(), nullable=True), + sa.Column( + "created_at", + sa.DateTime(timezone=True), + server_default=sa.text("NOW()"), + nullable=False, + ), + sa.Column( + "updated_at", + sa.DateTime(timezone=True), + server_default=sa.text("NOW()"), + nullable=False, + ), + sa.ForeignKeyConstraint(["user_id"], ["users.id"], ondelete="CASCADE"), + sa.PrimaryKeyConstraint("id"), + sa.UniqueConstraint( + "user_id", "name", name="uq_config_profiles_user_name" + ), + ) + if not _index_exists("config_profiles", "idx_config_profiles_user"): + op.create_index("idx_config_profiles_user", "config_profiles", ["user_id"]) - # Create config_includes table - op.create_table( - "config_includes", - sa.Column("id", postgresql.UUID(as_uuid=True), nullable=False), - sa.Column("profile_id", postgresql.UUID(as_uuid=True), nullable=False), - sa.Column("included_profile_id", postgresql.UUID(as_uuid=True), nullable=False), - sa.Column("order_index", sa.Integer(), nullable=False, server_default="0"), - sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.text("NOW()"), nullable=False), - sa.Column("updated_at", sa.DateTime(timezone=True), server_default=sa.text("NOW()"), nullable=False), - sa.ForeignKeyConstraint(["profile_id"], ["config_profiles.id"], ondelete="CASCADE"), - sa.ForeignKeyConstraint(["included_profile_id"], ["config_profiles.id"], ondelete="CASCADE"), - sa.PrimaryKeyConstraint("id"), - sa.UniqueConstraint("profile_id", "included_profile_id", name="uq_config_includes_pair"), - ) - op.create_index("idx_config_includes_profile", "config_includes", ["profile_id"]) - op.create_index("idx_config_includes_included", "config_includes", ["included_profile_id"]) + if not _table_exists("config_includes"): + op.create_table( + "config_includes", + sa.Column("id", postgresql.UUID(as_uuid=True), nullable=False), + sa.Column("profile_id", postgresql.UUID(as_uuid=True), nullable=False), + sa.Column( + "included_profile_id", postgresql.UUID(as_uuid=True), nullable=False + ), + sa.Column("order_index", sa.Integer(), nullable=False, server_default="0"), + sa.Column( + "created_at", + sa.DateTime(timezone=True), + server_default=sa.text("NOW()"), + nullable=False, + ), + sa.Column( + "updated_at", + sa.DateTime(timezone=True), + server_default=sa.text("NOW()"), + nullable=False, + ), + sa.ForeignKeyConstraint( + ["profile_id"], ["config_profiles.id"], ondelete="CASCADE" + ), + sa.ForeignKeyConstraint( + ["included_profile_id"], + ["config_profiles.id"], + ondelete="CASCADE", + ), + sa.PrimaryKeyConstraint("id"), + sa.UniqueConstraint( + "profile_id", "included_profile_id", name="uq_config_includes_pair" + ), + ) + if not _index_exists("config_includes", "idx_config_includes_profile"): + op.create_index("idx_config_includes_profile", "config_includes", ["profile_id"]) + if not _index_exists("config_includes", "idx_config_includes_included"): + op.create_index( + "idx_config_includes_included", "config_includes", ["included_profile_id"] + ) - # Create config_mounts table - op.create_table( - "config_mounts", - sa.Column("id", postgresql.UUID(as_uuid=True), nullable=False), - sa.Column("profile_id", postgresql.UUID(as_uuid=True), nullable=False), - sa.Column("mount_path", sa.String(length=1024), nullable=False), - sa.Column("content", sa.Text(), nullable=True), - sa.Column("source_profile_id", postgresql.UUID(as_uuid=True), nullable=True), - sa.Column("order_index", sa.Integer(), nullable=False, server_default="0"), - sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.text("NOW()"), nullable=False), - sa.Column("updated_at", sa.DateTime(timezone=True), server_default=sa.text("NOW()"), nullable=False), - sa.ForeignKeyConstraint(["profile_id"], ["config_profiles.id"], ondelete="CASCADE"), - sa.ForeignKeyConstraint(["source_profile_id"], ["config_profiles.id"], ondelete="SET NULL"), - sa.PrimaryKeyConstraint("id"), - ) - op.create_index("idx_config_mounts_profile", "config_mounts", ["profile_id"]) + if not _table_exists("config_mounts"): + op.create_table( + "config_mounts", + sa.Column("id", postgresql.UUID(as_uuid=True), nullable=False), + sa.Column("profile_id", postgresql.UUID(as_uuid=True), nullable=False), + sa.Column("mount_path", sa.String(length=1024), nullable=False), + sa.Column("content", sa.Text(), nullable=True), + sa.Column("source_profile_id", postgresql.UUID(as_uuid=True), nullable=True), + sa.Column("order_index", sa.Integer(), nullable=False, server_default="0"), + sa.Column( + "created_at", + sa.DateTime(timezone=True), + server_default=sa.text("NOW()"), + nullable=False, + ), + sa.Column( + "updated_at", + sa.DateTime(timezone=True), + server_default=sa.text("NOW()"), + nullable=False, + ), + sa.ForeignKeyConstraint( + ["profile_id"], ["config_profiles.id"], ondelete="CASCADE" + ), + sa.ForeignKeyConstraint( + ["source_profile_id"], ["config_profiles.id"], ondelete="SET NULL" + ), + sa.PrimaryKeyConstraint("id"), + ) + if not _index_exists("config_mounts", "idx_config_mounts_profile"): + op.create_index("idx_config_mounts_profile", "config_mounts", ["profile_id"]) - # Add selected_profile_id to tool_instances - op.add_column( - "tool_instances", - sa.Column("selected_profile_id", postgresql.UUID(as_uuid=True), nullable=True), - ) - op.create_foreign_key( - "fk_tool_instances_selected_profile", - "tool_instances", - "config_profiles", - ["selected_profile_id"], - ["id"], - ondelete="SET NULL", - ) - op.create_index("idx_tool_instances_selected_profile", "tool_instances", ["selected_profile_id"]) + if not _column_exists("tool_instances", "selected_profile_id"): + op.add_column( + "tool_instances", + sa.Column("selected_profile_id", postgresql.UUID(as_uuid=True), nullable=True), + ) + if not _foreign_key_exists( + "tool_instances", ["selected_profile_id"], "config_profiles" + ): + op.create_foreign_key( + "fk_tool_instances_selected_profile", + "tool_instances", + "config_profiles", + ["selected_profile_id"], + ["id"], + ondelete="SET NULL", + ) + if not _index_exists("tool_instances", "idx_tool_instances_selected_profile"): + op.create_index( + "idx_tool_instances_selected_profile", + "tool_instances", + ["selected_profile_id"], + ) def downgrade() -> None: # Remove selected_profile_id from tool_instances op.drop_index("idx_tool_instances_selected_profile", table_name="tool_instances") - op.drop_constraint("fk_tool_instances_selected_profile", "tool_instances", type_="foreignkey") + op.drop_constraint( + "fk_tool_instances_selected_profile", "tool_instances", type_="foreignkey" + ) op.drop_column("tool_instances", "selected_profile_id") # Drop config_mounts diff --git a/apps/api/alembic/versions/0014_add_profile_resolver_fields.py b/apps/api/alembic/versions/0014_add_profile_resolver_fields.py index 8d923fb..5302c5e 100644 --- a/apps/api/alembic/versions/0014_add_profile_resolver_fields.py +++ b/apps/api/alembic/versions/0014_add_profile_resolver_fields.py @@ -5,7 +5,7 @@ Revises: 0013_add_config_profiles Create Date: 2026-05-24 14:00:00.000000 """ -from typing import Sequence, Union +from collections.abc import Sequence from alembic import op import sqlalchemy as sa @@ -13,82 +13,141 @@ from sqlalchemy.dialects import postgresql # revision identifiers, used by Alembic. revision: str = "0014_add_profile_resolver_fields" -down_revision: Union[str, None] = "0013_add_config_profiles" -branch_labels: Union[str, Sequence[str], None] = None -depends_on: Union[str, Sequence[str], None] = None +down_revision: str | None = "0013_add_config_profiles" +branch_labels: str | Sequence[str] | None = None +depends_on: str | Sequence[str] | None = None + + +def _table_exists(table_name: str) -> bool: + return sa.inspect(op.get_bind()).has_table(table_name) + + +def _column_exists(table_name: str, column_name: str) -> bool: + if not _table_exists(table_name): + return False + return column_name in { + column["name"] for column in sa.inspect(op.get_bind()).get_columns(table_name) + } + + +def _index_exists(table_name: str, index_name: str) -> bool: + if not _table_exists(table_name): + return False + return index_name in { + index["name"] for index in sa.inspect(op.get_bind()).get_indexes(table_name) + } + + +def _foreign_key_exists( + table_name: str, + constrained_columns: list[str], + referred_table: str, +) -> bool: + if not _table_exists(table_name): + return False + for foreign_key in sa.inspect(op.get_bind()).get_foreign_keys(table_name): + if ( + foreign_key.get("constrained_columns") == constrained_columns + and foreign_key.get("referred_table") == referred_table + ): + return True + return False + + +def _foreign_key_names_for_column(table_name: str, column_name: str) -> list[str]: + if not _table_exists(table_name): + return [] + names: list[str] = [] + for foreign_key in sa.inspect(op.get_bind()).get_foreign_keys(table_name): + if column_name in foreign_key.get("constrained_columns", []): + name = foreign_key.get("name") + if name: + names.append(name) + return names def upgrade() -> None: - # Add fields to config_profiles - op.add_column( - "config_profiles", - sa.Column("project_id", postgresql.UUID(as_uuid=True), nullable=True), - ) - op.add_column( - "config_profiles", - sa.Column("tool_type_id", postgresql.UUID(as_uuid=True), nullable=True), - ) - op.add_column( - "config_profiles", - sa.Column("environment_variables", sa.JSON(), nullable=True), - ) - op.add_column( - "config_profiles", - sa.Column("start_command", sa.Text(), nullable=True), - ) - op.add_column( - "config_profiles", - sa.Column("working_directory", sa.Text(), nullable=True), - ) - op.add_column( - "config_profiles", - sa.Column("port", sa.Integer(), nullable=True), - ) - op.add_column( - "config_profiles", - sa.Column("is_default", sa.Boolean(), nullable=False, server_default="false"), - ) - - # Add foreign keys for project and tool_type - op.create_foreign_key( - "fk_config_profiles_project", - "config_profiles", - "projects", - ["project_id"], - ["id"], - ondelete="CASCADE", - ) - op.create_foreign_key( - "fk_config_profiles_tool_type", - "config_profiles", - "tool_types", - ["tool_type_id"], - ["id"], - ondelete="CASCADE", - ) - - # Create indices - op.create_index("idx_config_profiles_project", "config_profiles", ["project_id"]) - op.create_index("idx_config_profiles_tool_type", "config_profiles", ["tool_type_id"]) - - # Alter config_mounts: rename mount_path to target_path, add mode, change content to files JSON - op.alter_column("config_mounts", "mount_path", new_column_name="target_path") - op.add_column( - "config_mounts", - sa.Column("mode", sa.String(length=10), nullable=False, server_default="rw"), - ) - op.add_column( - "config_mounts", - sa.Column("files", sa.JSON(), nullable=True), - ) - # Drop the source_profile foreign key if it exists - op.drop_constraint( - "config_mounts_source_profile_id_fkey", - "config_mounts", - type_="foreignkey", - ) - op.drop_column("config_mounts", "content") - op.drop_column("config_mounts", "source_profile_id") + if not _column_exists("config_profiles", "project_id"): + op.add_column( + "config_profiles", + sa.Column("project_id", postgresql.UUID(as_uuid=True), nullable=True), + ) + if not _column_exists("config_profiles", "tool_type_id"): + op.add_column( + "config_profiles", + sa.Column("tool_type_id", postgresql.UUID(as_uuid=True), nullable=True), + ) + if not _column_exists("config_profiles", "environment_variables"): + op.add_column( + "config_profiles", + sa.Column("environment_variables", sa.JSON(), nullable=True), + ) + if not _column_exists("config_profiles", "start_command"): + op.add_column( + "config_profiles", + sa.Column("start_command", sa.Text(), nullable=True), + ) + if not _column_exists("config_profiles", "working_directory"): + op.add_column( + "config_profiles", + sa.Column("working_directory", sa.Text(), nullable=True), + ) + if not _column_exists("config_profiles", "port"): + op.add_column("config_profiles", sa.Column("port", sa.Integer(), nullable=True)) + if not _column_exists("config_profiles", "is_default"): + op.add_column( + "config_profiles", + sa.Column("is_default", sa.Boolean(), nullable=False, server_default="false"), + ) + + if not _foreign_key_exists("config_profiles", ["project_id"], "projects"): + op.create_foreign_key( + "fk_config_profiles_project", + "config_profiles", + "projects", + ["project_id"], + ["id"], + ondelete="CASCADE", + ) + if not _foreign_key_exists("config_profiles", ["tool_type_id"], "tool_types"): + op.create_foreign_key( + "fk_config_profiles_tool_type", + "config_profiles", + "tool_types", + ["tool_type_id"], + ["id"], + ondelete="CASCADE", + ) + + if not _index_exists("config_profiles", "idx_config_profiles_project"): + op.create_index("idx_config_profiles_project", "config_profiles", ["project_id"]) + if not _index_exists("config_profiles", "idx_config_profiles_tool_type"): + op.create_index( + "idx_config_profiles_tool_type", "config_profiles", ["tool_type_id"] + ) + + if _column_exists("config_mounts", "mount_path") and not _column_exists( + "config_mounts", "target_path" + ): + op.alter_column("config_mounts", "mount_path", new_column_name="target_path") + if not _column_exists("config_mounts", "mode"): + op.add_column( + "config_mounts", + sa.Column("mode", sa.String(length=10), nullable=False, server_default="rw"), + ) + if not _column_exists("config_mounts", "files"): + op.add_column( + "config_mounts", + sa.Column("files", sa.JSON(), nullable=True), + ) + for constraint_name in _foreign_key_names_for_column( + "config_mounts", "source_profile_id" + ): + op.drop_constraint(constraint_name, "config_mounts", type_="foreignkey") + if _column_exists("config_mounts", "content"): + op.drop_column("config_mounts", "content") + if _column_exists("config_mounts", "source_profile_id"): + op.drop_column("config_mounts", "source_profile_id") def downgrade() -> None: @@ -104,11 +163,13 @@ def downgrade() -> None: op.drop_column("config_mounts", "files") op.drop_column("config_mounts", "mode") op.alter_column("config_mounts", "target_path", new_column_name="mount_path") - + # Restore config_profiles op.drop_index("idx_config_profiles_tool_type", table_name="config_profiles") op.drop_index("idx_config_profiles_project", table_name="config_profiles") - op.drop_constraint("fk_config_profiles_tool_type", "config_profiles", type_="foreignkey") + op.drop_constraint( + "fk_config_profiles_tool_type", "config_profiles", type_="foreignkey" + ) op.drop_constraint("fk_config_profiles_project", "config_profiles", type_="foreignkey") op.drop_column("config_profiles", "is_default") op.drop_column("config_profiles", "port") diff --git a/apps/api/alembic/versions/86cec91fdb00_merge_profile_resolver_and_workspaces_.py b/apps/api/alembic/versions/86cec91fdb00_merge_profile_resolver_and_workspaces_.py new file mode 100644 index 0000000..88163e6 --- /dev/null +++ b/apps/api/alembic/versions/86cec91fdb00_merge_profile_resolver_and_workspaces_.py @@ -0,0 +1,20 @@ +"""merge profile resolver and workspaces heads + +Revision ID: 86cec91fdb00 +Revises: 0014_add_profile_resolver_fields, 2026_06_01_add_workspaces +Create Date: 2026-06-03 12:48:36.145702 +""" + +# revision identifiers, used by Alembic. +revision = "86cec91fdb00" +down_revision = ("0014_add_profile_resolver_fields", "2026_06_01_add_workspaces") +branch_labels = None +depends_on = None + + +def upgrade() -> None: + pass + + +def downgrade() -> None: + pass diff --git a/apps/api/src/models/__init__.py b/apps/api/src/models/__init__.py index 3358553..20b1ac0 100644 --- a/apps/api/src/models/__init__.py +++ b/apps/api/src/models/__init__.py @@ -10,6 +10,7 @@ from src.models.tool_instance import ToolInstance from src.models.tool_type import ToolType from src.models.user import User from src.models.user_config import UserConfig +from src.models.workspace import Workspace __all__ = [ "Base", @@ -24,4 +25,5 @@ __all__ = [ "ToolType", "User", "UserConfig", + "Workspace", ] diff --git a/apps/api/src/models/tool_type.py b/apps/api/src/models/tool_type.py index 24b93dc..1d7b6a3 100644 --- a/apps/api/src/models/tool_type.py +++ b/apps/api/src/models/tool_type.py @@ -7,8 +7,9 @@ from sqlalchemy.orm import Mapped, mapped_column, relationship from src.models.base import Base, TimestampMixin, UUIDPrimaryKeyMixin +from src.models.tool_definition_manifest import ToolDefinitionManifest + if TYPE_CHECKING: - from src.models.tool_definition_manifest import ToolDefinitionManifest from src.models.user import User