From 5deee8c65c2442ada09410430ea71750d75364cb Mon Sep 17 00:00:00 2001 From: Alex Blank Date: Thu, 28 May 2026 13:26:54 +0200 Subject: [PATCH 1/3] feat: tool definition manifest system (PR 1) - Add ToolDefinitionManifest model with base image versioning - Add manifest compiler: Dockerfile + Compose generation from JSON manifests - Add permission fixer: post-start chown/chmod for mount policies - Add tool definition CRUD API with live compile preview endpoint - Integrate manifest-based startup flow in start_instance - Add Alembic migration with data conversion for pi-agent - Add 48 unit tests for manifest compiler, permission fixer, docker service - Keep backward compatibility with legacy dockerfile_template/compose_template Migration: applied successfully. Pi-agent converted to manifest. Quality gates: pytest (146 passed, 4 pre-existing unrelated failures) --- .pi/settings.json | 1 + apps/api/.pi-lens/cache/review-graph.json | 1 + ...026_05_28_add_tool_definition_manifests.py | 375 +++++++++ apps/api/src/api/tool_definitions.py | 424 ++++++++++ apps/api/src/api/tool_instances.py | 280 ++++++- apps/api/src/main.py | 8 +- apps/api/src/models/__init__.py | 16 +- .../src/models/tool_definition_manifest.py | 67 ++ apps/api/src/models/tool_instance.py | 42 +- apps/api/src/models/tool_type.py | 21 +- apps/api/src/services/manifest_compiler.py | 412 ++++++++++ apps/api/src/services/permission_fixer.py | 164 ++++ apps/api/tests/unit/test_manifest_compiler.py | 315 ++++++++ apps/api/tests/unit/test_permission_fixer.py | 145 ++++ openspec/config.yaml | 37 + openspec/designs/tool-definition-manifest.md | 751 ++++++++++++++++++ .../streamline-tool-container-definitions.md | 362 +++++++++ .../streamline-tool-container-definitions.md | 447 +++++++++++ openspec/specs/tool-definition-manifest.md | 323 ++++++++ openspec/tasks/tool-definition-manifest.md | 89 +++ 20 files changed, 4211 insertions(+), 69 deletions(-) create mode 100644 .pi/settings.json create mode 100644 apps/api/.pi-lens/cache/review-graph.json create mode 100644 apps/api/alembic/versions/2026_05_28_add_tool_definition_manifests.py create mode 100644 apps/api/src/api/tool_definitions.py create mode 100644 apps/api/src/models/tool_definition_manifest.py create mode 100644 apps/api/src/services/manifest_compiler.py create mode 100644 apps/api/src/services/permission_fixer.py create mode 100644 apps/api/tests/unit/test_manifest_compiler.py create mode 100644 apps/api/tests/unit/test_permission_fixer.py create mode 100644 openspec/config.yaml create mode 100644 openspec/designs/tool-definition-manifest.md create mode 100644 openspec/explorations/streamline-tool-container-definitions.md create mode 100644 openspec/proposals/streamline-tool-container-definitions.md create mode 100644 openspec/specs/tool-definition-manifest.md create mode 100644 openspec/tasks/tool-definition-manifest.md diff --git a/.pi/settings.json b/.pi/settings.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/.pi/settings.json @@ -0,0 +1 @@ +{} 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..0d649ad --- /dev/null +++ b/apps/api/.pi-lens/cache/review-graph.json @@ -0,0 +1 @@ +{"version":"v2","builtAt":"2026-05-28T11:31:47.398Z","signature":"/home/alex/projects/headquarter/apps/api/alembic/env.py:1566:1779050260293.852|/home/alex/projects/headquarter/apps/api/alembic/versions/0001_initial_schema.py:4658:1779050260293.852|/home/alex/projects/headquarter/apps/api/alembic/versions/0002_refresh_tokens.py:2405:1779050260294.7954|/home/alex/projects/headquarter/apps/api/alembic/versions/0003_user_configs.py:1101:1779139057995.512|/home/alex/projects/headquarter/apps/api/alembic/versions/0004_tool_types.py:1575:1779139081351.2407|/home/alex/projects/headquarter/apps/api/alembic/versions/0005_ssh_keys_timestamps.py:1039:1779184269353.1443|/home/alex/projects/headquarter/apps/api/alembic/versions/0006_tool_instances.py:2716:1779215731764.582|/home/alex/projects/headquarter/apps/api/alembic/versions/0007_instance_container_name.py:715:1779265847432.003|/home/alex/projects/headquarter/apps/api/alembic/versions/0008_tool_type_category.py:911:1779267040781.6345|/home/alex/projects/headquarter/apps/api/alembic/versions/0009_tool_configs.py:2039:1779267064123.3723|/home/alex/projects/headquarter/apps/api/alembic/versions/0010_tool_type_default_port.py:689:1779277879364.0645|/home/alex/projects/headquarter/apps/api/alembic/versions/0011_tool_instance_tunnel_fields.py:894:1779279491357.6292|/home/alex/projects/headquarter/apps/api/alembic/versions/0012_default_port_req.py:1229:1779290612348.005|/home/alex/projects/headquarter/apps/api/alembic/versions/0013_add_probe_result.py:743:1779478921751.2427|/home/alex/projects/headquarter/apps/api/alembic/versions/0014_merge_heads.py:525:1779958621074.462|/home/alex/projects/headquarter/apps/api/alembic/versions/0015_single_interface.py:3832:1779958621081.462|/home/alex/projects/headquarter/apps/api/alembic/versions/2026_05_22_add_clone_mode.py:1312:1779485016565.7122|/home/alex/projects/headquarter/apps/api/alembic/versions/2026_05_23_remove_is_builtin.py:698:1779620544420.1614|/home/alex/projects/headquarter/apps/api/alembic/versions/2026_05_24_220141_add_startup_command.py:683:1779700843566.628|/home/alex/projects/headquarter/apps/api/alembic/versions/2026_05_24_add_config_profiles.py:4826:1779645589985.5532|/home/alex/projects/headquarter/apps/api/alembic/versions/2026_05_26_add_git_mounts.py:716:1779870048496.4265|/home/alex/projects/headquarter/apps/api/alembic/versions/2026_05_27_external_repos.py:1150:1779870986784.585|/home/alex/projects/headquarter/apps/api/alembic/versions/2026_05_28_add_tool_definition_manifests.py:13934:1779967994204.917|/home/alex/projects/headquarter/apps/api/alembic/versions/20260527160017_add_pi_agent_tool_type.py:3794:1779958621081.462|/home/alex/projects/headquarter/apps/api/alembic/versions/398082499c30_add_tool_config_fields.py:1576:1779467943887.104|/home/alex/projects/headquarter/apps/api/alembic/versions/6fc7bfcf199f_merge_remove_is_builtin_and_add_config_.py:455:1779958621081.462|/home/alex/projects/headquarter/apps/api/alembic/versions/8ed7dd80973d_create_config_folders_table.py:1770:1779467958721.936|/home/alex/projects/headquarter/apps/api/alembic/versions/af8512103d67_add_tool_type_fields.py:1432:1779467930354.6824|/home/alex/projects/headquarter/apps/api/alembic/versions/f3d2dc90ba3a_merge_single_interface_and_clone_mode.py:559:1779958621094.4617|/home/alex/projects/headquarter/apps/api/src/__init__.py:31:1779050260294.7954|/home/alex/projects/headquarter/apps/api/src/api/__init__.py:139:1779050826659.6775|/home/alex/projects/headquarter/apps/api/src/api/auth.py:7944:1779912973110.818|/home/alex/projects/headquarter/apps/api/src/api/config_folders.py:12351:1779710572785.8096|/home/alex/projects/headquarter/apps/api/src/api/config_profiles.py:27916:1779958621095.4617|/home/alex/projects/headquarter/apps/api/src/api/dashboard.py:2121:1779218866429.8337|/home/alex/projects/headquarter/apps/api/src/api/git_repositories.py:46638:1779958621112.4614|/home/alex/projects/headquarter/apps/api/src/api/health.py:4554:1779958621112.4614|/home/alex/projects/headquarter/apps/api/src/api/instance_proxy.py:4233:1779958621116.4614|/home/alex/projects/headquarter/apps/api/src/api/projects.py:6672:1779958621116.4614|/home/alex/projects/headquarter/apps/api/src/api/shared_validators.py:2682:1779958621132.4612|/home/alex/projects/headquarter/apps/api/src/api/ssh_keys.py:7517:1779958621133.4612|/home/alex/projects/headquarter/apps/api/src/api/terminal.py:12567:1779958621133.4612|/home/alex/projects/headquarter/apps/api/src/api/tool_configs.py:11248:1779958621152.461|/home/alex/projects/headquarter/apps/api/src/api/tool_definitions.py:13721:1779962991824.0735|/home/alex/projects/headquarter/apps/api/src/api/tool_instances.py:81390:1779962991812.0737|/home/alex/projects/headquarter/apps/api/src/api/tool_types_validation.py:2608:1779710051058.87|/home/alex/projects/headquarter/apps/api/src/api/tool_types.py:18213:1779958621153.461|/home/alex/projects/headquarter/apps/api/src/api/user_config.py:3431:1779958621153.461|/home/alex/projects/headquarter/apps/api/src/api/users.py:4291:1779708729186.244|/home/alex/projects/headquarter/apps/api/src/auth/__init__.py:308:1779137370597.2402|/home/alex/projects/headquarter/apps/api/src/auth/cookies.py:287:1779139942809.316|/home/alex/projects/headquarter/apps/api/src/auth/dependencies.py:2891:1779958621153.461|/home/alex/projects/headquarter/apps/api/src/auth/oidc.py:1650:1779137182579.4893|/home/alex/projects/headquarter/apps/api/src/auth/session.py:2228:1779645590016.553|/home/alex/projects/headquarter/apps/api/src/config.py:4705:1779286905138.4783|/home/alex/projects/headquarter/apps/api/src/database.py:3904:1779138928838.0117|/home/alex/projects/headquarter/apps/api/src/logging_config.py:2832:1779135759825.8926|/home/alex/projects/headquarter/apps/api/src/main.py:4791:1779962991745.0745|/home/alex/projects/headquarter/apps/api/src/models/__init__.py:770:1779962991815.0735|/home/alex/projects/headquarter/apps/api/src/models/base.py:640:1779109950568.2888|/home/alex/projects/headquarter/apps/api/src/models/config_folder.py:1199:1779468006545.395|/home/alex/projects/headquarter/apps/api/src/models/config_profile.py:3157:1779885324307.303|/home/alex/projects/headquarter/apps/api/src/models/git_repository.py:1415:1779870334034.114|/home/alex/projects/headquarter/apps/api/src/models/project.py:1241:1779109950568.697|/home/alex/projects/headquarter/apps/api/src/models/ssh_key.py:993:1779184246096.4092|/home/alex/projects/headquarter/apps/api/src/models/tool_config.py:1814:1779471154363.973|/home/alex/projects/headquarter/apps/api/src/models/tool_definition_manifest.py:2449:1779962991760.0742|/home/alex/projects/headquarter/apps/api/src/models/tool_instance.py:3057:1779962991776.074|/home/alex/projects/headquarter/apps/api/src/models/tool_type.py:2196:1779962991768.0742|/home/alex/projects/headquarter/apps/api/src/models/user_config.py:680:1779109990811.1602|/home/alex/projects/headquarter/apps/api/src/models/user.py:981:1779137408181.7927|/home/alex/projects/headquarter/apps/api/src/scripts/__init__.py:43:1779050260295.4287|/home/alex/projects/headquarter/apps/api/src/scripts/seed.py:1099:1779050260295.7207|/home/alex/projects/headquarter/apps/api/src/services/clone.py:2697:1779912904816.8372|/home/alex/projects/headquarter/apps/api/src/services/config_profile_resolver.py:15234:1779874299307.0806|/home/alex/projects/headquarter/apps/api/src/services/docker_build.py:2454:1779958621154.461|/home/alex/projects/headquarter/apps/api/src/services/docker.py:16097:1779958667213.9204|/home/alex/projects/headquarter/apps/api/src/services/manifest_compiler.py:13851:1779962991788.074|/home/alex/projects/headquarter/apps/api/src/services/permission_fixer.py:4631:1779962991795.0737|/home/alex/projects/headquarter/apps/api/src/services/readiness_probe.py:2120:1779468682156.7576|/home/alex/projects/headquarter/apps/api/src/services/ssh_keys.py:2050:1779481962606.4976|/home/alex/projects/headquarter/apps/api/src/services/terminal_manager.py:5804:1779958621154.461|/home/alex/projects/headquarter/apps/api/src/services/terminal_session.py:8778:1779912904787.3071|/home/alex/projects/headquarter/apps/api/src/utils/git_control.py:8284:1779958621174.4607|/home/alex/projects/headquarter/apps/api/src/utils/git_files.py:13552:1779618531450.968|/home/alex/projects/headquarter/apps/api/src/utils/git_history.py:11790:1779189553538.5813|/home/alex/projects/headquarter/apps/api/src/utils/git_url_parser.py:6437:1779185863539.9849|/home/alex/projects/headquarter/apps/api/tests/conftest.py:7687:1779958621174.4607|/home/alex/projects/headquarter/apps/api/tests/integration/__init__.py:0:1779471420954.9705|/home/alex/projects/headquarter/apps/api/tests/integration/test_auth_api.py:3813:1779471420958.8003|/home/alex/projects/headquarter/apps/api/tests/integration/test_auth_services.py:2447:1779471420958.9465|/home/alex/projects/headquarter/apps/api/tests/integration/test_config_folders_api.py:9227:1779473067454.4243|/home/alex/projects/headquarter/apps/api/tests/integration/test_config_profiles_api.py:16841:1779886811162.0073|/home/alex/projects/headquarter/apps/api/tests/integration/test_git_control.py:5257:1779478799198.6309|/home/alex/projects/headquarter/apps/api/tests/integration/test_models.py:3080:1779958621180.4607|/home/alex/projects/headquarter/apps/api/tests/integration/test_projects_api.py:8540:1779958621180.4607|/home/alex/projects/headquarter/apps/api/tests/integration/test_seed.py:864:1779471420972.4473|/home/alex/projects/headquarter/apps/api/tests/integration/test_ssh_keys_api.py:689:1779471420972.5269|/home/alex/projects/headquarter/apps/api/tests/integration/test_tool_configs_api_extended.py:9897:1779958621181.4607|/home/alex/projects/headquarter/apps/api/tests/integration/test_tool_types_api_extended.py:12371:1779958621181.4607|/home/alex/projects/headquarter/apps/api/tests/integration/test_tool_types_api.py:12510:1779556564012.5024|/home/alex/projects/headquarter/apps/api/tests/integration/test_users_api.py:6616:1779473987795.1477|/home/alex/projects/headquarter/apps/api/tests/system/__init__.py:0:1779109035822.815|/home/alex/projects/headquarter/apps/api/tests/unit/__init__.py:0:1779110037714.6304|/home/alex/projects/headquarter/apps/api/tests/unit/test_config_profile_resolver.py:15730:1779958621181.4607|/home/alex/projects/headquarter/apps/api/tests/unit/test_config.py:2316:1779110755300.477|/home/alex/projects/headquarter/apps/api/tests/unit/test_docker_build.py:5738:1779471360116.6558|/home/alex/projects/headquarter/apps/api/tests/unit/test_docker_service.py:1697:1779958603311.6707|/home/alex/projects/headquarter/apps/api/tests/unit/test_git_mount_resolution.py:4797:1779958621182.4607|/home/alex/projects/headquarter/apps/api/tests/unit/test_git_repository_clone_preflight.py:1109:1779474860172.3552|/home/alex/projects/headquarter/apps/api/tests/unit/test_git_repository_working_clones.py:2843:1779474860172.3552|/home/alex/projects/headquarter/apps/api/tests/unit/test_git_url_parser.py:5471:1779958621182.4607|/home/alex/projects/headquarter/apps/api/tests/unit/test_manifest_compiler.py:11095:1779962991834.0735|/home/alex/projects/headquarter/apps/api/tests/unit/test_migration_metadata.py:1177:1779110847713.4197|/home/alex/projects/headquarter/apps/api/tests/unit/test_permission_fixer.py:5348:1779962991842.0732|/home/alex/projects/headquarter/apps/api/tests/unit/test_readiness_probe.py:7321:1779958621190.4604|/home/alex/projects/headquarter/apps/api/tests/unit/test_session_branch_selection.py:6346:1779958621197.4604","fileSignatures":[["/home/alex/projects/headquarter/apps/api/alembic/env.py","1566:1779050260293.852"],["/home/alex/projects/headquarter/apps/api/alembic/versions/0001_initial_schema.py","4658:1779050260293.852"],["/home/alex/projects/headquarter/apps/api/alembic/versions/0002_refresh_tokens.py","2405:1779050260294.7954"],["/home/alex/projects/headquarter/apps/api/alembic/versions/0003_user_configs.py","1101:1779139057995.512"],["/home/alex/projects/headquarter/apps/api/alembic/versions/0004_tool_types.py","1575:1779139081351.2407"],["/home/alex/projects/headquarter/apps/api/alembic/versions/0005_ssh_keys_timestamps.py","1039:1779184269353.1443"],["/home/alex/projects/headquarter/apps/api/alembic/versions/0006_tool_instances.py","2716:1779215731764.582"],["/home/alex/projects/headquarter/apps/api/alembic/versions/0007_instance_container_name.py","715:1779265847432.003"],["/home/alex/projects/headquarter/apps/api/alembic/versions/0008_tool_type_category.py","911:1779267040781.6345"],["/home/alex/projects/headquarter/apps/api/alembic/versions/0009_tool_configs.py","2039:1779267064123.3723"],["/home/alex/projects/headquarter/apps/api/alembic/versions/0010_tool_type_default_port.py","689:1779277879364.0645"],["/home/alex/projects/headquarter/apps/api/alembic/versions/0011_tool_instance_tunnel_fields.py","894:1779279491357.6292"],["/home/alex/projects/headquarter/apps/api/alembic/versions/0012_default_port_req.py","1229:1779290612348.005"],["/home/alex/projects/headquarter/apps/api/alembic/versions/0013_add_probe_result.py","743:1779478921751.2427"],["/home/alex/projects/headquarter/apps/api/alembic/versions/0014_merge_heads.py","525:1779958621074.462"],["/home/alex/projects/headquarter/apps/api/alembic/versions/0015_single_interface.py","3832:1779958621081.462"],["/home/alex/projects/headquarter/apps/api/alembic/versions/20260527160017_add_pi_agent_tool_type.py","3794:1779958621081.462"],["/home/alex/projects/headquarter/apps/api/alembic/versions/2026_05_22_add_clone_mode.py","1312:1779485016565.7122"],["/home/alex/projects/headquarter/apps/api/alembic/versions/2026_05_23_remove_is_builtin.py","698:1779620544420.1614"],["/home/alex/projects/headquarter/apps/api/alembic/versions/2026_05_24_220141_add_startup_command.py","683:1779700843566.628"],["/home/alex/projects/headquarter/apps/api/alembic/versions/2026_05_24_add_config_profiles.py","4826:1779645589985.5532"],["/home/alex/projects/headquarter/apps/api/alembic/versions/2026_05_26_add_git_mounts.py","716:1779870048496.4265"],["/home/alex/projects/headquarter/apps/api/alembic/versions/2026_05_27_external_repos.py","1150:1779870986784.585"],["/home/alex/projects/headquarter/apps/api/alembic/versions/2026_05_28_add_tool_definition_manifests.py","13934:1779967994204.917"],["/home/alex/projects/headquarter/apps/api/alembic/versions/398082499c30_add_tool_config_fields.py","1576:1779467943887.104"],["/home/alex/projects/headquarter/apps/api/alembic/versions/6fc7bfcf199f_merge_remove_is_builtin_and_add_config_.py","455:1779958621081.462"],["/home/alex/projects/headquarter/apps/api/alembic/versions/8ed7dd80973d_create_config_folders_table.py","1770:1779467958721.936"],["/home/alex/projects/headquarter/apps/api/alembic/versions/af8512103d67_add_tool_type_fields.py","1432:1779467930354.6824"],["/home/alex/projects/headquarter/apps/api/alembic/versions/f3d2dc90ba3a_merge_single_interface_and_clone_mode.py","559:1779958621094.4617"],["/home/alex/projects/headquarter/apps/api/src/__init__.py","31:1779050260294.7954"],["/home/alex/projects/headquarter/apps/api/src/api/__init__.py","139:1779050826659.6775"],["/home/alex/projects/headquarter/apps/api/src/api/auth.py","7944:1779912973110.818"],["/home/alex/projects/headquarter/apps/api/src/api/config_folders.py","12351:1779710572785.8096"],["/home/alex/projects/headquarter/apps/api/src/api/config_profiles.py","27916:1779958621095.4617"],["/home/alex/projects/headquarter/apps/api/src/api/dashboard.py","2121:1779218866429.8337"],["/home/alex/projects/headquarter/apps/api/src/api/git_repositories.py","46638:1779958621112.4614"],["/home/alex/projects/headquarter/apps/api/src/api/health.py","4554:1779958621112.4614"],["/home/alex/projects/headquarter/apps/api/src/api/instance_proxy.py","4233:1779958621116.4614"],["/home/alex/projects/headquarter/apps/api/src/api/projects.py","6672:1779958621116.4614"],["/home/alex/projects/headquarter/apps/api/src/api/shared_validators.py","2682:1779958621132.4612"],["/home/alex/projects/headquarter/apps/api/src/api/ssh_keys.py","7517:1779958621133.4612"],["/home/alex/projects/headquarter/apps/api/src/api/terminal.py","12567:1779958621133.4612"],["/home/alex/projects/headquarter/apps/api/src/api/tool_configs.py","11248:1779958621152.461"],["/home/alex/projects/headquarter/apps/api/src/api/tool_definitions.py","13721:1779962991824.0735"],["/home/alex/projects/headquarter/apps/api/src/api/tool_instances.py","81390:1779962991812.0737"],["/home/alex/projects/headquarter/apps/api/src/api/tool_types.py","18213:1779958621153.461"],["/home/alex/projects/headquarter/apps/api/src/api/tool_types_validation.py","2608:1779710051058.87"],["/home/alex/projects/headquarter/apps/api/src/api/user_config.py","3431:1779958621153.461"],["/home/alex/projects/headquarter/apps/api/src/api/users.py","4291:1779708729186.244"],["/home/alex/projects/headquarter/apps/api/src/auth/__init__.py","308:1779137370597.2402"],["/home/alex/projects/headquarter/apps/api/src/auth/cookies.py","287:1779139942809.316"],["/home/alex/projects/headquarter/apps/api/src/auth/dependencies.py","2891:1779958621153.461"],["/home/alex/projects/headquarter/apps/api/src/auth/oidc.py","1650:1779137182579.4893"],["/home/alex/projects/headquarter/apps/api/src/auth/session.py","2228:1779645590016.553"],["/home/alex/projects/headquarter/apps/api/src/config.py","4705:1779286905138.4783"],["/home/alex/projects/headquarter/apps/api/src/database.py","3904:1779138928838.0117"],["/home/alex/projects/headquarter/apps/api/src/logging_config.py","2832:1779135759825.8926"],["/home/alex/projects/headquarter/apps/api/src/main.py","4791:1779962991745.0745"],["/home/alex/projects/headquarter/apps/api/src/models/__init__.py","770:1779962991815.0735"],["/home/alex/projects/headquarter/apps/api/src/models/base.py","640:1779109950568.2888"],["/home/alex/projects/headquarter/apps/api/src/models/config_folder.py","1199:1779468006545.395"],["/home/alex/projects/headquarter/apps/api/src/models/config_profile.py","3157:1779885324307.303"],["/home/alex/projects/headquarter/apps/api/src/models/git_repository.py","1415:1779870334034.114"],["/home/alex/projects/headquarter/apps/api/src/models/project.py","1241:1779109950568.697"],["/home/alex/projects/headquarter/apps/api/src/models/ssh_key.py","993:1779184246096.4092"],["/home/alex/projects/headquarter/apps/api/src/models/tool_config.py","1814:1779471154363.973"],["/home/alex/projects/headquarter/apps/api/src/models/tool_definition_manifest.py","2449:1779962991760.0742"],["/home/alex/projects/headquarter/apps/api/src/models/tool_instance.py","3057:1779962991776.074"],["/home/alex/projects/headquarter/apps/api/src/models/tool_type.py","2196:1779962991768.0742"],["/home/alex/projects/headquarter/apps/api/src/models/user.py","981:1779137408181.7927"],["/home/alex/projects/headquarter/apps/api/src/models/user_config.py","680:1779109990811.1602"],["/home/alex/projects/headquarter/apps/api/src/scripts/__init__.py","43:1779050260295.4287"],["/home/alex/projects/headquarter/apps/api/src/scripts/seed.py","1099:1779050260295.7207"],["/home/alex/projects/headquarter/apps/api/src/services/clone.py","2697:1779912904816.8372"],["/home/alex/projects/headquarter/apps/api/src/services/config_profile_resolver.py","15234:1779874299307.0806"],["/home/alex/projects/headquarter/apps/api/src/services/docker.py","16097:1779958667213.9204"],["/home/alex/projects/headquarter/apps/api/src/services/docker_build.py","2454:1779958621154.461"],["/home/alex/projects/headquarter/apps/api/src/services/manifest_compiler.py","13851:1779962991788.074"],["/home/alex/projects/headquarter/apps/api/src/services/permission_fixer.py","4631:1779962991795.0737"],["/home/alex/projects/headquarter/apps/api/src/services/readiness_probe.py","2120:1779468682156.7576"],["/home/alex/projects/headquarter/apps/api/src/services/ssh_keys.py","2050:1779481962606.4976"],["/home/alex/projects/headquarter/apps/api/src/services/terminal_manager.py","5804:1779958621154.461"],["/home/alex/projects/headquarter/apps/api/src/services/terminal_session.py","8778:1779912904787.3071"],["/home/alex/projects/headquarter/apps/api/src/utils/git_control.py","8284:1779958621174.4607"],["/home/alex/projects/headquarter/apps/api/src/utils/git_files.py","13552:1779618531450.968"],["/home/alex/projects/headquarter/apps/api/src/utils/git_history.py","11790:1779189553538.5813"],["/home/alex/projects/headquarter/apps/api/src/utils/git_url_parser.py","6437:1779185863539.9849"],["/home/alex/projects/headquarter/apps/api/tests/conftest.py","7687:1779958621174.4607"],["/home/alex/projects/headquarter/apps/api/tests/integration/__init__.py","0:1779471420954.9705"],["/home/alex/projects/headquarter/apps/api/tests/integration/test_auth_api.py","3813:1779471420958.8003"],["/home/alex/projects/headquarter/apps/api/tests/integration/test_auth_services.py","2447:1779471420958.9465"],["/home/alex/projects/headquarter/apps/api/tests/integration/test_config_folders_api.py","9227:1779473067454.4243"],["/home/alex/projects/headquarter/apps/api/tests/integration/test_config_profiles_api.py","16841:1779886811162.0073"],["/home/alex/projects/headquarter/apps/api/tests/integration/test_git_control.py","5257:1779478799198.6309"],["/home/alex/projects/headquarter/apps/api/tests/integration/test_models.py","3080:1779958621180.4607"],["/home/alex/projects/headquarter/apps/api/tests/integration/test_projects_api.py","8540:1779958621180.4607"],["/home/alex/projects/headquarter/apps/api/tests/integration/test_seed.py","864:1779471420972.4473"],["/home/alex/projects/headquarter/apps/api/tests/integration/test_ssh_keys_api.py","689:1779471420972.5269"],["/home/alex/projects/headquarter/apps/api/tests/integration/test_tool_configs_api_extended.py","9897:1779958621181.4607"],["/home/alex/projects/headquarter/apps/api/tests/integration/test_tool_types_api.py","12510:1779556564012.5024"],["/home/alex/projects/headquarter/apps/api/tests/integration/test_tool_types_api_extended.py","12371:1779958621181.4607"],["/home/alex/projects/headquarter/apps/api/tests/integration/test_users_api.py","6616:1779473987795.1477"],["/home/alex/projects/headquarter/apps/api/tests/system/__init__.py","0:1779109035822.815"],["/home/alex/projects/headquarter/apps/api/tests/unit/__init__.py","0:1779110037714.6304"],["/home/alex/projects/headquarter/apps/api/tests/unit/test_config.py","2316:1779110755300.477"],["/home/alex/projects/headquarter/apps/api/tests/unit/test_config_profile_resolver.py","15730:1779958621181.4607"],["/home/alex/projects/headquarter/apps/api/tests/unit/test_docker_build.py","5738:1779471360116.6558"],["/home/alex/projects/headquarter/apps/api/tests/unit/test_docker_service.py","1697:1779958603311.6707"],["/home/alex/projects/headquarter/apps/api/tests/unit/test_git_mount_resolution.py","4797:1779958621182.4607"],["/home/alex/projects/headquarter/apps/api/tests/unit/test_git_repository_clone_preflight.py","1109:1779474860172.3552"],["/home/alex/projects/headquarter/apps/api/tests/unit/test_git_repository_working_clones.py","2843:1779474860172.3552"],["/home/alex/projects/headquarter/apps/api/tests/unit/test_git_url_parser.py","5471:1779958621182.4607"],["/home/alex/projects/headquarter/apps/api/tests/unit/test_manifest_compiler.py","11095:1779962991834.0735"],["/home/alex/projects/headquarter/apps/api/tests/unit/test_migration_metadata.py","1177:1779110847713.4197"],["/home/alex/projects/headquarter/apps/api/tests/unit/test_permission_fixer.py","5348:1779962991842.0732"],["/home/alex/projects/headquarter/apps/api/tests/unit/test_readiness_probe.py","7321:1779958621190.4604"],["/home/alex/projects/headquarter/apps/api/tests/unit/test_session_branch_selection.py","6346:1779958621197.4604"]],"nodes":[["file:/home/alex/projects/headquarter/apps/api/alembic/env.py",{"id":"file:/home/alex/projects/headquarter/apps/api/alembic/env.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/alembic/env.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/alembic/versions/0001_initial_schema.py",{"id":"file:/home/alex/projects/headquarter/apps/api/alembic/versions/0001_initial_schema.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/alembic/versions/0001_initial_schema.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/alembic/versions/0002_refresh_tokens.py",{"id":"file:/home/alex/projects/headquarter/apps/api/alembic/versions/0002_refresh_tokens.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/alembic/versions/0002_refresh_tokens.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization","auth","user-input"]}}],["file:/home/alex/projects/headquarter/apps/api/alembic/versions/0003_user_configs.py",{"id":"file:/home/alex/projects/headquarter/apps/api/alembic/versions/0003_user_configs.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/alembic/versions/0003_user_configs.py","metadata":{"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/alembic/versions/0004_tool_types.py",{"id":"file:/home/alex/projects/headquarter/apps/api/alembic/versions/0004_tool_types.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/alembic/versions/0004_tool_types.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/alembic/versions/0005_ssh_keys_timestamps.py",{"id":"file:/home/alex/projects/headquarter/apps/api/alembic/versions/0005_ssh_keys_timestamps.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/alembic/versions/0005_ssh_keys_timestamps.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/alembic/versions/0006_tool_instances.py",{"id":"file:/home/alex/projects/headquarter/apps/api/alembic/versions/0006_tool_instances.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/alembic/versions/0006_tool_instances.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/alembic/versions/0007_instance_container_name.py",{"id":"file:/home/alex/projects/headquarter/apps/api/alembic/versions/0007_instance_container_name.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/alembic/versions/0007_instance_container_name.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/alembic/versions/0008_tool_type_category.py",{"id":"file:/home/alex/projects/headquarter/apps/api/alembic/versions/0008_tool_type_category.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/alembic/versions/0008_tool_type_category.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/alembic/versions/0009_tool_configs.py",{"id":"file:/home/alex/projects/headquarter/apps/api/alembic/versions/0009_tool_configs.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/alembic/versions/0009_tool_configs.py","metadata":{"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/alembic/versions/0010_tool_type_default_port.py",{"id":"file:/home/alex/projects/headquarter/apps/api/alembic/versions/0010_tool_type_default_port.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/alembic/versions/0010_tool_type_default_port.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/alembic/versions/0011_tool_instance_tunnel_fields.py",{"id":"file:/home/alex/projects/headquarter/apps/api/alembic/versions/0011_tool_instance_tunnel_fields.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/alembic/versions/0011_tool_instance_tunnel_fields.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/alembic/versions/0012_default_port_req.py",{"id":"file:/home/alex/projects/headquarter/apps/api/alembic/versions/0012_default_port_req.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/alembic/versions/0012_default_port_req.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/alembic/versions/0013_add_probe_result.py",{"id":"file:/home/alex/projects/headquarter/apps/api/alembic/versions/0013_add_probe_result.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/alembic/versions/0013_add_probe_result.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/alembic/versions/0014_merge_heads.py",{"id":"file:/home/alex/projects/headquarter/apps/api/alembic/versions/0014_merge_heads.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/alembic/versions/0014_merge_heads.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/alembic/versions/0015_single_interface.py",{"id":"file:/home/alex/projects/headquarter/apps/api/alembic/versions/0015_single_interface.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/alembic/versions/0015_single_interface.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/alembic/versions/20260527160017_add_pi_agent_tool_type.py",{"id":"file:/home/alex/projects/headquarter/apps/api/alembic/versions/20260527160017_add_pi_agent_tool_type.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/alembic/versions/20260527160017_add_pi_agent_tool_type.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/alembic/versions/2026_05_22_add_clone_mode.py",{"id":"file:/home/alex/projects/headquarter/apps/api/alembic/versions/2026_05_22_add_clone_mode.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/alembic/versions/2026_05_22_add_clone_mode.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/alembic/versions/2026_05_23_remove_is_builtin.py",{"id":"file:/home/alex/projects/headquarter/apps/api/alembic/versions/2026_05_23_remove_is_builtin.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/alembic/versions/2026_05_23_remove_is_builtin.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/alembic/versions/2026_05_24_220141_add_startup_command.py",{"id":"file:/home/alex/projects/headquarter/apps/api/alembic/versions/2026_05_24_220141_add_startup_command.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/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:/home/alex/projects/headquarter/apps/api/alembic/versions/2026_05_24_add_config_profiles.py",{"id":"file:/home/alex/projects/headquarter/apps/api/alembic/versions/2026_05_24_add_config_profiles.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/alembic/versions/2026_05_24_add_config_profiles.py","metadata":{"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/alembic/versions/2026_05_26_add_git_mounts.py",{"id":"file:/home/alex/projects/headquarter/apps/api/alembic/versions/2026_05_26_add_git_mounts.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/alembic/versions/2026_05_26_add_git_mounts.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/alembic/versions/2026_05_27_external_repos.py",{"id":"file:/home/alex/projects/headquarter/apps/api/alembic/versions/2026_05_27_external_repos.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/alembic/versions/2026_05_27_external_repos.py","metadata":{"featureKind":"library","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/alembic/versions/398082499c30_add_tool_config_fields.py",{"id":"file:/home/alex/projects/headquarter/apps/api/alembic/versions/398082499c30_add_tool_config_fields.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/alembic/versions/398082499c30_add_tool_config_fields.py","metadata":{"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/alembic/versions/6fc7bfcf199f_merge_remove_is_builtin_and_add_config_.py",{"id":"file:/home/alex/projects/headquarter/apps/api/alembic/versions/6fc7bfcf199f_merge_remove_is_builtin_and_add_config_.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/alembic/versions/6fc7bfcf199f_merge_remove_is_builtin_and_add_config_.py","metadata":{"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/alembic/versions/8ed7dd80973d_create_config_folders_table.py",{"id":"file:/home/alex/projects/headquarter/apps/api/alembic/versions/8ed7dd80973d_create_config_folders_table.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/alembic/versions/8ed7dd80973d_create_config_folders_table.py","metadata":{"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/alembic/versions/af8512103d67_add_tool_type_fields.py",{"id":"file:/home/alex/projects/headquarter/apps/api/alembic/versions/af8512103d67_add_tool_type_fields.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/alembic/versions/af8512103d67_add_tool_type_fields.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/alembic/versions/f3d2dc90ba3a_merge_single_interface_and_clone_mode.py",{"id":"file:/home/alex/projects/headquarter/apps/api/alembic/versions/f3d2dc90ba3a_merge_single_interface_and_clone_mode.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/alembic/versions/f3d2dc90ba3a_merge_single_interface_and_clone_mode.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/src/__init__.py",{"id":"file:/home/alex/projects/headquarter/apps/api/src/__init__.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/src/__init__.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/src/api/__init__.py",{"id":"file:/home/alex/projects/headquarter/apps/api/src/api/__init__.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/src/api/__init__.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/src/api/auth.py",{"id":"file:/home/alex/projects/headquarter/apps/api/src/api/auth.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/src/api/auth.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization","auth","user-input"]}}],["file:/home/alex/projects/headquarter/apps/api/src/api/config_folders.py",{"id":"file:/home/alex/projects/headquarter/apps/api/src/api/config_folders.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/src/api/config_folders.py","metadata":{"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/src/api/config_profiles.py",{"id":"file:/home/alex/projects/headquarter/apps/api/src/api/config_profiles.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/src/api/config_profiles.py","metadata":{"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/src/api/dashboard.py",{"id":"file:/home/alex/projects/headquarter/apps/api/src/api/dashboard.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/src/api/dashboard.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/src/api/git_repositories.py",{"id":"file:/home/alex/projects/headquarter/apps/api/src/api/git_repositories.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/src/api/git_repositories.py","metadata":{"featureKind":"library","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/src/api/health.py",{"id":"file:/home/alex/projects/headquarter/apps/api/src/api/health.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/src/api/health.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/src/api/instance_proxy.py",{"id":"file:/home/alex/projects/headquarter/apps/api/src/api/instance_proxy.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/src/api/instance_proxy.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/src/api/projects.py",{"id":"file:/home/alex/projects/headquarter/apps/api/src/api/projects.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/src/api/projects.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/src/api/shared_validators.py",{"id":"file:/home/alex/projects/headquarter/apps/api/src/api/shared_validators.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/src/api/shared_validators.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/src/api/ssh_keys.py",{"id":"file:/home/alex/projects/headquarter/apps/api/src/api/ssh_keys.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/src/api/ssh_keys.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/src/api/terminal.py",{"id":"file:/home/alex/projects/headquarter/apps/api/src/api/terminal.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/src/api/terminal.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/src/api/tool_configs.py",{"id":"file:/home/alex/projects/headquarter/apps/api/src/api/tool_configs.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/src/api/tool_configs.py","metadata":{"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/src/api/tool_definitions.py",{"id":"file:/home/alex/projects/headquarter/apps/api/src/api/tool_definitions.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/src/api/tool_definitions.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/src/api/tool_instances.py",{"id":"file:/home/alex/projects/headquarter/apps/api/src/api/tool_instances.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/src/api/tool_instances.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/src/api/tool_types.py",{"id":"file:/home/alex/projects/headquarter/apps/api/src/api/tool_types.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/src/api/tool_types.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/src/api/tool_types_validation.py",{"id":"file:/home/alex/projects/headquarter/apps/api/src/api/tool_types_validation.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/src/api/tool_types_validation.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/src/api/user_config.py",{"id":"file:/home/alex/projects/headquarter/apps/api/src/api/user_config.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/src/api/user_config.py","metadata":{"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/src/api/users.py",{"id":"file:/home/alex/projects/headquarter/apps/api/src/api/users.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/src/api/users.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/src/auth/__init__.py",{"id":"file:/home/alex/projects/headquarter/apps/api/src/auth/__init__.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/src/auth/__init__.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization","auth","user-input"]}}],["file:/home/alex/projects/headquarter/apps/api/src/auth/cookies.py",{"id":"file:/home/alex/projects/headquarter/apps/api/src/auth/cookies.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/src/auth/cookies.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization","auth","user-input"]}}],["file:/home/alex/projects/headquarter/apps/api/src/auth/dependencies.py",{"id":"file:/home/alex/projects/headquarter/apps/api/src/auth/dependencies.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/src/auth/dependencies.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization","auth","user-input"]}}],["file:/home/alex/projects/headquarter/apps/api/src/auth/oidc.py",{"id":"file:/home/alex/projects/headquarter/apps/api/src/auth/oidc.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/src/auth/oidc.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization","auth","user-input"]}}],["file:/home/alex/projects/headquarter/apps/api/src/auth/session.py",{"id":"file:/home/alex/projects/headquarter/apps/api/src/auth/session.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/src/auth/session.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization","auth","user-input"]}}],["file:/home/alex/projects/headquarter/apps/api/src/config.py",{"id":"file:/home/alex/projects/headquarter/apps/api/src/config.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/src/config.py","metadata":{"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/src/database.py",{"id":"file:/home/alex/projects/headquarter/apps/api/src/database.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/src/database.py","metadata":{"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/src/logging_config.py",{"id":"file:/home/alex/projects/headquarter/apps/api/src/logging_config.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/src/logging_config.py","metadata":{"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/src/main.py",{"id":"file:/home/alex/projects/headquarter/apps/api/src/main.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/src/main.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/src/models/__init__.py",{"id":"file:/home/alex/projects/headquarter/apps/api/src/models/__init__.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/src/models/__init__.py","metadata":{"featureKind":"library","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/src/models/base.py",{"id":"file:/home/alex/projects/headquarter/apps/api/src/models/base.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/src/models/base.py","metadata":{"featureKind":"library","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/src/models/config_folder.py",{"id":"file:/home/alex/projects/headquarter/apps/api/src/models/config_folder.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/src/models/config_folder.py","metadata":{"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/src/models/config_profile.py",{"id":"file:/home/alex/projects/headquarter/apps/api/src/models/config_profile.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/src/models/config_profile.py","metadata":{"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/src/models/git_repository.py",{"id":"file:/home/alex/projects/headquarter/apps/api/src/models/git_repository.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/src/models/git_repository.py","metadata":{"featureKind":"library","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/src/models/project.py",{"id":"file:/home/alex/projects/headquarter/apps/api/src/models/project.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/src/models/project.py","metadata":{"featureKind":"library","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/src/models/ssh_key.py",{"id":"file:/home/alex/projects/headquarter/apps/api/src/models/ssh_key.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/src/models/ssh_key.py","metadata":{"featureKind":"library","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/src/models/tool_config.py",{"id":"file:/home/alex/projects/headquarter/apps/api/src/models/tool_config.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/src/models/tool_config.py","metadata":{"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/src/models/tool_definition_manifest.py",{"id":"file:/home/alex/projects/headquarter/apps/api/src/models/tool_definition_manifest.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/src/models/tool_definition_manifest.py","metadata":{"featureKind":"library","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/src/models/tool_instance.py",{"id":"file:/home/alex/projects/headquarter/apps/api/src/models/tool_instance.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/src/models/tool_instance.py","metadata":{"featureKind":"library","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/src/models/tool_type.py",{"id":"file:/home/alex/projects/headquarter/apps/api/src/models/tool_type.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/src/models/tool_type.py","metadata":{"featureKind":"library","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/src/models/user.py",{"id":"file:/home/alex/projects/headquarter/apps/api/src/models/user.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/src/models/user.py","metadata":{"featureKind":"library","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/src/models/user_config.py",{"id":"file:/home/alex/projects/headquarter/apps/api/src/models/user_config.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/src/models/user_config.py","metadata":{"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/src/scripts/__init__.py",{"id":"file:/home/alex/projects/headquarter/apps/api/src/scripts/__init__.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/src/scripts/__init__.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/src/scripts/seed.py",{"id":"file:/home/alex/projects/headquarter/apps/api/src/scripts/seed.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/src/scripts/seed.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/src/services/clone.py",{"id":"file:/home/alex/projects/headquarter/apps/api/src/services/clone.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/src/services/clone.py","metadata":{"featureKind":"service","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/src/services/config_profile_resolver.py",{"id":"file:/home/alex/projects/headquarter/apps/api/src/services/config_profile_resolver.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/src/services/config_profile_resolver.py","metadata":{"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/src/services/docker.py",{"id":"file:/home/alex/projects/headquarter/apps/api/src/services/docker.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/src/services/docker.py","metadata":{"featureKind":"service","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/src/services/docker_build.py",{"id":"file:/home/alex/projects/headquarter/apps/api/src/services/docker_build.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/src/services/docker_build.py","metadata":{"featureKind":"service","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/src/services/manifest_compiler.py",{"id":"file:/home/alex/projects/headquarter/apps/api/src/services/manifest_compiler.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/src/services/manifest_compiler.py","metadata":{"featureKind":"service","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/src/services/permission_fixer.py",{"id":"file:/home/alex/projects/headquarter/apps/api/src/services/permission_fixer.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/src/services/permission_fixer.py","metadata":{"featureKind":"service","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/src/services/readiness_probe.py",{"id":"file:/home/alex/projects/headquarter/apps/api/src/services/readiness_probe.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/src/services/readiness_probe.py","metadata":{"featureKind":"service","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/src/services/ssh_keys.py",{"id":"file:/home/alex/projects/headquarter/apps/api/src/services/ssh_keys.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/src/services/ssh_keys.py","metadata":{"featureKind":"service","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/src/services/terminal_manager.py",{"id":"file:/home/alex/projects/headquarter/apps/api/src/services/terminal_manager.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/src/services/terminal_manager.py","metadata":{"featureKind":"service","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/src/services/terminal_session.py",{"id":"file:/home/alex/projects/headquarter/apps/api/src/services/terminal_session.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/src/services/terminal_session.py","metadata":{"featureKind":"service","trustBoundaries":["network","external-api","serialization","auth","user-input"]}}],["file:/home/alex/projects/headquarter/apps/api/src/utils/git_control.py",{"id":"file:/home/alex/projects/headquarter/apps/api/src/utils/git_control.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/src/utils/git_control.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/src/utils/git_files.py",{"id":"file:/home/alex/projects/headquarter/apps/api/src/utils/git_files.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/src/utils/git_files.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/src/utils/git_history.py",{"id":"file:/home/alex/projects/headquarter/apps/api/src/utils/git_history.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/src/utils/git_history.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/src/utils/git_url_parser.py",{"id":"file:/home/alex/projects/headquarter/apps/api/src/utils/git_url_parser.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/src/utils/git_url_parser.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/tests/conftest.py",{"id":"file:/home/alex/projects/headquarter/apps/api/tests/conftest.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/tests/conftest.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/tests/integration/__init__.py",{"id":"file:/home/alex/projects/headquarter/apps/api/tests/integration/__init__.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/tests/integration/__init__.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/tests/integration/test_auth_api.py",{"id":"file:/home/alex/projects/headquarter/apps/api/tests/integration/test_auth_api.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/tests/integration/test_auth_api.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization","auth","user-input"]}}],["file:/home/alex/projects/headquarter/apps/api/tests/integration/test_auth_services.py",{"id":"file:/home/alex/projects/headquarter/apps/api/tests/integration/test_auth_services.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/tests/integration/test_auth_services.py","metadata":{"featureKind":"service","trustBoundaries":["network","external-api","serialization","auth","user-input"]}}],["file:/home/alex/projects/headquarter/apps/api/tests/integration/test_config_folders_api.py",{"id":"file:/home/alex/projects/headquarter/apps/api/tests/integration/test_config_folders_api.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/tests/integration/test_config_folders_api.py","metadata":{"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/tests/integration/test_config_profiles_api.py",{"id":"file:/home/alex/projects/headquarter/apps/api/tests/integration/test_config_profiles_api.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/tests/integration/test_config_profiles_api.py","metadata":{"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/tests/integration/test_git_control.py",{"id":"file:/home/alex/projects/headquarter/apps/api/tests/integration/test_git_control.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/tests/integration/test_git_control.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/tests/integration/test_models.py",{"id":"file:/home/alex/projects/headquarter/apps/api/tests/integration/test_models.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/tests/integration/test_models.py","metadata":{"featureKind":"library","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/tests/integration/test_projects_api.py",{"id":"file:/home/alex/projects/headquarter/apps/api/tests/integration/test_projects_api.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/tests/integration/test_projects_api.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/tests/integration/test_seed.py",{"id":"file:/home/alex/projects/headquarter/apps/api/tests/integration/test_seed.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/tests/integration/test_seed.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/tests/integration/test_ssh_keys_api.py",{"id":"file:/home/alex/projects/headquarter/apps/api/tests/integration/test_ssh_keys_api.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/tests/integration/test_ssh_keys_api.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/tests/integration/test_tool_configs_api_extended.py",{"id":"file:/home/alex/projects/headquarter/apps/api/tests/integration/test_tool_configs_api_extended.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/tests/integration/test_tool_configs_api_extended.py","metadata":{"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/tests/integration/test_tool_types_api.py",{"id":"file:/home/alex/projects/headquarter/apps/api/tests/integration/test_tool_types_api.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/tests/integration/test_tool_types_api.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/tests/integration/test_tool_types_api_extended.py",{"id":"file:/home/alex/projects/headquarter/apps/api/tests/integration/test_tool_types_api_extended.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/tests/integration/test_tool_types_api_extended.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/tests/integration/test_users_api.py",{"id":"file:/home/alex/projects/headquarter/apps/api/tests/integration/test_users_api.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/tests/integration/test_users_api.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/tests/system/__init__.py",{"id":"file:/home/alex/projects/headquarter/apps/api/tests/system/__init__.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/tests/system/__init__.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/tests/unit/__init__.py",{"id":"file:/home/alex/projects/headquarter/apps/api/tests/unit/__init__.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/tests/unit/__init__.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/tests/unit/test_config.py",{"id":"file:/home/alex/projects/headquarter/apps/api/tests/unit/test_config.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/tests/unit/test_config.py","metadata":{"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/tests/unit/test_config_profile_resolver.py",{"id":"file:/home/alex/projects/headquarter/apps/api/tests/unit/test_config_profile_resolver.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/tests/unit/test_config_profile_resolver.py","metadata":{"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/tests/unit/test_docker_build.py",{"id":"file:/home/alex/projects/headquarter/apps/api/tests/unit/test_docker_build.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/tests/unit/test_docker_build.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/tests/unit/test_docker_service.py",{"id":"file:/home/alex/projects/headquarter/apps/api/tests/unit/test_docker_service.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/tests/unit/test_docker_service.py","metadata":{"featureKind":"service","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/tests/unit/test_git_mount_resolution.py",{"id":"file:/home/alex/projects/headquarter/apps/api/tests/unit/test_git_mount_resolution.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/tests/unit/test_git_mount_resolution.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/tests/unit/test_git_repository_clone_preflight.py",{"id":"file:/home/alex/projects/headquarter/apps/api/tests/unit/test_git_repository_clone_preflight.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/tests/unit/test_git_repository_clone_preflight.py","metadata":{"featureKind":"library","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/tests/unit/test_git_repository_working_clones.py",{"id":"file:/home/alex/projects/headquarter/apps/api/tests/unit/test_git_repository_working_clones.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/tests/unit/test_git_repository_working_clones.py","metadata":{"featureKind":"library","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/tests/unit/test_git_url_parser.py",{"id":"file:/home/alex/projects/headquarter/apps/api/tests/unit/test_git_url_parser.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/tests/unit/test_git_url_parser.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/tests/unit/test_manifest_compiler.py",{"id":"file:/home/alex/projects/headquarter/apps/api/tests/unit/test_manifest_compiler.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/tests/unit/test_manifest_compiler.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/tests/unit/test_migration_metadata.py",{"id":"file:/home/alex/projects/headquarter/apps/api/tests/unit/test_migration_metadata.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/tests/unit/test_migration_metadata.py","metadata":{"featureKind":"library","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/tests/unit/test_permission_fixer.py",{"id":"file:/home/alex/projects/headquarter/apps/api/tests/unit/test_permission_fixer.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/tests/unit/test_permission_fixer.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/tests/unit/test_readiness_probe.py",{"id":"file:/home/alex/projects/headquarter/apps/api/tests/unit/test_readiness_probe.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/tests/unit/test_readiness_probe.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/api/tests/unit/test_session_branch_selection.py",{"id":"file:/home/alex/projects/headquarter/apps/api/tests/unit/test_session_branch_selection.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/tests/unit/test_session_branch_selection.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization","auth","user-input"]}}],["file:/home/alex/projects/headquarter/apps/api/alembic/versions/2026_05_28_add_tool_definition_manifests.py",{"id":"file:/home/alex/projects/headquarter/apps/api/alembic/versions/2026_05_28_add_tool_definition_manifests.py","kind":"file","language":"python","filePath":"/home/alex/projects/headquarter/apps/api/alembic/versions/2026_05_28_add_tool_definition_manifests.py","metadata":{"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}]],"edges":[]} \ No newline at end of file diff --git a/apps/api/alembic/versions/2026_05_28_add_tool_definition_manifests.py b/apps/api/alembic/versions/2026_05_28_add_tool_definition_manifests.py new file mode 100644 index 0000000..bdb5884 --- /dev/null +++ b/apps/api/alembic/versions/2026_05_28_add_tool_definition_manifests.py @@ -0,0 +1,375 @@ +"""add tool definition manifests + +Revision ID: 2026_05_28_add_tool_definition_manifests +Revises: 20260527_160017_add_pi_agent +Create Date: 2026-05-28T11:00:00 + +""" + +import json +import uuid +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision: str = "2026_05_28_add_tool_definition_manifests" +down_revision: Union[str, None] = "20260527_160017_add_pi_agent" +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + +BASE_UBUNTU_ID = uuid.UUID("a1b2c3d4-e5f6-7890-abcd-ef1234567890") +PI_AGENT_MANIFEST_ID = uuid.UUID("d07b8376-2151-4119-8c1d-27f792aae9a3") + + +def upgrade() -> None: + conn = op.get_bind() + + # ── Create tool_definition_manifests table ─────────────────────── + op.create_table( + "tool_definition_manifests", + sa.Column("id", sa.UUID(), nullable=False), + sa.Column("name", sa.String(64), nullable=False), + sa.Column("display_name", sa.String(128), nullable=False), + sa.Column("description", sa.Text(), nullable=True), + sa.Column("category", sa.String(64), nullable=True), + sa.Column("interface_type", sa.String(16), nullable=False), + sa.Column("base_image", sa.String(256), nullable=True), + sa.Column("base_definition_id", sa.UUID(), nullable=True), + sa.Column( + "base_version", sa.String(32), nullable=False, server_default="latest" + ), + sa.Column("manifest", sa.JSON(), nullable=False), + sa.Column("dockerfile_cache", sa.Text(), nullable=True), + sa.Column("compose_cache", sa.Text(), nullable=True), + sa.Column("version", sa.String(32), nullable=False, server_default="v1"), + sa.Column("is_base", sa.Boolean(), nullable=False, server_default="false"), + sa.Column("created_by_id", sa.UUID(), nullable=True), + sa.Column( + "created_at", sa.TIMESTAMP(timezone=True), server_default=sa.func.now() + ), + sa.Column( + "updated_at", sa.TIMESTAMP(timezone=True), server_default=sa.func.now() + ), + sa.PrimaryKeyConstraint("id"), + sa.UniqueConstraint("name"), + sa.ForeignKeyConstraint( + ["base_definition_id"], ["tool_definition_manifests.id"] + ), + sa.ForeignKeyConstraint(["created_by_id"], ["users.id"]), + sa.CheckConstraint( + "(base_image IS NOT NULL) OR (base_definition_id IS NOT NULL)", + name="ck_tool_definition_manifests_base_required", + ), + ) + + # ── Add columns to tool_types ──────────────────────────────────── + # Check if manifest_id exists before adding + conn = op.get_bind() + result = conn.execute( + sa.text(""" + SELECT column_name FROM information_schema.columns + WHERE table_name = 'tool_types' AND column_name = 'manifest_id' + """) + ) + if not result.fetchone(): + op.add_column("tool_types", sa.Column("manifest_id", sa.UUID(), nullable=True)) + op.create_foreign_key( + "fk_tool_types_manifest_id", + "tool_types", + "tool_definition_manifests", + ["manifest_id"], + ["id"], + ) + + # Update definition_type to allow 'legacy' and 'manifest' + result = conn.execute( + sa.text(""" + SELECT constraint_name FROM information_schema.check_constraints + WHERE constraint_name = 'chk_definition_type' + """) + ) + if result.fetchone(): + op.drop_constraint("chk_definition_type", "tool_types", type_="check") + + op.execute("ALTER TABLE tool_types ALTER COLUMN definition_type TYPE VARCHAR(16)") + op.execute("ALTER TABLE tool_types ALTER COLUMN definition_type SET DEFAULT 'legacy'") + + # ── Add columns to tool_instances ──────────────────────────────── + result = conn.execute( + sa.text(""" + SELECT column_name FROM information_schema.columns + WHERE table_name = 'tool_instances' AND column_name = 'manifest_compiled_at' + """) + ) + if not result.fetchone(): + op.add_column( + "tool_instances", + sa.Column("manifest_compiled_at", sa.TIMESTAMP(timezone=True), nullable=True), + ) + + result = conn.execute( + sa.text(""" + SELECT column_name FROM information_schema.columns + WHERE table_name = 'tool_instances' AND column_name = 'image_tag' + """) + ) + if not result.fetchone(): + op.add_column( + "tool_instances", + sa.Column("image_tag", sa.String(256), nullable=True), + ) + + # ── Data migration: create base definition + pi-agent manifest ─── + conn.execute( + sa.text( + """ + INSERT INTO tool_definition_manifests + (id, name, display_name, description, interface_type, base_image, + manifest, is_base, version, created_at, updated_at) + VALUES + (:base_id, 'ubuntu-24.04-dev', 'Ubuntu 24.04 Dev Base', + 'Base development environment with build tools', 'terminal', + 'ubuntu:24.04', :base_manifest, true, 'v1', now(), now()) + """ + ), + { + "base_id": BASE_UBUNTU_ID, + "base_manifest": json.dumps( + { + "name": "ubuntu-24.04-dev", + "display_name": "Ubuntu 24.04 Dev Base", + "interface_type": "terminal", + "base_image": "ubuntu:24.04", + "packages": { + "apt": [ + "curl", + "wget", + "git", + "build-essential", + "ca-certificates", + "python3", + "python3-pip", + ] + }, + "user": { + "name": "user", + "uid": 1000, + "gid": 1000, + "create_home": True, + "shell": "/bin/bash", + }, + "env": {"DEBIAN_FRONTEND": "noninteractive"}, + } + ), + }, + ) + + conn.execute( + sa.text( + """ + INSERT INTO tool_definition_manifests + (id, name, display_name, description, category, interface_type, + base_definition_id, base_version, manifest, version, created_at, updated_at) + VALUES + (:manifest_id, 'pi-agent', 'Pi Agent', + 'Terminal-based coding harness with nvim, ranger, tmux', + 'development', 'terminal', :base_id, 'v1', :manifest, 'v1', + now(), now()) + """ + ), + { + "manifest_id": PI_AGENT_MANIFEST_ID, + "base_id": BASE_UBUNTU_ID, + "manifest": json.dumps( + { + "name": "pi-agent", + "display_name": "Pi Agent", + "description": "Terminal-based coding harness", + "category": "development", + "interface_type": "terminal", + "base_definition_id": str(BASE_UBUNTU_ID), + "base_version": "v1", + "packages": { + "apt": [ + "neovim", + "ranger", + "tmux", + "htop", + "tree", + "jq", + ], + "node": {"version": "20"}, + "npm_global": ["@earendil-works/pi-coding-agent"], + }, + "user": { + "name": "user", + "uid": 1001, + "gid": 1001, + "create_home": True, + "shell": "/bin/bash", + }, + "env": {"DEBIAN_FRONTEND": "noninteractive"}, + "scripts": { + "build": [ + "git config --global init.defaultBranch main && git config --global user.email 'dev@headquarter.local' && git config --global user.name 'Developer'", + "mkdir -p /home/user/.config/ranger && echo 'set preview_files true' > /home/user/.config/ranger/rc.conf", + ], + "startup": [ + "if [ -d /workspace ]; then sudo chown -R user:user /workspace 2>/dev/null || true; fi", + ], + }, + "mounts": [ + { + "name": "workspace", + "target": "/workspace", + "source_type": "repo", + "writable": True, + "owner": "user", + }, + { + "name": "ssh_keys", + "target": "/home/user/.ssh", + "source_type": "ssh_key", + "mode": "0700", + "file_mode": "0600", + "readonly": True, + }, + { + "name": "pi_state", + "target": "/tmp/.pi/agents", + "source_type": "instance", + "writable": True, + }, + { + "name": "pi_config", + "target": "/home/user/.pi", + "source_type": "git_mount", + "git_mount_ref": "dotfiles", + "writable": True, + "owner": "user", + }, + ], + "runtime": { + "command": ["/bin/bash"], + "stdin_open": True, + "tty": True, + "working_dir": "/workspace", + }, + } + ), + }, + ) + + # ── Update existing pi-agent tool_type ─────────────────────────── + conn.execute( + sa.text( + """ + UPDATE tool_types + SET manifest_id = :manifest_id, + definition_type = 'manifest', + dockerfile_template = NULL, + compose_template = NULL + WHERE name = 'pi-agent' + """ + ), + {"manifest_id": PI_AGENT_MANIFEST_ID}, + ) + + +def downgrade() -> None: + conn = op.get_bind() + + # Restore pi-agent templates if manifest_id column exists + result = conn.execute( + sa.text(""" + SELECT column_name FROM information_schema.columns + WHERE table_name = 'tool_types' AND column_name = 'manifest_id' + """) + ) + has_manifest_id = result.fetchone() is not None + + if has_manifest_id: + conn.execute( + sa.text( + """ + UPDATE tool_types + SET manifest_id = NULL, + definition_type = 'dockerfile', + dockerfile_template = :dockerfile, + compose_template = :compose + WHERE name = 'pi-agent' + """ + ), + { + "dockerfile": """# Pi Coding Agent - Terminal-based coding harness +FROM ubuntu:24.04 + +ENV DEBIAN_FRONTEND=noninteractive + +RUN apt-get update && apt-get install -y \\ + curl wget git neovim ranger tmux htop tree jq \\ + ca-certificates python3 python3-pip build-essential \\ + && rm -rf /var/lib/apt/lists/* + +RUN curl -fsSL https://deb.nodesource.com/setup_20.x | bash - \\ + && apt-get install -y nodejs \\ + && rm -rf /var/lib/apt/lists/* + +RUN npm install -g --ignore-scripts @earendil-works/pi-coding-agent + +RUN useradd -m -s /bin/bash user +WORKDIR /home/user + +RUN git config --global init.defaultBranch main \\ + && git config --global user.email "dev@headquarter.local" \\ + && git config --global user.name "Developer" + +RUN echo 'set -g mouse on\\nset -g default-terminal "screen-256color"' > /home/user/.tmux.conf + +RUN mkdir -p /home/user/.config/ranger \\ + && echo 'set preview_files true\\nset use_preview_script true' > /home/user/.config/ranger/rc.conf + +RUN mkdir -p /home/user/.pi/agent + +USER user + +CMD ["/bin/bash"] +""", + "compose": """services: + app: + build: . + stdin_open: true + tty: true + volumes: + - ${REPO_PATH}:/workspace + working_dir: /workspace + command: /bin/bash""", + }, + ) + + # Drop columns conditionally + result = conn.execute( + sa.text(""" + SELECT column_name FROM information_schema.columns + WHERE table_name = 'tool_instances' AND column_name = 'image_tag' + """) + ) + if result.fetchone(): + op.drop_column("tool_instances", "image_tag") + + result = conn.execute( + sa.text(""" + SELECT column_name FROM information_schema.columns + WHERE table_name = 'tool_instances' AND column_name = 'manifest_compiled_at' + """) + ) + if result.fetchone(): + op.drop_column("tool_instances", "manifest_compiled_at") + + if has_manifest_id: + op.drop_constraint("fk_tool_types_manifest_id", "tool_types", type_="foreignkey") + op.drop_column("tool_types", "manifest_id") + + op.drop_table("tool_definition_manifests") diff --git a/apps/api/src/api/tool_definitions.py b/apps/api/src/api/tool_definitions.py new file mode 100644 index 0000000..a0abc33 --- /dev/null +++ b/apps/api/src/api/tool_definitions.py @@ -0,0 +1,424 @@ +"""Tool definition API endpoints.""" + +import logging +import uuid + +from fastapi import APIRouter, Depends, HTTPException, status +from pydantic import BaseModel, Field +from sqlalchemy import select +from sqlalchemy.ext.asyncio import AsyncSession + +from src.auth.dependencies import get_current_user_id, get_db_session +from src.models.tool_definition_manifest import ToolDefinitionManifest +from src.models.tool_type import ToolType +from src.services.manifest_compiler import ( + compile_compose, + compile_dockerfile, + compile_entrypoint, + compute_image_tag, + deep_merge, + resolve_base, +) + +logger = logging.getLogger(__name__) + +router = APIRouter(prefix="/tool-definitions", tags=["tool-definitions"]) + + +class CreateToolDefinitionRequest(BaseModel): + """Request body for creating a tool definition manifest.""" + + model_config = {"extra": "ignore"} + + name: str = Field(description="Unique identifier (kebab-case)") + display_name: str = Field(description="Human-readable name") + description: str | None = Field(default=None) + category: str = Field(default="development") + interface_type: str = Field(default="terminal", description="web or terminal") + base_image: str | None = Field(default=None, description="Direct base image") + base_definition_id: str | None = Field( + default=None, description="Reference to a base definition" + ) + base_version: str = Field(default="latest") + manifest: dict = Field(description="The full manifest JSON") + + +class UpdateToolDefinitionRequest(BaseModel): + """Request body for updating a tool definition manifest.""" + + model_config = {"extra": "ignore"} + + display_name: str | None = Field(default=None) + description: str | None = Field(default=None) + category: str | None = Field(default=None) + manifest: dict | None = Field(default=None) + base_version: str | None = Field(default=None) + + +@router.post( + "", + summary="Create tool definition", + description="Create a new tool definition manifest.", +) +async def create_tool_definition( + data: CreateToolDefinitionRequest, + user_id: uuid.UUID = Depends(get_current_user_id), + session: AsyncSession = Depends(get_db_session), +) -> dict: + """Create a new tool definition manifest. + + Args: + data: Manifest data. + user_id: Authenticated user ID. + session: Database session. + + Returns: + Dictionary with created definition details. + """ + # Validate base reference + if not data.base_image and not data.base_definition_id: + raise HTTPException( + status_code=status.HTTP_400_BAD_REQUEST, + detail="Either base_image or base_definition_id is required", + ) + + base_def_id = None + if data.base_definition_id: + try: + base_def_id = uuid.UUID(data.base_definition_id) + except ValueError: + raise HTTPException( + status_code=status.HTTP_400_BAD_REQUEST, + detail=f"Invalid base_definition_id: {data.base_definition_id}", + ) + + base_def = await session.get(ToolDefinitionManifest, base_def_id) + if not base_def: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail=f"Base definition not found: {data.base_definition_id}", + ) + if not base_def.is_base: + raise HTTPException( + status_code=status.HTTP_400_BAD_REQUEST, + detail="Referenced definition is not a base definition", + ) + + # Check name uniqueness + existing = await session.execute( + select(ToolDefinitionManifest).where(ToolDefinitionManifest.name == data.name) + ) + if existing.scalar_one_or_none(): + raise HTTPException( + status_code=status.HTTP_409_CONFLICT, + detail=f"Tool definition '{data.name}' already exists", + ) + + definition = ToolDefinitionManifest( + name=data.name, + display_name=data.display_name, + description=data.description, + category=data.category, + interface_type=data.interface_type, + base_image=data.base_image, + base_definition_id=base_def_id, + base_version=data.base_version, + manifest=data.manifest, + created_by_id=user_id, + ) + + session.add(definition) + await session.commit() + await session.refresh(definition) + + logger.info("Created tool definition %s (%s)", definition.id, definition.name) + + return { + "id": str(definition.id), + "name": definition.name, + "display_name": definition.display_name, + "description": definition.description, + "category": definition.category, + "interface_type": definition.interface_type, + "base_image": definition.base_image, + "base_definition_id": str(definition.base_definition_id) + if definition.base_definition_id + else None, + "base_version": definition.base_version, + "manifest": definition.manifest, + "is_base": definition.is_base, + "created_at": definition.created_at.isoformat(), + } + + +@router.get( + "", + summary="List tool definitions", + description="List all tool definition manifests.", +) +async def list_tool_definitions( + user_id: uuid.UUID = Depends(get_current_user_id), + session: AsyncSession = Depends(get_db_session), + include_bases: bool = True, +) -> dict: + """List all tool definition manifests. + + Args: + user_id: Authenticated user ID. + session: Database session. + include_bases: Whether to include base definitions. + + Returns: + Dictionary containing list of definitions. + """ + query = select(ToolDefinitionManifest) + if not include_bases: + query = query.where(ToolDefinitionManifest.is_base == False) + + result = await session.execute( + query.order_by(ToolDefinitionManifest.created_at.desc()) + ) + definitions = result.scalars().all() + + return { + "definitions": [ + { + "id": str(d.id), + "name": d.name, + "display_name": d.display_name, + "description": d.description, + "category": d.category, + "interface_type": d.interface_type, + "is_base": d.is_base, + "base_image": d.base_image, + "base_definition_id": str(d.base_definition_id) + if d.base_definition_id + else None, + "base_version": d.base_version, + "version": d.version, + "created_at": d.created_at.isoformat(), + } + for d in definitions + ] + } + + +@router.get( + "/{definition_id}", + summary="Get tool definition", + description="Get a specific tool definition manifest.", +) +async def get_tool_definition( + definition_id: uuid.UUID, + user_id: uuid.UUID = Depends(get_current_user_id), + session: AsyncSession = Depends(get_db_session), +) -> dict: + """Get a specific tool definition manifest. + + Args: + definition_id: UUID of the definition. + user_id: Authenticated user ID. + session: Database session. + + Returns: + Dictionary with definition details. + """ + definition = await session.get(ToolDefinitionManifest, definition_id) + if not definition: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail=f"Tool definition not found: {definition_id}", + ) + + return { + "id": str(definition.id), + "name": definition.name, + "display_name": definition.display_name, + "description": definition.description, + "category": definition.category, + "interface_type": definition.interface_type, + "base_image": definition.base_image, + "base_definition_id": str(definition.base_definition_id) + if definition.base_definition_id + else None, + "base_version": definition.base_version, + "manifest": definition.manifest, + "dockerfile_cache": definition.dockerfile_cache, + "compose_cache": definition.compose_cache, + "version": definition.version, + "is_base": definition.is_base, + "created_at": definition.created_at.isoformat(), + "updated_at": definition.updated_at.isoformat(), + } + + +@router.put( + "/{definition_id}", + summary="Update tool definition", + description="Update a tool definition manifest.", +) +async def update_tool_definition( + definition_id: uuid.UUID, + data: UpdateToolDefinitionRequest, + user_id: uuid.UUID = Depends(get_current_user_id), + session: AsyncSession = Depends(get_db_session), +) -> dict: + """Update a tool definition manifest. + + Args: + definition_id: UUID of the definition. + data: Update data. + user_id: Authenticated user ID. + session: Database session. + + Returns: + Dictionary with updated definition details. + """ + definition = await session.get(ToolDefinitionManifest, definition_id) + if not definition: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail=f"Tool definition not found: {definition_id}", + ) + + if data.display_name is not None: + definition.display_name = data.display_name + if data.description is not None: + definition.description = data.description + if data.category is not None: + definition.category = data.category + if data.manifest is not None: + definition.manifest = data.manifest + if data.base_version is not None: + definition.base_version = data.base_version + + await session.commit() + await session.refresh(definition) + + logger.info("Updated tool definition %s (%s)", definition.id, definition.name) + + return { + "id": str(definition.id), + "name": definition.name, + "display_name": definition.display_name, + "manifest": definition.manifest, + "updated_at": definition.updated_at.isoformat(), + } + + +@router.delete( + "/{definition_id}", + summary="Delete tool definition", + description="Delete a tool definition manifest.", +) +async def delete_tool_definition( + definition_id: uuid.UUID, + user_id: uuid.UUID = Depends(get_current_user_id), + session: AsyncSession = Depends(get_db_session), +) -> dict: + """Delete a tool definition manifest. + + Args: + definition_id: UUID of the definition. + user_id: Authenticated user ID. + session: Database session. + + Returns: + Dictionary with deletion status. + """ + definition = await session.get(ToolDefinitionManifest, definition_id) + if not definition: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail=f"Tool definition not found: {definition_id}", + ) + + # Check if any tool types reference this manifest + result = await session.execute( + select(ToolType).where(ToolType.manifest_id == definition_id) + ) + referencing = result.scalars().all() + if referencing: + tool_names = ", ".join(t.name for t in referencing) + raise HTTPException( + status_code=status.HTTP_409_CONFLICT, + detail=f"Cannot delete: referenced by tool types: {tool_names}", + ) + + await session.delete(definition) + await session.commit() + + logger.info("Deleted tool definition %s (%s)", definition.id, definition.name) + + return {"status": "deleted", "id": str(definition_id)} + + +@router.post( + "/{definition_id}/compile", + summary="Compile tool definition", + description="Compile a manifest to Dockerfile + Compose preview without building.", +) +async def compile_tool_definition( + definition_id: uuid.UUID, + user_id: uuid.UUID = Depends(get_current_user_id), + session: AsyncSession = Depends(get_db_session), +) -> dict: + """Compile a manifest to Dockerfile + Compose preview. + + Args: + definition_id: UUID of the definition. + user_id: Authenticated user ID. + session: Database session. + + Returns: + Dictionary with compiled Dockerfile, Compose, and image tag. + """ + definition = await session.get(ToolDefinitionManifest, definition_id) + if not definition: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail=f"Tool definition not found: {definition_id}", + ) + + manifest = dict(definition.manifest) + + # Resolve base if referenced + if definition.base_definition_id: + base_def = await session.get( + ToolDefinitionManifest, definition.base_definition_id + ) + if base_def: + base_manifest = dict(base_def.manifest) + manifest = resolve_base(deep_merge(base_manifest, manifest)) + + # Compile + dockerfile = compile_dockerfile(manifest) + entrypoint = compile_entrypoint(manifest) + image_tag = compute_image_tag(definition.name, manifest) + + # Dummy compose with placeholder variables + dummy_vars = { + "IMAGE_TAG": image_tag, + "INSTANCE_NAME": f"{definition.name}-preview", + "INSTANCE_DIR": "/data/instances/preview", + "REPO_PATH": "/data/repos/preview", + "SSH_PATH": "/data/instances/preview/.ssh", + "TOOL_PORT": "8080", + "EXTRA_ENV": {}, + "EXTRA_VOLUMES": [], + } + compose = compile_compose(manifest, dummy_vars) + + # Update cache + definition.dockerfile_cache = dockerfile + definition.compose_cache = compose + await session.commit() + + return { + "id": str(definition.id), + "name": definition.name, + "dockerfile": dockerfile, + "entrypoint": entrypoint, + "compose": compose, + "image_tag": image_tag, + } diff --git a/apps/api/src/api/tool_instances.py b/apps/api/src/api/tool_instances.py index 7788d29..e709858 100644 --- a/apps/api/src/api/tool_instances.py +++ b/apps/api/src/api/tool_instances.py @@ -62,6 +62,16 @@ from src.services.docker import ( write_env_file, ) from src.services.docker_build import build_image +from src.services.manifest_compiler import ( + compile_compose, + compile_dockerfile, + compile_entrypoint, + compute_image_tag, + deep_merge, + merge_with_config, + resolve_base, +) +from src.services.permission_fixer import apply_mount_permissions from src.services.readiness_probe import execute_probe from src.services.ssh_keys import cleanup_ssh_key_files, prepare_ssh_key_files @@ -961,6 +971,142 @@ async def get_instance( } +async def _prepare_manifest_instance( + session: AsyncSession, + instance: ToolInstance, + instance_dir: str, + repo_path: str, + configs: list, + env_vars: dict, + extra_volumes: list, + working_directory: str | None, +) -> tuple[str, str, dict]: + """Build image and generate compose from a manifest-based tool type. + + Returns: + Tuple of (image_tag, compose_content, resolved_manifest) + """ + from src.models.tool_definition_manifest import ToolDefinitionManifest + + tool_type = await session.get(ToolType, instance.tool_type_id) + manifest_def = await session.get(ToolDefinitionManifest, tool_type.manifest_id) + + if not manifest_def: + raise RuntimeError(f"Manifest not found for tool type {tool_type.id}") + + manifest = dict(manifest_def.manifest) + + # Resolve base if referenced + if manifest_def.base_definition_id: + base_def = await session.get( + ToolDefinitionManifest, manifest_def.base_definition_id + ) + if base_def: + base_manifest = dict(base_def.manifest) + manifest = resolve_base(deep_merge(base_manifest, manifest)) + else: + logger.warning( + "Base definition %s not found for manifest %s", + manifest_def.base_definition_id, + manifest_def.id, + ) + + # Merge tool configs + tool_config_dicts = [ + { + "config_type": c.config_type, + "key": c.key, + "value": c.value, + "file_path": c.file_path, + "port_override": c.port_override, + "start_command": c.start_command, + "working_directory": c.working_directory, + "environment_variables": c.environment_variables, + "volumes": c.volumes, + } + for c in configs + ] + manifest = merge_with_config(manifest, tool_config_dicts) + + # Resolve extra env and volumes from merge_with_config + extra_env = manifest.pop("_extra_env", {}) + extra_cfg_volumes = manifest.pop("_extra_volumes", []) + env_vars.update(extra_env) + extra_volumes.extend(extra_cfg_volumes) + + # Compute image tag + image_tag = compute_image_tag(tool_type.name, manifest) + + # Check if image already exists + check = subprocess.run( + ["docker", "images", "-q", image_tag], + capture_output=True, + text=True, + ) + image_exists = check.returncode == 0 and check.stdout.strip() + + if not image_exists: + # Compile and build + dockerfile = compile_dockerfile(manifest) + entrypoint = compile_entrypoint(manifest) + + build_ctx = { + "Dockerfile": dockerfile, + ".headquarter/entrypoint.sh": entrypoint, + } + + returncode, stdout, stderr = await asyncio.to_thread( + build_image, + instance_dir=instance_dir, + dockerfile=dockerfile, + tag=image_tag, + build_context=build_ctx, + ) + + if returncode != 0: + raise RuntimeError(f"Docker build failed: {stderr}") + + logger.info("Built image %s for instance %s", image_tag, instance.id) + else: + logger.info("Reusing existing image %s for instance %s", image_tag, instance.id) + + # Prepare SSH path for mount resolution + ssh_path = "" + if instance.clone_mode == "clone": + ssh_path = os.path.join(instance_dir, ".ssh") + + # Resolve git mount variables from config profile + git_mount_vars = {} + if instance.selected_config_profile_id: + resolved_profile = await resolve_profile( + session, instance.selected_config_profile_id + ) + for gm in resolved_profile.git_mounts or []: + ref = gm.get("git_mount_ref", "default") + # The actual resolution happens in _resolve_git_mounts; we store placeholder + git_mount_vars[f"GIT_MOUNT_{ref}"] = "" + + variables = { + "IMAGE_TAG": image_tag, + "INSTANCE_NAME": instance.name.lower(), + "INSTANCE_DIR": instance_dir, + "REPO_PATH": repo_path, + "SSH_PATH": ssh_path, + "TOOL_PORT": instance.port or 0, + "EXTRA_ENV": env_vars, + "EXTRA_VOLUMES": extra_volumes, + **git_mount_vars, + } + + compose_content = compile_compose(manifest, variables) + + # Cache + instance.image_tag = image_tag + instance.manifest_compiled_at = datetime.now() + + return image_tag, compose_content, manifest + + @router.post( "/{project_id}/repositories/{repo_id}/instances/{instance_id}/start", summary="Start instance", @@ -1119,41 +1265,85 @@ async def start_instance( "Wrote %d config files for instance %s", len(config_files), instance.id ) - # Mount SSH key for clone-mode instances - if instance.clone_mode == "clone": - repo = await session.get(GitRepository, instance.repository_id) - if repo and repo.ssh_key_id: - ssh_key = await session.get(SSHKey, repo.ssh_key_id) - if ssh_key: - try: - ssh_dir = prepare_ssh_key_files(instance_dir, ssh_key) - extra_volumes.append( - { - "source": ssh_dir, - "target": "/root/.ssh", - "type": "ro", - } - ) - logger.debug( - "Mounted SSH key for clone-mode instance %s", instance.id - ) - except Exception as exc: - logger.error( - "Failed to prepare SSH key for instance %s: %s", - instance.id, - exc, - ) + # ── MANIFEST-BASED FLOW ────────────────────────────────────── + tool_type = await session.get(ToolType, instance.tool_type_id) + resolved_manifest = None - # Modify compose file if needed (port override, start command, working dir, volumes) - if port_override or start_command or working_directory or extra_volumes: - _modify_compose_file( - instance.compose_path, - port_override, - start_command, - working_directory, - extra_volumes, - ) - logger.debug("Modified compose file for instance %s", instance.id) + if tool_type and tool_type.definition_type == "manifest" and tool_type.manifest_id: + logger.info("Using manifest-based startup for instance %s", instance.id) + + # Determine repo path + repo = await session.get(GitRepository, instance.repository_id) + repo_path = repo.path if repo else "" + if instance.clone_mode == "clone": + repo_path = os.path.join(instance_dir, "repo-clone") + + try: + ( + image_tag, + compose_content, + resolved_manifest, + ) = await _prepare_manifest_instance( + session=session, + instance=instance, + instance_dir=instance_dir, + repo_path=repo_path, + configs=configs, + env_vars=env_vars, + extra_volumes=extra_volumes, + working_directory=working_directory, + ) + write_compose_file(instance_dir, compose_content) + logger.debug( + "Generated manifest-based compose for instance %s", instance.id + ) + except Exception as exc: + logger.exception( + "Manifest compilation failed for instance %s: %s", instance.id, exc + ) + instance.status = "error" + await session.commit() + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail=f"Manifest compilation failed: {exc}", + ) + else: + # ── LEGACY FLOW ────────────────────────────────────────── + # Mount SSH key for clone-mode instances + if instance.clone_mode == "clone": + repo = await session.get(GitRepository, instance.repository_id) + if repo and repo.ssh_key_id: + ssh_key = await session.get(SSHKey, repo.ssh_key_id) + if ssh_key: + try: + ssh_dir = prepare_ssh_key_files(instance_dir, ssh_key) + extra_volumes.append( + { + "source": ssh_dir, + "target": "/root/.ssh", + "type": "ro", + } + ) + logger.debug( + "Mounted SSH key for clone-mode instance %s", instance.id + ) + except Exception as exc: + logger.error( + "Failed to prepare SSH key for instance %s: %s", + instance.id, + exc, + ) + + # Modify compose file if needed (port override, start command, working dir, volumes) + if port_override or start_command or working_directory or extra_volumes: + _modify_compose_file( + instance.compose_path, + port_override, + start_command, + working_directory, + extra_volumes, + ) + logger.debug("Modified compose file for instance %s", instance.id) # Sanitize compose file to remove invalid port mappings from old instances _sanitize_compose_file(instance.compose_path) @@ -1244,6 +1434,28 @@ async def start_instance( startup_result["waited_seconds"], ) + # Apply mount permission fixes for manifest-based instances + if resolved_manifest and instance.container_id: + mounts = resolved_manifest.get("mounts", []) + if mounts: + logger.debug( + "Applying permission fixes for instance %s (%d mounts)", + instance.id, + len(mounts), + ) + permission_results = apply_mount_permissions( + instance.container_id, + mounts, + ) + for result in permission_results: + if not result["success"]: + logger.warning( + "Permission fix failed for mount %s on instance %s: %s", + result["mount_name"], + instance.id, + result["error"], + ) + # Execute readiness probe if configured tool_type = await session.get(ToolType, instance.tool_type_id) if tool_type and instance.container_id: diff --git a/apps/api/src/main.py b/apps/api/src/main.py index ae7b9d7..c2dfc23 100644 --- a/apps/api/src/main.py +++ b/apps/api/src/main.py @@ -18,6 +18,7 @@ from src.api.instance_proxy import router as instance_proxy_router from src.api.config_folders import router as config_folders_router from src.api.config_profiles import router as config_profiles_router from src.api.tool_configs import router as tool_configs_router +from src.api.tool_definitions import router as tool_definitions_router from src.api.tool_instances import router as tool_instances_router from src.api.tool_instances import sessions_router from src.api.tool_types import router as tool_types_router @@ -66,7 +67,9 @@ def _sanitize_validation_errors(errors): "type": error.get("type"), "loc": error.get("loc"), "msg": error.get("msg"), - "input": str(error.get("input")) if error.get("input") is not None else None, + "input": str(error.get("input")) + if error.get("input") is not None + else None, } # Convert ctx to safe format ctx = error.get("ctx") @@ -110,10 +113,12 @@ async def on_startup(): if not db_ready: logger.error("Database initialization failed. Shutting down.") import sys + sys.exit(1) logger.info("Startup complete.") + app.include_router(health_router) app.include_router(auth_router) app.include_router(dashboard_router) @@ -123,6 +128,7 @@ app.include_router(ssh_keys_router) app.include_router(git_repositories_router) app.include_router(user_config_router) app.include_router(tool_types_router) +app.include_router(tool_definitions_router) app.include_router(config_folders_router) app.include_router(config_profiles_router) app.include_router(tool_instances_router) diff --git a/apps/api/src/models/__init__.py b/apps/api/src/models/__init__.py index 4426212..f6b8e31 100644 --- a/apps/api/src/models/__init__.py +++ b/apps/api/src/models/__init__.py @@ -4,9 +4,23 @@ from src.models.config_profile import ConfigProfile, ConfigProfileInclude from src.models.git_repository import GitRepository from src.models.project import Project from src.models.ssh_key import SSHKey +from src.models.tool_definition_manifest import ToolDefinitionManifest 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 -__all__ = ["Base", "ConfigFolder", "ConfigProfile", "ConfigProfileInclude", "GitRepository", "Project", "SSHKey", "ToolInstance", "ToolType", "User", "UserConfig"] +__all__ = [ + "Base", + "ConfigFolder", + "ConfigProfile", + "ConfigProfileInclude", + "GitRepository", + "Project", + "SSHKey", + "ToolDefinitionManifest", + "ToolInstance", + "ToolType", + "User", + "UserConfig", +] diff --git a/apps/api/src/models/tool_definition_manifest.py b/apps/api/src/models/tool_definition_manifest.py new file mode 100644 index 0000000..bcbd2f7 --- /dev/null +++ b/apps/api/src/models/tool_definition_manifest.py @@ -0,0 +1,67 @@ +"""Tool Definition Manifest model.""" + +import uuid +from typing import TYPE_CHECKING + +from sqlalchemy import Boolean, ForeignKey, JSON, String, Text +from sqlalchemy import Uuid as UUID +from sqlalchemy.orm import Mapped, mapped_column, relationship + +from src.models.base import Base, TimestampMixin, UUIDPrimaryKeyMixin + +if TYPE_CHECKING: + from src.models.user import User + + +class ToolDefinitionManifest(UUIDPrimaryKeyMixin, TimestampMixin, Base): + """A declarative manifest that compiles to Dockerfile + Compose. + + Can be either: + - A base definition (is_base=True) with a FROM image and common packages + - A tool definition (is_base=False) that references a base + adds specifics + """ + + __tablename__ = "tool_definition_manifests" + + name: Mapped[str] = mapped_column(String(64), unique=True, nullable=False) + display_name: Mapped[str] = mapped_column(String(128), nullable=False) + description: Mapped[str | None] = mapped_column(Text, nullable=True) + category: Mapped[str | None] = mapped_column(String(64), nullable=True) + interface_type: Mapped[str] = mapped_column(String(16), nullable=False) + + # Base: either a direct image or a reference to another manifest + base_image: Mapped[str | None] = mapped_column(String(256), nullable=True) + base_definition_id: Mapped[uuid.UUID | None] = mapped_column( + UUID(), + ForeignKey("tool_definition_manifests.id"), + nullable=True, + ) + base_version: Mapped[str] = mapped_column( + String(32), nullable=False, default="latest" + ) + + # The full manifest JSON + manifest: Mapped[dict] = mapped_column(JSON, nullable=False) + + # Caches for quick inspection + dockerfile_cache: Mapped[str | None] = mapped_column(Text, nullable=True) + compose_cache: Mapped[str | None] = mapped_column(Text, nullable=True) + + # Versioning + version: Mapped[str] = mapped_column(String(32), nullable=False, default="v1") + is_base: Mapped[bool] = mapped_column(Boolean, nullable=False, default=False) + + created_by_id: Mapped[uuid.UUID | None] = mapped_column( + UUID(), + ForeignKey("users.id"), + nullable=True, + ) + + # Relationships + created_by: Mapped["User | None"] = relationship( + foreign_keys=[created_by_id], + ) + base_definition: Mapped["ToolDefinitionManifest | None"] = relationship( + remote_side="ToolDefinitionManifest.id", + foreign_keys=[base_definition_id], + ) diff --git a/apps/api/src/models/tool_instance.py b/apps/api/src/models/tool_instance.py index 589ff9b..e1a1a8b 100644 --- a/apps/api/src/models/tool_instance.py +++ b/apps/api/src/models/tool_instance.py @@ -33,42 +33,26 @@ class ToolInstance(UUIDPrimaryKeyMixin, TimestampMixin, Base): owner_id: Mapped[uuid.UUID] = mapped_column( UUID(), ForeignKey("users.id"), nullable=False ) - status: Mapped[str] = mapped_column( - String(50), nullable=False, default="pending" - ) - container_id: Mapped[str | None] = mapped_column( - String(255), nullable=True - ) - container_name: Mapped[str | None] = mapped_column( - String(255), nullable=True - ) - compose_path: Mapped[str | None] = mapped_column( - String(1024), nullable=True - ) - url: Mapped[str | None] = mapped_column( - String(1024), nullable=True - ) - public_url: Mapped[str | None] = mapped_column( - String(1024), nullable=True - ) - tunnel_id: Mapped[str | None] = mapped_column( - String(255), nullable=True - ) - port: Mapped[int | None] = mapped_column( - Integer, nullable=True - ) + status: Mapped[str] = mapped_column(String(50), nullable=False, default="pending") + container_id: Mapped[str | None] = mapped_column(String(255), nullable=True) + container_name: Mapped[str | None] = mapped_column(String(255), nullable=True) + compose_path: Mapped[str | None] = mapped_column(String(1024), nullable=True) + url: Mapped[str | None] = mapped_column(String(1024), nullable=True) + public_url: Mapped[str | None] = mapped_column(String(1024), nullable=True) + tunnel_id: Mapped[str | None] = mapped_column(String(255), nullable=True) + port: Mapped[int | None] = mapped_column(Integer, nullable=True) last_started_at: Mapped[datetime | None] = mapped_column( DateTime(timezone=True), nullable=True ) last_stopped_at: Mapped[datetime | None] = mapped_column( DateTime(timezone=True), nullable=True ) - probe_result: Mapped[dict | None] = mapped_column( - JSON, nullable=True - ) - clone_mode: Mapped[str] = mapped_column( - String(20), nullable=False, default="mount" + manifest_compiled_at: Mapped[datetime | None] = mapped_column( + DateTime(timezone=True), nullable=True ) + image_tag: Mapped[str | None] = mapped_column(String(256), nullable=True) + probe_result: Mapped[dict | None] = mapped_column(JSON, nullable=True) + clone_mode: Mapped[str] = mapped_column(String(20), nullable=False, default="mount") branch: Mapped[str | None] = mapped_column( String(255), nullable=True, default="main" ) diff --git a/apps/api/src/models/tool_type.py b/apps/api/src/models/tool_type.py index 05d1c5c..24b93dc 100644 --- a/apps/api/src/models/tool_type.py +++ b/apps/api/src/models/tool_type.py @@ -8,6 +8,7 @@ from sqlalchemy.orm import Mapped, mapped_column, relationship from src.models.base import Base, TimestampMixin, UUIDPrimaryKeyMixin if TYPE_CHECKING: + from src.models.tool_definition_manifest import ToolDefinitionManifest from src.models.user import User @@ -18,12 +19,19 @@ class ToolType(UUIDPrimaryKeyMixin, TimestampMixin, Base): display_name: Mapped[str] = mapped_column(String(255), nullable=False) description: Mapped[str | None] = mapped_column(Text, nullable=True) category: Mapped[str] = mapped_column(String(50), nullable=False, default="other") - interface_type: Mapped[str] = mapped_column(String(20), nullable=False, default="web") + interface_type: Mapped[str] = mapped_column( + String(20), nullable=False, default="web" + ) requires_port: Mapped[bool] = mapped_column(Boolean, default=True, nullable=False) default_port: Mapped[int] = mapped_column(nullable=False) definition_type: Mapped[str] = mapped_column( - String(20), nullable=False, default="compose" - ) # "compose" or "dockerfile" + String(16), nullable=False, default="legacy" + ) # "legacy" | "manifest" + manifest_id: Mapped[uuid.UUID | None] = mapped_column( + UUID(), + ForeignKey("tool_definition_manifests.id"), + nullable=True, + ) compose_template: Mapped[str | None] = mapped_column(Text, nullable=True) dockerfile_template: Mapped[str | None] = mapped_column(Text, nullable=True) build_context: Mapped[dict | None] = mapped_column( @@ -31,11 +39,16 @@ class ToolType(UUIDPrimaryKeyMixin, TimestampMixin, Base): ) readiness_probe: Mapped[dict | None] = mapped_column(JSON, nullable=True) startup_command: Mapped[str | None] = mapped_column(Text, nullable=True) - required_variables: Mapped[list[str]] = mapped_column(JSON, default=list, nullable=False) + required_variables: Mapped[list[str]] = mapped_column( + JSON, default=list, nullable=False + ) created_by_id: Mapped[uuid.UUID | None] = mapped_column( UUID(), ForeignKey("users.id"), nullable=True, ) + manifest: Mapped["ToolDefinitionManifest | None"] = relationship( + foreign_keys=[manifest_id], + ) created_by: Mapped["User | None"] = relationship() diff --git a/apps/api/src/services/manifest_compiler.py b/apps/api/src/services/manifest_compiler.py new file mode 100644 index 0000000..af76233 --- /dev/null +++ b/apps/api/src/services/manifest_compiler.py @@ -0,0 +1,412 @@ +"""Manifest compiler: transforms ToolDefinitionManifest into Dockerfile + Compose.""" + +import hashlib +import json +import shlex +from copy import deepcopy +from typing import Any + +import yaml + + +def resolve_base(manifest: dict) -> dict: + """Merge a base definition into a tool manifest. + + If the manifest has base_definition_id, the base manifest is loaded + and merged. Tool-specific values override base values. + + Args: + manifest: The tool manifest JSON (may reference a base) + + Returns: + A fully resolved manifest with base values merged in. + """ + result = deepcopy(manifest) + + base_definition_id = result.pop("base_definition_id", None) + base_version = result.pop("base_version", "latest") + + if base_definition_id: + # This will be provided by the caller (they have the DB session) + # For now, we assume the manifest has been pre-resolved + # or the caller provides the base manifest separately. + pass + + return result + + +def deep_merge(base: dict, override: dict) -> dict: + """Deep merge two manifests. Arrays are concatenated; dicts are merged. + + Args: + base: The base manifest. + override: The tool-specific overrides. + + Returns: + Merged manifest. + """ + merged = deepcopy(base) + + for key, value in override.items(): + if key == "mounts" and isinstance(value, list): + # Concatenate mount arrays + existing = merged.get("mounts", []) + merged["mounts"] = existing + deepcopy(value) + elif key == "scripts" and isinstance(value, dict): + # Merge script categories + if "scripts" not in merged: + merged["scripts"] = {} + for script_key, script_value in value.items(): + existing = merged["scripts"].get(script_key, []) + merged["scripts"][script_key] = existing + deepcopy(script_value) + elif key == "packages" and isinstance(value, dict): + # Union package arrays + if "packages" not in merged: + merged["packages"] = {} + for pkg_key, pkg_value in value.items(): + if ( + pkg_key in merged["packages"] + and isinstance(merged["packages"][pkg_key], list) + and isinstance(pkg_value, list) + ): + merged["packages"][pkg_key] = merged["packages"][ + pkg_key + ] + deepcopy(pkg_value) + else: + merged["packages"][pkg_key] = deepcopy(pkg_value) + elif key == "env" and isinstance(value, dict): + # Dict merge: override wins on key conflict + if "env" not in merged: + merged["env"] = {} + merged["env"].update(deepcopy(value)) + elif ( + isinstance(value, dict) and key in merged and isinstance(merged[key], dict) + ): + # Generic dict merge + merged[key] = {**merged[key], **deepcopy(value)} + else: + # Override entirely + merged[key] = deepcopy(value) + + return merged + + +def compile_dockerfile(manifest: dict) -> str: + """Compile a resolved manifest into a Dockerfile string. + + Args: + manifest: Fully resolved manifest JSON. + + Returns: + Dockerfile content. + """ + lines: list[str] = [] + + # FROM + base_image = manifest.get("base_image", "ubuntu:24.04") + lines.append(f"FROM {base_image}") + lines.append("") + + # Build-time environment + env = manifest.get("env", {}) + for key, value in env.items(): + lines.append(f"ENV {key}={shlex.quote(value)}") + if env: + lines.append("") + + # System packages (apt) + apt_packages = manifest.get("packages", {}).get("apt", []) + if apt_packages: + lines.append("RUN apt-get update && apt-get install -y \\\\") + for pkg in apt_packages[:-1]: + lines.append(f" {pkg} \\\\") + lines.append(f" {apt_packages[-1]} \\\\") + lines.append(" && rm -rf /var/lib/apt/lists/*") + lines.append("") + + # Node.js + node = manifest.get("packages", {}).get("node") + if node: + version = node.get("version", "20") + lines.append( + f"RUN curl -fsSL https://deb.nodesource.com/setup_{version}.x | bash - && \\\\" + ) + lines.append(" apt-get install -y nodejs && \\\\") + lines.append(" rm -rf /var/lib/apt/lists/*") + lines.append("") + + # NPM global packages + npm_packages = manifest.get("packages", {}).get("npm_global", []) + if npm_packages: + pkg_list = " ".join(shlex.quote(p) for p in npm_packages) + lines.append(f"RUN npm install -g {pkg_list}") + lines.append("") + + # Pip packages + pip_packages = manifest.get("packages", {}).get("pip", []) + if pip_packages: + pkg_list = " ".join(shlex.quote(p) for p in pip_packages) + lines.append(f"RUN pip install {pkg_list}") + lines.append("") + + # User creation + user = manifest.get("user") + if user: + name = user["name"] + uid = user["uid"] + gid = user["gid"] + create_home = "-m " if user.get("create_home", True) else "" + shell = user.get("shell", "/bin/bash") + lines.append(f"RUN groupadd -g {gid} {name} && \\\\") + lines.append(f" useradd -u {uid} -g {gid} {create_home}-s {shell} {name}") + lines.append("") + + # Build scripts + build_scripts = manifest.get("scripts", {}).get("build", []) + for script in build_scripts: + # Normalize multi-line scripts into single RUN command + stripped_lines = [ + line.strip() for line in script.strip().split("\n") if line.strip() + ] + if stripped_lines: + normalized = " && ".join(stripped_lines) + lines.append(f"RUN {normalized}") + if build_scripts: + lines.append("") + + # Create mount target directories + mounts = manifest.get("mounts", []) + if mounts: + dirs = [mount["target"] for mount in mounts] + dir_str = " ".join(dirs) + lines.append(f"RUN mkdir -p {dir_str}") + if user: + lines.append(f"RUN chown -R {user['name']}:{user['name']} {dir_str}") + lines.append("") + + # Entrypoint for startup scripts + startup_scripts = manifest.get("scripts", {}).get("startup", []) + if startup_scripts: + lines.append( + "COPY .headquarter/entrypoint.sh /usr/local/bin/headquarter-entrypoint" + ) + lines.append("RUN chmod +x /usr/local/bin/headquarter-entrypoint") + lines.append("") + + # Switch to runtime user + if user: + lines.append(f"USER {user['name']}") + lines.append(f"WORKDIR /home/{user['name']}") + lines.append("") + + # Entrypoint and CMD + runtime = manifest.get("runtime", {}) + if startup_scripts: + lines.append('ENTRYPOINT ["/usr/local/bin/headquarter-entrypoint"]') + + command = runtime.get("command", ["/bin/bash"]) + cmd_json = json.dumps(command) + lines.append(f"CMD {cmd_json}") + + return "\n".join(lines) + + +def compile_entrypoint(manifest: dict) -> str: + """Generate the startup entrypoint script from startup scripts. + + Args: + manifest: Fully resolved manifest JSON. + + Returns: + Shell script content. + """ + lines = ["#!/bin/bash", "set -e", ""] + + startup_scripts = manifest.get("scripts", {}).get("startup", []) + for script in startup_scripts: + lines.append(script) + lines.append("") + + lines.append('exec "$@"') + return "\n".join(lines) + + +def compile_compose(manifest: dict, variables: dict[str, Any]) -> str: + """Compile a resolved manifest into a Docker Compose string. + + Args: + manifest: Fully resolved manifest JSON. + variables: Resolved values: IMAGE_TAG, INSTANCE_NAME, REPO_PATH, etc. + + Returns: + Docker Compose YAML content. + """ + runtime = manifest.get("runtime", {}) + user = manifest.get("user") + interface_type = manifest["interface_type"] + + service: dict[str, Any] = { + "image": variables["IMAGE_TAG"], + "container_name": variables["INSTANCE_NAME"], + "restart": "unless-stopped", + } + + # Terminal-specific fields + if runtime.get("stdin_open", False): + service["stdin_open"] = True + if runtime.get("tty", False): + service["tty"] = True + if runtime.get("working_dir"): + service["working_dir"] = runtime["working_dir"] + + # User override + if user: + service["user"] = f"{user['uid']}:{user['gid']}" + + # Ports for web tools + default_port = manifest.get("default_port") + if interface_type == "web" and default_port: + service["ports"] = [f"{variables['TOOL_PORT']}:{default_port}"] + + # Environment + env = manifest.get("env", {}) + if env: + service["environment"] = dict(env) + + # Merge extra env from config + extra_env = variables.get("EXTRA_ENV", {}) + if extra_env: + if "environment" not in service: + service["environment"] = {} + service["environment"].update(extra_env) + + # Volumes from mount schema + volumes = [] + for mount in manifest.get("mounts", []): + source = resolve_mount_source(mount, variables) + if not source: + continue + target = mount["target"] + readonly = ":ro" if mount.get("readonly", False) else "" + volumes.append(f"{source}:{target}{readonly}") + + # Append extra volumes from tool config / config profile + for vol in variables.get("EXTRA_VOLUMES", []): + vol_str = f"{vol['source']}:{vol['target']}" + if vol.get("readonly"): + vol_str += ":ro" + volumes.append(vol_str) + + if volumes: + service["volumes"] = volumes + + compose = {"services": {"app": service}} + return yaml.dump(compose, default_flow_style=False) + + +def resolve_mount_source(mount: dict, variables: dict[str, Any]) -> str: + """Resolve a mount's source_type to an actual host path. + + Args: + mount: Mount definition from manifest. + variables: Resolved variables dict. + + Returns: + Host path string, or empty string if unresolved. + """ + source_type = mount.get("source_type", "host_path") + + if source_type == "repo": + return variables.get("REPO_PATH", "") + elif source_type == "ssh_key": + return variables.get("SSH_PATH", "") + elif source_type == "instance": + instance_dir = variables.get("INSTANCE_DIR", "") + mount_name = mount.get("name", "unknown") + return f"{instance_dir}/mounts/{mount_name}" + elif source_type == "git_mount": + ref = mount.get("git_mount_ref", "default") + return variables.get(f"GIT_MOUNT_{ref}", "") + elif source_type == "host_path": + return mount.get("source", "") + + return "" + + +def compute_image_tag(tool_name: str, manifest: dict) -> str: + """Compute a deterministic image tag from manifest content. + + Args: + tool_name: Human-readable tool name. + manifest: Fully resolved manifest JSON. + + Returns: + Docker image tag string. + """ + # Canonicalize: sort keys, stable JSON + canonical = json.dumps(manifest, sort_keys=True, separators=(",", ":")) + hash_suffix = hashlib.sha256(canonical.encode()).hexdigest()[:8] + safe_name = tool_name.lower().replace(" ", "-").replace("_", "-") + return f"headquarter/{safe_name}-{hash_suffix}:latest" + + +def merge_with_config( + manifest: dict, tool_configs: list[dict], profile: dict | None = None +) -> dict: + """Merge ToolConfig and ConfigProfile overrides into a manifest. + + Args: + manifest: Base manifest from tool definition. + tool_configs: List of ToolConfig records. + profile: Resolved ConfigProfile (optional). + + Returns: + Manifest with overrides applied. + """ + result = deepcopy(manifest) + + # Apply ToolConfigs + extra_env: dict[str, str] = {} + extra_volumes: list[dict] = [] + + for config in tool_configs: + if config.get("config_type") == "env": + extra_env[config["key"]] = config["value"] + elif config.get("config_type") == "file" and config.get("file_path"): + # Files are handled outside the manifest (written to instance dir) + pass + if config.get("port_override"): + result["default_port"] = config["port_override"] + if config.get("start_command"): + result["runtime"] = result.get("runtime", {}) + result["runtime"]["command"] = config["start_command"].split() + if config.get("working_directory"): + result["runtime"] = result.get("runtime", {}) + result["runtime"]["working_dir"] = config["working_directory"] + if config.get("environment_variables"): + extra_env.update(config["environment_variables"]) + if config.get("volumes"): + extra_volumes.extend(config["volumes"]) + + # Apply ConfigProfile + if profile: + if profile.get("environment_variables"): + extra_env.update(profile["environment_variables"]) + if profile.get("mounts"): + extra_volumes.extend(profile["mounts"]) + # Profile hints override everything + hints = profile.get("hints", {}) + if hints.get("start_command"): + result["runtime"] = result.get("runtime", {}) + result["runtime"]["command"] = hints["start_command"].split() + if hints.get("working_directory"): + result["runtime"] = result.get("runtime", {}) + result["runtime"]["working_dir"] = hints["working_directory"] + if hints.get("port_override"): + result["default_port"] = hints["port_override"] + + # Store merged extras for the compose compiler + result["_extra_env"] = extra_env + result["_extra_volumes"] = extra_volumes + + return result diff --git a/apps/api/src/services/permission_fixer.py b/apps/api/src/services/permission_fixer.py new file mode 100644 index 0000000..b0c8603 --- /dev/null +++ b/apps/api/src/services/permission_fixer.py @@ -0,0 +1,164 @@ +"""Permission fixer: applies mount permission policies post-start.""" + +import logging +import subprocess +from typing import Any + +logger = logging.getLogger(__name__) + + +def apply_mount_permissions( + container_id: str, + mounts: list[dict], + timeout: int = 10, +) -> list[dict[str, Any]]: + """Apply permission policies to mounted directories in a running container. + + Runs `chown`, `chmod`, and file-mode fixes for each mount that declares + an owner, mode, or file_mode. Requires the container to have a root user. + + Args: + container_id: Docker container ID or name. + mounts: List of mount definitions from the manifest. + timeout: Max seconds per docker exec command. + + Returns: + List of result dicts: [{mount_name, success, error}] + """ + results = [] + + for mount in mounts: + name = mount.get("name", "unknown") + target = mount["target"] + owner = mount.get("owner") + mode = mount.get("mode") + file_mode = mount.get("file_mode") + + result: dict[str, Any] = { + "mount_name": name, + "success": True, + "error": None, + } + + # Skip if no permission policy defined + if not owner and not mode and not file_mode: + results.append(result) + continue + + try: + if owner: + _run_in_container( + container_id, + ["chown", "-R", f"{owner}:{owner}", target], + timeout, + ) + logger.debug( + "Applied owner %s to %s in container %s", + owner, + target, + container_id, + ) + + if mode and result["success"]: + _run_in_container( + container_id, + ["chmod", mode, target], + timeout, + ) + logger.debug( + "Applied mode %s to %s in container %s", + mode, + target, + container_id, + ) + + if file_mode and result["success"]: + _run_in_container( + container_id, + [ + "sh", + "-c", + f"find {target} -type f -exec chmod {file_mode} {{}} +", + ], + timeout, + ) + logger.debug( + "Applied file_mode %s to files in %s in container %s", + file_mode, + target, + container_id, + ) + + except PermissionFixError as exc: + result["success"] = False + result["error"] = str(exc) + logger.warning( + "Permission fix failed for mount %s (target=%s): %s", + name, + target, + exc, + ) + + results.append(result) + + return results + + +class PermissionFixError(Exception): + """Raised when a permission fix command fails.""" + + pass + + +def _run_in_container( + container_id: str, + command: list[str], + timeout: int, +) -> None: + """Run a command inside a container as root. + + Args: + container_id: Docker container ID or name. + command: Command + args to execute. + timeout: Max seconds to wait. + + Raises: + PermissionFixError: If the command fails or times out. + """ + cmd = ["docker", "exec", "--user", "root", container_id] + command + + try: + result = subprocess.run( + cmd, + capture_output=True, + text=True, + timeout=timeout, + ) + except subprocess.TimeoutExpired: + raise PermissionFixError( + f"Command timed out after {timeout}s: {' '.join(command)}" + ) + except FileNotFoundError: + raise PermissionFixError(f"Docker command not found: {' '.join(command)}") + + if result.returncode != 0: + raise PermissionFixError( + f"Command failed (rc={result.returncode}): {result.stderr.strip()}" + ) + + +def check_root_user_available(container_id: str, timeout: int = 5) -> bool: + """Check if the container has a root user we can exec as. + + Args: + container_id: Docker container ID or name. + timeout: Max seconds to wait. + + Returns: + True if root user exists and is usable. + """ + try: + _run_in_container(container_id, ["id", "root"], timeout) + return True + except PermissionFixError: + return False diff --git a/apps/api/tests/unit/test_manifest_compiler.py b/apps/api/tests/unit/test_manifest_compiler.py new file mode 100644 index 0000000..12600ec --- /dev/null +++ b/apps/api/tests/unit/test_manifest_compiler.py @@ -0,0 +1,315 @@ +"""Unit tests for the manifest compiler.""" + +import pytest + +from src.services.manifest_compiler import ( + compile_compose, + compile_dockerfile, + compile_entrypoint, + compute_image_tag, + deep_merge, + merge_with_config, + resolve_base, +) + + +class TestResolveBase: + """Tests for resolve_base.""" + + def test_returns_manifest_unchanged_when_no_base(self) -> None: + manifest = {"name": "test", "base_image": "ubuntu:24.04"} + result = resolve_base(manifest) + assert result["name"] == "test" + assert "base_definition_id" not in result + + +class TestDeepMerge: + """Tests for deep_merge.""" + + def test_packages_are_unioned(self) -> None: + base = {"packages": {"apt": ["curl", "git"]}} + override = {"packages": {"apt": ["neovim"]}} + result = deep_merge(base, override) + assert result["packages"]["apt"] == ["curl", "git", "neovim"] + + def test_node_version_overrides(self) -> None: + base = {"packages": {"node": {"version": "18"}}} + override = {"packages": {"node": {"version": "20"}}} + result = deep_merge(base, override) + assert result["packages"]["node"]["version"] == "20" + + def test_env_is_merged_with_override_winning(self) -> None: + base = {"env": {"FOO": "base", "BAR": "base"}} + override = {"env": {"FOO": "override"}} + result = deep_merge(base, override) + assert result["env"]["FOO"] == "override" + assert result["env"]["BAR"] == "base" + + def test_build_scripts_are_concatenated(self) -> None: + base = {"scripts": {"build": ["echo base"]}} + override = {"scripts": {"build": ["echo override"]}} + result = deep_merge(base, override) + assert result["scripts"]["build"] == ["echo base", "echo override"] + + def test_mounts_are_concatenated(self) -> None: + base = {"mounts": [{"name": "base-mount", "target": "/base"}]} + override = {"mounts": [{"name": "tool-mount", "target": "/tool"}]} + result = deep_merge(base, override) + assert len(result["mounts"]) == 2 + + def test_user_is_overridden_entirely(self) -> None: + base = {"user": {"name": "base", "uid": 1000}} + override = {"user": {"name": "tool", "uid": 1001}} + result = deep_merge(base, override) + assert result["user"]["name"] == "tool" + assert result["user"]["uid"] == 1001 + + +class TestCompileDockerfile: + """Tests for compile_dockerfile.""" + + def test_includes_from(self) -> None: + manifest = {"base_image": "ubuntu:24.04", "name": "test"} + df = compile_dockerfile(manifest) + assert "FROM ubuntu:24.04" in df + + def test_installs_apt_packages(self) -> None: + manifest = { + "base_image": "ubuntu:24.04", + "name": "test", + "packages": {"apt": ["curl", "git"]}, + } + df = compile_dockerfile(manifest) + assert "apt-get install -y" in df + assert "curl" in df + assert "git" in df + assert "rm -rf /var/lib/apt/lists/*" in df + + def test_installs_node(self) -> None: + manifest = { + "base_image": "ubuntu:24.04", + "name": "test", + "packages": {"node": {"version": "20"}}, + } + df = compile_dockerfile(manifest) + assert "nodesource.com/setup_20.x" in df + + def test_installs_npm_global(self) -> None: + manifest = { + "base_image": "ubuntu:24.04", + "name": "test", + "packages": {"npm_global": ["@scope/pkg"]}, + } + df = compile_dockerfile(manifest) + assert "npm install -g @scope/pkg" in df + + def test_creates_user(self) -> None: + manifest = { + "base_image": "ubuntu:24.04", + "name": "test", + "user": {"name": "dev", "uid": 1001, "gid": 1001}, + } + df = compile_dockerfile(manifest) + assert "groupadd -g 1001 dev" in df + assert "useradd -u 1001 -g 1001" in df + assert "USER dev" in df + + def test_build_scripts_as_run_commands(self) -> None: + manifest = { + "base_image": "ubuntu:24.04", + "name": "test", + "scripts": {"build": ["echo hello", "echo world"]}, + } + df = compile_dockerfile(manifest) + assert "RUN echo hello" in df + assert "RUN echo world" in df + + def test_creates_mount_directories(self) -> None: + manifest = { + "base_image": "ubuntu:24.04", + "name": "test", + "user": {"name": "dev", "uid": 1001, "gid": 1001}, + "mounts": [ + {"name": "ws", "target": "/workspace"}, + {"name": "cfg", "target": "/config"}, + ], + } + df = compile_dockerfile(manifest) + assert "mkdir -p /workspace /config" in df + assert "chown -R dev:dev /workspace /config" in df + + def test_entrypoint_for_startup_scripts(self) -> None: + manifest = { + "base_image": "ubuntu:24.04", + "name": "test", + "scripts": {"startup": ["echo start"]}, + } + df = compile_dockerfile(manifest) + assert 'ENTRYPOINT ["/usr/local/bin/headquarter-entrypoint"]' in df + + def test_cmd_from_runtime(self) -> None: + manifest = { + "base_image": "ubuntu:24.04", + "name": "test", + "runtime": {"command": ["/bin/bash", "-il"]}, + } + df = compile_dockerfile(manifest) + assert 'CMD ["/bin/bash", "-il"]' in df + + def test_default_cmd_when_no_runtime(self) -> None: + manifest = {"base_image": "ubuntu:24.04", "name": "test"} + df = compile_dockerfile(manifest) + assert 'CMD ["/bin/bash"]' in df + + +class TestCompileEntrypoint: + """Tests for compile_entrypoint.""" + + def test_includes_shebang_and_set_e(self) -> None: + manifest = {"scripts": {"startup": ["echo hello"]}} + ep = compile_entrypoint(manifest) + assert "#!/bin/bash" in ep + assert "set -e" in ep + + def test_includes_startup_scripts(self) -> None: + manifest = {"scripts": {"startup": ["echo hello", "echo world"]}} + ep = compile_entrypoint(manifest) + assert "echo hello" in ep + assert "echo world" in ep + + def test_ends_with_exec(self) -> None: + manifest: dict = {"scripts": {"startup": []}} + ep = compile_entrypoint(manifest) + assert 'exec "$@"' in ep + + +class TestCompileCompose: + """Tests for compile_compose.""" + + def test_includes_image_and_container_name(self) -> None: + manifest = {"name": "test", "interface_type": "terminal"} + vars_dict = {"IMAGE_TAG": "test:v1", "INSTANCE_NAME": "test-1"} + compose = compile_compose(manifest, vars_dict) + assert "image: test:v1" in compose + assert "container_name: test-1" in compose + + def test_terminal_fields(self) -> None: + manifest = { + "name": "test", + "interface_type": "terminal", + "runtime": {"stdin_open": True, "tty": True, "working_dir": "/workspace"}, + } + compose = compile_compose(manifest, {"IMAGE_TAG": "t", "INSTANCE_NAME": "n"}) + assert "stdin_open: true" in compose + assert "tty: true" in compose + assert "working_dir: /workspace" in compose + + def test_web_ports(self) -> None: + manifest = { + "name": "test", + "interface_type": "web", + "default_port": 8080, + } + compose = compile_compose( + manifest, {"IMAGE_TAG": "t", "INSTANCE_NAME": "n", "TOOL_PORT": "3000"} + ) + assert "3000:8080" in compose + + def test_user_override(self) -> None: + manifest = { + "name": "test", + "interface_type": "terminal", + "user": {"uid": 1001, "gid": 1001}, + } + compose = compile_compose(manifest, {"IMAGE_TAG": "t", "INSTANCE_NAME": "n"}) + assert "user: 1001:1001" in compose + + def test_mounts_resolved(self) -> None: + manifest = { + "name": "test", + "interface_type": "terminal", + "mounts": [ + {"name": "ws", "target": "/workspace", "source_type": "repo"}, + { + "name": "ssh", + "target": "/home/user/.ssh", + "source_type": "ssh_key", + "readonly": True, + }, + ], + } + compose = compile_compose( + manifest, + { + "IMAGE_TAG": "t", + "INSTANCE_NAME": "n", + "REPO_PATH": "/repos/myrepo", + "SSH_PATH": "/keys/ssh", + }, + ) + assert "/repos/myrepo:/workspace" in compose + assert "/keys/ssh:/home/user/.ssh:ro" in compose + + def test_extra_volumes_appended(self) -> None: + manifest = {"name": "test", "interface_type": "terminal"} + compose = compile_compose( + manifest, + { + "IMAGE_TAG": "t", + "INSTANCE_NAME": "n", + "EXTRA_VOLUMES": [{"source": "/host/x", "target": "/container/x"}], + }, + ) + assert "/host/x:/container/x" in compose + + +class TestComputeImageTag: + """Tests for compute_image_tag.""" + + def test_is_deterministic(self) -> None: + manifest = {"name": "test", "packages": {"apt": ["curl"]}} + tag1 = compute_image_tag("My Tool", manifest) + tag2 = compute_image_tag("My Tool", manifest) + assert tag1 == tag2 + + def test_changes_with_content(self) -> None: + manifest1 = {"name": "test", "packages": {"apt": ["curl"]}} + manifest2 = {"name": "test", "packages": {"apt": ["wget"]}} + tag1 = compute_image_tag("test", manifest1) + tag2 = compute_image_tag("test", manifest2) + assert tag1 != tag2 + + def test_lowercases_name(self) -> None: + manifest = {"name": "test"} + tag = compute_image_tag("My Tool", manifest) + assert "my-tool" in tag + + def test_valid_docker_reference(self) -> None: + manifest = {"name": "test"} + tag = compute_image_tag("test", manifest) + assert tag.startswith("headquarter/test-") + assert tag.endswith(":latest") + + +class TestMergeWithConfig: + """Tests for merge_with_config.""" + + def test_applies_tool_config_env(self) -> None: + manifest = {"name": "test"} + configs = [ + {"config_type": "env", "key": "FOO", "value": "bar"}, + ] + result = merge_with_config(manifest, configs) + assert result["_extra_env"]["FOO"] == "bar" + + def test_applies_port_override(self) -> None: + manifest = {"name": "test", "default_port": 8080} + configs = [{"port_override": 3000}] + result = merge_with_config(manifest, configs) + assert result["default_port"] == 3000 + + def test_applies_start_command(self) -> None: + manifest = {"name": "test", "runtime": {"command": ["/bin/bash"]}} + configs = [{"start_command": "/bin/sh"}] + result = merge_with_config(manifest, configs) + assert result["runtime"]["command"] == ["/bin/sh"] diff --git a/apps/api/tests/unit/test_permission_fixer.py b/apps/api/tests/unit/test_permission_fixer.py new file mode 100644 index 0000000..df868d2 --- /dev/null +++ b/apps/api/tests/unit/test_permission_fixer.py @@ -0,0 +1,145 @@ +"""Unit tests for the permission fixer.""" + +from unittest.mock import MagicMock, patch + +import pytest + +from src.services.permission_fixer import ( + PermissionFixError, + apply_mount_permissions, + check_root_user_available, + _run_in_container, +) + + +class TestApplyMountPermissions: + """Tests for apply_mount_permissions.""" + + @patch("src.services.permission_fixer._run_in_container") + def test_applies_chown_when_owner_declared(self, mock_run) -> None: + mounts = [ + {"name": "workspace", "target": "/workspace", "owner": "user"}, + ] + results = apply_mount_permissions("abc123", mounts) + + assert len(results) == 1 + assert results[0]["mount_name"] == "workspace" + assert results[0]["success"] is True + mock_run.assert_called_once() + args = mock_run.call_args[0] + assert args[0] == "abc123" + assert args[1] == ["chown", "-R", "user:user", "/workspace"] + + @patch("src.services.permission_fixer._run_in_container") + def test_applies_chmod_when_mode_declared(self, mock_run) -> None: + mounts = [ + {"name": "ssh", "target": "/home/user/.ssh", "mode": "0700"}, + ] + results = apply_mount_permissions("abc123", mounts) + + assert results[0]["success"] is True + # Only chmod called (no owner, so no chown) + assert mock_run.call_count == 1 + chmod_call = mock_run.call_args_list[0] + assert chmod_call[0][1] == ["chmod", "0700", "/home/user/.ssh"] + + @patch("src.services.permission_fixer._run_in_container") + def test_applies_file_mode_when_declared(self, mock_run) -> None: + mounts = [ + { + "name": "ssh", + "target": "/home/user/.ssh", + "file_mode": "0600", + }, + ] + results = apply_mount_permissions("abc123", mounts) + + assert results[0]["success"] is True + # Only file_mode called (no owner, no mode) + assert mock_run.call_count == 1 + file_mode_call = mock_run.call_args_list[0] + assert file_mode_call[0][1][0] == "sh" + assert ( + "find /home/user/.ssh -type f -exec chmod 0600" in file_mode_call[0][1][2] + ) + + @patch("src.services.permission_fixer._run_in_container") + def test_skips_mount_with_no_policy(self, mock_run) -> None: + mounts = [ + {"name": "workspace", "target": "/workspace", "writable": True}, + ] + results = apply_mount_permissions("abc123", mounts) + + assert len(results) == 1 + assert results[0]["success"] is True + mock_run.assert_not_called() + + @patch("src.services.permission_fixer._run_in_container") + def test_reports_failure_on_command_error(self, mock_run) -> None: + mock_run.side_effect = PermissionFixError("chown failed") + + mounts = [ + {"name": "workspace", "target": "/workspace", "owner": "user"}, + ] + results = apply_mount_permissions("abc123", mounts) + + assert results[0]["success"] is False + assert "chown failed" in results[0]["error"] + + @patch("src.services.permission_fixer._run_in_container") + def test_stops_on_first_failure(self, mock_run) -> None: + """If chown fails, chmod and file_mode should not run.""" + mock_run.side_effect = PermissionFixError("chown failed") + + mounts = [ + { + "name": "workspace", + "target": "/workspace", + "owner": "user", + "mode": "0755", + "file_mode": "0644", + }, + ] + results = apply_mount_permissions("abc123", mounts) + + assert results[0]["success"] is False + assert mock_run.call_count == 1 # Only chown attempted + + +class TestRunInContainer: + """Tests for _run_in_container.""" + + @patch("subprocess.run") + def test_success(self, mock_run) -> None: + mock_run.return_value = MagicMock(returncode=0, stderr="") + _run_in_container("abc123", ["echo", "hello"], 10) + mock_run.assert_called_once() + cmd = mock_run.call_args[0][0] + assert cmd == ["docker", "exec", "--user", "root", "abc123", "echo", "hello"] + + @patch("subprocess.run") + def test_failure_raises(self, mock_run) -> None: + mock_run.return_value = MagicMock(returncode=1, stderr="permission denied") + with pytest.raises(PermissionFixError, match="permission denied"): + _run_in_container("abc123", ["chown", "x"], 10) + + @patch("subprocess.run") + def test_timeout_raises(self, mock_run) -> None: + import subprocess + + mock_run.side_effect = subprocess.TimeoutExpired(cmd=["docker"], timeout=10) + with pytest.raises(PermissionFixError, match="timed out"): + _run_in_container("abc123", ["chown", "x"], 10) + + +class TestCheckRootUserAvailable: + """Tests for check_root_user_available.""" + + @patch("src.services.permission_fixer._run_in_container") + def test_returns_true_when_root_exists(self, mock_run) -> None: + assert check_root_user_available("abc123") is True + + @patch("src.services.permission_fixer._run_in_container") + def test_returns_false_when_root_missing(self, mock_run) -> None: + mock_run.side_effect = PermissionFixError("no such user") + assert check_root_user_available("abc123") is False diff --git a/openspec/config.yaml b/openspec/config.yaml new file mode 100644 index 0000000..649528b --- /dev/null +++ b/openspec/config.yaml @@ -0,0 +1,37 @@ +project: + name: Headquarter + description: Docker-based development platform for managing coding agent tool instances + repository: https://git.commumedia.org/alex/headquarter + +stack: + backend: + framework: FastAPI + language: Python 3.11 + database: PostgreSQL 15 (async SQLAlchemy) + cache: Redis 7 + migrations: Alembic + testing: pytest + frontend: + framework: React + Vite + language: TypeScript + infrastructure: + local: Docker Compose + production: Docker Compose + Traefik + auth: Authentik SSO + +sdd: + execution_mode: interactive + artifact_store: openspec + chained_pr_strategy: auto-forecast + review_budget_lines: 400 + +strict_tdd: + enabled: true + test_command: docker exec hq-api pytest + evidence_required: red_green_triangulate_refactor + +phase_rules: + explore_before_proposal: true + spec_before_design: true + design_before_tasks: true + verify_before_archive: true diff --git a/openspec/designs/tool-definition-manifest.md b/openspec/designs/tool-definition-manifest.md new file mode 100644 index 0000000..a7a0e6c --- /dev/null +++ b/openspec/designs/tool-definition-manifest.md @@ -0,0 +1,751 @@ +# Design: Tool Definition Manifest System + +## Status +**Phase:** design +**Date:** 2026-05-28 +**Owner:** el Gentleman +**Based on:** Spec `tool-definition-manifest` + +--- + +## Architecture Overview + +``` +┌─────────────────────────────────────────────────────────────────┐ +│ Tool Workshop (Frontend) │ +│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────────┐ │ +│ │ Base Image │ │ Packages │ │ Mount Schema Designer │ │ +│ │ Selector │ │ Editors │ │ (target, owner, mode) │ │ +│ └─────────────┘ └─────────────┘ └─────────────────────────┘ │ +│ ┌─────────────────────────────────────────────────────────────┐│ +│ │ Live Preview: Dockerfile + Compose ││ +│ └─────────────────────────────────────────────────────────────┘│ +└─────────────────────────────────────────────────────────────────┘ + │ + ▼ POST /tool-definitions +┌─────────────────────────────────────────────────────────────────┐ +│ API Backend │ +│ ┌─────────────────┐ ┌──────────────────┐ ┌────────────┐ │ +│ │ ManifestSchema │───▶│ ManifestCompiler │───▶│ LiveBuild │ │ +│ │ (validation) │ │ (Dockerfile + │ │ (optional) │ │ +│ │ │ │ Compose gen) │ │ │ │ +│ └─────────────────┘ └──────────────────┘ └────────────┘ │ +│ │ +│ ▼ save to DB +│ ┌─────────────────────────────────────────────────────────────┐│ +│ │ ToolDefinitionManifest (JSONB in PostgreSQL) ││ +│ └─────────────────────────────────────────────────────────────┘│ +└─────────────────────────────────────────────────────────────────┘ + │ + ▼ POST /instances/{id}/start +┌─────────────────────────────────────────────────────────────────┐ +│ Instance Startup Flow │ +│ ┌─────────────┐ ┌──────────────┐ ┌──────────────────────┐ │ +│ │ Resolve │──▶│ Compile │──▶│ Build Image │ │ +│ │ Manifest │ │ to Dockerfile│ │ (docker build) │ │ +│ │ (base merge)│ │ + Compose │ │ │ │ +│ └─────────────┘ └──────────────┘ └──────────────────────┘ │ +│ │ +│ ▼ +│ ┌─────────────┐ ┌──────────────┐ ┌──────────────────────┐ │ +│ │ Permission │◀──│ docker comp. │◀──│ Generate Compose │ │ +│ │ Fixer │ │ up │ │ (mount resolution) │ │ +│ │ (post-start)│ │ │ │ │ │ +│ └─────────────┘ └──────────────┘ └──────────────────────┘ │ +└─────────────────────────────────────────────────────────────────┘ +``` + +--- + +## Manifest JSON Schema + +```json +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "required": ["name", "interface_type"], + "oneOf": [ + {"required": ["base_image"]}, + {"required": ["base_definition_id"]} + ], + "properties": { + "name": {"type": "string", "pattern": "^[a-z0-9-]+$", "maxLength": 64}, + "display_name": {"type": "string", "maxLength": 128}, + "description": {"type": "string"}, + "category": {"type": "string", "maxLength": 64}, + "interface_type": {"type": "string", "enum": ["web", "terminal"]}, + "base_image": {"type": "string", "maxLength": 256}, + "base_definition_id": {"type": "string", "format": "uuid"}, + "base_version": {"type": "string", "maxLength": 32, "default": "latest"}, + "packages": { + "type": "object", + "properties": { + "apt": {"type": "array", "items": {"type": "string"}}, + "node": { + "type": "object", + "properties": { + "version": {"type": "string", "pattern": "^\\d+$"} + }, + "required": ["version"] + }, + "npm_global": {"type": "array", "items": {"type": "string"}}, + "pip": {"type": "array", "items": {"type": "string"}} + } + }, + "user": { + "type": "object", + "properties": { + "name": {"type": "string", "maxLength": 32}, + "uid": {"type": "integer", "minimum": 1, "maximum": 65535}, + "gid": {"type": "integer", "minimum": 1, "maximum": 65535}, + "create_home": {"type": "boolean", "default": true}, + "shell": {"type": "string", "maxLength": 64, "default": "/bin/bash"} + }, + "required": ["name", "uid", "gid"] + }, + "env": {"type": "object", "additionalProperties": {"type": "string"}}, + "scripts": { + "type": "object", + "properties": { + "build": {"type": "array", "items": {"type": "string"}}, + "startup": {"type": "array", "items": {"type": "string"}} + } + }, + "mounts": { + "type": "array", + "items": { + "type": "object", + "required": ["name", "target", "source_type"], + "properties": { + "name": {"type": "string", "maxLength": 64}, + "target": {"type": "string", "maxLength": 256}, + "source_type": {"type": "string", "enum": ["repo", "ssh_key", "instance", "git_mount", "host_path"]}, + "writable": {"type": "boolean", "default": true}, + "owner": {"type": "string", "maxLength": 32}, + "mode": {"type": "string", "pattern": "^[0-7]{3,4}$"}, + "file_mode": {"type": "string", "pattern": "^[0-7]{3,4}$"}, + "readonly": {"type": "boolean", "default": false}, + "git_mount_ref": {"type": "string", "maxLength": 64} + } + } + }, + "runtime": { + "type": "object", + "properties": { + "command": {"type": "array", "items": {"type": "string"}}, + "stdin_open": {"type": "boolean", "default": false}, + "tty": {"type": "boolean", "default": false}, + "working_dir": {"type": "string", "maxLength": 256} + } + } + } +} +``` + +--- + +## Manifest Compiler Algorithm + +### Step 1: Resolve Base + +```python +def resolve_base(manifest: dict) -> dict: + """Merge base definition into the manifest.""" + if manifest.get("base_definition_id"): + base = load_base_definition(manifest["base_definition_id"], + manifest.get("base_version", "latest")) + # Deep merge: base first, then tool-specific overrides + merged = deep_merge(base, manifest) + # Remove base fields from the merged result + merged.pop("base_definition_id", None) + merged.pop("base_version", None) + return merged + return manifest +``` + +Merge rules: +- `packages`: Union arrays (base apt + tool apt = combined apt) +- `env`: Tool overrides base (dict merge, tool wins on key conflict) +- `scripts.build`: Concatenate arrays (base scripts first, then tool) +- `scripts.startup`: Concatenate arrays +- `user`: Tool overrides base entirely +- `mounts`: Concatenate arrays +- `runtime`: Tool overrides base (dict merge) + +### Step 2: Generate Dockerfile + +```python +def compile_dockerfile(manifest: dict) -> str: + """Compile a resolved manifest to a Dockerfile string.""" + lines = [] + + # FROM + lines.append(f"FROM {manifest['base_image']}") + lines.append("") + + # ENV (build-time) + for key, value in manifest.get("env", {}).items(): + lines.append(f"ENV {key}={shlex.quote(value)}") + if manifest.get("env"): + lines.append("") + + # System packages (apt) + apt_packages = manifest.get("packages", {}).get("apt", []) + if apt_packages: + lines.append("RUN apt-get update && apt-get install -y \\\\") + for pkg in apt_packages: + lines.append(f" {pkg} \\\\") + lines.append(" && rm -rf /var/lib/apt/lists/*") + lines.append("") + + # Node.js + node = manifest.get("packages", {}).get("node") + if node: + lines.append( + f"RUN curl -fsSL https://deb.nodesource.com/setup_{node['version']}.x | bash - && \\\\") + lines.append(" apt-get install -y nodejs && \\\\") + lines.append(" rm -rf /var/lib/apt/lists/*") + lines.append("") + + # NPM global + npm_packages = manifest.get("packages", {}).get("npm_global", []) + if npm_packages: + pkg_list = " ".join(shlex.quote(p) for p in npm_packages) + lines.append(f"RUN npm install -g {pkg_list}") + lines.append("") + + # Pip + pip_packages = manifest.get("packages", {}).get("pip", []) + if pip_packages: + pkg_list = " ".join(shlex.quote(p) for p in pip_packages) + lines.append(f"RUN pip install {pkg_list}") + lines.append("") + + # User creation + user = manifest.get("user") + if user: + lines.append( + f"RUN groupadd -g {user['gid']} {user['name']} && \\\\") + lines.append( + f" useradd -u {user['uid']} -g {user['gid']} " + f"{'-m ' if user.get('create_home', True) else ''}" + f"-s {user['shell']} {user['name']}") + lines.append("") + + # Build scripts + build_scripts = manifest.get("scripts", {}).get("build", []) + for script in build_scripts: + # Each script block becomes one RUN command + # Normalize multi-line scripts + normalized = " && ".join(line.strip() for line in script.strip().split("\n") if line.strip()) + lines.append(f"RUN {normalized}") + if build_scripts: + lines.append("") + + # Create mount target directories and pre-set ownership + mounts = manifest.get("mounts", []) + if mounts: + dirs = [] + for mount in mounts: + dirs.append(mount["target"]) + if dirs: + dir_str = " ".join(dirs) + lines.append(f"RUN mkdir -p {dir_str}") + if user: + lines.append(f"RUN chown -R {user['name']}:{user['name']} {dir_str}") + lines.append("") + + # Entrypoint for startup scripts + startup_scripts = manifest.get("scripts", {}).get("startup", []) + if startup_scripts: + lines.append("COPY .headquarter/entrypoint.sh /usr/local/bin/headquarter-entrypoint") + lines.append("RUN chmod +x /usr/local/bin/headquarter-entrypoint") + lines.append("") + + # Switch to user + if user: + lines.append(f"USER {user['name']}") + lines.append(f"WORKDIR /home/{user['name']}") + lines.append("") + + # Entrypoint and CMD + runtime = manifest.get("runtime", {}) + if startup_scripts: + lines.append('ENTRYPOINT ["/usr/local/bin/headquarter-entrypoint"]') + command = runtime.get("command", ["/bin/bash"]) + cmd_json = json.dumps(command) + lines.append(f"CMD {cmd_json}") + + return "\n".join(lines) +``` + +### Step 3: Generate Entrypoint Script + +```python +def compile_entrypoint(manifest: dict) -> str: + """Generate the startup entrypoint script.""" + lines = ["#!/bin/bash", "set -e", ""] + + startup_scripts = manifest.get("scripts", {}).get("startup", []) + for script in startup_scripts: + lines.append(script) + lines.append("") + + lines.append('exec "$@"') + return "\n".join(lines) +``` + +### Step 4: Generate Compose + +```python +def compile_compose(manifest: dict, variables: dict) -> str: + """Compile a resolved manifest to a Docker Compose string.""" + runtime = manifest.get("runtime", {}) + user = manifest.get("user") + interface_type = manifest["interface_type"] + + service = { + "image": variables["IMAGE_TAG"], + "container_name": variables["INSTANCE_NAME"], + "restart": "unless-stopped", + } + + # Terminal-specific fields + if runtime.get("stdin_open", False): + service["stdin_open"] = True + if runtime.get("tty", False): + service["tty"] = True + if runtime.get("working_dir"): + service["working_dir"] = runtime["working_dir"] + + # User override in compose (helps with permission consistency) + if user: + service["user"] = f"{user['uid']}:{user['gid']}" + + # Ports for web tools + if interface_type == "web" and manifest.get("default_port"): + service["ports"] = [f"{variables['TOOL_PORT']}:{manifest['default_port']}"] + + # Environment + env = manifest.get("env", {}) + if env: + service["environment"] = env + + # Volumes from mounts + volumes = [] + for mount in manifest.get("mounts", []): + source = resolve_mount_source(mount, variables) + target = mount["target"] + readonly = ":ro" if mount.get("readonly", False) else "" + volumes.append(f"{source}:{target}{readonly}") + + # Append extra volumes from tool config / config profile + for vol in variables.get("EXTRA_VOLUMES", []): + vol_str = f"{vol['source']}:{vol['target']}" + if vol.get("readonly"): + vol_str += ":ro" + volumes.append(vol_str) + + if volumes: + service["volumes"] = volumes + + compose = { + "services": {"app": service} + } + + return yaml.dump(compose, default_flow_style=False) +``` + +### Step 5: Image Tag Hash + +```python +import hashlib +import json + +def compute_image_tag(tool_name: str, manifest: dict) -> str: + """Deterministic image tag from manifest content.""" + # Normalize: sort keys, stable JSON + canonical = json.dumps(manifest, sort_keys=True, separators=(',', ':')) + hash_suffix = hashlib.sha256(canonical.encode()).hexdigest()[:8] + safe_name = tool_name.lower().replace(" ", "-").replace("_", "-") + return f"headquarter/{safe_name}-{hash_suffix}:latest" +``` + +--- + +## Mount Resolution + +Each `source_type` resolves differently at instance creation time: + +| source_type | Resolution | Example | +|-------------|------------|---------| +| `repo` | `{repo_path}` (mount or clone) | `/data/repos/headquarter` | +| `ssh_key` | `{instance_dir}/.ssh` | `/data/instances/.../.ssh` | +| `instance` | `{instance_dir}/{name}` | `/data/instances/.../mounts/tmp_.pi_agents` | +| `git_mount` | Resolved from ConfigProfile git_mounts | `/data/instances/.../git-mounts/...` | +| `host_path` | Literal host path | `/var/run/docker.sock` | + +```python +def resolve_mount_source(mount: dict, variables: dict) -> str: + source_type = mount["source_type"] + if source_type == "repo": + return variables["REPO_PATH"] + elif source_type == "ssh_key": + return variables["SSH_PATH"] + elif source_type == "instance": + instance_dir = variables["INSTANCE_DIR"] + mount_name = mount["name"] + return f"{instance_dir}/mounts/{mount_name}" + elif source_type == "git_mount": + ref = mount.get("git_mount_ref", "default") + return variables.get(f"GIT_MOUNT_{ref}", "") + elif source_type == "host_path": + return mount.get("source", "") + else: + raise ValueError(f"Unknown source_type: {source_type}") +``` + +--- + +## Permission Fixer (Post-Start) + +```python +def apply_mount_permissions( + container_id: str, + mounts: list[dict], + timeout: int = 10 +) -> list[dict]: + """Apply permission policies to mounted directories in a running container. + + Returns a list of results: [{mount_name, success, error}] + """ + results = [] + for mount in mounts: + name = mount["name"] + target = mount["target"] + owner = mount.get("owner") + mode = mount.get("mode") + file_mode = mount.get("file_mode") + + result = {"mount_name": name, "success": True, "error": None} + + try: + if owner: + proc = subprocess.run( + ["docker", "exec", container_id, "chown", "-R", + f"{owner}:{owner}", target], + capture_output=True, text=True, timeout=timeout + ) + if proc.returncode != 0: + result["success"] = False + result["error"] = f"chown failed: {proc.stderr}" + + if mode and result["success"]: + proc = subprocess.run( + ["docker", "exec", container_id, "chmod", mode, target], + capture_output=True, text=True, timeout=timeout + ) + if proc.returncode != 0: + result["success"] = False + result["error"] = f"chmod failed: {proc.stderr}" + + if file_mode and result["success"]: + proc = subprocess.run( + ["docker", "exec", container_id, "sh", "-c", + f"find {target} -type f -exec chmod {file_mode} {{}} +"], + capture_output=True, text=True, timeout=timeout + ) + if proc.returncode != 0: + result["success"] = False + result["error"] = f"file_mode chmod failed: {proc.stderr}" + + except subprocess.TimeoutExpired: + result["success"] = False + result["error"] = "Permission fix timed out" + + results.append(result) + + return results +``` + +**Important:** The permission fixer checks if `root` exists in the container before running. If the container has no `root` user (e.g., distroless images), it logs a warning and skips. + +--- + +## Modified Startup Flow + +The `start_instance` function in `tool_instances.py` is modified as follows: + +```python +async def start_instance(...): + # ... existing validation ... + + tool_type = await session.get(ToolType, instance.tool_type_id) + + if tool_type.definition_type == "manifest" and tool_type.manifest_id: + # NEW: Manifest-based startup flow + manifest = await load_manifest(session, tool_type.manifest_id) + + # Merge base definition + resolved = resolve_base(manifest) + + # Merge tool configs and config profile + resolved = apply_tool_configs(resolved, configs) + resolved = apply_config_profile(resolved, profile) + + # Compile + dockerfile = compile_dockerfile(resolved) + entrypoint = compile_entrypoint(resolved) + image_tag = compute_image_tag(tool_type.name, resolved) + + # Build image + build_context = { + "Dockerfile": dockerfile, + ".headquarter/entrypoint.sh": entrypoint, + } + returncode, stdout, stderr = build_image( + instance_dir=instance_dir, + dockerfile=dockerfile, # The Dockerfile references entrypoint.sh + tag=image_tag, + build_context=build_context, + ) + + # Generate compose with resolved variables + variables = { + "IMAGE_TAG": image_tag, + "INSTANCE_NAME": instance.name.lower(), + "REPO_PATH": repo_path, + "SSH_PATH": ssh_dir, + "INSTANCE_DIR": instance_dir, + # ... git mount resolutions from config profile ... + } + compose_content = compile_compose(resolved, variables) + write_compose_file(instance_dir, compose_content) + + # Store image tag for reuse + instance.image_tag = image_tag + + else: + # LEGACY: Existing dockerfile_template / compose_template flow + ... + + # ... docker compose up ... + # ... wait for running ... + + # NEW: Apply mount permissions post-start + if tool_type.definition_type == "manifest": + manifest = await load_manifest(session, tool_type.manifest_id) + resolved = resolve_base(manifest) + permission_results = apply_mount_permissions( + instance.container_id, + resolved.get("mounts", []) + ) + for result in permission_results: + if not result["success"]: + logger.warning( + "Permission fix failed for mount %s: %s", + result["mount_name"], result["error"] + ) + + # ... readiness probe ... + # ... tunnel creation ... +``` + +--- + +## File Layout + +``` +apps/api/src/ +├── models/ +│ ├── tool_definition_manifest.py # NEW: SQLAlchemy model +│ └── tool_type.py # MOD: add manifest_id, definition_type +├── services/ +│ ├── manifest_compiler.py # NEW: compile_dockerfile, compile_compose, resolve_base +│ ├── permission_fixer.py # NEW: apply_mount_permissions +│ └── docker_build.py # MOD: support build_context files +├── api/ +│ ├── tool_definitions.py # NEW: CRUD + compile endpoints +│ └── tool_instances.py # MOD: manifest-based startup flow +├── schemas/ +│ └── manifest_schema.py # NEW: JSON Schema + Pydantic validators +└── alembic/versions/ + └── 20260528_add_tool_definition_manifests.py # NEW: migration +``` + +--- + +## Testing Strategy + +### Unit Tests + +| Module | Tests | Coverage | +|--------|-------|----------| +| `manifest_compiler.py` | Dockerfile generation for all package managers, base merging, entrypoint generation | All branches | +| `permission_fixer.py` | chown/chmod success, failure, timeout, missing root user | All branches | +| `manifest_schema.py` | Valid manifest acceptance, invalid manifest rejection (all error paths) | All validation rules | + +### Integration Tests + +| Scenario | Test | +|----------|------| +| Manifest → Dockerfile → Build | Create manifest, compile, build image, verify it runs | +| ConfigProfile merge | Start instance with profile, verify mounts merged correctly | +| Permission fix | Start non-root container, verify workspace is writable | +| SSH key mount | Start clone-mode instance, verify SSH keys accessible and have correct permissions | +| Legacy compatibility | Start instance from old dockerfile_template tool type, verify it still works | +| Base versioning | Create tool with base v1, update base to v2, verify tool still uses v1 | + +### E2E Tests + +| Scenario | Test | +|----------|------| +| Tool Workshop CRUD | Create, edit, preview, delete a tool definition via UI | +| Instance lifecycle | Create instance from manifest tool, start, terminal connect, stop, delete | + +--- + +## Migration Plan + +### Step 1: Schema Migration + +```python +# alembic migration +from alembic import op +import sqlalchemy as sa + +def upgrade(): + op.create_table( + "tool_definition_manifests", + sa.Column("id", sa.UUID(), nullable=False), + sa.Column("name", sa.String(64), nullable=False), + sa.Column("display_name", sa.String(128), nullable=False), + sa.Column("description", sa.Text(), nullable=True), + sa.Column("category", sa.String(64), nullable=True), + sa.Column("interface_type", sa.String(16), nullable=False), + sa.Column("base_image", sa.String(256), nullable=True), + sa.Column("base_definition_id", sa.UUID(), nullable=True), + sa.Column("base_version", sa.String(32), nullable=False, server_default="latest"), + sa.Column("manifest", sa.JSON(), nullable=False), + sa.Column("dockerfile_cache", sa.Text(), nullable=True), + sa.Column("compose_cache", sa.Text(), nullable=True), + sa.Column("version", sa.String(32), nullable=False, server_default="v1"), + sa.Column("is_base", sa.Boolean(), nullable=False, server_default="false"), + sa.Column("created_by_id", sa.UUID(), nullable=True), + sa.Column("created_at", sa.TIMESTAMP(timezone=True), server_default=sa.func.now()), + sa.Column("updated_at", sa.TIMESTAMP(timezone=True), server_default=sa.func.now()), + sa.PrimaryKeyConstraint("id"), + sa.UniqueConstraint("name"), + sa.ForeignKeyConstraint(["base_definition_id"], ["tool_definition_manifests.id"]), + sa.ForeignKeyConstraint(["created_by_id"], ["users.id"]), + sa.CheckConstraint( + "(base_image IS NOT NULL) OR (base_definition_id IS NOT NULL)", + name="ck_tool_definition_manifests_base_required" + ), + ) + + op.add_column("tool_types", sa.Column("manifest_id", sa.UUID(), nullable=True)) + op.add_column("tool_types", sa.Column("definition_type", sa.String(16), nullable=False, server_default="legacy")) + op.create_foreign_key( + "fk_tool_types_manifest_id", + "tool_types", "tool_definition_manifests", + ["manifest_id"], ["id"] + ) + + op.add_column("tool_instances", sa.Column("manifest_compiled_at", sa.TIMESTAMP(timezone=True), nullable=True)) + op.add_column("tool_instances", sa.Column("image_tag", sa.String(256), nullable=True)) +``` + +### Step 2: Data Migration + +Convert the existing pi-agent tool type from `dockerfile_template` to manifest: + +```python +def upgrade_data(): + conn = op.get_bind() + + # Create the base definition for ubuntu-24.04-dev + base_id = uuid.uuid4() + conn.execute(sa.text(""" + INSERT INTO tool_definition_manifests + (id, name, display_name, description, interface_type, base_image, manifest, is_base, version) + VALUES (:id, 'ubuntu-24.04-dev', 'Ubuntu 24.04 Dev Base', 'Base development environment', + 'terminal', 'ubuntu:24.04', :manifest, true, 'v1') + """), { + "id": base_id, + "manifest": json.dumps({ + "name": "ubuntu-24.04-dev", + "base_image": "ubuntu:24.04", + "packages": {"apt": ["curl", "wget", "git", "build-essential", "ca-certificates"]}, + "user": {"name": "user", "uid": 1000, "gid": 1000}, + }) + }) + + # Create pi-agent manifest referencing the base + pi_agent_id = uuid.UUID("d07b8376-2151-4119-8c1d-27f792aae9a3") + conn.execute(sa.text(""" + INSERT INTO tool_definition_manifests + (id, name, display_name, description, category, interface_type, + base_definition_id, base_version, manifest, version) + VALUES (:id, 'pi-agent', 'Pi Agent', 'Terminal-based coding harness', + 'development', 'terminal', :base_id, 'v1', :manifest, 'v1') + """), { + "id": pi_agent_id, + "base_id": base_id, + "manifest": json.dumps({ + "name": "pi-agent", + "display_name": "Pi Agent", + "interface_type": "terminal", + "packages": { + "apt": ["neovim", "ranger", "tmux", "htop", "tree", "jq", "python3", "python3-pip"], + "node": {"version": "20"}, + "npm_global": ["@earendil-works/pi-coding-agent"] + }, + "user": {"name": "user", "uid": 1001, "gid": 1001, "create_home": True, "shell": "/bin/bash"}, + "env": {"DEBIAN_FRONTEND": "noninteractive"}, + "scripts": { + "build": [ + "git config --global init.defaultBranch main && git config --global user.email 'dev@headquarter.local' && git config --global user.name 'Developer'", + "mkdir -p /home/user/.config/ranger && echo 'set preview_files true' > /home/user/.config/ranger/rc.conf" + ], + "startup": [ + "if [ -d /workspace ]; then sudo chown -R user:user /workspace 2>/dev/null || true; fi" + ] + }, + "mounts": [ + {"name": "workspace", "target": "/workspace", "source_type": "repo", "writable": True, "owner": "user"}, + {"name": "ssh_keys", "target": "/home/user/.ssh", "source_type": "ssh_key", "mode": "0700", "file_mode": "0600", "readonly": True}, + {"name": "pi_state", "target": "/tmp/.pi/agents", "source_type": "instance", "writable": True}, + {"name": "pi_config", "target": "/home/user/.pi", "source_type": "git_mount", "git_mount_ref": "dotfiles", "writable": True, "owner": "user"} + ], + "runtime": { + "command": ["/bin/bash"], + "stdin_open": True, + "tty": True, + "working_dir": "/workspace" + } + }) + }) + + # Update the existing tool_types row + conn.execute(sa.text(""" + UPDATE tool_types + SET manifest_id = :manifest_id, + definition_type = 'manifest', + dockerfile_template = NULL, + compose_template = NULL + WHERE name = 'pi-agent' + """), {"manifest_id": pi_agent_id}) +``` + +--- + +## Review Workload Forecast + +| PR | Scope | Est. Lines | Review Risk | +|----|-------|-----------|-------------| +| PR 1: Backend | Compiler, fixer, API, tests, migration | ~1800 | Medium — core algorithm changes | +| PR 2: Frontend | Tool Workshop UI | ~1200 | Medium — new feature, self-contained | +| PR 3: Migration | Data migration, legacy fallback | ~300 | Low — additive only | + +All PRs are under the 400-line budget individually. Chained PRs recommended for sequential review. diff --git a/openspec/explorations/streamline-tool-container-definitions.md b/openspec/explorations/streamline-tool-container-definitions.md new file mode 100644 index 0000000..2635a77 --- /dev/null +++ b/openspec/explorations/streamline-tool-container-definitions.md @@ -0,0 +1,362 @@ +# SDD Exploration: Streamline Tool Container Definitions + +## Status +**Phase:** explore +**Date:** 2026-05-28 +**Owner:** el Gentleman (parent session) +**Scope:** Tool container definition, build, and mount system + +--- + +## Executive Summary + +The current tool container system works for the happy path (pi-agent on Ubuntu) but has deep structural inflexibility: + +1. **Monolithic Dockerfile strings** in the database — impossible to review, version, or compose +2. **Ad-hoc compose generation** — string formatting with hardcoded fields (`stdin_open`, `tty`, `working_dir` missing for dockerfile types) +3. **Hardcoded mount paths** — `/workspace` and `/root/.ssh` don't adapt to the container's runtime user +4. **No package/base-image modularity** — every tool type carries a full Dockerfile copy +5. **Permission mismatch** — bind mounts come in as root-owned; non-root container users can't write +6. **Config overlap** — tool configs, config profiles, and compose templates fight for control of the same fields + +This exploration proposes a **layered, declarative container definition system** where tool types compose from reusable base images, mount schemas, and permission policies. + +--- + +## Current Architecture Map + +### Data Model + +``` +ToolType (DB table) + ├── name, display_name, description, category + ├── interface_type: "web" | "terminal" + ├── definition_type: "dockerfile" | "compose" + ├── dockerfile_template: TEXT (giant Dockerfile string) + ├── compose_template: TEXT (Jinja-like {{VAR}} string) + ├── build_context: JSON {path: content} + ├── required_variables: JSON ["REPO_PATH", ...] + ├── default_port: int + └── readiness_probe: JSON + +ToolInstance (DB table) + ├── name, display_name, status + ├── tool_type_id → ToolType + ├── repository_id → GitRepository + ├── compose_path: str + ├── container_id, container_name + ├── port, url, public_url, tunnel_id + ├── clone_mode: "mount" | "clone" + ├── branch, new_branch + └── selected_config_profile_id → ConfigProfile + +ToolConfig (DB table, per-user per-tool-type) + ├── config_type: "env" | "file" + ├── key, value, file_path + ├── port_override, start_command, working_directory + ├── environment_variables: JSON + └── volumes: JSON [{source, target, type}] + +ConfigProfile (DB table) + ├── name, description + ├── user_id, project_id, tool_type_id + ├── environment_variables: JSON + ├── files: JSON {path: content} + ├── mounts: JSON [{source, target, type}] + ├── git_mounts: JSON [{remote_url, source_path, target_path, branch}] + └── parent_profile_id → ConfigProfile (hierarchy) +``` + +### Creation Flow (`create_instance`) + +``` +POST /projects/{id}/repositories/{id}/instances + → validate tool_type, repo, config_profile + → generate instance_name = "{tool_type}-{repo}-{uuid8}" + → ensure_instance_directory(instance_name) + → find_free_port() + → determine repo_path (mount = repo.path; clone = clone_repository()) + → IF tool_type.definition_type == "dockerfile": + build_image(instance_dir, dockerfile_template, tag, build_context) + generate compose_content (HARDCODED STRING FORMATTING) + ELSE: + render_compose_template(tool_type.compose_template, variables) + → write_compose_file() + → create ToolInstance DB record (status="pending") +``` + +### Startup Flow (`start_instance`) + +``` +POST /instances/{id}/start + → fetch ToolConfigs (env, files, port_override, start_command, working_dir, volumes) + → IF selected_config_profile: + resolve_profile() → env, files, mounts, git_mounts, hints + → write .env file, config files + → IF clone_mode: mount SSH keys at /root/.ssh (HARDCODED) + → _modify_compose_file(port, command, working_dir, extra_volumes) + → _sanitize_compose_file() + → execute_compose_command("up") + → get_container_id(instance.name) ← CASE-SENSITIVE BUG (fixed) + → get_container_name(instance.name) + → connect_container_to_network("backend") + → wait_for_container_running() + → IF web: start_cloudflared_tunnel() + → instance.status = "running" +``` + +### Key Files + +| File | Responsibility | +|------|---------------| +| `apps/api/src/api/tool_instances.py` | create_instance, start_instance, stop_instance, restart_instance, proxy, logs | +| `apps/api/src/api/tool_types.py` | CRUD for ToolType (DB strings) | +| `apps/api/src/services/docker.py` | compose execution, container queries, tunnel management | +| `apps/api/src/services/docker_build.py` | `docker build` wrapper | +| `apps/api/src/services/terminal_session.py` | PTY-based terminal over `docker exec` | +| `apps/api/src/services/terminal_manager.py` | WebSocket ↔ terminal session lifecycle | +| `apps/api/src/models/tool_type.py` | SQLAlchemy model | + +--- + +## Pain Points (Detailed) + +### 1. Monolithic Dockerfile Templates + +The pi-agent Dockerfile template is a 40-line string stored in the DB migration: + +```sql +INSERT INTO tool_types (... dockerfile_template ...) +VALUES ('...# Pi Coding Agent - Terminal-based coding harness\nFROM ubuntu:24.04\n...') +``` + +**Problems:** +- No syntax highlighting, linting, or `docker build` validation at edit time +- Every tool type copies the entire Dockerfile; no reuse of common layers +- Changes require a DB migration +- No way for users to customize packages without forking the whole template + +### 2. Ad-Hoc Compose Generation + +For `dockerfile` type tools, the compose is generated by Python f-string: + +```python +compose_content = f"""version: "3.8" +services: + app: + image: {image_tag} + container_name: {instance_name.lower()} +{ports_section} volumes: + - {repo_path}:/workspace + restart: unless-stopped +""" +``` + +**Problems:** +- Missing `stdin_open: true` and `tty: true` (essential for terminal tools) +- Missing `working_dir: /workspace` +- No way to add labels, networks, healthchecks, or extra services +- Port section is conditionally included with awkward string concatenation + +### 3. Hardcoded Mount Paths + +| Mount | Current Target | Problem | +|-------|---------------|---------| +| Repository | `/workspace` | Always root-owned; no permission fix for non-root users | +| SSH keys (clone mode) | `/root/.ssh` | Invisible to containers running as `user` | +| Git-mount configs | `/tmp/.pi` | May be root-owned; conflicts with user's `.pi` | +| Config profile files | Instance-relative paths | No validation against container filesystem | + +### 4. No Base Image / Layer Composition + +Every tool type must specify a complete Dockerfile from `FROM` to `CMD`. There's no way to say: + +```yaml +base: ubuntu-24.04-dev # pre-built with curl, git, build-essential +layers: + - nodejs-20 + - pi-coding-agent + - custom-packages: [neovim, ranger, tmux] +``` + +### 5. Permission Mismatch (Non-Root Users) + +The pi-agent Dockerfile creates a `user` account and uses `USER user`. Bind mounts from the host come in as root-owned. The API has **no automatic permission fix** — this caused the workspace-unwritable bug. + +Workarounds considered: +- Post-start `docker exec --user root chown` (current fix) +- Dockerfile entrypoint script that chowns before dropping privileges +- Matching container UID to host UID + +None of these are systematic or configurable. + +### 6. Config Overlap and Precedence Confusion + +Three systems control the same container aspects: + +| System | Controls | Stored | +|--------|----------|--------| +| ToolConfig | env vars, files, port, command, working_dir, volumes | DB (per-user per-tool) | +| ConfigProfile | env vars, files, mounts, git_mounts, hints | DB (hierarchical) | +| Compose template / generation | volumes, ports, command, working_dir | DB string / Python f-string | + +**Precedence is unclear:** +- ToolConfig `working_directory` vs ConfigProfile hint `working_directory` vs compose `working_dir` +- ToolConfig `volumes` vs ConfigProfile `mounts` vs compose `volumes` +- `start_command` from ToolConfig vs ConfigProfile vs Dockerfile `CMD` + +### 7. Build Context Limitations + +`build_context` is a JSON dictionary of `{relative_path: file_content}`. This is stored in the DB as text. + +**Problems:** +- Binary files (images, tarballs) can't be stored +- Large files bloat the DB +- No versioning or external reference (e.g., "use file from git repo") + +--- + +## Extensibility Gaps + +| Want | Current State | Gap | +|------|--------------|-----| +| Add a new language runtime (e.g., Go, Rust) | Copy entire Dockerfile, edit | No modular package/layer system | +| Use a custom base image (e.g., `my-registry/dev-base:v2`) | Edit full Dockerfile | No base-image reference field | +| Mount a second repo or a secrets file | Write ConfigProfile or ToolConfig JSON | No declarative mount schema | +| Run as root instead of `user` | Edit full Dockerfile | No runtime-user field | +| Add a sidecar (e.g., postgres for integration tests) | Edit compose_template string | No multi-service compose support | +| Pre-install VS Code server | Edit full Dockerfile | No "feature" or "extension" mechanism | +| Custom entrypoint script | Edit full Dockerfile | No entrypoint field | + +--- + +## Design Directions (Pre-Proposal) + +### Direction A: Declarative Tool Manifests + +Replace the monolithic `dockerfile_template` with a structured manifest: + +```yaml +# Example: tool manifest for pi-agent +name: pi-agent +base_image: ubuntu:24.04 +user: + name: user + uid: 1000 + home: /home/user +packages: + apt: [curl, wget, git, neovim, ranger, tmux, htop, tree, jq, python3, python3-pip, build-essential] + npm_global: [@earendil-works/pi-coding-agent] + node_version: "20" +env: + DEBIAN_FRONTEND: noninteractive +config_files: + /home/user/.tmux.conf: "set -g mouse on\n..." + /home/user/.config/ranger/rc.conf: "set preview_files true\n..." +working_directory: /workspace +command: ["/bin/bash"] +ports: [] +mounts: + repo: {target: /workspace, writable: true} + ssh: {target: /home/user/.ssh, mode: "0600"} + tmp_state: {target: /tmp/.pi, writable: true} +``` + +**Pros:** Structured, reviewable, composable +**Cons:** Requires a manifest-to-Dockerfile compiler; migration complexity + +### Direction B: Base Image Registry + Layers + +Maintain a registry of pre-built base images: + +``` +headquarter/base/ubuntu-24.04-dev +headquarter/base/nodejs-20 +headquarter/base/python-3.11 +``` + +Tool types reference a base image and a list of layers: + +```yaml +base_image: headquarter/base/ubuntu-24.04-dev +layers: + - type: npm_install + package: @earendil-works/pi-coding-agent + - type: config_file + path: /home/user/.tmux.conf + content: "..." +``` + +**Pros:** Fast builds (base images cached), reusable, versioned +**Cons:** Requires image registry management, layer ordering complexity + +### Direction C: Compose-First with Dockerfile Overrides + +Treat `compose_template` as the primary definition. For simple cases, use a pre-built image. For custom cases, allow an inline Dockerfile or a `build` section in the compose: + +```yaml +services: + app: + build: + context: . + dockerfile_inline: | + FROM ubuntu:24.04 + ... + stdin_open: true + tty: true + working_dir: /workspace + volumes: + - ${REPO_PATH}:/workspace + - ${SSH_PATH}:/home/user/.ssh:ro + user: "${CONTAINER_USER:-user}" +``` + +**Pros:** Leverages Docker Compose native features, familiar to users +**Cons:** Still string-based; inline Dockerfiles are hard to edit + +### Direction D: Permission-Aware Mount Schema + +Decouple mount declaration from mount implementation: + +```python +class MountPolicy: + source: str # host path + target: str # container path + owner: str | None # container user to own the mount + permissions: str # chmod string + readonly: bool +``` + +At startup, the API runs a post-start "permission fixer" that applies all policies: + +```bash +docker exec --user root chown -R +docker exec --user root chmod +``` + +**Pros:** Systematic, works with any base image, configurable per mount +**Cons:** Adds startup latency, requires root to exist in container + +--- + +## Recommended Next Steps + +1. **Proposal phase:** Evaluate Direction A (Declarative Manifests) vs Direction C (Compose-First) for the primary architecture +2. **Design phase:** Detail the manifest schema or compose enhancement, migration path, and API changes +3. **Consider Direction D** as a cross-cutting concern regardless of primary direction + +--- + +## Risks + +- **Migration risk:** Existing `dockerfile_template` and `compose_template` columns need backward-compatible migration +- **Build cache invalidation:** Changing the build system may invalidate Docker layer caches +- **User confusion:** Adding a manifest layer on top of Dockerfiles may feel like "yet another abstraction" +- **Scope creep:** This touches tool types, tool configs, config profiles, compose generation, and the startup flow — high cross-cutting surface + +--- + +## Artifacts + +- `openspec/config.yaml` — SDD configuration +- `openspec/explorations/streamline-tool-container-definitions.md` — This document diff --git a/openspec/proposals/streamline-tool-container-definitions.md b/openspec/proposals/streamline-tool-container-definitions.md new file mode 100644 index 0000000..b023b9d --- /dev/null +++ b/openspec/proposals/streamline-tool-container-definitions.md @@ -0,0 +1,447 @@ +# SDD Proposal: Declarative Tool Container Compiler + +## Status +**Phase:** proposal +**Date:** 2026-05-28 +**Owner:** el Gentleman +**Based on:** Exploration `streamline-tool-container-definitions` + +--- + +## User Story + +As a platform operator, I want to define a tool container by specifying: +- A **base image** (e.g. `ubuntu:24.04` or a pre-built `headquarter/base:dev-ubuntu`) +- A **list of packages** to install (apt, npm, pip, etc.) +- **Setup scripts** that run at build-time or container-startup +- **Mount policies** that automatically fix permissions for the runtime user + +I do **not** want to write Dockerfiles or Compose files by hand. + +The system should compile these declarations into Dockerfiles and Compose files automatically, while remaining fully compatible with the existing ConfigProfile mount system. + +--- + +## Core Concept: The Tool Definition Manifest + +Replace the monolithic `dockerfile_template` and `compose_template` strings with a single structured **Tool Definition Manifest**. + +```yaml +# Tool Definition Manifest (stored as JSON in DB) +name: pi-agent +display_name: "Pi Agent" +description: "Terminal-based coding harness" +category: development +interface_type: terminal # web | terminal + +# ── Base Image ─────────────────────────────────────────────── +base_image: ubuntu:24.04 +# OR reference a pre-built base definition: +# base_definition_id: "base-ubuntu-24.04-dev" + +# ── Packages ───────────────────────────────────────────────── +packages: + apt: + - curl + - wget + - git + - neovim + - ranger + - tmux + - htop + - tree + - jq + - ca-certificates + - python3 + - python3-pip + - build-essential + node: + version: "20" # triggers nodesource setup + npm_global: + - "@earendil-works/pi-coding-agent" + # pip: + # - requests + # - httpx + +# ── Runtime User ───────────────────────────────────────────── +user: + name: user + uid: 1001 + gid: 1001 + create_home: true + shell: /bin/bash + +# ── Environment ────────────────────────────────────────────── +env: + DEBIAN_FRONTEND: noninteractive + +# ── Setup Scripts ──────────────────────────────────────────── +scripts: + # build: runs during `docker build` → becomes RUN commands + build: + - | + git config --global init.defaultBranch main + git config --global user.email "dev@headquarter.local" + git config --global user.name "Developer" + - | + mkdir -p /home/user/.config/ranger + echo 'set preview_files true' > /home/user/.config/ranger/rc.conf + + # startup: runs when container starts → becomes entrypoint script + startup: + - | + # Ensure workspace is owned by runtime user + if [ -d /workspace ]; then + sudo chown -R user:user /workspace 2>/dev/null || true + fi + +# ── Mount Schema ───────────────────────────────────────────── +mounts: + - name: workspace + target: /workspace + source_type: repo # resolved from repository path at instance creation + writable: true + owner: user # post-start: chown -R user:user /workspace + + - name: ssh_keys + target: /home/user/.ssh + source_type: ssh_key # resolved from repository's SSH key + mode: "0700" # post-start: chmod 0700 /home/user/.ssh + file_mode: "0600" # post-start: chmod 0600 files inside + readonly: true + + - name: pi_state + target: /tmp/.pi/agents + source_type: instance # resolved to {instance_dir}/mounts/tmp_.pi_agents + writable: true + + - name: pi_config + target: /home/user/.pi + source_type: git_mount # resolved from config profile git_mounts + git_mount_ref: dotfiles # references a named git mount in the config profile + writable: true + owner: user + +# ── Runtime ────────────────────────────────────────────────── +runtime: + command: ["/bin/bash"] + stdin_open: true + tty: true + working_dir: /workspace + # ports are auto-derived from interface_type: + # web: expose default_port + # terminal: no port mapping +``` + +--- + +## How It Compiles + +### 1. Dockerfile Generation + +The manifest compiler transforms the spec into a Dockerfile: + +```dockerfile +# Generated Dockerfile — do not edit manually +FROM ubuntu:24.04 + +ENV DEBIAN_FRONTEND=noninteractive + +# ── System Packages ── +RUN apt-get update && apt-get install -y \ + curl wget git neovim ranger tmux htop tree jq \ + ca-certificates python3 python3-pip build-essential \ + && rm -rf /var/lib/apt/lists/* + +# ── Node.js ── +RUN curl -fsSL https://deb.nodesource.com/setup_20.x | bash - \ + && apt-get install -y nodejs \ + && rm -rf /var/lib/apt/lists/* + +# ── NPM Packages ── +RUN npm install -g --ignore-scripts @earendil-works/pi-coding-agent + +# ── Runtime User ── +RUN groupadd -g 1001 user && \ + useradd -u 1001 -g 1001 -m -s /bin/bash user + +# ── Build Scripts ── +RUN git config --global init.defaultBranch main && \ + git config --global user.email "dev@headquarter.local" && \ + git config --global user.name "Developer" + +RUN mkdir -p /home/user/.config/ranger && \ + echo 'set preview_files true' > /home/user/.config/ranger/rc.conf + +# ── Environment ── +ENV DEBIAN_FRONTEND=noninteractive + +# ── Setup Directories ── +RUN mkdir -p /workspace /tmp/.pi/agents /home/user/.pi && \ + chown -R user:user /workspace /tmp/.pi /home/user/.pi + +# ── Entrypoint for Startup Scripts ── +COPY .headquarter/entrypoint.sh /usr/local/bin/headquarter-entrypoint +RUN chmod +x /usr/local/bin/headquarter-entrypoint + +USER user +WORKDIR /home/user + +ENTRYPOINT ["/usr/local/bin/headquarter-entrypoint"] +CMD ["/bin/bash"] +``` + +The generated `entrypoint.sh`: + +```bash +#!/bin/bash +set -e + +# Run startup scripts +echo "Ensure workspace is owned by runtime user" +if [ -d /workspace ]; then + sudo chown -R user:user /workspace 2>/dev/null || true +fi + +# Pass through to the main command +exec "$@" +``` + +### 2. Compose File Generation + +The manifest compiler also generates the Compose file: + +```yaml +services: + app: + image: ${IMAGE_TAG} + container_name: ${INSTANCE_NAME} + stdin_open: true + tty: true + working_dir: /workspace + user: "1001:1001" # from manifest user.uid/gid + volumes: + - ${REPO_PATH}:/workspace + - ${SSH_PATH}:/home/user/.ssh:ro + - ${INSTANCE_DIR}/mounts/tmp_.pi_agents:/tmp/.pi/agents + - ${GIT_MOUNT_dotfiles}:/home/user/.pi + environment: + DEBIAN_FRONTEND: noninteractive + restart: unless-stopped +``` + +Variables are resolved at instance creation time: +- `${REPO_PATH}` → the repository working directory +- `${SSH_PATH}` → prepared SSH key directory +- `${INSTANCE_DIR}` → the instance working directory +- `${GIT_MOUNT_dotfiles}` → resolved from config profile git_mounts + +### 3. Permission Fixer (Post-Start) + +After `docker compose up`, the API iterates over the mount schema and applies permission policies: + +```python +for mount in manifest.mounts: + if mount.owner: + docker_exec(f"chown -R {mount.owner}:{mount.owner} {mount.target}") + if mount.mode: + docker_exec(f"chmod {mount.mode} {mount.target}") + if mount.file_mode: + docker_exec(f"find {mount.target} -type f -exec chmod {mount.file_mode} {{}} +") +``` + +This is **systematic and configurable** — not hardcoded to `/workspace`. + +--- + +## Config Profile Compatibility + +The existing ConfigProfile system provides: +- `environment_variables` → merged into compose `environment` +- `files` → written to instance dir, mounted via `volumes` +- `mounts` → appended to compose `volumes` +- `git_mounts` → resolved to host paths, appended to compose `volumes` +- `hints.start_command` → overrides `runtime.command` +- `hints.working_directory` → overrides `runtime.working_dir` + +With the manifest system, ConfigProfiles **extend** the default mount schema: + +1. Tool manifest defines the **default mount schema** (workspace, ssh, state) +2. ConfigProfile can add **additional mounts** or **override runtime hints** +3. Both are merged at instance-start time into the final compose file + +The merge precedence: +1. Tool manifest (defaults) +2. ToolConfig overrides (per-user per-tool settings) +3. ConfigProfile overrides (hierarchical, can inherit from parent) +4. User-provided start options (e.g. branch selection) + +--- + +## Base Image Definitions + +A base definition is itself a manifest with no `runtime` section: + +```yaml +# Base Definition: "ubuntu-24.04-dev" +name: ubuntu-24.04-dev +description: "Ubuntu 24.04 with build tools" +base_image: ubuntu:24.04 +packages: + apt: + - curl + - wget + - git + - build-essential + - ca-certificates +user: + name: user + uid: 1000 + gid: 1000 + create_home: true +``` + +A tool definition can reference it: + +```yaml +base_definition_id: "ubuntu-24.04-dev" +packages: + apt: + - neovim + - ranger + - tmux + node: + version: "20" +``` + +The compiler **merges** the base definition with the tool-specific overrides: +- Packages are **unioned** (base apt + tool apt) +- Scripts are **appended** (base build scripts, then tool build scripts) +- User/env are **overridden** (tool wins) + +This enables a family of tool types to share a common base. + +--- + +## Database Schema (Proposed) + +### New Table: `tool_definition_manifests` + +| Column | Type | Description | +|--------|------|-------------| +| `id` | UUID | PK | +| `name` | str | Unique identifier | +| `display_name` | str | Human-readable | +| `description` | str | | +| `category` | str | development, data-science, etc. | +| `interface_type` | enum | web, terminal | +| `base_image` | str | e.g. `ubuntu:24.04` | +| `base_definition_id` | UUID? | FK to another manifest | +| `manifest` | JSONB | The full manifest JSON | +| `dockerfile_cache` | TEXT | Last generated Dockerfile (for inspection) | +| `created_at` | datetime | | +| `updated_at` | datetime | | + +### Migration: `tool_types` table + +Add a nullable `manifest_id` column to `tool_types`. + +For backward compatibility: +- If `manifest_id` is set → use the new manifest system +- If `manifest_id` is null → fall back to `dockerfile_template` / `compose_template` + +A data migration converts existing pi-agent to the new manifest format. + +--- + +## API Changes + +### New Endpoints + +``` +GET /tool-definitions → list all base/tool definitions +GET /tool-definitions/{id} → get a definition +POST /tool-definitions → create a new definition +PUT /tool-definitions/{id} → update a definition +DELETE /tool-definitions/{id} → delete (if not in use) +POST /tool-definitions/{id}/compile → preview generated Dockerfile + compose +``` + +### Modified Endpoints + +``` +POST /tool-types → can now accept manifest_id instead of templates +GET /tool-types/{id} → includes manifest if available +``` + +### Frontend Changes + +New UI page: **Tool Workshop** + +- Base image selector (dropdown of existing bases or custom FROM) +- Package manager tabs (apt, npm, pip, etc.) +- Script editor (build vs startup) +- Mount schema designer (drag-drop or form) +- Live preview of generated Dockerfile +- Test build button (builds image and reports success/failure) + +--- + +## Open Questions + +1. **Should we support multi-stage builds?** + - Pros: smaller images, separation of build deps from runtime + - Cons: more complexity in the manifest schema + +2. **Should base definitions be versioned?** + - Pros: reproducible builds, safe updates + - Cons: more DB complexity + +3. **How do we handle binary build context files?** + - Current: JSON text in DB + - Option A: Store in filesystem, reference by path + - Option B: Upload to object storage (S3/minio) + +4. **Should generated images be cached/pushed to a registry?** + - Currently: built locally per instance + - Option: push to `headquarter/tools/{tool-name}:{hash}` for reuse + +--- + +## Risks + +| Risk | Severity | Mitigation | +|------|----------|------------| +| Migration complexity | Medium | Keep old fields nullable; gradual adoption | +| Build cache invalidation | Medium | Use deterministic Dockerfile generation; hash manifest for image tag | +| User confusion ("yet another abstraction") | Low | Provide live preview + "view generated Dockerfile" button | +| Scope creep into full CI/CD | High | Keep scope to container definition only; no pipeline/orchestration | +| Binary files in manifests | Medium | Limit build context to text; document workaround for binaries | + +--- + +## Effort Estimate + +| Phase | Files | Lines (est) | Complexity | +|-------|-------|-------------|------------| +| DB migration + models | 3 | 200 | Low | +| Manifest compiler (Dockerfile) | 2 | 400 | Medium | +| Manifest compiler (Compose) | 2 | 300 | Medium | +| Permission fixer refactor | 2 | 200 | Low | +| API endpoints | 3 | 400 | Medium | +| Frontend Tool Workshop | 8 | 1200 | High | +| Tests | 4 | 600 | Medium | +| **Total** | **24** | **~3300** | **High** | + +**Review workload forecast:** ~3300 lines is well above the 400-line budget. This should be split into **chained PRs**: +1. Backend: manifest schema, compiler, API (PR 1) +2. Frontend: Tool Workshop UI (PR 2) +3. Migration + data conversion (PR 3) + +--- + +## Next Recommended Phase + +**Design** — Detail the manifest JSON schema, compiler internals, and migration plan. + +Should I proceed to design? diff --git a/openspec/specs/tool-definition-manifest.md b/openspec/specs/tool-definition-manifest.md new file mode 100644 index 0000000..e8b81e5 --- /dev/null +++ b/openspec/specs/tool-definition-manifest.md @@ -0,0 +1,323 @@ +# Spec: Tool Definition Manifest System + +## Status +**Phase:** spec +**Date:** 2026-05-28 +**Owner:** el Gentleman +**Based on:** Proposal `streamline-tool-container-definitions` + +--- + +## Requirements + +### R1. Declarative Tool Definitions +Users must be able to define a tool container without writing Dockerfiles or Compose files. The definition is a structured manifest specifying base image, packages, scripts, mounts, and runtime configuration. + +### R2. Base Image Versioning +Base definitions must be versioned. Tool definitions reference a specific base version. Updating a base creates a new version; existing tools remain pinned to their version until explicitly updated. + +### R3. Package Managers +The manifest must support multiple package managers: `apt`, `npm` (global), `pip`, and `node` (version installation). + +### R4. Build vs Startup Scripts +Scripts are categorized by execution phase: +- **Build scripts**: Run during `docker build` (e.g., `git config`, config file setup) +- **Startup scripts**: Run when the container starts (e.g., permission fixes, dynamic setup) + +### R5. Mount Schema with Permission Policies +Mounts declare: +- `target`: Container path +- `source_type`: How the source is resolved (`repo`, `ssh_key`, `instance`, `git_mount`, `host_path`) +- `writable`: Whether the mount is read-write +- `owner`: Container user to own the target path (post-start chown) +- `mode`: Directory permissions (post-start chmod) +- `file_mode`: File permissions inside the directory +- `readonly`: Whether mounted read-only in compose + +### R6. Config Profile Compatibility +ConfigProfiles continue to add `env`, `files`, `mounts`, and `git_mounts` on top of the manifest defaults. The merge precedence is: manifest defaults → ToolConfig → ConfigProfile → user options. + +### R7. Backward Compatibility +Existing `dockerfile_template` and `compose_template` columns remain functional. New tool types use the manifest system; old types continue to work. A data migration converts the existing pi-agent to the new format. + +### R8. Local Builds +Images are built locally per instance using the standard `docker build` command. No registry integration in this phase. + +### R9. Live Preview +The API provides a `compile` endpoint that returns the generated Dockerfile and Compose file without building. + +### R10. Deterministic Image Tags +The image tag is derived from a hash of the manifest content, enabling build cache reuse when the manifest hasn't changed. + +--- + +## Scenarios + +### S1. Creating a New Tool Definition + +**Given** a user on the Tool Workshop page +**When** they select base "ubuntu-24.04-dev:v1", add packages `[neovim, tmux]`, add a build script for git config, and define mounts for workspace + ssh +**Then** the system generates a manifest, compiles a Dockerfile + Compose preview, and upon save stores the manifest in the database. + +### S2. Building an Instance from a Manifest + +**Given** a tool instance created from a manifest-based tool type +**When** `start_instance` is called +**Then** the API compiles the manifest to a Dockerfile, builds the image, generates the Compose file with resolved mount paths, starts the container, and applies permission policies post-start. + +### S3. Permission Fix on Non-Root Containers + +**Given** a manifest with `user: {name: user, uid: 1001}` and a mount `target: /workspace, owner: user` +**When** the container starts with the workspace bind-mounted from host (root-owned) +**Then** the post-start permission fixer runs `docker exec --user root chown -R user:user /workspace`, making the directory writable for the container user. + +### S4. SSH Key Mount for Non-Root User + +**Given** a manifest with a mount `target: /home/user/.ssh, source_type: ssh_key, mode: "0700"` +**When** the container starts +**Then** SSH keys are mounted from the instance `.ssh` directory to `/home/user/.ssh`, and post-start fixes permissions to `0700` for the directory and `0600` for key files. + +### S5. Config Profile Extends Manifest + +**Given** a manifest with default mount `workspace: /workspace` and a ConfigProfile that adds `git_mounts: [{remote_url: "...", target_path: "/home/user/.config"}]` +**When** the instance starts with that profile selected +**Then** the final Compose includes both the workspace mount and the config git mount, merged in the correct precedence. + +### S6. Base Version Pinning + +**Given** a tool definition referencing `base_definition_id: "ubuntu-24.04-dev", base_version: "v1"` +**When** the base definition is updated to "v2" +**Then** the tool definition continues to use "v1" until explicitly updated. New tool definitions default to the latest version. + +### S7. Deterministic Image Tag + +**Given** a manifest with specific packages and scripts +**When** compiled +**Then** the generated image tag is `headquarter/{tool-name}-{manifest-hash}:latest`, and rebuilding the same manifest reuses the cached image layer. + +### S8. Live Preview Without Build + +**Given** a manifest being edited +**When** the user clicks "Preview" +**Then** the API returns the generated Dockerfile and Compose file within 500ms, without invoking Docker. + +--- + +## Acceptance Criteria + +### A1. Manifest Schema Validation +- [ ] The manifest JSON must validate against a defined JSON Schema +- [ ] Invalid manifests return 400 with detailed field-level errors +- [ ] Missing required fields (name, base_image or base_definition_id) are rejected + +### A2. Dockerfile Compilation +- [ ] Generated Dockerfile builds successfully with `docker build` +- [ ] Build scripts appear as `RUN` commands in order +- [ ] Startup scripts appear in the generated entrypoint script +- [ ] Packages are installed in a single layer per package manager +- [ ] User creation uses the declared uid/gid + +### A3. Compose Compilation +- [ ] Generated Compose file starts successfully with `docker compose up` +- [ ] Mounts are resolved from `source_type` to actual host paths +- [ ] `stdin_open` and `tty` are set for terminal interface types +- [ ] Ports are only included for web interface types + +### A4. Permission Fixer +- [ ] Post-start chown runs for all mounts with an `owner` declared +- [ ] Post-start chmod runs for all mounts with `mode` or `file_mode` declared +- [ ] Permission fixes complete within 5 seconds of container start +- [ ] If the container has no `root` user, permission fixes are skipped with a warning + +### A5. Config Profile Merge +- [ ] ConfigProfile env vars override manifest defaults +- [ ] ConfigProfile mounts are appended to manifest mounts +- [ ] ConfigProfile git_mounts are resolved and appended +- [ ] ToolConfig values override both manifest and ConfigProfile + +### A6. Backward Compatibility +- [ ] Existing tool types with `dockerfile_template` continue to work +- [ ] Existing tool types with `compose_template` continue to work +- [ ] The pi-agent tool type is migrated to the new manifest format +- [ ] Old and new tool types can coexist in the same project + +### A7. Base Versioning +- [ ] Base definitions store a version string +- [ ] Tool definitions store the base version they reference +- [ ] Updating a base creates a new version; old versions remain accessible +- [ ] The "latest" version can be referenced explicitly or by omission + +### A8. Image Tag Determinism +- [ ] Same manifest produces the same image tag +- [ ] Changing any field (package, script, env) produces a different tag +- [ ] The tag is lowercased and valid as a Docker image reference + +### A9. API Endpoints +- [ ] `POST /tool-definitions` creates a definition (201) +- [ ] `GET /tool-definitions/{id}` returns the definition with compiled preview +- [ ] `POST /tool-definitions/{id}/compile` returns Dockerfile + Compose (no build) +- [ ] `PUT /tool-definitions/{id}` updates and re-validates + +### A10. Frontend Tool Workshop +- [ ] Users can create a tool definition via form (no raw JSON editing required) +- [ ] Live preview shows generated Dockerfile and Compose +- [ ] Package lists support add/remove/reorder +- [ ] Mount schema supports add/remove with visual feedback +- [ ] Base image selector shows available versions + +--- + +## Non-Goals + +- **Multi-stage builds** — Out of scope for this phase. The compiler generates single-stage Dockerfiles. +- **Docker registry integration** — Images are built locally per instance. +- **Binary build context files** — Build context is limited to text files stored in the DB. +- **Custom Dockerfile editing** — Users work exclusively through the manifest; no raw Dockerfile editing. +- **Container orchestration beyond Compose** — No Kubernetes, Swarm, or other orchestrators. +- **Real-time collaborative editing** — Tool Workshop is single-user editing. + +--- + +## API Contract + +### POST /tool-definitions + +**Request:** +```json +{ + "name": "pi-agent", + "display_name": "Pi Agent", + "description": "Terminal coding harness", + "category": "development", + "interface_type": "terminal", + "base_image": "ubuntu:24.04", + "packages": { + "apt": ["curl", "git", "neovim", "tmux"], + "node": {"version": "20"}, + "npm_global": ["@earendil-works/pi-coding-agent"] + }, + "user": { + "name": "user", + "uid": 1001, + "gid": 1001, + "create_home": true, + "shell": "/bin/bash" + }, + "env": {"DEBIAN_FRONTEND": "noninteractive"}, + "scripts": { + "build": [ + "git config --global init.defaultBranch main", + "mkdir -p /home/user/.config/ranger" + ], + "startup": [ + "if [ -d /workspace ]; then sudo chown -R user:user /workspace; fi" + ] + }, + "mounts": [ + { + "name": "workspace", + "target": "/workspace", + "source_type": "repo", + "writable": true, + "owner": "user" + }, + { + "name": "ssh", + "target": "/home/user/.ssh", + "source_type": "ssh_key", + "mode": "0700", + "file_mode": "0600", + "readonly": true + } + ], + "runtime": { + "command": ["/bin/bash"], + "stdin_open": true, + "tty": true, + "working_dir": "/workspace" + } +} +``` + +**Response (201):** +```json +{ + "id": "d07b8376-2151-4119-8c1d-27f792aae9a3", + "name": "pi-agent", + "display_name": "Pi Agent", + "manifest": { ... }, + "dockerfile_preview": "FROM ubuntu:24.04\n...", + "compose_preview": "services:\n app:\n image: ...", + "created_at": "2026-05-28T10:00:00Z" +} +``` + +### POST /tool-definitions/{id}/compile + +**Response (200):** +```json +{ + "dockerfile": "FROM ubuntu:24.04\n...", + "compose": "services:\n app:\n...", + "image_tag": "headquarter/pi-agent-a3f7c2d9:latest", + "mounts_resolved": [ + {"name": "workspace", "source": "/data/repos/headquarter", "target": "/workspace"} + ] +} +``` + +--- + +## Database Schema + +### `tool_definition_manifests` + +| Column | Type | Constraints | +|--------|------|-------------| +| `id` | UUID | PK | +| `name` | VARCHAR(64) | UNIQUE, NOT NULL | +| `display_name` | VARCHAR(128) | NOT NULL | +| `description` | TEXT | | +| `category` | VARCHAR(64) | | +| `interface_type` | VARCHAR(16) | CHECK IN ('web', 'terminal') | +| `base_image` | VARCHAR(256) | | +| `base_definition_id` | UUID | FK → `tool_definition_manifests.id` | +| `base_version` | VARCHAR(32) | DEFAULT 'latest' | +| `manifest` | JSONB | NOT NULL | +| `dockerfile_cache` | TEXT | | +| `compose_cache` | TEXT | | +| `version` | VARCHAR(32) | DEFAULT 'v1' | +| `is_base` | BOOLEAN | DEFAULT FALSE | +| `created_by_id` | UUID | FK → `users.id` | +| `created_at` | TIMESTAMPTZ | DEFAULT now() | +| `updated_at` | TIMESTAMPTZ | DEFAULT now() | + +**Check constraint:** Exactly one of `base_image` or `base_definition_id` must be set. + +### Alter `tool_types` + +```sql +ALTER TABLE tool_types + ADD COLUMN manifest_id UUID REFERENCES tool_definition_manifests(id), + ADD COLUMN definition_type VARCHAR(16) DEFAULT 'legacy'; -- 'legacy' | 'manifest' +``` + +### Alter `tool_instances` + +```sql +ALTER TABLE tool_instances + ADD COLUMN manifest_compiled_at TIMESTAMPTZ, + ADD COLUMN image_tag VARCHAR(256); +``` + +--- + +## Related Files + +- `apps/api/src/models/tool_definition_manifest.py` — New model +- `apps/api/src/models/tool_type.py` — Add manifest_id, definition_type +- `apps/api/src/services/manifest_compiler.py` — New compiler +- `apps/api/src/services/permission_fixer.py` — Refactored mount policy applier +- `apps/api/src/api/tool_definitions.py` — New endpoints +- `apps/api/src/api/tool_instances.py` — Modified start_instance flow +- `apps/api/alembic/versions/20260528_add_tool_definition_manifests.py` — Migration diff --git a/openspec/tasks/tool-definition-manifest.md b/openspec/tasks/tool-definition-manifest.md new file mode 100644 index 0000000..ae5bd1f --- /dev/null +++ b/openspec/tasks/tool-definition-manifest.md @@ -0,0 +1,89 @@ +# Tasks: Tool Definition Manifest System + +## PR 1: Backend Manifest System + +### T1.1 Database Migration +- [ ] Create `tool_definition_manifests` table +- [ ] Add `manifest_id`, `definition_type` to `tool_types` +- [ ] Add `manifest_compiled_at`, `image_tag` to `tool_instances` +- [ ] Data migration: convert pi-agent to manifest + +### T1.2 Models +- [ ] `ToolDefinitionManifest` SQLAlchemy model +- [ ] Update `ToolType` model with manifest relationship +- [ ] Update `ToolInstance` model with image_tag + +### T1.3 Manifest Compiler +- [ ] `resolve_base()` — deep merge base + tool manifest +- [ ] `compile_dockerfile()` — generate Dockerfile from manifest +- [ ] `compile_entrypoint()` — generate startup entrypoint script +- [ ] `compile_compose()` — generate Compose from manifest +- [ ] `compute_image_tag()` — deterministic hash-based tag +- [ ] `resolve_mount_source()` — mount source resolution + +### T1.4 Permission Fixer +- [ ] `apply_mount_permissions()` — post-start chown/chmod +- [ ] Handle missing root user gracefully +- [ ] Timeout and error reporting + +### T1.5 API Endpoints +- [ ] `POST /tool-definitions` — create +- [ ] `GET /tool-definitions` — list +- [ ] `GET /tool-definitions/{id}` — get +- [ ] `PUT /tool-definitions/{id}` — update +- [ ] `DELETE /tool-definitions/{id}` — delete +- [ ] `POST /tool-definitions/{id}/compile` — preview + +### T1.6 Modified Startup Flow +- [ ] Update `start_instance` to use manifest when `definition_type == "manifest"` +- [ ] Integrate permission fixer post-start +- [ ] Store image_tag on instance for reuse + +### T1.7 Tests +- [ ] Unit: manifest compiler (all package managers, base merge) +- [ ] Unit: permission fixer (success, failure, timeout) +- [ ] Unit: mount resolution (all source types) +- [ ] Integration: manifest → build → start → terminal works +- [ ] Integration: legacy tool types still work + +--- + +## PR 2: Frontend Tool Workshop + +### T2.1 Tool Definitions API Client +- [ ] Add tool definition endpoints to `client.ts` +- [ ] Type definitions for manifest schema + +### T2.2 Tool Workshop Page +- [ ] Base image selector (with version dropdown) +- [ ] Package manager editors (apt list, npm list, node version) +- [ ] Script editors (build vs startup, tabbed) +- [ ] Mount schema designer (form table with add/remove) +- [ ] Runtime config (command, working_dir, stdin_open, tty) + +### T2.3 Live Preview +- [ ] Preview panel showing generated Dockerfile +- [ ] Preview panel showing generated Compose +- [ ] "Compile" button calling API preview endpoint + +### T2.4 Tool Definitions List +- [ ] Table view of all definitions +- [ ] Create / Edit / Delete actions +- [ ] Base indicator (shows if it's a base definition) + +--- + +## PR 3: Migration & Legacy Fallback + +### T3.1 Data Migration +- [ ] Alembic migration creating base definition + pi-agent manifest +- [ ] Update existing pi-agent tool_type row + +### T3.2 Legacy Fallback +- [ ] Ensure `definition_type == "legacy"` still uses old flow +- [ ] Ensure `dockerfile_template` / `compose_template` still work +- [ ] Tests for legacy path + +### T3.3 Documentation +- [ ] Update API docs +- [ ] Add Tool Workshop user guide From e46b4f924929bb6542c1abb32d1307c9a1d842f7 Mon Sep 17 00:00:00 2001 From: Alex Blank Date: Thu, 28 May 2026 14:35:04 +0200 Subject: [PATCH 2/3] feat: Tool Workshop manifest editor (PR 2) - Add tool_definitions API client with types for manifests - Add ManifestEditor component: base image selector, package editors (apt/npm/pip/node), script editors (build/startup), mount schema designer, runtime config, and live preview panel - Integrate ManifestEditor into Tool Workshop as 'Manifest (Declarative)' definition type alongside Compose and Dockerfile - Update ToolType API types to include manifest_id and 'manifest' definition_type - Frontend builds clean, TypeScript typecheck passes --- ...026_05_28_add_tool_definition_manifests.py | 12 +- apps/web/.pi-lens/cache/review-graph.json | 1 + apps/web/src/api/tool_definitions.ts | 108 + apps/web/src/api/tool_types.ts | 136 +- apps/web/src/components/manifest-editor.tsx | 849 ++++ apps/web/src/pages/tool-workshop.tsx | 3424 ++++++++++------- 6 files changed, 3006 insertions(+), 1524 deletions(-) create mode 100644 apps/web/.pi-lens/cache/review-graph.json create mode 100644 apps/web/src/api/tool_definitions.ts create mode 100644 apps/web/src/components/manifest-editor.tsx diff --git a/apps/api/alembic/versions/2026_05_28_add_tool_definition_manifests.py b/apps/api/alembic/versions/2026_05_28_add_tool_definition_manifests.py index bdb5884..b4ec709 100644 --- a/apps/api/alembic/versions/2026_05_28_add_tool_definition_manifests.py +++ b/apps/api/alembic/versions/2026_05_28_add_tool_definition_manifests.py @@ -94,7 +94,9 @@ def upgrade() -> None: op.drop_constraint("chk_definition_type", "tool_types", type_="check") op.execute("ALTER TABLE tool_types ALTER COLUMN definition_type TYPE VARCHAR(16)") - op.execute("ALTER TABLE tool_types ALTER COLUMN definition_type SET DEFAULT 'legacy'") + op.execute( + "ALTER TABLE tool_types ALTER COLUMN definition_type SET DEFAULT 'legacy'" + ) # ── Add columns to tool_instances ──────────────────────────────── result = conn.execute( @@ -106,7 +108,9 @@ def upgrade() -> None: if not result.fetchone(): op.add_column( "tool_instances", - sa.Column("manifest_compiled_at", sa.TIMESTAMP(timezone=True), nullable=True), + sa.Column( + "manifest_compiled_at", sa.TIMESTAMP(timezone=True), nullable=True + ), ) result = conn.execute( @@ -369,7 +373,9 @@ CMD ["/bin/bash"] op.drop_column("tool_instances", "manifest_compiled_at") if has_manifest_id: - op.drop_constraint("fk_tool_types_manifest_id", "tool_types", type_="foreignkey") + op.drop_constraint( + "fk_tool_types_manifest_id", "tool_types", type_="foreignkey" + ) op.drop_column("tool_types", "manifest_id") op.drop_table("tool_definition_manifests") diff --git a/apps/web/.pi-lens/cache/review-graph.json b/apps/web/.pi-lens/cache/review-graph.json new file mode 100644 index 0000000..9f71352 --- /dev/null +++ b/apps/web/.pi-lens/cache/review-graph.json @@ -0,0 +1 @@ +{"version":"v2","builtAt":"2026-05-28T11:55:01.908Z","signature":"/home/alex/projects/headquarter/apps/web/.eslintrc.cjs:368:1779050260295.8674|/home/alex/projects/headquarter/apps/web/src/api/client.ts:1626:1779958621197.4604|/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:3739:1779478139563.111|/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts:2502:1779469007691.0808|/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts:4079:1779873890492.833|/home/alex/projects/headquarter/apps/web/src/api/dashboard.ts:350:1779050260296.2366|/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:7403:1779884227739.155|/home/alex/projects/headquarter/apps/web/src/api/profile.ts:880:1779051171239.6877|/home/alex/projects/headquarter/apps/web/src/api/projects.ts:1276:1779050260296.2366|/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:4795:1779958621198.4604|/home/alex/projects/headquarter/apps/web/src/api/settings.ts:781:1779283023155.8516|/home/alex/projects/headquarter/apps/web/src/api/ssh_keys.ts:1368:1779486648673.2014|/home/alex/projects/headquarter/apps/web/src/api/tool_configs.ts:2094:1779468979582.398|/home/alex/projects/headquarter/apps/web/src/api/tool_definitions.ts:2540:1779969046480.7527|/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:6355:1779478139563.111|/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts:2795:1779970190986.5713|/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx:4715:1779700778730.3628|/home/alex/projects/headquarter/apps/web/src/components/code-editor.tsx:1361:1779199463974.141|/home/alex/projects/headquarter/apps/web/src/components/commit-dialog.tsx:4363:1779211094143.865|/home/alex/projects/headquarter/apps/web/src/components/commit-panel.tsx:2707:1779195365883.247|/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:17540:1779645590026.5527|/home/alex/projects/headquarter/apps/web/src/components/data-states.tsx:762:1779710790599.268|/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:6466:1779211175763.9336|/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:7688:1779888860314.6736|/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:8063:1779483719123.56|/home/alex/projects/headquarter/apps/web/src/components/icon.tsx:2806:1779912877496.9204|/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:17415:1779650970344.7566|/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:26028:1779969298902.8604|/home/alex/projects/headquarter/apps/web/src/components/merge-dialog.tsx:3865:1779211039223.4932|/home/alex/projects/headquarter/apps/web/src/components/mobile-action-sheet.tsx:2203:1779699728563.322|/home/alex/projects/headquarter/apps/web/src/components/mobile-detail-view.tsx:2583:1779703873671.9841|/home/alex/projects/headquarter/apps/web/src/components/mobile-edit-view.tsx:5046:1779958621198.4604|/home/alex/projects/headquarter/apps/web/src/components/mobile-fab.tsx:385:1779703895033.7395|/home/alex/projects/headquarter/apps/web/src/components/mobile-list-view.tsx:2164:1779958621198.4604|/home/alex/projects/headquarter/apps/web/src/components/mobile-nav.tsx:2620:1779703154443.2212|/home/alex/projects/headquarter/apps/web/src/components/mobile-page-header.tsx:885:1779700188704.066|/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-header.tsx:2658:1779626577162.5774|/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-wrapper.tsx:3626:1779626567953.6814|/home/alex/projects/headquarter/apps/web/src/components/protected-route.test.tsx:1320:1779050260297.322|/home/alex/projects/headquarter/apps/web/src/components/protected-route.tsx:546:1779050260297.322|/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:3989:1779474860196.355|/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.tsx:2935:1779474860212.3547|/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:11360:1779485424989.0652|/home/alex/projects/headquarter/apps/web/src/components/session-card.tsx:11045:1779700843613.6272|/home/alex/projects/headquarter/apps/web/src/components/session-list.tsx:3783:1779624338276.7373|/home/alex/projects/headquarter/apps/web/src/components/settings-tab-layout.tsx:963:1779196943685.3203|/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx:3034:1779619372214.5903|/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx:2641:1779700587192.5288|/home/alex/projects/headquarter/apps/web/src/components/syntax-highlighter.tsx:1925:1779211122539.5408|/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:17778:1779958621198.4604|/home/alex/projects/headquarter/apps/web/src/components/tools-bottom-sheet.tsx:1667:1779703959646|/home/alex/projects/headquarter/apps/web/src/components/workspace-header.tsx:1337:1779210479843.7842|/home/alex/projects/headquarter/apps/web/src/hooks/use-async-data.ts:1029:1779708947297.703|/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts:1449:1779614194650.1113|/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts:4595:1779711443685.635|/home/alex/projects/headquarter/apps/web/src/hooks/use-mobile-viewport.ts:550:1779614165882.4216|/home/alex/projects/headquarter/apps/web/src/hooks/use-special-keys.ts:4159:1779619315924.23|/home/alex/projects/headquarter/apps/web/src/hooks/use-theme.ts:633:1779112495652.6404|/home/alex/projects/headquarter/apps/web/src/hooks/use-virtual-keyboard.ts:2021:1779614180923.2595|/home/alex/projects/headquarter/apps/web/src/main.tsx:550:1779216096682.4463|/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:48869:1779958621207.4604|/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:2355:1779711297334.298|/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:9442:1779958621208.4604|/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx:8308:1779958621208.4604|/home/alex/projects/headquarter/apps/web/src/pages/git-repositories.tsx:4121:1779711297335.0742|/home/alex/projects/headquarter/apps/web/src/pages/placeholder.tsx:1118:1779711297335.2217|/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx:5558:1779958621208.4604|/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx:4383:1779711297335.5564|/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:6046:1779711297335.7217|/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:7064:1779711297335.9092|/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:17194:1779711297336.0974|/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:7904:1779958621208.4604|/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx:5483:1779958621208.4604|/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:9795:1779958621208.4604|/home/alex/projects/headquarter/apps/web/src/pages/terminal.tsx:1289:1779711297337.0588|/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:14350:1779711297338.2292|/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:61554:1779970269083.6685|/home/alex/projects/headquarter/apps/web/src/router.tsx:2635:1779647089669.214|/home/alex/projects/headquarter/apps/web/src/state/auth.tsx:1666:1779050260297.5068|/home/alex/projects/headquarter/apps/web/src/state/sessions.tsx:1164:1779277256559.1477|/home/alex/projects/headquarter/apps/web/src/test/setup.ts:43:1779050260297.5068|/home/alex/projects/headquarter/apps/web/src/types.ts:308:1779051155846.8645|/home/alex/projects/headquarter/apps/web/src/utils/errors.ts:428:1779708863270.6814|/home/alex/projects/headquarter/apps/web/src/utils/icons.ts:2632:1779217560829.7283|/home/alex/projects/headquarter/apps/web/src/utils/language.ts:1815:1779199128936.8345|/home/alex/projects/headquarter/apps/web/vite.config.ts:246:1779050260297.5068","fileSignatures":[["/home/alex/projects/headquarter/apps/web/.eslintrc.cjs","368:1779050260295.8674"],["/home/alex/projects/headquarter/apps/web/src/api/client.ts","1626:1779958621197.4604"],["/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts","3739:1779478139563.111"],["/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts","2502:1779469007691.0808"],["/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts","4079:1779873890492.833"],["/home/alex/projects/headquarter/apps/web/src/api/dashboard.ts","350:1779050260296.2366"],["/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","7403:1779884227739.155"],["/home/alex/projects/headquarter/apps/web/src/api/profile.ts","880:1779051171239.6877"],["/home/alex/projects/headquarter/apps/web/src/api/projects.ts","1276:1779050260296.2366"],["/home/alex/projects/headquarter/apps/web/src/api/sessions.ts","4795:1779958621198.4604"],["/home/alex/projects/headquarter/apps/web/src/api/settings.ts","781:1779283023155.8516"],["/home/alex/projects/headquarter/apps/web/src/api/ssh_keys.ts","1368:1779486648673.2014"],["/home/alex/projects/headquarter/apps/web/src/api/tool_configs.ts","2094:1779468979582.398"],["/home/alex/projects/headquarter/apps/web/src/api/tool_definitions.ts","2540:1779969046480.7527"],["/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts","6355:1779478139563.111"],["/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts","2795:1779970190986.5713"],["/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx","4715:1779700778730.3628"],["/home/alex/projects/headquarter/apps/web/src/components/code-editor.tsx","1361:1779199463974.141"],["/home/alex/projects/headquarter/apps/web/src/components/commit-dialog.tsx","4363:1779211094143.865"],["/home/alex/projects/headquarter/apps/web/src/components/commit-panel.tsx","2707:1779195365883.247"],["/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx","17540:1779645590026.5527"],["/home/alex/projects/headquarter/apps/web/src/components/data-states.tsx","762:1779710790599.268"],["/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx","6466:1779211175763.9336"],["/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx","7688:1779888860314.6736"],["/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx","8063:1779483719123.56"],["/home/alex/projects/headquarter/apps/web/src/components/icon.tsx","2806:1779912877496.9204"],["/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx","17415:1779650970344.7566"],["/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx","26028:1779969298902.8604"],["/home/alex/projects/headquarter/apps/web/src/components/merge-dialog.tsx","3865:1779211039223.4932"],["/home/alex/projects/headquarter/apps/web/src/components/mobile-action-sheet.tsx","2203:1779699728563.322"],["/home/alex/projects/headquarter/apps/web/src/components/mobile-detail-view.tsx","2583:1779703873671.9841"],["/home/alex/projects/headquarter/apps/web/src/components/mobile-edit-view.tsx","5046:1779958621198.4604"],["/home/alex/projects/headquarter/apps/web/src/components/mobile-fab.tsx","385:1779703895033.7395"],["/home/alex/projects/headquarter/apps/web/src/components/mobile-list-view.tsx","2164:1779958621198.4604"],["/home/alex/projects/headquarter/apps/web/src/components/mobile-nav.tsx","2620:1779703154443.2212"],["/home/alex/projects/headquarter/apps/web/src/components/mobile-page-header.tsx","885:1779700188704.066"],["/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-header.tsx","2658:1779626577162.5774"],["/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-wrapper.tsx","3626:1779626567953.6814"],["/home/alex/projects/headquarter/apps/web/src/components/protected-route.test.tsx","1320:1779050260297.322"],["/home/alex/projects/headquarter/apps/web/src/components/protected-route.tsx","546:1779050260297.322"],["/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx","3989:1779474860196.355"],["/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.tsx","2935:1779474860212.3547"],["/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx","11360:1779485424989.0652"],["/home/alex/projects/headquarter/apps/web/src/components/session-card.tsx","11045:1779700843613.6272"],["/home/alex/projects/headquarter/apps/web/src/components/session-list.tsx","3783:1779624338276.7373"],["/home/alex/projects/headquarter/apps/web/src/components/settings-tab-layout.tsx","963:1779196943685.3203"],["/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx","3034:1779619372214.5903"],["/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx","2641:1779700587192.5288"],["/home/alex/projects/headquarter/apps/web/src/components/syntax-highlighter.tsx","1925:1779211122539.5408"],["/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","17778:1779958621198.4604"],["/home/alex/projects/headquarter/apps/web/src/components/tools-bottom-sheet.tsx","1667:1779703959646"],["/home/alex/projects/headquarter/apps/web/src/components/workspace-header.tsx","1337:1779210479843.7842"],["/home/alex/projects/headquarter/apps/web/src/hooks/use-async-data.ts","1029:1779708947297.703"],["/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts","1449:1779614194650.1113"],["/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts","4595:1779711443685.635"],["/home/alex/projects/headquarter/apps/web/src/hooks/use-mobile-viewport.ts","550:1779614165882.4216"],["/home/alex/projects/headquarter/apps/web/src/hooks/use-special-keys.ts","4159:1779619315924.23"],["/home/alex/projects/headquarter/apps/web/src/hooks/use-theme.ts","633:1779112495652.6404"],["/home/alex/projects/headquarter/apps/web/src/hooks/use-virtual-keyboard.ts","2021:1779614180923.2595"],["/home/alex/projects/headquarter/apps/web/src/main.tsx","550:1779216096682.4463"],["/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","48869:1779958621207.4604"],["/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx","2355:1779711297334.298"],["/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx","9442:1779958621208.4604"],["/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx","8308:1779958621208.4604"],["/home/alex/projects/headquarter/apps/web/src/pages/git-repositories.tsx","4121:1779711297335.0742"],["/home/alex/projects/headquarter/apps/web/src/pages/placeholder.tsx","1118:1779711297335.2217"],["/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx","5558:1779958621208.4604"],["/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx","4383:1779711297335.5564"],["/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx","6046:1779711297335.7217"],["/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx","7064:1779711297335.9092"],["/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","17194:1779711297336.0974"],["/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx","7904:1779958621208.4604"],["/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx","5483:1779958621208.4604"],["/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx","9795:1779958621208.4604"],["/home/alex/projects/headquarter/apps/web/src/pages/terminal.tsx","1289:1779711297337.0588"],["/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","14350:1779711297338.2292"],["/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","61554:1779970269083.6685"],["/home/alex/projects/headquarter/apps/web/src/router.tsx","2635:1779647089669.214"],["/home/alex/projects/headquarter/apps/web/src/state/auth.tsx","1666:1779050260297.5068"],["/home/alex/projects/headquarter/apps/web/src/state/sessions.tsx","1164:1779277256559.1477"],["/home/alex/projects/headquarter/apps/web/src/test/setup.ts","43:1779050260297.5068"],["/home/alex/projects/headquarter/apps/web/src/types.ts","308:1779051155846.8645"],["/home/alex/projects/headquarter/apps/web/src/utils/errors.ts","428:1779708863270.6814"],["/home/alex/projects/headquarter/apps/web/src/utils/icons.ts","2632:1779217560829.7283"],["/home/alex/projects/headquarter/apps/web/src/utils/language.ts","1815:1779199128936.8345"],["/home/alex/projects/headquarter/apps/web/vite.config.ts","246:1779050260297.5068"]],"nodes":[["file:/home/alex/projects/headquarter/apps/web/.eslintrc.cjs",{"id":"file:/home/alex/projects/headquarter/apps/web/.eslintrc.cjs","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/.eslintrc.cjs","metadata":{"lineCount":17,"featureKind":"library","trustBoundaries":[]}}],["file:/home/alex/projects/headquarter/apps/web/src/api/client.ts",{"id":"file:/home/alex/projects/headquarter/apps/web/src/api/client.ts","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/client.ts","metadata":{"lineCount":52,"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["external:axios",{"id":"external:axios","kind":"external","language":"jsts","metadata":{"source":"axios"}}],["/home/alex/projects/headquarter/apps/web/src/api/client.ts:shouldSkipAuthRedirect",{"id":"/home/alex/projects/headquarter/apps/web/src/api/client.ts:shouldSkipAuthRedirect","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/client.ts","symbolName":"shouldSkipAuthRedirect","symbolKind":"function","exported":true,"metadata":{"line":13,"column":39,"cyclomaticComplexity":2,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["network","external-api","serialization","auth","user-input"]}}],["external:path.startsWith",{"id":"external:path.startsWith","kind":"external","language":"jsts","metadata":{"unresolvedName":"path.startsWith"}}],["/home/alex/projects/headquarter/apps/web/src/api/client.ts:",{"id":"/home/alex/projects/headquarter/apps/web/src/api/client.ts:","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/client.ts","symbolName":"","symbolKind":"function","exported":false,"metadata":{"line":26,"column":3,"cyclomaticComplexity":8,"maxNestingDepth":2,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["symbol-name:shouldSkipAuthRedirect",{"id":"symbol-name:shouldSkipAuthRedirect","kind":"symbol","language":"jsts","symbolName":"shouldSkipAuthRedirect","metadata":{"unresolvedName":"shouldSkipAuthRedirect"}}],["external:window.location.assign",{"id":"external:window.location.assign","kind":"external","language":"jsts","metadata":{"unresolvedName":"window.location.assign"}}],["external:Promise.reject",{"id":"external:Promise.reject","kind":"external","language":"jsts","metadata":{"unresolvedName":"Promise.reject"}}],["external:error.message?.includes",{"id":"external:error.message?.includes","kind":"external","language":"jsts","metadata":{"unresolvedName":"error.message?.includes"}}],["external:retryCount.get",{"id":"external:retryCount.get","kind":"external","language":"jsts","metadata":{"unresolvedName":"retryCount.get"}}],["external:retryCount.set",{"id":"external:retryCount.set","kind":"external","language":"jsts","metadata":{"unresolvedName":"retryCount.set"}}],["symbol-name:setTimeout",{"id":"symbol-name:setTimeout","kind":"symbol","language":"jsts","symbolName":"setTimeout","metadata":{"unresolvedName":"setTimeout"}}],["symbol-name:apiClient",{"id":"symbol-name:apiClient","kind":"symbol","language":"jsts","symbolName":"apiClient","metadata":{"unresolvedName":"apiClient"}}],["file:/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts",{"id":"file:/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts","metadata":{"lineCount":132,"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["external:vitest",{"id":"external:vitest","kind":"external","language":"jsts","metadata":{"source":"vitest"}}],["file:/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts",{"id":"file:/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts","metadata":{"lineCount":96,"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:",{"id":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts","symbolName":"","symbolKind":"function","exported":false,"metadata":{"line":123,"column":26,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["symbol-name:describe",{"id":"symbol-name:describe","kind":"symbol","language":"jsts","symbolName":"describe","metadata":{"unresolvedName":"describe"}}],["symbol-name:it",{"id":"symbol-name:it","kind":"symbol","language":"jsts","symbolName":"it","metadata":{"unresolvedName":"it"}}],["external:mockGet.mockResolvedValue",{"id":"external:mockGet.mockResolvedValue","kind":"external","language":"jsts","metadata":{"unresolvedName":"mockGet.mockResolvedValue"}}],["symbol-name:listConfigFolders",{"id":"symbol-name:listConfigFolders","kind":"symbol","language":"jsts","symbolName":"listConfigFolders","metadata":{"unresolvedName":"listConfigFolders"}}],["external:expect(result[0].name).toBe",{"id":"external:expect(result[0].name).toBe","kind":"external","language":"jsts","metadata":{"unresolvedName":"expect(result[0].name).toBe"}}],["symbol-name:expect",{"id":"symbol-name:expect","kind":"symbol","language":"jsts","symbolName":"expect","metadata":{"unresolvedName":"expect"}}],["external:expect(result[0].files).toEqual",{"id":"external:expect(result[0].files).toEqual","kind":"external","language":"jsts","metadata":{"unresolvedName":"expect(result[0].files).toEqual"}}],["external:expect(mockGet).toHaveBeenCalledWith",{"id":"external:expect(mockGet).toHaveBeenCalledWith","kind":"external","language":"jsts","metadata":{"unresolvedName":"expect(mockGet).toHaveBeenCalledWith"}}],["external:mockPost.mockResolvedValue",{"id":"external:mockPost.mockResolvedValue","kind":"external","language":"jsts","metadata":{"unresolvedName":"mockPost.mockResolvedValue"}}],["symbol-name:createConfigFolder",{"id":"symbol-name:createConfigFolder","kind":"symbol","language":"jsts","symbolName":"createConfigFolder","metadata":{"unresolvedName":"createConfigFolder"}}],["external:expect(result.name).toBe",{"id":"external:expect(result.name).toBe","kind":"external","language":"jsts","metadata":{"unresolvedName":"expect(result.name).toBe"}}],["external:expect(mockPost).toHaveBeenCalledWith",{"id":"external:expect(mockPost).toHaveBeenCalledWith","kind":"external","language":"jsts","metadata":{"unresolvedName":"expect(mockPost).toHaveBeenCalledWith"}}],["external:expect.objectContaining",{"id":"external:expect.objectContaining","kind":"external","language":"jsts","metadata":{"unresolvedName":"expect.objectContaining"}}],["external:mockPut.mockResolvedValue",{"id":"external:mockPut.mockResolvedValue","kind":"external","language":"jsts","metadata":{"unresolvedName":"mockPut.mockResolvedValue"}}],["symbol-name:updateConfigFolder",{"id":"symbol-name:updateConfigFolder","kind":"symbol","language":"jsts","symbolName":"updateConfigFolder","metadata":{"unresolvedName":"updateConfigFolder"}}],["external:expect(result.files).toEqual",{"id":"external:expect(result.files).toEqual","kind":"external","language":"jsts","metadata":{"unresolvedName":"expect(result.files).toEqual"}}],["external:expect(mockPut).toHaveBeenCalledWith",{"id":"external:expect(mockPut).toHaveBeenCalledWith","kind":"external","language":"jsts","metadata":{"unresolvedName":"expect(mockPut).toHaveBeenCalledWith"}}],["external:mockDelete.mockResolvedValue",{"id":"external:mockDelete.mockResolvedValue","kind":"external","language":"jsts","metadata":{"unresolvedName":"mockDelete.mockResolvedValue"}}],["symbol-name:deleteConfigFolder",{"id":"symbol-name:deleteConfigFolder","kind":"symbol","language":"jsts","symbolName":"deleteConfigFolder","metadata":{"unresolvedName":"deleteConfigFolder"}}],["external:expect(mockDelete).toHaveBeenCalledWith",{"id":"external:expect(mockDelete).toHaveBeenCalledWith","kind":"external","language":"jsts","metadata":{"unresolvedName":"expect(mockDelete).toHaveBeenCalledWith"}}],["/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts:listConfigFolders",{"id":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts:listConfigFolders","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts","symbolName":"listConfigFolders","symbolKind":"function","exported":true,"metadata":{"line":37,"column":34,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["external:apiClient.get",{"id":"external:apiClient.get","kind":"external","language":"jsts","metadata":{"unresolvedName":"apiClient.get"}}],["/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts:getConfigFolder",{"id":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts:getConfigFolder","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts","symbolName":"getConfigFolder","symbolKind":"function","exported":true,"metadata":{"line":42,"column":32,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts:createConfigFolder",{"id":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts:createConfigFolder","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts","symbolName":"createConfigFolder","symbolKind":"function","exported":true,"metadata":{"line":47,"column":35,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["external:apiClient.post",{"id":"external:apiClient.post","kind":"external","language":"jsts","metadata":{"unresolvedName":"apiClient.post"}}],["/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts:updateConfigFolder",{"id":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts:updateConfigFolder","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts","symbolName":"updateConfigFolder","symbolKind":"function","exported":true,"metadata":{"line":54,"column":35,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["external:apiClient.put",{"id":"external:apiClient.put","kind":"external","language":"jsts","metadata":{"unresolvedName":"apiClient.put"}}],["/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts:deleteConfigFolder",{"id":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts:deleteConfigFolder","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts","symbolName":"deleteConfigFolder","symbolKind":"function","exported":true,"metadata":{"line":62,"column":35,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["external:apiClient.delete",{"id":"external:apiClient.delete","kind":"external","language":"jsts","metadata":{"unresolvedName":"apiClient.delete"}}],["/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts:addProjectOverride",{"id":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts:addProjectOverride","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts","symbolName":"addProjectOverride","symbolKind":"function","exported":true,"metadata":{"line":66,"column":35,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts:updateProjectOverride",{"id":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts:updateProjectOverride","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts","symbolName":"updateProjectOverride","symbolKind":"function","exported":true,"metadata":{"line":78,"column":38,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts:deleteProjectOverride",{"id":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts:deleteProjectOverride","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts","symbolName":"deleteProjectOverride","symbolKind":"function","exported":true,"metadata":{"line":90,"column":38,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts",{"id":"file:/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts","metadata":{"lineCount":157,"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts:listConfigProfiles",{"id":"/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts:listConfigProfiles","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts","symbolName":"listConfigProfiles","symbolKind":"function","exported":true,"metadata":{"line":94,"column":35,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts:getConfigProfile",{"id":"/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts:getConfigProfile","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts","symbolName":"getConfigProfile","symbolKind":"function","exported":true,"metadata":{"line":104,"column":33,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts:createConfigProfile",{"id":"/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts:createConfigProfile","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts","symbolName":"createConfigProfile","symbolKind":"function","exported":true,"metadata":{"line":109,"column":36,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts:updateConfigProfile",{"id":"/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts:updateConfigProfile","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts","symbolName":"updateConfigProfile","symbolKind":"function","exported":true,"metadata":{"line":116,"column":36,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts:deleteConfigProfile",{"id":"/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts:deleteConfigProfile","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts","symbolName":"deleteConfigProfile","symbolKind":"function","exported":true,"metadata":{"line":124,"column":36,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts:updateProfileIncludes",{"id":"/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts:updateProfileIncludes","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts","symbolName":"updateProfileIncludes","symbolKind":"function","exported":true,"metadata":{"line":128,"column":38,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts:previewConfigProfile",{"id":"/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts:previewConfigProfile","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts","symbolName":"previewConfigProfile","symbolKind":"function","exported":true,"metadata":{"line":139,"column":37,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts:resolveDefaultProfile",{"id":"/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts:resolveDefaultProfile","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts","symbolName":"resolveDefaultProfile","symbolKind":"function","exported":true,"metadata":{"line":148,"column":38,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/web/src/api/dashboard.ts",{"id":"file:/home/alex/projects/headquarter/apps/web/src/api/dashboard.ts","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/dashboard.ts","metadata":{"lineCount":14,"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["/home/alex/projects/headquarter/apps/web/src/api/dashboard.ts:getDashboardSummary",{"id":"/home/alex/projects/headquarter/apps/web/src/api/dashboard.ts:getDashboardSummary","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/dashboard.ts","symbolName":"getDashboardSummary","symbolKind":"function","exported":true,"metadata":{"line":10,"column":36,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts",{"id":"file:/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","metadata":{"lineCount":300,"featureKind":"library","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:parseGitUrl",{"id":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:parseGitUrl","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","symbolName":"parseGitUrl","symbolKind":"function","exported":true,"metadata":{"line":33,"column":1,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:listRepositories",{"id":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:listRepositories","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","symbolName":"listRepositories","symbolKind":"function","exported":true,"metadata":{"line":38,"column":1,"cyclomaticComplexity":2,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:listAllUserRepositories",{"id":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:listAllUserRepositories","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","symbolName":"listAllUserRepositories","symbolKind":"function","exported":true,"metadata":{"line":50,"column":1,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:createRepository",{"id":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:createRepository","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","symbolName":"createRepository","symbolKind":"function","exported":true,"metadata":{"line":55,"column":1,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:createExternalRepository",{"id":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:createExternalRepository","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","symbolName":"createExternalRepository","symbolKind":"function","exported":true,"metadata":{"line":63,"column":1,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:deleteRepository",{"id":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:deleteRepository","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","symbolName":"deleteRepository","symbolKind":"function","exported":true,"metadata":{"line":70,"column":1,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:updateRepositorySshKey",{"id":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:updateRepositorySshKey","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","symbolName":"updateRepositorySshKey","symbolKind":"function","exported":true,"metadata":{"line":74,"column":1,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["external:apiClient.patch",{"id":"external:apiClient.patch","kind":"external","language":"jsts","metadata":{"unresolvedName":"apiClient.patch"}}],["/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:listRepositoryBranches",{"id":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:listRepositoryBranches","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","symbolName":"listRepositoryBranches","symbolKind":"function","exported":true,"metadata":{"line":97,"column":1,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:getRepositoryHistory",{"id":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:getRepositoryHistory","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","symbolName":"getRepositoryHistory","symbolKind":"function","exported":true,"metadata":{"line":125,"column":1,"cyclomaticComplexity":4,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["external:searchParams.set",{"id":"external:searchParams.set","kind":"external","language":"jsts","metadata":{"unresolvedName":"searchParams.set"}}],["symbol-name:String",{"id":"symbol-name:String","kind":"symbol","language":"jsts","symbolName":"String","metadata":{"unresolvedName":"String"}}],["external:searchParams.toString",{"id":"external:searchParams.toString","kind":"external","language":"jsts","metadata":{"unresolvedName":"searchParams.toString"}}],["/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:getCommitDetail",{"id":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:getCommitDetail","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","symbolName":"getCommitDetail","symbolKind":"function","exported":true,"metadata":{"line":159,"column":1,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:getRepositoryStatus",{"id":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:getRepositoryStatus","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","symbolName":"getRepositoryStatus","symbolKind":"function","exported":true,"metadata":{"line":183,"column":1,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:createBranch",{"id":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:createBranch","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","symbolName":"createBranch","symbolKind":"function","exported":true,"metadata":{"line":193,"column":1,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:deleteBranch",{"id":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:deleteBranch","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","symbolName":"deleteBranch","symbolKind":"function","exported":true,"metadata":{"line":206,"column":1,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:checkoutBranch",{"id":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:checkoutBranch","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","symbolName":"checkoutBranch","symbolKind":"function","exported":true,"metadata":{"line":218,"column":1,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:commitChanges",{"id":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:commitChanges","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","symbolName":"commitChanges","symbolKind":"function","exported":true,"metadata":{"line":235,"column":1,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:fetchRepository",{"id":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:fetchRepository","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","symbolName":"fetchRepository","symbolKind":"function","exported":true,"metadata":{"line":248,"column":1,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:pullRepository",{"id":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:pullRepository","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","symbolName":"pullRepository","symbolKind":"function","exported":true,"metadata":{"line":258,"column":1,"cyclomaticComplexity":2,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:pushRepository",{"id":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:pushRepository","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","symbolName":"pushRepository","symbolKind":"function","exported":true,"metadata":{"line":270,"column":1,"cyclomaticComplexity":2,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:mergeBranches",{"id":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:mergeBranches","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","symbolName":"mergeBranches","symbolKind":"function","exported":true,"metadata":{"line":287,"column":1,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/web/src/api/profile.ts",{"id":"file:/home/alex/projects/headquarter/apps/web/src/api/profile.ts","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/profile.ts","metadata":{"lineCount":31,"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/web/src/types.ts",{"id":"file:/home/alex/projects/headquarter/apps/web/src/types.ts","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/types.ts","metadata":{"lineCount":19,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/api/profile.ts:getProfile",{"id":"/home/alex/projects/headquarter/apps/web/src/api/profile.ts:getProfile","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/profile.ts","symbolName":"getProfile","symbolKind":"function","exported":true,"metadata":{"line":11,"column":27,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["/home/alex/projects/headquarter/apps/web/src/api/profile.ts:updateProfile",{"id":"/home/alex/projects/headquarter/apps/web/src/api/profile.ts:updateProfile","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/profile.ts","symbolName":"updateProfile","symbolKind":"function","exported":true,"metadata":{"line":16,"column":30,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["/home/alex/projects/headquarter/apps/web/src/api/profile.ts:uploadAvatar",{"id":"/home/alex/projects/headquarter/apps/web/src/api/profile.ts:uploadAvatar","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/profile.ts","symbolName":"uploadAvatar","symbolKind":"function","exported":true,"metadata":{"line":21,"column":29,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["external:formData.append",{"id":"external:formData.append","kind":"external","language":"jsts","metadata":{"unresolvedName":"formData.append"}}],["file:/home/alex/projects/headquarter/apps/web/src/api/projects.ts",{"id":"file:/home/alex/projects/headquarter/apps/web/src/api/projects.ts","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/projects.ts","metadata":{"lineCount":52,"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["/home/alex/projects/headquarter/apps/web/src/api/projects.ts:listProjects",{"id":"/home/alex/projects/headquarter/apps/web/src/api/projects.ts:listProjects","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/projects.ts","symbolName":"listProjects","symbolKind":"function","exported":true,"metadata":{"line":18,"column":29,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["/home/alex/projects/headquarter/apps/web/src/api/projects.ts:createProject",{"id":"/home/alex/projects/headquarter/apps/web/src/api/projects.ts:createProject","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/projects.ts","symbolName":"createProject","symbolKind":"function","exported":true,"metadata":{"line":23,"column":30,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["/home/alex/projects/headquarter/apps/web/src/api/projects.ts:updateProject",{"id":"/home/alex/projects/headquarter/apps/web/src/api/projects.ts:updateProject","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/projects.ts","symbolName":"updateProject","symbolKind":"function","exported":true,"metadata":{"line":30,"column":30,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["/home/alex/projects/headquarter/apps/web/src/api/projects.ts:deleteProject",{"id":"/home/alex/projects/headquarter/apps/web/src/api/projects.ts:deleteProject","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/projects.ts","symbolName":"deleteProject","symbolKind":"function","exported":true,"metadata":{"line":38,"column":30,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["/home/alex/projects/headquarter/apps/web/src/api/projects.ts:setDefaultSSHKey",{"id":"/home/alex/projects/headquarter/apps/web/src/api/projects.ts:setDefaultSSHKey","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/projects.ts","symbolName":"setDefaultSSHKey","symbolKind":"function","exported":true,"metadata":{"line":42,"column":33,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/web/src/api/sessions.ts",{"id":"file:/home/alex/projects/headquarter/apps/web/src/api/sessions.ts","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts","metadata":{"lineCount":180,"featureKind":"library","trustBoundaries":["network","external-api","serialization","auth","user-input"]}}],["/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:listInstances",{"id":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:listInstances","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts","symbolName":"listInstances","symbolKind":"function","exported":true,"metadata":{"line":37,"column":1,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["network","external-api","serialization","auth","user-input"]}}],["/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:createInstance",{"id":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:createInstance","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts","symbolName":"createInstance","symbolKind":"function","exported":true,"metadata":{"line":47,"column":1,"cyclomaticComplexity":4,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["network","external-api","serialization","auth","user-input"]}}],["/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:startInstance",{"id":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:startInstance","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts","symbolName":"startInstance","symbolKind":"function","exported":true,"metadata":{"line":71,"column":1,"cyclomaticComplexity":4,"maxNestingDepth":2,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["network","external-api","serialization","auth","user-input"]}}],["symbol-name:startInstance",{"id":"symbol-name:startInstance","kind":"symbol","language":"jsts","symbolName":"startInstance","metadata":{"unresolvedName":"startInstance"}}],["/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:stopInstance",{"id":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:stopInstance","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts","symbolName":"stopInstance","symbolKind":"function","exported":true,"metadata":{"line":95,"column":1,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["network","external-api","serialization","auth","user-input"]}}],["/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:restartInstance",{"id":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:restartInstance","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts","symbolName":"restartInstance","symbolKind":"function","exported":true,"metadata":{"line":106,"column":1,"cyclomaticComplexity":4,"maxNestingDepth":2,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["network","external-api","serialization","auth","user-input"]}}],["symbol-name:restartInstance",{"id":"symbol-name:restartInstance","kind":"symbol","language":"jsts","symbolName":"restartInstance","metadata":{"unresolvedName":"restartInstance"}}],["/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:deleteInstance",{"id":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:deleteInstance","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts","symbolName":"deleteInstance","symbolKind":"function","exported":true,"metadata":{"line":130,"column":1,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["network","external-api","serialization","auth","user-input"]}}],["/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:getUserSessions",{"id":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:getUserSessions","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts","symbolName":"getUserSessions","symbolKind":"function","exported":true,"metadata":{"line":142,"column":1,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["network","external-api","serialization","auth","user-input"]}}],["/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:checkInstanceHealth",{"id":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:checkInstanceHealth","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts","symbolName":"checkInstanceHealth","symbolKind":"function","exported":true,"metadata":{"line":159,"column":1,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["network","external-api","serialization","auth","user-input"]}}],["/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:recreateInstanceTunnel",{"id":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:recreateInstanceTunnel","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts","symbolName":"recreateInstanceTunnel","symbolKind":"function","exported":true,"metadata":{"line":170,"column":1,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["network","external-api","serialization","auth","user-input"]}}],["file:/home/alex/projects/headquarter/apps/web/src/api/settings.ts",{"id":"file:/home/alex/projects/headquarter/apps/web/src/api/settings.ts","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/settings.ts","metadata":{"lineCount":28,"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["/home/alex/projects/headquarter/apps/web/src/api/settings.ts:getUserConfig",{"id":"/home/alex/projects/headquarter/apps/web/src/api/settings.ts:getUserConfig","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/settings.ts","symbolName":"getUserConfig","symbolKind":"function","exported":true,"metadata":{"line":19,"column":30,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["/home/alex/projects/headquarter/apps/web/src/api/settings.ts:updateUserConfig",{"id":"/home/alex/projects/headquarter/apps/web/src/api/settings.ts:updateUserConfig","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/settings.ts","symbolName":"updateUserConfig","symbolKind":"function","exported":true,"metadata":{"line":24,"column":33,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/web/src/api/ssh_keys.ts",{"id":"file:/home/alex/projects/headquarter/apps/web/src/api/ssh_keys.ts","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/ssh_keys.ts","metadata":{"lineCount":54,"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["/home/alex/projects/headquarter/apps/web/src/api/ssh_keys.ts:listSSHKeys",{"id":"/home/alex/projects/headquarter/apps/web/src/api/ssh_keys.ts:listSSHKeys","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/ssh_keys.ts","symbolName":"listSSHKeys","symbolKind":"function","exported":true,"metadata":{"line":14,"column":1,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["/home/alex/projects/headquarter/apps/web/src/api/ssh_keys.ts:createSSHKey",{"id":"/home/alex/projects/headquarter/apps/web/src/api/ssh_keys.ts:createSSHKey","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/ssh_keys.ts","symbolName":"createSSHKey","symbolKind":"function","exported":true,"metadata":{"line":19,"column":1,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["/home/alex/projects/headquarter/apps/web/src/api/ssh_keys.ts:deleteSSHKey",{"id":"/home/alex/projects/headquarter/apps/web/src/api/ssh_keys.ts:deleteSSHKey","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/ssh_keys.ts","symbolName":"deleteSSHKey","symbolKind":"function","exported":true,"metadata":{"line":24,"column":1,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["/home/alex/projects/headquarter/apps/web/src/api/ssh_keys.ts:signPayload",{"id":"/home/alex/projects/headquarter/apps/web/src/api/ssh_keys.ts:signPayload","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/ssh_keys.ts","symbolName":"signPayload","symbolKind":"function","exported":true,"metadata":{"line":45,"column":1,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["/home/alex/projects/headquarter/apps/web/src/api/ssh_keys.ts:verifySignature",{"id":"/home/alex/projects/headquarter/apps/web/src/api/ssh_keys.ts:verifySignature","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/ssh_keys.ts","symbolName":"verifySignature","symbolKind":"function","exported":true,"metadata":{"line":50,"column":1,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/web/src/api/tool_configs.ts",{"id":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_configs.ts","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/tool_configs.ts","metadata":{"lineCount":75,"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["/home/alex/projects/headquarter/apps/web/src/api/tool_configs.ts:listToolConfigs",{"id":"/home/alex/projects/headquarter/apps/web/src/api/tool_configs.ts:listToolConfigs","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/tool_configs.ts","symbolName":"listToolConfigs","symbolKind":"function","exported":true,"metadata":{"line":32,"column":32,"cyclomaticComplexity":3,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["external:params.append",{"id":"external:params.append","kind":"external","language":"jsts","metadata":{"unresolvedName":"params.append"}}],["external:params.toString",{"id":"external:params.toString","kind":"external","language":"jsts","metadata":{"unresolvedName":"params.toString"}}],["/home/alex/projects/headquarter/apps/web/src/api/tool_configs.ts:createToolConfig",{"id":"/home/alex/projects/headquarter/apps/web/src/api/tool_configs.ts:createToolConfig","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/tool_configs.ts","symbolName":"createToolConfig","symbolKind":"function","exported":true,"metadata":{"line":46,"column":33,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["/home/alex/projects/headquarter/apps/web/src/api/tool_configs.ts:updateToolConfig",{"id":"/home/alex/projects/headquarter/apps/web/src/api/tool_configs.ts:updateToolConfig","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/tool_configs.ts","symbolName":"updateToolConfig","symbolKind":"function","exported":true,"metadata":{"line":53,"column":33,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["/home/alex/projects/headquarter/apps/web/src/api/tool_configs.ts:deleteToolConfig",{"id":"/home/alex/projects/headquarter/apps/web/src/api/tool_configs.ts:deleteToolConfig","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/tool_configs.ts","symbolName":"deleteToolConfig","symbolKind":"function","exported":true,"metadata":{"line":64,"column":33,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["/home/alex/projects/headquarter/apps/web/src/api/tool_configs.ts:getToolConfigDefaults",{"id":"/home/alex/projects/headquarter/apps/web/src/api/tool_configs.ts:getToolConfigDefaults","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/tool_configs.ts","symbolName":"getToolConfigDefaults","symbolKind":"function","exported":true,"metadata":{"line":68,"column":38,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"service","trustBoundaries":["filesystem","database","network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/web/src/api/tool_definitions.ts",{"id":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_definitions.ts","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/tool_definitions.ts","metadata":{"lineCount":82,"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["/home/alex/projects/headquarter/apps/web/src/api/tool_definitions.ts:listToolDefinitions",{"id":"/home/alex/projects/headquarter/apps/web/src/api/tool_definitions.ts:listToolDefinitions","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/tool_definitions.ts","symbolName":"listToolDefinitions","symbolKind":"function","exported":true,"metadata":{"line":51,"column":36,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["/home/alex/projects/headquarter/apps/web/src/api/tool_definitions.ts:getToolDefinition",{"id":"/home/alex/projects/headquarter/apps/web/src/api/tool_definitions.ts:getToolDefinition","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/tool_definitions.ts","symbolName":"getToolDefinition","symbolKind":"function","exported":true,"metadata":{"line":58,"column":34,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["/home/alex/projects/headquarter/apps/web/src/api/tool_definitions.ts:createToolDefinition",{"id":"/home/alex/projects/headquarter/apps/web/src/api/tool_definitions.ts:createToolDefinition","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/tool_definitions.ts","symbolName":"createToolDefinition","symbolKind":"function","exported":true,"metadata":{"line":63,"column":37,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["/home/alex/projects/headquarter/apps/web/src/api/tool_definitions.ts:updateToolDefinition",{"id":"/home/alex/projects/headquarter/apps/web/src/api/tool_definitions.ts:updateToolDefinition","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/tool_definitions.ts","symbolName":"updateToolDefinition","symbolKind":"function","exported":true,"metadata":{"line":68,"column":37,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["/home/alex/projects/headquarter/apps/web/src/api/tool_definitions.ts:deleteToolDefinition",{"id":"/home/alex/projects/headquarter/apps/web/src/api/tool_definitions.ts:deleteToolDefinition","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/tool_definitions.ts","symbolName":"deleteToolDefinition","symbolKind":"function","exported":true,"metadata":{"line":73,"column":37,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["/home/alex/projects/headquarter/apps/web/src/api/tool_definitions.ts:compileToolDefinition",{"id":"/home/alex/projects/headquarter/apps/web/src/api/tool_definitions.ts:compileToolDefinition","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/tool_definitions.ts","symbolName":"compileToolDefinition","symbolKind":"function","exported":true,"metadata":{"line":78,"column":38,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts",{"id":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts","metadata":{"lineCount":228,"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:",{"id":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts","symbolName":"","symbolKind":"function","exported":false,"metadata":{"line":219,"column":29,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["symbol-name:listToolTypes",{"id":"symbol-name:listToolTypes","kind":"symbol","language":"jsts","symbolName":"listToolTypes","metadata":{"unresolvedName":"listToolTypes"}}],["external:expect(result[0].definition_type).toBe",{"id":"external:expect(result[0].definition_type).toBe","kind":"external","language":"jsts","metadata":{"unresolvedName":"expect(result[0].definition_type).toBe"}}],["external:expect(result[0].dockerfile_template).toBe",{"id":"external:expect(result[0].dockerfile_template).toBe","kind":"external","language":"jsts","metadata":{"unresolvedName":"expect(result[0].dockerfile_template).toBe"}}],["external:expect(result[0].readiness_probe).toEqual",{"id":"external:expect(result[0].readiness_probe).toEqual","kind":"external","language":"jsts","metadata":{"unresolvedName":"expect(result[0].readiness_probe).toEqual"}}],["external:expect(result[0].dockerfile_template).toBeNull",{"id":"external:expect(result[0].dockerfile_template).toBeNull","kind":"external","language":"jsts","metadata":{"unresolvedName":"expect(result[0].dockerfile_template).toBeNull"}}],["symbol-name:createToolType",{"id":"symbol-name:createToolType","kind":"symbol","language":"jsts","symbolName":"createToolType","metadata":{"unresolvedName":"createToolType"}}],["external:expect(result.definition_type).toBe",{"id":"external:expect(result.definition_type).toBe","kind":"external","language":"jsts","metadata":{"unresolvedName":"expect(result.definition_type).toBe"}}],["external:expect(result.readiness_probe).toEqual",{"id":"external:expect(result.readiness_probe).toEqual","kind":"external","language":"jsts","metadata":{"unresolvedName":"expect(result.readiness_probe).toEqual"}}],["symbol-name:validateToolType",{"id":"symbol-name:validateToolType","kind":"symbol","language":"jsts","symbolName":"validateToolType","metadata":{"unresolvedName":"validateToolType"}}],["external:expect(result.valid).toBe",{"id":"external:expect(result.valid).toBe","kind":"external","language":"jsts","metadata":{"unresolvedName":"expect(result.valid).toBe"}}],["external:expect(result.errors).toContain",{"id":"external:expect(result.errors).toContain","kind":"external","language":"jsts","metadata":{"unresolvedName":"expect(result.errors).toContain"}}],["symbol-name:updateToolType",{"id":"symbol-name:updateToolType","kind":"symbol","language":"jsts","symbolName":"updateToolType","metadata":{"unresolvedName":"updateToolType"}}],["symbol-name:deleteToolType",{"id":"symbol-name:deleteToolType","kind":"symbol","language":"jsts","symbolName":"deleteToolType","metadata":{"unresolvedName":"deleteToolType"}}],["file:/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx",{"id":"file:/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx","metadata":{"lineCount":142,"featureKind":"library","trustBoundaries":["user-input","process-exec"]}}],["external:react",{"id":"external:react","kind":"external","language":"jsts","metadata":{"source":"react"}}],["external:react-router-dom",{"id":"external:react-router-dom","kind":"external","language":"jsts","metadata":{"source":"react-router-dom"}}],["file:/home/alex/projects/headquarter/apps/web/src/hooks/use-theme.ts",{"id":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-theme.ts","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/hooks/use-theme.ts","metadata":{"lineCount":24,"featureKind":"library","trustBoundaries":[]}}],["file:/home/alex/projects/headquarter/apps/web/src/state/auth.tsx",{"id":"file:/home/alex/projects/headquarter/apps/web/src/state/auth.tsx","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/state/auth.tsx","metadata":{"lineCount":64,"featureKind":"library","trustBoundaries":["auth","user-input"]}}],["file:/home/alex/projects/headquarter/apps/web/src/state/sessions.tsx",{"id":"file:/home/alex/projects/headquarter/apps/web/src/state/sessions.tsx","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/state/sessions.tsx","metadata":{"lineCount":45,"featureKind":"library","trustBoundaries":["auth","user-input"]}}],["file:/home/alex/projects/headquarter/apps/web/src/hooks/use-mobile-viewport.ts",{"id":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-mobile-viewport.ts","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/hooks/use-mobile-viewport.ts","metadata":{"lineCount":22,"featureKind":"library","trustBoundaries":[]}}],["file:/home/alex/projects/headquarter/apps/web/src/components/icon.tsx",{"id":"file:/home/alex/projects/headquarter/apps/web/src/components/icon.tsx","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/icon.tsx","metadata":{"lineCount":168,"featureKind":"library","trustBoundaries":[]}}],["file:/home/alex/projects/headquarter/apps/web/src/components/mobile-nav.tsx",{"id":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-nav.tsx","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/mobile-nav.tsx","metadata":{"lineCount":88,"featureKind":"library","trustBoundaries":[]}}],["file:/home/alex/projects/headquarter/apps/web/src/utils/icons.ts",{"id":"file:/home/alex/projects/headquarter/apps/web/src/utils/icons.ts","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/utils/icons.ts","metadata":{"lineCount":181,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx:SessionItem",{"id":"/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx:SessionItem","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx","symbolName":"SessionItem","symbolKind":"function","exported":false,"metadata":{"line":23,"column":21,"cyclomaticComplexity":5,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["user-input","process-exec","auth"]}}],["/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx:AppShell",{"id":"/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx:AppShell","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx","symbolName":"AppShell","symbolKind":"function","exported":true,"metadata":{"line":41,"column":25,"cyclomaticComplexity":13,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["user-input","process-exec"]}}],["symbol-name:useTheme",{"id":"symbol-name:useTheme","kind":"symbol","language":"jsts","symbolName":"useTheme","metadata":{"unresolvedName":"useTheme"}}],["symbol-name:useAuth",{"id":"symbol-name:useAuth","kind":"symbol","language":"jsts","symbolName":"useAuth","metadata":{"unresolvedName":"useAuth"}}],["symbol-name:useSessions",{"id":"symbol-name:useSessions","kind":"symbol","language":"jsts","symbolName":"useSessions","metadata":{"unresolvedName":"useSessions"}}],["symbol-name:useLocation",{"id":"symbol-name:useLocation","kind":"symbol","language":"jsts","symbolName":"useLocation","metadata":{"unresolvedName":"useLocation"}}],["symbol-name:useMobileViewport",{"id":"symbol-name:useMobileViewport","kind":"symbol","language":"jsts","symbolName":"useMobileViewport","metadata":{"unresolvedName":"useMobileViewport"}}],["external:location.pathname.includes",{"id":"external:location.pathname.includes","kind":"external","language":"jsts","metadata":{"unresolvedName":"location.pathname.includes"}}],["symbol-name:useCallback",{"id":"symbol-name:useCallback","kind":"symbol","language":"jsts","symbolName":"useCallback","metadata":{"unresolvedName":"useCallback"}}],["symbol-name:getUserSessions",{"id":"symbol-name:getUserSessions","kind":"symbol","language":"jsts","symbolName":"getUserSessions","metadata":{"unresolvedName":"getUserSessions"}}],["symbol-name:setAllSessions",{"id":"symbol-name:setAllSessions","kind":"symbol","language":"jsts","symbolName":"setAllSessions","metadata":{"unresolvedName":"setAllSessions"}}],["symbol-name:useEffect",{"id":"symbol-name:useEffect","kind":"symbol","language":"jsts","symbolName":"useEffect","metadata":{"unresolvedName":"useEffect"}}],["symbol-name:loadSessions",{"id":"symbol-name:loadSessions","kind":"symbol","language":"jsts","symbolName":"loadSessions","metadata":{"unresolvedName":"loadSessions"}}],["symbol-name:setInterval",{"id":"symbol-name:setInterval","kind":"symbol","language":"jsts","symbolName":"setInterval","metadata":{"unresolvedName":"setInterval"}}],["symbol-name:clearInterval",{"id":"symbol-name:clearInterval","kind":"symbol","language":"jsts","symbolName":"clearInterval","metadata":{"unresolvedName":"clearInterval"}}],["symbol-name:logout",{"id":"symbol-name:logout","kind":"symbol","language":"jsts","symbolName":"logout","metadata":{"unresolvedName":"logout"}}],["external:NAV_ITEMS.map",{"id":"external:NAV_ITEMS.map","kind":"external","language":"jsts","metadata":{"unresolvedName":"NAV_ITEMS.map"}}],["external:sessions.filter",{"id":"external:sessions.filter","kind":"external","language":"jsts","metadata":{"unresolvedName":"sessions.filter"}}],["external:sessions.map",{"id":"external:sessions.map","kind":"external","language":"jsts","metadata":{"unresolvedName":"sessions.map"}}],["/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx:",{"id":"/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx:","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx","symbolName":"","symbolKind":"function","exported":false,"metadata":{"line":101,"column":28,"cyclomaticComplexity":4,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["user-input","process-exec"]}}],["file:/home/alex/projects/headquarter/apps/web/src/components/code-editor.tsx",{"id":"file:/home/alex/projects/headquarter/apps/web/src/components/code-editor.tsx","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/code-editor.tsx","metadata":{"lineCount":57,"featureKind":"library","trustBoundaries":[]}}],["external:react-simple-code-editor",{"id":"external:react-simple-code-editor","kind":"external","language":"jsts","metadata":{"source":"react-simple-code-editor"}}],["file:/home/alex/projects/headquarter/apps/web/src/utils/language.ts",{"id":"file:/home/alex/projects/headquarter/apps/web/src/utils/language.ts","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/utils/language.ts","metadata":{"lineCount":91,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/code-editor.tsx:CodeEditor",{"id":"/home/alex/projects/headquarter/apps/web/src/components/code-editor.tsx:CodeEditor","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/code-editor.tsx","symbolName":"CodeEditor","symbolKind":"function","exported":true,"metadata":{"line":12,"column":54,"cyclomaticComplexity":2,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["symbol-name:loadLanguage",{"id":"symbol-name:loadLanguage","kind":"symbol","language":"jsts","symbolName":"loadLanguage","metadata":{"unresolvedName":"loadLanguage"}}],["symbol-name:highlight",{"id":"symbol-name:highlight","kind":"symbol","language":"jsts","symbolName":"highlight","metadata":{"unresolvedName":"highlight"}}],["external:input\n .split(\"\\n\")\n .map",{"id":"external:input\n .split(\"\\n\")\n .map","kind":"external","language":"jsts","metadata":{"unresolvedName":"input\n .split(\"\\n\")\n .map"}}],["external:input\n .split",{"id":"external:input\n .split","kind":"external","language":"jsts","metadata":{"unresolvedName":"input\n .split"}}],["symbol-name:highlightCode",{"id":"symbol-name:highlightCode","kind":"symbol","language":"jsts","symbolName":"highlightCode","metadata":{"unresolvedName":"highlightCode"}}],["/home/alex/projects/headquarter/apps/web/src/components/code-editor.tsx:",{"id":"/home/alex/projects/headquarter/apps/web/src/components/code-editor.tsx:","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/code-editor.tsx","symbolName":"","symbolKind":"function","exported":false,"metadata":{"line":18,"column":13,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/code-editor.tsx:highlight",{"id":"/home/alex/projects/headquarter/apps/web/src/components/code-editor.tsx:highlight","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/code-editor.tsx","symbolName":"highlight","symbolKind":"function","exported":false,"metadata":{"line":19,"column":23,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["file:/home/alex/projects/headquarter/apps/web/src/components/commit-dialog.tsx",{"id":"file:/home/alex/projects/headquarter/apps/web/src/components/commit-dialog.tsx","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/commit-dialog.tsx","metadata":{"lineCount":160,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/commit-dialog.tsx:CommitDialog",{"id":"/home/alex/projects/headquarter/apps/web/src/components/commit-dialog.tsx:CommitDialog","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/commit-dialog.tsx","symbolName":"CommitDialog","symbolKind":"function","exported":true,"metadata":{"line":14,"column":58,"cyclomaticComplexity":19,"maxNestingDepth":3,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["symbol-name:useState",{"id":"symbol-name:useState","kind":"symbol","language":"jsts","symbolName":"useState","metadata":{"unresolvedName":"useState"}}],["external:originalContent.split",{"id":"external:originalContent.split","kind":"external","language":"jsts","metadata":{"unresolvedName":"originalContent.split"}}],["external:newContent.split",{"id":"external:newContent.split","kind":"external","language":"jsts","metadata":{"unresolvedName":"newContent.split"}}],["external:Math.max",{"id":"external:Math.max","kind":"external","language":"jsts","metadata":{"unresolvedName":"Math.max"}}],["external:diff.push",{"id":"external:diff.push","kind":"external","language":"jsts","metadata":{"unresolvedName":"diff.push"}}],["external:message.trim",{"id":"external:message.trim","kind":"external","language":"jsts","metadata":{"unresolvedName":"message.trim"}}],["symbol-name:setError",{"id":"symbol-name:setError","kind":"symbol","language":"jsts","symbolName":"setError","metadata":{"unresolvedName":"setError"}}],["symbol-name:setLoading",{"id":"symbol-name:setLoading","kind":"symbol","language":"jsts","symbolName":"setLoading","metadata":{"unresolvedName":"setLoading"}}],["symbol-name:onCommit",{"id":"symbol-name:onCommit","kind":"symbol","language":"jsts","symbolName":"onCommit","metadata":{"unresolvedName":"onCommit"}}],["symbol-name:generateDiff",{"id":"symbol-name:generateDiff","kind":"symbol","language":"jsts","symbolName":"generateDiff","metadata":{"unresolvedName":"generateDiff"}}],["external:diff.some",{"id":"external:diff.some","kind":"external","language":"jsts","metadata":{"unresolvedName":"diff.some"}}],["external:diff.map",{"id":"external:diff.map","kind":"external","language":"jsts","metadata":{"unresolvedName":"diff.map"}}],["symbol-name:setMessage",{"id":"symbol-name:setMessage","kind":"symbol","language":"jsts","symbolName":"setMessage","metadata":{"unresolvedName":"setMessage"}}],["/home/alex/projects/headquarter/apps/web/src/components/commit-dialog.tsx:generateDiff",{"id":"/home/alex/projects/headquarter/apps/web/src/components/commit-dialog.tsx:generateDiff","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/commit-dialog.tsx","symbolName":"generateDiff","symbolKind":"function","exported":false,"metadata":{"line":28,"column":24,"cyclomaticComplexity":7,"maxNestingDepth":3,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/commit-dialog.tsx:handleCommit",{"id":"/home/alex/projects/headquarter/apps/web/src/components/commit-dialog.tsx:handleCommit","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/commit-dialog.tsx","symbolName":"handleCommit","symbolKind":"function","exported":false,"metadata":{"line":53,"column":24,"cyclomaticComplexity":3,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["file:/home/alex/projects/headquarter/apps/web/src/components/commit-panel.tsx",{"id":"file:/home/alex/projects/headquarter/apps/web/src/components/commit-panel.tsx","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/commit-panel.tsx","metadata":{"lineCount":103,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/commit-panel.tsx:CommitPanel",{"id":"/home/alex/projects/headquarter/apps/web/src/components/commit-panel.tsx:CommitPanel","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/commit-panel.tsx","symbolName":"CommitPanel","symbolKind":"function","exported":true,"metadata":{"line":15,"column":28,"cyclomaticComplexity":7,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["symbol-name:commitChanges",{"id":"symbol-name:commitChanges","kind":"symbol","language":"jsts","symbolName":"commitChanges","metadata":{"unresolvedName":"commitChanges"}}],["external:modified.map",{"id":"external:modified.map","kind":"external","language":"jsts","metadata":{"unresolvedName":"modified.map"}}],["external:added.map",{"id":"external:added.map","kind":"external","language":"jsts","metadata":{"unresolvedName":"added.map"}}],["external:deleted.map",{"id":"external:deleted.map","kind":"external","language":"jsts","metadata":{"unresolvedName":"deleted.map"}}],["external:untracked.map",{"id":"external:untracked.map","kind":"external","language":"jsts","metadata":{"unresolvedName":"untracked.map"}}],["/home/alex/projects/headquarter/apps/web/src/components/commit-panel.tsx:handleCommit",{"id":"/home/alex/projects/headquarter/apps/web/src/components/commit-panel.tsx:handleCommit","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/commit-panel.tsx","symbolName":"handleCommit","symbolKind":"function","exported":false,"metadata":{"line":31,"column":24,"cyclomaticComplexity":3,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["file:/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx",{"id":"file:/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx","metadata":{"lineCount":522,"featureKind":"library","trustBoundaries":["auth","user-input"]}}],["/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:CreateSessionForm",{"id":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:CreateSessionForm","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx","symbolName":"CreateSessionForm","symbolKind":"function","exported":true,"metadata":{"line":27,"column":34,"cyclomaticComplexity":76,"maxNestingDepth":2,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["auth","user-input"]}}],["symbol-name:listSSHKeys",{"id":"symbol-name:listSSHKeys","kind":"symbol","language":"jsts","symbolName":"listSSHKeys","metadata":{"unresolvedName":"listSSHKeys"}}],["symbol-name:setSshKeys",{"id":"symbol-name:setSshKeys","kind":"symbol","language":"jsts","symbolName":"setSshKeys","metadata":{"unresolvedName":"setSshKeys"}}],["symbol-name:loadKeys",{"id":"symbol-name:loadKeys","kind":"symbol","language":"jsts","symbolName":"loadKeys","metadata":{"unresolvedName":"loadKeys"}}],["symbol-name:setConfigProfiles",{"id":"symbol-name:setConfigProfiles","kind":"symbol","language":"jsts","symbolName":"setConfigProfiles","metadata":{"unresolvedName":"setConfigProfiles"}}],["symbol-name:setSelectedConfigProfile",{"id":"symbol-name:setSelectedConfigProfile","kind":"symbol","language":"jsts","symbolName":"setSelectedConfigProfile","metadata":{"unresolvedName":"setSelectedConfigProfile"}}],["symbol-name:listConfigProfiles",{"id":"symbol-name:listConfigProfiles","kind":"symbol","language":"jsts","symbolName":"listConfigProfiles","metadata":{"unresolvedName":"listConfigProfiles"}}],["external:profiles.find",{"id":"external:profiles.find","kind":"external","language":"jsts","metadata":{"unresolvedName":"profiles.find"}}],["symbol-name:loadProfiles",{"id":"symbol-name:loadProfiles","kind":"symbol","language":"jsts","symbolName":"loadProfiles","metadata":{"unresolvedName":"loadProfiles"}}],["symbol-name:setBranches",{"id":"symbol-name:setBranches","kind":"symbol","language":"jsts","symbolName":"setBranches","metadata":{"unresolvedName":"setBranches"}}],["symbol-name:setIsLoadingBranches",{"id":"symbol-name:setIsLoadingBranches","kind":"symbol","language":"jsts","symbolName":"setIsLoadingBranches","metadata":{"unresolvedName":"setIsLoadingBranches"}}],["symbol-name:listRepositoryBranches",{"id":"symbol-name:listRepositoryBranches","kind":"symbol","language":"jsts","symbolName":"listRepositoryBranches","metadata":{"unresolvedName":"listRepositoryBranches"}}],["symbol-name:setBranch",{"id":"symbol-name:setBranch","kind":"symbol","language":"jsts","symbolName":"setBranch","metadata":{"unresolvedName":"setBranch"}}],["symbol-name:setBaseBranch",{"id":"symbol-name:setBaseBranch","kind":"symbol","language":"jsts","symbolName":"setBaseBranch","metadata":{"unresolvedName":"setBaseBranch"}}],["symbol-name:loadBranches",{"id":"symbol-name:loadBranches","kind":"symbol","language":"jsts","symbolName":"loadBranches","metadata":{"unresolvedName":"loadBranches"}}],["external:repositories.filter",{"id":"external:repositories.filter","kind":"external","language":"jsts","metadata":{"unresolvedName":"repositories.filter"}}],["external:event.preventDefault",{"id":"external:event.preventDefault","kind":"external","language":"jsts","metadata":{"unresolvedName":"event.preventDefault"}}],["external:repositories.find",{"id":"external:repositories.find","kind":"external","language":"jsts","metadata":{"unresolvedName":"repositories.find"}}],["symbol-name:setStatus",{"id":"symbol-name:setStatus","kind":"symbol","language":"jsts","symbolName":"setStatus","metadata":{"unresolvedName":"setStatus"}}],["symbol-name:setProgress",{"id":"symbol-name:setProgress","kind":"symbol","language":"jsts","symbolName":"setProgress","metadata":{"unresolvedName":"setProgress"}}],["symbol-name:createInstance",{"id":"symbol-name:createInstance","kind":"symbol","language":"jsts","symbolName":"createInstance","metadata":{"unresolvedName":"createInstance"}}],["symbol-name:setSelectedProject",{"id":"symbol-name:setSelectedProject","kind":"symbol","language":"jsts","symbolName":"setSelectedProject","metadata":{"unresolvedName":"setSelectedProject"}}],["symbol-name:setSelectedRepo",{"id":"symbol-name:setSelectedRepo","kind":"symbol","language":"jsts","symbolName":"setSelectedRepo","metadata":{"unresolvedName":"setSelectedRepo"}}],["symbol-name:setSelectedToolType",{"id":"symbol-name:setSelectedToolType","kind":"symbol","language":"jsts","symbolName":"setSelectedToolType","metadata":{"unresolvedName":"setSelectedToolType"}}],["symbol-name:setDisplayName",{"id":"symbol-name:setDisplayName","kind":"symbol","language":"jsts","symbolName":"setDisplayName","metadata":{"unresolvedName":"setDisplayName"}}],["symbol-name:setCloneMode",{"id":"symbol-name:setCloneMode","kind":"symbol","language":"jsts","symbolName":"setCloneMode","metadata":{"unresolvedName":"setCloneMode"}}],["symbol-name:setIsCreatingNewBranch",{"id":"symbol-name:setIsCreatingNewBranch","kind":"symbol","language":"jsts","symbolName":"setIsCreatingNewBranch","metadata":{"unresolvedName":"setIsCreatingNewBranch"}}],["symbol-name:setNewBranchName",{"id":"symbol-name:setNewBranchName","kind":"symbol","language":"jsts","symbolName":"setNewBranchName","metadata":{"unresolvedName":"setNewBranchName"}}],["symbol-name:onSuccess",{"id":"symbol-name:onSuccess","kind":"symbol","language":"jsts","symbolName":"onSuccess","metadata":{"unresolvedName":"onSuccess"}}],["symbol-name:renderStep",{"id":"symbol-name:renderStep","kind":"symbol","language":"jsts","symbolName":"renderStep","metadata":{"unresolvedName":"renderStep"}}],["external:projects.find",{"id":"external:projects.find","kind":"external","language":"jsts","metadata":{"unresolvedName":"projects.find"}}],["symbol-name:onProjectChange",{"id":"symbol-name:onProjectChange","kind":"symbol","language":"jsts","symbolName":"onProjectChange","metadata":{"unresolvedName":"onProjectChange"}}],["external:projects.map",{"id":"external:projects.map","kind":"external","language":"jsts","metadata":{"unresolvedName":"projects.map"}}],["external:availableRepos.map",{"id":"external:availableRepos.map","kind":"external","language":"jsts","metadata":{"unresolvedName":"availableRepos.map"}}],["external:toolTypes.map",{"id":"external:toolTypes.map","kind":"external","language":"jsts","metadata":{"unresolvedName":"toolTypes.map"}}],["external:configProfiles.map",{"id":"external:configProfiles.map","kind":"external","language":"jsts","metadata":{"unresolvedName":"configProfiles.map"}}],["external:branches.map",{"id":"external:branches.map","kind":"external","language":"jsts","metadata":{"unresolvedName":"branches.map"}}],["external:sshKeys.find",{"id":"external:sshKeys.find","kind":"external","language":"jsts","metadata":{"unresolvedName":"sshKeys.find"}}],["/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:",{"id":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx","symbolName":"","symbolKind":"function","exported":false,"metadata":{"line":447,"column":23,"cyclomaticComplexity":4,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["auth","user-input"]}}],["/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:loadKeys",{"id":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:loadKeys","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx","symbolName":"loadKeys","symbolKind":"function","exported":false,"metadata":{"line":66,"column":22,"cyclomaticComplexity":2,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["auth","user-input"]}}],["/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:loadProfiles",{"id":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:loadProfiles","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx","symbolName":"loadProfiles","symbolKind":"function","exported":false,"metadata":{"line":85,"column":26,"cyclomaticComplexity":3,"maxNestingDepth":2,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["auth","user-input"]}}],["/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:loadBranches",{"id":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:loadBranches","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx","symbolName":"loadBranches","symbolKind":"function","exported":false,"metadata":{"line":108,"column":26,"cyclomaticComplexity":3,"maxNestingDepth":2,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"service","trustBoundaries":["filesystem","database","auth","user-input"]}}],["/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:handleSubmit",{"id":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:handleSubmit","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx","symbolName":"handleSubmit","symbolKind":"function","exported":false,"metadata":{"line":131,"column":24,"cyclomaticComplexity":21,"maxNestingDepth":2,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["auth","user-input"]}}],["/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:renderStep",{"id":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:renderStep","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx","symbolName":"renderStep","symbolKind":"function","exported":false,"metadata":{"line":203,"column":22,"cyclomaticComplexity":3,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["auth","user-input"]}}],["file:/home/alex/projects/headquarter/apps/web/src/components/data-states.tsx",{"id":"file:/home/alex/projects/headquarter/apps/web/src/components/data-states.tsx","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/data-states.tsx","metadata":{"lineCount":35,"featureKind":"library","trustBoundaries":[]}}],["file:/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx",{"id":"file:/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx","metadata":{"lineCount":242,"featureKind":"library","trustBoundaries":[]}}],["file:/home/alex/projects/headquarter/apps/web/src/components/syntax-highlighter.tsx",{"id":"file:/home/alex/projects/headquarter/apps/web/src/components/syntax-highlighter.tsx","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/syntax-highlighter.tsx","metadata":{"lineCount":78,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:FileEditor",{"id":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:FileEditor","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx","symbolName":"FileEditor","symbolKind":"function","exported":true,"metadata":{"line":16,"column":54,"cyclomaticComplexity":33,"maxNestingDepth":3,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["symbol-name:useSearchParams",{"id":"symbol-name:useSearchParams","kind":"symbol","language":"jsts","symbolName":"useSearchParams","metadata":{"unresolvedName":"useSearchParams"}}],["external:searchParams.get",{"id":"external:searchParams.get","kind":"external","language":"jsts","metadata":{"unresolvedName":"searchParams.get"}}],["symbol-name:setContent",{"id":"symbol-name:setContent","kind":"symbol","language":"jsts","symbolName":"setContent","metadata":{"unresolvedName":"setContent"}}],["symbol-name:setOriginalContent",{"id":"symbol-name:setOriginalContent","kind":"symbol","language":"jsts","symbolName":"setOriginalContent","metadata":{"unresolvedName":"setOriginalContent"}}],["symbol-name:setIsBinary",{"id":"symbol-name:setIsBinary","kind":"symbol","language":"jsts","symbolName":"setIsBinary","metadata":{"unresolvedName":"setIsBinary"}}],["symbol-name:setLanguage",{"id":"symbol-name:setLanguage","kind":"symbol","language":"jsts","symbolName":"setLanguage","metadata":{"unresolvedName":"setLanguage"}}],["symbol-name:detectLanguage",{"id":"symbol-name:detectLanguage","kind":"symbol","language":"jsts","symbolName":"detectLanguage","metadata":{"unresolvedName":"detectLanguage"}}],["symbol-name:loadFile",{"id":"symbol-name:loadFile","kind":"symbol","language":"jsts","symbolName":"loadFile","metadata":{"unresolvedName":"loadFile"}}],["symbol-name:setMode",{"id":"symbol-name:setMode","kind":"symbol","language":"jsts","symbolName":"setMode","metadata":{"unresolvedName":"setMode"}}],["symbol-name:setShowCommitDialog",{"id":"symbol-name:setShowCommitDialog","kind":"symbol","language":"jsts","symbolName":"setShowCommitDialog","metadata":{"unresolvedName":"setShowCommitDialog"}}],["symbol-name:setSaving",{"id":"symbol-name:setSaving","kind":"symbol","language":"jsts","symbolName":"setSaving","metadata":{"unresolvedName":"setSaving"}}],["external:e.preventDefault",{"id":"external:e.preventDefault","kind":"external","language":"jsts","metadata":{"unresolvedName":"e.preventDefault"}}],["symbol-name:handleEdit",{"id":"symbol-name:handleEdit","kind":"symbol","language":"jsts","symbolName":"handleEdit","metadata":{"unresolvedName":"handleEdit"}}],["symbol-name:handleCancel",{"id":"symbol-name:handleCancel","kind":"symbol","language":"jsts","symbolName":"handleCancel","metadata":{"unresolvedName":"handleCancel"}}],["symbol-name:handleSave",{"id":"symbol-name:handleSave","kind":"symbol","language":"jsts","symbolName":"handleSave","metadata":{"unresolvedName":"handleSave"}}],["external:window.addEventListener",{"id":"external:window.addEventListener","kind":"external","language":"jsts","metadata":{"unresolvedName":"window.addEventListener"}}],["external:window.removeEventListener",{"id":"external:window.removeEventListener","kind":"external","language":"jsts","metadata":{"unresolvedName":"window.removeEventListener"}}],["external:filePath.split(\"/\").map",{"id":"external:filePath.split(\"/\").map","kind":"external","language":"jsts","metadata":{"unresolvedName":"filePath.split(\"/\").map"}}],["external:filePath.split",{"id":"external:filePath.split","kind":"external","language":"jsts","metadata":{"unresolvedName":"filePath.split"}}],["/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:",{"id":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx","symbolName":"","symbolKind":"function","exported":false,"metadata":{"line":123,"column":13,"cyclomaticComplexity":11,"maxNestingDepth":3,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:handleEdit",{"id":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:handleEdit","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx","symbolName":"handleEdit","symbolKind":"function","exported":false,"metadata":{"line":77,"column":22,"cyclomaticComplexity":2,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:handleCancel",{"id":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:handleCancel","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx","symbolName":"handleCancel","symbolKind":"function","exported":false,"metadata":{"line":82,"column":24,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:handleSave",{"id":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:handleSave","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx","symbolName":"handleSave","symbolKind":"function","exported":false,"metadata":{"line":88,"column":22,"cyclomaticComplexity":2,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:handleCommit",{"id":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:handleCommit","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx","symbolName":"handleCommit","symbolKind":"function","exported":false,"metadata":{"line":96,"column":24,"cyclomaticComplexity":6,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:handleKeyDown",{"id":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:handleKeyDown","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx","symbolName":"handleKeyDown","symbolKind":"function","exported":false,"metadata":{"line":124,"column":27,"cyclomaticComplexity":11,"maxNestingDepth":3,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["file:/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx",{"id":"file:/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx","metadata":{"lineCount":226,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:GitMountEditor",{"id":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:GitMountEditor","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx","symbolName":"GitMountEditor","symbolKind":"function","exported":true,"metadata":{"line":10,"column":31,"cyclomaticComplexity":15,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["symbol-name:onChange",{"id":"symbol-name:onChange","kind":"symbol","language":"jsts","symbolName":"onChange","metadata":{"unresolvedName":"onChange"}}],["symbol-name:setNewMount",{"id":"symbol-name:setNewMount","kind":"symbol","language":"jsts","symbolName":"setNewMount","metadata":{"unresolvedName":"setNewMount"}}],["symbol-name:setEditingIndex",{"id":"symbol-name:setEditingIndex","kind":"symbol","language":"jsts","symbolName":"setEditingIndex","metadata":{"unresolvedName":"setEditingIndex"}}],["external:mounts.filter",{"id":"external:mounts.filter","kind":"external","language":"jsts","metadata":{"unresolvedName":"mounts.filter"}}],["external:path.includes",{"id":"external:path.includes","kind":"external","language":"jsts","metadata":{"unresolvedName":"path.includes"}}],["external:url.startsWith",{"id":"external:url.startsWith","kind":"external","language":"jsts","metadata":{"unresolvedName":"url.startsWith"}}],["external:mounts.map",{"id":"external:mounts.map","kind":"external","language":"jsts","metadata":{"unresolvedName":"mounts.map"}}],["symbol-name:handleUpdate",{"id":"symbol-name:handleUpdate","kind":"symbol","language":"jsts","symbolName":"handleUpdate","metadata":{"unresolvedName":"handleUpdate"}}],["symbol-name:handleRemove",{"id":"symbol-name:handleRemove","kind":"symbol","language":"jsts","symbolName":"handleRemove","metadata":{"unresolvedName":"handleRemove"}}],["/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:handleAdd",{"id":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:handleAdd","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx","symbolName":"handleAdd","symbolKind":"function","exported":false,"metadata":{"line":19,"column":21,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:handleUpdate",{"id":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:handleUpdate","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx","symbolName":"handleUpdate","symbolKind":"function","exported":false,"metadata":{"line":24,"column":24,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:handleRemove",{"id":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:handleRemove","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx","symbolName":"handleRemove","symbolKind":"function","exported":false,"metadata":{"line":31,"column":24,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:validatePath",{"id":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:validatePath","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx","symbolName":"validatePath","symbolKind":"function","exported":false,"metadata":{"line":35,"column":24,"cyclomaticComplexity":6,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:validateUrl",{"id":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:validateUrl","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx","symbolName":"validateUrl","symbolKind":"function","exported":false,"metadata":{"line":42,"column":23,"cyclomaticComplexity":6,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:GitMountForm",{"id":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:GitMountForm","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx","symbolName":"GitMountForm","symbolKind":"function","exported":false,"metadata":{"line":126,"column":22,"cyclomaticComplexity":17,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["symbol-name:setForm",{"id":"symbol-name:setForm","kind":"symbol","language":"jsts","symbolName":"setForm","metadata":{"unresolvedName":"setForm"}}],["symbol-name:setErrors",{"id":"symbol-name:setErrors","kind":"symbol","language":"jsts","symbolName":"setErrors","metadata":{"unresolvedName":"setErrors"}}],["symbol-name:validateUrl",{"id":"symbol-name:validateUrl","kind":"symbol","language":"jsts","symbolName":"validateUrl","metadata":{"unresolvedName":"validateUrl"}}],["symbol-name:validatePath",{"id":"symbol-name:validatePath","kind":"symbol","language":"jsts","symbolName":"validatePath","metadata":{"unresolvedName":"validatePath"}}],["external:Object.keys",{"id":"external:Object.keys","kind":"external","language":"jsts","metadata":{"unresolvedName":"Object.keys"}}],["symbol-name:onSave",{"id":"symbol-name:onSave","kind":"symbol","language":"jsts","symbolName":"onSave","metadata":{"unresolvedName":"onSave"}}],["symbol-name:handleChange",{"id":"symbol-name:handleChange","kind":"symbol","language":"jsts","symbolName":"handleChange","metadata":{"unresolvedName":"handleChange"}}],["/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:handleChange",{"id":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:handleChange","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx","symbolName":"handleChange","symbolKind":"function","exported":false,"metadata":{"line":130,"column":24,"cyclomaticComplexity":2,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:",{"id":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx","symbolName":"","symbolKind":"function","exported":false,"metadata":{"line":133,"column":17,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:handleSubmit",{"id":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:handleSubmit","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx","symbolName":"handleSubmit","symbolKind":"function","exported":false,"metadata":{"line":141,"column":24,"cyclomaticComplexity":7,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["file:/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx",{"id":"file:/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx","metadata":{"lineCount":277,"featureKind":"library","trustBoundaries":[]}}],["file:/home/alex/projects/headquarter/apps/web/src/components/merge-dialog.tsx",{"id":"file:/home/alex/projects/headquarter/apps/web/src/components/merge-dialog.tsx","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/merge-dialog.tsx","metadata":{"lineCount":145,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:GitToolbar",{"id":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:GitToolbar","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx","symbolName":"GitToolbar","symbolKind":"function","exported":true,"metadata":{"line":26,"column":27,"cyclomaticComplexity":34,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["symbol-name:getRepositoryStatus",{"id":"symbol-name:getRepositoryStatus","kind":"symbol","language":"jsts","symbolName":"getRepositoryStatus","metadata":{"unresolvedName":"getRepositoryStatus"}}],["symbol-name:loadStatus",{"id":"symbol-name:loadStatus","kind":"symbol","language":"jsts","symbolName":"loadStatus","metadata":{"unresolvedName":"loadStatus"}}],["symbol-name:fetchRepository",{"id":"symbol-name:fetchRepository","kind":"symbol","language":"jsts","symbolName":"fetchRepository","metadata":{"unresolvedName":"fetchRepository"}}],["symbol-name:pullRepository",{"id":"symbol-name:pullRepository","kind":"symbol","language":"jsts","symbolName":"pullRepository","metadata":{"unresolvedName":"pullRepository"}}],["symbol-name:onRefresh",{"id":"symbol-name:onRefresh","kind":"symbol","language":"jsts","symbolName":"onRefresh","metadata":{"unresolvedName":"onRefresh"}}],["symbol-name:pushRepository",{"id":"symbol-name:pushRepository","kind":"symbol","language":"jsts","symbolName":"pushRepository","metadata":{"unresolvedName":"pushRepository"}}],["symbol-name:checkoutBranch",{"id":"symbol-name:checkoutBranch","kind":"symbol","language":"jsts","symbolName":"checkoutBranch","metadata":{"unresolvedName":"checkoutBranch"}}],["symbol-name:onBranchChange",{"id":"symbol-name:onBranchChange","kind":"symbol","language":"jsts","symbolName":"onBranchChange","metadata":{"unresolvedName":"onBranchChange"}}],["external:newBranchName.trim",{"id":"external:newBranchName.trim","kind":"external","language":"jsts","metadata":{"unresolvedName":"newBranchName.trim"}}],["symbol-name:createBranch",{"id":"symbol-name:createBranch","kind":"symbol","language":"jsts","symbolName":"createBranch","metadata":{"unresolvedName":"createBranch"}}],["symbol-name:setShowNewBranch",{"id":"symbol-name:setShowNewBranch","kind":"symbol","language":"jsts","symbolName":"setShowNewBranch","metadata":{"unresolvedName":"setShowNewBranch"}}],["symbol-name:setNewBranchBase",{"id":"symbol-name:setNewBranchBase","kind":"symbol","language":"jsts","symbolName":"setNewBranchBase","metadata":{"unresolvedName":"setNewBranchBase"}}],["symbol-name:handleCheckout",{"id":"symbol-name:handleCheckout","kind":"symbol","language":"jsts","symbolName":"handleCheckout","metadata":{"unresolvedName":"handleCheckout"}}],["symbol-name:setShowMergeDialog",{"id":"symbol-name:setShowMergeDialog","kind":"symbol","language":"jsts","symbolName":"setShowMergeDialog","metadata":{"unresolvedName":"setShowMergeDialog"}}],["/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:",{"id":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx","symbolName":"","symbolKind":"function","exported":false,"metadata":{"line":269,"column":18,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:handleFetch",{"id":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:handleFetch","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx","symbolName":"handleFetch","symbolKind":"function","exported":false,"metadata":{"line":61,"column":23,"cyclomaticComplexity":3,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:handlePull",{"id":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:handlePull","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx","symbolName":"handlePull","symbolKind":"function","exported":false,"metadata":{"line":74,"column":22,"cyclomaticComplexity":4,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:handlePush",{"id":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:handlePush","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx","symbolName":"handlePush","symbolKind":"function","exported":false,"metadata":{"line":88,"column":22,"cyclomaticComplexity":2,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:handleCheckout",{"id":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:handleCheckout","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx","symbolName":"handleCheckout","symbolKind":"function","exported":false,"metadata":{"line":100,"column":26,"cyclomaticComplexity":2,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:handleCreateBranch",{"id":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:handleCreateBranch","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx","symbolName":"handleCreateBranch","symbolKind":"function","exported":false,"metadata":{"line":113,"column":30,"cyclomaticComplexity":5,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["external:@phosphor-icons/react",{"id":"external:@phosphor-icons/react","kind":"external","language":"jsts","metadata":{"source":"@phosphor-icons/react"}}],["/home/alex/projects/headquarter/apps/web/src/components/icon.tsx:Icon",{"id":"/home/alex/projects/headquarter/apps/web/src/components/icon.tsx:Icon","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/icon.tsx","symbolName":"Icon","symbolKind":"function","exported":true,"metadata":{"line":141,"column":42,"cyclomaticComplexity":3,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["file:/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx",{"id":"file:/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx","metadata":{"lineCount":466,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:InstanceList",{"id":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:InstanceList","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx","symbolName":"InstanceList","symbolKind":"function","exported":true,"metadata":{"line":28,"column":29,"cyclomaticComplexity":47,"maxNestingDepth":2,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["symbol-name:useNavigate",{"id":"symbol-name:useNavigate","kind":"symbol","language":"jsts","symbolName":"useNavigate","metadata":{"unresolvedName":"useNavigate"}}],["symbol-name:listInstances",{"id":"symbol-name:listInstances","kind":"symbol","language":"jsts","symbolName":"listInstances","metadata":{"unresolvedName":"listInstances"}}],["symbol-name:setInstances",{"id":"symbol-name:setInstances","kind":"symbol","language":"jsts","symbolName":"setInstances","metadata":{"unresolvedName":"setInstances"}}],["symbol-name:loadInstances",{"id":"symbol-name:loadInstances","kind":"symbol","language":"jsts","symbolName":"loadInstances","metadata":{"unresolvedName":"loadInstances"}}],["external:instances.filter",{"id":"external:instances.filter","kind":"external","language":"jsts","metadata":{"unresolvedName":"instances.filter"}}],["external:i.url?.startsWith",{"id":"external:i.url?.startsWith","kind":"external","language":"jsts","metadata":{"unresolvedName":"i.url?.startsWith"}}],["symbol-name:checkInstanceHealth",{"id":"symbol-name:checkInstanceHealth","kind":"symbol","language":"jsts","symbolName":"checkInstanceHealth","metadata":{"unresolvedName":"checkInstanceHealth"}}],["symbol-name:setHealthStatus",{"id":"symbol-name:setHealthStatus","kind":"symbol","language":"jsts","symbolName":"setHealthStatus","metadata":{"unresolvedName":"setHealthStatus"}}],["external:Date.now",{"id":"external:Date.now","kind":"external","language":"jsts","metadata":{"unresolvedName":"Date.now"}}],["symbol-name:checkHealth",{"id":"symbol-name:checkHealth","kind":"symbol","language":"jsts","symbolName":"checkHealth","metadata":{"unresolvedName":"checkHealth"}}],["symbol-name:setShowCreate",{"id":"symbol-name:setShowCreate","kind":"symbol","language":"jsts","symbolName":"setShowCreate","metadata":{"unresolvedName":"setShowCreate"}}],["symbol-name:setBusyInstanceId",{"id":"symbol-name:setBusyInstanceId","kind":"symbol","language":"jsts","symbolName":"setBusyInstanceId","metadata":{"unresolvedName":"setBusyInstanceId"}}],["symbol-name:setProfileSelectInstanceId",{"id":"symbol-name:setProfileSelectInstanceId","kind":"symbol","language":"jsts","symbolName":"setProfileSelectInstanceId","metadata":{"unresolvedName":"setProfileSelectInstanceId"}}],["symbol-name:setSelectedProfileForAction",{"id":"symbol-name:setSelectedProfileForAction","kind":"symbol","language":"jsts","symbolName":"setSelectedProfileForAction","metadata":{"unresolvedName":"setSelectedProfileForAction"}}],["symbol-name:stopInstance",{"id":"symbol-name:stopInstance","kind":"symbol","language":"jsts","symbolName":"stopInstance","metadata":{"unresolvedName":"stopInstance"}}],["symbol-name:setStopConfirmId",{"id":"symbol-name:setStopConfirmId","kind":"symbol","language":"jsts","symbolName":"setStopConfirmId","metadata":{"unresolvedName":"setStopConfirmId"}}],["symbol-name:confirm",{"id":"symbol-name:confirm","kind":"symbol","language":"jsts","symbolName":"confirm","metadata":{"unresolvedName":"confirm"}}],["symbol-name:deleteInstance",{"id":"symbol-name:deleteInstance","kind":"symbol","language":"jsts","symbolName":"deleteInstance","metadata":{"unresolvedName":"deleteInstance"}}],["external:prev.filter",{"id":"external:prev.filter","kind":"external","language":"jsts","metadata":{"unresolvedName":"prev.filter"}}],["symbol-name:recreateInstanceTunnel",{"id":"symbol-name:recreateInstanceTunnel","kind":"symbol","language":"jsts","symbolName":"recreateInstanceTunnel","metadata":{"unresolvedName":"recreateInstanceTunnel"}}],["external:instance.url?.startsWith",{"id":"external:instance.url?.startsWith","kind":"external","language":"jsts","metadata":{"unresolvedName":"instance.url?.startsWith"}}],["external:instances.map",{"id":"external:instances.map","kind":"external","language":"jsts","metadata":{"unresolvedName":"instances.map"}}],["symbol-name:getStatusColor",{"id":"symbol-name:getStatusColor","kind":"symbol","language":"jsts","symbolName":"getStatusColor","metadata":{"unresolvedName":"getStatusColor"}}],["symbol-name:isTunnelUnhealthy",{"id":"symbol-name:isTunnelUnhealthy","kind":"symbol","language":"jsts","symbolName":"isTunnelUnhealthy","metadata":{"unresolvedName":"isTunnelUnhealthy"}}],["external:configProfiles.find",{"id":"external:configProfiles.find","kind":"external","language":"jsts","metadata":{"unresolvedName":"configProfiles.find"}}],["external:instance.tool_type_interfaces.includes",{"id":"external:instance.tool_type_interfaces.includes","kind":"external","language":"jsts","metadata":{"unresolvedName":"instance.tool_type_interfaces.includes"}}],["external:instance.url.startsWith",{"id":"external:instance.url.startsWith","kind":"external","language":"jsts","metadata":{"unresolvedName":"instance.url.startsWith"}}],["symbol-name:handleRecreateTunnel",{"id":"symbol-name:handleRecreateTunnel","kind":"symbol","language":"jsts","symbolName":"handleRecreateTunnel","metadata":{"unresolvedName":"handleRecreateTunnel"}}],["symbol-name:navigate",{"id":"symbol-name:navigate","kind":"symbol","language":"jsts","symbolName":"navigate","metadata":{"unresolvedName":"navigate"}}],["symbol-name:handleStart",{"id":"symbol-name:handleStart","kind":"symbol","language":"jsts","symbolName":"handleStart","metadata":{"unresolvedName":"handleStart"}}],["external:toolTypes.find",{"id":"external:toolTypes.find","kind":"external","language":"jsts","metadata":{"unresolvedName":"toolTypes.find"}}],["symbol-name:loadConfigProfiles",{"id":"symbol-name:loadConfigProfiles","kind":"symbol","language":"jsts","symbolName":"loadConfigProfiles","metadata":{"unresolvedName":"loadConfigProfiles"}}],["symbol-name:handleStop",{"id":"symbol-name:handleStop","kind":"symbol","language":"jsts","symbolName":"handleStop","metadata":{"unresolvedName":"handleStop"}}],["symbol-name:handleRestart",{"id":"symbol-name:handleRestart","kind":"symbol","language":"jsts","symbolName":"handleRestart","metadata":{"unresolvedName":"handleRestart"}}],["symbol-name:handleDelete",{"id":"symbol-name:handleDelete","kind":"symbol","language":"jsts","symbolName":"handleDelete","metadata":{"unresolvedName":"handleDelete"}}],["/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:",{"id":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx","symbolName":"","symbolKind":"function","exported":false,"metadata":{"line":414,"column":34,"cyclomaticComplexity":3,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:checkHealth",{"id":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:checkHealth","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx","symbolName":"checkHealth","symbolKind":"function","exported":false,"metadata":{"line":70,"column":25,"cyclomaticComplexity":3,"maxNestingDepth":2,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:handleCreateSuccess",{"id":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:handleCreateSuccess","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx","symbolName":"handleCreateSuccess","symbolKind":"function","exported":false,"metadata":{"line":95,"column":31,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:handleStart",{"id":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:handleStart","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx","symbolName":"handleStart","symbolKind":"function","exported":false,"metadata":{"line":109,"column":23,"cyclomaticComplexity":2,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:handleStop",{"id":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:handleStop","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx","symbolName":"handleStop","symbolKind":"function","exported":false,"metadata":{"line":123,"column":22,"cyclomaticComplexity":2,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:handleRestart",{"id":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:handleRestart","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx","symbolName":"handleRestart","symbolKind":"function","exported":false,"metadata":{"line":136,"column":25,"cyclomaticComplexity":2,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:handleDelete",{"id":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:handleDelete","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx","symbolName":"handleDelete","symbolKind":"function","exported":false,"metadata":{"line":150,"column":24,"cyclomaticComplexity":3,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:handleRecreateTunnel",{"id":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:handleRecreateTunnel","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx","symbolName":"handleRecreateTunnel","symbolKind":"function","exported":false,"metadata":{"line":164,"column":32,"cyclomaticComplexity":2,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:getStatusColor",{"id":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:getStatusColor","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx","symbolName":"getStatusColor","symbolKind":"function","exported":false,"metadata":{"line":176,"column":26,"cyclomaticComplexity":5,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:isTunnelUnhealthy",{"id":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:isTunnelUnhealthy","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx","symbolName":"isTunnelUnhealthy","symbolKind":"function","exported":false,"metadata":{"line":190,"column":29,"cyclomaticComplexity":4,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["file:/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx",{"id":"file:/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx","metadata":{"lineCount":662,"featureKind":"library","trustBoundaries":[]}}],["file:/home/alex/projects/headquarter/apps/web/src/utils/errors.ts",{"id":"file:/home/alex/projects/headquarter/apps/web/src/utils/errors.ts","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/utils/errors.ts","metadata":{"lineCount":10,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor",{"id":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx","symbolName":"ManifestEditor","symbolKind":"function","exported":true,"metadata":{"line":29,"column":31,"cyclomaticComplexity":44,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["symbol-name:setBaseImage",{"id":"symbol-name:setBaseImage","kind":"symbol","language":"jsts","symbolName":"setBaseImage","metadata":{"unresolvedName":"setBaseImage"}}],["symbol-name:setBaseDefinitionId",{"id":"symbol-name:setBaseDefinitionId","kind":"symbol","language":"jsts","symbolName":"setBaseDefinitionId","metadata":{"unresolvedName":"setBaseDefinitionId"}}],["symbol-name:setAptPackages",{"id":"symbol-name:setAptPackages","kind":"symbol","language":"jsts","symbolName":"setAptPackages","metadata":{"unresolvedName":"setAptPackages"}}],["external:((pkgs.apt as string[]) || []).map",{"id":"external:((pkgs.apt as string[]) || []).map","kind":"external","language":"jsts","metadata":{"unresolvedName":"((pkgs.apt as string[]) || []).map"}}],["symbol-name:setNpmPackages",{"id":"symbol-name:setNpmPackages","kind":"symbol","language":"jsts","symbolName":"setNpmPackages","metadata":{"unresolvedName":"setNpmPackages"}}],["external:((pkgs.npm_global as string[]) || []).map",{"id":"external:((pkgs.npm_global as string[]) || []).map","kind":"external","language":"jsts","metadata":{"unresolvedName":"((pkgs.npm_global as string[]) || []).map"}}],["symbol-name:setPipPackages",{"id":"symbol-name:setPipPackages","kind":"symbol","language":"jsts","symbolName":"setPipPackages","metadata":{"unresolvedName":"setPipPackages"}}],["external:((pkgs.pip as string[]) || []).map",{"id":"external:((pkgs.pip as string[]) || []).map","kind":"external","language":"jsts","metadata":{"unresolvedName":"((pkgs.pip as string[]) || []).map"}}],["symbol-name:setNodeVersion",{"id":"symbol-name:setNodeVersion","kind":"symbol","language":"jsts","symbolName":"setNodeVersion","metadata":{"unresolvedName":"setNodeVersion"}}],["symbol-name:setUserName",{"id":"symbol-name:setUserName","kind":"symbol","language":"jsts","symbolName":"setUserName","metadata":{"unresolvedName":"setUserName"}}],["symbol-name:setUserUid",{"id":"symbol-name:setUserUid","kind":"symbol","language":"jsts","symbolName":"setUserUid","metadata":{"unresolvedName":"setUserUid"}}],["symbol-name:setUserGid",{"id":"symbol-name:setUserGid","kind":"symbol","language":"jsts","symbolName":"setUserGid","metadata":{"unresolvedName":"setUserGid"}}],["symbol-name:setEnvVars",{"id":"symbol-name:setEnvVars","kind":"symbol","language":"jsts","symbolName":"setEnvVars","metadata":{"unresolvedName":"setEnvVars"}}],["external:Object.entries(env).map",{"id":"external:Object.entries(env).map","kind":"external","language":"jsts","metadata":{"unresolvedName":"Object.entries(env).map"}}],["external:Object.entries",{"id":"external:Object.entries","kind":"external","language":"jsts","metadata":{"unresolvedName":"Object.entries"}}],["symbol-name:setBuildScripts",{"id":"symbol-name:setBuildScripts","kind":"symbol","language":"jsts","symbolName":"setBuildScripts","metadata":{"unresolvedName":"setBuildScripts"}}],["symbol-name:setStartupScripts",{"id":"symbol-name:setStartupScripts","kind":"symbol","language":"jsts","symbolName":"setStartupScripts","metadata":{"unresolvedName":"setStartupScripts"}}],["symbol-name:setMounts",{"id":"symbol-name:setMounts","kind":"symbol","language":"jsts","symbolName":"setMounts","metadata":{"unresolvedName":"setMounts"}}],["symbol-name:setCommand",{"id":"symbol-name:setCommand","kind":"symbol","language":"jsts","symbolName":"setCommand","metadata":{"unresolvedName":"setCommand"}}],["symbol-name:setWorkingDir",{"id":"symbol-name:setWorkingDir","kind":"symbol","language":"jsts","symbolName":"setWorkingDir","metadata":{"unresolvedName":"setWorkingDir"}}],["symbol-name:setStdinOpen",{"id":"symbol-name:setStdinOpen","kind":"symbol","language":"jsts","symbolName":"setStdinOpen","metadata":{"unresolvedName":"setStdinOpen"}}],["symbol-name:setTty",{"id":"symbol-name:setTty","kind":"symbol","language":"jsts","symbolName":"setTty","metadata":{"unresolvedName":"setTty"}}],["external:aptPackages.map((p) => p.name).filter",{"id":"external:aptPackages.map((p) => p.name).filter","kind":"external","language":"jsts","metadata":{"unresolvedName":"aptPackages.map((p) => p.name).filter"}}],["external:aptPackages.map",{"id":"external:aptPackages.map","kind":"external","language":"jsts","metadata":{"unresolvedName":"aptPackages.map"}}],["external:npmPackages.map((p) => p.name).filter",{"id":"external:npmPackages.map((p) => p.name).filter","kind":"external","language":"jsts","metadata":{"unresolvedName":"npmPackages.map((p) => p.name).filter"}}],["external:npmPackages.map",{"id":"external:npmPackages.map","kind":"external","language":"jsts","metadata":{"unresolvedName":"npmPackages.map"}}],["external:pipPackages.map((p) => p.name).filter",{"id":"external:pipPackages.map((p) => p.name).filter","kind":"external","language":"jsts","metadata":{"unresolvedName":"pipPackages.map((p) => p.name).filter"}}],["external:pipPackages.map",{"id":"external:pipPackages.map","kind":"external","language":"jsts","metadata":{"unresolvedName":"pipPackages.map"}}],["external:envVars.forEach",{"id":"external:envVars.forEach","kind":"external","language":"jsts","metadata":{"unresolvedName":"envVars.forEach"}}],["external:buildScripts.filter",{"id":"external:buildScripts.filter","kind":"external","language":"jsts","metadata":{"unresolvedName":"buildScripts.filter"}}],["external:startupScripts.filter",{"id":"external:startupScripts.filter","kind":"external","language":"jsts","metadata":{"unresolvedName":"startupScripts.filter"}}],["symbol-name:parseInt",{"id":"symbol-name:parseInt","kind":"symbol","language":"jsts","symbolName":"parseInt","metadata":{"unresolvedName":"parseInt"}}],["external:command.filter",{"id":"external:command.filter","kind":"external","language":"jsts","metadata":{"unresolvedName":"command.filter"}}],["symbol-name:buildManifest",{"id":"symbol-name:buildManifest","kind":"symbol","language":"jsts","symbolName":"buildManifest","metadata":{"unresolvedName":"buildManifest"}}],["symbol-name:setPreviewError",{"id":"symbol-name:setPreviewError","kind":"symbol","language":"jsts","symbolName":"setPreviewError","metadata":{"unresolvedName":"setPreviewError"}}],["symbol-name:setPreviewLoading",{"id":"symbol-name:setPreviewLoading","kind":"symbol","language":"jsts","symbolName":"setPreviewLoading","metadata":{"unresolvedName":"setPreviewLoading"}}],["symbol-name:compileToolDefinition",{"id":"symbol-name:compileToolDefinition","kind":"symbol","language":"jsts","symbolName":"compileToolDefinition","metadata":{"unresolvedName":"compileToolDefinition"}}],["symbol-name:setPreview",{"id":"symbol-name:setPreview","kind":"symbol","language":"jsts","symbolName":"setPreview","metadata":{"unresolvedName":"setPreview"}}],["symbol-name:extractErrorMessage",{"id":"symbol-name:extractErrorMessage","kind":"symbol","language":"jsts","symbolName":"extractErrorMessage","metadata":{"unresolvedName":"extractErrorMessage"}}],["external:aptPackages.filter",{"id":"external:aptPackages.filter","kind":"external","language":"jsts","metadata":{"unresolvedName":"aptPackages.filter"}}],["external:npmPackages.filter",{"id":"external:npmPackages.filter","kind":"external","language":"jsts","metadata":{"unresolvedName":"npmPackages.filter"}}],["external:pipPackages.filter",{"id":"external:pipPackages.filter","kind":"external","language":"jsts","metadata":{"unresolvedName":"pipPackages.filter"}}],["external:envVars.filter",{"id":"external:envVars.filter","kind":"external","language":"jsts","metadata":{"unresolvedName":"envVars.filter"}}],["external:baseDefinitions.map",{"id":"external:baseDefinitions.map","kind":"external","language":"jsts","metadata":{"unresolvedName":"baseDefinitions.map"}}],["symbol-name:updateAptPackage",{"id":"symbol-name:updateAptPackage","kind":"symbol","language":"jsts","symbolName":"updateAptPackage","metadata":{"unresolvedName":"updateAptPackage"}}],["symbol-name:removeAptPackage",{"id":"symbol-name:removeAptPackage","kind":"symbol","language":"jsts","symbolName":"removeAptPackage","metadata":{"unresolvedName":"removeAptPackage"}}],["symbol-name:updateNpmPackage",{"id":"symbol-name:updateNpmPackage","kind":"symbol","language":"jsts","symbolName":"updateNpmPackage","metadata":{"unresolvedName":"updateNpmPackage"}}],["symbol-name:removeNpmPackage",{"id":"symbol-name:removeNpmPackage","kind":"symbol","language":"jsts","symbolName":"removeNpmPackage","metadata":{"unresolvedName":"removeNpmPackage"}}],["symbol-name:updatePipPackage",{"id":"symbol-name:updatePipPackage","kind":"symbol","language":"jsts","symbolName":"updatePipPackage","metadata":{"unresolvedName":"updatePipPackage"}}],["symbol-name:removePipPackage",{"id":"symbol-name:removePipPackage","kind":"symbol","language":"jsts","symbolName":"removePipPackage","metadata":{"unresolvedName":"removePipPackage"}}],["external:envVars.map",{"id":"external:envVars.map","kind":"external","language":"jsts","metadata":{"unresolvedName":"envVars.map"}}],["symbol-name:updateEnvVar",{"id":"symbol-name:updateEnvVar","kind":"symbol","language":"jsts","symbolName":"updateEnvVar","metadata":{"unresolvedName":"updateEnvVar"}}],["symbol-name:removeEnvVar",{"id":"symbol-name:removeEnvVar","kind":"symbol","language":"jsts","symbolName":"removeEnvVar","metadata":{"unresolvedName":"removeEnvVar"}}],["external:buildScripts.map",{"id":"external:buildScripts.map","kind":"external","language":"jsts","metadata":{"unresolvedName":"buildScripts.map"}}],["symbol-name:updateBuildScript",{"id":"symbol-name:updateBuildScript","kind":"symbol","language":"jsts","symbolName":"updateBuildScript","metadata":{"unresolvedName":"updateBuildScript"}}],["symbol-name:removeBuildScript",{"id":"symbol-name:removeBuildScript","kind":"symbol","language":"jsts","symbolName":"removeBuildScript","metadata":{"unresolvedName":"removeBuildScript"}}],["external:startupScripts.map",{"id":"external:startupScripts.map","kind":"external","language":"jsts","metadata":{"unresolvedName":"startupScripts.map"}}],["symbol-name:updateStartupScript",{"id":"symbol-name:updateStartupScript","kind":"symbol","language":"jsts","symbolName":"updateStartupScript","metadata":{"unresolvedName":"updateStartupScript"}}],["symbol-name:removeStartupScript",{"id":"symbol-name:removeStartupScript","kind":"symbol","language":"jsts","symbolName":"removeStartupScript","metadata":{"unresolvedName":"removeStartupScript"}}],["symbol-name:updateMount",{"id":"symbol-name:updateMount","kind":"symbol","language":"jsts","symbolName":"updateMount","metadata":{"unresolvedName":"updateMount"}}],["symbol-name:removeMount",{"id":"symbol-name:removeMount","kind":"symbol","language":"jsts","symbolName":"removeMount","metadata":{"unresolvedName":"removeMount"}}],["external:command.join",{"id":"external:command.join","kind":"external","language":"jsts","metadata":{"unresolvedName":"command.join"}}],["external:e.target.value.split",{"id":"external:e.target.value.split","kind":"external","language":"jsts","metadata":{"unresolvedName":"e.target.value.split"}}],["/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:",{"id":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx","symbolName":"","symbolKind":"function","exported":false,"metadata":{"line":262,"column":25,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:handlePreview",{"id":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:handlePreview","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx","symbolName":"handlePreview","symbolKind":"function","exported":false,"metadata":{"line":142,"column":25,"cyclomaticComplexity":3,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:updateAptPackage",{"id":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:updateAptPackage","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx","symbolName":"updateAptPackage","symbolKind":"function","exported":false,"metadata":{"line":165,"column":28,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:updateNpmPackage",{"id":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:updateNpmPackage","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx","symbolName":"updateNpmPackage","symbolKind":"function","exported":false,"metadata":{"line":173,"column":28,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:updatePipPackage",{"id":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:updatePipPackage","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx","symbolName":"updatePipPackage","symbolKind":"function","exported":false,"metadata":{"line":181,"column":28,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:updateEnvVar",{"id":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:updateEnvVar","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx","symbolName":"updateEnvVar","symbolKind":"function","exported":false,"metadata":{"line":189,"column":24,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:updateBuildScript",{"id":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:updateBuildScript","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx","symbolName":"updateBuildScript","symbolKind":"function","exported":false,"metadata":{"line":197,"column":29,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:updateStartupScript",{"id":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:updateStartupScript","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx","symbolName":"updateStartupScript","symbolKind":"function","exported":false,"metadata":{"line":205,"column":31,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:updateMount",{"id":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:updateMount","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx","symbolName":"updateMount","symbolKind":"function","exported":false,"metadata":{"line":227,"column":23,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/merge-dialog.tsx:MergeDialog",{"id":"/home/alex/projects/headquarter/apps/web/src/components/merge-dialog.tsx:MergeDialog","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/merge-dialog.tsx","symbolName":"MergeDialog","symbolKind":"function","exported":true,"metadata":{"line":16,"column":28,"cyclomaticComplexity":10,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["external:branches.filter",{"id":"external:branches.filter","kind":"external","language":"jsts","metadata":{"unresolvedName":"branches.filter"}}],["symbol-name:setSuccess",{"id":"symbol-name:setSuccess","kind":"symbol","language":"jsts","symbolName":"setSuccess","metadata":{"unresolvedName":"setSuccess"}}],["symbol-name:mergeBranches",{"id":"symbol-name:mergeBranches","kind":"symbol","language":"jsts","symbolName":"mergeBranches","metadata":{"unresolvedName":"mergeBranches"}}],["symbol-name:onMerge",{"id":"symbol-name:onMerge","kind":"symbol","language":"jsts","symbolName":"onMerge","metadata":{"unresolvedName":"onMerge"}}],["symbol-name:onClose",{"id":"symbol-name:onClose","kind":"symbol","language":"jsts","symbolName":"onClose","metadata":{"unresolvedName":"onClose"}}],["external:e.stopPropagation",{"id":"external:e.stopPropagation","kind":"external","language":"jsts","metadata":{"unresolvedName":"e.stopPropagation"}}],["symbol-name:setSourceBranch",{"id":"symbol-name:setSourceBranch","kind":"symbol","language":"jsts","symbolName":"setSourceBranch","metadata":{"unresolvedName":"setSourceBranch"}}],["external:availableBranches.map",{"id":"external:availableBranches.map","kind":"external","language":"jsts","metadata":{"unresolvedName":"availableBranches.map"}}],["symbol-name:setCommitMessage",{"id":"symbol-name:setCommitMessage","kind":"symbol","language":"jsts","symbolName":"setCommitMessage","metadata":{"unresolvedName":"setCommitMessage"}}],["/home/alex/projects/headquarter/apps/web/src/components/merge-dialog.tsx:handleMerge",{"id":"/home/alex/projects/headquarter/apps/web/src/components/merge-dialog.tsx:handleMerge","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/merge-dialog.tsx","symbolName":"handleMerge","symbolKind":"function","exported":false,"metadata":{"line":35,"column":23,"cyclomaticComplexity":4,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/merge-dialog.tsx:",{"id":"/home/alex/projects/headquarter/apps/web/src/components/merge-dialog.tsx:","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/merge-dialog.tsx","symbolName":"","symbolKind":"function","exported":false,"metadata":{"line":52,"column":18,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["file:/home/alex/projects/headquarter/apps/web/src/components/mobile-action-sheet.tsx",{"id":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-action-sheet.tsx","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/mobile-action-sheet.tsx","metadata":{"lineCount":89,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/mobile-action-sheet.tsx:MobileActionSheet",{"id":"/home/alex/projects/headquarter/apps/web/src/components/mobile-action-sheet.tsx:MobileActionSheet","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/mobile-action-sheet.tsx","symbolName":"MobileActionSheet","symbolKind":"function","exported":true,"metadata":{"line":20,"column":1,"cyclomaticComplexity":7,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["symbol-name:useRef",{"id":"symbol-name:useRef","kind":"symbol","language":"jsts","symbolName":"useRef","metadata":{"unresolvedName":"useRef"}}],["external:document.addEventListener",{"id":"external:document.addEventListener","kind":"external","language":"jsts","metadata":{"unresolvedName":"document.addEventListener"}}],["external:document.removeEventListener",{"id":"external:document.removeEventListener","kind":"external","language":"jsts","metadata":{"unresolvedName":"document.removeEventListener"}}],["external:actions.map",{"id":"external:actions.map","kind":"external","language":"jsts","metadata":{"unresolvedName":"actions.map"}}],["external:action.onClick",{"id":"external:action.onClick","kind":"external","language":"jsts","metadata":{"unresolvedName":"action.onClick"}}],["/home/alex/projects/headquarter/apps/web/src/components/mobile-action-sheet.tsx:",{"id":"/home/alex/projects/headquarter/apps/web/src/components/mobile-action-sheet.tsx:","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/mobile-action-sheet.tsx","symbolName":"","symbolKind":"function","exported":false,"metadata":{"line":67,"column":24,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/mobile-action-sheet.tsx:handleEscape",{"id":"/home/alex/projects/headquarter/apps/web/src/components/mobile-action-sheet.tsx:handleEscape","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/mobile-action-sheet.tsx","symbolName":"handleEscape","symbolKind":"function","exported":false,"metadata":{"line":40,"column":26,"cyclomaticComplexity":3,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["file:/home/alex/projects/headquarter/apps/web/src/components/mobile-detail-view.tsx",{"id":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-detail-view.tsx","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/mobile-detail-view.tsx","metadata":{"lineCount":96,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/mobile-detail-view.tsx:MobileDetailView",{"id":"/home/alex/projects/headquarter/apps/web/src/components/mobile-detail-view.tsx:MobileDetailView","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/mobile-detail-view.tsx","symbolName":"MobileDetailView","symbolKind":"function","exported":true,"metadata":{"line":18,"column":66,"cyclomaticComplexity":9,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["external:JSON.stringify",{"id":"external:JSON.stringify","kind":"external","language":"jsts","metadata":{"unresolvedName":"JSON.stringify"}}],["external:fields.map",{"id":"external:fields.map","kind":"external","language":"jsts","metadata":{"unresolvedName":"fields.map"}}],["symbol-name:renderValue",{"id":"symbol-name:renderValue","kind":"symbol","language":"jsts","symbolName":"renderValue","metadata":{"unresolvedName":"renderValue"}}],["/home/alex/projects/headquarter/apps/web/src/components/mobile-detail-view.tsx:renderValue",{"id":"/home/alex/projects/headquarter/apps/web/src/components/mobile-detail-view.tsx:renderValue","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/mobile-detail-view.tsx","symbolName":"renderValue","symbolKind":"function","exported":false,"metadata":{"line":26,"column":23,"cyclomaticComplexity":8,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["file:/home/alex/projects/headquarter/apps/web/src/components/mobile-edit-view.tsx",{"id":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-edit-view.tsx","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/mobile-edit-view.tsx","metadata":{"lineCount":162,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/mobile-edit-view.tsx:MobileEditView",{"id":"/home/alex/projects/headquarter/apps/web/src/components/mobile-edit-view.tsx:MobileEditView","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/mobile-edit-view.tsx","symbolName":"MobileEditView","symbolKind":"function","exported":true,"metadata":{"line":23,"column":62,"cyclomaticComplexity":18,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["external:fields?.forEach",{"id":"external:fields?.forEach","kind":"external","language":"jsts","metadata":{"unresolvedName":"fields?.forEach"}}],["symbol-name:setFormData",{"id":"symbol-name:setFormData","kind":"symbol","language":"jsts","symbolName":"setFormData","metadata":{"unresolvedName":"setFormData"}}],["external:fields?.map",{"id":"external:fields?.map","kind":"external","language":"jsts","metadata":{"unresolvedName":"fields?.map"}}],["external:field.options?.map",{"id":"external:field.options?.map","kind":"external","language":"jsts","metadata":{"unresolvedName":"field.options?.map"}}],["symbol-name:Boolean",{"id":"symbol-name:Boolean","kind":"symbol","language":"jsts","symbolName":"Boolean","metadata":{"unresolvedName":"Boolean"}}],["symbol-name:Number",{"id":"symbol-name:Number","kind":"symbol","language":"jsts","symbolName":"Number","metadata":{"unresolvedName":"Number"}}],["/home/alex/projects/headquarter/apps/web/src/components/mobile-edit-view.tsx:",{"id":"/home/alex/projects/headquarter/apps/web/src/components/mobile-edit-view.tsx:","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/mobile-edit-view.tsx","symbolName":"","symbolKind":"function","exported":false,"metadata":{"line":34,"column":23,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/mobile-edit-view.tsx:handleChange",{"id":"/home/alex/projects/headquarter/apps/web/src/components/mobile-edit-view.tsx:handleChange","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/mobile-edit-view.tsx","symbolName":"handleChange","symbolKind":"function","exported":false,"metadata":{"line":41,"column":24,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/mobile-edit-view.tsx:handleSubmit",{"id":"/home/alex/projects/headquarter/apps/web/src/components/mobile-edit-view.tsx:handleSubmit","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/mobile-edit-view.tsx","symbolName":"handleSubmit","symbolKind":"function","exported":false,"metadata":{"line":45,"column":24,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["file:/home/alex/projects/headquarter/apps/web/src/components/mobile-fab.tsx",{"id":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-fab.tsx","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/mobile-fab.tsx","metadata":{"lineCount":23,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/mobile-fab.tsx:MobileFAB",{"id":"/home/alex/projects/headquarter/apps/web/src/components/mobile-fab.tsx:MobileFAB","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/mobile-fab.tsx","symbolName":"MobileFAB","symbolKind":"function","exported":true,"metadata":{"line":8,"column":52,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["file:/home/alex/projects/headquarter/apps/web/src/components/mobile-list-view.tsx",{"id":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-list-view.tsx","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/mobile-list-view.tsx","metadata":{"lineCount":77,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/mobile-list-view.tsx:MobileListView",{"id":"/home/alex/projects/headquarter/apps/web/src/components/mobile-list-view.tsx:MobileListView","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/mobile-list-view.tsx","symbolName":"MobileListView","symbolKind":"function","exported":true,"metadata":{"line":22,"column":62,"cyclomaticComplexity":5,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["symbol-name:onSearch",{"id":"symbol-name:onSearch","kind":"symbol","language":"jsts","symbolName":"onSearch","metadata":{"unresolvedName":"onSearch"}}],["external:items.map",{"id":"external:items.map","kind":"external","language":"jsts","metadata":{"unresolvedName":"items.map"}}],["symbol-name:onItemClick",{"id":"symbol-name:onItemClick","kind":"symbol","language":"jsts","symbolName":"onItemClick","metadata":{"unresolvedName":"onItemClick"}}],["file:/home/alex/projects/headquarter/apps/web/src/components/tools-bottom-sheet.tsx",{"id":"file:/home/alex/projects/headquarter/apps/web/src/components/tools-bottom-sheet.tsx","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/tools-bottom-sheet.tsx","metadata":{"lineCount":63,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/mobile-nav.tsx:MobileNav",{"id":"/home/alex/projects/headquarter/apps/web/src/components/mobile-nav.tsx:MobileNav","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/mobile-nav.tsx","symbolName":"MobileNav","symbolKind":"function","exported":true,"metadata":{"line":26,"column":52,"cyclomaticComplexity":8,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["symbol-name:setToolsSheetOpen",{"id":"symbol-name:setToolsSheetOpen","kind":"symbol","language":"jsts","symbolName":"setToolsSheetOpen","metadata":{"unresolvedName":"setToolsSheetOpen"}}],["external:MOBILE_NAV_ITEMS.map",{"id":"external:MOBILE_NAV_ITEMS.map","kind":"external","language":"jsts","metadata":{"unresolvedName":"MOBILE_NAV_ITEMS.map"}}],["symbol-name:handleNavClick",{"id":"symbol-name:handleNavClick","kind":"symbol","language":"jsts","symbolName":"handleNavClick","metadata":{"unresolvedName":"handleNavClick"}}],["/home/alex/projects/headquarter/apps/web/src/components/mobile-nav.tsx:handleNavClick",{"id":"/home/alex/projects/headquarter/apps/web/src/components/mobile-nav.tsx:handleNavClick","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/mobile-nav.tsx","symbolName":"handleNavClick","symbolKind":"function","exported":false,"metadata":{"line":34,"column":26,"cyclomaticComplexity":2,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/mobile-nav.tsx:",{"id":"/home/alex/projects/headquarter/apps/web/src/components/mobile-nav.tsx:","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/mobile-nav.tsx","symbolName":"","symbolKind":"function","exported":false,"metadata":{"line":43,"column":31,"cyclomaticComplexity":6,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["file:/home/alex/projects/headquarter/apps/web/src/components/mobile-page-header.tsx",{"id":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-page-header.tsx","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/mobile-page-header.tsx","metadata":{"lineCount":34,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/mobile-page-header.tsx:MobilePageHeader",{"id":"/home/alex/projects/headquarter/apps/web/src/components/mobile-page-header.tsx:MobilePageHeader","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/mobile-page-header.tsx","symbolName":"MobilePageHeader","symbolKind":"function","exported":true,"metadata":{"line":11,"column":1,"cyclomaticComplexity":4,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["file:/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-header.tsx",{"id":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-header.tsx","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-header.tsx","metadata":{"lineCount":95,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-header.tsx:MobileTerminalHeader",{"id":"/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-header.tsx:MobileTerminalHeader","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-header.tsx","symbolName":"MobileTerminalHeader","symbolKind":"function","exported":true,"metadata":{"line":14,"column":74,"cyclomaticComplexity":7,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["symbol-name:onFontSizeChange",{"id":"symbol-name:onFontSizeChange","kind":"symbol","language":"jsts","symbolName":"onFontSizeChange","metadata":{"unresolvedName":"onFontSizeChange"}}],["file:/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-wrapper.tsx",{"id":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-wrapper.tsx","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-wrapper.tsx","metadata":{"lineCount":117,"featureKind":"library","trustBoundaries":[]}}],["file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx",{"id":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","metadata":{"lineCount":641,"featureKind":"library","trustBoundaries":[]}}],["file:/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx",{"id":"file:/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx","metadata":{"lineCount":97,"featureKind":"library","trustBoundaries":[]}}],["file:/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx",{"id":"file:/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx","metadata":{"lineCount":115,"featureKind":"library","trustBoundaries":[]}}],["file:/home/alex/projects/headquarter/apps/web/src/hooks/use-virtual-keyboard.ts",{"id":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-virtual-keyboard.ts","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/hooks/use-virtual-keyboard.ts","metadata":{"lineCount":69,"featureKind":"library","trustBoundaries":[]}}],["file:/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts",{"id":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts","metadata":{"lineCount":69,"featureKind":"library","trustBoundaries":[]}}],["file:/home/alex/projects/headquarter/apps/web/src/hooks/use-special-keys.ts",{"id":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-special-keys.ts","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/hooks/use-special-keys.ts","metadata":{"lineCount":141,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-wrapper.tsx:MobileTerminalWrapper",{"id":"/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-wrapper.tsx:MobileTerminalWrapper","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-wrapper.tsx","symbolName":"MobileTerminalWrapper","symbolKind":"function","exported":true,"metadata":{"line":19,"column":76,"cyclomaticComplexity":3,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["symbol-name:useVirtualKeyboard",{"id":"symbol-name:useVirtualKeyboard","kind":"symbol","language":"jsts","symbolName":"useVirtualKeyboard","metadata":{"unresolvedName":"useVirtualKeyboard"}}],["symbol-name:useAutoHide",{"id":"symbol-name:useAutoHide","kind":"symbol","language":"jsts","symbolName":"useAutoHide","metadata":{"unresolvedName":"useAutoHide"}}],["external:headerAutoHide.toggle",{"id":"external:headerAutoHide.toggle","kind":"external","language":"jsts","metadata":{"unresolvedName":"headerAutoHide.toggle"}}],["symbol-name:setTerminalRef",{"id":"symbol-name:setTerminalRef","kind":"symbol","language":"jsts","symbolName":"setTerminalRef","metadata":{"unresolvedName":"setTerminalRef"}}],["external:terminalRef?.sendData",{"id":"external:terminalRef?.sendData","kind":"external","language":"jsts","metadata":{"unresolvedName":"terminalRef?.sendData"}}],["external:terminalRef?.changeFontSize",{"id":"external:terminalRef?.changeFontSize","kind":"external","language":"jsts","metadata":{"unresolvedName":"terminalRef?.changeFontSize"}}],["symbol-name:setShowPanel",{"id":"symbol-name:setShowPanel","kind":"symbol","language":"jsts","symbolName":"setShowPanel","metadata":{"unresolvedName":"setShowPanel"}}],["external:terminalRef?.focusInput",{"id":"external:terminalRef?.focusInput","kind":"external","language":"jsts","metadata":{"unresolvedName":"terminalRef?.focusInput"}}],["/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-wrapper.tsx:",{"id":"/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-wrapper.tsx:","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-wrapper.tsx","symbolName":"","symbolKind":"function","exported":false,"metadata":{"line":52,"column":5,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["file:/home/alex/projects/headquarter/apps/web/src/components/protected-route.test.tsx",{"id":"file:/home/alex/projects/headquarter/apps/web/src/components/protected-route.test.tsx","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/protected-route.test.tsx","metadata":{"lineCount":50,"featureKind":"library","trustBoundaries":[]}}],["external:@testing-library/react",{"id":"external:@testing-library/react","kind":"external","language":"jsts","metadata":{"source":"@testing-library/react"}}],["file:/home/alex/projects/headquarter/apps/web/src/components/protected-route.tsx",{"id":"file:/home/alex/projects/headquarter/apps/web/src/components/protected-route.tsx","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/protected-route.tsx","metadata":{"lineCount":20,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/protected-route.test.tsx:",{"id":"/home/alex/projects/headquarter/apps/web/src/components/protected-route.test.tsx:","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/protected-route.test.tsx","symbolName":"","symbolKind":"function","exported":false,"metadata":{"line":28,"column":50,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["external:mockUseAuth.mockReturnValue",{"id":"external:mockUseAuth.mockReturnValue","kind":"external","language":"jsts","metadata":{"unresolvedName":"mockUseAuth.mockReturnValue"}}],["symbol-name:render",{"id":"symbol-name:render","kind":"symbol","language":"jsts","symbolName":"render","metadata":{"unresolvedName":"render"}}],["external:expect(screen.getByText(\"Checking session...\")).toBeInTheDocument",{"id":"external:expect(screen.getByText(\"Checking session...\")).toBeInTheDocument","kind":"external","language":"jsts","metadata":{"unresolvedName":"expect(screen.getByText(\"Checking session...\")).toBeInTheDocument"}}],["external:screen.getByText",{"id":"external:screen.getByText","kind":"external","language":"jsts","metadata":{"unresolvedName":"screen.getByText"}}],["external:expect(screen.getByText(\"login page\")).toBeInTheDocument",{"id":"external:expect(screen.getByText(\"login page\")).toBeInTheDocument","kind":"external","language":"jsts","metadata":{"unresolvedName":"expect(screen.getByText(\"login page\")).toBeInTheDocument"}}],["/home/alex/projects/headquarter/apps/web/src/components/protected-route.tsx:ProtectedRoute",{"id":"/home/alex/projects/headquarter/apps/web/src/components/protected-route.tsx:ProtectedRoute","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/protected-route.tsx","symbolName":"ProtectedRoute","symbolKind":"function","exported":true,"metadata":{"line":5,"column":31,"cyclomaticComplexity":3,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["symbol-name:encodeURIComponent",{"id":"symbol-name:encodeURIComponent","kind":"symbol","language":"jsts","symbolName":"encodeURIComponent","metadata":{"unresolvedName":"encodeURIComponent"}}],["file:/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx",{"id":"file:/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx","metadata":{"lineCount":115,"featureKind":"library","trustBoundaries":["filesystem","database"]}}],["file:/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.tsx",{"id":"file:/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.tsx","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.tsx","metadata":{"lineCount":100,"featureKind":"library","trustBoundaries":["filesystem","database"]}}],["/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:",{"id":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx","symbolName":"","symbolKind":"function","exported":false,"metadata":{"line":99,"column":19,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["filesystem","database"]}}],["external:vi.importActual",{"id":"external:vi.importActual","kind":"external","language":"jsts","metadata":{"unresolvedName":"vi.importActual"}}],["symbol-name:cleanup",{"id":"symbol-name:cleanup","kind":"symbol","language":"jsts","symbolName":"cleanup","metadata":{"unresolvedName":"cleanup"}}],["external:vi.restoreAllMocks",{"id":"external:vi.restoreAllMocks","kind":"external","language":"jsts","metadata":{"unresolvedName":"vi.restoreAllMocks"}}],["external:vi.spyOn(gitRepositoriesApi, \"listRepositories\").mockResolvedValue",{"id":"external:vi.spyOn(gitRepositoriesApi, \"listRepositories\").mockResolvedValue","kind":"external","language":"jsts","metadata":{"unresolvedName":"vi.spyOn(gitRepositoriesApi, \"listRepositories\").mockResolvedValue"}}],["external:vi.spyOn",{"id":"external:vi.spyOn","kind":"external","language":"jsts","metadata":{"unresolvedName":"vi.spyOn"}}],["external:vi.spyOn(gitRepositoriesApi, \"createRepository\").mockResolvedValue",{"id":"external:vi.spyOn(gitRepositoriesApi, \"createRepository\").mockResolvedValue","kind":"external","language":"jsts","metadata":{"unresolvedName":"vi.spyOn(gitRepositoriesApi, \"createRepository\").mockResolvedValue"}}],["symbol-name:waitFor",{"id":"symbol-name:waitFor","kind":"symbol","language":"jsts","symbolName":"waitFor","metadata":{"unresolvedName":"waitFor"}}],["external:expect(screen.getByText(\"Main Repo\")).toBeInTheDocument",{"id":"external:expect(screen.getByText(\"Main Repo\")).toBeInTheDocument","kind":"external","language":"jsts","metadata":{"unresolvedName":"expect(screen.getByText(\"Main Repo\")).toBeInTheDocument"}}],["external:fireEvent.click",{"id":"external:fireEvent.click","kind":"external","language":"jsts","metadata":{"unresolvedName":"fireEvent.click"}}],["external:screen.getByRole",{"id":"external:screen.getByRole","kind":"external","language":"jsts","metadata":{"unresolvedName":"screen.getByRole"}}],["external:fireEvent.change",{"id":"external:fireEvent.change","kind":"external","language":"jsts","metadata":{"unresolvedName":"fireEvent.change"}}],["external:screen.getByPlaceholderText",{"id":"external:screen.getByPlaceholderText","kind":"external","language":"jsts","metadata":{"unresolvedName":"screen.getByPlaceholderText"}}],["external:expect(createMock).toHaveBeenCalledWith",{"id":"external:expect(createMock).toHaveBeenCalledWith","kind":"external","language":"jsts","metadata":{"unresolvedName":"expect(createMock).toHaveBeenCalledWith"}}],["external:expect(listMock).toHaveBeenCalledTimes",{"id":"external:expect(listMock).toHaveBeenCalledTimes","kind":"external","language":"jsts","metadata":{"unresolvedName":"expect(listMock).toHaveBeenCalledTimes"}}],["file:/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx",{"id":"file:/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx","metadata":{"lineCount":344,"featureKind":"library","trustBoundaries":["filesystem","database"]}}],["/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.tsx:RepositoriesSettingsTab",{"id":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.tsx:RepositoriesSettingsTab","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.tsx","symbolName":"RepositoriesSettingsTab","symbolKind":"function","exported":true,"metadata":{"line":8,"column":50,"cyclomaticComplexity":11,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["filesystem","database"]}}],["symbol-name:useParams",{"id":"symbol-name:useParams","kind":"symbol","language":"jsts","symbolName":"useParams","metadata":{"unresolvedName":"useParams"}}],["symbol-name:listRepositories",{"id":"symbol-name:listRepositories","kind":"symbol","language":"jsts","symbolName":"listRepositories","metadata":{"unresolvedName":"listRepositories"}}],["symbol-name:setRepositories",{"id":"symbol-name:setRepositories","kind":"symbol","language":"jsts","symbolName":"setRepositories","metadata":{"unresolvedName":"setRepositories"}}],["symbol-name:loadRepositories",{"id":"symbol-name:loadRepositories","kind":"symbol","language":"jsts","symbolName":"loadRepositories","metadata":{"unresolvedName":"loadRepositories"}}],["external:window.confirm",{"id":"external:window.confirm","kind":"external","language":"jsts","metadata":{"unresolvedName":"window.confirm"}}],["symbol-name:deleteRepository",{"id":"symbol-name:deleteRepository","kind":"symbol","language":"jsts","symbolName":"deleteRepository","metadata":{"unresolvedName":"deleteRepository"}}],["external:current.filter",{"id":"external:current.filter","kind":"external","language":"jsts","metadata":{"unresolvedName":"current.filter"}}],["external:repositories.map",{"id":"external:repositories.map","kind":"external","language":"jsts","metadata":{"unresolvedName":"repositories.map"}}],["/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.tsx:",{"id":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.tsx:","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.tsx","symbolName":"","symbolKind":"function","exported":false,"metadata":{"line":32,"column":13,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["filesystem","database"]}}],["/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.tsx:handleDelete",{"id":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.tsx:handleDelete","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.tsx","symbolName":"handleDelete","symbolKind":"function","exported":false,"metadata":{"line":36,"column":24,"cyclomaticComplexity":4,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["filesystem","database"]}}],["/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:RepositoryCreateDialog",{"id":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:RepositoryCreateDialog","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx","symbolName":"RepositoryCreateDialog","symbolKind":"function","exported":true,"metadata":{"line":18,"column":39,"cyclomaticComplexity":40,"maxNestingDepth":4,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["filesystem","database"]}}],["symbol-name:clearTimeout",{"id":"symbol-name:clearTimeout","kind":"symbol","language":"jsts","symbolName":"clearTimeout","metadata":{"unresolvedName":"clearTimeout"}}],["symbol-name:setUrlValidation",{"id":"symbol-name:setUrlValidation","kind":"symbol","language":"jsts","symbolName":"setUrlValidation","metadata":{"unresolvedName":"setUrlValidation"}}],["external:advancedUrl.trim",{"id":"external:advancedUrl.trim","kind":"external","language":"jsts","metadata":{"unresolvedName":"advancedUrl.trim"}}],["symbol-name:parseGitUrl",{"id":"symbol-name:parseGitUrl","kind":"symbol","language":"jsts","symbolName":"parseGitUrl","metadata":{"unresolvedName":"parseGitUrl"}}],["symbol-name:setCreateMode",{"id":"symbol-name:setCreateMode","kind":"symbol","language":"jsts","symbolName":"setCreateMode","metadata":{"unresolvedName":"setCreateMode"}}],["symbol-name:setFormName",{"id":"symbol-name:setFormName","kind":"symbol","language":"jsts","symbolName":"setFormName","metadata":{"unresolvedName":"setFormName"}}],["symbol-name:setOwner",{"id":"symbol-name:setOwner","kind":"symbol","language":"jsts","symbolName":"setOwner","metadata":{"unresolvedName":"setOwner"}}],["symbol-name:setRepoName",{"id":"symbol-name:setRepoName","kind":"symbol","language":"jsts","symbolName":"setRepoName","metadata":{"unresolvedName":"setRepoName"}}],["symbol-name:setAdvancedUrl",{"id":"symbol-name:setAdvancedUrl","kind":"symbol","language":"jsts","symbolName":"setAdvancedUrl","metadata":{"unresolvedName":"setAdvancedUrl"}}],["symbol-name:setUseAdvancedUrl",{"id":"symbol-name:setUseAdvancedUrl","kind":"symbol","language":"jsts","symbolName":"setUseAdvancedUrl","metadata":{"unresolvedName":"setUseAdvancedUrl"}}],["symbol-name:setFormError",{"id":"symbol-name:setFormError","kind":"symbol","language":"jsts","symbolName":"setFormError","metadata":{"unresolvedName":"setFormError"}}],["symbol-name:setSelectedSshKey",{"id":"symbol-name:setSelectedSshKey","kind":"symbol","language":"jsts","symbolName":"setSelectedSshKey","metadata":{"unresolvedName":"setSelectedSshKey"}}],["symbol-name:resetForm",{"id":"symbol-name:resetForm","kind":"symbol","language":"jsts","symbolName":"resetForm","metadata":{"unresolvedName":"resetForm"}}],["external:formName.trim",{"id":"external:formName.trim","kind":"external","language":"jsts","metadata":{"unresolvedName":"formName.trim"}}],["external:owner.trim",{"id":"external:owner.trim","kind":"external","language":"jsts","metadata":{"unresolvedName":"owner.trim"}}],["external:repoName.trim",{"id":"external:repoName.trim","kind":"external","language":"jsts","metadata":{"unresolvedName":"repoName.trim"}}],["symbol-name:createRepository",{"id":"symbol-name:createRepository","kind":"symbol","language":"jsts","symbolName":"createRepository","metadata":{"unresolvedName":"createRepository"}}],["symbol-name:handleClose",{"id":"symbol-name:handleClose","kind":"symbol","language":"jsts","symbolName":"handleClose","metadata":{"unresolvedName":"handleClose"}}],["symbol-name:onCreated",{"id":"symbol-name:onCreated","kind":"symbol","language":"jsts","symbolName":"onCreated","metadata":{"unresolvedName":"onCreated"}}],["external:sshKeys.map",{"id":"external:sshKeys.map","kind":"external","language":"jsts","metadata":{"unresolvedName":"sshKeys.map"}}],["symbol-name:getUrlInputClass",{"id":"symbol-name:getUrlInputClass","kind":"symbol","language":"jsts","symbolName":"getUrlInputClass","metadata":{"unresolvedName":"getUrlInputClass"}}],["/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:",{"id":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx","symbolName":"","symbolKind":"function","exported":false,"metadata":{"line":87,"column":12,"cyclomaticComplexity":2,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["filesystem","database"]}}],["/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:loadKeys",{"id":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:loadKeys","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx","symbolName":"loadKeys","symbolKind":"function","exported":false,"metadata":{"line":43,"column":22,"cyclomaticComplexity":2,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["filesystem","database"]}}],["/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:resetForm",{"id":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:resetForm","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx","symbolName":"resetForm","symbolKind":"function","exported":false,"metadata":{"line":94,"column":21,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["filesystem","database"]}}],["/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:handleClose",{"id":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:handleClose","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx","symbolName":"handleClose","symbolKind":"function","exported":false,"metadata":{"line":106,"column":23,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["filesystem","database"]}}],["/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:handleSubmit",{"id":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:handleSubmit","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx","symbolName":"handleSubmit","symbolKind":"function","exported":false,"metadata":{"line":111,"column":24,"cyclomaticComplexity":10,"maxNestingDepth":4,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["filesystem","database"]}}],["/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:handleUseSuggestedUrl",{"id":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:handleUseSuggestedUrl","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx","symbolName":"handleUseSuggestedUrl","symbolKind":"function","exported":false,"metadata":{"line":155,"column":33,"cyclomaticComplexity":2,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["filesystem","database"]}}],["/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:getUrlInputClass",{"id":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:getUrlInputClass","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx","symbolName":"getUrlInputClass","symbolKind":"function","exported":false,"metadata":{"line":163,"column":28,"cyclomaticComplexity":4,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["filesystem","database"]}}],["file:/home/alex/projects/headquarter/apps/web/src/components/session-card.tsx",{"id":"file:/home/alex/projects/headquarter/apps/web/src/components/session-card.tsx","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/session-card.tsx","metadata":{"lineCount":339,"featureKind":"library","trustBoundaries":["auth","user-input"]}}],["/home/alex/projects/headquarter/apps/web/src/components/session-card.tsx:SessionCard",{"id":"/home/alex/projects/headquarter/apps/web/src/components/session-card.tsx:SessionCard","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/session-card.tsx","symbolName":"SessionCard","symbolKind":"function","exported":true,"metadata":{"line":39,"column":1,"cyclomaticComplexity":38,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["auth","user-input"]}}],["external:session.tool_type_interfaces?.includes",{"id":"external:session.tool_type_interfaces?.includes","kind":"external","language":"jsts","metadata":{"unresolvedName":"session.tool_type_interfaces?.includes"}}],["symbol-name:setShowStopConfirm",{"id":"symbol-name:setShowStopConfirm","kind":"symbol","language":"jsts","symbolName":"setShowStopConfirm","metadata":{"unresolvedName":"setShowStopConfirm"}}],["symbol-name:onStop",{"id":"symbol-name:onStop","kind":"symbol","language":"jsts","symbolName":"onStop","metadata":{"unresolvedName":"onStop"}}],["symbol-name:setShowDeleteConfirm",{"id":"symbol-name:setShowDeleteConfirm","kind":"symbol","language":"jsts","symbolName":"setShowDeleteConfirm","metadata":{"unresolvedName":"setShowDeleteConfirm"}}],["symbol-name:onDelete",{"id":"symbol-name:onDelete","kind":"symbol","language":"jsts","symbolName":"onDelete","metadata":{"unresolvedName":"onDelete"}}],["external:[\"running\", \"building\", \"starting\", \"probing\", \"pending\", \"unhealthy\"].includes",{"id":"external:[\"running\", \"building\", \"starting\", \"probing\", \"pending\", \"unhealthy\"].includes","kind":"external","language":"jsts","metadata":{"unresolvedName":"[\"running\", \"building\", \"starting\", \"probing\", \"pending\", \"unhealthy\"].includes"}}],["external:new Date(session.created_at).toLocaleString",{"id":"external:new Date(session.created_at).toLocaleString","kind":"external","language":"jsts","metadata":{"unresolvedName":"new Date(session.created_at).toLocaleString"}}],["symbol-name:onOpen",{"id":"symbol-name:onOpen","kind":"symbol","language":"jsts","symbolName":"onOpen","metadata":{"unresolvedName":"onOpen"}}],["symbol-name:setShowActionSheet",{"id":"symbol-name:setShowActionSheet","kind":"symbol","language":"jsts","symbolName":"setShowActionSheet","metadata":{"unresolvedName":"setShowActionSheet"}}],["symbol-name:onStart",{"id":"symbol-name:onStart","kind":"symbol","language":"jsts","symbolName":"onStart","metadata":{"unresolvedName":"onStart"}}],["symbol-name:onRecreateTunnel",{"id":"symbol-name:onRecreateTunnel","kind":"symbol","language":"jsts","symbolName":"onRecreateTunnel","metadata":{"unresolvedName":"onRecreateTunnel"}}],["/home/alex/projects/headquarter/apps/web/src/components/session-card.tsx:handleStop",{"id":"/home/alex/projects/headquarter/apps/web/src/components/session-card.tsx:handleStop","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/session-card.tsx","symbolName":"handleStop","symbolKind":"function","exported":false,"metadata":{"line":59,"column":22,"cyclomaticComplexity":2,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["auth","user-input"]}}],["/home/alex/projects/headquarter/apps/web/src/components/session-card.tsx:handleDelete",{"id":"/home/alex/projects/headquarter/apps/web/src/components/session-card.tsx:handleDelete","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/session-card.tsx","symbolName":"handleDelete","symbolKind":"function","exported":false,"metadata":{"line":68,"column":24,"cyclomaticComplexity":2,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["auth","user-input"]}}],["file:/home/alex/projects/headquarter/apps/web/src/components/session-list.tsx",{"id":"file:/home/alex/projects/headquarter/apps/web/src/components/session-list.tsx","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/session-list.tsx","metadata":{"lineCount":126,"featureKind":"library","trustBoundaries":["auth","user-input"]}}],["/home/alex/projects/headquarter/apps/web/src/components/session-list.tsx:SessionList",{"id":"/home/alex/projects/headquarter/apps/web/src/components/session-list.tsx:SessionList","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/session-list.tsx","symbolName":"SessionList","symbolKind":"function","exported":true,"metadata":{"line":24,"column":1,"cyclomaticComplexity":9,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["auth","user-input"]}}],["external:activeStatuses.includes",{"id":"external:activeStatuses.includes","kind":"external","language":"jsts","metadata":{"unresolvedName":"activeStatuses.includes"}}],["external:sessions\n .filter((s) => recentStatuses.includes(s.status))\n .slice",{"id":"external:sessions\n .filter((s) => recentStatuses.includes(s.status))\n .slice","kind":"external","language":"jsts","metadata":{"unresolvedName":"sessions\n .filter((s) => recentStatuses.includes(s.status))\n .slice"}}],["external:sessions\n .filter",{"id":"external:sessions\n .filter","kind":"external","language":"jsts","metadata":{"unresolvedName":"sessions\n .filter"}}],["external:recentStatuses.includes",{"id":"external:recentStatuses.includes","kind":"external","language":"jsts","metadata":{"unresolvedName":"recentStatuses.includes"}}],["external:activeSessions.map",{"id":"external:activeSessions.map","kind":"external","language":"jsts","metadata":{"unresolvedName":"activeSessions.map"}}],["external:recentSessions.map",{"id":"external:recentSessions.map","kind":"external","language":"jsts","metadata":{"unresolvedName":"recentSessions.map"}}],["file:/home/alex/projects/headquarter/apps/web/src/components/settings-tab-layout.tsx",{"id":"file:/home/alex/projects/headquarter/apps/web/src/components/settings-tab-layout.tsx","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/settings-tab-layout.tsx","metadata":{"lineCount":44,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/settings-tab-layout.tsx:SettingsTabLayout",{"id":"/home/alex/projects/headquarter/apps/web/src/components/settings-tab-layout.tsx:SettingsTabLayout","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/settings-tab-layout.tsx","symbolName":"SettingsTabLayout","symbolKind":"function","exported":true,"metadata":{"line":16,"column":68,"cyclomaticComplexity":2,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["external:tabs.map",{"id":"external:tabs.map","kind":"external","language":"jsts","metadata":{"unresolvedName":"tabs.map"}}],["/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx:SpecialKeysPanel",{"id":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx:SpecialKeysPanel","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx","symbolName":"SpecialKeysPanel","symbolKind":"function","exported":true,"metadata":{"line":38,"column":66,"cyclomaticComplexity":4,"maxNestingDepth":2,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["symbol-name:getSequenceWithModifier",{"id":"symbol-name:getSequenceWithModifier","kind":"symbol","language":"jsts","symbolName":"getSequenceWithModifier","metadata":{"unresolvedName":"getSequenceWithModifier"}}],["symbol-name:onSend",{"id":"symbol-name:onSend","kind":"symbol","language":"jsts","symbolName":"onSend","metadata":{"unresolvedName":"onSend"}}],["symbol-name:onModifierChange",{"id":"symbol-name:onModifierChange","kind":"symbol","language":"jsts","symbolName":"onModifierChange","metadata":{"unresolvedName":"onModifierChange"}}],["symbol-name:requestAnimationFrame",{"id":"symbol-name:requestAnimationFrame","kind":"symbol","language":"jsts","symbolName":"requestAnimationFrame","metadata":{"unresolvedName":"requestAnimationFrame"}}],["symbol-name:onKeepFocus",{"id":"symbol-name:onKeepFocus","kind":"symbol","language":"jsts","symbolName":"onKeepFocus","metadata":{"unresolvedName":"onKeepFocus"}}],["external:EXPANDED_KEYS.map",{"id":"external:EXPANDED_KEYS.map","kind":"external","language":"jsts","metadata":{"unresolvedName":"EXPANDED_KEYS.map"}}],["symbol-name:handlePointerDown",{"id":"symbol-name:handlePointerDown","kind":"symbol","language":"jsts","symbolName":"handlePointerDown","metadata":{"unresolvedName":"handlePointerDown"}}],["external:F_KEYS.map",{"id":"external:F_KEYS.map","kind":"external","language":"jsts","metadata":{"unresolvedName":"F_KEYS.map"}}],["/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx:handlePointerDown",{"id":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx:handlePointerDown","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx","symbolName":"handlePointerDown","symbolKind":"function","exported":false,"metadata":{"line":48,"column":29,"cyclomaticComplexity":3,"maxNestingDepth":2,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx:",{"id":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx:","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx","symbolName":"","symbolKind":"function","exported":false,"metadata":{"line":70,"column":27,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx:handleOverlayPointerDown",{"id":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx:handleOverlayPointerDown","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx","symbolName":"handleOverlayPointerDown","symbolKind":"function","exported":false,"metadata":{"line":66,"column":36,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx:SpecialKeysStrip",{"id":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx:SpecialKeysStrip","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx","symbolName":"SpecialKeysStrip","symbolKind":"function","exported":true,"metadata":{"line":24,"column":66,"cyclomaticComplexity":11,"maxNestingDepth":2,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["symbol-name:onMoreClick",{"id":"symbol-name:onMoreClick","kind":"symbol","language":"jsts","symbolName":"onMoreClick","metadata":{"unresolvedName":"onMoreClick"}}],["external:PRIMARY_KEYS.map",{"id":"external:PRIMARY_KEYS.map","kind":"external","language":"jsts","metadata":{"unresolvedName":"PRIMARY_KEYS.map"}}],["/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx:handlePointerDown",{"id":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx:handlePointerDown","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx","symbolName":"handlePointerDown","symbolKind":"function","exported":false,"metadata":{"line":32,"column":29,"cyclomaticComplexity":6,"maxNestingDepth":2,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx:",{"id":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx:","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx","symbolName":"","symbolKind":"function","exported":false,"metadata":{"line":61,"column":27,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx:handleMorePointerDown",{"id":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx:handleMorePointerDown","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx","symbolName":"handleMorePointerDown","symbolKind":"function","exported":false,"metadata":{"line":58,"column":33,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["filesystem","database"]}}],["/home/alex/projects/headquarter/apps/web/src/components/syntax-highlighter.tsx:SyntaxHighlighter",{"id":"/home/alex/projects/headquarter/apps/web/src/components/syntax-highlighter.tsx:SyntaxHighlighter","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/syntax-highlighter.tsx","symbolName":"SyntaxHighlighter","symbolKind":"function","exported":true,"metadata":{"line":12,"column":68,"cyclomaticComplexity":3,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["symbol-name:setHighlighted",{"id":"symbol-name:setHighlighted","kind":"symbol","language":"jsts","symbolName":"setHighlighted","metadata":{"unresolvedName":"setHighlighted"}}],["external:navigator.clipboard.writeText",{"id":"external:navigator.clipboard.writeText","kind":"external","language":"jsts","metadata":{"unresolvedName":"navigator.clipboard.writeText"}}],["symbol-name:setCopied",{"id":"symbol-name:setCopied","kind":"symbol","language":"jsts","symbolName":"setCopied","metadata":{"unresolvedName":"setCopied"}}],["external:code.split",{"id":"external:code.split","kind":"external","language":"jsts","metadata":{"unresolvedName":"code.split"}}],["external:lines.map",{"id":"external:lines.map","kind":"external","language":"jsts","metadata":{"unresolvedName":"lines.map"}}],["/home/alex/projects/headquarter/apps/web/src/components/syntax-highlighter.tsx:",{"id":"/home/alex/projects/headquarter/apps/web/src/components/syntax-highlighter.tsx:","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/syntax-highlighter.tsx","symbolName":"","symbolKind":"function","exported":false,"metadata":{"line":20,"column":13,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/syntax-highlighter.tsx:highlight",{"id":"/home/alex/projects/headquarter/apps/web/src/components/syntax-highlighter.tsx:highlight","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/syntax-highlighter.tsx","symbolName":"highlight","symbolKind":"function","exported":false,"metadata":{"line":21,"column":23,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/syntax-highlighter.tsx:handleCopy",{"id":"/home/alex/projects/headquarter/apps/web/src/components/syntax-highlighter.tsx:handleCopy","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/syntax-highlighter.tsx","symbolName":"handleCopy","symbolKind":"function","exported":false,"metadata":{"line":28,"column":22,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["external:xterm",{"id":"external:xterm","kind":"external","language":"jsts","metadata":{"source":"xterm"}}],["external:xterm-addon-fit",{"id":"external:xterm-addon-fit","kind":"external","language":"jsts","metadata":{"source":"xterm-addon-fit"}}],["external:xterm-addon-web-links",{"id":"external:xterm-addon-web-links","kind":"external","language":"jsts","metadata":{"source":"xterm-addon-web-links"}}],["external:xterm/css/xterm.css",{"id":"external:xterm/css/xterm.css","kind":"external","language":"jsts","metadata":{"source":"xterm/css/xterm.css"}}],["/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent",{"id":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","symbolName":"TerminalComponent","symbolKind":"function","exported":true,"metadata":{"line":37,"column":59,"cyclomaticComplexity":92,"maxNestingDepth":8,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["external:localStorage.getItem",{"id":"external:localStorage.getItem","kind":"external","language":"jsts","metadata":{"unresolvedName":"localStorage.getItem"}}],["external:Math.min",{"id":"external:Math.min","kind":"external","language":"jsts","metadata":{"unresolvedName":"Math.min"}}],["external:apiUrl.replace(/^https?:\\/\\//, \"\").replace",{"id":"external:apiUrl.replace(/^https?:\\/\\//, \"\").replace","kind":"external","language":"jsts","metadata":{"unresolvedName":"apiUrl.replace(/^https?:\\/\\//, \"\").replace"}}],["external:apiUrl.replace",{"id":"external:apiUrl.replace","kind":"external","language":"jsts","metadata":{"unresolvedName":"apiUrl.replace"}}],["external:ws.send",{"id":"external:ws.send","kind":"external","language":"jsts","metadata":{"unresolvedName":"ws.send"}}],["external:window.clearInterval",{"id":"external:window.clearInterval","kind":"external","language":"jsts","metadata":{"unresolvedName":"window.clearInterval"}}],["external:window.setInterval",{"id":"external:window.setInterval","kind":"external","language":"jsts","metadata":{"unresolvedName":"window.setInterval"}}],["external:ws.close",{"id":"external:ws.close","kind":"external","language":"jsts","metadata":{"unresolvedName":"ws.close"}}],["external:event.data.arrayBuffer().then",{"id":"external:event.data.arrayBuffer().then","kind":"external","language":"jsts","metadata":{"unresolvedName":"event.data.arrayBuffer().then"}}],["external:event.data.arrayBuffer",{"id":"external:event.data.arrayBuffer","kind":"external","language":"jsts","metadata":{"unresolvedName":"event.data.arrayBuffer"}}],["external:termRef.current?.write",{"id":"external:termRef.current?.write","kind":"external","language":"jsts","metadata":{"unresolvedName":"termRef.current?.write"}}],["external:JSON.parse",{"id":"external:JSON.parse","kind":"external","language":"jsts","metadata":{"unresolvedName":"JSON.parse"}}],["external:termRef.current.clear",{"id":"external:termRef.current.clear","kind":"external","language":"jsts","metadata":{"unresolvedName":"termRef.current.clear"}}],["external:fitAddonRef.current.fit",{"id":"external:fitAddonRef.current.fit","kind":"external","language":"jsts","metadata":{"unresolvedName":"fitAddonRef.current.fit"}}],["external:currentWs.send",{"id":"external:currentWs.send","kind":"external","language":"jsts","metadata":{"unresolvedName":"currentWs.send"}}],["external:Math.pow",{"id":"external:Math.pow","kind":"external","language":"jsts","metadata":{"unresolvedName":"Math.pow"}}],["symbol-name:connectWebSocket",{"id":"symbol-name:connectWebSocket","kind":"symbol","language":"jsts","symbolName":"connectWebSocket","metadata":{"unresolvedName":"connectWebSocket"}}],["symbol-name:calculateFontSize",{"id":"symbol-name:calculateFontSize","kind":"symbol","language":"jsts","symbolName":"calculateFontSize","metadata":{"unresolvedName":"calculateFontSize"}}],["external:term.loadAddon",{"id":"external:term.loadAddon","kind":"external","language":"jsts","metadata":{"unresolvedName":"term.loadAddon"}}],["external:termRef.current.refresh",{"id":"external:termRef.current.refresh","kind":"external","language":"jsts","metadata":{"unresolvedName":"termRef.current.refresh"}}],["external:term.open",{"id":"external:term.open","kind":"external","language":"jsts","metadata":{"unresolvedName":"term.open"}}],["symbol-name:fitTerminal",{"id":"symbol-name:fitTerminal","kind":"symbol","language":"jsts","symbolName":"fitTerminal","metadata":{"unresolvedName":"fitTerminal"}}],["external:document.fonts.ready.then",{"id":"external:document.fonts.ready.then","kind":"external","language":"jsts","metadata":{"unresolvedName":"document.fonts.ready.then"}}],["external:term.onData",{"id":"external:term.onData","kind":"external","language":"jsts","metadata":{"unresolvedName":"term.onData"}}],["symbol-name:applyModifierToChar",{"id":"symbol-name:applyModifierToChar","kind":"symbol","language":"jsts","symbolName":"applyModifierToChar","metadata":{"unresolvedName":"applyModifierToChar"}}],["external:resizeObserver.observe",{"id":"external:resizeObserver.observe","kind":"external","language":"jsts","metadata":{"unresolvedName":"resizeObserver.observe"}}],["external:termRef.current?.focus",{"id":"external:termRef.current?.focus","kind":"external","language":"jsts","metadata":{"unresolvedName":"termRef.current?.focus"}}],["external:handleFontSizeChangeRef.current",{"id":"external:handleFontSizeChangeRef.current","kind":"external","language":"jsts","metadata":{"unresolvedName":"handleFontSizeChangeRef.current"}}],["external:onTerminalReadyRef.current",{"id":"external:onTerminalReadyRef.current","kind":"external","language":"jsts","metadata":{"unresolvedName":"onTerminalReadyRef.current"}}],["external:resizeObserver.disconnect",{"id":"external:resizeObserver.disconnect","kind":"external","language":"jsts","metadata":{"unresolvedName":"resizeObserver.disconnect"}}],["external:term.dispose",{"id":"external:term.dispose","kind":"external","language":"jsts","metadata":{"unresolvedName":"term.dispose"}}],["external:wsRef.current.send",{"id":"external:wsRef.current.send","kind":"external","language":"jsts","metadata":{"unresolvedName":"wsRef.current.send"}}],["symbol-name:onTerminalReady",{"id":"symbol-name:onTerminalReady","kind":"symbol","language":"jsts","symbolName":"onTerminalReady","metadata":{"unresolvedName":"onTerminalReady"}}],["symbol-name:setFontSize",{"id":"symbol-name:setFontSize","kind":"symbol","language":"jsts","symbolName":"setFontSize","metadata":{"unresolvedName":"setFontSize"}}],["external:localStorage.setItem",{"id":"external:localStorage.setItem","kind":"external","language":"jsts","metadata":{"unresolvedName":"localStorage.setItem"}}],["external:newSize.toString",{"id":"external:newSize.toString","kind":"external","language":"jsts","metadata":{"unresolvedName":"newSize.toString"}}],["external:termRef.current.getSelection",{"id":"external:termRef.current.getSelection","kind":"external","language":"jsts","metadata":{"unresolvedName":"termRef.current.getSelection"}}],["external:document.createElement",{"id":"external:document.createElement","kind":"external","language":"jsts","metadata":{"unresolvedName":"document.createElement"}}],["external:document.body.appendChild",{"id":"external:document.body.appendChild","kind":"external","language":"jsts","metadata":{"unresolvedName":"document.body.appendChild"}}],["external:textarea.select",{"id":"external:textarea.select","kind":"external","language":"jsts","metadata":{"unresolvedName":"textarea.select"}}],["external:document.execCommand",{"id":"external:document.execCommand","kind":"external","language":"jsts","metadata":{"unresolvedName":"document.execCommand"}}],["external:document.body.removeChild",{"id":"external:document.body.removeChild","kind":"external","language":"jsts","metadata":{"unresolvedName":"document.body.removeChild"}}],["external:navigator.clipboard.readText",{"id":"external:navigator.clipboard.readText","kind":"external","language":"jsts","metadata":{"unresolvedName":"navigator.clipboard.readText"}}],["external:termRef.current.focus",{"id":"external:termRef.current.focus","kind":"external","language":"jsts","metadata":{"unresolvedName":"termRef.current.focus"}}],["symbol-name:handleFontSizeChange",{"id":"symbol-name:handleFontSizeChange","kind":"symbol","language":"jsts","symbolName":"handleFontSizeChange","metadata":{"unresolvedName":"handleFontSizeChange"}}],["symbol-name:setShowResetConfirm",{"id":"symbol-name:setShowResetConfirm","kind":"symbol","language":"jsts","symbolName":"setShowResetConfirm","metadata":{"unresolvedName":"setShowResetConfirm"}}],["/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:",{"id":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","symbolName":"","symbolKind":"function","exported":false,"metadata":{"line":614,"column":17,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:fitTerminal",{"id":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:fitTerminal","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","symbolName":"fitTerminal","symbolKind":"function","exported":false,"metadata":{"line":264,"column":23,"cyclomaticComplexity":10,"maxNestingDepth":2,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:doInitialFit",{"id":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:doInitialFit","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","symbolName":"doInitialFit","symbolKind":"function","exported":false,"metadata":{"line":293,"column":24,"cyclomaticComplexity":5,"maxNestingDepth":2,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:handleWindowResize",{"id":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:handleWindowResize","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","symbolName":"handleWindowResize","symbolKind":"function","exported":false,"metadata":{"line":356,"column":30,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:sendData",{"id":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:sendData","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","symbolName":"sendData","symbolKind":"function","exported":false,"metadata":{"line":424,"column":21,"cyclomaticComplexity":2,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:focusInput",{"id":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:focusInput","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","symbolName":"focusInput","symbolKind":"function","exported":false,"metadata":{"line":429,"column":23,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:changeFontSize",{"id":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:changeFontSize","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","symbolName":"changeFontSize","symbolKind":"function","exported":false,"metadata":{"line":432,"column":27,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:handleVisibilityChange",{"id":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:handleVisibilityChange","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","symbolName":"handleVisibilityChange","symbolKind":"function","exported":false,"metadata":{"line":387,"column":34,"cyclomaticComplexity":5,"maxNestingDepth":2,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:handleFontSizeChange",{"id":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:handleFontSizeChange","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","symbolName":"handleFontSizeChange","symbolKind":"function","exported":false,"metadata":{"line":439,"column":31,"cyclomaticComplexity":7,"maxNestingDepth":4,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:handleCopy",{"id":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:handleCopy","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","symbolName":"handleCopy","symbolKind":"function","exported":false,"metadata":{"line":471,"column":21,"cyclomaticComplexity":4,"maxNestingDepth":2,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:handlePaste",{"id":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:handlePaste","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","symbolName":"handlePaste","symbolKind":"function","exported":false,"metadata":{"line":489,"column":22,"cyclomaticComplexity":3,"maxNestingDepth":2,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:handleTerminalClick",{"id":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:handleTerminalClick","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","symbolName":"handleTerminalClick","symbolKind":"function","exported":false,"metadata":{"line":501,"column":30,"cyclomaticComplexity":3,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/tools-bottom-sheet.tsx:ToolsBottomSheet",{"id":"/home/alex/projects/headquarter/apps/web/src/components/tools-bottom-sheet.tsx:ToolsBottomSheet","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/tools-bottom-sheet.tsx","symbolName":"ToolsBottomSheet","symbolKind":"function","exported":true,"metadata":{"line":14,"column":66,"cyclomaticComplexity":4,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["external:TOOLS_ITEMS.map",{"id":"external:TOOLS_ITEMS.map","kind":"external","language":"jsts","metadata":{"unresolvedName":"TOOLS_ITEMS.map"}}],["symbol-name:handleSelect",{"id":"symbol-name:handleSelect","kind":"symbol","language":"jsts","symbolName":"handleSelect","metadata":{"unresolvedName":"handleSelect"}}],["/home/alex/projects/headquarter/apps/web/src/components/tools-bottom-sheet.tsx:handleSelect",{"id":"/home/alex/projects/headquarter/apps/web/src/components/tools-bottom-sheet.tsx:handleSelect","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/tools-bottom-sheet.tsx","symbolName":"handleSelect","symbolKind":"function","exported":false,"metadata":{"line":23,"column":24,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["file:/home/alex/projects/headquarter/apps/web/src/components/workspace-header.tsx",{"id":"file:/home/alex/projects/headquarter/apps/web/src/components/workspace-header.tsx","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/workspace-header.tsx","metadata":{"lineCount":49,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/components/workspace-header.tsx:WorkspaceHeader",{"id":"/home/alex/projects/headquarter/apps/web/src/components/workspace-header.tsx:WorkspaceHeader","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/components/workspace-header.tsx","symbolName":"WorkspaceHeader","symbolKind":"function","exported":true,"metadata":{"line":16,"column":32,"cyclomaticComplexity":3,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["file:/home/alex/projects/headquarter/apps/web/src/hooks/use-async-data.ts",{"id":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-async-data.ts","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/hooks/use-async-data.ts","metadata":{"lineCount":43,"featureKind":"service","trustBoundaries":["network","external-api","serialization"]}}],["/home/alex/projects/headquarter/apps/web/src/hooks/use-async-data.ts:useAsyncData",{"id":"/home/alex/projects/headquarter/apps/web/src/hooks/use-async-data.ts:useAsyncData","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/hooks/use-async-data.ts","symbolName":"useAsyncData","symbolKind":"function","exported":true,"metadata":{"line":12,"column":1,"cyclomaticComplexity":3,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"service","trustBoundaries":["network","external-api","serialization"]}}],["symbol-name:fetcher",{"id":"symbol-name:fetcher","kind":"symbol","language":"jsts","symbolName":"fetcher","metadata":{"unresolvedName":"fetcher"}}],["symbol-name:setData",{"id":"symbol-name:setData","kind":"symbol","language":"jsts","symbolName":"setData","metadata":{"unresolvedName":"setData"}}],["symbol-name:load",{"id":"symbol-name:load","kind":"symbol","language":"jsts","symbolName":"load","metadata":{"unresolvedName":"load"}}],["/home/alex/projects/headquarter/apps/web/src/hooks/use-async-data.ts:",{"id":"/home/alex/projects/headquarter/apps/web/src/hooks/use-async-data.ts:","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/hooks/use-async-data.ts","symbolName":"","symbolKind":"function","exported":false,"metadata":{"line":37,"column":13,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"service","trustBoundaries":["network","external-api","serialization"]}}],["/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts:useAutoHide",{"id":"/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts:useAutoHide","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts","symbolName":"useAutoHide","symbolKind":"function","exported":true,"metadata":{"line":8,"column":1,"cyclomaticComplexity":9,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["symbol-name:setIsVisible",{"id":"symbol-name:setIsVisible","kind":"symbol","language":"jsts","symbolName":"setIsVisible","metadata":{"unresolvedName":"setIsVisible"}}],["symbol-name:hide",{"id":"symbol-name:hide","kind":"symbol","language":"jsts","symbolName":"hide","metadata":{"unresolvedName":"hide"}}],["symbol-name:show",{"id":"symbol-name:show","kind":"symbol","language":"jsts","symbolName":"show","metadata":{"unresolvedName":"show"}}],["/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts:",{"id":"/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts:","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts","symbolName":"","symbolKind":"function","exported":false,"metadata":{"line":55,"column":12,"cyclomaticComplexity":2,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["file:/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts",{"id":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts","metadata":{"lineCount":159,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts:useInstanceActions",{"id":"/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts:useInstanceActions","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts","symbolName":"useInstanceActions","symbolKind":"function","exported":true,"metadata":{"line":27,"column":1,"cyclomaticComplexity":15,"maxNestingDepth":3,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["external:window.open",{"id":"external:window.open","kind":"external","language":"jsts","metadata":{"unresolvedName":"window.open"}}],["symbol-name:setLoadingSessionId",{"id":"symbol-name:setLoadingSessionId","kind":"symbol","language":"jsts","symbolName":"setLoadingSessionId","metadata":{"unresolvedName":"setLoadingSessionId"}}],["symbol-name:setDirtyDeleteSession",{"id":"symbol-name:setDirtyDeleteSession","kind":"symbol","language":"jsts","symbolName":"setDirtyDeleteSession","metadata":{"unresolvedName":"setDirtyDeleteSession"}}],["symbol-name:setDirtyDeleteFiles",{"id":"symbol-name:setDirtyDeleteFiles","kind":"symbol","language":"jsts","symbolName":"setDirtyDeleteFiles","metadata":{"unresolvedName":"setDirtyDeleteFiles"}}],["/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts:",{"id":"/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts:","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts","symbolName":"","symbolKind":"function","exported":false,"metadata":{"line":141,"column":40,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/hooks/use-mobile-viewport.ts:useMobileViewport",{"id":"/home/alex/projects/headquarter/apps/web/src/hooks/use-mobile-viewport.ts:useMobileViewport","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/hooks/use-mobile-viewport.ts","symbolName":"useMobileViewport","symbolKind":"function","exported":true,"metadata":{"line":5,"column":1,"cyclomaticComplexity":2,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["symbol-name:setIsMobile",{"id":"symbol-name:setIsMobile","kind":"symbol","language":"jsts","symbolName":"setIsMobile","metadata":{"unresolvedName":"setIsMobile"}}],["/home/alex/projects/headquarter/apps/web/src/hooks/use-mobile-viewport.ts:",{"id":"/home/alex/projects/headquarter/apps/web/src/hooks/use-mobile-viewport.ts:","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/hooks/use-mobile-viewport.ts","symbolName":"","symbolKind":"function","exported":false,"metadata":{"line":11,"column":13,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/hooks/use-mobile-viewport.ts:handleResize",{"id":"/home/alex/projects/headquarter/apps/web/src/hooks/use-mobile-viewport.ts:handleResize","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/hooks/use-mobile-viewport.ts","symbolName":"handleResize","symbolKind":"function","exported":false,"metadata":{"line":12,"column":26,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/hooks/use-special-keys.ts:getSequenceWithModifier",{"id":"/home/alex/projects/headquarter/apps/web/src/hooks/use-special-keys.ts:getSequenceWithModifier","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/hooks/use-special-keys.ts","symbolName":"getSequenceWithModifier","symbolKind":"function","exported":true,"metadata":{"line":106,"column":1,"cyclomaticComplexity":7,"maxNestingDepth":2,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["external:char.toLowerCase",{"id":"external:char.toLowerCase","kind":"external","language":"jsts","metadata":{"unresolvedName":"char.toLowerCase"}}],["/home/alex/projects/headquarter/apps/web/src/hooks/use-special-keys.ts:applyModifierToChar",{"id":"/home/alex/projects/headquarter/apps/web/src/hooks/use-special-keys.ts:applyModifierToChar","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/hooks/use-special-keys.ts","symbolName":"applyModifierToChar","symbolKind":"function","exported":true,"metadata":{"line":130,"column":1,"cyclomaticComplexity":3,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/hooks/use-theme.ts:useTheme",{"id":"/home/alex/projects/headquarter/apps/web/src/hooks/use-theme.ts:useTheme","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/hooks/use-theme.ts","symbolName":"useTheme","symbolKind":"function","exported":true,"metadata":{"line":5,"column":1,"cyclomaticComplexity":4,"maxNestingDepth":2,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["symbol-name:getUserConfig",{"id":"symbol-name:getUserConfig","kind":"symbol","language":"jsts","symbolName":"getUserConfig","metadata":{"unresolvedName":"getUserConfig"}}],["external:document.documentElement.removeAttribute",{"id":"external:document.documentElement.removeAttribute","kind":"external","language":"jsts","metadata":{"unresolvedName":"document.documentElement.removeAttribute"}}],["external:document.documentElement.setAttribute",{"id":"external:document.documentElement.setAttribute","kind":"external","language":"jsts","metadata":{"unresolvedName":"document.documentElement.setAttribute"}}],["/home/alex/projects/headquarter/apps/web/src/hooks/use-theme.ts:",{"id":"/home/alex/projects/headquarter/apps/web/src/hooks/use-theme.ts:","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/hooks/use-theme.ts","symbolName":"","symbolKind":"function","exported":false,"metadata":{"line":7,"column":11,"cyclomaticComplexity":4,"maxNestingDepth":2,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/hooks/use-virtual-keyboard.ts:useVirtualKeyboard",{"id":"/home/alex/projects/headquarter/apps/web/src/hooks/use-virtual-keyboard.ts:useVirtualKeyboard","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/hooks/use-virtual-keyboard.ts","symbolName":"useVirtualKeyboard","symbolKind":"function","exported":true,"metadata":{"line":9,"column":1,"cyclomaticComplexity":7,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["symbol-name:setState",{"id":"symbol-name:setState","kind":"symbol","language":"jsts","symbolName":"setState","metadata":{"unresolvedName":"setState"}}],["external:visualViewport.addEventListener",{"id":"external:visualViewport.addEventListener","kind":"external","language":"jsts","metadata":{"unresolvedName":"visualViewport.addEventListener"}}],["symbol-name:updateKeyboardState",{"id":"symbol-name:updateKeyboardState","kind":"symbol","language":"jsts","symbolName":"updateKeyboardState","metadata":{"unresolvedName":"updateKeyboardState"}}],["external:visualViewport.removeEventListener",{"id":"external:visualViewport.removeEventListener","kind":"external","language":"jsts","metadata":{"unresolvedName":"visualViewport.removeEventListener"}}],["/home/alex/projects/headquarter/apps/web/src/hooks/use-virtual-keyboard.ts:",{"id":"/home/alex/projects/headquarter/apps/web/src/hooks/use-virtual-keyboard.ts:","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/hooks/use-virtual-keyboard.ts","symbolName":"","symbolKind":"function","exported":false,"metadata":{"line":57,"column":12,"cyclomaticComplexity":2,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["file:/home/alex/projects/headquarter/apps/web/src/main.tsx",{"id":"file:/home/alex/projects/headquarter/apps/web/src/main.tsx","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/main.tsx","metadata":{"lineCount":21,"featureKind":"library","trustBoundaries":[]}}],["external:react-dom/client",{"id":"external:react-dom/client","kind":"external","language":"jsts","metadata":{"source":"react-dom/client"}}],["file:/home/alex/projects/headquarter/apps/web/src/router.tsx",{"id":"file:/home/alex/projects/headquarter/apps/web/src/router.tsx","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/router.tsx","metadata":{"lineCount":56,"featureKind":"library","trustBoundaries":[]}}],["file:/home/alex/projects/headquarter/apps/web/src/styles.css",{"id":"file:/home/alex/projects/headquarter/apps/web/src/styles.css","kind":"file","language":"css","filePath":"/home/alex/projects/headquarter/apps/web/src/styles.css"}],["file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx",{"id":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","metadata":{"lineCount":1294,"featureKind":"service","trustBoundaries":["filesystem","database"]}}],["/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","symbolName":"ConfigProfilesPage","symbolKind":"function","exported":true,"metadata":{"line":29,"column":35,"cyclomaticComplexity":132,"maxNestingDepth":4,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"service","trustBoundaries":["filesystem","database"]}}],["external:Promise.all",{"id":"external:Promise.all","kind":"external","language":"jsts","metadata":{"unresolvedName":"Promise.all"}}],["symbol-name:listProjects",{"id":"symbol-name:listProjects","kind":"symbol","language":"jsts","symbolName":"listProjects","metadata":{"unresolvedName":"listProjects"}}],["symbol-name:setProfiles",{"id":"symbol-name:setProfiles","kind":"symbol","language":"jsts","symbolName":"setProfiles","metadata":{"unresolvedName":"setProfiles"}}],["symbol-name:setProjects",{"id":"symbol-name:setProjects","kind":"symbol","language":"jsts","symbolName":"setProjects","metadata":{"unresolvedName":"setProjects"}}],["symbol-name:setToolTypes",{"id":"symbol-name:setToolTypes","kind":"symbol","language":"jsts","symbolName":"setToolTypes","metadata":{"unresolvedName":"setToolTypes"}}],["symbol-name:loadData",{"id":"symbol-name:loadData","kind":"symbol","language":"jsts","symbolName":"loadData","metadata":{"unresolvedName":"loadData"}}],["symbol-name:setIncludedProfileIds",{"id":"symbol-name:setIncludedProfileIds","kind":"symbol","language":"jsts","symbolName":"setIncludedProfileIds","metadata":{"unresolvedName":"setIncludedProfileIds"}}],["symbol-name:setSaveStatus",{"id":"symbol-name:setSaveStatus","kind":"symbol","language":"jsts","symbolName":"setSaveStatus","metadata":{"unresolvedName":"setSaveStatus"}}],["symbol-name:setPreviewData",{"id":"symbol-name:setPreviewData","kind":"symbol","language":"jsts","symbolName":"setPreviewData","metadata":{"unresolvedName":"setPreviewData"}}],["external:profile.includes.map",{"id":"external:profile.includes.map","kind":"external","language":"jsts","metadata":{"unresolvedName":"profile.includes.map"}}],["symbol-name:setSelectedProfileId",{"id":"symbol-name:setSelectedProfileId","kind":"symbol","language":"jsts","symbolName":"setSelectedProfileId","metadata":{"unresolvedName":"setSelectedProfileId"}}],["symbol-name:setIsCreating",{"id":"symbol-name:setIsCreating","kind":"symbol","language":"jsts","symbolName":"setIsCreating","metadata":{"unresolvedName":"setIsCreating"}}],["symbol-name:populateForm",{"id":"symbol-name:populateForm","kind":"symbol","language":"jsts","symbolName":"populateForm","metadata":{"unresolvedName":"populateForm"}}],["external:visited.has",{"id":"external:visited.has","kind":"external","language":"jsts","metadata":{"unresolvedName":"visited.has"}}],["symbol-name:getIncludedProfile",{"id":"symbol-name:getIncludedProfile","kind":"symbol","language":"jsts","symbolName":"getIncludedProfile","metadata":{"unresolvedName":"getIncludedProfile"}}],["external:nextVisited.add",{"id":"external:nextVisited.add","kind":"external","language":"jsts","metadata":{"unresolvedName":"nextVisited.add"}}],["symbol-name:wouldCreateCycle",{"id":"symbol-name:wouldCreateCycle","kind":"symbol","language":"jsts","symbolName":"wouldCreateCycle","metadata":{"unresolvedName":"wouldCreateCycle"}}],["external:profiles.filter",{"id":"external:profiles.filter","kind":"external","language":"jsts","metadata":{"unresolvedName":"profiles.filter"}}],["external:includedProfileIds.includes",{"id":"external:includedProfileIds.includes","kind":"external","language":"jsts","metadata":{"unresolvedName":"includedProfileIds.includes"}}],["external:e.dataTransfer.setData",{"id":"external:e.dataTransfer.setData","kind":"external","language":"jsts","metadata":{"unresolvedName":"e.dataTransfer.setData"}}],["symbol-name:setDragOverIndex",{"id":"symbol-name:setDragOverIndex","kind":"symbol","language":"jsts","symbolName":"setDragOverIndex","metadata":{"unresolvedName":"setDragOverIndex"}}],["external:e.dataTransfer.getData",{"id":"external:e.dataTransfer.getData","kind":"external","language":"jsts","metadata":{"unresolvedName":"e.dataTransfer.getData"}}],["external:newOrder.splice",{"id":"external:newOrder.splice","kind":"external","language":"jsts","metadata":{"unresolvedName":"newOrder.splice"}}],["external:formData.name?.trim",{"id":"external:formData.name?.trim","kind":"external","language":"jsts","metadata":{"unresolvedName":"formData.name?.trim"}}],["symbol-name:createConfigProfile",{"id":"symbol-name:createConfigProfile","kind":"symbol","language":"jsts","symbolName":"createConfigProfile","metadata":{"unresolvedName":"createConfigProfile"}}],["symbol-name:updateProfileIncludes",{"id":"symbol-name:updateProfileIncludes","kind":"symbol","language":"jsts","symbolName":"updateProfileIncludes","metadata":{"unresolvedName":"updateProfileIncludes"}}],["external:(await listConfigProfiles()).find",{"id":"external:(await listConfigProfiles()).find","kind":"external","language":"jsts","metadata":{"unresolvedName":"(await listConfigProfiles()).find"}}],["symbol-name:updateConfigProfile",{"id":"symbol-name:updateConfigProfile","kind":"symbol","language":"jsts","symbolName":"updateConfigProfile","metadata":{"unresolvedName":"updateConfigProfile"}}],["symbol-name:deleteConfigProfile",{"id":"symbol-name:deleteConfigProfile","kind":"symbol","language":"jsts","symbolName":"deleteConfigProfile","metadata":{"unresolvedName":"deleteConfigProfile"}}],["symbol-name:alert",{"id":"symbol-name:alert","kind":"symbol","language":"jsts","symbolName":"alert","metadata":{"unresolvedName":"alert"}}],["symbol-name:setPreviewingId",{"id":"symbol-name:setPreviewingId","kind":"symbol","language":"jsts","symbolName":"setPreviewingId","metadata":{"unresolvedName":"setPreviewingId"}}],["symbol-name:previewConfigProfile",{"id":"symbol-name:previewConfigProfile","kind":"symbol","language":"jsts","symbolName":"previewConfigProfile","metadata":{"unresolvedName":"previewConfigProfile"}}],["external:mounts.splice",{"id":"external:mounts.splice","kind":"external","language":"jsts","metadata":{"unresolvedName":"mounts.splice"}}],["external:profiles.map",{"id":"external:profiles.map","kind":"external","language":"jsts","metadata":{"unresolvedName":"profiles.map"}}],["symbol-name:getScopeLabel",{"id":"symbol-name:getScopeLabel","kind":"symbol","language":"jsts","symbolName":"getScopeLabel","metadata":{"unresolvedName":"getScopeLabel"}}],["symbol-name:setMobileView",{"id":"symbol-name:setMobileView","kind":"symbol","language":"jsts","symbolName":"setMobileView","metadata":{"unresolvedName":"setMobileView"}}],["external:Object.entries(selectedProfile.env_vars).map(([k, v]) => `${k}=${v}`).join",{"id":"external:Object.entries(selectedProfile.env_vars).map(([k, v]) => `${k}=${v}`).join","kind":"external","language":"jsts","metadata":{"unresolvedName":"Object.entries(selectedProfile.env_vars).map(([k, v]) => `${k}=${v}`).join"}}],["external:Object.entries(selectedProfile.env_vars).map",{"id":"external:Object.entries(selectedProfile.env_vars).map","kind":"external","language":"jsts","metadata":{"unresolvedName":"Object.entries(selectedProfile.env_vars).map"}}],["external:selectedProfile.mounts.map((m) => `${m.target} (${m.mode})`).join",{"id":"external:selectedProfile.mounts.map((m) => `${m.target} (${m.mode})`).join","kind":"external","language":"jsts","metadata":{"unresolvedName":"selectedProfile.mounts.map((m) => `${m.target} (${m.mode})`).join"}}],["external:selectedProfile.mounts.map",{"id":"external:selectedProfile.mounts.map","kind":"external","language":"jsts","metadata":{"unresolvedName":"selectedProfile.mounts.map"}}],["symbol-name:handleSubmit",{"id":"symbol-name:handleSubmit","kind":"symbol","language":"jsts","symbolName":"handleSubmit","metadata":{"unresolvedName":"handleSubmit"}}],["symbol-name:updateFormField",{"id":"symbol-name:updateFormField","kind":"symbol","language":"jsts","symbolName":"updateFormField","metadata":{"unresolvedName":"updateFormField"}}],["external:Object.entries(formData.env_vars || {}).map",{"id":"external:Object.entries(formData.env_vars || {}).map","kind":"external","language":"jsts","metadata":{"unresolvedName":"Object.entries(formData.env_vars || {}).map"}}],["external:(formData.mounts || []).map",{"id":"external:(formData.mounts || []).map","kind":"external","language":"jsts","metadata":{"unresolvedName":"(formData.mounts || []).map"}}],["external:(formData.mounts || []).filter",{"id":"external:(formData.mounts || []).filter","kind":"external","language":"jsts","metadata":{"unresolvedName":"(formData.mounts || []).filter"}}],["symbol-name:handleSelectProfile",{"id":"symbol-name:handleSelectProfile","kind":"symbol","language":"jsts","symbolName":"handleSelectProfile","metadata":{"unresolvedName":"handleSelectProfile"}}],["symbol-name:handlePreview",{"id":"symbol-name:handlePreview","kind":"symbol","language":"jsts","symbolName":"handlePreview","metadata":{"unresolvedName":"handlePreview"}}],["external:includedProfileIds.map",{"id":"external:includedProfileIds.map","kind":"external","language":"jsts","metadata":{"unresolvedName":"includedProfileIds.map"}}],["symbol-name:handleDragStart",{"id":"symbol-name:handleDragStart","kind":"symbol","language":"jsts","symbolName":"handleDragStart","metadata":{"unresolvedName":"handleDragStart"}}],["symbol-name:handleDragOver",{"id":"symbol-name:handleDragOver","kind":"symbol","language":"jsts","symbolName":"handleDragOver","metadata":{"unresolvedName":"handleDragOver"}}],["symbol-name:handleDrop",{"id":"symbol-name:handleDrop","kind":"symbol","language":"jsts","symbolName":"handleDrop","metadata":{"unresolvedName":"handleDrop"}}],["symbol-name:removeInclude",{"id":"symbol-name:removeInclude","kind":"symbol","language":"jsts","symbolName":"removeInclude","metadata":{"unresolvedName":"removeInclude"}}],["symbol-name:availableProfilesForInclude",{"id":"symbol-name:availableProfilesForInclude","kind":"symbol","language":"jsts","symbolName":"availableProfilesForInclude","metadata":{"unresolvedName":"availableProfilesForInclude"}}],["symbol-name:addInclude",{"id":"symbol-name:addInclude","kind":"symbol","language":"jsts","symbolName":"addInclude","metadata":{"unresolvedName":"addInclude"}}],["external:availableProfilesForInclude().map",{"id":"external:availableProfilesForInclude().map","kind":"external","language":"jsts","metadata":{"unresolvedName":"availableProfilesForInclude().map"}}],["external:Object.entries(formData.files || {}).map",{"id":"external:Object.entries(formData.files || {}).map","kind":"external","language":"jsts","metadata":{"unresolvedName":"Object.entries(formData.files || {}).map"}}],["symbol-name:updateFile",{"id":"symbol-name:updateFile","kind":"symbol","language":"jsts","symbolName":"updateFile","metadata":{"unresolvedName":"updateFile"}}],["symbol-name:removeFile",{"id":"symbol-name:removeFile","kind":"symbol","language":"jsts","symbolName":"removeFile","metadata":{"unresolvedName":"removeFile"}}],["external:Object.entries(mount.files).map",{"id":"external:Object.entries(mount.files).map","kind":"external","language":"jsts","metadata":{"unresolvedName":"Object.entries(mount.files).map"}}],["symbol-name:updateMountFile",{"id":"symbol-name:updateMountFile","kind":"symbol","language":"jsts","symbolName":"updateMountFile","metadata":{"unresolvedName":"updateMountFile"}}],["symbol-name:removeMountFile",{"id":"symbol-name:removeMountFile","kind":"symbol","language":"jsts","symbolName":"removeMountFile","metadata":{"unresolvedName":"removeMountFile"}}],["symbol-name:addMountFile",{"id":"symbol-name:addMountFile","kind":"symbol","language":"jsts","symbolName":"addMountFile","metadata":{"unresolvedName":"addMountFile"}}],["/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","symbolName":"","symbolKind":"function","exported":false,"metadata":{"line":1262,"column":30,"cyclomaticComplexity":3,"maxNestingDepth":2,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"service","trustBoundaries":["filesystem","database"]}}],["/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:resetForm",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:resetForm","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","symbolName":"resetForm","symbolKind":"function","exported":false,"metadata":{"line":83,"column":21,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"service","trustBoundaries":["filesystem","database"]}}],["/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:populateForm",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:populateForm","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","symbolName":"populateForm","symbolKind":"function","exported":false,"metadata":{"line":100,"column":24,"cyclomaticComplexity":5,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"service","trustBoundaries":["filesystem","database"]}}],["/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleSelectProfile",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleSelectProfile","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","symbolName":"handleSelectProfile","symbolKind":"function","exported":false,"metadata":{"line":121,"column":31,"cyclomaticComplexity":2,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"service","trustBoundaries":["filesystem","database"]}}],["/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleCreateNew",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleCreateNew","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","symbolName":"handleCreateNew","symbolKind":"function","exported":false,"metadata":{"line":131,"column":27,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"service","trustBoundaries":["filesystem","database"]}}],["/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:getScopeLabel",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:getScopeLabel","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","symbolName":"getScopeLabel","symbolKind":"function","exported":false,"metadata":{"line":140,"column":25,"cyclomaticComplexity":5,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"service","trustBoundaries":["filesystem","database"]}}],["/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:wouldCreateCycle",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:wouldCreateCycle","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","symbolName":"wouldCreateCycle","symbolKind":"function","exported":false,"metadata":{"line":148,"column":28,"cyclomaticComplexity":6,"maxNestingDepth":2,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"service","trustBoundaries":["filesystem","database"]}}],["/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:availableProfilesForInclude",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:availableProfilesForInclude","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","symbolName":"availableProfilesForInclude","symbolKind":"function","exported":false,"metadata":{"line":162,"column":39,"cyclomaticComplexity":5,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"service","trustBoundaries":["filesystem","database"]}}],["/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:addInclude",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:addInclude","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","symbolName":"addInclude","symbolKind":"function","exported":false,"metadata":{"line":173,"column":22,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"service","trustBoundaries":["filesystem","database"]}}],["/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:removeInclude",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:removeInclude","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","symbolName":"removeInclude","symbolKind":"function","exported":false,"metadata":{"line":177,"column":25,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"service","trustBoundaries":["filesystem","database"]}}],["/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleDragStart",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleDragStart","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","symbolName":"handleDragStart","symbolKind":"function","exported":false,"metadata":{"line":182,"column":27,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"service","trustBoundaries":["filesystem","database"]}}],["/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleDragOver",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleDragOver","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","symbolName":"handleDragOver","symbolKind":"function","exported":false,"metadata":{"line":187,"column":26,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"service","trustBoundaries":["filesystem","database"]}}],["/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleDragLeave",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleDragLeave","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","symbolName":"handleDragLeave","symbolKind":"function","exported":false,"metadata":{"line":193,"column":27,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"service","trustBoundaries":["filesystem","database"]}}],["/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleDrop",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleDrop","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","symbolName":"handleDrop","symbolKind":"function","exported":false,"metadata":{"line":197,"column":22,"cyclomaticComplexity":2,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"service","trustBoundaries":["filesystem","database"]}}],["/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleSubmit",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleSubmit","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","symbolName":"handleSubmit","symbolKind":"function","exported":false,"metadata":{"line":213,"column":24,"cyclomaticComplexity":8,"maxNestingDepth":4,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"service","trustBoundaries":["filesystem","database"]}}],["/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleDelete",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleDelete","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","symbolName":"handleDelete","symbolKind":"function","exported":false,"metadata":{"line":252,"column":24,"cyclomaticComplexity":4,"maxNestingDepth":2,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"service","trustBoundaries":["filesystem","database"]}}],["/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handlePreview",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handlePreview","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","symbolName":"handlePreview","symbolKind":"function","exported":false,"metadata":{"line":268,"column":25,"cyclomaticComplexity":2,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"service","trustBoundaries":["filesystem","database"]}}],["/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:updateFormField",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:updateFormField","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","symbolName":"updateFormField","symbolKind":"function","exported":false,"metadata":{"line":280,"column":27,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"service","trustBoundaries":["filesystem","database"]}}],["/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:addEnvVar",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:addEnvVar","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","symbolName":"addEnvVar","symbolKind":"function","exported":false,"metadata":{"line":288,"column":21,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"service","trustBoundaries":["filesystem","database"]}}],["/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:updateEnvVar",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:updateEnvVar","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","symbolName":"updateEnvVar","symbolKind":"function","exported":false,"metadata":{"line":296,"column":24,"cyclomaticComplexity":2,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"service","trustBoundaries":["filesystem","database"]}}],["/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:removeEnvVar",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:removeEnvVar","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","symbolName":"removeEnvVar","symbolKind":"function","exported":false,"metadata":{"line":308,"column":24,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"service","trustBoundaries":["filesystem","database"]}}],["/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:addFile",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:addFile","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","symbolName":"addFile","symbolKind":"function","exported":false,"metadata":{"line":317,"column":19,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"service","trustBoundaries":["filesystem","database"]}}],["/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:updateFile",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:updateFile","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","symbolName":"updateFile","symbolKind":"function","exported":false,"metadata":{"line":325,"column":22,"cyclomaticComplexity":2,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"service","trustBoundaries":["filesystem","database"]}}],["/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:removeFile",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:removeFile","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","symbolName":"removeFile","symbolKind":"function","exported":false,"metadata":{"line":337,"column":22,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"service","trustBoundaries":["filesystem","database"]}}],["/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:addMount",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:addMount","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","symbolName":"addMount","symbolKind":"function","exported":false,"metadata":{"line":346,"column":20,"cyclomaticComplexity":2,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"service","trustBoundaries":["filesystem","database"]}}],["/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:updateMount",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:updateMount","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","symbolName":"updateMount","symbolKind":"function","exported":false,"metadata":{"line":354,"column":23,"cyclomaticComplexity":2,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"service","trustBoundaries":["filesystem","database"]}}],["/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:removeMount",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:removeMount","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","symbolName":"removeMount","symbolKind":"function","exported":false,"metadata":{"line":363,"column":23,"cyclomaticComplexity":2,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"service","trustBoundaries":["filesystem","database"]}}],["/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:addMountFile",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:addMountFile","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","symbolName":"addMountFile","symbolKind":"function","exported":false,"metadata":{"line":372,"column":24,"cyclomaticComplexity":2,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"service","trustBoundaries":["filesystem","database"]}}],["/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:updateMountFile",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:updateMountFile","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","symbolName":"updateMountFile","symbolKind":"function","exported":false,"metadata":{"line":384,"column":27,"cyclomaticComplexity":3,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"service","trustBoundaries":["filesystem","database"]}}],["/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:removeMountFile",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:removeMountFile","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","symbolName":"removeMountFile","symbolKind":"function","exported":false,"metadata":{"line":403,"column":27,"cyclomaticComplexity":2,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"service","trustBoundaries":["filesystem","database"]}}],["/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:preventDefault",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:preventDefault","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","symbolName":"preventDefault","symbolKind":"function","exported":false,"metadata":{"line":504,"column":56,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"service","trustBoundaries":["filesystem","database"]}}],["file:/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx",{"id":"file:/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx","metadata":{"lineCount":82,"featureKind":"library","trustBoundaries":[]}}],["file:/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx",{"id":"file:/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx","metadata":{"lineCount":267,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx","symbolName":"","symbolKind":"function","exported":false,"metadata":{"line":75,"column":19,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["symbol-name:beforeEach",{"id":"symbol-name:beforeEach","kind":"symbol","language":"jsts","symbolName":"beforeEach","metadata":{"unresolvedName":"beforeEach"}}],["external:mockDashboard.mockReset",{"id":"external:mockDashboard.mockReset","kind":"external","language":"jsts","metadata":{"unresolvedName":"mockDashboard.mockReset"}}],["external:mockSessions.mockReset",{"id":"external:mockSessions.mockReset","kind":"external","language":"jsts","metadata":{"unresolvedName":"mockSessions.mockReset"}}],["external:mockProjects.mockReset",{"id":"external:mockProjects.mockReset","kind":"external","language":"jsts","metadata":{"unresolvedName":"mockProjects.mockReset"}}],["external:mockRepos.mockReset",{"id":"external:mockRepos.mockReset","kind":"external","language":"jsts","metadata":{"unresolvedName":"mockRepos.mockReset"}}],["external:mockDashboard.mockResolvedValue",{"id":"external:mockDashboard.mockResolvedValue","kind":"external","language":"jsts","metadata":{"unresolvedName":"mockDashboard.mockResolvedValue"}}],["external:mockSessions.mockResolvedValue",{"id":"external:mockSessions.mockResolvedValue","kind":"external","language":"jsts","metadata":{"unresolvedName":"mockSessions.mockResolvedValue"}}],["external:mockProjects.mockResolvedValue",{"id":"external:mockProjects.mockResolvedValue","kind":"external","language":"jsts","metadata":{"unresolvedName":"mockProjects.mockResolvedValue"}}],["external:mockRepos.mockResolvedValue",{"id":"external:mockRepos.mockResolvedValue","kind":"external","language":"jsts","metadata":{"unresolvedName":"mockRepos.mockResolvedValue"}}],["external:expect(screen.getByText(\"Loading overview...\")).toBeInTheDocument",{"id":"external:expect(screen.getByText(\"Loading overview...\")).toBeInTheDocument","kind":"external","language":"jsts","metadata":{"unresolvedName":"expect(screen.getByText(\"Loading overview...\")).toBeInTheDocument"}}],["external:expect(screen.getAllByText(\"Open sessions\").length).toBeGreaterThan",{"id":"external:expect(screen.getAllByText(\"Open sessions\").length).toBeGreaterThan","kind":"external","language":"jsts","metadata":{"unresolvedName":"expect(screen.getAllByText(\"Open sessions\").length).toBeGreaterThan"}}],["external:screen.getAllByText",{"id":"external:screen.getAllByText","kind":"external","language":"jsts","metadata":{"unresolvedName":"screen.getAllByText"}}],["external:expect(screen.getByText(\"Available projects\")).toBeInTheDocument",{"id":"external:expect(screen.getByText(\"Available projects\")).toBeInTheDocument","kind":"external","language":"jsts","metadata":{"unresolvedName":"expect(screen.getByText(\"Available projects\")).toBeInTheDocument"}}],["external:mockDashboard.mockRejectedValueOnce",{"id":"external:mockDashboard.mockRejectedValueOnce","kind":"external","language":"jsts","metadata":{"unresolvedName":"mockDashboard.mockRejectedValueOnce"}}],["external:mockSessions.mockRejectedValueOnce",{"id":"external:mockSessions.mockRejectedValueOnce","kind":"external","language":"jsts","metadata":{"unresolvedName":"mockSessions.mockRejectedValueOnce"}}],["external:mockProjects.mockRejectedValueOnce",{"id":"external:mockProjects.mockRejectedValueOnce","kind":"external","language":"jsts","metadata":{"unresolvedName":"mockProjects.mockRejectedValueOnce"}}],["external:screen.getAllByRole",{"id":"external:screen.getAllByRole","kind":"external","language":"jsts","metadata":{"unresolvedName":"screen.getAllByRole"}}],["/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:HomePage",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:HomePage","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx","symbolName":"HomePage","symbolKind":"function","exported":true,"metadata":{"line":26,"column":25,"cyclomaticComplexity":17,"maxNestingDepth":2,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["external:Array.isArray",{"id":"external:Array.isArray","kind":"external","language":"jsts","metadata":{"unresolvedName":"Array.isArray"}}],["symbol-name:getDashboardSummary",{"id":"symbol-name:getDashboardSummary","kind":"symbol","language":"jsts","symbolName":"getDashboardSummary","metadata":{"unresolvedName":"getDashboardSummary"}}],["symbol-name:setSummary",{"id":"symbol-name:setSummary","kind":"symbol","language":"jsts","symbolName":"setSummary","metadata":{"unresolvedName":"setSummary"}}],["symbol-name:setSessions",{"id":"symbol-name:setSessions","kind":"symbol","language":"jsts","symbolName":"setSessions","metadata":{"unresolvedName":"setSessions"}}],["symbol-name:loadHome",{"id":"symbol-name:loadHome","kind":"symbol","language":"jsts","symbolName":"loadHome","metadata":{"unresolvedName":"loadHome"}}],["symbol-name:useInstanceActions",{"id":"symbol-name:useInstanceActions","kind":"symbol","language":"jsts","symbolName":"useInstanceActions","metadata":{"unresolvedName":"useInstanceActions"}}],["external:safeSessions.filter",{"id":"external:safeSessions.filter","kind":"external","language":"jsts","metadata":{"unresolvedName":"safeSessions.filter"}}],["symbol-name:setTunnelHealth",{"id":"symbol-name:setTunnelHealth","kind":"symbol","language":"jsts","symbolName":"setTunnelHealth","metadata":{"unresolvedName":"setTunnelHealth"}}],["symbol-name:loadRepos",{"id":"symbol-name:loadRepos","kind":"symbol","language":"jsts","symbolName":"loadRepos","metadata":{"unresolvedName":"loadRepos"}}],["symbol-name:useMemo",{"id":"symbol-name:useMemo","kind":"symbol","language":"jsts","symbolName":"useMemo","metadata":{"unresolvedName":"useMemo"}}],["external:[\"running\", \"building\", \"pending\"].includes",{"id":"external:[\"running\", \"building\", \"pending\"].includes","kind":"external","language":"jsts","metadata":{"unresolvedName":"[\"running\", \"building\", \"pending\"].includes"}}],["symbol-name:updateUserConfig",{"id":"symbol-name:updateUserConfig","kind":"symbol","language":"jsts","symbolName":"updateUserConfig","metadata":{"unresolvedName":"updateUserConfig"}}],["external:summaryCards.map",{"id":"external:summaryCards.map","kind":"external","language":"jsts","metadata":{"unresolvedName":"summaryCards.map"}}],["external:[\"running\", \"building\", \"pending\", \"starting\", \"probing\", \"unhealthy\"].includes",{"id":"external:[\"running\", \"building\", \"pending\", \"starting\", \"probing\", \"unhealthy\"].includes","kind":"external","language":"jsts","metadata":{"unresolvedName":"[\"running\", \"building\", \"pending\", \"starting\", \"probing\", \"unhealthy\"].includes"}}],["external:[\"stopped\", \"error\"].includes",{"id":"external:[\"stopped\", \"error\"].includes","kind":"external","language":"jsts","metadata":{"unresolvedName":"[\"stopped\", \"error\"].includes"}}],["/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx","symbolName":"","symbolKind":"function","exported":false,"metadata":{"line":113,"column":13,"cyclomaticComplexity":3,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:checkHealth",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:checkHealth","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx","symbolName":"checkHealth","symbolKind":"function","exported":false,"metadata":{"line":72,"column":25,"cyclomaticComplexity":4,"maxNestingDepth":2,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:loadRepos",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:loadRepos","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx","symbolName":"loadRepos","symbolKind":"function","exported":false,"metadata":{"line":119,"column":23,"cyclomaticComplexity":2,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["filesystem","database"]}}],["/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:handleCreateSuccess",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:handleCreateSuccess","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx","symbolName":"handleCreateSuccess","symbolKind":"function","exported":false,"metadata":{"line":136,"column":31,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["file:/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx",{"id":"file:/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx","metadata":{"lineCount":227,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx:GitHistoryPage",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx:GitHistoryPage","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx","symbolName":"GitHistoryPage","symbolKind":"function","exported":true,"metadata":{"line":9,"column":31,"cyclomaticComplexity":26,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["symbol-name:useAsyncData",{"id":"symbol-name:useAsyncData","kind":"symbol","language":"jsts","symbolName":"useAsyncData","metadata":{"unresolvedName":"useAsyncData"}}],["symbol-name:getRepositoryHistory",{"id":"symbol-name:getRepositoryHistory","kind":"symbol","language":"jsts","symbolName":"getRepositoryHistory","metadata":{"unresolvedName":"getRepositoryHistory"}}],["symbol-name:setSelectedBranch",{"id":"symbol-name:setSelectedBranch","kind":"symbol","language":"jsts","symbolName":"setSelectedBranch","metadata":{"unresolvedName":"setSelectedBranch"}}],["symbol-name:setSelectedCommit",{"id":"symbol-name:setSelectedCommit","kind":"symbol","language":"jsts","symbolName":"setSelectedCommit","metadata":{"unresolvedName":"setSelectedCommit"}}],["symbol-name:setDetailStatus",{"id":"symbol-name:setDetailStatus","kind":"symbol","language":"jsts","symbolName":"setDetailStatus","metadata":{"unresolvedName":"setDetailStatus"}}],["symbol-name:getCommitDetail",{"id":"symbol-name:getCommitDetail","kind":"symbol","language":"jsts","symbolName":"getCommitDetail","metadata":{"unresolvedName":"getCommitDetail"}}],["symbol-name:setCommitDetail",{"id":"symbol-name:setCommitDetail","kind":"symbol","language":"jsts","symbolName":"setCommitDetail","metadata":{"unresolvedName":"setCommitDetail"}}],["external:new Date(dateStr).toLocaleString",{"id":"external:new Date(dateStr).toLocaleString","kind":"external","language":"jsts","metadata":{"unresolvedName":"new Date(dateStr).toLocaleString"}}],["external:commits.map",{"id":"external:commits.map","kind":"external","language":"jsts","metadata":{"unresolvedName":"commits.map"}}],["symbol-name:handleCommitClick",{"id":"symbol-name:handleCommitClick","kind":"symbol","language":"jsts","symbolName":"handleCommitClick","metadata":{"unresolvedName":"handleCommitClick"}}],["external:commit.refs.map",{"id":"external:commit.refs.map","kind":"external","language":"jsts","metadata":{"unresolvedName":"commit.refs.map"}}],["external:commit.message.split",{"id":"external:commit.message.split","kind":"external","language":"jsts","metadata":{"unresolvedName":"commit.message.split"}}],["symbol-name:formatDate",{"id":"symbol-name:formatDate","kind":"symbol","language":"jsts","symbolName":"formatDate","metadata":{"unresolvedName":"formatDate"}}],["external:commitDetail.parents.map",{"id":"external:commitDetail.parents.map","kind":"external","language":"jsts","metadata":{"unresolvedName":"commitDetail.parents.map"}}],["external:parent.substring",{"id":"external:parent.substring","kind":"external","language":"jsts","metadata":{"unresolvedName":"parent.substring"}}],["/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx:",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx:","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx","symbolName":"","symbolKind":"function","exported":false,"metadata":{"line":114,"column":26,"cyclomaticComplexity":3,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx:handleCommitClick",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx:handleCommitClick","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx","symbolName":"handleCommitClick","symbolKind":"function","exported":false,"metadata":{"line":32,"column":29,"cyclomaticComplexity":4,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx:handleCloseDetail",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx:handleCloseDetail","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx","symbolName":"handleCloseDetail","symbolKind":"function","exported":false,"metadata":{"line":45,"column":29,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx:formatDate",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx:formatDate","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx","symbolName":"formatDate","symbolKind":"function","exported":false,"metadata":{"line":51,"column":22,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["file:/home/alex/projects/headquarter/apps/web/src/pages/git-repositories.tsx",{"id":"file:/home/alex/projects/headquarter/apps/web/src/pages/git-repositories.tsx","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/git-repositories.tsx","metadata":{"lineCount":122,"featureKind":"library","trustBoundaries":["filesystem","database"]}}],["/home/alex/projects/headquarter/apps/web/src/pages/git-repositories.tsx:GitRepositoriesPage",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/git-repositories.tsx:GitRepositoriesPage","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/git-repositories.tsx","symbolName":"GitRepositoriesPage","symbolKind":"function","exported":true,"metadata":{"line":14,"column":36,"cyclomaticComplexity":15,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["filesystem","database"]}}],["symbol-name:setDeleteConfirmId",{"id":"symbol-name:setDeleteConfirmId","kind":"symbol","language":"jsts","symbolName":"setDeleteConfirmId","metadata":{"unresolvedName":"setDeleteConfirmId"}}],["symbol-name:reload",{"id":"symbol-name:reload","kind":"symbol","language":"jsts","symbolName":"reload","metadata":{"unresolvedName":"reload"}}],["external:safeRepositories.map",{"id":"external:safeRepositories.map","kind":"external","language":"jsts","metadata":{"unresolvedName":"safeRepositories.map"}}],["/home/alex/projects/headquarter/apps/web/src/pages/git-repositories.tsx:",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/git-repositories.tsx:","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/git-repositories.tsx","symbolName":"","symbolKind":"function","exported":false,"metadata":{"line":21,"column":5,"cyclomaticComplexity":2,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["filesystem","database"]}}],["/home/alex/projects/headquarter/apps/web/src/pages/git-repositories.tsx:handleDelete",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/git-repositories.tsx:handleDelete","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/git-repositories.tsx","symbolName":"handleDelete","symbolKind":"function","exported":false,"metadata":{"line":28,"column":24,"cyclomaticComplexity":3,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["filesystem","database"]}}],["file:/home/alex/projects/headquarter/apps/web/src/pages/placeholder.tsx",{"id":"file:/home/alex/projects/headquarter/apps/web/src/pages/placeholder.tsx","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/placeholder.tsx","metadata":{"lineCount":38,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/pages/placeholder.tsx:PlaceholderPage",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/placeholder.tsx:PlaceholderPage","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/placeholder.tsx","symbolName":"PlaceholderPage","symbolKind":"function","exported":true,"metadata":{"line":1,"column":32,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/pages/placeholder.tsx:NotFoundPage",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/placeholder.tsx:NotFoundPage","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/placeholder.tsx","symbolName":"NotFoundPage","symbolKind":"function","exported":true,"metadata":{"line":10,"column":29,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/pages/placeholder.tsx:LoginRedirectPage",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/placeholder.tsx:LoginRedirectPage","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/placeholder.tsx","symbolName":"LoginRedirectPage","symbolKind":"function","exported":true,"metadata":{"line":23,"column":34,"cyclomaticComplexity":2,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["auth","user-input"]}}],["external:new URLSearchParams(window.location.search).get",{"id":"external:new URLSearchParams(window.location.search).get","kind":"external","language":"jsts","metadata":{"unresolvedName":"new URLSearchParams(window.location.search).get"}}],["file:/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx",{"id":"file:/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx","metadata":{"lineCount":185,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx:ProfilePage",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx:ProfilePage","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx","symbolName":"ProfilePage","symbolKind":"function","exported":true,"metadata":{"line":12,"column":28,"cyclomaticComplexity":20,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["symbol-name:setName",{"id":"symbol-name:setName","kind":"symbol","language":"jsts","symbolName":"setName","metadata":{"unresolvedName":"setName"}}],["symbol-name:setEmail",{"id":"symbol-name:setEmail","kind":"symbol","language":"jsts","symbolName":"setEmail","metadata":{"unresolvedName":"setEmail"}}],["symbol-name:setDisplayStatus",{"id":"symbol-name:setDisplayStatus","kind":"symbol","language":"jsts","symbolName":"setDisplayStatus","metadata":{"unresolvedName":"setDisplayStatus"}}],["external:name.trim",{"id":"external:name.trim","kind":"external","language":"jsts","metadata":{"unresolvedName":"name.trim"}}],["external:email.includes",{"id":"external:email.includes","kind":"external","language":"jsts","metadata":{"unresolvedName":"email.includes"}}],["symbol-name:updateProfile",{"id":"symbol-name:updateProfile","kind":"symbol","language":"jsts","symbolName":"updateProfile","metadata":{"unresolvedName":"updateProfile"}}],["external:email.trim",{"id":"external:email.trim","kind":"external","language":"jsts","metadata":{"unresolvedName":"email.trim"}}],["symbol-name:refreshSession",{"id":"symbol-name:refreshSession","kind":"symbol","language":"jsts","symbolName":"refreshSession","metadata":{"unresolvedName":"refreshSession"}}],["external:file.type.startsWith",{"id":"external:file.type.startsWith","kind":"external","language":"jsts","metadata":{"unresolvedName":"file.type.startsWith"}}],["symbol-name:uploadAvatar",{"id":"symbol-name:uploadAvatar","kind":"symbol","language":"jsts","symbolName":"uploadAvatar","metadata":{"unresolvedName":"uploadAvatar"}}],["external:profile.name.charAt(0).toUpperCase",{"id":"external:profile.name.charAt(0).toUpperCase","kind":"external","language":"jsts","metadata":{"unresolvedName":"profile.name.charAt(0).toUpperCase"}}],["external:profile.name.charAt",{"id":"external:profile.name.charAt","kind":"external","language":"jsts","metadata":{"unresolvedName":"profile.name.charAt"}}],["external:fileInputRef.current?.click",{"id":"external:fileInputRef.current?.click","kind":"external","language":"jsts","metadata":{"unresolvedName":"fileInputRef.current?.click"}}],["/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx:",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx:","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx","symbolName":"","symbolKind":"function","exported":false,"metadata":{"line":60,"column":5,"cyclomaticComplexity":5,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["file:/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx",{"id":"file:/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx","metadata":{"lineCount":149,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx:GeneralSettings",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx:GeneralSettings","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx","symbolName":"GeneralSettings","symbolKind":"function","exported":false,"metadata":{"line":17,"column":6,"cyclomaticComplexity":7,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["symbol-name:setDescription",{"id":"symbol-name:setDescription","kind":"symbol","language":"jsts","symbolName":"setDescription","metadata":{"unresolvedName":"setDescription"}}],["/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx:handleSave",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx:handleSave","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx","symbolName":"handleSave","symbolKind":"function","exported":false,"metadata":{"line":24,"column":22,"cyclomaticComplexity":2,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx:handleDelete",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx:handleDelete","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx","symbolName":"handleDelete","symbolKind":"function","exported":false,"metadata":{"line":38,"column":24,"cyclomaticComplexity":3,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx:ProjectSettingsPage",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx:ProjectSettingsPage","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx","symbolName":"ProjectSettingsPage","symbolKind":"function","exported":true,"metadata":{"line":100,"column":46,"cyclomaticComplexity":5,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["symbol-name:setProject",{"id":"symbol-name:setProject","kind":"symbol","language":"jsts","symbolName":"setProject","metadata":{"unresolvedName":"setProject"}}],["symbol-name:fetchProject",{"id":"symbol-name:fetchProject","kind":"symbol","language":"jsts","symbolName":"fetchProject","metadata":{"unresolvedName":"fetchProject"}}],["/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx:",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx:","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx","symbolName":"","symbolKind":"function","exported":false,"metadata":{"line":106,"column":13,"cyclomaticComplexity":2,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx:fetchProject",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx:fetchProject","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx","symbolName":"fetchProject","symbolKind":"function","exported":false,"metadata":{"line":107,"column":26,"cyclomaticComplexity":2,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["file:/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx",{"id":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx","metadata":{"lineCount":197,"featureKind":"library","trustBoundaries":[]}}],["file:/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx",{"id":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx","metadata":{"lineCount":217,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx","symbolName":"","symbolKind":"function","exported":false,"metadata":{"line":191,"column":19,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["external:vi.spyOn(projectsApi, \"listProjects\").mockImplementation",{"id":"external:vi.spyOn(projectsApi, \"listProjects\").mockImplementation","kind":"external","language":"jsts","metadata":{"unresolvedName":"vi.spyOn(projectsApi, \"listProjects\").mockImplementation"}}],["external:expect(screen.getByText(/loading projects/i)).toBeInTheDocument",{"id":"external:expect(screen.getByText(/loading projects/i)).toBeInTheDocument","kind":"external","language":"jsts","metadata":{"unresolvedName":"expect(screen.getByText(/loading projects/i)).toBeInTheDocument"}}],["external:vi.spyOn(projectsApi, \"listProjects\").mockResolvedValue",{"id":"external:vi.spyOn(projectsApi, \"listProjects\").mockResolvedValue","kind":"external","language":"jsts","metadata":{"unresolvedName":"vi.spyOn(projectsApi, \"listProjects\").mockResolvedValue"}}],["external:expect(screen.getByText(\"Alpha Project\")).toBeInTheDocument",{"id":"external:expect(screen.getByText(\"Alpha Project\")).toBeInTheDocument","kind":"external","language":"jsts","metadata":{"unresolvedName":"expect(screen.getByText(\"Alpha Project\")).toBeInTheDocument"}}],["external:expect(screen.getByText(\"Beta Project\")).toBeInTheDocument",{"id":"external:expect(screen.getByText(\"Beta Project\")).toBeInTheDocument","kind":"external","language":"jsts","metadata":{"unresolvedName":"expect(screen.getByText(\"Beta Project\")).toBeInTheDocument"}}],["external:expect(screen.getByText(\"First project\")).toBeInTheDocument",{"id":"external:expect(screen.getByText(\"First project\")).toBeInTheDocument","kind":"external","language":"jsts","metadata":{"unresolvedName":"expect(screen.getByText(\"First project\")).toBeInTheDocument"}}],["external:expect(screen.getByText(/no projects yet/i)).toBeInTheDocument",{"id":"external:expect(screen.getByText(/no projects yet/i)).toBeInTheDocument","kind":"external","language":"jsts","metadata":{"unresolvedName":"expect(screen.getByText(/no projects yet/i)).toBeInTheDocument"}}],["external:vi.spyOn(projectsApi, \"listProjects\").mockRejectedValue",{"id":"external:vi.spyOn(projectsApi, \"listProjects\").mockRejectedValue","kind":"external","language":"jsts","metadata":{"unresolvedName":"vi.spyOn(projectsApi, \"listProjects\").mockRejectedValue"}}],["external:expect(screen.getByText(/failed to load projects/i)).toBeInTheDocument",{"id":"external:expect(screen.getByText(/failed to load projects/i)).toBeInTheDocument","kind":"external","language":"jsts","metadata":{"unresolvedName":"expect(screen.getByText(/failed to load projects/i)).toBeInTheDocument"}}],["external:expect(screen.getByRole(\"button\", { name: /retry/i })).toBeInTheDocument",{"id":"external:expect(screen.getByRole(\"button\", { name: /retry/i })).toBeInTheDocument","kind":"external","language":"jsts","metadata":{"unresolvedName":"expect(screen.getByRole(\"button\", { name: /retry/i })).toBeInTheDocument"}}],["external:vi.spyOn(projectsApi, \"createProject\").mockResolvedValue",{"id":"external:vi.spyOn(projectsApi, \"createProject\").mockResolvedValue","kind":"external","language":"jsts","metadata":{"unresolvedName":"vi.spyOn(projectsApi, \"createProject\").mockResolvedValue"}}],["external:expect(screen.getByRole(\"dialog\")).toBeInTheDocument",{"id":"external:expect(screen.getByRole(\"dialog\")).toBeInTheDocument","kind":"external","language":"jsts","metadata":{"unresolvedName":"expect(screen.getByRole(\"dialog\")).toBeInTheDocument"}}],["external:expect(screen.getByText(/project name is required/i)).toBeInTheDocument",{"id":"external:expect(screen.getByText(/project name is required/i)).toBeInTheDocument","kind":"external","language":"jsts","metadata":{"unresolvedName":"expect(screen.getByText(/project name is required/i)).toBeInTheDocument"}}],["external:vi.spyOn(projectsApi, \"updateProject\").mockResolvedValue",{"id":"external:vi.spyOn(projectsApi, \"updateProject\").mockResolvedValue","kind":"external","language":"jsts","metadata":{"unresolvedName":"vi.spyOn(projectsApi, \"updateProject\").mockResolvedValue"}}],["external:screen.getByText(\"Alpha Project\").closest",{"id":"external:screen.getByText(\"Alpha Project\").closest","kind":"external","language":"jsts","metadata":{"unresolvedName":"screen.getByText(\"Alpha Project\").closest"}}],["external:within(alphaCard).getByRole",{"id":"external:within(alphaCard).getByRole","kind":"external","language":"jsts","metadata":{"unresolvedName":"within(alphaCard).getByRole"}}],["symbol-name:within",{"id":"symbol-name:within","kind":"symbol","language":"jsts","symbolName":"within","metadata":{"unresolvedName":"within"}}],["external:screen.getByDisplayValue",{"id":"external:screen.getByDisplayValue","kind":"external","language":"jsts","metadata":{"unresolvedName":"screen.getByDisplayValue"}}],["external:expect(updateMock).toHaveBeenCalledWith",{"id":"external:expect(updateMock).toHaveBeenCalledWith","kind":"external","language":"jsts","metadata":{"unresolvedName":"expect(updateMock).toHaveBeenCalledWith"}}],["external:vi.spyOn(projectsApi, \"deleteProject\").mockResolvedValue",{"id":"external:vi.spyOn(projectsApi, \"deleteProject\").mockResolvedValue","kind":"external","language":"jsts","metadata":{"unresolvedName":"vi.spyOn(projectsApi, \"deleteProject\").mockResolvedValue"}}],["external:expect(within(alphaCard).getByText(/are you sure/i)).toBeInTheDocument",{"id":"external:expect(within(alphaCard).getByText(/are you sure/i)).toBeInTheDocument","kind":"external","language":"jsts","metadata":{"unresolvedName":"expect(within(alphaCard).getByText(/are you sure/i)).toBeInTheDocument"}}],["external:within(alphaCard).getByText",{"id":"external:within(alphaCard).getByText","kind":"external","language":"jsts","metadata":{"unresolvedName":"within(alphaCard).getByText"}}],["external:expect(deleteMock).toHaveBeenCalledWith",{"id":"external:expect(deleteMock).toHaveBeenCalledWith","kind":"external","language":"jsts","metadata":{"unresolvedName":"expect(deleteMock).toHaveBeenCalledWith"}}],["/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:ProjectsPage",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:ProjectsPage","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx","symbolName":"ProjectsPage","symbolKind":"function","exported":true,"metadata":{"line":20,"column":29,"cyclomaticComplexity":23,"maxNestingDepth":3,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["symbol-name:setFormDescription",{"id":"symbol-name:setFormDescription","kind":"symbol","language":"jsts","symbolName":"setFormDescription","metadata":{"unresolvedName":"setFormDescription"}}],["symbol-name:setEditingProject",{"id":"symbol-name:setEditingProject","kind":"symbol","language":"jsts","symbolName":"setEditingProject","metadata":{"unresolvedName":"setEditingProject"}}],["symbol-name:setDialogMode",{"id":"symbol-name:setDialogMode","kind":"symbol","language":"jsts","symbolName":"setDialogMode","metadata":{"unresolvedName":"setDialogMode"}}],["external:formDescription.trim",{"id":"external:formDescription.trim","kind":"external","language":"jsts","metadata":{"unresolvedName":"formDescription.trim"}}],["symbol-name:createProject",{"id":"symbol-name:createProject","kind":"symbol","language":"jsts","symbolName":"createProject","metadata":{"unresolvedName":"createProject"}}],["symbol-name:updateProject",{"id":"symbol-name:updateProject","kind":"symbol","language":"jsts","symbolName":"updateProject","metadata":{"unresolvedName":"updateProject"}}],["symbol-name:closeDialog",{"id":"symbol-name:closeDialog","kind":"symbol","language":"jsts","symbolName":"closeDialog","metadata":{"unresolvedName":"closeDialog"}}],["symbol-name:deleteProject",{"id":"symbol-name:deleteProject","kind":"symbol","language":"jsts","symbolName":"deleteProject","metadata":{"unresolvedName":"deleteProject"}}],["external:safeProjects.map",{"id":"external:safeProjects.map","kind":"external","language":"jsts","metadata":{"unresolvedName":"safeProjects.map"}}],["symbol-name:openEdit",{"id":"symbol-name:openEdit","kind":"symbol","language":"jsts","symbolName":"openEdit","metadata":{"unresolvedName":"openEdit"}}],["/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:openCreate",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:openCreate","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx","symbolName":"openCreate","symbolKind":"function","exported":false,"metadata":{"line":31,"column":22,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:openEdit",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:openEdit","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx","symbolName":"openEdit","symbolKind":"function","exported":false,"metadata":{"line":39,"column":20,"cyclomaticComplexity":2,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:closeDialog",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:closeDialog","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx","symbolName":"closeDialog","symbolKind":"function","exported":false,"metadata":{"line":47,"column":23,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:handleSubmit",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:handleSubmit","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx","symbolName":"handleSubmit","symbolKind":"function","exported":false,"metadata":{"line":53,"column":24,"cyclomaticComplexity":8,"maxNestingDepth":3,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:handleDelete",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:handleDelete","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx","symbolName":"handleDelete","symbolKind":"function","exported":false,"metadata":{"line":83,"column":24,"cyclomaticComplexity":2,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["file:/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx",{"id":"file:/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","metadata":{"lineCount":506,"featureKind":"library","trustBoundaries":["filesystem","database"]}}],["/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:RepoWorkspace",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:RepoWorkspace","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","symbolName":"RepoWorkspace","symbolKind":"function","exported":true,"metadata":{"line":47,"column":30,"cyclomaticComplexity":43,"maxNestingDepth":3,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["filesystem","database"]}}],["symbol-name:setSelectedRepoId",{"id":"symbol-name:setSelectedRepoId","kind":"symbol","language":"jsts","symbolName":"setSelectedRepoId","metadata":{"unresolvedName":"setSelectedRepoId"}}],["external:newParams.set",{"id":"external:newParams.set","kind":"external","language":"jsts","metadata":{"unresolvedName":"newParams.set"}}],["symbol-name:setSearchParams",{"id":"symbol-name:setSearchParams","kind":"symbol","language":"jsts","symbolName":"setSearchParams","metadata":{"unresolvedName":"setSearchParams"}}],["external:response.data.branches.map",{"id":"external:response.data.branches.map","kind":"external","language":"jsts","metadata":{"unresolvedName":"response.data.branches.map"}}],["symbol-name:setCurrentBranch",{"id":"symbol-name:setCurrentBranch","kind":"symbol","language":"jsts","symbolName":"setCurrentBranch","metadata":{"unresolvedName":"setCurrentBranch"}}],["symbol-name:setGitStatus",{"id":"symbol-name:setGitStatus","kind":"symbol","language":"jsts","symbolName":"setGitStatus","metadata":{"unresolvedName":"setGitStatus"}}],["symbol-name:loadProject",{"id":"symbol-name:loadProject","kind":"symbol","language":"jsts","symbolName":"loadProject","metadata":{"unresolvedName":"loadProject"}}],["symbol-name:loadToolTypes",{"id":"symbol-name:loadToolTypes","kind":"symbol","language":"jsts","symbolName":"loadToolTypes","metadata":{"unresolvedName":"loadToolTypes"}}],["symbol-name:loadGitStatus",{"id":"symbol-name:loadGitStatus","kind":"symbol","language":"jsts","symbolName":"loadGitStatus","metadata":{"unresolvedName":"loadGitStatus"}}],["external:newParams.delete",{"id":"external:newParams.delete","kind":"external","language":"jsts","metadata":{"unresolvedName":"newParams.delete"}}],["symbol-name:handleRepoChange",{"id":"symbol-name:handleRepoChange","kind":"symbol","language":"jsts","symbolName":"handleRepoChange","metadata":{"unresolvedName":"handleRepoChange"}}],["external:window.dispatchEvent",{"id":"external:window.dispatchEvent","kind":"external","language":"jsts","metadata":{"unresolvedName":"window.dispatchEvent"}}],["symbol-name:setMobileTab",{"id":"symbol-name:setMobileTab","kind":"symbol","language":"jsts","symbolName":"setMobileTab","metadata":{"unresolvedName":"setMobileTab"}}],["/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","symbolName":"","symbolKind":"function","exported":false,"metadata":{"line":482,"column":20,"cyclomaticComplexity":10,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["filesystem","database"]}}],["/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:handleRepoChange",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:handleRepoChange","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","symbolName":"handleRepoChange","symbolKind":"function","exported":false,"metadata":{"line":147,"column":28,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["filesystem","database"]}}],["/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:FileBrowser",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:FileBrowser","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","symbolName":"FileBrowser","symbolKind":"function","exported":false,"metadata":{"line":387,"column":21,"cyclomaticComplexity":26,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["filesystem","database"]}}],["symbol-name:setEntries",{"id":"symbol-name:setEntries","kind":"symbol","language":"jsts","symbolName":"setEntries","metadata":{"unresolvedName":"setEntries"}}],["symbol-name:loadFiles",{"id":"symbol-name:loadFiles","kind":"symbol","language":"jsts","symbolName":"loadFiles","metadata":{"unresolvedName":"loadFiles"}}],["external:path.split(\"/\").slice(0, -1).join",{"id":"external:path.split(\"/\").slice(0, -1).join","kind":"external","language":"jsts","metadata":{"unresolvedName":"path.split(\"/\").slice(0, -1).join"}}],["external:path.split(\"/\").slice",{"id":"external:path.split(\"/\").slice","kind":"external","language":"jsts","metadata":{"unresolvedName":"path.split(\"/\").slice"}}],["external:path.split",{"id":"external:path.split","kind":"external","language":"jsts","metadata":{"unresolvedName":"path.split"}}],["external:gitStatus.modified.includes",{"id":"external:gitStatus.modified.includes","kind":"external","language":"jsts","metadata":{"unresolvedName":"gitStatus.modified.includes"}}],["external:gitStatus.added.includes",{"id":"external:gitStatus.added.includes","kind":"external","language":"jsts","metadata":{"unresolvedName":"gitStatus.added.includes"}}],["external:gitStatus.deleted.includes",{"id":"external:gitStatus.deleted.includes","kind":"external","language":"jsts","metadata":{"unresolvedName":"gitStatus.deleted.includes"}}],["external:gitStatus.untracked.includes",{"id":"external:gitStatus.untracked.includes","kind":"external","language":"jsts","metadata":{"unresolvedName":"gitStatus.untracked.includes"}}],["external:entries.map",{"id":"external:entries.map","kind":"external","language":"jsts","metadata":{"unresolvedName":"entries.map"}}],["symbol-name:getFileStatus",{"id":"symbol-name:getFileStatus","kind":"symbol","language":"jsts","symbolName":"getFileStatus","metadata":{"unresolvedName":"getFileStatus"}}],["symbol-name:handleEntryClick",{"id":"symbol-name:handleEntryClick","kind":"symbol","language":"jsts","symbolName":"handleEntryClick","metadata":{"unresolvedName":"handleEntryClick"}}],["/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:handleEntryClick",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:handleEntryClick","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","symbolName":"handleEntryClick","symbolKind":"function","exported":false,"metadata":{"line":436,"column":28,"cyclomaticComplexity":2,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["filesystem","database"]}}],["/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:navigateUp",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:navigateUp","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","symbolName":"navigateUp","symbolKind":"function","exported":false,"metadata":{"line":448,"column":22,"cyclomaticComplexity":3,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["filesystem","database"]}}],["/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:getFileStatus",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:getFileStatus","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","symbolName":"getFileStatus","symbolKind":"function","exported":false,"metadata":{"line":460,"column":25,"cyclomaticComplexity":6,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["filesystem","database"]}}],["file:/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx",{"id":"file:/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx","metadata":{"lineCount":255,"featureKind":"library","trustBoundaries":["auth","user-input"]}}],["/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:SessionsPage",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:SessionsPage","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx","symbolName":"SessionsPage","symbolKind":"function","exported":true,"metadata":{"line":22,"column":29,"cyclomaticComplexity":17,"maxNestingDepth":2,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["auth","user-input"]}}],["symbol-name:setLastSessionId",{"id":"symbol-name:setLastSessionId","kind":"symbol","language":"jsts","symbolName":"setLastSessionId","metadata":{"unresolvedName":"setLastSessionId"}}],["symbol-name:loadProjects",{"id":"symbol-name:loadProjects","kind":"symbol","language":"jsts","symbolName":"loadProjects","metadata":{"unresolvedName":"loadProjects"}}],["external:[\"running\", \"starting\", \"unhealthy\", \"probing\"].includes",{"id":"external:[\"running\", \"starting\", \"unhealthy\", \"probing\"].includes","kind":"external","language":"jsts","metadata":{"unresolvedName":"[\"running\", \"starting\", \"unhealthy\", \"probing\"].includes"}}],["external:s.tool_type_interfaces?.includes",{"id":"external:s.tool_type_interfaces?.includes","kind":"external","language":"jsts","metadata":{"unresolvedName":"s.tool_type_interfaces?.includes"}}],["external:sessions.find",{"id":"external:sessions.find","kind":"external","language":"jsts","metadata":{"unresolvedName":"sessions.find"}}],["external:dirtyDeleteFiles.map",{"id":"external:dirtyDeleteFiles.map","kind":"external","language":"jsts","metadata":{"unresolvedName":"dirtyDeleteFiles.map"}}],["symbol-name:handleForceDelete",{"id":"symbol-name:handleForceDelete","kind":"symbol","language":"jsts","symbolName":"handleForceDelete","metadata":{"unresolvedName":"handleForceDelete"}}],["/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx","symbolName":"","symbolKind":"function","exported":false,"metadata":{"line":206,"column":32,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["auth","user-input"]}}],["/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:loadProjects",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:loadProjects","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx","symbolName":"loadProjects","symbolKind":"function","exported":false,"metadata":{"line":54,"column":26,"cyclomaticComplexity":2,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["auth","user-input"]}}],["/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:loadToolTypes",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:loadToolTypes","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx","symbolName":"loadToolTypes","symbolKind":"function","exported":false,"metadata":{"line":66,"column":27,"cyclomaticComplexity":2,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["auth","user-input"]}}],["/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:checkHealth",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:checkHealth","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx","symbolName":"checkHealth","symbolKind":"function","exported":false,"metadata":{"line":92,"column":25,"cyclomaticComplexity":4,"maxNestingDepth":2,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["auth","user-input"]}}],["/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:loadRepos",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:loadRepos","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx","symbolName":"loadRepos","symbolKind":"function","exported":false,"metadata":{"line":137,"column":23,"cyclomaticComplexity":2,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["filesystem","database","auth","user-input"]}}],["/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:handleCreateSuccess",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:handleCreateSuccess","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx","symbolName":"handleCreateSuccess","symbolKind":"function","exported":false,"metadata":{"line":153,"column":31,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["auth","user-input"]}}],["file:/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx",{"id":"file:/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx","metadata":{"lineCount":154,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx:SettingsPage",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx:SettingsPage","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx","symbolName":"SettingsPage","symbolKind":"function","exported":true,"metadata":{"line":27,"column":29,"cyclomaticComplexity":10,"maxNestingDepth":2,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["symbol-name:setConfig",{"id":"symbol-name:setConfig","kind":"symbol","language":"jsts","symbolName":"setConfig","metadata":{"unresolvedName":"setConfig"}}],["external:window.setTimeout",{"id":"external:window.setTimeout","kind":"external","language":"jsts","metadata":{"unresolvedName":"window.setTimeout"}}],["external:location.pathname.split(\"/\").filter",{"id":"external:location.pathname.split(\"/\").filter","kind":"external","language":"jsts","metadata":{"unresolvedName":"location.pathname.split(\"/\").filter"}}],["external:location.pathname.split",{"id":"external:location.pathname.split","kind":"external","language":"jsts","metadata":{"unresolvedName":"location.pathname.split"}}],["external:location.pathname.endsWith",{"id":"external:location.pathname.endsWith","kind":"external","language":"jsts","metadata":{"unresolvedName":"location.pathname.endsWith"}}],["external:TABS.map",{"id":"external:TABS.map","kind":"external","language":"jsts","metadata":{"unresolvedName":"TABS.map"}}],["/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx:",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx:","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx","symbolName":"","symbolKind":"function","exported":false,"metadata":{"line":40,"column":13,"cyclomaticComplexity":2,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx:handleChange",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx:handleChange","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx","symbolName":"handleChange","symbolKind":"function","exported":false,"metadata":{"line":46,"column":24,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx:handleSave",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx:handleSave","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx","symbolName":"handleSave","symbolKind":"function","exported":false,"metadata":{"line":51,"column":22,"cyclomaticComplexity":3,"maxNestingDepth":2,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx:GeneralSettingsTab",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx:GeneralSettingsTab","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx","symbolName":"GeneralSettingsTab","symbolKind":"function","exported":true,"metadata":{"line":118,"column":35,"cyclomaticComplexity":10,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["symbol-name:useOutletContext",{"id":"symbol-name:useOutletContext","kind":"symbol","language":"jsts","symbolName":"useOutletContext","metadata":{"unresolvedName":"useOutletContext"}}],["external:THEME_OPTIONS.map",{"id":"external:THEME_OPTIONS.map","kind":"external","language":"jsts","metadata":{"unresolvedName":"THEME_OPTIONS.map"}}],["file:/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx",{"id":"file:/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx","metadata":{"lineCount":278,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:SSHKeysPage",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:SSHKeysPage","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx","symbolName":"SSHKeysPage","symbolKind":"function","exported":true,"metadata":{"line":8,"column":28,"cyclomaticComplexity":29,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["external:newKeyName.trim",{"id":"external:newKeyName.trim","kind":"external","language":"jsts","metadata":{"unresolvedName":"newKeyName.trim"}}],["symbol-name:setGenerating",{"id":"symbol-name:setGenerating","kind":"symbol","language":"jsts","symbolName":"setGenerating","metadata":{"unresolvedName":"setGenerating"}}],["symbol-name:createSSHKey",{"id":"symbol-name:createSSHKey","kind":"symbol","language":"jsts","symbolName":"createSSHKey","metadata":{"unresolvedName":"createSSHKey"}}],["symbol-name:setNewKeyName",{"id":"symbol-name:setNewKeyName","kind":"symbol","language":"jsts","symbolName":"setNewKeyName","metadata":{"unresolvedName":"setNewKeyName"}}],["symbol-name:setMutationError",{"id":"symbol-name:setMutationError","kind":"symbol","language":"jsts","symbolName":"setMutationError","metadata":{"unresolvedName":"setMutationError"}}],["symbol-name:deleteSSHKey",{"id":"symbol-name:deleteSSHKey","kind":"symbol","language":"jsts","symbolName":"deleteSSHKey","metadata":{"unresolvedName":"deleteSSHKey"}}],["external:payload?.trim",{"id":"external:payload?.trim","kind":"external","language":"jsts","metadata":{"unresolvedName":"payload?.trim"}}],["symbol-name:setSigning",{"id":"symbol-name:setSigning","kind":"symbol","language":"jsts","symbolName":"setSigning","metadata":{"unresolvedName":"setSigning"}}],["symbol-name:signPayload",{"id":"symbol-name:signPayload","kind":"symbol","language":"jsts","symbolName":"signPayload","metadata":{"unresolvedName":"signPayload"}}],["external:payload.trim",{"id":"external:payload.trim","kind":"external","language":"jsts","metadata":{"unresolvedName":"payload.trim"}}],["symbol-name:setSignatures",{"id":"symbol-name:setSignatures","kind":"symbol","language":"jsts","symbolName":"setSignatures","metadata":{"unresolvedName":"setSignatures"}}],["external:signature?.trim",{"id":"external:signature?.trim","kind":"external","language":"jsts","metadata":{"unresolvedName":"signature?.trim"}}],["symbol-name:setVerifying",{"id":"symbol-name:setVerifying","kind":"symbol","language":"jsts","symbolName":"setVerifying","metadata":{"unresolvedName":"setVerifying"}}],["symbol-name:verifySignature",{"id":"symbol-name:verifySignature","kind":"symbol","language":"jsts","symbolName":"verifySignature","metadata":{"unresolvedName":"verifySignature"}}],["external:signature.trim",{"id":"external:signature.trim","kind":"external","language":"jsts","metadata":{"unresolvedName":"signature.trim"}}],["symbol-name:setVerifyResults",{"id":"symbol-name:setVerifyResults","kind":"symbol","language":"jsts","symbolName":"setVerifyResults","metadata":{"unresolvedName":"setVerifyResults"}}],["external:safeKeys.map",{"id":"external:safeKeys.map","kind":"external","language":"jsts","metadata":{"unresolvedName":"safeKeys.map"}}],["external:new Date(key.created_at).toLocaleDateString",{"id":"external:new Date(key.created_at).toLocaleDateString","kind":"external","language":"jsts","metadata":{"unresolvedName":"new Date(key.created_at).toLocaleDateString"}}],["external:key.public_key.substring",{"id":"external:key.public_key.substring","kind":"external","language":"jsts","metadata":{"unresolvedName":"key.public_key.substring"}}],["symbol-name:copyToClipboard",{"id":"symbol-name:copyToClipboard","kind":"symbol","language":"jsts","symbolName":"copyToClipboard","metadata":{"unresolvedName":"copyToClipboard"}}],["symbol-name:setSignPayloads",{"id":"symbol-name:setSignPayloads","kind":"symbol","language":"jsts","symbolName":"setSignPayloads","metadata":{"unresolvedName":"setSignPayloads"}}],["symbol-name:handleSign",{"id":"symbol-name:handleSign","kind":"symbol","language":"jsts","symbolName":"handleSign","metadata":{"unresolvedName":"handleSign"}}],["external:signPayloads[key.id]?.trim",{"id":"external:signPayloads[key.id]?.trim","kind":"external","language":"jsts","metadata":{"unresolvedName":"signPayloads[key.id]?.trim"}}],["symbol-name:setVerifyPayloads",{"id":"symbol-name:setVerifyPayloads","kind":"symbol","language":"jsts","symbolName":"setVerifyPayloads","metadata":{"unresolvedName":"setVerifyPayloads"}}],["symbol-name:setVerifySignatures",{"id":"symbol-name:setVerifySignatures","kind":"symbol","language":"jsts","symbolName":"setVerifySignatures","metadata":{"unresolvedName":"setVerifySignatures"}}],["symbol-name:handleVerify",{"id":"symbol-name:handleVerify","kind":"symbol","language":"jsts","symbolName":"handleVerify","metadata":{"unresolvedName":"handleVerify"}}],["external:verifyPayloads[key.id]?.trim",{"id":"external:verifyPayloads[key.id]?.trim","kind":"external","language":"jsts","metadata":{"unresolvedName":"verifyPayloads[key.id]?.trim"}}],["external:verifySignatures[key.id]?.trim",{"id":"external:verifySignatures[key.id]?.trim","kind":"external","language":"jsts","metadata":{"unresolvedName":"verifySignatures[key.id]?.trim"}}],["/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:handleGenerate",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:handleGenerate","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx","symbolName":"handleGenerate","symbolKind":"function","exported":false,"metadata":{"line":24,"column":3,"cyclomaticComplexity":3,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:handleDelete",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:handleDelete","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx","symbolName":"handleDelete","symbolKind":"function","exported":false,"metadata":{"line":40,"column":3,"cyclomaticComplexity":3,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:copyToClipboard",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:copyToClipboard","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx","symbolName":"copyToClipboard","symbolKind":"function","exported":false,"metadata":{"line":51,"column":3,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:handleSign",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:handleSign","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx","symbolName":"handleSign","symbolKind":"function","exported":false,"metadata":{"line":55,"column":3,"cyclomaticComplexity":3,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:handleVerify",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:handleVerify","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx","symbolName":"handleVerify","symbolKind":"function","exported":false,"metadata":{"line":71,"column":3,"cyclomaticComplexity":4,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["file:/home/alex/projects/headquarter/apps/web/src/pages/terminal.tsx",{"id":"file:/home/alex/projects/headquarter/apps/web/src/pages/terminal.tsx","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/terminal.tsx","metadata":{"lineCount":51,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/pages/terminal.tsx:TerminalPage",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/terminal.tsx:TerminalPage","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/terminal.tsx","symbolName":"TerminalPage","symbolKind":"function","exported":true,"metadata":{"line":7,"column":39,"cyclomaticComplexity":3,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx",{"id":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","metadata":{"lineCount":400,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","symbolName":"","symbolKind":"function","exported":false,"metadata":{"line":392,"column":23,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["external:vi.spyOn(toolTypesApi, \"listToolTypes\").mockImplementation",{"id":"external:vi.spyOn(toolTypesApi, \"listToolTypes\").mockImplementation","kind":"external","language":"jsts","metadata":{"unresolvedName":"vi.spyOn(toolTypesApi, \"listToolTypes\").mockImplementation"}}],["external:vi.spyOn(toolConfigsApi, \"listToolConfigs\").mockImplementation",{"id":"external:vi.spyOn(toolConfigsApi, \"listToolConfigs\").mockImplementation","kind":"external","language":"jsts","metadata":{"unresolvedName":"vi.spyOn(toolConfigsApi, \"listToolConfigs\").mockImplementation"}}],["external:vi.spyOn(configFoldersApi, \"listConfigFolders\").mockImplementation",{"id":"external:vi.spyOn(configFoldersApi, \"listConfigFolders\").mockImplementation","kind":"external","language":"jsts","metadata":{"unresolvedName":"vi.spyOn(configFoldersApi, \"listConfigFolders\").mockImplementation"}}],["external:expect(screen.getByText(/loading/i)).toBeInTheDocument",{"id":"external:expect(screen.getByText(/loading/i)).toBeInTheDocument","kind":"external","language":"jsts","metadata":{"unresolvedName":"expect(screen.getByText(/loading/i)).toBeInTheDocument"}}],["external:vi.spyOn(toolTypesApi, \"listToolTypes\").mockResolvedValue",{"id":"external:vi.spyOn(toolTypesApi, \"listToolTypes\").mockResolvedValue","kind":"external","language":"jsts","metadata":{"unresolvedName":"vi.spyOn(toolTypesApi, \"listToolTypes\").mockResolvedValue"}}],["external:vi.spyOn(toolConfigsApi, \"listToolConfigs\").mockResolvedValue",{"id":"external:vi.spyOn(toolConfigsApi, \"listToolConfigs\").mockResolvedValue","kind":"external","language":"jsts","metadata":{"unresolvedName":"vi.spyOn(toolConfigsApi, \"listToolConfigs\").mockResolvedValue"}}],["external:vi.spyOn(configFoldersApi, \"listConfigFolders\").mockResolvedValue",{"id":"external:vi.spyOn(configFoldersApi, \"listConfigFolders\").mockResolvedValue","kind":"external","language":"jsts","metadata":{"unresolvedName":"vi.spyOn(configFoldersApi, \"listConfigFolders\").mockResolvedValue"}}],["external:expect(screen.getByText(\"VS Code Server\")).toBeInTheDocument",{"id":"external:expect(screen.getByText(\"VS Code Server\")).toBeInTheDocument","kind":"external","language":"jsts","metadata":{"unresolvedName":"expect(screen.getByText(\"VS Code Server\")).toBeInTheDocument"}}],["external:expect(screen.getByText(\"Custom Tool\")).toBeInTheDocument",{"id":"external:expect(screen.getByText(\"Custom Tool\")).toBeInTheDocument","kind":"external","language":"jsts","metadata":{"unresolvedName":"expect(screen.getByText(\"Custom Tool\")).toBeInTheDocument"}}],["external:expect(screen.getByRole(\"button\", { name: /configs/i })).toBeInTheDocument",{"id":"external:expect(screen.getByRole(\"button\", { name: /configs/i })).toBeInTheDocument","kind":"external","language":"jsts","metadata":{"unresolvedName":"expect(screen.getByRole(\"button\", { name: /configs/i })).toBeInTheDocument"}}],["external:expect(screen.getByText(\"OPENAI_API_KEY\")).toBeInTheDocument",{"id":"external:expect(screen.getByText(\"OPENAI_API_KEY\")).toBeInTheDocument","kind":"external","language":"jsts","metadata":{"unresolvedName":"expect(screen.getByText(\"OPENAI_API_KEY\")).toBeInTheDocument"}}],["external:expect(screen.getByPlaceholderText(\"e.g., OPENAI_API_KEY\")).toBeInTheDocument",{"id":"external:expect(screen.getByPlaceholderText(\"e.g., OPENAI_API_KEY\")).toBeInTheDocument","kind":"external","language":"jsts","metadata":{"unresolvedName":"expect(screen.getByPlaceholderText(\"e.g., OPENAI_API_KEY\")).toBeInTheDocument"}}],["external:expect(screen.getByPlaceholderText(/Enter value/i)).toBeInTheDocument",{"id":"external:expect(screen.getByPlaceholderText(/Enter value/i)).toBeInTheDocument","kind":"external","language":"jsts","metadata":{"unresolvedName":"expect(screen.getByPlaceholderText(/Enter value/i)).toBeInTheDocument"}}],["external:vi.spyOn(toolConfigsApi, \"createToolConfig\").mockResolvedValue",{"id":"external:vi.spyOn(toolConfigsApi, \"createToolConfig\").mockResolvedValue","kind":"external","language":"jsts","metadata":{"unresolvedName":"vi.spyOn(toolConfigsApi, \"createToolConfig\").mockResolvedValue"}}],["external:expect(configsListMock).toHaveBeenCalledTimes",{"id":"external:expect(configsListMock).toHaveBeenCalledTimes","kind":"external","language":"jsts","metadata":{"unresolvedName":"expect(configsListMock).toHaveBeenCalledTimes"}}],["external:expect(screen.getByRole(\"button\", { name: /folders/i })).toBeInTheDocument",{"id":"external:expect(screen.getByRole(\"button\", { name: /folders/i })).toBeInTheDocument","kind":"external","language":"jsts","metadata":{"unresolvedName":"expect(screen.getByRole(\"button\", { name: /folders/i })).toBeInTheDocument"}}],["external:expect(screen.getByText(\"my-dotfiles\")).toBeInTheDocument",{"id":"external:expect(screen.getByText(\"my-dotfiles\")).toBeInTheDocument","kind":"external","language":"jsts","metadata":{"unresolvedName":"expect(screen.getByText(\"my-dotfiles\")).toBeInTheDocument"}}],["external:expect(screen.getByPlaceholderText(\"e.g., my-dotfiles\")).toBeInTheDocument",{"id":"external:expect(screen.getByPlaceholderText(\"e.g., my-dotfiles\")).toBeInTheDocument","kind":"external","language":"jsts","metadata":{"unresolvedName":"expect(screen.getByPlaceholderText(\"e.g., my-dotfiles\")).toBeInTheDocument"}}],["external:expect(screen.getByPlaceholderText(\"e.g., /home/user\")).toBeInTheDocument",{"id":"external:expect(screen.getByPlaceholderText(\"e.g., /home/user\")).toBeInTheDocument","kind":"external","language":"jsts","metadata":{"unresolvedName":"expect(screen.getByPlaceholderText(\"e.g., /home/user\")).toBeInTheDocument"}}],["external:vi.spyOn(configFoldersApi, \"createConfigFolder\").mockResolvedValue",{"id":"external:vi.spyOn(configFoldersApi, \"createConfigFolder\").mockResolvedValue","kind":"external","language":"jsts","metadata":{"unresolvedName":"vi.spyOn(configFoldersApi, \"createConfigFolder\").mockResolvedValue"}}],["external:expect(foldersListMock).toHaveBeenCalledTimes",{"id":"external:expect(foldersListMock).toHaveBeenCalledTimes","kind":"external","language":"jsts","metadata":{"unresolvedName":"expect(foldersListMock).toHaveBeenCalledTimes"}}],["external:expect(screen.getByText(\"Active\")).toBeInTheDocument",{"id":"external:expect(screen.getByText(\"Active\")).toBeInTheDocument","kind":"external","language":"jsts","metadata":{"unresolvedName":"expect(screen.getByText(\"Active\")).toBeInTheDocument"}}],["external:vi.spyOn(toolTypesApi, \"listToolTypes\").mockRejectedValue",{"id":"external:vi.spyOn(toolTypesApi, \"listToolTypes\").mockRejectedValue","kind":"external","language":"jsts","metadata":{"unresolvedName":"vi.spyOn(toolTypesApi, \"listToolTypes\").mockRejectedValue"}}],["external:vi.spyOn(toolConfigsApi, \"listToolConfigs\").mockRejectedValue",{"id":"external:vi.spyOn(toolConfigsApi, \"listToolConfigs\").mockRejectedValue","kind":"external","language":"jsts","metadata":{"unresolvedName":"vi.spyOn(toolConfigsApi, \"listToolConfigs\").mockRejectedValue"}}],["external:vi.spyOn(configFoldersApi, \"listConfigFolders\").mockRejectedValue",{"id":"external:vi.spyOn(configFoldersApi, \"listConfigFolders\").mockRejectedValue","kind":"external","language":"jsts","metadata":{"unresolvedName":"vi.spyOn(configFoldersApi, \"listConfigFolders\").mockRejectedValue"}}],["external:expect(screen.getByText(/failed to load/i)).toBeInTheDocument",{"id":"external:expect(screen.getByText(/failed to load/i)).toBeInTheDocument","kind":"external","language":"jsts","metadata":{"unresolvedName":"expect(screen.getByText(/failed to load/i)).toBeInTheDocument"}}],["external:vi.spyOn(toolTypesApi, \"listToolTypes\")\n .mockRejectedValueOnce",{"id":"external:vi.spyOn(toolTypesApi, \"listToolTypes\")\n .mockRejectedValueOnce","kind":"external","language":"jsts","metadata":{"unresolvedName":"vi.spyOn(toolTypesApi, \"listToolTypes\")\n .mockRejectedValueOnce"}}],["external:vi.spyOn(toolConfigsApi, \"listToolConfigs\")\n .mockRejectedValueOnce",{"id":"external:vi.spyOn(toolConfigsApi, \"listToolConfigs\")\n .mockRejectedValueOnce","kind":"external","language":"jsts","metadata":{"unresolvedName":"vi.spyOn(toolConfigsApi, \"listToolConfigs\")\n .mockRejectedValueOnce"}}],["external:vi.spyOn(configFoldersApi, \"listConfigFolders\")\n .mockRejectedValueOnce",{"id":"external:vi.spyOn(configFoldersApi, \"listConfigFolders\")\n .mockRejectedValueOnce","kind":"external","language":"jsts","metadata":{"unresolvedName":"vi.spyOn(configFoldersApi, \"listConfigFolders\")\n .mockRejectedValueOnce"}}],["external:vi.spyOn(toolTypesApi, \"deleteToolType\").mockResolvedValue",{"id":"external:vi.spyOn(toolTypesApi, \"deleteToolType\").mockResolvedValue","kind":"external","language":"jsts","metadata":{"unresolvedName":"vi.spyOn(toolTypesApi, \"deleteToolType\").mockResolvedValue"}}],["external:screen.getByText(\"Custom Tool\").closest",{"id":"external:screen.getByText(\"Custom Tool\").closest","kind":"external","language":"jsts","metadata":{"unresolvedName":"screen.getByText(\"Custom Tool\").closest"}}],["external:within(customToolCard as HTMLElement).queryByRole",{"id":"external:within(customToolCard as HTMLElement).queryByRole","kind":"external","language":"jsts","metadata":{"unresolvedName":"within(customToolCard as HTMLElement).queryByRole"}}],["external:vi.spyOn(window, \"confirm\").mockReturnValue",{"id":"external:vi.spyOn(window, \"confirm\").mockReturnValue","kind":"external","language":"jsts","metadata":{"unresolvedName":"vi.spyOn(window, \"confirm\").mockReturnValue"}}],["external:(toolTypes || []).find",{"id":"external:(toolTypes || []).find","kind":"external","language":"jsts","metadata":{"unresolvedName":"(toolTypes || []).find"}}],["external:(configs || []).filter",{"id":"external:(configs || []).filter","kind":"external","language":"jsts","metadata":{"unresolvedName":"(configs || []).filter"}}],["symbol-name:listToolConfigs",{"id":"symbol-name:listToolConfigs","kind":"symbol","language":"jsts","symbolName":"listToolConfigs","metadata":{"unresolvedName":"listToolConfigs"}}],["symbol-name:setConfigs",{"id":"symbol-name:setConfigs","kind":"symbol","language":"jsts","symbolName":"setConfigs","metadata":{"unresolvedName":"setConfigs"}}],["symbol-name:setFolders",{"id":"symbol-name:setFolders","kind":"symbol","language":"jsts","symbolName":"setFolders","metadata":{"unresolvedName":"setFolders"}}],["symbol-name:setToolTypeForm",{"id":"symbol-name:setToolTypeForm","kind":"symbol","language":"jsts","symbolName":"setToolTypeForm","metadata":{"unresolvedName":"setToolTypeForm"}}],["symbol-name:setToolTypeError",{"id":"symbol-name:setToolTypeError","kind":"symbol","language":"jsts","symbolName":"setToolTypeError","metadata":{"unresolvedName":"setToolTypeError"}}],["symbol-name:setToolTypeDirty",{"id":"symbol-name:setToolTypeDirty","kind":"symbol","language":"jsts","symbolName":"setToolTypeDirty","metadata":{"unresolvedName":"setToolTypeDirty"}}],["external:toolType.default_port?.toString",{"id":"external:toolType.default_port?.toString","kind":"external","language":"jsts","metadata":{"unresolvedName":"toolType.default_port?.toString"}}],["external:toolType.readiness_probe?.timeout?.toString",{"id":"external:toolType.readiness_probe?.timeout?.toString","kind":"external","language":"jsts","metadata":{"unresolvedName":"toolType.readiness_probe?.timeout?.toString"}}],["external:toolType.readiness_probe?.interval?.toString",{"id":"external:toolType.readiness_probe?.interval?.toString","kind":"external","language":"jsts","metadata":{"unresolvedName":"toolType.readiness_probe?.interval?.toString"}}],["external:toolType.required_variables?.join",{"id":"external:toolType.required_variables?.join","kind":"external","language":"jsts","metadata":{"unresolvedName":"toolType.required_variables?.join"}}],["symbol-name:setSelectedToolTypeId",{"id":"symbol-name:setSelectedToolTypeId","kind":"symbol","language":"jsts","symbolName":"setSelectedToolTypeId","metadata":{"unresolvedName":"setSelectedToolTypeId"}}],["symbol-name:populateToolTypeForm",{"id":"symbol-name:populateToolTypeForm","kind":"symbol","language":"jsts","symbolName":"populateToolTypeForm","metadata":{"unresolvedName":"populateToolTypeForm"}}],["symbol-name:setRightPanelTab",{"id":"symbol-name:setRightPanelTab","kind":"symbol","language":"jsts","symbolName":"setRightPanelTab","metadata":{"unresolvedName":"setRightPanelTab"}}],["symbol-name:setShowConfigForm",{"id":"symbol-name:setShowConfigForm","kind":"symbol","language":"jsts","symbolName":"setShowConfigForm","metadata":{"unresolvedName":"setShowConfigForm"}}],["symbol-name:setShowFolderForm",{"id":"symbol-name:setShowFolderForm","kind":"symbol","language":"jsts","symbolName":"setShowFolderForm","metadata":{"unresolvedName":"setShowFolderForm"}}],["symbol-name:resetToolTypeForm",{"id":"symbol-name:resetToolTypeForm","kind":"symbol","language":"jsts","symbolName":"resetToolTypeForm","metadata":{"unresolvedName":"resetToolTypeForm"}}],["external:toolTypeForm.name.trim",{"id":"external:toolTypeForm.name.trim","kind":"external","language":"jsts","metadata":{"unresolvedName":"toolTypeForm.name.trim"}}],["external:toolTypeForm.display_name.trim",{"id":"external:toolTypeForm.display_name.trim","kind":"external","language":"jsts","metadata":{"unresolvedName":"toolTypeForm.display_name.trim"}}],["external:toolTypeForm.default_port.trim",{"id":"external:toolTypeForm.default_port.trim","kind":"external","language":"jsts","metadata":{"unresolvedName":"toolTypeForm.default_port.trim"}}],["symbol-name:isNaN",{"id":"symbol-name:isNaN","kind":"symbol","language":"jsts","symbolName":"isNaN","metadata":{"unresolvedName":"isNaN"}}],["external:template.trim",{"id":"external:template.trim","kind":"external","language":"jsts","metadata":{"unresolvedName":"template.trim"}}],["external:toolTypeForm.required_variables\n .split(\",\")\n .map",{"id":"external:toolTypeForm.required_variables\n .split(\",\")\n .map","kind":"external","language":"jsts","metadata":{"unresolvedName":"toolTypeForm.required_variables\n .split(\",\")\n .map"}}],["external:toolTypeForm.required_variables\n .split",{"id":"external:toolTypeForm.required_variables\n .split","kind":"external","language":"jsts","metadata":{"unresolvedName":"toolTypeForm.required_variables\n .split"}}],["external:v.trim",{"id":"external:v.trim","kind":"external","language":"jsts","metadata":{"unresolvedName":"v.trim"}}],["external:toolTypeForm.readiness_command.trim",{"id":"external:toolTypeForm.readiness_command.trim","kind":"external","language":"jsts","metadata":{"unresolvedName":"toolTypeForm.readiness_command.trim"}}],["external:toolTypeForm.description.trim",{"id":"external:toolTypeForm.description.trim","kind":"external","language":"jsts","metadata":{"unresolvedName":"toolTypeForm.description.trim"}}],["external:toolTypeForm.category.trim",{"id":"external:toolTypeForm.category.trim","kind":"external","language":"jsts","metadata":{"unresolvedName":"toolTypeForm.category.trim"}}],["external:toolTypeForm.startup_command.trim",{"id":"external:toolTypeForm.startup_command.trim","kind":"external","language":"jsts","metadata":{"unresolvedName":"toolTypeForm.startup_command.trim"}}],["symbol-name:setConfigForm",{"id":"symbol-name:setConfigForm","kind":"symbol","language":"jsts","symbolName":"setConfigForm","metadata":{"unresolvedName":"setConfigForm"}}],["symbol-name:setConfigError",{"id":"symbol-name:setConfigError","kind":"symbol","language":"jsts","symbolName":"setConfigError","metadata":{"unresolvedName":"setConfigError"}}],["symbol-name:setSelectedConfig",{"id":"symbol-name:setSelectedConfig","kind":"symbol","language":"jsts","symbolName":"setSelectedConfig","metadata":{"unresolvedName":"setSelectedConfig"}}],["symbol-name:resetConfigForm",{"id":"symbol-name:resetConfigForm","kind":"symbol","language":"jsts","symbolName":"resetConfigForm","metadata":{"unresolvedName":"resetConfigForm"}}],["external:config.port_override?.toString",{"id":"external:config.port_override?.toString","kind":"external","language":"jsts","metadata":{"unresolvedName":"config.port_override?.toString"}}],["external:configForm.key.trim",{"id":"external:configForm.key.trim","kind":"external","language":"jsts","metadata":{"unresolvedName":"configForm.key.trim"}}],["external:configForm.env_vars_json.trim",{"id":"external:configForm.env_vars_json.trim","kind":"external","language":"jsts","metadata":{"unresolvedName":"configForm.env_vars_json.trim"}}],["external:configForm.volumes_json.trim",{"id":"external:configForm.volumes_json.trim","kind":"external","language":"jsts","metadata":{"unresolvedName":"configForm.volumes_json.trim"}}],["external:configForm.start_command.trim",{"id":"external:configForm.start_command.trim","kind":"external","language":"jsts","metadata":{"unresolvedName":"configForm.start_command.trim"}}],["external:configForm.working_directory.trim",{"id":"external:configForm.working_directory.trim","kind":"external","language":"jsts","metadata":{"unresolvedName":"configForm.working_directory.trim"}}],["symbol-name:updateToolConfig",{"id":"symbol-name:updateToolConfig","kind":"symbol","language":"jsts","symbolName":"updateToolConfig","metadata":{"unresolvedName":"updateToolConfig"}}],["symbol-name:createToolConfig",{"id":"symbol-name:createToolConfig","kind":"symbol","language":"jsts","symbolName":"createToolConfig","metadata":{"unresolvedName":"createToolConfig"}}],["symbol-name:deleteToolConfig",{"id":"symbol-name:deleteToolConfig","kind":"symbol","language":"jsts","symbolName":"deleteToolConfig","metadata":{"unresolvedName":"deleteToolConfig"}}],["symbol-name:setFolderForm",{"id":"symbol-name:setFolderForm","kind":"symbol","language":"jsts","symbolName":"setFolderForm","metadata":{"unresolvedName":"setFolderForm"}}],["symbol-name:setFolderError",{"id":"symbol-name:setFolderError","kind":"symbol","language":"jsts","symbolName":"setFolderError","metadata":{"unresolvedName":"setFolderError"}}],["symbol-name:setSelectedFolder",{"id":"symbol-name:setSelectedFolder","kind":"symbol","language":"jsts","symbolName":"setSelectedFolder","metadata":{"unresolvedName":"setSelectedFolder"}}],["symbol-name:resetFolderForm",{"id":"symbol-name:resetFolderForm","kind":"symbol","language":"jsts","symbolName":"resetFolderForm","metadata":{"unresolvedName":"resetFolderForm"}}],["external:folderForm.name.trim",{"id":"external:folderForm.name.trim","kind":"external","language":"jsts","metadata":{"unresolvedName":"folderForm.name.trim"}}],["external:folderForm.mount_path.trim",{"id":"external:folderForm.mount_path.trim","kind":"external","language":"jsts","metadata":{"unresolvedName":"folderForm.mount_path.trim"}}],["external:folderForm.files_json.trim",{"id":"external:folderForm.files_json.trim","kind":"external","language":"jsts","metadata":{"unresolvedName":"folderForm.files_json.trim"}}],["external:folderForm.description.trim",{"id":"external:folderForm.description.trim","kind":"external","language":"jsts","metadata":{"unresolvedName":"folderForm.description.trim"}}],["external:selectedToolType.required_variables?.join",{"id":"external:selectedToolType.required_variables?.join","kind":"external","language":"jsts","metadata":{"unresolvedName":"selectedToolType.required_variables?.join"}}],["symbol-name:handleDeleteToolType",{"id":"symbol-name:handleDeleteToolType","kind":"symbol","language":"jsts","symbolName":"handleDeleteToolType","metadata":{"unresolvedName":"handleDeleteToolType"}}],["symbol-name:handleToolTypeSubmit",{"id":"symbol-name:handleToolTypeSubmit","kind":"symbol","language":"jsts","symbolName":"handleToolTypeSubmit","metadata":{"unresolvedName":"handleToolTypeSubmit"}}],["symbol-name:handleSelectToolType",{"id":"symbol-name:handleSelectToolType","kind":"symbol","language":"jsts","symbolName":"handleSelectToolType","metadata":{"unresolvedName":"handleSelectToolType"}}],["external:([\"details\", \"configs\", \"folders\"] as RightPanelTab[]).map",{"id":"external:([\"details\", \"configs\", \"folders\"] as RightPanelTab[]).map","kind":"external","language":"jsts","metadata":{"unresolvedName":"([\"details\", \"configs\", \"folders\"] as RightPanelTab[]).map"}}],["external:toolConfigs.map",{"id":"external:toolConfigs.map","kind":"external","language":"jsts","metadata":{"unresolvedName":"toolConfigs.map"}}],["symbol-name:openEditConfig",{"id":"symbol-name:openEditConfig","kind":"symbol","language":"jsts","symbolName":"openEditConfig","metadata":{"unresolvedName":"openEditConfig"}}],["symbol-name:handleDeleteConfig",{"id":"symbol-name:handleDeleteConfig","kind":"symbol","language":"jsts","symbolName":"handleDeleteConfig","metadata":{"unresolvedName":"handleDeleteConfig"}}],["external:toolFolders.map",{"id":"external:toolFolders.map","kind":"external","language":"jsts","metadata":{"unresolvedName":"toolFolders.map"}}],["symbol-name:openEditFolder",{"id":"symbol-name:openEditFolder","kind":"symbol","language":"jsts","symbolName":"openEditFolder","metadata":{"unresolvedName":"openEditFolder"}}],["symbol-name:handleDeleteFolder",{"id":"symbol-name:handleDeleteFolder","kind":"symbol","language":"jsts","symbolName":"handleDeleteFolder","metadata":{"unresolvedName":"handleDeleteFolder"}}],["/home/alex/projects/headquarter/apps/web/src/router.tsx:AppRouter",{"id":"/home/alex/projects/headquarter/apps/web/src/router.tsx:AppRouter","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/router.tsx","symbolName":"AppRouter","symbolKind":"function","exported":true,"metadata":{"line":20,"column":26,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/state/auth.tsx:AuthProvider",{"id":"/home/alex/projects/headquarter/apps/web/src/state/auth.tsx:AuthProvider","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/state/auth.tsx","symbolName":"AuthProvider","symbolKind":"function","exported":true,"metadata":{"line":17,"column":29,"cyclomaticComplexity":2,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["auth","user-input"]}}],["symbol-name:setUser",{"id":"symbol-name:setUser","kind":"symbol","language":"jsts","symbolName":"setUser","metadata":{"unresolvedName":"setUser"}}],["/home/alex/projects/headquarter/apps/web/src/state/auth.tsx:",{"id":"/home/alex/projects/headquarter/apps/web/src/state/auth.tsx:","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/state/auth.tsx","symbolName":"","symbolKind":"function","exported":false,"metadata":{"line":39,"column":13,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["auth","user-input"]}}],["/home/alex/projects/headquarter/apps/web/src/state/auth.tsx:useAuth",{"id":"/home/alex/projects/headquarter/apps/web/src/state/auth.tsx:useAuth","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/state/auth.tsx","symbolName":"useAuth","symbolKind":"function","exported":true,"metadata":{"line":56,"column":24,"cyclomaticComplexity":2,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["auth","user-input"]}}],["symbol-name:useContext",{"id":"symbol-name:useContext","kind":"symbol","language":"jsts","symbolName":"useContext","metadata":{"unresolvedName":"useContext"}}],["/home/alex/projects/headquarter/apps/web/src/state/sessions.tsx:SessionsProvider",{"id":"/home/alex/projects/headquarter/apps/web/src/state/sessions.tsx:SessionsProvider","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/state/sessions.tsx","symbolName":"SessionsProvider","symbolKind":"function","exported":true,"metadata":{"line":24,"column":33,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["auth","user-input"]}}],["/home/alex/projects/headquarter/apps/web/src/state/sessions.tsx:",{"id":"/home/alex/projects/headquarter/apps/web/src/state/sessions.tsx:","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/state/sessions.tsx","symbolName":"","symbolKind":"function","exported":false,"metadata":{"line":27,"column":38,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["auth","user-input"]}}],["/home/alex/projects/headquarter/apps/web/src/state/sessions.tsx:useSessions",{"id":"/home/alex/projects/headquarter/apps/web/src/state/sessions.tsx:useSessions","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/state/sessions.tsx","symbolName":"useSessions","symbolKind":"function","exported":true,"metadata":{"line":38,"column":28,"cyclomaticComplexity":2,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["auth","user-input"]}}],["file:/home/alex/projects/headquarter/apps/web/src/test/setup.ts",{"id":"file:/home/alex/projects/headquarter/apps/web/src/test/setup.ts","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/test/setup.ts","metadata":{"lineCount":2,"featureKind":"library","trustBoundaries":[]}}],["external:@testing-library/jest-dom/vitest",{"id":"external:@testing-library/jest-dom/vitest","kind":"external","language":"jsts","metadata":{"source":"@testing-library/jest-dom/vitest"}}],["/home/alex/projects/headquarter/apps/web/src/utils/errors.ts:extractErrorMessage",{"id":"/home/alex/projects/headquarter/apps/web/src/utils/errors.ts:extractErrorMessage","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/utils/errors.ts","symbolName":"extractErrorMessage","symbolKind":"function","exported":true,"metadata":{"line":1,"column":36,"cyclomaticComplexity":5,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["external:detail.map((d) => typeof d === \"string\" ? d : d.msg || JSON.stringify(d)).join",{"id":"external:detail.map((d) => typeof d === \"string\" ? d : d.msg || JSON.stringify(d)).join","kind":"external","language":"jsts","metadata":{"unresolvedName":"detail.map((d) => typeof d === \"string\" ? d : d.msg || JSON.stringify(d)).join"}}],["external:detail.map",{"id":"external:detail.map","kind":"external","language":"jsts","metadata":{"unresolvedName":"detail.map"}}],["external:prismjs",{"id":"external:prismjs","kind":"external","language":"jsts","metadata":{"source":"prismjs"}}],["/home/alex/projects/headquarter/apps/web/src/utils/language.ts:detectLanguage",{"id":"/home/alex/projects/headquarter/apps/web/src/utils/language.ts:detectLanguage","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/utils/language.ts","symbolName":"detectLanguage","symbolKind":"function","exported":true,"metadata":{"line":69,"column":31,"cyclomaticComplexity":3,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["external:filename.split(\".\").pop()?.toLowerCase",{"id":"external:filename.split(\".\").pop()?.toLowerCase","kind":"external","language":"jsts","metadata":{"unresolvedName":"filename.split(\".\").pop()?.toLowerCase"}}],["external:filename.split(\".\").pop",{"id":"external:filename.split(\".\").pop","kind":"external","language":"jsts","metadata":{"unresolvedName":"filename.split(\".\").pop"}}],["external:filename.split",{"id":"external:filename.split","kind":"external","language":"jsts","metadata":{"unresolvedName":"filename.split"}}],["/home/alex/projects/headquarter/apps/web/src/utils/language.ts:highlightCode",{"id":"/home/alex/projects/headquarter/apps/web/src/utils/language.ts:highlightCode","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/utils/language.ts","symbolName":"highlightCode","symbolKind":"function","exported":true,"metadata":{"line":74,"column":30,"cyclomaticComplexity":2,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["external:Prism.highlight",{"id":"external:Prism.highlight","kind":"external","language":"jsts","metadata":{"unresolvedName":"Prism.highlight"}}],["/home/alex/projects/headquarter/apps/web/src/utils/language.ts:loadLanguage",{"id":"/home/alex/projects/headquarter/apps/web/src/utils/language.ts:loadLanguage","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/utils/language.ts","symbolName":"loadLanguage","symbolKind":"function","exported":true,"metadata":{"line":79,"column":29,"cyclomaticComplexity":4,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["symbol-name:import",{"id":"symbol-name:import","kind":"symbol","language":"jsts","symbolName":"import","metadata":{"unresolvedName":"import"}}],["file:/home/alex/projects/headquarter/apps/web/vite.config.ts",{"id":"file:/home/alex/projects/headquarter/apps/web/vite.config.ts","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/vite.config.ts","metadata":{"lineCount":14,"featureKind":"service","trustBoundaries":["filesystem","database"]}}],["external:vite",{"id":"external:vite","kind":"external","language":"jsts","metadata":{"source":"vite"}}],["external:@vitejs/plugin-react",{"id":"external:@vitejs/plugin-react","kind":"external","language":"jsts","metadata":{"source":"@vitejs/plugin-react"}}],["symbol-name:listToolDefinitions",{"id":"symbol-name:listToolDefinitions","kind":"symbol","language":"jsts","symbolName":"listToolDefinitions","metadata":{"unresolvedName":"listToolDefinitions"}}],["symbol-name:setBaseDefinitions",{"id":"symbol-name:setBaseDefinitions","kind":"symbol","language":"jsts","symbolName":"setBaseDefinitions","metadata":{"unresolvedName":"setBaseDefinitions"}}],["external:(defs || []).filter",{"id":"external:(defs || []).filter","kind":"external","language":"jsts","metadata":{"unresolvedName":"(defs || []).filter"}}],["symbol-name:setManifestData",{"id":"symbol-name:setManifestData","kind":"symbol","language":"jsts","symbolName":"setManifestData","metadata":{"unresolvedName":"setManifestData"}}],["symbol-name:setManifestDefinitionId",{"id":"symbol-name:setManifestDefinitionId","kind":"symbol","language":"jsts","symbolName":"setManifestDefinitionId","metadata":{"unresolvedName":"setManifestDefinitionId"}}],["file:/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts",{"id":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts","metadata":{"lineCount":94,"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts:listToolTypes",{"id":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts:listToolTypes","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts","symbolName":"listToolTypes","symbolKind":"function","exported":true,"metadata":{"line":66,"column":30,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts:getToolType",{"id":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts:getToolType","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts","symbolName":"getToolType","symbolKind":"function","exported":true,"metadata":{"line":71,"column":28,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts:createToolType",{"id":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts:createToolType","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts","symbolName":"createToolType","symbolKind":"function","exported":true,"metadata":{"line":76,"column":31,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts:updateToolType",{"id":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts:updateToolType","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts","symbolName":"updateToolType","symbolKind":"function","exported":true,"metadata":{"line":81,"column":31,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts:deleteToolType",{"id":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts:deleteToolType","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts","symbolName":"deleteToolType","symbolKind":"function","exported":true,"metadata":{"line":86,"column":31,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts:validateToolType",{"id":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts:validateToolType","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts","symbolName":"validateToolType","symbolKind":"function","exported":true,"metadata":{"line":90,"column":33,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":["network","external-api","serialization"]}}],["file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx",{"id":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","kind":"file","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","metadata":{"lineCount":1513,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","symbolName":"ToolWorkshopPage","symbolKind":"function","exported":true,"metadata":{"line":45,"column":33,"cyclomaticComplexity":167,"maxNestingDepth":4,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","symbolName":"","symbolKind":"function","exported":false,"metadata":{"line":1476,"column":56,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:resetToolTypeForm",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:resetToolTypeForm","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","symbolName":"resetToolTypeForm","symbolKind":"function","exported":false,"metadata":{"line":137,"column":29,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:populateToolTypeForm",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:populateToolTypeForm","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","symbolName":"populateToolTypeForm","symbolKind":"function","exported":false,"metadata":{"line":161,"column":32,"cyclomaticComplexity":15,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleSelectToolType",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleSelectToolType","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","symbolName":"handleSelectToolType","symbolKind":"function","exported":false,"metadata":{"line":186,"column":32,"cyclomaticComplexity":4,"maxNestingDepth":2,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleCreateNew",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleCreateNew","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","symbolName":"handleCreateNew","symbolKind":"function","exported":false,"metadata":{"line":204,"column":27,"cyclomaticComplexity":3,"maxNestingDepth":2,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleToolTypeSubmit",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleToolTypeSubmit","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","symbolName":"handleToolTypeSubmit","symbolKind":"function","exported":false,"metadata":{"line":218,"column":32,"cyclomaticComplexity":29,"maxNestingDepth":3,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleDeleteToolType",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleDeleteToolType","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","symbolName":"handleDeleteToolType","symbolKind":"function","exported":false,"metadata":{"line":305,"column":32,"cyclomaticComplexity":4,"maxNestingDepth":2,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:resetConfigForm",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:resetConfigForm","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","symbolName":"resetConfigForm","symbolKind":"function","exported":false,"metadata":{"line":321,"column":27,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"service","trustBoundaries":["filesystem","database"]}}],["/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:openCreateConfig",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:openCreateConfig","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","symbolName":"openCreateConfig","symbolKind":"function","exported":false,"metadata":{"line":337,"column":28,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"service","trustBoundaries":["filesystem","database"]}}],["/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:openEditConfig",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:openEditConfig","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","symbolName":"openEditConfig","symbolKind":"function","exported":false,"metadata":{"line":342,"column":26,"cyclomaticComplexity":7,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"service","trustBoundaries":["filesystem","database"]}}],["/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleConfigSubmit",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleConfigSubmit","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","symbolName":"handleConfigSubmit","symbolKind":"function","exported":false,"metadata":{"line":359,"column":30,"cyclomaticComplexity":15,"maxNestingDepth":2,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"service","trustBoundaries":["filesystem","database"]}}],["/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleDeleteConfig",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleDeleteConfig","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","symbolName":"handleDeleteConfig","symbolKind":"function","exported":false,"metadata":{"line":417,"column":30,"cyclomaticComplexity":3,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"service","trustBoundaries":["filesystem","database"]}}],["/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:resetFolderForm",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:resetFolderForm","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","symbolName":"resetFolderForm","symbolKind":"function","exported":false,"metadata":{"line":428,"column":27,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:openCreateFolder",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:openCreateFolder","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","symbolName":"openCreateFolder","symbolKind":"function","exported":false,"metadata":{"line":440,"column":28,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:openEditFolder",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:openEditFolder","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","symbolName":"openEditFolder","symbolKind":"function","exported":false,"metadata":{"line":445,"column":26,"cyclomaticComplexity":2,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleFolderSubmit",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleFolderSubmit","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","symbolName":"handleFolderSubmit","symbolKind":"function","exported":false,"metadata":{"line":458,"column":30,"cyclomaticComplexity":9,"maxNestingDepth":2,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleDeleteFolder",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleDeleteFolder","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","symbolName":"handleDeleteFolder","symbolKind":"function","exported":false,"metadata":{"line":500,"column":30,"cyclomaticComplexity":3,"maxNestingDepth":1,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}],["/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:preventDefault",{"id":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:preventDefault","kind":"symbol","language":"jsts","filePath":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","symbolName":"preventDefault","symbolKind":"function","exported":false,"metadata":{"line":610,"column":54,"cyclomaticComplexity":1,"maxNestingDepth":0,"isBoundaryWrapper":false,"isPassThroughWrapper":false,"featureKind":"library","trustBoundaries":[]}}]],"edges":[{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/client.ts","to":"external:axios","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/client.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/client.ts:shouldSkipAuthRedirect","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/client.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/client.ts:shouldSkipAuthRedirect","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/client.ts:shouldSkipAuthRedirect","to":"external:path.startsWith","kind":"calls","metadata":{"unresolvedName":"path.startsWith"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/client.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/client.ts:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/client.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/client.ts:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/client.ts:","to":"/home/alex/projects/headquarter/apps/web/src/api/client.ts:shouldSkipAuthRedirect","kind":"calls","metadata":{"unresolvedName":"shouldSkipAuthRedirect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/client.ts:","to":"external:window.location.assign","kind":"calls","metadata":{"unresolvedName":"window.location.assign"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/client.ts:","to":"external:Promise.reject","kind":"calls","metadata":{"unresolvedName":"Promise.reject"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/client.ts:","to":"external:error.message?.includes","kind":"calls","metadata":{"unresolvedName":"error.message?.includes"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/client.ts:","to":"external:retryCount.get","kind":"calls","metadata":{"unresolvedName":"retryCount.get"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/client.ts:","to":"external:retryCount.set","kind":"calls","metadata":{"unresolvedName":"retryCount.set"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/client.ts:","to":"symbol-name:setTimeout","kind":"calls","metadata":{"unresolvedName":"setTimeout"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/client.ts:","to":"symbol-name:apiClient","kind":"calls","metadata":{"unresolvedName":"apiClient"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts","to":"external:vitest","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts","to":"file:/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"symbol-name:describe","kind":"calls","metadata":{"unresolvedName":"describe"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"symbol-name:it","kind":"calls","metadata":{"unresolvedName":"it"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"external:mockGet.mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"mockGet.mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts:listConfigFolders","kind":"calls","metadata":{"unresolvedName":"listConfigFolders"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"external:expect(result[0].name).toBe","kind":"calls","metadata":{"unresolvedName":"expect(result[0].name).toBe"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"external:expect(result[0].files).toEqual","kind":"calls","metadata":{"unresolvedName":"expect(result[0].files).toEqual"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"external:expect(mockGet).toHaveBeenCalledWith","kind":"calls","metadata":{"unresolvedName":"expect(mockGet).toHaveBeenCalledWith"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"external:mockPost.mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"mockPost.mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts:createConfigFolder","kind":"calls","metadata":{"unresolvedName":"createConfigFolder"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"external:expect(result.name).toBe","kind":"calls","metadata":{"unresolvedName":"expect(result.name).toBe"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"external:expect(mockPost).toHaveBeenCalledWith","kind":"calls","metadata":{"unresolvedName":"expect(mockPost).toHaveBeenCalledWith"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"external:expect.objectContaining","kind":"calls","metadata":{"unresolvedName":"expect.objectContaining"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"external:mockPut.mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"mockPut.mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts:updateConfigFolder","kind":"calls","metadata":{"unresolvedName":"updateConfigFolder"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"external:expect(result.files).toEqual","kind":"calls","metadata":{"unresolvedName":"expect(result.files).toEqual"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"external:expect(mockPut).toHaveBeenCalledWith","kind":"calls","metadata":{"unresolvedName":"expect(mockPut).toHaveBeenCalledWith"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"external:mockDelete.mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"mockDelete.mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts:deleteConfigFolder","kind":"calls","metadata":{"unresolvedName":"deleteConfigFolder"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"external:expect(mockDelete).toHaveBeenCalledWith","kind":"calls","metadata":{"unresolvedName":"expect(mockDelete).toHaveBeenCalledWith"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"symbol-name:it","kind":"calls","metadata":{"unresolvedName":"it"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"external:mockGet.mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"mockGet.mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts:listConfigFolders","kind":"calls","metadata":{"unresolvedName":"listConfigFolders"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"external:expect(result[0].name).toBe","kind":"calls","metadata":{"unresolvedName":"expect(result[0].name).toBe"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"external:expect(result[0].files).toEqual","kind":"calls","metadata":{"unresolvedName":"expect(result[0].files).toEqual"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"external:expect(mockGet).toHaveBeenCalledWith","kind":"calls","metadata":{"unresolvedName":"expect(mockGet).toHaveBeenCalledWith"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"external:mockGet.mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"mockGet.mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts:listConfigFolders","kind":"calls","metadata":{"unresolvedName":"listConfigFolders"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"external:expect(result[0].name).toBe","kind":"calls","metadata":{"unresolvedName":"expect(result[0].name).toBe"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"external:expect(result[0].files).toEqual","kind":"calls","metadata":{"unresolvedName":"expect(result[0].files).toEqual"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"external:expect(mockGet).toHaveBeenCalledWith","kind":"calls","metadata":{"unresolvedName":"expect(mockGet).toHaveBeenCalledWith"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"symbol-name:it","kind":"calls","metadata":{"unresolvedName":"it"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"external:mockPost.mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"mockPost.mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts:createConfigFolder","kind":"calls","metadata":{"unresolvedName":"createConfigFolder"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"external:expect(result.name).toBe","kind":"calls","metadata":{"unresolvedName":"expect(result.name).toBe"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"external:expect(mockPost).toHaveBeenCalledWith","kind":"calls","metadata":{"unresolvedName":"expect(mockPost).toHaveBeenCalledWith"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"external:expect.objectContaining","kind":"calls","metadata":{"unresolvedName":"expect.objectContaining"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"external:mockPost.mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"mockPost.mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts:createConfigFolder","kind":"calls","metadata":{"unresolvedName":"createConfigFolder"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"external:expect(result.name).toBe","kind":"calls","metadata":{"unresolvedName":"expect(result.name).toBe"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"external:expect(mockPost).toHaveBeenCalledWith","kind":"calls","metadata":{"unresolvedName":"expect(mockPost).toHaveBeenCalledWith"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"external:expect.objectContaining","kind":"calls","metadata":{"unresolvedName":"expect.objectContaining"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"symbol-name:it","kind":"calls","metadata":{"unresolvedName":"it"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"external:mockPut.mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"mockPut.mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts:updateConfigFolder","kind":"calls","metadata":{"unresolvedName":"updateConfigFolder"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"external:expect(result.files).toEqual","kind":"calls","metadata":{"unresolvedName":"expect(result.files).toEqual"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"external:expect(mockPut).toHaveBeenCalledWith","kind":"calls","metadata":{"unresolvedName":"expect(mockPut).toHaveBeenCalledWith"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"external:expect.objectContaining","kind":"calls","metadata":{"unresolvedName":"expect.objectContaining"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"external:mockPut.mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"mockPut.mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts:updateConfigFolder","kind":"calls","metadata":{"unresolvedName":"updateConfigFolder"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"external:expect(result.files).toEqual","kind":"calls","metadata":{"unresolvedName":"expect(result.files).toEqual"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"external:expect(mockPut).toHaveBeenCalledWith","kind":"calls","metadata":{"unresolvedName":"expect(mockPut).toHaveBeenCalledWith"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"external:expect.objectContaining","kind":"calls","metadata":{"unresolvedName":"expect.objectContaining"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"symbol-name:it","kind":"calls","metadata":{"unresolvedName":"it"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"external:mockDelete.mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"mockDelete.mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts:deleteConfigFolder","kind":"calls","metadata":{"unresolvedName":"deleteConfigFolder"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"external:expect(mockDelete).toHaveBeenCalledWith","kind":"calls","metadata":{"unresolvedName":"expect(mockDelete).toHaveBeenCalledWith"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"external:mockDelete.mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"mockDelete.mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts:deleteConfigFolder","kind":"calls","metadata":{"unresolvedName":"deleteConfigFolder"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"external:expect(mockDelete).toHaveBeenCalledWith","kind":"calls","metadata":{"unresolvedName":"expect(mockDelete).toHaveBeenCalledWith"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.test.ts:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts","to":"file:/home/alex/projects/headquarter/apps/web/src/api/client.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts:listConfigFolders","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts:listConfigFolders","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts:listConfigFolders","to":"external:apiClient.get","kind":"calls","metadata":{"unresolvedName":"apiClient.get"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts:getConfigFolder","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts:getConfigFolder","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts:getConfigFolder","to":"external:apiClient.get","kind":"calls","metadata":{"unresolvedName":"apiClient.get"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts:createConfigFolder","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts:createConfigFolder","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts:createConfigFolder","to":"external:apiClient.post","kind":"calls","metadata":{"unresolvedName":"apiClient.post"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts:updateConfigFolder","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts:updateConfigFolder","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts:updateConfigFolder","to":"external:apiClient.put","kind":"calls","metadata":{"unresolvedName":"apiClient.put"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts:deleteConfigFolder","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts:deleteConfigFolder","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts:deleteConfigFolder","to":"external:apiClient.delete","kind":"calls","metadata":{"unresolvedName":"apiClient.delete"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts:addProjectOverride","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts:addProjectOverride","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts:addProjectOverride","to":"external:apiClient.post","kind":"calls","metadata":{"unresolvedName":"apiClient.post"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts:updateProjectOverride","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts:updateProjectOverride","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts:updateProjectOverride","to":"external:apiClient.put","kind":"calls","metadata":{"unresolvedName":"apiClient.put"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts:deleteProjectOverride","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts:deleteProjectOverride","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts:deleteProjectOverride","to":"external:apiClient.delete","kind":"calls","metadata":{"unresolvedName":"apiClient.delete"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts","to":"file:/home/alex/projects/headquarter/apps/web/src/api/client.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts:listConfigProfiles","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts:listConfigProfiles","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts:listConfigProfiles","to":"external:apiClient.get","kind":"calls","metadata":{"unresolvedName":"apiClient.get"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts:getConfigProfile","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts:getConfigProfile","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts:getConfigProfile","to":"external:apiClient.get","kind":"calls","metadata":{"unresolvedName":"apiClient.get"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts:createConfigProfile","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts:createConfigProfile","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts:createConfigProfile","to":"external:apiClient.post","kind":"calls","metadata":{"unresolvedName":"apiClient.post"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts:updateConfigProfile","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts:updateConfigProfile","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts:updateConfigProfile","to":"external:apiClient.put","kind":"calls","metadata":{"unresolvedName":"apiClient.put"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts:deleteConfigProfile","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts:deleteConfigProfile","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts:deleteConfigProfile","to":"external:apiClient.delete","kind":"calls","metadata":{"unresolvedName":"apiClient.delete"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts:updateProfileIncludes","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts:updateProfileIncludes","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts:updateProfileIncludes","to":"external:apiClient.put","kind":"calls","metadata":{"unresolvedName":"apiClient.put"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts:previewConfigProfile","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts:previewConfigProfile","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts:previewConfigProfile","to":"external:apiClient.get","kind":"calls","metadata":{"unresolvedName":"apiClient.get"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts:resolveDefaultProfile","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts:resolveDefaultProfile","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts:resolveDefaultProfile","to":"external:apiClient.get","kind":"calls","metadata":{"unresolvedName":"apiClient.get"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/dashboard.ts","to":"file:/home/alex/projects/headquarter/apps/web/src/api/client.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/dashboard.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/dashboard.ts:getDashboardSummary","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/dashboard.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/dashboard.ts:getDashboardSummary","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/dashboard.ts:getDashboardSummary","to":"external:apiClient.get","kind":"calls","metadata":{"unresolvedName":"apiClient.get"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","to":"file:/home/alex/projects/headquarter/apps/web/src/api/client.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:parseGitUrl","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:parseGitUrl","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:parseGitUrl","to":"external:apiClient.post","kind":"calls","metadata":{"unresolvedName":"apiClient.post"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:listRepositories","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:listRepositories","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:listRepositories","to":"external:apiClient.get","kind":"calls","metadata":{"unresolvedName":"apiClient.get"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:listAllUserRepositories","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:listAllUserRepositories","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:listAllUserRepositories","to":"external:apiClient.get","kind":"calls","metadata":{"unresolvedName":"apiClient.get"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:createRepository","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:createRepository","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:createRepository","to":"external:apiClient.post","kind":"calls","metadata":{"unresolvedName":"apiClient.post"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:createExternalRepository","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:createExternalRepository","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:createExternalRepository","to":"external:apiClient.post","kind":"calls","metadata":{"unresolvedName":"apiClient.post"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:deleteRepository","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:deleteRepository","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:deleteRepository","to":"external:apiClient.delete","kind":"calls","metadata":{"unresolvedName":"apiClient.delete"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:updateRepositorySshKey","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:updateRepositorySshKey","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:updateRepositorySshKey","to":"external:apiClient.patch","kind":"calls","metadata":{"unresolvedName":"apiClient.patch"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:listRepositoryBranches","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:listRepositoryBranches","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:listRepositoryBranches","to":"external:apiClient.get","kind":"calls","metadata":{"unresolvedName":"apiClient.get"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:getRepositoryHistory","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:getRepositoryHistory","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:getRepositoryHistory","to":"external:searchParams.set","kind":"calls","metadata":{"unresolvedName":"searchParams.set"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:getRepositoryHistory","to":"symbol-name:String","kind":"calls","metadata":{"unresolvedName":"String"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:getRepositoryHistory","to":"external:searchParams.toString","kind":"calls","metadata":{"unresolvedName":"searchParams.toString"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:getRepositoryHistory","to":"external:apiClient.get","kind":"calls","metadata":{"unresolvedName":"apiClient.get"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:getCommitDetail","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:getCommitDetail","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:getCommitDetail","to":"external:apiClient.get","kind":"calls","metadata":{"unresolvedName":"apiClient.get"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:getRepositoryStatus","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:getRepositoryStatus","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:getRepositoryStatus","to":"external:apiClient.get","kind":"calls","metadata":{"unresolvedName":"apiClient.get"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:createBranch","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:createBranch","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:createBranch","to":"external:apiClient.post","kind":"calls","metadata":{"unresolvedName":"apiClient.post"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:deleteBranch","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:deleteBranch","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:deleteBranch","to":"external:apiClient.delete","kind":"calls","metadata":{"unresolvedName":"apiClient.delete"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:checkoutBranch","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:checkoutBranch","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:checkoutBranch","to":"external:apiClient.post","kind":"calls","metadata":{"unresolvedName":"apiClient.post"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:commitChanges","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:commitChanges","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:commitChanges","to":"external:apiClient.post","kind":"calls","metadata":{"unresolvedName":"apiClient.post"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:fetchRepository","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:fetchRepository","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:fetchRepository","to":"external:apiClient.post","kind":"calls","metadata":{"unresolvedName":"apiClient.post"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:pullRepository","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:pullRepository","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:pullRepository","to":"external:apiClient.post","kind":"calls","metadata":{"unresolvedName":"apiClient.post"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:pushRepository","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:pushRepository","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:pushRepository","to":"external:apiClient.post","kind":"calls","metadata":{"unresolvedName":"apiClient.post"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:mergeBranches","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:mergeBranches","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:mergeBranches","to":"external:apiClient.post","kind":"calls","metadata":{"unresolvedName":"apiClient.post"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/profile.ts","to":"file:/home/alex/projects/headquarter/apps/web/src/api/client.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/profile.ts","to":"file:/home/alex/projects/headquarter/apps/web/src/types.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/profile.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/profile.ts:getProfile","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/profile.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/profile.ts:getProfile","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/profile.ts:getProfile","to":"external:apiClient.get","kind":"calls","metadata":{"unresolvedName":"apiClient.get"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/profile.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/profile.ts:updateProfile","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/profile.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/profile.ts:updateProfile","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/profile.ts:updateProfile","to":"external:apiClient.put","kind":"calls","metadata":{"unresolvedName":"apiClient.put"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/profile.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/profile.ts:uploadAvatar","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/profile.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/profile.ts:uploadAvatar","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/profile.ts:uploadAvatar","to":"external:formData.append","kind":"calls","metadata":{"unresolvedName":"formData.append"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/profile.ts:uploadAvatar","to":"external:apiClient.post","kind":"calls","metadata":{"unresolvedName":"apiClient.post"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/projects.ts","to":"file:/home/alex/projects/headquarter/apps/web/src/api/client.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/projects.ts","to":"file:/home/alex/projects/headquarter/apps/web/src/types.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/projects.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/projects.ts:listProjects","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/projects.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/projects.ts:listProjects","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/projects.ts:listProjects","to":"external:apiClient.get","kind":"calls","metadata":{"unresolvedName":"apiClient.get"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/projects.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/projects.ts:createProject","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/projects.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/projects.ts:createProject","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/projects.ts:createProject","to":"external:apiClient.post","kind":"calls","metadata":{"unresolvedName":"apiClient.post"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/projects.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/projects.ts:updateProject","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/projects.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/projects.ts:updateProject","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/projects.ts:updateProject","to":"external:apiClient.patch","kind":"calls","metadata":{"unresolvedName":"apiClient.patch"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/projects.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/projects.ts:deleteProject","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/projects.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/projects.ts:deleteProject","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/projects.ts:deleteProject","to":"external:apiClient.delete","kind":"calls","metadata":{"unresolvedName":"apiClient.delete"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/projects.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/projects.ts:setDefaultSSHKey","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/projects.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/projects.ts:setDefaultSSHKey","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/projects.ts:setDefaultSSHKey","to":"external:apiClient.patch","kind":"calls","metadata":{"unresolvedName":"apiClient.patch"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/sessions.ts","to":"external:axios","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/sessions.ts","to":"file:/home/alex/projects/headquarter/apps/web/src/api/client.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/sessions.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:listInstances","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/sessions.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:listInstances","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:listInstances","to":"external:apiClient.get","kind":"calls","metadata":{"unresolvedName":"apiClient.get"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/sessions.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:createInstance","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/sessions.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:createInstance","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:createInstance","to":"external:apiClient.post","kind":"calls","metadata":{"unresolvedName":"apiClient.post"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/sessions.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:startInstance","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/sessions.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:startInstance","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:startInstance","to":"external:apiClient.post","kind":"calls","metadata":{"unresolvedName":"apiClient.post"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:startInstance","to":"symbol-name:setTimeout","kind":"calls","metadata":{"unresolvedName":"setTimeout"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:startInstance","to":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:startInstance","kind":"calls","metadata":{"unresolvedName":"startInstance"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/sessions.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:stopInstance","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/sessions.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:stopInstance","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:stopInstance","to":"external:apiClient.post","kind":"calls","metadata":{"unresolvedName":"apiClient.post"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/sessions.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:restartInstance","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/sessions.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:restartInstance","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:restartInstance","to":"external:apiClient.post","kind":"calls","metadata":{"unresolvedName":"apiClient.post"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:restartInstance","to":"symbol-name:setTimeout","kind":"calls","metadata":{"unresolvedName":"setTimeout"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:restartInstance","to":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:restartInstance","kind":"calls","metadata":{"unresolvedName":"restartInstance"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/sessions.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:deleteInstance","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/sessions.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:deleteInstance","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:deleteInstance","to":"external:apiClient.delete","kind":"calls","metadata":{"unresolvedName":"apiClient.delete"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/sessions.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:getUserSessions","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/sessions.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:getUserSessions","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:getUserSessions","to":"external:apiClient.get","kind":"calls","metadata":{"unresolvedName":"apiClient.get"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/sessions.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:checkInstanceHealth","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/sessions.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:checkInstanceHealth","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:checkInstanceHealth","to":"external:apiClient.get","kind":"calls","metadata":{"unresolvedName":"apiClient.get"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/sessions.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:recreateInstanceTunnel","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/sessions.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:recreateInstanceTunnel","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:recreateInstanceTunnel","to":"external:apiClient.post","kind":"calls","metadata":{"unresolvedName":"apiClient.post"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/settings.ts","to":"file:/home/alex/projects/headquarter/apps/web/src/api/client.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/settings.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/settings.ts:getUserConfig","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/settings.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/settings.ts:getUserConfig","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/settings.ts:getUserConfig","to":"external:apiClient.get","kind":"calls","metadata":{"unresolvedName":"apiClient.get"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/settings.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/settings.ts:updateUserConfig","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/settings.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/settings.ts:updateUserConfig","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/settings.ts:updateUserConfig","to":"external:apiClient.patch","kind":"calls","metadata":{"unresolvedName":"apiClient.patch"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/ssh_keys.ts","to":"file:/home/alex/projects/headquarter/apps/web/src/api/client.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/ssh_keys.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/ssh_keys.ts:listSSHKeys","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/ssh_keys.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/ssh_keys.ts:listSSHKeys","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/ssh_keys.ts:listSSHKeys","to":"external:apiClient.get","kind":"calls","metadata":{"unresolvedName":"apiClient.get"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/ssh_keys.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/ssh_keys.ts:createSSHKey","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/ssh_keys.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/ssh_keys.ts:createSSHKey","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/ssh_keys.ts:createSSHKey","to":"external:apiClient.post","kind":"calls","metadata":{"unresolvedName":"apiClient.post"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/ssh_keys.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/ssh_keys.ts:deleteSSHKey","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/ssh_keys.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/ssh_keys.ts:deleteSSHKey","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/ssh_keys.ts:deleteSSHKey","to":"external:apiClient.delete","kind":"calls","metadata":{"unresolvedName":"apiClient.delete"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/ssh_keys.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/ssh_keys.ts:signPayload","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/ssh_keys.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/ssh_keys.ts:signPayload","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/ssh_keys.ts:signPayload","to":"external:apiClient.post","kind":"calls","metadata":{"unresolvedName":"apiClient.post"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/ssh_keys.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/ssh_keys.ts:verifySignature","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/ssh_keys.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/ssh_keys.ts:verifySignature","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/ssh_keys.ts:verifySignature","to":"external:apiClient.post","kind":"calls","metadata":{"unresolvedName":"apiClient.post"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_configs.ts","to":"file:/home/alex/projects/headquarter/apps/web/src/api/client.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_configs.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_configs.ts:listToolConfigs","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_configs.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_configs.ts:listToolConfigs","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_configs.ts:listToolConfigs","to":"external:params.append","kind":"calls","metadata":{"unresolvedName":"params.append"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_configs.ts:listToolConfigs","to":"external:apiClient.get","kind":"calls","metadata":{"unresolvedName":"apiClient.get"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_configs.ts:listToolConfigs","to":"external:params.toString","kind":"calls","metadata":{"unresolvedName":"params.toString"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_configs.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_configs.ts:createToolConfig","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_configs.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_configs.ts:createToolConfig","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_configs.ts:createToolConfig","to":"external:apiClient.post","kind":"calls","metadata":{"unresolvedName":"apiClient.post"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_configs.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_configs.ts:updateToolConfig","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_configs.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_configs.ts:updateToolConfig","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_configs.ts:updateToolConfig","to":"external:apiClient.put","kind":"calls","metadata":{"unresolvedName":"apiClient.put"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_configs.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_configs.ts:deleteToolConfig","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_configs.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_configs.ts:deleteToolConfig","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_configs.ts:deleteToolConfig","to":"external:apiClient.delete","kind":"calls","metadata":{"unresolvedName":"apiClient.delete"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_configs.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_configs.ts:getToolConfigDefaults","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_configs.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_configs.ts:getToolConfigDefaults","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_configs.ts:getToolConfigDefaults","to":"external:apiClient.get","kind":"calls","metadata":{"unresolvedName":"apiClient.get"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_definitions.ts","to":"file:/home/alex/projects/headquarter/apps/web/src/api/client.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_definitions.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_definitions.ts:listToolDefinitions","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_definitions.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_definitions.ts:listToolDefinitions","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_definitions.ts:listToolDefinitions","to":"external:apiClient.get","kind":"calls","metadata":{"unresolvedName":"apiClient.get"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_definitions.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_definitions.ts:getToolDefinition","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_definitions.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_definitions.ts:getToolDefinition","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_definitions.ts:getToolDefinition","to":"external:apiClient.get","kind":"calls","metadata":{"unresolvedName":"apiClient.get"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_definitions.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_definitions.ts:createToolDefinition","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_definitions.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_definitions.ts:createToolDefinition","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_definitions.ts:createToolDefinition","to":"external:apiClient.post","kind":"calls","metadata":{"unresolvedName":"apiClient.post"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_definitions.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_definitions.ts:updateToolDefinition","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_definitions.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_definitions.ts:updateToolDefinition","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_definitions.ts:updateToolDefinition","to":"external:apiClient.put","kind":"calls","metadata":{"unresolvedName":"apiClient.put"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_definitions.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_definitions.ts:deleteToolDefinition","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_definitions.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_definitions.ts:deleteToolDefinition","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_definitions.ts:deleteToolDefinition","to":"external:apiClient.delete","kind":"calls","metadata":{"unresolvedName":"apiClient.delete"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_definitions.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_definitions.ts:compileToolDefinition","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_definitions.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_definitions.ts:compileToolDefinition","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_definitions.ts:compileToolDefinition","to":"external:apiClient.post","kind":"calls","metadata":{"unresolvedName":"apiClient.post"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts","to":"external:vitest","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts","to":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"symbol-name:describe","kind":"calls","metadata":{"unresolvedName":"describe"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"symbol-name:it","kind":"calls","metadata":{"unresolvedName":"it"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"external:mockGet.mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"mockGet.mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"external:expect(result[0].definition_type).toBe","kind":"calls","metadata":{"unresolvedName":"expect(result[0].definition_type).toBe"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"external:expect(result[0].dockerfile_template).toBe","kind":"calls","metadata":{"unresolvedName":"expect(result[0].dockerfile_template).toBe"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"external:expect(result[0].readiness_probe).toEqual","kind":"calls","metadata":{"unresolvedName":"expect(result[0].readiness_probe).toEqual"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"external:expect(result[0].dockerfile_template).toBeNull","kind":"calls","metadata":{"unresolvedName":"expect(result[0].dockerfile_template).toBeNull"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"external:mockPost.mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"mockPost.mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"external:expect(result.definition_type).toBe","kind":"calls","metadata":{"unresolvedName":"expect(result.definition_type).toBe"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"external:expect(mockPost).toHaveBeenCalledWith","kind":"calls","metadata":{"unresolvedName":"expect(mockPost).toHaveBeenCalledWith"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"external:expect.objectContaining","kind":"calls","metadata":{"unresolvedName":"expect.objectContaining"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"external:expect(result.readiness_probe).toEqual","kind":"calls","metadata":{"unresolvedName":"expect(result.readiness_probe).toEqual"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"external:expect(result.valid).toBe","kind":"calls","metadata":{"unresolvedName":"expect(result.valid).toBe"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"external:expect(mockGet).toHaveBeenCalledWith","kind":"calls","metadata":{"unresolvedName":"expect(mockGet).toHaveBeenCalledWith"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"external:expect(result.errors).toContain","kind":"calls","metadata":{"unresolvedName":"expect(result.errors).toContain"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"external:mockPut.mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"mockPut.mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"external:expect(mockPut).toHaveBeenCalledWith","kind":"calls","metadata":{"unresolvedName":"expect(mockPut).toHaveBeenCalledWith"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"external:mockDelete.mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"mockDelete.mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"external:expect(mockDelete).toHaveBeenCalledWith","kind":"calls","metadata":{"unresolvedName":"expect(mockDelete).toHaveBeenCalledWith"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"symbol-name:it","kind":"calls","metadata":{"unresolvedName":"it"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"external:mockGet.mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"mockGet.mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"external:expect(result[0].definition_type).toBe","kind":"calls","metadata":{"unresolvedName":"expect(result[0].definition_type).toBe"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"external:expect(result[0].dockerfile_template).toBe","kind":"calls","metadata":{"unresolvedName":"expect(result[0].dockerfile_template).toBe"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"external:expect(result[0].readiness_probe).toEqual","kind":"calls","metadata":{"unresolvedName":"expect(result[0].readiness_probe).toEqual"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"external:expect(result[0].dockerfile_template).toBeNull","kind":"calls","metadata":{"unresolvedName":"expect(result[0].dockerfile_template).toBeNull"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"external:mockGet.mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"mockGet.mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"external:expect(result[0].definition_type).toBe","kind":"calls","metadata":{"unresolvedName":"expect(result[0].definition_type).toBe"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"external:expect(result[0].dockerfile_template).toBe","kind":"calls","metadata":{"unresolvedName":"expect(result[0].dockerfile_template).toBe"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"external:expect(result[0].readiness_probe).toEqual","kind":"calls","metadata":{"unresolvedName":"expect(result[0].readiness_probe).toEqual"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"external:mockGet.mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"mockGet.mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"external:expect(result[0].definition_type).toBe","kind":"calls","metadata":{"unresolvedName":"expect(result[0].definition_type).toBe"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"external:expect(result[0].dockerfile_template).toBeNull","kind":"calls","metadata":{"unresolvedName":"expect(result[0].dockerfile_template).toBeNull"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"symbol-name:it","kind":"calls","metadata":{"unresolvedName":"it"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"external:mockPost.mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"mockPost.mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"external:expect(result.definition_type).toBe","kind":"calls","metadata":{"unresolvedName":"expect(result.definition_type).toBe"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"external:expect(mockPost).toHaveBeenCalledWith","kind":"calls","metadata":{"unresolvedName":"expect(mockPost).toHaveBeenCalledWith"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"external:expect.objectContaining","kind":"calls","metadata":{"unresolvedName":"expect.objectContaining"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"external:expect(result.readiness_probe).toEqual","kind":"calls","metadata":{"unresolvedName":"expect(result.readiness_probe).toEqual"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"external:mockPost.mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"mockPost.mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"external:expect(result.definition_type).toBe","kind":"calls","metadata":{"unresolvedName":"expect(result.definition_type).toBe"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"external:expect(mockPost).toHaveBeenCalledWith","kind":"calls","metadata":{"unresolvedName":"expect(mockPost).toHaveBeenCalledWith"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"external:expect.objectContaining","kind":"calls","metadata":{"unresolvedName":"expect.objectContaining"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"external:mockPost.mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"mockPost.mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"external:expect(result.readiness_probe).toEqual","kind":"calls","metadata":{"unresolvedName":"expect(result.readiness_probe).toEqual"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"symbol-name:it","kind":"calls","metadata":{"unresolvedName":"it"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"external:mockGet.mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"mockGet.mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"external:expect(result.valid).toBe","kind":"calls","metadata":{"unresolvedName":"expect(result.valid).toBe"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"external:expect(mockGet).toHaveBeenCalledWith","kind":"calls","metadata":{"unresolvedName":"expect(mockGet).toHaveBeenCalledWith"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"external:expect(result.errors).toContain","kind":"calls","metadata":{"unresolvedName":"expect(result.errors).toContain"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"external:mockGet.mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"mockGet.mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"external:expect(result.valid).toBe","kind":"calls","metadata":{"unresolvedName":"expect(result.valid).toBe"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"external:expect(mockGet).toHaveBeenCalledWith","kind":"calls","metadata":{"unresolvedName":"expect(mockGet).toHaveBeenCalledWith"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"external:mockGet.mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"mockGet.mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"external:expect(result.valid).toBe","kind":"calls","metadata":{"unresolvedName":"expect(result.valid).toBe"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"external:expect(result.errors).toContain","kind":"calls","metadata":{"unresolvedName":"expect(result.errors).toContain"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"symbol-name:it","kind":"calls","metadata":{"unresolvedName":"it"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"external:mockPut.mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"mockPut.mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"external:expect(result.definition_type).toBe","kind":"calls","metadata":{"unresolvedName":"expect(result.definition_type).toBe"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"external:expect(mockPut).toHaveBeenCalledWith","kind":"calls","metadata":{"unresolvedName":"expect(mockPut).toHaveBeenCalledWith"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"external:expect.objectContaining","kind":"calls","metadata":{"unresolvedName":"expect.objectContaining"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"external:mockPut.mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"mockPut.mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"external:expect(result.definition_type).toBe","kind":"calls","metadata":{"unresolvedName":"expect(result.definition_type).toBe"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"external:expect(mockPut).toHaveBeenCalledWith","kind":"calls","metadata":{"unresolvedName":"expect(mockPut).toHaveBeenCalledWith"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"external:expect.objectContaining","kind":"calls","metadata":{"unresolvedName":"expect.objectContaining"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"symbol-name:it","kind":"calls","metadata":{"unresolvedName":"it"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"external:mockDelete.mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"mockDelete.mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"external:expect(mockDelete).toHaveBeenCalledWith","kind":"calls","metadata":{"unresolvedName":"expect(mockDelete).toHaveBeenCalledWith"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"external:mockDelete.mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"mockDelete.mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"external:expect(mockDelete).toHaveBeenCalledWith","kind":"calls","metadata":{"unresolvedName":"expect(mockDelete).toHaveBeenCalledWith"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx","to":"external:react","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx","to":"external:react-router-dom","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/api/sessions.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/api/sessions.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-theme.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/state/auth.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/state/sessions.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-mobile-viewport.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/icon.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-nav.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/utils/icons.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx:SessionItem","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx:SessionItem","kind":"defines"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx:AppShell","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx:AppShell","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx:AppShell","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-theme.ts:useTheme","kind":"calls","metadata":{"unresolvedName":"useTheme"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx:AppShell","to":"/home/alex/projects/headquarter/apps/web/src/state/auth.tsx:useAuth","kind":"calls","metadata":{"unresolvedName":"useAuth"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx:AppShell","to":"/home/alex/projects/headquarter/apps/web/src/state/sessions.tsx:useSessions","kind":"calls","metadata":{"unresolvedName":"useSessions"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx:AppShell","to":"symbol-name:useLocation","kind":"calls","metadata":{"unresolvedName":"useLocation"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx:AppShell","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-mobile-viewport.ts:useMobileViewport","kind":"calls","metadata":{"unresolvedName":"useMobileViewport"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx:AppShell","to":"external:location.pathname.includes","kind":"calls","metadata":{"unresolvedName":"location.pathname.includes"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx:AppShell","to":"symbol-name:useCallback","kind":"calls","metadata":{"unresolvedName":"useCallback"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx:AppShell","to":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:getUserSessions","kind":"calls","metadata":{"unresolvedName":"getUserSessions"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx:AppShell","to":"symbol-name:setAllSessions","kind":"calls","metadata":{"unresolvedName":"setAllSessions"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx:AppShell","to":"symbol-name:useEffect","kind":"calls","metadata":{"unresolvedName":"useEffect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx:AppShell","to":"symbol-name:loadSessions","kind":"calls","metadata":{"unresolvedName":"loadSessions"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx:AppShell","to":"symbol-name:setInterval","kind":"calls","metadata":{"unresolvedName":"setInterval"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx:AppShell","to":"symbol-name:clearInterval","kind":"calls","metadata":{"unresolvedName":"clearInterval"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx:AppShell","to":"symbol-name:logout","kind":"calls","metadata":{"unresolvedName":"logout"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx:AppShell","to":"external:NAV_ITEMS.map","kind":"calls","metadata":{"unresolvedName":"NAV_ITEMS.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx:AppShell","to":"external:sessions.filter","kind":"calls","metadata":{"unresolvedName":"sessions.filter"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx:AppShell","to":"external:sessions.map","kind":"calls","metadata":{"unresolvedName":"sessions.map"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:getUserSessions","kind":"calls","metadata":{"unresolvedName":"getUserSessions"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx:","to":"symbol-name:setAllSessions","kind":"calls","metadata":{"unresolvedName":"setAllSessions"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx:","to":"symbol-name:loadSessions","kind":"calls","metadata":{"unresolvedName":"loadSessions"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx:","to":"symbol-name:setInterval","kind":"calls","metadata":{"unresolvedName":"setInterval"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx:","to":"symbol-name:clearInterval","kind":"calls","metadata":{"unresolvedName":"clearInterval"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx:","to":"symbol-name:loadSessions","kind":"calls","metadata":{"unresolvedName":"loadSessions"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx:","to":"symbol-name:logout","kind":"calls","metadata":{"unresolvedName":"logout"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx:","to":"external:sessions.filter","kind":"calls","metadata":{"unresolvedName":"sessions.filter"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/code-editor.tsx","to":"external:react","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/code-editor.tsx","to":"external:react-simple-code-editor","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/code-editor.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/utils/language.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/code-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/code-editor.tsx:CodeEditor","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/code-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/code-editor.tsx:CodeEditor","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/code-editor.tsx:CodeEditor","to":"symbol-name:useEffect","kind":"calls","metadata":{"unresolvedName":"useEffect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/code-editor.tsx:CodeEditor","to":"/home/alex/projects/headquarter/apps/web/src/utils/language.ts:loadLanguage","kind":"calls","metadata":{"unresolvedName":"loadLanguage"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/code-editor.tsx:CodeEditor","to":"symbol-name:highlight","kind":"calls","metadata":{"unresolvedName":"highlight"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/code-editor.tsx:CodeEditor","to":"external:input\n .split(\"\\n\")\n .map","kind":"calls","metadata":{"unresolvedName":"input\n .split(\"\\n\")\n .map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/code-editor.tsx:CodeEditor","to":"external:input\n .split","kind":"calls","metadata":{"unresolvedName":"input\n .split"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/code-editor.tsx:CodeEditor","to":"/home/alex/projects/headquarter/apps/web/src/utils/language.ts:highlightCode","kind":"calls","metadata":{"unresolvedName":"highlightCode"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/code-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/code-editor.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/code-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/code-editor.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/code-editor.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/utils/language.ts:loadLanguage","kind":"calls","metadata":{"unresolvedName":"loadLanguage"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/code-editor.tsx:","to":"symbol-name:highlight","kind":"calls","metadata":{"unresolvedName":"highlight"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/code-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/code-editor.tsx:highlight","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/code-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/code-editor.tsx:highlight","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/code-editor.tsx:highlight","to":"/home/alex/projects/headquarter/apps/web/src/utils/language.ts:loadLanguage","kind":"calls","metadata":{"unresolvedName":"loadLanguage"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/commit-dialog.tsx","to":"external:react","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/commit-dialog.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/icon.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/commit-dialog.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/commit-dialog.tsx:CommitDialog","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/commit-dialog.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/commit-dialog.tsx:CommitDialog","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/commit-dialog.tsx:CommitDialog","to":"symbol-name:useState","kind":"calls","metadata":{"unresolvedName":"useState"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/commit-dialog.tsx:CommitDialog","to":"external:originalContent.split","kind":"calls","metadata":{"unresolvedName":"originalContent.split"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/commit-dialog.tsx:CommitDialog","to":"external:newContent.split","kind":"calls","metadata":{"unresolvedName":"newContent.split"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/commit-dialog.tsx:CommitDialog","to":"external:Math.max","kind":"calls","metadata":{"unresolvedName":"Math.max"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/commit-dialog.tsx:CommitDialog","to":"external:diff.push","kind":"calls","metadata":{"unresolvedName":"diff.push"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/commit-dialog.tsx:CommitDialog","to":"external:message.trim","kind":"calls","metadata":{"unresolvedName":"message.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/commit-dialog.tsx:CommitDialog","to":"symbol-name:setError","kind":"calls","metadata":{"unresolvedName":"setError"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/commit-dialog.tsx:CommitDialog","to":"symbol-name:setLoading","kind":"calls","metadata":{"unresolvedName":"setLoading"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/commit-dialog.tsx:CommitDialog","to":"symbol-name:onCommit","kind":"calls","metadata":{"unresolvedName":"onCommit"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/commit-dialog.tsx:CommitDialog","to":"/home/alex/projects/headquarter/apps/web/src/components/commit-dialog.tsx:generateDiff","kind":"calls","metadata":{"unresolvedName":"generateDiff"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/commit-dialog.tsx:CommitDialog","to":"external:diff.some","kind":"calls","metadata":{"unresolvedName":"diff.some"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/commit-dialog.tsx:CommitDialog","to":"external:diff.map","kind":"calls","metadata":{"unresolvedName":"diff.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/commit-dialog.tsx:CommitDialog","to":"symbol-name:setMessage","kind":"calls","metadata":{"unresolvedName":"setMessage"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/commit-dialog.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/commit-dialog.tsx:generateDiff","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/commit-dialog.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/commit-dialog.tsx:generateDiff","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/commit-dialog.tsx:generateDiff","to":"external:originalContent.split","kind":"calls","metadata":{"unresolvedName":"originalContent.split"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/commit-dialog.tsx:generateDiff","to":"external:newContent.split","kind":"calls","metadata":{"unresolvedName":"newContent.split"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/commit-dialog.tsx:generateDiff","to":"external:Math.max","kind":"calls","metadata":{"unresolvedName":"Math.max"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/commit-dialog.tsx:generateDiff","to":"external:diff.push","kind":"calls","metadata":{"unresolvedName":"diff.push"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/commit-dialog.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/commit-dialog.tsx:handleCommit","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/commit-dialog.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/commit-dialog.tsx:handleCommit","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/commit-dialog.tsx:handleCommit","to":"external:message.trim","kind":"calls","metadata":{"unresolvedName":"message.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/commit-dialog.tsx:handleCommit","to":"symbol-name:setError","kind":"calls","metadata":{"unresolvedName":"setError"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/commit-dialog.tsx:handleCommit","to":"symbol-name:setLoading","kind":"calls","metadata":{"unresolvedName":"setLoading"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/commit-dialog.tsx:handleCommit","to":"symbol-name:onCommit","kind":"calls","metadata":{"unresolvedName":"onCommit"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/commit-panel.tsx","to":"external:react","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/commit-panel.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/commit-panel.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/commit-panel.tsx:CommitPanel","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/commit-panel.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/commit-panel.tsx:CommitPanel","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/commit-panel.tsx:CommitPanel","to":"symbol-name:useState","kind":"calls","metadata":{"unresolvedName":"useState"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/commit-panel.tsx:CommitPanel","to":"external:message.trim","kind":"calls","metadata":{"unresolvedName":"message.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/commit-panel.tsx:CommitPanel","to":"symbol-name:setError","kind":"calls","metadata":{"unresolvedName":"setError"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/commit-panel.tsx:CommitPanel","to":"symbol-name:setLoading","kind":"calls","metadata":{"unresolvedName":"setLoading"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/commit-panel.tsx:CommitPanel","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:commitChanges","kind":"calls","metadata":{"unresolvedName":"commitChanges"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/commit-panel.tsx:CommitPanel","to":"symbol-name:setMessage","kind":"calls","metadata":{"unresolvedName":"setMessage"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/commit-panel.tsx:CommitPanel","to":"symbol-name:onCommit","kind":"calls","metadata":{"unresolvedName":"onCommit"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/commit-panel.tsx:CommitPanel","to":"external:modified.map","kind":"calls","metadata":{"unresolvedName":"modified.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/commit-panel.tsx:CommitPanel","to":"external:added.map","kind":"calls","metadata":{"unresolvedName":"added.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/commit-panel.tsx:CommitPanel","to":"external:deleted.map","kind":"calls","metadata":{"unresolvedName":"deleted.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/commit-panel.tsx:CommitPanel","to":"external:untracked.map","kind":"calls","metadata":{"unresolvedName":"untracked.map"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/commit-panel.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/commit-panel.tsx:handleCommit","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/commit-panel.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/commit-panel.tsx:handleCommit","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/commit-panel.tsx:handleCommit","to":"external:message.trim","kind":"calls","metadata":{"unresolvedName":"message.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/commit-panel.tsx:handleCommit","to":"symbol-name:setError","kind":"calls","metadata":{"unresolvedName":"setError"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/commit-panel.tsx:handleCommit","to":"symbol-name:setLoading","kind":"calls","metadata":{"unresolvedName":"setLoading"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/commit-panel.tsx:handleCommit","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:commitChanges","kind":"calls","metadata":{"unresolvedName":"commitChanges"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/commit-panel.tsx:handleCommit","to":"symbol-name:setMessage","kind":"calls","metadata":{"unresolvedName":"setMessage"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/commit-panel.tsx:handleCommit","to":"symbol-name:onCommit","kind":"calls","metadata":{"unresolvedName":"onCommit"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx","to":"external:react","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/icon.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/api/sessions.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/types.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/api/ssh_keys.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:CreateSessionForm","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:CreateSessionForm","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:CreateSessionForm","to":"symbol-name:useState","kind":"calls","metadata":{"unresolvedName":"useState"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:CreateSessionForm","to":"symbol-name:useEffect","kind":"calls","metadata":{"unresolvedName":"useEffect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:CreateSessionForm","to":"/home/alex/projects/headquarter/apps/web/src/api/ssh_keys.ts:listSSHKeys","kind":"calls","metadata":{"unresolvedName":"listSSHKeys"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:CreateSessionForm","to":"symbol-name:setSshKeys","kind":"calls","metadata":{"unresolvedName":"setSshKeys"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:CreateSessionForm","to":"symbol-name:loadKeys","kind":"calls","metadata":{"unresolvedName":"loadKeys"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:CreateSessionForm","to":"symbol-name:setConfigProfiles","kind":"calls","metadata":{"unresolvedName":"setConfigProfiles"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:CreateSessionForm","to":"symbol-name:setSelectedConfigProfile","kind":"calls","metadata":{"unresolvedName":"setSelectedConfigProfile"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:CreateSessionForm","to":"/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts:listConfigProfiles","kind":"calls","metadata":{"unresolvedName":"listConfigProfiles"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:CreateSessionForm","to":"external:profiles.find","kind":"calls","metadata":{"unresolvedName":"profiles.find"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:CreateSessionForm","to":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:loadProfiles","kind":"calls","metadata":{"unresolvedName":"loadProfiles"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:CreateSessionForm","to":"symbol-name:setBranches","kind":"calls","metadata":{"unresolvedName":"setBranches"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:CreateSessionForm","to":"symbol-name:setIsLoadingBranches","kind":"calls","metadata":{"unresolvedName":"setIsLoadingBranches"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:CreateSessionForm","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:listRepositoryBranches","kind":"calls","metadata":{"unresolvedName":"listRepositoryBranches"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:CreateSessionForm","to":"symbol-name:setBranch","kind":"calls","metadata":{"unresolvedName":"setBranch"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:CreateSessionForm","to":"symbol-name:setBaseBranch","kind":"calls","metadata":{"unresolvedName":"setBaseBranch"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:CreateSessionForm","to":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:loadBranches","kind":"calls","metadata":{"unresolvedName":"loadBranches"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:CreateSessionForm","to":"external:repositories.filter","kind":"calls","metadata":{"unresolvedName":"repositories.filter"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:CreateSessionForm","to":"external:event.preventDefault","kind":"calls","metadata":{"unresolvedName":"event.preventDefault"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:CreateSessionForm","to":"symbol-name:setError","kind":"calls","metadata":{"unresolvedName":"setError"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:CreateSessionForm","to":"external:repositories.find","kind":"calls","metadata":{"unresolvedName":"repositories.find"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:CreateSessionForm","to":"symbol-name:setStatus","kind":"calls","metadata":{"unresolvedName":"setStatus"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:CreateSessionForm","to":"symbol-name:setProgress","kind":"calls","metadata":{"unresolvedName":"setProgress"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:CreateSessionForm","to":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:createInstance","kind":"calls","metadata":{"unresolvedName":"createInstance"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:CreateSessionForm","to":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:startInstance","kind":"calls","metadata":{"unresolvedName":"startInstance"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:CreateSessionForm","to":"symbol-name:setSelectedProject","kind":"calls","metadata":{"unresolvedName":"setSelectedProject"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:CreateSessionForm","to":"symbol-name:setSelectedRepo","kind":"calls","metadata":{"unresolvedName":"setSelectedRepo"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:CreateSessionForm","to":"symbol-name:setSelectedToolType","kind":"calls","metadata":{"unresolvedName":"setSelectedToolType"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:CreateSessionForm","to":"symbol-name:setDisplayName","kind":"calls","metadata":{"unresolvedName":"setDisplayName"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:CreateSessionForm","to":"symbol-name:setCloneMode","kind":"calls","metadata":{"unresolvedName":"setCloneMode"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:CreateSessionForm","to":"symbol-name:setIsCreatingNewBranch","kind":"calls","metadata":{"unresolvedName":"setIsCreatingNewBranch"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:CreateSessionForm","to":"symbol-name:setNewBranchName","kind":"calls","metadata":{"unresolvedName":"setNewBranchName"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:CreateSessionForm","to":"symbol-name:onSuccess","kind":"calls","metadata":{"unresolvedName":"onSuccess"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:CreateSessionForm","to":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:renderStep","kind":"calls","metadata":{"unresolvedName":"renderStep"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:CreateSessionForm","to":"external:projects.find","kind":"calls","metadata":{"unresolvedName":"projects.find"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:CreateSessionForm","to":"symbol-name:onProjectChange","kind":"calls","metadata":{"unresolvedName":"onProjectChange"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:CreateSessionForm","to":"external:projects.map","kind":"calls","metadata":{"unresolvedName":"projects.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:CreateSessionForm","to":"external:availableRepos.map","kind":"calls","metadata":{"unresolvedName":"availableRepos.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:CreateSessionForm","to":"external:toolTypes.map","kind":"calls","metadata":{"unresolvedName":"toolTypes.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:CreateSessionForm","to":"external:configProfiles.map","kind":"calls","metadata":{"unresolvedName":"configProfiles.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:CreateSessionForm","to":"external:branches.map","kind":"calls","metadata":{"unresolvedName":"branches.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:CreateSessionForm","to":"external:sshKeys.find","kind":"calls","metadata":{"unresolvedName":"sshKeys.find"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/api/ssh_keys.ts:listSSHKeys","kind":"calls","metadata":{"unresolvedName":"listSSHKeys"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:","to":"symbol-name:setSshKeys","kind":"calls","metadata":{"unresolvedName":"setSshKeys"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:","to":"symbol-name:loadKeys","kind":"calls","metadata":{"unresolvedName":"loadKeys"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:loadKeys","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:loadKeys","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:loadKeys","to":"/home/alex/projects/headquarter/apps/web/src/api/ssh_keys.ts:listSSHKeys","kind":"calls","metadata":{"unresolvedName":"listSSHKeys"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:loadKeys","to":"symbol-name:setSshKeys","kind":"calls","metadata":{"unresolvedName":"setSshKeys"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:","to":"symbol-name:setConfigProfiles","kind":"calls","metadata":{"unresolvedName":"setConfigProfiles"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:","to":"symbol-name:setSelectedConfigProfile","kind":"calls","metadata":{"unresolvedName":"setSelectedConfigProfile"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts:listConfigProfiles","kind":"calls","metadata":{"unresolvedName":"listConfigProfiles"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:","to":"external:profiles.find","kind":"calls","metadata":{"unresolvedName":"profiles.find"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:loadProfiles","kind":"calls","metadata":{"unresolvedName":"loadProfiles"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:loadProfiles","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:loadProfiles","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:loadProfiles","to":"/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts:listConfigProfiles","kind":"calls","metadata":{"unresolvedName":"listConfigProfiles"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:loadProfiles","to":"symbol-name:setConfigProfiles","kind":"calls","metadata":{"unresolvedName":"setConfigProfiles"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:loadProfiles","to":"external:profiles.find","kind":"calls","metadata":{"unresolvedName":"profiles.find"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:loadProfiles","to":"symbol-name:setSelectedConfigProfile","kind":"calls","metadata":{"unresolvedName":"setSelectedConfigProfile"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:","to":"symbol-name:setBranches","kind":"calls","metadata":{"unresolvedName":"setBranches"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:","to":"symbol-name:setIsLoadingBranches","kind":"calls","metadata":{"unresolvedName":"setIsLoadingBranches"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:listRepositoryBranches","kind":"calls","metadata":{"unresolvedName":"listRepositoryBranches"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:","to":"symbol-name:setBranch","kind":"calls","metadata":{"unresolvedName":"setBranch"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:","to":"symbol-name:setBaseBranch","kind":"calls","metadata":{"unresolvedName":"setBaseBranch"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:loadBranches","kind":"calls","metadata":{"unresolvedName":"loadBranches"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:loadBranches","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:loadBranches","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:loadBranches","to":"symbol-name:setIsLoadingBranches","kind":"calls","metadata":{"unresolvedName":"setIsLoadingBranches"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:loadBranches","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:listRepositoryBranches","kind":"calls","metadata":{"unresolvedName":"listRepositoryBranches"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:loadBranches","to":"symbol-name:setBranches","kind":"calls","metadata":{"unresolvedName":"setBranches"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:loadBranches","to":"symbol-name:setBranch","kind":"calls","metadata":{"unresolvedName":"setBranch"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:loadBranches","to":"symbol-name:setBaseBranch","kind":"calls","metadata":{"unresolvedName":"setBaseBranch"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:handleSubmit","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:handleSubmit","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:handleSubmit","to":"external:event.preventDefault","kind":"calls","metadata":{"unresolvedName":"event.preventDefault"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:handleSubmit","to":"symbol-name:setError","kind":"calls","metadata":{"unresolvedName":"setError"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:handleSubmit","to":"external:repositories.find","kind":"calls","metadata":{"unresolvedName":"repositories.find"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:handleSubmit","to":"symbol-name:setStatus","kind":"calls","metadata":{"unresolvedName":"setStatus"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:handleSubmit","to":"symbol-name:setProgress","kind":"calls","metadata":{"unresolvedName":"setProgress"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:handleSubmit","to":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:createInstance","kind":"calls","metadata":{"unresolvedName":"createInstance"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:handleSubmit","to":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:startInstance","kind":"calls","metadata":{"unresolvedName":"startInstance"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:handleSubmit","to":"symbol-name:setSelectedProject","kind":"calls","metadata":{"unresolvedName":"setSelectedProject"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:handleSubmit","to":"symbol-name:setSelectedRepo","kind":"calls","metadata":{"unresolvedName":"setSelectedRepo"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:handleSubmit","to":"symbol-name:setSelectedToolType","kind":"calls","metadata":{"unresolvedName":"setSelectedToolType"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:handleSubmit","to":"symbol-name:setDisplayName","kind":"calls","metadata":{"unresolvedName":"setDisplayName"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:handleSubmit","to":"symbol-name:setCloneMode","kind":"calls","metadata":{"unresolvedName":"setCloneMode"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:handleSubmit","to":"symbol-name:setBranch","kind":"calls","metadata":{"unresolvedName":"setBranch"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:handleSubmit","to":"symbol-name:setIsCreatingNewBranch","kind":"calls","metadata":{"unresolvedName":"setIsCreatingNewBranch"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:handleSubmit","to":"symbol-name:setNewBranchName","kind":"calls","metadata":{"unresolvedName":"setNewBranchName"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:handleSubmit","to":"symbol-name:setBaseBranch","kind":"calls","metadata":{"unresolvedName":"setBaseBranch"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:handleSubmit","to":"symbol-name:setBranches","kind":"calls","metadata":{"unresolvedName":"setBranches"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:handleSubmit","to":"symbol-name:onSuccess","kind":"calls","metadata":{"unresolvedName":"onSuccess"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:renderStep","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:renderStep","kind":"defines"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:","to":"symbol-name:setSelectedProject","kind":"calls","metadata":{"unresolvedName":"setSelectedProject"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:","to":"symbol-name:setSelectedRepo","kind":"calls","metadata":{"unresolvedName":"setSelectedRepo"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:","to":"symbol-name:setSelectedToolType","kind":"calls","metadata":{"unresolvedName":"setSelectedToolType"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:","to":"symbol-name:setCloneMode","kind":"calls","metadata":{"unresolvedName":"setCloneMode"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:","to":"symbol-name:setIsCreatingNewBranch","kind":"calls","metadata":{"unresolvedName":"setIsCreatingNewBranch"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:","to":"symbol-name:onProjectChange","kind":"calls","metadata":{"unresolvedName":"onProjectChange"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:","to":"symbol-name:setSelectedRepo","kind":"calls","metadata":{"unresolvedName":"setSelectedRepo"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:","to":"symbol-name:setSelectedToolType","kind":"calls","metadata":{"unresolvedName":"setSelectedToolType"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:","to":"symbol-name:setCloneMode","kind":"calls","metadata":{"unresolvedName":"setCloneMode"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:","to":"symbol-name:setIsCreatingNewBranch","kind":"calls","metadata":{"unresolvedName":"setIsCreatingNewBranch"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:","to":"symbol-name:setSelectedToolType","kind":"calls","metadata":{"unresolvedName":"setSelectedToolType"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:","to":"symbol-name:setCloneMode","kind":"calls","metadata":{"unresolvedName":"setCloneMode"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:","to":"symbol-name:setIsCreatingNewBranch","kind":"calls","metadata":{"unresolvedName":"setIsCreatingNewBranch"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:","to":"symbol-name:setCloneMode","kind":"calls","metadata":{"unresolvedName":"setCloneMode"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:","to":"symbol-name:setIsCreatingNewBranch","kind":"calls","metadata":{"unresolvedName":"setIsCreatingNewBranch"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:","to":"symbol-name:setCloneMode","kind":"calls","metadata":{"unresolvedName":"setCloneMode"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:","to":"symbol-name:setIsCreatingNewBranch","kind":"calls","metadata":{"unresolvedName":"setIsCreatingNewBranch"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:","to":"symbol-name:setIsCreatingNewBranch","kind":"calls","metadata":{"unresolvedName":"setIsCreatingNewBranch"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:","to":"symbol-name:setNewBranchName","kind":"calls","metadata":{"unresolvedName":"setNewBranchName"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:","to":"symbol-name:setBranch","kind":"calls","metadata":{"unresolvedName":"setBranch"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:","to":"symbol-name:setBaseBranch","kind":"calls","metadata":{"unresolvedName":"setBaseBranch"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:","to":"external:repositories.find","kind":"calls","metadata":{"unresolvedName":"repositories.find"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:","to":"external:sshKeys.find","kind":"calls","metadata":{"unresolvedName":"sshKeys.find"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/data-states.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/icon.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx","to":"external:react","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx","to":"external:react-router-dom","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/api/client.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/state/auth.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/code-editor.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/commit-dialog.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/icon.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/syntax-highlighter.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/utils/language.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:FileEditor","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:FileEditor","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:FileEditor","to":"symbol-name:useSearchParams","kind":"calls","metadata":{"unresolvedName":"useSearchParams"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:FileEditor","to":"/home/alex/projects/headquarter/apps/web/src/state/auth.tsx:useAuth","kind":"calls","metadata":{"unresolvedName":"useAuth"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:FileEditor","to":"symbol-name:useState","kind":"calls","metadata":{"unresolvedName":"useState"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:FileEditor","to":"external:searchParams.get","kind":"calls","metadata":{"unresolvedName":"searchParams.get"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:FileEditor","to":"symbol-name:useCallback","kind":"calls","metadata":{"unresolvedName":"useCallback"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:FileEditor","to":"symbol-name:setContent","kind":"calls","metadata":{"unresolvedName":"setContent"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:FileEditor","to":"symbol-name:setOriginalContent","kind":"calls","metadata":{"unresolvedName":"setOriginalContent"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:FileEditor","to":"symbol-name:setLoading","kind":"calls","metadata":{"unresolvedName":"setLoading"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:FileEditor","to":"symbol-name:setError","kind":"calls","metadata":{"unresolvedName":"setError"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:FileEditor","to":"external:apiClient.get","kind":"calls","metadata":{"unresolvedName":"apiClient.get"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:FileEditor","to":"symbol-name:setIsBinary","kind":"calls","metadata":{"unresolvedName":"setIsBinary"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:FileEditor","to":"symbol-name:setLanguage","kind":"calls","metadata":{"unresolvedName":"setLanguage"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:FileEditor","to":"/home/alex/projects/headquarter/apps/web/src/utils/language.ts:detectLanguage","kind":"calls","metadata":{"unresolvedName":"detectLanguage"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:FileEditor","to":"symbol-name:useEffect","kind":"calls","metadata":{"unresolvedName":"useEffect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:FileEditor","to":"symbol-name:loadFile","kind":"calls","metadata":{"unresolvedName":"loadFile"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:FileEditor","to":"symbol-name:setMode","kind":"calls","metadata":{"unresolvedName":"setMode"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:FileEditor","to":"symbol-name:setShowCommitDialog","kind":"calls","metadata":{"unresolvedName":"setShowCommitDialog"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:FileEditor","to":"symbol-name:setSaving","kind":"calls","metadata":{"unresolvedName":"setSaving"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:FileEditor","to":"external:apiClient.post","kind":"calls","metadata":{"unresolvedName":"apiClient.post"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:FileEditor","to":"external:e.preventDefault","kind":"calls","metadata":{"unresolvedName":"e.preventDefault"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:FileEditor","to":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:handleEdit","kind":"calls","metadata":{"unresolvedName":"handleEdit"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:FileEditor","to":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:handleCancel","kind":"calls","metadata":{"unresolvedName":"handleCancel"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:FileEditor","to":"symbol-name:handleSave","kind":"calls","metadata":{"unresolvedName":"handleSave"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:FileEditor","to":"external:window.addEventListener","kind":"calls","metadata":{"unresolvedName":"window.addEventListener"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:FileEditor","to":"external:window.removeEventListener","kind":"calls","metadata":{"unresolvedName":"window.removeEventListener"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:FileEditor","to":"external:filePath.split(\"/\").map","kind":"calls","metadata":{"unresolvedName":"filePath.split(\"/\").map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:FileEditor","to":"external:filePath.split","kind":"calls","metadata":{"unresolvedName":"filePath.split"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:","to":"symbol-name:setContent","kind":"calls","metadata":{"unresolvedName":"setContent"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:","to":"symbol-name:setOriginalContent","kind":"calls","metadata":{"unresolvedName":"setOriginalContent"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:","to":"symbol-name:setLoading","kind":"calls","metadata":{"unresolvedName":"setLoading"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:","to":"symbol-name:setError","kind":"calls","metadata":{"unresolvedName":"setError"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:","to":"external:apiClient.get","kind":"calls","metadata":{"unresolvedName":"apiClient.get"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:","to":"symbol-name:setIsBinary","kind":"calls","metadata":{"unresolvedName":"setIsBinary"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:","to":"symbol-name:setLanguage","kind":"calls","metadata":{"unresolvedName":"setLanguage"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/utils/language.ts:detectLanguage","kind":"calls","metadata":{"unresolvedName":"detectLanguage"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:","to":"symbol-name:loadFile","kind":"calls","metadata":{"unresolvedName":"loadFile"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:handleEdit","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:handleEdit","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:handleEdit","to":"symbol-name:setMode","kind":"calls","metadata":{"unresolvedName":"setMode"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:handleCancel","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:handleCancel","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:handleCancel","to":"symbol-name:setContent","kind":"calls","metadata":{"unresolvedName":"setContent"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:handleCancel","to":"symbol-name:setMode","kind":"calls","metadata":{"unresolvedName":"setMode"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:handleCancel","to":"symbol-name:setShowCommitDialog","kind":"calls","metadata":{"unresolvedName":"setShowCommitDialog"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:handleSave","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:handleSave","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:handleSave","to":"symbol-name:setMode","kind":"calls","metadata":{"unresolvedName":"setMode"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:handleSave","to":"symbol-name:setShowCommitDialog","kind":"calls","metadata":{"unresolvedName":"setShowCommitDialog"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:handleCommit","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:handleCommit","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:handleCommit","to":"symbol-name:setSaving","kind":"calls","metadata":{"unresolvedName":"setSaving"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:handleCommit","to":"external:apiClient.post","kind":"calls","metadata":{"unresolvedName":"apiClient.post"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:handleCommit","to":"symbol-name:setOriginalContent","kind":"calls","metadata":{"unresolvedName":"setOriginalContent"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:handleCommit","to":"symbol-name:setMode","kind":"calls","metadata":{"unresolvedName":"setMode"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:handleCommit","to":"symbol-name:setShowCommitDialog","kind":"calls","metadata":{"unresolvedName":"setShowCommitDialog"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:handleCommit","to":"symbol-name:setError","kind":"calls","metadata":{"unresolvedName":"setError"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:","to":"external:e.preventDefault","kind":"calls","metadata":{"unresolvedName":"e.preventDefault"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:handleEdit","kind":"calls","metadata":{"unresolvedName":"handleEdit"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:handleCancel","kind":"calls","metadata":{"unresolvedName":"handleCancel"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:","to":"symbol-name:handleSave","kind":"calls","metadata":{"unresolvedName":"handleSave"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:","to":"external:window.addEventListener","kind":"calls","metadata":{"unresolvedName":"window.addEventListener"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:","to":"external:window.removeEventListener","kind":"calls","metadata":{"unresolvedName":"window.removeEventListener"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:handleKeyDown","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:handleKeyDown","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:handleKeyDown","to":"external:e.preventDefault","kind":"calls","metadata":{"unresolvedName":"e.preventDefault"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:handleKeyDown","to":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:handleEdit","kind":"calls","metadata":{"unresolvedName":"handleEdit"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:handleKeyDown","to":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:handleCancel","kind":"calls","metadata":{"unresolvedName":"handleCancel"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx:handleKeyDown","to":"symbol-name:handleSave","kind":"calls","metadata":{"unresolvedName":"handleSave"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx","to":"external:react","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/icon.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:GitMountEditor","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:GitMountEditor","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:GitMountEditor","to":"symbol-name:useState","kind":"calls","metadata":{"unresolvedName":"useState"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:GitMountEditor","to":"symbol-name:onChange","kind":"calls","metadata":{"unresolvedName":"onChange"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:GitMountEditor","to":"symbol-name:setNewMount","kind":"calls","metadata":{"unresolvedName":"setNewMount"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:GitMountEditor","to":"symbol-name:setEditingIndex","kind":"calls","metadata":{"unresolvedName":"setEditingIndex"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:GitMountEditor","to":"external:mounts.filter","kind":"calls","metadata":{"unresolvedName":"mounts.filter"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:GitMountEditor","to":"external:path.includes","kind":"calls","metadata":{"unresolvedName":"path.includes"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:GitMountEditor","to":"external:path.startsWith","kind":"calls","metadata":{"unresolvedName":"path.startsWith"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:GitMountEditor","to":"external:url.startsWith","kind":"calls","metadata":{"unresolvedName":"url.startsWith"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:GitMountEditor","to":"external:mounts.map","kind":"calls","metadata":{"unresolvedName":"mounts.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:GitMountEditor","to":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:handleUpdate","kind":"calls","metadata":{"unresolvedName":"handleUpdate"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:GitMountEditor","to":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:handleRemove","kind":"calls","metadata":{"unresolvedName":"handleRemove"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:handleAdd","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:handleAdd","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:handleAdd","to":"symbol-name:onChange","kind":"calls","metadata":{"unresolvedName":"onChange"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:handleAdd","to":"symbol-name:setNewMount","kind":"calls","metadata":{"unresolvedName":"setNewMount"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:handleUpdate","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:handleUpdate","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:handleUpdate","to":"symbol-name:onChange","kind":"calls","metadata":{"unresolvedName":"onChange"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:handleUpdate","to":"symbol-name:setEditingIndex","kind":"calls","metadata":{"unresolvedName":"setEditingIndex"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:handleRemove","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:handleRemove","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:handleRemove","to":"symbol-name:onChange","kind":"calls","metadata":{"unresolvedName":"onChange"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:handleRemove","to":"external:mounts.filter","kind":"calls","metadata":{"unresolvedName":"mounts.filter"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:validatePath","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:validatePath","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:validatePath","to":"external:path.includes","kind":"calls","metadata":{"unresolvedName":"path.includes"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:validatePath","to":"external:path.startsWith","kind":"calls","metadata":{"unresolvedName":"path.startsWith"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:validateUrl","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:validateUrl","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:validateUrl","to":"external:url.startsWith","kind":"calls","metadata":{"unresolvedName":"url.startsWith"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:GitMountForm","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:GitMountForm","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:GitMountForm","to":"symbol-name:useState","kind":"calls","metadata":{"unresolvedName":"useState"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:GitMountForm","to":"symbol-name:setForm","kind":"calls","metadata":{"unresolvedName":"setForm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:GitMountForm","to":"symbol-name:setErrors","kind":"calls","metadata":{"unresolvedName":"setErrors"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:GitMountForm","to":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:validateUrl","kind":"calls","metadata":{"unresolvedName":"validateUrl"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:GitMountForm","to":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:validatePath","kind":"calls","metadata":{"unresolvedName":"validatePath"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:GitMountForm","to":"external:Object.keys","kind":"calls","metadata":{"unresolvedName":"Object.keys"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:GitMountForm","to":"symbol-name:onSave","kind":"calls","metadata":{"unresolvedName":"onSave"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:GitMountForm","to":"symbol-name:handleChange","kind":"calls","metadata":{"unresolvedName":"handleChange"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:handleChange","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:handleChange","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:handleChange","to":"symbol-name:setForm","kind":"calls","metadata":{"unresolvedName":"setForm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:handleChange","to":"symbol-name:setErrors","kind":"calls","metadata":{"unresolvedName":"setErrors"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:","kind":"defines"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:handleSubmit","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:handleSubmit","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:handleSubmit","to":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:validateUrl","kind":"calls","metadata":{"unresolvedName":"validateUrl"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:handleSubmit","to":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:validatePath","kind":"calls","metadata":{"unresolvedName":"validatePath"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:handleSubmit","to":"external:Object.keys","kind":"calls","metadata":{"unresolvedName":"Object.keys"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:handleSubmit","to":"symbol-name:setErrors","kind":"calls","metadata":{"unresolvedName":"setErrors"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:handleSubmit","to":"symbol-name:onSave","kind":"calls","metadata":{"unresolvedName":"onSave"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx:handleSubmit","to":"symbol-name:setForm","kind":"calls","metadata":{"unresolvedName":"setForm"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx","to":"external:react","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/icon.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/merge-dialog.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:GitToolbar","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:GitToolbar","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:GitToolbar","to":"symbol-name:useState","kind":"calls","metadata":{"unresolvedName":"useState"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:GitToolbar","to":"symbol-name:useCallback","kind":"calls","metadata":{"unresolvedName":"useCallback"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:GitToolbar","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:getRepositoryStatus","kind":"calls","metadata":{"unresolvedName":"getRepositoryStatus"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:GitToolbar","to":"symbol-name:setStatus","kind":"calls","metadata":{"unresolvedName":"setStatus"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:GitToolbar","to":"symbol-name:setError","kind":"calls","metadata":{"unresolvedName":"setError"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:GitToolbar","to":"symbol-name:useEffect","kind":"calls","metadata":{"unresolvedName":"useEffect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:GitToolbar","to":"symbol-name:loadStatus","kind":"calls","metadata":{"unresolvedName":"loadStatus"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:GitToolbar","to":"symbol-name:setInterval","kind":"calls","metadata":{"unresolvedName":"setInterval"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:GitToolbar","to":"symbol-name:clearInterval","kind":"calls","metadata":{"unresolvedName":"clearInterval"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:GitToolbar","to":"symbol-name:setLoading","kind":"calls","metadata":{"unresolvedName":"setLoading"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:GitToolbar","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:fetchRepository","kind":"calls","metadata":{"unresolvedName":"fetchRepository"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:GitToolbar","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:pullRepository","kind":"calls","metadata":{"unresolvedName":"pullRepository"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:GitToolbar","to":"symbol-name:onRefresh","kind":"calls","metadata":{"unresolvedName":"onRefresh"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:GitToolbar","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:pushRepository","kind":"calls","metadata":{"unresolvedName":"pushRepository"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:GitToolbar","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:checkoutBranch","kind":"calls","metadata":{"unresolvedName":"checkoutBranch"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:GitToolbar","to":"symbol-name:onBranchChange","kind":"calls","metadata":{"unresolvedName":"onBranchChange"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:GitToolbar","to":"external:newBranchName.trim","kind":"calls","metadata":{"unresolvedName":"newBranchName.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:GitToolbar","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:createBranch","kind":"calls","metadata":{"unresolvedName":"createBranch"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:GitToolbar","to":"symbol-name:setShowNewBranch","kind":"calls","metadata":{"unresolvedName":"setShowNewBranch"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:GitToolbar","to":"symbol-name:setNewBranchName","kind":"calls","metadata":{"unresolvedName":"setNewBranchName"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:GitToolbar","to":"symbol-name:setNewBranchBase","kind":"calls","metadata":{"unresolvedName":"setNewBranchBase"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:GitToolbar","to":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:handleCheckout","kind":"calls","metadata":{"unresolvedName":"handleCheckout"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:GitToolbar","to":"external:branches.map","kind":"calls","metadata":{"unresolvedName":"branches.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:GitToolbar","to":"symbol-name:setShowMergeDialog","kind":"calls","metadata":{"unresolvedName":"setShowMergeDialog"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:getRepositoryStatus","kind":"calls","metadata":{"unresolvedName":"getRepositoryStatus"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:","to":"symbol-name:setStatus","kind":"calls","metadata":{"unresolvedName":"setStatus"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:","to":"symbol-name:setError","kind":"calls","metadata":{"unresolvedName":"setError"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:","to":"symbol-name:loadStatus","kind":"calls","metadata":{"unresolvedName":"loadStatus"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:","to":"symbol-name:setInterval","kind":"calls","metadata":{"unresolvedName":"setInterval"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:","to":"symbol-name:clearInterval","kind":"calls","metadata":{"unresolvedName":"clearInterval"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:handleFetch","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:handleFetch","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:handleFetch","to":"symbol-name:setLoading","kind":"calls","metadata":{"unresolvedName":"setLoading"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:handleFetch","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:fetchRepository","kind":"calls","metadata":{"unresolvedName":"fetchRepository"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:handleFetch","to":"symbol-name:loadStatus","kind":"calls","metadata":{"unresolvedName":"loadStatus"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:handleFetch","to":"symbol-name:setError","kind":"calls","metadata":{"unresolvedName":"setError"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:handlePull","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:handlePull","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:handlePull","to":"symbol-name:setLoading","kind":"calls","metadata":{"unresolvedName":"setLoading"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:handlePull","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:pullRepository","kind":"calls","metadata":{"unresolvedName":"pullRepository"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:handlePull","to":"symbol-name:loadStatus","kind":"calls","metadata":{"unresolvedName":"loadStatus"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:handlePull","to":"symbol-name:onRefresh","kind":"calls","metadata":{"unresolvedName":"onRefresh"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:handlePull","to":"symbol-name:setError","kind":"calls","metadata":{"unresolvedName":"setError"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:handlePush","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:handlePush","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:handlePush","to":"symbol-name:setLoading","kind":"calls","metadata":{"unresolvedName":"setLoading"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:handlePush","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:pushRepository","kind":"calls","metadata":{"unresolvedName":"pushRepository"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:handlePush","to":"symbol-name:loadStatus","kind":"calls","metadata":{"unresolvedName":"loadStatus"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:handlePush","to":"symbol-name:setError","kind":"calls","metadata":{"unresolvedName":"setError"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:handleCheckout","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:handleCheckout","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:handleCheckout","to":"symbol-name:setLoading","kind":"calls","metadata":{"unresolvedName":"setLoading"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:handleCheckout","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:checkoutBranch","kind":"calls","metadata":{"unresolvedName":"checkoutBranch"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:handleCheckout","to":"symbol-name:onBranchChange","kind":"calls","metadata":{"unresolvedName":"onBranchChange"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:handleCheckout","to":"symbol-name:onRefresh","kind":"calls","metadata":{"unresolvedName":"onRefresh"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:handleCheckout","to":"symbol-name:setError","kind":"calls","metadata":{"unresolvedName":"setError"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:handleCreateBranch","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:handleCreateBranch","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:handleCreateBranch","to":"external:newBranchName.trim","kind":"calls","metadata":{"unresolvedName":"newBranchName.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:handleCreateBranch","to":"symbol-name:setLoading","kind":"calls","metadata":{"unresolvedName":"setLoading"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:handleCreateBranch","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:createBranch","kind":"calls","metadata":{"unresolvedName":"createBranch"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:handleCreateBranch","to":"symbol-name:setShowNewBranch","kind":"calls","metadata":{"unresolvedName":"setShowNewBranch"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:handleCreateBranch","to":"symbol-name:setNewBranchName","kind":"calls","metadata":{"unresolvedName":"setNewBranchName"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:handleCreateBranch","to":"symbol-name:setNewBranchBase","kind":"calls","metadata":{"unresolvedName":"setNewBranchBase"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:handleCreateBranch","to":"symbol-name:onRefresh","kind":"calls","metadata":{"unresolvedName":"onRefresh"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:handleCreateBranch","to":"symbol-name:setError","kind":"calls","metadata":{"unresolvedName":"setError"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:","to":"symbol-name:loadStatus","kind":"calls","metadata":{"unresolvedName":"loadStatus"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx:","to":"symbol-name:onRefresh","kind":"calls","metadata":{"unresolvedName":"onRefresh"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/icon.tsx","to":"external:react","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/icon.tsx","to":"external:@phosphor-icons/react","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/icon.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/icon.tsx:Icon","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/icon.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/icon.tsx:Icon","kind":"defines"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx","to":"external:react","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx","to":"external:react-router-dom","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/icon.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/api/sessions.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/api/sessions.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:InstanceList","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:InstanceList","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:InstanceList","to":"symbol-name:useNavigate","kind":"calls","metadata":{"unresolvedName":"useNavigate"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:InstanceList","to":"symbol-name:useState","kind":"calls","metadata":{"unresolvedName":"useState"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:InstanceList","to":"symbol-name:useCallback","kind":"calls","metadata":{"unresolvedName":"useCallback"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:InstanceList","to":"symbol-name:setLoading","kind":"calls","metadata":{"unresolvedName":"setLoading"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:InstanceList","to":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:listInstances","kind":"calls","metadata":{"unresolvedName":"listInstances"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:InstanceList","to":"symbol-name:setInstances","kind":"calls","metadata":{"unresolvedName":"setInstances"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:InstanceList","to":"symbol-name:setError","kind":"calls","metadata":{"unresolvedName":"setError"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:InstanceList","to":"symbol-name:useEffect","kind":"calls","metadata":{"unresolvedName":"useEffect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:InstanceList","to":"symbol-name:loadInstances","kind":"calls","metadata":{"unresolvedName":"loadInstances"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:InstanceList","to":"external:instances.filter","kind":"calls","metadata":{"unresolvedName":"instances.filter"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:InstanceList","to":"external:i.url?.startsWith","kind":"calls","metadata":{"unresolvedName":"i.url?.startsWith"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:InstanceList","to":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:checkInstanceHealth","kind":"calls","metadata":{"unresolvedName":"checkInstanceHealth"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:InstanceList","to":"symbol-name:setHealthStatus","kind":"calls","metadata":{"unresolvedName":"setHealthStatus"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:InstanceList","to":"external:Date.now","kind":"calls","metadata":{"unresolvedName":"Date.now"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:InstanceList","to":"symbol-name:checkHealth","kind":"calls","metadata":{"unresolvedName":"checkHealth"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:InstanceList","to":"symbol-name:setInterval","kind":"calls","metadata":{"unresolvedName":"setInterval"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:InstanceList","to":"symbol-name:clearInterval","kind":"calls","metadata":{"unresolvedName":"clearInterval"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:InstanceList","to":"symbol-name:setShowCreate","kind":"calls","metadata":{"unresolvedName":"setShowCreate"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:InstanceList","to":"/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts:listConfigProfiles","kind":"calls","metadata":{"unresolvedName":"listConfigProfiles"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:InstanceList","to":"symbol-name:setConfigProfiles","kind":"calls","metadata":{"unresolvedName":"setConfigProfiles"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:InstanceList","to":"symbol-name:setBusyInstanceId","kind":"calls","metadata":{"unresolvedName":"setBusyInstanceId"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:InstanceList","to":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:startInstance","kind":"calls","metadata":{"unresolvedName":"startInstance"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:InstanceList","to":"symbol-name:setProfileSelectInstanceId","kind":"calls","metadata":{"unresolvedName":"setProfileSelectInstanceId"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:InstanceList","to":"symbol-name:setSelectedProfileForAction","kind":"calls","metadata":{"unresolvedName":"setSelectedProfileForAction"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:InstanceList","to":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:stopInstance","kind":"calls","metadata":{"unresolvedName":"stopInstance"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:InstanceList","to":"symbol-name:setStopConfirmId","kind":"calls","metadata":{"unresolvedName":"setStopConfirmId"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:InstanceList","to":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:restartInstance","kind":"calls","metadata":{"unresolvedName":"restartInstance"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:InstanceList","to":"symbol-name:confirm","kind":"calls","metadata":{"unresolvedName":"confirm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:InstanceList","to":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:deleteInstance","kind":"calls","metadata":{"unresolvedName":"deleteInstance"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:InstanceList","to":"external:prev.filter","kind":"calls","metadata":{"unresolvedName":"prev.filter"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:InstanceList","to":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:recreateInstanceTunnel","kind":"calls","metadata":{"unresolvedName":"recreateInstanceTunnel"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:InstanceList","to":"external:instance.url?.startsWith","kind":"calls","metadata":{"unresolvedName":"instance.url?.startsWith"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:InstanceList","to":"external:instances.map","kind":"calls","metadata":{"unresolvedName":"instances.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:InstanceList","to":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:getStatusColor","kind":"calls","metadata":{"unresolvedName":"getStatusColor"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:InstanceList","to":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:isTunnelUnhealthy","kind":"calls","metadata":{"unresolvedName":"isTunnelUnhealthy"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:InstanceList","to":"external:configProfiles.find","kind":"calls","metadata":{"unresolvedName":"configProfiles.find"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:InstanceList","to":"external:instance.tool_type_interfaces.includes","kind":"calls","metadata":{"unresolvedName":"instance.tool_type_interfaces.includes"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:InstanceList","to":"external:instance.url.startsWith","kind":"calls","metadata":{"unresolvedName":"instance.url.startsWith"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:InstanceList","to":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:handleRecreateTunnel","kind":"calls","metadata":{"unresolvedName":"handleRecreateTunnel"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:InstanceList","to":"symbol-name:navigate","kind":"calls","metadata":{"unresolvedName":"navigate"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:InstanceList","to":"external:configProfiles.map","kind":"calls","metadata":{"unresolvedName":"configProfiles.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:InstanceList","to":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:handleStart","kind":"calls","metadata":{"unresolvedName":"handleStart"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:InstanceList","to":"external:toolTypes.find","kind":"calls","metadata":{"unresolvedName":"toolTypes.find"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:InstanceList","to":"symbol-name:loadConfigProfiles","kind":"calls","metadata":{"unresolvedName":"loadConfigProfiles"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:InstanceList","to":"symbol-name:handleStop","kind":"calls","metadata":{"unresolvedName":"handleStop"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:InstanceList","to":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:handleRestart","kind":"calls","metadata":{"unresolvedName":"handleRestart"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:InstanceList","to":"symbol-name:handleDelete","kind":"calls","metadata":{"unresolvedName":"handleDelete"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:","to":"symbol-name:setLoading","kind":"calls","metadata":{"unresolvedName":"setLoading"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:listInstances","kind":"calls","metadata":{"unresolvedName":"listInstances"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:","to":"symbol-name:setInstances","kind":"calls","metadata":{"unresolvedName":"setInstances"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:","to":"symbol-name:setError","kind":"calls","metadata":{"unresolvedName":"setError"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:","to":"symbol-name:loadInstances","kind":"calls","metadata":{"unresolvedName":"loadInstances"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:","to":"external:instances.filter","kind":"calls","metadata":{"unresolvedName":"instances.filter"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:","to":"external:i.url?.startsWith","kind":"calls","metadata":{"unresolvedName":"i.url?.startsWith"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:checkInstanceHealth","kind":"calls","metadata":{"unresolvedName":"checkInstanceHealth"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:","to":"symbol-name:setHealthStatus","kind":"calls","metadata":{"unresolvedName":"setHealthStatus"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:","to":"external:Date.now","kind":"calls","metadata":{"unresolvedName":"Date.now"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:","to":"symbol-name:checkHealth","kind":"calls","metadata":{"unresolvedName":"checkHealth"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:","to":"symbol-name:setInterval","kind":"calls","metadata":{"unresolvedName":"setInterval"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:","to":"symbol-name:clearInterval","kind":"calls","metadata":{"unresolvedName":"clearInterval"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:checkHealth","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:checkHealth","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:checkHealth","to":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:checkInstanceHealth","kind":"calls","metadata":{"unresolvedName":"checkInstanceHealth"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:checkHealth","to":"symbol-name:setHealthStatus","kind":"calls","metadata":{"unresolvedName":"setHealthStatus"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:checkHealth","to":"external:Date.now","kind":"calls","metadata":{"unresolvedName":"Date.now"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:handleCreateSuccess","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:handleCreateSuccess","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:handleCreateSuccess","to":"symbol-name:setShowCreate","kind":"calls","metadata":{"unresolvedName":"setShowCreate"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:handleCreateSuccess","to":"symbol-name:loadInstances","kind":"calls","metadata":{"unresolvedName":"loadInstances"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts:listConfigProfiles","kind":"calls","metadata":{"unresolvedName":"listConfigProfiles"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:","to":"symbol-name:setConfigProfiles","kind":"calls","metadata":{"unresolvedName":"setConfigProfiles"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:handleStart","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:handleStart","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:handleStart","to":"symbol-name:setBusyInstanceId","kind":"calls","metadata":{"unresolvedName":"setBusyInstanceId"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:handleStart","to":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:startInstance","kind":"calls","metadata":{"unresolvedName":"startInstance"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:handleStart","to":"symbol-name:setProfileSelectInstanceId","kind":"calls","metadata":{"unresolvedName":"setProfileSelectInstanceId"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:handleStart","to":"symbol-name:setSelectedProfileForAction","kind":"calls","metadata":{"unresolvedName":"setSelectedProfileForAction"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:handleStart","to":"symbol-name:loadInstances","kind":"calls","metadata":{"unresolvedName":"loadInstances"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:handleStart","to":"symbol-name:setError","kind":"calls","metadata":{"unresolvedName":"setError"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:handleStop","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:handleStop","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:handleStop","to":"symbol-name:setBusyInstanceId","kind":"calls","metadata":{"unresolvedName":"setBusyInstanceId"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:handleStop","to":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:stopInstance","kind":"calls","metadata":{"unresolvedName":"stopInstance"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:handleStop","to":"symbol-name:setStopConfirmId","kind":"calls","metadata":{"unresolvedName":"setStopConfirmId"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:handleStop","to":"symbol-name:loadInstances","kind":"calls","metadata":{"unresolvedName":"loadInstances"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:handleStop","to":"symbol-name:setError","kind":"calls","metadata":{"unresolvedName":"setError"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:handleRestart","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:handleRestart","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:handleRestart","to":"symbol-name:setBusyInstanceId","kind":"calls","metadata":{"unresolvedName":"setBusyInstanceId"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:handleRestart","to":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:restartInstance","kind":"calls","metadata":{"unresolvedName":"restartInstance"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:handleRestart","to":"symbol-name:setProfileSelectInstanceId","kind":"calls","metadata":{"unresolvedName":"setProfileSelectInstanceId"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:handleRestart","to":"symbol-name:setSelectedProfileForAction","kind":"calls","metadata":{"unresolvedName":"setSelectedProfileForAction"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:handleRestart","to":"symbol-name:loadInstances","kind":"calls","metadata":{"unresolvedName":"loadInstances"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:handleRestart","to":"symbol-name:setError","kind":"calls","metadata":{"unresolvedName":"setError"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:handleDelete","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:handleDelete","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:handleDelete","to":"symbol-name:confirm","kind":"calls","metadata":{"unresolvedName":"confirm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:handleDelete","to":"symbol-name:setBusyInstanceId","kind":"calls","metadata":{"unresolvedName":"setBusyInstanceId"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:handleDelete","to":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:deleteInstance","kind":"calls","metadata":{"unresolvedName":"deleteInstance"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:handleDelete","to":"symbol-name:setInstances","kind":"calls","metadata":{"unresolvedName":"setInstances"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:handleDelete","to":"external:prev.filter","kind":"calls","metadata":{"unresolvedName":"prev.filter"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:handleDelete","to":"symbol-name:setError","kind":"calls","metadata":{"unresolvedName":"setError"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:handleRecreateTunnel","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:handleRecreateTunnel","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:handleRecreateTunnel","to":"symbol-name:setBusyInstanceId","kind":"calls","metadata":{"unresolvedName":"setBusyInstanceId"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:handleRecreateTunnel","to":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:recreateInstanceTunnel","kind":"calls","metadata":{"unresolvedName":"recreateInstanceTunnel"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:handleRecreateTunnel","to":"symbol-name:loadInstances","kind":"calls","metadata":{"unresolvedName":"loadInstances"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:handleRecreateTunnel","to":"symbol-name:setError","kind":"calls","metadata":{"unresolvedName":"setError"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:getStatusColor","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:getStatusColor","kind":"defines"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:isTunnelUnhealthy","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:isTunnelUnhealthy","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:isTunnelUnhealthy","to":"external:instance.url?.startsWith","kind":"calls","metadata":{"unresolvedName":"instance.url?.startsWith"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:","to":"symbol-name:setProfileSelectInstanceId","kind":"calls","metadata":{"unresolvedName":"setProfileSelectInstanceId"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:","to":"symbol-name:setSelectedProfileForAction","kind":"calls","metadata":{"unresolvedName":"setSelectedProfileForAction"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:","to":"external:toolTypes.find","kind":"calls","metadata":{"unresolvedName":"toolTypes.find"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:","to":"symbol-name:loadConfigProfiles","kind":"calls","metadata":{"unresolvedName":"loadConfigProfiles"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:","to":"symbol-name:setProfileSelectInstanceId","kind":"calls","metadata":{"unresolvedName":"setProfileSelectInstanceId"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:","to":"symbol-name:setSelectedProfileForAction","kind":"calls","metadata":{"unresolvedName":"setSelectedProfileForAction"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:","to":"symbol-name:setProfileSelectInstanceId","kind":"calls","metadata":{"unresolvedName":"setProfileSelectInstanceId"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:","to":"symbol-name:setSelectedProfileForAction","kind":"calls","metadata":{"unresolvedName":"setSelectedProfileForAction"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:","to":"external:toolTypes.find","kind":"calls","metadata":{"unresolvedName":"toolTypes.find"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:","to":"symbol-name:loadConfigProfiles","kind":"calls","metadata":{"unresolvedName":"loadConfigProfiles"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:","to":"symbol-name:setProfileSelectInstanceId","kind":"calls","metadata":{"unresolvedName":"setProfileSelectInstanceId"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx:","to":"symbol-name:setSelectedProfileForAction","kind":"calls","metadata":{"unresolvedName":"setSelectedProfileForAction"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx","to":"external:react","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/icon.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/utils/errors.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_definitions.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"symbol-name:useState","kind":"calls","metadata":{"unresolvedName":"useState"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"symbol-name:useEffect","kind":"calls","metadata":{"unresolvedName":"useEffect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"symbol-name:setBaseImage","kind":"calls","metadata":{"unresolvedName":"setBaseImage"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"symbol-name:setBaseDefinitionId","kind":"calls","metadata":{"unresolvedName":"setBaseDefinitionId"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"symbol-name:setAptPackages","kind":"calls","metadata":{"unresolvedName":"setAptPackages"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"external:((pkgs.apt as string[]) || []).map","kind":"calls","metadata":{"unresolvedName":"((pkgs.apt as string[]) || []).map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"symbol-name:setNpmPackages","kind":"calls","metadata":{"unresolvedName":"setNpmPackages"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"external:((pkgs.npm_global as string[]) || []).map","kind":"calls","metadata":{"unresolvedName":"((pkgs.npm_global as string[]) || []).map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"symbol-name:setPipPackages","kind":"calls","metadata":{"unresolvedName":"setPipPackages"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"external:((pkgs.pip as string[]) || []).map","kind":"calls","metadata":{"unresolvedName":"((pkgs.pip as string[]) || []).map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"symbol-name:setNodeVersion","kind":"calls","metadata":{"unresolvedName":"setNodeVersion"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"symbol-name:setUserName","kind":"calls","metadata":{"unresolvedName":"setUserName"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"symbol-name:setUserUid","kind":"calls","metadata":{"unresolvedName":"setUserUid"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"symbol-name:String","kind":"calls","metadata":{"unresolvedName":"String"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"symbol-name:setUserGid","kind":"calls","metadata":{"unresolvedName":"setUserGid"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"symbol-name:setEnvVars","kind":"calls","metadata":{"unresolvedName":"setEnvVars"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"external:Object.entries(env).map","kind":"calls","metadata":{"unresolvedName":"Object.entries(env).map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"external:Object.entries","kind":"calls","metadata":{"unresolvedName":"Object.entries"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"symbol-name:setBuildScripts","kind":"calls","metadata":{"unresolvedName":"setBuildScripts"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"symbol-name:setStartupScripts","kind":"calls","metadata":{"unresolvedName":"setStartupScripts"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"symbol-name:setMounts","kind":"calls","metadata":{"unresolvedName":"setMounts"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"symbol-name:setCommand","kind":"calls","metadata":{"unresolvedName":"setCommand"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"symbol-name:setWorkingDir","kind":"calls","metadata":{"unresolvedName":"setWorkingDir"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"symbol-name:setStdinOpen","kind":"calls","metadata":{"unresolvedName":"setStdinOpen"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"symbol-name:setTty","kind":"calls","metadata":{"unresolvedName":"setTty"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"symbol-name:useCallback","kind":"calls","metadata":{"unresolvedName":"useCallback"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"external:aptPackages.map((p) => p.name).filter","kind":"calls","metadata":{"unresolvedName":"aptPackages.map((p) => p.name).filter"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"external:aptPackages.map","kind":"calls","metadata":{"unresolvedName":"aptPackages.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"external:npmPackages.map((p) => p.name).filter","kind":"calls","metadata":{"unresolvedName":"npmPackages.map((p) => p.name).filter"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"external:npmPackages.map","kind":"calls","metadata":{"unresolvedName":"npmPackages.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"external:pipPackages.map((p) => p.name).filter","kind":"calls","metadata":{"unresolvedName":"pipPackages.map((p) => p.name).filter"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"external:pipPackages.map","kind":"calls","metadata":{"unresolvedName":"pipPackages.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"external:envVars.forEach","kind":"calls","metadata":{"unresolvedName":"envVars.forEach"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"external:buildScripts.filter","kind":"calls","metadata":{"unresolvedName":"buildScripts.filter"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"external:startupScripts.filter","kind":"calls","metadata":{"unresolvedName":"startupScripts.filter"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"external:mounts.filter","kind":"calls","metadata":{"unresolvedName":"mounts.filter"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"symbol-name:parseInt","kind":"calls","metadata":{"unresolvedName":"parseInt"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"external:command.filter","kind":"calls","metadata":{"unresolvedName":"command.filter"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"symbol-name:buildManifest","kind":"calls","metadata":{"unresolvedName":"buildManifest"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"symbol-name:onChange","kind":"calls","metadata":{"unresolvedName":"onChange"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"symbol-name:setPreviewError","kind":"calls","metadata":{"unresolvedName":"setPreviewError"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"symbol-name:setPreviewLoading","kind":"calls","metadata":{"unresolvedName":"setPreviewLoading"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_definitions.ts:compileToolDefinition","kind":"calls","metadata":{"unresolvedName":"compileToolDefinition"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"symbol-name:setPreview","kind":"calls","metadata":{"unresolvedName":"setPreview"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"/home/alex/projects/headquarter/apps/web/src/utils/errors.ts:extractErrorMessage","kind":"calls","metadata":{"unresolvedName":"extractErrorMessage"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"external:aptPackages.filter","kind":"calls","metadata":{"unresolvedName":"aptPackages.filter"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"external:npmPackages.filter","kind":"calls","metadata":{"unresolvedName":"npmPackages.filter"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"external:pipPackages.filter","kind":"calls","metadata":{"unresolvedName":"pipPackages.filter"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"external:envVars.filter","kind":"calls","metadata":{"unresolvedName":"envVars.filter"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"external:baseDefinitions.map","kind":"calls","metadata":{"unresolvedName":"baseDefinitions.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:updateAptPackage","kind":"calls","metadata":{"unresolvedName":"updateAptPackage"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"symbol-name:removeAptPackage","kind":"calls","metadata":{"unresolvedName":"removeAptPackage"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:updateNpmPackage","kind":"calls","metadata":{"unresolvedName":"updateNpmPackage"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"symbol-name:removeNpmPackage","kind":"calls","metadata":{"unresolvedName":"removeNpmPackage"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:updatePipPackage","kind":"calls","metadata":{"unresolvedName":"updatePipPackage"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"symbol-name:removePipPackage","kind":"calls","metadata":{"unresolvedName":"removePipPackage"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"external:envVars.map","kind":"calls","metadata":{"unresolvedName":"envVars.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"symbol-name:updateEnvVar","kind":"calls","metadata":{"unresolvedName":"updateEnvVar"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:removeEnvVar","kind":"calls","metadata":{"unresolvedName":"removeEnvVar"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"external:buildScripts.map","kind":"calls","metadata":{"unresolvedName":"buildScripts.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:updateBuildScript","kind":"calls","metadata":{"unresolvedName":"updateBuildScript"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"symbol-name:removeBuildScript","kind":"calls","metadata":{"unresolvedName":"removeBuildScript"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"external:startupScripts.map","kind":"calls","metadata":{"unresolvedName":"startupScripts.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:updateStartupScript","kind":"calls","metadata":{"unresolvedName":"updateStartupScript"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"symbol-name:removeStartupScript","kind":"calls","metadata":{"unresolvedName":"removeStartupScript"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"external:mounts.map","kind":"calls","metadata":{"unresolvedName":"mounts.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"symbol-name:updateMount","kind":"calls","metadata":{"unresolvedName":"updateMount"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:removeMount","kind":"calls","metadata":{"unresolvedName":"removeMount"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"external:command.join","kind":"calls","metadata":{"unresolvedName":"command.join"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:ManifestEditor","to":"external:e.target.value.split","kind":"calls","metadata":{"unresolvedName":"e.target.value.split"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:","to":"symbol-name:setBaseImage","kind":"calls","metadata":{"unresolvedName":"setBaseImage"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:","to":"symbol-name:setBaseDefinitionId","kind":"calls","metadata":{"unresolvedName":"setBaseDefinitionId"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:","to":"symbol-name:setAptPackages","kind":"calls","metadata":{"unresolvedName":"setAptPackages"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:","to":"external:((pkgs.apt as string[]) || []).map","kind":"calls","metadata":{"unresolvedName":"((pkgs.apt as string[]) || []).map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:","to":"symbol-name:setNpmPackages","kind":"calls","metadata":{"unresolvedName":"setNpmPackages"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:","to":"external:((pkgs.npm_global as string[]) || []).map","kind":"calls","metadata":{"unresolvedName":"((pkgs.npm_global as string[]) || []).map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:","to":"symbol-name:setPipPackages","kind":"calls","metadata":{"unresolvedName":"setPipPackages"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:","to":"external:((pkgs.pip as string[]) || []).map","kind":"calls","metadata":{"unresolvedName":"((pkgs.pip as string[]) || []).map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:","to":"symbol-name:setNodeVersion","kind":"calls","metadata":{"unresolvedName":"setNodeVersion"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:","to":"symbol-name:setUserName","kind":"calls","metadata":{"unresolvedName":"setUserName"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:","to":"symbol-name:setUserUid","kind":"calls","metadata":{"unresolvedName":"setUserUid"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:","to":"symbol-name:String","kind":"calls","metadata":{"unresolvedName":"String"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:","to":"symbol-name:setUserGid","kind":"calls","metadata":{"unresolvedName":"setUserGid"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:","to":"symbol-name:setEnvVars","kind":"calls","metadata":{"unresolvedName":"setEnvVars"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:","to":"external:Object.entries(env).map","kind":"calls","metadata":{"unresolvedName":"Object.entries(env).map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:","to":"external:Object.entries","kind":"calls","metadata":{"unresolvedName":"Object.entries"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:","to":"symbol-name:setBuildScripts","kind":"calls","metadata":{"unresolvedName":"setBuildScripts"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:","to":"symbol-name:setStartupScripts","kind":"calls","metadata":{"unresolvedName":"setStartupScripts"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:","to":"symbol-name:setMounts","kind":"calls","metadata":{"unresolvedName":"setMounts"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:","to":"symbol-name:setCommand","kind":"calls","metadata":{"unresolvedName":"setCommand"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:","to":"symbol-name:setWorkingDir","kind":"calls","metadata":{"unresolvedName":"setWorkingDir"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:","to":"symbol-name:setStdinOpen","kind":"calls","metadata":{"unresolvedName":"setStdinOpen"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:","to":"symbol-name:setTty","kind":"calls","metadata":{"unresolvedName":"setTty"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:","to":"external:aptPackages.map((p) => p.name).filter","kind":"calls","metadata":{"unresolvedName":"aptPackages.map((p) => p.name).filter"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:","to":"external:aptPackages.map","kind":"calls","metadata":{"unresolvedName":"aptPackages.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:","to":"external:npmPackages.map((p) => p.name).filter","kind":"calls","metadata":{"unresolvedName":"npmPackages.map((p) => p.name).filter"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:","to":"external:npmPackages.map","kind":"calls","metadata":{"unresolvedName":"npmPackages.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:","to":"external:pipPackages.map((p) => p.name).filter","kind":"calls","metadata":{"unresolvedName":"pipPackages.map((p) => p.name).filter"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:","to":"external:pipPackages.map","kind":"calls","metadata":{"unresolvedName":"pipPackages.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:","to":"external:envVars.forEach","kind":"calls","metadata":{"unresolvedName":"envVars.forEach"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:","to":"external:buildScripts.filter","kind":"calls","metadata":{"unresolvedName":"buildScripts.filter"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:","to":"external:startupScripts.filter","kind":"calls","metadata":{"unresolvedName":"startupScripts.filter"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:","to":"external:mounts.filter","kind":"calls","metadata":{"unresolvedName":"mounts.filter"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:","to":"symbol-name:parseInt","kind":"calls","metadata":{"unresolvedName":"parseInt"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:","to":"external:command.filter","kind":"calls","metadata":{"unresolvedName":"command.filter"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:","kind":"defines"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:","to":"symbol-name:buildManifest","kind":"calls","metadata":{"unresolvedName":"buildManifest"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:","to":"symbol-name:onChange","kind":"calls","metadata":{"unresolvedName":"onChange"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:handlePreview","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:handlePreview","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:handlePreview","to":"symbol-name:setPreviewError","kind":"calls","metadata":{"unresolvedName":"setPreviewError"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:handlePreview","to":"symbol-name:setPreviewLoading","kind":"calls","metadata":{"unresolvedName":"setPreviewLoading"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:handlePreview","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_definitions.ts:compileToolDefinition","kind":"calls","metadata":{"unresolvedName":"compileToolDefinition"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:handlePreview","to":"symbol-name:setPreview","kind":"calls","metadata":{"unresolvedName":"setPreview"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:handlePreview","to":"/home/alex/projects/headquarter/apps/web/src/utils/errors.ts:extractErrorMessage","kind":"calls","metadata":{"unresolvedName":"extractErrorMessage"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:updateAptPackage","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:updateAptPackage","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:updateAptPackage","to":"symbol-name:setAptPackages","kind":"calls","metadata":{"unresolvedName":"setAptPackages"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:updateNpmPackage","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:updateNpmPackage","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:updateNpmPackage","to":"symbol-name:setNpmPackages","kind":"calls","metadata":{"unresolvedName":"setNpmPackages"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:updatePipPackage","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:updatePipPackage","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:updatePipPackage","to":"symbol-name:setPipPackages","kind":"calls","metadata":{"unresolvedName":"setPipPackages"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:updateEnvVar","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:updateEnvVar","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:updateEnvVar","to":"symbol-name:setEnvVars","kind":"calls","metadata":{"unresolvedName":"setEnvVars"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:updateBuildScript","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:updateBuildScript","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:updateBuildScript","to":"symbol-name:setBuildScripts","kind":"calls","metadata":{"unresolvedName":"setBuildScripts"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:updateStartupScript","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:updateStartupScript","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:updateStartupScript","to":"symbol-name:setStartupScripts","kind":"calls","metadata":{"unresolvedName":"setStartupScripts"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:updateMount","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:updateMount","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:updateMount","to":"symbol-name:setMounts","kind":"calls","metadata":{"unresolvedName":"setMounts"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:","to":"symbol-name:setBaseDefinitionId","kind":"calls","metadata":{"unresolvedName":"setBaseDefinitionId"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:","to":"symbol-name:setBaseImage","kind":"calls","metadata":{"unresolvedName":"setBaseImage"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:","to":"symbol-name:setBaseImage","kind":"calls","metadata":{"unresolvedName":"setBaseImage"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx:","to":"symbol-name:setBaseDefinitionId","kind":"calls","metadata":{"unresolvedName":"setBaseDefinitionId"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/merge-dialog.tsx","to":"external:react","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/merge-dialog.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/merge-dialog.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/icon.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/merge-dialog.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/merge-dialog.tsx:MergeDialog","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/merge-dialog.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/merge-dialog.tsx:MergeDialog","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/merge-dialog.tsx:MergeDialog","to":"symbol-name:useState","kind":"calls","metadata":{"unresolvedName":"useState"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/merge-dialog.tsx:MergeDialog","to":"external:branches.filter","kind":"calls","metadata":{"unresolvedName":"branches.filter"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/merge-dialog.tsx:MergeDialog","to":"symbol-name:setError","kind":"calls","metadata":{"unresolvedName":"setError"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/merge-dialog.tsx:MergeDialog","to":"symbol-name:setLoading","kind":"calls","metadata":{"unresolvedName":"setLoading"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/merge-dialog.tsx:MergeDialog","to":"symbol-name:setSuccess","kind":"calls","metadata":{"unresolvedName":"setSuccess"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/merge-dialog.tsx:MergeDialog","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:mergeBranches","kind":"calls","metadata":{"unresolvedName":"mergeBranches"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/merge-dialog.tsx:MergeDialog","to":"symbol-name:setTimeout","kind":"calls","metadata":{"unresolvedName":"setTimeout"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/merge-dialog.tsx:MergeDialog","to":"symbol-name:onMerge","kind":"calls","metadata":{"unresolvedName":"onMerge"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/merge-dialog.tsx:MergeDialog","to":"symbol-name:onClose","kind":"calls","metadata":{"unresolvedName":"onClose"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/merge-dialog.tsx:MergeDialog","to":"external:e.stopPropagation","kind":"calls","metadata":{"unresolvedName":"e.stopPropagation"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/merge-dialog.tsx:MergeDialog","to":"symbol-name:setSourceBranch","kind":"calls","metadata":{"unresolvedName":"setSourceBranch"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/merge-dialog.tsx:MergeDialog","to":"external:availableBranches.map","kind":"calls","metadata":{"unresolvedName":"availableBranches.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/merge-dialog.tsx:MergeDialog","to":"symbol-name:setCommitMessage","kind":"calls","metadata":{"unresolvedName":"setCommitMessage"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/merge-dialog.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/merge-dialog.tsx:handleMerge","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/merge-dialog.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/merge-dialog.tsx:handleMerge","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/merge-dialog.tsx:handleMerge","to":"symbol-name:setError","kind":"calls","metadata":{"unresolvedName":"setError"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/merge-dialog.tsx:handleMerge","to":"symbol-name:setLoading","kind":"calls","metadata":{"unresolvedName":"setLoading"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/merge-dialog.tsx:handleMerge","to":"symbol-name:setSuccess","kind":"calls","metadata":{"unresolvedName":"setSuccess"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/merge-dialog.tsx:handleMerge","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:mergeBranches","kind":"calls","metadata":{"unresolvedName":"mergeBranches"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/merge-dialog.tsx:handleMerge","to":"symbol-name:setTimeout","kind":"calls","metadata":{"unresolvedName":"setTimeout"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/merge-dialog.tsx:handleMerge","to":"symbol-name:onMerge","kind":"calls","metadata":{"unresolvedName":"onMerge"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/merge-dialog.tsx:handleMerge","to":"symbol-name:onClose","kind":"calls","metadata":{"unresolvedName":"onClose"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/merge-dialog.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/merge-dialog.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/merge-dialog.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/merge-dialog.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/merge-dialog.tsx:","to":"symbol-name:onMerge","kind":"calls","metadata":{"unresolvedName":"onMerge"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/merge-dialog.tsx:","to":"symbol-name:onClose","kind":"calls","metadata":{"unresolvedName":"onClose"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-action-sheet.tsx","to":"external:react","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-action-sheet.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/icon.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-action-sheet.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/icon.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-action-sheet.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/mobile-action-sheet.tsx:MobileActionSheet","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-action-sheet.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/mobile-action-sheet.tsx:MobileActionSheet","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/mobile-action-sheet.tsx:MobileActionSheet","to":"symbol-name:useRef","kind":"calls","metadata":{"unresolvedName":"useRef"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/mobile-action-sheet.tsx:MobileActionSheet","to":"symbol-name:useEffect","kind":"calls","metadata":{"unresolvedName":"useEffect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/mobile-action-sheet.tsx:MobileActionSheet","to":"symbol-name:onClose","kind":"calls","metadata":{"unresolvedName":"onClose"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/mobile-action-sheet.tsx:MobileActionSheet","to":"external:document.addEventListener","kind":"calls","metadata":{"unresolvedName":"document.addEventListener"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/mobile-action-sheet.tsx:MobileActionSheet","to":"external:document.removeEventListener","kind":"calls","metadata":{"unresolvedName":"document.removeEventListener"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/mobile-action-sheet.tsx:MobileActionSheet","to":"external:e.stopPropagation","kind":"calls","metadata":{"unresolvedName":"e.stopPropagation"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/mobile-action-sheet.tsx:MobileActionSheet","to":"external:actions.map","kind":"calls","metadata":{"unresolvedName":"actions.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/mobile-action-sheet.tsx:MobileActionSheet","to":"external:action.onClick","kind":"calls","metadata":{"unresolvedName":"action.onClick"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-action-sheet.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/mobile-action-sheet.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-action-sheet.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/mobile-action-sheet.tsx:","kind":"defines"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-action-sheet.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/mobile-action-sheet.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-action-sheet.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/mobile-action-sheet.tsx:","kind":"defines"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-action-sheet.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/mobile-action-sheet.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-action-sheet.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/mobile-action-sheet.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/mobile-action-sheet.tsx:","to":"symbol-name:onClose","kind":"calls","metadata":{"unresolvedName":"onClose"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/mobile-action-sheet.tsx:","to":"external:document.addEventListener","kind":"calls","metadata":{"unresolvedName":"document.addEventListener"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/mobile-action-sheet.tsx:","to":"external:document.removeEventListener","kind":"calls","metadata":{"unresolvedName":"document.removeEventListener"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-action-sheet.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/mobile-action-sheet.tsx:handleEscape","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-action-sheet.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/mobile-action-sheet.tsx:handleEscape","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/mobile-action-sheet.tsx:handleEscape","to":"symbol-name:onClose","kind":"calls","metadata":{"unresolvedName":"onClose"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-action-sheet.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/mobile-action-sheet.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-action-sheet.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/mobile-action-sheet.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/mobile-action-sheet.tsx:","to":"external:action.onClick","kind":"calls","metadata":{"unresolvedName":"action.onClick"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/mobile-action-sheet.tsx:","to":"symbol-name:onClose","kind":"calls","metadata":{"unresolvedName":"onClose"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-detail-view.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/icon.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-detail-view.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/mobile-detail-view.tsx:MobileDetailView","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-detail-view.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/mobile-detail-view.tsx:MobileDetailView","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/mobile-detail-view.tsx:MobileDetailView","to":"external:JSON.stringify","kind":"calls","metadata":{"unresolvedName":"JSON.stringify"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/mobile-detail-view.tsx:MobileDetailView","to":"symbol-name:String","kind":"calls","metadata":{"unresolvedName":"String"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/mobile-detail-view.tsx:MobileDetailView","to":"external:fields.map","kind":"calls","metadata":{"unresolvedName":"fields.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/mobile-detail-view.tsx:MobileDetailView","to":"/home/alex/projects/headquarter/apps/web/src/components/mobile-detail-view.tsx:renderValue","kind":"calls","metadata":{"unresolvedName":"renderValue"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-detail-view.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/mobile-detail-view.tsx:renderValue","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-detail-view.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/mobile-detail-view.tsx:renderValue","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/mobile-detail-view.tsx:renderValue","to":"external:JSON.stringify","kind":"calls","metadata":{"unresolvedName":"JSON.stringify"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/mobile-detail-view.tsx:renderValue","to":"symbol-name:String","kind":"calls","metadata":{"unresolvedName":"String"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-edit-view.tsx","to":"external:react","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-edit-view.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/mobile-edit-view.tsx:MobileEditView","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-edit-view.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/mobile-edit-view.tsx:MobileEditView","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/mobile-edit-view.tsx:MobileEditView","to":"symbol-name:useState","kind":"calls","metadata":{"unresolvedName":"useState"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/mobile-edit-view.tsx:MobileEditView","to":"external:fields?.forEach","kind":"calls","metadata":{"unresolvedName":"fields?.forEach"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/mobile-edit-view.tsx:MobileEditView","to":"symbol-name:setFormData","kind":"calls","metadata":{"unresolvedName":"setFormData"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/mobile-edit-view.tsx:MobileEditView","to":"external:e.preventDefault","kind":"calls","metadata":{"unresolvedName":"e.preventDefault"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/mobile-edit-view.tsx:MobileEditView","to":"symbol-name:onSave","kind":"calls","metadata":{"unresolvedName":"onSave"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/mobile-edit-view.tsx:MobileEditView","to":"external:fields?.map","kind":"calls","metadata":{"unresolvedName":"fields?.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/mobile-edit-view.tsx:MobileEditView","to":"symbol-name:String","kind":"calls","metadata":{"unresolvedName":"String"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/mobile-edit-view.tsx:MobileEditView","to":"symbol-name:handleChange","kind":"calls","metadata":{"unresolvedName":"handleChange"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/mobile-edit-view.tsx:MobileEditView","to":"external:field.options?.map","kind":"calls","metadata":{"unresolvedName":"field.options?.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/mobile-edit-view.tsx:MobileEditView","to":"symbol-name:Boolean","kind":"calls","metadata":{"unresolvedName":"Boolean"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/mobile-edit-view.tsx:MobileEditView","to":"symbol-name:Number","kind":"calls","metadata":{"unresolvedName":"Number"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-edit-view.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/mobile-edit-view.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-edit-view.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/mobile-edit-view.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/mobile-edit-view.tsx:","to":"external:fields?.forEach","kind":"calls","metadata":{"unresolvedName":"fields?.forEach"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-edit-view.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/mobile-edit-view.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-edit-view.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/mobile-edit-view.tsx:","kind":"defines"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-edit-view.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/mobile-edit-view.tsx:handleChange","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-edit-view.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/mobile-edit-view.tsx:handleChange","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/mobile-edit-view.tsx:handleChange","to":"symbol-name:setFormData","kind":"calls","metadata":{"unresolvedName":"setFormData"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-edit-view.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/mobile-edit-view.tsx:handleSubmit","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-edit-view.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/mobile-edit-view.tsx:handleSubmit","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/mobile-edit-view.tsx:handleSubmit","to":"external:e.preventDefault","kind":"calls","metadata":{"unresolvedName":"e.preventDefault"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/mobile-edit-view.tsx:handleSubmit","to":"symbol-name:onSave","kind":"calls","metadata":{"unresolvedName":"onSave"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-fab.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/icon.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-fab.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/mobile-fab.tsx:MobileFAB","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-fab.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/mobile-fab.tsx:MobileFAB","kind":"defines"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-list-view.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/icon.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-list-view.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/utils/icons.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-list-view.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/mobile-list-view.tsx:MobileListView","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-list-view.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/mobile-list-view.tsx:MobileListView","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/mobile-list-view.tsx:MobileListView","to":"symbol-name:onSearch","kind":"calls","metadata":{"unresolvedName":"onSearch"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/mobile-list-view.tsx:MobileListView","to":"external:items.map","kind":"calls","metadata":{"unresolvedName":"items.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/mobile-list-view.tsx:MobileListView","to":"symbol-name:onItemClick","kind":"calls","metadata":{"unresolvedName":"onItemClick"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-nav.tsx","to":"external:react","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-nav.tsx","to":"external:react-router-dom","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-nav.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/icon.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-nav.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/tools-bottom-sheet.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-nav.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/utils/icons.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-nav.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/mobile-nav.tsx:MobileNav","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-nav.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/mobile-nav.tsx:MobileNav","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/mobile-nav.tsx:MobileNav","to":"symbol-name:useLocation","kind":"calls","metadata":{"unresolvedName":"useLocation"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/mobile-nav.tsx:MobileNav","to":"symbol-name:useState","kind":"calls","metadata":{"unresolvedName":"useState"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/mobile-nav.tsx:MobileNav","to":"symbol-name:setToolsSheetOpen","kind":"calls","metadata":{"unresolvedName":"setToolsSheetOpen"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/mobile-nav.tsx:MobileNav","to":"external:MOBILE_NAV_ITEMS.map","kind":"calls","metadata":{"unresolvedName":"MOBILE_NAV_ITEMS.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/mobile-nav.tsx:MobileNav","to":"/home/alex/projects/headquarter/apps/web/src/components/mobile-nav.tsx:handleNavClick","kind":"calls","metadata":{"unresolvedName":"handleNavClick"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-nav.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/mobile-nav.tsx:handleNavClick","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-nav.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/mobile-nav.tsx:handleNavClick","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/mobile-nav.tsx:handleNavClick","to":"symbol-name:setToolsSheetOpen","kind":"calls","metadata":{"unresolvedName":"setToolsSheetOpen"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-nav.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/mobile-nav.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-nav.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/mobile-nav.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/mobile-nav.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/components/mobile-nav.tsx:handleNavClick","kind":"calls","metadata":{"unresolvedName":"handleNavClick"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-page-header.tsx","to":"external:react-router-dom","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-page-header.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-mobile-viewport.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-page-header.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/icon.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-page-header.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/mobile-page-header.tsx:MobilePageHeader","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-page-header.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/mobile-page-header.tsx:MobilePageHeader","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/mobile-page-header.tsx:MobilePageHeader","to":"symbol-name:useNavigate","kind":"calls","metadata":{"unresolvedName":"useNavigate"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/mobile-page-header.tsx:MobilePageHeader","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-mobile-viewport.ts:useMobileViewport","kind":"calls","metadata":{"unresolvedName":"useMobileViewport"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/mobile-page-header.tsx:MobilePageHeader","to":"symbol-name:navigate","kind":"calls","metadata":{"unresolvedName":"navigate"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-header.tsx","to":"external:react","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-header.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/icon.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-header.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-header.tsx:MobileTerminalHeader","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-header.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-header.tsx:MobileTerminalHeader","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-header.tsx:MobileTerminalHeader","to":"symbol-name:onFontSizeChange","kind":"calls","metadata":{"unresolvedName":"onFontSizeChange"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-wrapper.tsx","to":"external:react","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-wrapper.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-wrapper.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-header.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-wrapper.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-wrapper.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-wrapper.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-mobile-viewport.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-wrapper.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-virtual-keyboard.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-wrapper.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-wrapper.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-special-keys.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-wrapper.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-wrapper.tsx:MobileTerminalWrapper","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-wrapper.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-wrapper.tsx:MobileTerminalWrapper","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-wrapper.tsx:MobileTerminalWrapper","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-mobile-viewport.ts:useMobileViewport","kind":"calls","metadata":{"unresolvedName":"useMobileViewport"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-wrapper.tsx:MobileTerminalWrapper","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-virtual-keyboard.ts:useVirtualKeyboard","kind":"calls","metadata":{"unresolvedName":"useVirtualKeyboard"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-wrapper.tsx:MobileTerminalWrapper","to":"symbol-name:useState","kind":"calls","metadata":{"unresolvedName":"useState"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-wrapper.tsx:MobileTerminalWrapper","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts:useAutoHide","kind":"calls","metadata":{"unresolvedName":"useAutoHide"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-wrapper.tsx:MobileTerminalWrapper","to":"symbol-name:useCallback","kind":"calls","metadata":{"unresolvedName":"useCallback"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-wrapper.tsx:MobileTerminalWrapper","to":"external:headerAutoHide.toggle","kind":"calls","metadata":{"unresolvedName":"headerAutoHide.toggle"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-wrapper.tsx:MobileTerminalWrapper","to":"symbol-name:setTerminalRef","kind":"calls","metadata":{"unresolvedName":"setTerminalRef"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-wrapper.tsx:MobileTerminalWrapper","to":"external:terminalRef?.sendData","kind":"calls","metadata":{"unresolvedName":"terminalRef?.sendData"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-wrapper.tsx:MobileTerminalWrapper","to":"external:terminalRef?.changeFontSize","kind":"calls","metadata":{"unresolvedName":"terminalRef?.changeFontSize"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-wrapper.tsx:MobileTerminalWrapper","to":"symbol-name:setShowPanel","kind":"calls","metadata":{"unresolvedName":"setShowPanel"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-wrapper.tsx:MobileTerminalWrapper","to":"external:terminalRef?.focusInput","kind":"calls","metadata":{"unresolvedName":"terminalRef?.focusInput"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-wrapper.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-wrapper.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-wrapper.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-wrapper.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-wrapper.tsx:","to":"external:headerAutoHide.toggle","kind":"calls","metadata":{"unresolvedName":"headerAutoHide.toggle"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-wrapper.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-wrapper.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-wrapper.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-wrapper.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-wrapper.tsx:","to":"symbol-name:setTerminalRef","kind":"calls","metadata":{"unresolvedName":"setTerminalRef"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-wrapper.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-wrapper.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-wrapper.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-wrapper.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-wrapper.tsx:","to":"external:terminalRef?.sendData","kind":"calls","metadata":{"unresolvedName":"terminalRef?.sendData"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/protected-route.test.tsx","to":"external:@testing-library/react","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/protected-route.test.tsx","to":"external:react-router-dom","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/protected-route.test.tsx","to":"external:vitest","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/protected-route.test.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/protected-route.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/protected-route.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/protected-route.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/protected-route.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/protected-route.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/protected-route.test.tsx:","to":"symbol-name:it","kind":"calls","metadata":{"unresolvedName":"it"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/protected-route.test.tsx:","to":"external:mockUseAuth.mockReturnValue","kind":"calls","metadata":{"unresolvedName":"mockUseAuth.mockReturnValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/protected-route.test.tsx:","to":"symbol-name:render","kind":"calls","metadata":{"unresolvedName":"render"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/protected-route.test.tsx:","to":"external:expect(screen.getByText(\"Checking session...\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(\"Checking session...\")).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/protected-route.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/protected-route.test.tsx:","to":"external:screen.getByText","kind":"calls","metadata":{"unresolvedName":"screen.getByText"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/protected-route.test.tsx:","to":"external:expect(screen.getByText(\"login page\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(\"login page\")).toBeInTheDocument"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/protected-route.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/protected-route.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/protected-route.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/protected-route.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/protected-route.test.tsx:","to":"external:mockUseAuth.mockReturnValue","kind":"calls","metadata":{"unresolvedName":"mockUseAuth.mockReturnValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/protected-route.test.tsx:","to":"symbol-name:render","kind":"calls","metadata":{"unresolvedName":"render"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/protected-route.test.tsx:","to":"external:expect(screen.getByText(\"Checking session...\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(\"Checking session...\")).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/protected-route.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/protected-route.test.tsx:","to":"external:screen.getByText","kind":"calls","metadata":{"unresolvedName":"screen.getByText"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/protected-route.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/protected-route.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/protected-route.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/protected-route.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/protected-route.test.tsx:","to":"external:mockUseAuth.mockReturnValue","kind":"calls","metadata":{"unresolvedName":"mockUseAuth.mockReturnValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/protected-route.test.tsx:","to":"symbol-name:render","kind":"calls","metadata":{"unresolvedName":"render"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/protected-route.test.tsx:","to":"external:expect(screen.getByText(\"login page\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(\"login page\")).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/protected-route.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/protected-route.test.tsx:","to":"external:screen.getByText","kind":"calls","metadata":{"unresolvedName":"screen.getByText"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/protected-route.tsx","to":"external:react-router-dom","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/protected-route.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/state/auth.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/protected-route.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/protected-route.tsx:ProtectedRoute","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/protected-route.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/protected-route.tsx:ProtectedRoute","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/protected-route.tsx:ProtectedRoute","to":"/home/alex/projects/headquarter/apps/web/src/state/auth.tsx:useAuth","kind":"calls","metadata":{"unresolvedName":"useAuth"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/protected-route.tsx:ProtectedRoute","to":"symbol-name:useLocation","kind":"calls","metadata":{"unresolvedName":"useLocation"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/protected-route.tsx:ProtectedRoute","to":"symbol-name:encodeURIComponent","kind":"calls","metadata":{"unresolvedName":"encodeURIComponent"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx","to":"external:@testing-library/react","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx","to":"external:vitest","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"external:vi.importActual","kind":"calls","metadata":{"unresolvedName":"vi.importActual"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"symbol-name:cleanup","kind":"calls","metadata":{"unresolvedName":"cleanup"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"external:vi.restoreAllMocks","kind":"calls","metadata":{"unresolvedName":"vi.restoreAllMocks"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"symbol-name:it","kind":"calls","metadata":{"unresolvedName":"it"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"external:vi.spyOn(gitRepositoriesApi, \"listRepositories\").mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(gitRepositoriesApi, \"listRepositories\").mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"external:vi.spyOn","kind":"calls","metadata":{"unresolvedName":"vi.spyOn"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"external:vi.spyOn(gitRepositoriesApi, \"createRepository\").mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(gitRepositoriesApi, \"createRepository\").mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"symbol-name:render","kind":"calls","metadata":{"unresolvedName":"render"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"symbol-name:waitFor","kind":"calls","metadata":{"unresolvedName":"waitFor"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"external:expect(screen.getByText(\"Main Repo\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(\"Main Repo\")).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"external:screen.getByText","kind":"calls","metadata":{"unresolvedName":"screen.getByText"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"external:fireEvent.click","kind":"calls","metadata":{"unresolvedName":"fireEvent.click"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"external:screen.getByRole","kind":"calls","metadata":{"unresolvedName":"screen.getByRole"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"external:fireEvent.change","kind":"calls","metadata":{"unresolvedName":"fireEvent.change"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"external:screen.getByPlaceholderText","kind":"calls","metadata":{"unresolvedName":"screen.getByPlaceholderText"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"external:expect(createMock).toHaveBeenCalledWith","kind":"calls","metadata":{"unresolvedName":"expect(createMock).toHaveBeenCalledWith"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"external:expect(listMock).toHaveBeenCalledTimes","kind":"calls","metadata":{"unresolvedName":"expect(listMock).toHaveBeenCalledTimes"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"external:vi.spyOn(gitRepositoriesApi, \"listRepositories\").mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(gitRepositoriesApi, \"listRepositories\").mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"external:vi.spyOn","kind":"calls","metadata":{"unresolvedName":"vi.spyOn"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"external:vi.spyOn(gitRepositoriesApi, \"createRepository\").mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(gitRepositoriesApi, \"createRepository\").mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"symbol-name:render","kind":"calls","metadata":{"unresolvedName":"render"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"symbol-name:waitFor","kind":"calls","metadata":{"unresolvedName":"waitFor"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"external:expect(screen.getByText(\"Main Repo\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(\"Main Repo\")).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"external:screen.getByText","kind":"calls","metadata":{"unresolvedName":"screen.getByText"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"external:fireEvent.click","kind":"calls","metadata":{"unresolvedName":"fireEvent.click"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"external:screen.getByRole","kind":"calls","metadata":{"unresolvedName":"screen.getByRole"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"external:fireEvent.change","kind":"calls","metadata":{"unresolvedName":"fireEvent.change"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"external:screen.getByPlaceholderText","kind":"calls","metadata":{"unresolvedName":"screen.getByPlaceholderText"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"external:expect(createMock).toHaveBeenCalledWith","kind":"calls","metadata":{"unresolvedName":"expect(createMock).toHaveBeenCalledWith"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"external:expect(listMock).toHaveBeenCalledTimes","kind":"calls","metadata":{"unresolvedName":"expect(listMock).toHaveBeenCalledTimes"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"external:expect(screen.getByText(\"Main Repo\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(\"Main Repo\")).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"external:screen.getByText","kind":"calls","metadata":{"unresolvedName":"screen.getByText"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"external:expect(createMock).toHaveBeenCalledWith","kind":"calls","metadata":{"unresolvedName":"expect(createMock).toHaveBeenCalledWith"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"external:vi.spyOn(gitRepositoriesApi, \"listRepositories\").mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(gitRepositoriesApi, \"listRepositories\").mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"external:vi.spyOn","kind":"calls","metadata":{"unresolvedName":"vi.spyOn"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"external:vi.spyOn(gitRepositoriesApi, \"createRepository\").mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(gitRepositoriesApi, \"createRepository\").mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"symbol-name:render","kind":"calls","metadata":{"unresolvedName":"render"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"symbol-name:waitFor","kind":"calls","metadata":{"unresolvedName":"waitFor"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"external:expect(screen.getByText(\"Main Repo\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(\"Main Repo\")).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"external:screen.getByText","kind":"calls","metadata":{"unresolvedName":"screen.getByText"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"external:fireEvent.click","kind":"calls","metadata":{"unresolvedName":"fireEvent.click"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"external:screen.getByRole","kind":"calls","metadata":{"unresolvedName":"screen.getByRole"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"external:fireEvent.change","kind":"calls","metadata":{"unresolvedName":"fireEvent.change"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"external:screen.getByPlaceholderText","kind":"calls","metadata":{"unresolvedName":"screen.getByPlaceholderText"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"external:expect(createMock).toHaveBeenCalledWith","kind":"calls","metadata":{"unresolvedName":"expect(createMock).toHaveBeenCalledWith"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"external:expect(listMock).toHaveBeenCalledTimes","kind":"calls","metadata":{"unresolvedName":"expect(listMock).toHaveBeenCalledTimes"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"external:expect(screen.getByText(\"Main Repo\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(\"Main Repo\")).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"external:screen.getByText","kind":"calls","metadata":{"unresolvedName":"screen.getByText"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"external:expect(createMock).toHaveBeenCalledWith","kind":"calls","metadata":{"unresolvedName":"expect(createMock).toHaveBeenCalledWith"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"external:vi.spyOn(gitRepositoriesApi, \"listRepositories\").mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(gitRepositoriesApi, \"listRepositories\").mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"external:vi.spyOn","kind":"calls","metadata":{"unresolvedName":"vi.spyOn"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"symbol-name:render","kind":"calls","metadata":{"unresolvedName":"render"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"symbol-name:waitFor","kind":"calls","metadata":{"unresolvedName":"waitFor"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"external:expect(screen.getByText(\"Main Repo\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(\"Main Repo\")).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"external:screen.getByText","kind":"calls","metadata":{"unresolvedName":"screen.getByText"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"external:fireEvent.click","kind":"calls","metadata":{"unresolvedName":"fireEvent.click"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"external:screen.getByRole","kind":"calls","metadata":{"unresolvedName":"screen.getByRole"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"external:fireEvent.change","kind":"calls","metadata":{"unresolvedName":"fireEvent.change"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"external:screen.getByPlaceholderText","kind":"calls","metadata":{"unresolvedName":"screen.getByPlaceholderText"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"external:expect(screen.getByText(\"Main Repo\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(\"Main Repo\")).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.test.tsx:","to":"external:screen.getByText","kind":"calls","metadata":{"unresolvedName":"screen.getByText"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.tsx","to":"external:react","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.tsx","to":"external:react-router-dom","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/icon.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.tsx:RepositoriesSettingsTab","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.tsx:RepositoriesSettingsTab","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.tsx:RepositoriesSettingsTab","to":"symbol-name:useParams","kind":"calls","metadata":{"unresolvedName":"useParams"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.tsx:RepositoriesSettingsTab","to":"symbol-name:useState","kind":"calls","metadata":{"unresolvedName":"useState"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.tsx:RepositoriesSettingsTab","to":"symbol-name:useCallback","kind":"calls","metadata":{"unresolvedName":"useCallback"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.tsx:RepositoriesSettingsTab","to":"symbol-name:setLoading","kind":"calls","metadata":{"unresolvedName":"setLoading"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.tsx:RepositoriesSettingsTab","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:listRepositories","kind":"calls","metadata":{"unresolvedName":"listRepositories"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.tsx:RepositoriesSettingsTab","to":"symbol-name:setRepositories","kind":"calls","metadata":{"unresolvedName":"setRepositories"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.tsx:RepositoriesSettingsTab","to":"symbol-name:setError","kind":"calls","metadata":{"unresolvedName":"setError"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.tsx:RepositoriesSettingsTab","to":"symbol-name:useEffect","kind":"calls","metadata":{"unresolvedName":"useEffect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.tsx:RepositoriesSettingsTab","to":"symbol-name:loadRepositories","kind":"calls","metadata":{"unresolvedName":"loadRepositories"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.tsx:RepositoriesSettingsTab","to":"external:window.confirm","kind":"calls","metadata":{"unresolvedName":"window.confirm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.tsx:RepositoriesSettingsTab","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:deleteRepository","kind":"calls","metadata":{"unresolvedName":"deleteRepository"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.tsx:RepositoriesSettingsTab","to":"external:current.filter","kind":"calls","metadata":{"unresolvedName":"current.filter"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.tsx:RepositoriesSettingsTab","to":"symbol-name:setShowCreate","kind":"calls","metadata":{"unresolvedName":"setShowCreate"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.tsx:RepositoriesSettingsTab","to":"external:repositories.map","kind":"calls","metadata":{"unresolvedName":"repositories.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.tsx:RepositoriesSettingsTab","to":"symbol-name:handleDelete","kind":"calls","metadata":{"unresolvedName":"handleDelete"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.tsx:","to":"symbol-name:setLoading","kind":"calls","metadata":{"unresolvedName":"setLoading"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:listRepositories","kind":"calls","metadata":{"unresolvedName":"listRepositories"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.tsx:","to":"symbol-name:setRepositories","kind":"calls","metadata":{"unresolvedName":"setRepositories"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.tsx:","to":"symbol-name:setError","kind":"calls","metadata":{"unresolvedName":"setError"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.tsx:","to":"symbol-name:loadRepositories","kind":"calls","metadata":{"unresolvedName":"loadRepositories"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.tsx:handleDelete","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.tsx:handleDelete","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.tsx:handleDelete","to":"external:window.confirm","kind":"calls","metadata":{"unresolvedName":"window.confirm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.tsx:handleDelete","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:deleteRepository","kind":"calls","metadata":{"unresolvedName":"deleteRepository"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.tsx:handleDelete","to":"symbol-name:setRepositories","kind":"calls","metadata":{"unresolvedName":"setRepositories"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.tsx:handleDelete","to":"external:current.filter","kind":"calls","metadata":{"unresolvedName":"current.filter"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.tsx:handleDelete","to":"symbol-name:setError","kind":"calls","metadata":{"unresolvedName":"setError"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx","to":"external:react","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/api/ssh_keys.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/icon.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:RepositoryCreateDialog","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:RepositoryCreateDialog","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:RepositoryCreateDialog","to":"symbol-name:useState","kind":"calls","metadata":{"unresolvedName":"useState"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:RepositoryCreateDialog","to":"symbol-name:useRef","kind":"calls","metadata":{"unresolvedName":"useRef"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:RepositoryCreateDialog","to":"symbol-name:useEffect","kind":"calls","metadata":{"unresolvedName":"useEffect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:RepositoryCreateDialog","to":"symbol-name:clearTimeout","kind":"calls","metadata":{"unresolvedName":"clearTimeout"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:RepositoryCreateDialog","to":"/home/alex/projects/headquarter/apps/web/src/api/ssh_keys.ts:listSSHKeys","kind":"calls","metadata":{"unresolvedName":"listSSHKeys"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:RepositoryCreateDialog","to":"symbol-name:setSshKeys","kind":"calls","metadata":{"unresolvedName":"setSshKeys"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:RepositoryCreateDialog","to":"symbol-name:loadKeys","kind":"calls","metadata":{"unresolvedName":"loadKeys"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:RepositoryCreateDialog","to":"symbol-name:setUrlValidation","kind":"calls","metadata":{"unresolvedName":"setUrlValidation"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:RepositoryCreateDialog","to":"external:advancedUrl.trim","kind":"calls","metadata":{"unresolvedName":"advancedUrl.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:RepositoryCreateDialog","to":"symbol-name:setTimeout","kind":"calls","metadata":{"unresolvedName":"setTimeout"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:RepositoryCreateDialog","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:parseGitUrl","kind":"calls","metadata":{"unresolvedName":"parseGitUrl"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:RepositoryCreateDialog","to":"symbol-name:setCreateMode","kind":"calls","metadata":{"unresolvedName":"setCreateMode"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:RepositoryCreateDialog","to":"symbol-name:setFormName","kind":"calls","metadata":{"unresolvedName":"setFormName"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:RepositoryCreateDialog","to":"symbol-name:setOwner","kind":"calls","metadata":{"unresolvedName":"setOwner"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:RepositoryCreateDialog","to":"symbol-name:setRepoName","kind":"calls","metadata":{"unresolvedName":"setRepoName"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:RepositoryCreateDialog","to":"symbol-name:setAdvancedUrl","kind":"calls","metadata":{"unresolvedName":"setAdvancedUrl"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:RepositoryCreateDialog","to":"symbol-name:setUseAdvancedUrl","kind":"calls","metadata":{"unresolvedName":"setUseAdvancedUrl"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:RepositoryCreateDialog","to":"symbol-name:setFormError","kind":"calls","metadata":{"unresolvedName":"setFormError"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:RepositoryCreateDialog","to":"symbol-name:setSelectedSshKey","kind":"calls","metadata":{"unresolvedName":"setSelectedSshKey"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:RepositoryCreateDialog","to":"symbol-name:resetForm","kind":"calls","metadata":{"unresolvedName":"resetForm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:RepositoryCreateDialog","to":"symbol-name:onClose","kind":"calls","metadata":{"unresolvedName":"onClose"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:RepositoryCreateDialog","to":"external:event.preventDefault","kind":"calls","metadata":{"unresolvedName":"event.preventDefault"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:RepositoryCreateDialog","to":"external:formName.trim","kind":"calls","metadata":{"unresolvedName":"formName.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:RepositoryCreateDialog","to":"external:owner.trim","kind":"calls","metadata":{"unresolvedName":"owner.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:RepositoryCreateDialog","to":"external:repoName.trim","kind":"calls","metadata":{"unresolvedName":"repoName.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:RepositoryCreateDialog","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:createRepository","kind":"calls","metadata":{"unresolvedName":"createRepository"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:RepositoryCreateDialog","to":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:handleClose","kind":"calls","metadata":{"unresolvedName":"handleClose"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:RepositoryCreateDialog","to":"symbol-name:onCreated","kind":"calls","metadata":{"unresolvedName":"onCreated"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:RepositoryCreateDialog","to":"external:sshKeys.map","kind":"calls","metadata":{"unresolvedName":"sshKeys.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:RepositoryCreateDialog","to":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:getUrlInputClass","kind":"calls","metadata":{"unresolvedName":"getUrlInputClass"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:","to":"symbol-name:clearTimeout","kind":"calls","metadata":{"unresolvedName":"clearTimeout"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/api/ssh_keys.ts:listSSHKeys","kind":"calls","metadata":{"unresolvedName":"listSSHKeys"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:","to":"symbol-name:setSshKeys","kind":"calls","metadata":{"unresolvedName":"setSshKeys"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:","to":"symbol-name:loadKeys","kind":"calls","metadata":{"unresolvedName":"loadKeys"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:loadKeys","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:loadKeys","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:loadKeys","to":"/home/alex/projects/headquarter/apps/web/src/api/ssh_keys.ts:listSSHKeys","kind":"calls","metadata":{"unresolvedName":"listSSHKeys"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:loadKeys","to":"symbol-name:setSshKeys","kind":"calls","metadata":{"unresolvedName":"setSshKeys"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:","to":"symbol-name:setUrlValidation","kind":"calls","metadata":{"unresolvedName":"setUrlValidation"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:","to":"symbol-name:clearTimeout","kind":"calls","metadata":{"unresolvedName":"clearTimeout"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:","to":"external:advancedUrl.trim","kind":"calls","metadata":{"unresolvedName":"advancedUrl.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:","to":"symbol-name:setTimeout","kind":"calls","metadata":{"unresolvedName":"setTimeout"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:parseGitUrl","kind":"calls","metadata":{"unresolvedName":"parseGitUrl"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:parseGitUrl","kind":"calls","metadata":{"unresolvedName":"parseGitUrl"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:","to":"external:advancedUrl.trim","kind":"calls","metadata":{"unresolvedName":"advancedUrl.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:","to":"symbol-name:setUrlValidation","kind":"calls","metadata":{"unresolvedName":"setUrlValidation"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:","to":"symbol-name:clearTimeout","kind":"calls","metadata":{"unresolvedName":"clearTimeout"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:resetForm","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:resetForm","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:resetForm","to":"symbol-name:setCreateMode","kind":"calls","metadata":{"unresolvedName":"setCreateMode"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:resetForm","to":"symbol-name:setFormName","kind":"calls","metadata":{"unresolvedName":"setFormName"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:resetForm","to":"symbol-name:setOwner","kind":"calls","metadata":{"unresolvedName":"setOwner"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:resetForm","to":"symbol-name:setRepoName","kind":"calls","metadata":{"unresolvedName":"setRepoName"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:resetForm","to":"symbol-name:setAdvancedUrl","kind":"calls","metadata":{"unresolvedName":"setAdvancedUrl"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:resetForm","to":"symbol-name:setUseAdvancedUrl","kind":"calls","metadata":{"unresolvedName":"setUseAdvancedUrl"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:resetForm","to":"symbol-name:setFormError","kind":"calls","metadata":{"unresolvedName":"setFormError"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:resetForm","to":"symbol-name:setUrlValidation","kind":"calls","metadata":{"unresolvedName":"setUrlValidation"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:resetForm","to":"symbol-name:setSelectedSshKey","kind":"calls","metadata":{"unresolvedName":"setSelectedSshKey"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:handleClose","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:handleClose","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:handleClose","to":"symbol-name:resetForm","kind":"calls","metadata":{"unresolvedName":"resetForm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:handleClose","to":"symbol-name:onClose","kind":"calls","metadata":{"unresolvedName":"onClose"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:handleSubmit","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:handleSubmit","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:handleSubmit","to":"external:event.preventDefault","kind":"calls","metadata":{"unresolvedName":"event.preventDefault"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:handleSubmit","to":"symbol-name:setFormError","kind":"calls","metadata":{"unresolvedName":"setFormError"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:handleSubmit","to":"external:formName.trim","kind":"calls","metadata":{"unresolvedName":"formName.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:handleSubmit","to":"external:advancedUrl.trim","kind":"calls","metadata":{"unresolvedName":"advancedUrl.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:handleSubmit","to":"external:owner.trim","kind":"calls","metadata":{"unresolvedName":"owner.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:handleSubmit","to":"external:repoName.trim","kind":"calls","metadata":{"unresolvedName":"repoName.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:handleSubmit","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:createRepository","kind":"calls","metadata":{"unresolvedName":"createRepository"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:handleSubmit","to":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:handleClose","kind":"calls","metadata":{"unresolvedName":"handleClose"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:handleSubmit","to":"symbol-name:onCreated","kind":"calls","metadata":{"unresolvedName":"onCreated"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:handleUseSuggestedUrl","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:handleUseSuggestedUrl","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:handleUseSuggestedUrl","to":"symbol-name:setAdvancedUrl","kind":"calls","metadata":{"unresolvedName":"setAdvancedUrl"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:handleUseSuggestedUrl","to":"symbol-name:setUrlValidation","kind":"calls","metadata":{"unresolvedName":"setUrlValidation"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:handleUseSuggestedUrl","to":"symbol-name:setFormError","kind":"calls","metadata":{"unresolvedName":"setFormError"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:getUrlInputClass","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx:getUrlInputClass","kind":"defines"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/session-card.tsx","to":"external:react","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/session-card.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/api/sessions.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/session-card.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/icon.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/session-card.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-mobile-viewport.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/session-card.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-action-sheet.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/session-card.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/icon.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/session-card.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/session-card.tsx:SessionCard","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/session-card.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/session-card.tsx:SessionCard","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/session-card.tsx:SessionCard","to":"symbol-name:useState","kind":"calls","metadata":{"unresolvedName":"useState"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/session-card.tsx:SessionCard","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-mobile-viewport.ts:useMobileViewport","kind":"calls","metadata":{"unresolvedName":"useMobileViewport"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/session-card.tsx:SessionCard","to":"external:session.tool_type_interfaces?.includes","kind":"calls","metadata":{"unresolvedName":"session.tool_type_interfaces?.includes"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/session-card.tsx:SessionCard","to":"symbol-name:setShowStopConfirm","kind":"calls","metadata":{"unresolvedName":"setShowStopConfirm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/session-card.tsx:SessionCard","to":"symbol-name:onStop","kind":"calls","metadata":{"unresolvedName":"onStop"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/session-card.tsx:SessionCard","to":"symbol-name:setShowDeleteConfirm","kind":"calls","metadata":{"unresolvedName":"setShowDeleteConfirm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/session-card.tsx:SessionCard","to":"symbol-name:onDelete","kind":"calls","metadata":{"unresolvedName":"onDelete"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/session-card.tsx:SessionCard","to":"external:[\"running\", \"building\", \"starting\", \"probing\", \"pending\", \"unhealthy\"].includes","kind":"calls","metadata":{"unresolvedName":"[\"running\", \"building\", \"starting\", \"probing\", \"pending\", \"unhealthy\"].includes"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/session-card.tsx:SessionCard","to":"external:new Date(session.created_at).toLocaleString","kind":"calls","metadata":{"unresolvedName":"new Date(session.created_at).toLocaleString"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/session-card.tsx:SessionCard","to":"symbol-name:onOpen","kind":"calls","metadata":{"unresolvedName":"onOpen"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/session-card.tsx:SessionCard","to":"symbol-name:setShowActionSheet","kind":"calls","metadata":{"unresolvedName":"setShowActionSheet"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/session-card.tsx:SessionCard","to":"symbol-name:onStart","kind":"calls","metadata":{"unresolvedName":"onStart"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/session-card.tsx:SessionCard","to":"symbol-name:onRecreateTunnel","kind":"calls","metadata":{"unresolvedName":"onRecreateTunnel"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/session-card.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/session-card.tsx:handleStop","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/session-card.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/session-card.tsx:handleStop","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/session-card.tsx:handleStop","to":"symbol-name:setShowStopConfirm","kind":"calls","metadata":{"unresolvedName":"setShowStopConfirm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/session-card.tsx:handleStop","to":"symbol-name:onStop","kind":"calls","metadata":{"unresolvedName":"onStop"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/session-card.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/session-card.tsx:handleDelete","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/session-card.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/session-card.tsx:handleDelete","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/session-card.tsx:handleDelete","to":"symbol-name:setShowDeleteConfirm","kind":"calls","metadata":{"unresolvedName":"setShowDeleteConfirm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/session-card.tsx:handleDelete","to":"symbol-name:onDelete","kind":"calls","metadata":{"unresolvedName":"onDelete"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/session-list.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/api/sessions.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/session-list.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/session-card.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/session-list.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/api/sessions.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/session-list.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/session-list.tsx:SessionList","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/session-list.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/session-list.tsx:SessionList","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/session-list.tsx:SessionList","to":"external:sessions.filter","kind":"calls","metadata":{"unresolvedName":"sessions.filter"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/session-list.tsx:SessionList","to":"external:activeStatuses.includes","kind":"calls","metadata":{"unresolvedName":"activeStatuses.includes"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/session-list.tsx:SessionList","to":"external:sessions\n .filter((s) => recentStatuses.includes(s.status))\n .slice","kind":"calls","metadata":{"unresolvedName":"sessions\n .filter((s) => recentStatuses.includes(s.status))\n .slice"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/session-list.tsx:SessionList","to":"external:sessions\n .filter","kind":"calls","metadata":{"unresolvedName":"sessions\n .filter"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/session-list.tsx:SessionList","to":"external:recentStatuses.includes","kind":"calls","metadata":{"unresolvedName":"recentStatuses.includes"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/session-list.tsx:SessionList","to":"external:sessions.map","kind":"calls","metadata":{"unresolvedName":"sessions.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/session-list.tsx:SessionList","to":"external:activeSessions.map","kind":"calls","metadata":{"unresolvedName":"activeSessions.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/session-list.tsx:SessionList","to":"external:recentSessions.map","kind":"calls","metadata":{"unresolvedName":"recentSessions.map"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/settings-tab-layout.tsx","to":"external:react","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/settings-tab-layout.tsx","to":"external:react-router-dom","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/settings-tab-layout.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/settings-tab-layout.tsx:SettingsTabLayout","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/settings-tab-layout.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/settings-tab-layout.tsx:SettingsTabLayout","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/settings-tab-layout.tsx:SettingsTabLayout","to":"symbol-name:useLocation","kind":"calls","metadata":{"unresolvedName":"useLocation"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/settings-tab-layout.tsx:SettingsTabLayout","to":"external:tabs.map","kind":"calls","metadata":{"unresolvedName":"tabs.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/settings-tab-layout.tsx:SettingsTabLayout","to":"external:location.pathname.includes","kind":"calls","metadata":{"unresolvedName":"location.pathname.includes"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx","to":"external:react","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-special-keys.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx:SpecialKeysPanel","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx:SpecialKeysPanel","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx:SpecialKeysPanel","to":"external:e.preventDefault","kind":"calls","metadata":{"unresolvedName":"e.preventDefault"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx:SpecialKeysPanel","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-special-keys.ts:getSequenceWithModifier","kind":"calls","metadata":{"unresolvedName":"getSequenceWithModifier"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx:SpecialKeysPanel","to":"symbol-name:onSend","kind":"calls","metadata":{"unresolvedName":"onSend"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx:SpecialKeysPanel","to":"symbol-name:onModifierChange","kind":"calls","metadata":{"unresolvedName":"onModifierChange"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx:SpecialKeysPanel","to":"symbol-name:onClose","kind":"calls","metadata":{"unresolvedName":"onClose"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx:SpecialKeysPanel","to":"symbol-name:requestAnimationFrame","kind":"calls","metadata":{"unresolvedName":"requestAnimationFrame"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx:SpecialKeysPanel","to":"symbol-name:onKeepFocus","kind":"calls","metadata":{"unresolvedName":"onKeepFocus"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx:SpecialKeysPanel","to":"external:e.stopPropagation","kind":"calls","metadata":{"unresolvedName":"e.stopPropagation"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx:SpecialKeysPanel","to":"external:EXPANDED_KEYS.map","kind":"calls","metadata":{"unresolvedName":"EXPANDED_KEYS.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx:SpecialKeysPanel","to":"symbol-name:handlePointerDown","kind":"calls","metadata":{"unresolvedName":"handlePointerDown"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx:SpecialKeysPanel","to":"external:F_KEYS.map","kind":"calls","metadata":{"unresolvedName":"F_KEYS.map"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx:handlePointerDown","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx:handlePointerDown","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx:handlePointerDown","to":"external:e.preventDefault","kind":"calls","metadata":{"unresolvedName":"e.preventDefault"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx:handlePointerDown","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-special-keys.ts:getSequenceWithModifier","kind":"calls","metadata":{"unresolvedName":"getSequenceWithModifier"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx:handlePointerDown","to":"symbol-name:onSend","kind":"calls","metadata":{"unresolvedName":"onSend"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx:handlePointerDown","to":"symbol-name:onModifierChange","kind":"calls","metadata":{"unresolvedName":"onModifierChange"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx:handlePointerDown","to":"symbol-name:onClose","kind":"calls","metadata":{"unresolvedName":"onClose"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx:handlePointerDown","to":"symbol-name:requestAnimationFrame","kind":"calls","metadata":{"unresolvedName":"requestAnimationFrame"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx:handlePointerDown","to":"symbol-name:onKeepFocus","kind":"calls","metadata":{"unresolvedName":"onKeepFocus"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx:","to":"symbol-name:onKeepFocus","kind":"calls","metadata":{"unresolvedName":"onKeepFocus"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx:handleOverlayPointerDown","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx:handleOverlayPointerDown","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx:handleOverlayPointerDown","to":"external:e.preventDefault","kind":"calls","metadata":{"unresolvedName":"e.preventDefault"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx:handleOverlayPointerDown","to":"symbol-name:onModifierChange","kind":"calls","metadata":{"unresolvedName":"onModifierChange"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx:handleOverlayPointerDown","to":"symbol-name:onClose","kind":"calls","metadata":{"unresolvedName":"onClose"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx:handleOverlayPointerDown","to":"symbol-name:requestAnimationFrame","kind":"calls","metadata":{"unresolvedName":"requestAnimationFrame"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx:handleOverlayPointerDown","to":"symbol-name:onKeepFocus","kind":"calls","metadata":{"unresolvedName":"onKeepFocus"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-panel.tsx:","to":"symbol-name:onKeepFocus","kind":"calls","metadata":{"unresolvedName":"onKeepFocus"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx","to":"external:react","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-special-keys.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx:SpecialKeysStrip","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx:SpecialKeysStrip","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx:SpecialKeysStrip","to":"external:e.preventDefault","kind":"calls","metadata":{"unresolvedName":"e.preventDefault"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx:SpecialKeysStrip","to":"symbol-name:onModifierChange","kind":"calls","metadata":{"unresolvedName":"onModifierChange"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx:SpecialKeysStrip","to":"symbol-name:requestAnimationFrame","kind":"calls","metadata":{"unresolvedName":"requestAnimationFrame"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx:SpecialKeysStrip","to":"symbol-name:onKeepFocus","kind":"calls","metadata":{"unresolvedName":"onKeepFocus"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx:SpecialKeysStrip","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-special-keys.ts:getSequenceWithModifier","kind":"calls","metadata":{"unresolvedName":"getSequenceWithModifier"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx:SpecialKeysStrip","to":"symbol-name:onSend","kind":"calls","metadata":{"unresolvedName":"onSend"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx:SpecialKeysStrip","to":"symbol-name:onMoreClick","kind":"calls","metadata":{"unresolvedName":"onMoreClick"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx:SpecialKeysStrip","to":"external:PRIMARY_KEYS.map","kind":"calls","metadata":{"unresolvedName":"PRIMARY_KEYS.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx:SpecialKeysStrip","to":"symbol-name:handlePointerDown","kind":"calls","metadata":{"unresolvedName":"handlePointerDown"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx:handlePointerDown","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx:handlePointerDown","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx:handlePointerDown","to":"external:e.preventDefault","kind":"calls","metadata":{"unresolvedName":"e.preventDefault"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx:handlePointerDown","to":"symbol-name:onModifierChange","kind":"calls","metadata":{"unresolvedName":"onModifierChange"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx:handlePointerDown","to":"symbol-name:requestAnimationFrame","kind":"calls","metadata":{"unresolvedName":"requestAnimationFrame"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx:handlePointerDown","to":"symbol-name:onKeepFocus","kind":"calls","metadata":{"unresolvedName":"onKeepFocus"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx:handlePointerDown","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-special-keys.ts:getSequenceWithModifier","kind":"calls","metadata":{"unresolvedName":"getSequenceWithModifier"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx:handlePointerDown","to":"symbol-name:onSend","kind":"calls","metadata":{"unresolvedName":"onSend"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx:","to":"symbol-name:onKeepFocus","kind":"calls","metadata":{"unresolvedName":"onKeepFocus"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx:","to":"symbol-name:onKeepFocus","kind":"calls","metadata":{"unresolvedName":"onKeepFocus"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx:handleMorePointerDown","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx:handleMorePointerDown","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx:handleMorePointerDown","to":"external:e.preventDefault","kind":"calls","metadata":{"unresolvedName":"e.preventDefault"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx:handleMorePointerDown","to":"symbol-name:onMoreClick","kind":"calls","metadata":{"unresolvedName":"onMoreClick"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx:handleMorePointerDown","to":"symbol-name:requestAnimationFrame","kind":"calls","metadata":{"unresolvedName":"requestAnimationFrame"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx:handleMorePointerDown","to":"symbol-name:onKeepFocus","kind":"calls","metadata":{"unresolvedName":"onKeepFocus"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/special-keys-strip.tsx:","to":"symbol-name:onKeepFocus","kind":"calls","metadata":{"unresolvedName":"onKeepFocus"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/syntax-highlighter.tsx","to":"external:react","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/syntax-highlighter.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/icon.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/syntax-highlighter.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/utils/language.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/syntax-highlighter.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/syntax-highlighter.tsx:SyntaxHighlighter","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/syntax-highlighter.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/syntax-highlighter.tsx:SyntaxHighlighter","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/syntax-highlighter.tsx:SyntaxHighlighter","to":"symbol-name:useState","kind":"calls","metadata":{"unresolvedName":"useState"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/syntax-highlighter.tsx:SyntaxHighlighter","to":"symbol-name:useEffect","kind":"calls","metadata":{"unresolvedName":"useEffect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/syntax-highlighter.tsx:SyntaxHighlighter","to":"/home/alex/projects/headquarter/apps/web/src/utils/language.ts:loadLanguage","kind":"calls","metadata":{"unresolvedName":"loadLanguage"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/syntax-highlighter.tsx:SyntaxHighlighter","to":"symbol-name:setHighlighted","kind":"calls","metadata":{"unresolvedName":"setHighlighted"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/syntax-highlighter.tsx:SyntaxHighlighter","to":"/home/alex/projects/headquarter/apps/web/src/utils/language.ts:highlightCode","kind":"calls","metadata":{"unresolvedName":"highlightCode"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/syntax-highlighter.tsx:SyntaxHighlighter","to":"symbol-name:highlight","kind":"calls","metadata":{"unresolvedName":"highlight"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/syntax-highlighter.tsx:SyntaxHighlighter","to":"external:navigator.clipboard.writeText","kind":"calls","metadata":{"unresolvedName":"navigator.clipboard.writeText"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/syntax-highlighter.tsx:SyntaxHighlighter","to":"symbol-name:setCopied","kind":"calls","metadata":{"unresolvedName":"setCopied"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/syntax-highlighter.tsx:SyntaxHighlighter","to":"symbol-name:setTimeout","kind":"calls","metadata":{"unresolvedName":"setTimeout"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/syntax-highlighter.tsx:SyntaxHighlighter","to":"external:code.split","kind":"calls","metadata":{"unresolvedName":"code.split"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/syntax-highlighter.tsx:SyntaxHighlighter","to":"external:lines.map","kind":"calls","metadata":{"unresolvedName":"lines.map"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/syntax-highlighter.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/syntax-highlighter.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/syntax-highlighter.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/syntax-highlighter.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/syntax-highlighter.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/utils/language.ts:loadLanguage","kind":"calls","metadata":{"unresolvedName":"loadLanguage"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/syntax-highlighter.tsx:","to":"symbol-name:setHighlighted","kind":"calls","metadata":{"unresolvedName":"setHighlighted"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/syntax-highlighter.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/utils/language.ts:highlightCode","kind":"calls","metadata":{"unresolvedName":"highlightCode"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/syntax-highlighter.tsx:","to":"symbol-name:highlight","kind":"calls","metadata":{"unresolvedName":"highlight"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/syntax-highlighter.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/syntax-highlighter.tsx:highlight","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/syntax-highlighter.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/syntax-highlighter.tsx:highlight","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/syntax-highlighter.tsx:highlight","to":"/home/alex/projects/headquarter/apps/web/src/utils/language.ts:loadLanguage","kind":"calls","metadata":{"unresolvedName":"loadLanguage"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/syntax-highlighter.tsx:highlight","to":"symbol-name:setHighlighted","kind":"calls","metadata":{"unresolvedName":"setHighlighted"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/syntax-highlighter.tsx:highlight","to":"/home/alex/projects/headquarter/apps/web/src/utils/language.ts:highlightCode","kind":"calls","metadata":{"unresolvedName":"highlightCode"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/syntax-highlighter.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/syntax-highlighter.tsx:handleCopy","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/syntax-highlighter.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/syntax-highlighter.tsx:handleCopy","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/syntax-highlighter.tsx:handleCopy","to":"external:navigator.clipboard.writeText","kind":"calls","metadata":{"unresolvedName":"navigator.clipboard.writeText"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/syntax-highlighter.tsx:handleCopy","to":"symbol-name:setCopied","kind":"calls","metadata":{"unresolvedName":"setCopied"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/syntax-highlighter.tsx:handleCopy","to":"symbol-name:setTimeout","kind":"calls","metadata":{"unresolvedName":"setTimeout"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"external:react","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"external:xterm","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"external:xterm-addon-fit","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"external:xterm-addon-web-links","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"external:xterm/css/xterm.css","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-special-keys.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"symbol-name:useRef","kind":"calls","metadata":{"unresolvedName":"useRef"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"symbol-name:useState","kind":"calls","metadata":{"unresolvedName":"useState"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"external:localStorage.getItem","kind":"calls","metadata":{"unresolvedName":"localStorage.getItem"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"symbol-name:parseInt","kind":"calls","metadata":{"unresolvedName":"parseInt"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"external:Math.max","kind":"calls","metadata":{"unresolvedName":"Math.max"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"external:Math.min","kind":"calls","metadata":{"unresolvedName":"Math.min"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"symbol-name:useCallback","kind":"calls","metadata":{"unresolvedName":"useCallback"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"external:apiUrl.replace(/^https?:\\/\\//, \"\").replace","kind":"calls","metadata":{"unresolvedName":"apiUrl.replace(/^https?:\\/\\//, \"\").replace"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"external:apiUrl.replace","kind":"calls","metadata":{"unresolvedName":"apiUrl.replace"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"symbol-name:setStatus","kind":"calls","metadata":{"unresolvedName":"setStatus"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"symbol-name:setError","kind":"calls","metadata":{"unresolvedName":"setError"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"external:Date.now","kind":"calls","metadata":{"unresolvedName":"Date.now"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"external:ws.send","kind":"calls","metadata":{"unresolvedName":"ws.send"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"external:JSON.stringify","kind":"calls","metadata":{"unresolvedName":"JSON.stringify"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"external:window.clearInterval","kind":"calls","metadata":{"unresolvedName":"window.clearInterval"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"external:window.setInterval","kind":"calls","metadata":{"unresolvedName":"window.setInterval"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"external:ws.close","kind":"calls","metadata":{"unresolvedName":"ws.close"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"external:event.data.arrayBuffer().then","kind":"calls","metadata":{"unresolvedName":"event.data.arrayBuffer().then"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"external:event.data.arrayBuffer","kind":"calls","metadata":{"unresolvedName":"event.data.arrayBuffer"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"external:termRef.current?.write","kind":"calls","metadata":{"unresolvedName":"termRef.current?.write"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"external:JSON.parse","kind":"calls","metadata":{"unresolvedName":"JSON.parse"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"external:termRef.current.clear","kind":"calls","metadata":{"unresolvedName":"termRef.current.clear"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"symbol-name:requestAnimationFrame","kind":"calls","metadata":{"unresolvedName":"requestAnimationFrame"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"external:fitAddonRef.current.fit","kind":"calls","metadata":{"unresolvedName":"fitAddonRef.current.fit"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"external:currentWs.send","kind":"calls","metadata":{"unresolvedName":"currentWs.send"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"external:Math.pow","kind":"calls","metadata":{"unresolvedName":"Math.pow"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"symbol-name:setTimeout","kind":"calls","metadata":{"unresolvedName":"setTimeout"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"symbol-name:connectWebSocket","kind":"calls","metadata":{"unresolvedName":"connectWebSocket"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"symbol-name:useEffect","kind":"calls","metadata":{"unresolvedName":"useEffect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"symbol-name:calculateFontSize","kind":"calls","metadata":{"unresolvedName":"calculateFontSize"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"external:term.loadAddon","kind":"calls","metadata":{"unresolvedName":"term.loadAddon"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"external:termRef.current.refresh","kind":"calls","metadata":{"unresolvedName":"termRef.current.refresh"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"external:term.open","kind":"calls","metadata":{"unresolvedName":"term.open"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:fitTerminal","kind":"calls","metadata":{"unresolvedName":"fitTerminal"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"external:document.fonts.ready.then","kind":"calls","metadata":{"unresolvedName":"document.fonts.ready.then"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"external:term.onData","kind":"calls","metadata":{"unresolvedName":"term.onData"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-special-keys.ts:applyModifierToChar","kind":"calls","metadata":{"unresolvedName":"applyModifierToChar"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"symbol-name:onModifierChange","kind":"calls","metadata":{"unresolvedName":"onModifierChange"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"symbol-name:clearTimeout","kind":"calls","metadata":{"unresolvedName":"clearTimeout"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"external:resizeObserver.observe","kind":"calls","metadata":{"unresolvedName":"resizeObserver.observe"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"external:window.addEventListener","kind":"calls","metadata":{"unresolvedName":"window.addEventListener"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"external:termRef.current?.focus","kind":"calls","metadata":{"unresolvedName":"termRef.current?.focus"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"external:handleFontSizeChangeRef.current","kind":"calls","metadata":{"unresolvedName":"handleFontSizeChangeRef.current"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"external:onTerminalReadyRef.current","kind":"calls","metadata":{"unresolvedName":"onTerminalReadyRef.current"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"external:document.addEventListener","kind":"calls","metadata":{"unresolvedName":"document.addEventListener"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"external:resizeObserver.disconnect","kind":"calls","metadata":{"unresolvedName":"resizeObserver.disconnect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"external:window.removeEventListener","kind":"calls","metadata":{"unresolvedName":"window.removeEventListener"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"external:document.removeEventListener","kind":"calls","metadata":{"unresolvedName":"document.removeEventListener"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"external:term.dispose","kind":"calls","metadata":{"unresolvedName":"term.dispose"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"external:wsRef.current.send","kind":"calls","metadata":{"unresolvedName":"wsRef.current.send"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"symbol-name:onTerminalReady","kind":"calls","metadata":{"unresolvedName":"onTerminalReady"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"symbol-name:setFontSize","kind":"calls","metadata":{"unresolvedName":"setFontSize"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"external:localStorage.setItem","kind":"calls","metadata":{"unresolvedName":"localStorage.setItem"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"external:newSize.toString","kind":"calls","metadata":{"unresolvedName":"newSize.toString"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"external:termRef.current.getSelection","kind":"calls","metadata":{"unresolvedName":"termRef.current.getSelection"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"external:navigator.clipboard.writeText","kind":"calls","metadata":{"unresolvedName":"navigator.clipboard.writeText"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"external:document.createElement","kind":"calls","metadata":{"unresolvedName":"document.createElement"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"external:document.body.appendChild","kind":"calls","metadata":{"unresolvedName":"document.body.appendChild"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"external:textarea.select","kind":"calls","metadata":{"unresolvedName":"textarea.select"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"external:document.execCommand","kind":"calls","metadata":{"unresolvedName":"document.execCommand"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"external:document.body.removeChild","kind":"calls","metadata":{"unresolvedName":"document.body.removeChild"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"external:navigator.clipboard.readText","kind":"calls","metadata":{"unresolvedName":"navigator.clipboard.readText"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"external:termRef.current.focus","kind":"calls","metadata":{"unresolvedName":"termRef.current.focus"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:handleFontSizeChange","kind":"calls","metadata":{"unresolvedName":"handleFontSizeChange"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:TerminalComponent","to":"symbol-name:setShowResetConfirm","kind":"calls","metadata":{"unresolvedName":"setShowResetConfirm"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","kind":"defines"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:localStorage.getItem","kind":"calls","metadata":{"unresolvedName":"localStorage.getItem"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"symbol-name:parseInt","kind":"calls","metadata":{"unresolvedName":"parseInt"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:Math.max","kind":"calls","metadata":{"unresolvedName":"Math.max"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:Math.min","kind":"calls","metadata":{"unresolvedName":"Math.min"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","kind":"defines"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:apiUrl.replace(/^https?:\\/\\//, \"\").replace","kind":"calls","metadata":{"unresolvedName":"apiUrl.replace(/^https?:\\/\\//, \"\").replace"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:apiUrl.replace","kind":"calls","metadata":{"unresolvedName":"apiUrl.replace"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"symbol-name:setStatus","kind":"calls","metadata":{"unresolvedName":"setStatus"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"symbol-name:setError","kind":"calls","metadata":{"unresolvedName":"setError"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:Date.now","kind":"calls","metadata":{"unresolvedName":"Date.now"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:ws.send","kind":"calls","metadata":{"unresolvedName":"ws.send"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:JSON.stringify","kind":"calls","metadata":{"unresolvedName":"JSON.stringify"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:window.clearInterval","kind":"calls","metadata":{"unresolvedName":"window.clearInterval"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:window.setInterval","kind":"calls","metadata":{"unresolvedName":"window.setInterval"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:ws.close","kind":"calls","metadata":{"unresolvedName":"ws.close"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:event.data.arrayBuffer().then","kind":"calls","metadata":{"unresolvedName":"event.data.arrayBuffer().then"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:event.data.arrayBuffer","kind":"calls","metadata":{"unresolvedName":"event.data.arrayBuffer"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:termRef.current?.write","kind":"calls","metadata":{"unresolvedName":"termRef.current?.write"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:JSON.parse","kind":"calls","metadata":{"unresolvedName":"JSON.parse"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:termRef.current.clear","kind":"calls","metadata":{"unresolvedName":"termRef.current.clear"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"symbol-name:requestAnimationFrame","kind":"calls","metadata":{"unresolvedName":"requestAnimationFrame"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:fitAddonRef.current.fit","kind":"calls","metadata":{"unresolvedName":"fitAddonRef.current.fit"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:currentWs.send","kind":"calls","metadata":{"unresolvedName":"currentWs.send"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:Math.pow","kind":"calls","metadata":{"unresolvedName":"Math.pow"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"symbol-name:setTimeout","kind":"calls","metadata":{"unresolvedName":"setTimeout"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"symbol-name:connectWebSocket","kind":"calls","metadata":{"unresolvedName":"connectWebSocket"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"symbol-name:setStatus","kind":"calls","metadata":{"unresolvedName":"setStatus"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"symbol-name:setError","kind":"calls","metadata":{"unresolvedName":"setError"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:Date.now","kind":"calls","metadata":{"unresolvedName":"Date.now"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:ws.send","kind":"calls","metadata":{"unresolvedName":"ws.send"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:JSON.stringify","kind":"calls","metadata":{"unresolvedName":"JSON.stringify"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:window.clearInterval","kind":"calls","metadata":{"unresolvedName":"window.clearInterval"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:window.setInterval","kind":"calls","metadata":{"unresolvedName":"window.setInterval"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:ws.close","kind":"calls","metadata":{"unresolvedName":"ws.close"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:Date.now","kind":"calls","metadata":{"unresolvedName":"Date.now"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:ws.close","kind":"calls","metadata":{"unresolvedName":"ws.close"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:event.data.arrayBuffer().then","kind":"calls","metadata":{"unresolvedName":"event.data.arrayBuffer().then"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:event.data.arrayBuffer","kind":"calls","metadata":{"unresolvedName":"event.data.arrayBuffer"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:termRef.current?.write","kind":"calls","metadata":{"unresolvedName":"termRef.current?.write"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:JSON.parse","kind":"calls","metadata":{"unresolvedName":"JSON.parse"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"symbol-name:setStatus","kind":"calls","metadata":{"unresolvedName":"setStatus"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"symbol-name:setError","kind":"calls","metadata":{"unresolvedName":"setError"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:termRef.current.clear","kind":"calls","metadata":{"unresolvedName":"termRef.current.clear"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"symbol-name:requestAnimationFrame","kind":"calls","metadata":{"unresolvedName":"requestAnimationFrame"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:fitAddonRef.current.fit","kind":"calls","metadata":{"unresolvedName":"fitAddonRef.current.fit"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:currentWs.send","kind":"calls","metadata":{"unresolvedName":"currentWs.send"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:JSON.stringify","kind":"calls","metadata":{"unresolvedName":"JSON.stringify"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:Date.now","kind":"calls","metadata":{"unresolvedName":"Date.now"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:ws.send","kind":"calls","metadata":{"unresolvedName":"ws.send"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:termRef.current?.write","kind":"calls","metadata":{"unresolvedName":"termRef.current?.write"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:fitAddonRef.current.fit","kind":"calls","metadata":{"unresolvedName":"fitAddonRef.current.fit"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:currentWs.send","kind":"calls","metadata":{"unresolvedName":"currentWs.send"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:JSON.stringify","kind":"calls","metadata":{"unresolvedName":"JSON.stringify"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:window.clearInterval","kind":"calls","metadata":{"unresolvedName":"window.clearInterval"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"symbol-name:setStatus","kind":"calls","metadata":{"unresolvedName":"setStatus"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"symbol-name:setError","kind":"calls","metadata":{"unresolvedName":"setError"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:Math.pow","kind":"calls","metadata":{"unresolvedName":"Math.pow"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"symbol-name:setTimeout","kind":"calls","metadata":{"unresolvedName":"setTimeout"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"symbol-name:connectWebSocket","kind":"calls","metadata":{"unresolvedName":"connectWebSocket"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"symbol-name:connectWebSocket","kind":"calls","metadata":{"unresolvedName":"connectWebSocket"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"symbol-name:setStatus","kind":"calls","metadata":{"unresolvedName":"setStatus"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"symbol-name:setError","kind":"calls","metadata":{"unresolvedName":"setError"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"symbol-name:calculateFontSize","kind":"calls","metadata":{"unresolvedName":"calculateFontSize"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:term.loadAddon","kind":"calls","metadata":{"unresolvedName":"term.loadAddon"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:fitAddonRef.current.fit","kind":"calls","metadata":{"unresolvedName":"fitAddonRef.current.fit"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:termRef.current.refresh","kind":"calls","metadata":{"unresolvedName":"termRef.current.refresh"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:currentWs.send","kind":"calls","metadata":{"unresolvedName":"currentWs.send"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:JSON.stringify","kind":"calls","metadata":{"unresolvedName":"JSON.stringify"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:term.open","kind":"calls","metadata":{"unresolvedName":"term.open"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"symbol-name:connectWebSocket","kind":"calls","metadata":{"unresolvedName":"connectWebSocket"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:fitTerminal","kind":"calls","metadata":{"unresolvedName":"fitTerminal"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"symbol-name:requestAnimationFrame","kind":"calls","metadata":{"unresolvedName":"requestAnimationFrame"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:document.fonts.ready.then","kind":"calls","metadata":{"unresolvedName":"document.fonts.ready.then"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:term.onData","kind":"calls","metadata":{"unresolvedName":"term.onData"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-special-keys.ts:applyModifierToChar","kind":"calls","metadata":{"unresolvedName":"applyModifierToChar"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"symbol-name:onModifierChange","kind":"calls","metadata":{"unresolvedName":"onModifierChange"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"symbol-name:clearTimeout","kind":"calls","metadata":{"unresolvedName":"clearTimeout"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"symbol-name:setTimeout","kind":"calls","metadata":{"unresolvedName":"setTimeout"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:resizeObserver.observe","kind":"calls","metadata":{"unresolvedName":"resizeObserver.observe"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:window.addEventListener","kind":"calls","metadata":{"unresolvedName":"window.addEventListener"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:termRef.current?.focus","kind":"calls","metadata":{"unresolvedName":"termRef.current?.focus"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:handleFontSizeChangeRef.current","kind":"calls","metadata":{"unresolvedName":"handleFontSizeChangeRef.current"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:onTerminalReadyRef.current","kind":"calls","metadata":{"unresolvedName":"onTerminalReadyRef.current"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:document.addEventListener","kind":"calls","metadata":{"unresolvedName":"document.addEventListener"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:resizeObserver.disconnect","kind":"calls","metadata":{"unresolvedName":"resizeObserver.disconnect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:window.removeEventListener","kind":"calls","metadata":{"unresolvedName":"window.removeEventListener"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:document.removeEventListener","kind":"calls","metadata":{"unresolvedName":"document.removeEventListener"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:ws.close","kind":"calls","metadata":{"unresolvedName":"ws.close"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:window.clearInterval","kind":"calls","metadata":{"unresolvedName":"window.clearInterval"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:term.dispose","kind":"calls","metadata":{"unresolvedName":"term.dispose"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:fitTerminal","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:fitTerminal","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:fitTerminal","to":"external:fitAddonRef.current.fit","kind":"calls","metadata":{"unresolvedName":"fitAddonRef.current.fit"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:fitTerminal","to":"external:termRef.current.refresh","kind":"calls","metadata":{"unresolvedName":"termRef.current.refresh"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:fitTerminal","to":"external:currentWs.send","kind":"calls","metadata":{"unresolvedName":"currentWs.send"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:fitTerminal","to":"external:JSON.stringify","kind":"calls","metadata":{"unresolvedName":"JSON.stringify"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:doInitialFit","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:doInitialFit","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:doInitialFit","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:fitTerminal","kind":"calls","metadata":{"unresolvedName":"fitTerminal"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:doInitialFit","to":"symbol-name:requestAnimationFrame","kind":"calls","metadata":{"unresolvedName":"requestAnimationFrame"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"symbol-name:requestAnimationFrame","kind":"calls","metadata":{"unresolvedName":"requestAnimationFrame"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:fitTerminal","kind":"calls","metadata":{"unresolvedName":"fitTerminal"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-special-keys.ts:applyModifierToChar","kind":"calls","metadata":{"unresolvedName":"applyModifierToChar"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:currentWs.send","kind":"calls","metadata":{"unresolvedName":"currentWs.send"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"symbol-name:onModifierChange","kind":"calls","metadata":{"unresolvedName":"onModifierChange"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"symbol-name:clearTimeout","kind":"calls","metadata":{"unresolvedName":"clearTimeout"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"symbol-name:setTimeout","kind":"calls","metadata":{"unresolvedName":"setTimeout"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"symbol-name:requestAnimationFrame","kind":"calls","metadata":{"unresolvedName":"requestAnimationFrame"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:fitTerminal","kind":"calls","metadata":{"unresolvedName":"fitTerminal"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"symbol-name:requestAnimationFrame","kind":"calls","metadata":{"unresolvedName":"requestAnimationFrame"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:fitTerminal","kind":"calls","metadata":{"unresolvedName":"fitTerminal"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:fitTerminal","kind":"calls","metadata":{"unresolvedName":"fitTerminal"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:handleWindowResize","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:handleWindowResize","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:handleWindowResize","to":"symbol-name:clearTimeout","kind":"calls","metadata":{"unresolvedName":"clearTimeout"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:handleWindowResize","to":"symbol-name:setTimeout","kind":"calls","metadata":{"unresolvedName":"setTimeout"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:handleWindowResize","to":"symbol-name:requestAnimationFrame","kind":"calls","metadata":{"unresolvedName":"requestAnimationFrame"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:handleWindowResize","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:fitTerminal","kind":"calls","metadata":{"unresolvedName":"fitTerminal"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"symbol-name:requestAnimationFrame","kind":"calls","metadata":{"unresolvedName":"requestAnimationFrame"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:fitTerminal","kind":"calls","metadata":{"unresolvedName":"fitTerminal"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:fitTerminal","kind":"calls","metadata":{"unresolvedName":"fitTerminal"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:sendData","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:sendData","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:sendData","to":"external:currentWs.send","kind":"calls","metadata":{"unresolvedName":"currentWs.send"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:focusInput","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:focusInput","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:focusInput","to":"external:termRef.current?.focus","kind":"calls","metadata":{"unresolvedName":"termRef.current?.focus"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:changeFontSize","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:changeFontSize","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:changeFontSize","to":"external:handleFontSizeChangeRef.current","kind":"calls","metadata":{"unresolvedName":"handleFontSizeChangeRef.current"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:handleVisibilityChange","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:handleVisibilityChange","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:handleVisibilityChange","to":"symbol-name:connectWebSocket","kind":"calls","metadata":{"unresolvedName":"connectWebSocket"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"symbol-name:clearTimeout","kind":"calls","metadata":{"unresolvedName":"clearTimeout"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:resizeObserver.disconnect","kind":"calls","metadata":{"unresolvedName":"resizeObserver.disconnect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:window.removeEventListener","kind":"calls","metadata":{"unresolvedName":"window.removeEventListener"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:document.removeEventListener","kind":"calls","metadata":{"unresolvedName":"document.removeEventListener"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:ws.close","kind":"calls","metadata":{"unresolvedName":"ws.close"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:window.clearInterval","kind":"calls","metadata":{"unresolvedName":"window.clearInterval"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:term.dispose","kind":"calls","metadata":{"unresolvedName":"term.dispose"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:wsRef.current.send","kind":"calls","metadata":{"unresolvedName":"wsRef.current.send"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:termRef.current?.focus","kind":"calls","metadata":{"unresolvedName":"termRef.current?.focus"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:handleFontSizeChangeRef.current","kind":"calls","metadata":{"unresolvedName":"handleFontSizeChangeRef.current"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"symbol-name:onTerminalReady","kind":"calls","metadata":{"unresolvedName":"onTerminalReady"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:sendData","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:sendData","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:sendData","to":"external:wsRef.current.send","kind":"calls","metadata":{"unresolvedName":"wsRef.current.send"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:focusInput","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:focusInput","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:focusInput","to":"external:termRef.current?.focus","kind":"calls","metadata":{"unresolvedName":"termRef.current?.focus"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:changeFontSize","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:changeFontSize","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:changeFontSize","to":"external:handleFontSizeChangeRef.current","kind":"calls","metadata":{"unresolvedName":"handleFontSizeChangeRef.current"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:handleFontSizeChange","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:handleFontSizeChange","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:handleFontSizeChange","to":"external:Math.max","kind":"calls","metadata":{"unresolvedName":"Math.max"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:handleFontSizeChange","to":"external:Math.min","kind":"calls","metadata":{"unresolvedName":"Math.min"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:handleFontSizeChange","to":"symbol-name:setFontSize","kind":"calls","metadata":{"unresolvedName":"setFontSize"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:handleFontSizeChange","to":"external:localStorage.setItem","kind":"calls","metadata":{"unresolvedName":"localStorage.setItem"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:handleFontSizeChange","to":"external:newSize.toString","kind":"calls","metadata":{"unresolvedName":"newSize.toString"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:handleFontSizeChange","to":"symbol-name:requestAnimationFrame","kind":"calls","metadata":{"unresolvedName":"requestAnimationFrame"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:handleFontSizeChange","to":"external:fitAddonRef.current.fit","kind":"calls","metadata":{"unresolvedName":"fitAddonRef.current.fit"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:handleFontSizeChange","to":"external:wsRef.current.send","kind":"calls","metadata":{"unresolvedName":"wsRef.current.send"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:handleFontSizeChange","to":"external:JSON.stringify","kind":"calls","metadata":{"unresolvedName":"JSON.stringify"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:fitAddonRef.current.fit","kind":"calls","metadata":{"unresolvedName":"fitAddonRef.current.fit"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:wsRef.current.send","kind":"calls","metadata":{"unresolvedName":"wsRef.current.send"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:JSON.stringify","kind":"calls","metadata":{"unresolvedName":"JSON.stringify"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:handleCopy","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:handleCopy","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:handleCopy","to":"external:termRef.current.getSelection","kind":"calls","metadata":{"unresolvedName":"termRef.current.getSelection"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:handleCopy","to":"external:navigator.clipboard.writeText","kind":"calls","metadata":{"unresolvedName":"navigator.clipboard.writeText"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:handleCopy","to":"external:document.createElement","kind":"calls","metadata":{"unresolvedName":"document.createElement"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:handleCopy","to":"external:document.body.appendChild","kind":"calls","metadata":{"unresolvedName":"document.body.appendChild"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:handleCopy","to":"external:textarea.select","kind":"calls","metadata":{"unresolvedName":"textarea.select"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:handleCopy","to":"external:document.execCommand","kind":"calls","metadata":{"unresolvedName":"document.execCommand"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:handleCopy","to":"external:document.body.removeChild","kind":"calls","metadata":{"unresolvedName":"document.body.removeChild"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:handlePaste","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:handlePaste","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:handlePaste","to":"external:navigator.clipboard.readText","kind":"calls","metadata":{"unresolvedName":"navigator.clipboard.readText"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:handlePaste","to":"external:wsRef.current.send","kind":"calls","metadata":{"unresolvedName":"wsRef.current.send"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:handleTerminalClick","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:handleTerminalClick","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:handleTerminalClick","to":"external:termRef.current.focus","kind":"calls","metadata":{"unresolvedName":"termRef.current.focus"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"symbol-name:setShowResetConfirm","kind":"calls","metadata":{"unresolvedName":"setShowResetConfirm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:wsRef.current.send","kind":"calls","metadata":{"unresolvedName":"wsRef.current.send"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"external:JSON.stringify","kind":"calls","metadata":{"unresolvedName":"JSON.stringify"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx:","to":"symbol-name:connectWebSocket","kind":"calls","metadata":{"unresolvedName":"connectWebSocket"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/tools-bottom-sheet.tsx","to":"external:react-router-dom","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/tools-bottom-sheet.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/icon.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/tools-bottom-sheet.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/tools-bottom-sheet.tsx:ToolsBottomSheet","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/tools-bottom-sheet.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/tools-bottom-sheet.tsx:ToolsBottomSheet","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/tools-bottom-sheet.tsx:ToolsBottomSheet","to":"symbol-name:useLocation","kind":"calls","metadata":{"unresolvedName":"useLocation"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/tools-bottom-sheet.tsx:ToolsBottomSheet","to":"symbol-name:useNavigate","kind":"calls","metadata":{"unresolvedName":"useNavigate"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/tools-bottom-sheet.tsx:ToolsBottomSheet","to":"symbol-name:onClose","kind":"calls","metadata":{"unresolvedName":"onClose"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/tools-bottom-sheet.tsx:ToolsBottomSheet","to":"symbol-name:navigate","kind":"calls","metadata":{"unresolvedName":"navigate"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/tools-bottom-sheet.tsx:ToolsBottomSheet","to":"external:e.stopPropagation","kind":"calls","metadata":{"unresolvedName":"e.stopPropagation"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/tools-bottom-sheet.tsx:ToolsBottomSheet","to":"external:TOOLS_ITEMS.map","kind":"calls","metadata":{"unresolvedName":"TOOLS_ITEMS.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/tools-bottom-sheet.tsx:ToolsBottomSheet","to":"/home/alex/projects/headquarter/apps/web/src/components/tools-bottom-sheet.tsx:handleSelect","kind":"calls","metadata":{"unresolvedName":"handleSelect"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/tools-bottom-sheet.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/tools-bottom-sheet.tsx:handleSelect","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/tools-bottom-sheet.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/tools-bottom-sheet.tsx:handleSelect","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/components/tools-bottom-sheet.tsx:handleSelect","to":"symbol-name:onClose","kind":"calls","metadata":{"unresolvedName":"onClose"}},{"from":"/home/alex/projects/headquarter/apps/web/src/components/tools-bottom-sheet.tsx:handleSelect","to":"symbol-name:navigate","kind":"calls","metadata":{"unresolvedName":"navigate"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/workspace-header.tsx","to":"external:react-router-dom","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/workspace-header.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/icon.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/workspace-header.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/workspace-header.tsx:WorkspaceHeader","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/components/workspace-header.tsx","to":"/home/alex/projects/headquarter/apps/web/src/components/workspace-header.tsx:WorkspaceHeader","kind":"defines"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-async-data.ts","to":"external:react","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-async-data.ts","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-async-data.ts:useAsyncData","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-async-data.ts","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-async-data.ts:useAsyncData","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-async-data.ts:useAsyncData","to":"symbol-name:useState","kind":"calls","metadata":{"unresolvedName":"useState"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-async-data.ts:useAsyncData","to":"symbol-name:useCallback","kind":"calls","metadata":{"unresolvedName":"useCallback"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-async-data.ts:useAsyncData","to":"symbol-name:setStatus","kind":"calls","metadata":{"unresolvedName":"setStatus"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-async-data.ts:useAsyncData","to":"symbol-name:setError","kind":"calls","metadata":{"unresolvedName":"setError"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-async-data.ts:useAsyncData","to":"symbol-name:fetcher","kind":"calls","metadata":{"unresolvedName":"fetcher"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-async-data.ts:useAsyncData","to":"symbol-name:setData","kind":"calls","metadata":{"unresolvedName":"setData"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-async-data.ts:useAsyncData","to":"symbol-name:load","kind":"calls","metadata":{"unresolvedName":"load"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-async-data.ts:useAsyncData","to":"symbol-name:useEffect","kind":"calls","metadata":{"unresolvedName":"useEffect"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-async-data.ts","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-async-data.ts:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-async-data.ts","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-async-data.ts:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-async-data.ts:","to":"symbol-name:setStatus","kind":"calls","metadata":{"unresolvedName":"setStatus"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-async-data.ts:","to":"symbol-name:setError","kind":"calls","metadata":{"unresolvedName":"setError"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-async-data.ts:","to":"symbol-name:fetcher","kind":"calls","metadata":{"unresolvedName":"fetcher"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-async-data.ts:","to":"symbol-name:setData","kind":"calls","metadata":{"unresolvedName":"setData"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-async-data.ts","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-async-data.ts:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-async-data.ts","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-async-data.ts:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-async-data.ts:","to":"symbol-name:load","kind":"calls","metadata":{"unresolvedName":"load"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-async-data.ts","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-async-data.ts:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-async-data.ts","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-async-data.ts:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-async-data.ts:","to":"symbol-name:load","kind":"calls","metadata":{"unresolvedName":"load"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts","to":"external:react","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts:useAutoHide","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts:useAutoHide","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts:useAutoHide","to":"symbol-name:useState","kind":"calls","metadata":{"unresolvedName":"useState"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts:useAutoHide","to":"symbol-name:useRef","kind":"calls","metadata":{"unresolvedName":"useRef"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts:useAutoHide","to":"external:Date.now","kind":"calls","metadata":{"unresolvedName":"Date.now"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts:useAutoHide","to":"symbol-name:useCallback","kind":"calls","metadata":{"unresolvedName":"useCallback"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts:useAutoHide","to":"symbol-name:setIsVisible","kind":"calls","metadata":{"unresolvedName":"setIsVisible"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts:useAutoHide","to":"symbol-name:clearTimeout","kind":"calls","metadata":{"unresolvedName":"clearTimeout"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts:useAutoHide","to":"symbol-name:setTimeout","kind":"calls","metadata":{"unresolvedName":"setTimeout"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts:useAutoHide","to":"symbol-name:hide","kind":"calls","metadata":{"unresolvedName":"hide"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts:useAutoHide","to":"symbol-name:show","kind":"calls","metadata":{"unresolvedName":"show"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts:useAutoHide","to":"symbol-name:useEffect","kind":"calls","metadata":{"unresolvedName":"useEffect"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts:","to":"symbol-name:setIsVisible","kind":"calls","metadata":{"unresolvedName":"setIsVisible"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts:","to":"external:Date.now","kind":"calls","metadata":{"unresolvedName":"Date.now"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts:","to":"symbol-name:clearTimeout","kind":"calls","metadata":{"unresolvedName":"clearTimeout"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts:","to":"symbol-name:setTimeout","kind":"calls","metadata":{"unresolvedName":"setTimeout"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts:","to":"symbol-name:setIsVisible","kind":"calls","metadata":{"unresolvedName":"setIsVisible"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts:","to":"symbol-name:setIsVisible","kind":"calls","metadata":{"unresolvedName":"setIsVisible"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts:","to":"symbol-name:clearTimeout","kind":"calls","metadata":{"unresolvedName":"clearTimeout"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts:","to":"symbol-name:hide","kind":"calls","metadata":{"unresolvedName":"hide"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts:","to":"symbol-name:show","kind":"calls","metadata":{"unresolvedName":"show"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts:","to":"symbol-name:setIsVisible","kind":"calls","metadata":{"unresolvedName":"setIsVisible"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts:","to":"symbol-name:show","kind":"calls","metadata":{"unresolvedName":"show"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts:","to":"symbol-name:clearTimeout","kind":"calls","metadata":{"unresolvedName":"clearTimeout"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-auto-hide.ts:","to":"symbol-name:clearTimeout","kind":"calls","metadata":{"unresolvedName":"clearTimeout"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts","to":"external:react","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts","to":"file:/home/alex/projects/headquarter/apps/web/src/api/sessions.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts","to":"file:/home/alex/projects/headquarter/apps/web/src/api/sessions.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts:useInstanceActions","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts:useInstanceActions","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts:useInstanceActions","to":"symbol-name:useState","kind":"calls","metadata":{"unresolvedName":"useState"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts:useInstanceActions","to":"symbol-name:useCallback","kind":"calls","metadata":{"unresolvedName":"useCallback"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts:useInstanceActions","to":"external:window.open","kind":"calls","metadata":{"unresolvedName":"window.open"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts:useInstanceActions","to":"external:session.tool_type_interfaces?.includes","kind":"calls","metadata":{"unresolvedName":"session.tool_type_interfaces?.includes"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts:useInstanceActions","to":"symbol-name:setLoadingSessionId","kind":"calls","metadata":{"unresolvedName":"setLoadingSessionId"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts:useInstanceActions","to":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:startInstance","kind":"calls","metadata":{"unresolvedName":"startInstance"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts:useInstanceActions","to":"symbol-name:onRefresh","kind":"calls","metadata":{"unresolvedName":"onRefresh"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts:useInstanceActions","to":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:stopInstance","kind":"calls","metadata":{"unresolvedName":"stopInstance"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts:useInstanceActions","to":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:deleteInstance","kind":"calls","metadata":{"unresolvedName":"deleteInstance"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts:useInstanceActions","to":"symbol-name:setDirtyDeleteSession","kind":"calls","metadata":{"unresolvedName":"setDirtyDeleteSession"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts:useInstanceActions","to":"symbol-name:setDirtyDeleteFiles","kind":"calls","metadata":{"unresolvedName":"setDirtyDeleteFiles"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts:useInstanceActions","to":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:recreateInstanceTunnel","kind":"calls","metadata":{"unresolvedName":"recreateInstanceTunnel"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts:","to":"external:window.open","kind":"calls","metadata":{"unresolvedName":"window.open"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts:","to":"external:session.tool_type_interfaces?.includes","kind":"calls","metadata":{"unresolvedName":"session.tool_type_interfaces?.includes"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts:","to":"symbol-name:setLoadingSessionId","kind":"calls","metadata":{"unresolvedName":"setLoadingSessionId"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts:","to":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:startInstance","kind":"calls","metadata":{"unresolvedName":"startInstance"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts:","to":"symbol-name:onRefresh","kind":"calls","metadata":{"unresolvedName":"onRefresh"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts:","to":"symbol-name:setLoadingSessionId","kind":"calls","metadata":{"unresolvedName":"setLoadingSessionId"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts:","to":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:stopInstance","kind":"calls","metadata":{"unresolvedName":"stopInstance"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts:","to":"symbol-name:onRefresh","kind":"calls","metadata":{"unresolvedName":"onRefresh"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts:","to":"symbol-name:setLoadingSessionId","kind":"calls","metadata":{"unresolvedName":"setLoadingSessionId"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts:","to":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:deleteInstance","kind":"calls","metadata":{"unresolvedName":"deleteInstance"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts:","to":"symbol-name:setDirtyDeleteSession","kind":"calls","metadata":{"unresolvedName":"setDirtyDeleteSession"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts:","to":"symbol-name:setDirtyDeleteFiles","kind":"calls","metadata":{"unresolvedName":"setDirtyDeleteFiles"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts:","to":"symbol-name:onRefresh","kind":"calls","metadata":{"unresolvedName":"onRefresh"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts:","to":"symbol-name:setLoadingSessionId","kind":"calls","metadata":{"unresolvedName":"setLoadingSessionId"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts:","to":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:deleteInstance","kind":"calls","metadata":{"unresolvedName":"deleteInstance"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts:","to":"symbol-name:setDirtyDeleteSession","kind":"calls","metadata":{"unresolvedName":"setDirtyDeleteSession"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts:","to":"symbol-name:setDirtyDeleteFiles","kind":"calls","metadata":{"unresolvedName":"setDirtyDeleteFiles"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts:","to":"symbol-name:onRefresh","kind":"calls","metadata":{"unresolvedName":"onRefresh"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts:","to":"symbol-name:setLoadingSessionId","kind":"calls","metadata":{"unresolvedName":"setLoadingSessionId"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts:","to":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:recreateInstanceTunnel","kind":"calls","metadata":{"unresolvedName":"recreateInstanceTunnel"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts:","to":"symbol-name:onRefresh","kind":"calls","metadata":{"unresolvedName":"onRefresh"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts:","to":"symbol-name:setDirtyDeleteSession","kind":"calls","metadata":{"unresolvedName":"setDirtyDeleteSession"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts:","to":"symbol-name:setDirtyDeleteFiles","kind":"calls","metadata":{"unresolvedName":"setDirtyDeleteFiles"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-mobile-viewport.ts","to":"external:react","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-mobile-viewport.ts","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-mobile-viewport.ts:useMobileViewport","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-mobile-viewport.ts","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-mobile-viewport.ts:useMobileViewport","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-mobile-viewport.ts:useMobileViewport","to":"symbol-name:useState","kind":"calls","metadata":{"unresolvedName":"useState"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-mobile-viewport.ts:useMobileViewport","to":"symbol-name:useEffect","kind":"calls","metadata":{"unresolvedName":"useEffect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-mobile-viewport.ts:useMobileViewport","to":"symbol-name:setIsMobile","kind":"calls","metadata":{"unresolvedName":"setIsMobile"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-mobile-viewport.ts:useMobileViewport","to":"external:window.addEventListener","kind":"calls","metadata":{"unresolvedName":"window.addEventListener"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-mobile-viewport.ts:useMobileViewport","to":"external:window.removeEventListener","kind":"calls","metadata":{"unresolvedName":"window.removeEventListener"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-mobile-viewport.ts","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-mobile-viewport.ts:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-mobile-viewport.ts","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-mobile-viewport.ts:","kind":"defines"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-mobile-viewport.ts","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-mobile-viewport.ts:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-mobile-viewport.ts","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-mobile-viewport.ts:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-mobile-viewport.ts:","to":"symbol-name:setIsMobile","kind":"calls","metadata":{"unresolvedName":"setIsMobile"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-mobile-viewport.ts:","to":"external:window.addEventListener","kind":"calls","metadata":{"unresolvedName":"window.addEventListener"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-mobile-viewport.ts:","to":"external:window.removeEventListener","kind":"calls","metadata":{"unresolvedName":"window.removeEventListener"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-mobile-viewport.ts","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-mobile-viewport.ts:handleResize","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-mobile-viewport.ts","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-mobile-viewport.ts:handleResize","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-mobile-viewport.ts:handleResize","to":"symbol-name:setIsMobile","kind":"calls","metadata":{"unresolvedName":"setIsMobile"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-special-keys.ts","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-special-keys.ts:getSequenceWithModifier","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-special-keys.ts","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-special-keys.ts:getSequenceWithModifier","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-special-keys.ts:getSequenceWithModifier","to":"external:char.toLowerCase","kind":"calls","metadata":{"unresolvedName":"char.toLowerCase"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-special-keys.ts","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-special-keys.ts:applyModifierToChar","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-special-keys.ts","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-special-keys.ts:applyModifierToChar","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-special-keys.ts:applyModifierToChar","to":"external:char.toLowerCase","kind":"calls","metadata":{"unresolvedName":"char.toLowerCase"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-theme.ts","to":"external:react","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-theme.ts","to":"file:/home/alex/projects/headquarter/apps/web/src/api/settings.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-theme.ts","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-theme.ts:useTheme","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-theme.ts","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-theme.ts:useTheme","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-theme.ts:useTheme","to":"symbol-name:useEffect","kind":"calls","metadata":{"unresolvedName":"useEffect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-theme.ts:useTheme","to":"/home/alex/projects/headquarter/apps/web/src/api/settings.ts:getUserConfig","kind":"calls","metadata":{"unresolvedName":"getUserConfig"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-theme.ts:useTheme","to":"external:document.documentElement.removeAttribute","kind":"calls","metadata":{"unresolvedName":"document.documentElement.removeAttribute"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-theme.ts:useTheme","to":"external:document.documentElement.setAttribute","kind":"calls","metadata":{"unresolvedName":"document.documentElement.setAttribute"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-theme.ts","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-theme.ts:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-theme.ts","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-theme.ts:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-theme.ts:","to":"/home/alex/projects/headquarter/apps/web/src/api/settings.ts:getUserConfig","kind":"calls","metadata":{"unresolvedName":"getUserConfig"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-theme.ts:","to":"external:document.documentElement.removeAttribute","kind":"calls","metadata":{"unresolvedName":"document.documentElement.removeAttribute"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-theme.ts:","to":"external:document.documentElement.setAttribute","kind":"calls","metadata":{"unresolvedName":"document.documentElement.setAttribute"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-theme.ts","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-theme.ts:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-theme.ts","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-theme.ts:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-theme.ts:","to":"/home/alex/projects/headquarter/apps/web/src/api/settings.ts:getUserConfig","kind":"calls","metadata":{"unresolvedName":"getUserConfig"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-theme.ts:","to":"external:document.documentElement.removeAttribute","kind":"calls","metadata":{"unresolvedName":"document.documentElement.removeAttribute"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-theme.ts:","to":"external:document.documentElement.setAttribute","kind":"calls","metadata":{"unresolvedName":"document.documentElement.setAttribute"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-virtual-keyboard.ts","to":"external:react","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-virtual-keyboard.ts","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-virtual-keyboard.ts:useVirtualKeyboard","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-virtual-keyboard.ts","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-virtual-keyboard.ts:useVirtualKeyboard","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-virtual-keyboard.ts:useVirtualKeyboard","to":"symbol-name:useState","kind":"calls","metadata":{"unresolvedName":"useState"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-virtual-keyboard.ts:useVirtualKeyboard","to":"symbol-name:useCallback","kind":"calls","metadata":{"unresolvedName":"useCallback"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-virtual-keyboard.ts:useVirtualKeyboard","to":"symbol-name:setState","kind":"calls","metadata":{"unresolvedName":"setState"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-virtual-keyboard.ts:useVirtualKeyboard","to":"symbol-name:useEffect","kind":"calls","metadata":{"unresolvedName":"useEffect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-virtual-keyboard.ts:useVirtualKeyboard","to":"external:visualViewport.addEventListener","kind":"calls","metadata":{"unresolvedName":"visualViewport.addEventListener"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-virtual-keyboard.ts:useVirtualKeyboard","to":"external:window.addEventListener","kind":"calls","metadata":{"unresolvedName":"window.addEventListener"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-virtual-keyboard.ts:useVirtualKeyboard","to":"symbol-name:updateKeyboardState","kind":"calls","metadata":{"unresolvedName":"updateKeyboardState"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-virtual-keyboard.ts:useVirtualKeyboard","to":"external:visualViewport.removeEventListener","kind":"calls","metadata":{"unresolvedName":"visualViewport.removeEventListener"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-virtual-keyboard.ts:useVirtualKeyboard","to":"external:window.removeEventListener","kind":"calls","metadata":{"unresolvedName":"window.removeEventListener"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-virtual-keyboard.ts","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-virtual-keyboard.ts:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-virtual-keyboard.ts","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-virtual-keyboard.ts:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-virtual-keyboard.ts:","to":"symbol-name:setState","kind":"calls","metadata":{"unresolvedName":"setState"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-virtual-keyboard.ts","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-virtual-keyboard.ts:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-virtual-keyboard.ts","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-virtual-keyboard.ts:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-virtual-keyboard.ts:","to":"external:visualViewport.addEventListener","kind":"calls","metadata":{"unresolvedName":"visualViewport.addEventListener"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-virtual-keyboard.ts:","to":"external:window.addEventListener","kind":"calls","metadata":{"unresolvedName":"window.addEventListener"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-virtual-keyboard.ts:","to":"symbol-name:updateKeyboardState","kind":"calls","metadata":{"unresolvedName":"updateKeyboardState"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-virtual-keyboard.ts:","to":"external:visualViewport.removeEventListener","kind":"calls","metadata":{"unresolvedName":"visualViewport.removeEventListener"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-virtual-keyboard.ts:","to":"external:window.removeEventListener","kind":"calls","metadata":{"unresolvedName":"window.removeEventListener"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-virtual-keyboard.ts","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-virtual-keyboard.ts:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-virtual-keyboard.ts","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-virtual-keyboard.ts:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-virtual-keyboard.ts:","to":"external:visualViewport.removeEventListener","kind":"calls","metadata":{"unresolvedName":"visualViewport.removeEventListener"}},{"from":"/home/alex/projects/headquarter/apps/web/src/hooks/use-virtual-keyboard.ts:","to":"external:window.removeEventListener","kind":"calls","metadata":{"unresolvedName":"window.removeEventListener"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/main.tsx","to":"external:react","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/main.tsx","to":"external:react-dom/client","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/main.tsx","to":"external:react-router-dom","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/main.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/router.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/main.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/state/auth.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/main.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/state/sessions.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/main.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/styles.css","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"external:react","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/data-states.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/icon.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-mobile-viewport.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/utils/errors.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-list-view.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-detail-view.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-edit-view.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-fab.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/api/projects.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/types.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/git-mount-editor.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-mobile-viewport.ts:useMobileViewport","kind":"calls","metadata":{"unresolvedName":"useMobileViewport"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"symbol-name:useState","kind":"calls","metadata":{"unresolvedName":"useState"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"external:profiles.find","kind":"calls","metadata":{"unresolvedName":"profiles.find"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"symbol-name:useCallback","kind":"calls","metadata":{"unresolvedName":"useCallback"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"symbol-name:setStatus","kind":"calls","metadata":{"unresolvedName":"setStatus"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"external:Promise.all","kind":"calls","metadata":{"unresolvedName":"Promise.all"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts:listConfigProfiles","kind":"calls","metadata":{"unresolvedName":"listConfigProfiles"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"/home/alex/projects/headquarter/apps/web/src/api/projects.ts:listProjects","kind":"calls","metadata":{"unresolvedName":"listProjects"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"symbol-name:setProfiles","kind":"calls","metadata":{"unresolvedName":"setProfiles"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"symbol-name:setProjects","kind":"calls","metadata":{"unresolvedName":"setProjects"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"symbol-name:setToolTypes","kind":"calls","metadata":{"unresolvedName":"setToolTypes"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"symbol-name:useEffect","kind":"calls","metadata":{"unresolvedName":"useEffect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"symbol-name:loadData","kind":"calls","metadata":{"unresolvedName":"loadData"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"symbol-name:setFormData","kind":"calls","metadata":{"unresolvedName":"setFormData"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"symbol-name:setIncludedProfileIds","kind":"calls","metadata":{"unresolvedName":"setIncludedProfileIds"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"symbol-name:setError","kind":"calls","metadata":{"unresolvedName":"setError"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"symbol-name:setSaveStatus","kind":"calls","metadata":{"unresolvedName":"setSaveStatus"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"symbol-name:setPreviewData","kind":"calls","metadata":{"unresolvedName":"setPreviewData"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"external:profile.includes.map","kind":"calls","metadata":{"unresolvedName":"profile.includes.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"symbol-name:setSelectedProfileId","kind":"calls","metadata":{"unresolvedName":"setSelectedProfileId"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"symbol-name:setIsCreating","kind":"calls","metadata":{"unresolvedName":"setIsCreating"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:populateForm","kind":"calls","metadata":{"unresolvedName":"populateForm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"symbol-name:resetForm","kind":"calls","metadata":{"unresolvedName":"resetForm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"external:visited.has","kind":"calls","metadata":{"unresolvedName":"visited.has"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"symbol-name:getIncludedProfile","kind":"calls","metadata":{"unresolvedName":"getIncludedProfile"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"external:nextVisited.add","kind":"calls","metadata":{"unresolvedName":"nextVisited.add"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:wouldCreateCycle","kind":"calls","metadata":{"unresolvedName":"wouldCreateCycle"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"external:profiles.filter","kind":"calls","metadata":{"unresolvedName":"profiles.filter"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"external:includedProfileIds.includes","kind":"calls","metadata":{"unresolvedName":"includedProfileIds.includes"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"external:prev.filter","kind":"calls","metadata":{"unresolvedName":"prev.filter"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"external:e.dataTransfer.setData","kind":"calls","metadata":{"unresolvedName":"e.dataTransfer.setData"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"symbol-name:String","kind":"calls","metadata":{"unresolvedName":"String"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"external:e.preventDefault","kind":"calls","metadata":{"unresolvedName":"e.preventDefault"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"symbol-name:setDragOverIndex","kind":"calls","metadata":{"unresolvedName":"setDragOverIndex"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"symbol-name:Number","kind":"calls","metadata":{"unresolvedName":"Number"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"external:e.dataTransfer.getData","kind":"calls","metadata":{"unresolvedName":"e.dataTransfer.getData"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"external:newOrder.splice","kind":"calls","metadata":{"unresolvedName":"newOrder.splice"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"external:formData.name?.trim","kind":"calls","metadata":{"unresolvedName":"formData.name?.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts:createConfigProfile","kind":"calls","metadata":{"unresolvedName":"createConfigProfile"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts:updateProfileIncludes","kind":"calls","metadata":{"unresolvedName":"updateProfileIncludes"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"external:(await listConfigProfiles()).find","kind":"calls","metadata":{"unresolvedName":"(await listConfigProfiles()).find"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts:updateConfigProfile","kind":"calls","metadata":{"unresolvedName":"updateConfigProfile"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"/home/alex/projects/headquarter/apps/web/src/utils/errors.ts:extractErrorMessage","kind":"calls","metadata":{"unresolvedName":"extractErrorMessage"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"external:window.confirm","kind":"calls","metadata":{"unresolvedName":"window.confirm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts:deleteConfigProfile","kind":"calls","metadata":{"unresolvedName":"deleteConfigProfile"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"symbol-name:alert","kind":"calls","metadata":{"unresolvedName":"alert"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"symbol-name:setPreviewingId","kind":"calls","metadata":{"unresolvedName":"setPreviewingId"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts:previewConfigProfile","kind":"calls","metadata":{"unresolvedName":"previewConfigProfile"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"external:mounts.splice","kind":"calls","metadata":{"unresolvedName":"mounts.splice"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"external:profiles.map","kind":"calls","metadata":{"unresolvedName":"profiles.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:getScopeLabel","kind":"calls","metadata":{"unresolvedName":"getScopeLabel"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"symbol-name:setMobileView","kind":"calls","metadata":{"unresolvedName":"setMobileView"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"symbol-name:handleDelete","kind":"calls","metadata":{"unresolvedName":"handleDelete"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"external:Object.keys","kind":"calls","metadata":{"unresolvedName":"Object.keys"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"external:Object.entries(selectedProfile.env_vars).map(([k, v]) => `${k}=${v}`).join","kind":"calls","metadata":{"unresolvedName":"Object.entries(selectedProfile.env_vars).map(([k, v]) => `${k}=${v}`).join"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"external:Object.entries(selectedProfile.env_vars).map","kind":"calls","metadata":{"unresolvedName":"Object.entries(selectedProfile.env_vars).map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"external:Object.entries","kind":"calls","metadata":{"unresolvedName":"Object.entries"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"external:selectedProfile.mounts.map((m) => `${m.target} (${m.mode})`).join","kind":"calls","metadata":{"unresolvedName":"selectedProfile.mounts.map((m) => `${m.target} (${m.mode})`).join"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"external:selectedProfile.mounts.map","kind":"calls","metadata":{"unresolvedName":"selectedProfile.mounts.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"symbol-name:handleSubmit","kind":"calls","metadata":{"unresolvedName":"handleSubmit"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:updateFormField","kind":"calls","metadata":{"unresolvedName":"updateFormField"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"external:projects.map","kind":"calls","metadata":{"unresolvedName":"projects.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"external:toolTypes.map","kind":"calls","metadata":{"unresolvedName":"toolTypes.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"external:Object.entries(formData.env_vars || {}).map","kind":"calls","metadata":{"unresolvedName":"Object.entries(formData.env_vars || {}).map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"external:(formData.mounts || []).map","kind":"calls","metadata":{"unresolvedName":"(formData.mounts || []).map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"external:(formData.mounts || []).filter","kind":"calls","metadata":{"unresolvedName":"(formData.mounts || []).filter"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleSelectProfile","kind":"calls","metadata":{"unresolvedName":"handleSelectProfile"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"external:e.stopPropagation","kind":"calls","metadata":{"unresolvedName":"e.stopPropagation"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"external:projects.find","kind":"calls","metadata":{"unresolvedName":"projects.find"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"external:toolTypes.find","kind":"calls","metadata":{"unresolvedName":"toolTypes.find"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"symbol-name:handlePreview","kind":"calls","metadata":{"unresolvedName":"handlePreview"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"external:includedProfileIds.map","kind":"calls","metadata":{"unresolvedName":"includedProfileIds.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleDragStart","kind":"calls","metadata":{"unresolvedName":"handleDragStart"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleDragOver","kind":"calls","metadata":{"unresolvedName":"handleDragOver"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleDrop","kind":"calls","metadata":{"unresolvedName":"handleDrop"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:removeInclude","kind":"calls","metadata":{"unresolvedName":"removeInclude"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:availableProfilesForInclude","kind":"calls","metadata":{"unresolvedName":"availableProfilesForInclude"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:addInclude","kind":"calls","metadata":{"unresolvedName":"addInclude"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"external:availableProfilesForInclude().map","kind":"calls","metadata":{"unresolvedName":"availableProfilesForInclude().map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"symbol-name:updateEnvVar","kind":"calls","metadata":{"unresolvedName":"updateEnvVar"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:removeEnvVar","kind":"calls","metadata":{"unresolvedName":"removeEnvVar"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"external:JSON.stringify","kind":"calls","metadata":{"unresolvedName":"JSON.stringify"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"external:JSON.parse","kind":"calls","metadata":{"unresolvedName":"JSON.parse"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"external:Object.entries(formData.files || {}).map","kind":"calls","metadata":{"unresolvedName":"Object.entries(formData.files || {}).map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:updateFile","kind":"calls","metadata":{"unresolvedName":"updateFile"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:removeFile","kind":"calls","metadata":{"unresolvedName":"removeFile"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"symbol-name:updateMount","kind":"calls","metadata":{"unresolvedName":"updateMount"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:removeMount","kind":"calls","metadata":{"unresolvedName":"removeMount"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"external:Object.entries(mount.files).map","kind":"calls","metadata":{"unresolvedName":"Object.entries(mount.files).map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:updateMountFile","kind":"calls","metadata":{"unresolvedName":"updateMountFile"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:removeMountFile","kind":"calls","metadata":{"unresolvedName":"removeMountFile"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:addMountFile","kind":"calls","metadata":{"unresolvedName":"addMountFile"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","to":"symbol-name:setStatus","kind":"calls","metadata":{"unresolvedName":"setStatus"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","to":"external:Promise.all","kind":"calls","metadata":{"unresolvedName":"Promise.all"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts:listConfigProfiles","kind":"calls","metadata":{"unresolvedName":"listConfigProfiles"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/api/projects.ts:listProjects","kind":"calls","metadata":{"unresolvedName":"listProjects"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","to":"symbol-name:setProfiles","kind":"calls","metadata":{"unresolvedName":"setProfiles"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","to":"symbol-name:setProjects","kind":"calls","metadata":{"unresolvedName":"setProjects"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","to":"symbol-name:setToolTypes","kind":"calls","metadata":{"unresolvedName":"setToolTypes"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","to":"symbol-name:loadData","kind":"calls","metadata":{"unresolvedName":"loadData"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:resetForm","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:resetForm","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:resetForm","to":"symbol-name:setFormData","kind":"calls","metadata":{"unresolvedName":"setFormData"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:resetForm","to":"symbol-name:setIncludedProfileIds","kind":"calls","metadata":{"unresolvedName":"setIncludedProfileIds"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:resetForm","to":"symbol-name:setError","kind":"calls","metadata":{"unresolvedName":"setError"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:resetForm","to":"symbol-name:setSaveStatus","kind":"calls","metadata":{"unresolvedName":"setSaveStatus"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:resetForm","to":"symbol-name:setPreviewData","kind":"calls","metadata":{"unresolvedName":"setPreviewData"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:populateForm","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:populateForm","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:populateForm","to":"symbol-name:setFormData","kind":"calls","metadata":{"unresolvedName":"setFormData"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:populateForm","to":"symbol-name:setIncludedProfileIds","kind":"calls","metadata":{"unresolvedName":"setIncludedProfileIds"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:populateForm","to":"external:profile.includes.map","kind":"calls","metadata":{"unresolvedName":"profile.includes.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:populateForm","to":"symbol-name:setError","kind":"calls","metadata":{"unresolvedName":"setError"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:populateForm","to":"symbol-name:setSaveStatus","kind":"calls","metadata":{"unresolvedName":"setSaveStatus"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:populateForm","to":"symbol-name:setPreviewData","kind":"calls","metadata":{"unresolvedName":"setPreviewData"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleSelectProfile","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleSelectProfile","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleSelectProfile","to":"symbol-name:setSelectedProfileId","kind":"calls","metadata":{"unresolvedName":"setSelectedProfileId"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleSelectProfile","to":"symbol-name:setIsCreating","kind":"calls","metadata":{"unresolvedName":"setIsCreating"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleSelectProfile","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:populateForm","kind":"calls","metadata":{"unresolvedName":"populateForm"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleCreateNew","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleCreateNew","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleCreateNew","to":"symbol-name:setSelectedProfileId","kind":"calls","metadata":{"unresolvedName":"setSelectedProfileId"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleCreateNew","to":"symbol-name:setIsCreating","kind":"calls","metadata":{"unresolvedName":"setIsCreating"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleCreateNew","to":"symbol-name:resetForm","kind":"calls","metadata":{"unresolvedName":"resetForm"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:getScopeLabel","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:getScopeLabel","kind":"defines"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:wouldCreateCycle","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:wouldCreateCycle","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:wouldCreateCycle","to":"external:visited.has","kind":"calls","metadata":{"unresolvedName":"visited.has"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:wouldCreateCycle","to":"symbol-name:getIncludedProfile","kind":"calls","metadata":{"unresolvedName":"getIncludedProfile"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:wouldCreateCycle","to":"external:nextVisited.add","kind":"calls","metadata":{"unresolvedName":"nextVisited.add"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:wouldCreateCycle","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:wouldCreateCycle","kind":"calls","metadata":{"unresolvedName":"wouldCreateCycle"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:availableProfilesForInclude","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:availableProfilesForInclude","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:availableProfilesForInclude","to":"external:profiles.filter","kind":"calls","metadata":{"unresolvedName":"profiles.filter"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:availableProfilesForInclude","to":"external:includedProfileIds.includes","kind":"calls","metadata":{"unresolvedName":"includedProfileIds.includes"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:availableProfilesForInclude","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:wouldCreateCycle","kind":"calls","metadata":{"unresolvedName":"wouldCreateCycle"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","to":"external:includedProfileIds.includes","kind":"calls","metadata":{"unresolvedName":"includedProfileIds.includes"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:wouldCreateCycle","kind":"calls","metadata":{"unresolvedName":"wouldCreateCycle"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:addInclude","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:addInclude","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:addInclude","to":"symbol-name:setIncludedProfileIds","kind":"calls","metadata":{"unresolvedName":"setIncludedProfileIds"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:removeInclude","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:removeInclude","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:removeInclude","to":"symbol-name:setIncludedProfileIds","kind":"calls","metadata":{"unresolvedName":"setIncludedProfileIds"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:removeInclude","to":"external:prev.filter","kind":"calls","metadata":{"unresolvedName":"prev.filter"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleDragStart","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleDragStart","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleDragStart","to":"external:e.dataTransfer.setData","kind":"calls","metadata":{"unresolvedName":"e.dataTransfer.setData"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleDragStart","to":"symbol-name:String","kind":"calls","metadata":{"unresolvedName":"String"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleDragOver","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleDragOver","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleDragOver","to":"external:e.preventDefault","kind":"calls","metadata":{"unresolvedName":"e.preventDefault"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleDragOver","to":"symbol-name:setDragOverIndex","kind":"calls","metadata":{"unresolvedName":"setDragOverIndex"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleDragLeave","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleDragLeave","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleDragLeave","to":"symbol-name:setDragOverIndex","kind":"calls","metadata":{"unresolvedName":"setDragOverIndex"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleDrop","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleDrop","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleDrop","to":"external:e.preventDefault","kind":"calls","metadata":{"unresolvedName":"e.preventDefault"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleDrop","to":"symbol-name:Number","kind":"calls","metadata":{"unresolvedName":"Number"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleDrop","to":"external:e.dataTransfer.getData","kind":"calls","metadata":{"unresolvedName":"e.dataTransfer.getData"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleDrop","to":"symbol-name:setDragOverIndex","kind":"calls","metadata":{"unresolvedName":"setDragOverIndex"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleDrop","to":"symbol-name:setIncludedProfileIds","kind":"calls","metadata":{"unresolvedName":"setIncludedProfileIds"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleDrop","to":"external:newOrder.splice","kind":"calls","metadata":{"unresolvedName":"newOrder.splice"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","to":"external:newOrder.splice","kind":"calls","metadata":{"unresolvedName":"newOrder.splice"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleSubmit","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleSubmit","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleSubmit","to":"external:e.preventDefault","kind":"calls","metadata":{"unresolvedName":"e.preventDefault"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleSubmit","to":"symbol-name:setError","kind":"calls","metadata":{"unresolvedName":"setError"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleSubmit","to":"symbol-name:setSaveStatus","kind":"calls","metadata":{"unresolvedName":"setSaveStatus"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleSubmit","to":"external:formData.name?.trim","kind":"calls","metadata":{"unresolvedName":"formData.name?.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleSubmit","to":"/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts:createConfigProfile","kind":"calls","metadata":{"unresolvedName":"createConfigProfile"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleSubmit","to":"/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts:updateProfileIncludes","kind":"calls","metadata":{"unresolvedName":"updateProfileIncludes"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleSubmit","to":"symbol-name:setIsCreating","kind":"calls","metadata":{"unresolvedName":"setIsCreating"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleSubmit","to":"symbol-name:setSelectedProfileId","kind":"calls","metadata":{"unresolvedName":"setSelectedProfileId"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleSubmit","to":"symbol-name:loadData","kind":"calls","metadata":{"unresolvedName":"loadData"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleSubmit","to":"external:(await listConfigProfiles()).find","kind":"calls","metadata":{"unresolvedName":"(await listConfigProfiles()).find"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleSubmit","to":"/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts:listConfigProfiles","kind":"calls","metadata":{"unresolvedName":"listConfigProfiles"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleSubmit","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:populateForm","kind":"calls","metadata":{"unresolvedName":"populateForm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleSubmit","to":"/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts:updateConfigProfile","kind":"calls","metadata":{"unresolvedName":"updateConfigProfile"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleSubmit","to":"/home/alex/projects/headquarter/apps/web/src/utils/errors.ts:extractErrorMessage","kind":"calls","metadata":{"unresolvedName":"extractErrorMessage"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleDelete","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleDelete","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleDelete","to":"external:window.confirm","kind":"calls","metadata":{"unresolvedName":"window.confirm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleDelete","to":"/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts:deleteConfigProfile","kind":"calls","metadata":{"unresolvedName":"deleteConfigProfile"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleDelete","to":"symbol-name:setSelectedProfileId","kind":"calls","metadata":{"unresolvedName":"setSelectedProfileId"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleDelete","to":"symbol-name:setIsCreating","kind":"calls","metadata":{"unresolvedName":"setIsCreating"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleDelete","to":"symbol-name:resetForm","kind":"calls","metadata":{"unresolvedName":"resetForm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleDelete","to":"symbol-name:loadData","kind":"calls","metadata":{"unresolvedName":"loadData"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleDelete","to":"symbol-name:alert","kind":"calls","metadata":{"unresolvedName":"alert"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handlePreview","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handlePreview","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handlePreview","to":"symbol-name:setPreviewingId","kind":"calls","metadata":{"unresolvedName":"setPreviewingId"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handlePreview","to":"/home/alex/projects/headquarter/apps/web/src/api/config_profiles.ts:previewConfigProfile","kind":"calls","metadata":{"unresolvedName":"previewConfigProfile"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handlePreview","to":"symbol-name:setPreviewData","kind":"calls","metadata":{"unresolvedName":"setPreviewData"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handlePreview","to":"symbol-name:setError","kind":"calls","metadata":{"unresolvedName":"setError"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:updateFormField","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:updateFormField","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:updateFormField","to":"symbol-name:setFormData","kind":"calls","metadata":{"unresolvedName":"setFormData"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:updateFormField","to":"symbol-name:setSaveStatus","kind":"calls","metadata":{"unresolvedName":"setSaveStatus"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:addEnvVar","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:addEnvVar","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:addEnvVar","to":"symbol-name:setFormData","kind":"calls","metadata":{"unresolvedName":"setFormData"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:addEnvVar","to":"symbol-name:setSaveStatus","kind":"calls","metadata":{"unresolvedName":"setSaveStatus"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:updateEnvVar","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:updateEnvVar","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:updateEnvVar","to":"symbol-name:setFormData","kind":"calls","metadata":{"unresolvedName":"setFormData"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:updateEnvVar","to":"symbol-name:setSaveStatus","kind":"calls","metadata":{"unresolvedName":"setSaveStatus"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"defines"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:removeEnvVar","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:removeEnvVar","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:removeEnvVar","to":"symbol-name:setFormData","kind":"calls","metadata":{"unresolvedName":"setFormData"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:removeEnvVar","to":"symbol-name:setSaveStatus","kind":"calls","metadata":{"unresolvedName":"setSaveStatus"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"defines"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:addFile","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:addFile","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:addFile","to":"symbol-name:setFormData","kind":"calls","metadata":{"unresolvedName":"setFormData"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:addFile","to":"symbol-name:setSaveStatus","kind":"calls","metadata":{"unresolvedName":"setSaveStatus"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:updateFile","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:updateFile","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:updateFile","to":"symbol-name:setFormData","kind":"calls","metadata":{"unresolvedName":"setFormData"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:updateFile","to":"symbol-name:setSaveStatus","kind":"calls","metadata":{"unresolvedName":"setSaveStatus"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"defines"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:removeFile","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:removeFile","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:removeFile","to":"symbol-name:setFormData","kind":"calls","metadata":{"unresolvedName":"setFormData"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:removeFile","to":"symbol-name:setSaveStatus","kind":"calls","metadata":{"unresolvedName":"setSaveStatus"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"defines"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:addMount","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:addMount","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:addMount","to":"symbol-name:setFormData","kind":"calls","metadata":{"unresolvedName":"setFormData"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:addMount","to":"symbol-name:setSaveStatus","kind":"calls","metadata":{"unresolvedName":"setSaveStatus"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:updateMount","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:updateMount","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:updateMount","to":"symbol-name:setFormData","kind":"calls","metadata":{"unresolvedName":"setFormData"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:updateMount","to":"symbol-name:setSaveStatus","kind":"calls","metadata":{"unresolvedName":"setSaveStatus"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"defines"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:removeMount","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:removeMount","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:removeMount","to":"symbol-name:setFormData","kind":"calls","metadata":{"unresolvedName":"setFormData"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:removeMount","to":"external:mounts.splice","kind":"calls","metadata":{"unresolvedName":"mounts.splice"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:removeMount","to":"symbol-name:setSaveStatus","kind":"calls","metadata":{"unresolvedName":"setSaveStatus"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","to":"external:mounts.splice","kind":"calls","metadata":{"unresolvedName":"mounts.splice"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:addMountFile","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:addMountFile","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:addMountFile","to":"symbol-name:setFormData","kind":"calls","metadata":{"unresolvedName":"setFormData"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:addMountFile","to":"symbol-name:setSaveStatus","kind":"calls","metadata":{"unresolvedName":"setSaveStatus"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"defines"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:updateMountFile","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:updateMountFile","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:updateMountFile","to":"symbol-name:setFormData","kind":"calls","metadata":{"unresolvedName":"setFormData"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:updateMountFile","to":"symbol-name:setSaveStatus","kind":"calls","metadata":{"unresolvedName":"setSaveStatus"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"defines"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:removeMountFile","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:removeMountFile","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:removeMountFile","to":"symbol-name:setFormData","kind":"calls","metadata":{"unresolvedName":"setFormData"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:removeMountFile","to":"symbol-name:setSaveStatus","kind":"calls","metadata":{"unresolvedName":"setSaveStatus"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"defines"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","to":"symbol-name:setSelectedProfileId","kind":"calls","metadata":{"unresolvedName":"setSelectedProfileId"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","to":"symbol-name:setIsCreating","kind":"calls","metadata":{"unresolvedName":"setIsCreating"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","to":"external:profiles.find","kind":"calls","metadata":{"unresolvedName":"profiles.find"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:populateForm","kind":"calls","metadata":{"unresolvedName":"populateForm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","to":"symbol-name:setMobileView","kind":"calls","metadata":{"unresolvedName":"setMobileView"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","to":"symbol-name:setIsCreating","kind":"calls","metadata":{"unresolvedName":"setIsCreating"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","to":"symbol-name:setSelectedProfileId","kind":"calls","metadata":{"unresolvedName":"setSelectedProfileId"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","to":"symbol-name:resetForm","kind":"calls","metadata":{"unresolvedName":"resetForm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","to":"symbol-name:setMobileView","kind":"calls","metadata":{"unresolvedName":"setMobileView"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:populateForm","kind":"calls","metadata":{"unresolvedName":"populateForm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","to":"symbol-name:setIsCreating","kind":"calls","metadata":{"unresolvedName":"setIsCreating"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","to":"symbol-name:setMobileView","kind":"calls","metadata":{"unresolvedName":"setMobileView"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","to":"symbol-name:setMobileView","kind":"calls","metadata":{"unresolvedName":"setMobileView"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:preventDefault","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:preventDefault","kind":"defines"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:updateFormField","kind":"calls","metadata":{"unresolvedName":"updateFormField"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:updateFormField","kind":"calls","metadata":{"unresolvedName":"updateFormField"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:updateFormField","kind":"calls","metadata":{"unresolvedName":"updateFormField"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:updateFormField","kind":"calls","metadata":{"unresolvedName":"updateFormField"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:updateFormField","kind":"calls","metadata":{"unresolvedName":"updateFormField"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","to":"external:(formData.mounts || []).filter","kind":"calls","metadata":{"unresolvedName":"(formData.mounts || []).filter"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:updateFormField","kind":"calls","metadata":{"unresolvedName":"updateFormField"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","to":"symbol-name:setSelectedProfileId","kind":"calls","metadata":{"unresolvedName":"setSelectedProfileId"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","to":"symbol-name:setIsCreating","kind":"calls","metadata":{"unresolvedName":"setIsCreating"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","to":"external:profiles.find","kind":"calls","metadata":{"unresolvedName":"profiles.find"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:populateForm","kind":"calls","metadata":{"unresolvedName":"populateForm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","to":"symbol-name:setMobileView","kind":"calls","metadata":{"unresolvedName":"setMobileView"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","to":"symbol-name:setIsCreating","kind":"calls","metadata":{"unresolvedName":"setIsCreating"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","to":"symbol-name:setSelectedProfileId","kind":"calls","metadata":{"unresolvedName":"setSelectedProfileId"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","to":"symbol-name:resetForm","kind":"calls","metadata":{"unresolvedName":"resetForm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","to":"symbol-name:setMobileView","kind":"calls","metadata":{"unresolvedName":"setMobileView"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"defines"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"defines"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","to":"external:e.stopPropagation","kind":"calls","metadata":{"unresolvedName":"e.stopPropagation"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","to":"symbol-name:handleDelete","kind":"calls","metadata":{"unresolvedName":"handleDelete"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"defines"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"defines"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","to":"symbol-name:getIncludedProfile","kind":"calls","metadata":{"unresolvedName":"getIncludedProfile"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleDragStart","kind":"calls","metadata":{"unresolvedName":"handleDragStart"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleDragOver","kind":"calls","metadata":{"unresolvedName":"handleDragOver"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:handleDrop","kind":"calls","metadata":{"unresolvedName":"handleDrop"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:getScopeLabel","kind":"calls","metadata":{"unresolvedName":"getScopeLabel"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:removeInclude","kind":"calls","metadata":{"unresolvedName":"removeInclude"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:addInclude","kind":"calls","metadata":{"unresolvedName":"addInclude"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","to":"external:JSON.parse","kind":"calls","metadata":{"unresolvedName":"JSON.parse"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:updateFormField","kind":"calls","metadata":{"unresolvedName":"updateFormField"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","to":"symbol-name:resetForm","kind":"calls","metadata":{"unresolvedName":"resetForm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:populateForm","kind":"calls","metadata":{"unresolvedName":"populateForm"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx","to":"external:@testing-library/react","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx","to":"external:react-router-dom","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx","to":"external:vitest","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","to":"symbol-name:beforeEach","kind":"calls","metadata":{"unresolvedName":"beforeEach"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","to":"external:mockDashboard.mockReset","kind":"calls","metadata":{"unresolvedName":"mockDashboard.mockReset"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","to":"external:mockSessions.mockReset","kind":"calls","metadata":{"unresolvedName":"mockSessions.mockReset"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","to":"external:mockProjects.mockReset","kind":"calls","metadata":{"unresolvedName":"mockProjects.mockReset"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","to":"external:mockRepos.mockReset","kind":"calls","metadata":{"unresolvedName":"mockRepos.mockReset"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","to":"symbol-name:it","kind":"calls","metadata":{"unresolvedName":"it"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","to":"external:mockDashboard.mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"mockDashboard.mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","to":"external:mockSessions.mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"mockSessions.mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","to":"external:mockProjects.mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"mockProjects.mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","to":"external:mockRepos.mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"mockRepos.mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","to":"symbol-name:render","kind":"calls","metadata":{"unresolvedName":"render"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","to":"external:expect(screen.getByText(\"Loading overview...\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(\"Loading overview...\")).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","to":"external:screen.getByText","kind":"calls","metadata":{"unresolvedName":"screen.getByText"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","to":"symbol-name:waitFor","kind":"calls","metadata":{"unresolvedName":"waitFor"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","to":"external:expect(screen.getAllByText(\"Open sessions\").length).toBeGreaterThan","kind":"calls","metadata":{"unresolvedName":"expect(screen.getAllByText(\"Open sessions\").length).toBeGreaterThan"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","to":"external:screen.getAllByText","kind":"calls","metadata":{"unresolvedName":"screen.getAllByText"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","to":"external:expect(screen.getByText(\"Available projects\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(\"Available projects\")).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","to":"external:mockDashboard.mockRejectedValueOnce","kind":"calls","metadata":{"unresolvedName":"mockDashboard.mockRejectedValueOnce"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","to":"external:mockSessions.mockRejectedValueOnce","kind":"calls","metadata":{"unresolvedName":"mockSessions.mockRejectedValueOnce"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","to":"external:mockProjects.mockRejectedValueOnce","kind":"calls","metadata":{"unresolvedName":"mockProjects.mockRejectedValueOnce"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","to":"external:fireEvent.click","kind":"calls","metadata":{"unresolvedName":"fireEvent.click"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","to":"external:screen.getAllByRole","kind":"calls","metadata":{"unresolvedName":"screen.getAllByRole"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","to":"external:mockDashboard.mockReset","kind":"calls","metadata":{"unresolvedName":"mockDashboard.mockReset"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","to":"external:mockSessions.mockReset","kind":"calls","metadata":{"unresolvedName":"mockSessions.mockReset"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","to":"external:mockProjects.mockReset","kind":"calls","metadata":{"unresolvedName":"mockProjects.mockReset"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","to":"external:mockRepos.mockReset","kind":"calls","metadata":{"unresolvedName":"mockRepos.mockReset"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","to":"external:mockDashboard.mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"mockDashboard.mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","to":"external:mockSessions.mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"mockSessions.mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","to":"external:mockProjects.mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"mockProjects.mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","to":"external:mockRepos.mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"mockRepos.mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","to":"symbol-name:render","kind":"calls","metadata":{"unresolvedName":"render"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","to":"external:expect(screen.getByText(\"Loading overview...\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(\"Loading overview...\")).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","to":"external:screen.getByText","kind":"calls","metadata":{"unresolvedName":"screen.getByText"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","to":"symbol-name:waitFor","kind":"calls","metadata":{"unresolvedName":"waitFor"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","to":"external:expect(screen.getAllByText(\"Open sessions\").length).toBeGreaterThan","kind":"calls","metadata":{"unresolvedName":"expect(screen.getAllByText(\"Open sessions\").length).toBeGreaterThan"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","to":"external:screen.getAllByText","kind":"calls","metadata":{"unresolvedName":"screen.getAllByText"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","to":"external:expect(screen.getByText(\"Available projects\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(\"Available projects\")).toBeInTheDocument"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","to":"external:expect(screen.getAllByText(\"Open sessions\").length).toBeGreaterThan","kind":"calls","metadata":{"unresolvedName":"expect(screen.getAllByText(\"Open sessions\").length).toBeGreaterThan"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","to":"external:screen.getAllByText","kind":"calls","metadata":{"unresolvedName":"screen.getAllByText"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","to":"external:expect(screen.getByText(\"Available projects\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(\"Available projects\")).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","to":"external:screen.getByText","kind":"calls","metadata":{"unresolvedName":"screen.getByText"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","to":"external:mockDashboard.mockRejectedValueOnce","kind":"calls","metadata":{"unresolvedName":"mockDashboard.mockRejectedValueOnce"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","to":"external:mockSessions.mockRejectedValueOnce","kind":"calls","metadata":{"unresolvedName":"mockSessions.mockRejectedValueOnce"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","to":"external:mockProjects.mockRejectedValueOnce","kind":"calls","metadata":{"unresolvedName":"mockProjects.mockRejectedValueOnce"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","to":"symbol-name:render","kind":"calls","metadata":{"unresolvedName":"render"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","to":"symbol-name:waitFor","kind":"calls","metadata":{"unresolvedName":"waitFor"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","to":"external:screen.getByText","kind":"calls","metadata":{"unresolvedName":"screen.getByText"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","to":"external:fireEvent.click","kind":"calls","metadata":{"unresolvedName":"fireEvent.click"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","to":"external:screen.getAllByRole","kind":"calls","metadata":{"unresolvedName":"screen.getAllByRole"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.test.tsx:","to":"external:screen.getByText","kind":"calls","metadata":{"unresolvedName":"screen.getByText"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx","to":"external:react","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx","to":"external:react-router-dom","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/api/dashboard.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/api/sessions.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/api/projects.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/api/settings.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/types.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/data-states.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/session-list.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:HomePage","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:HomePage","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:HomePage","to":"symbol-name:useNavigate","kind":"calls","metadata":{"unresolvedName":"useNavigate"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:HomePage","to":"symbol-name:useState","kind":"calls","metadata":{"unresolvedName":"useState"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:HomePage","to":"external:Array.isArray","kind":"calls","metadata":{"unresolvedName":"Array.isArray"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:HomePage","to":"symbol-name:useCallback","kind":"calls","metadata":{"unresolvedName":"useCallback"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:HomePage","to":"symbol-name:setStatus","kind":"calls","metadata":{"unresolvedName":"setStatus"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:HomePage","to":"external:Promise.all","kind":"calls","metadata":{"unresolvedName":"Promise.all"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:HomePage","to":"/home/alex/projects/headquarter/apps/web/src/api/dashboard.ts:getDashboardSummary","kind":"calls","metadata":{"unresolvedName":"getDashboardSummary"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:HomePage","to":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:getUserSessions","kind":"calls","metadata":{"unresolvedName":"getUserSessions"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:HomePage","to":"/home/alex/projects/headquarter/apps/web/src/api/projects.ts:listProjects","kind":"calls","metadata":{"unresolvedName":"listProjects"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:HomePage","to":"symbol-name:setSummary","kind":"calls","metadata":{"unresolvedName":"setSummary"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:HomePage","to":"symbol-name:setSessions","kind":"calls","metadata":{"unresolvedName":"setSessions"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:HomePage","to":"symbol-name:setProjects","kind":"calls","metadata":{"unresolvedName":"setProjects"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:HomePage","to":"symbol-name:setToolTypes","kind":"calls","metadata":{"unresolvedName":"setToolTypes"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:HomePage","to":"symbol-name:useEffect","kind":"calls","metadata":{"unresolvedName":"useEffect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:HomePage","to":"symbol-name:loadHome","kind":"calls","metadata":{"unresolvedName":"loadHome"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:HomePage","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts:useInstanceActions","kind":"calls","metadata":{"unresolvedName":"useInstanceActions"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:HomePage","to":"external:safeSessions.filter","kind":"calls","metadata":{"unresolvedName":"safeSessions.filter"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:HomePage","to":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:checkInstanceHealth","kind":"calls","metadata":{"unresolvedName":"checkInstanceHealth"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:HomePage","to":"symbol-name:setTunnelHealth","kind":"calls","metadata":{"unresolvedName":"setTunnelHealth"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:HomePage","to":"symbol-name:checkHealth","kind":"calls","metadata":{"unresolvedName":"checkHealth"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:HomePage","to":"symbol-name:setInterval","kind":"calls","metadata":{"unresolvedName":"setInterval"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:HomePage","to":"symbol-name:clearInterval","kind":"calls","metadata":{"unresolvedName":"clearInterval"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:HomePage","to":"symbol-name:setRepositories","kind":"calls","metadata":{"unresolvedName":"setRepositories"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:HomePage","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:listRepositories","kind":"calls","metadata":{"unresolvedName":"listRepositories"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:HomePage","to":"symbol-name:loadRepos","kind":"calls","metadata":{"unresolvedName":"loadRepos"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:HomePage","to":"symbol-name:useMemo","kind":"calls","metadata":{"unresolvedName":"useMemo"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:HomePage","to":"external:[\"running\", \"building\", \"pending\"].includes","kind":"calls","metadata":{"unresolvedName":"[\"running\", \"building\", \"pending\"].includes"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:HomePage","to":"/home/alex/projects/headquarter/apps/web/src/api/settings.ts:updateUserConfig","kind":"calls","metadata":{"unresolvedName":"updateUserConfig"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:HomePage","to":"symbol-name:setSelectedProject","kind":"calls","metadata":{"unresolvedName":"setSelectedProject"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:HomePage","to":"symbol-name:navigate","kind":"calls","metadata":{"unresolvedName":"navigate"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:HomePage","to":"external:summaryCards.map","kind":"calls","metadata":{"unresolvedName":"summaryCards.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:HomePage","to":"external:[\"running\", \"building\", \"pending\", \"starting\", \"probing\", \"unhealthy\"].includes","kind":"calls","metadata":{"unresolvedName":"[\"running\", \"building\", \"pending\", \"starting\", \"probing\", \"unhealthy\"].includes"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:HomePage","to":"external:projects.map","kind":"calls","metadata":{"unresolvedName":"projects.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:HomePage","to":"external:[\"stopped\", \"error\"].includes","kind":"calls","metadata":{"unresolvedName":"[\"stopped\", \"error\"].includes"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:","to":"symbol-name:setStatus","kind":"calls","metadata":{"unresolvedName":"setStatus"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:","to":"external:Promise.all","kind":"calls","metadata":{"unresolvedName":"Promise.all"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/api/dashboard.ts:getDashboardSummary","kind":"calls","metadata":{"unresolvedName":"getDashboardSummary"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:getUserSessions","kind":"calls","metadata":{"unresolvedName":"getUserSessions"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/api/projects.ts:listProjects","kind":"calls","metadata":{"unresolvedName":"listProjects"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:","to":"symbol-name:setSummary","kind":"calls","metadata":{"unresolvedName":"setSummary"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:","to":"symbol-name:setSessions","kind":"calls","metadata":{"unresolvedName":"setSessions"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:","to":"symbol-name:setProjects","kind":"calls","metadata":{"unresolvedName":"setProjects"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:","to":"symbol-name:setToolTypes","kind":"calls","metadata":{"unresolvedName":"setToolTypes"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:","to":"symbol-name:loadHome","kind":"calls","metadata":{"unresolvedName":"loadHome"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:","to":"external:safeSessions.filter","kind":"calls","metadata":{"unresolvedName":"safeSessions.filter"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:checkInstanceHealth","kind":"calls","metadata":{"unresolvedName":"checkInstanceHealth"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:","to":"symbol-name:setTunnelHealth","kind":"calls","metadata":{"unresolvedName":"setTunnelHealth"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:","to":"symbol-name:checkHealth","kind":"calls","metadata":{"unresolvedName":"checkHealth"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:","to":"symbol-name:setInterval","kind":"calls","metadata":{"unresolvedName":"setInterval"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:","to":"symbol-name:clearInterval","kind":"calls","metadata":{"unresolvedName":"clearInterval"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:checkHealth","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:checkHealth","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:checkHealth","to":"external:safeSessions.filter","kind":"calls","metadata":{"unresolvedName":"safeSessions.filter"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:checkHealth","to":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:checkInstanceHealth","kind":"calls","metadata":{"unresolvedName":"checkInstanceHealth"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:checkHealth","to":"symbol-name:setTunnelHealth","kind":"calls","metadata":{"unresolvedName":"setTunnelHealth"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:","to":"symbol-name:checkHealth","kind":"calls","metadata":{"unresolvedName":"checkHealth"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:","to":"symbol-name:setRepositories","kind":"calls","metadata":{"unresolvedName":"setRepositories"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:listRepositories","kind":"calls","metadata":{"unresolvedName":"listRepositories"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:","to":"symbol-name:loadRepos","kind":"calls","metadata":{"unresolvedName":"loadRepos"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:loadRepos","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:loadRepos","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:loadRepos","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:listRepositories","kind":"calls","metadata":{"unresolvedName":"listRepositories"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:loadRepos","to":"symbol-name:setRepositories","kind":"calls","metadata":{"unresolvedName":"setRepositories"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:handleCreateSuccess","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:handleCreateSuccess","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:handleCreateSuccess","to":"/home/alex/projects/headquarter/apps/web/src/api/settings.ts:updateUserConfig","kind":"calls","metadata":{"unresolvedName":"updateUserConfig"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:handleCreateSuccess","to":"symbol-name:setSelectedProject","kind":"calls","metadata":{"unresolvedName":"setSelectedProject"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:handleCreateSuccess","to":"symbol-name:loadHome","kind":"calls","metadata":{"unresolvedName":"loadHome"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx","to":"external:react","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx","to":"external:react-router-dom","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/data-states.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/icon.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-async-data.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx:GitHistoryPage","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx:GitHistoryPage","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx:GitHistoryPage","to":"symbol-name:useParams","kind":"calls","metadata":{"unresolvedName":"useParams"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx:GitHistoryPage","to":"symbol-name:useNavigate","kind":"calls","metadata":{"unresolvedName":"useNavigate"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx:GitHistoryPage","to":"symbol-name:useState","kind":"calls","metadata":{"unresolvedName":"useState"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx:GitHistoryPage","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-async-data.ts:useAsyncData","kind":"calls","metadata":{"unresolvedName":"useAsyncData"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx:GitHistoryPage","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:getRepositoryHistory","kind":"calls","metadata":{"unresolvedName":"getRepositoryHistory"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx:GitHistoryPage","to":"symbol-name:useEffect","kind":"calls","metadata":{"unresolvedName":"useEffect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx:GitHistoryPage","to":"symbol-name:setSelectedBranch","kind":"calls","metadata":{"unresolvedName":"setSelectedBranch"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx:GitHistoryPage","to":"symbol-name:setSelectedCommit","kind":"calls","metadata":{"unresolvedName":"setSelectedCommit"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx:GitHistoryPage","to":"symbol-name:setDetailStatus","kind":"calls","metadata":{"unresolvedName":"setDetailStatus"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx:GitHistoryPage","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:getCommitDetail","kind":"calls","metadata":{"unresolvedName":"getCommitDetail"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx:GitHistoryPage","to":"symbol-name:setCommitDetail","kind":"calls","metadata":{"unresolvedName":"setCommitDetail"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx:GitHistoryPage","to":"external:new Date(dateStr).toLocaleString","kind":"calls","metadata":{"unresolvedName":"new Date(dateStr).toLocaleString"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx:GitHistoryPage","to":"external:branches.map","kind":"calls","metadata":{"unresolvedName":"branches.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx:GitHistoryPage","to":"symbol-name:navigate","kind":"calls","metadata":{"unresolvedName":"navigate"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx:GitHistoryPage","to":"external:commits.map","kind":"calls","metadata":{"unresolvedName":"commits.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx:GitHistoryPage","to":"/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx:handleCommitClick","kind":"calls","metadata":{"unresolvedName":"handleCommitClick"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx:GitHistoryPage","to":"external:commit.refs.map","kind":"calls","metadata":{"unresolvedName":"commit.refs.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx:GitHistoryPage","to":"external:commit.message.split","kind":"calls","metadata":{"unresolvedName":"commit.message.split"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx:GitHistoryPage","to":"/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx:formatDate","kind":"calls","metadata":{"unresolvedName":"formatDate"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx:GitHistoryPage","to":"external:commitDetail.parents.map","kind":"calls","metadata":{"unresolvedName":"commitDetail.parents.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx:GitHistoryPage","to":"external:parent.substring","kind":"calls","metadata":{"unresolvedName":"parent.substring"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:getRepositoryHistory","kind":"calls","metadata":{"unresolvedName":"getRepositoryHistory"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx:","to":"symbol-name:setSelectedBranch","kind":"calls","metadata":{"unresolvedName":"setSelectedBranch"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx:handleCommitClick","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx:handleCommitClick","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx:handleCommitClick","to":"symbol-name:setSelectedCommit","kind":"calls","metadata":{"unresolvedName":"setSelectedCommit"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx:handleCommitClick","to":"symbol-name:setDetailStatus","kind":"calls","metadata":{"unresolvedName":"setDetailStatus"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx:handleCommitClick","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:getCommitDetail","kind":"calls","metadata":{"unresolvedName":"getCommitDetail"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx:handleCommitClick","to":"symbol-name:setCommitDetail","kind":"calls","metadata":{"unresolvedName":"setCommitDetail"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx:handleCloseDetail","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx:handleCloseDetail","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx:handleCloseDetail","to":"symbol-name:setSelectedCommit","kind":"calls","metadata":{"unresolvedName":"setSelectedCommit"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx:handleCloseDetail","to":"symbol-name:setCommitDetail","kind":"calls","metadata":{"unresolvedName":"setCommitDetail"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx:handleCloseDetail","to":"symbol-name:setDetailStatus","kind":"calls","metadata":{"unresolvedName":"setDetailStatus"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx:formatDate","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx:formatDate","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx:formatDate","to":"external:new Date(dateStr).toLocaleString","kind":"calls","metadata":{"unresolvedName":"new Date(dateStr).toLocaleString"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx:handleCommitClick","kind":"calls","metadata":{"unresolvedName":"handleCommitClick"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/git-repositories.tsx","to":"external:react","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/git-repositories.tsx","to":"external:react-router-dom","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/git-repositories.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/git-repositories.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/git-repositories.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/data-states.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/git-repositories.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/icon.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/git-repositories.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/repository-create-dialog.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/git-repositories.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-async-data.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/git-repositories.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/git-repositories.tsx:GitRepositoriesPage","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/git-repositories.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/git-repositories.tsx:GitRepositoriesPage","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/git-repositories.tsx:GitRepositoriesPage","to":"symbol-name:useParams","kind":"calls","metadata":{"unresolvedName":"useParams"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/git-repositories.tsx:GitRepositoriesPage","to":"symbol-name:useNavigate","kind":"calls","metadata":{"unresolvedName":"useNavigate"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/git-repositories.tsx:GitRepositoriesPage","to":"symbol-name:useState","kind":"calls","metadata":{"unresolvedName":"useState"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/git-repositories.tsx:GitRepositoriesPage","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-async-data.ts:useAsyncData","kind":"calls","metadata":{"unresolvedName":"useAsyncData"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/git-repositories.tsx:GitRepositoriesPage","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:listRepositories","kind":"calls","metadata":{"unresolvedName":"listRepositories"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/git-repositories.tsx:GitRepositoriesPage","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:deleteRepository","kind":"calls","metadata":{"unresolvedName":"deleteRepository"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/git-repositories.tsx:GitRepositoriesPage","to":"symbol-name:setDeleteConfirmId","kind":"calls","metadata":{"unresolvedName":"setDeleteConfirmId"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/git-repositories.tsx:GitRepositoriesPage","to":"symbol-name:reload","kind":"calls","metadata":{"unresolvedName":"reload"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/git-repositories.tsx:GitRepositoriesPage","to":"symbol-name:setShowCreate","kind":"calls","metadata":{"unresolvedName":"setShowCreate"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/git-repositories.tsx:GitRepositoriesPage","to":"external:safeRepositories.map","kind":"calls","metadata":{"unresolvedName":"safeRepositories.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/git-repositories.tsx:GitRepositoriesPage","to":"symbol-name:navigate","kind":"calls","metadata":{"unresolvedName":"navigate"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/git-repositories.tsx:GitRepositoriesPage","to":"symbol-name:handleDelete","kind":"calls","metadata":{"unresolvedName":"handleDelete"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/git-repositories.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/git-repositories.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/git-repositories.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/git-repositories.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/git-repositories.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:listRepositories","kind":"calls","metadata":{"unresolvedName":"listRepositories"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/git-repositories.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/git-repositories.tsx:handleDelete","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/git-repositories.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/git-repositories.tsx:handleDelete","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/git-repositories.tsx:handleDelete","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:deleteRepository","kind":"calls","metadata":{"unresolvedName":"deleteRepository"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/git-repositories.tsx:handleDelete","to":"symbol-name:setDeleteConfirmId","kind":"calls","metadata":{"unresolvedName":"setDeleteConfirmId"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/git-repositories.tsx:handleDelete","to":"symbol-name:reload","kind":"calls","metadata":{"unresolvedName":"reload"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/placeholder.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/icon.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/placeholder.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/placeholder.tsx:PlaceholderPage","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/placeholder.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/placeholder.tsx:PlaceholderPage","kind":"defines"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/placeholder.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/placeholder.tsx:NotFoundPage","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/placeholder.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/placeholder.tsx:NotFoundPage","kind":"defines"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/placeholder.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/placeholder.tsx:LoginRedirectPage","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/placeholder.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/placeholder.tsx:LoginRedirectPage","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/placeholder.tsx:LoginRedirectPage","to":"external:new URLSearchParams(window.location.search).get","kind":"calls","metadata":{"unresolvedName":"new URLSearchParams(window.location.search).get"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/placeholder.tsx:LoginRedirectPage","to":"symbol-name:encodeURIComponent","kind":"calls","metadata":{"unresolvedName":"encodeURIComponent"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx","to":"external:react","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/api/profile.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/data-states.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/icon.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/state/auth.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-async-data.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/api/profile.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx:ProfilePage","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx:ProfilePage","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx:ProfilePage","to":"/home/alex/projects/headquarter/apps/web/src/state/auth.tsx:useAuth","kind":"calls","metadata":{"unresolvedName":"useAuth"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx:ProfilePage","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-async-data.ts:useAsyncData","kind":"calls","metadata":{"unresolvedName":"useAsyncData"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx:ProfilePage","to":"symbol-name:useState","kind":"calls","metadata":{"unresolvedName":"useState"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx:ProfilePage","to":"symbol-name:useRef","kind":"calls","metadata":{"unresolvedName":"useRef"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx:ProfilePage","to":"symbol-name:useEffect","kind":"calls","metadata":{"unresolvedName":"useEffect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx:ProfilePage","to":"symbol-name:setName","kind":"calls","metadata":{"unresolvedName":"setName"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx:ProfilePage","to":"symbol-name:setEmail","kind":"calls","metadata":{"unresolvedName":"setEmail"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx:ProfilePage","to":"symbol-name:setDisplayStatus","kind":"calls","metadata":{"unresolvedName":"setDisplayStatus"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx:ProfilePage","to":"symbol-name:setError","kind":"calls","metadata":{"unresolvedName":"setError"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx:ProfilePage","to":"symbol-name:useCallback","kind":"calls","metadata":{"unresolvedName":"useCallback"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx:ProfilePage","to":"external:name.trim","kind":"calls","metadata":{"unresolvedName":"name.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx:ProfilePage","to":"external:email.includes","kind":"calls","metadata":{"unresolvedName":"email.includes"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx:ProfilePage","to":"/home/alex/projects/headquarter/apps/web/src/api/profile.ts:updateProfile","kind":"calls","metadata":{"unresolvedName":"updateProfile"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx:ProfilePage","to":"external:email.trim","kind":"calls","metadata":{"unresolvedName":"email.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx:ProfilePage","to":"symbol-name:refreshSession","kind":"calls","metadata":{"unresolvedName":"refreshSession"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx:ProfilePage","to":"external:file.type.startsWith","kind":"calls","metadata":{"unresolvedName":"file.type.startsWith"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx:ProfilePage","to":"/home/alex/projects/headquarter/apps/web/src/api/profile.ts:uploadAvatar","kind":"calls","metadata":{"unresolvedName":"uploadAvatar"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx:ProfilePage","to":"symbol-name:reload","kind":"calls","metadata":{"unresolvedName":"reload"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx:ProfilePage","to":"external:profile.name.charAt(0).toUpperCase","kind":"calls","metadata":{"unresolvedName":"profile.name.charAt(0).toUpperCase"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx:ProfilePage","to":"external:profile.name.charAt","kind":"calls","metadata":{"unresolvedName":"profile.name.charAt"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx:ProfilePage","to":"external:fileInputRef.current?.click","kind":"calls","metadata":{"unresolvedName":"fileInputRef.current?.click"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx:ProfilePage","to":"symbol-name:handleSave","kind":"calls","metadata":{"unresolvedName":"handleSave"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx:","to":"symbol-name:setName","kind":"calls","metadata":{"unresolvedName":"setName"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx:","to":"symbol-name:setEmail","kind":"calls","metadata":{"unresolvedName":"setEmail"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx:","to":"symbol-name:setDisplayStatus","kind":"calls","metadata":{"unresolvedName":"setDisplayStatus"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx:","to":"symbol-name:setError","kind":"calls","metadata":{"unresolvedName":"setError"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx:","to":"symbol-name:setDisplayStatus","kind":"calls","metadata":{"unresolvedName":"setDisplayStatus"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx:","to":"external:name.trim","kind":"calls","metadata":{"unresolvedName":"name.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx:","to":"symbol-name:setError","kind":"calls","metadata":{"unresolvedName":"setError"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx:","to":"external:email.includes","kind":"calls","metadata":{"unresolvedName":"email.includes"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx:","to":"symbol-name:setDisplayStatus","kind":"calls","metadata":{"unresolvedName":"setDisplayStatus"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/api/profile.ts:updateProfile","kind":"calls","metadata":{"unresolvedName":"updateProfile"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx:","to":"external:email.trim","kind":"calls","metadata":{"unresolvedName":"email.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx:","to":"symbol-name:refreshSession","kind":"calls","metadata":{"unresolvedName":"refreshSession"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx:","to":"external:file.type.startsWith","kind":"calls","metadata":{"unresolvedName":"file.type.startsWith"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx:","to":"symbol-name:setError","kind":"calls","metadata":{"unresolvedName":"setError"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx:","to":"symbol-name:setDisplayStatus","kind":"calls","metadata":{"unresolvedName":"setDisplayStatus"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/api/profile.ts:uploadAvatar","kind":"calls","metadata":{"unresolvedName":"uploadAvatar"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx:","to":"symbol-name:refreshSession","kind":"calls","metadata":{"unresolvedName":"refreshSession"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx:","to":"symbol-name:reload","kind":"calls","metadata":{"unresolvedName":"reload"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx","to":"external:react","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx","to":"external:react-router-dom","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/settings-tab-layout.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/repositories-settings-tab.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/api/client.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/types.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx:GeneralSettings","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx:GeneralSettings","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx:GeneralSettings","to":"symbol-name:useNavigate","kind":"calls","metadata":{"unresolvedName":"useNavigate"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx:GeneralSettings","to":"symbol-name:useState","kind":"calls","metadata":{"unresolvedName":"useState"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx:GeneralSettings","to":"symbol-name:setSaving","kind":"calls","metadata":{"unresolvedName":"setSaving"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx:GeneralSettings","to":"external:apiClient.patch","kind":"calls","metadata":{"unresolvedName":"apiClient.patch"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx:GeneralSettings","to":"symbol-name:setError","kind":"calls","metadata":{"unresolvedName":"setError"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx:GeneralSettings","to":"external:window.confirm","kind":"calls","metadata":{"unresolvedName":"window.confirm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx:GeneralSettings","to":"external:apiClient.delete","kind":"calls","metadata":{"unresolvedName":"apiClient.delete"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx:GeneralSettings","to":"symbol-name:navigate","kind":"calls","metadata":{"unresolvedName":"navigate"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx:GeneralSettings","to":"symbol-name:setName","kind":"calls","metadata":{"unresolvedName":"setName"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx:GeneralSettings","to":"symbol-name:setDescription","kind":"calls","metadata":{"unresolvedName":"setDescription"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx:handleSave","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx:handleSave","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx:handleSave","to":"symbol-name:setSaving","kind":"calls","metadata":{"unresolvedName":"setSaving"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx:handleSave","to":"external:apiClient.patch","kind":"calls","metadata":{"unresolvedName":"apiClient.patch"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx:handleSave","to":"symbol-name:setError","kind":"calls","metadata":{"unresolvedName":"setError"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx:handleDelete","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx:handleDelete","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx:handleDelete","to":"external:window.confirm","kind":"calls","metadata":{"unresolvedName":"window.confirm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx:handleDelete","to":"external:apiClient.delete","kind":"calls","metadata":{"unresolvedName":"apiClient.delete"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx:handleDelete","to":"symbol-name:navigate","kind":"calls","metadata":{"unresolvedName":"navigate"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx:handleDelete","to":"symbol-name:setError","kind":"calls","metadata":{"unresolvedName":"setError"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx:ProjectSettingsPage","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx:ProjectSettingsPage","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx:ProjectSettingsPage","to":"symbol-name:useParams","kind":"calls","metadata":{"unresolvedName":"useParams"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx:ProjectSettingsPage","to":"symbol-name:useState","kind":"calls","metadata":{"unresolvedName":"useState"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx:ProjectSettingsPage","to":"symbol-name:useEffect","kind":"calls","metadata":{"unresolvedName":"useEffect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx:ProjectSettingsPage","to":"external:apiClient.get","kind":"calls","metadata":{"unresolvedName":"apiClient.get"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx:ProjectSettingsPage","to":"symbol-name:setProject","kind":"calls","metadata":{"unresolvedName":"setProject"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx:ProjectSettingsPage","to":"symbol-name:setError","kind":"calls","metadata":{"unresolvedName":"setError"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx:ProjectSettingsPage","to":"symbol-name:setLoading","kind":"calls","metadata":{"unresolvedName":"setLoading"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx:ProjectSettingsPage","to":"/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx:fetchProject","kind":"calls","metadata":{"unresolvedName":"fetchProject"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx:","to":"external:apiClient.get","kind":"calls","metadata":{"unresolvedName":"apiClient.get"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx:","to":"symbol-name:setProject","kind":"calls","metadata":{"unresolvedName":"setProject"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx:","to":"symbol-name:setError","kind":"calls","metadata":{"unresolvedName":"setError"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx:","to":"symbol-name:setLoading","kind":"calls","metadata":{"unresolvedName":"setLoading"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx:fetchProject","kind":"calls","metadata":{"unresolvedName":"fetchProject"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx:fetchProject","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx:fetchProject","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx:fetchProject","to":"external:apiClient.get","kind":"calls","metadata":{"unresolvedName":"apiClient.get"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx:fetchProject","to":"symbol-name:setProject","kind":"calls","metadata":{"unresolvedName":"setProject"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx:fetchProject","to":"symbol-name:setError","kind":"calls","metadata":{"unresolvedName":"setError"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx:fetchProject","to":"symbol-name:setLoading","kind":"calls","metadata":{"unresolvedName":"setLoading"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx","to":"external:@testing-library/react","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx","to":"external:react-router-dom","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx","to":"external:vitest","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/api/projects.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"symbol-name:cleanup","kind":"calls","metadata":{"unresolvedName":"cleanup"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:vi.restoreAllMocks","kind":"calls","metadata":{"unresolvedName":"vi.restoreAllMocks"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"symbol-name:it","kind":"calls","metadata":{"unresolvedName":"it"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:vi.spyOn(projectsApi, \"listProjects\").mockImplementation","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(projectsApi, \"listProjects\").mockImplementation"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:vi.spyOn","kind":"calls","metadata":{"unresolvedName":"vi.spyOn"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"symbol-name:render","kind":"calls","metadata":{"unresolvedName":"render"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:expect(screen.getByText(/loading projects/i)).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(/loading projects/i)).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:screen.getByText","kind":"calls","metadata":{"unresolvedName":"screen.getByText"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:vi.spyOn(projectsApi, \"listProjects\").mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(projectsApi, \"listProjects\").mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"symbol-name:waitFor","kind":"calls","metadata":{"unresolvedName":"waitFor"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:expect(screen.getByText(\"Alpha Project\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(\"Alpha Project\")).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:expect(screen.getByText(\"Beta Project\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(\"Beta Project\")).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:expect(screen.getByText(\"First project\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(\"First project\")).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:expect(screen.getByText(/no projects yet/i)).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(/no projects yet/i)).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:vi.spyOn(projectsApi, \"listProjects\").mockRejectedValue","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(projectsApi, \"listProjects\").mockRejectedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:expect(screen.getByText(/failed to load projects/i)).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(/failed to load projects/i)).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:expect(screen.getByRole(\"button\", { name: /retry/i })).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByRole(\"button\", { name: /retry/i })).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:screen.getByRole","kind":"calls","metadata":{"unresolvedName":"screen.getByRole"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:vi.spyOn(projectsApi, \"createProject\").mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(projectsApi, \"createProject\").mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:fireEvent.click","kind":"calls","metadata":{"unresolvedName":"fireEvent.click"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:expect(screen.getByRole(\"dialog\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByRole(\"dialog\")).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:fireEvent.change","kind":"calls","metadata":{"unresolvedName":"fireEvent.change"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:screen.getByPlaceholderText","kind":"calls","metadata":{"unresolvedName":"screen.getByPlaceholderText"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:expect(createMock).toHaveBeenCalledWith","kind":"calls","metadata":{"unresolvedName":"expect(createMock).toHaveBeenCalledWith"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:expect(listMock).toHaveBeenCalledTimes","kind":"calls","metadata":{"unresolvedName":"expect(listMock).toHaveBeenCalledTimes"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:expect(screen.getByText(/project name is required/i)).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(/project name is required/i)).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:vi.spyOn(projectsApi, \"updateProject\").mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(projectsApi, \"updateProject\").mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:screen.getByText(\"Alpha Project\").closest","kind":"calls","metadata":{"unresolvedName":"screen.getByText(\"Alpha Project\").closest"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:within(alphaCard).getByRole","kind":"calls","metadata":{"unresolvedName":"within(alphaCard).getByRole"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"symbol-name:within","kind":"calls","metadata":{"unresolvedName":"within"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:screen.getByDisplayValue","kind":"calls","metadata":{"unresolvedName":"screen.getByDisplayValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:expect(updateMock).toHaveBeenCalledWith","kind":"calls","metadata":{"unresolvedName":"expect(updateMock).toHaveBeenCalledWith"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:vi.spyOn(projectsApi, \"deleteProject\").mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(projectsApi, \"deleteProject\").mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:expect(within(alphaCard).getByText(/are you sure/i)).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(within(alphaCard).getByText(/are you sure/i)).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:within(alphaCard).getByText","kind":"calls","metadata":{"unresolvedName":"within(alphaCard).getByText"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:expect(deleteMock).toHaveBeenCalledWith","kind":"calls","metadata":{"unresolvedName":"expect(deleteMock).toHaveBeenCalledWith"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:vi.spyOn(projectsApi, \"listProjects\").mockImplementation","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(projectsApi, \"listProjects\").mockImplementation"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:vi.spyOn","kind":"calls","metadata":{"unresolvedName":"vi.spyOn"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"symbol-name:render","kind":"calls","metadata":{"unresolvedName":"render"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:expect(screen.getByText(/loading projects/i)).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(/loading projects/i)).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:screen.getByText","kind":"calls","metadata":{"unresolvedName":"screen.getByText"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","kind":"defines"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:vi.spyOn(projectsApi, \"listProjects\").mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(projectsApi, \"listProjects\").mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:vi.spyOn","kind":"calls","metadata":{"unresolvedName":"vi.spyOn"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"symbol-name:render","kind":"calls","metadata":{"unresolvedName":"render"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"symbol-name:waitFor","kind":"calls","metadata":{"unresolvedName":"waitFor"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:expect(screen.getByText(\"Alpha Project\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(\"Alpha Project\")).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:screen.getByText","kind":"calls","metadata":{"unresolvedName":"screen.getByText"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:expect(screen.getByText(\"Beta Project\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(\"Beta Project\")).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:expect(screen.getByText(\"First project\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(\"First project\")).toBeInTheDocument"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:expect(screen.getByText(\"Alpha Project\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(\"Alpha Project\")).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:screen.getByText","kind":"calls","metadata":{"unresolvedName":"screen.getByText"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:vi.spyOn(projectsApi, \"listProjects\").mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(projectsApi, \"listProjects\").mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:vi.spyOn","kind":"calls","metadata":{"unresolvedName":"vi.spyOn"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"symbol-name:render","kind":"calls","metadata":{"unresolvedName":"render"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"symbol-name:waitFor","kind":"calls","metadata":{"unresolvedName":"waitFor"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:expect(screen.getByText(/no projects yet/i)).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(/no projects yet/i)).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:screen.getByText","kind":"calls","metadata":{"unresolvedName":"screen.getByText"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:expect(screen.getByText(/no projects yet/i)).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(/no projects yet/i)).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:screen.getByText","kind":"calls","metadata":{"unresolvedName":"screen.getByText"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:vi.spyOn(projectsApi, \"listProjects\").mockRejectedValue","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(projectsApi, \"listProjects\").mockRejectedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:vi.spyOn","kind":"calls","metadata":{"unresolvedName":"vi.spyOn"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"symbol-name:render","kind":"calls","metadata":{"unresolvedName":"render"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"symbol-name:waitFor","kind":"calls","metadata":{"unresolvedName":"waitFor"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:expect(screen.getByText(/failed to load projects/i)).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(/failed to load projects/i)).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:screen.getByText","kind":"calls","metadata":{"unresolvedName":"screen.getByText"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:expect(screen.getByRole(\"button\", { name: /retry/i })).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByRole(\"button\", { name: /retry/i })).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:screen.getByRole","kind":"calls","metadata":{"unresolvedName":"screen.getByRole"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:expect(screen.getByText(/failed to load projects/i)).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(/failed to load projects/i)).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:screen.getByText","kind":"calls","metadata":{"unresolvedName":"screen.getByText"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:vi.spyOn(projectsApi, \"listProjects\").mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(projectsApi, \"listProjects\").mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:vi.spyOn","kind":"calls","metadata":{"unresolvedName":"vi.spyOn"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:vi.spyOn(projectsApi, \"createProject\").mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(projectsApi, \"createProject\").mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"symbol-name:render","kind":"calls","metadata":{"unresolvedName":"render"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"symbol-name:waitFor","kind":"calls","metadata":{"unresolvedName":"waitFor"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:expect(screen.getByText(/no projects yet/i)).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(/no projects yet/i)).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:screen.getByText","kind":"calls","metadata":{"unresolvedName":"screen.getByText"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:fireEvent.click","kind":"calls","metadata":{"unresolvedName":"fireEvent.click"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:screen.getByRole","kind":"calls","metadata":{"unresolvedName":"screen.getByRole"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:expect(screen.getByRole(\"dialog\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByRole(\"dialog\")).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:fireEvent.change","kind":"calls","metadata":{"unresolvedName":"fireEvent.change"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:screen.getByPlaceholderText","kind":"calls","metadata":{"unresolvedName":"screen.getByPlaceholderText"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:expect(createMock).toHaveBeenCalledWith","kind":"calls","metadata":{"unresolvedName":"expect(createMock).toHaveBeenCalledWith"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:expect(listMock).toHaveBeenCalledTimes","kind":"calls","metadata":{"unresolvedName":"expect(listMock).toHaveBeenCalledTimes"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:expect(screen.getByText(/no projects yet/i)).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(/no projects yet/i)).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:screen.getByText","kind":"calls","metadata":{"unresolvedName":"screen.getByText"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:expect(createMock).toHaveBeenCalledWith","kind":"calls","metadata":{"unresolvedName":"expect(createMock).toHaveBeenCalledWith"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:vi.spyOn(projectsApi, \"listProjects\").mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(projectsApi, \"listProjects\").mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:vi.spyOn","kind":"calls","metadata":{"unresolvedName":"vi.spyOn"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"symbol-name:render","kind":"calls","metadata":{"unresolvedName":"render"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"symbol-name:waitFor","kind":"calls","metadata":{"unresolvedName":"waitFor"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:expect(screen.getByText(/no projects yet/i)).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(/no projects yet/i)).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:screen.getByText","kind":"calls","metadata":{"unresolvedName":"screen.getByText"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:fireEvent.click","kind":"calls","metadata":{"unresolvedName":"fireEvent.click"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:screen.getByRole","kind":"calls","metadata":{"unresolvedName":"screen.getByRole"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:expect(screen.getByText(/project name is required/i)).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(/project name is required/i)).toBeInTheDocument"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:expect(screen.getByText(/no projects yet/i)).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(/no projects yet/i)).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:screen.getByText","kind":"calls","metadata":{"unresolvedName":"screen.getByText"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:vi.spyOn(projectsApi, \"listProjects\").mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(projectsApi, \"listProjects\").mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:vi.spyOn","kind":"calls","metadata":{"unresolvedName":"vi.spyOn"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:vi.spyOn(projectsApi, \"updateProject\").mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(projectsApi, \"updateProject\").mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"symbol-name:render","kind":"calls","metadata":{"unresolvedName":"render"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"symbol-name:waitFor","kind":"calls","metadata":{"unresolvedName":"waitFor"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:expect(screen.getByText(\"Alpha Project\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(\"Alpha Project\")).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:screen.getByText","kind":"calls","metadata":{"unresolvedName":"screen.getByText"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:screen.getByText(\"Alpha Project\").closest","kind":"calls","metadata":{"unresolvedName":"screen.getByText(\"Alpha Project\").closest"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:fireEvent.click","kind":"calls","metadata":{"unresolvedName":"fireEvent.click"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:within(alphaCard).getByRole","kind":"calls","metadata":{"unresolvedName":"within(alphaCard).getByRole"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"symbol-name:within","kind":"calls","metadata":{"unresolvedName":"within"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:expect(screen.getByRole(\"dialog\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByRole(\"dialog\")).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:screen.getByRole","kind":"calls","metadata":{"unresolvedName":"screen.getByRole"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:screen.getByDisplayValue","kind":"calls","metadata":{"unresolvedName":"screen.getByDisplayValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:fireEvent.change","kind":"calls","metadata":{"unresolvedName":"fireEvent.change"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:expect(updateMock).toHaveBeenCalledWith","kind":"calls","metadata":{"unresolvedName":"expect(updateMock).toHaveBeenCalledWith"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:expect(listMock).toHaveBeenCalledTimes","kind":"calls","metadata":{"unresolvedName":"expect(listMock).toHaveBeenCalledTimes"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:expect(screen.getByText(\"Alpha Project\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(\"Alpha Project\")).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:screen.getByText","kind":"calls","metadata":{"unresolvedName":"screen.getByText"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:expect(updateMock).toHaveBeenCalledWith","kind":"calls","metadata":{"unresolvedName":"expect(updateMock).toHaveBeenCalledWith"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:vi.spyOn(projectsApi, \"listProjects\").mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(projectsApi, \"listProjects\").mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:vi.spyOn","kind":"calls","metadata":{"unresolvedName":"vi.spyOn"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:vi.spyOn(projectsApi, \"deleteProject\").mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(projectsApi, \"deleteProject\").mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"symbol-name:render","kind":"calls","metadata":{"unresolvedName":"render"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"symbol-name:waitFor","kind":"calls","metadata":{"unresolvedName":"waitFor"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:expect(screen.getByText(\"Alpha Project\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(\"Alpha Project\")).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:screen.getByText","kind":"calls","metadata":{"unresolvedName":"screen.getByText"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:screen.getByText(\"Alpha Project\").closest","kind":"calls","metadata":{"unresolvedName":"screen.getByText(\"Alpha Project\").closest"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:fireEvent.click","kind":"calls","metadata":{"unresolvedName":"fireEvent.click"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:within(alphaCard).getByRole","kind":"calls","metadata":{"unresolvedName":"within(alphaCard).getByRole"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"symbol-name:within","kind":"calls","metadata":{"unresolvedName":"within"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:expect(within(alphaCard).getByText(/are you sure/i)).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(within(alphaCard).getByText(/are you sure/i)).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:within(alphaCard).getByText","kind":"calls","metadata":{"unresolvedName":"within(alphaCard).getByText"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:expect(deleteMock).toHaveBeenCalledWith","kind":"calls","metadata":{"unresolvedName":"expect(deleteMock).toHaveBeenCalledWith"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:expect(listMock).toHaveBeenCalledTimes","kind":"calls","metadata":{"unresolvedName":"expect(listMock).toHaveBeenCalledTimes"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:expect(screen.getByText(\"Alpha Project\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(\"Alpha Project\")).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:screen.getByText","kind":"calls","metadata":{"unresolvedName":"screen.getByText"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"external:expect(deleteMock).toHaveBeenCalledWith","kind":"calls","metadata":{"unresolvedName":"expect(deleteMock).toHaveBeenCalledWith"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx","to":"external:react","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx","to":"external:react-router-dom","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/api/projects.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/data-states.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/icon.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-async-data.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/types.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:ProjectsPage","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:ProjectsPage","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:ProjectsPage","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-async-data.ts:useAsyncData","kind":"calls","metadata":{"unresolvedName":"useAsyncData"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:ProjectsPage","to":"symbol-name:useState","kind":"calls","metadata":{"unresolvedName":"useState"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:ProjectsPage","to":"symbol-name:setFormName","kind":"calls","metadata":{"unresolvedName":"setFormName"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:ProjectsPage","to":"symbol-name:setFormDescription","kind":"calls","metadata":{"unresolvedName":"setFormDescription"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:ProjectsPage","to":"symbol-name:setFormError","kind":"calls","metadata":{"unresolvedName":"setFormError"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:ProjectsPage","to":"symbol-name:setEditingProject","kind":"calls","metadata":{"unresolvedName":"setEditingProject"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:ProjectsPage","to":"symbol-name:setDialogMode","kind":"calls","metadata":{"unresolvedName":"setDialogMode"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:ProjectsPage","to":"external:e.preventDefault","kind":"calls","metadata":{"unresolvedName":"e.preventDefault"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:ProjectsPage","to":"external:formName.trim","kind":"calls","metadata":{"unresolvedName":"formName.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:ProjectsPage","to":"external:formDescription.trim","kind":"calls","metadata":{"unresolvedName":"formDescription.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:ProjectsPage","to":"/home/alex/projects/headquarter/apps/web/src/api/projects.ts:createProject","kind":"calls","metadata":{"unresolvedName":"createProject"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:ProjectsPage","to":"/home/alex/projects/headquarter/apps/web/src/api/projects.ts:updateProject","kind":"calls","metadata":{"unresolvedName":"updateProject"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:ProjectsPage","to":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:closeDialog","kind":"calls","metadata":{"unresolvedName":"closeDialog"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:ProjectsPage","to":"symbol-name:reload","kind":"calls","metadata":{"unresolvedName":"reload"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:ProjectsPage","to":"/home/alex/projects/headquarter/apps/web/src/api/projects.ts:deleteProject","kind":"calls","metadata":{"unresolvedName":"deleteProject"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:ProjectsPage","to":"symbol-name:setDeleteConfirmId","kind":"calls","metadata":{"unresolvedName":"setDeleteConfirmId"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:ProjectsPage","to":"external:safeProjects.map","kind":"calls","metadata":{"unresolvedName":"safeProjects.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:ProjectsPage","to":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:openEdit","kind":"calls","metadata":{"unresolvedName":"openEdit"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:ProjectsPage","to":"symbol-name:handleDelete","kind":"calls","metadata":{"unresolvedName":"handleDelete"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:openCreate","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:openCreate","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:openCreate","to":"symbol-name:setFormName","kind":"calls","metadata":{"unresolvedName":"setFormName"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:openCreate","to":"symbol-name:setFormDescription","kind":"calls","metadata":{"unresolvedName":"setFormDescription"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:openCreate","to":"symbol-name:setFormError","kind":"calls","metadata":{"unresolvedName":"setFormError"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:openCreate","to":"symbol-name:setEditingProject","kind":"calls","metadata":{"unresolvedName":"setEditingProject"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:openCreate","to":"symbol-name:setDialogMode","kind":"calls","metadata":{"unresolvedName":"setDialogMode"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:openEdit","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:openEdit","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:openEdit","to":"symbol-name:setFormName","kind":"calls","metadata":{"unresolvedName":"setFormName"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:openEdit","to":"symbol-name:setFormDescription","kind":"calls","metadata":{"unresolvedName":"setFormDescription"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:openEdit","to":"symbol-name:setFormError","kind":"calls","metadata":{"unresolvedName":"setFormError"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:openEdit","to":"symbol-name:setEditingProject","kind":"calls","metadata":{"unresolvedName":"setEditingProject"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:openEdit","to":"symbol-name:setDialogMode","kind":"calls","metadata":{"unresolvedName":"setDialogMode"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:closeDialog","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:closeDialog","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:closeDialog","to":"symbol-name:setDialogMode","kind":"calls","metadata":{"unresolvedName":"setDialogMode"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:closeDialog","to":"symbol-name:setEditingProject","kind":"calls","metadata":{"unresolvedName":"setEditingProject"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:closeDialog","to":"symbol-name:setFormError","kind":"calls","metadata":{"unresolvedName":"setFormError"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:handleSubmit","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:handleSubmit","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:handleSubmit","to":"external:e.preventDefault","kind":"calls","metadata":{"unresolvedName":"e.preventDefault"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:handleSubmit","to":"symbol-name:setFormError","kind":"calls","metadata":{"unresolvedName":"setFormError"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:handleSubmit","to":"external:formName.trim","kind":"calls","metadata":{"unresolvedName":"formName.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:handleSubmit","to":"external:formDescription.trim","kind":"calls","metadata":{"unresolvedName":"formDescription.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:handleSubmit","to":"/home/alex/projects/headquarter/apps/web/src/api/projects.ts:createProject","kind":"calls","metadata":{"unresolvedName":"createProject"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:handleSubmit","to":"/home/alex/projects/headquarter/apps/web/src/api/projects.ts:updateProject","kind":"calls","metadata":{"unresolvedName":"updateProject"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:handleSubmit","to":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:closeDialog","kind":"calls","metadata":{"unresolvedName":"closeDialog"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:handleSubmit","to":"symbol-name:reload","kind":"calls","metadata":{"unresolvedName":"reload"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:handleDelete","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:handleDelete","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:handleDelete","to":"/home/alex/projects/headquarter/apps/web/src/api/projects.ts:deleteProject","kind":"calls","metadata":{"unresolvedName":"deleteProject"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:handleDelete","to":"symbol-name:setDeleteConfirmId","kind":"calls","metadata":{"unresolvedName":"setDeleteConfirmId"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx:handleDelete","to":"symbol-name:reload","kind":"calls","metadata":{"unresolvedName":"reload"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","to":"external:react","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/data-states.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/icon.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-mobile-viewport.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","to":"external:react-router-dom","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/api/client.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/commit-panel.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/file-editor.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/git-toolbar.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/instance-list.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/workspace-header.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:RepoWorkspace","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:RepoWorkspace","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:RepoWorkspace","to":"symbol-name:useParams","kind":"calls","metadata":{"unresolvedName":"useParams"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:RepoWorkspace","to":"symbol-name:useSearchParams","kind":"calls","metadata":{"unresolvedName":"useSearchParams"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:RepoWorkspace","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-mobile-viewport.ts:useMobileViewport","kind":"calls","metadata":{"unresolvedName":"useMobileViewport"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:RepoWorkspace","to":"symbol-name:useState","kind":"calls","metadata":{"unresolvedName":"useState"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:RepoWorkspace","to":"external:searchParams.get","kind":"calls","metadata":{"unresolvedName":"searchParams.get"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:RepoWorkspace","to":"symbol-name:useCallback","kind":"calls","metadata":{"unresolvedName":"useCallback"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:RepoWorkspace","to":"external:apiClient.get","kind":"calls","metadata":{"unresolvedName":"apiClient.get"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:RepoWorkspace","to":"symbol-name:setProject","kind":"calls","metadata":{"unresolvedName":"setProject"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:RepoWorkspace","to":"symbol-name:setStatus","kind":"calls","metadata":{"unresolvedName":"setStatus"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:RepoWorkspace","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:listRepositories","kind":"calls","metadata":{"unresolvedName":"listRepositories"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:RepoWorkspace","to":"symbol-name:setRepositories","kind":"calls","metadata":{"unresolvedName":"setRepositories"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:RepoWorkspace","to":"symbol-name:setSelectedRepoId","kind":"calls","metadata":{"unresolvedName":"setSelectedRepoId"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:RepoWorkspace","to":"external:newParams.set","kind":"calls","metadata":{"unresolvedName":"newParams.set"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:RepoWorkspace","to":"symbol-name:setSearchParams","kind":"calls","metadata":{"unresolvedName":"setSearchParams"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:RepoWorkspace","to":"external:response.data.branches.map","kind":"calls","metadata":{"unresolvedName":"response.data.branches.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:RepoWorkspace","to":"symbol-name:setBranches","kind":"calls","metadata":{"unresolvedName":"setBranches"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:RepoWorkspace","to":"symbol-name:setCurrentBranch","kind":"calls","metadata":{"unresolvedName":"setCurrentBranch"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:RepoWorkspace","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:getRepositoryStatus","kind":"calls","metadata":{"unresolvedName":"getRepositoryStatus"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:RepoWorkspace","to":"symbol-name:setGitStatus","kind":"calls","metadata":{"unresolvedName":"setGitStatus"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:RepoWorkspace","to":"symbol-name:setToolTypes","kind":"calls","metadata":{"unresolvedName":"setToolTypes"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:RepoWorkspace","to":"symbol-name:useEffect","kind":"calls","metadata":{"unresolvedName":"useEffect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:RepoWorkspace","to":"symbol-name:loadProject","kind":"calls","metadata":{"unresolvedName":"loadProject"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:RepoWorkspace","to":"symbol-name:loadRepositories","kind":"calls","metadata":{"unresolvedName":"loadRepositories"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:RepoWorkspace","to":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:loadToolTypes","kind":"calls","metadata":{"unresolvedName":"loadToolTypes"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:RepoWorkspace","to":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:loadBranches","kind":"calls","metadata":{"unresolvedName":"loadBranches"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:RepoWorkspace","to":"symbol-name:loadGitStatus","kind":"calls","metadata":{"unresolvedName":"loadGitStatus"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:RepoWorkspace","to":"external:newParams.delete","kind":"calls","metadata":{"unresolvedName":"newParams.delete"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:RepoWorkspace","to":"external:repositories.find","kind":"calls","metadata":{"unresolvedName":"repositories.find"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:RepoWorkspace","to":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:handleRepoChange","kind":"calls","metadata":{"unresolvedName":"handleRepoChange"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:RepoWorkspace","to":"external:repositories.map","kind":"calls","metadata":{"unresolvedName":"repositories.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:RepoWorkspace","to":"external:branches.map","kind":"calls","metadata":{"unresolvedName":"branches.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:RepoWorkspace","to":"external:window.dispatchEvent","kind":"calls","metadata":{"unresolvedName":"window.dispatchEvent"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:RepoWorkspace","to":"symbol-name:setMobileTab","kind":"calls","metadata":{"unresolvedName":"setMobileTab"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:RepoWorkspace","to":"symbol-name:Boolean","kind":"calls","metadata":{"unresolvedName":"Boolean"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","to":"external:apiClient.get","kind":"calls","metadata":{"unresolvedName":"apiClient.get"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","to":"symbol-name:setProject","kind":"calls","metadata":{"unresolvedName":"setProject"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","to":"symbol-name:setStatus","kind":"calls","metadata":{"unresolvedName":"setStatus"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:listRepositories","kind":"calls","metadata":{"unresolvedName":"listRepositories"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","to":"symbol-name:setRepositories","kind":"calls","metadata":{"unresolvedName":"setRepositories"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","to":"symbol-name:setSelectedRepoId","kind":"calls","metadata":{"unresolvedName":"setSelectedRepoId"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","to":"external:newParams.set","kind":"calls","metadata":{"unresolvedName":"newParams.set"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","to":"symbol-name:setSearchParams","kind":"calls","metadata":{"unresolvedName":"setSearchParams"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","to":"external:apiClient.get","kind":"calls","metadata":{"unresolvedName":"apiClient.get"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","to":"external:response.data.branches.map","kind":"calls","metadata":{"unresolvedName":"response.data.branches.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","to":"symbol-name:setBranches","kind":"calls","metadata":{"unresolvedName":"setBranches"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","to":"symbol-name:setCurrentBranch","kind":"calls","metadata":{"unresolvedName":"setCurrentBranch"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:getRepositoryStatus","kind":"calls","metadata":{"unresolvedName":"getRepositoryStatus"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","to":"symbol-name:setGitStatus","kind":"calls","metadata":{"unresolvedName":"setGitStatus"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","to":"symbol-name:setToolTypes","kind":"calls","metadata":{"unresolvedName":"setToolTypes"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","to":"symbol-name:loadProject","kind":"calls","metadata":{"unresolvedName":"loadProject"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","to":"symbol-name:loadRepositories","kind":"calls","metadata":{"unresolvedName":"loadRepositories"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:loadToolTypes","kind":"calls","metadata":{"unresolvedName":"loadToolTypes"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:loadBranches","kind":"calls","metadata":{"unresolvedName":"loadBranches"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","to":"symbol-name:loadGitStatus","kind":"calls","metadata":{"unresolvedName":"loadGitStatus"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:handleRepoChange","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:handleRepoChange","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:handleRepoChange","to":"symbol-name:setSelectedRepoId","kind":"calls","metadata":{"unresolvedName":"setSelectedRepoId"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:handleRepoChange","to":"external:newParams.set","kind":"calls","metadata":{"unresolvedName":"newParams.set"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:handleRepoChange","to":"external:newParams.delete","kind":"calls","metadata":{"unresolvedName":"newParams.delete"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:handleRepoChange","to":"symbol-name:setSearchParams","kind":"calls","metadata":{"unresolvedName":"setSearchParams"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","to":"symbol-name:setCurrentBranch","kind":"calls","metadata":{"unresolvedName":"setCurrentBranch"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","to":"external:newParams.set","kind":"calls","metadata":{"unresolvedName":"newParams.set"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","to":"symbol-name:setSearchParams","kind":"calls","metadata":{"unresolvedName":"setSearchParams"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","to":"symbol-name:loadGitStatus","kind":"calls","metadata":{"unresolvedName":"loadGitStatus"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","to":"external:window.dispatchEvent","kind":"calls","metadata":{"unresolvedName":"window.dispatchEvent"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","to":"symbol-name:setCurrentBranch","kind":"calls","metadata":{"unresolvedName":"setCurrentBranch"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","to":"external:newParams.set","kind":"calls","metadata":{"unresolvedName":"newParams.set"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","to":"symbol-name:setSearchParams","kind":"calls","metadata":{"unresolvedName":"setSearchParams"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx:loadBranches","kind":"calls","metadata":{"unresolvedName":"loadBranches"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","to":"symbol-name:loadGitStatus","kind":"calls","metadata":{"unresolvedName":"loadGitStatus"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","to":"external:window.dispatchEvent","kind":"calls","metadata":{"unresolvedName":"window.dispatchEvent"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","to":"symbol-name:loadGitStatus","kind":"calls","metadata":{"unresolvedName":"loadGitStatus"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","to":"external:window.dispatchEvent","kind":"calls","metadata":{"unresolvedName":"window.dispatchEvent"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:FileBrowser","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:FileBrowser","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:FileBrowser","to":"symbol-name:useSearchParams","kind":"calls","metadata":{"unresolvedName":"useSearchParams"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:FileBrowser","to":"symbol-name:useState","kind":"calls","metadata":{"unresolvedName":"useState"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:FileBrowser","to":"external:searchParams.get","kind":"calls","metadata":{"unresolvedName":"searchParams.get"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:FileBrowser","to":"symbol-name:useCallback","kind":"calls","metadata":{"unresolvedName":"useCallback"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:FileBrowser","to":"symbol-name:setLoading","kind":"calls","metadata":{"unresolvedName":"setLoading"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:FileBrowser","to":"symbol-name:setError","kind":"calls","metadata":{"unresolvedName":"setError"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:FileBrowser","to":"external:apiClient.get","kind":"calls","metadata":{"unresolvedName":"apiClient.get"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:FileBrowser","to":"symbol-name:setEntries","kind":"calls","metadata":{"unresolvedName":"setEntries"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:FileBrowser","to":"symbol-name:useEffect","kind":"calls","metadata":{"unresolvedName":"useEffect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:FileBrowser","to":"symbol-name:loadFiles","kind":"calls","metadata":{"unresolvedName":"loadFiles"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:FileBrowser","to":"external:window.addEventListener","kind":"calls","metadata":{"unresolvedName":"window.addEventListener"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:FileBrowser","to":"external:window.removeEventListener","kind":"calls","metadata":{"unresolvedName":"window.removeEventListener"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:FileBrowser","to":"external:newParams.set","kind":"calls","metadata":{"unresolvedName":"newParams.set"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:FileBrowser","to":"symbol-name:setSearchParams","kind":"calls","metadata":{"unresolvedName":"setSearchParams"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:FileBrowser","to":"external:path.split(\"/\").slice(0, -1).join","kind":"calls","metadata":{"unresolvedName":"path.split(\"/\").slice(0, -1).join"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:FileBrowser","to":"external:path.split(\"/\").slice","kind":"calls","metadata":{"unresolvedName":"path.split(\"/\").slice"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:FileBrowser","to":"external:path.split","kind":"calls","metadata":{"unresolvedName":"path.split"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:FileBrowser","to":"external:newParams.delete","kind":"calls","metadata":{"unresolvedName":"newParams.delete"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:FileBrowser","to":"external:gitStatus.modified.includes","kind":"calls","metadata":{"unresolvedName":"gitStatus.modified.includes"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:FileBrowser","to":"external:gitStatus.added.includes","kind":"calls","metadata":{"unresolvedName":"gitStatus.added.includes"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:FileBrowser","to":"external:gitStatus.deleted.includes","kind":"calls","metadata":{"unresolvedName":"gitStatus.deleted.includes"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:FileBrowser","to":"external:gitStatus.untracked.includes","kind":"calls","metadata":{"unresolvedName":"gitStatus.untracked.includes"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:FileBrowser","to":"external:entries.map","kind":"calls","metadata":{"unresolvedName":"entries.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:FileBrowser","to":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:getFileStatus","kind":"calls","metadata":{"unresolvedName":"getFileStatus"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:FileBrowser","to":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:handleEntryClick","kind":"calls","metadata":{"unresolvedName":"handleEntryClick"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","to":"symbol-name:setLoading","kind":"calls","metadata":{"unresolvedName":"setLoading"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","to":"symbol-name:setError","kind":"calls","metadata":{"unresolvedName":"setError"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","to":"external:apiClient.get","kind":"calls","metadata":{"unresolvedName":"apiClient.get"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","to":"symbol-name:setEntries","kind":"calls","metadata":{"unresolvedName":"setEntries"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","to":"symbol-name:loadFiles","kind":"calls","metadata":{"unresolvedName":"loadFiles"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","to":"symbol-name:loadFiles","kind":"calls","metadata":{"unresolvedName":"loadFiles"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","to":"external:window.addEventListener","kind":"calls","metadata":{"unresolvedName":"window.addEventListener"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","to":"external:window.removeEventListener","kind":"calls","metadata":{"unresolvedName":"window.removeEventListener"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:handleEntryClick","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:handleEntryClick","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:handleEntryClick","to":"external:newParams.set","kind":"calls","metadata":{"unresolvedName":"newParams.set"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:handleEntryClick","to":"symbol-name:setSearchParams","kind":"calls","metadata":{"unresolvedName":"setSearchParams"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:navigateUp","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:navigateUp","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:navigateUp","to":"external:path.split(\"/\").slice(0, -1).join","kind":"calls","metadata":{"unresolvedName":"path.split(\"/\").slice(0, -1).join"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:navigateUp","to":"external:path.split(\"/\").slice","kind":"calls","metadata":{"unresolvedName":"path.split(\"/\").slice"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:navigateUp","to":"external:path.split","kind":"calls","metadata":{"unresolvedName":"path.split"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:navigateUp","to":"external:newParams.set","kind":"calls","metadata":{"unresolvedName":"newParams.set"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:navigateUp","to":"external:newParams.delete","kind":"calls","metadata":{"unresolvedName":"newParams.delete"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:navigateUp","to":"symbol-name:setSearchParams","kind":"calls","metadata":{"unresolvedName":"setSearchParams"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:getFileStatus","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:getFileStatus","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:getFileStatus","to":"external:gitStatus.modified.includes","kind":"calls","metadata":{"unresolvedName":"gitStatus.modified.includes"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:getFileStatus","to":"external:gitStatus.added.includes","kind":"calls","metadata":{"unresolvedName":"gitStatus.added.includes"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:getFileStatus","to":"external:gitStatus.deleted.includes","kind":"calls","metadata":{"unresolvedName":"gitStatus.deleted.includes"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:getFileStatus","to":"external:gitStatus.untracked.includes","kind":"calls","metadata":{"unresolvedName":"gitStatus.untracked.includes"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:getFileStatus","kind":"calls","metadata":{"unresolvedName":"getFileStatus"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:handleEntryClick","kind":"calls","metadata":{"unresolvedName":"handleEntryClick"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx","to":"external:react","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/api/projects.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/types.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/api/sessions.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/api/settings.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/data-states.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/create-session-form.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/session-list.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/session-card.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/api/sessions.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:SessionsPage","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:SessionsPage","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:SessionsPage","to":"symbol-name:useState","kind":"calls","metadata":{"unresolvedName":"useState"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:SessionsPage","to":"symbol-name:useCallback","kind":"calls","metadata":{"unresolvedName":"useCallback"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:SessionsPage","to":"symbol-name:setStatus","kind":"calls","metadata":{"unresolvedName":"setStatus"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:SessionsPage","to":"external:Promise.all","kind":"calls","metadata":{"unresolvedName":"Promise.all"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:SessionsPage","to":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:getUserSessions","kind":"calls","metadata":{"unresolvedName":"getUserSessions"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:SessionsPage","to":"/home/alex/projects/headquarter/apps/web/src/api/settings.ts:getUserConfig","kind":"calls","metadata":{"unresolvedName":"getUserConfig"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:SessionsPage","to":"symbol-name:setSessions","kind":"calls","metadata":{"unresolvedName":"setSessions"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:SessionsPage","to":"symbol-name:setLastSessionId","kind":"calls","metadata":{"unresolvedName":"setLastSessionId"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:SessionsPage","to":"symbol-name:useEffect","kind":"calls","metadata":{"unresolvedName":"useEffect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:SessionsPage","to":"symbol-name:loadSessions","kind":"calls","metadata":{"unresolvedName":"loadSessions"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:SessionsPage","to":"/home/alex/projects/headquarter/apps/web/src/api/projects.ts:listProjects","kind":"calls","metadata":{"unresolvedName":"listProjects"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:SessionsPage","to":"symbol-name:setProjects","kind":"calls","metadata":{"unresolvedName":"setProjects"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:SessionsPage","to":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:loadProjects","kind":"calls","metadata":{"unresolvedName":"loadProjects"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:SessionsPage","to":"symbol-name:setToolTypes","kind":"calls","metadata":{"unresolvedName":"setToolTypes"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:SessionsPage","to":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:loadToolTypes","kind":"calls","metadata":{"unresolvedName":"loadToolTypes"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:SessionsPage","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-instance-actions.ts:useInstanceActions","kind":"calls","metadata":{"unresolvedName":"useInstanceActions"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:SessionsPage","to":"external:sessions.filter","kind":"calls","metadata":{"unresolvedName":"sessions.filter"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:SessionsPage","to":"external:[\"running\", \"starting\", \"unhealthy\", \"probing\"].includes","kind":"calls","metadata":{"unresolvedName":"[\"running\", \"starting\", \"unhealthy\", \"probing\"].includes"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:SessionsPage","to":"external:s.tool_type_interfaces?.includes","kind":"calls","metadata":{"unresolvedName":"s.tool_type_interfaces?.includes"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:SessionsPage","to":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:checkInstanceHealth","kind":"calls","metadata":{"unresolvedName":"checkInstanceHealth"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:SessionsPage","to":"symbol-name:setTunnelHealth","kind":"calls","metadata":{"unresolvedName":"setTunnelHealth"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:SessionsPage","to":"symbol-name:checkHealth","kind":"calls","metadata":{"unresolvedName":"checkHealth"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:SessionsPage","to":"symbol-name:setInterval","kind":"calls","metadata":{"unresolvedName":"setInterval"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:SessionsPage","to":"symbol-name:clearInterval","kind":"calls","metadata":{"unresolvedName":"clearInterval"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:SessionsPage","to":"symbol-name:setRepositories","kind":"calls","metadata":{"unresolvedName":"setRepositories"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:SessionsPage","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:listRepositories","kind":"calls","metadata":{"unresolvedName":"listRepositories"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:SessionsPage","to":"symbol-name:loadRepos","kind":"calls","metadata":{"unresolvedName":"loadRepos"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:SessionsPage","to":"symbol-name:useMemo","kind":"calls","metadata":{"unresolvedName":"useMemo"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:SessionsPage","to":"external:sessions.find","kind":"calls","metadata":{"unresolvedName":"sessions.find"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:SessionsPage","to":"/home/alex/projects/headquarter/apps/web/src/api/settings.ts:updateUserConfig","kind":"calls","metadata":{"unresolvedName":"updateUserConfig"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:SessionsPage","to":"symbol-name:setSelectedProject","kind":"calls","metadata":{"unresolvedName":"setSelectedProject"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:SessionsPage","to":"external:e.stopPropagation","kind":"calls","metadata":{"unresolvedName":"e.stopPropagation"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:SessionsPage","to":"external:dirtyDeleteFiles.map","kind":"calls","metadata":{"unresolvedName":"dirtyDeleteFiles.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:SessionsPage","to":"symbol-name:handleForceDelete","kind":"calls","metadata":{"unresolvedName":"handleForceDelete"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:","to":"symbol-name:setStatus","kind":"calls","metadata":{"unresolvedName":"setStatus"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:","to":"external:Promise.all","kind":"calls","metadata":{"unresolvedName":"Promise.all"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:getUserSessions","kind":"calls","metadata":{"unresolvedName":"getUserSessions"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/api/settings.ts:getUserConfig","kind":"calls","metadata":{"unresolvedName":"getUserConfig"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:","to":"symbol-name:setSessions","kind":"calls","metadata":{"unresolvedName":"setSessions"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:","to":"symbol-name:setLastSessionId","kind":"calls","metadata":{"unresolvedName":"setLastSessionId"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:","to":"symbol-name:loadSessions","kind":"calls","metadata":{"unresolvedName":"loadSessions"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/api/projects.ts:listProjects","kind":"calls","metadata":{"unresolvedName":"listProjects"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:","to":"symbol-name:setProjects","kind":"calls","metadata":{"unresolvedName":"setProjects"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:loadProjects","kind":"calls","metadata":{"unresolvedName":"loadProjects"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:loadProjects","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:loadProjects","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:loadProjects","to":"/home/alex/projects/headquarter/apps/web/src/api/projects.ts:listProjects","kind":"calls","metadata":{"unresolvedName":"listProjects"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:loadProjects","to":"symbol-name:setProjects","kind":"calls","metadata":{"unresolvedName":"setProjects"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:","to":"symbol-name:setToolTypes","kind":"calls","metadata":{"unresolvedName":"setToolTypes"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:loadToolTypes","kind":"calls","metadata":{"unresolvedName":"loadToolTypes"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:loadToolTypes","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:loadToolTypes","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:loadToolTypes","to":"symbol-name:setToolTypes","kind":"calls","metadata":{"unresolvedName":"setToolTypes"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:","to":"external:sessions.filter","kind":"calls","metadata":{"unresolvedName":"sessions.filter"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:","to":"external:[\"running\", \"starting\", \"unhealthy\", \"probing\"].includes","kind":"calls","metadata":{"unresolvedName":"[\"running\", \"starting\", \"unhealthy\", \"probing\"].includes"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:","to":"external:s.tool_type_interfaces?.includes","kind":"calls","metadata":{"unresolvedName":"s.tool_type_interfaces?.includes"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:checkInstanceHealth","kind":"calls","metadata":{"unresolvedName":"checkInstanceHealth"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:","to":"symbol-name:setTunnelHealth","kind":"calls","metadata":{"unresolvedName":"setTunnelHealth"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:","to":"symbol-name:checkHealth","kind":"calls","metadata":{"unresolvedName":"checkHealth"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:","to":"symbol-name:setInterval","kind":"calls","metadata":{"unresolvedName":"setInterval"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:","to":"symbol-name:clearInterval","kind":"calls","metadata":{"unresolvedName":"clearInterval"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:checkHealth","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:checkHealth","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:checkHealth","to":"external:sessions.filter","kind":"calls","metadata":{"unresolvedName":"sessions.filter"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:checkHealth","to":"external:[\"running\", \"starting\", \"unhealthy\", \"probing\"].includes","kind":"calls","metadata":{"unresolvedName":"[\"running\", \"starting\", \"unhealthy\", \"probing\"].includes"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:checkHealth","to":"external:s.tool_type_interfaces?.includes","kind":"calls","metadata":{"unresolvedName":"s.tool_type_interfaces?.includes"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:checkHealth","to":"/home/alex/projects/headquarter/apps/web/src/api/sessions.ts:checkInstanceHealth","kind":"calls","metadata":{"unresolvedName":"checkInstanceHealth"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:checkHealth","to":"symbol-name:setTunnelHealth","kind":"calls","metadata":{"unresolvedName":"setTunnelHealth"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:","to":"symbol-name:setRepositories","kind":"calls","metadata":{"unresolvedName":"setRepositories"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:listRepositories","kind":"calls","metadata":{"unresolvedName":"listRepositories"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:","to":"symbol-name:loadRepos","kind":"calls","metadata":{"unresolvedName":"loadRepos"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:loadRepos","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:loadRepos","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:loadRepos","to":"/home/alex/projects/headquarter/apps/web/src/api/git_repositories.ts:listRepositories","kind":"calls","metadata":{"unresolvedName":"listRepositories"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:loadRepos","to":"symbol-name:setRepositories","kind":"calls","metadata":{"unresolvedName":"setRepositories"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:handleCreateSuccess","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:handleCreateSuccess","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:handleCreateSuccess","to":"/home/alex/projects/headquarter/apps/web/src/api/settings.ts:updateUserConfig","kind":"calls","metadata":{"unresolvedName":"updateUserConfig"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:handleCreateSuccess","to":"symbol-name:setSelectedProject","kind":"calls","metadata":{"unresolvedName":"setSelectedProject"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:handleCreateSuccess","to":"symbol-name:loadSessions","kind":"calls","metadata":{"unresolvedName":"loadSessions"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:","to":"symbol-name:setSelectedProject","kind":"calls","metadata":{"unresolvedName":"setSelectedProject"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx","to":"external:react","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx","to":"external:react-router-dom","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/api/settings.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/data-states.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/icon.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-async-data.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx:SettingsPage","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx:SettingsPage","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx:SettingsPage","to":"symbol-name:useLocation","kind":"calls","metadata":{"unresolvedName":"useLocation"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx:SettingsPage","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-async-data.ts:useAsyncData","kind":"calls","metadata":{"unresolvedName":"useAsyncData"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx:SettingsPage","to":"symbol-name:useState","kind":"calls","metadata":{"unresolvedName":"useState"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx:SettingsPage","to":"symbol-name:useEffect","kind":"calls","metadata":{"unresolvedName":"useEffect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx:SettingsPage","to":"symbol-name:setConfig","kind":"calls","metadata":{"unresolvedName":"setConfig"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx:SettingsPage","to":"symbol-name:setSaveStatus","kind":"calls","metadata":{"unresolvedName":"setSaveStatus"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx:SettingsPage","to":"/home/alex/projects/headquarter/apps/web/src/api/settings.ts:updateUserConfig","kind":"calls","metadata":{"unresolvedName":"updateUserConfig"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx:SettingsPage","to":"external:document.documentElement.removeAttribute","kind":"calls","metadata":{"unresolvedName":"document.documentElement.removeAttribute"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx:SettingsPage","to":"external:document.documentElement.setAttribute","kind":"calls","metadata":{"unresolvedName":"document.documentElement.setAttribute"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx:SettingsPage","to":"external:window.setTimeout","kind":"calls","metadata":{"unresolvedName":"window.setTimeout"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx:SettingsPage","to":"external:location.pathname.split(\"/\").filter","kind":"calls","metadata":{"unresolvedName":"location.pathname.split(\"/\").filter"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx:SettingsPage","to":"external:location.pathname.split","kind":"calls","metadata":{"unresolvedName":"location.pathname.split"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx:SettingsPage","to":"external:location.pathname.endsWith","kind":"calls","metadata":{"unresolvedName":"location.pathname.endsWith"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx:SettingsPage","to":"external:TABS.map","kind":"calls","metadata":{"unresolvedName":"TABS.map"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx:","to":"symbol-name:setConfig","kind":"calls","metadata":{"unresolvedName":"setConfig"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx:handleChange","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx:handleChange","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx:handleChange","to":"symbol-name:setConfig","kind":"calls","metadata":{"unresolvedName":"setConfig"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx:handleChange","to":"symbol-name:setSaveStatus","kind":"calls","metadata":{"unresolvedName":"setSaveStatus"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx:handleSave","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx:handleSave","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx:handleSave","to":"symbol-name:setSaveStatus","kind":"calls","metadata":{"unresolvedName":"setSaveStatus"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx:handleSave","to":"/home/alex/projects/headquarter/apps/web/src/api/settings.ts:updateUserConfig","kind":"calls","metadata":{"unresolvedName":"updateUserConfig"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx:handleSave","to":"symbol-name:setConfig","kind":"calls","metadata":{"unresolvedName":"setConfig"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx:handleSave","to":"external:document.documentElement.removeAttribute","kind":"calls","metadata":{"unresolvedName":"document.documentElement.removeAttribute"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx:handleSave","to":"external:document.documentElement.setAttribute","kind":"calls","metadata":{"unresolvedName":"document.documentElement.setAttribute"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx:handleSave","to":"external:window.setTimeout","kind":"calls","metadata":{"unresolvedName":"window.setTimeout"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx:GeneralSettingsTab","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx:GeneralSettingsTab","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx:GeneralSettingsTab","to":"symbol-name:useOutletContext","kind":"calls","metadata":{"unresolvedName":"useOutletContext"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx:GeneralSettingsTab","to":"symbol-name:handleChange","kind":"calls","metadata":{"unresolvedName":"handleChange"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx:GeneralSettingsTab","to":"external:THEME_OPTIONS.map","kind":"calls","metadata":{"unresolvedName":"THEME_OPTIONS.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx:GeneralSettingsTab","to":"symbol-name:handleSave","kind":"calls","metadata":{"unresolvedName":"handleSave"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx","to":"external:react","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx","to":"external:react-router-dom","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/api/ssh_keys.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/data-states.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/icon.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-async-data.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:SSHKeysPage","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:SSHKeysPage","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:SSHKeysPage","to":"symbol-name:useNavigate","kind":"calls","metadata":{"unresolvedName":"useNavigate"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:SSHKeysPage","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-async-data.ts:useAsyncData","kind":"calls","metadata":{"unresolvedName":"useAsyncData"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:SSHKeysPage","to":"symbol-name:useState","kind":"calls","metadata":{"unresolvedName":"useState"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:SSHKeysPage","to":"external:e.preventDefault","kind":"calls","metadata":{"unresolvedName":"e.preventDefault"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:SSHKeysPage","to":"external:newKeyName.trim","kind":"calls","metadata":{"unresolvedName":"newKeyName.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:SSHKeysPage","to":"symbol-name:setGenerating","kind":"calls","metadata":{"unresolvedName":"setGenerating"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:SSHKeysPage","to":"/home/alex/projects/headquarter/apps/web/src/api/ssh_keys.ts:createSSHKey","kind":"calls","metadata":{"unresolvedName":"createSSHKey"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:SSHKeysPage","to":"symbol-name:setNewKeyName","kind":"calls","metadata":{"unresolvedName":"setNewKeyName"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:SSHKeysPage","to":"symbol-name:loadKeys","kind":"calls","metadata":{"unresolvedName":"loadKeys"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:SSHKeysPage","to":"symbol-name:setMutationError","kind":"calls","metadata":{"unresolvedName":"setMutationError"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:SSHKeysPage","to":"symbol-name:confirm","kind":"calls","metadata":{"unresolvedName":"confirm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:SSHKeysPage","to":"/home/alex/projects/headquarter/apps/web/src/api/ssh_keys.ts:deleteSSHKey","kind":"calls","metadata":{"unresolvedName":"deleteSSHKey"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:SSHKeysPage","to":"external:navigator.clipboard.writeText","kind":"calls","metadata":{"unresolvedName":"navigator.clipboard.writeText"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:SSHKeysPage","to":"external:payload?.trim","kind":"calls","metadata":{"unresolvedName":"payload?.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:SSHKeysPage","to":"symbol-name:setSigning","kind":"calls","metadata":{"unresolvedName":"setSigning"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:SSHKeysPage","to":"/home/alex/projects/headquarter/apps/web/src/api/ssh_keys.ts:signPayload","kind":"calls","metadata":{"unresolvedName":"signPayload"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:SSHKeysPage","to":"external:payload.trim","kind":"calls","metadata":{"unresolvedName":"payload.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:SSHKeysPage","to":"symbol-name:setSignatures","kind":"calls","metadata":{"unresolvedName":"setSignatures"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:SSHKeysPage","to":"external:signature?.trim","kind":"calls","metadata":{"unresolvedName":"signature?.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:SSHKeysPage","to":"symbol-name:setVerifying","kind":"calls","metadata":{"unresolvedName":"setVerifying"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:SSHKeysPage","to":"/home/alex/projects/headquarter/apps/web/src/api/ssh_keys.ts:verifySignature","kind":"calls","metadata":{"unresolvedName":"verifySignature"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:SSHKeysPage","to":"external:signature.trim","kind":"calls","metadata":{"unresolvedName":"signature.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:SSHKeysPage","to":"symbol-name:setVerifyResults","kind":"calls","metadata":{"unresolvedName":"setVerifyResults"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:SSHKeysPage","to":"symbol-name:navigate","kind":"calls","metadata":{"unresolvedName":"navigate"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:SSHKeysPage","to":"external:safeKeys.map","kind":"calls","metadata":{"unresolvedName":"safeKeys.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:SSHKeysPage","to":"symbol-name:handleDelete","kind":"calls","metadata":{"unresolvedName":"handleDelete"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:SSHKeysPage","to":"external:new Date(key.created_at).toLocaleDateString","kind":"calls","metadata":{"unresolvedName":"new Date(key.created_at).toLocaleDateString"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:SSHKeysPage","to":"external:key.public_key.substring","kind":"calls","metadata":{"unresolvedName":"key.public_key.substring"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:SSHKeysPage","to":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:copyToClipboard","kind":"calls","metadata":{"unresolvedName":"copyToClipboard"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:SSHKeysPage","to":"symbol-name:setSignPayloads","kind":"calls","metadata":{"unresolvedName":"setSignPayloads"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:SSHKeysPage","to":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:handleSign","kind":"calls","metadata":{"unresolvedName":"handleSign"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:SSHKeysPage","to":"external:signPayloads[key.id]?.trim","kind":"calls","metadata":{"unresolvedName":"signPayloads[key.id]?.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:SSHKeysPage","to":"symbol-name:setVerifyPayloads","kind":"calls","metadata":{"unresolvedName":"setVerifyPayloads"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:SSHKeysPage","to":"symbol-name:setVerifySignatures","kind":"calls","metadata":{"unresolvedName":"setVerifySignatures"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:SSHKeysPage","to":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:handleVerify","kind":"calls","metadata":{"unresolvedName":"handleVerify"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:SSHKeysPage","to":"external:verifyPayloads[key.id]?.trim","kind":"calls","metadata":{"unresolvedName":"verifyPayloads[key.id]?.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:SSHKeysPage","to":"external:verifySignatures[key.id]?.trim","kind":"calls","metadata":{"unresolvedName":"verifySignatures[key.id]?.trim"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:handleGenerate","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:handleGenerate","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:handleGenerate","to":"external:e.preventDefault","kind":"calls","metadata":{"unresolvedName":"e.preventDefault"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:handleGenerate","to":"external:newKeyName.trim","kind":"calls","metadata":{"unresolvedName":"newKeyName.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:handleGenerate","to":"symbol-name:setGenerating","kind":"calls","metadata":{"unresolvedName":"setGenerating"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:handleGenerate","to":"/home/alex/projects/headquarter/apps/web/src/api/ssh_keys.ts:createSSHKey","kind":"calls","metadata":{"unresolvedName":"createSSHKey"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:handleGenerate","to":"symbol-name:setNewKeyName","kind":"calls","metadata":{"unresolvedName":"setNewKeyName"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:handleGenerate","to":"symbol-name:loadKeys","kind":"calls","metadata":{"unresolvedName":"loadKeys"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:handleGenerate","to":"symbol-name:setMutationError","kind":"calls","metadata":{"unresolvedName":"setMutationError"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:handleDelete","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:handleDelete","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:handleDelete","to":"symbol-name:confirm","kind":"calls","metadata":{"unresolvedName":"confirm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:handleDelete","to":"/home/alex/projects/headquarter/apps/web/src/api/ssh_keys.ts:deleteSSHKey","kind":"calls","metadata":{"unresolvedName":"deleteSSHKey"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:handleDelete","to":"symbol-name:loadKeys","kind":"calls","metadata":{"unresolvedName":"loadKeys"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:handleDelete","to":"symbol-name:setMutationError","kind":"calls","metadata":{"unresolvedName":"setMutationError"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:copyToClipboard","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:copyToClipboard","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:copyToClipboard","to":"external:navigator.clipboard.writeText","kind":"calls","metadata":{"unresolvedName":"navigator.clipboard.writeText"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:handleSign","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:handleSign","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:handleSign","to":"external:payload?.trim","kind":"calls","metadata":{"unresolvedName":"payload?.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:handleSign","to":"symbol-name:setSigning","kind":"calls","metadata":{"unresolvedName":"setSigning"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:handleSign","to":"/home/alex/projects/headquarter/apps/web/src/api/ssh_keys.ts:signPayload","kind":"calls","metadata":{"unresolvedName":"signPayload"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:handleSign","to":"external:payload.trim","kind":"calls","metadata":{"unresolvedName":"payload.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:handleSign","to":"symbol-name:setSignatures","kind":"calls","metadata":{"unresolvedName":"setSignatures"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:handleSign","to":"symbol-name:setMutationError","kind":"calls","metadata":{"unresolvedName":"setMutationError"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:handleVerify","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:handleVerify","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:handleVerify","to":"external:payload?.trim","kind":"calls","metadata":{"unresolvedName":"payload?.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:handleVerify","to":"external:signature?.trim","kind":"calls","metadata":{"unresolvedName":"signature?.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:handleVerify","to":"symbol-name:setVerifying","kind":"calls","metadata":{"unresolvedName":"setVerifying"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:handleVerify","to":"/home/alex/projects/headquarter/apps/web/src/api/ssh_keys.ts:verifySignature","kind":"calls","metadata":{"unresolvedName":"verifySignature"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:handleVerify","to":"external:payload.trim","kind":"calls","metadata":{"unresolvedName":"payload.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:handleVerify","to":"external:signature.trim","kind":"calls","metadata":{"unresolvedName":"signature.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:handleVerify","to":"symbol-name:setVerifyResults","kind":"calls","metadata":{"unresolvedName":"setVerifyResults"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx:handleVerify","to":"symbol-name:setMutationError","kind":"calls","metadata":{"unresolvedName":"setMutationError"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/terminal.tsx","to":"external:react","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/terminal.tsx","to":"external:react-router-dom","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/terminal.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/terminal.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/terminal.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-terminal-wrapper.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/terminal.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-mobile-viewport.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/terminal.tsx:TerminalPage","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/terminal.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/terminal.tsx:TerminalPage","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/terminal.tsx:TerminalPage","to":"symbol-name:useParams","kind":"calls","metadata":{"unresolvedName":"useParams"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/terminal.tsx:TerminalPage","to":"symbol-name:useNavigate","kind":"calls","metadata":{"unresolvedName":"useNavigate"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/terminal.tsx:TerminalPage","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-mobile-viewport.ts:useMobileViewport","kind":"calls","metadata":{"unresolvedName":"useMobileViewport"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/terminal.tsx:TerminalPage","to":"symbol-name:navigate","kind":"calls","metadata":{"unresolvedName":"navigate"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"external:@testing-library/react","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"external:vitest","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_configs.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"symbol-name:cleanup","kind":"calls","metadata":{"unresolvedName":"cleanup"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:vi.restoreAllMocks","kind":"calls","metadata":{"unresolvedName":"vi.restoreAllMocks"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"symbol-name:it","kind":"calls","metadata":{"unresolvedName":"it"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:vi.spyOn(toolTypesApi, \"listToolTypes\").mockImplementation","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(toolTypesApi, \"listToolTypes\").mockImplementation"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:vi.spyOn","kind":"calls","metadata":{"unresolvedName":"vi.spyOn"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:vi.spyOn(toolConfigsApi, \"listToolConfigs\").mockImplementation","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(toolConfigsApi, \"listToolConfigs\").mockImplementation"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:vi.spyOn(configFoldersApi, \"listConfigFolders\").mockImplementation","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(configFoldersApi, \"listConfigFolders\").mockImplementation"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"symbol-name:render","kind":"calls","metadata":{"unresolvedName":"render"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(screen.getByText(/loading/i)).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(/loading/i)).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:screen.getByText","kind":"calls","metadata":{"unresolvedName":"screen.getByText"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:vi.spyOn(toolTypesApi, \"listToolTypes\").mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(toolTypesApi, \"listToolTypes\").mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:vi.spyOn(toolConfigsApi, \"listToolConfigs\").mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(toolConfigsApi, \"listToolConfigs\").mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:vi.spyOn(configFoldersApi, \"listConfigFolders\").mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(configFoldersApi, \"listConfigFolders\").mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"symbol-name:waitFor","kind":"calls","metadata":{"unresolvedName":"waitFor"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(screen.getByText(\"VS Code Server\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(\"VS Code Server\")).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(screen.getByText(\"Custom Tool\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(\"Custom Tool\")).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:fireEvent.click","kind":"calls","metadata":{"unresolvedName":"fireEvent.click"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(screen.getByRole(\"button\", { name: /configs/i })).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByRole(\"button\", { name: /configs/i })).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:screen.getByRole","kind":"calls","metadata":{"unresolvedName":"screen.getByRole"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(screen.getByText(\"OPENAI_API_KEY\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(\"OPENAI_API_KEY\")).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(screen.getByPlaceholderText(\"e.g., OPENAI_API_KEY\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByPlaceholderText(\"e.g., OPENAI_API_KEY\")).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:screen.getByPlaceholderText","kind":"calls","metadata":{"unresolvedName":"screen.getByPlaceholderText"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(screen.getByPlaceholderText(/Enter value/i)).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByPlaceholderText(/Enter value/i)).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:vi.spyOn(toolConfigsApi, \"createToolConfig\").mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(toolConfigsApi, \"createToolConfig\").mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:fireEvent.change","kind":"calls","metadata":{"unresolvedName":"fireEvent.change"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(createMock).toHaveBeenCalledWith","kind":"calls","metadata":{"unresolvedName":"expect(createMock).toHaveBeenCalledWith"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect.objectContaining","kind":"calls","metadata":{"unresolvedName":"expect.objectContaining"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(configsListMock).toHaveBeenCalledTimes","kind":"calls","metadata":{"unresolvedName":"expect(configsListMock).toHaveBeenCalledTimes"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(screen.getByRole(\"button\", { name: /folders/i })).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByRole(\"button\", { name: /folders/i })).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(screen.getByText(\"my-dotfiles\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(\"my-dotfiles\")).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(screen.getByPlaceholderText(\"e.g., my-dotfiles\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByPlaceholderText(\"e.g., my-dotfiles\")).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(screen.getByPlaceholderText(\"e.g., /home/user\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByPlaceholderText(\"e.g., /home/user\")).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:vi.spyOn(configFoldersApi, \"createConfigFolder\").mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(configFoldersApi, \"createConfigFolder\").mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(foldersListMock).toHaveBeenCalledTimes","kind":"calls","metadata":{"unresolvedName":"expect(foldersListMock).toHaveBeenCalledTimes"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(screen.getByText(\"Active\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(\"Active\")).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:vi.spyOn(toolTypesApi, \"listToolTypes\").mockRejectedValue","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(toolTypesApi, \"listToolTypes\").mockRejectedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:vi.spyOn(toolConfigsApi, \"listToolConfigs\").mockRejectedValue","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(toolConfigsApi, \"listToolConfigs\").mockRejectedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:vi.spyOn(configFoldersApi, \"listConfigFolders\").mockRejectedValue","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(configFoldersApi, \"listConfigFolders\").mockRejectedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(screen.getByText(/failed to load/i)).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(/failed to load/i)).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(screen.getByRole(\"button\", { name: /retry/i })).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByRole(\"button\", { name: /retry/i })).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:vi.spyOn(toolTypesApi, \"listToolTypes\")\n .mockRejectedValueOnce","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(toolTypesApi, \"listToolTypes\")\n .mockRejectedValueOnce"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:vi.spyOn(toolConfigsApi, \"listToolConfigs\")\n .mockRejectedValueOnce","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(toolConfigsApi, \"listToolConfigs\")\n .mockRejectedValueOnce"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:vi.spyOn(configFoldersApi, \"listConfigFolders\")\n .mockRejectedValueOnce","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(configFoldersApi, \"listConfigFolders\")\n .mockRejectedValueOnce"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(listMock).toHaveBeenCalledTimes","kind":"calls","metadata":{"unresolvedName":"expect(listMock).toHaveBeenCalledTimes"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:vi.spyOn(toolTypesApi, \"deleteToolType\").mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(toolTypesApi, \"deleteToolType\").mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:screen.getByText(\"Custom Tool\").closest","kind":"calls","metadata":{"unresolvedName":"screen.getByText(\"Custom Tool\").closest"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:within(customToolCard as HTMLElement).queryByRole","kind":"calls","metadata":{"unresolvedName":"within(customToolCard as HTMLElement).queryByRole"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"symbol-name:within","kind":"calls","metadata":{"unresolvedName":"within"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:vi.spyOn(window, \"confirm\").mockReturnValue","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(window, \"confirm\").mockReturnValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(deleteMock).toHaveBeenCalledWith","kind":"calls","metadata":{"unresolvedName":"expect(deleteMock).toHaveBeenCalledWith"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:vi.spyOn(toolTypesApi, \"listToolTypes\").mockImplementation","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(toolTypesApi, \"listToolTypes\").mockImplementation"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:vi.spyOn","kind":"calls","metadata":{"unresolvedName":"vi.spyOn"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:vi.spyOn(toolConfigsApi, \"listToolConfigs\").mockImplementation","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(toolConfigsApi, \"listToolConfigs\").mockImplementation"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:vi.spyOn(configFoldersApi, \"listConfigFolders\").mockImplementation","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(configFoldersApi, \"listConfigFolders\").mockImplementation"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"symbol-name:render","kind":"calls","metadata":{"unresolvedName":"render"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(screen.getByText(/loading/i)).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(/loading/i)).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:screen.getByText","kind":"calls","metadata":{"unresolvedName":"screen.getByText"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"defines"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"defines"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"defines"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:vi.spyOn(toolTypesApi, \"listToolTypes\").mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(toolTypesApi, \"listToolTypes\").mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:vi.spyOn","kind":"calls","metadata":{"unresolvedName":"vi.spyOn"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:vi.spyOn(toolConfigsApi, \"listToolConfigs\").mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(toolConfigsApi, \"listToolConfigs\").mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:vi.spyOn(configFoldersApi, \"listConfigFolders\").mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(configFoldersApi, \"listConfigFolders\").mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"symbol-name:render","kind":"calls","metadata":{"unresolvedName":"render"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"symbol-name:waitFor","kind":"calls","metadata":{"unresolvedName":"waitFor"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(screen.getByText(\"VS Code Server\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(\"VS Code Server\")).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:screen.getByText","kind":"calls","metadata":{"unresolvedName":"screen.getByText"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(screen.getByText(\"Custom Tool\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(\"Custom Tool\")).toBeInTheDocument"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(screen.getByText(\"VS Code Server\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(\"VS Code Server\")).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:screen.getByText","kind":"calls","metadata":{"unresolvedName":"screen.getByText"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:vi.spyOn(toolTypesApi, \"listToolTypes\").mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(toolTypesApi, \"listToolTypes\").mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:vi.spyOn","kind":"calls","metadata":{"unresolvedName":"vi.spyOn"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:vi.spyOn(toolConfigsApi, \"listToolConfigs\").mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(toolConfigsApi, \"listToolConfigs\").mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:vi.spyOn(configFoldersApi, \"listConfigFolders\").mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(configFoldersApi, \"listConfigFolders\").mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"symbol-name:render","kind":"calls","metadata":{"unresolvedName":"render"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"symbol-name:waitFor","kind":"calls","metadata":{"unresolvedName":"waitFor"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(screen.getByText(\"VS Code Server\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(\"VS Code Server\")).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:screen.getByText","kind":"calls","metadata":{"unresolvedName":"screen.getByText"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:fireEvent.click","kind":"calls","metadata":{"unresolvedName":"fireEvent.click"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(screen.getByRole(\"button\", { name: /configs/i })).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByRole(\"button\", { name: /configs/i })).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:screen.getByRole","kind":"calls","metadata":{"unresolvedName":"screen.getByRole"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(screen.getByText(\"OPENAI_API_KEY\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(\"OPENAI_API_KEY\")).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(screen.getByPlaceholderText(\"e.g., OPENAI_API_KEY\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByPlaceholderText(\"e.g., OPENAI_API_KEY\")).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:screen.getByPlaceholderText","kind":"calls","metadata":{"unresolvedName":"screen.getByPlaceholderText"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(screen.getByPlaceholderText(/Enter value/i)).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByPlaceholderText(/Enter value/i)).toBeInTheDocument"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(screen.getByText(\"VS Code Server\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(\"VS Code Server\")).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:screen.getByText","kind":"calls","metadata":{"unresolvedName":"screen.getByText"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(screen.getByRole(\"button\", { name: /configs/i })).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByRole(\"button\", { name: /configs/i })).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:screen.getByRole","kind":"calls","metadata":{"unresolvedName":"screen.getByRole"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(screen.getByText(\"OPENAI_API_KEY\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(\"OPENAI_API_KEY\")).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:screen.getByText","kind":"calls","metadata":{"unresolvedName":"screen.getByText"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:vi.spyOn(toolTypesApi, \"listToolTypes\").mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(toolTypesApi, \"listToolTypes\").mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:vi.spyOn","kind":"calls","metadata":{"unresolvedName":"vi.spyOn"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:vi.spyOn(toolConfigsApi, \"listToolConfigs\").mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(toolConfigsApi, \"listToolConfigs\").mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:vi.spyOn(toolConfigsApi, \"createToolConfig\").mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(toolConfigsApi, \"createToolConfig\").mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:vi.spyOn(configFoldersApi, \"listConfigFolders\").mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(configFoldersApi, \"listConfigFolders\").mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"symbol-name:render","kind":"calls","metadata":{"unresolvedName":"render"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"symbol-name:waitFor","kind":"calls","metadata":{"unresolvedName":"waitFor"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(screen.getByText(\"VS Code Server\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(\"VS Code Server\")).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:screen.getByText","kind":"calls","metadata":{"unresolvedName":"screen.getByText"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:fireEvent.click","kind":"calls","metadata":{"unresolvedName":"fireEvent.click"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(screen.getByRole(\"button\", { name: /configs/i })).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByRole(\"button\", { name: /configs/i })).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:screen.getByRole","kind":"calls","metadata":{"unresolvedName":"screen.getByRole"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(screen.getByText(\"OPENAI_API_KEY\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(\"OPENAI_API_KEY\")).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:fireEvent.change","kind":"calls","metadata":{"unresolvedName":"fireEvent.change"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:screen.getByPlaceholderText","kind":"calls","metadata":{"unresolvedName":"screen.getByPlaceholderText"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(createMock).toHaveBeenCalledWith","kind":"calls","metadata":{"unresolvedName":"expect(createMock).toHaveBeenCalledWith"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect.objectContaining","kind":"calls","metadata":{"unresolvedName":"expect.objectContaining"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(configsListMock).toHaveBeenCalledTimes","kind":"calls","metadata":{"unresolvedName":"expect(configsListMock).toHaveBeenCalledTimes"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(screen.getByText(\"VS Code Server\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(\"VS Code Server\")).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:screen.getByText","kind":"calls","metadata":{"unresolvedName":"screen.getByText"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(screen.getByRole(\"button\", { name: /configs/i })).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByRole(\"button\", { name: /configs/i })).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:screen.getByRole","kind":"calls","metadata":{"unresolvedName":"screen.getByRole"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(screen.getByText(\"OPENAI_API_KEY\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(\"OPENAI_API_KEY\")).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:screen.getByText","kind":"calls","metadata":{"unresolvedName":"screen.getByText"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(createMock).toHaveBeenCalledWith","kind":"calls","metadata":{"unresolvedName":"expect(createMock).toHaveBeenCalledWith"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect.objectContaining","kind":"calls","metadata":{"unresolvedName":"expect.objectContaining"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:vi.spyOn(toolTypesApi, \"listToolTypes\").mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(toolTypesApi, \"listToolTypes\").mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:vi.spyOn","kind":"calls","metadata":{"unresolvedName":"vi.spyOn"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:vi.spyOn(toolConfigsApi, \"listToolConfigs\").mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(toolConfigsApi, \"listToolConfigs\").mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:vi.spyOn(configFoldersApi, \"listConfigFolders\").mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(configFoldersApi, \"listConfigFolders\").mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"symbol-name:render","kind":"calls","metadata":{"unresolvedName":"render"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"symbol-name:waitFor","kind":"calls","metadata":{"unresolvedName":"waitFor"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(screen.getByText(\"VS Code Server\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(\"VS Code Server\")).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:screen.getByText","kind":"calls","metadata":{"unresolvedName":"screen.getByText"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:fireEvent.click","kind":"calls","metadata":{"unresolvedName":"fireEvent.click"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(screen.getByRole(\"button\", { name: /folders/i })).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByRole(\"button\", { name: /folders/i })).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:screen.getByRole","kind":"calls","metadata":{"unresolvedName":"screen.getByRole"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(screen.getByText(\"my-dotfiles\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(\"my-dotfiles\")).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(screen.getByPlaceholderText(\"e.g., my-dotfiles\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByPlaceholderText(\"e.g., my-dotfiles\")).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:screen.getByPlaceholderText","kind":"calls","metadata":{"unresolvedName":"screen.getByPlaceholderText"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(screen.getByPlaceholderText(\"e.g., /home/user\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByPlaceholderText(\"e.g., /home/user\")).toBeInTheDocument"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(screen.getByText(\"VS Code Server\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(\"VS Code Server\")).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:screen.getByText","kind":"calls","metadata":{"unresolvedName":"screen.getByText"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(screen.getByRole(\"button\", { name: /folders/i })).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByRole(\"button\", { name: /folders/i })).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:screen.getByRole","kind":"calls","metadata":{"unresolvedName":"screen.getByRole"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(screen.getByText(\"my-dotfiles\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(\"my-dotfiles\")).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:screen.getByText","kind":"calls","metadata":{"unresolvedName":"screen.getByText"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:vi.spyOn(configFoldersApi, \"listConfigFolders\").mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(configFoldersApi, \"listConfigFolders\").mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:vi.spyOn","kind":"calls","metadata":{"unresolvedName":"vi.spyOn"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:vi.spyOn(configFoldersApi, \"createConfigFolder\").mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(configFoldersApi, \"createConfigFolder\").mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:vi.spyOn(toolTypesApi, \"listToolTypes\").mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(toolTypesApi, \"listToolTypes\").mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:vi.spyOn(toolConfigsApi, \"listToolConfigs\").mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(toolConfigsApi, \"listToolConfigs\").mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"symbol-name:render","kind":"calls","metadata":{"unresolvedName":"render"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"symbol-name:waitFor","kind":"calls","metadata":{"unresolvedName":"waitFor"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(screen.getByText(\"VS Code Server\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(\"VS Code Server\")).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:screen.getByText","kind":"calls","metadata":{"unresolvedName":"screen.getByText"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:fireEvent.click","kind":"calls","metadata":{"unresolvedName":"fireEvent.click"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(screen.getByRole(\"button\", { name: /folders/i })).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByRole(\"button\", { name: /folders/i })).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:screen.getByRole","kind":"calls","metadata":{"unresolvedName":"screen.getByRole"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(screen.getByText(\"my-dotfiles\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(\"my-dotfiles\")).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:fireEvent.change","kind":"calls","metadata":{"unresolvedName":"fireEvent.change"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:screen.getByPlaceholderText","kind":"calls","metadata":{"unresolvedName":"screen.getByPlaceholderText"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(createMock).toHaveBeenCalledWith","kind":"calls","metadata":{"unresolvedName":"expect(createMock).toHaveBeenCalledWith"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect.objectContaining","kind":"calls","metadata":{"unresolvedName":"expect.objectContaining"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(foldersListMock).toHaveBeenCalledTimes","kind":"calls","metadata":{"unresolvedName":"expect(foldersListMock).toHaveBeenCalledTimes"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(screen.getByText(\"VS Code Server\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(\"VS Code Server\")).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:screen.getByText","kind":"calls","metadata":{"unresolvedName":"screen.getByText"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(screen.getByRole(\"button\", { name: /folders/i })).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByRole(\"button\", { name: /folders/i })).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:screen.getByRole","kind":"calls","metadata":{"unresolvedName":"screen.getByRole"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(screen.getByText(\"my-dotfiles\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(\"my-dotfiles\")).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:screen.getByText","kind":"calls","metadata":{"unresolvedName":"screen.getByText"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(createMock).toHaveBeenCalledWith","kind":"calls","metadata":{"unresolvedName":"expect(createMock).toHaveBeenCalledWith"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect.objectContaining","kind":"calls","metadata":{"unresolvedName":"expect.objectContaining"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:vi.spyOn(toolTypesApi, \"listToolTypes\").mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(toolTypesApi, \"listToolTypes\").mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:vi.spyOn","kind":"calls","metadata":{"unresolvedName":"vi.spyOn"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:vi.spyOn(toolConfigsApi, \"listToolConfigs\").mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(toolConfigsApi, \"listToolConfigs\").mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:vi.spyOn(configFoldersApi, \"listConfigFolders\").mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(configFoldersApi, \"listConfigFolders\").mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"symbol-name:render","kind":"calls","metadata":{"unresolvedName":"render"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"symbol-name:waitFor","kind":"calls","metadata":{"unresolvedName":"waitFor"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(screen.getByText(\"VS Code Server\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(\"VS Code Server\")).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:screen.getByText","kind":"calls","metadata":{"unresolvedName":"screen.getByText"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:fireEvent.click","kind":"calls","metadata":{"unresolvedName":"fireEvent.click"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(screen.getByRole(\"button\", { name: /folders/i })).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByRole(\"button\", { name: /folders/i })).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:screen.getByRole","kind":"calls","metadata":{"unresolvedName":"screen.getByRole"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(screen.getByText(\"my-dotfiles\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(\"my-dotfiles\")).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(screen.getByText(\"Active\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(\"Active\")).toBeInTheDocument"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(screen.getByText(\"VS Code Server\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(\"VS Code Server\")).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:screen.getByText","kind":"calls","metadata":{"unresolvedName":"screen.getByText"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(screen.getByRole(\"button\", { name: /folders/i })).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByRole(\"button\", { name: /folders/i })).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:screen.getByRole","kind":"calls","metadata":{"unresolvedName":"screen.getByRole"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(screen.getByText(\"my-dotfiles\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(\"my-dotfiles\")).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:screen.getByText","kind":"calls","metadata":{"unresolvedName":"screen.getByText"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:vi.spyOn(toolTypesApi, \"listToolTypes\").mockRejectedValue","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(toolTypesApi, \"listToolTypes\").mockRejectedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:vi.spyOn","kind":"calls","metadata":{"unresolvedName":"vi.spyOn"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:vi.spyOn(toolConfigsApi, \"listToolConfigs\").mockRejectedValue","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(toolConfigsApi, \"listToolConfigs\").mockRejectedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:vi.spyOn(configFoldersApi, \"listConfigFolders\").mockRejectedValue","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(configFoldersApi, \"listConfigFolders\").mockRejectedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"symbol-name:render","kind":"calls","metadata":{"unresolvedName":"render"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"symbol-name:waitFor","kind":"calls","metadata":{"unresolvedName":"waitFor"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(screen.getByText(/failed to load/i)).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(/failed to load/i)).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:screen.getByText","kind":"calls","metadata":{"unresolvedName":"screen.getByText"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(screen.getByRole(\"button\", { name: /retry/i })).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByRole(\"button\", { name: /retry/i })).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:screen.getByRole","kind":"calls","metadata":{"unresolvedName":"screen.getByRole"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(screen.getByText(/failed to load/i)).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(/failed to load/i)).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:screen.getByText","kind":"calls","metadata":{"unresolvedName":"screen.getByText"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:vi.spyOn(toolTypesApi, \"listToolTypes\")\n .mockRejectedValueOnce","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(toolTypesApi, \"listToolTypes\")\n .mockRejectedValueOnce"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:vi.spyOn","kind":"calls","metadata":{"unresolvedName":"vi.spyOn"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:vi.spyOn(toolConfigsApi, \"listToolConfigs\")\n .mockRejectedValueOnce","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(toolConfigsApi, \"listToolConfigs\")\n .mockRejectedValueOnce"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:vi.spyOn(configFoldersApi, \"listConfigFolders\")\n .mockRejectedValueOnce","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(configFoldersApi, \"listConfigFolders\")\n .mockRejectedValueOnce"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"symbol-name:render","kind":"calls","metadata":{"unresolvedName":"render"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"symbol-name:waitFor","kind":"calls","metadata":{"unresolvedName":"waitFor"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(screen.getByText(/failed to load/i)).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(/failed to load/i)).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:screen.getByText","kind":"calls","metadata":{"unresolvedName":"screen.getByText"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:fireEvent.click","kind":"calls","metadata":{"unresolvedName":"fireEvent.click"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:screen.getByRole","kind":"calls","metadata":{"unresolvedName":"screen.getByRole"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(screen.getByText(\"VS Code Server\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(\"VS Code Server\")).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(listMock).toHaveBeenCalledTimes","kind":"calls","metadata":{"unresolvedName":"expect(listMock).toHaveBeenCalledTimes"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(screen.getByText(/failed to load/i)).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(/failed to load/i)).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:screen.getByText","kind":"calls","metadata":{"unresolvedName":"screen.getByText"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(screen.getByText(\"VS Code Server\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(\"VS Code Server\")).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:screen.getByText","kind":"calls","metadata":{"unresolvedName":"screen.getByText"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:vi.spyOn(toolTypesApi, \"listToolTypes\").mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(toolTypesApi, \"listToolTypes\").mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:vi.spyOn","kind":"calls","metadata":{"unresolvedName":"vi.spyOn"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:vi.spyOn(toolTypesApi, \"deleteToolType\").mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(toolTypesApi, \"deleteToolType\").mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:vi.spyOn(toolConfigsApi, \"listToolConfigs\").mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(toolConfigsApi, \"listToolConfigs\").mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:vi.spyOn(configFoldersApi, \"listConfigFolders\").mockResolvedValue","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(configFoldersApi, \"listConfigFolders\").mockResolvedValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"symbol-name:render","kind":"calls","metadata":{"unresolvedName":"render"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"symbol-name:waitFor","kind":"calls","metadata":{"unresolvedName":"waitFor"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(screen.getByText(\"Custom Tool\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(\"Custom Tool\")).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:screen.getByText","kind":"calls","metadata":{"unresolvedName":"screen.getByText"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:screen.getByText(\"Custom Tool\").closest","kind":"calls","metadata":{"unresolvedName":"screen.getByText(\"Custom Tool\").closest"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:within(customToolCard as HTMLElement).queryByRole","kind":"calls","metadata":{"unresolvedName":"within(customToolCard as HTMLElement).queryByRole"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"symbol-name:within","kind":"calls","metadata":{"unresolvedName":"within"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:vi.spyOn(window, \"confirm\").mockReturnValue","kind":"calls","metadata":{"unresolvedName":"vi.spyOn(window, \"confirm\").mockReturnValue"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:fireEvent.click","kind":"calls","metadata":{"unresolvedName":"fireEvent.click"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(deleteMock).toHaveBeenCalledWith","kind":"calls","metadata":{"unresolvedName":"expect(deleteMock).toHaveBeenCalledWith"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(listMock).toHaveBeenCalledTimes","kind":"calls","metadata":{"unresolvedName":"expect(listMock).toHaveBeenCalledTimes"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(screen.getByText(\"Custom Tool\")).toBeInTheDocument","kind":"calls","metadata":{"unresolvedName":"expect(screen.getByText(\"Custom Tool\")).toBeInTheDocument"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:screen.getByText","kind":"calls","metadata":{"unresolvedName":"screen.getByText"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"external:expect(deleteMock).toHaveBeenCalledWith","kind":"calls","metadata":{"unresolvedName":"expect(deleteMock).toHaveBeenCalledWith"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.test.tsx:","to":"symbol-name:expect","kind":"calls","metadata":{"unresolvedName":"expect"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/router.tsx","to":"external:react-router-dom","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/router.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/app-shell.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/router.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/protected-route.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/router.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/router.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/pages/placeholder.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/router.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/pages/profile.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/router.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/pages/projects.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/router.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/pages/git-repositories.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/router.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/pages/git-history.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/router.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/pages/project-settings.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/router.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/router.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/pages/settings.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/router.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/pages/terminal.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/router.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/router.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/pages/ssh-keys.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/router.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/router.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/router.tsx","to":"/home/alex/projects/headquarter/apps/web/src/router.tsx:AppRouter","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/router.tsx","to":"/home/alex/projects/headquarter/apps/web/src/router.tsx:AppRouter","kind":"defines"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/state/auth.tsx","to":"external:react","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/state/auth.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/api/client.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/state/auth.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/types.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/state/auth.tsx","to":"/home/alex/projects/headquarter/apps/web/src/state/auth.tsx:AuthProvider","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/state/auth.tsx","to":"/home/alex/projects/headquarter/apps/web/src/state/auth.tsx:AuthProvider","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/state/auth.tsx:AuthProvider","to":"symbol-name:useState","kind":"calls","metadata":{"unresolvedName":"useState"}},{"from":"/home/alex/projects/headquarter/apps/web/src/state/auth.tsx:AuthProvider","to":"symbol-name:useCallback","kind":"calls","metadata":{"unresolvedName":"useCallback"}},{"from":"/home/alex/projects/headquarter/apps/web/src/state/auth.tsx:AuthProvider","to":"symbol-name:setState","kind":"calls","metadata":{"unresolvedName":"setState"}},{"from":"/home/alex/projects/headquarter/apps/web/src/state/auth.tsx:AuthProvider","to":"external:apiClient.get","kind":"calls","metadata":{"unresolvedName":"apiClient.get"}},{"from":"/home/alex/projects/headquarter/apps/web/src/state/auth.tsx:AuthProvider","to":"symbol-name:setUser","kind":"calls","metadata":{"unresolvedName":"setUser"}},{"from":"/home/alex/projects/headquarter/apps/web/src/state/auth.tsx:AuthProvider","to":"external:apiClient.post","kind":"calls","metadata":{"unresolvedName":"apiClient.post"}},{"from":"/home/alex/projects/headquarter/apps/web/src/state/auth.tsx:AuthProvider","to":"symbol-name:useEffect","kind":"calls","metadata":{"unresolvedName":"useEffect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/state/auth.tsx:AuthProvider","to":"symbol-name:refreshSession","kind":"calls","metadata":{"unresolvedName":"refreshSession"}},{"from":"/home/alex/projects/headquarter/apps/web/src/state/auth.tsx:AuthProvider","to":"symbol-name:useMemo","kind":"calls","metadata":{"unresolvedName":"useMemo"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/state/auth.tsx","to":"/home/alex/projects/headquarter/apps/web/src/state/auth.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/state/auth.tsx","to":"/home/alex/projects/headquarter/apps/web/src/state/auth.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/state/auth.tsx:","to":"symbol-name:setState","kind":"calls","metadata":{"unresolvedName":"setState"}},{"from":"/home/alex/projects/headquarter/apps/web/src/state/auth.tsx:","to":"external:apiClient.get","kind":"calls","metadata":{"unresolvedName":"apiClient.get"}},{"from":"/home/alex/projects/headquarter/apps/web/src/state/auth.tsx:","to":"symbol-name:setUser","kind":"calls","metadata":{"unresolvedName":"setUser"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/state/auth.tsx","to":"/home/alex/projects/headquarter/apps/web/src/state/auth.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/state/auth.tsx","to":"/home/alex/projects/headquarter/apps/web/src/state/auth.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/state/auth.tsx:","to":"external:apiClient.post","kind":"calls","metadata":{"unresolvedName":"apiClient.post"}},{"from":"/home/alex/projects/headquarter/apps/web/src/state/auth.tsx:","to":"symbol-name:setUser","kind":"calls","metadata":{"unresolvedName":"setUser"}},{"from":"/home/alex/projects/headquarter/apps/web/src/state/auth.tsx:","to":"symbol-name:setState","kind":"calls","metadata":{"unresolvedName":"setState"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/state/auth.tsx","to":"/home/alex/projects/headquarter/apps/web/src/state/auth.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/state/auth.tsx","to":"/home/alex/projects/headquarter/apps/web/src/state/auth.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/state/auth.tsx:","to":"symbol-name:refreshSession","kind":"calls","metadata":{"unresolvedName":"refreshSession"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/state/auth.tsx","to":"/home/alex/projects/headquarter/apps/web/src/state/auth.tsx:useAuth","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/state/auth.tsx","to":"/home/alex/projects/headquarter/apps/web/src/state/auth.tsx:useAuth","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/state/auth.tsx:useAuth","to":"symbol-name:useContext","kind":"calls","metadata":{"unresolvedName":"useContext"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/state/sessions.tsx","to":"external:react","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/state/sessions.tsx","to":"/home/alex/projects/headquarter/apps/web/src/state/sessions.tsx:SessionsProvider","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/state/sessions.tsx","to":"/home/alex/projects/headquarter/apps/web/src/state/sessions.tsx:SessionsProvider","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/state/sessions.tsx:SessionsProvider","to":"symbol-name:useState","kind":"calls","metadata":{"unresolvedName":"useState"}},{"from":"/home/alex/projects/headquarter/apps/web/src/state/sessions.tsx:SessionsProvider","to":"symbol-name:useCallback","kind":"calls","metadata":{"unresolvedName":"useCallback"}},{"from":"/home/alex/projects/headquarter/apps/web/src/state/sessions.tsx:SessionsProvider","to":"symbol-name:setSessions","kind":"calls","metadata":{"unresolvedName":"setSessions"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/state/sessions.tsx","to":"/home/alex/projects/headquarter/apps/web/src/state/sessions.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/state/sessions.tsx","to":"/home/alex/projects/headquarter/apps/web/src/state/sessions.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/state/sessions.tsx:","to":"symbol-name:setSessions","kind":"calls","metadata":{"unresolvedName":"setSessions"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/state/sessions.tsx","to":"/home/alex/projects/headquarter/apps/web/src/state/sessions.tsx:useSessions","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/state/sessions.tsx","to":"/home/alex/projects/headquarter/apps/web/src/state/sessions.tsx:useSessions","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/state/sessions.tsx:useSessions","to":"symbol-name:useContext","kind":"calls","metadata":{"unresolvedName":"useContext"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/test/setup.ts","to":"external:@testing-library/jest-dom/vitest","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/utils/errors.ts","to":"/home/alex/projects/headquarter/apps/web/src/utils/errors.ts:extractErrorMessage","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/utils/errors.ts","to":"/home/alex/projects/headquarter/apps/web/src/utils/errors.ts:extractErrorMessage","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/utils/errors.ts:extractErrorMessage","to":"external:Array.isArray","kind":"calls","metadata":{"unresolvedName":"Array.isArray"}},{"from":"/home/alex/projects/headquarter/apps/web/src/utils/errors.ts:extractErrorMessage","to":"external:detail.map((d) => typeof d === \"string\" ? d : d.msg || JSON.stringify(d)).join","kind":"calls","metadata":{"unresolvedName":"detail.map((d) => typeof d === \"string\" ? d : d.msg || JSON.stringify(d)).join"}},{"from":"/home/alex/projects/headquarter/apps/web/src/utils/errors.ts:extractErrorMessage","to":"external:detail.map","kind":"calls","metadata":{"unresolvedName":"detail.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/utils/errors.ts:extractErrorMessage","to":"external:JSON.stringify","kind":"calls","metadata":{"unresolvedName":"JSON.stringify"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/utils/icons.ts","to":"external:@phosphor-icons/react","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/utils/language.ts","to":"external:prismjs","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/utils/language.ts","to":"/home/alex/projects/headquarter/apps/web/src/utils/language.ts:detectLanguage","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/utils/language.ts","to":"/home/alex/projects/headquarter/apps/web/src/utils/language.ts:detectLanguage","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/utils/language.ts:detectLanguage","to":"external:filename.split(\".\").pop()?.toLowerCase","kind":"calls","metadata":{"unresolvedName":"filename.split(\".\").pop()?.toLowerCase"}},{"from":"/home/alex/projects/headquarter/apps/web/src/utils/language.ts:detectLanguage","to":"external:filename.split(\".\").pop","kind":"calls","metadata":{"unresolvedName":"filename.split(\".\").pop"}},{"from":"/home/alex/projects/headquarter/apps/web/src/utils/language.ts:detectLanguage","to":"external:filename.split","kind":"calls","metadata":{"unresolvedName":"filename.split"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/utils/language.ts","to":"/home/alex/projects/headquarter/apps/web/src/utils/language.ts:highlightCode","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/utils/language.ts","to":"/home/alex/projects/headquarter/apps/web/src/utils/language.ts:highlightCode","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/utils/language.ts:highlightCode","to":"external:Prism.highlight","kind":"calls","metadata":{"unresolvedName":"Prism.highlight"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/utils/language.ts","to":"/home/alex/projects/headquarter/apps/web/src/utils/language.ts:loadLanguage","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/utils/language.ts","to":"/home/alex/projects/headquarter/apps/web/src/utils/language.ts:loadLanguage","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/utils/language.ts:loadLanguage","to":"symbol-name:import","kind":"calls","metadata":{"unresolvedName":"import"}},{"from":"file:/home/alex/projects/headquarter/apps/web/vite.config.ts","to":"external:vite","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/vite.config.ts","to":"external:@vitejs/plugin-react","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts","to":"file:/home/alex/projects/headquarter/apps/web/src/api/client.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts:listToolTypes","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts:listToolTypes","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts:listToolTypes","to":"external:apiClient.get","kind":"calls","metadata":{"unresolvedName":"apiClient.get"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts:getToolType","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts:getToolType","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts:getToolType","to":"external:apiClient.get","kind":"calls","metadata":{"unresolvedName":"apiClient.get"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts:createToolType","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts:createToolType","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts:createToolType","to":"external:apiClient.post","kind":"calls","metadata":{"unresolvedName":"apiClient.post"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts:updateToolType","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts:updateToolType","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts:updateToolType","to":"external:apiClient.put","kind":"calls","metadata":{"unresolvedName":"apiClient.put"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts:deleteToolType","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts:deleteToolType","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts:deleteToolType","to":"external:apiClient.delete","kind":"calls","metadata":{"unresolvedName":"apiClient.delete"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts:validateToolType","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts:validateToolType","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts:validateToolType","to":"external:apiClient.get","kind":"calls","metadata":{"unresolvedName":"apiClient.get"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts:listToolTypes","kind":"calls","metadata":{"unresolvedName":"listToolTypes"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts:createToolType","kind":"calls","metadata":{"unresolvedName":"createToolType"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts:validateToolType","kind":"calls","metadata":{"unresolvedName":"validateToolType"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts:updateToolType","kind":"calls","metadata":{"unresolvedName":"updateToolType"}},{"from":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.test.ts:","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts:deleteToolType","kind":"calls","metadata":{"unresolvedName":"deleteToolType"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:ConfigProfilesPage","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts:listToolTypes","kind":"calls","metadata":{"unresolvedName":"listToolTypes"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/config-profiles.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts:listToolTypes","kind":"calls","metadata":{"unresolvedName":"listToolTypes"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:HomePage","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts:listToolTypes","kind":"calls","metadata":{"unresolvedName":"listToolTypes"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/dashboard.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts:listToolTypes","kind":"calls","metadata":{"unresolvedName":"listToolTypes"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:RepoWorkspace","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts:listToolTypes","kind":"calls","metadata":{"unresolvedName":"listToolTypes"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/repo-workspace.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts:listToolTypes","kind":"calls","metadata":{"unresolvedName":"listToolTypes"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:SessionsPage","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts:listToolTypes","kind":"calls","metadata":{"unresolvedName":"listToolTypes"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts:listToolTypes","kind":"calls","metadata":{"unresolvedName":"listToolTypes"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/sessions.tsx:loadToolTypes","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts:listToolTypes","kind":"calls","metadata":{"unresolvedName":"listToolTypes"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"external:react","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/data-states.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/icon.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/hooks/use-mobile-viewport.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/utils/errors.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-list-view.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-detail-view.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-edit-view.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/mobile-fab.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_definitions.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/components/manifest-editor.tsx","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/api/tool_configs.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"file:/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts","kind":"imports"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"/home/alex/projects/headquarter/apps/web/src/hooks/use-mobile-viewport.ts:useMobileViewport","kind":"calls","metadata":{"unresolvedName":"useMobileViewport"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"symbol-name:useState","kind":"calls","metadata":{"unresolvedName":"useState"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"external:(toolTypes || []).find","kind":"calls","metadata":{"unresolvedName":"(toolTypes || []).find"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"external:(configs || []).filter","kind":"calls","metadata":{"unresolvedName":"(configs || []).filter"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"symbol-name:useCallback","kind":"calls","metadata":{"unresolvedName":"useCallback"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"symbol-name:setStatus","kind":"calls","metadata":{"unresolvedName":"setStatus"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"external:Promise.all","kind":"calls","metadata":{"unresolvedName":"Promise.all"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts:listToolTypes","kind":"calls","metadata":{"unresolvedName":"listToolTypes"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_configs.ts:listToolConfigs","kind":"calls","metadata":{"unresolvedName":"listToolConfigs"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts:listConfigFolders","kind":"calls","metadata":{"unresolvedName":"listConfigFolders"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_definitions.ts:listToolDefinitions","kind":"calls","metadata":{"unresolvedName":"listToolDefinitions"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"symbol-name:setToolTypes","kind":"calls","metadata":{"unresolvedName":"setToolTypes"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"symbol-name:setConfigs","kind":"calls","metadata":{"unresolvedName":"setConfigs"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"symbol-name:setFolders","kind":"calls","metadata":{"unresolvedName":"setFolders"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"symbol-name:setBaseDefinitions","kind":"calls","metadata":{"unresolvedName":"setBaseDefinitions"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"external:(defs || []).filter","kind":"calls","metadata":{"unresolvedName":"(defs || []).filter"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"symbol-name:useEffect","kind":"calls","metadata":{"unresolvedName":"useEffect"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"symbol-name:loadData","kind":"calls","metadata":{"unresolvedName":"loadData"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"symbol-name:setToolTypeForm","kind":"calls","metadata":{"unresolvedName":"setToolTypeForm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"symbol-name:setToolTypeError","kind":"calls","metadata":{"unresolvedName":"setToolTypeError"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"symbol-name:setToolTypeDirty","kind":"calls","metadata":{"unresolvedName":"setToolTypeDirty"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"symbol-name:setManifestData","kind":"calls","metadata":{"unresolvedName":"setManifestData"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"symbol-name:setManifestDefinitionId","kind":"calls","metadata":{"unresolvedName":"setManifestDefinitionId"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"external:toolType.default_port?.toString","kind":"calls","metadata":{"unresolvedName":"toolType.default_port?.toString"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"external:toolType.readiness_probe?.timeout?.toString","kind":"calls","metadata":{"unresolvedName":"toolType.readiness_probe?.timeout?.toString"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"external:toolType.readiness_probe?.interval?.toString","kind":"calls","metadata":{"unresolvedName":"toolType.readiness_probe?.interval?.toString"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"external:toolType.required_variables?.join","kind":"calls","metadata":{"unresolvedName":"toolType.required_variables?.join"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"external:window.confirm","kind":"calls","metadata":{"unresolvedName":"window.confirm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"symbol-name:setSelectedToolTypeId","kind":"calls","metadata":{"unresolvedName":"setSelectedToolTypeId"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"symbol-name:setIsCreating","kind":"calls","metadata":{"unresolvedName":"setIsCreating"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:populateToolTypeForm","kind":"calls","metadata":{"unresolvedName":"populateToolTypeForm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"symbol-name:setRightPanelTab","kind":"calls","metadata":{"unresolvedName":"setRightPanelTab"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"symbol-name:setShowConfigForm","kind":"calls","metadata":{"unresolvedName":"setShowConfigForm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"symbol-name:setShowFolderForm","kind":"calls","metadata":{"unresolvedName":"setShowFolderForm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:resetToolTypeForm","kind":"calls","metadata":{"unresolvedName":"resetToolTypeForm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"external:e.preventDefault","kind":"calls","metadata":{"unresolvedName":"e.preventDefault"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"external:toolTypeForm.name.trim","kind":"calls","metadata":{"unresolvedName":"toolTypeForm.name.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"external:toolTypeForm.display_name.trim","kind":"calls","metadata":{"unresolvedName":"toolTypeForm.display_name.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"external:toolTypeForm.default_port.trim","kind":"calls","metadata":{"unresolvedName":"toolTypeForm.default_port.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"symbol-name:isNaN","kind":"calls","metadata":{"unresolvedName":"isNaN"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"symbol-name:Number","kind":"calls","metadata":{"unresolvedName":"Number"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"external:template.trim","kind":"calls","metadata":{"unresolvedName":"template.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"external:toolTypeForm.required_variables\n .split(\",\")\n .map","kind":"calls","metadata":{"unresolvedName":"toolTypeForm.required_variables\n .split(\",\")\n .map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"external:toolTypeForm.required_variables\n .split","kind":"calls","metadata":{"unresolvedName":"toolTypeForm.required_variables\n .split"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"external:v.trim","kind":"calls","metadata":{"unresolvedName":"v.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"external:toolTypeForm.readiness_command.trim","kind":"calls","metadata":{"unresolvedName":"toolTypeForm.readiness_command.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"symbol-name:parseInt","kind":"calls","metadata":{"unresolvedName":"parseInt"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"external:toolTypeForm.description.trim","kind":"calls","metadata":{"unresolvedName":"toolTypeForm.description.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"external:toolTypeForm.category.trim","kind":"calls","metadata":{"unresolvedName":"toolTypeForm.category.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"external:toolTypeForm.startup_command.trim","kind":"calls","metadata":{"unresolvedName":"toolTypeForm.startup_command.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts:createToolType","kind":"calls","metadata":{"unresolvedName":"createToolType"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts:updateToolType","kind":"calls","metadata":{"unresolvedName":"updateToolType"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"/home/alex/projects/headquarter/apps/web/src/utils/errors.ts:extractErrorMessage","kind":"calls","metadata":{"unresolvedName":"extractErrorMessage"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts:deleteToolType","kind":"calls","metadata":{"unresolvedName":"deleteToolType"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"symbol-name:alert","kind":"calls","metadata":{"unresolvedName":"alert"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"symbol-name:setConfigForm","kind":"calls","metadata":{"unresolvedName":"setConfigForm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"symbol-name:setConfigError","kind":"calls","metadata":{"unresolvedName":"setConfigError"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"symbol-name:setSelectedConfig","kind":"calls","metadata":{"unresolvedName":"setSelectedConfig"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:resetConfigForm","kind":"calls","metadata":{"unresolvedName":"resetConfigForm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"external:config.port_override?.toString","kind":"calls","metadata":{"unresolvedName":"config.port_override?.toString"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"external:JSON.stringify","kind":"calls","metadata":{"unresolvedName":"JSON.stringify"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"external:configForm.key.trim","kind":"calls","metadata":{"unresolvedName":"configForm.key.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"external:configForm.env_vars_json.trim","kind":"calls","metadata":{"unresolvedName":"configForm.env_vars_json.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"external:JSON.parse","kind":"calls","metadata":{"unresolvedName":"JSON.parse"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"external:configForm.volumes_json.trim","kind":"calls","metadata":{"unresolvedName":"configForm.volumes_json.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"external:configForm.start_command.trim","kind":"calls","metadata":{"unresolvedName":"configForm.start_command.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"external:configForm.working_directory.trim","kind":"calls","metadata":{"unresolvedName":"configForm.working_directory.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_configs.ts:updateToolConfig","kind":"calls","metadata":{"unresolvedName":"updateToolConfig"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_configs.ts:createToolConfig","kind":"calls","metadata":{"unresolvedName":"createToolConfig"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_configs.ts:deleteToolConfig","kind":"calls","metadata":{"unresolvedName":"deleteToolConfig"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"symbol-name:setFolderForm","kind":"calls","metadata":{"unresolvedName":"setFolderForm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"symbol-name:setFolderError","kind":"calls","metadata":{"unresolvedName":"setFolderError"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"symbol-name:setSelectedFolder","kind":"calls","metadata":{"unresolvedName":"setSelectedFolder"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:resetFolderForm","kind":"calls","metadata":{"unresolvedName":"resetFolderForm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"external:folderForm.name.trim","kind":"calls","metadata":{"unresolvedName":"folderForm.name.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"external:folderForm.mount_path.trim","kind":"calls","metadata":{"unresolvedName":"folderForm.mount_path.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"external:folderForm.files_json.trim","kind":"calls","metadata":{"unresolvedName":"folderForm.files_json.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"external:folderForm.description.trim","kind":"calls","metadata":{"unresolvedName":"folderForm.description.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts:updateConfigFolder","kind":"calls","metadata":{"unresolvedName":"updateConfigFolder"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts:createConfigFolder","kind":"calls","metadata":{"unresolvedName":"createConfigFolder"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts:deleteConfigFolder","kind":"calls","metadata":{"unresolvedName":"deleteConfigFolder"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"external:toolTypes.map","kind":"calls","metadata":{"unresolvedName":"toolTypes.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"symbol-name:setMobileView","kind":"calls","metadata":{"unresolvedName":"setMobileView"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"external:selectedToolType.required_variables?.join","kind":"calls","metadata":{"unresolvedName":"selectedToolType.required_variables?.join"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleDeleteToolType","kind":"calls","metadata":{"unresolvedName":"handleDeleteToolType"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleToolTypeSubmit","kind":"calls","metadata":{"unresolvedName":"handleToolTypeSubmit"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleSelectToolType","kind":"calls","metadata":{"unresolvedName":"handleSelectToolType"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"external:e.stopPropagation","kind":"calls","metadata":{"unresolvedName":"e.stopPropagation"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"external:([\"details\", \"configs\", \"folders\"] as RightPanelTab[]).map","kind":"calls","metadata":{"unresolvedName":"([\"details\", \"configs\", \"folders\"] as RightPanelTab[]).map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"external:toolConfigs.map","kind":"calls","metadata":{"unresolvedName":"toolConfigs.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:openEditConfig","kind":"calls","metadata":{"unresolvedName":"openEditConfig"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleDeleteConfig","kind":"calls","metadata":{"unresolvedName":"handleDeleteConfig"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"external:toolFolders.map","kind":"calls","metadata":{"unresolvedName":"toolFolders.map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"external:Object.keys","kind":"calls","metadata":{"unresolvedName":"Object.keys"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:openEditFolder","kind":"calls","metadata":{"unresolvedName":"openEditFolder"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:ToolWorkshopPage","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleDeleteFolder","kind":"calls","metadata":{"unresolvedName":"handleDeleteFolder"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"symbol-name:setStatus","kind":"calls","metadata":{"unresolvedName":"setStatus"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"external:Promise.all","kind":"calls","metadata":{"unresolvedName":"Promise.all"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts:listToolTypes","kind":"calls","metadata":{"unresolvedName":"listToolTypes"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_configs.ts:listToolConfigs","kind":"calls","metadata":{"unresolvedName":"listToolConfigs"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts:listConfigFolders","kind":"calls","metadata":{"unresolvedName":"listConfigFolders"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_definitions.ts:listToolDefinitions","kind":"calls","metadata":{"unresolvedName":"listToolDefinitions"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"symbol-name:setToolTypes","kind":"calls","metadata":{"unresolvedName":"setToolTypes"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"symbol-name:setConfigs","kind":"calls","metadata":{"unresolvedName":"setConfigs"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"symbol-name:setFolders","kind":"calls","metadata":{"unresolvedName":"setFolders"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"symbol-name:setBaseDefinitions","kind":"calls","metadata":{"unresolvedName":"setBaseDefinitions"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"external:(defs || []).filter","kind":"calls","metadata":{"unresolvedName":"(defs || []).filter"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"symbol-name:loadData","kind":"calls","metadata":{"unresolvedName":"loadData"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:resetToolTypeForm","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:resetToolTypeForm","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:resetToolTypeForm","to":"symbol-name:setToolTypeForm","kind":"calls","metadata":{"unresolvedName":"setToolTypeForm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:resetToolTypeForm","to":"symbol-name:setToolTypeError","kind":"calls","metadata":{"unresolvedName":"setToolTypeError"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:resetToolTypeForm","to":"symbol-name:setToolTypeDirty","kind":"calls","metadata":{"unresolvedName":"setToolTypeDirty"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:resetToolTypeForm","to":"symbol-name:setManifestData","kind":"calls","metadata":{"unresolvedName":"setManifestData"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:resetToolTypeForm","to":"symbol-name:setManifestDefinitionId","kind":"calls","metadata":{"unresolvedName":"setManifestDefinitionId"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:populateToolTypeForm","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:populateToolTypeForm","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:populateToolTypeForm","to":"symbol-name:setToolTypeForm","kind":"calls","metadata":{"unresolvedName":"setToolTypeForm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:populateToolTypeForm","to":"external:toolType.default_port?.toString","kind":"calls","metadata":{"unresolvedName":"toolType.default_port?.toString"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:populateToolTypeForm","to":"external:toolType.readiness_probe?.timeout?.toString","kind":"calls","metadata":{"unresolvedName":"toolType.readiness_probe?.timeout?.toString"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:populateToolTypeForm","to":"external:toolType.readiness_probe?.interval?.toString","kind":"calls","metadata":{"unresolvedName":"toolType.readiness_probe?.interval?.toString"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:populateToolTypeForm","to":"external:toolType.required_variables?.join","kind":"calls","metadata":{"unresolvedName":"toolType.required_variables?.join"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:populateToolTypeForm","to":"symbol-name:setToolTypeError","kind":"calls","metadata":{"unresolvedName":"setToolTypeError"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:populateToolTypeForm","to":"symbol-name:setToolTypeDirty","kind":"calls","metadata":{"unresolvedName":"setToolTypeDirty"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:populateToolTypeForm","to":"symbol-name:setManifestData","kind":"calls","metadata":{"unresolvedName":"setManifestData"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:populateToolTypeForm","to":"symbol-name:setManifestDefinitionId","kind":"calls","metadata":{"unresolvedName":"setManifestDefinitionId"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleSelectToolType","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleSelectToolType","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleSelectToolType","to":"external:window.confirm","kind":"calls","metadata":{"unresolvedName":"window.confirm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleSelectToolType","to":"symbol-name:setSelectedToolTypeId","kind":"calls","metadata":{"unresolvedName":"setSelectedToolTypeId"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleSelectToolType","to":"symbol-name:setIsCreating","kind":"calls","metadata":{"unresolvedName":"setIsCreating"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleSelectToolType","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:populateToolTypeForm","kind":"calls","metadata":{"unresolvedName":"populateToolTypeForm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleSelectToolType","to":"symbol-name:setRightPanelTab","kind":"calls","metadata":{"unresolvedName":"setRightPanelTab"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleSelectToolType","to":"symbol-name:setShowConfigForm","kind":"calls","metadata":{"unresolvedName":"setShowConfigForm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleSelectToolType","to":"symbol-name:setShowFolderForm","kind":"calls","metadata":{"unresolvedName":"setShowFolderForm"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleCreateNew","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleCreateNew","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleCreateNew","to":"external:window.confirm","kind":"calls","metadata":{"unresolvedName":"window.confirm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleCreateNew","to":"symbol-name:setSelectedToolTypeId","kind":"calls","metadata":{"unresolvedName":"setSelectedToolTypeId"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleCreateNew","to":"symbol-name:setIsCreating","kind":"calls","metadata":{"unresolvedName":"setIsCreating"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleCreateNew","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:resetToolTypeForm","kind":"calls","metadata":{"unresolvedName":"resetToolTypeForm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleCreateNew","to":"symbol-name:setRightPanelTab","kind":"calls","metadata":{"unresolvedName":"setRightPanelTab"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleCreateNew","to":"symbol-name:setShowConfigForm","kind":"calls","metadata":{"unresolvedName":"setShowConfigForm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleCreateNew","to":"symbol-name:setShowFolderForm","kind":"calls","metadata":{"unresolvedName":"setShowFolderForm"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleToolTypeSubmit","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleToolTypeSubmit","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleToolTypeSubmit","to":"external:e.preventDefault","kind":"calls","metadata":{"unresolvedName":"e.preventDefault"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleToolTypeSubmit","to":"symbol-name:setToolTypeError","kind":"calls","metadata":{"unresolvedName":"setToolTypeError"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleToolTypeSubmit","to":"external:toolTypeForm.name.trim","kind":"calls","metadata":{"unresolvedName":"toolTypeForm.name.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleToolTypeSubmit","to":"external:toolTypeForm.display_name.trim","kind":"calls","metadata":{"unresolvedName":"toolTypeForm.display_name.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleToolTypeSubmit","to":"external:toolTypeForm.default_port.trim","kind":"calls","metadata":{"unresolvedName":"toolTypeForm.default_port.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleToolTypeSubmit","to":"symbol-name:isNaN","kind":"calls","metadata":{"unresolvedName":"isNaN"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleToolTypeSubmit","to":"symbol-name:Number","kind":"calls","metadata":{"unresolvedName":"Number"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleToolTypeSubmit","to":"external:template.trim","kind":"calls","metadata":{"unresolvedName":"template.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleToolTypeSubmit","to":"external:toolTypeForm.required_variables\n .split(\",\")\n .map","kind":"calls","metadata":{"unresolvedName":"toolTypeForm.required_variables\n .split(\",\")\n .map"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleToolTypeSubmit","to":"external:toolTypeForm.required_variables\n .split","kind":"calls","metadata":{"unresolvedName":"toolTypeForm.required_variables\n .split"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleToolTypeSubmit","to":"external:v.trim","kind":"calls","metadata":{"unresolvedName":"v.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleToolTypeSubmit","to":"external:toolTypeForm.readiness_command.trim","kind":"calls","metadata":{"unresolvedName":"toolTypeForm.readiness_command.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleToolTypeSubmit","to":"symbol-name:parseInt","kind":"calls","metadata":{"unresolvedName":"parseInt"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleToolTypeSubmit","to":"external:toolTypeForm.description.trim","kind":"calls","metadata":{"unresolvedName":"toolTypeForm.description.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleToolTypeSubmit","to":"external:toolTypeForm.category.trim","kind":"calls","metadata":{"unresolvedName":"toolTypeForm.category.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleToolTypeSubmit","to":"external:toolTypeForm.startup_command.trim","kind":"calls","metadata":{"unresolvedName":"toolTypeForm.startup_command.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleToolTypeSubmit","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts:createToolType","kind":"calls","metadata":{"unresolvedName":"createToolType"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleToolTypeSubmit","to":"symbol-name:setIsCreating","kind":"calls","metadata":{"unresolvedName":"setIsCreating"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleToolTypeSubmit","to":"symbol-name:setSelectedToolTypeId","kind":"calls","metadata":{"unresolvedName":"setSelectedToolTypeId"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleToolTypeSubmit","to":"symbol-name:setToolTypeDirty","kind":"calls","metadata":{"unresolvedName":"setToolTypeDirty"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleToolTypeSubmit","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts:updateToolType","kind":"calls","metadata":{"unresolvedName":"updateToolType"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleToolTypeSubmit","to":"symbol-name:loadData","kind":"calls","metadata":{"unresolvedName":"loadData"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleToolTypeSubmit","to":"/home/alex/projects/headquarter/apps/web/src/utils/errors.ts:extractErrorMessage","kind":"calls","metadata":{"unresolvedName":"extractErrorMessage"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleDeleteToolType","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleDeleteToolType","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleDeleteToolType","to":"external:window.confirm","kind":"calls","metadata":{"unresolvedName":"window.confirm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleDeleteToolType","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_types.ts:deleteToolType","kind":"calls","metadata":{"unresolvedName":"deleteToolType"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleDeleteToolType","to":"symbol-name:setSelectedToolTypeId","kind":"calls","metadata":{"unresolvedName":"setSelectedToolTypeId"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleDeleteToolType","to":"symbol-name:setIsCreating","kind":"calls","metadata":{"unresolvedName":"setIsCreating"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleDeleteToolType","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:resetToolTypeForm","kind":"calls","metadata":{"unresolvedName":"resetToolTypeForm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleDeleteToolType","to":"symbol-name:loadData","kind":"calls","metadata":{"unresolvedName":"loadData"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleDeleteToolType","to":"symbol-name:alert","kind":"calls","metadata":{"unresolvedName":"alert"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:resetConfigForm","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:resetConfigForm","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:resetConfigForm","to":"symbol-name:setConfigForm","kind":"calls","metadata":{"unresolvedName":"setConfigForm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:resetConfigForm","to":"symbol-name:setConfigError","kind":"calls","metadata":{"unresolvedName":"setConfigError"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:resetConfigForm","to":"symbol-name:setSelectedConfig","kind":"calls","metadata":{"unresolvedName":"setSelectedConfig"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:openCreateConfig","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:openCreateConfig","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:openCreateConfig","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:resetConfigForm","kind":"calls","metadata":{"unresolvedName":"resetConfigForm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:openCreateConfig","to":"symbol-name:setShowConfigForm","kind":"calls","metadata":{"unresolvedName":"setShowConfigForm"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:openEditConfig","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:openEditConfig","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:openEditConfig","to":"symbol-name:setConfigForm","kind":"calls","metadata":{"unresolvedName":"setConfigForm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:openEditConfig","to":"external:config.port_override?.toString","kind":"calls","metadata":{"unresolvedName":"config.port_override?.toString"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:openEditConfig","to":"external:JSON.stringify","kind":"calls","metadata":{"unresolvedName":"JSON.stringify"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:openEditConfig","to":"symbol-name:setConfigError","kind":"calls","metadata":{"unresolvedName":"setConfigError"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:openEditConfig","to":"symbol-name:setShowConfigForm","kind":"calls","metadata":{"unresolvedName":"setShowConfigForm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:openEditConfig","to":"symbol-name:setSelectedConfig","kind":"calls","metadata":{"unresolvedName":"setSelectedConfig"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleConfigSubmit","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleConfigSubmit","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleConfigSubmit","to":"external:e.preventDefault","kind":"calls","metadata":{"unresolvedName":"e.preventDefault"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleConfigSubmit","to":"symbol-name:setConfigError","kind":"calls","metadata":{"unresolvedName":"setConfigError"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleConfigSubmit","to":"external:configForm.key.trim","kind":"calls","metadata":{"unresolvedName":"configForm.key.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleConfigSubmit","to":"external:configForm.env_vars_json.trim","kind":"calls","metadata":{"unresolvedName":"configForm.env_vars_json.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleConfigSubmit","to":"external:JSON.parse","kind":"calls","metadata":{"unresolvedName":"JSON.parse"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleConfigSubmit","to":"external:configForm.volumes_json.trim","kind":"calls","metadata":{"unresolvedName":"configForm.volumes_json.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleConfigSubmit","to":"symbol-name:Number","kind":"calls","metadata":{"unresolvedName":"Number"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleConfigSubmit","to":"external:configForm.start_command.trim","kind":"calls","metadata":{"unresolvedName":"configForm.start_command.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleConfigSubmit","to":"external:configForm.working_directory.trim","kind":"calls","metadata":{"unresolvedName":"configForm.working_directory.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleConfigSubmit","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_configs.ts:updateToolConfig","kind":"calls","metadata":{"unresolvedName":"updateToolConfig"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleConfigSubmit","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_configs.ts:createToolConfig","kind":"calls","metadata":{"unresolvedName":"createToolConfig"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleConfigSubmit","to":"symbol-name:setShowConfigForm","kind":"calls","metadata":{"unresolvedName":"setShowConfigForm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleConfigSubmit","to":"symbol-name:setSelectedConfig","kind":"calls","metadata":{"unresolvedName":"setSelectedConfig"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleConfigSubmit","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:resetConfigForm","kind":"calls","metadata":{"unresolvedName":"resetConfigForm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleConfigSubmit","to":"symbol-name:loadData","kind":"calls","metadata":{"unresolvedName":"loadData"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleConfigSubmit","to":"/home/alex/projects/headquarter/apps/web/src/utils/errors.ts:extractErrorMessage","kind":"calls","metadata":{"unresolvedName":"extractErrorMessage"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleDeleteConfig","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleDeleteConfig","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleDeleteConfig","to":"external:window.confirm","kind":"calls","metadata":{"unresolvedName":"window.confirm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleDeleteConfig","to":"/home/alex/projects/headquarter/apps/web/src/api/tool_configs.ts:deleteToolConfig","kind":"calls","metadata":{"unresolvedName":"deleteToolConfig"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleDeleteConfig","to":"symbol-name:loadData","kind":"calls","metadata":{"unresolvedName":"loadData"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleDeleteConfig","to":"symbol-name:alert","kind":"calls","metadata":{"unresolvedName":"alert"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:resetFolderForm","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:resetFolderForm","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:resetFolderForm","to":"symbol-name:setFolderForm","kind":"calls","metadata":{"unresolvedName":"setFolderForm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:resetFolderForm","to":"symbol-name:setFolderError","kind":"calls","metadata":{"unresolvedName":"setFolderError"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:resetFolderForm","to":"symbol-name:setSelectedFolder","kind":"calls","metadata":{"unresolvedName":"setSelectedFolder"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:openCreateFolder","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:openCreateFolder","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:openCreateFolder","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:resetFolderForm","kind":"calls","metadata":{"unresolvedName":"resetFolderForm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:openCreateFolder","to":"symbol-name:setShowFolderForm","kind":"calls","metadata":{"unresolvedName":"setShowFolderForm"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:openEditFolder","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:openEditFolder","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:openEditFolder","to":"symbol-name:setFolderForm","kind":"calls","metadata":{"unresolvedName":"setFolderForm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:openEditFolder","to":"external:JSON.stringify","kind":"calls","metadata":{"unresolvedName":"JSON.stringify"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:openEditFolder","to":"symbol-name:setFolderError","kind":"calls","metadata":{"unresolvedName":"setFolderError"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:openEditFolder","to":"symbol-name:setShowFolderForm","kind":"calls","metadata":{"unresolvedName":"setShowFolderForm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:openEditFolder","to":"symbol-name:setSelectedFolder","kind":"calls","metadata":{"unresolvedName":"setSelectedFolder"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleFolderSubmit","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleFolderSubmit","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleFolderSubmit","to":"external:e.preventDefault","kind":"calls","metadata":{"unresolvedName":"e.preventDefault"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleFolderSubmit","to":"symbol-name:setFolderError","kind":"calls","metadata":{"unresolvedName":"setFolderError"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleFolderSubmit","to":"external:folderForm.name.trim","kind":"calls","metadata":{"unresolvedName":"folderForm.name.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleFolderSubmit","to":"external:folderForm.mount_path.trim","kind":"calls","metadata":{"unresolvedName":"folderForm.mount_path.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleFolderSubmit","to":"external:folderForm.files_json.trim","kind":"calls","metadata":{"unresolvedName":"folderForm.files_json.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleFolderSubmit","to":"external:JSON.parse","kind":"calls","metadata":{"unresolvedName":"JSON.parse"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleFolderSubmit","to":"external:folderForm.description.trim","kind":"calls","metadata":{"unresolvedName":"folderForm.description.trim"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleFolderSubmit","to":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts:updateConfigFolder","kind":"calls","metadata":{"unresolvedName":"updateConfigFolder"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleFolderSubmit","to":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts:createConfigFolder","kind":"calls","metadata":{"unresolvedName":"createConfigFolder"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleFolderSubmit","to":"symbol-name:setShowFolderForm","kind":"calls","metadata":{"unresolvedName":"setShowFolderForm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleFolderSubmit","to":"symbol-name:setSelectedFolder","kind":"calls","metadata":{"unresolvedName":"setSelectedFolder"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleFolderSubmit","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:resetFolderForm","kind":"calls","metadata":{"unresolvedName":"resetFolderForm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleFolderSubmit","to":"symbol-name:loadData","kind":"calls","metadata":{"unresolvedName":"loadData"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleFolderSubmit","to":"/home/alex/projects/headquarter/apps/web/src/utils/errors.ts:extractErrorMessage","kind":"calls","metadata":{"unresolvedName":"extractErrorMessage"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleDeleteFolder","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleDeleteFolder","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleDeleteFolder","to":"external:window.confirm","kind":"calls","metadata":{"unresolvedName":"window.confirm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleDeleteFolder","to":"/home/alex/projects/headquarter/apps/web/src/api/config_folders.ts:deleteConfigFolder","kind":"calls","metadata":{"unresolvedName":"deleteConfigFolder"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleDeleteFolder","to":"symbol-name:loadData","kind":"calls","metadata":{"unresolvedName":"loadData"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleDeleteFolder","to":"symbol-name:alert","kind":"calls","metadata":{"unresolvedName":"alert"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"symbol-name:setSelectedToolTypeId","kind":"calls","metadata":{"unresolvedName":"setSelectedToolTypeId"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"symbol-name:setIsCreating","kind":"calls","metadata":{"unresolvedName":"setIsCreating"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"symbol-name:setMobileView","kind":"calls","metadata":{"unresolvedName":"setMobileView"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"symbol-name:setSelectedToolTypeId","kind":"calls","metadata":{"unresolvedName":"setSelectedToolTypeId"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"symbol-name:setIsCreating","kind":"calls","metadata":{"unresolvedName":"setIsCreating"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:resetToolTypeForm","kind":"calls","metadata":{"unresolvedName":"resetToolTypeForm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"symbol-name:setMobileView","kind":"calls","metadata":{"unresolvedName":"setMobileView"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:populateToolTypeForm","kind":"calls","metadata":{"unresolvedName":"populateToolTypeForm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"symbol-name:setIsCreating","kind":"calls","metadata":{"unresolvedName":"setIsCreating"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"symbol-name:setMobileView","kind":"calls","metadata":{"unresolvedName":"setMobileView"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleDeleteToolType","kind":"calls","metadata":{"unresolvedName":"handleDeleteToolType"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"symbol-name:setMobileView","kind":"calls","metadata":{"unresolvedName":"setMobileView"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"symbol-name:setSelectedToolTypeId","kind":"calls","metadata":{"unresolvedName":"setSelectedToolTypeId"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"symbol-name:setMobileView","kind":"calls","metadata":{"unresolvedName":"setMobileView"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"external:window.confirm","kind":"calls","metadata":{"unresolvedName":"window.confirm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"symbol-name:setMobileView","kind":"calls","metadata":{"unresolvedName":"setMobileView"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleToolTypeSubmit","kind":"calls","metadata":{"unresolvedName":"handleToolTypeSubmit"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"symbol-name:setMobileView","kind":"calls","metadata":{"unresolvedName":"setMobileView"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:preventDefault","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:preventDefault","kind":"defines"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","kind":"defines"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","kind":"defines"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"external:e.stopPropagation","kind":"calls","metadata":{"unresolvedName":"e.stopPropagation"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:handleDeleteToolType","kind":"calls","metadata":{"unresolvedName":"handleDeleteToolType"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","kind":"defines"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","kind":"defines"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"symbol-name:setToolTypeForm","kind":"calls","metadata":{"unresolvedName":"setToolTypeForm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"symbol-name:setToolTypeDirty","kind":"calls","metadata":{"unresolvedName":"setToolTypeDirty"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"symbol-name:setToolTypeForm","kind":"calls","metadata":{"unresolvedName":"setToolTypeForm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"symbol-name:setToolTypeDirty","kind":"calls","metadata":{"unresolvedName":"setToolTypeDirty"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"symbol-name:setToolTypeForm","kind":"calls","metadata":{"unresolvedName":"setToolTypeForm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"symbol-name:setToolTypeDirty","kind":"calls","metadata":{"unresolvedName":"setToolTypeDirty"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"symbol-name:setToolTypeForm","kind":"calls","metadata":{"unresolvedName":"setToolTypeForm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"symbol-name:setToolTypeDirty","kind":"calls","metadata":{"unresolvedName":"setToolTypeDirty"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"symbol-name:setToolTypeForm","kind":"calls","metadata":{"unresolvedName":"setToolTypeForm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"symbol-name:setToolTypeDirty","kind":"calls","metadata":{"unresolvedName":"setToolTypeDirty"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"symbol-name:setToolTypeForm","kind":"calls","metadata":{"unresolvedName":"setToolTypeForm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"symbol-name:setToolTypeDirty","kind":"calls","metadata":{"unresolvedName":"setToolTypeDirty"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"symbol-name:setToolTypeForm","kind":"calls","metadata":{"unresolvedName":"setToolTypeForm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"symbol-name:setToolTypeDirty","kind":"calls","metadata":{"unresolvedName":"setToolTypeDirty"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"symbol-name:setToolTypeForm","kind":"calls","metadata":{"unresolvedName":"setToolTypeForm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"symbol-name:setToolTypeDirty","kind":"calls","metadata":{"unresolvedName":"setToolTypeDirty"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"symbol-name:setManifestData","kind":"calls","metadata":{"unresolvedName":"setManifestData"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"symbol-name:setToolTypeDirty","kind":"calls","metadata":{"unresolvedName":"setToolTypeDirty"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"symbol-name:setToolTypeForm","kind":"calls","metadata":{"unresolvedName":"setToolTypeForm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"symbol-name:setToolTypeDirty","kind":"calls","metadata":{"unresolvedName":"setToolTypeDirty"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"symbol-name:setToolTypeForm","kind":"calls","metadata":{"unresolvedName":"setToolTypeForm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"symbol-name:setToolTypeDirty","kind":"calls","metadata":{"unresolvedName":"setToolTypeDirty"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"symbol-name:setToolTypeForm","kind":"calls","metadata":{"unresolvedName":"setToolTypeForm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"symbol-name:setToolTypeDirty","kind":"calls","metadata":{"unresolvedName":"setToolTypeDirty"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"symbol-name:setToolTypeForm","kind":"calls","metadata":{"unresolvedName":"setToolTypeForm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"symbol-name:setToolTypeDirty","kind":"calls","metadata":{"unresolvedName":"setToolTypeDirty"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"symbol-name:setToolTypeForm","kind":"calls","metadata":{"unresolvedName":"setToolTypeForm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"symbol-name:setToolTypeDirty","kind":"calls","metadata":{"unresolvedName":"setToolTypeDirty"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:resetToolTypeForm","kind":"calls","metadata":{"unresolvedName":"resetToolTypeForm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:populateToolTypeForm","kind":"calls","metadata":{"unresolvedName":"populateToolTypeForm"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"symbol-name:setShowConfigForm","kind":"calls","metadata":{"unresolvedName":"setShowConfigForm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:resetConfigForm","kind":"calls","metadata":{"unresolvedName":"resetConfigForm"}},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","kind":"contains"},{"from":"file:/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","kind":"defines"},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"symbol-name:setShowFolderForm","kind":"calls","metadata":{"unresolvedName":"setShowFolderForm"}},{"from":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:","to":"/home/alex/projects/headquarter/apps/web/src/pages/tool-workshop.tsx:resetFolderForm","kind":"calls","metadata":{"unresolvedName":"resetFolderForm"}}]} \ No newline at end of file diff --git a/apps/web/src/api/tool_definitions.ts b/apps/web/src/api/tool_definitions.ts new file mode 100644 index 0000000..9ef7bcd --- /dev/null +++ b/apps/web/src/api/tool_definitions.ts @@ -0,0 +1,108 @@ +import { apiClient } from "./client"; + +export interface ToolDefinitionManifest { + id: string; + name: string; + display_name: string; + description: string | null; + category: string | null; + interface_type: string; + base_image: string | null; + base_definition_id: string | null; + base_version: string; + manifest: Record; + dockerfile_cache: string | null; + compose_cache: string | null; + version: string; + is_base: boolean; + created_at: string; + updated_at: string; +} + +export interface CreateToolDefinitionRequest { + name: string; + display_name: string; + description?: string; + category?: string; + interface_type?: string; + base_image?: string; + base_definition_id?: string; + base_version?: string; + manifest: Record; +} + +export interface UpdateToolDefinitionRequest { + display_name?: string; + description?: string; + category?: string; + manifest?: Record; + base_version?: string; +} + +export interface CompileResult { + id: string; + name: string; + dockerfile: string; + entrypoint: string; + compose: string; + image_tag: string; +} + +export const listToolDefinitions = async ( + includeBases = true, +): Promise => { + const response = await apiClient.get<{ + definitions: ToolDefinitionManifest[]; + }>("/tool-definitions", { + params: { include_bases: includeBases }, + }); + return response.data.definitions; +}; + +export const getToolDefinition = async ( + id: string, +): Promise => { + const response = await apiClient.get( + `/tool-definitions/${id}`, + ); + return response.data; +}; + +export const createToolDefinition = async ( + data: CreateToolDefinitionRequest, +): Promise => { + const response = await apiClient.post( + "/tool-definitions", + data, + ); + return response.data; +}; + +export const updateToolDefinition = async ( + id: string, + data: UpdateToolDefinitionRequest, +): Promise => { + const response = await apiClient.put( + `/tool-definitions/${id}`, + data, + ); + return response.data; +}; + +export const deleteToolDefinition = async ( + id: string, +): Promise<{ status: string; id: string }> => { + const response = await apiClient.delete<{ status: string; id: string }>( + `/tool-definitions/${id}`, + ); + return response.data; +}; + +export const compileToolDefinition = async ( + id: string, +): Promise => { + const response = await apiClient.post( + `/tool-definitions/${id}/compile`, + ); + return response.data; +}; diff --git a/apps/web/src/api/tool_types.ts b/apps/web/src/api/tool_types.ts index 893cc1a..0c3b381 100644 --- a/apps/web/src/api/tool_types.ts +++ b/apps/web/src/api/tool_types.ts @@ -1,90 +1,102 @@ import { apiClient } from "./client"; export interface ReadinessProbe { - command: string; - timeout: number; - interval: number; + command: string; + timeout: number; + interval: number; } export interface ToolType { - id: string; - name: string; - display_name: string; - description: string | null; - category: string; - interface_type: string; - requires_port: boolean; - default_port: number | null; - definition_type: 'compose' | 'dockerfile'; - compose_template: string | null; - dockerfile_template: string | null; - build_context: Record | null; - readiness_probe: ReadinessProbe | null; - startup_command: string | null; - required_variables: string[]; - created_by_id: string | null; - created_at: string; - updated_at: string; + id: string; + name: string; + display_name: string; + description: string | null; + category: string; + interface_type: string; + requires_port: boolean; + default_port: number | null; + definition_type: "compose" | "dockerfile" | "manifest"; + manifest_id: string | null; + compose_template: string | null; + dockerfile_template: string | null; + build_context: Record | null; + readiness_probe: ReadinessProbe | null; + startup_command: string | null; + required_variables: string[]; + created_by_id: string | null; + created_at: string; + updated_at: string; } export interface CreateToolTypeRequest { - name: string; - display_name: string; - description?: string; - category?: string; - interface_type?: string; - requires_port?: boolean; - default_port: number; - definition_type?: 'compose' | 'dockerfile'; - compose_template?: string; - dockerfile_template?: string; - build_context?: Record; - readiness_probe?: ReadinessProbe; - startup_command?: string; - required_variables: string[]; + name: string; + display_name: string; + description?: string; + category?: string; + interface_type?: string; + requires_port?: boolean; + default_port: number; + definition_type?: "compose" | "dockerfile" | "manifest"; + manifest_id?: string; + compose_template?: string; + dockerfile_template?: string; + build_context?: Record; + readiness_probe?: ReadinessProbe; + startup_command?: string; + required_variables: string[]; } export interface UpdateToolTypeRequest { - display_name?: string; - description?: string; - category?: string; - interface_type?: string; - requires_port?: boolean; - default_port?: number; - definition_type?: 'compose' | 'dockerfile'; - compose_template?: string; - dockerfile_template?: string; - build_context?: Record; - readiness_probe?: ReadinessProbe; - startup_command?: string; - required_variables?: string[]; + display_name?: string; + description?: string; + category?: string; + interface_type?: string; + requires_port?: boolean; + default_port?: number; + definition_type?: "compose" | "dockerfile" | "manifest"; + manifest_id?: string; + compose_template?: string; + dockerfile_template?: string; + build_context?: Record; + readiness_probe?: ReadinessProbe; + startup_command?: string; + required_variables?: string[]; } export const listToolTypes = async (): Promise => { - const response = await apiClient.get("/tool-types"); - return response.data; + const response = await apiClient.get("/tool-types"); + return response.data; }; export const getToolType = async (id: string): Promise => { - const response = await apiClient.get(`/tool-types/${id}`); - return response.data; + const response = await apiClient.get(`/tool-types/${id}`); + return response.data; }; -export const createToolType = async (data: CreateToolTypeRequest): Promise => { - const response = await apiClient.post("/tool-types", data); - return response.data; +export const createToolType = async ( + data: CreateToolTypeRequest, +): Promise => { + const response = await apiClient.post("/tool-types", data); + return response.data; }; -export const updateToolType = async (id: string, data: UpdateToolTypeRequest): Promise => { - const response = await apiClient.put(`/tool-types/${id}`, data); - return response.data; +export const updateToolType = async ( + id: string, + data: UpdateToolTypeRequest, +): Promise => { + const response = await apiClient.put(`/tool-types/${id}`, data); + return response.data; }; export const deleteToolType = async (id: string): Promise => { - await apiClient.delete(`/tool-types/${id}`); + await apiClient.delete(`/tool-types/${id}`); }; -export const validateToolType = async (id: string): Promise<{ valid: boolean; errors?: string[] }> => { - const response = await apiClient.get<{ valid: boolean; errors?: string[] }>(`/tool-types/${id}/validate`); - return response.data; +export const validateToolType = async ( + id: string, +): Promise<{ valid: boolean; errors?: string[] }> => { + const response = await apiClient.get<{ valid: boolean; errors?: string[] }>( + `/tool-types/${id}/validate`, + ); + return response.data; }; diff --git a/apps/web/src/components/manifest-editor.tsx b/apps/web/src/components/manifest-editor.tsx new file mode 100644 index 0000000..76a3b41 --- /dev/null +++ b/apps/web/src/components/manifest-editor.tsx @@ -0,0 +1,849 @@ +import { useState, useEffect, useCallback } from "react"; +import { Icon } from "./icon"; +import { extractErrorMessage } from "../utils/errors"; +import { + compileToolDefinition, + type ToolDefinitionManifest, +} from "../api/tool_definitions"; + +interface PackageEntry { + name: string; +} + +interface MountEntry { + name: string; + target: string; + source_type: string; + writable: boolean; + owner: string; + mode: string; + file_mode: string; + readonly: boolean; + git_mount_ref: string; +} + +interface ManifestEditorProps { + manifest: Record | null; + baseDefinitions: ToolDefinitionManifest[]; + onChange: (manifest: Record) => void; + definitionId?: string | null; +} + +export const ManifestEditor = ({ + manifest, + baseDefinitions, + onChange, + definitionId, +}: ManifestEditorProps) => { + const [baseImage, setBaseImage] = useState(""); + const [baseDefinitionId, setBaseDefinitionId] = useState(""); + const [aptPackages, setAptPackages] = useState([]); + const [npmPackages, setNpmPackages] = useState([]); + const [pipPackages, setPipPackages] = useState([]); + const [nodeVersion, setNodeVersion] = useState(""); + const [userName, setUserName] = useState("user"); + const [userUid, setUserUid] = useState("1000"); + const [userGid, setUserGid] = useState("1000"); + const [envVars, setEnvVars] = useState<{ key: string; value: string }[]>([]); + const [buildScripts, setBuildScripts] = useState([""]); + const [startupScripts, setStartupScripts] = useState([""]); + const [mounts, setMounts] = useState([]); + const [command, setCommand] = useState([""]); + const [workingDir, setWorkingDir] = useState("/workspace"); + const [stdinOpen, setStdinOpen] = useState(true); + const [tty, setTty] = useState(true); + + const [preview, setPreview] = useState<{ + dockerfile: string; + compose: string; + entrypoint: string; + } | null>(null); + const [previewLoading, setPreviewLoading] = useState(false); + const [previewError, setPreviewError] = useState(null); + + // Load manifest into form + useEffect(() => { + if (!manifest) return; + + const pkgs = (manifest.packages as Record) || {}; + setBaseImage((manifest.base_image as string) || ""); + setBaseDefinitionId((manifest.base_definition_id as string) || ""); + setAptPackages(((pkgs.apt as string[]) || []).map((p) => ({ name: p }))); + setNpmPackages( + ((pkgs.npm_global as string[]) || []).map((p) => ({ name: p })), + ); + setPipPackages(((pkgs.pip as string[]) || []).map((p) => ({ name: p }))); + setNodeVersion((pkgs.node as Record)?.version || ""); + + const user = (manifest.user as Record) || {}; + setUserName((user.name as string) || "user"); + setUserUid(String(user.uid || "1000")); + setUserGid(String(user.gid || "1000")); + + const env = (manifest.env as Record) || {}; + setEnvVars(Object.entries(env).map(([key, value]) => ({ key, value }))); + + const scripts = (manifest.scripts as Record) || {}; + setBuildScripts((scripts.build || []).length > 0 ? scripts.build : [""]); + setStartupScripts( + (scripts.startup || []).length > 0 ? scripts.startup : [""], + ); + + const mts = (manifest.mounts as MountEntry[]) || []; + setMounts(mts); + + const runtime = (manifest.runtime as Record) || {}; + setCommand((runtime.command as string[]) || [""]); + setWorkingDir((runtime.working_dir as string) || "/workspace"); + setStdinOpen((runtime.stdin_open as boolean) ?? true); + setTty((runtime.tty as boolean) ?? true); + }, [manifest]); + + // Build manifest from form state + const buildManifest = useCallback((): Record => { + const packages: Record = {}; + const apt = aptPackages.map((p) => p.name).filter(Boolean); + if (apt.length) packages.apt = apt; + const npm = npmPackages.map((p) => p.name).filter(Boolean); + if (npm.length) packages.npm_global = npm; + const pip = pipPackages.map((p) => p.name).filter(Boolean); + if (pip.length) packages.pip = pip; + if (nodeVersion) packages.node = { version: nodeVersion }; + + const env: Record = {}; + envVars.forEach(({ key, value }) => { + if (key) env[key] = value; + }); + + const scripts: Record = {}; + const build = buildScripts.filter(Boolean); + if (build.length) scripts.build = build; + const startup = startupScripts.filter(Boolean); + if (startup.length) scripts.startup = startup; + + const mts = mounts.filter((m) => m.name && m.target); + + const result: Record = { + packages, + user: { + name: userName, + uid: parseInt(userUid) || 1000, + gid: parseInt(userGid) || 1000, + create_home: true, + shell: "/bin/bash", + }, + env, + scripts, + mounts: mts, + runtime: { + command: + command.filter(Boolean).length > 0 + ? command.filter(Boolean) + : ["/bin/bash"], + stdin_open: stdinOpen, + tty: tty, + working_dir: workingDir, + }, + }; + + if (baseImage) result.base_image = baseImage; + if (baseDefinitionId) result.base_definition_id = baseDefinitionId; + + return result; + }, [ + aptPackages, + npmPackages, + pipPackages, + nodeVersion, + userName, + userUid, + userGid, + envVars, + buildScripts, + startupScripts, + mounts, + command, + workingDir, + stdinOpen, + tty, + baseImage, + baseDefinitionId, + ]); + + // Notify parent of changes + useEffect(() => { + const m = buildManifest(); + onChange(m); + }, [buildManifest, onChange]); + + const handlePreview = async () => { + if (!definitionId) { + setPreviewError("Save the tool definition first to preview"); + return; + } + setPreviewLoading(true); + setPreviewError(null); + try { + const result = await compileToolDefinition(definitionId); + setPreview({ + dockerfile: result.dockerfile, + compose: result.compose, + entrypoint: result.entrypoint, + }); + } catch (err) { + setPreviewError(extractErrorMessage(err)); + } finally { + setPreviewLoading(false); + } + }; + + const addAptPackage = () => setAptPackages([...aptPackages, { name: "" }]); + const removeAptPackage = (idx: number) => + setAptPackages(aptPackages.filter((_, i) => i !== idx)); + const updateAptPackage = (idx: number, name: string) => { + const copy = [...aptPackages]; + copy[idx] = { name }; + setAptPackages(copy); + }; + + const addNpmPackage = () => setNpmPackages([...npmPackages, { name: "" }]); + const removeNpmPackage = (idx: number) => + setNpmPackages(npmPackages.filter((_, i) => i !== idx)); + const updateNpmPackage = (idx: number, name: string) => { + const copy = [...npmPackages]; + copy[idx] = { name }; + setNpmPackages(copy); + }; + + const addPipPackage = () => setPipPackages([...pipPackages, { name: "" }]); + const removePipPackage = (idx: number) => + setPipPackages(pipPackages.filter((_, i) => i !== idx)); + const updatePipPackage = (idx: number, name: string) => { + const copy = [...pipPackages]; + copy[idx] = { name }; + setPipPackages(copy); + }; + + const addEnvVar = () => setEnvVars([...envVars, { key: "", value: "" }]); + const removeEnvVar = (idx: number) => + setEnvVars(envVars.filter((_, i) => i !== idx)); + const updateEnvVar = (idx: number, field: "key" | "value", val: string) => { + const copy = [...envVars]; + copy[idx] = { ...copy[idx], [field]: val }; + setEnvVars(copy); + }; + + const addBuildScript = () => setBuildScripts([...buildScripts, ""]); + const removeBuildScript = (idx: number) => + setBuildScripts(buildScripts.filter((_, i) => i !== idx)); + const updateBuildScript = (idx: number, val: string) => { + const copy = [...buildScripts]; + copy[idx] = val; + setBuildScripts(copy); + }; + + const addStartupScript = () => setStartupScripts([...startupScripts, ""]); + const removeStartupScript = (idx: number) => + setStartupScripts(startupScripts.filter((_, i) => i !== idx)); + const updateStartupScript = (idx: number, val: string) => { + const copy = [...startupScripts]; + copy[idx] = val; + setStartupScripts(copy); + }; + + const addMount = () => + setMounts([ + ...mounts, + { + name: "", + target: "", + source_type: "repo", + writable: true, + owner: "", + mode: "", + file_mode: "", + readonly: false, + git_mount_ref: "", + }, + ]); + const removeMount = (idx: number) => + setMounts(mounts.filter((_, i) => i !== idx)); + const updateMount = (idx: number, field: keyof MountEntry, val: unknown) => { + const copy = [...mounts]; + copy[idx] = { ...copy[idx], [field]: val }; + setMounts(copy); + }; + + return ( +
+ {/* Base Image */} +
+

Base Image

+
+
+ + +
+
+ + { + setBaseImage(e.target.value); + setBaseDefinitionId(""); + }} + placeholder="e.g., ubuntu:24.04" + className="form-input" + disabled={!!baseDefinitionId} + /> +
+
+
+ + {/* Packages */} +
+

Packages

+ +
+ + setNodeVersion(e.target.value)} + placeholder="e.g., 20" + className="form-input" + style={{ width: "120px" }} + /> +
+ +
+ +
+ {aptPackages.map((pkg, idx) => ( +
+ updateAptPackage(idx, e.target.value)} + placeholder="e.g., neovim" + className="form-input" + /> + +
+ ))} + +
+
+ +
+ +
+ {npmPackages.map((pkg, idx) => ( +
+ updateNpmPackage(idx, e.target.value)} + placeholder="e.g., @scope/pkg" + className="form-input" + /> + +
+ ))} + +
+
+ +
+ +
+ {pipPackages.map((pkg, idx) => ( +
+ updatePipPackage(idx, e.target.value)} + placeholder="e.g., requests" + className="form-input" + /> + +
+ ))} + +
+
+
+ + {/* Runtime User */} +
+

Runtime User

+
+
+ + setUserName(e.target.value)} + className="form-input" + /> +
+
+ + setUserUid(e.target.value)} + className="form-input" + /> +
+
+ + setUserGid(e.target.value)} + className="form-input" + /> +
+
+
+ + {/* Environment */} +
+

Environment Variables

+
+ {envVars.map((ev, idx) => ( +
+ updateEnvVar(idx, "key", e.target.value)} + placeholder="KEY" + className="form-input" + /> + updateEnvVar(idx, "value", e.target.value)} + placeholder="value" + className="form-input" + /> + +
+ ))} + +
+
+ + {/* Build Scripts */} +
+

Build Scripts (run during docker build)

+
+ {buildScripts.map((script, idx) => ( +
+