Showing preview only (9,457K chars total). Download the full file or copy to clipboard to get everything.
Repository: BloopAI/vibe-kanban
Branch: main
Commit: a05fff227c17
Files: 1782
Total size: 8.6 MB
Directory structure:
gitextract_ei47u9gy/
├── .cargo/
│ └── config.toml
├── .dockerignore
├── .github/
│ ├── actions/
│ │ ├── cargo-checks-common-setup/
│ │ │ └── action.yml
│ │ ├── setup-jsign/
│ │ │ └── action.yml
│ │ └── setup-node/
│ │ └── action.yml
│ └── workflows/
│ ├── pre-release.yml
│ ├── publish.yml
│ ├── relay-deploy-dev.yml
│ ├── relay-deploy-prod.yml
│ ├── relay-release.yml
│ ├── remote-deploy-dev.yml
│ ├── remote-deploy-prod.yml
│ ├── remote-release.yml
│ └── test.yml
├── .gitignore
├── .npmrc
├── AGENTS.md
├── CODE-OF-CONDUCT.md
├── CONTRIBUTORS.md
├── Cargo.toml
├── Dockerfile
├── LICENSE
├── README.md
├── assets/
│ └── scripts/
│ └── toast-notification.ps1
├── crates/
│ ├── api-types/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ ├── attachment.rs
│ │ ├── auth.rs
│ │ ├── blob.rs
│ │ ├── issue.rs
│ │ ├── issue_assignee.rs
│ │ ├── issue_comment.rs
│ │ ├── issue_comment_reaction.rs
│ │ ├── issue_follower.rs
│ │ ├── issue_relationship.rs
│ │ ├── issue_tag.rs
│ │ ├── lib.rs
│ │ ├── migration.rs
│ │ ├── notification.rs
│ │ ├── oauth.rs
│ │ ├── organization_member.rs
│ │ ├── organizations.rs
│ │ ├── project.rs
│ │ ├── project_status.rs
│ │ ├── pull_request.rs
│ │ ├── pull_requests_local.rs
│ │ ├── relay.rs
│ │ ├── response.rs
│ │ ├── tag.rs
│ │ ├── user.rs
│ │ ├── workspace.rs
│ │ └── workspaces.rs
│ ├── db/
│ │ ├── .sqlx/
│ │ │ ├── query-039c2290b6cf7cdc905c8ddc44293f067fe7e8f246da737e4baad3f494ac8b8f.json
│ │ │ ├── query-04c207be2c3c2c07ff42c695542504c358d67c1f40ca2b1e75a396a90c173a53.json
│ │ │ ├── query-04e5a05c7cad438d39c4c8590410889ab1eefa7376d474a10c119d3f4d9143c7.json
│ │ │ ├── query-04f17449e3e12785affab91e4eab308103491e34c022199b7b060e04fa8aed0f.json
│ │ │ ├── query-0a805c219c9028b2677bd94ccabd47916e60d26c1cede27e467f0ae91f6639ab.json
│ │ │ ├── query-0ab07fb562e61148f3f07f33f766ea12c73d467df4522240008370f681c8409a.json
│ │ │ ├── query-0ac0d0f3826330836e3fd1bf57c42777eb489ac41a650f9361e6b563fc69bf35.json
│ │ │ ├── query-0c7b20643f119afd3e233105b0fa2920e8e940bdad86cdc95d01e485a20d6ed4.json
│ │ │ ├── query-0f90844fc62261ed140e02515ae464b940743113814507313c9fdc176000d1bf.json
│ │ │ ├── query-1085d1f8107c7e16fc2058ef610918760d8d420f0fca97adecd76d698f6f3a51.json
│ │ │ ├── query-11793c98a4bee67fce9972ed6b10a18226e0455a0e8d113d04c4d5148b72aec7.json
│ │ │ ├── query-12a5c0a8b95d8cb87f1c869ff35692a2cee52bc418b06d00a31a4c139e12d18a.json
│ │ │ ├── query-13826fc6fdd367255cb921640e5972f30905ac7a81ad477cf8bbcfc24f06f39b.json
│ │ │ ├── query-167c1d13ee37ebe62cd2316feaf6b5354eb26d0a8fc16efb22827a5cde59a60e.json
│ │ │ ├── query-1b186dc075846fc1f7270a942afbf82a88806ee6ababdb437ab5e97ddd2122da.json
│ │ │ ├── query-1c2201b0ca9305283634fe5c72df6eac3ad954c1238088a84a4b9085b1dbdb74.json
│ │ │ ├── query-218f1d14c72148ea88d75e816e1ba111c8f4678a7e428b15462e6dfc74c25b03.json
│ │ │ ├── query-2547a5d06fd3b17360bff34a04b7d3d929c13ef0d86395a9201834d8fc955295.json
│ │ │ ├── query-256f9e937384933464e6d4d00ee977bbb2915ef80930c8b5c0b0525367a5264d.json
│ │ │ ├── query-29cc3aa8d0ad5deda94494402500a4125e29381d63f18ef083cc4da95e2c5db5.json
│ │ │ ├── query-2a57b702e52b3cc9bdbc361267985958b11d4493b01a9ab8daedf5d951422897.json
│ │ │ ├── query-2b253f92ac5daa4864e7335fde1b82625f504fd73d19b21992497219a9c3170a.json
│ │ │ ├── query-2c0172d5b2c5bff0914727a57983d5c336f5b2dfa73ca6c2efa4ea23bb526e05.json
│ │ │ ├── query-2c71bf4dd5683e0dedf2341e52880ff2c0765659d3cf53d62faa54adc91071dd.json
│ │ │ ├── query-2cb5a269045f23da9f4ee0ee679ccb7fffc39d4b37b1b58357b11a7abfdba125.json
│ │ │ ├── query-31f4e685fc0b1103ff662b3866b3bb422cc7fc8e0661ebfed30ffd16ea7ed8c0.json
│ │ │ ├── query-3266b6a544952177f84e2e7c31be9dba212c92d91b997de7f6aa811e08ed6c72.json
│ │ │ ├── query-33f23656ba343bd75a88b0fadf2a4ba01eda330f9b549e625e27701e3b0b5a31.json
│ │ │ ├── query-3634e2bab8fef106721bb64a791edd81d3d49eb34fbabd34e4feadfb5f229a6e.json
│ │ │ ├── query-3a9148e9e914d644d4d82a1c2dc8bd0e093d4f4c638afa7fd8f5211892fb6d84.json
│ │ │ ├── query-3ace1ee8dba0669400d69891912b86823e41ca643092d990b12c1a6160112427.json
│ │ │ ├── query-3d34580933bc02a168f4a7c483460a6ad13ef72b508532f5a6cd5e53aff04a69.json
│ │ │ ├── query-3d85256618729c1c0bf2758ffab9cdb4ec2af0751e3a37db4009c02f95f6f556.json
│ │ │ ├── query-3f4b2179dcd8857fc18f1e5f6e6cf10f152eebbb141b2d3604dd4191e0c2f367.json
│ │ │ ├── query-420a0c490f1e4d549fb194265e971d8c03b86fe75b595091f6425de11d120a6b.json
│ │ │ ├── query-4506eeeb85b49f00143a9d23636c976159e1c72c9cfce005599c5eb52dc15095.json
│ │ │ ├── query-48c556a5317e6ea77595a8fdc410d30df50c8405adf38b371fdf0a1bde8c0083.json
│ │ │ ├── query-4ac35216ead7e5be9cc2de504a06b6e375e23ca2ed14493ec991f53e458a6a34.json
│ │ │ ├── query-4b59b958807be54c7c9949d96ced96e4ab1498f1056e7d0d7956aff46352d90f.json
│ │ │ ├── query-4b952fb779fbcf70bd402b6bcc0eec07b75879333614b8ef98e5b8073ad66ca6.json
│ │ │ ├── query-4c9b1b539ec383ace94ef29c58967bbf08112ebdc61276e9710663a083318211.json
│ │ │ ├── query-4d84b308a2cc7677da65111d080bf02e5e35c052048360d3dbea656bbbcd3edb.json
│ │ │ ├── query-4d86dcbf754f971ff3acffe9e85b5c2f455e77c40c624e09736be9480238110b.json
│ │ │ ├── query-5154289c5a9ddbc061d42de2baf129e03a75061b8b305110921688f01d112de1.json
│ │ │ ├── query-517fb82570b9624e166696af53963ec499966562b23b5833fc4ca4cf43bcaccc.json
│ │ │ ├── query-557963b950205b10db273762da5fd24c9db96c1f366a796c319e4adc888d7414.json
│ │ │ ├── query-570f62a32921c4a9a7e4e1006e9b31c4c58e69ab8681d76dfe9b184ff1e0bc65.json
│ │ │ ├── query-5785a10c3d51ff9b001aa455f6296a4dcba61cec700a4b72031c5c643b273938.json
│ │ │ ├── query-57d6335c98deb608cf961836f73a67163af6484f91954c0577aea1cc2fddac4f.json
│ │ │ ├── query-586d5ab95899967c8a8f74996c4a598a73661823bc2bcb240cebb7cd0533abb6.json
│ │ │ ├── query-5884e7baa4a061166cb2911f717d3fd92852d62975a910dd9cb05e7908fdf8b6.json
│ │ │ ├── query-592656b17a5f78d117365909e47afba7d3df545ac1078c307c6b968e75c8e2ba.json
│ │ │ ├── query-5a5eb8f05ddf515b4e568d8e209e9722d8b7ce62f76a1eb084af880c2a4dfad2.json
│ │ │ ├── query-5d9739705372b113b1bb45d441ebdf2846dc4cd83b8547128c733cd282b5b4f2.json
│ │ │ ├── query-5ff9809face43fe1f071dfda62b6a30f4a32a9aaace29caf89b95c224482201b.json
│ │ │ ├── query-606016bf31cf0abd87d7eb95ea99d7c8c014523cb02e482d608299ceefaeffc5.json
│ │ │ ├── query-61c6546164ba21a659d32d4e345926b0ee1a611fe4e46bb8db51a4e41f781af9.json
│ │ │ ├── query-64f31710ab7ba14047f31cce44ad36c60a53624f9bcb03a5eaff5d61ca8cc9cf.json
│ │ │ ├── query-686810c5271e1d44042b6ea2c6cc434eb2e3f5d3540c97d703c34dd4e978c690.json
│ │ │ ├── query-6ae5eb2719382d4d081ee17dbd5de654c156b06e2af4ddfb917d36002146be5b.json
│ │ │ ├── query-70b21c5c0a2ba5c21c9c1132f14a68c02a8a2cd555caea74e57a0aeb206770d3.json
│ │ │ ├── query-7364150098bec681451c43762117a1f5c5b4e27f5f65186c3cc16092b3491c37.json
│ │ │ ├── query-73aee4cb95294087554eafaf3126556df244f4b6639d5a188f0badb6739c1a70.json
│ │ │ ├── query-7410e8128e63af1c3127e833accee637e65f7efcd9111ecb891587294042129c.json
│ │ │ ├── query-766fa107de23b7e6c579223b083d916e252d422e2908c27f6718fcbd851de2c1.json
│ │ │ ├── query-7807cb09da72c5a1e35bf4f4da1bea1743a578588e72444ede98f5f969af08c1.json
│ │ │ ├── query-784e59a5259f046a74bbfd3cc5a78500797ccf3e67928e5f1520623c5c04ac9f.json
│ │ │ ├── query-79e1e11b83c786c6d5a985ab045b6bd122d5efa920225dadc9fedb6592c6e0a3.json
│ │ │ ├── query-79f6b9f999c33900ae87475d72651b274cc94ab3b1f36e9c5517bc5572ea9947.json
│ │ │ ├── query-7d12bf106e68365fc1aa239b8b39065430f30ad658d0bf9801c81e3ced2127da.json
│ │ │ ├── query-80669005bff96b45015f095ccf28598df604540e2aaf3828fcb8db7d55538dc7.json
│ │ │ ├── query-80e6cfb4e27fcaa79b7dbd37ac16aac255f46a646c75aa65111b2f58ec03f892.json
│ │ │ ├── query-82b92577d15b92908cecca7bff6ff21478c90a16eb6123165f0bd16d2d60bca4.json
│ │ │ ├── query-82f7bba858a26732ad9d4122c3a0bca4209ae37c59dcd7353a68e2dec434c48a.json
│ │ │ ├── query-84ee994f0aad005cf62ca318eb20ae29d218a72cdd1fadf2a5ae399b0719ca19.json
│ │ │ ├── query-891bad4b14f75be20c70a5cec02fb3b4fb3cbb84ce322bf5da3791d75b1deae7.json
│ │ │ ├── query-8f3ab3ad20de3261703b0bdaf01a3d3c4289754381b47af7cd97acce767163e8.json
│ │ │ ├── query-9139f8d02c4ff94db0f2e8de7a6d5a53092479499815531962b7c84f5e0b2129.json
│ │ │ ├── query-91810eeed4804827717a182ad1b61c641648e2659100f43ef9504fc60e5d244e.json
│ │ │ ├── query-93efe07b91d232fc0c371be8ee618ba6ccfd6930454fc11845d5dfc2ba0bad62.json
│ │ │ ├── query-973e43902b05d671f69b24a0aeeb07bc0cbcd22d75b20c83c49a122f92c6b231.json
│ │ │ ├── query-9747ebaebd562d65f0c333b0f5efc74fa63ab9fcb35a43f75f57da3fcb9a2588.json
│ │ │ ├── query-9821ee63362e96cf3fd936e2d54a641fb30f239a8137dc6c1b3a670b2c6138c1.json
│ │ │ ├── query-99399425f53b140a8de232a4de3c6c056bc422f2fbdb8ead6aab3f6945906e51.json
│ │ │ ├── query-9dd37bd520d651339fa13078ea5cb76847c8c74970b195b0e5ee33e4c5a777fb.json
│ │ │ ├── query-9f783d1b275548a59429235991e5299b7aaf071effebbd62f006404b3ce83dc8.json
│ │ │ ├── query-9f8ab7d7c2660321412117bfb55e3b2b9ccd7b9ed2679fb8ccca0a36996e6e21.json
│ │ │ ├── query-a1574f21db387b0e4a2c3f5723de6df4ee42d98145d16e9d135345dd60128429.json
│ │ │ ├── query-a3d14f90b59d6cb15c42d1e6400c040a86eab49095c89fcef9d1585890056856.json
│ │ │ ├── query-a4a50fcfb903e6d0a315676f4f760e5bb7718e10ea550aedf990c9da84834416.json
│ │ │ ├── query-a915c22f5ed0bb86c3a242ca38cbc1bfca40ebfe9096058c27e94479b67c7c02.json
│ │ │ ├── query-a9446d873a2f199e7120e9faeda1b2135383396f82623813d734e321114d4623.json
│ │ │ ├── query-aa598f6943fbf773ca00deb113f3955bdf689d1c22df63849bc5ce36c7c76382.json
│ │ │ ├── query-ab2693e557142354564a2882f3c321b350828419c440885c0f88840079b1c94e.json
│ │ │ ├── query-abbda92ba42bea0f7d17d0945d51b011bf50e7b36ee50ed74988e053f6fb0eec.json
│ │ │ ├── query-abff188fc81caf44081e2053cb7841d1dc6c1a8965f4b862caa2f9cebcae0176.json
│ │ │ ├── query-b1edd509d00577007680243589ce59570182b98a1e9059d9702d97e9eaa9cbf5.json
│ │ │ ├── query-b4476bedb8e5c0f7bc21654dc62fb00fbd8a41e24efaba55be8278031d71cc59.json
│ │ │ ├── query-b4ff8dabb0d5c99319fad3f2f7e620523c96b89beaf1edd97f79d9972b93c8fe.json
│ │ │ ├── query-c097fa44c48e55f0e74f56577c0c1c4b3b92b2875d12c0bd1a70a1dcc4eda58e.json
│ │ │ ├── query-c24119a35ed2099b886a0b1a9a41adf01d1a1f86792abf3d3a410c6cbab2ec0f.json
│ │ │ ├── query-c27f2fd6b3696cb5a8ec54226608440786a6cec601783f797be3a8c515080d62.json
│ │ │ ├── query-c422aa419f267df88b65557ccb897ba98c01970a68866eb7028b791f04da2b39.json
│ │ │ ├── query-c5a45e39543468b57c2e3662735c640210c3948113dcbd1be8339f2c27506b76.json
│ │ │ ├── query-c793ee8493c54ea295a62a51650d00894fdad2f2cadc5665ae1e16a605626cb2.json
│ │ │ ├── query-cac90f2884c7c0eed4d2ab621016a5bc62dfbcb65539eb4a52e3306f96c0698a.json
│ │ │ ├── query-cd6d7ca74442a100d9caf170ac43118795226f50b8392069b47abd4f7564c135.json
│ │ │ ├── query-d41acd2bd3c805f9787c0d468a25ce62bfa8b268131c19b83fd76acb59a8c9ea.json
│ │ │ ├── query-d7a11078522c029b71a75f4a45abc941536d3ce08d8ee0fcbde3eacf6360b7d5.json
│ │ │ ├── query-d9f7205a1a749c23c928ef2861783446bd99a7b7939929dee1f8a409bb99ab04.json
│ │ │ ├── query-db1b29e1ea843ee4024c914820978a558f0ac4cc65da76645ccff4748240e565.json
│ │ │ ├── query-db39f7ab7391c1289299e7f8aa7e1f642874eed0179e91a9558f9df534db797c.json
│ │ │ ├── query-dc5d0ad507cbd962235c9e85c3e43f34c7c38eb2e08ab7899073010a6e77b37d.json
│ │ │ ├── query-dc88d70bb25b6437580480c346ed29fb90115e3b83fa36d8966b62f02990b9c7.json
│ │ │ ├── query-dd0d0e3fd03f130aab947d13580796eee9a786e2ca01d339fd0e8356f8ad3824.json
│ │ │ ├── query-df2f35912a8055dff6cb24c83ea67fc49b432f457961fa584c6a13389bfdcea5.json
│ │ │ ├── query-df66eae37a24c07c2ae0a521c802e3828ac153e6c087edcf2ba4dbe621dc79d3.json
│ │ │ ├── query-e41bedcff88553343a55112c9c0688efdae03ddb4249d0636b69934f5cd4d8fd.json
│ │ │ ├── query-ee06dfd8dc7fc2ffc239db9635a3a5cac2e603992392a632bff7d450c6bca061.json
│ │ │ ├── query-efce74898a8e81dafc3933231e8ac3c07be392e1c073e62c621138c00d0ed30d.json
│ │ │ ├── query-f2dbb49b2f839e84a46fdd865d9982b758160517b93bc92d8e12060426daa05d.json
│ │ │ ├── query-f584dbe0f2f2a4f1e7dcf5b8f675eb2a6d954bb3f148ac0fece10652f05fb49b.json
│ │ │ ├── query-f9e8640c28fae8aebf3d8b0d3984804fdb3f197c8cc2d5750fd267c82e3e68a1.json
│ │ │ ├── query-faae305f6ac9dc7d04d21c76531cde3912647430195267ffa5b99bb9a7df1feb.json
│ │ │ ├── query-fb1ab168509b38eccf3064e2a90690a3fdef67a98fee7e5943689e61818d34f0.json
│ │ │ └── query-fc90f4dd7a408d6129aff95538de22c3a1ca018bc7837e3dc1c5aa0007844887.json
│ │ ├── Cargo.toml
│ │ ├── migrations/
│ │ │ ├── 20250617183714_init.sql
│ │ │ ├── 20250620212427_execution_processes.sql
│ │ │ ├── 20250620214100_remove_stdout_stderr_from_task_attempts.sql
│ │ │ ├── 20250621120000_relate_activities_to_execution_processes.sql
│ │ │ ├── 20250623120000_executor_sessions.sql
│ │ │ ├── 20250623130000_add_executor_type_to_execution_processes.sql
│ │ │ ├── 20250625000000_add_dev_script_to_projects.sql
│ │ │ ├── 20250701000000_add_branch_to_task_attempts.sql
│ │ │ ├── 20250701000001_add_pr_tracking_to_task_attempts.sql
│ │ │ ├── 20250701120000_add_assistant_message_to_executor_sessions.sql
│ │ │ ├── 20250708000000_add_base_branch_to_task_attempts.sql
│ │ │ ├── 20250709000000_add_worktree_deleted_flag.sql
│ │ │ ├── 20250710000000_add_setup_completion.sql
│ │ │ ├── 20250715154859_add_task_templates.sql
│ │ │ ├── 20250716143725_add_default_templates.sql
│ │ │ ├── 20250716161432_update_executor_names_to_kebab_case.sql
│ │ │ ├── 20250716170000_add_parent_task_to_tasks.sql
│ │ │ ├── 20250717000000_drop_task_attempt_activities.sql
│ │ │ ├── 20250719000000_add_cleanup_script_to_projects.sql
│ │ │ ├── 20250720000000_add_cleanupscript_to_process_type_constraint.sql
│ │ │ ├── 20250726182144_update_worktree_path_to_container_ref.sql
│ │ │ ├── 20250726210910_make_branch_optional.sql
│ │ │ ├── 20250727124142_remove_command_from_execution_process.sql
│ │ │ ├── 20250727150349_remove_working_directory.sql
│ │ │ ├── 20250729162941_create_execution_process_logs.sql
│ │ │ ├── 20250729165913_remove_stdout_and_stderr_from_execution_processes.sql
│ │ │ ├── 20250730000000_add_executor_action_to_execution_processes.sql
│ │ │ ├── 20250730000001_rename_process_type_to_run_reason.sql
│ │ │ ├── 20250730124500_add_execution_process_task_attempt_index.sql
│ │ │ ├── 20250805112332_add_executor_action_type_to_task_attempts.sql
│ │ │ ├── 20250805122100_fix_executor_action_type_virtual_column.sql
│ │ │ ├── 20250811000000_add_copy_files_to_projects.sql
│ │ │ ├── 20250813000001_rename_base_coding_agent_to_profile.sql
│ │ │ ├── 20250815100344_migrate_old_executor_actions.sql
│ │ │ ├── 20250818150000_refactor_images_to_junction_tables.sql
│ │ │ ├── 20250819000000_move_merge_commit_to_merges_table.sql
│ │ │ ├── 20250902120000_add_masked_by_restore_to_execution_processes.sql
│ │ │ ├── 20250902184501_rename-profile-to-executor.sql
│ │ │ ├── 20250903091032_executors_to_screaming_snake.sql
│ │ │ ├── 20250905090000_add_after_head_commit_to_execution_processes.sql
│ │ │ ├── 20250906120000_add_follow_up_drafts.sql
│ │ │ ├── 20250910120000_add_before_head_commit_to_execution_processes.sql
│ │ │ ├── 20250917123000_optimize_selects_and_cleanup_indexes.sql
│ │ │ ├── 20250921222241_unify_drafts_tables.sql
│ │ │ ├── 20250923000000_make_branch_non_null.sql
│ │ │ ├── 20251020120000_convert_templates_to_tags.sql
│ │ │ ├── 20251101090000_drop_execution_process_logs_pk.sql
│ │ │ ├── 20251114000000_create_shared_tasks.sql
│ │ │ ├── 20251120000001_refactor_to_scratch.sql
│ │ │ ├── 20251129155145_drop_drafts_table.sql
│ │ │ ├── 20251202000000_migrate_to_electric.sql
│ │ │ ├── 20251206000000_add_parallel_setup_script_to_projects.sql
│ │ │ ├── 20251209000000_add_project_repositories.sql
│ │ │ ├── 20251215145026_drop_worktree_deleted.sql
│ │ │ ├── 20251216000000_add_dev_script_working_dir_to_projects.sql
│ │ │ ├── 20251216142123_refactor_task_attempts_to_workspaces_sessions.sql
│ │ │ ├── 20251219000000_add_agent_working_dir_to_projects.sql
│ │ │ ├── 20251219164205_add_missing_indexes_for_slow_queries.sql
│ │ │ ├── 20251220134608_fix_session_executor_format.sql
│ │ │ ├── 20251221000000_add_workspace_flags.sql
│ │ │ ├── 20260107000000_move_scripts_to_repos.sql
│ │ │ ├── 20260107115155_add_seen_to_coding_agent_turns.sql
│ │ │ ├── 20260112160045_add_composite_indexes_for_performance.sql
│ │ │ ├── 20260113144821_remove_shared_tasks.sql
│ │ │ ├── 20260122000000_add_default_target_branch_to_repos.sql
│ │ │ ├── 20260123125956_add_agent_message_id.sql
│ │ │ ├── 20260126000000_add_agent_working_dir_to_repos.sql
│ │ │ ├── 20260128000000_add_migration_state.sql
│ │ │ ├── 20260203000000_add_archive_script_to_repos.sql
│ │ │ ├── 20260217120312_remove_task_fk_from_workspaces.sql
│ │ │ ├── 20260220000000_optimize_query_planner_after_latest_process_query_update.sql
│ │ │ ├── 20260302113031_add_worktree_deleted_to_workspaces.sql
│ │ │ ├── 20260304153000_move_agent_working_dir_to_sessions.sql
│ │ │ ├── 20260314000000_add_name_to_sessions.sql
│ │ │ └── 20260317120000_cleanup_attachment_schema.sql
│ │ └── src/
│ │ ├── lib.rs
│ │ └── models/
│ │ ├── coding_agent_turn.rs
│ │ ├── execution_process.rs
│ │ ├── execution_process_logs.rs
│ │ ├── execution_process_repo_state.rs
│ │ ├── file.rs
│ │ ├── merge.rs
│ │ ├── migration_state.rs
│ │ ├── mod.rs
│ │ ├── project.rs
│ │ ├── repo.rs
│ │ ├── requests.rs
│ │ ├── scratch.rs
│ │ ├── session.rs
│ │ ├── tag.rs
│ │ ├── task.rs
│ │ ├── workspace.rs
│ │ └── workspace_repo.rs
│ ├── deployment/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ └── lib.rs
│ ├── executors/
│ │ ├── Cargo.toml
│ │ ├── default_mcp.json
│ │ ├── default_profiles.json
│ │ └── src/
│ │ ├── actions/
│ │ │ ├── coding_agent_follow_up.rs
│ │ │ ├── coding_agent_initial.rs
│ │ │ ├── mod.rs
│ │ │ ├── review.rs
│ │ │ └── script.rs
│ │ ├── approvals.rs
│ │ ├── command.rs
│ │ ├── env.rs
│ │ ├── executor_discovery.rs
│ │ ├── executors/
│ │ │ ├── acp/
│ │ │ │ ├── client.rs
│ │ │ │ ├── harness.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── normalize_logs.rs
│ │ │ │ └── session.rs
│ │ │ ├── amp.rs
│ │ │ ├── claude/
│ │ │ │ ├── client.rs
│ │ │ │ ├── protocol.rs
│ │ │ │ ├── slash_commands.rs
│ │ │ │ └── types.rs
│ │ │ ├── claude.rs
│ │ │ ├── codex/
│ │ │ │ ├── client.rs
│ │ │ │ ├── init_prompt.md
│ │ │ │ ├── jsonrpc.rs
│ │ │ │ ├── normalize_logs.rs
│ │ │ │ ├── review.rs
│ │ │ │ └── slash_commands.rs
│ │ │ ├── codex.rs
│ │ │ ├── copilot.rs
│ │ │ ├── cursor/
│ │ │ │ └── mcp.rs
│ │ │ ├── cursor.rs
│ │ │ ├── droid/
│ │ │ │ └── normalize_logs.rs
│ │ │ ├── droid.rs
│ │ │ ├── gemini.rs
│ │ │ ├── mod.rs
│ │ │ ├── opencode/
│ │ │ │ ├── models.rs
│ │ │ │ ├── normalize_logs.rs
│ │ │ │ ├── sdk.rs
│ │ │ │ ├── slash_commands.rs
│ │ │ │ └── types.rs
│ │ │ ├── opencode.rs
│ │ │ ├── qa_mock.rs
│ │ │ ├── qwen.rs
│ │ │ └── utils.rs
│ │ ├── lib.rs
│ │ ├── logs/
│ │ │ ├── mod.rs
│ │ │ ├── plain_text_processor.rs
│ │ │ ├── stderr_processor.rs
│ │ │ └── utils/
│ │ │ ├── entry_index.rs
│ │ │ ├── mod.rs
│ │ │ ├── patch.rs
│ │ │ └── shell_command_parsing.rs
│ │ ├── mcp_config.rs
│ │ ├── model_selector.rs
│ │ ├── profile.rs
│ │ └── stdout_dup.rs
│ ├── git/
│ │ ├── Cargo.toml
│ │ ├── src/
│ │ │ ├── cli.rs
│ │ │ ├── lib.rs
│ │ │ └── validation.rs
│ │ └── tests/
│ │ ├── git_ops_safety.rs
│ │ └── git_workflow.rs
│ ├── git-host/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ ├── azure/
│ │ │ ├── cli.rs
│ │ │ └── mod.rs
│ │ ├── detection.rs
│ │ ├── github/
│ │ │ ├── cli.rs
│ │ │ └── mod.rs
│ │ ├── lib.rs
│ │ └── types.rs
│ ├── local-deployment/
│ │ ├── Cargo.toml
│ │ ├── build.rs
│ │ └── src/
│ │ ├── command.rs
│ │ ├── container.rs
│ │ ├── copy.rs
│ │ ├── lib.rs
│ │ └── pty.rs
│ ├── mcp/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ ├── bin/
│ │ │ └── vibe_kanban_mcp.rs
│ │ ├── lib.rs
│ │ └── task_server/
│ │ ├── handler.rs
│ │ ├── mod.rs
│ │ └── tools/
│ │ ├── context.rs
│ │ ├── issue_assignees.rs
│ │ ├── issue_relationships.rs
│ │ ├── issue_tags.rs
│ │ ├── mod.rs
│ │ ├── organizations.rs
│ │ ├── remote_issues.rs
│ │ ├── remote_projects.rs
│ │ ├── repos.rs
│ │ ├── sessions.rs
│ │ ├── task_attempts.rs
│ │ └── workspaces.rs
│ ├── relay-control/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ ├── lib.rs
│ │ └── signing.rs
│ ├── relay-tunnel/
│ │ ├── .sqlx/
│ │ │ ├── query-13462773c343a0812783b914d7a09b6e7148d20be4c2a5c92fa5860e1bc5bd36.json
│ │ │ ├── query-25045af6947be74c0a4f1784670904bd488d1cbafe997a2d8abef620d2e5497f.json
│ │ │ ├── query-2b222c6a2bfc74535ad20d839e8f1aef3d1d64c2b0b96289f1703b08f2a48f68.json
│ │ │ ├── query-2b81f9454b626be80c21761b0fd1e7a83b71bb53a4ababf212d4fb13636119ae.json
│ │ │ ├── query-422fce71b9df8d2d68d5aabe22d8299f596f77a09069e350138f5a5b72204dfe.json
│ │ │ ├── query-5ba9186639e75711df9218209ad88f91f54f9643ecf5f53af1e7bfc583727a7c.json
│ │ │ ├── query-6aef9ee49b4bc1d9a23c0322e7733bee239e31380cb4cf8274cb60427b492299.json
│ │ │ ├── query-6d64fbb63cd05c4cd9bcc3d07cbc26b165f0d0ffbc4df75391c6b205fe0abd78.json
│ │ │ ├── query-775151df9d9be456f8a86a1826fd4b7c4ea6ada452dfc89f30c7b6d0135c9e2e.json
│ │ │ ├── query-7b010dece6caaeb04e8f033c869982b97f20c60903a92f4d45634f990ffbfce3.json
│ │ │ ├── query-80dfc0d5bbc6db412ea0fda24a5184c3ce20064826779571cab1d9e32459c4cb.json
│ │ │ ├── query-8b865d8fca4a3d7a8f7edf6671aed582164f93f973448143883d6d2fb461caf6.json
│ │ │ ├── query-9459cf92b30943acb79f0e0f2e9421be83ce9e50e39f6b1e435b92ff70907264.json
│ │ │ ├── query-9c2e6a8fc112e4e2980e4dc3f1dae1ea7da376119b0f06aafbc74c7a471f17ad.json
│ │ │ ├── query-b2c8a0820366a696d4425720bacec9c694398e2f9ff101753c8833cbf0152d9d.json
│ │ │ ├── query-e84a068d6a2ad1458cf6f45c2f2dde8511355f29677cebfd15783fccd095a131.json
│ │ │ ├── query-f31c0531cb5c099bc0c6b193852d3e3d0be6cfe1104dd792651d9c5434483ef0.json
│ │ │ └── query-f6d727f8d7baa7b92464ccccccd113fbe7c69a69d91dc6f54c6052eaa65ce868.json
│ │ ├── Cargo.toml
│ │ ├── Dockerfile
│ │ └── src/
│ │ ├── bin/
│ │ │ └── relay_server.rs
│ │ ├── client.rs
│ │ ├── lib.rs
│ │ ├── server.rs
│ │ ├── server_bin/
│ │ │ ├── auth.rs
│ │ │ ├── config.rs
│ │ │ ├── db/
│ │ │ │ ├── auth_sessions.rs
│ │ │ │ ├── hosts.rs
│ │ │ │ ├── identity_errors.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── relay_auth_codes.rs
│ │ │ │ ├── relay_browser_sessions.rs
│ │ │ │ └── users.rs
│ │ │ ├── mod.rs
│ │ │ ├── relay_registry.rs
│ │ │ ├── routes/
│ │ │ │ ├── auth_code.rs
│ │ │ │ ├── connect.rs
│ │ │ │ ├── mod.rs
│ │ │ │ └── path_routes.rs
│ │ │ └── state.rs
│ │ ├── tls.rs
│ │ └── ws_io.rs
│ ├── remote/
│ │ ├── .sqlx/
│ │ │ ├── query-00f50fdb65f4126b197b523f6fc1870571c4c121c32e0c3393f6770fc3608e95.json
│ │ │ ├── query-00f5a09dfd00355a8657007f6d7b3a2a98547db4acccd485cec20d8fd29815ad.json
│ │ │ ├── query-0802e4b755645e959d1a2d9b5b13fb087d0b5b162726a09487df18139e707c5e.json
│ │ │ ├── query-082aaf51a023c8ccb44002ce48287acd8ef90b0f4c8338447c6e5370ca93390b.json
│ │ │ ├── query-08fa6f887e954e3b6921f84bbd412b4c3fc5dc1df0b9a5ea3fa4a4b07a86bb55.json
│ │ │ ├── query-0a57abb390861f8e9ce1da411934bef0a1a4edcea151cbf78fdf4cb510a0d450.json
│ │ │ ├── query-0c5dfb11325fb2f0ea279c9406d593376bece575358831870012d125fd053be3.json
│ │ │ ├── query-0df35d620c891a94f62e7e3f7afb60819783f961be1dd36cabb478c5e3ad23c0.json
│ │ │ ├── query-10428c897273798508759a89323d4fb181081eb5ffea40ef41a4d5437b7b6849.json
│ │ │ ├── query-11eede7c3a324ffa6266ee5c3fe3fdb2bd3b9e894fcabeece1e8d2201d18dcc6.json
│ │ │ ├── query-12eb8caf8044a790e7390882bc07d8c737581e0926d473b2e0a9eaccdd0a8674.json
│ │ │ ├── query-1565680821f93069b2b5c109a7d1ba10889ca9b98c848895de6ef2c3ef4dffa0.json
│ │ │ ├── query-16abe1e4d69bf90ed05d8651b688e3be23a74d8dd3957a976c7b757660d5b169.json
│ │ │ ├── query-174295c848146ecd7d9b542e1cad3243d19f58f1c338dbcc63d52573e05cb25e.json
│ │ │ ├── query-185b7fc8f6f22b7c29950a490d46bb16c4fec50cf6e8dc988f3a2c942be909c0.json
│ │ │ ├── query-187b173294e46a013a48040ca4375b65df44215d8883cae88123f762880507e9.json
│ │ │ ├── query-18ae849cdeff678538d5bd6782e16780da9db40e4d892a75d7d244f247db5c04.json
│ │ │ ├── query-18f2fc4074de23b6b2a0c2c70403d6a1eaa57e1fda5063d9f3a292e8aab61ede.json
│ │ │ ├── query-198df1da04fb3ffee213718de87fa49d5032545d55d45a7cb0c62dcc60db5f78.json
│ │ │ ├── query-1b2c4d4205244ed0fa457ebc3b42147c9446a7efb5e205cd85aa780f99824b88.json
│ │ │ ├── query-1ba653e8d80e8eec3b86e805d37a89b836274b47861f0b5921fe3e0b963ed1f5.json
│ │ │ ├── query-1c2201b0ca9305283634fe5c72df6eac3ad954c1238088a84a4b9085b1dbdb74.json
│ │ │ ├── query-1c57e525a7060361832601f158977fffec60c36534ec8eb9affbdf648c280334.json
│ │ │ ├── query-1d612faf67c945cfe22cfd7ab6b6d360fbce8dceb7b64c4d17b4df108434c822.json
│ │ │ ├── query-1d6f13e86897b0885ac3caa36bd56a8685e137a5e22545776b16a5814f225211.json
│ │ │ ├── query-1e2aef04b2d7b1ece13c96ac1dd7718d59c6e8f3dbf0606789fc9f664ac33332.json
│ │ │ ├── query-1ea6478b8325ce0313727f756715c988d0c03ccb74a87e67325c73c03a5dcc33.json
│ │ │ ├── query-209f1b560de8e99de312394860b42251b0272fc7f8f57ea50c9a16fb026b5ae4.json
│ │ │ ├── query-2129f33c4fdf5d1bf52cfac30238e36ffacaab20fb2cf4111fa70ba4e5aa1bca.json
│ │ │ ├── query-253ed3e27e9c1798ecadf943e621bf2993ffdf2267e2582679656ccde7a33c67.json
│ │ │ ├── query-28f6198cfd9c7a01e437a72e5cb3e076f5183a457cb6389cb56d047c1dcce439.json
│ │ │ ├── query-2aa7a0c029cf5fde56e413c13af502a0656051e41e1d036805cc427514c37337.json
│ │ │ ├── query-2b222c6a2bfc74535ad20d839e8f1aef3d1d64c2b0b96289f1703b08f2a48f68.json
│ │ │ ├── query-2b3d84d8febea88a7957efbfd0ca68ee279bc57c6a60afecf9073f46445163a2.json
│ │ │ ├── query-2d85b3d08704ce8475a15a7c8d10a5c1afd97f8ae8e126d26844735f7449fb19.json
│ │ │ ├── query-2db4c808f8d1f22c6209027007ebeb2bd58580758abf8996797b5338d793f741.json
│ │ │ ├── query-2f3898ec50ee1386f87786c605069aac78d5177feaabd719b60e54f94f5f535e.json
│ │ │ ├── query-301e398b03c6e376d3ebd8dc9373f5724ae535e773588ab75baa29468a495ef4.json
│ │ │ ├── query-31c99a55082ff59e212e1fe5425b695030dcf4cfe029ffbb1b56813106a563dc.json
│ │ │ ├── query-32388086083c01d21b0d4d052519a08002b82751e45aa59b3ac628cc96be2723.json
│ │ │ ├── query-3239a6b54374bfba7c1ee16f151333563e21af8994d0431acf029e6a2ca08bfd.json
│ │ │ ├── query-3690a7ea5e1250ceca638bad754a77df36031d8ca132402cc9256f71a57fa476.json
│ │ │ ├── query-37af75dde5f977838d59b57729e9a238d2d2def278d376adc1d4c1d038a918cf.json
│ │ │ ├── query-389b412ed9b76973a5b1546a24167e0b752467405f024de73101b6c12e1e05f1.json
│ │ │ ├── query-3e682d961f272a5c1ce20366008889156928c87babc1704d3277ff9a1812193c.json
│ │ │ ├── query-3ef67cb768d55e4aa8d551401be7daa6c8a9c76a4218ce776d87db6e6d1c890c.json
│ │ │ ├── query-40c9618c70aae933513bd931a3baace6830d78daacfcbd7af69e4f76a234d01c.json
│ │ │ ├── query-421ed23a0bff456c54a14068ceed214fa64d0c50e432fcfe40c222991341bf68.json
│ │ │ ├── query-422fce71b9df8d2d68d5aabe22d8299f596f77a09069e350138f5a5b72204dfe.json
│ │ │ ├── query-426eb8216286273dd0066a15ce4508d9fed04d2feccfff81abb4813ebfea9778.json
│ │ │ ├── query-4274624ba6445ad370380230898232b12365b2336e235b045b1ad25c958c902d.json
│ │ │ ├── query-4411b08341b6b5516505ef4d218e0e46cebe76085e49f4cb88fcdc40816d1228.json
│ │ │ ├── query-4447c24a9150eb78d81edc26a441a50ee50b8523c92bfe3ccc82b09518608204.json
│ │ │ ├── query-45010d9fa4bde72535c3f23f06b7aa9dbf01cf287159476852e5f87496d94ea4.json
│ │ │ ├── query-4508b7a46677e8da7a397979a22c1a3e1160c7407b94d7baa84d6a3cdc5667c5.json
│ │ │ ├── query-4593ea3d9f66cb2618bf444ddbab1e8f2b790471f32aaf192e93f9226fc042bc.json
│ │ │ ├── query-471944787bb9b58a1b30628f28ab8088f60bf3390bfaddbae993e87df89b8844.json
│ │ │ ├── query-47c186223fb7e3c66fff44c1029cf04fb872064a1d8c14bf7d76a841cfe904a6.json
│ │ │ ├── query-4815234c108e45d450f433e5daca76218abdb441b9475ba916a39ab9e1341030.json
│ │ │ ├── query-4b27e9774d71a851edc8c042e682037a35bd4cdffe22f3a13e1730f0d6712485.json
│ │ │ ├── query-4cc8dc5f57a8398ef28942eab072784543333eac379d78c5843ca0c2203b69f5.json
│ │ │ ├── query-4d963a12190ee1db657446ef451c5364f8f91153f7f1bb4e5abfd3f3ddbe0461.json
│ │ │ ├── query-4decb0554367c10f06a45f14291e5ba2a3e16aaf63bf1c34c2e8bc0c249fe4dd.json
│ │ │ ├── query-4e74faa43c070a492467104f59f81a8cb7e304593dd8cc12523b2c9052a48275.json
│ │ │ ├── query-4f80d17d6ca14600ec33d3660b8aa2efb385baf0384b6e666c3d25f0dad3c902.json
│ │ │ ├── query-4fc440b2735dfe8561c3f75440d8eaab32d1c31c994e17f319f52045bf96714f.json
│ │ │ ├── query-51fe714966b7474d7f96cda8411b353e51efd935c929b689a8c33872d6a887b0.json
│ │ │ ├── query-547e9a424c4baa6d0a39299996fc8ee6abf88c2b6f687a17ec8216059de49596.json
│ │ │ ├── query-55f054b37280bfa43dbea79edd61ba969bacf776c0be43b608b5b0ca3f68c1fe.json
│ │ │ ├── query-56b1a366106974ec86702175bc3b4cad61f7437599082e142262169647df324d.json
│ │ │ ├── query-56d467122fa8b6599dc8821f65c2b191f378c9a76d3707d63d8cee1ef31fe4ba.json
│ │ │ ├── query-56d8fd993d1926824c84fff5b5a7f918f06e301ba4938075305eb575d310e891.json
│ │ │ ├── query-56efc697008a751a659452d95248636ce60c7f13fb2a3ef3f5440a7c795b13eb.json
│ │ │ ├── query-574f50459071d9a400bad0c7623ab1618c6ae90b4a60adb8cb4a75628cb22c1c.json
│ │ │ ├── query-577b1dc54aeefe702c74a56776544a391429b561b76d36d59673e410d5d78576.json
│ │ │ ├── query-58d7e8202ef0fb891303c761ae83a803459ffdda3c2a43ca3d6f74c0e3ecb34d.json
│ │ │ ├── query-5a652dd2a3d8bcbc8824584f8a1d9ccbb1fa56f54575b6c9dcd855a26de1edc5.json
│ │ │ ├── query-5cc635c1e2ceaad3edcec3a471a04f17071c5719f4ad0626491aa6a3b67057b8.json
│ │ │ ├── query-5ce478f8221034468e5ea9ec66051e724d7054f8c62106795bccf9fd5366696d.json
│ │ │ ├── query-5dae00eb6e3bef4d8ded1db51ad1252f6df335355b877f0dd64075f74c0018b8.json
│ │ │ ├── query-5f8a332903cbf55aca62cf642bfca4e1815e2b168889f3a5983cb859c77a75b6.json
│ │ │ ├── query-61245f2cee584d03acf4fd65dec00d22076134f726e5a5f4f13d1f4fc2060974.json
│ │ │ ├── query-6205d4d925ce5c7ab8a91e109c807b458a668304ed6262c5afab4b85a227d119.json
│ │ │ ├── query-622e613f8a71f6dd4d110df061bff6ab4e46636ab60dd85dbccd9181d004de33.json
│ │ │ ├── query-623c1d7933109030c4dbbf84d6028d1a7c94394906d1300c257c2e657925eb25.json
│ │ │ ├── query-62a28e66786692c5525ac4266bd3120d75ada4b85ed14f6815231c8691604e2f.json
│ │ │ ├── query-633bc2ca535b8b0078e81e188c734426421fe426dfb90697d025556cc8cb723f.json
│ │ │ ├── query-63ad252e1cd34aca9f819e457d0184c8df21cb4d2b1606ef84c3bdf5fc4457b0.json
│ │ │ ├── query-6412e3c9c929c588d924c1f899891f5d47f92d48b19f93823fb5a795d44a736a.json
│ │ │ ├── query-65f7a21a932662220579276b648b4866ecb76a8d7a4b36d2178b0328cf12f7ec.json
│ │ │ ├── query-667708775c67d5b3ee9a55730434f37f9ae7a49ba89301999fbb1e20aef9bb42.json
│ │ │ ├── query-66eefd452f6ccbd5bc757154a1da211c8134075b7c9f42dacc4fecaedd1c8737.json
│ │ │ ├── query-68422b179dc361337c65a6bd1aa455a961708b97a673d84f7af64cd252cbfdf3.json
│ │ │ ├── query-68494b64181d1ca4293962abfcf0af30e5b4d6947dd4e9509bfc21d8fe4b93d5.json
│ │ │ ├── query-690c16c206895598016a784884f1a764f4a921232df68cc046495ff4f39827ec.json
│ │ │ ├── query-6a1bfdce77c93b841ff0c3b533a71e6d9c9d333659de1b12ffbe462ae0123bd5.json
│ │ │ ├── query-6be91bb87b8d2b28f600bf4f59224281d676281278f6c6bf266a1aa3a91d44fd.json
│ │ │ ├── query-6c5c2a580b7be0465ecd2e86ff92282c0947576fbb09cb23c4b9a2189a38747c.json
│ │ │ ├── query-6fae9f0d59fa5fb6b03ba068d1b50e82aa1b91fa2abe782bdbddd4ccbbd7971c.json
│ │ │ ├── query-7373b3a43a7dd6c5d77c13b5094bb01a63e2902a89dec683659644dd80eb6990.json
│ │ │ ├── query-75e67eb14d42e5c1003060931a7d6ff7c957f024d1d200c2321de693ddf56ecb.json
│ │ │ ├── query-775151df9d9be456f8a86a1826fd4b7c4ea6ada452dfc89f30c7b6d0135c9e2e.json
│ │ │ ├── query-79dc2aa6cb26c21530ac05b84ec58aff9b042724bda846aadd9bf1b1a3a53791.json
│ │ │ ├── query-79f211832f75b3711706ffb94edb091f6288aa2aaea4ffebcce04ff9a27ab838.json
│ │ │ ├── query-7a96ad78e02ebdb1f6d29d941a3c393b128a7165123b63c455df2c2581995e35.json
│ │ │ ├── query-7c54f2956d1c6f0912da45e40590e2bfbb1e5c24c374c2d68ca5b692c87cf26f.json
│ │ │ ├── query-7d628ce544ed41baf2d0cdc0c95f35ac324474564b8cbb6735c9a7fc6aff75fa.json
│ │ │ ├── query-7def4e455b1290e624cf7bb52819074dadebc72a22ddfc8f4ba2513eb2992c17.json
│ │ │ ├── query-7f100e4420b2b8c086eac892d13f0ed114a5667b9c26fe7d99dcff1f4b3b1a9f.json
│ │ │ ├── query-7fb263a325db6e402761a9d0643561b134deda610f7f163d38c20625a4fdd048.json
│ │ │ ├── query-80c3a6879ba2142e78a397340501ac402808707724c58a67db7c7bb9040a7cb9.json
│ │ │ ├── query-8123b99c8d0df1c3a39ae0b2e02b8f95e438dcaa7f85e4ad37a069d962ae2e39.json
│ │ │ ├── query-823f54d7b4eb060b1c5eb4e45143e668286ae6716705e55bb4f4f0f89a5b4117.json
│ │ │ ├── query-82dcc3cd88256066ad91785afe686ec03090ea549029ba2c701cdfa2c1501f0d.json
│ │ │ ├── query-830e7650bdeccf581f260646182b3b5af903927702022ba1a4293d9d8627f727.json
│ │ │ ├── query-83edd4a9b106ad4dfda19ed983d27aee591e50a5a5f4774dbe6d68265da0c6de.json
│ │ │ ├── query-862eb483016735e02aad5e9d7e14584d1db4f2b7517b246d73bbea45f2edead4.json
│ │ │ ├── query-864ea9a40e219fdf04230331e225d699677200d5ccd3d4e12842060a657bd8ea.json
│ │ │ ├── query-86d32fea56d89959413ec714af2decbfd0b58a60ab4833cb300f15eac9061ff7.json
│ │ │ ├── query-8700e0ec6e6832a658fc2e52381c6e165d6129b275ed6ddf2e0f073b9488a31c.json
│ │ │ ├── query-877d201df7908d91a3c6bbef9dbd3cf4966a8ea833ac0e8d7449dcbce065cb5c.json
│ │ │ ├── query-878adca3c3dc2383f7dd86e19026f9aa18d6b2ac20a46a97630a43f9c5ee99eb.json
│ │ │ ├── query-883490bd163237d721488136ba8efbe81f42357213817ce1efe61e6036184b3e.json
│ │ │ ├── query-88ac4f15091a552f40c752a56d2894bb4f46c5eaeff9eec813e2d3c032de3e82.json
│ │ │ ├── query-8b2002931058f7e268604b9ad4f2a12ec6388fa66e20f8d3cc0f70c10e3d43ea.json
│ │ │ ├── query-8e19324c386abf1aa443d861d68290bec42e4c532d63b8528f6d8d5082335a1c.json
│ │ │ ├── query-8e32d5bf86d112e2f4a16f622bd95c8f728946f01e1a994a9c66b0fac6e3ae52.json
│ │ │ ├── query-8e96696a873dbbd175f1d73eb03773beab823476f6d5712c02633dbc6efa0159.json
│ │ │ ├── query-8e9d6c188fe09693d027d408b15792cbbebc72d2dd5bd4e2de12ef533a073f75.json
│ │ │ ├── query-8fc5f7e1920e9d43034aeaacb0a00739e0ee3cd00d06a692beac0f0fb2324ac8.json
│ │ │ ├── query-9110860adef3796e2aefb3e48bbb9651149f3707b75ecdd12c25879983130a41.json
│ │ │ ├── query-91776c42e46c2b2a3909baccf21dd83e2e1c88e592e94699a7a286fd396f2812.json
│ │ │ ├── query-92768b10d8dcb0593c1c5558d847aae11301163ffc053e89f08cae48a94753a0.json
│ │ │ ├── query-9459cf92b30943acb79f0e0f2e9421be83ce9e50e39f6b1e435b92ff70907264.json
│ │ │ ├── query-95427f2ba8293a8aa51366aad80129a3cfdcd1b3ec4dc8298d3aa7d0c5419191.json
│ │ │ ├── query-9889a5e2b2b849138e5af7bb649c9833cfa4fbc45c3bed269d25a8ada30634e4.json
│ │ │ ├── query-9b2762d25c773099f99e6ae65ccefc16ac367d725df8ebb7983420aa0fce4149.json
│ │ │ ├── query-9ebdeece60e544032f3da1507a6476e00d7d4675ade9081811f42aa1dc892569.json
│ │ │ ├── query-a1431ca78db627fef0eca6f573b34d65510e9333765126cbd80c943046dfaea8.json
│ │ │ ├── query-a4f5f53d0b9882e4e8147be7b618cb3dd18d0b5c74f4fd4faf13b4be6c6704ad.json
│ │ │ ├── query-a5ba908419fb3e456bdd2daca41ba06cc3212ffffb8520fc7dbbcc8b60ada314.json
│ │ │ ├── query-a5d10a37114cf01163a023d70212d17b963a27528089dca9d8fe8503335ad14b.json
│ │ │ ├── query-a5d1aeb3ce62a3f286a2a4bddc38c3f5caf2eb556236b561b68483b17dc24cfd.json
│ │ │ ├── query-a7e65932f06ee066e304db0fa693ebda5852505102aef3f2a6e9220e9010773b.json
│ │ │ ├── query-aa31348f22b24c16e1d1365c2508ad7b6c155ef2a50cabd80b59e297001dd93a.json
│ │ │ ├── query-b2c8a0820366a696d4425720bacec9c694398e2f9ff101753c8833cbf0152d9d.json
│ │ │ ├── query-b33110a056cf1ed2bb527aa975f8099d52ac0c9482cdf695a980fad0223ea136.json
│ │ │ ├── query-b5a2ccf794217a408e9ffb663183af1ba203d6d2274e9562a9e3aa938ea6d71b.json
│ │ │ ├── query-b97175fb9a4f5a7379119da3760be7efc1ba2bf95bd5d3e6725f4f98aa7d955a.json
│ │ │ ├── query-b9ca641c1f698d0ade94f50ecc78ac9fb75cf12b55f36556741a8a3adeffe7ee.json
│ │ │ ├── query-baa0922dd5a1e99794f480c483124402f5e1cd014e87919a72d468cd9762ec49.json
│ │ │ ├── query-bc0e36b956903c2ace672e6c52516598ec5f2b0288dcb935ef4d1bc694dacf0d.json
│ │ │ ├── query-bd632f11a197d6a17fcdf3e757283a64d281a931aaacd1ed6e4b73f18f1b6a2f.json
│ │ │ ├── query-bdbdee30d4f94a94f3d449aaea132512d8334a6a2636f898facd4e916a683f5e.json
│ │ │ ├── query-bee3a7f9d08e5634eb32e750701822a8f4efa01d301c8227e67783b435ee90cc.json
│ │ │ ├── query-bf4a22fed2026657255fd032fcbc1ee14c27e48df5fa21fcc6202863520dbf98.json
│ │ │ ├── query-bfc7aa46dc9d6d70c2fed471996ddcbf4d723f0e41aa17f7d2be0cf277350410.json
│ │ │ ├── query-c27e4a5df0dbc872c6ae2c35abf0868b70ba141486e15a70e61c18e97f9e9213.json
│ │ │ ├── query-c30d54026d89b9cf9c938f5aff5cf09ca12af2ab456094aac9a417473645b7e4.json
│ │ │ ├── query-c392eefb0fa2803536184053eaa22d63b6af8119f60419b8117f332cf48912de.json
│ │ │ ├── query-c48b9162c22c3d0ad7d2e2f34ecca353b807876aebf3540e5a024669ac2bb613.json
│ │ │ ├── query-c665891a58a9b19de71114e24e7162bfc0c1b5b3bfc41a9e9193e8e3e70d0668.json
│ │ │ ├── query-c6cccc00461c95d86edc5a1f66b8228fb438985f6b78f9d83663ecb11d59675f.json
│ │ │ ├── query-c850c165c1041f6b9ef852f8bb6c36f0558bd305000151834a884d7629521d28.json
│ │ │ ├── query-c91d02654edf56d33a7eb9d33d3423ac2b0a59bdd89eb7d8aeadbabb2af72314.json
│ │ │ ├── query-c9499f4408f22989b6f55f1641e7e1a82b2f32e079c6b3ee0d9f6a47a15a2522.json
│ │ │ ├── query-ca680e4e2a221ccaf578639b96730fa0d0fd4451d956f9dfa46670f5980c29a8.json
│ │ │ ├── query-cbeee2168e74df2896cbb063187cd1acc8a5429bfaec80f32764676dafd2cd1e.json
│ │ │ ├── query-cc7d93b529cfbddc9921ae33533572062f2e072f5be0fcb26032cbfec2fb3118.json
│ │ │ ├── query-cccab845031104e7a06d411cfbbbf7465f73051b30ec06d21a4c687ec175a58c.json
│ │ │ ├── query-ce7908cdeecd4b4b94c92256bd800c165567ebe5644cfd702a9e4c0bb24091d4.json
│ │ │ ├── query-d0e511b622ffba9354c3be61112b392f7c22eb9facc97730d5b4ee62c248fff8.json
│ │ │ ├── query-d1a4753755833d5100bcf4b61449f58fa83f7ee511ce0b15c7dc00c2d8c01560.json
│ │ │ ├── query-d2275416ba3ddb1bbaf929787b5df4c736084582ddebdbe9f4a4aa6853727484.json
│ │ │ ├── query-d4931e5f81b8a68f983d3e43b319a0f145339b7d8f878c3c1a765f41f3f4697c.json
│ │ │ ├── query-d78735cb49612be9fdf5a7e90c5e70cd050bc001533f388ae73e4bf64ea52a06.json
│ │ │ ├── query-da660b40d95d5fa5e9176b0b5859bb594e83fc21664f062f29ed148969b17c0b.json
│ │ │ ├── query-db645795e781123885506fe4f8e4f1a77a82d0dde22fd876f9b84dd04063db65.json
│ │ │ ├── query-dc063653a33231264dadc3971c2a0715759b8e3ef198d7325e83935a70698613.json
│ │ │ ├── query-dd0d0e3fd03f130aab947d13580796eee9a786e2ca01d339fd0e8356f8ad3824.json
│ │ │ ├── query-ddb471fb54ccc7b6438a15f8de8c9eba7e32eb51866b7f2871df2300bfe7cf40.json
│ │ │ ├── query-df27dcabe19b0b1433865256b090f84474986985ec0d204ab17becd6d3568d0a.json
│ │ │ ├── query-dfad52e56108583960a73a9b89cb91e4da97e212313adc2db73a64cc8c473a87.json
│ │ │ ├── query-dfbf03c5f333dfc7f531f415f4816603d080a544699705329dfe2e93e33c2886.json
│ │ │ ├── query-e0a011a3d29e5ae50ff06a264c39655e32be70ba76939a82184bf0dc5e8d6968.json
│ │ │ ├── query-e161b18662654bba364a273f67486b9366d5a972fc4968b03aa4c9067b92389d.json
│ │ │ ├── query-e185203cf84e43b801dfb23b4159e34aeaef1154dcd3d6811ab504915497ccf7.json
│ │ │ ├── query-e2894ddc831401000e89318423f70f221248b494ff81c1966e59c32e70a87502.json
│ │ │ ├── query-e2bf31db16ca8adc105f79f00c26d6af8b542f1f1e57e947ae39197d94dd3fed.json
│ │ │ ├── query-e509e51e9b1fe5e989713ab048e2641e6d1450f5506502b5a261e93dbb284226.json
│ │ │ ├── query-e553f31a70abb9d7e39755633f67f2b9c21ab6552986181acc10a1523852655c.json
│ │ │ ├── query-ea41e984b0e7c1c952cb265659a443de1967c2d024be80ae1d9878e27b474986.json
│ │ │ ├── query-ec42318654455b31681de774e8d1e07efae222e1d5c97146a4e0054f74c0b2cc.json
│ │ │ ├── query-ec5c77c1afea022848e52039e1c681e39dca08568992ec67770b3ef973b40401.json
│ │ │ ├── query-f00d3b1e7ce2a7fe5e8e3132e32b7ea50b0d6865f0708b6113bea68a54d857f4.json
│ │ │ ├── query-f036504d4bec68969c545881e684ab0dd9fcb85285e4d541d97a7e6be1681e38.json
│ │ │ ├── query-f04fc738e518f28f1f148245ae92c177289f673ef6a631d65b92bd5ee841bb52.json
│ │ │ ├── query-f20260cbe7dff433f5aefa4fe14fa9bc89a6ad97d550420c768e326de6ae5ae6.json
│ │ │ ├── query-f2e8e193cc183a69527708cdd65fc8f0dc9ac4d9fcf67b8ac5285d068c161e06.json
│ │ │ ├── query-f360cdb953a3e2fb64123ab8351d42029b58919a0ac0e8900320fee60c5c93b2.json
│ │ │ ├── query-f4015e2352122c1819ff7e7a4dff62b9387f439d80f47bf457b20663c24b861a.json
│ │ │ ├── query-f403f8876022d19b330e4fc0b550e2ef8bb14a08de3530cb541ae09e1a479d45.json
│ │ │ ├── query-f5eff8b44dfd3aceb4e1fc1a4b58c4e74c8fac220e9943daf4103eb9e57af051.json
│ │ │ ├── query-f7c20c9dc1eaf61cc18cf226449b4ee8c4b082c96515a3ee261c960aa23171e2.json
│ │ │ ├── query-f9491f7f61aec53b057689bc722b6f20c2646510bfcd8b38c27576769a53e750.json
│ │ │ ├── query-fbd32cb35d27a0a60a48b61c9e7db73c3f3b21e62c597850df1ebfca0d22c159.json
│ │ │ ├── query-fcffbcc41e058a6d055bec006e7287fcfb26b609107d753e372faeb7f9d92302.json
│ │ │ ├── query-fe9ae1da931e14f97d432ad34fe636b4854c7f85665b90337b342663bdde68b9.json
│ │ │ └── query-ffea7acda162fba35e1b1acd2c6791bc917f086bf1c34816178282f0579c1eeb.json
│ │ ├── AGENTS.md
│ │ ├── Cargo.toml
│ │ ├── Dockerfile
│ │ ├── README.md
│ │ ├── docker-compose.yml
│ │ ├── migrations/
│ │ │ ├── 20251001000000_shared_tasks_activity.sql
│ │ │ ├── 20251117000000_jwt_refresh_tokens.sql
│ │ │ ├── 20251120121307_oauth_handoff_tokens.sql
│ │ │ ├── 20251127000000_electric_support.sql
│ │ │ ├── 20251201000000_drop_unused_activity_and_columns.sql
│ │ │ ├── 20251201010000_unify_task_status_enums.sql
│ │ │ ├── 20251212000000_create_reviews_table.sql
│ │ │ ├── 20251215000000_github_app_installations.sql
│ │ │ ├── 20251216000000_add_webhook_fields_to_reviews.sql
│ │ │ ├── 20251216100000_add_review_enabled_to_repos.sql
│ │ │ ├── 20260112000000_remote-projects.sql
│ │ │ ├── 20260114000000_electric_sync_tables.sql
│ │ │ ├── 20260115000000_billing.sql
│ │ │ ├── 20260204000000_issue_attachments.sql
│ │ │ ├── 20260205000000_add_issue_creator.sql
│ │ │ ├── 20260213000000_pending_uploads.sql
│ │ │ ├── 20260216000000_remove_attachment_electric_sync.sql
│ │ │ ├── 20260217000000_add_project_sort_order.sql
│ │ │ ├── 20260226000000_add_encrypted_provider_tokens_to_oauth_accounts.sql
│ │ │ ├── 20260226100000_relay_hosts_and_sessions.sql
│ │ │ ├── 20260310000000_add_title_description_notification_types.sql
│ │ │ ├── 20260311000000_notification_digest.sql
│ │ │ └── 20260313000000_fix-short-id-counter.sql
│ │ ├── scripts/
│ │ │ └── prepare-db.sh
│ │ └── src/
│ │ ├── analytics.rs
│ │ ├── app.rs
│ │ ├── attachments/
│ │ │ ├── cleanup.rs
│ │ │ ├── mod.rs
│ │ │ └── thumbnail.rs
│ │ ├── audit/
│ │ │ └── mod.rs
│ │ ├── auth/
│ │ │ ├── handoff.rs
│ │ │ ├── jwt.rs
│ │ │ ├── middleware.rs
│ │ │ ├── mod.rs
│ │ │ ├── oauth_token_validator.rs
│ │ │ └── provider.rs
│ │ ├── azure_blob.rs
│ │ ├── billing.rs
│ │ ├── bin/
│ │ │ └── generate_types.rs
│ │ ├── config.rs
│ │ ├── db/
│ │ │ ├── attachments.rs
│ │ │ ├── auth.rs
│ │ │ ├── blobs.rs
│ │ │ ├── digest.rs
│ │ │ ├── electric_publications.rs
│ │ │ ├── github_app.rs
│ │ │ ├── hosts.rs
│ │ │ ├── identity_errors.rs
│ │ │ ├── invitations.rs
│ │ │ ├── issue_assignees.rs
│ │ │ ├── issue_comment_reactions.rs
│ │ │ ├── issue_comments.rs
│ │ │ ├── issue_followers.rs
│ │ │ ├── issue_relationships.rs
│ │ │ ├── issue_tags.rs
│ │ │ ├── issues.rs
│ │ │ ├── migration.rs
│ │ │ ├── mod.rs
│ │ │ ├── notifications.rs
│ │ │ ├── oauth.rs
│ │ │ ├── oauth_accounts.rs
│ │ │ ├── organization_members.rs
│ │ │ ├── organizations.rs
│ │ │ ├── pending_uploads.rs
│ │ │ ├── project_notification_preferences.rs
│ │ │ ├── project_statuses.rs
│ │ │ ├── projects.rs
│ │ │ ├── pull_requests.rs
│ │ │ ├── reviews.rs
│ │ │ ├── tags.rs
│ │ │ ├── types.rs
│ │ │ ├── users.rs
│ │ │ └── workspaces.rs
│ │ ├── digest/
│ │ │ ├── email.rs
│ │ │ ├── index.mjml
│ │ │ ├── mod.rs
│ │ │ └── task.rs
│ │ ├── github_app/
│ │ │ ├── jwt.rs
│ │ │ ├── mod.rs
│ │ │ ├── pr_review.rs
│ │ │ ├── service.rs
│ │ │ └── webhook.rs
│ │ ├── lib.rs
│ │ ├── mail.rs
│ │ ├── main.rs
│ │ ├── middleware/
│ │ │ ├── mod.rs
│ │ │ └── version.rs
│ │ ├── mutation_definition.rs
│ │ ├── notifications.rs
│ │ ├── r2.rs
│ │ ├── routes/
│ │ │ ├── attachments.rs
│ │ │ ├── billing.rs
│ │ │ ├── electric_proxy.rs
│ │ │ ├── error.rs
│ │ │ ├── github_app.rs
│ │ │ ├── hosts.rs
│ │ │ ├── identity.rs
│ │ │ ├── issue_assignees.rs
│ │ │ ├── issue_comment_reactions.rs
│ │ │ ├── issue_comments.rs
│ │ │ ├── issue_followers.rs
│ │ │ ├── issue_relationships.rs
│ │ │ ├── issue_tags.rs
│ │ │ ├── issues.rs
│ │ │ ├── migration.rs
│ │ │ ├── mod.rs
│ │ │ ├── notifications.rs
│ │ │ ├── oauth.rs
│ │ │ ├── organization_members.rs
│ │ │ ├── organizations.rs
│ │ │ ├── project_statuses.rs
│ │ │ ├── projects.rs
│ │ │ ├── pull_requests.rs
│ │ │ ├── review.rs
│ │ │ ├── tags.rs
│ │ │ ├── tokens.rs
│ │ │ └── workspaces.rs
│ │ ├── shape_definition.rs
│ │ ├── shape_route.rs
│ │ ├── shape_routes.rs
│ │ ├── shapes.rs
│ │ ├── shared_key_auth.rs
│ │ └── state.rs
│ ├── review/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ ├── api.rs
│ │ ├── archive.rs
│ │ ├── claude_session.rs
│ │ ├── config.rs
│ │ ├── error.rs
│ │ ├── github.rs
│ │ ├── main.rs
│ │ └── session_selector.rs
│ ├── server/
│ │ ├── Cargo.toml
│ │ ├── build.rs
│ │ └── src/
│ │ ├── bin/
│ │ │ └── generate_types.rs
│ │ ├── error.rs
│ │ ├── lib.rs
│ │ ├── main.rs
│ │ ├── middleware/
│ │ │ ├── error_logging.rs
│ │ │ ├── mod.rs
│ │ │ ├── model_loaders.rs
│ │ │ ├── origin.rs
│ │ │ └── relay_request_signature.rs
│ │ ├── preview_proxy/
│ │ │ ├── bippy_bundle.js
│ │ │ ├── click_to_component_script.js
│ │ │ ├── devtools_script.js
│ │ │ ├── eruda_init.js
│ │ │ └── mod.rs
│ │ ├── routes/
│ │ │ ├── approvals.rs
│ │ │ ├── attachments.rs
│ │ │ ├── config.rs
│ │ │ ├── containers.rs
│ │ │ ├── events.rs
│ │ │ ├── execution_processes.rs
│ │ │ ├── filesystem.rs
│ │ │ ├── frontend.rs
│ │ │ ├── health.rs
│ │ │ ├── migration.rs
│ │ │ ├── mod.rs
│ │ │ ├── oauth.rs
│ │ │ ├── organizations.rs
│ │ │ ├── relay_auth.rs
│ │ │ ├── relay_ws.rs
│ │ │ ├── releases.rs
│ │ │ ├── remote/
│ │ │ │ ├── issue_assignees.rs
│ │ │ │ ├── issue_relationships.rs
│ │ │ │ ├── issue_tags.rs
│ │ │ │ ├── issues.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── project_statuses.rs
│ │ │ │ ├── projects.rs
│ │ │ │ ├── pull_requests.rs
│ │ │ │ ├── tags.rs
│ │ │ │ └── workspaces.rs
│ │ │ ├── repo.rs
│ │ │ ├── scratch.rs
│ │ │ ├── search.rs
│ │ │ ├── sessions/
│ │ │ │ ├── mod.rs
│ │ │ │ ├── queue.rs
│ │ │ │ └── review.rs
│ │ │ ├── tags.rs
│ │ │ ├── terminal.rs
│ │ │ └── workspaces/
│ │ │ ├── attachments.rs
│ │ │ ├── codex_setup.rs
│ │ │ ├── core.rs
│ │ │ ├── create.rs
│ │ │ ├── cursor_setup.rs
│ │ │ ├── execution.rs
│ │ │ ├── gh_cli_setup.rs
│ │ │ ├── git.rs
│ │ │ ├── integration.rs
│ │ │ ├── links.rs
│ │ │ ├── mod.rs
│ │ │ ├── pr.rs
│ │ │ ├── repos.rs
│ │ │ ├── streams.rs
│ │ │ └── workspace_summary.rs
│ │ ├── startup.rs
│ │ └── tunnel.rs
│ ├── server-info/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ └── lib.rs
│ ├── services/
│ │ ├── Cargo.toml
│ │ ├── src/
│ │ │ ├── lib.rs
│ │ │ └── services/
│ │ │ ├── analytics.rs
│ │ │ ├── approvals/
│ │ │ │ └── executor_approvals.rs
│ │ │ ├── approvals.rs
│ │ │ ├── auth.rs
│ │ │ ├── config/
│ │ │ │ ├── editor/
│ │ │ │ │ └── mod.rs
│ │ │ │ ├── mod.rs
│ │ │ │ └── versions/
│ │ │ │ ├── mod.rs
│ │ │ │ ├── v1.rs
│ │ │ │ ├── v2.rs
│ │ │ │ ├── v3.rs
│ │ │ │ ├── v4.rs
│ │ │ │ ├── v5.rs
│ │ │ │ ├── v6.rs
│ │ │ │ ├── v7.rs
│ │ │ │ └── v8.rs
│ │ │ ├── container.rs
│ │ │ ├── diff_stream.rs
│ │ │ ├── events/
│ │ │ │ ├── patches.rs
│ │ │ │ ├── streams.rs
│ │ │ │ └── types.rs
│ │ │ ├── events.rs
│ │ │ ├── execution_process.rs
│ │ │ ├── file.rs
│ │ │ ├── file_ranker.rs
│ │ │ ├── file_search.rs
│ │ │ ├── filesystem.rs
│ │ │ ├── filesystem_watcher.rs
│ │ │ ├── migration/
│ │ │ │ ├── error.rs
│ │ │ │ ├── mod.rs
│ │ │ │ └── types.rs
│ │ │ ├── mod.rs
│ │ │ ├── notification.rs
│ │ │ ├── oauth_credentials.rs
│ │ │ ├── pr_monitor.rs
│ │ │ ├── qa_repos.rs
│ │ │ ├── queued_message.rs
│ │ │ ├── remote_client.rs
│ │ │ ├── remote_sync.rs
│ │ │ └── repo.rs
│ │ └── tests/
│ │ └── filesystem_repo_discovery.rs
│ ├── tauri-app/
│ │ ├── Cargo.toml
│ │ ├── Info.plist
│ │ ├── build.rs
│ │ ├── capabilities/
│ │ │ └── default.json
│ │ ├── gen/
│ │ │ └── schemas/
│ │ │ ├── acl-manifests.json
│ │ │ ├── capabilities.json
│ │ │ ├── desktop-schema.json
│ │ │ └── macOS-schema.json
│ │ ├── icons/
│ │ │ ├── android/
│ │ │ │ ├── mipmap-anydpi-v26/
│ │ │ │ │ └── ic_launcher.xml
│ │ │ │ └── values/
│ │ │ │ └── ic_launcher_background.xml
│ │ │ └── icon.icns
│ │ ├── msi-template.wxs
│ │ ├── splash/
│ │ │ └── index.html
│ │ ├── src/
│ │ │ └── main.rs
│ │ └── tauri.conf.json
│ ├── trusted-key-auth/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ ├── error.rs
│ │ ├── key_confirmation.rs
│ │ ├── lib.rs
│ │ ├── refresh.rs
│ │ ├── request_signature.rs
│ │ ├── runtime.rs
│ │ ├── spake2.rs
│ │ └── trusted_keys.rs
│ ├── utils/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ ├── approvals.rs
│ │ ├── assets.rs
│ │ ├── browser.rs
│ │ ├── command_ext.rs
│ │ ├── diff.rs
│ │ ├── execution_logs.rs
│ │ ├── jwt.rs
│ │ ├── lib.rs
│ │ ├── log_msg.rs
│ │ ├── msg_store.rs
│ │ ├── path.rs
│ │ ├── port_file.rs
│ │ ├── process.rs
│ │ ├── response.rs
│ │ ├── sentry.rs
│ │ ├── shell.rs
│ │ ├── stream_lines.rs
│ │ ├── text.rs
│ │ ├── tokio.rs
│ │ └── version.rs
│ ├── workspace-manager/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ ├── lib.rs
│ │ └── workspace_manager.rs
│ └── worktree-manager/
│ ├── Cargo.toml
│ └── src/
│ ├── lib.rs
│ └── worktree_manager.rs
├── dev_assets_seed/
│ └── config.json
├── docs/
│ ├── .mintignore
│ ├── AGENTS.md
│ ├── README.md
│ ├── agents/
│ │ ├── amp.mdx
│ │ ├── ccr.mdx
│ │ ├── claude-code.mdx
│ │ ├── cursor-cli.mdx
│ │ ├── droid.mdx
│ │ ├── gemini-cli.mdx
│ │ ├── github-copilot.mdx
│ │ ├── openai-codex.mdx
│ │ ├── opencode.mdx
│ │ └── qwen-code.mdx
│ ├── browser-testing.mdx
│ ├── cloud/
│ │ ├── authentication.mdx
│ │ ├── customisation.mdx
│ │ ├── filtering.mdx
│ │ ├── getting-started.mdx
│ │ ├── index.mdx
│ │ ├── issues.mdx
│ │ ├── kanban-board.mdx
│ │ ├── list-view.mdx
│ │ ├── migration.mdx
│ │ ├── organizations.mdx
│ │ ├── projects.mdx
│ │ ├── team-members.mdx
│ │ └── troubleshooting.mdx
│ ├── configuration-customisation/
│ │ ├── agent-configurations.mdx
│ │ ├── creating-task-tags.mdx
│ │ ├── global-settings.mdx
│ │ └── keyboard-shortcuts.mdx
│ ├── core-features/
│ │ ├── completing-a-task.mdx
│ │ ├── creating-projects.mdx
│ │ ├── creating-tasks.mdx
│ │ ├── monitoring-task-execution.mdx
│ │ ├── new-task-attempts.mdx
│ │ ├── resolving-rebase-conflicts.mdx
│ │ ├── reviewing-code-changes.mdx
│ │ ├── subtasks.mdx
│ │ └── testing-your-application.mdx
│ ├── docs.json
│ ├── frontend-ui-library-refactor-audit.md
│ ├── getting-started.mdx
│ ├── index.mdx
│ ├── integrations/
│ │ ├── azure-repos-integration.mdx
│ │ ├── github-integration.mdx
│ │ ├── mcp-server-configuration.mdx
│ │ ├── vibe-kanban-mcp-server.mdx
│ │ └── vscode-extension.mdx
│ ├── issue-management.mdx
│ ├── remote-access.mdx
│ ├── responsible-disclosure.mdx
│ ├── reviewing-code.mdx
│ ├── self-hosting/
│ │ ├── deploy-docker.mdx
│ │ └── local-development.mdx
│ ├── settings/
│ │ ├── agent-configurations.mdx
│ │ ├── creating-task-tags.mdx
│ │ ├── general.mdx
│ │ ├── index.mdx
│ │ ├── mcp-servers.mdx
│ │ ├── organization-settings.mdx
│ │ ├── projects-repositories.mdx
│ │ └── remote-projects.mdx
│ ├── supported-coding-agents.mdx
│ ├── troubleshooting.mdx
│ └── workspaces/
│ ├── changes.mdx
│ ├── chat-interface.mdx
│ ├── command-bar.mdx
│ ├── creating-workspaces.mdx
│ ├── git-operations.mdx
│ ├── index.mdx
│ ├── interface.mdx
│ ├── managing-workspaces.mdx
│ ├── multi-repo-sessions.mdx
│ ├── repositories.mdx
│ ├── sessions.mdx
│ └── slash-commands.mdx
├── local-build.sh
├── mobile-testing.md
├── npx-cli/
│ ├── README.md
│ ├── package.json
│ ├── src/
│ │ ├── cli.ts
│ │ ├── desktop.ts
│ │ └── download.ts
│ └── tsconfig.json
├── package.json
├── packages/
│ ├── local-web/
│ │ ├── .eslintrc.cjs
│ │ ├── .prettierignore
│ │ ├── .prettierrc.json
│ │ ├── AGENTS.md
│ │ ├── components.json
│ │ ├── components.legacy.json
│ │ ├── index.html
│ │ ├── package.json
│ │ ├── postcss.config.cjs
│ │ ├── src/
│ │ │ ├── app/
│ │ │ │ ├── entry/
│ │ │ │ │ ├── App.tsx
│ │ │ │ │ └── Bootstrap.tsx
│ │ │ │ ├── hooks/
│ │ │ │ │ ├── useTauriNotificationNavigation.ts
│ │ │ │ │ └── useTauriUpdateReady.ts
│ │ │ │ ├── navigation/
│ │ │ │ │ └── AppNavigation.ts
│ │ │ │ ├── notifications/
│ │ │ │ │ ├── AppSystemNotifications.tsx
│ │ │ │ │ └── showSystemNotification.ts
│ │ │ │ ├── providers/
│ │ │ │ │ ├── ClickedElementsProvider.tsx
│ │ │ │ │ ├── ConfigProvider.tsx
│ │ │ │ │ └── ThemeProvider.tsx
│ │ │ │ └── router/
│ │ │ │ └── index.ts
│ │ │ ├── routeTree.gen.ts
│ │ │ ├── routes/
│ │ │ │ ├── __root.tsx
│ │ │ │ ├── _app.migrate.tsx
│ │ │ │ ├── _app.notifications.tsx
│ │ │ │ ├── _app.projects.$projectId.tsx
│ │ │ │ ├── _app.projects.$projectId_.issues.$issueId.tsx
│ │ │ │ ├── _app.projects.$projectId_.issues.$issueId_.workspaces.$workspaceId.tsx
│ │ │ │ ├── _app.projects.$projectId_.issues.$issueId_.workspaces.create.$draftId.tsx
│ │ │ │ ├── _app.projects.$projectId_.workspaces.create.$draftId.tsx
│ │ │ │ ├── _app.tsx
│ │ │ │ ├── _app.workspaces.tsx
│ │ │ │ ├── _app.workspaces_.$workspaceId.tsx
│ │ │ │ ├── _app.workspaces_.create.tsx
│ │ │ │ ├── _app.workspaces_.electric-test.tsx
│ │ │ │ ├── index.tsx
│ │ │ │ ├── onboarding.tsx
│ │ │ │ ├── onboarding_.sign-in.tsx
│ │ │ │ └── workspaces.$workspaceId.vscode.tsx
│ │ │ ├── shared/
│ │ │ │ └── types/
│ │ │ │ └── virtual-executor-schemas.d.ts
│ │ │ └── vite-env.d.ts
│ │ ├── tailwind.new.config.js
│ │ ├── tsconfig.json
│ │ ├── tsconfig.node.json
│ │ └── vite.config.ts
│ ├── public/
│ │ ├── robots.txt
│ │ └── site.webmanifest
│ ├── remote-web/
│ │ ├── .prettierignore
│ │ ├── index.html
│ │ ├── package.json
│ │ ├── postcss.config.cjs
│ │ ├── src/
│ │ │ ├── app/
│ │ │ │ ├── entry/
│ │ │ │ │ ├── App.tsx
│ │ │ │ │ └── Bootstrap.tsx
│ │ │ │ ├── layout/
│ │ │ │ │ ├── RemoteAppBarUserPopoverContainer.tsx
│ │ │ │ │ ├── RemoteAppShell.tsx
│ │ │ │ │ ├── RemoteDesktopNavbar.tsx
│ │ │ │ │ └── RemoteNavbarContainer.tsx
│ │ │ │ ├── navigation/
│ │ │ │ │ └── AppNavigation.ts
│ │ │ │ ├── providers/
│ │ │ │ │ ├── RemoteActionsProvider.tsx
│ │ │ │ │ ├── RemoteAuthProvider.tsx
│ │ │ │ │ └── RemoteUserSystemProvider.tsx
│ │ │ │ ├── router/
│ │ │ │ │ └── index.ts
│ │ │ │ └── styles/
│ │ │ │ └── index.css
│ │ │ ├── pages/
│ │ │ │ ├── HomePage.tsx
│ │ │ │ ├── InvitationCompletePage.tsx
│ │ │ │ ├── InvitationPage.tsx
│ │ │ │ ├── LoginCompletePage.tsx
│ │ │ │ ├── LoginPage.tsx
│ │ │ │ ├── NotFoundPage.tsx
│ │ │ │ ├── RemoteProjectKanbanShell.tsx
│ │ │ │ ├── RemoteWorkspacesPageShell.tsx
│ │ │ │ ├── UpgradeCompletePage.tsx
│ │ │ │ ├── UpgradePage.tsx
│ │ │ │ ├── UpgradeSuccessPage.tsx
│ │ │ │ └── WorkspacesUnavailablePage.tsx
│ │ │ ├── routeTree.gen.ts
│ │ │ ├── routes/
│ │ │ │ ├── __root.tsx
│ │ │ │ ├── account.tsx
│ │ │ │ ├── account_.complete.tsx
│ │ │ │ ├── account_.organizations.$orgId.tsx
│ │ │ │ ├── hosts.$hostId.workspaces.$workspaceId.vscode.tsx
│ │ │ │ ├── hosts.$hostId.workspaces.tsx
│ │ │ │ ├── hosts.$hostId.workspaces_.$workspaceId.tsx
│ │ │ │ ├── hosts.$hostId.workspaces_.create.tsx
│ │ │ │ ├── index.tsx
│ │ │ │ ├── invitations.$token.accept.tsx
│ │ │ │ ├── invitations.$token.complete.tsx
│ │ │ │ ├── login.tsx
│ │ │ │ ├── login_.complete.tsx
│ │ │ │ ├── notifications.tsx
│ │ │ │ ├── projects.$projectId.tsx
│ │ │ │ ├── projects.$projectId_.hosts.$hostId.workspaces.create.$draftId.tsx
│ │ │ │ ├── projects.$projectId_.issues.$issueId.tsx
│ │ │ │ ├── projects.$projectId_.issues.$issueId_.hosts.$hostId.workspaces.$workspaceId.tsx
│ │ │ │ ├── projects.$projectId_.issues.$issueId_.hosts.$hostId.workspaces.create.$draftId.tsx
│ │ │ │ ├── upgrade.tsx
│ │ │ │ ├── upgrade_.complete.tsx
│ │ │ │ └── upgrade_.success.tsx
│ │ │ ├── shared/
│ │ │ │ ├── components/
│ │ │ │ │ └── BrandLogo.tsx
│ │ │ │ ├── constants/
│ │ │ │ │ └── settings.ts
│ │ │ │ ├── hooks/
│ │ │ │ │ ├── useRelayAppBarHosts.ts
│ │ │ │ │ ├── useRelayWorkspaceHostHealth.ts
│ │ │ │ │ └── useSystemTheme.ts
│ │ │ │ ├── lib/
│ │ │ │ │ ├── api.ts
│ │ │ │ │ ├── auth/
│ │ │ │ │ │ └── tokenManager.ts
│ │ │ │ │ ├── auth.ts
│ │ │ │ │ ├── pkce.ts
│ │ │ │ │ ├── relay/
│ │ │ │ │ │ ├── activeHostContext.ts
│ │ │ │ │ │ ├── bytes.ts
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── http.ts
│ │ │ │ │ │ ├── keyCache.ts
│ │ │ │ │ │ ├── routing.ts
│ │ │ │ │ │ ├── signing.ts
│ │ │ │ │ │ ├── types.ts
│ │ │ │ │ │ └── ws.ts
│ │ │ │ │ ├── relayHostApi.ts
│ │ │ │ │ └── route-auth.ts
│ │ │ │ ├── stores/
│ │ │ │ │ └── useMobileWorkspaceTitle.ts
│ │ │ │ └── types/
│ │ │ │ └── virtual-executor-schemas.d.ts
│ │ │ └── vite-env.d.ts
│ │ ├── tailwind.config.cjs
│ │ ├── tsconfig.json
│ │ ├── tsconfig.node.json
│ │ └── vite.config.ts
│ ├── ui/
│ │ ├── .eslintrc.cjs
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── components/
│ │ │ │ ├── Accordion.tsx
│ │ │ │ ├── Alert.tsx
│ │ │ │ ├── AppBar.tsx
│ │ │ │ ├── AppBarButton.tsx
│ │ │ │ ├── AppBarSocialLink.tsx
│ │ │ │ ├── AppBarUserPopover.tsx
│ │ │ │ ├── AskUserQuestionBanner.tsx
│ │ │ │ ├── AutoExpandingTextarea.tsx
│ │ │ │ ├── AutoResizeTextarea.tsx
│ │ │ │ ├── Badge.tsx
│ │ │ │ ├── BulkActionBar.tsx
│ │ │ │ ├── Button.tsx
│ │ │ │ ├── Card.tsx
│ │ │ │ ├── ChangeTargetDialog.tsx
│ │ │ │ ├── ChangesPanel.tsx
│ │ │ │ ├── ChatAggregatedDiffEntries.tsx
│ │ │ │ ├── ChatAggregatedToolEntries.tsx
│ │ │ │ ├── ChatApprovalCard.tsx
│ │ │ │ ├── ChatAssistantMessage.tsx
│ │ │ │ ├── ChatBoxBase.tsx
│ │ │ │ ├── ChatCollapsedThinking.tsx
│ │ │ │ ├── ChatEmptyState.tsx
│ │ │ │ ├── ChatEntryContainer.tsx
│ │ │ │ ├── ChatErrorMessage.tsx
│ │ │ │ ├── ChatFileEntry.tsx
│ │ │ │ ├── ChatMarkdown.tsx
│ │ │ │ ├── ChatScriptEntry.tsx
│ │ │ │ ├── ChatScriptPlaceholder.tsx
│ │ │ │ ├── ChatSubagentEntry.tsx
│ │ │ │ ├── ChatSystemMessage.tsx
│ │ │ │ ├── ChatThinkingMessage.tsx
│ │ │ │ ├── ChatTodoList.tsx
│ │ │ │ ├── ChatToolSummary.tsx
│ │ │ │ ├── ChatUserMessage.tsx
│ │ │ │ ├── Checkbox.tsx
│ │ │ │ ├── ClickableCodePlugin.tsx
│ │ │ │ ├── CodeBlockShortcutPlugin.tsx
│ │ │ │ ├── CodeHighlightPlugin.tsx
│ │ │ │ ├── CollapsibleSectionHeader.tsx
│ │ │ │ ├── ColorPicker.tsx
│ │ │ │ ├── Command.tsx
│ │ │ │ ├── CommandBar.tsx
│ │ │ │ ├── CommentCard.tsx
│ │ │ │ ├── ComponentInfoKeyboardPlugin.tsx
│ │ │ │ ├── ConfirmDialog.tsx
│ │ │ │ ├── ContextBar.tsx
│ │ │ │ ├── ContextUsageGauge.tsx
│ │ │ │ ├── CreateChatBox.tsx
│ │ │ │ ├── CreateRepoDialog.tsx
│ │ │ │ ├── DataTable.tsx
│ │ │ │ ├── DeleteWorkspaceDialog.tsx
│ │ │ │ ├── Dialog.tsx
│ │ │ │ ├── Dropdown.tsx
│ │ │ │ ├── DropdownMenu.tsx
│ │ │ │ ├── EmojiPicker.tsx
│ │ │ │ ├── ErrorAlert.tsx
│ │ │ │ ├── ErrorDialog.tsx
│ │ │ │ ├── FileTagTypeaheadPlugin.tsx
│ │ │ │ ├── FileTree.tsx
│ │ │ │ ├── FileTreeNode.tsx
│ │ │ │ ├── FileTreeSearchBar.tsx
│ │ │ │ ├── GitPanel.tsx
│ │ │ │ ├── GoogleLogo.tsx
│ │ │ │ ├── GuideDialogShell.tsx
│ │ │ │ ├── IconButton.tsx
│ │ │ │ ├── IconButtonGroup.tsx
│ │ │ │ ├── ImageKeyboardPlugin.tsx
│ │ │ │ ├── Input.tsx
│ │ │ │ ├── InputField.tsx
│ │ │ │ ├── IssueCommentsSection.tsx
│ │ │ │ ├── IssueListRow.tsx
│ │ │ │ ├── IssueListSection.tsx
│ │ │ │ ├── IssueListView.tsx
│ │ │ │ ├── IssuePropertyRow.tsx
│ │ │ │ ├── IssueRelationshipsSection.tsx
│ │ │ │ ├── IssueSubIssuesSection.tsx
│ │ │ │ ├── IssueTagsRow.tsx
│ │ │ │ ├── IssueWorkspaceCard.tsx
│ │ │ │ ├── IssueWorkspacesSection.tsx
│ │ │ │ ├── KanbanAssignee.tsx
│ │ │ │ ├── KanbanBadge.tsx
│ │ │ │ ├── KanbanBoard.tsx
│ │ │ │ ├── KanbanCardContent.tsx
│ │ │ │ ├── KanbanFilterBar.tsx
│ │ │ │ ├── KanbanIssuePanel.tsx
│ │ │ │ ├── KeyboardCommandsPlugin.tsx
│ │ │ │ ├── KeyboardDialog.tsx
│ │ │ │ ├── Label.tsx
│ │ │ │ ├── Loader.tsx
│ │ │ │ ├── MarkdownInsertPlugin.tsx
│ │ │ │ ├── MarkdownListContinuePlugin.tsx
│ │ │ │ ├── MarkdownSyncPlugin.tsx
│ │ │ │ ├── MigrateChooseProjects.tsx
│ │ │ │ ├── MigrateFinish.tsx
│ │ │ │ ├── MigrateIntroduction.tsx
│ │ │ │ ├── MigrateMigrate.tsx
│ │ │ │ ├── MigrateSidebar.tsx
│ │ │ │ ├── MobileDrawer.tsx
│ │ │ │ ├── ModelList.tsx
│ │ │ │ ├── ModelProviderIcon.tsx
│ │ │ │ ├── ModelSelectorPopover.tsx
│ │ │ │ ├── MultiSelectCommandBar.tsx
│ │ │ │ ├── MultiSelectDropdown.tsx
│ │ │ │ ├── Navbar.tsx
│ │ │ │ ├── OAuthButtons.tsx
│ │ │ │ ├── PasteMarkdownPlugin.tsx
│ │ │ │ ├── PierreConversationDiff.tsx
│ │ │ │ ├── Popover.tsx
│ │ │ │ ├── PrBadge.tsx
│ │ │ │ ├── PreviewBrowser.tsx
│ │ │ │ ├── PreviewControls.tsx
│ │ │ │ ├── PreviewNavigation.tsx
│ │ │ │ ├── PrimaryButton.tsx
│ │ │ │ ├── PriorityFilterDropdown.tsx
│ │ │ │ ├── PriorityIcon.tsx
│ │ │ │ ├── ProcessListItem.tsx
│ │ │ │ ├── ProjectsGuideDialog.tsx
│ │ │ │ ├── PropertyDropdown.tsx
│ │ │ │ ├── RadixTooltip.tsx
│ │ │ │ ├── ReadOnlyLinkPlugin.tsx
│ │ │ │ ├── RebaseInProgressDialog.tsx
│ │ │ │ ├── RelationshipBadge.tsx
│ │ │ │ ├── RenameSessionDialog.tsx
│ │ │ │ ├── RenameWorkspaceDialog.tsx
│ │ │ │ ├── RepoCard.tsx
│ │ │ │ ├── RunningDots.tsx
│ │ │ │ ├── SearchableDropdown.tsx
│ │ │ │ ├── SearchableTagDropdown.tsx
│ │ │ │ ├── Select.tsx
│ │ │ │ ├── SessionChatBox.tsx
│ │ │ │ ├── SlashCommandTypeaheadPlugin.tsx
│ │ │ │ ├── SplitButton.tsx
│ │ │ │ ├── StaticToolbarPlugin.tsx
│ │ │ │ ├── StatusDot.tsx
│ │ │ │ ├── SubIssueRow.tsx
│ │ │ │ ├── Switch.tsx
│ │ │ │ ├── SyncErrorIndicator.tsx
│ │ │ │ ├── Table.tsx
│ │ │ │ ├── TerminalPanel.tsx
│ │ │ │ ├── Textarea.tsx
│ │ │ │ ├── TodoProgressPopup.tsx
│ │ │ │ ├── Toggle.tsx
│ │ │ │ ├── ToolStatusDot.tsx
│ │ │ │ ├── Toolbar.tsx
│ │ │ │ ├── ToolbarPlugin.tsx
│ │ │ │ ├── Tooltip.tsx
│ │ │ │ ├── TypeaheadMenu.tsx
│ │ │ │ ├── TypeaheadOpenContext.tsx
│ │ │ │ ├── UserAvatar.tsx
│ │ │ │ ├── ViewNavTabs.tsx
│ │ │ │ ├── WorkspaceContext.tsx
│ │ │ │ ├── WorkspaceSummary.tsx
│ │ │ │ ├── WorkspacesMain.tsx
│ │ │ │ ├── WorkspacesSidebar.tsx
│ │ │ │ ├── attachment-node.tsx
│ │ │ │ ├── component-info-node.tsx
│ │ │ │ ├── create-decorator-node.tsx
│ │ │ │ ├── image-node.tsx
│ │ │ │ ├── pr-comment-card.tsx
│ │ │ │ └── pr-comment-node.tsx
│ │ │ ├── lib/
│ │ │ │ ├── cn.ts
│ │ │ │ ├── code-highlight-theme.ts
│ │ │ │ ├── modals.ts
│ │ │ │ ├── platform.ts
│ │ │ │ └── table-transformer.ts
│ │ │ └── styles/
│ │ │ └── diff-style-overrides.css
│ │ └── tsconfig.json
│ └── web-core/
│ ├── .prettierrc.json
│ ├── package.json
│ ├── src/
│ │ ├── app/
│ │ │ └── styles/
│ │ │ ├── diff-style-overrides.css
│ │ │ ├── edit-diff-overrides.css
│ │ │ └── new/
│ │ │ └── index.css
│ │ ├── features/
│ │ │ ├── create-mode/
│ │ │ │ └── model/
│ │ │ │ ├── CreateModeProvider.tsx
│ │ │ │ ├── createModeBootstrap.ts
│ │ │ │ ├── createModeSeedStore.ts
│ │ │ │ ├── useCreateMode.ts
│ │ │ │ └── useCreateModeState.ts
│ │ │ ├── kanban/
│ │ │ │ ├── model/
│ │ │ │ │ └── hooks/
│ │ │ │ │ └── useKanbanFilters.ts
│ │ │ │ └── ui/
│ │ │ │ ├── BulkActionBarContainer.tsx
│ │ │ │ └── KanbanContainer.tsx
│ │ │ ├── migration/
│ │ │ │ ├── model/
│ │ │ │ │ └── hooks/
│ │ │ │ │ └── useProjects.ts
│ │ │ │ └── ui/
│ │ │ │ ├── MigrateChooseProjectsContainer.tsx
│ │ │ │ ├── MigrateFinishContainer.tsx
│ │ │ │ ├── MigrateIntroductionContainer.tsx
│ │ │ │ ├── MigrateLayout.tsx
│ │ │ │ └── MigrateMigrateContainer.tsx
│ │ │ ├── onboarding/
│ │ │ │ └── ui/
│ │ │ │ ├── LandingPage.tsx
│ │ │ │ └── OnboardingSignInPage.tsx
│ │ │ ├── workspace/
│ │ │ │ └── model/
│ │ │ │ └── hooks/
│ │ │ │ ├── usePreviewDevServer.ts
│ │ │ │ └── useWorkspaceNotes.ts
│ │ │ └── workspace-chat/
│ │ │ ├── model/
│ │ │ │ ├── contexts/
│ │ │ │ │ ├── ApprovalFeedbackContext.tsx
│ │ │ │ │ ├── EntriesContext.tsx
│ │ │ │ │ ├── MessageEditContext.tsx
│ │ │ │ │ └── RetryUiContext.tsx
│ │ │ │ ├── conversation-row-model.ts
│ │ │ │ ├── conversation-scroll-commands.ts
│ │ │ │ ├── deriveConversationEntries.ts
│ │ │ │ ├── deriveConversationSemanticTimeline.ts
│ │ │ │ ├── deriveConversationTimeline.ts
│ │ │ │ ├── deriveConversationTurns.ts
│ │ │ │ ├── hooks/
│ │ │ │ │ ├── useApprovalMutation.ts
│ │ │ │ │ ├── useConversationHistory.ts
│ │ │ │ │ ├── useCreateSession.ts
│ │ │ │ │ ├── useMessageEditRetry.ts
│ │ │ │ │ ├── useResetProcess.ts
│ │ │ │ │ ├── useResetProcessMutation.ts
│ │ │ │ │ ├── useSessionAttachments.ts
│ │ │ │ │ ├── useSessionMessageEditor.ts
│ │ │ │ │ ├── useSessionQueueInteraction.ts
│ │ │ │ │ ├── useSessionSend.ts
│ │ │ │ │ ├── useTodos.ts
│ │ │ │ │ └── useWorkspaceBranch.ts
│ │ │ │ ├── store/
│ │ │ │ │ └── useInspectModeStore.ts
│ │ │ │ ├── useConversationVirtualizer.ts
│ │ │ │ └── useScrollCommandExecutor.ts
│ │ │ └── ui/
│ │ │ ├── ConversationListContainer.tsx
│ │ │ ├── DisplayConversationEntry.tsx
│ │ │ └── SessionChatBoxContainer.tsx
│ │ ├── i18n/
│ │ │ ├── config.ts
│ │ │ ├── index.ts
│ │ │ ├── languages.ts
│ │ │ └── locales/
│ │ │ ├── en/
│ │ │ │ ├── common.json
│ │ │ │ ├── organization.json
│ │ │ │ ├── projects.json
│ │ │ │ ├── settings.json
│ │ │ │ └── tasks.json
│ │ │ ├── es/
│ │ │ │ ├── common.json
│ │ │ │ ├── organization.json
│ │ │ │ ├── projects.json
│ │ │ │ ├── settings.json
│ │ │ │ └── tasks.json
│ │ │ ├── fr/
│ │ │ │ ├── common.json
│ │ │ │ ├── organization.json
│ │ │ │ ├── projects.json
│ │ │ │ ├── settings.json
│ │ │ │ └── tasks.json
│ │ │ ├── ja/
│ │ │ │ ├── common.json
│ │ │ │ ├── organization.json
│ │ │ │ ├── projects.json
│ │ │ │ ├── settings.json
│ │ │ │ └── tasks.json
│ │ │ ├── ko/
│ │ │ │ ├── common.json
│ │ │ │ ├── organization.json
│ │ │ │ ├── projects.json
│ │ │ │ ├── settings.json
│ │ │ │ └── tasks.json
│ │ │ ├── zh-Hans/
│ │ │ │ ├── common.json
│ │ │ │ ├── organization.json
│ │ │ │ ├── projects.json
│ │ │ │ ├── settings.json
│ │ │ │ └── tasks.json
│ │ │ └── zh-Hant/
│ │ │ ├── common.json
│ │ │ ├── organization.json
│ │ │ ├── projects.json
│ │ │ ├── settings.json
│ │ │ └── tasks.json
│ │ ├── integrations/
│ │ │ ├── remote/
│ │ │ │ └── IssueProvider.tsx
│ │ │ └── vscode/
│ │ │ ├── ContextMenu.tsx
│ │ │ └── bridge.ts
│ │ ├── mock/
│ │ │ └── normalized_entries.json
│ │ ├── pages/
│ │ │ ├── kanban/
│ │ │ │ ├── IssueCommentsSectionContainer.tsx
│ │ │ │ ├── IssueRelationshipsSectionContainer.tsx
│ │ │ │ ├── IssueSubIssuesSectionContainer.tsx
│ │ │ │ ├── IssueWorkspacesSectionContainer.tsx
│ │ │ │ ├── KanbanIssuePanelContainer.tsx
│ │ │ │ ├── LocalProjectKanban.tsx
│ │ │ │ ├── ProjectKanban.tsx
│ │ │ │ ├── ProjectRightSidebarContainer.tsx
│ │ │ │ └── kanban-issue-panel-state.ts
│ │ │ ├── migrate/
│ │ │ │ └── MigratePage.tsx
│ │ │ ├── root/
│ │ │ │ └── RootRedirectPage.tsx
│ │ │ └── workspaces/
│ │ │ ├── AppBarNotificationBellContainer.tsx
│ │ │ ├── ChangesPanelContainer.tsx
│ │ │ ├── CommentWidgetLine.tsx
│ │ │ ├── ContextBarContainer.tsx
│ │ │ ├── ElectricTestPage.tsx
│ │ │ ├── FileTreeContainer.tsx
│ │ │ ├── GitHubCommentRenderer.tsx
│ │ │ ├── GitPanelContainer.tsx
│ │ │ ├── LogsContentContainer.tsx
│ │ │ ├── NotificationsPage.tsx
│ │ │ ├── PierreDiffCard.tsx
│ │ │ ├── PreviewBrowserContainer.tsx
│ │ │ ├── PreviewControlsContainer.tsx
│ │ │ ├── ProcessListContainer.tsx
│ │ │ ├── ReviewCommentRenderer.tsx
│ │ │ ├── RightSidebar.tsx
│ │ │ ├── VSCodeWorkspacePage.tsx
│ │ │ ├── WorkspaceNotesContainer.tsx
│ │ │ ├── Workspaces.tsx
│ │ │ ├── WorkspacesLanding.tsx
│ │ │ ├── WorkspacesLayout.tsx
│ │ │ ├── WorkspacesMainContainer.tsx
│ │ │ └── WorkspacesSidebarContainer.tsx
│ │ ├── project-routes/
│ │ │ ├── ProjectFallbackPage.tsx
│ │ │ └── project-search.ts
│ │ ├── shared/
│ │ │ ├── actions/
│ │ │ │ └── index.ts
│ │ │ ├── command-bar/
│ │ │ │ └── actions/
│ │ │ │ ├── pages.ts
│ │ │ │ └── useActionVisibility.ts
│ │ │ ├── components/
│ │ │ │ ├── AgentIcon.tsx
│ │ │ │ ├── CopyButton.tsx
│ │ │ │ ├── CreateChatBoxContainer.tsx
│ │ │ │ ├── CreateModeRepoPickerBar.tsx
│ │ │ │ ├── IdeIcon.tsx
│ │ │ │ ├── ModelSelectorContainer.tsx
│ │ │ │ ├── NormalizedConversation/
│ │ │ │ │ ├── EditDiffRenderer.tsx
│ │ │ │ │ ├── FileChangeRenderer.tsx
│ │ │ │ │ ├── FileContentView.tsx
│ │ │ │ │ ├── PendingApprovalEntry.tsx
│ │ │ │ │ └── RetryEditorInline.tsx
│ │ │ │ ├── OpenInIdeButton.tsx
│ │ │ │ ├── RawLogText.tsx
│ │ │ │ ├── SearchableTagDropdownContainer.tsx
│ │ │ │ ├── SimpleMarkdown.tsx
│ │ │ │ ├── TagManager.tsx
│ │ │ │ ├── TerminalPanelContainer.tsx
│ │ │ │ ├── VariantSelector.tsx
│ │ │ │ ├── VirtualizedProcessLogs.tsx
│ │ │ │ ├── WYSIWYGEditor.tsx
│ │ │ │ ├── XTermInstance.tsx
│ │ │ │ ├── common/
│ │ │ │ │ └── ProfileVariantBadge.tsx
│ │ │ │ ├── org/
│ │ │ │ │ ├── MemberListItem.tsx
│ │ │ │ │ └── PendingInvitationItem.tsx
│ │ │ │ ├── settings/
│ │ │ │ │ └── ExecutorProfileSelector.tsx
│ │ │ │ ├── tasks/
│ │ │ │ │ ├── AgentSelector.tsx
│ │ │ │ │ ├── BranchSelector.tsx
│ │ │ │ │ ├── ConfigSelector.tsx
│ │ │ │ │ ├── RepoBranchSelector.tsx
│ │ │ │ │ ├── RepoSelector.tsx
│ │ │ │ │ ├── TaskDetails/
│ │ │ │ │ │ ├── ProcessLogsViewer.tsx
│ │ │ │ │ │ └── ProcessesTab.tsx
│ │ │ │ │ ├── Toolbar/
│ │ │ │ │ │ └── GitOperations.tsx
│ │ │ │ │ └── UserAvatar.tsx
│ │ │ │ └── ui-new/
│ │ │ │ └── containers/
│ │ │ │ ├── AppBarUserPopoverContainer.tsx
│ │ │ │ ├── ColorPickerContainer.tsx
│ │ │ │ ├── NavbarContainer.tsx
│ │ │ │ ├── RemoteIssueLink.tsx
│ │ │ │ ├── SearchableDropdownContainer.tsx
│ │ │ │ └── SharedAppLayout.tsx
│ │ │ ├── constants/
│ │ │ │ └── processes.ts
│ │ │ ├── dialogs/
│ │ │ │ ├── auth/
│ │ │ │ │ └── GhCliSetupDialog.tsx
│ │ │ │ ├── command-bar/
│ │ │ │ │ ├── BranchRebaseDialog.tsx
│ │ │ │ │ ├── ChangeTargetBranchDialog.tsx
│ │ │ │ │ ├── CommandBarDialog.tsx
│ │ │ │ │ ├── CreatePRDialog.tsx
│ │ │ │ │ ├── CreateWorkspaceFromPrDialog.tsx
│ │ │ │ │ ├── EditBranchNameDialog.tsx
│ │ │ │ │ ├── EditorSelectionDialog.tsx
│ │ │ │ │ ├── ForcePushDialog.tsx
│ │ │ │ │ ├── GitActionsDialog.tsx
│ │ │ │ │ ├── RebaseDialog.tsx
│ │ │ │ │ ├── SelectionDialog.tsx
│ │ │ │ │ ├── StartReviewDialog.tsx
│ │ │ │ │ ├── ViewProcessesDialog.tsx
│ │ │ │ │ ├── WorkspaceSelectionDialog.tsx
│ │ │ │ │ ├── commandBar/
│ │ │ │ │ │ ├── injectSearchMatches.ts
│ │ │ │ │ │ ├── useCommandBarState.ts
│ │ │ │ │ │ └── useResolvedPage.ts
│ │ │ │ │ └── selections/
│ │ │ │ │ ├── ProjectSelectionDialog.tsx
│ │ │ │ │ ├── branchSelection.ts
│ │ │ │ │ ├── prioritySelection.ts
│ │ │ │ │ ├── relationshipSelection.ts
│ │ │ │ │ ├── repoSelection.ts
│ │ │ │ │ ├── statusSelection.ts
│ │ │ │ │ └── subIssueSelection.ts
│ │ │ │ ├── global/
│ │ │ │ │ ├── OAuthDialog.tsx
│ │ │ │ │ └── ReleaseNotesDialog.tsx
│ │ │ │ ├── kanban/
│ │ │ │ │ ├── AssigneeSelectionDialog.tsx
│ │ │ │ │ └── KanbanFiltersDialog.tsx
│ │ │ │ ├── org/
│ │ │ │ │ ├── CreateOrganizationDialog.tsx
│ │ │ │ │ ├── CreateRemoteProjectDialog.tsx
│ │ │ │ │ ├── DeleteRemoteProjectDialog.tsx
│ │ │ │ │ └── InviteMemberDialog.tsx
│ │ │ │ ├── scripts/
│ │ │ │ │ └── ScriptFixerDialog.tsx
│ │ │ │ ├── settings/
│ │ │ │ │ ├── CreateConfigurationDialog.tsx
│ │ │ │ │ ├── DeleteConfigurationDialog.tsx
│ │ │ │ │ ├── SettingsDialog.tsx
│ │ │ │ │ └── settings/
│ │ │ │ │ ├── AgentsSettingsSection.tsx
│ │ │ │ │ ├── ExecutorConfigForm.tsx
│ │ │ │ │ ├── GeneralSettingsSection.tsx
│ │ │ │ │ ├── McpSettingsSection.tsx
│ │ │ │ │ ├── OrganizationsSettingsSection.tsx
│ │ │ │ │ ├── RelaySettingsSection.tsx
│ │ │ │ │ ├── RemoteProjectsSettingsSection.tsx
│ │ │ │ │ ├── ReposSettingsSection.tsx
│ │ │ │ │ ├── SettingsComponents.tsx
│ │ │ │ │ ├── SettingsDirtyContext.tsx
│ │ │ │ │ ├── SettingsSection.tsx
│ │ │ │ │ ├── rjsf/
│ │ │ │ │ │ ├── Fields.tsx
│ │ │ │ │ │ ├── Templates.tsx
│ │ │ │ │ │ ├── Widgets.tsx
│ │ │ │ │ │ └── theme.ts
│ │ │ │ │ └── useRelayRemoteHostMutations.ts
│ │ │ │ ├── shared/
│ │ │ │ │ ├── ConfirmDialog.tsx
│ │ │ │ │ ├── FolderPickerDialog.tsx
│ │ │ │ │ ├── KeyboardShortcutsDialog.tsx
│ │ │ │ │ ├── LoginRequiredPrompt.tsx
│ │ │ │ │ ├── TagEditDialog.tsx
│ │ │ │ │ └── WorkspacesGuideDialog.tsx
│ │ │ │ ├── tasks/
│ │ │ │ │ ├── PrCommentsDialog.tsx
│ │ │ │ │ ├── ResolveConflictsDialog.tsx
│ │ │ │ │ └── RestoreLogsDialog.tsx
│ │ │ │ └── wysiwyg/
│ │ │ │ └── ImagePreviewDialog.tsx
│ │ │ ├── hooks/
│ │ │ │ ├── ApprovalForm.tsx
│ │ │ │ ├── ChangesViewProvider.tsx
│ │ │ │ ├── GitOperationsContext.tsx
│ │ │ │ ├── ProcessSelectionContext.tsx
│ │ │ │ ├── ReviewProvider.tsx
│ │ │ │ ├── TabNavigationContext.tsx
│ │ │ │ ├── auth/
│ │ │ │ │ ├── useAuth.ts
│ │ │ │ │ ├── useAuthMutations.ts
│ │ │ │ │ ├── useAuthStatus.ts
│ │ │ │ │ └── useCurrentUser.ts
│ │ │ │ ├── organizationKeys.ts
│ │ │ │ ├── useActionVisibilityContext.ts
│ │ │ │ ├── useActions.ts
│ │ │ │ ├── useAllOrganizationProjects.ts
│ │ │ │ ├── useAppNavigation.ts
│ │ │ │ ├── useAppRuntime.tsx
│ │ │ │ ├── useApprovals.ts
│ │ │ │ ├── useAttachmentUrl.ts
│ │ │ │ ├── useAzureAttachments.ts
│ │ │ │ ├── useBranchStatus.ts
│ │ │ │ ├── useChangeTargetBranch.ts
│ │ │ │ ├── useChangesView.ts
│ │ │ │ ├── useCommandBarShortcut.ts
│ │ │ │ ├── useContextBarPosition.ts
│ │ │ │ ├── useConversationHistory/
│ │ │ │ │ ├── constants.ts
│ │ │ │ │ └── types.ts
│ │ │ │ ├── useCreateAttachments.ts
│ │ │ │ ├── useCreateWorkspace.ts
│ │ │ │ ├── useCurrentAppDestination.ts
│ │ │ │ ├── useCurrentKanbanRouteState.ts
│ │ │ │ ├── useDebouncedCallback.ts
│ │ │ │ ├── useDevServer.ts
│ │ │ │ ├── useDiffStream.ts
│ │ │ │ ├── useDiffSummary.ts
│ │ │ │ ├── useDiscordOnlineCount.ts
│ │ │ │ ├── useExecutionProcesses.ts
│ │ │ │ ├── useExecutionProcessesContext.ts
│ │ │ │ ├── useExecutorConfig.ts
│ │ │ │ ├── useExecutorDiscovery.ts
│ │ │ │ ├── useForcePush.ts
│ │ │ │ ├── useGitHubComments.ts
│ │ │ │ ├── useGitHubStars.ts
│ │ │ │ ├── useGitOperations.ts
│ │ │ │ ├── useIsMobile.ts
│ │ │ │ ├── useIssueContext.ts
│ │ │ │ ├── useIssueMultiSelect.ts
│ │ │ │ ├── useJsonPatchWsStream.ts
│ │ │ │ ├── useKanbanIssueComposerScratch.ts
│ │ │ │ ├── useLocalStorageScratch.ts
│ │ │ │ ├── useLogStream.ts
│ │ │ │ ├── useLogsPanel.ts
│ │ │ │ ├── useMerge.ts
│ │ │ │ ├── useNotificationMembers.ts
│ │ │ │ ├── useNotifications.ts
│ │ │ │ ├── useOpenInEditor.ts
│ │ │ │ ├── useOrgContext.ts
│ │ │ │ ├── useOrganizationInvitations.ts
│ │ │ │ ├── useOrganizationMembers.ts
│ │ │ │ ├── useOrganizationMutations.ts
│ │ │ │ ├── useOrganizationProjects.ts
│ │ │ │ ├── useOrganizationSelection.ts
│ │ │ │ ├── usePageTitle.ts
│ │ │ │ ├── usePrComments.ts
│ │ │ │ ├── usePresetOptions.ts
│ │ │ │ ├── usePreviewNavigation.ts
│ │ │ │ ├── usePreviewSettings.ts
│ │ │ │ ├── usePreviewUrl.ts
│ │ │ │ ├── useProfiles.ts
│ │ │ │ ├── useProjectContext.ts
│ │ │ │ ├── useProjectRepoDefaults.ts
│ │ │ │ ├── useProjectWorkspaceCreateDraft.ts
│ │ │ │ ├── usePush.ts
│ │ │ │ ├── useRebase.ts
│ │ │ │ ├── useReleases.ts
│ │ │ │ ├── useRenameBranch.ts
│ │ │ │ ├── useRepoBranchSelection.ts
│ │ │ │ ├── useRepoBranches.ts
│ │ │ │ ├── useRetryProcess.ts
│ │ │ │ ├── useRetryUi.ts
│ │ │ │ ├── useReview.ts
│ │ │ │ ├── useScratch.ts
│ │ │ │ ├── useScriptPlaceholders.ts
│ │ │ │ ├── useScrollSyncStateMachine.ts
│ │ │ │ ├── useSyncErrorContext.ts
│ │ │ │ ├── useTaskWorkspaces.ts
│ │ │ │ ├── useTerminal.ts
│ │ │ │ ├── useTheme.ts
│ │ │ │ ├── useUiPreferencesScratch.ts
│ │ │ │ ├── useUserContext.ts
│ │ │ │ ├── useUserOrganizations.ts
│ │ │ │ ├── useUserSystem.ts
│ │ │ │ ├── useVariant.ts
│ │ │ │ ├── useWorkspace.ts
│ │ │ │ ├── useWorkspaceConflicts.ts
│ │ │ │ ├── useWorkspaceContext.ts
│ │ │ │ ├── useWorkspaceCreateDefaults.ts
│ │ │ │ ├── useWorkspaceExecution.ts
│ │ │ │ ├── useWorkspaceRecord.ts
│ │ │ │ ├── useWorkspaceRepo.ts
│ │ │ │ ├── useWorkspaceSessions.ts
│ │ │ │ ├── useWorkspaceSidebarPreviewController.ts
│ │ │ │ ├── useWorkspaces.ts
│ │ │ │ └── workspaceSummaryKeys.ts
│ │ │ ├── integrations/
│ │ │ │ └── electric/
│ │ │ │ └── hooks.ts
│ │ │ ├── keyboard/
│ │ │ │ ├── SequenceIndicator.tsx
│ │ │ │ ├── SequenceTracker.tsx
│ │ │ │ ├── hooks.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── registry.ts
│ │ │ │ ├── types.ts
│ │ │ │ ├── useIssueShortcuts.ts
│ │ │ │ ├── useSemanticKey.ts
│ │ │ │ └── useWorkspaceShortcuts.ts
│ │ │ ├── lib/
│ │ │ │ ├── StyleOverride.tsx
│ │ │ │ ├── TruncatePath.tsx
│ │ │ │ ├── aggregateEntries.ts
│ │ │ │ ├── api.ts
│ │ │ │ ├── attachmentUtils.ts
│ │ │ │ ├── auth/
│ │ │ │ │ ├── runtime.ts
│ │ │ │ │ └── tokenManager.ts
│ │ │ │ ├── clipboard.ts
│ │ │ │ ├── colors.ts
│ │ │ │ ├── conflicts.ts
│ │ │ │ ├── date.ts
│ │ │ │ ├── devServerUtils.ts
│ │ │ │ ├── diffDataAdapter.ts
│ │ │ │ ├── diffHeightEstimate.ts
│ │ │ │ ├── diffStatsParser.ts
│ │ │ │ ├── electric/
│ │ │ │ │ ├── collections.ts
│ │ │ │ │ └── types.ts
│ │ │ │ ├── executor.ts
│ │ │ │ ├── extToLanguage.ts
│ │ │ │ ├── fileTreeUtils.ts
│ │ │ │ ├── fileTypeIcon.ts
│ │ │ │ ├── firstProjectDestination.ts
│ │ │ │ ├── hmrContext.ts
│ │ │ │ ├── id.ts
│ │ │ │ ├── ideName.ts
│ │ │ │ ├── jsonPatch.ts
│ │ │ │ ├── localApiTransport.ts
│ │ │ │ ├── mcpStrategies.ts
│ │ │ │ ├── modals.ts
│ │ │ │ ├── modelSelector.ts
│ │ │ │ ├── notificationMessage.ts
│ │ │ │ ├── notifications.ts
│ │ │ │ ├── paths.ts
│ │ │ │ ├── platform.ts
│ │ │ │ ├── previewBridge.ts
│ │ │ │ ├── previewDevToolsBridge.ts
│ │ │ │ ├── projectOrder.ts
│ │ │ │ ├── promptMessage.ts
│ │ │ │ ├── queryClient.ts
│ │ │ │ ├── recentModels.ts
│ │ │ │ ├── relayBackendApi.ts
│ │ │ │ ├── relayClientIdentity.ts
│ │ │ │ ├── relayPairingStorage.ts
│ │ │ │ ├── relayPake.ts
│ │ │ │ ├── relaySigningSessionRefresh.ts
│ │ │ │ ├── remoteApi.ts
│ │ │ │ ├── resolveRelationships.ts
│ │ │ │ ├── routes/
│ │ │ │ │ └── appNavigation.ts
│ │ │ │ ├── scriptPlaceholders.ts
│ │ │ │ ├── searchTagsAndFiles.ts
│ │ │ │ ├── streamJsonPatchEntries.ts
│ │ │ │ ├── string.ts
│ │ │ │ ├── terminalTheme.ts
│ │ │ │ ├── theme.ts
│ │ │ │ ├── types.ts
│ │ │ │ ├── utils.ts
│ │ │ │ ├── virtuoso-modifiers.ts
│ │ │ │ ├── workspaceAttachments.ts
│ │ │ │ ├── workspaceCreateState.ts
│ │ │ │ ├── workspaceDefaults.ts
│ │ │ │ └── zoom.ts
│ │ │ ├── providers/
│ │ │ │ ├── ActionsProvider.tsx
│ │ │ │ ├── ExecutionProcessesProvider.tsx
│ │ │ │ ├── LogsPanelProvider.tsx
│ │ │ │ ├── SyncErrorProvider.tsx
│ │ │ │ ├── TerminalProvider.tsx
│ │ │ │ ├── WorkspaceProvider.tsx
│ │ │ │ ├── auth/
│ │ │ │ │ └── LocalAuthProvider.tsx
│ │ │ │ └── remote/
│ │ │ │ ├── OrgProvider.tsx
│ │ │ │ ├── ProjectProvider.tsx
│ │ │ │ └── UserProvider.tsx
│ │ │ ├── stores/
│ │ │ │ ├── useAppUpdateStore.ts
│ │ │ │ ├── useDiffViewStore.ts
│ │ │ │ ├── useExpandableStore.ts
│ │ │ │ ├── useIssueSelectionStore.ts
│ │ │ │ ├── useKanbanIssueComposerStore.ts
│ │ │ │ ├── useOrganizationStore.ts
│ │ │ │ └── useUiPreferencesStore.ts
│ │ │ └── types/
│ │ │ ├── actions.ts
│ │ │ ├── attempt.ts
│ │ │ ├── commandBar.ts
│ │ │ ├── createMode.ts
│ │ │ ├── diff.ts
│ │ │ ├── fileTree.ts
│ │ │ ├── logs.ts
│ │ │ ├── modal-args.d.ts
│ │ │ ├── modals.ts
│ │ │ ├── previewDevTools.ts
│ │ │ ├── selectionItems.ts
│ │ │ ├── tabs.ts
│ │ │ ├── tanstack-history.d.ts
│ │ │ └── virtual-executor-schemas.d.ts
│ │ ├── styles/
│ │ │ ├── diff-style-overrides.css
│ │ │ ├── edit-diff-overrides.css
│ │ │ └── new/
│ │ │ └── index.css
│ │ ├── test/
│ │ │ └── fixtures/
│ │ │ └── normalized_entries.json
│ │ └── vite-env.d.ts
│ └── tsconfig.json
├── pnpm-workspace.yaml
├── rust-toolchain.toml
├── rustfmt.toml
├── scripts/
│ ├── build-bippy-bundle.mjs
│ ├── build-tauri-msi.js
│ ├── check-i18n.sh
│ ├── check-legacy-frontend-paths.sh
│ ├── check-unused-i18n-keys.mjs
│ ├── clang
│ ├── dialog-import-rewrite-map.tsv
│ ├── generate-desktop-manifest.js
│ ├── generate-tauri-update-json.js
│ ├── legacy-frontend-paths-allowlist.txt
│ ├── migrate-remote-web-structure.mjs
│ ├── prepare-db.js
│ ├── refactor-web-shims.mjs
│ ├── relay-test-client/
│ │ ├── README.md
│ │ └── index.html
│ ├── ring-cc-wrapper.sh
│ └── setup-dev-environment.js
└── shared/
├── jwt.ts
├── remote-types.ts
├── schemas/
│ ├── amp.json
│ ├── claude_code.json
│ ├── codex.json
│ ├── copilot.json
│ ├── cursor_agent.json
│ ├── droid.json
│ ├── gemini.json
│ ├── opencode.json
│ └── qwen_code.json
└── types.ts
================================================
FILE CONTENTS
================================================
================================================
FILE: .cargo/config.toml
================================================
[target.x86_64-apple-darwin]
rustflags = [
"-C", "link-arg=-framework",
"-C", "link-arg=AppKit",
"-C", "link-arg=-framework",
"-C", "link-arg=ApplicationServices",
"-C", "link-arg=-framework",
"-C", "link-arg=Foundation",
]
[target.aarch64-apple-darwin]
rustflags = [
"-C", "link-arg=-framework",
"-C", "link-arg=AppKit",
"-C", "link-arg=-framework",
"-C", "link-arg=ApplicationServices",
"-C", "link-arg=-framework",
"-C", "link-arg=Foundation",
]
[target.x86_64-pc-windows-msvc]
rustflags = ["-C", "link-arg=/DEBUG:FASTLINK"]
[target.aarch64-pc-windows-msvc]
rustflags = ["-C", "link-arg=/DEBUG:FASTLINK"]
================================================
FILE: .dockerignore
================================================
# Node modules
node_modules/
**/node_modules
.pnpm-store/
.pnpm/
npm-debug.log*
yarn-debug.log*
yarn-error.log*
lerna-debug.log*
# Build artifacts
**/target/
dist/
build/
*.tgz
*.tar.gz
remote-frontend/dist/
# IDE and editor files
.vscode/
.idea/
*.swp
*.swo
*~
# OS generated files
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db
# Git
.git/
.gitignore
# Repo content not needed for Docker builds
.github/
docs/
dev_assets/
dev_assets_seed/
# Docker
Dockerfile*
.dockerignore
# Environment files
.env
.env.local
.env.development.local
.env.test.local
.env.production.local
# Logs
logs/
*.log
# Runtime data
pids/
*.pid
*.seed
*.pid.lock
# Coverage directory used by tools like istanbul
coverage/
# Temporary folders
tmp/
temp/
================================================
FILE: .github/actions/cargo-checks-common-setup/action.yml
================================================
name: 'Cargo checks common setup'
description: 'Common setup for cargo checks in CI'
inputs:
toolchain:
description: 'Rust toolchain version'
required: true
components:
description: 'Comma-separated rustup components'
required: false
default: ''
cache-key:
description: 'Shared key for rust-cache'
required: true
setup-node:
description: 'Whether to install Node.js and pnpm'
required: false
default: 'false'
setup-sqlx-cli:
description: 'Whether to install sqlx-cli'
required: false
default: 'false'
runs:
using: 'composite'
steps:
- name: Setup Node
if: ${{ inputs.setup-node == 'true' }}
uses: ./.github/actions/setup-node
- name: Setup sccache
uses: BloopAI/sccache-action@main
- name: Install Rust toolchain
if: ${{ inputs.components == '' }}
uses: dtolnay/rust-toolchain@stable
with:
toolchain: ${{ inputs.toolchain }}
- name: Install Rust toolchain with components
if: ${{ inputs.components != '' }}
uses: dtolnay/rust-toolchain@stable
with:
toolchain: ${{ inputs.toolchain }}
components: ${{ inputs.components }}
- name: Cache Rust dependencies
uses: Swatinem/rust-cache@v2
env:
RUST_CACHE_DEBUG: true
with:
workspaces: "."
cache-provider: "github"
cache-on-failure: true
shared-key: ${{ inputs.cache-key }}
cache-all-crates: true
- name: Install sqlx-cli
if: ${{ inputs.setup-sqlx-cli == 'true' }}
uses: taiki-e/cache-cargo-install-action@34ce5120836e5f9f1508d8713d7fdea0e8facd6f # v3.0.1
with:
tool: sqlx-cli
no-default-features: true
features: sqlite,postgres
================================================
FILE: .github/actions/setup-jsign/action.yml
================================================
name: 'Setup Jsign'
description: 'Downloads and caches Jsign for cross-platform Windows code signing'
inputs:
version:
description: 'Jsign version'
required: false
default: '7.4'
sha256:
description: 'Expected SHA256 of the jar'
required: false
default: '2abf2ade9ea322acc2d60c24794eadc465ff9380938fca4c932d09e0b25f1c28'
outputs:
jar-path:
description: 'Path to the Jsign jar'
value: ${{ steps.path.outputs.jar }}
runs:
using: 'composite'
steps:
- name: Set jar path
id: path
shell: bash
run: echo "jar=${{ runner.temp }}/jsign-${{ inputs.version }}.jar" >> $GITHUB_OUTPUT
- name: Cache Jsign
id: cache
uses: actions/cache@v5
with:
path: ${{ steps.path.outputs.jar }}
key: jsign-${{ inputs.version }}-${{ inputs.sha256 }}
- name: Download Jsign
if: steps.cache.outputs.cache-hit != 'true'
shell: bash
run: |
curl -sL "https://github.com/ebourg/jsign/releases/download/${{ inputs.version }}/jsign-${{ inputs.version }}.jar" \
-o "${{ steps.path.outputs.jar }}"
- name: Verify checksum
shell: bash
run: echo "${{ inputs.sha256 }} ${{ steps.path.outputs.jar }}" | sha256sum -c -
================================================
FILE: .github/actions/setup-node/action.yml
================================================
name: 'Setup Node.js and pnpm'
description: 'Sets up Node.js and pnpm with caching'
runs:
using: 'composite'
steps:
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
registry-url: 'https://registry.npmjs.org'
- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
version: ${{ env.PNPM_VERSION }}
- name: Get pnpm store directory
shell: bash
run: |
echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV
- name: Setup pnpm cache
uses: actions/cache@v4
with:
path: ${{ env.STORE_PATH }}
key: ${{ runner.os }}-${{ runner.arch }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-${{ runner.arch }}-pnpm-store-
================================================
FILE: .github/workflows/pre-release.yml
================================================
name: Create GitHub Pre-Release
on:
workflow_dispatch:
inputs:
version_type:
description: "Version bump type"
required: true
default: "patch"
type: choice
options:
- patch
- minor
- major
- prerelease
concurrency:
group: release-${{ github.ref_name }} # allow concurrent prerelease from different branches
cancel-in-progress: true
permissions:
contents: write
packages: write
pull-requests: write
env:
NODE_VERSION: 22
PNPM_VERSION: 10.13.1
RUST_TOOLCHAIN: nightly-2025-12-04
CARGO_XWIN_VERSION: 0.20.2
jobs:
bump-version:
runs-on: blacksmith-4vcpu-ubuntu-2404
outputs:
new_tag: ${{ steps.version.outputs.new_tag }}
new_version: ${{ steps.version.outputs.new_version }}
branch_suffix: ${{ steps.branch.outputs.suffix }}
steps:
- name: Cache cargo-edit
uses: actions/cache@v5
id: cache-cargo-edit
with:
path: ~/.cargo/bin/cargo-set-version
key: cargo-edit-${{ runner.os }}-${{ env.RUST_TOOLCHAIN }}
- name: Install cargo-edit
if: steps.cache-cargo-edit.outputs.cache-hit != 'true'
run: cargo install cargo-edit
- uses: actions/checkout@v6
with:
token: ${{ secrets.GITHUB_TOKEN }}
ssh-key: ${{ secrets.DEPLOY_KEY }}
- name: setup node
uses: ./.github/actions/setup-node
- name: Setup SSH Agent for private dependencies
id: ssh-setup
if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository }}
uses: webfactory/ssh-agent@v0.9.0
with:
ssh-private-key: ${{ secrets.VK_PRIVATE_DEPLOY_KEY }}
- name: Generate branch suffix
id: branch
run: |
branch_name="${{ github.ref_name }}"
# Get last 6 characters of branch name, remove all special chars (including dashes)
suffix=$(echo "$branch_name" | tail -c 7 | sed 's/[^a-zA-Z0-9]//g' | tr '[:upper:]' '[:lower:]')
echo "Branch: $branch_name"
echo "Suffix: $suffix"
echo "suffix=$suffix" >> $GITHUB_OUTPUT
- name: Determine and update versions
id: version
run: |
# Get the latest version from npm registry
latest_npm_version=$(npm view vibe-kanban version 2>/dev/null || echo "0.0.0")
echo "Latest npm version: $latest_npm_version"
# Get current repo version
current_repo_version=$(node -p "require('./package.json').version")
echo "Current repo version: $current_repo_version"
# Use the higher of the two versions as the base (prevents downgrade errors with cargo set-version)
base_version=$(node -e "
const npm = '$latest_npm_version'.split('.').map(Number);
const repo = '$current_repo_version'.split('.').map(Number);
for (let i = 0; i < 3; i++) {
if ((npm[i] || 0) > (repo[i] || 0)) { console.log('$latest_npm_version'); process.exit(); }
if ((npm[i] || 0) < (repo[i] || 0)) { console.log('$current_repo_version'); process.exit(); }
}
console.log('$current_repo_version');
")
echo "Base version for bump: $base_version"
timestamp=$(date +%Y%m%d%H%M%S)
# Update root package.json based on base version
if [[ "${{ github.event.inputs.version_type }}" == "prerelease" ]]; then
# For prerelease, use current package.json version and add branch suffix
npm version prerelease --preid="${{ steps.branch.outputs.suffix }}" --no-git-tag-version
new_version=$(node -p "require('./package.json').version")
new_tag="v${new_version}.${timestamp}"
else
# For regular releases, use base version and bump it
npm version $base_version --no-git-tag-version --allow-same-version
npm version ${{ github.event.inputs.version_type }} --no-git-tag-version
new_version=$(node -p "require('./package.json').version")
new_tag="v${new_version}-${timestamp}"
fi
# Update npx-cli package.json to match
(
cd npx-cli
npm version $new_version --no-git-tag-version --allow-same-version
)
# Update web app package.json to match
(
cd packages/local-web
npm version $new_version --no-git-tag-version --allow-same-version
)
cargo set-version --workspace "$new_version"
node -e "
const fs = require('fs');
const path = 'crates/tauri-app/tauri.conf.json';
const conf = JSON.parse(fs.readFileSync(path, 'utf8'));
conf.version = '$new_version';
fs.writeFileSync(path, JSON.stringify(conf, null, 2) + '\n');
"
echo "New version: $new_version"
echo "new_version=$new_version" >> $GITHUB_OUTPUT
echo "new_tag=$new_tag" >> $GITHUB_OUTPUT
- name: Update remote crate lockfile
if: ${{ steps.ssh-setup.outcome == 'success' }}
run: cargo metadata --format-version 1 --manifest-path crates/remote/Cargo.toml > /dev/null
- name: Update relay-tunnel crate lockfile
run: cargo metadata --format-version 1 --manifest-path crates/relay-tunnel/Cargo.toml > /dev/null
- name: Stop SSH agent
if: ${{ steps.ssh-setup.outcome == 'success' }}
run: ssh-agent -k
- name: Commit changes and create tag
run: |
git config --local user.email "action@github.com"
git config --local user.name "GitHub Action"
git add package.json pnpm-lock.yaml npx-cli/package.json npx-cli/package-lock.json packages/local-web/package.json crates/tauri-app/tauri.conf.json Cargo.lock
git add $(find . -name Cargo.toml)
[ -f crates/remote/Cargo.lock ] && git add crates/remote/Cargo.lock || true
[ -f crates/relay-tunnel/Cargo.lock ] && git add crates/relay-tunnel/Cargo.lock || true
git commit -m "chore: bump version to ${{ steps.version.outputs.new_version }}"
git tag -a ${{ steps.version.outputs.new_tag }} -m "Release ${{ steps.version.outputs.new_tag }}"
git push
git push --tags
build-frontend:
needs: bump-version
runs-on: blacksmith-16vcpu-ubuntu-2404
env:
VITE_PUBLIC_REACT_VIRTUOSO_LICENSE_KEY: ${{ secrets.PUBLIC_REACT_VIRTUOSO_LICENSE_KEY }}
VITE_VK_SHARED_API_BASE: ${{ secrets.VK_SHARED_API_BASE }}
steps:
- uses: actions/checkout@v6
with:
ref: ${{ needs.bump-version.outputs.new_tag }}
- name: Setup Node
uses: ./.github/actions/setup-node
- name: Install dependencies
run: pnpm install
- name: Lint frontend
run: cd packages/local-web && npm run lint
- name: Type check frontend
run: cd packages/local-web && npx tsc --noEmit
- name: Build frontend
run: cd packages/local-web && npm run build
env:
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
VITE_POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }}
VITE_POSTHOG_API_ENDPOINT: ${{ secrets.POSTHOG_API_ENDPOINT }}
VITE_SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
- name: Create Sentry release
uses: getsentry/action-release@v3
env:
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
SENTRY_ORG: ${{ secrets.SENTRY_ORG }}
SENTRY_PROJECT: ${{ secrets.SENTRY_PROJECT }}
with:
release: ${{ needs.bump-version.outputs.new_version }}
environment: production
sourcemaps: "./packages/local-web/dist"
ignore_missing: true
- name: Upload frontend artifact
uses: actions/upload-artifact@v6
with:
name: frontend-dist
path: packages/local-web/dist/
retention-days: 1
build-backend:
needs: [bump-version, build-frontend]
runs-on: ${{ matrix.os }}
strategy:
# Platform matrix - keep target/name in sync with package-npx-cli job
matrix:
include:
- target: x86_64-unknown-linux-musl
os: blacksmith-16vcpu-ubuntu-2404
name: linux-x64
- target: aarch64-unknown-linux-musl
os: blacksmith-16vcpu-ubuntu-2404-arm
name: linux-arm64
- target: x86_64-pc-windows-msvc
os: blacksmith-16vcpu-ubuntu-2404
name: windows-x64
- target: x86_64-apple-darwin
os: macos-15-xlarge
name: macos-x64
- target: aarch64-apple-darwin
os: macos-15-xlarge
name: macos-arm64
- target: aarch64-pc-windows-msvc
os: blacksmith-16vcpu-ubuntu-2404
name: windows-arm64
env:
CARGO_INCREMENTAL: "0"
SCCACHE_GHA_ENABLED: "true"
RUSTC_WRAPPER: "sccache"
SCCACHE_CACHE_SIZE: "10G"
CARGO_HOME: ${{ github.workspace }}/.cargo
RUSTUP_HOME: ${{ github.workspace }}/.rustup
XWIN_CACHE_DIR: ${{ github.workspace }}/.xwin-cache
steps:
- uses: actions/checkout@v6
with:
ref: ${{ needs.bump-version.outputs.new_tag }}
- name: Setup sccache
uses: BloopAI/sccache-action@main
- name: Cache Rust toolchain
uses: actions/cache@v5
with:
path: .rustup/toolchains
key: rust-toolchain-${{ runner.os }}-${{ matrix.target }}-${{ env.RUST_TOOLCHAIN }}
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
toolchain: ${{ env.RUST_TOOLCHAIN }}
targets: ${{ matrix.target }}
components: rustfmt, clippy
- name: Install dependencies (Linux)
if: runner.os == 'Linux'
run: |
sudo apt-get update
DEBIAN_FRONTEND=noninteractive sudo apt-get install -y clang libclang-dev lld llvm nasm cmake ninja-build
if [[ "${{ matrix.target }}" == *"windows"* ]]; then
DEBIAN_FRONTEND=noninteractive sudo apt-get install -y clang-19 clang-tools-19 llvm-19 lld-19
echo "/usr/lib/llvm-19/bin" >> $GITHUB_PATH
fi
- name: Cache Cargo registry
uses: actions/cache@v5
with:
path: |
.cargo/registry/cache
.cargo/registry/index
.cargo/git/db
.cargo/bin
.cargo/.crates.toml
.cargo/.crates2.json
key: cargo-${{ runner.os }}-${{ env.RUST_TOOLCHAIN }}-${{ matrix.target }}-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
cargo-${{ runner.os }}-${{ env.RUST_TOOLCHAIN }}-${{ matrix.target }}-
- name: Install Zig
if: runner.os == 'Linux' && !contains(matrix.target, 'windows')
uses: BloopAI/setup-zig@main
with:
version: 0.15.2
- name: Install cargo zigbuild
if: runner.os == 'Linux' && !contains(matrix.target, 'windows')
run: cargo install --locked cargo-zigbuild --version 0.20.1
- name: Install cargo xwin
if: runner.os == 'Linux' && contains(matrix.target, 'windows')
run: cargo install --locked cargo-xwin --version ${{ env.CARGO_XWIN_VERSION }}
- name: Cache xwin downloads
if: runner.os == 'Linux' && contains(matrix.target, 'windows')
uses: actions/cache@v5
with:
path: ${{ github.workspace }}/.xwin-cache
key: xwin-${{ runner.os }}-${{ matrix.target }}-cargo-xwin-${{ env.CARGO_XWIN_VERSION }}
- name: Cache target
uses: actions/cache@v5
with:
path: target
key: target-${{ runner.os }}-${{ env.RUST_TOOLCHAIN }}-${{ matrix.target }}-${{ github.ref_name }}-${{ github.sha }}
restore-keys: |
target-${{ runner.os }}-${{ env.RUST_TOOLCHAIN }}-${{ matrix.target }}-${{ github.ref_name }}-
target-${{ runner.os }}-${{ env.RUST_TOOLCHAIN }}-${{ matrix.target }}-
- name: Setup cargo-sweep
shell: bash
run: |
cargo install --locked cargo-sweep --version 0.8.0
- name: Download frontend artifact
uses: actions/download-artifact@v7
with:
name: frontend-dist
path: packages/local-web/dist/
- name: Build backend (Linux)
if: runner.os == 'Linux' && !contains(matrix.target, 'windows')
run: |
cargo zigbuild --release --target ${{ matrix.target }} -p server -p mcp -p review --bin server --bin vibe-kanban-mcp --bin review
env:
POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }}
POSTHOG_API_ENDPOINT: ${{ secrets.POSTHOG_API_ENDPOINT }}
VK_SHARED_API_BASE: ${{ secrets.VK_SHARED_API_BASE }}
VK_SHARED_RELAY_API_BASE: ${{ secrets.VK_SHARED_RELAY_API_BASE }}
SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
- name: Build backend (macOS)
if: runner.os == 'macOS'
run: |
if [[ "${{ matrix.target }}" == "x86_64-apple-darwin" ]]; then
export MACOSX_DEPLOYMENT_TARGET=10.12
elif [[ "${{ matrix.target }}" == "aarch64-apple-darwin" ]]; then
export MACOSX_DEPLOYMENT_TARGET=11.0
fi
cargo build --release --target ${{ matrix.target }} -p server -p mcp -p review --bin server --bin vibe-kanban-mcp --bin review
env:
POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }}
POSTHOG_API_ENDPOINT: ${{ secrets.POSTHOG_API_ENDPOINT }}
VK_SHARED_API_BASE: ${{ secrets.VK_SHARED_API_BASE }}
VK_SHARED_RELAY_API_BASE: ${{ secrets.VK_SHARED_RELAY_API_BASE }}
SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
- name: Build backend (Windows)
if: runner.os == 'Linux' && contains(matrix.target, 'windows')
run: |
if [[ "${{ matrix.target }}" == "aarch64-pc-windows-msvc" ]]; then
# ring requires clang on arm64 windows. See https://github.com/briansmith/ring/issues/2117
chmod +x scripts/ring-cc-wrapper.sh scripts/clang
export PATH="${{ github.workspace }}/scripts:$PATH"
export RING_CC=/usr/lib/llvm-19/bin/clang
export DEFAULT_CC=clang-cl
export CC_aarch64_pc_windows_msvc="${{ github.workspace }}/scripts/ring-cc-wrapper.sh"
fi
cargo xwin build --cross-compiler clang-cl --release --target ${{ matrix.target }} -p server -p mcp -p review --bin server --bin vibe-kanban-mcp --bin review
env:
POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }}
POSTHOG_API_ENDPOINT: ${{ secrets.POSTHOG_API_ENDPOINT }}
VK_SHARED_API_BASE: ${{ secrets.VK_SHARED_API_BASE }}
VK_SHARED_RELAY_API_BASE: ${{ secrets.VK_SHARED_RELAY_API_BASE }}
SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
# Avoid aws-lc-sys CMake failures when Rust's `release` profile includes debug info.
# Without this, cmake-rs selects RelWithDebInfo and CMake fails when ASM is enabled.
CARGO_PROFILE_RELEASE_DEBUG: 0
- name: Setup Sentry CLI
uses: matbour/setup-sentry-cli@v2
with:
token: ${{ secrets.SENTRY_AUTH_TOKEN }}
organization: ${{ secrets.SENTRY_ORG }}
project: ${{ secrets.SENTRY_PROJECT }}
version: 2.21.2
- name: Upload source maps to Sentry
run: sentry-cli debug-files upload --include-sources target/${{ matrix.target }}/release
- name: Prepare binaries (non-macOS)
if: runner.os != 'macOS'
shell: bash
run: |
mkdir -p dist
if [[ "${{ matrix.name }}" == *"windows"* ]]; then
cp target/${{ matrix.target }}/release/server.exe dist/vibe-kanban-${{ matrix.name }}.exe
cp target/${{ matrix.target }}/release/vibe-kanban-mcp.exe dist/vibe-kanban-mcp-${{ matrix.name }}.exe
cp target/${{ matrix.target }}/release/review.exe dist/vibe-kanban-review-${{ matrix.name }}.exe
else
cp target/${{ matrix.target }}/release/server dist/vibe-kanban-${{ matrix.name }}
cp target/${{ matrix.target }}/release/vibe-kanban-mcp dist/vibe-kanban-mcp-${{ matrix.name }}
cp target/${{ matrix.target }}/release/review dist/vibe-kanban-review-${{ matrix.name }}
fi
# Code signing for macOS only
- name: Prepare Apple certificate (macOS)
if: runner.os == 'macOS'
run: |
echo "${{ secrets.APPLE_CERTIFICATE_P12_BASE64 }}" | base64 --decode > certificate.p12
- name: Write API Key to file
if: runner.os == 'macOS'
env:
API_KEY: ${{ secrets.APP_STORE_API_KEY }}
run: echo $API_KEY > app_store_key.json
- name: Sign main binary (macOS)
if: runner.os == 'macOS'
uses: BloopAI/apple-code-sign-action@v1
with:
input_path: target/${{ matrix.target }}/release/server
output_path: vibe-kanban
p12_file: certificate.p12
p12_password: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
sign: true
sign_args: "--code-signature-flags=runtime"
- name: Package main binary (macOS)
if: runner.os == 'macOS'
run: zip vibe-kanban.zip vibe-kanban
- name: Sign MCP binary (macOS)
if: runner.os == 'macOS'
uses: BloopAI/apple-code-sign-action@v1
with:
input_path: target/${{ matrix.target }}/release/vibe-kanban-mcp
output_path: vibe-kanban-mcp
p12_file: certificate.p12
p12_password: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
sign: true
sign_args: "--code-signature-flags=runtime"
- name: Package MCP binary (macOS)
if: runner.os == 'macOS'
run: zip vibe-kanban-mcp.zip vibe-kanban-mcp
- name: Sign Review binary (macOS)
if: runner.os == 'macOS'
uses: BloopAI/apple-code-sign-action@v1
with:
input_path: target/${{ matrix.target }}/release/review
output_path: vibe-kanban-review
p12_file: certificate.p12
p12_password: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
sign: true
sign_args: "--code-signature-flags=runtime"
- name: Package Review binary (macOS)
if: runner.os == 'macOS'
run: zip vibe-kanban-review.zip vibe-kanban-review
- name: Notarize signed binaries (macOS)
if: runner.os == 'macOS'
uses: BloopAI/apple-code-sign-action@main
continue-on-error: true
with:
input_path: |
vibe-kanban.zip
vibe-kanban-mcp.zip
vibe-kanban-review.zip
sign: false
notarize: true
app_store_connect_api_key_json_file: app_store_key.json
- name: Prepare signed binaries (macOS)
if: runner.os == 'macOS'
run: |
mkdir -p dist
cp vibe-kanban.zip dist/vibe-kanban-${{ matrix.name }}.zip
cp vibe-kanban-mcp.zip dist/vibe-kanban-mcp-${{ matrix.name }}.zip
cp vibe-kanban-review.zip dist/vibe-kanban-review-${{ matrix.name }}.zip
- name: Clean up certificates (macOS)
if: runner.os == 'macOS'
run: |
rm -f certificate.p12
rm -rf private_keys/
- name: Upload binary artifact
uses: actions/upload-artifact@v6
with:
name: backend-binary-${{ matrix.name }}
path: dist/
retention-days: 1
- name: Sweep Cargo target cache
shell: bash
run: |
cargo sweep --maxsize 10GB
cargo sweep --time 30
package-npx-cli:
needs: [bump-version, build-frontend, build-backend]
runs-on: blacksmith-4vcpu-ubuntu-2404
strategy:
# NOTE: This matrix must be kept in sync with build-backend job above
# GitHub Actions doesn't support YAML anchors, so duplication is unavoidable
matrix:
include:
- target: x86_64-unknown-linux-musl
name: linux-x64
binary: vibe-kanban
mcp_binary: vibe-kanban-mcp
review_binary: vibe-kanban-review
- target: x86_64-pc-windows-msvc
name: windows-x64
binary: vibe-kanban.exe
mcp_binary: vibe-kanban-mcp.exe
review_binary: vibe-kanban-review.exe
- target: x86_64-apple-darwin
name: macos-x64
binary: vibe-kanban
mcp_binary: vibe-kanban-mcp
review_binary: vibe-kanban-review
- target: aarch64-apple-darwin
name: macos-arm64
binary: vibe-kanban
mcp_binary: vibe-kanban-mcp
review_binary: vibe-kanban-review
- target: aarch64-pc-windows-msvc
name: windows-arm64
binary: vibe-kanban.exe
mcp_binary: vibe-kanban-mcp.exe
review_binary: vibe-kanban-review.exe
- target: aarch64-unknown-linux-musl
name: linux-arm64
binary: vibe-kanban
mcp_binary: vibe-kanban-mcp
review_binary: vibe-kanban-review
steps:
- uses: actions/checkout@v6
with:
ref: ${{ needs.bump-version.outputs.new_tag }}
- name: Download frontend artifact
uses: actions/download-artifact@v7
with:
name: frontend-dist
path: packages/local-web/dist/
- name: Download backend binary artifact
uses: actions/download-artifact@v7
with:
name: backend-binary-${{ matrix.name }}
path: dist/
- name: List downloaded artifacts
run: |
echo "Downloaded backend binaries:"
find dist/
- name: Create platform package
if: matrix.name != 'macos-arm64' && matrix.name != 'macos-x64'
run: |
mkdir -p npx-cli/dist/${{ matrix.name }}
mkdir vibe-kanban-${{ matrix.name }}
mkdir vibe-kanban-mcp-${{ matrix.name }}
mkdir vibe-kanban-review-${{ matrix.name }}
cp dist/vibe-kanban-${{ matrix.name }}* vibe-kanban-${{ matrix.name }}/${{ matrix.binary }}
cp dist/vibe-kanban-mcp-${{ matrix.name }}* vibe-kanban-mcp-${{ matrix.name }}/${{ matrix.mcp_binary }}
cp dist/vibe-kanban-review-${{ matrix.name }}* vibe-kanban-review-${{ matrix.name }}/${{ matrix.review_binary }}
zip -j npx-cli/dist/${{ matrix.name }}/vibe-kanban.zip vibe-kanban-${{ matrix.name }}/${{ matrix.binary }}
zip -j npx-cli/dist/${{ matrix.name }}/vibe-kanban-mcp.zip vibe-kanban-mcp-${{ matrix.name }}/${{ matrix.mcp_binary }}
zip -j npx-cli/dist/${{ matrix.name }}/vibe-kanban-review.zip vibe-kanban-review-${{ matrix.name }}/${{ matrix.review_binary }}
- name: Create platform package (macOS)
if: matrix.name == 'macos-arm64' || matrix.name == 'macos-x64'
run: |
mkdir -p npx-cli/dist/${{ matrix.name }}
mkdir vibe-kanban-${{ matrix.name }}
cp dist/vibe-kanban-${{ matrix.name }}* npx-cli/dist/${{ matrix.name }}/vibe-kanban.zip
cp dist/vibe-kanban-mcp-${{ matrix.name }}* npx-cli/dist/${{ matrix.name }}/vibe-kanban-mcp.zip
cp dist/vibe-kanban-review-${{ matrix.name }}* npx-cli/dist/${{ matrix.name }}/vibe-kanban-review.zip
- name: Upload platform package artifact
uses: actions/upload-artifact@v6
with:
name: npx-platform-${{ matrix.name }}
path: npx-cli/dist/
retention-days: 1
upload-to-r2:
needs: [bump-version, package-npx-cli]
runs-on: blacksmith-4vcpu-ubuntu-2404
steps:
- uses: actions/checkout@v6
with:
ref: ${{ needs.bump-version.outputs.new_tag }}
- name: Download all platform packages
uses: actions/download-artifact@v7
with:
pattern: npx-platform-*
path: binaries/
merge-multiple: true
- name: List downloaded binaries
run: |
echo "Downloaded binaries:"
find binaries/
- name: Configure AWS CLI for R2
run: |
aws configure set aws_access_key_id ${{ secrets.R2_BINARIES_ACCESS_KEY_ID }}
aws configure set aws_secret_access_key ${{ secrets.R2_BINARIES_SECRET_ACCESS_KEY }}
aws configure set default.region auto
- name: Generate manifest and upload to R2
run: |
TAG="${{ needs.bump-version.outputs.new_tag }}"
ENDPOINT="${{ secrets.R2_BINARIES_ENDPOINT }}"
BUCKET="${{ secrets.R2_BINARIES_BUCKET }}"
# Generate version manifest with checksums
node -e "
const fs = require('fs');
const crypto = require('crypto');
const manifest = { version: '$TAG', platforms: {} };
const platforms = ['linux-x64', 'linux-arm64', 'windows-x64', 'windows-arm64', 'macos-x64', 'macos-arm64'];
const binaries = ['vibe-kanban', 'vibe-kanban-mcp', 'vibe-kanban-review'];
for (const platform of platforms) {
manifest.platforms[platform] = {};
for (const binary of binaries) {
const zipPath = \`binaries/\${platform}/\${binary}.zip\`;
if (fs.existsSync(zipPath)) {
const data = fs.readFileSync(zipPath);
manifest.platforms[platform][binary] = {
sha256: crypto.createHash('sha256').update(data).digest('hex'),
size: data.length
};
}
}
}
fs.writeFileSync('version-manifest.json', JSON.stringify(manifest, null, 2));
console.log('Generated manifest:');
console.log(JSON.stringify(manifest, null, 2));
"
# Upload binaries (use full tag for path, allows multiple pre-releases to coexist)
for platform in linux-x64 linux-arm64 windows-x64 windows-arm64 macos-x64 macos-arm64; do
for binary in vibe-kanban vibe-kanban-mcp vibe-kanban-review; do
if [ -f "binaries/$platform/$binary.zip" ]; then
echo "Uploading binaries/$platform/$binary.zip..."
aws s3 cp "binaries/$platform/$binary.zip" \
"s3://$BUCKET/binaries/$TAG/$platform/$binary.zip" \
--endpoint-url "$ENDPOINT"
fi
done
done
# Upload version manifest
echo "Uploading version manifest..."
aws s3 cp version-manifest.json \
"s3://$BUCKET/binaries/$TAG/manifest.json" \
--endpoint-url "$ENDPOINT" --content-type "application/json"
# Update global manifest
VERSION="${{ needs.bump-version.outputs.new_version }}"
echo "Updating global manifest..."
echo "{\"latest\": \"$VERSION\"}" | aws s3 cp - \
"s3://$BUCKET/binaries/manifest.json" \
--endpoint-url "$ENDPOINT" --content-type "application/json"
- name: Verify upload
run: |
TAG="${{ needs.bump-version.outputs.new_tag }}"
ENDPOINT="${{ secrets.R2_BINARIES_ENDPOINT }}"
BUCKET="${{ secrets.R2_BINARIES_BUCKET }}"
echo "Listing uploaded files..."
aws s3 ls "s3://$BUCKET/binaries/$TAG/" \
--endpoint-url "$ENDPOINT" \
--recursive
build-tauri:
needs: [bump-version, build-frontend]
runs-on: ${{ matrix.os }}
defaults:
run:
shell: bash
strategy:
matrix:
include:
- target: aarch64-apple-darwin
os: macos-15-xlarge
platform: darwin-aarch64
- target: x86_64-apple-darwin
os: macos-15-xlarge
platform: darwin-x86_64
- target: x86_64-unknown-linux-gnu
os: blacksmith-16vcpu-ubuntu-2404
platform: linux-x86_64
- target: aarch64-unknown-linux-gnu
os: blacksmith-16vcpu-ubuntu-2404-arm
platform: linux-aarch64
- target: x86_64-pc-windows-msvc
os: blacksmith-16vcpu-ubuntu-2404
platform: windows-x86_64
- target: aarch64-pc-windows-msvc
os: blacksmith-16vcpu-ubuntu-2404
platform: windows-aarch64
env:
CARGO_INCREMENTAL: "0"
SCCACHE_GHA_ENABLED: "true"
RUSTC_WRAPPER: "sccache"
SCCACHE_CACHE_SIZE: "10G"
CARGO_HOME: ${{ github.workspace }}/.cargo
RUSTUP_HOME: ${{ github.workspace }}/.rustup
XWIN_CACHE_DIR: ${{ github.workspace }}/.xwin-cache
steps:
- uses: actions/checkout@v6
with:
ref: ${{ needs.bump-version.outputs.new_tag }}
- name: Setup sccache
uses: BloopAI/sccache-action@main
- name: Cache Rust toolchain
uses: actions/cache@v5
with:
path: .rustup/toolchains
key: rust-toolchain-${{ runner.os }}-${{ matrix.target }}-${{ env.RUST_TOOLCHAIN }}
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
toolchain: ${{ env.RUST_TOOLCHAIN }}
targets: ${{ matrix.target }}
- name: Cache Cargo registry
uses: actions/cache@v5
with:
path: |
.cargo/registry/cache
.cargo/registry/index
.cargo/git/db
.cargo/bin
.cargo/.crates.toml
.cargo/.crates2.json
key: cargo-tauri-${{ runner.os }}-${{ env.RUST_TOOLCHAIN }}-${{ matrix.target }}-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
cargo-tauri-${{ runner.os }}-${{ env.RUST_TOOLCHAIN }}-${{ matrix.target }}-
- name: Cache target
uses: actions/cache@v5
with:
path: target
key: tauri-target-${{ runner.os }}-${{ env.RUST_TOOLCHAIN }}-${{ matrix.target }}-${{ github.ref_name }}-${{ github.sha }}
restore-keys: |
tauri-target-${{ runner.os }}-${{ env.RUST_TOOLCHAIN }}-${{ matrix.target }}-${{ github.ref_name }}-
tauri-target-${{ runner.os }}-${{ env.RUST_TOOLCHAIN }}-${{ matrix.target }}-
- name: Setup cargo-sweep
run: cargo install --locked cargo-sweep --version 0.8.0
- name: Setup Node
uses: ./.github/actions/setup-node
- name: Install Linux dependencies
if: runner.os == 'Linux' && contains(matrix.target, 'linux')
run: |
sudo apt-get update
sudo apt-get install -y libwebkit2gtk-4.1-dev build-essential \
libssl-dev libayatana-appindicator3-dev librsvg2-dev \
libxdo-dev file pkg-config xdg-utils
- name: Install Windows cross-compilation dependencies
if: runner.os == 'Linux' && contains(matrix.target, 'windows')
run: |
sudo apt-get update
DEBIAN_FRONTEND=noninteractive sudo apt-get install -y \
clang libclang-dev lld llvm nasm cmake ninja-build nsis \
clang-19 clang-tools-19 llvm-19 lld-19 \
meson valac bison gobject-introspection libgirepository1.0-dev \
libglib2.0-dev libgsf-1-dev libgcab-dev libmsi-dev
echo "/usr/lib/llvm-19/bin" >> $GITHUB_PATH
- name: Build and install wixl
if: runner.os == 'Linux' && contains(matrix.target, 'windows')
env:
RUSTC_WRAPPER: ""
run: |
cd /tmp
curl -sL https://download.gnome.org/sources/msitools/0.103/msitools-0.103.tar.xz | tar xJ
cd msitools-0.103
meson setup builddir --prefix=/usr
meson compile -C builddir wixl
sudo install -m755 builddir/tools/wixl/wixl /usr/local/bin/wixl
sudo install -m644 builddir/libmsi/libmsi-1.0.so.0.0.0 /usr/local/lib/
sudo ln -sf libmsi-1.0.so.0.0.0 /usr/local/lib/libmsi-1.0.so.0
sudo ln -sf libmsi-1.0.so.0 /usr/local/lib/libmsi-1.0.so
sudo ldconfig
sudo mkdir -p /usr/share/wixl-0.103/ext
sudo cp -r data/ext/ui /usr/share/wixl-0.103/ext/
cd / && rm -rf /tmp/msitools-0.103
wixl --version
- name: Install cargo-xwin
if: runner.os == 'Linux' && contains(matrix.target, 'windows')
run: cargo install --locked cargo-xwin --version ${{ env.CARGO_XWIN_VERSION }}
- name: Cache xwin downloads
if: runner.os == 'Linux' && contains(matrix.target, 'windows')
uses: actions/cache@v5
with:
path: ${{ github.workspace }}/.xwin-cache
key: xwin-${{ runner.os }}-${{ matrix.target }}-cargo-xwin-${{ env.CARGO_XWIN_VERSION }}
- name: Install dependencies
run: pnpm install
- name: Install Tauri CLI
uses: taiki-e/cache-cargo-install-action@34ce5120836e5f9f1508d8713d7fdea0e8facd6f # v3.0.1
with:
tool: tauri-cli@2
- name: Download frontend artifact
uses: actions/download-artifact@v7
with:
name: frontend-dist
path: packages/local-web/dist/
- name: Patch tauri.conf.json for CI
run: |
node -e "
const fs = require('fs');
const conf = JSON.parse(fs.readFileSync('crates/tauri-app/tauri.conf.json', 'utf8'));
// Inject the real updater endpoint (replaces __TAURI_UPDATE_ENDPOINT__ placeholder)
const endpoint = '${{ secrets.R2_BINARIES_PUBLIC_URL }}/binaries/tauri-update/latest.json';
conf.plugins.updater.endpoints = conf.plugins.updater.endpoints.map(e =>
e === '__TAURI_UPDATE_ENDPOINT__' ? endpoint : e
);
fs.writeFileSync('crates/tauri-app/tauri.conf.json', JSON.stringify(conf, null, 2) + '\n');
"
- name: Set up Apple notarization key
if: runner.os == 'macOS'
env:
API_KEY_ID: ${{ secrets.APPLE_API_KEY_ID }}
API_ISSUER: ${{ secrets.APPLE_API_ISSUER }}
API_PRIVATE_KEY: ${{ secrets.APPLE_API_PRIVATE_KEY }}
run: |
# Write the .p8 key file where Tauri/notarytool can find it
mkdir -p ~/.private_keys
KEY_PATH="$HOME/.private_keys/AuthKey_${API_KEY_ID}.p8"
printf '%s' "$API_PRIVATE_KEY" > "$KEY_PATH"
echo "APPLE_API_KEY=$API_KEY_ID" >> $GITHUB_ENV
echo "APPLE_API_ISSUER=$API_ISSUER" >> $GITHUB_ENV
echo "APPLE_API_KEY_PATH=$KEY_PATH" >> $GITHUB_ENV
- name: Build Tauri app
run: |
if [[ "${{ matrix.target }}" == "aarch64-pc-windows-msvc" ]]; then
# ring requires clang on arm64 windows cross-compile
chmod +x scripts/ring-cc-wrapper.sh scripts/clang
export PATH="${{ github.workspace }}/scripts:$PATH"
export RING_CC=/usr/lib/llvm-19/bin/clang
export DEFAULT_CC=clang-cl
export CC_aarch64_pc_windows_msvc="${{ github.workspace }}/scripts/ring-cc-wrapper.sh"
export CARGO_PROFILE_RELEASE_DEBUG=0
fi
if [[ "${{ matrix.target }}" == *"windows"* ]]; then
cargo tauri build --runner cargo-xwin --target ${{ matrix.target }} --ci
else
cargo tauri build --target ${{ matrix.target }} --ci
fi
env:
TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }}
APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE_P12_BASE64 }}
APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
APPLE_SIGNING_IDENTITY: ${{ secrets.APPLE_SIGNING_IDENTITY }}
APPLE_API_KEY: ${{ env.APPLE_API_KEY }}
APPLE_API_ISSUER: ${{ env.APPLE_API_ISSUER }}
APPLE_API_KEY_PATH: ${{ env.APPLE_API_KEY_PATH }}
POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }}
POSTHOG_API_ENDPOINT: ${{ secrets.POSTHOG_API_ENDPOINT }}
VK_SHARED_API_BASE: ${{ secrets.VK_SHARED_API_BASE }}
VK_SHARED_RELAY_API_BASE: ${{ secrets.VK_SHARED_RELAY_API_BASE }}
SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
- name: Build MSI with wixl
if: contains(matrix.target, 'windows')
run: |
node scripts/build-tauri-msi.js \
--target ${{ matrix.target }} \
--version ${{ needs.bump-version.outputs.new_version }}
- name: Setup Jsign
if: contains(matrix.target, 'windows')
id: jsign
uses: ./.github/actions/setup-jsign
- name: Install JRE for Jsign
if: contains(matrix.target, 'windows')
run: |
sudo apt-get update
sudo apt-get install -y default-jre-headless
- name: Azure CLI login
if: contains(matrix.target, 'windows') && env.AZURE_ENDPOINT != ''
uses: azure/login@v2
with:
creds: '{"clientId":"${{ secrets.AZURE_CLIENT_ID }}","clientSecret":"${{ secrets.AZURE_CLIENT_SECRET }}","tenantId":"${{ secrets.AZURE_TENANT_ID }}"}'
allow-no-subscriptions: true
env:
AZURE_ENDPOINT: ${{ secrets.AZURE_ENDPOINT }}
- name: Sign Windows artifacts with Azure Trusted Signing
if: contains(matrix.target, 'windows') && env.AZURE_ENDPOINT != ''
env:
AZURE_ENDPOINT: ${{ secrets.AZURE_ENDPOINT }}
AZURE_CODE_SIGNING_NAME: ${{ secrets.AZURE_CODE_SIGNING_NAME }}
AZURE_CERT_PROFILE_NAME: ${{ secrets.AZURE_CERT_PROFILE_NAME }}
run: |
TOKEN=$(az account get-access-token --resource https://codesigning.azure.net --query accessToken -o tsv)
# Extract hostname from endpoint URL
KEYSTORE=$(echo "$AZURE_ENDPOINT" | sed 's|https\?://||;s|/.*||')
# Sign all exe and msi files in the bundle directory
find target/${{ matrix.target }}/release/bundle -type f \( -name "*.exe" -o -name "*.msi" \) | while read file; do
echo "Signing: $file"
java -jar "${{ steps.jsign.outputs.jar-path }}" \
--storetype TRUSTEDSIGNING \
--keystore "$KEYSTORE" \
--storepass "$TOKEN" \
--alias "${AZURE_CODE_SIGNING_NAME}/${AZURE_CERT_PROFILE_NAME}" \
--tsaurl http://timestamp.acs.microsoft.com \
--tsmode RFC3161 \
"$file"
done
- name: Collect updater artifacts and installers
run: |
mkdir -p tauri-artifacts/${{ matrix.platform }}
# Collect updater artifacts (.sig files and their corresponding bundles)
find target/${{ matrix.target }}/release/bundle -name "*.sig" | while read sig; do
artifact="${sig%.sig}"
if [ -f "$artifact" ]; then
cp "$artifact" "tauri-artifacts/${{ matrix.platform }}/"
cp "$sig" "tauri-artifacts/${{ matrix.platform }}/"
echo "Collected updater artifact: $(basename $artifact)"
fi
done
# Collect installer files for GitHub Release (DMG, AppImage, deb, msi, NSIS exe)
find target/${{ matrix.target }}/release/bundle \
\( -name "*.dmg" -o -name "*.AppImage" -o -name "*.deb" -o -name "*.msi" -o -name "*-setup.exe" \) | while read f; do
cp "$f" "tauri-artifacts/${{ matrix.platform }}/"
echo "Collected installer: $(basename $f)"
done
echo "All artifacts for ${{ matrix.platform }}:"
ls -la tauri-artifacts/${{ matrix.platform }}/
- name: Clean up signing keys
if: always() && runner.os == 'macOS'
run: rm -rf ~/.private_keys
- name: Upload Tauri artifacts
uses: actions/upload-artifact@v6
with:
name: tauri-artifacts-${{ matrix.platform }}
path: tauri-artifacts/
retention-days: 1
- name: Sweep Cargo target cache
if: always()
run: |
cargo sweep --maxsize 10GB
cargo sweep --time 30
upload-tauri-update:
needs: [bump-version, build-tauri]
runs-on: blacksmith-4vcpu-ubuntu-2404
steps:
- uses: actions/checkout@v6
with:
ref: ${{ needs.bump-version.outputs.new_tag }}
- name: Setup Node
uses: ./.github/actions/setup-node
- name: Download all Tauri artifacts
uses: actions/download-artifact@v7
with:
pattern: tauri-artifacts-*
path: tauri-artifacts/
merge-multiple: true
- name: List Tauri artifacts
run: find tauri-artifacts/
- name: Generate updater manifest
run: |
node scripts/generate-tauri-update-json.js \
--version "${{ needs.bump-version.outputs.new_version }}" \
--notes "Release ${{ needs.bump-version.outputs.new_tag }}" \
--artifacts-dir ./tauri-artifacts \
--download-base "${{ secrets.R2_BINARIES_PUBLIC_URL }}/binaries/${{ needs.bump-version.outputs.new_tag }}/tauri" \
--output latest.json
echo "Generated latest.json:"
cat latest.json
- name: Generate desktop manifest for NPX CLI
run: |
node scripts/generate-desktop-manifest.js \
--version "${{ needs.bump-version.outputs.new_version }}" \
--artifacts-dir ./tauri-artifacts \
--output desktop-manifest.json
echo "Generated desktop-manifest.json:"
cat desktop-manifest.json
- name: Configure AWS CLI for R2
run: |
aws configure set aws_access_key_id ${{ secrets.R2_BINARIES_ACCESS_KEY_ID }}
aws configure set aws_secret_access_key ${{ secrets.R2_BINARIES_SECRET_ACCESS_KEY }}
aws configure set default.region auto
- name: Upload Tauri artifacts and update manifest to R2
run: |
TAG="${{ needs.bump-version.outputs.new_tag }}"
ENDPOINT="${{ secrets.R2_BINARIES_ENDPOINT }}"
BUCKET="${{ secrets.R2_BINARIES_BUCKET }}"
# Upload individual platform artifacts
for platform in darwin-aarch64 darwin-x86_64 linux-x86_64 linux-aarch64 windows-x86_64 windows-aarch64; do
if [ -d "tauri-artifacts/$platform" ]; then
for file in tauri-artifacts/$platform/*; do
[ -f "$file" ] || continue
# Skip .sig files from artifact upload (signatures are in latest.json)
[[ "$file" == *.sig ]] && continue
filename=$(basename "$file")
echo "Uploading $filename for $platform..."
aws s3 cp "$file" \
"s3://$BUCKET/binaries/$TAG/tauri/$platform/$filename" \
--endpoint-url "$ENDPOINT"
done
fi
done
# Upload latest.json alongside the tag artifacts (NOT to the fixed
# update endpoint). The fixed endpoint is only updated when a
# pre-release is promoted to a full release (see publish.yml).
echo "Uploading updater manifest for tag..."
aws s3 cp latest.json \
"s3://$BUCKET/binaries/$TAG/tauri/latest.json" \
--endpoint-url "$ENDPOINT" --content-type "application/json"
echo "Update manifest uploaded to: binaries/$TAG/tauri/latest.json"
# Upload desktop manifest for NPX CLI auto-install
echo "Uploading desktop manifest..."
aws s3 cp desktop-manifest.json \
"s3://$BUCKET/binaries/$TAG/tauri/desktop-manifest.json" \
--endpoint-url "$ENDPOINT" --content-type "application/json"
echo "Desktop manifest uploaded to: binaries/$TAG/tauri/desktop-manifest.json"
create-prerelease:
needs: [bump-version, build-frontend, upload-to-r2, upload-tauri-update]
runs-on: blacksmith-4vcpu-ubuntu-2404
steps:
- uses: actions/checkout@v6
with:
ref: ${{ needs.bump-version.outputs.new_tag }}
- name: Download frontend artifact
uses: actions/download-artifact@v7
with:
name: frontend-dist
path: packages/local-web/dist/
- name: Download Tauri artifacts for release
uses: actions/download-artifact@v7
with:
pattern: tauri-artifacts-*
path: tauri-release/
merge-multiple: true
- name: Collect Tauri installers for release
run: |
mkdir -p tauri-installers
find tauri-release \( -name "*.dmg" -o -name "*.AppImage" -o -name "*.deb" -o -name "*.msi" -o -name "*-setup.exe" \) \
-exec cp {} tauri-installers/ \;
echo "Tauri installers for release:"
ls -la tauri-installers/ 2>/dev/null || echo "No installers found"
- name: List downloaded artifacts
run: |
echo "Web dist:"
find packages/local-web/dist
- name: Zip frontend
run: |
mkdir vibe-kanban-${{ needs.bump-version.outputs.new_tag }}
mv packages/local-web/dist vibe-kanban-${{ needs.bump-version.outputs.new_tag }}
zip -r vibe-kanban-${{ needs.bump-version.outputs.new_tag }}.zip vibe-kanban-${{ needs.bump-version.outputs.new_tag }}
- name: Setup Node for npm pack
uses: ./.github/actions/setup-node
- name: Install npx-cli dependencies
run: |
cd npx-cli
npm ci
- name: Build npx-cli TypeScript, inject secrets, and Pack
run: |
cd npx-cli
npm run build
# Replace placeholders in the bundled output
sed -i "s|__R2_PUBLIC_URL__|${{ secrets.R2_BINARIES_PUBLIC_URL }}|g" bin/cli.js
sed -i "s|__BINARY_TAG__|${{ needs.bump-version.outputs.new_tag }}|g" bin/cli.js
npm pack
- name: Create GitHub Pre-Release
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ needs.bump-version.outputs.new_tag }}
name: Pre-release ${{ needs.bump-version.outputs.new_tag }}
prerelease: true
generate_release_notes: true
files: |
vibe-kanban-${{ needs.bump-version.outputs.new_tag }}.zip
npx-cli/vibe-kanban-*.tgz
tauri-installers/*
================================================
FILE: .github/workflows/publish.yml
================================================
name: Publish to npm
on:
release:
types: [released]
workflow_dispatch:
inputs:
tag_name:
description: "Release tag (e.g., v1.2.3)"
required: true
release_id:
description: "GitHub release ID"
required: true
concurrency:
group: publish
cancel-in-progress: true
permissions:
contents: write
packages: write
id-token: write # Required for OIDC trusted publishing
env:
NODE_VERSION: 22
PNPM_VERSION: 10.13.1
jobs:
publish:
runs-on: ubuntu-latest
# Only run for main app releases (not remote-v* tags) that were converted from pre-release
if: github.event.release.prerelease == false && !startsWith(github.event.release.tag_name, 'remote-')
steps:
- uses: actions/checkout@v6
with:
ref: ${{ github.event.release.tag_name || inputs.tag_name }}
- name: Setup Node
uses: ./.github/actions/setup-node
- name: Upgrade npm for OIDC support
run: npm install -g npm@latest
- name: Download release assets
uses: actions/github-script@v8
env:
RELEASE_ID: ${{ inputs.release_id }}
with:
script: |
const fs = require('fs');
const path = require('path');
const releaseId = context.payload.release?.id || process.env.RELEASE_ID;
console.log("releaseId:", releaseId);
if (!releaseId) {
core.setFailed('No release ID found.');
return;
}
const release = await github.rest.repos.getRelease({
owner: context.repo.owner,
repo: context.repo.repo,
release_id: releaseId
});
// Find the .tgz file
const tgzAsset = release.data.assets.find(asset => asset.name.endsWith('.tgz'));
if (!tgzAsset) {
core.setFailed('No .tgz file found in release assets');
return;
}
// Download the asset
const response = await github.rest.repos.getReleaseAsset({
owner: context.repo.owner,
repo: context.repo.repo,
asset_id: tgzAsset.id,
headers: {
Accept: 'application/octet-stream'
}
});
// Save to npx-cli directory
const filePath = path.join('npx-cli', tgzAsset.name);
fs.writeFileSync(filePath, Buffer.from(response.data));
console.log(`Downloaded ${tgzAsset.name} to ${filePath}`);
// Set output for next step
core.setOutput('package-file', filePath);
core.setOutput('package-name', tgzAsset.name);
- name: Verify package integrity
id: verify
run: |
cd npx-cli
# List files to confirm download
ls -la *.tgz
# Verify the package can be read
npm pack --dry-run || echo "Note: This is expected to show differences since we're using the pre-built package"
# Extract package name from the downloaded file
PACKAGE_FILE=$(ls *.tgz | head -n1)
echo "package-file=$PACKAGE_FILE" >> $GITHUB_OUTPUT
- name: Publish to npm
run: |
cd npx-cli
# Publish the exact same package that was tested
PACKAGE_FILE="${{ steps.verify.outputs.package-file }}"
echo "Publishing $PACKAGE_FILE to npm..."
npm publish "$PACKAGE_FILE" --provenance --access public
echo "✅ Successfully published to npm!"
- name: Update release description
uses: actions/github-script@v8
env:
RELEASE_ID: ${{ inputs.release_id }}
with:
script: |
const releaseId = context.payload.release?.id || process.env.RELEASE_ID;;
// Fetch the release to get the current body
const release = await github.rest.repos.getRelease({
owner: context.repo.owner,
repo: context.repo.repo,
release_id: releaseId
});
const currentBody = release.data.body || '';
await github.rest.repos.updateRelease({
owner: context.repo.owner,
repo: context.repo.repo,
release_id: releaseId,
body: currentBody + '\n\n✅ **Published to npm registry**'
});
# Promote the tag-specific Tauri update manifest to the fixed endpoint
# so existing desktop app users receive the update notification.
promote-tauri-update:
runs-on: ubuntu-latest
if: github.event.release.prerelease == false && !startsWith(github.event.release.tag_name, 'remote-')
steps:
- name: Configure AWS CLI for R2
run: |
aws configure set aws_access_key_id ${{ secrets.R2_BINARIES_ACCESS_KEY_ID }}
aws configure set aws_secret_access_key ${{ secrets.R2_BINARIES_SECRET_ACCESS_KEY }}
aws configure set default.region auto
- name: Copy update manifest to live endpoint
run: |
TAG="${{ github.event.release.tag_name || inputs.tag_name }}"
ENDPOINT="${{ secrets.R2_BINARIES_ENDPOINT }}"
BUCKET="${{ secrets.R2_BINARIES_BUCKET }}"
echo "Promoting update manifest for $TAG to live endpoint..."
aws s3 cp \
"s3://$BUCKET/binaries/$TAG/tauri/latest.json" \
"s3://$BUCKET/binaries/tauri-update/latest.json" \
--endpoint-url "$ENDPOINT" --content-type "application/json"
echo "Update manifest promoted: binaries/tauri-update/latest.json"
================================================
FILE: .github/workflows/relay-deploy-dev.yml
================================================
name: Relay Deploy Dev
on:
push:
branches:
- main
paths:
- crates/relay-tunnel/**
workflow_dispatch:
jobs:
run-relay-deploy:
name: Deploy Relay Dev
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- name: Dispatch dev relay deployment workflow
uses: peter-evans/repository-dispatch@28959ce8df70de7be546dd1250a005dd32156697 # v4.0.1
with:
token: ${{ secrets.REMOTE_DEPLOYMENT_TOKEN }}
repository: BloopAI/vibe-kanban-remote-deployment
event-type: vibe-kanban-relay-deploy-dev
client-payload: |
{
"ref": "${{ github.ref_name }}",
"sha": "${{ github.sha }}"
}
================================================
FILE: .github/workflows/relay-deploy-prod.yml
================================================
name: Deploy Relay Prod
on:
workflow_dispatch:
inputs:
version_type:
description: "Version bump type"
required: true
default: "patch"
type: choice
options:
- patch
- minor
- major
concurrency:
group: relay-deploy-${{ github.ref_name }}
cancel-in-progress: true
permissions:
contents: write
env:
RUST_TOOLCHAIN: nightly-2025-12-04
jobs:
release-and-deploy:
runs-on: ubuntu-latest
steps:
- name: Cache cargo-edit
uses: actions/cache@v5
id: cache-cargo-edit
with:
path: ~/.cargo/bin/cargo-set-version
key: cargo-edit-${{ runner.os }}-${{ env.RUST_TOOLCHAIN }}
- name: Install cargo-edit
if: steps.cache-cargo-edit.outputs.cache-hit != 'true'
run: cargo install cargo-edit
- uses: actions/checkout@v6
with:
token: ${{ secrets.GITHUB_TOKEN }}
ssh-key: ${{ secrets.DEPLOY_KEY }}
- name: Determine and update version
id: version
run: |
# Get current version from crates/relay-tunnel/Cargo.toml
current_version=$(grep '^version = ' crates/relay-tunnel/Cargo.toml | head -1 | sed 's/version = "\(.*\)"/\1/')
echo "Current relay-tunnel version: $current_version"
# Parse version components
IFS='.' read -r major minor patch <<< "$current_version"
# Bump based on type
case "${{ github.event.inputs.version_type }}" in
major)
major=$((major + 1))
minor=0
patch=0
;;
minor)
minor=$((minor + 1))
patch=0
;;
patch)
patch=$((patch + 1))
;;
esac
new_version="${major}.${minor}.${patch}"
new_tag="relay-v${new_version}"
# Update version in crates/relay-tunnel/Cargo.toml
cd crates/relay-tunnel
cargo set-version "$new_version"
cargo update relay-tunnel
cd ../..
echo "New version: $new_version"
echo "New tag: $new_tag"
echo "new_version=$new_version" >> $GITHUB_OUTPUT
echo "new_tag=$new_tag" >> $GITHUB_OUTPUT
echo "new_ref=$new_tag" >> $GITHUB_OUTPUT
- name: Commit changes and create tag
run: |
git config --local user.email "action@github.com"
git config --local user.name "GitHub Action"
git add crates/relay-tunnel/Cargo.toml crates/relay-tunnel/Cargo.lock
git commit -m "chore: bump relay-tunnel version to ${{ steps.version.outputs.new_version }}"
git tag -a ${{ steps.version.outputs.new_tag }} -m "Relay release ${{ steps.version.outputs.new_tag }}"
git push
git push --tags
- name: Dispatch relay deployment workflow
uses: peter-evans/repository-dispatch@28959ce8df70de7be546dd1250a005dd32156697 # v4.0.1
with:
token: ${{ secrets.REMOTE_DEPLOYMENT_TOKEN }}
repository: BloopAI/vibe-kanban-remote-deployment
event-type: vibe-kanban-relay-deploy-prod
client-payload: |
{
"ref": "${{ steps.version.outputs.new_ref }}",
"sha": "${{ github.sha }}",
"version": "${{ steps.version.outputs.new_version }}"
}
================================================
FILE: .github/workflows/relay-release.yml
================================================
name: Create Relay Release
on:
repository_dispatch:
types: [relay-deploy-success]
jobs:
create-release:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Create GitHub Release
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ github.event.client_payload.tag }}
name: ${{ github.event.client_payload.tag }}
generate_release_notes: true
body: |
## Relay Tunnel Service Release
Deployed to ${{ github.event.client_payload.environment }}
================================================
FILE: .github/workflows/remote-deploy-dev.yml
================================================
name: Remote Deploy Dev
on:
push:
branches:
- main
paths:
- crates/remote/**
- packages/remote-web/**
workflow_dispatch:
jobs:
run-remote-deploy:
name: Deploy Remote Dev
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- name: Dispatch dev remote deployment workflow
uses: peter-evans/repository-dispatch@28959ce8df70de7be546dd1250a005dd32156697 # v4.0.1
with:
token: ${{ secrets.REMOTE_DEPLOYMENT_TOKEN }}
repository: BloopAI/vibe-kanban-remote-deployment
event-type: vibe-kanban-remote-deploy-dev
client-payload: |
{
"ref": "${{ github.ref_name }}",
"sha": "${{ github.sha }}"
}
================================================
FILE: .github/workflows/remote-deploy-prod.yml
================================================
name: Deploy Remote Prod
on:
workflow_dispatch:
inputs:
version_type:
description: "Version bump type"
required: true
default: "patch"
type: choice
options:
- patch
- minor
- major
concurrency:
group: remote-deploy-${{ github.ref_name }}
cancel-in-progress: true
permissions:
contents: write
env:
RUST_TOOLCHAIN: nightly-2025-12-04
jobs:
release-and-deploy:
runs-on: ubuntu-latest
steps:
- name: Cache cargo-edit
uses: actions/cache@v5
id: cache-cargo-edit
with:
path: ~/.cargo/bin/cargo-set-version
key: cargo-edit-${{ runner.os }}-${{ env.RUST_TOOLCHAIN }}
- name: Install cargo-edit
if: steps.cache-cargo-edit.outputs.cache-hit != 'true'
run: cargo install cargo-edit
- uses: actions/checkout@v6
with:
token: ${{ secrets.GITHUB_TOKEN }}
ssh-key: ${{ secrets.DEPLOY_KEY }}
- name: Setup SSH Agent for private dependencies
uses: webfactory/ssh-agent@v0.9.0
with:
ssh-private-key: ${{ secrets.VK_PRIVATE_DEPLOY_KEY }}
- name: Determine and update version
id: version
run: |
# Get current version from crates/remote/Cargo.toml
current_version=$(grep '^version = ' crates/remote/Cargo.toml | head -1 | sed 's/version = "\(.*\)"/\1/')
echo "Current remote version: $current_version"
# Parse version components
IFS='.' read -r major minor patch <<< "$current_version"
# Bump based on type
case "${{ github.event.inputs.version_type }}" in
major)
major=$((major + 1))
minor=0
patch=0
;;
minor)
minor=$((minor + 1))
patch=0
;;
patch)
patch=$((patch + 1))
;;
esac
new_version="${major}.${minor}.${patch}"
new_tag="remote-v${new_version}"
# Update version in crates/remote/Cargo.toml
cd crates/remote
cargo set-version "$new_version"
cargo update remote
cd ../..
echo "New version: $new_version"
echo "New tag: $new_tag"
echo "new_version=$new_version" >> $GITHUB_OUTPUT
echo "new_tag=$new_tag" >> $GITHUB_OUTPUT
echo "new_ref=$new_tag" >> $GITHUB_OUTPUT
- name: Stop SSH agent
run: ssh-agent -k
- name: Commit changes and create tag
run: |
git config --local user.email "action@github.com"
git config --local user.name "GitHub Action"
git add crates/remote/Cargo.toml crates/remote/Cargo.lock
git commit -m "chore: bump remote version to ${{ steps.version.outputs.new_version }}"
git tag -a ${{ steps.version.outputs.new_tag }} -m "Remote release ${{ steps.version.outputs.new_tag }}"
git push
git push --tags
- name: Dispatch remote deployment workflow
uses: peter-evans/repository-dispatch@28959ce8df70de7be546dd1250a005dd32156697 # v4.0.1
with:
token: ${{ secrets.REMOTE_DEPLOYMENT_TOKEN }}
repository: BloopAI/vibe-kanban-remote-deployment
event-type: vibe-kanban-remote-deploy-prod
client-payload: |
{
"ref": "${{ steps.version.outputs.new_ref }}",
"sha": "${{ github.sha }}",
"version": "${{ steps.version.outputs.new_version }}"
}
================================================
FILE: .github/workflows/remote-release.yml
================================================
name: Create Remote Release
on:
repository_dispatch:
types: [remote-deploy-success]
jobs:
create-release:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Create GitHub Release
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ github.event.client_payload.tag }}
name: ${{ github.event.client_payload.tag }}
generate_release_notes: true
body: |
## Remote Service Release
✅ Deployed to ${{ github.event.client_payload.environment }}
================================================
FILE: .github/workflows/test.yml
================================================
name: Test
on:
pull_request:
branches:
- main
paths-ignore:
- .github/workflows/**
- '!.github/workflows/test.yml'
push:
branches:
- main
workflow_dispatch:
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}
env:
CARGO_TERM_COLOR: always
NODE_VERSION: 22
PNPM_VERSION: 10.13.1
RUST_TOOLCHAIN: nightly-2025-12-04
RUNNER_LABEL: &runner_label blacksmith-16vcpu-ubuntu-2404
jobs:
changes:
runs-on: *runner_label
if: github.event_name == 'pull_request'
permissions:
contents: read
pull-requests: read
outputs:
frontend: ${{ steps.filter.outputs.frontend }}
backend: ${{ steps.filter.outputs.backend }}
backend-remote: ${{ steps.filter.outputs['backend-remote'] }}
tauri: ${{ steps.filter.outputs.tauri }}
steps:
- uses: actions/checkout@v6
- uses: dorny/paths-filter@0bc4621a3135347011ad047f9ecf449bf72ce2bd # v3.0.0
id: filter
with:
filters: |
frontend:
- 'packages/local-web/**'
- 'packages/web-core/**'
- 'packages/remote-web/**'
- 'packages/ui/**'
- 'shared/**'
- 'scripts/check-i18n.sh'
- 'scripts/check-unused-i18n-keys.mjs'
- 'scripts/check-legacy-frontend-paths.sh'
- 'scripts/legacy-frontend-paths-allowlist.txt'
- 'pnpm-lock.yaml'
- 'pnpm-workspace.yaml'
- 'package.json'
- '.npmrc'
- '.github/workflows/test.yml'
- '.github/actions/**'
backend:
- 'crates/api-types/**'
- 'crates/db/**'
- 'crates/deployment/**'
- 'crates/executors/**'
- 'crates/git/**'
- 'crates/local-deployment/**'
- 'crates/mcp/**'
- 'crates/review/**'
- 'crates/server/**'
- 'crates/services/**'
- 'crates/utils/**'
- 'Cargo.toml'
- 'Cargo.lock'
- 'shared/**'
- 'scripts/prepare-db.js'
- 'pnpm-lock.yaml'
- 'package.json'
- 'rustfmt.toml'
- 'rust-toolchain.toml'
- '.cargo/**'
- '.github/workflows/test.yml'
- '.github/actions/**'
backend-remote:
- 'crates/remote/**'
- 'crates/relay-tunnel/**'
- 'crates/api-types/**'
- 'crates/utils/**'
- 'Cargo.toml'
- 'Cargo.lock'
- 'shared/**'
- 'rustfmt.toml'
- 'rust-toolchain.toml'
- '.cargo/**'
- 'pnpm-lock.yaml'
- 'package.json'
- '.github/workflows/test.yml'
- '.github/actions/**'
tauri:
- 'crates/tauri-app/**'
- 'crates/api-types/**'
- 'crates/db/**'
- 'crates/deployment/**'
- 'crates/executors/**'
- 'crates/git/**'
- 'crates/local-deployment/**'
- 'crates/mcp/**'
- 'crates/review/**'
- 'crates/server/**'
- 'crates/services/**'
- 'crates/utils/**'
- 'Cargo.toml'
- 'Cargo.lock'
- 'rustfmt.toml'
- 'rust-toolchain.toml'
- '.cargo/**'
- 'package.json'
- 'pnpm-lock.yaml'
- 'pnpm-workspace.yaml'
- '.npmrc'
- '.github/workflows/test.yml'
- '.github/actions/**'
frontend-checks:
needs: changes
if: always() && (needs.changes.outputs.frontend == 'true' || needs.changes.result == 'skipped')
runs-on: *runner_label
steps:
- uses: actions/checkout@v6
- name: Setup Node
uses: ./.github/actions/setup-node
- name: Install dependencies
run: pnpm install
- name: Run frontend checks
env:
NODE_OPTIONS: --max-old-space-size=8192
run: |
npx concurrently \
--kill-others-on-fail \
--names "local:lint,local:fmt,local:build,remote:fmt,remote:build,ui:check,ui:lint,ui:fmt,core:check,core:fmt,i18n,i18n:unused,legacy" \
--timings \
"cd packages/local-web && npm run lint" \
"cd packages/local-web && npm run format:check" \
"cd packages/local-web && npm run build" \
"cd packages/remote-web && npm run format:check" \
"cd packages/remote-web && npm run build" \
"cd packages/ui && npm run check" \
"cd packages/ui && npm run lint" \
"cd packages/ui && npm run format:check" \
"cd packages/web-core && npm run check" \
"cd packages/web-core && npm run format:check" \
"GITHUB_BASE_REF=${{ github.base_ref || 'main' }} ./scripts/check-i18n.sh" \
"node scripts/check-unused-i18n-keys.mjs" \
"./scripts/check-legacy-frontend-paths.sh"
backend-schema-checks:
needs: changes
if: always() && (needs.changes.outputs.backend == 'true' || needs.changes.result == 'skipped')
runs-on: *runner_label
env:
SCCACHE_GHA_ENABLED: "true"
RUSTC_WRAPPER: "sccache"
steps:
- uses: actions/checkout@v6
- name: Setup Rust
uses: ./.github/actions/cargo-checks-common-setup
with:
toolchain: ${{ env.RUST_TOOLCHAIN }}
cache-key: backend-schema-checks-${{ runner.os }}-${{ runner.arch }}-${{ env.RUNNER_LABEL }}
setup-node: 'true'
setup-sqlx-cli: 'true'
- name: Check generated types
run: npm run generate-types:check
- name: Sqlx checks
run: npm run prepare-db:check
backend-remote-checks:
needs: changes
if: >-
always()
&& (needs.changes.outputs['backend-remote'] == 'true' || needs.changes.result == 'skipped')
&& (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository)
runs-on: *runner_label
env:
SCCACHE_GHA_ENABLED: "true"
RUSTC_WRAPPER: "sccache"
steps:
- uses: actions/checkout@v6
- name: Setup Rust
uses: ./.github/actions/cargo-checks-common-setup
with:
toolchain: ${{ env.RUST_TOOLCHAIN }}
components: rustfmt, clippy
cache-key: backend-remote-checks-${{ runner.os }}-${{ runner.arch }}-${{ env.RUNNER_LABEL }}
setup-node: 'true'
setup-sqlx-cli: 'true'
- name: Setup SSH Agent for private dependencies
uses: webfactory/ssh-agent@v0.9.0
with:
ssh-private-key: ${{ secrets.VK_PRIVATE_DEPLOY_KEY }}
- name: Check remote Cargo.lock is consistent
run: |
cargo metadata --locked --format-version 1 --manifest-path crates/remote/Cargo.toml > /dev/null
cargo metadata --locked --format-version 1 --manifest-path crates/relay-tunnel/Cargo.toml > /dev/null
- name: Check formatting
run: |
cargo fmt --all --manifest-path crates/remote/Cargo.toml -- --check
cargo fmt --all --manifest-path crates/relay-tunnel/Cargo.toml -- --check
- name: Run Clippy
run: |
cargo clippy --all-targets --manifest-path crates/remote/Cargo.toml -- -D warnings
cargo clippy --all-targets --manifest-path crates/relay-tunnel/Cargo.toml -- -D warnings
- name: Check generated types
run: npm run remote:generate-types:check
- name: Sqlx checks
run: npm run remote:prepare-db:check
backend-clippy:
needs: changes
if: always() && (needs.changes.outputs.backend == 'true' || needs.changes.result == 'skipped')
runs-on: *runner_label
env:
SCCACHE_GHA_ENABLED: "true"
RUSTC_WRAPPER: "sccache"
steps:
- uses: actions/checkout@v6
- name: Setup Rust
uses: ./.github/actions/cargo-checks-common-setup
with:
toolchain: ${{ env.RUST_TOOLCHAIN }}
components: rustfmt, clippy
cache-key: backend-clippy-${{ runner.os }}-${{ runner.arch }}-${{ env.RUNNER_LABEL }}
- name: Run Clippy and fmt checks
run: |
set -x
cargo fmt --all -- --check & pid_fmt=$!
cargo clippy --workspace --all-targets --exclude vibe-kanban-tauri -- -D warnings
wait $pid_fmt
backend-test:
needs: changes
if: always() && (needs.changes.outputs.backend == 'true' || needs.changes.result == 'skipped')
runs-on: *runner_label
env:
SCCACHE_GHA_ENABLED: "true"
RUSTC_WRAPPER: "sccache"
steps:
- uses: actions/checkout@v6
- name: Setup Rust
uses: ./.github/actions/cargo-checks-common-setup
with:
toolchain: ${{ env.RUST_TOOLCHAIN }}
cache-key: backend-test-${{ runner.os }}-${{ runner.arch }}-${{ env.RUNNER_LABEL }}
- name: Install cargo-nextest
uses: taiki-e/install-action@nextest
- name: Run Cargo tests
run: cargo nextest run --workspace --exclude vibe-kanban-tauri
tauri-checks:
needs: changes
if: always() && (needs.changes.outputs.tauri == 'true' || needs.changes.result == 'skipped')
runs-on: *runner_label
env:
SCCACHE_GHA_ENABLED: "true"
RUSTC_WRAPPER: "sccache"
steps:
- uses: actions/checkout@v6
- name: Setup Rust
uses: ./.github/actions/cargo-checks-common-setup
with:
toolchain: ${{ env.RUST_TOOLCHAIN }}
components: rustfmt, clippy
cache-key: tauri-checks-${{ runner.os }}-${{ runner.arch }}-${{ env.RUNNER_LABEL }}
- name: Install Linux dependencies
run: |
sudo apt-get update
sudo apt-get install -y libwebkit2gtk-4.1-dev build-essential \
libssl-dev libayatana-appindicator3-dev librsvg2-dev \
libxdo-dev file pkg-config xdg-utils
- name: Run Tauri fmt, clippy, and compile checks
run: |
cargo fmt --all --manifest-path crates/tauri-app/Cargo.toml -- --check
cargo clippy --all-targets --manifest-path crates/tauri-app/Cargo.toml -- -D warnings
cargo check -p vibe-kanban-tauri
================================================
FILE: .gitignore
================================================
# Rust
target/
**/*.rs.bk
# Node.js
node_modules/
npm-debug.log*
yarn-debug.log*
yarn-error.log*
.pnpm-debug.log*
# Build outputs
/dist
/build
bindings/
# Environment variables
.env
.env.remote
.env.local
.env.development.local
.env.test.local
.env.production.local
.env.production
# IDE
.vscode/
.idea/
*.swp
*.swo
*~
# OS
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# Coverage directory used by tools like istanbul
coverage/
*.lcov
# nyc test coverage
.nyc_output
# ESLint cache
.eslintcache
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Storybook build outputs
.out
.storybook-out
.env
packages/**/dist
build-npm-package-codesign.sh
npx-cli/bin/
npx-cli/dist
npx-cli/vibe-kanban-*
vibe-kanban-*.tgz
# Development ports file
.dev-ports.json
dev_assets
/packages/web/.env.sentry-build-plugin
.ssh
vibe-kanban-cloud/
.jj
.sisyphus/
# Vite temp files
*.timestamp-*.mjs
# Mobile testing (per-developer, do not commit)
*.ts.net.crt
*.ts.net.key
Caddyfile
Caddyfile.dev
================================================
FILE: .npmrc
================================================
engine-strict=true
================================================
FILE: AGENTS.md
================================================
# Repository Guidelines
## Project Structure & Module Organization
- `crates/`: Rust workspace crates — `server` (API + bins), `db` (SQLx models/migrations), `executors`, `services`, `utils`, `git` (Git operations), `api-types` (shared API types for local + remote), `review` (PR review tool), `deployment`, `local-deployment`, `remote`.
- `packages/local-web/`: Local React + TypeScript app entrypoint (Vite, Tailwind). Shell source in `packages/local-web/src`.
- `packages/remote-web/`: Remote deployment frontend entrypoint.
- `packages/web-core/`: Shared React + TypeScript frontend library used by local + remote web (`packages/web-core/src`).
- `shared/`: Generated TypeScript types (`shared/types.ts`, `shared/remote-types.ts`) and agent tool schemas (`shared/schemas/`). Do not edit generated files directly.
- `assets/`, `dev_assets_seed/`, `dev_assets/`: Packaged and local dev assets.
- `npx-cli/`: Files published to the npm CLI package.
- `scripts/`: Dev helpers (ports, DB preparation).
- `docs/`: Documentation files.
### Crate-specific guides
- [`crates/remote/AGENTS.md`](crates/remote/AGENTS.md) — Remote server architecture, ElectricSQL integration, mutation patterns, environment variables.
- [`docs/AGENTS.md`](docs/AGENTS.md) — Mintlify documentation writing guidelines and component reference.
- [`packages/local-web/AGENTS.md`](packages/local-web/AGENTS.md) — Web app design system styling guidelines.
## Managing Shared Types Between Rust and TypeScript
ts-rs allows you to derive TypeScript types from Rust structs/enums. By annotating your Rust types with #[derive(TS)] and related macros, ts-rs will generate .ts declaration files for those types.
When making changes to the types, you can regenerate them using `pnpm run generate-types`
Do not manually edit shared/types.ts, instead edit crates/server/src/bin/generate_types.rs
For remote/cloud types, regenerate using `pnpm run remote:generate-types`
Do not manually edit shared/remote-types.ts, instead edit crates/remote/src/bin/remote-generate-types.rs (see crates/remote/AGENTS.md for details).
## Build, Test, and Development Commands
- Install: `pnpm i`
- Run dev (web app + backend with ports auto-assigned): `pnpm run dev`
- Backend (watch): `pnpm run backend:dev:watch`
- Web app (dev): `pnpm run local-web:dev`
- Type checks: `pnpm run check` (frontend + all backend Rust workspaces) and `pnpm run backend:check` (all backend Rust workspaces, including `crates/remote`)
- Rust tests: `cargo test --workspace`
- Generate TS types from Rust: `pnpm run generate-types` (or `generate-types:check` in CI)
- Prepare SQLx (offline): `pnpm run prepare-db`
- Prepare SQLx (remote package, postgres): `pnpm run remote:prepare-db`
- Local NPX build: `pnpm run build:npx` then `pnpm pack` in `npx-cli/`
- Format code: `pnpm run format` (runs `cargo fmt` for all backend Rust workspaces + web-core/web Prettier)
- Lint: `pnpm run lint` (runs web/ui ESLint + `cargo clippy` for all backend Rust workspaces)
## Before Completing a Task
- Run `pnpm run format` to format all Rust workspaces and web code.
## Coding Style & Naming Conventions
- Rust: `rustfmt` enforced (`rustfmt.toml`); group imports by crate; snake_case modules, PascalCase types.
- TypeScript/React: ESLint + Prettier (2 spaces, single quotes, 80 cols). PascalCase components, camelCase vars/functions, kebab-case file names where practical.
- Keep functions small, add `Debug`/`Serialize`/`Deserialize` where useful.
## Testing Guidelines
- Rust: prefer unit tests alongside code (`#[cfg(test)]`), run `cargo test --workspace`. Add tests for new logic and edge cases.
- Web app: ensure `pnpm run check` and `pnpm run lint` pass. If adding runtime logic, include lightweight tests (e.g., Vitest) in the same directory.
## Security & Config Tips
- Use `.env` for local overrides; never commit secrets. Key envs: `FRONTEND_PORT`, `BACKEND_PORT`, `HOST`
- Dev ports and assets are managed by `scripts/setup-dev-environment.js`.
================================================
FILE: CODE-OF-CONDUCT.md
================================================
# Contributor Covenant Code of Conduct
## Our Pledge
We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, caste, color, religion, or sexual
identity and orientation.
We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.
## Our Standards
Examples of behavior that contributes to a positive environment for our
community include:
- Demonstrating empathy and kindness toward other people
- Being respectful of differing opinions, viewpoints, and experiences
- Giving and gracefully accepting constructive feedback
- Accepting responsibility and apologizing to those affected by our mistakes,
and learning from the experience
- Focusing on what is best not just for us as individuals, but for the overall
community
Examples of unacceptable behavior include:
- The use of sexualized language or imagery, and sexual attention or advances of
any kind
- Trolling, insulting or derogatory comments, and personal or political attacks
- Public or private harassment
- Publishing others' private information, such as a physical or email address,
without their explicit permission
- Other conduct which could reasonably be considered inappropriate in a
professional setting
## Enforcement Responsibilities
Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.
Community leaders have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, and will communicate reasons for moderation
decisions when appropriate.
## Scope
This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official e-mail address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at
maintainers@bloop.ai through e-mail, with an appropriate subject line.
All complaints will be reviewed and investigated promptly and fairly.
All community leaders are obligated to respect the privacy and security of the
reporter of any incident.
Project maintainers who do not follow or enforce the Code of Conduct in good
faith may face temporary or permanent repercussions as determined by other
members of the project's leadership.
### Attribution
This Code of Conduct is adapted from the [Next.js project][nextjs-coc]
The original text is from the [Contributor Covenant][homepage],
version 2.1, available at
[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
For answers to common questions about this code of conduct, see the FAQ at
[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at
[https://www.contributor-covenant.org/translations][translations].
[nextjs-coc]: https://raw.githubusercontent.com/vercel/next.js/canary/CODE_OF_CONDUCT.md
[homepage]: https://www.contributor-covenant.org
[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
[FAQ]: https://www.contributor-covenant.org/faq
[translations]: https://www.contributor-covenant.org/translations
================================================
FILE: CONTRIBUTORS.md
================================================
# Contributing & Change Control
## Change Control Policy
All changes to production code are governed by formal change control procedures. These procedures ensure that modifications are reviewed, approved, and deployed in a controlled manner.
## Code Review Requirements
A maintainer must review pull requests before they are merged into any production branch. No code changes shall be merged without explicit approval from a qualified reviewer.
## Pull Request Process
1. Create a feature or fix branch from the base branch.
2. Make changes and open a pull request.
3. Obtain the required review and approval from a maintainer.
4. All required CI checks must pass before merging.
5. Merge only after approval has been granted and CI checks have passed.
## Separation of Duties
Development, testing, and deployment of changes shall not be performed by a single individual without approval and oversight. All significant changes require independent review to ensure correctness, security, and alignment with project standards.
## Coding Practices
Contributors are expected to follow the project's coding standards throughout the development cycle. These standards cover code quality, style consistency, and security.
### Style & Formatting
- **Rust**: Code must be formatted with `rustfmt` (config in `rustfmt.toml`). Use `snake_case` for modules and functions, `PascalCase` for types. Group imports by crate.
- **TypeScript/React**: Code must pass ESLint and Prettier (2 spaces, single quotes, 80-column width). Use `PascalCase` for components, `camelCase` for variables and functions, and `kebab-case` for file names.
- Run `pnpm run format` before submitting a pull request.
- Run `pnpm run lint` to verify there are no linting errors.
### Code Quality
- Keep functions small and focused on a single responsibility.
- Write clear, self-documenting code. Add comments only where the logic is not self-evident.
- Do not introduce unnecessary abstractions or over-engineer solutions.
- Do not manually edit generated files (e.g., `shared/types.ts`). Modify the source and regenerate.
### Testing
- **Rust**: Add unit tests alongside code using `#[cfg(test)]`. Run `cargo test --workspace` to verify.
- **TypeScript**: Ensure `pnpm run check` and `pnpm run lint` pass. Include lightweight tests (e.g., Vitest) for new runtime logic.
- All CI checks must pass before a pull request can be merged.
### Security
- Never commit secrets, credentials, or API keys. Use `.env` for local configuration.
- Be mindful of common vulnerabilities (injection, XSS, insecure deserialization) when writing code that handles user input or external data.
- Report security issues privately to the maintainers rather than opening a public issue.
### Commit Messages
- Use clear, descriptive commit messages that explain the _why_ behind a change.
- Prefix with a conventional type where appropriate (e.g., `feat:`, `fix:`, `chore:`, `docs:`, `refactor:`, `test:`).
- Keep the subject line under 72 characters. Use the body for additional context if needed.
## Scope
These procedures apply to all production branches in this repository.
================================================
FILE: Cargo.toml
================================================
[workspace]
resolver = "3"
members = [
"crates/api-types",
"crates/server",
"crates/trusted-key-auth",
"crates/mcp",
"crates/db",
"crates/executors",
"crates/services",
"crates/worktree-manager",
"crates/workspace-manager",
"crates/relay-control",
"crates/server-info",
"crates/utils",
"crates/git",
"crates/git-host",
"crates/local-deployment",
"crates/deployment",
"crates/review",
"crates/tauri-app",
]
exclude = ["crates/remote", "crates/relay-tunnel"]
[workspace.dependencies]
tokio = { version = "1.0", features = ["full"] }
axum = { version = "0.8.4", features = ["macros", "multipart", "ws"] }
tower-http = { version = "0.5", features = ["cors", "request-id", "trace", "fs", "validate-request", "compression-gzip", "compression-br"] }
serde = { version = "1.0", features = ["derive"] }
serde_json = { version = "1.0", features = ["preserve_order"] }
anyhow = "1.0"
git2 = { version = "0.20.3", default-features = false }
reqwest = { version = "0.13", default-features = false, features = ["json", "query", "stream", "rustls"] }
rustls = { version = "0.23", default-features = false, features = ["aws_lc_rs", "std", "tls12"] }
thiserror = "2.0.12"
tracing = "0.1.43"
tracing-subscriber = { version = "0.3", features = ["env-filter", "fmt", "json"] }
ts-rs = { git = "https://github.com/xazukx/ts-rs.git", branch = "use-ts-enum", features = ["uuid-impl", "chrono-impl", "no-serde-warnings", "serde-json-impl"] }
schemars = { version = "1.0.4", features = ["derive", "chrono04", "uuid1", "preserve_order"] }
serde_with = "3"
async-trait = "0.1"
aws-lc-sys = "=0.37.0"
aws-lc-rs = "=1.16.0"
[profile.release]
debug = 1
split-debuginfo = "packed"
strip = true
================================================
FILE: Dockerfile
================================================
# syntax=docker/dockerfile:1.6
FROM node:24-alpine AS fe-builder
ARG POSTHOG_API_KEY=""
ARG POSTHOG_API_ENDPOINT=""
WORKDIR /app
ENV PNPM_HOME=/pnpm
ENV PATH=${PNPM_HOME}:${PATH}
ENV VITE_PUBLIC_POSTHOG_KEY=${POSTHOG_API_KEY}
ENV VITE_PUBLIC_POSTHOG_HOST=${POSTHOG_API_ENDPOINT}
ENV NODE_OPTIONS=--max-old-space-size=4096
RUN corepack enable
RUN pnpm config set store-dir /pnpm/store
COPY pnpm-lock.yaml pnpm-workspace.yaml package.json ./
COPY packages/local-web/package.json packages/local-web/package.json
COPY packages/ui/package.json packages/ui/package.json
COPY packages/web-core/package.json packages/web-core/package.json
RUN --mount=type=cache,id=pnpm,target=/pnpm/store \
pnpm install --frozen-lockfile
COPY packages/local-web/ packages/local-web/
COPY packages/public/ packages/public/
COPY packages/ui/ packages/ui/
COPY packages/web-core/ packages/web-core/
COPY shared/ shared/
RUN pnpm -C packages/local-web build
FROM rust:1.93-slim-bookworm AS builder
ARG POSTHOG_API_KEY=""
ARG POSTHOG_API_ENDPOINT=""
ARG SENTRY_DSN=""
ARG VK_SHARED_API_BASE=""
ENV CARGO_REGISTRIES_CRATES_IO_PROTOCOL=sparse
ENV CARGO_NET_GIT_FETCH_WITH_CLI=true
ENV CARGO_TARGET_DIR=/app/target
ENV POSTHOG_API_KEY=${POSTHOG_API_KEY}
ENV POSTHOG_API_ENDPOINT=${POSTHOG_API_ENDPOINT}
ENV SENTRY_DSN=${SENTRY_DSN}
ENV VK_SHARED_API_BASE=${VK_SHARED_API_BASE}
WORKDIR /app
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
build-essential \
ca-certificates \
git \
libclang-dev \
libssl-dev \
pkg-config \
&& rm -rf /var/lib/apt/lists/*
COPY rust-toolchain.toml ./
RUN cargo --version >/dev/null
COPY Cargo.toml Cargo.lock ./
COPY crates/api-types/Cargo.toml crates/api-types/Cargo.toml
COPY crates/db/Cargo.toml crates/db/Cargo.toml
COPY crates/deployment/Cargo.toml crates/deployment/Cargo.toml
COPY crates/executors/Cargo.toml crates/executors/Cargo.toml
COPY crates/git/Cargo.toml crates/git/Cargo.toml
COPY crates/git-host/Cargo.toml crates/git-host/Cargo.toml
COPY crates/local-deployment/Cargo.toml crates/local-deployment/Cargo.toml
COPY crates/mcp/Cargo.toml crates/mcp/Cargo.toml
COPY crates/relay-control/Cargo.toml crates/relay-control/Cargo.toml
COPY crates/relay-tunnel/Cargo.toml crates/relay-tunnel/Cargo.toml
COPY crates/review/Cargo.toml crates/review/Cargo.toml
COPY crates/server/Cargo.toml crates/server/Cargo.toml
COPY crates/server-info/Cargo.toml crates/server-info/Cargo.toml
COPY crates/services/Cargo.toml crates/services/Cargo.toml
COPY crates/tauri-app/Cargo.toml crates/tauri-app/Cargo.toml
COPY crates/trusted-key-auth/Cargo.toml crates/trusted-key-auth/Cargo.toml
COPY crates/utils/Cargo.toml crates/utils/Cargo.toml
COPY crates/workspace-manager/Cargo.toml crates/workspace-manager/Cargo.toml
COPY crates/worktree-manager/Cargo.toml crates/worktree-manager/Cargo.toml
COPY crates/api-types/ crates/api-types/
COPY crates/db/ crates/db/
COPY crates/deployment/ crates/deployment/
COPY crates/executors/ crates/executors/
COPY crates/git/ crates/git/
COPY crates/git-host/ crates/git-host/
COPY crates/local-deployment/ crates/local-deployment/
COPY crates/mcp/ crates/mcp/
COPY crates/relay-control/ crates/relay-control/
COPY crates/relay-tunnel/ crates/relay-tunnel/
COPY crates/review/ crates/review/
COPY crates/server/ crates/server/
COPY crates/server-info/ crates/server-info/
COPY crates/services/ crates/services/
COPY crates/trusted-key-auth/ crates/trusted-key-auth/
COPY crates/utils/ crates/utils/
COPY crates/workspace-manager/ crates/workspace-manager/
COPY crates/worktree-manager/ crates/worktree-manager/
COPY assets/ assets/
COPY --from=fe-builder /app/packages/local-web/dist packages/local-web/dist
RUN --mount=type=cache,id=cargo-registry,target=/usr/local/cargo/registry \
--mount=type=cache,id=cargo-git,target=/usr/local/cargo/git \
--mount=type=cache,id=workspace-target,target=/app/target \
cargo build --locked --release --bin server \
&& cp /app/target/release/server /usr/local/bin/server
FROM debian:bookworm-slim AS runtime
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
ca-certificates \
git \
openssh-client \
tini \
wget \
&& rm -rf /var/lib/apt/lists/* \
&& useradd --system --create-home --uid 10001 appuser
WORKDIR /repos
COPY --from=builder /usr/local/bin/server /usr/local/bin/server
RUN mkdir -p /repos \
&& chown -R appuser:appuser /repos
USER appuser
ENV HOST=0.0.0.0
ENV PORT=3000
EXPOSE 3000
HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \
CMD ["/bin/sh", "-c", "wget --spider -q http://127.0.0.1:${PORT:-3000}/health"]
ENTRYPOINT ["/usr/bin/tini", "--", "/usr/local/bin/server"]
================================================
FILE: LICENSE
================================================
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
================================================
FILE: README.md
================================================
<p align="center">
<a href="https://vibekanban.com">
<picture>
<source srcset="packages/public/vibe-kanban-logo-dark.svg" media="(prefers-color-scheme: dark)">
<source srcset="packages/public/vibe-kanban-logo.svg" media="(prefers-color-scheme: light)">
<img src="packages/public/vibe-kanban-logo.svg" alt="Vibe Kanban Logo">
</picture>
</a>
</p>
<p align="center">Get 10X more out of Claude Code, Gemini CLI, Codex, Amp and other coding agents...</p>
<p align="center">
<a href="https://www.npmjs.com/package/vibe-kanban"><img alt="npm" src="https://img.shields.io/npm/v/vibe-kanban?style=flat-square" /></a>
<a href="https://github.com/BloopAI/vibe-kanban/blob/main/.github/workflows/publish.yml"><img alt="Build status" src="https://img.shields.io/github/actions/workflow/status/BloopAI/vibe-kanban/.github%2Fworkflows%2Fpublish.yml" /></a>
<a href="https://deepwiki.com/BloopAI/vibe-kanban"><img src="https://deepwiki.com/badge.svg" alt="Ask DeepWiki"></a>
</p>
<h1 align="center">
<a href="https://jobs.polymer.co/vibe-kanban?source=github"><strong>We're hiring!</strong></a>
</h1>

## Overview
In a world where software engineers spend most of their time planning and reviewing coding agents, the most impactful way to ship more is to get faster at planning and review.
Vibe Kanban is built for this. Use kanban issues to plan work, either privately or with your team. When you're ready to begin, create workspaces where coding agents can execute.
- **Plan with kanban issues** — create, prioritise, and assign issues on a kanban board
- **Run coding agents in workspaces** — each workspace gives an agent a branch, a terminal, and a dev server
- **Review diffs and leave inline comments** — send feedback directly to the agent without leaving the UI
- **Preview your app** — built-in browser with devtools, inspect mode, and device emulation
- **Switch between 10+ coding agents** — Claude Code, Codex, Gemini CLI, GitHub Copilot, Amp, Cursor, OpenCode, Droid, CCR, and Qwen Code
- **Create pull requests and merge** — open PRs with AI-generated descriptions, review on GitHub, and merge

One command. Describe the work, review the diff, ship it.
```bash
npx vibe-kanban
```
## Installation
Make sure you have authenticated with your favourite coding agent. A full list of supported coding agents can be found in the [docs](https://vibekanban.com/docs/supported-coding-agents). Then in your terminal run:
```bash
npx vibe-kanban
```
## Documentation
Head to the [website](https://vibekanban.com/docs) for the latest documentation and user guides.
## Self-Hosting
Want to host your own Vibe Kanban Cloud instance? See our [self-hosting guide](https://vibekanban.com/docs/self-hosting/deploy-docker).
## Support
We use [GitHub Discussions](https://github.com/BloopAI/vibe-kanban/discussions) for feature requests. Please open a discussion to create a feature request. For bugs please open an issue on this repo.
## Contributing
We would prefer that ideas and changes are first raised with the core team via [GitHub Discussions](https://github.com/BloopAI/vibe-kanban/discussions) or [Discord](https://discord.gg/AC4nwVtJM3), where we can discuss implementation details and alignment with the existing roadmap. Please do not open PRs without first discussing your proposal with the team.
## Development
### Prerequisites
- [Rust](https://rustup.rs/) (latest stable)
- [Node.js](https://nodejs.org/) (>=20)
- [pnpm](https://pnpm.io/) (>=8)
Additional development tools:
```bash
cargo install cargo-watch
cargo install sqlx-cli
```
Install dependencies:
```bash
pnpm i
```
### Running the dev server
```bash
pnpm run dev
```
This will start the backend and web app. A blank DB will be copied from the `dev_assets_seed` folder.
### Building the web app
To build just the web app:
```bash
cd packages/local-web
pnpm run build
```
### Build from source (macOS)
1. Run `./local-build.sh`
2. Test with `cd npx-cli && node bin/cli.js`
### Environment Variables
The following environment variables can be configured at build time or runtime:
| Variable | Type | Default | Description |
|----------|------|---------|-------------|
| `POSTHOG_API_KEY` | Build-time | Empty | PostHog analytics API key (disables analytics if empty) |
| `POSTHOG_API_ENDPOINT` | Build-time | Empty | PostHog analytics endpoint (disables analytics if empty) |
| `PORT` | Runtime | Auto-assign | **Production**: Server port. **Dev**: Frontend port (backend uses PORT+1) |
| `BACKEND_PORT` | Runtime | `0` (auto-assign) | Backend server port (dev mode only, overrides PORT+1) |
| `FRONTEND_PORT` | Runtime | `3000` | Frontend dev server port (dev mode only, overrides PORT) |
| `HOST` | Runtime | `127.0.0.1` | Backend server host |
| `MCP_HOST` | Runtime | Value of `HOST` | MCP server connection host (use `127.0.0.1` when `HOST=0.0.0.0` on Windows) |
| `MCP_PORT` | Runtime | Value of `BACKEND_PORT` | MCP server connection port |
| `DISABLE_WORKTREE_CLEANUP` | Runtime | Not set | Disable all git worktree cleanup including orphan and expired workspace cleanup (for debugging) |
| `VK_ALLOWED_ORIGINS` | Runtime | Not set | Comma-separated list of origins that are allowed to make backend API requests (e.g., `https://my-vibekanban-frontend.com`) |
| `VK_SHARED_API_BASE` | Runtime | Not set | Base URL for the remote/cloud API used by the local desktop app |
| `VK_SHARED_RELAY_API_BASE` | Runtime | Not set | Base URL for the relay API used by tunnel-mode connections |
| `VK_TUNNEL` | Runtime | Not set | Enable relay tunnel mode when set (requires relay API base URL) |
**Build-time variables** must be set when running `pnpm run build`. **Runtime variables** are read when the application starts.
#### Self-Hosting with a Reverse Proxy or Custom Domain
When running Vibe Kanban behind a reverse proxy (e.g., nginx, Caddy, Traefik) or on a custom domain, you must set the `VK_ALLOWED_ORIGINS` environment variable. Without this, the browser's Origin header won't match the backend's expected host, and API requests will be rejected with a 403 Forbidden error.
Set it to the full origin URL(s) where your frontend is accessible:
```bash
# Single origin
VK_ALLOWED_ORIGINS=https://vk.example.com
# Multiple origins (comma-separated)
VK_ALLOWED_ORIGINS=https://vk.example.com,https://vk-staging.example.com
```
### Remote Deployment
When running Vibe Kanban on a remote server (e.g., via systemctl, Docker, or cloud hosting), you can configure your editor to open projects via SSH:
1. **Access via tunnel**: Use Cloudflare Tunnel, ngrok, or similar to expose the web UI
2. **Configure remote SSH** in Settings → Editor Integration:
- Set **Remote SSH Host** to your server hostname or IP
- Set **Remote SSH User** to your SSH username (optional)
3. **Prerequisites**:
- SSH access from your local machine to the remote server
- SSH keys configured (passwordless authentication)
- VSCode Remote-SSH extension
When configured, the "Open in VSCode" buttons will generate URLs like `vscode://vscode-remote/ssh-remote+user@host/path` that open your local editor and connect to the remote server.
See the [documentation](https://vibekanban.com/docs/settings/general) for detailed setup instructions.
================================================
FILE: assets/scripts/toast-notification.ps1
================================================
param(
[Parameter(Mandatory=$true)]
[string]$Title,
[Parameter(Mandatory=$true)]
[string]$Message,
[Parameter(Mandatory=$false)]
[string]$AppName = "Vibe Kanban"
)
[Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType = WindowsRuntime] | Out-Null
$Template = [Windows.UI.Notifications.ToastNotificationManager]::GetTemplateContent([Windows.UI.Notifications.ToastTemplateType]::ToastText02)
$RawXml = [xml] $Template.GetXml()
($RawXml.toast.visual.binding.text|where {$_.id -eq "1"}).AppendChild($RawXml.CreateTextNode($Title)) | Out-Null
($RawXml.toast.visual.binding.text|where {$_.id -eq "2"}).AppendChild($RawXml.CreateTextNode($Message)) | Out-Null
$SerializedXml = New-Object Windows.Data.Xml.Dom.XmlDocument
$SerializedXml.LoadXml($RawXml.OuterXml)
$Toast = [Windows.UI.Notifications.ToastNotification]::new($SerializedXml)
$Toast.Tag = $AppName
$Toast.Group = $AppName
$Notifier = [Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier($AppName)
$Notifier.Show($Toast)
================================================
FILE: crates/api-types/Cargo.toml
================================================
[package]
name = "api-types"
version = "0.1.33"
edition = "2024"
[dependencies]
chrono = { version = "0.4", features = ["serde"] }
schemars = { workspace = true }
serde = { workspace = true }
serde_json = { workspace = true }
sqlx = { version = "0.8.6", default-features = false, features = ["postgres", "uuid", "chrono", "derive"] }
ts-rs = { workspace = true }
uuid = { version = "1.0", features = ["v4", "serde"] }
================================================
FILE: crates/api-types/src/attachment.rs
================================================
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use ts_rs::TS;
use uuid::Uuid;
/// An attachment links a blob to an issue or comment.
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
pub struct Attachment {
pub id: Uuid,
pub blob_id: Uuid,
pub issue_id: Option<Uuid>,
pub comment_id: Option<Uuid>,
pub created_at: DateTime<Utc>,
pub expires_at: Option<DateTime<Utc>>,
}
/// An attachment with its associated blob data (for API responses).
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
pub struct AttachmentWithBlob {
pub id: Uuid,
pub blob_id: Uuid,
pub issue_id: Option<Uuid>,
pub comment_id: Option<Uuid>,
pub created_at: DateTime<Utc>,
pub expires_at: Option<DateTime<Utc>>,
// Blob fields
pub blob_path: String,
pub thumbnail_blob_path: Option<String>,
pub original_name: String,
pub mime_type: Option<String>,
pub size_bytes: i64,
pub hash: String,
pub width: Option<i32>,
pub height: Option<i32>,
}
/// An attachment with blob data and a presigned file URL.
#[derive(Debug, Serialize, Deserialize)]
pub struct AttachmentWithUrl {
#[serde(flatten)]
pub attachment: AttachmentWithBlob,
pub file_url: Option<String>,
}
/// Response from listing attachments.
#[derive(Debug, Serialize, Deserialize)]
pub struct ListAttachmentsResponse {
pub attachments: Vec<AttachmentWithUrl>,
}
/// Response containing a presigned URL for an attachment file or thumbnail.
#[derive(Debug, Serialize, Deserialize, TS)]
pub struct AttachmentUrlResponse {
pub url: String,
}
================================================
FILE: crates/api-types/src/auth.rs
================================================
use chrono::{DateTime, Duration, Utc};
use serde::Serialize;
use uuid::Uuid;
#[derive(Debug, Clone, sqlx::FromRow, Serialize)]
pub struct AuthSession {
pub id: Uuid,
pub user_id: Uuid,
pub created_at: DateTime<Utc>,
pub last_used_at: Option<DateTime<Utc>>,
pub revoked_at: Option<DateTime<Utc>>,
pub refresh_token_id: Option<Uuid>,
pub refresh_token_issued_at: Option<DateTime<Utc>>,
}
impl AuthSession {
pub fn last_activity_at(&self) -> DateTime<Utc> {
self.last_used_at.unwrap_or(self.created_at)
}
pub fn inactivity_duration(&self, now: DateTime<Utc>) -> Duration {
now.signed_duration_since(self.last_activity_at())
}
}
================================================
FILE: crates/api-types/src/blob.rs
================================================
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use ts_rs::TS;
use uuid::Uuid;
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
pub struct Blob {
pub id: Uuid,
pub project_id: Uuid,
pub blob_path: String,
pub thumbnail_blob_path: Option<String>,
pub original_name: String,
pub mime_type: Option<String>,
pub size_bytes: i64,
pub hash: String,
pub width: Option<i32>,
pub height: Option<i32>,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}
================================================
FILE: crates/api-types/src/issue.rs
================================================
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use serde_json::Value;
use sqlx::Type;
use ts_rs::TS;
use uuid::Uuid;
use crate::some_if_present;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Type, TS)]
#[sqlx(type_name = "issue_priority", rename_all = "snake_case")]
#[serde(rename_all = "snake_case")]
pub enum IssuePriority {
Urgent,
High,
Medium,
Low,
}
#[derive(Debug, Clone, Serialize, Deserialize, TS, sqlx::FromRow)]
pub struct Issue {
pub id: Uuid,
pub project_id: Uuid,
pub issue_number: i32,
pub simple_id: String,
pub status_id: Uuid,
pub title: String,
pub description: Option<String>,
pub priority: Option<IssuePriority>,
pub start_date: Option<DateTime<Utc>>,
pub target_date: Option<DateTime<Utc>>,
pub completed_at: Option<DateTime<Utc>>,
pub sort_order: f64,
pub parent_issue_id: Option<Uuid>,
pub parent_issue_sort_order: Option<f64>,
pub extension_metadata: Value,
pub creator_user_id: Option<Uuid>,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, TS)]
#[serde(rename_all = "snake_case")]
pub enum IssueSortField {
SortOrder,
Priority,
CreatedAt,
UpdatedAt,
Title,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, TS)]
#[serde(rename_all = "snake_case")]
pub enum SortDirection {
Asc,
Desc,
}
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
pub struct CreateIssueRequest {
/// Optional client-generated ID. If not provided, server generates one.
/// Using client-generated IDs enables stable optimistic updates.
#[ts(optional)]
pub id: Option<Uuid>,
pub project_id: Uuid,
pub status_id: Uuid,
pub title: String,
pub description: Option<String>,
pub priority: Option<IssuePriority>,
pub start_date: Option<DateTime<Utc>>,
pub target_date: Option<DateTime<Utc>>,
pub completed_at: Option<DateTime<Utc>>,
pub sort_order: f64,
pub parent_issue_id: Option<Uuid>,
pub parent_issue_sort_order: Option<f64>,
pub extension_metadata: Value,
}
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
pub struct UpdateIssueRequest {
#[serde(
default,
deserialize_with = "some_if_present",
skip_serializing_if = "Option::is_none"
)]
pub status_id: Option<Uuid>,
#[serde(
default,
deserialize_with = "some_if_present",
skip_serializing_if = "Option::is_none"
)]
pub title: Option<String>,
#[serde(
default,
deserialize_with = "some_if_present",
skip_serializing_if = "Option::is_none"
)]
pub description: Option<Option<String>>,
#[serde(
default,
deserialize_with = "some_if_present",
skip_serializing_if = "Option::is_none"
)]
pub priority: Option<Option<IssuePriority>>,
#[serde(
default,
deserialize_with = "some_if_present",
skip_serializing_if = "Option::is_none"
)]
pub start_date: Option<Option<DateTime<Utc>>>,
#[serde(
default,
deserialize_with = "some_if_present",
skip_serializing_if = "Option::is_none"
)]
pub target_date: Option<Option<DateTime<Utc>>>,
#[serde(
default,
deserialize_with = "some_if_present",
skip_serializing_if = "Option::is_none"
)]
pub completed_at: Option<Option<DateTime<Utc>>>,
#[serde(
default,
deserialize_with = "some_if_present",
skip_serializing_if = "Option::is_none"
)]
pub sort_order: Option<f64>,
#[serde(
default,
deserialize_with = "some_if_present",
skip_serializing_if = "Option::is_none"
)]
pub parent_issue_id: Option<Option<Uuid>>,
#[serde(
default,
deserialize_with = "some_if_present",
skip_serializing_if = "Option::is_none"
)]
pub parent_issue_sort_order: Option<Option<f64>>,
#[serde(
default,
deserialize_with = "some_if_present",
skip_serializing_if = "Option::is_none"
)]
pub extension_metadata: Option<Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
pub struct ListIssuesQuery {
pub project_id: Uuid,
}
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
pub struct SearchIssuesRequest {
pub project_id: Uuid,
#[ts(optional)]
#[serde(skip_serializing_if = "Option::is_none")]
pub status_id: Option<Uuid>,
#[ts(optional)]
#[serde(skip_serializing_if = "Option::is_none")]
pub status_ids: Option<Vec<Uuid>>,
#[ts(optional)]
#[serde(skip_serializing_if = "Option::is_none")]
pub priority: Option<IssuePriority>,
#[ts(optional)]
#[serde(skip_serializing_if = "Option::is_none")]
pub parent_issue_id: Option<Uuid>,
#[ts(optional)]
#[serde(skip_serializing_if = "Option::is_none")]
pub search: Option<String>,
#[ts(optional)]
#[serde(skip_serializing_if = "Option::is_none")]
pub simple_id: Option<String>,
#[ts(optional)]
#[serde(skip_serializing_if = "Option::is_none")]
pub assignee_user_id: Option<Uuid>,
#[ts(optional)]
#[serde(skip_serializing_if = "Option::is_none")]
pub tag_id: Option<Uuid>,
#[ts(optional)]
#[serde(skip_serializing_if = "Option::is_none")]
pub tag_ids: Option<Vec<Uuid>>,
#[ts(optional)]
#[serde(skip_serializing_if = "Option::is_none")]
pub sort_field: Option<IssueSortField>,
#[ts(optional)]
#[serde(skip_serializing_if = "Option::is_none")]
pub sort_direction: Option<SortDirection>,
#[ts(optional)]
#[serde(skip_serializing_if = "Option::is_none")]
pub limit: Option<i32>,
#[ts(optional)]
#[serde(skip_serializing_if = "Option::is_none")]
pub offset: Option<i32>,
}
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
pub struct ListIssuesResponse {
pub issues: Vec<Issue>,
pub total_count: usize,
pub limit: usize,
pub offset: usize,
}
================================================
FILE: crates/api-types/src/issue_assignee.rs
================================================
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use ts_rs::TS;
use uuid::Uuid;
use crate::some_if_present;
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
pub struct IssueAssignee {
pub id: Uuid,
pub issue_id: Uuid,
pub user_id: Uuid,
pub assigned_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
pub struct CreateIssueAssigneeRequest {
/// Optional client-generated ID. If not provided, server generates one.
/// Using client-generated IDs enables stable optimistic updates.
#[ts(optional)]
pub id: Option<Uuid>,
pub issue_id: Uuid,
pub user_id: Uuid,
}
#[derive(Debug, Clone, Deserialize, TS)]
pub struct UpdateIssueAssigneeRequest {
#[serde(default, deserialize_with = "some_if_present")]
pub user_id: Option<Uuid>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct ListIssueAssigneesQuery {
pub issue_id: Uuid,
}
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
pub struct ListIssueAssigneesResponse {
pub issue_assignees: Vec<IssueAssignee>,
}
================================================
FILE: crates/api-types/src/issue_comment.rs
================================================
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use ts_rs::TS;
use uuid::Uuid;
use crate::some_if_present;
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
pub struct IssueComment {
pub id: Uuid,
pub issue_id: Uuid,
pub author_id: Option<Uuid>,
pub parent_id: Option<Uuid>,
pub message: String,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Deserialize, TS)]
pub struct CreateIssueCommentRequest {
/// Optional client-generated ID. If not provided, server generates one.
/// Using client-generated IDs enables stable optimistic updates.
#[ts(optional)]
pub id: Option<Uuid>,
pub issue_id: Uuid,
pub message: String,
pub parent_id: Option<Uuid>,
}
#[derive(Debug, Clone, Deserialize, TS)]
pub struct UpdateIssueCommentRequest {
#[serde(default, deserialize_with = "some_if_present")]
pub message: Option<String>,
#[serde(default, deserialize_with = "some_if_present")]
pub parent_id: Option<Option<Uuid>>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct ListIssueCommentsQuery {
pub issue_id: Uuid,
}
#[derive(Debug, Clone, Serialize, TS)]
pub struct ListIssueCommentsResponse {
pub issue_comments: Vec<IssueComment>,
}
================================================
FILE: crates/api-types/src/issue_comment_reaction.rs
================================================
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use ts_rs::TS;
use uuid::Uuid;
use crate::some_if_present;
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
pub struct IssueCommentReaction {
pub id: Uuid,
pub comment_id: Uuid,
pub user_id: Uuid,
pub emoji: String,
pub created_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Deserialize, TS)]
pub struct CreateIssueCommentReactionRequest {
/// Optional client-generated ID. If not provided, server generates one.
/// Using client-generated IDs enables stable optimistic updates.
#[ts(optional)]
pub id: Option<Uuid>,
pub comment_id: Uuid,
pub emoji: String,
}
#[derive(Debug, Clone, Deserialize, TS)]
pub struct UpdateIssueCommentReactionRequest {
#[serde(default, deserialize_with = "some_if_present")]
pub emoji: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct ListIssueCommentReactionsQuery {
pub comment_id: Uuid,
}
#[derive(Debug, Clone, Serialize, TS)]
pub struct ListIssueCommentReactionsResponse {
pub issue_comment_reactions: Vec<IssueCommentReaction>,
}
================================================
FILE: crates/api-types/src/issue_follower.rs
================================================
use serde::{Deserialize, Serialize};
use ts_rs::TS;
use uuid::Uuid;
use crate::some_if_present;
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
pub struct IssueFollower {
pub id: Uuid,
pub issue_id: Uuid,
pub user_id: Uuid,
}
#[derive(Debug, Clone, Deserialize, TS)]
pub struct CreateIssueFollowerRequest {
/// Optional client-generated ID. If not provided, server generates one.
/// Using client-generated IDs enables stable optimistic updates.
#[ts(optional)]
pub id: Option<Uuid>,
pub issue_id: Uuid,
pub user_id: Uuid,
}
#[derive(Debug, Clone, Deserialize, TS)]
pub struct UpdateIssueFollowerRequest {
#[serde(default, deserialize_with = "some_if_present")]
pub user_id: Option<Uuid>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct ListIssueFollowersQuery {
pub issue_id: Uuid,
}
#[derive(Debug, Clone, Serialize, TS)]
pub struct ListIssueFollowersResponse {
pub issue_followers: Vec<IssueFollower>,
}
================================================
FILE: crates/api-types/src/issue_relationship.rs
================================================
use chrono::{DateTime, Utc};
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use sqlx::Type;
use ts_rs::TS;
use uuid::Uuid;
use crate::some_if_present;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Type, TS, JsonSchema)]
#[sqlx(type_name = "issue_relationship_type", rename_all = "snake_case")]
#[serde(rename_all = "snake_case")]
pub enum IssueRelationshipType {
Blocking,
Related,
HasDuplicate,
}
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
pub struct IssueRelationship {
pub id: Uuid,
pub issue_id: Uuid,
pub related_issue_id: Uuid,
pub relationship_type: IssueRelationshipType,
pub created_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
pub struct CreateIssueRelationshipRequest {
/// Optional client-generated ID. If not provided, server generates one.
/// Using client-generated IDs enables stable optimistic updates.
#[ts(optional)]
pub id: Option<Uuid>,
pub issue_id: Uuid,
pub related_issue_id: Uuid,
pub relationship_type: IssueRelationshipType,
}
#[derive(Debug, Clone, Deserialize, TS)]
pub struct UpdateIssueRelationshipRequest {
#[serde(default, deserialize_with = "some_if_present")]
pub related_issue_id: Option<Uuid>,
#[serde(default, deserialize_with = "some_if_present")]
pub relationship_type: Option<IssueRelationshipType>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct ListIssueRelationshipsQuery {
pub issue_id: Uuid,
}
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
pub struct ListIssueRelationshipsResponse {
pub issue_relationships: Vec<IssueRelationship>,
}
================================================
FILE: crates/api-types/src/issue_tag.rs
================================================
use serde::{Deserialize, Serialize};
use ts_rs::TS;
use uuid::Uuid;
use crate::some_if_present;
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
pub struct IssueTag {
pub id: Uuid,
pub issue_id: Uuid,
pub tag_id: Uuid,
}
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
pub struct CreateIssueTagRequest {
/// Optional client-generated ID. If not provided, server generates one.
/// Using client-generated IDs enables stable optimistic updates.
#[ts(optional)]
pub id: Option<Uuid>,
pub issue_id: Uuid,
pub tag_id: Uuid,
}
#[derive(Debug, Clone, Deserialize, TS)]
pub struct UpdateIssueTagRequest {
#[serde(default, deserialize_with = "some_if_present")]
pub tag_id: Option<Uuid>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct ListIssueTagsQuery {
pub issue_id: Uuid,
}
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
pub struct ListIssueTagsResponse {
pub issue_tags: Vec<IssueTag>,
}
================================================
FILE: crates/api-types/src/lib.rs
================================================
//! API types shared between local and remote backends.
//!
//! This crate contains:
//! - Row types (e.g., `Issue`, `Project`) - the API representation of database entities
//! - Request types (e.g., `CreateIssueRequest`, `UpdateIssueRequest`) - API input types
//! - Shared enums (e.g., `IssuePriority`, `PullRequestStatus`)
use serde::{Deserialize, Deserializer};
pub mod attachment;
pub mod auth;
pub mod blob;
pub mod issue;
pub mod issue_assignee;
pub mod issue_comment;
pub mod issue_comment_reaction;
pub mod issue_follower;
pub mod issue_relationship;
pub mod issue_tag;
pub mod migration;
pub mod notification;
pub mod oauth;
pub mod organization_member;
pub mod organizations;
pub mod project;
pub mod project_status;
pub mod pull_request;
pub mod pull_requests_local;
pub mod relay;
pub mod response;
pub mod tag;
pub mod user;
pub mod workspace;
pub mod workspaces;
pub use attachment::*;
pub use auth::*;
pub use blob::*;
pub use issue::*;
pub use issue_assignee::*;
pub use issue_comment::*;
pub use issue_comment_reaction::*;
pub use issue_follower::*;
pub use issue_relationship::*;
pub use issue_tag::*;
pub use migration::*;
pub use notification::*;
pub use oauth::*;
pub use organization_member::*;
pub use organizations::*;
pub use project::*;
pub use project_status::*;
pub use pull_request::*;
pub use pull_requests_local::*;
pub use relay::*;
pub use response::*;
pub use tag::*;
pub use user::*;
pub use workspace::*;
pub use workspaces::*;
pub fn some_if_present<'de, D, T>(deserializer: D) -> Result<Option<T>, D::Error>
where
D: Deserializer<'de>,
T: Deserialize<'de>,
{
T::deserialize(deserializer).map(Some)
}
================================================
FILE: crates/api-types/src/migration.rs
================================================
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use uuid::Uuid;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MigrateProjectRequest {
pub organization_id: Uuid,
pub name: String,
pub color: String,
pub created_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MigrateIssueRequest {
pub project_id: Uuid,
pub status_name: String,
pub title: String,
pub description: Option<String>,
pub created_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MigratePullRequestRequest {
pub url: String,
pub number: i32,
pub status: String,
pub merged_at: Option<DateTime<Utc>>,
pub merge_commit_sha: Option<String>,
pub target_branch_name: String,
pub issue_id: Uuid,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MigrateWorkspaceRequest {
pub project_id: Uuid,
pub issue_id: Option<Uuid>,
pub local_workspace_id: Uuid,
pub archived: bool,
pub created_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BulkMigrateRequest<T> {
pub items: Vec<T>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BulkMigrateResponse {
pub ids: Vec<Uuid>,
}
================================================
FILE: crates/api-types/src/notification.rs
================================================
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use sqlx::Type;
use ts_rs::TS;
use uuid::Uuid;
use crate::{IssuePriority, some_if_present};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Type, TS)]
#[serde(rename_all = "snake_case")]
#[sqlx(type_name = "notification_type", rename_all = "snake_case")]
pub enum NotificationType {
IssueCommentAdded,
IssueStatusChanged,
IssueAssigneeChanged,
IssuePriorityChanged,
IssueUnassigned,
IssueCommentReaction,
IssueDeleted,
IssueTitleChanged,
IssueDescriptionChanged,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, TS)]
#[serde(rename_all = "snake_case")]
pub enum NotificationGroupKind {
Single,
IssueChanges,
StatusChanges,
Comments,
Reactions,
IssueDeleted,
}
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
pub struct Notification {
pub id: Uuid,
pub organization_id: Uuid,
pub user_id: Uuid,
pub notification_type: NotificationType,
pub payload: NotificationPayload,
pub issue_id: Option<Uuid>,
pub comment_id: Option<Uuid>,
pub seen: bool,
pub dismissed_at: Option<DateTime<Utc>>,
pub created_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, TS)]
pub struct NotificationPayload {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub deeplink_path: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub issue_id: Option<Uuid>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub issue_simple_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub issue_title: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub actor_user_id: Option<Uuid>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub comment_preview: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub old_status_id: Option<Uuid>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub new_status_id: Option<Uuid>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub old_status_name: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub new_status_name: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub new_title: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub old_priority: Option<IssuePriority>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub new_priority: Option<IssuePriority>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub assignee_user_id: Option<Uuid>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub emoji: Option<String>,
}
#[derive(Debug, Clone, Deserialize, TS)]
pub struct UpdateNotificationRequest {
#[serde(default, deserialize_with = "some_if_present")]
pub seen: Option<bool>,
}
================================================
FILE: crates/api-types/src/oauth.rs
================================================
use serde::{Deserialize, Serialize};
use ts_rs::TS;
use uuid::Uuid;
#[derive(Debug, Serialize, Deserialize, Clone, TS)]
pub struct HandoffInitRequest {
pub provider: String,
pub return_to: String,
pub app_challenge: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, TS)]
pub struct HandoffInitResponse {
pub handoff_id: Uuid,
pub authorize_url: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, TS)]
pub struct HandoffRedeemRequest {
pub handoff_id: Uuid,
pub app_code: String,
pub app_verifier: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, TS)]
pub struct HandoffRedeemResponse {
pub access_token: String,
pub refresh_token: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, TS)]
pub struct TokenRefreshRequest {
pub refresh_token: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, TS)]
pub struct TokenRefreshResponse {
pub access_token: String,
pub refresh_token: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, TS)]
pub struct ProviderProfile {
pub provider: String,
pub username: Option<String>,
pub display_name: Option<String>,
pub email: Option<String>,
pub avatar_url: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Clone, TS)]
pub struct ProfileResponse {
pub user_id: Uuid,
pub username: Option<String>,
pub email: String,
pub providers: Vec<ProviderProfile>,
}
#[derive(Debug, Serialize, Deserialize, Clone, TS)]
#[serde(tag = "status", rename_all = "lowercase")]
pub enum LoginStatus {
LoggedOut,
LoggedIn { profile: ProfileResponse },
}
#[derive(Debug, Serialize, Deserialize, Clone, TS)]
pub struct StatusResponse {
pub logged_in: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub profile: Option<ProfileResponse>,
#[serde(skip_serializing_if = "Option::is_none")]
pub degraded: Option<bool>,
}
================================================
FILE: crates/api-types/src/organization_member.rs
================================================
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use sqlx::Type;
use ts_rs::TS;
use uuid::Uuid;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Type, TS)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
#[sqlx(type_name = "member_role", rename_all = "lowercase")]
#[ts(use_ts_enum)]
#[ts(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum MemberRole {
Admin,
Member,
}
/// Organization member as stored in the database / streamed via Electric.
/// This is the full row type with organization_id for shapes.
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
pub struct OrganizationMember {
pub organization_id: Uuid,
pub user_id: Uuid,
pub role: MemberRole,
pub joined_at: DateTime<Utc>,
pub last_seen_at: Option<DateTime<Utc>>,
}
================================================
FILE: crates/api-types/src/organizations.rs
================================================
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use sqlx::Type;
use ts_rs::TS;
use uuid::Uuid;
use crate::MemberRole;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Type, TS)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
#[sqlx(type_name = "invitation_status", rename_all = "lowercase")]
#[ts(use_ts_enum)]
#[ts(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum InvitationStatus {
Pending,
Accepted,
Declined,
Expired,
}
#[derive(Debug, Clone, Serialize, Deserialize, sqlx::FromRow, TS)]
pub struct Organization {
pub id: Uuid,
pub name: String,
pub slug: String,
pub is_personal: bool,
pub issue_prefix: String,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize, sqlx::FromRow, TS)]
pub struct OrganizationWithRole {
pub id: Uuid,
pub name: String,
pub slug: String,
pub is_personal: bool,
pub issue_prefix: String,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
pub user_role: MemberRole,
}
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
pub struct ListOrganizationsResponse {
pub organizations: Vec<OrganizationWithRole>,
}
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
pub struct GetOrganizationResponse {
pub organization: Organization,
pub user_role: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
pub struct CreateOrganizationRequest {
pub name: String,
pub slug: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
pub struct CreateOrganizationResponse {
pub organization: OrganizationWithRole,
}
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
pub struct UpdateOrganizationRequest {
pub name: String,
}
// Invitation types
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
pub struct Invitation {
pub id: Uuid,
pub organization_id: Uuid,
pub invited_by_user_id: Option<Uuid>,
pub email: String,
pub role: MemberRole,
pub status: InvitationStatus,
pub token: String,
pub created_at: DateTime<Utc>,
pub expires_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
pub struct CreateInvitationRequest {
pub email: String,
pub role: MemberRole,
}
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
pub struct CreateInvitationResponse {
pub invitation: Invitation,
}
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
pub struct ListInvitationsResponse {
pub invitations: Vec<Invitation>,
}
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
pub struct GetInvitationResponse {
pub id: Uuid,
pub organization_slug: String,
pub role: MemberRole,
pub expires_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
pub struct AcceptInvitationResponse {
pub organization_id: String,
pub organization_slug: String,
pub role: MemberRole,
}
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
pub struct RevokeInvitationRequest {
pub invitation_id: Uuid,
}
// Member types
/// Organization member info for API responses (without organization_id).
/// See also `OrganizationMember` in organization_member.rs for the full DB row type.
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
pub struct OrganizationMemberInfo {
pub user_id: Uuid,
pub role: MemberRole,
pub joined_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
pub struct OrganizationMemberWithProfile {
pub user_id: Uuid,
pub role: MemberRole,
pub joined_at: DateTime<Utc>,
pub first_name: Option<String>,
pub last_name: Option<String>,
pub username: Option<String>,
pub email: Option<String>,
pub avatar_url: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
pub struct ListMembersResponse {
pub members: Vec<OrganizationMemberWithProfile>,
}
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
pub struct UpdateMemberRoleRequest {
pub role: MemberRole,
}
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
pub struct UpdateMemberRoleResponse {
pub user_id: Uuid,
pub role: MemberRole,
}
================================================
FILE: crates/api-types/src/project.rs
================================================
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use ts_rs::TS;
use uuid::Uuid;
use crate::some_if_present;
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
pub struct Project {
pub id: Uuid,
pub organization_id: Uuid,
pub name: String,
pub color: String,
pub sort_order: i32,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Deserialize, TS)]
pub struct CreateProjectRequest {
/// Optional client-generated ID. If not provided, server generates one.
/// Using client-generated IDs enables stable optimistic updates.
#[ts(optional)]
pub id: Option<Uuid>,
pub organization_id: Uuid,
pub name: String,
pub color: String,
}
#[derive(Debug, Clone, Deserialize, TS)]
pub struct UpdateProjectRequest {
#[serde(default, deserialize_with = "some_if_present")]
pub name: Option<String>,
#[serde(default, deserialize_with = "some_if_present")]
pub color: Option<String>,
#[serde(default, deserialize_with = "some_if_present")]
pub sort_order: Option<i32>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct ListProjectsQuery {
pub organization_id: Uuid,
}
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
pub struct ListProjectsResponse {
pub projects: Vec<Project>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct BulkUpdateProjectItem {
pub id: Uuid,
#[serde(flatten)]
pub changes: UpdateProjectRequest,
}
#[derive(Debug, Clone, Deserialize)]
pub struct BulkUpdateProjectsRequest {
pub updates: Vec<BulkUpdateProjectItem>,
}
#[derive(Debug, Clone, Serialize)]
pub struct BulkUpdateProjectsResponse {
pub data: Vec<Project>,
pub txid: i64,
}
================================================
FILE: crates/api-types/src/project_status.rs
================================================
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use ts_rs::TS;
use uuid::Uuid;
use crate::some_if_present;
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
pub struct ProjectStatus {
pub id: Uuid,
pub project_id: Uuid,
pub name: String,
pub color: String,
pub sort_order: i32,
pub hidden: bool,
pub created_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Deserialize, TS)]
pub struct CreateProjectStatusRequest {
/// Optional client-generated ID. If not provided, server generates one.
/// Using client-generated IDs enables stable optimistic updates.
#[ts(optional)]
pub id: Option<Uuid>,
pub project_id: Uuid,
pub name: String,
pub color: String,
pub sort_order: i32,
pub hidden: bool,
}
#[derive(Debug, Clone, Deserialize, TS)]
pub struct UpdateProjectStatusRequest {
#[serde(default, deserialize_with = "some_if_present")]
pub name: Option<String>,
#[serde(default, deserialize_with = "some_if_present")]
pub color: Option<String>,
#[serde(default, deserialize_with = "some_if_present")]
pub sort_order: Option<i32>,
#[serde(default, deserialize_with = "some_if_present")]
pub hidden: Option<bool>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct ListProjectStatusesQuery {
pub project_id: Uuid,
}
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
pub struct ListProjectStatusesResponse {
pub project_statuses: Vec<ProjectStatus>,
}
================================================
FILE: crates/api-types/src/pull_request.rs
================================================
use chrono::{DateTime, Utc};
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use sqlx::Type;
use ts_rs::TS;
use uuid::Uuid;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Type, TS, JsonSchema)]
#[sqlx(type_name = "pull_request_status", rename_all = "lowercase")]
#[serde(rename_all = "lowercase")]
pub enum PullRequestStatus {
Open,
Merged,
Closed,
}
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
pub struct PullRequest {
pub id: Uuid,
pub url: String,
pub number: i32,
pub status: PullRequestStatus,
pub merged_at: Option<DateTime<Utc>>,
pub merge_commit_sha: Option<String>,
pub target_branch_name: String,
pub issue_id: Uuid,
pub workspace_id: Option<Uuid>,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct ListPullRequestsQuery {
pub issue_id: Uuid,
}
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
pub struct ListPullRequestsResponse {
pub pull_requests: Vec<PullRequest>,
}
================================================
FILE: crates/api-types/src/pull_requests_local.rs
================================================
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use uuid::Uuid;
use crate::PullRequestStatus;
#[derive(Debug, Deserialize, Serialize)]
pub struct UpsertPullRequestRequest {
pub url: String,
pub number: i32,
pub status: PullRequestStatus,
#[serde(skip_serializing_if = "Option::is_none")]
pub merged_at: Option<DateTime<Utc>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub merge_commit_sha: Option<String>,
pub target_branch_name: String,
pub local_workspace_id: Uuid,
}
================================================
FILE: crates/api-types/src/relay.rs
================================================
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use ts_rs::TS;
use uuid::Uuid;
#[derive(Debug, Clone, Serialize, Deserialize, sqlx::FromRow, TS)]
pub struct RelayHost {
pub id: Uuid,
pub owner_user_id: Uuid,
pub name: String,
pub status: String,
pub last_seen_at: Option<DateTime<Utc>>,
pub agent_version: Option<String>,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
pub access_role: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
pub struct ListRelayHostsResponse {
pub hosts: Vec<RelayHost>,
}
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
pub struct RelaySessionAuthCodeResponse {
pub session_id: Uuid,
pub code: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, sqlx::FromRow, TS)]
pub struct RelaySession {
pub id: Uuid,
pub host_id: Uuid,
pub request_user_id: Uuid,
pub state: String,
pub created_at: DateTime<Utc>,
pub expires_at: DateTime<Utc>,
pub claimed_at: Option<DateTime<Utc>>,
pub ended_at: Option<DateTime<Utc>>,
}
================================================
FILE: crates/api-types/src/response.rs
================================================
use serde::{Deserialize, Serialize};
use ts_rs::TS;
/// Response wrapper for mutation endpoints (create/update).
/// Includes the Postgres transaction ID for Electric sync.
#[derive(Debug, Serialize, Deserialize)]
pub struct MutationResponse<T> {
pub data: T,
pub txid: i64,
}
/// Response wrapper for delete endpoints.
#[derive(Debug, Serialize, Deserialize, TS)]
pub struct DeleteResponse {
pub txid: i64,
}
================================================
FILE: crates/api-types/src/tag.rs
================================================
use serde::{Deserialize, Serialize};
use ts_rs::TS;
use uuid::Uuid;
use crate::some_if_present;
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
pub struct Tag {
pub id: Uuid,
pub project_id: Uuid,
pub name: String,
pub color: String,
}
#[derive(Debug, Clone, Deserialize, TS)]
pub struct CreateTagRequest {
/// Optional client-generated ID. If not provided, server generates one.
/// Using client-generated IDs enables stable optimistic updates.
#[ts(optional)]
pub id: Option<Uuid>,
pub project_id: Uuid,
pub name: String,
pub color: String,
}
#[derive(Debug, Clone, Deserialize, TS)]
pub struct UpdateTagRequest {
#[serde(default, deserialize_with = "some_if_present")]
pub name: Option<String>,
#[serde(default, deserialize_with = "some_if_present")]
pub color: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct ListTagsQuery {
pub project_id: Uuid,
}
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
pub struct ListTagsResponse {
pub tags: Vec<Tag>,
}
================================================
FILE: crates/api-types/src/user.rs
================================================
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use ts_rs::TS;
use uuid::Uuid;
#[derive(Debug, Clone, Serialize, Deserialize, sqlx::FromRow, TS)]
pub struct User {
pub id: Uuid,
pub email: String,
pub first_name: Option<String>,
pub last_name: Option<String>,
pub username: Option<String>,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
pub struct UserData {
pub user_id: Uuid,
pub first_name: Option<String>,
pub last_name: Option<String>,
pub username: Option<String>,
}
================================================
FILE: crates/api-types/src/workspace.rs
================================================
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use ts_rs::TS;
use uuid::Uuid;
/// Workspace metadata pushed from local clients
#[derive(Debug, Clone, Serialize, Deserialize, sqlx::FromRow, TS)]
pub struct Workspace {
pub id: Uuid,
pub project_id: Uuid,
pub owner_user_id: Uuid,
pub issue_id: Option<Uuid>,
pub local_workspace_id: Option<Uuid>,
pub name: Option<String>,
pub archived: bool,
pub files_changed: Option<i32>,
pub lines_added: Option<i32>,
pub lines_removed: Option<i32>,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}
================================================
FILE: crates/api-types/src/workspaces.rs
================================================
use serde::{Deserialize, Serialize};
use uuid::Uuid;
#[derive(Debug, Deserialize, Serialize)]
pub struct DeleteWorkspaceRequest {
pub local_workspace_id: Uuid,
}
#[derive(Debug, Serialize)]
pub struct CreateWorkspaceRequest {
pub project_id: Uuid,
pub local_workspace_id: Uuid,
pub issue_id: Uuid,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub archived: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub files_changed: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub lines_added: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub lines_removed: Option<i32>,
}
#[derive(Debug, Deserialize, Serialize)]
pub struct UpdateWorkspaceRequest {
pub local_workspace_id: Uuid,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<Option<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub archived: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub files_changed: Option<Option<i32>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub lines_added: Option<Option<i32>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub lines_removed: Option<Option<i32>>,
}
================================================
FILE: crates/db/.sqlx/query-039c2290b6cf7cdc905c8ddc44293f067fe7e8f246da737e4baad3f494ac8b8f.json
================================================
{
"db_name": "SQLite",
"query": "INSERT INTO execution_processes (\n id, session_id, run_reason, executor_action,\n status, exit_code, started_at, completed_at, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
"describe": {
"columns": [],
"parameters": {
"Right": 10
},
"nullable": []
},
"hash": "039c2290b6cf7cdc905c8ddc44293f067fe7e8f246da737e4baad3f494ac8b8f"
}
================================================
FILE: crates/db/.sqlx/query-04c207be2c3c2c07ff42c695542504c358d67c1f40ca2b1e75a396a90c173a53.json
================================================
{
"db_name": "SQLite",
"query": "SELECT eprs.after_head_commit\n FROM execution_process_repo_states eprs\n JOIN execution_processes ep ON ep.id = eprs.execution_process_id\n WHERE ep.session_id = $1\n AND eprs.repo_id = $2\n AND ep.created_at < (SELECT created_at FROM execution_processes WHERE id = $3)\n ORDER BY ep.created_at DESC\n LIMIT 1",
"describe": {
"columns": [
{
"name": "after_head_commit",
"ordinal": 0,
"type_info": "Text"
}
],
"parameters": {
"Right": 3
},
"nullable": [
true
]
},
"hash": "04c207be2c3c2c07ff42c695542504c358d67c1f40ca2b1e75a396a90c173a53"
}
================================================
FILE: crates/db/.sqlx/query-04e5a05c7cad438d39c4c8590410889ab1eefa7376d474a10c119d3f4d9143c7.json
================================================
{
"db_name": "SQLite",
"query": "SELECT\n id as \"id!: Uuid\",\n execution_process_id as \"execution_process_id!: Uuid\",\n agent_session_id,\n agent_message_id,\n prompt,\n summary,\n seen as \"seen!: bool\",\n created_at as \"created_at!: DateTime<Utc>\",\n updated_at as \"updated_at!: DateTime<Utc>\"\n FROM coding_agent_turns\n WHERE agent_session_id = ?\n ORDER BY updated_at DESC\n LIMIT 1",
"describe": {
"columns": [
{
"name": "id!: Uuid",
"ordinal": 0,
"type_info": "Blob"
},
{
"name": "execution_process_id!: Uuid",
"ordinal": 1,
"type_info": "Blob"
},
{
"name": "agent_session_id",
"ordinal": 2,
"type_info": "Text"
},
{
"name": "agent_message_id",
"ordinal": 3,
"type_info": "Text"
},
{
"name": "prompt",
"ordinal": 4,
"type_info": "Text"
},
{
"name": "summary",
"ordinal": 5,
"type_info": "Text"
},
{
"name": "seen!: bool",
"ordinal": 6,
"type_info": "Integer"
},
{
"name": "created_at!: DateTime<Utc>",
"ordinal": 7,
"type_info": "Text"
},
{
"name": "updated_at!: DateTime<Utc>",
"ordinal": 8,
"type_info": "Text"
}
],
"parameters": {
"Right": 1
},
"nullable": [
true,
false,
true,
true,
true,
true,
false,
false,
false
]
},
"hash": "04e5a05c7cad438d39c4c8590410889ab1eefa7376d474a10c119d3f4d9143c7"
}
================================================
FILE: crates/db/.sqlx/query-04f17449e3e12785affab91e4eab308103491e34c022199b7b060e04fa8aed0f.json
================================================
{
"db_name": "SQLite",
"query": "SELECT id as \"id!: Uuid\",\n file_path as \"file_path!\",\n original_name as \"original_name!\",\n mime_type,\n size_bytes as \"size_bytes!\",\n hash as \"hash!\",\n created_at as \"created_at!: DateTime<Utc>\",\n updated_at as \"updated_at!: DateTime<Utc>\"\n FROM attachments\n WHERE hash = $1",
"describe": {
"columns": [
{
"name": "id!: Uuid",
"ordinal": 0,
"type_info": "Blob"
},
{
"name": "file_path!",
"ordinal": 1,
"type_info": "Text"
},
{
"name": "original_name!",
"ordinal": 2,
"type_info": "Text"
},
{
"name": "mime_type",
"ordinal": 3,
"type_info": "Text"
},
{
"name": "size_bytes!",
"ordinal": 4,
"type_info": "Integer"
},
{
"name": "hash!",
"ordinal": 5,
"type_info": "Text"
},
{
"name": "created_at!: DateTime<Utc>",
"ordinal": 6,
"type_info": "Text"
},
{
"name": "updated_at!: DateTime<Utc>",
"ordinal": 7,
"type_info": "Text"
}
],
"parameters": {
"Right": 1
},
"nullable": [
true,
false,
false,
true,
true,
false,
false,
false
]
},
"hash": "04f17449e3e12785affab91e4eab308103491e34c022199b7b060e04fa8aed0f"
}
================================================
FILE: crates/db/.sqlx/query-0a805c219c9028b2677bd94ccabd47916e60d26c1cede27e467f0ae91f6639ab.json
================================================
{
"db_name": "SQLite",
"query": "UPDATE migration_state\n SET status = 'migrated',\n remote_id = $3,\n error_message = NULL,\n updated_at = datetime('now', 'subsec')\n WHERE entity_type = $1 AND local_id = $2",
"describe": {
"columns": [],
"parameters": {
"Right": 3
},
"nullable": []
},
"hash": "0a805c219c9028b2677bd94ccabd47916e60d26c1cede27e467f0ae91f6639ab"
}
================================================
FILE: crates/db/.sqlx/query-0ab07fb562e61148f3f07f33f766ea12c73d467df4522240008370f681c8409a.json
================================================
{
"db_name": "SQLite",
"query": "UPDATE workspace_repos\n SET target_branch = $1, updated_at = datetime('now')\n WHERE target_branch = $2\n AND workspace_id IN (\n SELECT w.id FROM workspaces w\n JOIN tasks t ON w.task_id = t.id\n WHERE t.parent_workspace_id = $3\n )",
"describe": {
"columns": [],
"parameters": {
"Right": 3
},
"nullable": []
},
"hash": "0ab07fb562e61148f3f07f33f766ea12c73d467df4522240008370f681c8409a"
}
================================================
FILE: crates/db/.sqlx/query-0ac0d0f3826330836e3fd1bf57c42777eb489ac41a650f9361e6b563fc69bf35.json
================================================
{
"db_name": "SQLite",
"query": "UPDATE migration_state\n SET status = 'pending',\n error_message = NULL,\n updated_at = datetime('now', 'subsec')\n WHERE status = 'failed'",
"describe": {
"columns": [],
"parameters": {
"Right": 0
},
"nullable": []
},
"hash": "0ac0d0f3826330836e3fd1bf57c42777eb489ac41a650f9361e6b563fc69bf35"
}
================================================
FILE: crates/db/.sqlx/query-0c7b20643f119afd3e233105b0fa2920e8e940bdad86cdc95d01e485a20d6ed4.json
================================================
{
"db_name": "SQLite",
"query": "SELECT\n ep.id as \"id!: Uuid\",\n ep.session_id as \"session_id!: Uuid\",\n ep.run_reason as \"run_reason!: ExecutionProcessRunReason\",\n ep.executor_action as \"executor_action!: sqlx::types::Json<ExecutorActionField>\",\n ep.status as \"status!: ExecutionProcessStatus\",\n ep.exit_code,\n ep.dropped as \"dropped!: bool\",\n ep.started_at as \"started_at!: DateTime<Utc>\",\n ep.completed_at as \"completed_at?: DateTime<Utc>\",\n ep.created_at as \"created_at!: DateTime<Utc>\",\n ep.updated_at as \"updated_at!: DateTime<Utc>\"\n FROM execution_processes ep\n JOIN sessions s ON ep.session_id = s.id\n WHERE s.workspace_id = ? AND ep.run_reason = ? AND ep.dropped = FALSE\n ORDER BY ep.created_at DESC LIMIT 1",
"describe": {
"columns": [
{
"name": "id!: Uuid",
"ordinal": 0,
"type_info": "Blob"
},
{
"name": "session_id!: Uuid",
"ordinal": 1,
"type_info": "Blob"
},
{
"name": "run_reason!: ExecutionProcessRunReason",
"ordinal": 2,
"type_info": "Text"
},
{
"name": "executor_action!: sqlx::types::Json<ExecutorActionField>",
"ordinal": 3,
"type_info": "Text"
},
{
"name": "status!: ExecutionProcessStatus",
"ordinal": 4,
"type_info": "Text"
},
{
"name": "exit_code",
"ordinal": 5,
"type_info": "Integer"
},
{
"name": "dropped!: bool",
"ordinal": 6,
"type_info": "Integer"
},
{
"name": "started_at!: DateTime<Utc>",
"ordinal": 7,
"type_info": "Text"
},
{
"name": "completed_at?: DateTime<Utc>",
"ordinal": 8,
"type_info": "Text"
},
{
"name": "created_at!: DateTime<Utc>",
"ordinal": 9,
"type_info": "Text"
},
{
"name": "updated_at!: DateTime<Utc>",
"ordinal": 10,
"type_info": "Text"
}
],
"parameters": {
"Right": 2
},
"nullable": [
true,
false,
false,
false,
false,
true,
false,
false,
true,
false,
false
]
},
"hash": "0c7b20643f119afd3e233105b0fa2920e8e940bdad86cdc95d01e485a20d6ed4"
}
================================================
FILE: crates/db/.sqlx/query-0f90844fc62261ed140e02515ae464b940743113814507313c9fdc176000d1bf.json
================================================
{
"db_name": "SQLite",
"query": "UPDATE migration_state\n SET status = 'skipped',\n error_message = $3,\n updated_at = datetime('now', 'subsec')\n WHERE entity_type = $1 AND local_id = $2",
"describe": {
"columns": [],
"parameters": {
"Right": 3
},
"nullable": []
},
"hash": "0f90844fc62261ed140e02515ae464b940743113814507313c9fdc176000d1bf"
}
================================================
FILE: crates/db/.sqlx/query-1085d1f8107c7e16fc2058ef610918760d8d420f0fca97adecd76d698f6f3a51.json
================================================
{
"db_name": "SQLite",
"query": "SELECT\n id as \"id!: Uuid\",\n workspace_id as \"workspace_id!: Uuid\",\n repo_id as \"repo_id!: Uuid\",\n merge_type as \"merge_type!: MergeType\",\n merge_commit,\n pr_number,\n pr_url,\n pr_status as \"pr_status?: MergeStatus\",\n pr_merged_at as \"pr_merged_at?: DateTime<Utc>\",\n pr_merge_commit_sha,\n target_branch_name as \"target_branch_name!: String\",\n created_at as \"created_at!: DateTime<Utc>\"\n FROM merges\n WHERE workspace_id = $1 AND repo_id = $2\n ORDER BY created_at DESC",
"describe": {
"columns": [
{
"name": "id!: Uuid",
"ordinal": 0,
"type_info": "Blob"
},
{
"name": "workspace_id!: Uuid",
"ordinal": 1,
"type_info": "Blob"
},
{
"name": "repo_id!: Uuid",
"ordinal": 2,
"type_info": "Blob"
},
{
"name": "merge_type!: MergeType",
"ordinal": 3,
"type_info": "Text"
},
{
"name": "merge_commit",
"ordinal": 4,
"type_info": "Text"
},
{
"name": "pr_number",
"ordinal": 5,
"type_info": "Integer"
},
{
"name": "pr_url",
"ordinal": 6,
"type_info": "Text"
},
{
"name": "pr_status?: MergeStatus",
"ordinal": 7,
"type_info": "Text"
},
{
"name": "pr_merged_at?: DateTime<Utc>",
"ordinal": 8,
"type_info": "Text"
},
{
"name": "pr_merge_commit_sha",
"ordinal": 9,
"type_info": "Text"
},
{
"name": "target_branch_name!: String",
"ordinal": 10,
"type_info": "Text"
},
{
"name": "created_at!: DateTime<Utc>",
"ordinal": 11,
"type_info": "Text"
}
],
"parameters": {
"Right": 2
},
"nullable": [
true,
false,
false,
false,
true,
true,
true,
true,
true,
true,
false,
false
]
},
"hash": "1085d1f8107c7e16fc2058ef610918760d8d420f0fca97adecd76d698f6f3a51"
}
================================================
FILE: crates/db/.sqlx/query-11793c98a4bee67fce9972ed6b10a18226e0455a0e8d113d04c4d5148b72aec7.json
================================================
{
"db_name": "SQLite",
"query": "SELECT id as \"id!: Uuid\", tag_name, content as \"content!\", created_at as \"created_at!: DateTime<Utc>\", updated_at as \"updated_at!: DateTime<Utc>\"\n FROM tags\n WHERE id = $1",
"describe": {
"columns": [
{
"name": "id!: Uuid",
"ordinal": 0,
"type_info": "Blob"
},
{
"name": "tag_name",
"ordinal": 1,
"type_info": "Text"
},
{
"name": "content!",
"ordinal": 2,
"type_info": "Text"
},
{
"name": "created_at!: DateTime<Utc>",
"ordinal": 3,
"type_info": "Text"
},
{
"name": "updated_at!: DateTime<Utc>",
"ordinal": 4,
"type_info": "Text"
}
],
"parameters": {
"Right": 1
},
"nullable": [
true,
false,
false,
false,
false
]
},
"hash": "11793c98a4bee67fce9972ed6b10a18226e0455a0e8d113d04c4d5148b72aec7"
}
================================================
FILE: crates/db/.sqlx/query-12a5c0a8b95d8cb87f1c869ff35692a2cee52bc418b06d00a31a4c139e12d18a.json
================================================
{
"db_name": "SQLite",
"query": "\n SELECT \n ep.id as \"execution_id!: Uuid\", \n ep.session_id as \"session_id!: Uuid\"\n FROM execution_processes ep\n WHERE EXISTS (\n SELECT 1 FROM execution_process_logs epl WHERE epl.execution_id = ep.id\n )\n ",
"describe": {
"columns": [
{
"name": "execution_id!: Uuid",
"ordinal": 0,
"type_info": "Blob"
},
{
"name": "session_id!: Uuid",
"ordinal": 1,
"type_info": "Blob"
}
],
"parameters": {
"Right": 0
},
"nullable": [
true,
false
]
},
"hash": "12a5c0a8b95d8cb87f1c869ff35692a2cee52bc418b06d00a31a4c139e12d18a"
}
================================================
FILE: crates/db/.sqlx/query-13826fc6fdd367255cb921640e5972f30905ac7a81ad477cf8bbcfc24f06f39b.json
================================================
{
"db_name": "SQLite",
"query": "\n SELECT\n ep.id as \"id!: Uuid\",\n ep.session_id as \"session_id!: Uuid\",\n ep.run_reason as \"run_reason!: ExecutionProcessRunReason\",\n ep.executor_action as \"executor_action!: sqlx::types::Json<ExecutorActionField>\",\n ep.status as \"status!: ExecutionProcessStatus\",\n ep.exit_code,\n ep.dropped as \"dropped!: bool\",\n ep.started_at as \"started_at!: DateTime<Utc>\",\n ep.completed_at as \"completed_at?: DateTime<Utc>\",\n ep.created_at as \"created_at!: DateTime<Utc>\",\n ep.updated_at as \"updated_at!: DateTime<Utc>\"\n FROM execution_processes ep\n JOIN sessions s ON ep.session_id = s.id\n WHERE s.workspace_id = ?\n AND ep.status = 'running'\n AND ep.run_reason = 'devserver'\n ORDER BY ep.created_at DESC\n ",
"describe": {
"columns": [
{
"name": "id!: Uuid",
"ordinal": 0,
"type_info": "Blob"
},
{
"name": "session_id!: Uuid",
"ordinal": 1,
"type_info": "Blob"
},
{
"name": "run_reason!: ExecutionProcessRunReason",
"ordinal": 2,
"type_info": "Text"
},
{
"name": "executor_action!: sqlx::types::Json<ExecutorActionField>",
"ordinal": 3,
"type_info": "Text"
},
{
"name": "status!: ExecutionProcessStatus",
"ordinal": 4,
"type_info": "Text"
},
{
"name": "exit_code",
"ordinal": 5,
"type_info": "Integer"
},
{
"name": "dropped!: bool",
"ordinal": 6,
"type_info": "Integer"
},
{
"name": "started_at!: DateTime<Utc>",
"ordinal": 7,
"type_info": "Text"
},
{
"name": "completed_at?: DateTime<Utc>",
"ordinal": 8,
"type_info": "Text"
},
{
"name": "created_at!: DateTime<Utc>",
"ordinal": 9,
"type_info": "Text"
},
{
"name": "updated_at!: DateTime<Utc>",
"ordinal": 10,
"type_info": "Text"
}
],
"parameters": {
"Right": 1
},
"nullable": [
true,
false,
false,
false,
false,
true,
false,
false,
true,
false,
false
]
},
"hash": "13826fc6fdd367255cb921640e5972f30905ac7a81ad477cf8bbcfc24f06f39b"
}
================================================
FILE: crates/db/.sqlx/query-167c1d13ee37ebe62cd2316feaf6b5354eb26d0a8fc16efb22827a5cde59a60e.json
================================================
{
"db_name": "SQLite",
"query": "SELECT COUNT(1) as \"count!: i64\"\n FROM merges\n WHERE workspace_id = $1\n AND merge_type = 'pr'\n AND pr_status = 'open'",
"describe": {
"columns": [
{
"name": "count!: i64",
"ordinal": 0,
"type_info": "Integer"
}
],
"parameters": {
"Right": 1
},
"nullable": [
false
]
},
"hash": "167c1d13ee37ebe62cd2316feaf6b5354eb26d0a8fc16efb22827a5cde59a60e"
}
================================================
FILE: crates/db/.sqlx/query-1b186dc075846fc1f7270a942afbf82a88806ee6ababdb437ab5e97ddd2122da.json
================================================
{
"db_name": "SQLite",
"query": "SELECT COUNT(*) as \"count!: i64\"\n FROM execution_processes ep\n WHERE ep.session_id = $1\n AND ep.status = 'running'\n AND ep.run_reason = 'codingagent'",
"describe": {
"columns": [
{
"name": "count!: i64",
"ordinal": 0,
"type_info": "Integer"
}
],
"parameters": {
"Right": 1
},
"nullable": [
false
]
},
"hash": "1b186dc075846fc1f7270a942afbf82a88806ee6ababdb437ab5e97ddd2122da"
}
================================================
FILE: crates/db/.sqlx/query-1c2201b0ca9305283634fe5c72df6eac3ad954c1238088a84a4b9085b1dbdb74.json
================================================
{
"db_name": "SQLite",
"query": "DELETE FROM workspaces WHERE id = $1",
"describe": {
"columns": [],
"parameters": {
"Right": 1
},
"nullable": []
},
"hash": "1c2201b0ca9305283634fe5c72df6eac3ad954c1238088a84a4b9085b1dbdb74"
}
================================================
FILE: crates/db/.sqlx/query-218f1d14c72148ea88d75e816e1ba111c8f4678a7e428b15462e6dfc74c25b03.json
================================================
{
"db_name": "SQLite",
"query": "UPDATE tags\n SET tag_name = $2, content = $3, updated_at = datetime('now', 'subsec')\n WHERE id = $1\n RETURNING id as \"id!: Uuid\", tag_name, content as \"content!\", created_at as \"created_at!: DateTime<Utc>\", updated_at as \"updated_at!: DateTime<Utc>\"",
"describe": {
"columns": [
{
"name": "id!: Uuid",
"ordinal": 0,
"type_info": "Blob"
},
{
"name": "tag_name",
"ordinal": 1,
"type_info": "Text"
},
{
"name": "content!",
"ordinal": 2,
"type_info": "Text"
},
{
"name": "created_at!: DateTime<Utc>",
"ordinal": 3,
"type_info": "Text"
},
{
"name": "updated_at!: DateTime<Utc>",
"ordinal": 4,
"type_info": "Text"
}
],
"parameters": {
"Right": 3
},
"nullable": [
true,
false,
false,
false,
false
]
},
"hash": "218f1d14c72148ea88d75e816e1ba111c8f4678a7e428b15462e6dfc74c25b03"
}
================================================
FILE: crates/db/.sqlx/query-2547a5d06fd3b17360bff34a04b7d3d929c13ef0d86395a9201834d8fc955295.json
================================================
{
"db_name": "SQLite",
"query": "SELECT\n cat.agent_session_id as \"session_id!\",\n cat.agent_message_id as \"message_id\"\n FROM execution_processes ep\n JOIN coding_agent_turns cat ON ep.id = cat.execution_process_id\n WHERE ep.session_id = $1\n AND ep.run_reason = 'codingagent'\n AND ep.dropped = FALSE\n AND cat.agent_session_id IS NOT NULL\n ORDER BY ep.created_at DESC\n LIMIT 1",
"describe": {
"columns": [
{
"name": "session_id!",
"ordinal": 0,
"type_info": "Text"
},
{
"name": "message_id",
"ordinal": 1,
"type_info": "Text"
}
],
"parameters": {
"Right": 1
},
"nullable": [
true,
true
]
},
"hash": "2547a5d06fd3b17360bff34a04b7d3d929c13ef0d86395a9201834d8fc955295"
}
================================================
FILE: crates/db/.sqlx/query-256f9e937384933464e6d4d00ee977bbb2915ef80930c8b5c0b0525367a5264d.json
================================================
{
"db_name": "SQLite",
"query": "UPDATE repos SET name = $1, display_name = $2, updated_at = datetime('now', 'subsec') WHERE id = $3",
"describe": {
"columns": [],
"parameters": {
"Right": 3
},
"nullable": []
},
"hash": "256f9e937384933464e6d4d00ee977bbb2915ef80930c8b5c0b0525367a5264d"
}
================================================
FILE: crates/db/.sqlx/query-29cc3aa8d0ad5deda94494402500a4125e29381d63f18ef083cc4da95e2c5db5.json
================================================
{
"db_name": "SQLite",
"query": "SELECT w.id as \"workspace_id!: Uuid\"\n FROM workspaces w\n WHERE w.container_ref = ?",
"describe": {
"columns": [
{
"name": "workspace_id!: Uuid",
"ordinal": 0,
"type_info": "Blob"
}
],
"parameters": {
"Right": 1
},
"nullable": [
true
]
},
"hash": "29cc3aa8d0ad5deda94494402500a4125e29381d63f18ef083cc4da95e2c5db5"
}
================================================
FILE: crates/db/.sqlx/query-2a57b702e52b3cc9bdbc361267985958b11d4493b01a9ab8daedf5d951422897.json
================================================
{
"db_name": "SQLite",
"query": "UPDATE workspaces SET updated_at = datetime('now', 'subsec') WHERE id = ?",
"describe": {
"columns": [],
"parameters": {
"Right": 1
},
"nullable": []
},
"hash": "2a57b702e52b3cc9bdbc361267985958b11d4493b01a9ab8daedf5d951422897"
}
================================================
FILE: crates/db/.sqlx/query-2b253f92ac5daa4864e7335fde1b82625f504fd73d19b21992497219a9c3170a.json
================================================
{
"db_name": "SQLite",
"query": "INSERT INTO repos (id, path, name, display_name)\n VALUES ($1, $2, $3, $4)\n ON CONFLICT(path) DO UPDATE SET updated_at = updated_at\n RETURNING id as \"id!: Uuid\",\n path,\n name,\n display_name,\n setup_script,\n cleanup_script,\n archive_script,\n copy_files,\n parallel_setup_script as \"parallel_setup_script!: bool\",\n dev_server_script,\n default_target_branch,\n default_working_dir,\n created_at as \"created_at!: DateTime<Utc>\",\n updated_at as \"updated_at!: DateTime<Utc>\"",
"describe": {
"columns": [
{
"name": "id!: Uuid",
"ordinal": 0,
"type_info": "Blob"
},
{
"name": "path",
"ordinal": 1,
"type_info": "Text"
},
{
"name": "name",
"ordinal": 2,
"type_info": "Text"
},
{
"name": "display_name",
"ordinal": 3,
"type_info": "Text"
},
{
"name": "setup_script",
"ordinal": 4,
"type_info": "Text"
},
{
"name": "cleanup_script",
"ordinal": 5,
"type_info": "Text"
},
{
"name": "archive_script",
"ordinal": 6,
"type_info": "Text"
},
{
"name": "copy_files",
"ordinal": 7,
"type_info": "Text"
},
{
"name": "parallel_setup_script!: bool",
"ordinal": 8,
"type_info": "Integer"
},
{
"name": "dev_server_script",
"ordinal": 9,
"type_info": "Text"
},
{
"name": "default_target_branch",
"ordinal": 10,
"type_info": "Text"
},
{
"name": "default_working_dir",
"ordinal": 11,
"type_info": "Text"
},
{
"name": "created_at!: DateTime<Utc>",
"ordinal": 12,
"type_info": "Text"
},
{
"name": "updated_at!: DateTime<Utc>",
"ordinal": 13,
"type_info": "Text"
}
],
"parameters": {
"Right": 4
},
"nullable": [
true,
false,
false,
false,
true,
true,
true,
true,
false,
true,
true,
true,
false,
false
]
},
"hash": "2b253f92ac5daa4864e7335fde1b82625f504fd73d19b21992497219a9c3170a"
}
================================================
FILE: crates/db/.sqlx/query-2c0172d5b2c5bff0914727a57983d5c336f5b2dfa73ca6c2efa4ea23bb526e05.json
================================================
{
"db_name": "SQLite",
"query": "SELECT id as \"id!: Uuid\",\n name,\n default_agent_working_dir,\n remote_project_id as \"remote_project_id: Uuid\",\n created_at as \"created_at!: DateTime<Utc>\",\n updated_at as \"updated_at!: DateTime<Utc>\"\n FROM projects\n ORDER BY created_at DESC",
"describe": {
"columns": [
{
"name": "id!: Uuid",
"ordinal": 0,
"type_info": "Blob"
},
{
"name": "name",
"ordinal": 1,
"type_info": "Text"
},
{
"name": "default_agent_working_dir",
"ordinal": 2,
"type_info": "Text"
},
{
"name": "remote_project_id: Uuid",
"ordinal": 3,
"type_info": "Blob"
},
{
"name": "created_at!: DateTime<Utc>",
"ordinal": 4,
"type_info": "Text"
},
{
"name": "updated_at!: DateTime<Utc>",
"ordinal": 5,
"type_info": "Text"
}
],
"parameters": {
"Right": 0
},
"nullable": [
true,
false,
true,
true,
false,
false
]
},
"hash": "2c0172d5b2c5bff0914727a57983d5c336f5b2dfa73ca6c2efa4ea23bb526e05"
}
================================================
FILE: crates/db/.sqlx/query-2c71bf4dd5683e0dedf2341e52880ff2c0765659d3cf53d62faa54adc91071dd.json
================================================
{
"db_name": "SQLite",
"query": "SELECT w.name AS \"name: String\"\n FROM workspaces w\n JOIN workspace_repos wr ON wr.workspace_id = w.id\n WHERE wr.repo_id = $1\n AND w.archived = FALSE",
"describe": {
"columns": [
{
"name": "name: String",
"ordinal": 0,
"type_info": "Text"
}
],
"parameters": {
"Right": 1
},
"nullable": [
true
]
},
"hash": "2c71bf4dd5683e0dedf2341e52880ff2c0765659d3cf53d62faa54adc91071dd"
}
================================================
FILE: crates/db/.sqlx/query-2cb5a269045f23da9f4ee0ee679ccb7fffc39d4b37b1b58357b11a7abfdba125.json
================================================
{
"db_name": "SQLite",
"query": "UPDATE sessions SET executor = $1, updated_at = CURRENT_TIMESTAMP WHERE id = $2",
"describe": {
"columns": [],
"parameters": {
"Right": 2
},
"nullable": []
},
"hash": "2cb5a269045f23da9f4ee0ee679ccb7fffc39d4b37b1b58357b11a7abfdba125"
}
================================================
FILE: crates/db/.sqlx/query-31f4e685fc0b1103ff662b3866b3bb422cc7fc8e0661ebfed30ffd16ea7ed8c0.json
================================================
{
"db_name": "SQLite",
"query": "SELECT id as \"id!: Uuid\",\n workspace_id as \"workspace_id!: Uuid\",\n repo_id as \"repo_id!: Uuid\",\n target_branch,\n created_at as \"created_at!: DateTime<Utc>\",\n updated_at as \"updated_at!: DateTime<Utc>\"\n FROM workspace_repos\n WHERE workspace_id = $1",
"describe": {
"columns": [
{
"name": "id!: Uuid",
"ordinal": 0,
"type_info": "Blob"
},
{
"name": "workspace_id!: Uuid",
"ordinal": 1,
"type_info": "Blob"
},
{
"name": "repo_id!: Uuid",
"ordinal": 2,
"type_info": "Blob"
},
{
"name": "target_branch",
"ordinal": 3,
"type_info": "Text"
},
{
"name": "created_at!: DateTime<Utc>",
"ordinal": 4,
"type_info": "Text"
},
{
"name": "updated_at!: DateTime<Utc>",
"ordinal": 5,
"type_info": "Text"
}
],
"parameters": {
"Right": 1
},
"nullable": [
true,
false,
false,
false,
false,
false
]
},
"hash": "31f4e685fc0b1103ff662b3866b3bb422cc7fc8e0661ebfed30ffd16ea7ed8c0"
}
================================================
FILE: crates/db/.sqlx/query-3266b6a544952177f84e2e7c31be9dba212c92d91b997de7f6aa811e08ed6c72.json
================================================
{
"db_name": "SQLite",
"query": "SELECT\n ep.id as \"id!: Uuid\",\n ep.session_id as \"session_id!: Uuid\",\n ep.run_reason as \"run_reason!: ExecutionProcessRunReason\",\n ep.executor_action as \"executor_action!: sqlx::types::Json<ExecutorActionField>\",\n ep.status as \"status!: ExecutionProcessStatus\",\n ep.exit_code,\n ep.dropped as \"dropped!: bool\",\n ep.started_at as \"started_at!: DateTime<Utc>\",\n ep.completed_at as \"completed_at?: DateTime<Utc>\",\n ep.created_at as \"created_at!: DateTime<Utc>\",\n ep.updated_at as \"updated_at!: DateTime<Utc>\"\n FROM execution_processes ep\n WHERE ep.session_id = ? AND ep.run_reason = ? AND ep.dropped = FALSE\n ORDER BY ep.created_at DESC LIMIT 1",
"describe": {
"columns": [
{
"name": "id!: Uuid",
"ordinal": 0,
"type_info": "Blob"
},
{
"name": "session_id!: Uuid",
"ordinal": 1,
"type_info": "Blob"
},
{
"name": "run_reason!: ExecutionProcessRunReason",
"ordinal": 2,
"type_info": "Text"
},
{
"name": "executor_action!: sqlx::types::Json<ExecutorActionField>",
"ordinal": 3,
"type_info": "Text"
},
{
"name": "status!: ExecutionProcessStatus",
"ordinal": 4,
"type_info": "Text"
},
{
"name": "exit_code",
"ordinal": 5,
"type_info": "Integer"
},
{
"name": "dropped!: bool",
"ordinal": 6,
"type_info": "Integer"
},
{
"name": "started_at!: DateTime<Utc>",
"ordinal": 7,
"type_info": "Text"
},
{
"name": "completed_at?: DateTime<Utc>",
"ordinal": 8,
"type_info": "Text"
},
{
"name": "created_at!: DateTime<Utc>",
"ordinal": 9,
"type_info": "Text"
},
{
"name": "updated_at!: DateTime<Utc>",
"ordinal": 10,
"type_info": "Text"
}
],
"parameters": {
"Right": 2
},
"nullable": [
true,
false,
false,
false,
false,
true,
false,
false,
true,
false,
false
]
},
"hash": "3266b6a544952177f84e2e7c31be9dba212c92d91b997de7f6aa811e08ed6c72"
}
================================================
FILE: crates/db/.sqlx/query-33f23656ba343bd75a88b0fadf2a4ba01eda330f9b549e625e27701e3b0b5a31.json
================================================
{
"db_name": "SQLite",
"query": "SELECT\n id as \"id!: Uuid\",\n entity_type as \"entity_type!: EntityType\",\n local_id as \"local_id!: Uuid\",\n remote_id as \"remote_id: Uuid\",\n status as \"status!: MigrationStatus\",\n error_message,\n attempt_count as \"attempt_count!\",\n created_at as \"created_at!: DateTime<Utc>\",\n updated_at as \"updated_at!: DateTime<Utc>\"\n FROM migration_state\n WHERE entity_type = $1 AND status = 'pending'\n ORDER BY created_at ASC",
"describe": {
"columns": [
{
"name": "id!: Uuid",
"ordinal": 0,
"type_info": "Text"
},
{
"name": "entity_type!: EntityType",
"ordinal": 1,
"type_info": "Text"
},
{
"name": "local_id!: Uuid",
"ordinal": 2,
"type_info": "Text"
},
{
"name": "remote_id: Uuid",
"ordinal": 3,
"type_info": "Text"
},
{
"name": "status!: MigrationStatus",
"ordinal": 4,
"type_info": "Text"
},
{
"name": "error_message",
"ordinal": 5,
"type_info": "Text"
},
{
"name": "attempt_count!",
"ordinal": 6,
"type_info": "Integer"
},
{
"name": "created_at!: DateTime<Utc>",
"ordinal": 7,
"type_info": "Text"
},
{
"name": "updated_at!: DateTime<Utc>",
"ordinal": 8,
"type_info": "Text"
}
],
"parameters": {
"Right": 1
},
"nullable": [
true,
false,
false,
true,
false,
true,
false,
false,
false
]
},
"hash": "33f23656ba343bd75a88b0fadf2a4ba01eda330f9b549e625e27701e3b0b5a31"
}
================================================
FILE: crates/db/.sqlx/query-3634e2bab8fef106721bb64a791edd81d3d49eb34fbabd34e4feadfb5f229a6e.json
================================================
{
"db_name": "SQLite",
"query": "SELECT id as \"id!: Uuid\",\n container_ref as \"container_ref!\"\n FROM workspaces\n WHERE container_ref IS NOT NULL",
"describe": {
"columns": [
{
"name": "id!: Uuid",
"ordinal": 0,
"type_info": "Blob"
},
{
"name": "container_ref!",
"ordinal": 1,
"type_info": "Text"
}
],
"parameters": {
"Right": 0
},
"nullable": [
true,
true
]
},
"hash": "3634e2bab8fef106721bb64a791edd81d3d49eb34fbabd34e4feadfb5f229a6e"
}
================================================
FILE: crates/db/.sqlx/query-3a9148e9e914d644d4d82a1c2dc8bd0e093d4f4c638afa7fd8f5211892fb6d84.json
================================================
{
"db_name": "SQLite",
"query": "DELETE FROM repos WHERE id = $1",
"describe": {
"columns": [],
"parameters": {
"Right": 1
},
"nullable": []
},
"hash": "3a9148e9e914d644d4d82a1c2dc8bd0e093d4f4c638afa7fd8f5211892fb6d84"
}
================================================
FILE: crates/db/.sqlx/query-3ace1ee8dba0669400d69891912b86823e41ca643092d990b12c1a6160112427.json
================================================
{
"db_name": "SQLite",
"query": "SELECT\n m.id as \"id!: Uuid\",\n m.workspace_id as \"workspace_id!: Uuid\",\n m.repo_id as \"repo_id!: Uuid\",\n m.merge_type as \"merge_type!: MergeType\",\n m.merge_commit,\n m.pr_number,\n m.pr_url,\n m.pr_status as \"pr_status?: MergeStatus\",\n m.pr_merged_at as \"pr_me
gitextract_ei47u9gy/
├── .cargo/
│ └── config.toml
├── .dockerignore
├── .github/
│ ├── actions/
│ │ ├── cargo-checks-common-setup/
│ │ │ └── action.yml
│ │ ├── setup-jsign/
│ │ │ └── action.yml
│ │ └── setup-node/
│ │ └── action.yml
│ └── workflows/
│ ├── pre-release.yml
│ ├── publish.yml
│ ├── relay-deploy-dev.yml
│ ├── relay-deploy-prod.yml
│ ├── relay-release.yml
│ ├── remote-deploy-dev.yml
│ ├── remote-deploy-prod.yml
│ ├── remote-release.yml
│ └── test.yml
├── .gitignore
├── .npmrc
├── AGENTS.md
├── CODE-OF-CONDUCT.md
├── CONTRIBUTORS.md
├── Cargo.toml
├── Dockerfile
├── LICENSE
├── README.md
├── assets/
│ └── scripts/
│ └── toast-notification.ps1
├── crates/
│ ├── api-types/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ ├── attachment.rs
│ │ ├── auth.rs
│ │ ├── blob.rs
│ │ ├── issue.rs
│ │ ├── issue_assignee.rs
│ │ ├── issue_comment.rs
│ │ ├── issue_comment_reaction.rs
│ │ ├── issue_follower.rs
│ │ ├── issue_relationship.rs
│ │ ├── issue_tag.rs
│ │ ├── lib.rs
│ │ ├── migration.rs
│ │ ├── notification.rs
│ │ ├── oauth.rs
│ │ ├── organization_member.rs
│ │ ├── organizations.rs
│ │ ├── project.rs
│ │ ├── project_status.rs
│ │ ├── pull_request.rs
│ │ ├── pull_requests_local.rs
│ │ ├── relay.rs
│ │ ├── response.rs
│ │ ├── tag.rs
│ │ ├── user.rs
│ │ ├── workspace.rs
│ │ └── workspaces.rs
│ ├── db/
│ │ ├── .sqlx/
│ │ │ ├── query-039c2290b6cf7cdc905c8ddc44293f067fe7e8f246da737e4baad3f494ac8b8f.json
│ │ │ ├── query-04c207be2c3c2c07ff42c695542504c358d67c1f40ca2b1e75a396a90c173a53.json
│ │ │ ├── query-04e5a05c7cad438d39c4c8590410889ab1eefa7376d474a10c119d3f4d9143c7.json
│ │ │ ├── query-04f17449e3e12785affab91e4eab308103491e34c022199b7b060e04fa8aed0f.json
│ │ │ ├── query-0a805c219c9028b2677bd94ccabd47916e60d26c1cede27e467f0ae91f6639ab.json
│ │ │ ├── query-0ab07fb562e61148f3f07f33f766ea12c73d467df4522240008370f681c8409a.json
│ │ │ ├── query-0ac0d0f3826330836e3fd1bf57c42777eb489ac41a650f9361e6b563fc69bf35.json
│ │ │ ├── query-0c7b20643f119afd3e233105b0fa2920e8e940bdad86cdc95d01e485a20d6ed4.json
│ │ │ ├── query-0f90844fc62261ed140e02515ae464b940743113814507313c9fdc176000d1bf.json
│ │ │ ├── query-1085d1f8107c7e16fc2058ef610918760d8d420f0fca97adecd76d698f6f3a51.json
│ │ │ ├── query-11793c98a4bee67fce9972ed6b10a18226e0455a0e8d113d04c4d5148b72aec7.json
│ │ │ ├── query-12a5c0a8b95d8cb87f1c869ff35692a2cee52bc418b06d00a31a4c139e12d18a.json
│ │ │ ├── query-13826fc6fdd367255cb921640e5972f30905ac7a81ad477cf8bbcfc24f06f39b.json
│ │ │ ├── query-167c1d13ee37ebe62cd2316feaf6b5354eb26d0a8fc16efb22827a5cde59a60e.json
│ │ │ ├── query-1b186dc075846fc1f7270a942afbf82a88806ee6ababdb437ab5e97ddd2122da.json
│ │ │ ├── query-1c2201b0ca9305283634fe5c72df6eac3ad954c1238088a84a4b9085b1dbdb74.json
│ │ │ ├── query-218f1d14c72148ea88d75e816e1ba111c8f4678a7e428b15462e6dfc74c25b03.json
│ │ │ ├── query-2547a5d06fd3b17360bff34a04b7d3d929c13ef0d86395a9201834d8fc955295.json
│ │ │ ├── query-256f9e937384933464e6d4d00ee977bbb2915ef80930c8b5c0b0525367a5264d.json
│ │ │ ├── query-29cc3aa8d0ad5deda94494402500a4125e29381d63f18ef083cc4da95e2c5db5.json
│ │ │ ├── query-2a57b702e52b3cc9bdbc361267985958b11d4493b01a9ab8daedf5d951422897.json
│ │ │ ├── query-2b253f92ac5daa4864e7335fde1b82625f504fd73d19b21992497219a9c3170a.json
│ │ │ ├── query-2c0172d5b2c5bff0914727a57983d5c336f5b2dfa73ca6c2efa4ea23bb526e05.json
│ │ │ ├── query-2c71bf4dd5683e0dedf2341e52880ff2c0765659d3cf53d62faa54adc91071dd.json
│ │ │ ├── query-2cb5a269045f23da9f4ee0ee679ccb7fffc39d4b37b1b58357b11a7abfdba125.json
│ │ │ ├── query-31f4e685fc0b1103ff662b3866b3bb422cc7fc8e0661ebfed30ffd16ea7ed8c0.json
│ │ │ ├── query-3266b6a544952177f84e2e7c31be9dba212c92d91b997de7f6aa811e08ed6c72.json
│ │ │ ├── query-33f23656ba343bd75a88b0fadf2a4ba01eda330f9b549e625e27701e3b0b5a31.json
│ │ │ ├── query-3634e2bab8fef106721bb64a791edd81d3d49eb34fbabd34e4feadfb5f229a6e.json
│ │ │ ├── query-3a9148e9e914d644d4d82a1c2dc8bd0e093d4f4c638afa7fd8f5211892fb6d84.json
│ │ │ ├── query-3ace1ee8dba0669400d69891912b86823e41ca643092d990b12c1a6160112427.json
│ │ │ ├── query-3d34580933bc02a168f4a7c483460a6ad13ef72b508532f5a6cd5e53aff04a69.json
│ │ │ ├── query-3d85256618729c1c0bf2758ffab9cdb4ec2af0751e3a37db4009c02f95f6f556.json
│ │ │ ├── query-3f4b2179dcd8857fc18f1e5f6e6cf10f152eebbb141b2d3604dd4191e0c2f367.json
│ │ │ ├── query-420a0c490f1e4d549fb194265e971d8c03b86fe75b595091f6425de11d120a6b.json
│ │ │ ├── query-4506eeeb85b49f00143a9d23636c976159e1c72c9cfce005599c5eb52dc15095.json
│ │ │ ├── query-48c556a5317e6ea77595a8fdc410d30df50c8405adf38b371fdf0a1bde8c0083.json
│ │ │ ├── query-4ac35216ead7e5be9cc2de504a06b6e375e23ca2ed14493ec991f53e458a6a34.json
│ │ │ ├── query-4b59b958807be54c7c9949d96ced96e4ab1498f1056e7d0d7956aff46352d90f.json
│ │ │ ├── query-4b952fb779fbcf70bd402b6bcc0eec07b75879333614b8ef98e5b8073ad66ca6.json
│ │ │ ├── query-4c9b1b539ec383ace94ef29c58967bbf08112ebdc61276e9710663a083318211.json
│ │ │ ├── query-4d84b308a2cc7677da65111d080bf02e5e35c052048360d3dbea656bbbcd3edb.json
│ │ │ ├── query-4d86dcbf754f971ff3acffe9e85b5c2f455e77c40c624e09736be9480238110b.json
│ │ │ ├── query-5154289c5a9ddbc061d42de2baf129e03a75061b8b305110921688f01d112de1.json
│ │ │ ├── query-517fb82570b9624e166696af53963ec499966562b23b5833fc4ca4cf43bcaccc.json
│ │ │ ├── query-557963b950205b10db273762da5fd24c9db96c1f366a796c319e4adc888d7414.json
│ │ │ ├── query-570f62a32921c4a9a7e4e1006e9b31c4c58e69ab8681d76dfe9b184ff1e0bc65.json
│ │ │ ├── query-5785a10c3d51ff9b001aa455f6296a4dcba61cec700a4b72031c5c643b273938.json
│ │ │ ├── query-57d6335c98deb608cf961836f73a67163af6484f91954c0577aea1cc2fddac4f.json
│ │ │ ├── query-586d5ab95899967c8a8f74996c4a598a73661823bc2bcb240cebb7cd0533abb6.json
│ │ │ ├── query-5884e7baa4a061166cb2911f717d3fd92852d62975a910dd9cb05e7908fdf8b6.json
│ │ │ ├── query-592656b17a5f78d117365909e47afba7d3df545ac1078c307c6b968e75c8e2ba.json
│ │ │ ├── query-5a5eb8f05ddf515b4e568d8e209e9722d8b7ce62f76a1eb084af880c2a4dfad2.json
│ │ │ ├── query-5d9739705372b113b1bb45d441ebdf2846dc4cd83b8547128c733cd282b5b4f2.json
│ │ │ ├── query-5ff9809face43fe1f071dfda62b6a30f4a32a9aaace29caf89b95c224482201b.json
│ │ │ ├── query-606016bf31cf0abd87d7eb95ea99d7c8c014523cb02e482d608299ceefaeffc5.json
│ │ │ ├── query-61c6546164ba21a659d32d4e345926b0ee1a611fe4e46bb8db51a4e41f781af9.json
│ │ │ ├── query-64f31710ab7ba14047f31cce44ad36c60a53624f9bcb03a5eaff5d61ca8cc9cf.json
│ │ │ ├── query-686810c5271e1d44042b6ea2c6cc434eb2e3f5d3540c97d703c34dd4e978c690.json
│ │ │ ├── query-6ae5eb2719382d4d081ee17dbd5de654c156b06e2af4ddfb917d36002146be5b.json
│ │ │ ├── query-70b21c5c0a2ba5c21c9c1132f14a68c02a8a2cd555caea74e57a0aeb206770d3.json
│ │ │ ├── query-7364150098bec681451c43762117a1f5c5b4e27f5f65186c3cc16092b3491c37.json
│ │ │ ├── query-73aee4cb95294087554eafaf3126556df244f4b6639d5a188f0badb6739c1a70.json
│ │ │ ├── query-7410e8128e63af1c3127e833accee637e65f7efcd9111ecb891587294042129c.json
│ │ │ ├── query-766fa107de23b7e6c579223b083d916e252d422e2908c27f6718fcbd851de2c1.json
│ │ │ ├── query-7807cb09da72c5a1e35bf4f4da1bea1743a578588e72444ede98f5f969af08c1.json
│ │ │ ├── query-784e59a5259f046a74bbfd3cc5a78500797ccf3e67928e5f1520623c5c04ac9f.json
│ │ │ ├── query-79e1e11b83c786c6d5a985ab045b6bd122d5efa920225dadc9fedb6592c6e0a3.json
│ │ │ ├── query-79f6b9f999c33900ae87475d72651b274cc94ab3b1f36e9c5517bc5572ea9947.json
│ │ │ ├── query-7d12bf106e68365fc1aa239b8b39065430f30ad658d0bf9801c81e3ced2127da.json
│ │ │ ├── query-80669005bff96b45015f095ccf28598df604540e2aaf3828fcb8db7d55538dc7.json
│ │ │ ├── query-80e6cfb4e27fcaa79b7dbd37ac16aac255f46a646c75aa65111b2f58ec03f892.json
│ │ │ ├── query-82b92577d15b92908cecca7bff6ff21478c90a16eb6123165f0bd16d2d60bca4.json
│ │ │ ├── query-82f7bba858a26732ad9d4122c3a0bca4209ae37c59dcd7353a68e2dec434c48a.json
│ │ │ ├── query-84ee994f0aad005cf62ca318eb20ae29d218a72cdd1fadf2a5ae399b0719ca19.json
│ │ │ ├── query-891bad4b14f75be20c70a5cec02fb3b4fb3cbb84ce322bf5da3791d75b1deae7.json
│ │ │ ├── query-8f3ab3ad20de3261703b0bdaf01a3d3c4289754381b47af7cd97acce767163e8.json
│ │ │ ├── query-9139f8d02c4ff94db0f2e8de7a6d5a53092479499815531962b7c84f5e0b2129.json
│ │ │ ├── query-91810eeed4804827717a182ad1b61c641648e2659100f43ef9504fc60e5d244e.json
│ │ │ ├── query-93efe07b91d232fc0c371be8ee618ba6ccfd6930454fc11845d5dfc2ba0bad62.json
│ │ │ ├── query-973e43902b05d671f69b24a0aeeb07bc0cbcd22d75b20c83c49a122f92c6b231.json
│ │ │ ├── query-9747ebaebd562d65f0c333b0f5efc74fa63ab9fcb35a43f75f57da3fcb9a2588.json
│ │ │ ├── query-9821ee63362e96cf3fd936e2d54a641fb30f239a8137dc6c1b3a670b2c6138c1.json
│ │ │ ├── query-99399425f53b140a8de232a4de3c6c056bc422f2fbdb8ead6aab3f6945906e51.json
│ │ │ ├── query-9dd37bd520d651339fa13078ea5cb76847c8c74970b195b0e5ee33e4c5a777fb.json
│ │ │ ├── query-9f783d1b275548a59429235991e5299b7aaf071effebbd62f006404b3ce83dc8.json
│ │ │ ├── query-9f8ab7d7c2660321412117bfb55e3b2b9ccd7b9ed2679fb8ccca0a36996e6e21.json
│ │ │ ├── query-a1574f21db387b0e4a2c3f5723de6df4ee42d98145d16e9d135345dd60128429.json
│ │ │ ├── query-a3d14f90b59d6cb15c42d1e6400c040a86eab49095c89fcef9d1585890056856.json
│ │ │ ├── query-a4a50fcfb903e6d0a315676f4f760e5bb7718e10ea550aedf990c9da84834416.json
│ │ │ ├── query-a915c22f5ed0bb86c3a242ca38cbc1bfca40ebfe9096058c27e94479b67c7c02.json
│ │ │ ├── query-a9446d873a2f199e7120e9faeda1b2135383396f82623813d734e321114d4623.json
│ │ │ ├── query-aa598f6943fbf773ca00deb113f3955bdf689d1c22df63849bc5ce36c7c76382.json
│ │ │ ├── query-ab2693e557142354564a2882f3c321b350828419c440885c0f88840079b1c94e.json
│ │ │ ├── query-abbda92ba42bea0f7d17d0945d51b011bf50e7b36ee50ed74988e053f6fb0eec.json
│ │ │ ├── query-abff188fc81caf44081e2053cb7841d1dc6c1a8965f4b862caa2f9cebcae0176.json
│ │ │ ├── query-b1edd509d00577007680243589ce59570182b98a1e9059d9702d97e9eaa9cbf5.json
│ │ │ ├── query-b4476bedb8e5c0f7bc21654dc62fb00fbd8a41e24efaba55be8278031d71cc59.json
│ │ │ ├── query-b4ff8dabb0d5c99319fad3f2f7e620523c96b89beaf1edd97f79d9972b93c8fe.json
│ │ │ ├── query-c097fa44c48e55f0e74f56577c0c1c4b3b92b2875d12c0bd1a70a1dcc4eda58e.json
│ │ │ ├── query-c24119a35ed2099b886a0b1a9a41adf01d1a1f86792abf3d3a410c6cbab2ec0f.json
│ │ │ ├── query-c27f2fd6b3696cb5a8ec54226608440786a6cec601783f797be3a8c515080d62.json
│ │ │ ├── query-c422aa419f267df88b65557ccb897ba98c01970a68866eb7028b791f04da2b39.json
│ │ │ ├── query-c5a45e39543468b57c2e3662735c640210c3948113dcbd1be8339f2c27506b76.json
│ │ │ ├── query-c793ee8493c54ea295a62a51650d00894fdad2f2cadc5665ae1e16a605626cb2.json
│ │ │ ├── query-cac90f2884c7c0eed4d2ab621016a5bc62dfbcb65539eb4a52e3306f96c0698a.json
│ │ │ ├── query-cd6d7ca74442a100d9caf170ac43118795226f50b8392069b47abd4f7564c135.json
│ │ │ ├── query-d41acd2bd3c805f9787c0d468a25ce62bfa8b268131c19b83fd76acb59a8c9ea.json
│ │ │ ├── query-d7a11078522c029b71a75f4a45abc941536d3ce08d8ee0fcbde3eacf6360b7d5.json
│ │ │ ├── query-d9f7205a1a749c23c928ef2861783446bd99a7b7939929dee1f8a409bb99ab04.json
│ │ │ ├── query-db1b29e1ea843ee4024c914820978a558f0ac4cc65da76645ccff4748240e565.json
│ │ │ ├── query-db39f7ab7391c1289299e7f8aa7e1f642874eed0179e91a9558f9df534db797c.json
│ │ │ ├── query-dc5d0ad507cbd962235c9e85c3e43f34c7c38eb2e08ab7899073010a6e77b37d.json
│ │ │ ├── query-dc88d70bb25b6437580480c346ed29fb90115e3b83fa36d8966b62f02990b9c7.json
│ │ │ ├── query-dd0d0e3fd03f130aab947d13580796eee9a786e2ca01d339fd0e8356f8ad3824.json
│ │ │ ├── query-df2f35912a8055dff6cb24c83ea67fc49b432f457961fa584c6a13389bfdcea5.json
│ │ │ ├── query-df66eae37a24c07c2ae0a521c802e3828ac153e6c087edcf2ba4dbe621dc79d3.json
│ │ │ ├── query-e41bedcff88553343a55112c9c0688efdae03ddb4249d0636b69934f5cd4d8fd.json
│ │ │ ├── query-ee06dfd8dc7fc2ffc239db9635a3a5cac2e603992392a632bff7d450c6bca061.json
│ │ │ ├── query-efce74898a8e81dafc3933231e8ac3c07be392e1c073e62c621138c00d0ed30d.json
│ │ │ ├── query-f2dbb49b2f839e84a46fdd865d9982b758160517b93bc92d8e12060426daa05d.json
│ │ │ ├── query-f584dbe0f2f2a4f1e7dcf5b8f675eb2a6d954bb3f148ac0fece10652f05fb49b.json
│ │ │ ├── query-f9e8640c28fae8aebf3d8b0d3984804fdb3f197c8cc2d5750fd267c82e3e68a1.json
│ │ │ ├── query-faae305f6ac9dc7d04d21c76531cde3912647430195267ffa5b99bb9a7df1feb.json
│ │ │ ├── query-fb1ab168509b38eccf3064e2a90690a3fdef67a98fee7e5943689e61818d34f0.json
│ │ │ └── query-fc90f4dd7a408d6129aff95538de22c3a1ca018bc7837e3dc1c5aa0007844887.json
│ │ ├── Cargo.toml
│ │ ├── migrations/
│ │ │ ├── 20250617183714_init.sql
│ │ │ ├── 20250620212427_execution_processes.sql
│ │ │ ├── 20250620214100_remove_stdout_stderr_from_task_attempts.sql
│ │ │ ├── 20250621120000_relate_activities_to_execution_processes.sql
│ │ │ ├── 20250623120000_executor_sessions.sql
│ │ │ ├── 20250623130000_add_executor_type_to_execution_processes.sql
│ │ │ ├── 20250625000000_add_dev_script_to_projects.sql
│ │ │ ├── 20250701000000_add_branch_to_task_attempts.sql
│ │ │ ├── 20250701000001_add_pr_tracking_to_task_attempts.sql
│ │ │ ├── 20250701120000_add_assistant_message_to_executor_sessions.sql
│ │ │ ├── 20250708000000_add_base_branch_to_task_attempts.sql
│ │ │ ├── 20250709000000_add_worktree_deleted_flag.sql
│ │ │ ├── 20250710000000_add_setup_completion.sql
│ │ │ ├── 20250715154859_add_task_templates.sql
│ │ │ ├── 20250716143725_add_default_templates.sql
│ │ │ ├── 20250716161432_update_executor_names_to_kebab_case.sql
│ │ │ ├── 20250716170000_add_parent_task_to_tasks.sql
│ │ │ ├── 20250717000000_drop_task_attempt_activities.sql
│ │ │ ├── 20250719000000_add_cleanup_script_to_projects.sql
│ │ │ ├── 20250720000000_add_cleanupscript_to_process_type_constraint.sql
│ │ │ ├── 20250726182144_update_worktree_path_to_container_ref.sql
│ │ │ ├── 20250726210910_make_branch_optional.sql
│ │ │ ├── 20250727124142_remove_command_from_execution_process.sql
│ │ │ ├── 20250727150349_remove_working_directory.sql
│ │ │ ├── 20250729162941_create_execution_process_logs.sql
│ │ │ ├── 20250729165913_remove_stdout_and_stderr_from_execution_processes.sql
│ │ │ ├── 20250730000000_add_executor_action_to_execution_processes.sql
│ │ │ ├── 20250730000001_rename_process_type_to_run_reason.sql
│ │ │ ├── 20250730124500_add_execution_process_task_attempt_index.sql
│ │ │ ├── 20250805112332_add_executor_action_type_to_task_attempts.sql
│ │ │ ├── 20250805122100_fix_executor_action_type_virtual_column.sql
│ │ │ ├── 20250811000000_add_copy_files_to_projects.sql
│ │ │ ├── 20250813000001_rename_base_coding_agent_to_profile.sql
│ │ │ ├── 20250815100344_migrate_old_executor_actions.sql
│ │ │ ├── 20250818150000_refactor_images_to_junction_tables.sql
│ │ │ ├── 20250819000000_move_merge_commit_to_merges_table.sql
│ │ │ ├── 20250902120000_add_masked_by_restore_to_execution_processes.sql
│ │ │ ├── 20250902184501_rename-profile-to-executor.sql
│ │ │ ├── 20250903091032_executors_to_screaming_snake.sql
│ │ │ ├── 20250905090000_add_after_head_commit_to_execution_processes.sql
│ │ │ ├── 20250906120000_add_follow_up_drafts.sql
│ │ │ ├── 20250910120000_add_before_head_commit_to_execution_processes.sql
│ │ │ ├── 20250917123000_optimize_selects_and_cleanup_indexes.sql
│ │ │ ├── 20250921222241_unify_drafts_tables.sql
│ │ │ ├── 20250923000000_make_branch_non_null.sql
│ │ │ ├── 20251020120000_convert_templates_to_tags.sql
│ │ │ ├── 20251101090000_drop_execution_process_logs_pk.sql
│ │ │ ├── 20251114000000_create_shared_tasks.sql
│ │ │ ├── 20251120000001_refactor_to_scratch.sql
│ │ │ ├── 20251129155145_drop_drafts_table.sql
│ │ │ ├── 20251202000000_migrate_to_electric.sql
│ │ │ ├── 20251206000000_add_parallel_setup_script_to_projects.sql
│ │ │ ├── 20251209000000_add_project_repositories.sql
│ │ │ ├── 20251215145026_drop_worktree_deleted.sql
│ │ │ ├── 20251216000000_add_dev_script_working_dir_to_projects.sql
│ │ │ ├── 20251216142123_refactor_task_attempts_to_workspaces_sessions.sql
│ │ │ ├── 20251219000000_add_agent_working_dir_to_projects.sql
│ │ │ ├── 20251219164205_add_missing_indexes_for_slow_queries.sql
│ │ │ ├── 20251220134608_fix_session_executor_format.sql
│ │ │ ├── 20251221000000_add_workspace_flags.sql
│ │ │ ├── 20260107000000_move_scripts_to_repos.sql
│ │ │ ├── 20260107115155_add_seen_to_coding_agent_turns.sql
│ │ │ ├── 20260112160045_add_composite_indexes_for_performance.sql
│ │ │ ├── 20260113144821_remove_shared_tasks.sql
│ │ │ ├── 20260122000000_add_default_target_branch_to_repos.sql
│ │ │ ├── 20260123125956_add_agent_message_id.sql
│ │ │ ├── 20260126000000_add_agent_working_dir_to_repos.sql
│ │ │ ├── 20260128000000_add_migration_state.sql
│ │ │ ├── 20260203000000_add_archive_script_to_repos.sql
│ │ │ ├── 20260217120312_remove_task_fk_from_workspaces.sql
│ │ │ ├── 20260220000000_optimize_query_planner_after_latest_process_query_update.sql
│ │ │ ├── 20260302113031_add_worktree_deleted_to_workspaces.sql
│ │ │ ├── 20260304153000_move_agent_working_dir_to_sessions.sql
│ │ │ ├── 20260314000000_add_name_to_sessions.sql
│ │ │ └── 20260317120000_cleanup_attachment_schema.sql
│ │ └── src/
│ │ ├── lib.rs
│ │ └── models/
│ │ ├── coding_agent_turn.rs
│ │ ├── execution_process.rs
│ │ ├── execution_process_logs.rs
│ │ ├── execution_process_repo_state.rs
│ │ ├── file.rs
│ │ ├── merge.rs
│ │ ├── migration_state.rs
│ │ ├── mod.rs
│ │ ├── project.rs
│ │ ├── repo.rs
│ │ ├── requests.rs
│ │ ├── scratch.rs
│ │ ├── session.rs
│ │ ├── tag.rs
│ │ ├── task.rs
│ │ ├── workspace.rs
│ │ └── workspace_repo.rs
│ ├── deployment/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ └── lib.rs
│ ├── executors/
│ │ ├── Cargo.toml
│ │ ├── default_mcp.json
│ │ ├── default_profiles.json
│ │ └── src/
│ │ ├── actions/
│ │ │ ├── coding_agent_follow_up.rs
│ │ │ ├── coding_agent_initial.rs
│ │ │ ├── mod.rs
│ │ │ ├── review.rs
│ │ │ └── script.rs
│ │ ├── approvals.rs
│ │ ├── command.rs
│ │ ├── env.rs
│ │ ├── executor_discovery.rs
│ │ ├── executors/
│ │ │ ├── acp/
│ │ │ │ ├── client.rs
│ │ │ │ ├── harness.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── normalize_logs.rs
│ │ │ │ └── session.rs
│ │ │ ├── amp.rs
│ │ │ ├── claude/
│ │ │ │ ├── client.rs
│ │ │ │ ├── protocol.rs
│ │ │ │ ├── slash_commands.rs
│ │ │ │ └── types.rs
│ │ │ ├── claude.rs
│ │ │ ├── codex/
│ │ │ │ ├── client.rs
│ │ │ │ ├── init_prompt.md
│ │ │ │ ├── jsonrpc.rs
│ │ │ │ ├── normalize_logs.rs
│ │ │ │ ├── review.rs
│ │ │ │ └── slash_commands.rs
│ │ │ ├── codex.rs
│ │ │ ├── copilot.rs
│ │ │ ├── cursor/
│ │ │ │ └── mcp.rs
│ │ │ ├── cursor.rs
│ │ │ ├── droid/
│ │ │ │ └── normalize_logs.rs
│ │ │ ├── droid.rs
│ │ │ ├── gemini.rs
│ │ │ ├── mod.rs
│ │ │ ├── opencode/
│ │ │ │ ├── models.rs
│ │ │ │ ├── normalize_logs.rs
│ │ │ │ ├── sdk.rs
│ │ │ │ ├── slash_commands.rs
│ │ │ │ └── types.rs
│ │ │ ├── opencode.rs
│ │ │ ├── qa_mock.rs
│ │ │ ├── qwen.rs
│ │ │ └── utils.rs
│ │ ├── lib.rs
│ │ ├── logs/
│ │ │ ├── mod.rs
│ │ │ ├── plain_text_processor.rs
│ │ │ ├── stderr_processor.rs
│ │ │ └── utils/
│ │ │ ├── entry_index.rs
│ │ │ ├── mod.rs
│ │ │ ├── patch.rs
│ │ │ └── shell_command_parsing.rs
│ │ ├── mcp_config.rs
│ │ ├── model_selector.rs
│ │ ├── profile.rs
│ │ └── stdout_dup.rs
│ ├── git/
│ │ ├── Cargo.toml
│ │ ├── src/
│ │ │ ├── cli.rs
│ │ │ ├── lib.rs
│ │ │ └── validation.rs
│ │ └── tests/
│ │ ├── git_ops_safety.rs
│ │ └── git_workflow.rs
│ ├── git-host/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ ├── azure/
│ │ │ ├── cli.rs
│ │ │ └── mod.rs
│ │ ├── detection.rs
│ │ ├── github/
│ │ │ ├── cli.rs
│ │ │ └── mod.rs
│ │ ├── lib.rs
│ │ └── types.rs
│ ├── local-deployment/
│ │ ├── Cargo.toml
│ │ ├── build.rs
│ │ └── src/
│ │ ├── command.rs
│ │ ├── container.rs
│ │ ├── copy.rs
│ │ ├── lib.rs
│ │ └── pty.rs
│ ├── mcp/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ ├── bin/
│ │ │ └── vibe_kanban_mcp.rs
│ │ ├── lib.rs
│ │ └── task_server/
│ │ ├── handler.rs
│ │ ├── mod.rs
│ │ └── tools/
│ │ ├── context.rs
│ │ ├── issue_assignees.rs
│ │ ├── issue_relationships.rs
│ │ ├── issue_tags.rs
│ │ ├── mod.rs
│ │ ├── organizations.rs
│ │ ├── remote_issues.rs
│ │ ├── remote_projects.rs
│ │ ├── repos.rs
│ │ ├── sessions.rs
│ │ ├── task_attempts.rs
│ │ └── workspaces.rs
│ ├── relay-control/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ ├── lib.rs
│ │ └── signing.rs
│ ├── relay-tunnel/
│ │ ├── .sqlx/
│ │ │ ├── query-13462773c343a0812783b914d7a09b6e7148d20be4c2a5c92fa5860e1bc5bd36.json
│ │ │ ├── query-25045af6947be74c0a4f1784670904bd488d1cbafe997a2d8abef620d2e5497f.json
│ │ │ ├── query-2b222c6a2bfc74535ad20d839e8f1aef3d1d64c2b0b96289f1703b08f2a48f68.json
│ │ │ ├── query-2b81f9454b626be80c21761b0fd1e7a83b71bb53a4ababf212d4fb13636119ae.json
│ │ │ ├── query-422fce71b9df8d2d68d5aabe22d8299f596f77a09069e350138f5a5b72204dfe.json
│ │ │ ├── query-5ba9186639e75711df9218209ad88f91f54f9643ecf5f53af1e7bfc583727a7c.json
│ │ │ ├── query-6aef9ee49b4bc1d9a23c0322e7733bee239e31380cb4cf8274cb60427b492299.json
│ │ │ ├── query-6d64fbb63cd05c4cd9bcc3d07cbc26b165f0d0ffbc4df75391c6b205fe0abd78.json
│ │ │ ├── query-775151df9d9be456f8a86a1826fd4b7c4ea6ada452dfc89f30c7b6d0135c9e2e.json
│ │ │ ├── query-7b010dece6caaeb04e8f033c869982b97f20c60903a92f4d45634f990ffbfce3.json
│ │ │ ├── query-80dfc0d5bbc6db412ea0fda24a5184c3ce20064826779571cab1d9e32459c4cb.json
│ │ │ ├── query-8b865d8fca4a3d7a8f7edf6671aed582164f93f973448143883d6d2fb461caf6.json
│ │ │ ├── query-9459cf92b30943acb79f0e0f2e9421be83ce9e50e39f6b1e435b92ff70907264.json
│ │ │ ├── query-9c2e6a8fc112e4e2980e4dc3f1dae1ea7da376119b0f06aafbc74c7a471f17ad.json
│ │ │ ├── query-b2c8a0820366a696d4425720bacec9c694398e2f9ff101753c8833cbf0152d9d.json
│ │ │ ├── query-e84a068d6a2ad1458cf6f45c2f2dde8511355f29677cebfd15783fccd095a131.json
│ │ │ ├── query-f31c0531cb5c099bc0c6b193852d3e3d0be6cfe1104dd792651d9c5434483ef0.json
│ │ │ └── query-f6d727f8d7baa7b92464ccccccd113fbe7c69a69d91dc6f54c6052eaa65ce868.json
│ │ ├── Cargo.toml
│ │ ├── Dockerfile
│ │ └── src/
│ │ ├── bin/
│ │ │ └── relay_server.rs
│ │ ├── client.rs
│ │ ├── lib.rs
│ │ ├── server.rs
│ │ ├── server_bin/
│ │ │ ├── auth.rs
│ │ │ ├── config.rs
│ │ │ ├── db/
│ │ │ │ ├── auth_sessions.rs
│ │ │ │ ├── hosts.rs
│ │ │ │ ├── identity_errors.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── relay_auth_codes.rs
│ │ │ │ ├── relay_browser_sessions.rs
│ │ │ │ └── users.rs
│ │ │ ├── mod.rs
│ │ │ ├── relay_registry.rs
│ │ │ ├── routes/
│ │ │ │ ├── auth_code.rs
│ │ │ │ ├── connect.rs
│ │ │ │ ├── mod.rs
│ │ │ │ └── path_routes.rs
│ │ │ └── state.rs
│ │ ├── tls.rs
│ │ └── ws_io.rs
│ ├── remote/
│ │ ├── .sqlx/
│ │ │ ├── query-00f50fdb65f4126b197b523f6fc1870571c4c121c32e0c3393f6770fc3608e95.json
│ │ │ ├── query-00f5a09dfd00355a8657007f6d7b3a2a98547db4acccd485cec20d8fd29815ad.json
│ │ │ ├── query-0802e4b755645e959d1a2d9b5b13fb087d0b5b162726a09487df18139e707c5e.json
│ │ │ ├── query-082aaf51a023c8ccb44002ce48287acd8ef90b0f4c8338447c6e5370ca93390b.json
│ │ │ ├── query-08fa6f887e954e3b6921f84bbd412b4c3fc5dc1df0b9a5ea3fa4a4b07a86bb55.json
│ │ │ ├── query-0a57abb390861f8e9ce1da411934bef0a1a4edcea151cbf78fdf4cb510a0d450.json
│ │ │ ├── query-0c5dfb11325fb2f0ea279c9406d593376bece575358831870012d125fd053be3.json
│ │ │ ├── query-0df35d620c891a94f62e7e3f7afb60819783f961be1dd36cabb478c5e3ad23c0.json
│ │ │ ├── query-10428c897273798508759a89323d4fb181081eb5ffea40ef41a4d5437b7b6849.json
│ │ │ ├── query-11eede7c3a324ffa6266ee5c3fe3fdb2bd3b9e894fcabeece1e8d2201d18dcc6.json
│ │ │ ├── query-12eb8caf8044a790e7390882bc07d8c737581e0926d473b2e0a9eaccdd0a8674.json
│ │ │ ├── query-1565680821f93069b2b5c109a7d1ba10889ca9b98c848895de6ef2c3ef4dffa0.json
│ │ │ ├── query-16abe1e4d69bf90ed05d8651b688e3be23a74d8dd3957a976c7b757660d5b169.json
│ │ │ ├── query-174295c848146ecd7d9b542e1cad3243d19f58f1c338dbcc63d52573e05cb25e.json
│ │ │ ├── query-185b7fc8f6f22b7c29950a490d46bb16c4fec50cf6e8dc988f3a2c942be909c0.json
│ │ │ ├── query-187b173294e46a013a48040ca4375b65df44215d8883cae88123f762880507e9.json
│ │ │ ├── query-18ae849cdeff678538d5bd6782e16780da9db40e4d892a75d7d244f247db5c04.json
│ │ │ ├── query-18f2fc4074de23b6b2a0c2c70403d6a1eaa57e1fda5063d9f3a292e8aab61ede.json
│ │ │ ├── query-198df1da04fb3ffee213718de87fa49d5032545d55d45a7cb0c62dcc60db5f78.json
│ │ │ ├── query-1b2c4d4205244ed0fa457ebc3b42147c9446a7efb5e205cd85aa780f99824b88.json
│ │ │ ├── query-1ba653e8d80e8eec3b86e805d37a89b836274b47861f0b5921fe3e0b963ed1f5.json
│ │ │ ├── query-1c2201b0ca9305283634fe5c72df6eac3ad954c1238088a84a4b9085b1dbdb74.json
│ │ │ ├── query-1c57e525a7060361832601f158977fffec60c36534ec8eb9affbdf648c280334.json
│ │ │ ├── query-1d612faf67c945cfe22cfd7ab6b6d360fbce8dceb7b64c4d17b4df108434c822.json
│ │ │ ├── query-1d6f13e86897b0885ac3caa36bd56a8685e137a5e22545776b16a5814f225211.json
│ │ │ ├── query-1e2aef04b2d7b1ece13c96ac1dd7718d59c6e8f3dbf0606789fc9f664ac33332.json
│ │ │ ├── query-1ea6478b8325ce0313727f756715c988d0c03ccb74a87e67325c73c03a5dcc33.json
│ │ │ ├── query-209f1b560de8e99de312394860b42251b0272fc7f8f57ea50c9a16fb026b5ae4.json
│ │ │ ├── query-2129f33c4fdf5d1bf52cfac30238e36ffacaab20fb2cf4111fa70ba4e5aa1bca.json
│ │ │ ├── query-253ed3e27e9c1798ecadf943e621bf2993ffdf2267e2582679656ccde7a33c67.json
│ │ │ ├── query-28f6198cfd9c7a01e437a72e5cb3e076f5183a457cb6389cb56d047c1dcce439.json
│ │ │ ├── query-2aa7a0c029cf5fde56e413c13af502a0656051e41e1d036805cc427514c37337.json
│ │ │ ├── query-2b222c6a2bfc74535ad20d839e8f1aef3d1d64c2b0b96289f1703b08f2a48f68.json
│ │ │ ├── query-2b3d84d8febea88a7957efbfd0ca68ee279bc57c6a60afecf9073f46445163a2.json
│ │ │ ├── query-2d85b3d08704ce8475a15a7c8d10a5c1afd97f8ae8e126d26844735f7449fb19.json
│ │ │ ├── query-2db4c808f8d1f22c6209027007ebeb2bd58580758abf8996797b5338d793f741.json
│ │ │ ├── query-2f3898ec50ee1386f87786c605069aac78d5177feaabd719b60e54f94f5f535e.json
│ │ │ ├── query-301e398b03c6e376d3ebd8dc9373f5724ae535e773588ab75baa29468a495ef4.json
│ │ │ ├── query-31c99a55082ff59e212e1fe5425b695030dcf4cfe029ffbb1b56813106a563dc.json
│ │ │ ├── query-32388086083c01d21b0d4d052519a08002b82751e45aa59b3ac628cc96be2723.json
│ │ │ ├── query-3239a6b54374bfba7c1ee16f151333563e21af8994d0431acf029e6a2ca08bfd.json
│ │ │ ├── query-3690a7ea5e1250ceca638bad754a77df36031d8ca132402cc9256f71a57fa476.json
│ │ │ ├── query-37af75dde5f977838d59b57729e9a238d2d2def278d376adc1d4c1d038a918cf.json
│ │ │ ├── query-389b412ed9b76973a5b1546a24167e0b752467405f024de73101b6c12e1e05f1.json
│ │ │ ├── query-3e682d961f272a5c1ce20366008889156928c87babc1704d3277ff9a1812193c.json
│ │ │ ├── query-3ef67cb768d55e4aa8d551401be7daa6c8a9c76a4218ce776d87db6e6d1c890c.json
│ │ │ ├── query-40c9618c70aae933513bd931a3baace6830d78daacfcbd7af69e4f76a234d01c.json
│ │ │ ├── query-421ed23a0bff456c54a14068ceed214fa64d0c50e432fcfe40c222991341bf68.json
│ │ │ ├── query-422fce71b9df8d2d68d5aabe22d8299f596f77a09069e350138f5a5b72204dfe.json
│ │ │ ├── query-426eb8216286273dd0066a15ce4508d9fed04d2feccfff81abb4813ebfea9778.json
│ │ │ ├── query-4274624ba6445ad370380230898232b12365b2336e235b045b1ad25c958c902d.json
│ │ │ ├── query-4411b08341b6b5516505ef4d218e0e46cebe76085e49f4cb88fcdc40816d1228.json
│ │ │ ├── query-4447c24a9150eb78d81edc26a441a50ee50b8523c92bfe3ccc82b09518608204.json
│ │ │ ├── query-45010d9fa4bde72535c3f23f06b7aa9dbf01cf287159476852e5f87496d94ea4.json
│ │ │ ├── query-4508b7a46677e8da7a397979a22c1a3e1160c7407b94d7baa84d6a3cdc5667c5.json
│ │ │ ├── query-4593ea3d9f66cb2618bf444ddbab1e8f2b790471f32aaf192e93f9226fc042bc.json
│ │ │ ├── query-471944787bb9b58a1b30628f28ab8088f60bf3390bfaddbae993e87df89b8844.json
│ │ │ ├── query-47c186223fb7e3c66fff44c1029cf04fb872064a1d8c14bf7d76a841cfe904a6.json
│ │ │ ├── query-4815234c108e45d450f433e5daca76218abdb441b9475ba916a39ab9e1341030.json
│ │ │ ├── query-4b27e9774d71a851edc8c042e682037a35bd4cdffe22f3a13e1730f0d6712485.json
│ │ │ ├── query-4cc8dc5f57a8398ef28942eab072784543333eac379d78c5843ca0c2203b69f5.json
│ │ │ ├── query-4d963a12190ee1db657446ef451c5364f8f91153f7f1bb4e5abfd3f3ddbe0461.json
│ │ │ ├── query-4decb0554367c10f06a45f14291e5ba2a3e16aaf63bf1c34c2e8bc0c249fe4dd.json
│ │ │ ├── query-4e74faa43c070a492467104f59f81a8cb7e304593dd8cc12523b2c9052a48275.json
│ │ │ ├── query-4f80d17d6ca14600ec33d3660b8aa2efb385baf0384b6e666c3d25f0dad3c902.json
│ │ │ ├── query-4fc440b2735dfe8561c3f75440d8eaab32d1c31c994e17f319f52045bf96714f.json
│ │ │ ├── query-51fe714966b7474d7f96cda8411b353e51efd935c929b689a8c33872d6a887b0.json
│ │ │ ├── query-547e9a424c4baa6d0a39299996fc8ee6abf88c2b6f687a17ec8216059de49596.json
│ │ │ ├── query-55f054b37280bfa43dbea79edd61ba969bacf776c0be43b608b5b0ca3f68c1fe.json
│ │ │ ├── query-56b1a366106974ec86702175bc3b4cad61f7437599082e142262169647df324d.json
│ │ │ ├── query-56d467122fa8b6599dc8821f65c2b191f378c9a76d3707d63d8cee1ef31fe4ba.json
│ │ │ ├── query-56d8fd993d1926824c84fff5b5a7f918f06e301ba4938075305eb575d310e891.json
│ │ │ ├── query-56efc697008a751a659452d95248636ce60c7f13fb2a3ef3f5440a7c795b13eb.json
│ │ │ ├── query-574f50459071d9a400bad0c7623ab1618c6ae90b4a60adb8cb4a75628cb22c1c.json
│ │ │ ├── query-577b1dc54aeefe702c74a56776544a391429b561b76d36d59673e410d5d78576.json
│ │ │ ├── query-58d7e8202ef0fb891303c761ae83a803459ffdda3c2a43ca3d6f74c0e3ecb34d.json
│ │ │ ├── query-5a652dd2a3d8bcbc8824584f8a1d9ccbb1fa56f54575b6c9dcd855a26de1edc5.json
│ │ │ ├── query-5cc635c1e2ceaad3edcec3a471a04f17071c5719f4ad0626491aa6a3b67057b8.json
│ │ │ ├── query-5ce478f8221034468e5ea9ec66051e724d7054f8c62106795bccf9fd5366696d.json
│ │ │ ├── query-5dae00eb6e3bef4d8ded1db51ad1252f6df335355b877f0dd64075f74c0018b8.json
│ │ │ ├── query-5f8a332903cbf55aca62cf642bfca4e1815e2b168889f3a5983cb859c77a75b6.json
│ │ │ ├── query-61245f2cee584d03acf4fd65dec00d22076134f726e5a5f4f13d1f4fc2060974.json
│ │ │ ├── query-6205d4d925ce5c7ab8a91e109c807b458a668304ed6262c5afab4b85a227d119.json
│ │ │ ├── query-622e613f8a71f6dd4d110df061bff6ab4e46636ab60dd85dbccd9181d004de33.json
│ │ │ ├── query-623c1d7933109030c4dbbf84d6028d1a7c94394906d1300c257c2e657925eb25.json
│ │ │ ├── query-62a28e66786692c5525ac4266bd3120d75ada4b85ed14f6815231c8691604e2f.json
│ │ │ ├── query-633bc2ca535b8b0078e81e188c734426421fe426dfb90697d025556cc8cb723f.json
│ │ │ ├── query-63ad252e1cd34aca9f819e457d0184c8df21cb4d2b1606ef84c3bdf5fc4457b0.json
│ │ │ ├── query-6412e3c9c929c588d924c1f899891f5d47f92d48b19f93823fb5a795d44a736a.json
│ │ │ ├── query-65f7a21a932662220579276b648b4866ecb76a8d7a4b36d2178b0328cf12f7ec.json
│ │ │ ├── query-667708775c67d5b3ee9a55730434f37f9ae7a49ba89301999fbb1e20aef9bb42.json
│ │ │ ├── query-66eefd452f6ccbd5bc757154a1da211c8134075b7c9f42dacc4fecaedd1c8737.json
│ │ │ ├── query-68422b179dc361337c65a6bd1aa455a961708b97a673d84f7af64cd252cbfdf3.json
│ │ │ ├── query-68494b64181d1ca4293962abfcf0af30e5b4d6947dd4e9509bfc21d8fe4b93d5.json
│ │ │ ├── query-690c16c206895598016a784884f1a764f4a921232df68cc046495ff4f39827ec.json
│ │ │ ├── query-6a1bfdce77c93b841ff0c3b533a71e6d9c9d333659de1b12ffbe462ae0123bd5.json
│ │ │ ├── query-6be91bb87b8d2b28f600bf4f59224281d676281278f6c6bf266a1aa3a91d44fd.json
│ │ │ ├── query-6c5c2a580b7be0465ecd2e86ff92282c0947576fbb09cb23c4b9a2189a38747c.json
│ │ │ ├── query-6fae9f0d59fa5fb6b03ba068d1b50e82aa1b91fa2abe782bdbddd4ccbbd7971c.json
│ │ │ ├── query-7373b3a43a7dd6c5d77c13b5094bb01a63e2902a89dec683659644dd80eb6990.json
│ │ │ ├── query-75e67eb14d42e5c1003060931a7d6ff7c957f024d1d200c2321de693ddf56ecb.json
│ │ │ ├── query-775151df9d9be456f8a86a1826fd4b7c4ea6ada452dfc89f30c7b6d0135c9e2e.json
│ │ │ ├── query-79dc2aa6cb26c21530ac05b84ec58aff9b042724bda846aadd9bf1b1a3a53791.json
│ │ │ ├── query-79f211832f75b3711706ffb94edb091f6288aa2aaea4ffebcce04ff9a27ab838.json
│ │ │ ├── query-7a96ad78e02ebdb1f6d29d941a3c393b128a7165123b63c455df2c2581995e35.json
│ │ │ ├── query-7c54f2956d1c6f0912da45e40590e2bfbb1e5c24c374c2d68ca5b692c87cf26f.json
│ │ │ ├── query-7d628ce544ed41baf2d0cdc0c95f35ac324474564b8cbb6735c9a7fc6aff75fa.json
│ │ │ ├── query-7def4e455b1290e624cf7bb52819074dadebc72a22ddfc8f4ba2513eb2992c17.json
│ │ │ ├── query-7f100e4420b2b8c086eac892d13f0ed114a5667b9c26fe7d99dcff1f4b3b1a9f.json
│ │ │ ├── query-7fb263a325db6e402761a9d0643561b134deda610f7f163d38c20625a4fdd048.json
│ │ │ ├── query-80c3a6879ba2142e78a397340501ac402808707724c58a67db7c7bb9040a7cb9.json
│ │ │ ├── query-8123b99c8d0df1c3a39ae0b2e02b8f95e438dcaa7f85e4ad37a069d962ae2e39.json
│ │ │ ├── query-823f54d7b4eb060b1c5eb4e45143e668286ae6716705e55bb4f4f0f89a5b4117.json
│ │ │ ├── query-82dcc3cd88256066ad91785afe686ec03090ea549029ba2c701cdfa2c1501f0d.json
│ │ │ ├── query-830e7650bdeccf581f260646182b3b5af903927702022ba1a4293d9d8627f727.json
│ │ │ ├── query-83edd4a9b106ad4dfda19ed983d27aee591e50a5a5f4774dbe6d68265da0c6de.json
│ │ │ ├── query-862eb483016735e02aad5e9d7e14584d1db4f2b7517b246d73bbea45f2edead4.json
│ │ │ ├── query-864ea9a40e219fdf04230331e225d699677200d5ccd3d4e12842060a657bd8ea.json
│ │ │ ├── query-86d32fea56d89959413ec714af2decbfd0b58a60ab4833cb300f15eac9061ff7.json
│ │ │ ├── query-8700e0ec6e6832a658fc2e52381c6e165d6129b275ed6ddf2e0f073b9488a31c.json
│ │ │ ├── query-877d201df7908d91a3c6bbef9dbd3cf4966a8ea833ac0e8d7449dcbce065cb5c.json
│ │ │ ├── query-878adca3c3dc2383f7dd86e19026f9aa18d6b2ac20a46a97630a43f9c5ee99eb.json
│ │ │ ├── query-883490bd163237d721488136ba8efbe81f42357213817ce1efe61e6036184b3e.json
│ │ │ ├── query-88ac4f15091a552f40c752a56d2894bb4f46c5eaeff9eec813e2d3c032de3e82.json
│ │ │ ├── query-8b2002931058f7e268604b9ad4f2a12ec6388fa66e20f8d3cc0f70c10e3d43ea.json
│ │ │ ├── query-8e19324c386abf1aa443d861d68290bec42e4c532d63b8528f6d8d5082335a1c.json
│ │ │ ├── query-8e32d5bf86d112e2f4a16f622bd95c8f728946f01e1a994a9c66b0fac6e3ae52.json
│ │ │ ├── query-8e96696a873dbbd175f1d73eb03773beab823476f6d5712c02633dbc6efa0159.json
│ │ │ ├── query-8e9d6c188fe09693d027d408b15792cbbebc72d2dd5bd4e2de12ef533a073f75.json
│ │ │ ├── query-8fc5f7e1920e9d43034aeaacb0a00739e0ee3cd00d06a692beac0f0fb2324ac8.json
│ │ │ ├── query-9110860adef3796e2aefb3e48bbb9651149f3707b75ecdd12c25879983130a41.json
│ │ │ ├── query-91776c42e46c2b2a3909baccf21dd83e2e1c88e592e94699a7a286fd396f2812.json
│ │ │ ├── query-92768b10d8dcb0593c1c5558d847aae11301163ffc053e89f08cae48a94753a0.json
│ │ │ ├── query-9459cf92b30943acb79f0e0f2e9421be83ce9e50e39f6b1e435b92ff70907264.json
│ │ │ ├── query-95427f2ba8293a8aa51366aad80129a3cfdcd1b3ec4dc8298d3aa7d0c5419191.json
│ │ │ ├── query-9889a5e2b2b849138e5af7bb649c9833cfa4fbc45c3bed269d25a8ada30634e4.json
│ │ │ ├── query-9b2762d25c773099f99e6ae65ccefc16ac367d725df8ebb7983420aa0fce4149.json
│ │ │ ├── query-9ebdeece60e544032f3da1507a6476e00d7d4675ade9081811f42aa1dc892569.json
│ │ │ ├── query-a1431ca78db627fef0eca6f573b34d65510e9333765126cbd80c943046dfaea8.json
│ │ │ ├── query-a4f5f53d0b9882e4e8147be7b618cb3dd18d0b5c74f4fd4faf13b4be6c6704ad.json
│ │ │ ├── query-a5ba908419fb3e456bdd2daca41ba06cc3212ffffb8520fc7dbbcc8b60ada314.json
│ │ │ ├── query-a5d10a37114cf01163a023d70212d17b963a27528089dca9d8fe8503335ad14b.json
│ │ │ ├── query-a5d1aeb3ce62a3f286a2a4bddc38c3f5caf2eb556236b561b68483b17dc24cfd.json
│ │ │ ├── query-a7e65932f06ee066e304db0fa693ebda5852505102aef3f2a6e9220e9010773b.json
│ │ │ ├── query-aa31348f22b24c16e1d1365c2508ad7b6c155ef2a50cabd80b59e297001dd93a.json
│ │ │ ├── query-b2c8a0820366a696d4425720bacec9c694398e2f9ff101753c8833cbf0152d9d.json
│ │ │ ├── query-b33110a056cf1ed2bb527aa975f8099d52ac0c9482cdf695a980fad0223ea136.json
│ │ │ ├── query-b5a2ccf794217a408e9ffb663183af1ba203d6d2274e9562a9e3aa938ea6d71b.json
│ │ │ ├── query-b97175fb9a4f5a7379119da3760be7efc1ba2bf95bd5d3e6725f4f98aa7d955a.json
│ │ │ ├── query-b9ca641c1f698d0ade94f50ecc78ac9fb75cf12b55f36556741a8a3adeffe7ee.json
│ │ │ ├── query-baa0922dd5a1e99794f480c483124402f5e1cd014e87919a72d468cd9762ec49.json
│ │ │ ├── query-bc0e36b956903c2ace672e6c52516598ec5f2b0288dcb935ef4d1bc694dacf0d.json
│ │ │ ├── query-bd632f11a197d6a17fcdf3e757283a64d281a931aaacd1ed6e4b73f18f1b6a2f.json
│ │ │ ├── query-bdbdee30d4f94a94f3d449aaea132512d8334a6a2636f898facd4e916a683f5e.json
│ │ │ ├── query-bee3a7f9d08e5634eb32e750701822a8f4efa01d301c8227e67783b435ee90cc.json
│ │ │ ├── query-bf4a22fed2026657255fd032fcbc1ee14c27e48df5fa21fcc6202863520dbf98.json
│ │ │ ├── query-bfc7aa46dc9d6d70c2fed471996ddcbf4d723f0e41aa17f7d2be0cf277350410.json
│ │ │ ├── query-c27e4a5df0dbc872c6ae2c35abf0868b70ba141486e15a70e61c18e97f9e9213.json
│ │ │ ├── query-c30d54026d89b9cf9c938f5aff5cf09ca12af2ab456094aac9a417473645b7e4.json
│ │ │ ├── query-c392eefb0fa2803536184053eaa22d63b6af8119f60419b8117f332cf48912de.json
│ │ │ ├── query-c48b9162c22c3d0ad7d2e2f34ecca353b807876aebf3540e5a024669ac2bb613.json
│ │ │ ├── query-c665891a58a9b19de71114e24e7162bfc0c1b5b3bfc41a9e9193e8e3e70d0668.json
│ │ │ ├── query-c6cccc00461c95d86edc5a1f66b8228fb438985f6b78f9d83663ecb11d59675f.json
│ │ │ ├── query-c850c165c1041f6b9ef852f8bb6c36f0558bd305000151834a884d7629521d28.json
│ │ │ ├── query-c91d02654edf56d33a7eb9d33d3423ac2b0a59bdd89eb7d8aeadbabb2af72314.json
│ │ │ ├── query-c9499f4408f22989b6f55f1641e7e1a82b2f32e079c6b3ee0d9f6a47a15a2522.json
│ │ │ ├── query-ca680e4e2a221ccaf578639b96730fa0d0fd4451d956f9dfa46670f5980c29a8.json
│ │ │ ├── query-cbeee2168e74df2896cbb063187cd1acc8a5429bfaec80f32764676dafd2cd1e.json
│ │ │ ├── query-cc7d93b529cfbddc9921ae33533572062f2e072f5be0fcb26032cbfec2fb3118.json
│ │ │ ├── query-cccab845031104e7a06d411cfbbbf7465f73051b30ec06d21a4c687ec175a58c.json
│ │ │ ├── query-ce7908cdeecd4b4b94c92256bd800c165567ebe5644cfd702a9e4c0bb24091d4.json
│ │ │ ├── query-d0e511b622ffba9354c3be61112b392f7c22eb9facc97730d5b4ee62c248fff8.json
│ │ │ ├── query-d1a4753755833d5100bcf4b61449f58fa83f7ee511ce0b15c7dc00c2d8c01560.json
│ │ │ ├── query-d2275416ba3ddb1bbaf929787b5df4c736084582ddebdbe9f4a4aa6853727484.json
│ │ │ ├── query-d4931e5f81b8a68f983d3e43b319a0f145339b7d8f878c3c1a765f41f3f4697c.json
│ │ │ ├── query-d78735cb49612be9fdf5a7e90c5e70cd050bc001533f388ae73e4bf64ea52a06.json
│ │ │ ├── query-da660b40d95d5fa5e9176b0b5859bb594e83fc21664f062f29ed148969b17c0b.json
│ │ │ ├── query-db645795e781123885506fe4f8e4f1a77a82d0dde22fd876f9b84dd04063db65.json
│ │ │ ├── query-dc063653a33231264dadc3971c2a0715759b8e3ef198d7325e83935a70698613.json
│ │ │ ├── query-dd0d0e3fd03f130aab947d13580796eee9a786e2ca01d339fd0e8356f8ad3824.json
│ │ │ ├── query-ddb471fb54ccc7b6438a15f8de8c9eba7e32eb51866b7f2871df2300bfe7cf40.json
│ │ │ ├── query-df27dcabe19b0b1433865256b090f84474986985ec0d204ab17becd6d3568d0a.json
│ │ │ ├── query-dfad52e56108583960a73a9b89cb91e4da97e212313adc2db73a64cc8c473a87.json
│ │ │ ├── query-dfbf03c5f333dfc7f531f415f4816603d080a544699705329dfe2e93e33c2886.json
│ │ │ ├── query-e0a011a3d29e5ae50ff06a264c39655e32be70ba76939a82184bf0dc5e8d6968.json
│ │ │ ├── query-e161b18662654bba364a273f67486b9366d5a972fc4968b03aa4c9067b92389d.json
│ │ │ ├── query-e185203cf84e43b801dfb23b4159e34aeaef1154dcd3d6811ab504915497ccf7.json
│ │ │ ├── query-e2894ddc831401000e89318423f70f221248b494ff81c1966e59c32e70a87502.json
│ │ │ ├── query-e2bf31db16ca8adc105f79f00c26d6af8b542f1f1e57e947ae39197d94dd3fed.json
│ │ │ ├── query-e509e51e9b1fe5e989713ab048e2641e6d1450f5506502b5a261e93dbb284226.json
│ │ │ ├── query-e553f31a70abb9d7e39755633f67f2b9c21ab6552986181acc10a1523852655c.json
│ │ │ ├── query-ea41e984b0e7c1c952cb265659a443de1967c2d024be80ae1d9878e27b474986.json
│ │ │ ├── query-ec42318654455b31681de774e8d1e07efae222e1d5c97146a4e0054f74c0b2cc.json
│ │ │ ├── query-ec5c77c1afea022848e52039e1c681e39dca08568992ec67770b3ef973b40401.json
│ │ │ ├── query-f00d3b1e7ce2a7fe5e8e3132e32b7ea50b0d6865f0708b6113bea68a54d857f4.json
│ │ │ ├── query-f036504d4bec68969c545881e684ab0dd9fcb85285e4d541d97a7e6be1681e38.json
│ │ │ ├── query-f04fc738e518f28f1f148245ae92c177289f673ef6a631d65b92bd5ee841bb52.json
│ │ │ ├── query-f20260cbe7dff433f5aefa4fe14fa9bc89a6ad97d550420c768e326de6ae5ae6.json
│ │ │ ├── query-f2e8e193cc183a69527708cdd65fc8f0dc9ac4d9fcf67b8ac5285d068c161e06.json
│ │ │ ├── query-f360cdb953a3e2fb64123ab8351d42029b58919a0ac0e8900320fee60c5c93b2.json
│ │ │ ├── query-f4015e2352122c1819ff7e7a4dff62b9387f439d80f47bf457b20663c24b861a.json
│ │ │ ├── query-f403f8876022d19b330e4fc0b550e2ef8bb14a08de3530cb541ae09e1a479d45.json
│ │ │ ├── query-f5eff8b44dfd3aceb4e1fc1a4b58c4e74c8fac220e9943daf4103eb9e57af051.json
│ │ │ ├── query-f7c20c9dc1eaf61cc18cf226449b4ee8c4b082c96515a3ee261c960aa23171e2.json
│ │ │ ├── query-f9491f7f61aec53b057689bc722b6f20c2646510bfcd8b38c27576769a53e750.json
│ │ │ ├── query-fbd32cb35d27a0a60a48b61c9e7db73c3f3b21e62c597850df1ebfca0d22c159.json
│ │ │ ├── query-fcffbcc41e058a6d055bec006e7287fcfb26b609107d753e372faeb7f9d92302.json
│ │ │ ├── query-fe9ae1da931e14f97d432ad34fe636b4854c7f85665b90337b342663bdde68b9.json
│ │ │ └── query-ffea7acda162fba35e1b1acd2c6791bc917f086bf1c34816178282f0579c1eeb.json
│ │ ├── AGENTS.md
│ │ ├── Cargo.toml
│ │ ├── Dockerfile
│ │ ├── README.md
│ │ ├── docker-compose.yml
│ │ ├── migrations/
│ │ │ ├── 20251001000000_shared_tasks_activity.sql
│ │ │ ├── 20251117000000_jwt_refresh_tokens.sql
│ │ │ ├── 20251120121307_oauth_handoff_tokens.sql
│ │ │ ├── 20251127000000_electric_support.sql
│ │ │ ├── 20251201000000_drop_unused_activity_and_columns.sql
│ │ │ ├── 20251201010000_unify_task_status_enums.sql
│ │ │ ├── 20251212000000_create_reviews_table.sql
│ │ │ ├── 20251215000000_github_app_installations.sql
│ │ │ ├── 20251216000000_add_webhook_fields_to_reviews.sql
│ │ │ ├── 20251216100000_add_review_enabled_to_repos.sql
│ │ │ ├── 20260112000000_remote-projects.sql
│ │ │ ├── 20260114000000_electric_sync_tables.sql
│ │ │ ├── 20260115000000_billing.sql
│ │ │ ├── 20260204000000_issue_attachments.sql
│ │ │ ├── 20260205000000_add_issue_creator.sql
│ │ │ ├── 20260213000000_pending_uploads.sql
│ │ │ ├── 20260216000000_remove_attachment_electric_sync.sql
│ │ │ ├── 20260217000000_add_project_sort_order.sql
│ │ │ ├── 20260226000000_add_encrypted_provider_tokens_to_oauth_accounts.sql
│ │ │ ├── 20260226100000_relay_hosts_and_sessions.sql
│ │ │ ├── 20260310000000_add_title_description_notification_types.sql
│ │ │ ├── 20260311000000_notification_digest.sql
│ │ │ └── 20260313000000_fix-short-id-counter.sql
│ │ ├── scripts/
│ │ │ └── prepare-db.sh
│ │ └── src/
│ │ ├── analytics.rs
│ │ ├── app.rs
│ │ ├── attachments/
│ │ │ ├── cleanup.rs
│ │ │ ├── mod.rs
│ │ │ └── thumbnail.rs
│ │ ├── audit/
│ │ │ └── mod.rs
│ │ ├── auth/
│ │ │ ├── handoff.rs
│ │ │ ├── jwt.rs
│ │ │ ├── middleware.rs
│ │ │ ├── mod.rs
│ │ │ ├── oauth_token_validator.rs
│ │ │ └── provider.rs
│ │ ├── azure_blob.rs
│ │ ├── billing.rs
│ │ ├── bin/
│ │ │ └── generate_types.rs
│ │ ├── config.rs
│ │ ├── db/
│ │ │ ├── attachments.rs
│ │ │ ├── auth.rs
│ │ │ ├── blobs.rs
│ │ │ ├── digest.rs
│ │ │ ├── electric_publications.rs
│ │ │ ├── github_app.rs
│ │ │ ├── hosts.rs
│ │ │ ├── identity_errors.rs
│ │ │ ├── invitations.rs
│ │ │ ├── issue_assignees.rs
│ │ │ ├── issue_comment_reactions.rs
│ │ │ ├── issue_comments.rs
│ │ │ ├── issue_followers.rs
│ │ │ ├── issue_relationships.rs
│ │ │ ├── issue_tags.rs
│ │ │ ├── issues.rs
│ │ │ ├── migration.rs
│ │ │ ├── mod.rs
│ │ │ ├── notifications.rs
│ │ │ ├── oauth.rs
│ │ │ ├── oauth_accounts.rs
│ │ │ ├── organization_members.rs
│ │ │ ├── organizations.rs
│ │ │ ├── pending_uploads.rs
│ │ │ ├── project_notification_preferences.rs
│ │ │ ├── project_statuses.rs
│ │ │ ├── projects.rs
│ │ │ ├── pull_requests.rs
│ │ │ ├── reviews.rs
│ │ │ ├── tags.rs
│ │ │ ├── types.rs
│ │ │ ├── users.rs
│ │ │ └── workspaces.rs
│ │ ├── digest/
│ │ │ ├── email.rs
│ │ │ ├── index.mjml
│ │ │ ├── mod.rs
│ │ │ └── task.rs
│ │ ├── github_app/
│ │ │ ├── jwt.rs
│ │ │ ├── mod.rs
│ │ │ ├── pr_review.rs
│ │ │ ├── service.rs
│ │ │ └── webhook.rs
│ │ ├── lib.rs
│ │ ├── mail.rs
│ │ ├── main.rs
│ │ ├── middleware/
│ │ │ ├── mod.rs
│ │ │ └── version.rs
│ │ ├── mutation_definition.rs
│ │ ├── notifications.rs
│ │ ├── r2.rs
│ │ ├── routes/
│ │ │ ├── attachments.rs
│ │ │ ├── billing.rs
│ │ │ ├── electric_proxy.rs
│ │ │ ├── error.rs
│ │ │ ├── github_app.rs
│ │ │ ├── hosts.rs
│ │ │ ├── identity.rs
│ │ │ ├── issue_assignees.rs
│ │ │ ├── issue_comment_reactions.rs
│ │ │ ├── issue_comments.rs
│ │ │ ├── issue_followers.rs
│ │ │ ├── issue_relationships.rs
│ │ │ ├── issue_tags.rs
│ │ │ ├── issues.rs
│ │ │ ├── migration.rs
│ │ │ ├── mod.rs
│ │ │ ├── notifications.rs
│ │ │ ├── oauth.rs
│ │ │ ├── organization_members.rs
│ │ │ ├── organizations.rs
│ │ │ ├── project_statuses.rs
│ │ │ ├── projects.rs
│ │ │ ├── pull_requests.rs
│ │ │ ├── review.rs
│ │ │ ├── tags.rs
│ │ │ ├── tokens.rs
│ │ │ └── workspaces.rs
│ │ ├── shape_definition.rs
│ │ ├── shape_route.rs
│ │ ├── shape_routes.rs
│ │ ├── shapes.rs
│ │ ├── shared_key_auth.rs
│ │ └── state.rs
│ ├── review/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ ├── api.rs
│ │ ├── archive.rs
│ │ ├── claude_session.rs
│ │ ├── config.rs
│ │ ├── error.rs
│ │ ├── github.rs
│ │ ├── main.rs
│ │ └── session_selector.rs
│ ├── server/
│ │ ├── Cargo.toml
│ │ ├── build.rs
│ │ └── src/
│ │ ├── bin/
│ │ │ └── generate_types.rs
│ │ ├── error.rs
│ │ ├── lib.rs
│ │ ├── main.rs
│ │ ├── middleware/
│ │ │ ├── error_logging.rs
│ │ │ ├── mod.rs
│ │ │ ├── model_loaders.rs
│ │ │ ├── origin.rs
│ │ │ └── relay_request_signature.rs
│ │ ├── preview_proxy/
│ │ │ ├── bippy_bundle.js
│ │ │ ├── click_to_component_script.js
│ │ │ ├── devtools_script.js
│ │ │ ├── eruda_init.js
│ │ │ └── mod.rs
│ │ ├── routes/
│ │ │ ├── approvals.rs
│ │ │ ├── attachments.rs
│ │ │ ├── config.rs
│ │ │ ├── containers.rs
│ │ │ ├── events.rs
│ │ │ ├── execution_processes.rs
│ │ │ ├── filesystem.rs
│ │ │ ├── frontend.rs
│ │ │ ├── health.rs
│ │ │ ├── migration.rs
│ │ │ ├── mod.rs
│ │ │ ├── oauth.rs
│ │ │ ├── organizations.rs
│ │ │ ├── relay_auth.rs
│ │ │ ├── relay_ws.rs
│ │ │ ├── releases.rs
│ │ │ ├── remote/
│ │ │ │ ├── issue_assignees.rs
│ │ │ │ ├── issue_relationships.rs
│ │ │ │ ├── issue_tags.rs
│ │ │ │ ├── issues.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── project_statuses.rs
│ │ │ │ ├── projects.rs
│ │ │ │ ├── pull_requests.rs
│ │ │ │ ├── tags.rs
│ │ │ │ └── workspaces.rs
│ │ │ ├── repo.rs
│ │ │ ├── scratch.rs
│ │ │ ├── search.rs
│ │ │ ├── sessions/
│ │ │ │ ├── mod.rs
│ │ │ │ ├── queue.rs
│ │ │ │ └── review.rs
│ │ │ ├── tags.rs
│ │ │ ├── terminal.rs
│ │ │ └── workspaces/
│ │ │ ├── attachments.rs
│ │ │ ├── codex_setup.rs
│ │ │ ├── core.rs
│ │ │ ├── create.rs
│ │ │ ├── cursor_setup.rs
│ │ │ ├── execution.rs
│ │ │ ├── gh_cli_setup.rs
│ │ │ ├── git.rs
│ │ │ ├── integration.rs
│ │ │ ├── links.rs
│ │ │ ├── mod.rs
│ │ │ ├── pr.rs
│ │ │ ├── repos.rs
│ │ │ ├── streams.rs
│ │ │ └── workspace_summary.rs
│ │ ├── startup.rs
│ │ └── tunnel.rs
│ ├── server-info/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ └── lib.rs
│ ├── services/
│ │ ├── Cargo.toml
│ │ ├── src/
│ │ │ ├── lib.rs
│ │ │ └── services/
│ │ │ ├── analytics.rs
│ │ │ ├── approvals/
│ │ │ │ └── executor_approvals.rs
│ │ │ ├── approvals.rs
│ │ │ ├── auth.rs
│ │ │ ├── config/
│ │ │ │ ├── editor/
│ │ │ │ │ └── mod.rs
│ │ │ │ ├── mod.rs
│ │ │ │ └── versions/
│ │ │ │ ├── mod.rs
│ │ │ │ ├── v1.rs
│ │ │ │ ├── v2.rs
│ │ │ │ ├── v3.rs
│ │ │ │ ├── v4.rs
│ │ │ │ ├── v5.rs
│ │ │ │ ├── v6.rs
│ │ │ │ ├── v7.rs
│ │ │ │ └── v8.rs
│ │ │ ├── container.rs
│ │ │ ├── diff_stream.rs
│ │ │ ├── events/
│ │ │ │ ├── patches.rs
│ │ │ │ ├── streams.rs
│ │ │ │ └── types.rs
│ │ │ ├── events.rs
│ │ │ ├── execution_process.rs
│ │ │ ├── file.rs
│ │ │ ├── file_ranker.rs
│ │ │ ├── file_search.rs
│ │ │ ├── filesystem.rs
│ │ │ ├── filesystem_watcher.rs
│ │ │ ├── migration/
│ │ │ │ ├── error.rs
│ │ │ │ ├── mod.rs
│ │ │ │ └── types.rs
│ │ │ ├── mod.rs
│ │ │ ├── notification.rs
│ │ │ ├── oauth_credentials.rs
│ │ │ ├── pr_monitor.rs
│ │ │ ├── qa_repos.rs
│ │ │ ├── queued_message.rs
│ │ │ ├── remote_client.rs
│ │ │ ├── remote_sync.rs
│ │ │ └── repo.rs
│ │ └── tests/
│ │ └── filesystem_repo_discovery.rs
│ ├── tauri-app/
│ │ ├── Cargo.toml
│ │ ├── Info.plist
│ │ ├── build.rs
│ │ ├── capabilities/
│ │ │ └── default.json
│ │ ├── gen/
│ │ │ └── schemas/
│ │ │ ├── acl-manifests.json
│ │ │ ├── capabilities.json
│ │ │ ├── desktop-schema.json
│ │ │ └── macOS-schema.json
│ │ ├── icons/
│ │ │ ├── android/
│ │ │ │ ├── mipmap-anydpi-v26/
│ │ │ │ │ └── ic_launcher.xml
│ │ │ │ └── values/
│ │ │ │ └── ic_launcher_background.xml
│ │ │ └── icon.icns
│ │ ├── msi-template.wxs
│ │ ├── splash/
│ │ │ └── index.html
│ │ ├── src/
│ │ │ └── main.rs
│ │ └── tauri.conf.json
│ ├── trusted-key-auth/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ ├── error.rs
│ │ ├── key_confirmation.rs
│ │ ├── lib.rs
│ │ ├── refresh.rs
│ │ ├── request_signature.rs
│ │ ├── runtime.rs
│ │ ├── spake2.rs
│ │ └── trusted_keys.rs
│ ├── utils/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ ├── approvals.rs
│ │ ├── assets.rs
│ │ ├── browser.rs
│ │ ├── command_ext.rs
│ │ ├── diff.rs
│ │ ├── execution_logs.rs
│ │ ├── jwt.rs
│ │ ├── lib.rs
│ │ ├── log_msg.rs
│ │ ├── msg_store.rs
│ │ ├── path.rs
│ │ ├── port_file.rs
│ │ ├── process.rs
│ │ ├── response.rs
│ │ ├── sentry.rs
│ │ ├── shell.rs
│ │ ├── stream_lines.rs
│ │ ├── text.rs
│ │ ├── tokio.rs
│ │ └── version.rs
│ ├── workspace-manager/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ ├── lib.rs
│ │ └── workspace_manager.rs
│ └── worktree-manager/
│ ├── Cargo.toml
│ └── src/
│ ├── lib.rs
│ └── worktree_manager.rs
├── dev_assets_seed/
│ └── config.json
├── docs/
│ ├── .mintignore
│ ├── AGENTS.md
│ ├── README.md
│ ├── agents/
│ │ ├── amp.mdx
│ │ ├── ccr.mdx
│ │ ├── claude-code.mdx
│ │ ├── cursor-cli.mdx
│ │ ├── droid.mdx
│ │ ├── gemini-cli.mdx
│ │ ├── github-copilot.mdx
│ │ ├── openai-codex.mdx
│ │ ├── opencode.mdx
│ │ └── qwen-code.mdx
│ ├── browser-testing.mdx
│ ├── cloud/
│ │ ├── authentication.mdx
│ │ ├── customisation.mdx
│ │ ├── filtering.mdx
│ │ ├── getting-started.mdx
│ │ ├── index.mdx
│ │ ├── issues.mdx
│ │ ├── kanban-board.mdx
│ │ ├── list-view.mdx
│ │ ├── migration.mdx
│ │ ├── organizations.mdx
│ │ ├── projects.mdx
│ │ ├── team-members.mdx
│ │ └── troubleshooting.mdx
│ ├── configuration-customisation/
│ │ ├── agent-configurations.mdx
│ │ ├── creating-task-tags.mdx
│ │ ├── global-settings.mdx
│ │ └── keyboard-shortcuts.mdx
│ ├── core-features/
│ │ ├── completing-a-task.mdx
│ │ ├── creating-projects.mdx
│ │ ├── creating-tasks.mdx
│ │ ├── monitoring-task-execution.mdx
│ │ ├── new-task-attempts.mdx
│ │ ├── resolving-rebase-conflicts.mdx
│ │ ├── reviewing-code-changes.mdx
│ │ ├── subtasks.mdx
│ │ └── testing-your-application.mdx
│ ├── docs.json
│ ├── frontend-ui-library-refactor-audit.md
│ ├── getting-started.mdx
│ ├── index.mdx
│ ├── integrations/
│ │ ├── azure-repos-integration.mdx
│ │ ├── github-integration.mdx
│ │ ├── mcp-server-configuration.mdx
│ │ ├── vibe-kanban-mcp-server.mdx
│ │ └── vscode-extension.mdx
│ ├── issue-management.mdx
│ ├── remote-access.mdx
│ ├── responsible-disclosure.mdx
│ ├── reviewing-code.mdx
│ ├── self-hosting/
│ │ ├── deploy-docker.mdx
│ │ └── local-development.mdx
│ ├── settings/
│ │ ├── agent-configurations.mdx
│ │ ├── creating-task-tags.mdx
│ │ ├── general.mdx
│ │ ├── index.mdx
│ │ ├── mcp-servers.mdx
│ │ ├── organization-settings.mdx
│ │ ├── projects-repositories.mdx
│ │ └── remote-projects.mdx
│ ├── supported-coding-agents.mdx
│ ├── troubleshooting.mdx
│ └── workspaces/
│ ├── changes.mdx
│ ├── chat-interface.mdx
│ ├── command-bar.mdx
│ ├── creating-workspaces.mdx
│ ├── git-operations.mdx
│ ├── index.mdx
│ ├── interface.mdx
│ ├── managing-workspaces.mdx
│ ├── multi-repo-sessions.mdx
│ ├── repositories.mdx
│ ├── sessions.mdx
│ └── slash-commands.mdx
├── local-build.sh
├── mobile-testing.md
├── npx-cli/
│ ├── README.md
│ ├── package.json
│ ├── src/
│ │ ├── cli.ts
│ │ ├── desktop.ts
│ │ └── download.ts
│ └── tsconfig.json
├── package.json
├── packages/
│ ├── local-web/
│ │ ├── .eslintrc.cjs
│ │ ├── .prettierignore
│ │ ├── .prettierrc.json
│ │ ├── AGENTS.md
│ │ ├── components.json
│ │ ├── components.legacy.json
│ │ ├── index.html
│ │ ├── package.json
│ │ ├── postcss.config.cjs
│ │ ├── src/
│ │ │ ├── app/
│ │ │ │ ├── entry/
│ │ │ │ │ ├── App.tsx
│ │ │ │ │ └── Bootstrap.tsx
│ │ │ │ ├── hooks/
│ │ │ │ │ ├── useTauriNotificationNavigation.ts
│ │ │ │ │ └── useTauriUpdateReady.ts
│ │ │ │ ├── navigation/
│ │ │ │ │ └── AppNavigation.ts
│ │ │ │ ├── notifications/
│ │ │ │ │ ├── AppSystemNotifications.tsx
│ │ │ │ │ └── showSystemNotification.ts
│ │ │ │ ├── providers/
│ │ │ │ │ ├── ClickedElementsProvider.tsx
│ │ │ │ │ ├── ConfigProvider.tsx
│ │ │ │ │ └── ThemeProvider.tsx
│ │ │ │ └── router/
│ │ │ │ └── index.ts
│ │ │ ├── routeTree.gen.ts
│ │ │ ├── routes/
│ │ │ │ ├── __root.tsx
│ │ │ │ ├── _app.migrate.tsx
│ │ │ │ ├── _app.notifications.tsx
│ │ │ │ ├── _app.projects.$projectId.tsx
│ │ │ │ ├── _app.projects.$projectId_.issues.$issueId.tsx
│ │ │ │ ├── _app.projects.$projectId_.issues.$issueId_.workspaces.$workspaceId.tsx
│ │ │ │ ├── _app.projects.$projectId_.issues.$issueId_.workspaces.create.$draftId.tsx
│ │ │ │ ├── _app.projects.$projectId_.workspaces.create.$draftId.tsx
│ │ │ │ ├── _app.tsx
│ │ │ │ ├── _app.workspaces.tsx
│ │ │ │ ├── _app.workspaces_.$workspaceId.tsx
│ │ │ │ ├── _app.workspaces_.create.tsx
│ │ │ │ ├── _app.workspaces_.electric-test.tsx
│ │ │ │ ├── index.tsx
│ │ │ │ ├── onboarding.tsx
│ │ │ │ ├── onboarding_.sign-in.tsx
│ │ │ │ └── workspaces.$workspaceId.vscode.tsx
│ │ │ ├── shared/
│ │ │ │ └── types/
│ │ │ │ └── virtual-executor-schemas.d.ts
│ │ │ └── vite-env.d.ts
│ │ ├── tailwind.new.config.js
│ │ ├── tsconfig.json
│ │ ├── tsconfig.node.json
│ │ └── vite.config.ts
│ ├── public/
│ │ ├── robots.txt
│ │ └── site.webmanifest
│ ├── remote-web/
│ │ ├── .prettierignore
│ │ ├── index.html
│ │ ├── package.json
│ │ ├── postcss.config.cjs
│ │ ├── src/
│ │ │ ├── app/
│ │ │ │ ├── entry/
│ │ │ │ │ ├── App.tsx
│ │ │ │ │ └── Bootstrap.tsx
│ │ │ │ ├── layout/
│ │ │ │ │ ├── RemoteAppBarUserPopoverContainer.tsx
│ │ │ │ │ ├── RemoteAppShell.tsx
│ │ │ │ │ ├── RemoteDesktopNavbar.tsx
│ │ │ │ │ └── RemoteNavbarContainer.tsx
│ │ │ │ ├── navigation/
│ │ │ │ │ └── AppNavigation.ts
│ │ │ │ ├── providers/
│ │ │ │ │ ├── RemoteActionsProvider.tsx
│ │ │ │ │ ├── RemoteAuthProvider.tsx
│ │ │ │ │ └── RemoteUserSystemProvider.tsx
│ │ │ │ ├── router/
│ │ │ │ │ └── index.ts
│ │ │ │ └── styles/
│ │ │ │ └── index.css
│ │ │ ├── pages/
│ │ │ │ ├── HomePage.tsx
│ │ │ │ ├── InvitationCompletePage.tsx
│ │ │ │ ├── InvitationPage.tsx
│ │ │ │ ├── LoginCompletePage.tsx
│ │ │ │ ├── LoginPage.tsx
│ │ │ │ ├── NotFoundPage.tsx
│ │ │ │ ├── RemoteProjectKanbanShell.tsx
│ │ │ │ ├── RemoteWorkspacesPageShell.tsx
│ │ │ │ ├── UpgradeCompletePage.tsx
│ │ │ │ ├── UpgradePage.tsx
│ │ │ │ ├── UpgradeSuccessPage.tsx
│ │ │ │ └── WorkspacesUnavailablePage.tsx
│ │ │ ├── routeTree.gen.ts
│ │ │ ├── routes/
│ │ │ │ ├── __root.tsx
│ │ │ │ ├── account.tsx
│ │ │ │ ├── account_.complete.tsx
│ │ │ │ ├── account_.organizations.$orgId.tsx
│ │ │ │ ├── hosts.$hostId.workspaces.$workspaceId.vscode.tsx
│ │ │ │ ├── hosts.$hostId.workspaces.tsx
│ │ │ │ ├── hosts.$hostId.workspaces_.$workspaceId.tsx
│ │ │ │ ├── hosts.$hostId.workspaces_.create.tsx
│ │ │ │ ├── index.tsx
│ │ │ │ ├── invitations.$token.accept.tsx
│ │ │ │ ├── invitations.$token.complete.tsx
│ │ │ │ ├── login.tsx
│ │ │ │ ├── login_.complete.tsx
│ │ │ │ ├── notifications.tsx
│ │ │ │ ├── projects.$projectId.tsx
│ │ │ │ ├── projects.$projectId_.hosts.$hostId.workspaces.create.$draftId.tsx
│ │ │ │ ├── projects.$projectId_.issues.$issueId.tsx
│ │ │ │ ├── projects.$projectId_.issues.$issueId_.hosts.$hostId.workspaces.$workspaceId.tsx
│ │ │ │ ├── projects.$projectId_.issues.$issueId_.hosts.$hostId.workspaces.create.$draftId.tsx
│ │ │ │ ├── upgrade.tsx
│ │ │ │ ├── upgrade_.complete.tsx
│ │ │ │ └── upgrade_.success.tsx
│ │ │ ├── shared/
│ │ │ │ ├── components/
│ │ │ │ │ └── BrandLogo.tsx
│ │ │ │ ├── constants/
│ │ │ │ │ └── settings.ts
│ │ │ │ ├── hooks/
│ │ │ │ │ ├── useRelayAppBarHosts.ts
│ │ │ │ │ ├── useRelayWorkspaceHostHealth.ts
│ │ │ │ │ └── useSystemTheme.ts
│ │ │ │ ├── lib/
│ │ │ │ │ ├── api.ts
│ │ │ │ │ ├── auth/
│ │ │ │ │ │ └── tokenManager.ts
│ │ │ │ │ ├── auth.ts
│ │ │ │ │ ├── pkce.ts
│ │ │ │ │ ├── relay/
│ │ │ │ │ │ ├── activeHostContext.ts
│ │ │ │ │ │ ├── bytes.ts
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── http.ts
│ │ │ │ │ │ ├── keyCache.ts
│ │ │ │ │ │ ├── routing.ts
│ │ │ │ │ │ ├── signing.ts
│ │ │ │ │ │ ├── types.ts
│ │ │ │ │ │ └── ws.ts
│ │ │ │ │ ├── relayHostApi.ts
│ │ │ │ │ └── route-auth.ts
│ │ │ │ ├── stores/
│ │ │ │ │ └── useMobileWorkspaceTitle.ts
│ │ │ │ └── types/
│ │ │ │ └── virtual-executor-schemas.d.ts
│ │ │ └── vite-env.d.ts
│ │ ├── tailwind.config.cjs
│ │ ├── tsconfig.json
│ │ ├── tsconfig.node.json
│ │ └── vite.config.ts
│ ├── ui/
│ │ ├── .eslintrc.cjs
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── components/
│ │ │ │ ├── Accordion.tsx
│ │ │ │ ├── Alert.tsx
│ │ │ │ ├── AppBar.tsx
│ │ │ │ ├── AppBarButton.tsx
│ │ │ │ ├── AppBarSocialLink.tsx
│ │ │ │ ├── AppBarUserPopover.tsx
│ │ │ │ ├── AskUserQuestionBanner.tsx
│ │ │ │ ├── AutoExpandingTextarea.tsx
│ │ │ │ ├── AutoResizeTextarea.tsx
│ │ │ │ ├── Badge.tsx
│ │ │ │ ├── BulkActionBar.tsx
│ │ │ │ ├── Button.tsx
│ │ │ │ ├── Card.tsx
│ │ │ │ ├── ChangeTargetDialog.tsx
│ │ │ │ ├── ChangesPanel.tsx
│ │ │ │ ├── ChatAggregatedDiffEntries.tsx
│ │ │ │ ├── ChatAggregatedToolEntries.tsx
│ │ │ │ ├── ChatApprovalCard.tsx
│ │ │ │ ├── ChatAssistantMessage.tsx
│ │ │ │ ├── ChatBoxBase.tsx
│ │ │ │ ├── ChatCollapsedThinking.tsx
│ │ │ │ ├── ChatEmptyState.tsx
│ │ │ │ ├── ChatEntryContainer.tsx
│ │ │ │ ├── ChatErrorMessage.tsx
│ │ │ │ ├── ChatFileEntry.tsx
│ │ │ │ ├── ChatMarkdown.tsx
│ │ │ │ ├── ChatScriptEntry.tsx
│ │ │ │ ├── ChatScriptPlaceholder.tsx
│ │ │ │ ├── ChatSubagentEntry.tsx
│ │ │ │ ├── ChatSystemMessage.tsx
│ │ │ │ ├── ChatThinkingMessage.tsx
│ │ │ │ ├── ChatTodoList.tsx
│ │ │ │ ├── ChatToolSummary.tsx
│ │ │ │ ├── ChatUserMessage.tsx
│ │ │ │ ├── Checkbox.tsx
│ │ │ │ ├── ClickableCodePlugin.tsx
│ │ │ │ ├── CodeBlockShortcutPlugin.tsx
│ │ │ │ ├── CodeHighlightPlugin.tsx
│ │ │ │ ├── CollapsibleSectionHeader.tsx
│ │ │ │ ├── ColorPicker.tsx
│ │ │ │ ├── Command.tsx
│ │ │ │ ├── CommandBar.tsx
│ │ │ │ ├── CommentCard.tsx
│ │ │ │ ├── ComponentInfoKeyboardPlugin.tsx
│ │ │ │ ├── ConfirmDialog.tsx
│ │ │ │ ├── ContextBar.tsx
│ │ │ │ ├── ContextUsageGauge.tsx
│ │ │ │ ├── CreateChatBox.tsx
│ │ │ │ ├── CreateRepoDialog.tsx
│ │ │ │ ├── DataTable.tsx
│ │ │ │ ├── DeleteWorkspaceDialog.tsx
│ │ │ │ ├── Dialog.tsx
│ │ │ │ ├── Dropdown.tsx
│ │ │ │ ├── DropdownMenu.tsx
│ │ │ │ ├── EmojiPicker.tsx
│ │ │ │ ├── ErrorAlert.tsx
│ │ │ │ ├── ErrorDialog.tsx
│ │ │ │ ├── FileTagTypeaheadPlugin.tsx
│ │ │ │ ├── FileTree.tsx
│ │ │ │ ├── FileTreeNode.tsx
│ │ │ │ ├── FileTreeSearchBar.tsx
│ │ │ │ ├── GitPanel.tsx
│ │ │ │ ├── GoogleLogo.tsx
│ │ │ │ ├── GuideDialogShell.tsx
│ │ │ │ ├── IconButton.tsx
│ │ │ │ ├── IconButtonGroup.tsx
│ │ │ │ ├── ImageKeyboardPlugin.tsx
│ │ │ │ ├── Input.tsx
│ │ │ │ ├── InputField.tsx
│ │ │ │ ├── IssueCommentsSection.tsx
│ │ │ │ ├── IssueListRow.tsx
│ │ │ │ ├── IssueListSection.tsx
│ │ │ │ ├── IssueListView.tsx
│ │ │ │ ├── IssuePropertyRow.tsx
│ │ │ │ ├── IssueRelationshipsSection.tsx
│ │ │ │ ├── IssueSubIssuesSection.tsx
│ │ │ │ ├── IssueTagsRow.tsx
│ │ │ │ ├── IssueWorkspaceCard.tsx
│ │ │ │ ├── IssueWorkspacesSection.tsx
│ │ │ │ ├── KanbanAssignee.tsx
│ │ │ │ ├── KanbanBadge.tsx
│ │ │ │ ├── KanbanBoard.tsx
│ │ │ │ ├── KanbanCardContent.tsx
│ │ │ │ ├── KanbanFilterBar.tsx
│ │ │ │ ├── KanbanIssuePanel.tsx
│ │ │ │ ├── KeyboardCommandsPlugin.tsx
│ │ │ │ ├── KeyboardDialog.tsx
│ │ │ │ ├── Label.tsx
│ │ │ │ ├── Loader.tsx
│ │ │ │ ├── MarkdownInsertPlugin.tsx
│ │ │ │ ├── MarkdownListContinuePlugin.tsx
│ │ │ │ ├── MarkdownSyncPlugin.tsx
│ │ │ │ ├── MigrateChooseProjects.tsx
│ │ │ │ ├── MigrateFinish.tsx
│ │ │ │ ├── MigrateIntroduction.tsx
│ │ │ │ ├── MigrateMigrate.tsx
│ │ │ │ ├── MigrateSidebar.tsx
│ │ │ │ ├── MobileDrawer.tsx
│ │ │ │ ├── ModelList.tsx
│ │ │ │ ├── ModelProviderIcon.tsx
│ │ │ │ ├── ModelSelectorPopover.tsx
│ │ │ │ ├── MultiSelectCommandBar.tsx
│ │ │ │ ├── MultiSelectDropdown.tsx
│ │ │ │ ├── Navbar.tsx
│ │ │ │ ├── OAuthButtons.tsx
│ │ │ │ ├── PasteMarkdownPlugin.tsx
│ │ │ │ ├── PierreConversationDiff.tsx
│ │ │ │ ├── Popover.tsx
│ │ │ │ ├── PrBadge.tsx
│ │ │ │ ├── PreviewBrowser.tsx
│ │ │ │ ├── PreviewControls.tsx
│ │ │ │ ├── PreviewNavigation.tsx
│ │ │ │ ├── PrimaryButton.tsx
│ │ │ │ ├── PriorityFilterDropdown.tsx
│ │ │ │ ├── PriorityIcon.tsx
│ │ │ │ ├── ProcessListItem.tsx
│ │ │ │ ├── ProjectsGuideDialog.tsx
│ │ │ │ ├── PropertyDropdown.tsx
│ │ │ │ ├── RadixTooltip.tsx
│ │ │ │ ├── ReadOnlyLinkPlugin.tsx
│ │ │ │ ├── RebaseInProgressDialog.tsx
│ │ │ │ ├── RelationshipBadge.tsx
│ │ │ │ ├── RenameSessionDialog.tsx
│ │ │ │ ├── RenameWorkspaceDialog.tsx
│ │ │ │ ├── RepoCard.tsx
│ │ │ │ ├── RunningDots.tsx
│ │ │ │ ├── SearchableDropdown.tsx
│ │ │ │ ├── SearchableTagDropdown.tsx
│ │ │ │ ├── Select.tsx
│ │ │ │ ├── SessionChatBox.tsx
│ │ │ │ ├── SlashCommandTypeaheadPlugin.tsx
│ │ │ │ ├── SplitButton.tsx
│ │ │ │ ├── StaticToolbarPlugin.tsx
│ │ │ │ ├── StatusDot.tsx
│ │ │ │ ├── SubIssueRow.tsx
│ │ │ │ ├── Switch.tsx
│ │ │ │ ├── SyncErrorIndicator.tsx
│ │ │ │ ├── Table.tsx
│ │ │ │ ├── TerminalPanel.tsx
│ │ │ │ ├── Textarea.tsx
│ │ │ │ ├── TodoProgressPopup.tsx
│ │ │ │ ├── Toggle.tsx
│ │ │ │ ├── ToolStatusDot.tsx
│ │ │ │ ├── Toolbar.tsx
│ │ │ │ ├── ToolbarPlugin.tsx
│ │ │ │ ├── Tooltip.tsx
│ │ │ │ ├── TypeaheadMenu.tsx
│ │ │ │ ├── TypeaheadOpenContext.tsx
│ │ │ │ ├── UserAvatar.tsx
│ │ │ │ ├── ViewNavTabs.tsx
│ │ │ │ ├── WorkspaceContext.tsx
│ │ │ │ ├── WorkspaceSummary.tsx
│ │ │ │ ├── WorkspacesMain.tsx
│ │ │ │ ├── WorkspacesSidebar.tsx
│ │ │ │ ├── attachment-node.tsx
│ │ │ │ ├── component-info-node.tsx
│ │ │ │ ├── create-decorator-node.tsx
│ │ │ │ ├── image-node.tsx
│ │ │ │ ├── pr-comment-card.tsx
│ │ │ │ └── pr-comment-node.tsx
│ │ │ ├── lib/
│ │ │ │ ├── cn.ts
│ │ │ │ ├── code-highlight-theme.ts
│ │ │ │ ├── modals.ts
│ │ │ │ ├── platform.ts
│ │ │ │ └── table-transformer.ts
│ │ │ └── styles/
│ │ │ └── diff-style-overrides.css
│ │ └── tsconfig.json
│ └── web-core/
│ ├── .prettierrc.json
│ ├── package.json
│ ├── src/
│ │ ├── app/
│ │ │ └── styles/
│ │ │ ├── diff-style-overrides.css
│ │ │ ├── edit-diff-overrides.css
│ │ │ └── new/
│ │ │ └── index.css
│ │ ├── features/
│ │ │ ├── create-mode/
│ │ │ │ └── model/
│ │ │ │ ├── CreateModeProvider.tsx
│ │ │ │ ├── createModeBootstrap.ts
│ │ │ │ ├── createModeSeedStore.ts
│ │ │ │ ├── useCreateMode.ts
│ │ │ │ └── useCreateModeState.ts
│ │ │ ├── kanban/
│ │ │ │ ├── model/
│ │ │ │ │ └── hooks/
│ │ │ │ │ └── useKanbanFilters.ts
│ │ │ │ └── ui/
│ │ │ │ ├── BulkActionBarContainer.tsx
│ │ │ │ └── KanbanContainer.tsx
│ │ │ ├── migration/
│ │ │ │ ├── model/
│ │ │ │ │ └── hooks/
│ │ │ │ │ └── useProjects.ts
│ │ │ │ └── ui/
│ │ │ │ ├── MigrateChooseProjectsContainer.tsx
│ │ │ │ ├── MigrateFinishContainer.tsx
│ │ │ │ ├── MigrateIntroductionContainer.tsx
│ │ │ │ ├── MigrateLayout.tsx
│ │ │ │ └── MigrateMigrateContainer.tsx
│ │ │ ├── onboarding/
│ │ │ │ └── ui/
│ │ │ │ ├── LandingPage.tsx
│ │ │ │ └── OnboardingSignInPage.tsx
│ │ │ ├── workspace/
│ │ │ │ └── model/
│ │ │ │ └── hooks/
│ │ │ │ ├── usePreviewDevServer.ts
│ │ │ │ └── useWorkspaceNotes.ts
│ │ │ └── workspace-chat/
│ │ │ ├── model/
│ │ │ │ ├── contexts/
│ │ │ │ │ ├── ApprovalFeedbackContext.tsx
│ │ │ │ │ ├── EntriesContext.tsx
│ │ │ │ │ ├── MessageEditContext.tsx
│ │ │ │ │ └── RetryUiContext.tsx
│ │ │ │ ├── conversation-row-model.ts
│ │ │ │ ├── conversation-scroll-commands.ts
│ │ │ │ ├── deriveConversationEntries.ts
│ │ │ │ ├── deriveConversationSemanticTimeline.ts
│ │ │ │ ├── deriveConversationTimeline.ts
│ │ │ │ ├── deriveConversationTurns.ts
│ │ │ │ ├── hooks/
│ │ │ │ │ ├── useApprovalMutation.ts
│ │ │ │ │ ├── useConversationHistory.ts
│ │ │ │ │ ├── useCreateSession.ts
│ │ │ │ │ ├── useMessageEditRetry.ts
│ │ │ │ │ ├── useResetProcess.ts
│ │ │ │ │ ├── useResetProcessMutation.ts
│ │ │ │ │ ├── useSessionAttachments.ts
│ │ │ │ │ ├── useSessionMessageEditor.ts
│ │ │ │ │ ├── useSessionQueueInteraction.ts
│ │ │ │ │ ├── useSessionSend.ts
│ │ │ │ │ ├── useTodos.ts
│ │ │ │ │ └── useWorkspaceBranch.ts
│ │ │ │ ├── store/
│ │ │ │ │ └── useInspectModeStore.ts
│ │ │ │ ├── useConversationVirtualizer.ts
│ │ │ │ └── useScrollCommandExecutor.ts
│ │ │ └── ui/
│ │ │ ├── ConversationListContainer.tsx
│ │ │ ├── DisplayConversationEntry.tsx
│ │ │ └── SessionChatBoxContainer.tsx
│ │ ├── i18n/
│ │ │ ├── config.ts
│ │ │ ├── index.ts
│ │ │ ├── languages.ts
│ │ │ └── locales/
│ │ │ ├── en/
│ │ │ │ ├── common.json
│ │ │ │ ├── organization.json
│ │ │ │ ├── projects.json
│ │ │ │ ├── settings.json
│ │ │ │ └── tasks.json
│ │ │ ├── es/
│ │ │ │ ├── common.json
│ │ │ │ ├── organization.json
│ │ │ │ ├── projects.json
│ │ │ │ ├── settings.json
│ │ │ │ └── tasks.json
│ │ │ ├── fr/
│ │ │ │ ├── common.json
│ │ │ │ ├── organization.json
│ │ │ │ ├── projects.json
│ │ │ │ ├── settings.json
│ │ │ │ └── tasks.json
│ │ │ ├── ja/
│ │ │ │ ├── common.json
│ │ │ │ ├── organization.json
│ │ │ │ ├── projects.json
│ │ │ │ ├── settings.json
│ │ │ │ └── tasks.json
│ │ │ ├── ko/
│ │ │ │ ├── common.json
│ │ │ │ ├── organization.json
│ │ │ │ ├── projects.json
│ │ │ │ ├── settings.json
│ │ │ │ └── tasks.json
│ │ │ ├── zh-Hans/
│ │ │ │ ├── common.json
│ │ │ │ ├── organization.json
│ │ │ │ ├── projects.json
│ │ │ │ ├── settings.json
│ │ │ │ └── tasks.json
│ │ │ └── zh-Hant/
│ │ │ ├── common.json
│ │ │ ├── organization.json
│ │ │ ├── projects.json
│ │ │ ├── settings.json
│ │ │ └── tasks.json
│ │ ├── integrations/
│ │ │ ├── remote/
│ │ │ │ └── IssueProvider.tsx
│ │ │ └── vscode/
│ │ │ ├── ContextMenu.tsx
│ │ │ └── bridge.ts
│ │ ├── mock/
│ │ │ └── normalized_entries.json
│ │ ├── pages/
│ │ │ ├── kanban/
│ │ │ │ ├── IssueCommentsSectionContainer.tsx
│ │ │ │ ├── IssueRelationshipsSectionContainer.tsx
│ │ │ │ ├── IssueSubIssuesSectionContainer.tsx
│ │ │ │ ├── IssueWorkspacesSectionContainer.tsx
│ │ │ │ ├── KanbanIssuePanelContainer.tsx
│ │ │ │ ├── LocalProjectKanban.tsx
│ │ │ │ ├── ProjectKanban.tsx
│ │ │ │ ├── ProjectRightSidebarContainer.tsx
│ │ │ │ └── kanban-issue-panel-state.ts
│ │ │ ├── migrate/
│ │ │ │ └── MigratePage.tsx
│ │ │ ├── root/
│ │ │ │ └── RootRedirectPage.tsx
│ │ │ └── workspaces/
│ │ │ ├── AppBarNotificationBellContainer.tsx
│ │ │ ├── ChangesPanelContainer.tsx
│ │ │ ├── CommentWidgetLine.tsx
│ │ │ ├── ContextBarContainer.tsx
│ │ │ ├── ElectricTestPage.tsx
│ │ │ ├── FileTreeContainer.tsx
│ │ │ ├── GitHubCommentRenderer.tsx
│ │ │ ├── GitPanelContainer.tsx
│ │ │ ├── LogsContentContainer.tsx
│ │ │ ├── NotificationsPage.tsx
│ │ │ ├── PierreDiffCard.tsx
│ │ │ ├── PreviewBrowserContainer.tsx
│ │ │ ├── PreviewControlsContainer.tsx
│ │ │ ├── ProcessListContainer.tsx
│ │ │ ├── ReviewCommentRenderer.tsx
│ │ │ ├── RightSidebar.tsx
│ │ │ ├── VSCodeWorkspacePage.tsx
│ │ │ ├── WorkspaceNotesContainer.tsx
│ │ │ ├── Workspaces.tsx
│ │ │ ├── WorkspacesLanding.tsx
│ │ │ ├── WorkspacesLayout.tsx
│ │ │ ├── WorkspacesMainContainer.tsx
│ │ │ └── WorkspacesSidebarContainer.tsx
│ │ ├── project-routes/
│ │ │ ├── ProjectFallbackPage.tsx
│ │ │ └── project-search.ts
│ │ ├── shared/
│ │ │ ├── actions/
│ │ │ │ └── index.ts
│ │ │ ├── command-bar/
│ │ │ │ └── actions/
│ │ │ │ ├── pages.ts
│ │ │ │ └── useActionVisibility.ts
│ │ │ ├── components/
│ │ │ │ ├── AgentIcon.tsx
│ │ │ │ ├── CopyButton.tsx
│ │ │ │ ├── CreateChatBoxContainer.tsx
│ │ │ │ ├── CreateModeRepoPickerBar.tsx
│ │ │ │ ├── IdeIcon.tsx
│ │ │ │ ├── ModelSelectorContainer.tsx
│ │ │ │ ├── NormalizedConversation/
│ │ │ │ │ ├── EditDiffRenderer.tsx
│ │ │ │ │ ├── FileChangeRenderer.tsx
│ │ │ │ │ ├── FileContentView.tsx
│ │ │ │ │ ├── PendingApprovalEntry.tsx
│ │ │ │ │ └── RetryEditorInline.tsx
│ │ │ │ ├── OpenInIdeButton.tsx
│ │ │ │ ├── RawLogText.tsx
│ │ │ │ ├── SearchableTagDropdownContainer.tsx
│ │ │ │ ├── SimpleMarkdown.tsx
│ │ │ │ ├── TagManager.tsx
│ │ │ │ ├── TerminalPanelContainer.tsx
│ │ │ │ ├── VariantSelector.tsx
│ │ │ │ ├── VirtualizedProcessLogs.tsx
│ │ │ │ ├── WYSIWYGEditor.tsx
│ │ │ │ ├── XTermInstance.tsx
│ │ │ │ ├── common/
│ │ │ │ │ └── ProfileVariantBadge.tsx
│ │ │ │ ├── org/
│ │ │ │ │ ├── MemberListItem.tsx
│ │ │ │ │ └── PendingInvitationItem.tsx
│ │ │ │ ├── settings/
│ │ │ │ │ └── ExecutorProfileSelector.tsx
│ │ │ │ ├── tasks/
│ │ │ │ │ ├── AgentSelector.tsx
│ │ │ │ │ ├── BranchSelector.tsx
│ │ │ │ │ ├── ConfigSelector.tsx
│ │ │ │ │ ├── RepoBranchSelector.tsx
│ │ │ │ │ ├── RepoSelector.tsx
│ │ │ │ │ ├── TaskDetails/
│ │ │ │ │ │ ├── ProcessLogsViewer.tsx
│ │ │ │ │ │ └── ProcessesTab.tsx
│ │ │ │ │ ├── Toolbar/
│ │ │ │ │ │ └── GitOperations.tsx
│ │ │ │ │ └── UserAvatar.tsx
│ │ │ │ └── ui-new/
│ │ │ │ └── containers/
│ │ │ │ ├── AppBarUserPopoverContainer.tsx
│ │ │ │ ├── ColorPickerContainer.tsx
│ │ │ │ ├── NavbarContainer.tsx
│ │ │ │ ├── RemoteIssueLink.tsx
│ │ │ │ ├── SearchableDropdownContainer.tsx
│ │ │ │ └── SharedAppLayout.tsx
│ │ │ ├── constants/
│ │ │ │ └── processes.ts
│ │ │ ├── dialogs/
│ │ │ │ ├── auth/
│ │ │ │ │ └── GhCliSetupDialog.tsx
│ │ │ │ ├── command-bar/
│ │ │ │ │ ├── BranchRebaseDialog.tsx
│ │ │ │ │ ├── ChangeTargetBranchDialog.tsx
│ │ │ │ │ ├── CommandBarDialog.tsx
│ │ │ │ │ ├── CreatePRDialog.tsx
│ │ │ │ │ ├── CreateWorkspaceFromPrDialog.tsx
│ │ │ │ │ ├── EditBranchNameDialog.tsx
│ │ │ │ │ ├── EditorSelectionDialog.tsx
│ │ │ │ │ ├── ForcePushDialog.tsx
│ │ │ │ │ ├── GitActionsDialog.tsx
│ │ │ │ │ ├── RebaseDialog.tsx
│ │ │ │ │ ├── SelectionDialog.tsx
│ │ │ │ │ ├── StartReviewDialog.tsx
│ │ │ │ │ ├── ViewProcessesDialog.tsx
│ │ │ │ │ ├── WorkspaceSelectionDialog.tsx
│ │ │ │ │ ├── commandBar/
│ │ │ │ │ │ ├── injectSearchMatches.ts
│ │ │ │ │ │ ├── useCommandBarState.ts
│ │ │ │ │ │ └── useResolvedPage.ts
│ │ │ │ │ └── selections/
│ │ │ │ │ ├── ProjectSelectionDialog.tsx
│ │ │ │ │ ├── branchSelection.ts
│ │ │ │ │ ├── prioritySelection.ts
│ │ │ │ │ ├── relationshipSelection.ts
│ │ │ │ │ ├── repoSelection.ts
│ │ │ │ │ ├── statusSelection.ts
│ │ │ │ │ └── subIssueSelection.ts
│ │ │ │ ├── global/
│ │ │ │ │ ├── OAuthDialog.tsx
│ │ │ │ │ └── ReleaseNotesDialog.tsx
│ │ │ │ ├── kanban/
│ │ │ │ │ ├── AssigneeSelectionDialog.tsx
│ │ │ │ │ └── KanbanFiltersDialog.tsx
│ │ │ │ ├── org/
│ │ │ │ │ ├── CreateOrganizationDialog.tsx
│ │ │ │ │ ├── CreateRemoteProjectDialog.tsx
│ │ │ │ │ ├── DeleteRemoteProjectDialog.tsx
│ │ │ │ │ └── InviteMemberDialog.tsx
│ │ │ │ ├── scripts/
│ │ │ │ │ └── ScriptFixerDialog.tsx
│ │ │ │ ├── settings/
│ │ │ │ │ ├── CreateConfigurationDialog.tsx
│ │ │ │ │ ├── DeleteConfigurationDialog.tsx
│ │ │ │ │ ├── SettingsDialog.tsx
│ │ │ │ │ └── settings/
│ │ │ │ │ ├── AgentsSettingsSection.tsx
│ │ │ │ │ ├── ExecutorConfigForm.tsx
│ │ │ │ │ ├── GeneralSettingsSection.tsx
│ │ │ │ │ ├── McpSettingsSection.tsx
│ │ │ │ │ ├── OrganizationsSettingsSection.tsx
│ │ │ │ │ ├── RelaySettingsSection.tsx
│ │ │ │ │ ├── RemoteProjectsSettingsSection.tsx
│ │ │ │ │ ├── ReposSettingsSection.tsx
│ │ │ │ │ ├── SettingsComponents.tsx
│ │ │ │ │ ├── SettingsDirtyContext.tsx
│ │ │ │ │ ├── SettingsSection.tsx
│ │ │ │ │ ├── rjsf/
│ │ │ │ │ │ ├── Fields.tsx
│ │ │ │ │ │ ├── Templates.tsx
│ │ │ │ │ │ ├── Widgets.tsx
│ │ │ │ │ │ └── theme.ts
│ │ │ │ │ └── useRelayRemoteHostMutations.ts
│ │ │ │ ├── shared/
│ │ │ │ │ ├── ConfirmDialog.tsx
│ │ │ │ │ ├── FolderPickerDialog.tsx
│ │ │ │ │ ├── KeyboardShortcutsDialog.tsx
│ │ │ │ │ ├── LoginRequiredPrompt.tsx
│ │ │ │ │ ├── TagEditDialog.tsx
│ │ │ │ │ └── WorkspacesGuideDialog.tsx
│ │ │ │ ├── tasks/
│ │ │ │ │ ├── PrCommentsDialog.tsx
│ │ │ │ │ ├── ResolveConflictsDialog.tsx
│ │ │ │ │ └── RestoreLogsDialog.tsx
│ │ │ │ └── wysiwyg/
│ │ │ │ └── ImagePreviewDialog.tsx
│ │ │ ├── hooks/
│ │ │ │ ├── ApprovalForm.tsx
│ │ │ │ ├── ChangesViewProvider.tsx
│ │ │ │ ├── GitOperationsContext.tsx
│ │ │ │ ├── ProcessSelectionContext.tsx
│ │ │ │ ├── ReviewProvider.tsx
│ │ │ │ ├── TabNavigationContext.tsx
│ │ │ │ ├── auth/
│ │ │ │ │ ├── useAuth.ts
│ │ │ │ │ ├── useAuthMutations.ts
│ │ │ │ │ ├── useAuthStatus.ts
│ │ │ │ │ └── useCurrentUser.ts
│ │ │ │ ├── organizationKeys.ts
│ │ │ │ ├── useActionVisibilityContext.ts
│ │ │ │ ├── useActions.ts
│ │ │ │ ├── useAllOrganizationProjects.ts
│ │ │ │ ├── useAppNavigation.ts
│ │ │ │ ├── useAppRuntime.tsx
│ │ │ │ ├── useApprovals.ts
│ │ │ │ ├── useAttachmentUrl.ts
│ │ │ │ ├── useAzureAttachments.ts
│ │ │ │ ├── useBranchStatus.ts
│ │ │ │ ├── useChangeTargetBranch.ts
│ │ │ │ ├── useChangesView.ts
│ │ │ │ ├── useCommandBarShortcut.ts
│ │ │ │ ├── useContextBarPosition.ts
│ │ │ │ ├── useConversationHistory/
│ │ │ │ │ ├── constants.ts
│ │ │ │ │ └── types.ts
│ │ │ │ ├── useCreateAttachments.ts
│ │ │ │ ├── useCreateWorkspace.ts
│ │ │ │ ├── useCurrentAppDestination.ts
│ │ │ │ ├── useCurrentKanbanRouteState.ts
│ │ │ │ ├── useDebouncedCallback.ts
│ │ │ │ ├── useDevServer.ts
│ │ │ │ ├── useDiffStream.ts
│ │ │ │ ├── useDiffSummary.ts
│ │ │ │ ├── useDiscordOnlineCount.ts
│ │ │ │ ├── useExecutionProcesses.ts
│ │ │ │ ├── useExecutionProcessesContext.ts
│ │ │ │ ├── useExecutorConfig.ts
│ │ │ │ ├── useExecutorDiscovery.ts
│ │ │ │ ├── useForcePush.ts
│ │ │ │ ├── useGitHubComments.ts
│ │ │ │ ├── useGitHubStars.ts
│ │ │ │ ├── useGitOperations.ts
│ │ │ │ ├── useIsMobile.ts
│ │ │ │ ├── useIssueContext.ts
│ │ │ │ ├── useIssueMultiSelect.ts
│ │ │ │ ├── useJsonPatchWsStream.ts
│ │ │ │ ├── useKanbanIssueComposerScratch.ts
│ │ │ │ ├── useLocalStorageScratch.ts
│ │ │ │ ├── useLogStream.ts
│ │ │ │ ├── useLogsPanel.ts
│ │ │ │ ├── useMerge.ts
│ │ │ │ ├── useNotificationMembers.ts
│ │ │ │ ├── useNotifications.ts
│ │ │ │ ├── useOpenInEditor.ts
│ │ │ │ ├── useOrgContext.ts
│ │ │ │ ├── useOrganizationInvitations.ts
│ │ │ │ ├── useOrganizationMembers.ts
│ │ │ │ ├── useOrganizationMutations.ts
│ │ │ │ ├── useOrganizationProjects.ts
│ │ │ │ ├── useOrganizationSelection.ts
│ │ │ │ ├── usePageTitle.ts
│ │ │ │ ├── usePrComments.ts
│ │ │ │ ├── usePresetOptions.ts
│ │ │ │ ├── usePreviewNavigation.ts
│ │ │ │ ├── usePreviewSettings.ts
│ │ │ │ ├── usePreviewUrl.ts
│ │ │ │ ├── useProfiles.ts
│ │ │ │ ├── useProjectContext.ts
│ │ │ │ ├── useProjectRepoDefaults.ts
│ │ │ │ ├── useProjectWorkspaceCreateDraft.ts
│ │ │ │ ├── usePush.ts
│ │ │ │ ├── useRebase.ts
│ │ │ │ ├── useReleases.ts
│ │ │ │ ├── useRenameBranch.ts
│ │ │ │ ├── useRepoBranchSelection.ts
│ │ │ │ ├── useRepoBranches.ts
│ │ │ │ ├── useRetryProcess.ts
│ │ │ │ ├── useRetryUi.ts
│ │ │ │ ├── useReview.ts
│ │ │ │ ├── useScratch.ts
│ │ │ │ ├── useScriptPlaceholders.ts
│ │ │ │ ├── useScrollSyncStateMachine.ts
│ │ │ │ ├── useSyncErrorContext.ts
│ │ │ │ ├── useTaskWorkspaces.ts
│ │ │ │ ├── useTerminal.ts
│ │ │ │ ├── useTheme.ts
│ │ │ │ ├── useUiPreferencesScratch.ts
│ │ │ │ ├── useUserContext.ts
│ │ │ │ ├── useUserOrganizations.ts
│ │ │ │ ├── useUserSystem.ts
│ │ │ │ ├── useVariant.ts
│ │ │ │ ├── useWorkspace.ts
│ │ │ │ ├── useWorkspaceConflicts.ts
│ │ │ │ ├── useWorkspaceContext.ts
│ │ │ │ ├── useWorkspaceCreateDefaults.ts
│ │ │ │ ├── useWorkspaceExecution.ts
│ │ │ │ ├── useWorkspaceRecord.ts
│ │ │ │ ├── useWorkspaceRepo.ts
│ │ │ │ ├── useWorkspaceSessions.ts
│ │ │ │ ├── useWorkspaceSidebarPreviewController.ts
│ │ │ │ ├── useWorkspaces.ts
│ │ │ │ └── workspaceSummaryKeys.ts
│ │ │ ├── integrations/
│ │ │ │ └── electric/
│ │ │ │ └── hooks.ts
│ │ │ ├── keyboard/
│ │ │ │ ├── SequenceIndicator.tsx
│ │ │ │ ├── SequenceTracker.tsx
│ │ │ │ ├── hooks.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── registry.ts
│ │ │ │ ├── types.ts
│ │ │ │ ├── useIssueShortcuts.ts
│ │ │ │ ├── useSemanticKey.ts
│ │ │ │ └── useWorkspaceShortcuts.ts
│ │ │ ├── lib/
│ │ │ │ ├── StyleOverride.tsx
│ │ │ │ ├── TruncatePath.tsx
│ │ │ │ ├── aggregateEntries.ts
│ │ │ │ ├── api.ts
│ │ │ │ ├── attachmentUtils.ts
│ │ │ │ ├── auth/
│ │ │ │ │ ├── runtime.ts
│ │ │ │ │ └── tokenManager.ts
│ │ │ │ ├── clipboard.ts
│ │ │ │ ├── colors.ts
│ │ │ │ ├── conflicts.ts
│ │ │ │ ├── date.ts
│ │ │ │ ├── devServerUtils.ts
│ │ │ │ ├── diffDataAdapter.ts
│ │ │ │ ├── diffHeightEstimate.ts
│ │ │ │ ├── diffStatsParser.ts
│ │ │ │ ├── electric/
│ │ │ │ │ ├── collections.ts
│ │ │ │ │ └── types.ts
│ │ │ │ ├── executor.ts
│ │ │ │ ├── extToLanguage.ts
│ │ │ │ ├── fileTreeUtils.ts
│ │ │ │ ├── fileTypeIcon.ts
│ │ │ │ ├── firstProjectDestination.ts
│ │ │ │ ├── hmrContext.ts
│ │ │ │ ├── id.ts
│ │ │ │ ├── ideName.ts
│ │ │ │ ├── jsonPatch.ts
│ │ │ │ ├── localApiTransport.ts
│ │ │ │ ├── mcpStrategies.ts
│ │ │ │ ├── modals.ts
│ │ │ │ ├── modelSelector.ts
│ │ │ │ ├── notificationMessage.ts
│ │ │ │ ├── notifications.ts
│ │ │ │ ├── paths.ts
│ │ │ │ ├── platform.ts
│ │ │ │ ├── previewBridge.ts
│ │ │ │ ├── previewDevToolsBridge.ts
│ │ │ │ ├── projectOrder.ts
│ │ │ │ ├── promptMessage.ts
│ │ │ │ ├── queryClient.ts
│ │ │ │ ├── recentModels.ts
│ │ │ │ ├── relayBackendApi.ts
│ │ │ │ ├── relayClientIdentity.ts
│ │ │ │ ├── relayPairingStorage.ts
│ │ │ │ ├── relayPake.ts
│ │ │ │ ├── relaySigningSessionRefresh.ts
│ │ │ │ ├── remoteApi.ts
│ │ │ │ ├── resolveRelationships.ts
│ │ │ │ ├── routes/
│ │ │ │ │ └── appNavigation.ts
│ │ │ │ ├── scriptPlaceholders.ts
│ │ │ │ ├── searchTagsAndFiles.ts
│ │ │ │ ├── streamJsonPatchEntries.ts
│ │ │ │ ├── string.ts
│ │ │ │ ├── terminalTheme.ts
│ │ │ │ ├── theme.ts
│ │ │ │ ├── types.ts
│ │ │ │ ├── utils.ts
│ │ │ │ ├── virtuoso-modifiers.ts
│ │ │ │ ├── workspaceAttachments.ts
│ │ │ │ ├── workspaceCreateState.ts
│ │ │ │ ├── workspaceDefaults.ts
│ │ │ │ └── zoom.ts
│ │ │ ├── providers/
│ │ │ │ ├── ActionsProvider.tsx
│ │ │ │ ├── ExecutionProcessesProvider.tsx
│ │ │ │ ├── LogsPanelProvider.tsx
│ │ │ │ ├── SyncErrorProvider.tsx
│ │ │ │ ├── TerminalProvider.tsx
│ │ │ │ ├── WorkspaceProvider.tsx
│ │ │ │ ├── auth/
│ │ │ │ │ └── LocalAuthProvider.tsx
│ │ │ │ └── remote/
│ │ │ │ ├── OrgProvider.tsx
│ │ │ │ ├── ProjectProvider.tsx
│ │ │ │ └── UserProvider.tsx
│ │ │ ├── stores/
│ │ │ │ ├── useAppUpdateStore.ts
│ │ │ │ ├── useDiffViewStore.ts
│ │ │ │ ├── useExpandableStore.ts
│ │ │ │ ├── useIssueSelectionStore.ts
│ │ │ │ ├── useKanbanIssueComposerStore.ts
│ │ │ │ ├── useOrganizationStore.ts
│ │ │ │ └── useUiPreferencesStore.ts
│ │ │ └── types/
│ │ │ ├── actions.ts
│ │ │ ├── attempt.ts
│ │ │ ├── commandBar.ts
│ │ │ ├── createMode.ts
│ │ │ ├── diff.ts
│ │ │ ├── fileTree.ts
│ │ │ ├── logs.ts
│ │ │ ├── modal-args.d.ts
│ │ │ ├── modals.ts
│ │ │ ├── previewDevTools.ts
│ │ │ ├── selectionItems.ts
│ │ │ ├── tabs.ts
│ │ │ ├── tanstack-history.d.ts
│ │ │ └── virtual-executor-schemas.d.ts
│ │ ├── styles/
│ │ │ ├── diff-style-overrides.css
│ │ │ ├── edit-diff-overrides.css
│ │ │ └── new/
│ │ │ └── index.css
│ │ ├── test/
│ │ │ └── fixtures/
│ │ │ └── normalized_entries.json
│ │ └── vite-env.d.ts
│ └── tsconfig.json
├── pnpm-workspace.yaml
├── rust-toolchain.toml
├── rustfmt.toml
├── scripts/
│ ├── build-bippy-bundle.mjs
│ ├── build-tauri-msi.js
│ ├── check-i18n.sh
│ ├── check-legacy-frontend-paths.sh
│ ├── check-unused-i18n-keys.mjs
│ ├── clang
│ ├── dialog-import-rewrite-map.tsv
│ ├── generate-desktop-manifest.js
│ ├── generate-tauri-update-json.js
│ ├── legacy-frontend-paths-allowlist.txt
│ ├── migrate-remote-web-structure.mjs
│ ├── prepare-db.js
│ ├── refactor-web-shims.mjs
│ ├── relay-test-client/
│ │ ├── README.md
│ │ └── index.html
│ ├── ring-cc-wrapper.sh
│ └── setup-dev-environment.js
└── shared/
├── jwt.ts
├── remote-types.ts
├── schemas/
│ ├── amp.json
│ ├── claude_code.json
│ ├── codex.json
│ ├── copilot.json
│ ├── cursor_agent.json
│ ├── droid.json
│ ├── gemini.json
│ ├── opencode.json
│ └── qwen_code.json
└── types.ts
Showing preview only (734K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (8062 symbols across 1062 files)
FILE: crates/api-types/src/attachment.rs
type Attachment (line 8) | pub struct Attachment {
type AttachmentWithBlob (line 19) | pub struct AttachmentWithBlob {
type AttachmentWithUrl (line 39) | pub struct AttachmentWithUrl {
type ListAttachmentsResponse (line 47) | pub struct ListAttachmentsResponse {
type AttachmentUrlResponse (line 53) | pub struct AttachmentUrlResponse {
FILE: crates/api-types/src/auth.rs
type AuthSession (line 6) | pub struct AuthSession {
method last_activity_at (line 17) | pub fn last_activity_at(&self) -> DateTime<Utc> {
method inactivity_duration (line 21) | pub fn inactivity_duration(&self, now: DateTime<Utc>) -> Duration {
FILE: crates/api-types/src/blob.rs
type Blob (line 7) | pub struct Blob {
FILE: crates/api-types/src/issue.rs
type IssuePriority (line 13) | pub enum IssuePriority {
type Issue (line 21) | pub struct Issue {
type IssueSortField (line 44) | pub enum IssueSortField {
type SortDirection (line 54) | pub enum SortDirection {
type CreateIssueRequest (line 60) | pub struct CreateIssueRequest {
type UpdateIssueRequest (line 80) | pub struct UpdateIssueRequest {
type ListIssuesQuery (line 150) | pub struct ListIssuesQuery {
type SearchIssuesRequest (line 155) | pub struct SearchIssuesRequest {
type ListIssuesResponse (line 199) | pub struct ListIssuesResponse {
FILE: crates/api-types/src/issue_assignee.rs
type IssueAssignee (line 9) | pub struct IssueAssignee {
type CreateIssueAssigneeRequest (line 17) | pub struct CreateIssueAssigneeRequest {
type UpdateIssueAssigneeRequest (line 27) | pub struct UpdateIssueAssigneeRequest {
type ListIssueAssigneesQuery (line 33) | pub struct ListIssueAssigneesQuery {
type ListIssueAssigneesResponse (line 38) | pub struct ListIssueAssigneesResponse {
FILE: crates/api-types/src/issue_comment.rs
type IssueComment (line 9) | pub struct IssueComment {
type CreateIssueCommentRequest (line 20) | pub struct CreateIssueCommentRequest {
type UpdateIssueCommentRequest (line 31) | pub struct UpdateIssueCommentRequest {
type ListIssueCommentsQuery (line 39) | pub struct ListIssueCommentsQuery {
type ListIssueCommentsResponse (line 44) | pub struct ListIssueCommentsResponse {
FILE: crates/api-types/src/issue_comment_reaction.rs
type IssueCommentReaction (line 9) | pub struct IssueCommentReaction {
type CreateIssueCommentReactionRequest (line 18) | pub struct CreateIssueCommentReactionRequest {
type UpdateIssueCommentReactionRequest (line 28) | pub struct UpdateIssueCommentReactionRequest {
type ListIssueCommentReactionsQuery (line 34) | pub struct ListIssueCommentReactionsQuery {
type ListIssueCommentReactionsResponse (line 39) | pub struct ListIssueCommentReactionsResponse {
FILE: crates/api-types/src/issue_follower.rs
type IssueFollower (line 8) | pub struct IssueFollower {
type CreateIssueFollowerRequest (line 15) | pub struct CreateIssueFollowerRequest {
type UpdateIssueFollowerRequest (line 25) | pub struct UpdateIssueFollowerRequest {
type ListIssueFollowersQuery (line 31) | pub struct ListIssueFollowersQuery {
type ListIssueFollowersResponse (line 36) | pub struct ListIssueFollowersResponse {
FILE: crates/api-types/src/issue_relationship.rs
type IssueRelationshipType (line 13) | pub enum IssueRelationshipType {
type IssueRelationship (line 20) | pub struct IssueRelationship {
type CreateIssueRelationshipRequest (line 29) | pub struct CreateIssueRelationshipRequest {
type UpdateIssueRelationshipRequest (line 40) | pub struct UpdateIssueRelationshipRequest {
type ListIssueRelationshipsQuery (line 48) | pub struct ListIssueRelationshipsQuery {
type ListIssueRelationshipsResponse (line 53) | pub struct ListIssueRelationshipsResponse {
FILE: crates/api-types/src/issue_tag.rs
type IssueTag (line 8) | pub struct IssueTag {
type CreateIssueTagRequest (line 15) | pub struct CreateIssueTagRequest {
type UpdateIssueTagRequest (line 25) | pub struct UpdateIssueTagRequest {
type ListIssueTagsQuery (line 31) | pub struct ListIssueTagsQuery {
type ListIssueTagsResponse (line 36) | pub struct ListIssueTagsResponse {
FILE: crates/api-types/src/lib.rs
function some_if_present (line 62) | pub fn some_if_present<'de, D, T>(deserializer: D) -> Result<Option<T>, ...
FILE: crates/api-types/src/migration.rs
type MigrateProjectRequest (line 6) | pub struct MigrateProjectRequest {
type MigrateIssueRequest (line 14) | pub struct MigrateIssueRequest {
type MigratePullRequestRequest (line 23) | pub struct MigratePullRequestRequest {
type MigrateWorkspaceRequest (line 34) | pub struct MigrateWorkspaceRequest {
type BulkMigrateRequest (line 43) | pub struct BulkMigrateRequest<T> {
type BulkMigrateResponse (line 48) | pub struct BulkMigrateResponse {
FILE: crates/api-types/src/notification.rs
type NotificationType (line 12) | pub enum NotificationType {
type NotificationGroupKind (line 26) | pub enum NotificationGroupKind {
type Notification (line 36) | pub struct Notification {
type NotificationPayload (line 50) | pub struct NotificationPayload {
type UpdateNotificationRequest (line 84) | pub struct UpdateNotificationRequest {
FILE: crates/api-types/src/oauth.rs
type HandoffInitRequest (line 6) | pub struct HandoffInitRequest {
type HandoffInitResponse (line 13) | pub struct HandoffInitResponse {
type HandoffRedeemRequest (line 19) | pub struct HandoffRedeemRequest {
type HandoffRedeemResponse (line 26) | pub struct HandoffRedeemResponse {
type TokenRefreshRequest (line 32) | pub struct TokenRefreshRequest {
type TokenRefreshResponse (line 37) | pub struct TokenRefreshResponse {
type ProviderProfile (line 43) | pub struct ProviderProfile {
type ProfileResponse (line 52) | pub struct ProfileResponse {
type LoginStatus (line 61) | pub enum LoginStatus {
type StatusResponse (line 67) | pub struct StatusResponse {
FILE: crates/api-types/src/organization_member.rs
type MemberRole (line 12) | pub enum MemberRole {
type OrganizationMember (line 20) | pub struct OrganizationMember {
FILE: crates/api-types/src/organizations.rs
type InvitationStatus (line 14) | pub enum InvitationStatus {
type Organization (line 22) | pub struct Organization {
type OrganizationWithRole (line 33) | pub struct OrganizationWithRole {
type ListOrganizationsResponse (line 45) | pub struct ListOrganizationsResponse {
type GetOrganizationResponse (line 50) | pub struct GetOrganizationResponse {
type CreateOrganizationRequest (line 56) | pub struct CreateOrganizationRequest {
type CreateOrganizationResponse (line 62) | pub struct CreateOrganizationResponse {
type UpdateOrganizationRequest (line 67) | pub struct UpdateOrganizationRequest {
type Invitation (line 74) | pub struct Invitation {
type CreateInvitationRequest (line 87) | pub struct CreateInvitationRequest {
type CreateInvitationResponse (line 93) | pub struct CreateInvitationResponse {
type ListInvitationsResponse (line 98) | pub struct ListInvitationsResponse {
type GetInvitationResponse (line 103) | pub struct GetInvitationResponse {
type AcceptInvitationResponse (line 111) | pub struct AcceptInvitationResponse {
type RevokeInvitationRequest (line 118) | pub struct RevokeInvitationRequest {
type OrganizationMemberInfo (line 127) | pub struct OrganizationMemberInfo {
type OrganizationMemberWithProfile (line 134) | pub struct OrganizationMemberWithProfile {
type ListMembersResponse (line 146) | pub struct ListMembersResponse {
type UpdateMemberRoleRequest (line 151) | pub struct UpdateMemberRoleRequest {
type UpdateMemberRoleResponse (line 156) | pub struct UpdateMemberRoleResponse {
FILE: crates/api-types/src/project.rs
type Project (line 9) | pub struct Project {
type CreateProjectRequest (line 20) | pub struct CreateProjectRequest {
type UpdateProjectRequest (line 31) | pub struct UpdateProjectRequest {
type ListProjectsQuery (line 41) | pub struct ListProjectsQuery {
type ListProjectsResponse (line 46) | pub struct ListProjectsResponse {
type BulkUpdateProjectItem (line 51) | pub struct BulkUpdateProjectItem {
type BulkUpdateProjectsRequest (line 58) | pub struct BulkUpdateProjectsRequest {
type BulkUpdateProjectsResponse (line 63) | pub struct BulkUpdateProjectsResponse {
FILE: crates/api-types/src/project_status.rs
type ProjectStatus (line 9) | pub struct ProjectStatus {
type CreateProjectStatusRequest (line 20) | pub struct CreateProjectStatusRequest {
type UpdateProjectStatusRequest (line 33) | pub struct UpdateProjectStatusRequest {
type ListProjectStatusesQuery (line 45) | pub struct ListProjectStatusesQuery {
type ListProjectStatusesResponse (line 50) | pub struct ListProjectStatusesResponse {
FILE: crates/api-types/src/pull_request.rs
type PullRequestStatus (line 11) | pub enum PullRequestStatus {
type PullRequest (line 18) | pub struct PullRequest {
type ListPullRequestsQuery (line 33) | pub struct ListPullRequestsQuery {
type ListPullRequestsResponse (line 38) | pub struct ListPullRequestsResponse {
FILE: crates/api-types/src/pull_requests_local.rs
type UpsertPullRequestRequest (line 8) | pub struct UpsertPullRequestRequest {
FILE: crates/api-types/src/relay.rs
type RelayHost (line 7) | pub struct RelayHost {
type ListRelayHostsResponse (line 20) | pub struct ListRelayHostsResponse {
type RelaySessionAuthCodeResponse (line 25) | pub struct RelaySessionAuthCodeResponse {
type RelaySession (line 31) | pub struct RelaySession {
FILE: crates/api-types/src/response.rs
type MutationResponse (line 7) | pub struct MutationResponse<T> {
type DeleteResponse (line 14) | pub struct DeleteResponse {
FILE: crates/api-types/src/tag.rs
type Tag (line 8) | pub struct Tag {
type CreateTagRequest (line 16) | pub struct CreateTagRequest {
type UpdateTagRequest (line 27) | pub struct UpdateTagRequest {
type ListTagsQuery (line 35) | pub struct ListTagsQuery {
type ListTagsResponse (line 40) | pub struct ListTagsResponse {
FILE: crates/api-types/src/user.rs
type User (line 7) | pub struct User {
type UserData (line 18) | pub struct UserData {
FILE: crates/api-types/src/workspace.rs
type Workspace (line 8) | pub struct Workspace {
FILE: crates/api-types/src/workspaces.rs
type DeleteWorkspaceRequest (line 5) | pub struct DeleteWorkspaceRequest {
type CreateWorkspaceRequest (line 10) | pub struct CreateWorkspaceRequest {
type UpdateWorkspaceRequest (line 27) | pub struct UpdateWorkspaceRequest {
FILE: crates/db/migrations/20250617183714_init.sql
type projects (line 3) | CREATE TABLE projects (
type tasks (line 12) | CREATE TABLE tasks (
type task_attempts (line 24) | CREATE TABLE task_attempts (
type task_attempt_activities (line 37) | CREATE TABLE task_attempt_activities (
FILE: crates/db/migrations/20250620212427_execution_processes.sql
type execution_processes (line 3) | CREATE TABLE execution_processes (
type idx_execution_processes_task_attempt_id (line 23) | CREATE INDEX idx_execution_processes_task_attempt_id ON execution_proces...
type idx_execution_processes_status (line 24) | CREATE INDEX idx_execution_processes_status ON execution_processes(status)
type idx_execution_processes_type (line 25) | CREATE INDEX idx_execution_processes_type ON execution_processes(process...
FILE: crates/db/migrations/20250620214100_remove_stdout_stderr_from_task_attempts.sql
type task_attempts_new (line 8) | CREATE TABLE task_attempts_new (
FILE: crates/db/migrations/20250621120000_relate_activities_to_execution_processes.sql
type task_attempt_activities (line 10) | CREATE TABLE task_attempt_activities (
type idx_task_attempt_activities_execution_process_id (line 20) | CREATE INDEX idx_task_attempt_activities_execution_process_id ON task_at...
type idx_task_attempt_activities_created_at (line 23) | CREATE INDEX idx_task_attempt_activities_created_at ON task_attempt_acti...
FILE: crates/db/migrations/20250623120000_executor_sessions.sql
type executor_sessions (line 3) | CREATE TABLE executor_sessions (
type idx_executor_sessions_task_attempt_id (line 15) | CREATE INDEX idx_executor_sessions_task_attempt_id ON executor_sessions(...
type idx_executor_sessions_execution_process_id (line 16) | CREATE INDEX idx_executor_sessions_execution_process_id ON executor_sess...
type idx_executor_sessions_session_id (line 17) | CREATE INDEX idx_executor_sessions_session_id ON executor_sessions(sessi...
FILE: crates/db/migrations/20250715154859_add_task_templates.sql
type task_templates (line 2) | CREATE TABLE task_templates (
type idx_task_templates_project_id (line 14) | CREATE INDEX idx_task_templates_project_id ON task_templates(project_id)
type idx_task_templates_unique_name_project (line 18) | CREATE UNIQUE INDEX idx_task_templates_unique_name_project
type idx_task_templates_unique_name_global (line 23) | CREATE UNIQUE INDEX idx_task_templates_unique_name_global
FILE: crates/db/migrations/20250716170000_add_parent_task_to_tasks.sql
type idx_tasks_parent_task_attempt (line 7) | CREATE INDEX idx_tasks_parent_task_attempt ON tasks(parent_task_attempt)
FILE: crates/db/migrations/20250720000000_add_cleanupscript_to_process_type_constraint.sql
type idx_execution_processes_type (line 24) | CREATE INDEX idx_execution_processes_type
FILE: crates/db/migrations/20250729162941_create_execution_process_logs.sql
type execution_process_logs (line 3) | CREATE TABLE execution_process_logs (
type idx_execution_process_logs_inserted_at (line 11) | CREATE INDEX idx_execution_process_logs_inserted_at ON execution_process...
FILE: crates/db/migrations/20250730124500_add_execution_process_task_attempt_index.sql
type idx_execution_processes_task_attempt_type_created (line 5) | CREATE INDEX idx_execution_processes_task_attempt_type_created
FILE: crates/db/migrations/20250805122100_fix_executor_action_type_virtual_column.sql
type idx_execution_processes_task_attempt_type_created (line 11) | CREATE INDEX idx_execution_processes_task_attempt_type_created
FILE: crates/db/migrations/20250818150000_refactor_images_to_junction_tables.sql
type images (line 7) | CREATE TABLE images (
type task_images (line 19) | CREATE TABLE task_images (
type idx_images_hash (line 31) | CREATE INDEX idx_images_hash ON images(hash)
type idx_task_images_task_id (line 32) | CREATE INDEX idx_task_images_task_id ON task_images(task_id)
type idx_task_images_image_id (line 33) | CREATE INDEX idx_task_images_image_id ON task_images(image_id)
FILE: crates/db/migrations/20250819000000_move_merge_commit_to_merges_table.sql
type merges (line 2) | CREATE TABLE merges (
type idx_merges_task_attempt_id (line 33) | CREATE INDEX idx_merges_task_attempt_id ON merges(task_attempt_id)
type idx_merges_open_pr (line 36) | CREATE INDEX idx_merges_open_pr ON merges(task_attempt_id, pr_status)
FILE: crates/db/migrations/20250906120000_add_follow_up_drafts.sql
type follow_up_drafts (line 4) | CREATE TABLE IF NOT EXISTS follow_up_drafts (
type idx_follow_up_drafts_task_attempt_id (line 18) | CREATE INDEX IF NOT EXISTS idx_follow_up_drafts_task_attempt_id
FILE: crates/db/migrations/20250917123000_optimize_selects_and_cleanup_indexes.sql
type idx_task_attempts_task_id_created_at (line 4) | CREATE INDEX IF NOT EXISTS idx_task_attempts_task_id_created_at
type idx_task_attempts_created_at (line 8) | CREATE INDEX IF NOT EXISTS idx_task_attempts_created_at
type idx_execution_processes_task_attempt_created_at (line 12) | CREATE INDEX IF NOT EXISTS idx_execution_processes_task_attempt_created_at
type idx_tasks_project_created_at (line 19) | CREATE INDEX IF NOT EXISTS idx_tasks_project_created_at
FILE: crates/db/migrations/20250921222241_unify_drafts_tables.sql
type drafts (line 5) | CREATE TABLE IF NOT EXISTS drafts (
type idx_drafts_task_attempt_id (line 25) | CREATE INDEX IF NOT EXISTS idx_drafts_task_attempt_id
type idx_drafts_draft_type (line 28) | CREATE INDEX IF NOT EXISTS idx_drafts_draft_type
type idx_drafts_queued_sending (line 31) | CREATE INDEX IF NOT EXISTS idx_drafts_queued_sending
FILE: crates/db/migrations/20251020120000_convert_templates_to_tags.sql
type tags (line 4) | CREATE TABLE tags (
FILE: crates/db/migrations/20251101090000_drop_execution_process_logs_pk.sql
type execution_process_logs_new (line 13) | CREATE TABLE execution_process_logs_new (
type idx_execution_process_logs_execution_id_inserted_at (line 42) | CREATE INDEX IF NOT EXISTS idx_execution_process_logs_execution_id_inser...
FILE: crates/db/migrations/20251114000000_create_shared_tasks.sql
type shared_tasks (line 3) | CREATE TABLE IF NOT EXISTS shared_tasks (
type idx_shared_tasks_remote_project (line 20) | CREATE INDEX IF NOT EXISTS idx_shared_tasks_remote_project
type idx_shared_tasks_status (line 23) | CREATE INDEX IF NOT EXISTS idx_shared_tasks_status
type shared_activity_cursors (line 26) | CREATE TABLE IF NOT EXISTS shared_activity_cursors (
type idx_tasks_shared_task_unique (line 35) | CREATE UNIQUE INDEX IF NOT EXISTS idx_tasks_shared_task_unique
type idx_projects_remote_project_id (line 42) | CREATE UNIQUE INDEX IF NOT EXISTS idx_projects_remote_project_id
FILE: crates/db/migrations/20251120000001_refactor_to_scratch.sql
type scratch (line 1) | CREATE TABLE scratch (
type idx_scratch_created_at (line 10) | CREATE INDEX idx_scratch_created_at ON scratch(created_at)
FILE: crates/db/migrations/20251202000000_migrate_to_electric.sql
type idx_tasks_shared_task_unique (line 19) | CREATE UNIQUE INDEX IF NOT EXISTS idx_tasks_shared_task_unique
FILE: crates/db/migrations/20251209000000_add_project_repositories.sql
type repos (line 2) | CREATE TABLE repos (
type project_repos (line 12) | CREATE TABLE project_repos (
type idx_project_repos_project_id (line 24) | CREATE INDEX idx_project_repos_project_id ON project_repos(project_id)
type idx_project_repos_repo_id (line 25) | CREATE INDEX idx_project_repos_repo_id ON project_repos(repo_id)
type attempt_repos (line 28) | CREATE TABLE attempt_repos (
type idx_attempt_repos_attempt_id (line 39) | CREATE INDEX idx_attempt_repos_attempt_id ON attempt_repos(attempt_id)
type idx_attempt_repos_repo_id (line 40) | CREATE INDEX idx_attempt_repos_repo_id ON attempt_repos(repo_id)
type execution_process_repo_states (line 43) | CREATE TABLE execution_process_repo_states (
type idx_eprs_process_id (line 56) | CREATE INDEX idx_eprs_process_id ON execution_process_repo_states(execut...
type idx_eprs_repo_id (line 57) | CREATE INDEX idx_eprs_repo_id ON execution_process_repo_states(repo_id)
type idx_merges_repo_id (line 61) | CREATE INDEX idx_merges_repo_id ON merges(repo_id)
type idx_merges_repo_id (line 117) | CREATE INDEX idx_merges_repo_id ON merges(repo_id)
type projects_new (line 155) | CREATE TABLE projects_new (
type idx_projects_remote_project_id (line 175) | CREATE UNIQUE INDEX IF NOT EXISTS idx_projects_remote_project_id
FILE: crates/db/migrations/20251216142123_refactor_task_attempts_to_workspaces_sessions.sql
type sessions (line 13) | CREATE TABLE sessions (
type idx_sessions_workspace_id (line 22) | CREATE INDEX idx_sessions_workspace_id ON sessions(workspace_id)
type idx_merges_workspace_id (line 35) | CREATE INDEX idx_merges_workspace_id ON merges(workspace_id)
type idx_merges_open_pr (line 36) | CREATE INDEX idx_merges_open_pr ON merges(workspace_id, pr_status)
type idx_tasks_parent_workspace_id (line 42) | CREATE INDEX idx_tasks_parent_workspace_id ON tasks(parent_workspace_id)
type execution_processes_new (line 58) | CREATE TABLE execution_processes_new (
type idx_execution_processes_session_id (line 85) | CREATE INDEX idx_execution_processes_session_id ON execution_processes(s...
type idx_execution_processes_status (line 86) | CREATE INDEX idx_execution_processes_status ON execution_processes(status)
type idx_execution_processes_run_reason (line 87) | CREATE INDEX idx_execution_processes_run_reason ON execution_processes(r...
type idx_execution_processes_session_status_run_reason (line 90) | CREATE INDEX idx_execution_processes_session_status_run_reason
type idx_execution_processes_session_run_reason_created (line 93) | CREATE INDEX idx_execution_processes_session_run_reason_created
type coding_agent_turns (line 99) | CREATE TABLE coding_agent_turns (
type idx_coding_agent_turns_execution_process_id (line 117) | CREATE INDEX idx_coding_agent_turns_execution_process_id ON coding_agent...
type idx_coding_agent_turns_agent_session_id (line 118) | CREATE INDEX idx_coding_agent_turns_agent_session_id ON coding_agent_tur...
type idx_workspace_repos_workspace_id (line 125) | CREATE INDEX idx_workspace_repos_workspace_id ON workspace_repos(workspa...
type idx_workspace_repos_repo_id (line 126) | CREATE INDEX idx_workspace_repos_repo_id ON workspace_repos(repo_id)
FILE: crates/db/migrations/20251219164205_add_missing_indexes_for_slow_queries.sql
type idx_sessions_workspace_id_created_at (line 1) | CREATE INDEX IF NOT EXISTS idx_sessions_workspace_id_created_at
type idx_projects_created_at (line 4) | CREATE INDEX IF NOT EXISTS idx_projects_created_at
type idx_workspaces_container_ref (line 7) | CREATE INDEX IF NOT EXISTS idx_workspaces_container_ref
type idx_eprs_process_repo (line 11) | CREATE INDEX IF NOT EXISTS idx_eprs_process_repo
FILE: crates/db/migrations/20260112160045_add_composite_indexes_for_performance.sql
type idx_workspace_repos_lookup (line 4) | CREATE INDEX IF NOT EXISTS idx_workspace_repos_lookup
type idx_merges_type_status (line 10) | CREATE INDEX IF NOT EXISTS idx_merges_type_status
FILE: crates/db/migrations/20260128000000_add_migration_state.sql
type migration_state (line 2) | CREATE TABLE IF NOT EXISTS migration_state (
type idx_migration_state_status (line 15) | CREATE INDEX idx_migration_state_status ON migration_state(status)
type idx_migration_state_entity_type (line 16) | CREATE INDEX idx_migration_state_entity_type ON migration_state(entity_t...
type idx_migration_state_entity_lookup (line 17) | CREATE INDEX idx_migration_state_entity_lookup ON migration_state(entity...
FILE: crates/db/migrations/20260203000000_add_archive_script_to_repos.sql
type idx_execution_processes_run_reason (line 34) | CREATE INDEX idx_execution_processes_run_reason
type idx_execution_processes_session_status_run_reason (line 37) | CREATE INDEX idx_execution_processes_session_status_run_reason
type idx_execution_processes_session_run_reason_created (line 40) | CREATE INDEX idx_execution_processes_session_run_reason_created
FILE: crates/db/migrations/20260217120312_remove_task_fk_from_workspaces.sql
type workspaces_new (line 12) | CREATE TABLE workspaces_new (
type idx_workspaces_task_id_created_at (line 36) | CREATE INDEX idx_workspaces_task_id_created_at
type idx_workspaces_created_at (line 38) | CREATE INDEX idx_workspaces_created_at
type idx_workspaces_container_ref (line 40) | CREATE INDEX idx_workspaces_container_ref
type workspace_images (line 51) | CREATE TABLE workspace_images (
type idx_workspace_images_workspace_id (line 61) | CREATE INDEX idx_workspace_images_workspace_id ON workspace_images(works...
type idx_workspace_images_image_id (line 62) | CREATE INDEX idx_workspace_images_image_id ON workspace_images(image_id)
FILE: crates/db/migrations/20260317120000_cleanup_attachment_schema.sql
type idx_attachments_hash (line 19) | CREATE INDEX idx_attachments_hash ON attachments(hash)
type idx_task_attachments_task_id (line 20) | CREATE INDEX idx_task_attachments_task_id ON task_attachments(task_id)
type idx_task_attachments_attachment_id (line 21) | CREATE INDEX idx_task_attachments_attachment_id ON task_attachments(atta...
type idx_workspace_attachments_workspace_id (line 22) | CREATE INDEX idx_workspace_attachments_workspace_id
type idx_workspace_attachments_attachment_id (line 24) | CREATE INDEX idx_workspace_attachments_attachment_id
FILE: crates/db/src/lib.rs
function run_migrations (line 12) | async fn run_migrations(pool: &Pool<Sqlite>) -> Result<(), Error> {
type DBService (line 71) | pub struct DBService {
method new (line 76) | pub async fn new() -> Result<DBService, Error> {
method new_migration_pool (line 89) | pub async fn new_migration_pool() -> Result<Pool<Sqlite>, Error> {
method new_with_after_connect (line 104) | pub async fn new_with_after_connect<F>(after_connect: F) -> Result<DBS...
method create_pool (line 118) | async fn create_pool<F>(after_connect: Option<Arc<F>>) -> Result<Pool<...
FILE: crates/db/src/models/coding_agent_turn.rs
type CodingAgentTurn (line 8) | pub struct CodingAgentTurn {
method find_latest_session_info (line 36) | pub async fn find_latest_session_info(
method find_by_execution_process_id (line 60) | pub async fn find_by_execution_process_id(
method find_by_agent_session_id (line 84) | pub async fn find_by_agent_session_id(
method create (line 111) | pub async fn create(
method update_agent_session_id (line 156) | pub async fn update_agent_session_id(
method update_agent_message_id (line 177) | pub async fn update_agent_message_id(
method update_summary (line 198) | pub async fn update_summary(
method mark_unseen_by_execution_process_id (line 219) | pub async fn mark_unseen_by_execution_process_id(
method mark_seen_by_workspace_id (line 239) | pub async fn mark_seen_by_workspace_id(
method has_unseen_by_workspace_id (line 262) | pub async fn has_unseen_by_workspace_id(
method find_workspaces_with_unseen (line 282) | pub async fn find_workspaces_with_unseen(
type CreateCodingAgentTurn (line 21) | pub struct CreateCodingAgentTurn {
type CodingAgentResumeInfo (line 28) | pub struct CodingAgentResumeInfo {
FILE: crates/db/src/models/execution_process.rs
type ExecutionProcessError (line 24) | pub enum ExecutionProcessError {
type ExecutionProcessStatus (line 43) | pub enum ExecutionProcessStatus {
type ExecutionProcessRunReason (line 53) | pub enum ExecutionProcessRunReason {
type ExecutionProcess (line 62) | pub struct ExecutionProcess {
method find_by_id (line 133) | pub async fn find_by_id(pool: &SqlitePool, id: Uuid) -> Result<Option<...
method list_missing_before_context (line 157) | pub async fn list_missing_before_context(
method find_by_rowid (line 207) | pub async fn find_by_rowid(pool: &SqlitePool, rowid: i64) -> Result<Op...
method find_by_session_id (line 230) | pub async fn find_by_session_id(
method find_running (line 261) | pub async fn find_running(pool: &SqlitePool) -> Result<Vec<Self>, sqlx...
method has_running_coding_agent_for_session (line 283) | pub async fn has_running_coding_agent_for_session(
method has_running_non_dev_server_processes_for_workspace (line 301) | pub async fn has_running_non_dev_server_processes_for_workspace(
method find_running_dev_servers_by_workspace (line 320) | pub async fn find_running_dev_servers_by_workspace(
method find_latest_by_session_and_run_reason (line 353) | pub async fn find_latest_by_session_and_run_reason(
method find_latest_by_workspace_and_run_reason (line 383) | pub async fn find_latest_by_workspace_and_run_reason(
method create (line 420) | pub async fn create(
method was_stopped (line 455) | pub async fn was_stopped(pool: &SqlitePool, id: Uuid) -> bool {
method update_completion (line 468) | pub async fn update_completion(
method executor_action (line 495) | pub fn executor_action(&self) -> Result<&ExecutorAction, anyhow::Error> {
method drop_at_and_after (line 505) | pub async fn drop_at_and_after(
method find_prev_after_head_commit (line 526) | pub async fn find_prev_after_head_commit(
method parent_session (line 551) | pub async fn parent_session(&self, pool: &SqlitePool) -> Result<Option...
method parent_workspace_and_session (line 556) | pub async fn parent_workspace_and_session(
method load_context (line 572) | pub async fn load_context(
method latest_executor_profile_for_session (line 600) | pub async fn latest_executor_profile_for_session(
method find_latest_for_workspaces (line 655) | pub async fn find_latest_for_workspaces(
method find_workspaces_with_running_dev_servers (line 703) | pub async fn find_workspaces_with_running_dev_servers(
type CreateExecutionProcess (line 81) | pub struct CreateExecutionProcess {
type UpdateExecutionProcess (line 89) | pub struct UpdateExecutionProcess {
type ExecutionContext (line 96) | pub struct ExecutionContext {
type LatestProcessInfo (line 105) | pub struct LatestProcessInfo {
type ExecutorActionField (line 115) | pub enum ExecutorActionField {
type MissingBeforeContext (line 121) | pub struct MissingBeforeContext {
FILE: crates/db/src/models/execution_process_logs.rs
type ExecutionProcessLogs (line 9) | pub struct ExecutionProcessLogs {
method has_any (line 24) | pub async fn has_any(pool: &SqlitePool) -> Result<bool, sqlx::Error> {
method count_distinct_processes (line 40) | pub async fn count_distinct_processes(pool: &SqlitePool) -> Result<i64...
method stream_distinct_processes (line 56) | pub fn stream_distinct_processes<'a>(
method delete_all (line 75) | pub async fn delete_all(pool: &SqlitePool) -> Result<(), sqlx::Error> {
method find_by_execution_id (line 83) | pub async fn find_by_execution_id(
method stream_log_lines_by_execution_id (line 104) | pub fn stream_log_lines_by_execution_id<'a>(
method parse_logs (line 119) | pub fn parse_logs(records: &[Self]) -> Result<Vec<LogMsg>, serde_json:...
method append_log_line (line 131) | pub async fn append_log_line(
type ExecutionProcessLogMigrationInfo (line 17) | pub struct ExecutionProcessLogMigrationInfo {
FILE: crates/db/src/models/execution_process_repo_state.rs
type ExecutionProcessRepoState (line 8) | pub struct ExecutionProcessRepoState {
method create_many (line 30) | pub async fn create_many(
method update_before_head_commit (line 70) | pub async fn update_before_head_commit(
method update_after_head_commit (line 92) | pub async fn update_after_head_commit(
method set_merge_commit (line 114) | pub async fn set_merge_commit(
method find_by_execution_process_id (line 136) | pub async fn find_by_execution_process_id(
type CreateExecutionProcessRepoState (line 22) | pub struct CreateExecutionProcessRepoState {
FILE: crates/db/src/models/file.rs
type File (line 8) | pub struct File {
method create (line 29) | pub async fn create(pool: &SqlitePool, data: &CreateFile) -> Result<Se...
method find_by_hash (line 54) | pub async fn find_by_hash(pool: &SqlitePool, hash: &str) -> Result<Opt...
method find_by_id (line 73) | pub async fn find_by_id(pool: &SqlitePool, id: Uuid) -> Result<Option<...
method find_by_file_path (line 92) | pub async fn find_by_file_path(
method find_by_workspace_id (line 114) | pub async fn find_by_workspace_id(
method delete (line 138) | pub async fn delete(pool: &SqlitePool, id: Uuid) -> Result<(), sqlx::E...
method find_orphaned_files (line 145) | pub async fn find_orphaned_files(pool: &SqlitePool) -> Result<Vec<Self...
type CreateFile (line 20) | pub struct CreateFile {
type WorkspaceAttachment (line 166) | pub struct WorkspaceAttachment {
method associate_many_dedup (line 175) | pub async fn associate_many_dedup(
FILE: crates/db/src/models/merge.rs
type MergeStatus (line 12) | pub enum MergeStatus {
type Merge (line 21) | pub enum Merge {
method merge_commit (line 80) | pub fn merge_commit(&self) -> Option<String> {
method create_direct (line 88) | pub async fn create_direct(
method create_pr (line 129) | pub async fn create_pr(
method find_all_pr (line 172) | pub async fn find_all_pr(pool: &SqlitePool) -> Result<Vec<PrMerge>, sq...
method get_open_prs (line 198) | pub async fn get_open_prs(pool: &SqlitePool) -> Result<Vec<PrMerge>, s...
method count_open_prs_for_workspace (line 224) | pub async fn count_open_prs_for_workspace(
method update_status (line 243) | pub async fn update_status(
method find_by_workspace_id (line 272) | pub async fn find_by_workspace_id(
method find_by_workspace_and_repo_id (line 305) | pub async fn find_by_workspace_and_repo_id(
method get_latest_pr_status_for_workspaces (line 339) | pub async fn get_latest_pr_status_for_workspaces(
method from (line 421) | fn from(row: MergeRow) -> Self {
type DirectMerge (line 27) | pub struct DirectMerge {
method from (line 387) | fn from(row: MergeRow) -> Self {
type PrMerge (line 38) | pub struct PrMerge {
method from (line 402) | fn from(row: MergeRow) -> Self {
type PullRequestInfo (line 48) | pub struct PullRequestInfo {
type MergeType (line 58) | pub enum MergeType {
type MergeRow (line 64) | struct MergeRow {
FILE: crates/db/src/models/migration_state.rs
type MigrationStateError (line 9) | pub enum MigrationStateError {
type EntityType (line 18) | pub enum EntityType {
type MigrationStatus (line 29) | pub enum MigrationStatus {
type MigrationState (line 38) | pub struct MigrationState {
method find_all (line 57) | pub async fn find_all(pool: &SqlitePool) -> Result<Vec<Self>, Migratio...
method find_by_entity_type (line 78) | pub async fn find_by_entity_type(
method find_by_status (line 105) | pub async fn find_by_status(
method find_pending_by_type (line 132) | pub async fn find_pending_by_type(
method find_by_entity (line 159) | pub async fn find_by_entity(
method get_remote_id (line 187) | pub async fn get_remote_id(
method create (line 205) | pub async fn create<'e, E>(
method upsert (line 237) | pub async fn upsert<'e, E>(
method mark_migrated (line 271) | pub async fn mark_migrated<'e, E>(
method mark_failed (line 297) | pub async fn mark_failed<'e, E>(
method mark_skipped (line 323) | pub async fn mark_skipped<'e, E>(
method reset_failed (line 348) | pub async fn reset_failed(pool: &SqlitePool) -> Result<u64, MigrationS...
method get_stats (line 361) | pub async fn get_stats(pool: &SqlitePool) -> Result<MigrationStats, Mi...
method clear_all (line 377) | pub async fn clear_all(pool: &SqlitePool) -> Result<u64, MigrationStat...
type CreateMigrationState (line 51) | pub struct CreateMigrationState {
type MigrationStats (line 386) | pub struct MigrationStats {
FILE: crates/db/src/models/project.rs
type Project (line 8) | pub struct Project {
method find_all (line 20) | pub async fn find_all(pool: &SqlitePool) -> Result<Vec<Self>, sqlx::Er...
method set_remote_project_id (line 36) | pub async fn set_remote_project_id(
FILE: crates/db/src/models/repo.rs
type SearchResult (line 12) | pub struct SearchResult {
type SearchMatchType (line 22) | pub enum SearchMatchType {
type RepoError (line 29) | pub enum RepoError {
type Repo (line 37) | pub struct Repo {
method list_needing_name_fix (line 134) | pub async fn list_needing_name_fix(pool: &SqlitePool) -> Result<Vec<Se...
method update_name (line 158) | pub async fn update_name(
method find_by_id (line 175) | pub async fn find_by_id(pool: &SqlitePool, id: Uuid) -> Result<Option<...
method find_by_ids (line 200) | pub async fn find_by_ids(pool: &SqlitePool, ids: &[Uuid]) -> Result<Ve...
method find_or_create (line 215) | pub async fn find_or_create<'e, E>(
method delete_orphaned (line 259) | pub async fn delete_orphaned(pool: &SqlitePool) -> Result<u64, sqlx::E...
method list_all (line 270) | pub async fn list_all(pool: &SqlitePool) -> Result<Vec<Self>, sqlx::Er...
method list_by_recent_workspace_usage (line 294) | pub async fn list_by_recent_workspace_usage(
method active_workspace_names (line 326) | pub async fn active_workspace_names(
method delete (line 348) | pub async fn delete(pool: &SqlitePool, id: Uuid) -> Result<u64, sqlx::...
method update (line 355) | pub async fn update(
type UpdateRepo (line 57) | pub struct UpdateRepo {
FILE: crates/db/src/models/requests.rs
type ContainerQuery (line 9) | pub struct ContainerQuery {
type WorkspaceRepoInput (line 15) | pub struct WorkspaceRepoInput {
type CreateWorkspaceApiRequest (line 21) | pub struct CreateWorkspaceApiRequest {
type LinkedIssueInfo (line 26) | pub struct LinkedIssueInfo {
type CreateAndStartWorkspaceRequest (line 32) | pub struct CreateAndStartWorkspaceRequest {
type CreateAndStartWorkspaceResponse (line 42) | pub struct CreateAndStartWorkspaceResponse {
type UpdateWorkspace (line 48) | pub struct UpdateWorkspace {
type UpdateSession (line 55) | pub struct UpdateSession {
FILE: crates/db/src/models/scratch.rs
type ScratchError (line 11) | pub enum ScratchError {
type DraftFollowUpData (line 22) | pub struct DraftFollowUpData {
type PreviewSettingsData (line 30) | pub struct PreviewSettingsData {
type WorkspaceNotesData (line 42) | pub struct WorkspaceNotesData {
type WorkspacePanelStateData (line 48) | pub struct WorkspacePanelStateData {
type WorkspacePrFilterData (line 56) | pub enum WorkspacePrFilterData {
type WorkspaceSortByData (line 66) | pub enum WorkspaceSortByData {
type WorkspaceSortOrderData (line 75) | pub enum WorkspaceSortOrderData {
type WorkspaceFilterStateData (line 83) | pub struct WorkspaceFilterStateData {
type WorkspaceSortStateData (line 92) | pub struct WorkspaceSortStateData {
type UiPreferencesData (line 101) | pub struct UiPreferencesData {
type DraftWorkspaceLinkedIssue (line 151) | pub struct DraftWorkspaceLinkedIssue {
type DraftWorkspaceAttachment (line 160) | pub struct DraftWorkspaceAttachment {
type DraftWorkspaceData (line 171) | pub struct DraftWorkspaceData {
type DraftWorkspaceRepo (line 185) | pub struct DraftWorkspaceRepo {
type ProjectRepoDefaultsData (line 192) | pub struct ProjectRepoDefaultsData {
type DraftIssueData (line 198) | pub struct DraftIssueData {
type ScratchPayload (line 229) | pub enum ScratchPayload {
method scratch_type (line 242) | pub fn scratch_type(&self) -> ScratchType {
method validate_type (line 247) | pub fn validate_type(&self, expected: ScratchType) -> Result<(), Scrat...
type ScratchRow (line 260) | struct ScratchRow {
type Scratch (line 269) | pub struct Scratch {
method scratch_type (line 278) | pub fn scratch_type(&self) -> ScratchType {
type Error (line 284) | type Error = ScratchError;
method try_from (line 285) | fn try_from(r: ScratchRow) -> Result<Self, ScratchError> {
method create (line 315) | pub async fn create(
method find_by_id (line 345) | pub async fn find_by_id(
method find_all (line 373) | pub async fn find_all(pool: &SqlitePool) -> Result<Vec<Self>, ScratchE...
method update (line 399) | pub async fn update(
method delete (line 434) | pub async fn delete(
method find_by_rowid (line 450) | pub async fn find_by_rowid(
type CreateScratch (line 304) | pub struct CreateScratch {
type UpdateScratch (line 310) | pub struct UpdateScratch {
FILE: crates/db/src/models/session.rs
type SessionError (line 11) | pub enum SessionError {
type Session (line 23) | pub struct Session {
method find_by_id (line 40) | pub async fn find_by_id(pool: &SqlitePool, id: Uuid) -> Result<Option<...
method find_by_workspace_id (line 61) | pub async fn find_by_workspace_id(
method find_latest_by_workspace_id (line 92) | pub async fn find_latest_by_workspace_id(
method find_first_by_workspace_id (line 123) | pub async fn find_first_by_workspace_id(
method create (line 145) | pub async fn create(
method resolve_agent_working_dir (line 175) | async fn resolve_agent_working_dir(
method update (line 193) | pub async fn update(
method update_executor (line 215) | pub async fn update_executor(
type CreateSession (line 34) | pub struct CreateSession {
FILE: crates/db/src/models/tag.rs
type Tag (line 8) | pub struct Tag {
method find_all (line 29) | pub async fn find_all(pool: &SqlitePool) -> Result<Vec<Self>, sqlx::Er...
method find_by_id (line 40) | pub async fn find_by_id(pool: &SqlitePool, id: Uuid) -> Result<Option<...
method create (line 52) | pub async fn create(pool: &SqlitePool, data: &CreateTag) -> Result<Sel...
method update (line 67) | pub async fn update(
method delete (line 93) | pub async fn delete(pool: &SqlitePool, id: Uuid) -> Result<u64, sqlx::...
type CreateTag (line 17) | pub struct CreateTag {
type UpdateTag (line 23) | pub struct UpdateTag {
FILE: crates/db/src/models/task.rs
type TaskStatus (line 14) | pub enum TaskStatus {
type Task (line 24) | pub struct Task {
method find_all (line 36) | pub async fn find_all(pool: &SqlitePool) -> Result<Vec<Self>, sqlx::Er...
method find_by_id (line 47) | pub async fn find_by_id(pool: &SqlitePool, id: Uuid) -> Result<Option<...
FILE: crates/db/src/models/workspace.rs
constant WORKSPACE_NAME_MAX_LEN (line 10) | const WORKSPACE_NAME_MAX_LEN: usize = 60;
type WorkspaceError (line 19) | pub enum WorkspaceError {
type ContainerInfo (line 31) | pub struct ContainerInfo {
type WorkspaceContainerRefRow (line 36) | struct WorkspaceContainerRefRow {
type Workspace (line 42) | pub struct Workspace {
method fetch_all (line 99) | pub async fn fetch_all(pool: &SqlitePool) -> Result<Vec<Self>, Workspa...
method load_context (line 124) | pub async fn load_context(
method update_container_ref (line 146) | pub async fn update_container_ref(
method mark_worktree_deleted (line 163) | pub async fn mark_worktree_deleted(
method clear_worktree_deleted (line 176) | pub async fn clear_worktree_deleted(
method touch (line 191) | pub async fn touch(pool: &SqlitePool, workspace_id: Uuid) -> Result<()...
method find_by_id (line 201) | pub async fn find_by_id(pool: &SqlitePool, id: Uuid) -> Result<Option<...
method find_by_rowid (line 223) | pub async fn find_by_rowid(pool: &SqlitePool, rowid: i64) -> Result<Op...
method container_ref_exists (line 245) | pub async fn container_ref_exists(
method find_expired_for_cleanup (line 262) | pub async fn find_expired_for_cleanup(
method create (line 318) | pub async fn create(
method update_branch_name (line 339) | pub async fn update_branch_name(
method resolve_container_ref (line 355) | pub async fn resolve_container_ref(
method resolve_container_ref_by_prefix (line 376) | pub async fn resolve_container_ref_by_prefix(
method best_matching_container_ref (line 400) | fn best_matching_container_ref<'a>(
method set_archived (line 417) | pub async fn set_archived(
method update (line 434) | pub async fn update(
method get_first_user_message (line 463) | pub async fn get_first_user_message(
method extract_first_prompt_from_executor_action (line 489) | fn extract_first_prompt_from_executor_action(action: &ExecutorAction) ...
method truncate_to_name (line 510) | pub fn truncate_to_name(prompt: &str, max_len: usize) -> String {
method find_all_with_status (line 524) | pub async fn find_all_with_status(
method delete (line 612) | pub async fn delete(pool: &SqlitePool, id: Uuid) -> Result<u64, sqlx::...
method count_all (line 620) | pub async fn count_all(pool: &SqlitePool) -> Result<i64, WorkspaceErro...
method find_by_id_with_status (line 627) | pub async fn find_by_id_with_status(
type WorkspaceWithStatus (line 57) | pub struct WorkspaceWithStatus {
type Target (line 66) | type Target = Workspace;
method deref (line 67) | fn deref(&self) -> &Self::Target {
type CreateFollowUpAttempt (line 73) | pub struct CreateFollowUpAttempt {
type AttemptResumeContext (line 79) | pub struct AttemptResumeContext {
type WorkspaceContext (line 85) | pub struct WorkspaceContext {
type CreateWorkspace (line 92) | pub struct CreateWorkspace {
function best_matching_container_ref_prefers_deepest_match (line 713) | fn best_matching_container_ref_prefers_deepest_match() {
function best_matching_container_ref_supports_parent_request_path (line 725) | fn best_matching_container_ref_supports_parent_request_path() {
function best_matching_container_ref_ignores_unrelated_paths (line 736) | fn best_matching_container_ref_ignores_unrelated_paths() {
FILE: crates/db/src/models/workspace_repo.rs
type WorkspaceRepo (line 12) | pub struct WorkspaceRepo {
method create_many (line 46) | pub async fn create_many(
method find_by_workspace_id (line 87) | pub async fn find_by_workspace_id(
method find_repos_for_workspace (line 107) | pub async fn find_repos_for_workspace(
method find_repos_with_target_branch_for_workspace (line 137) | pub async fn find_repos_with_target_branch_for_workspace(
method find_by_workspace_and_repo_id (line 190) | pub async fn find_by_workspace_and_repo_id(
method update_target_branch (line 212) | pub async fn update_target_branch(
method update_target_branch_for_children_of_workspace (line 229) | pub async fn update_target_branch_for_children_of_workspace(
method find_unique_repos_for_task (line 253) | pub async fn find_unique_repos_for_task(
method find_repos_with_copy_files (line 285) | pub async fn find_repos_with_copy_files(
type CreateWorkspaceRepo (line 24) | pub struct CreateWorkspaceRepo {
type RepoWithTargetBranch (line 30) | pub struct RepoWithTargetBranch {
type RepoWithCopyFiles (line 38) | pub struct RepoWithCopyFiles {
FILE: crates/deployment/src/lib.rs
type RemoteClientNotConfigured (line 38) | pub struct RemoteClientNotConfigured;
type DeploymentError (line 41) | pub enum DeploymentError {
type Deployment (line 75) | pub trait Deployment: Clone + Send + Sync + 'static {
method new (line 76) | async fn new() -> Result<Self, DeploymentError>;
method user_id (line 78) | fn user_id(&self) -> &str;
method config (line 80) | fn config(&self) -> &Arc<RwLock<Config>>;
method db (line 82) | fn db(&self) -> &DBService;
method analytics (line 84) | fn analytics(&self) -> &Option<AnalyticsService>;
method container (line 86) | fn container(&self) -> &impl ContainerService;
method git (line 88) | fn git(&self) -> &GitService;
method repo (line 90) | fn repo(&self) -> &RepoService;
method file (line 92) | fn file(&self) -> &FileService;
method filesystem (line 94) | fn filesystem(&self) -> &FilesystemService;
method events (line 96) | fn events(&self) -> &EventService;
method file_search_cache (line 98) | fn file_search_cache(&self) -> &Arc<FileSearchCache>;
method approvals (line 100) | fn approvals(&self) -> &Approvals;
method queued_message_service (line 102) | fn queued_message_service(&self) -> &QueuedMessageService;
method auth_context (line 104) | fn auth_context(&self) -> &AuthContext;
method relay_control (line 106) | fn relay_control(&self) -> &Arc<RelayControl>;
method relay_signing (line 108) | fn relay_signing(&self) -> &RelaySigningService;
method server_info (line 110) | fn server_info(&self) -> &Arc<ServerInfo>;
method trusted_key_auth (line 112) | fn trusted_key_auth(&self) -> &TrustedKeyAuthRuntime;
method remote_client (line 114) | fn remote_client(&self) -> Result<RemoteClient, RemoteClientNotConfigu...
method shared_api_base (line 118) | fn shared_api_base(&self) -> Option<String> {
method update_sentry_scope (line 122) | async fn update_sentry_scope(&self) -> Result<(), DeploymentError> {
method track_if_analytics_allowed (line 132) | async fn track_if_analytics_allowed(&self, event_name: &str, propertie...
method stream_events (line 140) | async fn stream_events(
FILE: crates/executors/src/actions/coding_agent_follow_up.rs
type CodingAgentFollowUpRequest (line 18) | pub struct CodingAgentFollowUpRequest {
method effective_dir (line 33) | pub fn effective_dir(&self, current_dir: &Path) -> std::path::PathBuf {
method base_executor (line 40) | pub fn base_executor(&self) -> BaseCodingAgent {
method spawn (line 48) | async fn spawn(
FILE: crates/executors/src/actions/coding_agent_initial.rs
type CodingAgentInitialRequest (line 18) | pub struct CodingAgentInitialRequest {
method base_executor (line 30) | pub fn base_executor(&self) -> BaseCodingAgent {
method effective_dir (line 34) | pub fn effective_dir(&self, current_dir: &Path) -> std::path::PathBuf {
method spawn (line 45) | async fn spawn(
FILE: crates/executors/src/actions/mod.rs
type ExecutorActionType (line 28) | pub enum ExecutorActionType {
type ExecutorAction (line 36) | pub struct ExecutorAction {
method new (line 42) | pub fn new(typ: ExecutorActionType, next_action: Option<Box<ExecutorAc...
method append_action (line 45) | pub fn append_action(mut self, action: ExecutorAction) -> Self {
method typ (line 54) | pub fn typ(&self) -> &ExecutorActionType {
method next_action (line 58) | pub fn next_action(&self) -> Option<&ExecutorAction> {
method base_executor (line 62) | pub fn base_executor(&self) -> Option<BaseCodingAgent> {
type Executable (line 76) | pub trait Executable {
method spawn (line 77) | async fn spawn(
method spawn (line 87) | async fn spawn(
FILE: crates/executors/src/actions/review.rs
type RepoReviewContext (line 17) | pub struct RepoReviewContext {
type ReviewRequest (line 24) | pub struct ReviewRequest {
method base_executor (line 39) | pub fn base_executor(&self) -> BaseCodingAgent {
method effective_dir (line 43) | pub fn effective_dir(&self, current_dir: &Path) -> std::path::PathBuf {
method spawn (line 53) | async fn spawn(
FILE: crates/executors/src/actions/script.rs
type ScriptRequestLanguage (line 17) | pub enum ScriptRequestLanguage {
type ScriptContext (line 22) | pub enum ScriptContext {
type ScriptRequest (line 31) | pub struct ScriptRequest {
method spawn (line 43) | async fn spawn(
FILE: crates/executors/src/approvals.rs
type ExecutorApprovalError (line 11) | pub enum ExecutorApprovalError {
method request_failed (line 23) | pub fn request_failed<E: fmt::Display>(err: E) -> Self {
type ExecutorApprovalService (line 30) | pub trait ExecutorApprovalService: Send + Sync {
method create_tool_approval (line 32) | async fn create_tool_approval(&self, tool_name: &str) -> Result<String...
method create_question_approval (line 35) | async fn create_question_approval(
method wait_tool_approval (line 42) | async fn wait_tool_approval(
method wait_question_answer (line 49) | async fn wait_question_answer(
method create_tool_approval (line 61) | async fn create_tool_approval(
method create_question_approval (line 68) | async fn create_question_approval(
method wait_tool_approval (line 76) | async fn wait_tool_approval(
method wait_question_answer (line 84) | async fn wait_question_answer(
type NoopExecutorApprovalService (line 57) | pub struct NoopExecutorApprovalService;
type ToolCallMetadata (line 94) | pub struct ToolCallMetadata {
FILE: crates/executors/src/command.rs
type CommandBuildError (line 12) | pub enum CommandBuildError {
type CommandParts (line 24) | pub struct CommandParts {
method new (line 30) | pub fn new(program: String, args: Vec<String>) -> Self {
method into_resolved (line 34) | pub async fn into_resolved(self) -> Result<(PathBuf, Vec<String>), Exe...
type CmdOverrides (line 44) | pub struct CmdOverrides {
type CommandBuilder (line 66) | pub struct CommandBuilder {
method new (line 74) | pub fn new<S: Into<String>>(base: S) -> Self {
method params (line 81) | pub fn params<I>(mut self, params: I) -> Self
method override_base (line 90) | pub fn override_base<S: Into<String>>(mut self, base: S) -> Self {
method extend_shell_params (line 95) | fn extend_shell_params<I>(mut self, more: I) -> Result<Self, CommandBu...
method extend_params (line 120) | pub fn extend_params<I>(mut self, more: I) -> Self
method build_initial (line 133) | pub fn build_initial(&self) -> Result<CommandParts, CommandBuildError> {
method build_follow_up (line 137) | pub fn build_follow_up(
method build (line 144) | fn build(&self, additional_args: &[String]) -> Result<CommandParts, Co...
function split_command_line (line 162) | fn split_command_line(input: &str) -> Result<Vec<String>, CommandBuildEr...
function apply_overrides (line 179) | pub fn apply_overrides(
FILE: crates/executors/src/env.rs
type RepoContext (line 10) | pub struct RepoContext {
method new (line 17) | pub fn new(workspace_root: PathBuf, repo_names: Vec<String>) -> Self {
method repo_paths (line 24) | pub fn repo_paths(&self) -> Vec<PathBuf> {
method check_uncommitted_changes (line 34) | pub async fn check_uncommitted_changes(&self) -> String {
type ExecutionEnv (line 79) | pub struct ExecutionEnv {
method new (line 87) | pub fn new(
method insert (line 101) | pub fn insert(&mut self, key: impl Into<String>, value: impl Into<Stri...
method merge (line 106) | pub fn merge(&mut self, other: &HashMap<String, String>) {
method with_overrides (line 112) | pub fn with_overrides(mut self, overrides: &HashMap<String, String>) -...
method with_profile (line 118) | pub fn with_profile(self, cmd: &CmdOverrides) -> Self {
method apply_to_command (line 127) | pub fn apply_to_command(&self, command: &mut Command) {
method contains_key (line 133) | pub fn contains_key(&self, key: &str) -> bool {
method get (line 137) | pub fn get(&self, key: &str) -> Option<&String> {
function profile_overrides_runtime_env (line 147) | fn profile_overrides_runtime_env() {
FILE: crates/executors/src/executor_discovery.rs
type ExecutorDiscoveredOptions (line 12) | pub struct ExecutorDiscoveredOptions {
method with_loading (line 22) | pub fn with_loading(mut self, loading: bool) -> Self {
type ExecutorConfigCacheKey (line 31) | pub struct ExecutorConfigCacheKey {
method new (line 38) | pub fn new(path: Option<&PathBuf>, cmd_key: String, base_executor: Bas...
FILE: crates/executors/src/executors/acp/client.rs
type AcpClient (line 17) | pub struct AcpClient {
method new (line 26) | pub fn new(
method record_user_prompt_event (line 39) | pub fn record_user_prompt_event(&self, prompt: &str) {
method send_event (line 44) | fn send_event(&self, event: AcpEvent) {
method enqueue_feedback (line 51) | pub async fn enqueue_feedback(&self, message: String) {
method drain_feedback (line 60) | pub async fn drain_feedback(&self) -> Vec<String> {
method request_permission (line 68) | async fn request_permission(
method session_notification (line 179) | async fn session_notification(&self, args: acp::SessionNotification) -...
method write_text_file (line 198) | async fn write_text_file(
method read_text_file (line 205) | async fn read_text_file(
method create_terminal (line 213) | async fn create_terminal(
method terminal_output (line 220) | async fn terminal_output(
method release_terminal (line 227) | async fn release_terminal(
method wait_for_terminal_exit (line 234) | async fn wait_for_terminal_exit(
method kill_terminal_command (line 241) | async fn kill_terminal_command(
method ext_method (line 249) | async fn ext_method(&self, _args: acp::ExtRequest) -> Result<acp::ExtR...
method ext_notification (line 253) | async fn ext_notification(&self, _args: acp::ExtNotification) -> Resul...
method handle_approval_error (line 259) | fn handle_approval_error(
FILE: crates/executors/src/executors/acp/harness.rs
type AcpAgentHarness (line 32) | pub struct AcpAgentHarness {
method new (line 47) | pub fn new() -> Self {
method with_session_namespace (line 56) | pub fn with_session_namespace(namespace: impl Into<String>) -> Self {
method with_model (line 64) | pub fn with_model(mut self, model: impl Into<String>) -> Self {
method with_mode (line 69) | pub fn with_mode(mut self, mode: impl Into<String>) -> Self {
method apply_overrides (line 74) | pub fn apply_overrides(&mut self, executor_config: &crate::profile::Ex...
method spawn_with_command (line 84) | pub async fn spawn_with_command(
method spawn_follow_up_with_command (line 136) | pub async fn spawn_follow_up_with_command(
method bootstrap_acp_connection (line 189) | async fn bootstrap_acp_connection(
method default (line 39) | fn default() -> Self {
FILE: crates/executors/src/executors/acp/mod.rs
type AcpEvent (line 17) | pub enum AcpEvent {
method fmt (line 39) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
type Err (line 45) | type Err = serde_json::Error;
method from_str (line 47) | fn from_str(s: &str) -> Result<Self, Self::Err> {
type ApprovalResponse (line 53) | pub struct ApprovalResponse {
FILE: crates/executors/src/executors/acp/normalize_logs.rs
function normalize_logs (line 27) | pub fn normalize_logs(
function normalize_logs_with_suppressed_stderr_patterns (line 34) | pub fn normalize_logs_with_suppressed_stderr_patterns(
function normalize_acp_stderr_logs (line 682) | fn normalize_acp_stderr_logs(
type PartialToolCallData (line 718) | struct PartialToolCallData {
method extend (line 731) | fn extend(&mut self, tc: &agent_client_protocol::ToolCall, worktree_pa...
method default (line 763) | fn default() -> Self {
type AcpEventParser (line 778) | struct AcpEventParser;
method parse_line (line 782) | pub fn parse_line(line: &str) -> Option<AcpEvent> {
method parse_execute_command (line 795) | pub fn parse_execute_command(tc: &PartialToolCallData) -> String {
type ParsedLine (line 817) | pub enum ParsedLine {
type Error (line 825) | type Error = ();
method try_from (line 827) | fn try_from(notification: SessionNotification) -> Result<Self, ()> {
type SearchArgs (line 847) | struct SearchArgs {
type FetchArgs (line 852) | struct FetchArgs {
type StreamingState (line 857) | struct StreamingState {
type StreamingText (line 863) | struct StreamingText {
type EditInput (line 870) | struct EditInput {
FILE: crates/executors/src/executors/acp/session.rs
type SessionManager (line 13) | pub struct SessionManager {
method new (line 19) | pub fn new(namespace: impl Into<String>) -> Result<Self> {
method session_file_path (line 37) | fn session_file_path(&self, session_id: &str) -> PathBuf {
method append_raw_line (line 49) | pub fn append_raw_line(&self, session_id: &str, raw_json: &str) -> Res...
method normalize_session_event (line 70) | fn normalize_session_event(raw_json: &str) -> Option<String> {
method read_session_raw (line 115) | pub fn read_session_raw(&self, session_id: &str) -> Result<String> {
method fork_session (line 125) | pub fn fork_session(&self, old_id: &str, new_id: &str) -> Result<()> {
method delete_session (line 144) | pub fn delete_session(&self, session_id: &str) -> Result<()> {
method generate_resume_prompt (line 153) | pub fn generate_resume_prompt(&self, session_id: &str, current_prompt:...
type SessionMetadata (line 176) | pub struct SessionMetadata {
FILE: crates/executors/src/executors/amp.rs
type Amp (line 22) | pub struct Amp {
method build_command_builder (line 36) | fn build_command_builder(&self) -> Result<CommandBuilder, CommandBuild...
method spawn (line 48) | async fn spawn(
method spawn_follow_up (line 84) | async fn spawn_follow_up(
method normalize_logs (line 127) | fn normalize_logs(
method default_mcp_config_path (line 149) | fn default_mcp_config_path(&self) -> Option<std::path::PathBuf> {
method get_preset_options (line 153) | fn get_preset_options(&self) -> ExecutorConfig {
FILE: crates/executors/src/executors/claude.rs
constant SUPPRESSED_STDERR_PATTERNS (line 59) | const SUPPRESSED_STDERR_PATTERNS: &[&str] = &["[WARN] Fast mode requires...
function base_command (line 61) | fn base_command(claude_code_router: bool) -> &'static str {
function normalize_claude_stderr_logs (line 69) | fn normalize_claude_stderr_logs(
type ClaudeEffort (line 110) | pub enum ClaudeEffort {
type ClaudeCode (line 119) | pub struct ClaudeCode {
method build_command_builder (line 148) | async fn build_command_builder(&self) -> Result<CommandBuilder, Comman...
method permission_mode (line 198) | pub fn permission_mode(&self) -> PermissionMode {
method get_hooks (line 208) | pub fn get_hooks(&self, commit_reminder: bool) -> Option<serde_json::V...
method compute_cmd_key (line 260) | fn compute_cmd_key(&self) -> String {
method spawn_internal (line 614) | async fn spawn_internal(
function default_discovered_options (line 265) | fn default_discovered_options() -> crate::executor_discovery::ExecutorDi...
method apply_overrides (line 315) | fn apply_overrides(&mut self, executor_config: &ExecutorConfig) {
method use_approvals (line 343) | fn use_approvals(&mut self, approvals: Arc<dyn ExecutorApprovalService>) {
method spawn (line 347) | async fn spawn(
method spawn_follow_up (line 359) | async fn spawn_follow_up(
method normalize_logs (line 383) | fn normalize_logs(
method discover_options (line 404) | async fn discover_options(
method get_preset_options (line 566) | fn get_preset_options(&self) -> ExecutorConfig {
method default_mcp_config_path (line 591) | fn default_mcp_config_path(&self) -> Option<std::path::PathBuf> {
method get_availability_info (line 595) | fn get_availability_info(&self) -> AvailabilityInfo {
type HistoryStrategy (line 709) | pub enum HistoryStrategy {
constant DEFAULT_CLAUDE_CONTEXT_WINDOW (line 717) | const DEFAULT_CLAUDE_CONTEXT_WINDOW: u32 = 200_000;
type ClaudeLogProcessor (line 720) | pub struct ClaudeLogProcessor {
method new (line 737) | fn new() -> Self {
method new_with_strategy (line 741) | fn new_with_strategy(strategy: HistoryStrategy) -> Self {
method process_logs (line 756) | pub fn process_logs(
method extract_session_id (line 885) | fn extract_session_id(claude_json: &ClaudeJson) -> Option<String> {
method warn_if_unmanaged_key (line 906) | fn warn_if_unmanaged_key(src: &Option<String>) -> Option<NormalizedEnt...
method normalize_claude_tool_result_value (line 929) | fn normalize_claude_tool_result_value(
method build_tool_use_entry (line 962) | fn build_tool_use_entry(
method tool_use_entry (line 974) | fn tool_use_entry(
method replace_tool_entry_status (line 992) | fn replace_tool_entry_status(
method content_item_to_normalized_entry (line 1012) | fn content_item_to_normalized_entry(
method extract_action_type (line 1055) | fn extract_action_type(tool_data: &ClaudeToolData, worktree_path: &str...
method normalize_entries (line 1225) | fn normalize_entries(
method generate_concise_content (line 1953) | fn generate_concise_content(
method add_token_usage_entry (line 2052) | fn add_token_usage_entry(
function add_system_message (line 2073) | fn add_system_message(
function extract_model_name (line 2087) | fn extract_model_name(
type StreamingMessageState (line 2109) | struct StreamingMessageState {
method new (line 2115) | fn new(role: String) -> Self {
method content_block_start (line 2122) | fn content_block_start(&mut self, index: usize, content_block: ClaudeC...
method apply_content_block_delta (line 2128) | fn apply_content_block_delta(
method content_entry_index (line 2161) | fn content_entry_index(&self, content_index: usize) -> Option<usize> {
type StreamingContentKind (line 2169) | enum StreamingContentKind {
type StreamingContentState (line 2174) | struct StreamingContentState {
method from_content_block (line 2181) | fn from_content_block(content_block: ClaudeContentItem) -> Option<Self> {
method from_delta (line 2197) | fn from_delta(delta: &ClaudeContentBlockDelta) -> Option<Self> {
method apply_content_delta (line 2213) | fn apply_content_delta(&mut self, delta: &ClaudeContentBlockDelta) {
method to_content_item (line 2237) | fn to_content_item(&self) -> ClaudeContentItem {
type ClaudeJson (line 2252) | pub enum ClaudeJson {
type ClaudePlugin (line 2380) | pub struct ClaudePlugin {
type ClaudeMessage (line 2386) | pub struct ClaudeMessage {
type ClaudeMessageContent (line 2398) | pub enum ClaudeMessageContent {
method items (line 2404) | fn items(&self) -> impl Iterator<Item = &ClaudeContentItem> {
method as_text (line 2411) | fn as_text(&self) -> Option<&String> {
type ClaudeContentItem (line 2421) | pub enum ClaudeContentItem {
type ClaudeStreamEvent (line 2442) | pub enum ClaudeStreamEvent {
type ClaudeContentBlockDelta (line 2472) | pub enum ClaudeContentBlockDelta {
type ClaudeMessageDelta (line 2487) | pub struct ClaudeMessageDelta {
type ClaudeUsage (line 2495) | pub struct ClaudeUsage {
type ClaudeModelUsage (line 2511) | pub struct ClaudeModelUsage {
type ClaudeToolData (line 2519) | pub enum ClaudeToolData {
method get_name (line 2718) | pub fn get_name(&self) -> &str {
type ClaudeToolResultTextItem (line 2655) | struct ClaudeToolResultTextItem {
type ClaudeToolWithInput (line 2660) | struct ClaudeToolWithInput {
type AmpBashResult (line 2669) | struct AmpBashResult {
type ClaudeToolCallInfo (line 2677) | struct ClaudeToolCallInfo {
type AskUserQuestionInputItem (line 2686) | pub struct AskUserQuestionInputItem {
type AskUserQuestionInputOption (line 2696) | pub struct AskUserQuestionInputOption {
type ClaudeTodoItem (line 2702) | pub struct ClaudeTodoItem {
type ClaudeEditItem (line 2712) | pub struct ClaudeEditItem {
function patches_to_entries (line 2753) | fn patches_to_entries(patches: &[json_patch::Patch]) -> Vec<NormalizedEn...
function normalize_helper (line 2760) | fn normalize_helper(
function normalize (line 2770) | fn normalize(json: &ClaudeJson, worktree: &str) -> Vec<NormalizedEntry> {
function test_claude_json_parsing (line 2776) | fn test_claude_json_parsing() {
function test_assistant_message_parsing (line 2804) | fn test_assistant_message_parsing() {
function test_result_message_emits_final_text_if_not_seen (line 2818) | fn test_result_message_emits_final_text_if_not_seen() {
function test_thinking_content (line 2832) | fn test_thinking_content() {
function test_todo_tool_empty_list (line 2846) | fn test_todo_tool_empty_list() {
function test_glob_tool_content_extraction (line 2862) | fn test_glob_tool_content_extraction() {
function test_glob_tool_pattern_only (line 2881) | fn test_glob_tool_pattern_only() {
function test_ls_tool_content_extraction (line 2900) | fn test_ls_tool_content_extraction() {
function test_path_relative_conversion (line 2917) | fn test_path_relative_conversion() {
function test_streaming_patch_generation (line 2930) | async fn test_streaming_patch_generation() {
function test_session_id_extraction (line 2981) | fn test_session_id_extraction() {
function test_amp_tool_aliases_create_file_and_edit_file (line 2998) | fn test_amp_tool_aliases_create_file_and_edit_file() {
function test_amp_tool_aliases_oracle_mermaid_codebase_undo (line 3043) | fn test_amp_tool_aliases_oracle_mermaid_codebase_undo() {
function test_amp_bash_and_task_content (line 3106) | fn test_amp_bash_and_task_content() {
function test_task_description_or_prompt_backticks (line 3140) | fn test_task_description_or_prompt_backticks() {
function test_tool_result_parsing_ignored (line 3180) | fn test_tool_result_parsing_ignored() {
function test_content_item_tool_result_ignored (line 3196) | fn test_content_item_tool_result_ignored() {
function test_api_key_source_warning (line 3206) | fn test_api_key_source_warning() {
function test_mixed_content_with_thinking_ignores_tool_result (line 3247) | fn test_mixed_content_with_thinking_ignores_tool_result() {
function test_control_request_with_permission_suggestions (line 3273) | fn test_control_request_with_permission_suggestions() {
FILE: crates/executors/src/executors/claude/client.rs
constant EXIT_PLAN_MODE_NAME (line 23) | const EXIT_PLAN_MODE_NAME: &str = "ExitPlanMode";
constant ASK_USER_QUESTION_NAME (line 24) | const ASK_USER_QUESTION_NAME: &str = "AskUserQuestion";
constant AUTO_APPROVE_CALLBACK_ID (line 25) | pub const AUTO_APPROVE_CALLBACK_ID: &str = "AUTO_APPROVE_CALLBACK_ID";
constant STOP_GIT_CHECK_CALLBACK_ID (line 26) | pub const STOP_GIT_CHECK_CALLBACK_ID: &str = "STOP_GIT_CHECK_CALLBACK_ID";
constant TOOL_DENY_PREFIX (line 28) | const TOOL_DENY_PREFIX: &str = "The user doesn't want to proceed with th...
type ClaudeAgentClient (line 31) | pub struct ClaudeAgentClient {
method new (line 42) | pub fn new(
method handle_approval (line 60) | async fn handle_approval(
method handle_question (line 145) | async fn handle_question(
method handle_approval_error (line 233) | async fn handle_approval_error(
method handle_question_error (line 259) | async fn handle_question_error(
method on_can_use_tool (line 279) | pub async fn on_can_use_tool(
method on_hook_callback (line 323) | pub async fn on_hook_callback(
method log_message (line 382) | pub async fn log_message(&self, line: &str) -> Result<(), ExecutorErro...
FILE: crates/executors/src/executors/claude/protocol.rs
type ProtocolPeer (line 24) | pub struct ProtocolPeer {
method spawn (line 29) | pub fn spawn(
method read_loop (line 49) | async fn read_loop(
method handle_control_request (line 107) | async fn handle_control_request(
method send_hook_response (line 168) | pub async fn send_hook_response(
method send_error (line 181) | async fn send_error(&self, request_id: String, error: String) -> Resul...
method send_json (line 189) | async fn send_json<T: serde::Serialize>(&self, message: &T) -> Result<...
method send_user_message (line 198) | pub async fn send_user_message(&self, content: String) -> Result<(), E...
method initialize (line 203) | pub async fn initialize(&self, hooks: Option<serde_json::Value>) -> Re...
method interrupt (line 209) | pub async fn interrupt(&self) -> Result<(), ExecutorError> {
method set_permission_mode (line 214) | pub async fn set_permission_mode(&self, mode: PermissionMode) -> Resul...
FILE: crates/executors/src/executors/claude/slash_commands.rs
constant SLASH_COMMANDS_DISCOVERY_TIMEOUT (line 25) | const SLASH_COMMANDS_DISCOVERY_TIMEOUT: Duration = Duration::from_secs(1...
method extract_description (line 28) | fn extract_description(content: &str) -> Option<String> {
method make_key (line 46) | fn make_key(prefix: &Option<String>, name: &str) -> String {
method try_read_description (line 53) | async fn try_read_description(path: &Path) -> Option<String> {
method scan_dir (line 66) | async fn scan_dir(
method scan_base_path (line 84) | async fn scan_base_path(base_path: &Path, prefix: Option<String>) -> Has...
method discover_custom_command_descriptions (line 116) | pub async fn discover_custom_command_descriptions(
method hardcoded_slash_commands (line 142) | pub(super) fn hardcoded_slash_commands() -> Vec<SlashCommandDescription> {
method build_slash_commands_discovery_command_builder (line 194) | async fn build_slash_commands_discovery_command_builder(
method discover_available_command_and_plugins (line 213) | async fn discover_available_command_and_plugins(
method discover_available_slash_commands (line 284) | pub async fn discover_available_slash_commands(
method discover_available_agents (line 316) | pub async fn discover_available_agents(
method discover_agents_and_slash_commands_initial (line 327) | pub async fn discover_agents_and_slash_commands_initial(
method fill_slash_command_descriptions (line 362) | pub async fn fill_slash_command_descriptions(
method map_discovered_agents (line 381) | fn map_discovered_agents(agents: Vec<String>) -> Vec<AgentInfo> {
method format_agent_label (line 403) | fn format_agent_label(raw: &str) -> String {
FILE: crates/executors/src/executors/claude/types.rs
type CLIMessage (line 11) | pub enum CLIMessage {
type SDKControlRequest (line 29) | pub struct SDKControlRequest {
method new (line 37) | pub fn new(request: SDKControlRequestType) -> Self {
type ControlResponseMessage (line 49) | pub struct ControlResponseMessage {
method new (line 56) | pub fn new(response: ControlResponseType) -> Self {
type ControlRequestType (line 67) | pub enum ControlRequestType {
type PermissionResult (line 90) | pub enum PermissionResult {
type PermissionUpdateType (line 106) | pub enum PermissionUpdateType {
type PermissionUpdateDestination (line 117) | pub enum PermissionUpdateDestination {
type PermissionRuleValue (line 128) | pub struct PermissionRuleValue {
type PermissionUpdate (line 137) | pub struct PermissionUpdate {
type ControlResponseType (line 155) | pub enum ControlResponseType {
type Message (line 170) | pub enum Message {
method new_user (line 181) | pub fn new_user(content: String) -> Self {
type ClaudeUserMessage (line 175) | pub struct ClaudeUserMessage {
type SDKControlRequestType (line 193) | pub enum SDKControlRequestType {
type PermissionMode (line 206) | pub enum PermissionMode {
method as_str (line 214) | pub fn as_str(&self) -> &'static str {
method fmt (line 225) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
FILE: crates/executors/src/executors/codex.rs
function codex_home (line 18) | pub fn codex_home() -> Option<PathBuf> {
function resolve_model (line 27) | pub(crate) fn resolve_model(model: Option<&str>) -> (Option<&str>, bool) {
function fork_params_from (line 34) | pub(crate) fn fork_params_from(thread_id: String, params: ThreadStartPar...
type SandboxMode (line 89) | pub enum SandboxMode {
type AskForApproval (line 108) | pub enum AskForApproval {
type ReasoningEffort (line 119) | pub enum ReasoningEffort {
type ReasoningSummary (line 130) | pub enum ReasoningSummary {
type ReasoningSummaryFormat (line 141) | pub enum ReasoningSummaryFormat {
type CodexSessionAction (line 146) | enum CodexSessionAction {
type Codex (line 153) | pub struct Codex {
method base_command (line 431) | pub fn base_command() -> &'static str {
method build_command_builder (line 435) | fn build_command_builder(&self) -> Result<CommandBuilder, CommandBuild...
method build_thread_start_params (line 445) | fn build_thread_start_params(&self, cwd: &Path) -> ThreadStartParams {
method build_config_overrides (line 515) | fn build_config_overrides(&self) -> Option<HashMap<String, Value>> {
method spawn_inner (line 548) | async fn spawn_inner(
method launch_codex_agent (line 577) | async fn launch_codex_agent(
method spawn_app_server (line 624) | async fn spawn_app_server<F, Fut>(
method apply_overrides (line 195) | fn apply_overrides(&mut self, executor_config: &ExecutorConfig) {
method use_approvals (line 223) | fn use_approvals(&mut self, approvals: Arc<dyn ExecutorApprovalService>) {
method spawn (line 227) | async fn spawn(
method spawn_follow_up (line 237) | async fn spawn_follow_up(
method normalize_logs (line 249) | fn normalize_logs(
method default_mcp_config_path (line 257) | fn default_mcp_config_path(&self) -> Option<PathBuf> {
method get_availability_info (line 261) | fn get_availability_info(&self) -> AvailabilityInfo {
method get_preset_options (line 289) | fn get_preset_options(&self) -> ExecutorConfig {
method discover_options (line 312) | async fn discover_options(
method spawn_review (line 411) | async fn spawn_review(
FILE: crates/executors/src/executors/codex/client.rs
type PendingPlan (line 43) | struct PendingPlan {
type AppServerClient (line 47) | pub struct AppServerClient {
method new (line 66) | pub fn new(
method connect (line 94) | pub fn connect(&self, peer: JsonRpcPeer) {
method set_resolved_model (line 98) | pub fn set_resolved_model(&self, model: String) {
method rpc (line 102) | fn rpc(&self) -> &JsonRpcPeer {
method log_writer (line 106) | pub fn log_writer(&self) -> &LogWriter {
method initialize (line 110) | pub async fn initialize(&self) -> Result<(), ExecutorError> {
method thread_start (line 131) | pub async fn thread_start(
method thread_fork (line 142) | pub async fn thread_fork(
method turn_start (line 153) | pub async fn turn_start(
method turn_start_with_mode (line 161) | pub async fn turn_start_with_mode(
method collaboration_mode (line 179) | fn collaboration_mode(&self, mode: ModeKind) -> Result<CollaborationMo...
method initial_collaboration_mode (line 196) | pub fn initial_collaboration_mode(&self) -> Result<CollaborationMode, ...
method get_account (line 204) | pub async fn get_account(&self) -> Result<GetAccountResponse, Executor...
method start_review (line 214) | pub async fn start_review(
method list_mcp_server_status (line 230) | pub async fn list_mcp_server_status(
method thread_compact_start (line 244) | pub async fn thread_compact_start(
method thread_read (line 255) | pub async fn thread_read(
method config_batch_write (line 269) | pub async fn config_batch_write(
method config_read (line 285) | pub async fn config_read(
method get_account_rate_limits (line 299) | pub async fn get_account_rate_limits(
method handle_server_request (line 309) | async fn handle_server_request(
method request_tool_approval (line 445) | async fn request_tool_approval(
method handle_approval_error (line 491) | async fn handle_approval_error(&self, display_tool_name: &str, tool_ca...
method request_question_answer (line 505) | async fn request_question_answer(
method handle_question_error (line 545) | async fn handle_question_error(&self, tool_call_id: &str) {
method handle_plan_completed (line 555) | async fn handle_plan_completed(&self, plan: PendingPlan) -> Result<boo...
method register_session (line 637) | pub async fn register_session(&self, thread_id: &str) -> Result<(), Ex...
method send_message (line 646) | async fn send_message<M>(&self, message: &M) -> Result<(), ExecutorError>
method send_request (line 653) | async fn send_request<R>(&self, request: ClientRequest, label: &str) -...
method next_request_id (line 663) | fn next_request_id(&self) -> RequestId {
method command_execution_decision (line 667) | fn command_execution_decision(
method file_change_decision (line 694) | fn file_change_decision(
method enqueue_feedback (line 721) | async fn enqueue_feedback(&self, message: String) {
method flush_pending_feedback (line 731) | async fn flush_pending_feedback(&self) -> bool {
method spawn_turn_start (line 761) | fn spawn_turn_start(
method spawn_user_message (line 796) | fn spawn_user_message(&self, thread_id: String, message: String) {
method on_request (line 803) | async fn on_request(
method on_response (line 823) | async fn on_response(
method on_error (line 832) | async fn on_error(
method on_notification (line 841) | async fn on_notification(
method on_non_json (line 905) | async fn on_non_json(&self, raw: &str) -> Result<(), ExecutorError> {
function send_server_response (line 911) | async fn send_server_response<T>(
function answers_to_codex_format (line 930) | fn answers_to_codex_format(
function request_id (line 953) | fn request_id(request: &ClientRequest) -> RequestId {
type LogWriter (line 972) | pub struct LogWriter {
method new (line 977) | pub fn new(writer: impl AsyncWrite + Send + Unpin + 'static) -> Self {
method log_raw (line 983) | pub async fn log_raw(&self, raw: &str) -> Result<(), ExecutorError> {
FILE: crates/executors/src/executors/codex/jsonrpc.rs
type PendingResponse (line 34) | pub enum PendingResponse {
type ExitSignalSender (line 41) | pub struct ExitSignalSender {
method new (line 46) | pub fn new(sender: oneshot::Sender<ExecutorExitResult>) -> Self {
method send_exit_signal (line 52) | pub async fn send_exit_signal(&self, result: ExecutorExitResult) {
type JsonRpcPeer (line 60) | pub struct JsonRpcPeer {
method spawn (line 67) | pub fn spawn(
method next_request_id (line 176) | pub fn next_request_id(&self) -> RequestId {
method register (line 180) | pub async fn register(&self, request_id: RequestId) -> PendingReceiver {
method resolve (line 186) | pub async fn resolve(&self, request_id: RequestId, response: PendingRe...
method shutdown (line 192) | pub async fn shutdown(&self) -> Result<(), ExecutorError> {
method send (line 200) | pub async fn send<T>(&self, message: &T) -> Result<(), ExecutorError>
method request (line 209) | pub async fn request<R, T>(
method send_raw (line 225) | async fn send_raw(&self, payload: &str) -> Result<(), ExecutorError> {
type PendingReceiver (line 237) | pub type PendingReceiver = oneshot::Receiver<PendingResponse>;
function await_response (line 239) | pub async fn await_response<R>(
type JsonRpcCallbacks (line 276) | pub trait JsonRpcCallbacks: Send + Sync {
method on_request (line 277) | async fn on_request(
method on_response (line 284) | async fn on_response(
method on_error (line 291) | async fn on_error(
method on_notification (line 298) | async fn on_notification(
method on_non_json (line 305) | async fn on_non_json(&self, _raw: &str) -> Result<(), ExecutorError>;
FILE: crates/executors/src/executors/codex/normalize_logs.rs
type ToNormalizedEntry (line 53) | trait ToNormalizedEntry {
method to_normalized_entry (line 54) | fn to_normalized_entry(&self) -> NormalizedEntry;
method to_normalized_entry (line 87) | fn to_normalized_entry(&self) -> NormalizedEntry {
method to_normalized_entry (line 127) | fn to_normalized_entry(&self) -> NormalizedEntry {
method to_normalized_entry (line 160) | fn to_normalized_entry(&self) -> NormalizedEntry {
method to_normalized_entry (line 187) | fn to_normalized_entry(&self) -> NormalizedEntry {
method to_normalized_entry (line 210) | fn to_normalized_entry(&self) -> NormalizedEntry {
method to_normalized_entry (line 278) | fn to_normalized_entry(&self) -> NormalizedEntry {
method to_normalized_entry (line 311) | fn to_normalized_entry(&self) -> NormalizedEntry {
method to_normalized_entry (line 1618) | fn to_normalized_entry(&self) -> NormalizedEntry {
type ToNormalizedEntryOpt (line 57) | trait ToNormalizedEntryOpt {
method to_normalized_entry_opt (line 58) | fn to_normalized_entry_opt(&self) -> Option<NormalizedEntry>;
method to_normalized_entry_opt (line 1706) | fn to_normalized_entry_opt(&self) -> Option<NormalizedEntry> {
type CodexNotificationParams (line 62) | struct CodexNotificationParams {
type StreamingText (line 68) | struct StreamingText {
type CommandState (line 74) | struct CommandState {
type McpToolState (line 119) | struct McpToolState {
type WebSearchState (line 147) | struct WebSearchState {
method new (line 154) | fn new() -> Self {
type UserInputRequestState (line 179) | struct UserInputRequestState {
type PlanState (line 203) | struct PlanState {
type ReviewState (line 226) | struct ReviewState {
method complete (line 234) | fn complete(&mut self, review_event: &ExitedReviewModeEvent, worktree_...
type PatchState (line 297) | struct PatchState {
type PatchEntry (line 301) | struct PatchEntry {
type LogState (line 333) | struct LogState {
method new (line 359) | fn new(entry_index: EntryIndexProvider) -> Self {
method streaming_text_update (line 379) | fn streaming_text_update(
method streaming_text_append (line 415) | fn streaming_text_append(
method streaming_text_set (line 423) | fn streaming_text_set(
method assistant_message_append (line 431) | fn assistant_message_append(&mut self, content: String) -> (Normalized...
method thinking_append (line 435) | fn thinking_append(&mut self, content: String) -> (NormalizedEntry, us...
method assistant_message (line 439) | fn assistant_message(&mut self, content: String) -> (NormalizedEntry, ...
method thinking (line 443) | fn thinking(&mut self, content: String) -> (NormalizedEntry, usize, bo...
method update_tool_status (line 447) | fn update_tool_status(
type ModelParamsState (line 347) | struct ModelParamsState {
type StreamingTextKind (line 353) | enum StreamingTextKind {
type UpdateMode (line 491) | enum UpdateMode {
function normalize_file_changes (line 496) | fn normalize_file_changes(
function format_todo_status (line 533) | fn format_todo_status(status: &StepStatus) -> String {
constant SUPPRESSED_STDERR_PATTERNS (line 543) | const SUPPRESSED_STDERR_PATTERNS: &[&str] = &[
function normalize_codex_stderr_logs (line 551) | fn normalize_codex_stderr_logs(
function normalize_logs (line 585) | pub fn normalize_logs(
function handle_jsonrpc_response (line 1504) | fn handle_jsonrpc_response(
function handle_model_params (line 1534) | fn handle_model_params(
function build_command_output (line 1571) | fn build_command_output(stdout: Option<&str>, stderr: Option<&str>) -> O...
type Error (line 1599) | pub enum Error {
method launch_error (line 1605) | pub fn launch_error(error: String) -> Self {
method auth_required (line 1608) | pub fn auth_required(error: String) -> Self {
method raw (line 1612) | pub fn raw(&self) -> String {
type Approval (line 1641) | pub enum Approval {
method approval_requested (line 1659) | pub fn approval_requested(call_id: String, tool_name: String, approval...
method approval_response (line 1667) | pub fn approval_response(
method question_response (line 1679) | pub fn question_response(call_id: String, question_status: QuestionSta...
method raw (line 1686) | pub fn raw(&self) -> String {
method display_tool_name (line 1690) | pub fn display_tool_name(&self) -> String {
FILE: crates/executors/src/executors/codex/review.rs
function launch_codex_review (line 8) | pub async fn launch_codex_review(
FILE: crates/executors/src/executors/codex/slash_commands.rs
constant CODEX_INIT_PROMPT (line 24) | const CODEX_INIT_PROMPT: &str = include_str!("init_prompt.md");
constant DEFAULT_PROJECT_DOC_FILENAME (line 25) | const DEFAULT_PROJECT_DOC_FILENAME: &str = "AGENTS.md";
type CodexSlashCommand (line 28) | pub enum CodexSlashCommand {
method parse (line 37) | pub fn parse(prompt: &str) -> Option<Self> {
method spawn_slash_command (line 63) | pub async fn spawn_slash_command(
method spawn_agent_with_prompt (line 121) | async fn spawn_agent_with_prompt(
method handle_app_server_slash_command (line 141) | async fn handle_app_server_slash_command(
method return_static_reply (line 248) | pub async fn return_static_reply(
method spawn_static_reply_helper (line 270) | pub async fn spawn_static_reply_helper(
function log_event_notification (line 296) | pub async fn log_event_notification(
function log_event_raw (line 316) | pub async fn log_event_raw(log_writer: &LogWriter, message: String) -> R...
function fetch_status_message (line 327) | async fn fetch_status_message(
type RolloutEntry (line 483) | struct RolloutEntry {
type TokenCountPayload (line 491) | struct TokenCountPayload {
type RolloutTokenUsageInfo (line 496) | struct RolloutTokenUsageInfo {
type RolloutTokenUsage (line 503) | struct RolloutTokenUsage {
type TurnContextPayload (line 512) | struct TurnContextPayload {
type RolloutData (line 520) | struct RolloutData {
function read_rollout_data (line 525) | async fn read_rollout_data(session_id: &str) -> Option<RolloutData> {
function find_rollout_file (line 565) | async fn find_rollout_file(dir: &Path, session_id: &str) -> Option<PathB...
function fetch_mcp_status_message (line 584) | async fn fetch_mcp_status_message(client: &AppServerClient) -> Result<St...
function format_mcp_status (line 598) | fn format_mcp_status(servers: &[codex_app_server_protocol::McpServerStat...
function format_mcp_auth_status (line 644) | fn format_mcp_auth_status(status: &codex_app_server_protocol::McpAuthSta...
FILE: crates/executors/src/executors/copilot.rs
type Copilot (line 27) | pub struct Copilot {
method build_command_builder (line 51) | fn build_command_builder(&self) -> Result<CommandBuilder, CommandBuild...
method use_approvals (line 90) | fn use_approvals(&mut self, approvals: Arc<dyn ExecutorApprovalService>) {
method apply_overrides (line 94) | fn apply_overrides(&mut self, executor_config: &ExecutorConfig) {
method spawn (line 107) | async fn spawn(
method spawn_follow_up (line 128) | async fn spawn_follow_up(
method normalize_logs (line 152) | fn normalize_logs(
method default_mcp_config_path (line 160) | fn default_mcp_config_path(&self) -> Option<std::path::PathBuf> {
method get_availability_info (line 164) | fn get_availability_info(&self) -> AvailabilityInfo {
method get_preset_options (line 181) | fn get_preset_options(&self) -> ExecutorConfig {
method discover_options (line 192) | async fn discover_options(
FILE: crates/executors/src/executors/cursor.rs
constant CURSOR_AUTH_REQUIRED_MSG (line 39) | const CURSOR_AUTH_REQUIRED_MSG: &str = "Authentication required. Please ...
type CursorAgent (line 42) | pub struct CursorAgent {
method base_command (line 140) | pub fn base_command() -> &'static str {
method resolved_model (line 144) | fn resolved_model(&self) -> Option<&str> {
method build_command_builder (line 150) | fn build_command_builder(&self) -> Result<CommandBuilder, CommandBuild...
function resolve_cursor_model_name (line 60) | fn resolve_cursor_model_name<'a>(base_model: &'a str, reasoning: Option<...
function cursor_reasoning_options (line 112) | fn cursor_reasoning_options(base_model: &str) -> Vec<ReasoningOption> {
method apply_overrides (line 171) | fn apply_overrides(&mut self, executor_config: &ExecutorConfig) {
method spawn (line 186) | async fn spawn(
method spawn_follow_up (line 224) | async fn spawn_follow_up(
method normalize_logs (line 265) | fn normalize_logs(
method default_mcp_config_path (line 611) | fn default_mcp_config_path(&self) -> Option<std::path::PathBuf> {
method get_availability_info (line 615) | fn get_availability_info(&self) -> AvailabilityInfo {
method get_preset_options (line 633) | fn get_preset_options(&self) -> ExecutorConfig {
method discover_options (line 644) | async fn discover_options(
type CursorJson (line 701) | pub enum CursorJson {
method extract_session_id (line 766) | pub fn extract_session_id(&self) -> Option<String> {
type CursorMessage (line 780) | pub struct CursorMessage {
method concat_text (line 786) | pub fn concat_text(&self) -> Option<String> {
type CursorContentItem (line 797) | pub enum CursorContentItem {
type CursorToolCall (line 807) | pub enum CursorToolCall {
method get_name (line 883) | pub fn get_name(&self) -> &str {
method to_action_and_content (line 902) | pub fn to_action_and_content(&self, worktree_path: &str) -> (ActionTyp...
function normalize_todo_status (line 1106) | fn normalize_todo_status(status: &str) -> String {
type CursorShellOutcome (line 1121) | pub struct CursorShellOutcome {
type CursorShellWrappedResult (line 1131) | pub struct CursorShellWrappedResult {
type CursorShellResult (line 1140) | pub enum CursorShellResult {
method into_outcome (line 1147) | pub fn into_outcome(self) -> Option<CursorShellOutcome> {
type CursorMcpTextInner (line 1157) | pub struct CursorMcpTextInner {
type CursorMcpContentItem (line 1162) | pub struct CursorMcpContentItem {
type CursorMcpOutcome (line 1168) | pub struct CursorMcpOutcome {
type CursorMcpWrappedResult (line 1176) | pub struct CursorMcpWrappedResult {
type CursorMcpResult (line 1185) | pub enum CursorMcpResult {
method into_markdown (line 1192) | pub fn into_markdown(self) -> Option<String> {
type CursorShellArgs (line 1215) | pub struct CursorShellArgs {
type CursorLsArgs (line 1224) | pub struct CursorLsArgs {
type CursorGlobArgs (line 1231) | pub struct CursorGlobArgs {
type CursorGrepArgs (line 1241) | pub struct CursorGrepArgs {
type CursorSemSearchArgs (line 1260) | pub struct CursorSemSearchArgs {
type CursorWriteArgs (line 1269) | pub struct CursorWriteArgs {
type CursorReadArgs (line 1282) | pub struct CursorReadArgs {
type CursorEditArgs (line 1291) | pub struct CursorEditArgs {
type CursorEditResult (line 1303) | pub enum CursorEditResult {
type CursorEditSuccessResult (line 1313) | pub struct CursorEditSuccessResult {
type CursorApplyPatch (line 1328) | pub struct CursorApplyPatch {
type CursorStrReplace (line 1334) | pub struct CursorStrReplace {
type CursorMultiStrReplace (line 1344) | pub struct CursorMultiStrReplace {
type CursorMultiEditItem (line 1349) | pub struct CursorMultiEditItem {
type CursorDeleteArgs (line 1359) | pub struct CursorDeleteArgs {
type CursorUpdateTodosArgs (line 1364) | pub struct CursorUpdateTodosArgs {
type CursorMcpArgs (line 1370) | pub struct CursorMcpArgs {
type CursorTodoItem (line 1381) | pub struct CursorTodoItem {
function test_cursor_streaming_patch_generation (line 1407) | async fn test_cursor_streaming_patch_generation() {
function test_session_id_extraction_from_system_line (line 1451) | fn test_session_id_extraction_from_system_line() {
function test_cursor_tool_call_parsing (line 1459) | fn test_cursor_tool_call_parsing() {
FILE: crates/executors/src/executors/cursor/mcp.rs
function ensure_mcp_server_trust (line 10) | pub async fn ensure_mcp_server_trust(cursor: &CursorAgent, current_dir: ...
function ensure_mcp_server_trust_impl (line 19) | async fn ensure_mcp_server_trust_impl(
function cursor_project_slug (line 133) | fn cursor_project_slug(path: &Path) -> Option<String> {
function compute_cursor_approval_id (line 148) | fn compute_cursor_approval_id(
function default_cursor_mcp_servers (line 169) | fn default_cursor_mcp_servers(cursor: &CursorAgent) -> serde_json::Value {
FILE: crates/executors/src/executors/droid.rs
type Autonomy (line 31) | pub enum Autonomy {
function default_autonomy (line 39) | fn default_autonomy() -> Autonomy {
type ReasoningEffortLevel (line 47) | pub enum ReasoningEffortLevel {
type Droid (line 58) | pub struct Droid {
method build_command_builder (line 88) | pub fn build_command_builder(&self) -> Result<CommandBuilder, CommandB...
function spawn_droid (line 110) | async fn spawn_droid(
method apply_overrides (line 145) | fn apply_overrides(&mut self, executor_config: &ExecutorConfig) {
method spawn (line 158) | async fn spawn(
method spawn_follow_up (line 170) | async fn spawn_follow_up(
method normalize_logs (line 186) | fn normalize_logs(
method default_mcp_config_path (line 198) | fn default_mcp_config_path(&self) -> Option<std::path::PathBuf> {
method get_availability_info (line 202) | fn get_availability_info(&self) -> AvailabilityInfo {
method get_preset_options (line 219) | fn get_preset_options(&self) -> ExecutorConfig {
method discover_options (line 233) | async fn discover_options(
FILE: crates/executors/src/executors/droid/normalize_logs.rs
function normalize_logs (line 25) | pub fn normalize_logs(
function normalize_stderr_logs (line 674) | fn normalize_stderr_logs(
function extract_path_from_patch (line 712) | fn extract_path_from_patch(input: &str) -> String {
function parse_apply_patch_result (line 726) | fn parse_apply_patch_result(value: &Value, worktree_path: &str) -> Optio...
type ToolError (line 793) | pub struct ToolError {
type ToolResultPayload (line 801) | pub enum ToolResultPayload {
type EditToolResult (line 806) | pub struct EditToolResult {}
type DroidJson (line 810) | pub enum DroidJson {
method session_id (line 895) | pub fn session_id(&self) -> Option<&str> {
type DroidErrorLog (line 874) | struct DroidErrorLog {
type DroidErrorDetail (line 886) | struct DroidErrorDetail {
type DroidToolData (line 909) | pub enum DroidToolData {
type DroidTodoItem (line 995) | pub struct DroidTodoItem {
type DroidEditItem (line 1005) | pub struct DroidEditItem {
type ToNormalizedEntry (line 1010) | trait ToNormalizedEntry {
method to_normalized_entry (line 1011) | fn to_normalized_entry(&self) -> NormalizedEntry;
method to_normalized_entry (line 1022) | fn to_normalized_entry(&self) -> NormalizedEntry {
method to_normalized_entry (line 1047) | fn to_normalized_entry(&self) -> NormalizedEntry {
method to_normalized_entry (line 1074) | fn to_normalized_entry(&self) -> NormalizedEntry {
method to_normalized_entry (line 1115) | fn to_normalized_entry(&self) -> NormalizedEntry {
method to_normalized_entry (line 1146) | fn to_normalized_entry(&self) -> NormalizedEntry {
method to_normalized_entry (line 1170) | fn to_normalized_entry(&self) -> NormalizedEntry {
method to_normalized_entry (line 1196) | fn to_normalized_entry(&self) -> NormalizedEntry {
type FileReadState (line 1015) | struct FileReadState {
type FileEditState (line 1039) | struct FileEditState {
type CommandRunState (line 1065) | struct CommandRunState {
type TodoManagementState (line 1108) | struct TodoManagementState {
type SearchState (line 1139) | struct SearchState {
type WebFetchState (line 1163) | struct WebFetchState {
type GenericToolState (line 1187) | struct GenericToolState {
type ToolCallId (line 1220) | type ToolCallId = String;
type PendingToolCall (line 1223) | enum PendingToolCall {
type ToolCallStates (line 1235) | struct ToolCallStates {
method new (line 1249) | fn new(entry_index: EntryIndexProvider) -> Self {
FILE: crates/executors/src/executors/gemini.rs
constant SUPPRESSED_STDERR_PATTERNS (line 25) | const SUPPRESSED_STDERR_PATTERNS: &[&str] = &[
type Gemini (line 32) | pub struct Gemini {
method build_command_builder (line 48) | fn build_command_builder(&self) -> Result<CommandBuilder, CommandBuild...
method apply_overrides (line 68) | fn apply_overrides(&mut self, executor_config: &ExecutorConfig) {
method use_approvals (line 80) | fn use_approvals(&mut self, approvals: Arc<dyn ExecutorApprovalService>) {
method spawn (line 84) | async fn spawn(
method spawn_follow_up (line 110) | async fn spawn_follow_up(
method normalize_logs (line 139) | fn normalize_logs(
method default_mcp_config_path (line 151) | fn default_mcp_config_path(&self) -> Option<std::path::PathBuf> {
method get_availability_info (line 155) | fn get_availability_info(&self) -> AvailabilityInfo {
method get_preset_options (line 183) | fn get_preset_options(&self) -> ExecutorConfig {
method discover_options (line 199) | async fn discover_options(
FILE: crates/executors/src/executors/mod.rs
type SlashCommandDescription (line 48) | pub struct SlashCommandDescription {
type BaseAgentCapability (line 58) | pub enum BaseAgentCapability {
type ExecutorError (line 67) | pub enum ExecutorError {
type CodingAgent (line 109) | pub enum CodingAgent {
method get_mcp_config (line 127) | pub fn get_mcp_config(&self) -> McpConfig {
method supports_mcp (line 173) | pub fn supports_mcp(&self) -> bool {
method capabilities (line 177) | pub fn capabilities(&self) -> Vec<BaseAgentCapability> {
type AvailabilityInfo (line 205) | pub enum AvailabilityInfo {
method is_available (line 212) | pub fn is_available(&self) -> bool {
type StandardCodingAgentExecutor (line 222) | pub trait StandardCodingAgentExecutor {
method apply_overrides (line 223) | fn apply_overrides(&mut self, _executor_config: &ExecutorConfig) {}
method use_approvals (line 225) | fn use_approvals(&mut self, _approvals: Arc<dyn ExecutorApprovalServic...
method spawn (line 227) | async fn spawn(
method spawn_follow_up (line 235) | async fn spawn_follow_up(
method spawn_review (line 244) | async fn spawn_review(
method normalize_logs (line 260) | fn normalize_logs(
method default_mcp_config_path (line 269) | fn default_mcp_config_path(&self) -> Option<std::path::PathBuf>;
method get_setup_helper_action (line 271) | async fn get_setup_helper_action(&self) -> Result<ExecutorAction, Exec...
method get_availability_info (line 275) | fn get_availability_info(&self) -> AvailabilityInfo {
method discover_options (line 289) | async fn discover_options(
method get_preset_options (line 301) | fn get_preset_options(&self) -> ExecutorConfig;
type ExecutorExitResult (line 306) | pub enum ExecutorExitResult {
type ExecutorExitSignal (line 316) | pub type ExecutorExitSignal = tokio::sync::oneshot::Receiver<ExecutorExi...
type CancellationToken (line 320) | pub type CancellationToken = tokio_util::sync::CancellationToken;
type SpawnedChild (line 323) | pub struct SpawnedChild {
method from (line 332) | fn from(child: AsyncGroupChild) -> Self {
type AppendPrompt (line 349) | pub struct AppendPrompt(pub Option<String>);
method get (line 352) | pub fn get(&self) -> Option<String> {
method combine_prompt (line 356) | pub fn combine_prompt(&self, prompt: &str) -> String {
function build_review_prompt (line 364) | pub fn build_review_prompt(
function test_cursor_agent_deserialization (line 399) | fn test_cursor_agent_deserialization() {
FILE: crates/executors/src/executors/opencode.rs
type Opencode (line 46) | pub struct Opencode {
method build_command_builder (line 91) | fn build_command_builder(&self) -> Result<CommandBuilder, CommandBuild...
method compute_models_cache_key (line 100) | fn compute_models_cache_key(&self) -> String {
method spawn_server_process (line 105) | async fn spawn_server_process(
method spawn_server (line 139) | async fn spawn_server(
method spawn_inner (line 158) | async fn spawn_inner(
method transform_models (line 254) | fn transform_models(
type OpencodeServer (line 70) | struct OpencodeServer {
method drop (line 78) | fn drop(&mut self) {
type ServerPassword (line 88) | type ServerPassword = String;
function map_opencode_agents (line 287) | fn map_opencode_agents(agents: &[SDKAgentInfo]) -> Vec<AgentInfo> {
function format_tail (line 308) | fn format_tail(captured: Vec<String>) -> String {
function wait_for_server_url (line 320) | async fn wait_for_server_url(
function default_discovered_options (line 370) | fn default_discovered_options() -> crate::executor_discovery::ExecutorDi...
method apply_overrides (line 392) | fn apply_overrides(&mut self, executor_config: &ExecutorConfig) {
method use_approvals (line 410) | fn use_approvals(&mut self, approvals: Arc<dyn ExecutorApprovalService>) {
method spawn (line 414) | async fn spawn(
method spawn_follow_up (line 425) | async fn spawn_follow_up(
method normalize_logs (line 439) | fn normalize_logs(
method default_mcp_config_path (line 447) | fn default_mcp_config_path(&self) -> Option<std::path::PathBuf> {
method get_availability_info (line 472) | fn get_availability_info(&self) -> AvailabilityInfo {
method discover_options (line 527) | async fn discover_options(
method get_preset_options (line 756) | fn get_preset_options(&self) -> ExecutorConfig {
function default_to_true (line 772) | fn default_to_true() -> bool {
function setup_permissions_env (line 776) | fn setup_permissions_env(auto_approve: bool, env: &ExecutionEnv) -> Exec...
function build_default_permissions (line 790) | fn build_default_permissions(auto_approve: bool) -> Option<String> {
function setup_compaction_env (line 798) | fn setup_compaction_env(auto_compact: bool, env: &ExecutionEnv) -> Execu...
function merge_compaction_config (line 809) | fn merge_compaction_config(existing_json: Option<&str>) -> String {
FILE: crates/executors/src/executors/opencode/models.rs
type ProviderId (line 13) | type ProviderId = String;
type ModelId (line 14) | type ModelId = String;
type ContextWindowTokens (line 15) | type ContextWindowTokens = u32;
type ModelContextWindows (line 18) | pub(super) type ModelContextWindows = HashMap<(ProviderId, ModelId), Con...
type ModelCacheEntry (line 24) | struct ModelCacheEntry {
type ModelContextCache (line 31) | struct ModelContextCache {
method new (line 36) | fn new() -> Self {
method get (line 42) | fn get(&self, cache_key: &str, provider: &str, model: &str) -> Option<...
method update (line 58) | fn update(
function get_model_context_window (line 88) | async fn get_model_context_window(
function maybe_emit_token_usage (line 106) | pub(super) async fn maybe_emit_token_usage(context: &EventStreamContext<...
function extract_context_windows (line 158) | pub(super) fn extract_context_windows(data: &ProviderListResponse) -> Mo...
function seed_context_windows_cache (line 170) | pub(super) fn seed_context_windows_cache(cache_key: &str, windows: Model...
function fetch_model_context_windows (line 176) | async fn fetch_model_context_windows(
FILE: crates/executors/src/executors/opencode/normalize_logs.rs
type MessageId (line 3) | type MessageId = String;
type PartId (line 4) | type PartId = String;
function system_message (line 35) | fn system_message(content: String) -> NormalizedEntry {
function normalize_logs (line 44) | pub fn normalize_logs(
function parse_event (line 191) | fn parse_event(line: &str) -> Option<OpencodeExecutorEvent> {
type StreamingText (line 196) | struct StreamingText {
type UpdateMode (line 202) | enum UpdateMode {
type PartKind (line 208) | enum PartKind {
type LogState (line 214) | struct LogState {
method new (line 231) | fn new(entry_index: EntryIndexProvider, msg_store: Arc<MsgStore>) -> S...
method handle_sdk_event (line 249) | fn handle_sdk_event(&mut self, raw: &Value, worktree_path: &Path, msg_...
method handle_session_status (line 337) | fn handle_session_status(&mut self, status: SessionStatus) {
method handle_todo_updated (line 358) | fn handle_todo_updated(&mut self, todos: &[SdkTodo], msg_store: &Arc<M...
method maybe_emit_model_system_message (line 396) | fn maybe_emit_model_system_message(&mut self, info: &MessageInfo) {
method handle_part_update (line 414) | fn handle_part_update(
method handle_part_delta (line 537) | fn handle_part_delta(&mut self, event: MessagePartDeltaEvent, msg_stor...
method handle_approval_requested (line 582) | fn handle_approval_requested(
method handle_approval_response (line 607) | fn handle_approval_response(
method handle_question_response (line 659) | fn handle_question_response(
method handle_permission_asked (line 699) | fn handle_permission_asked(
method handle_question_asked (line 768) | fn handle_question_asked(
method add_normalized_entry (line 807) | fn add_normalized_entry(&mut self, entry: NormalizedEntry) -> usize {
method add_normalized_entry_with_index (line 811) | fn add_normalized_entry_with_index(&mut self, index: usize, entry: Nor...
function update_streaming_text (line 819) | fn update_streaming_text(
type ToolCallState (line 860) | struct ToolCallState {
method new (line 933) | fn new(call_id: String) -> Self {
method tool_name (line 952) | fn tool_name(&self) -> &str {
method set_tool_name (line 956) | fn set_tool_name(&mut self, name: String) {
method set_approval_if_missing (line 964) | fn set_approval_if_missing(&mut self, approval: Option<ApprovalStatus>) {
method set_approval (line 970) | fn set_approval(&mut self, approval: ApprovalStatus) {
method set_question_status (line 974) | fn set_question_status(&mut self, question: QuestionStatus) {
method tool_status (line 978) | fn tool_status(&self) -> ToolStatus {
method update_from_part (line 1004) | fn update_from_part(&mut self, part: ToolPart) {
method apply_tool_data (line 1050) | fn apply_tool_data(
method maybe_promote (line 1205) | fn maybe_promote(&mut self) {
method to_normalized_entry (line 1263) | fn to_normalized_entry(&self, worktree_path: &Path) -> NormalizedEntry {
method build_action_type (line 1281) | fn build_action_type(&self, worktree_path: &Path) -> ActionType {
method build_content (line 1386) | fn build_content(&self, action_type: &ActionType) -> String {
method other_metadata (line 1421) | fn other_metadata(&self) -> Option<&Value> {
method set_other_metadata (line 1428) | fn set_other_metadata(&mut self, meta: Value) {
method file_edit_file_path (line 1434) | fn file_edit_file_path(&self) -> Option<&str> {
method set_file_edit_file_path (line 1441) | fn set_file_edit_file_path(&mut self, path: String) {
method file_edit_unified_diff (line 1447) | fn file_edit_unified_diff(&self) -> Option<&str> {
method set_file_edit_unified_diff (line 1454) | fn set_file_edit_unified_diff(&mut self, diff: String) {
type ToolData (line 873) | enum ToolData {
type FileEditKind (line 918) | enum FileEditKind {
type TodoOperation (line 926) | enum TodoOperation {
type BashInput (line 1462) | struct BashInput {
type FilePathInput (line 1467) | struct FilePathInput {
type WriteInput (line 1473) | struct WriteInput {
type TodosContainer (line 1480) | struct TodosContainer {
type ToolStateStatus (line 1486) | enum ToolStateStatus {
function make_relative_path (line 1494) | fn make_relative_path(path: &str, worktree_path: &Path) -> String {
function fingerprint_todos (line 1498) | fn fingerprint_todos(todos: &[SdkTodo]) -> String {
function extract_diff_from_metadata (line 1515) | fn extract_diff_from_metadata(metadata: &Value) -> Option<&str> {
function extract_file_path_from_permission_metadata (line 1526) | fn extract_file_path_from_permission_metadata(metadata: &Value) -> Optio...
function parse_question_items_from_info (line 1542) | fn parse_question_items_from_info(items: &[QuestionInfo]) -> Vec<AskUser...
function parse_question_items (line 1561) | fn parse_question_items(items: &[Value]) -> Vec<AskUserQuestionItem> {
FILE: crates/executors/src/executors/opencode/sdk.rs
type LogWriter (line 34) | pub struct LogWriter {
method new (line 39) | pub fn new(writer: impl AsyncWrite + Send + Unpin + 'static) -> Self {
method log_event (line 45) | pub async fn log_event(&self, event: &OpencodeExecutorEvent) -> Result...
method log_error (line 51) | pub async fn log_error(&self, message: String) -> Result<(), ExecutorE...
method log_slash_command_result (line 56) | pub async fn log_slash_command_result(&self, message: String) -> Resul...
method log_raw (line 61) | async fn log_raw(&self, raw: &str) -> Result<(), ExecutorError> {
type RunConfig (line 74) | pub struct RunConfig {
function generate_server_password (line 94) | pub fn generate_server_password() -> String {
type HealthResponse (line 103) | struct HealthResponse {
type SessionResponse (line 109) | struct SessionResponse {
type CommandInfo (line 115) | pub struct CommandInfo {
type AgentInfo (line 123) | pub struct AgentInfo {
type ConfigResponse (line 131) | pub struct ConfigResponse {
type ConfigProvidersResponse (line 140) | pub struct ConfigProvidersResponse {
type LspStatus (line 147) | pub struct LspStatus {
type FormatterStatus (line 155) | pub struct FormatterStatus {
type PromptRequest (line 162) | struct PromptRequest {
type ModelSpec (line 173) | pub struct ModelSpec {
type TextPartInput (line 181) | struct TextPartInput {
type ControlEvent (line 187) | pub enum ControlEvent {
type PendingApprovals (line 195) | pub(crate) struct PendingApprovals {
method new (line 200) | pub(crate) fn new() -> Self {
method push (line 206) | async fn push(&self) -> oneshot::Sender<()> {
method wait (line 212) | async fn wait(&self, cancel: CancellationToken) -> bool {
function run_session (line 234) | pub async fn run_session(
function run_slash_command (line 244) | pub async fn run_slash_command(
function run_session_inner (line 255) | async fn run_session_inner(
function build_default_headers (line 394) | fn build_default_headers(directory: &str, password: &str) -> HeaderMap {
function build_authenticated_client (line 408) | pub fn build_authenticated_client(
function build_opencode_client (line 415) | fn build_opencode_client(
constant OPENCODE_PROMPT_TIMEOUT (line 430) | const OPENCODE_PROMPT_TIMEOUT: Duration = Duration::from_secs(60 * 30);
function append_session_error (line 432) | fn append_session_error(session_error: &mut Option<String>, message: Str...
function run_request_with_control (line 442) | pub async fn run_request_with_control<F>(
function wait_for_health (line 513) | pub async fn wait_for_health(
function create_session (line 551) | pub async fn create_session(
function fork_session (line 578) | pub async fn fork_session(
function prompt (line 607) | async fn prompt(
type SessionCommandRequest (line 682) | struct SessionCommandRequest {
function session_command (line 694) | pub async fn session_command(
type SummarizeRequest (line 763) | struct SummarizeRequest {
function session_summarize (line 771) | pub async fn session_summarize(
function list_commands (line 803) | pub async fn list_commands(
function list_agents (line 824) | pub async fn list_agents(
function config_get (line 845) | pub async fn config_get(
function list_config_providers (line 866) | pub async fn list_config_providers(
function list_providers (line 887) | pub async fn list_providers(
function mcp_status (line 908) | pub async fn mcp_status(
function lsp_status (line 929) | pub async fn lsp_status(
function formatter_status (line 950) | pub async fn formatter_status(
function build_response_error (line 971) | async fn build_response_error(resp: reqwest::Response, context: &str) ->...
function send_abort (line 982) | pub async fn send_abort(
function parse_model (line 1002) | fn parse_model(model: &str) -> Option<ModelSpec> {
function parse_model_strict (line 1014) | fn parse_model_strict(model: &str) -> Option<ModelSpec> {
function resolve_compaction_model (line 1026) | pub async fn resolve_compaction_model(
function connect_event_stream (line 1068) | pub async fn connect_event_stream(
type EventListenerConfig (line 1102) | pub struct EventListenerConfig {
function spawn_event_listener (line 1116) | pub async fn spawn_event_listener(config: EventListenerConfig, initial_r...
function exponential_backoff (line 1212) | fn exponential_backoff(base: Duration, attempt: u32) -> Duration {
type EventStreamOutcome (line 1221) | enum EventStreamOutcome {
type EventStreamContext (line 1227) | pub(super) struct EventStreamContext<'a> {
function process_event_stream (line 1245) | async fn process_event_stream(
function event_matches_session (line 1619) | fn event_matches_session(event_type: &str, event: &Value, session_id: &s...
function handle_approval_error (line 1652) | async fn handle_approval_error(
function log_approval_response (line 1677) | async fn log_approval_response(log_writer: &LogWriter, tool_call_id: &st...
function log_question_response (line 1686) | async fn log_question_response(log_writer: &LogWriter, tool_call_id: &st...
type ApprovalCreated (line 1695) | struct ApprovalCreated {
function create_permission_approval (line 1699) | async fn create_permission_approval(
function wait_permission_approval (line 1721) | async fn wait_permission_approval(
function create_question_approval (line 1733) | async fn create_question_approval(
function wait_question_approval (line 1747) | async fn wait_question_approval(
function answers_to_opencode_format (line 1759) | fn answers_to_opencode_format(questions: &[Value], answers: &[QuestionAn...
FILE: crates/executors/src/executors/opencode/slash_commands.rs
type OpencodeSlashCommand (line 27) | pub enum OpencodeSlashCommand {
method parse (line 45) | pub fn parse(prompt: &str) -> Option<Self> {
method requires_existing_session (line 50) | pub fn requires_existing_session(&self) -> bool {
method should_fork_session (line 55) | pub fn should_fork_session(&self) -> bool {
method from (line 61) | fn from(call: SlashCommandCall<'a>) -> Self {
function hardcoded_slash_commands (line 80) | pub fn hardcoded_slash_commands() -> Vec<SlashCommandDescription> {
function format_commands (line 110) | fn format_commands(commands: &[CommandInfo]) -> String {
function format_agents (line 133) | fn format_agents(agents: &[AgentInfo]) -> String {
function format_models (line 155) | fn format_models(
function format_status (line 210) | fn format_status(
function format_mcp (line 233) | fn format_mcp(mcp: &HashMap<String, Value>) -> String {
function format_mcp_section (line 237) | fn format_mcp_section(mcp: &HashMap<String, Value>) -> String {
function format_lsp_section (line 266) | fn format_lsp_section(lsp: &[LspStatus]) -> String {
function format_formatter_section (line 286) | fn format_formatter_section(formatter: &[FormatterStatus]) -> String {
function format_command_not_found (line 310) | fn format_command_not_found(name: &str) -> String {
function format_no_session (line 315) | fn format_no_session() -> String {
function log_result (line 320) | async fn log_result(log_writer: &LogWriter, message: String) -> Result<(...
function log_done (line 325) | async fn log_done(log_writer: &LogWriter) -> Result<(), ExecutorError> {
function log_result_and_done (line 330) | async fn log_result_and_done(log_writer: &LogWriter, message: String) ->...
function execute (line 336) | pub async fn execute(
FILE: crates/executors/src/executors/opencode/types.rs
type OpencodeExecutorEvent (line 10) | pub enum OpencodeExecutorEvent {
type SdkEventEnvelope (line 53) | pub(super) struct SdkEventEnvelope {
type SdkEvent (line 61) | pub(super) enum SdkEvent {
method parse (line 84) | pub(super) fn parse(value: &Value) -> Option<Self> {
type MessageRole (line 134) | pub(super) enum MessageRole {
type MessageUpdatedEvent (line 140) | pub(super) struct MessageUpdatedEvent {
type MessageInfo (line 145) | pub(super) struct MessageInfo {
method provider_id (line 184) | pub(super) fn provider_id(&self) -> Option<&str> {
method model_id (line 191) | pub(super) fn model_id(&self) -> Option<&str> {
type MessageTokens (line 159) | pub(super) struct MessageTokens {
type MessageTokensCache (line 168) | pub(super) struct MessageTokensCache {
function deserialize_f64_as_u32 (line 173) | fn deserialize_f64_as_u32<'de, D>(deserializer: D) -> Result<u32, D::Error>
type MessageModelInfo (line 200) | pub(super) struct MessageModelInfo {
type MessagePartUpdatedEvent (line 208) | pub(super) struct MessagePartUpdatedEvent {
type MessagePartDeltaEvent (line 215) | pub(super) struct MessagePartDeltaEvent {
type PermissionAskedEvent (line 226) | pub(super) struct PermissionAskedEvent {
type PermissionToolInfo (line 239) | pub(super) struct PermissionToolInfo {
type QuestionAskedEvent (line 245) | pub(super) struct QuestionAskedEvent {
type QuestionAskedTool (line 253) | pub(super) struct QuestionAskedTool {
type QuestionInfo (line 262) | pub(super) struct QuestionInfo {
type QuestionOption (line 272) | pub(super) struct QuestionOption {
type SessionStatusEvent (line 279) | pub(super) struct SessionStatusEvent {
type SessionStatus (line 285) | pub(super) enum SessionStatus {
type TodoUpdatedEvent (line 298) | pub(super) struct TodoUpdatedEvent {
type SdkTodo (line 303) | pub(super) struct SdkTodo {
type Part (line 313) | pub(super) enum Part {
type TextPart (line 325) | pub(super) struct TextPart {
type ReasoningPart (line 334) | pub(super) type ReasoningPart = TextPart;
type ToolPart (line 337) | pub(super) struct ToolPart {
type ToolStateUpdate (line 349) | pub(super) enum ToolStateUpdate {
type SessionErrorEvent (line 385) | pub(super) struct SessionErrorEvent {
type SdkError (line 391) | pub(super) struct SdkError {
method kind (line 396) | pub(super) fn kind(&self) -> &str {
method message (line 404) | pub(super) fn message(&self) -> Option<String> {
method deserialize (line 414) | fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
type Config (line 425) | pub(super) struct Config {
type ProviderModelInfo (line 431) | pub struct ProviderModelInfo {
type ProviderModelLimit (line 445) | pub struct ProviderModelLimit {
type ProviderInfo (line 451) | pub struct ProviderInfo {
type ProviderListResponse (line 460) | pub struct ProviderListResponse {
FILE: crates/executors/src/executors/qa_mock.rs
type QaMockExecutor (line 32) | pub struct QaMockExecutor;
method apply_overrides (line 36) | fn apply_overrides(&mut self, _executor_config: &ExecutorConfig) {}
method spawn (line 38) | async fn spawn(
method spawn_follow_up (line 79) | async fn spawn_follow_up(
method normalize_logs (line 92) | fn normalize_logs(
method default_mcp_config_path (line 108) | fn default_mcp_config_path(&self) -> Option<std::path::PathBuf> {
method get_preset_options (line 112) | fn get_preset_options(&self) -> ExecutorConfig {
function perform_file_operations (line 125) | async fn perform_file_operations(dir: &Path) {
function generate_mock_logs (line 202) | fn generate_mock_logs(prompt: &str) -> Vec<String> {
function test_generate_mock_logs_count (line 399) | fn test_generate_mock_logs_count() {
function test_generate_mock_logs_valid_json (line 405) | fn test_generate_mock_logs_valid_json() {
function test_generate_mock_logs_deserializes_to_claudejson (line 419) | fn test_generate_mock_logs_deserializes_to_claudejson() {
function test_escape_special_characters (line 434) | fn test_escape_special_characters() {
FILE: crates/executors/src/executors/qwen.rs
type QwenCode (line 26) | pub struct QwenCode {
method build_command_builder (line 44) | fn build_command_builder(&self) -> Result<CommandBuilder, CommandBuild...
method apply_overrides (line 61) | fn apply_overrides(&mut self, executor_config: &ExecutorConfig) {
method use_approvals (line 77) | fn use_approvals(&mut self, approvals: Arc<dyn ExecutorApprovalService>) {
method spawn (line 81) | async fn spawn(
method spawn_follow_up (line 113) | async fn spawn_follow_up(
method normalize_logs (line 148) | fn normalize_logs(
method default_mcp_config_path (line 157) | fn default_mcp_config_path(&self) -> Option<std::path::PathBuf> {
method get_availability_info (line 161) | fn get_availability_info(&self) -> AvailabilityInfo {
method get_preset_options (line 178) | fn get_preset_options(&self) -> ExecutorConfig {
method discover_options (line 194) | async fn discover_options(
FILE: crates/executors/src/executors/utils.rs
type SlashCommandCall (line 18) | pub struct SlashCommandCall<'a> {
function parse_slash_command (line 25) | pub fn parse_slash_command<'a, T>(prompt: &'a str) -> Option<T>
function reorder_slash_commands (line 42) | pub fn reorder_slash_commands(
type CacheEntry (line 65) | struct CacheEntry<V> {
type TtlCache (line 70) | pub struct TtlCache<K, V> {
function new (line 79) | pub fn new(capacity: usize, ttl: Duration) -> Self {
function get (line 89) | pub fn get(&self, key: &K) -> Option<Arc<V>> {
function put (line 102) | pub fn put(&self, key: K, value: V) {
constant EXECUTOR_OPTIONS_CACHE_CAPACITY (line 114) | pub const EXECUTOR_OPTIONS_CACHE_CAPACITY: usize = 64;
constant DEFAULT_CACHE_TTL (line 115) | pub const DEFAULT_CACHE_TTL: Duration = Duration::from_mins(5);
function executor_options_cache (line 117) | pub fn executor_options_cache()
function spawn_global_cache_refresh_for_agent (line 126) | pub fn spawn_global_cache_refresh_for_agent(base_agent: BaseCodingAgent) {
function spawn_global_cache_refresh_for_agent_with_configs (line 130) | fn spawn_global_cache_refresh_for_agent_with_configs(
function preload_global_executor_options_cache (line 147) | pub async fn preload_global_executor_options_cache() {
FILE: crates/executors/src/logs/mod.rs
type ToolResultValueType (line 13) | pub enum ToolResultValueType {
type ToolResult (line 19) | pub struct ToolResult {
method markdown (line 26) | pub fn markdown<S: Into<String>>(markdown: S) -> Self {
method json (line 33) | pub fn json(value: serde_json::Value) -> Self {
type CommandExitStatus (line 43) | pub enum CommandExitStatus {
type CommandRunResult (line 49) | pub struct CommandRunResult {
type NormalizedConversation (line 55) | pub struct NormalizedConversation {
type NormalizedEntryError (line 65) | pub enum NormalizedEntryError {
type NormalizedEntryType (line 73) | pub enum NormalizedEntryType {
type AnsweredQuestion (line 103) | pub struct AnsweredQuestion {
type TokenUsageInfo (line 109) | pub struct TokenUsageInfo {
type NormalizedEntry (line 115) | pub struct NormalizedEntry {
method with_tool_status (line 124) | pub fn with_tool_status(&self, status: ToolStatus) -> Option<Self> {
type ToolStatus (line 147) | pub enum ToolStatus {
method from_approval_status (line 162) | pub fn from_approval_status(status: &ApprovalStatus) -> Option<Self> {
method from_question_status (line 173) | pub fn from_question_status(status: &QuestionStatus) -> Self {
type TodoItem (line 182) | pub struct TodoItem {
type ActionType (line 192) | pub enum ActionType {
type AskUserQuestionItem (line 245) | pub struct AskUserQuestionItem {
type AskUserQuestionOption (line 255) | pub struct AskUserQuestionOption {
type FileChange (line 262) | pub enum FileChange {
FILE: crates/executors/src/logs/plain_text_processor.rs
type MessageBoundary (line 31) | pub enum MessageBoundary {
type PlainTextBuffer (line 43) | struct PlainTextBuffer {
method new (line 52) | pub fn new() -> Self {
method ingest (line 60) | pub fn ingest(&mut self, text_chunk: String) {
method drain_lines (line 86) | pub fn drain_lines(&mut self, n: usize) -> Vec<String> {
method drain_size (line 100) | pub fn drain_size(&mut self, len: usize) -> Vec<String> {
method flush (line 116) | pub fn flush(&mut self) -> Vec<String> {
method total_len (line 123) | pub fn total_len(&self) -> usize {
method lines (line 128) | pub fn lines(&self) -> &[String] {
method lines_mut (line 133) | pub fn lines_mut(&mut self) -> &mut Vec<String> {
method recompute_len (line 138) | pub fn recompute_len(&mut self) {
method partial_line (line 143) | pub fn partial_line(&self) -> Option<&str> {
method is_empty (line 153) | pub fn is_empty(&self) -> bool {
method default (line 160) | fn default() -> Self {
type FormatChunkFn (line 166) | pub type FormatChunkFn = Box<dyn Fn(Option<&str>, String) -> String + Se...
type MessageBoundaryPredicateFn (line 169) | pub type MessageBoundaryPredicateFn =
type NormalizedEntryProducerFn (line 173) | pub type NormalizedEntryProducerFn = Box<dyn Fn(String) -> NormalizedEnt...
type LinesTransformFn (line 176) | pub type LinesTransformFn = Box<dyn FnMut(&mut Vec<String>) + Send + 'st...
type PlainTextLogProcessor (line 179) | pub struct PlainTextLogProcessor {
method process (line 194) | pub fn process(&mut self, text_chunk: String) -> Vec<Patch> {
method create_patch (line 293) | fn create_patch(&mut self, lines: Vec<String>) -> Patch {
method new (line 329) | pub fn new(
function test_plain_buffer_flush (line 368) | fn test_plain_buffer_flush() {
function test_plain_buffer_len (line 380) | fn test_plain_buffer_len() {
function test_drain_until_size (line 391) | fn test_drain_until_size() {
function test_processor_simple (line 403) | fn test_processor_simple() {
function test_processor_custom_log_formatter (line 423) | fn test_processor_custom_log_formatter() {
function test_processor_transform_lines_clears_first_line (line 460) | fn test_processor_transform_lines_clears_first_line() {
FILE: crates/executors/src/logs/stderr_processor.rs
function normalize_stderr_logs (line 39) | pub fn normalize_stderr_logs(
FILE: crates/executors/src/logs/utils/entry_index.rs
type EntryIndexProvider (line 13) | pub struct EntryIndexProvider(Arc<AtomicUsize>);
method new (line 17) | fn new() -> Self {
method next (line 22) | pub fn next(&self) -> usize {
method current (line 27) | pub fn current(&self) -> usize {
method reset (line 31) | pub fn reset(&self) {
method start_from (line 37) | pub fn start_from(msg_store: &MsgStore) -> Self {
method test_new (line 75) | pub fn test_new() -> Self {
method default (line 67) | fn default() -> Self {
function test_entry_index_provider (line 85) | fn test_entry_index_provider() {
function test_entry_index_provider_clone (line 93) | fn test_entry_index_provider_clone() {
function test_current_index (line 103) | fn test_current_index() {
FILE: crates/executors/src/logs/utils/patch.rs
type PatchOperation (line 17) | enum PatchOperation {
type PatchType (line 26) | pub enum PatchType {
type PatchEntry (line 34) | struct PatchEntry {
function escape_json_pointer_segment (line 40) | pub fn escape_json_pointer_segment(s: &str) -> String {
type ConversationPatch (line 45) | pub struct ConversationPatch;
method add_normalized_entry (line 49) | pub fn add_normalized_entry(entry_index: usize, entry: NormalizedEntry...
method add_stdout (line 60) | pub fn add_stdout(entry_index: usize, entry: String) -> Patch {
method add_stderr (line 71) | pub fn add_stderr(entry_index: usize, entry: String) -> Patch {
method add_diff (line 82) | pub fn add_diff(entry_index: String, diff: Diff) -> Patch {
method replace_diff (line 93) | pub fn replace_diff(entry_index: String, diff: Diff) -> Patch {
method remove_diff (line 104) | pub fn remove_diff(entry_index: String) -> Patch {
method replace (line 113) | pub fn replace(entry_index: usize, entry: NormalizedEntry) -> Patch {
method remove (line 123) | pub fn remove(entry_index: usize) -> Patch {
function extract_normalized_entry_from_patch (line 133) | pub fn extract_normalized_entry_from_patch(patch: &Patch) -> Option<(usi...
function upsert_normalized_entry (line 149) | pub fn upsert_normalized_entry(
function add_normalized_entry (line 165) | pub fn add_normalized_entry(
function replace_normalized_entry (line 175) | pub fn replace_normalized_entry(
function patch_entry_path (line 184) | pub fn patch_entry_path(patch: &Patch) -> Option<String> {
function is_add_or_replace (line 188) | pub fn is_add_or_replace(patch: &Patch) -> bool {
function fix_patch_ops (line 194) | pub fn fix_patch_ops(mut patch: Patch, sent_paths: &mut HashSet<String>)...
function executor_discovered_options (line 219) | pub fn executor_discovered_options(options: ExecutorDiscoveredOptions) -...
function slash_commands (line 226) | pub fn slash_commands(
function update_models (line 239) | pub fn update_models(models: Vec<crate::model_selector::ModelInfo>) -> P...
function models_loaded (line 246) | pub fn models_loaded() -> Patch {
function update_agents (line 253) | pub fn update_agents(agents: Vec<crate::model_selector::AgentInfo>) -> P...
function agents_loaded (line 260) | pub fn agents_loaded() -> Patch {
function update_slash_commands (line 267) | pub fn update_slash_commands(
function slash_commands_loaded (line 276) | pub fn slash_commands_loaded() -> Patch {
function update_providers (line 283) | pub fn update_providers(providers: Vec<crate::model_selector::ModelProvi...
function update_default_model (line 290) | pub fn update_default_model(default_model: Option<String>) -> Patch {
function discovery_error (line 297) | pub fn discovery_error(error: String) -> Patch {
FILE: crates/executors/src/logs/utils/shell_command_parsing.rs
type CommandCategory (line 7) | pub enum CommandCategory {
method from_command (line 23) | pub fn from_command(command: &str) -> Self {
function has_file_redirect (line 72) | fn has_file_redirect(command: &str) -> bool {
function redirect_target (line 100) | fn redirect_target(token: &str) -> Option<&str> {
function is_file_target (line 108) | fn is_file_target(target: &str) -> bool {
function unwrap_shell_command (line 115) | pub fn unwrap_shell_command(command: &str) -> &str {
function extract_command_after_c_flag (line 146) | fn extract_command_after_c_flag(args: &str) -> Option<&str> {
function strip_quotes (line 170) | fn strip_quotes(s: &str) -> &str {
FILE: crates/executors/src/mcp_config.rs
function is_jsonc_file (line 19) | fn is_jsonc_file(path: &Path) -> bool {
type McpConfig (line 31) | pub struct McpConfig {
method new (line 40) | pub fn new(
method set_servers (line 54) | pub fn set_servers(&mut self, servers: HashMap<String, serde_json::Val...
function read_agent_config (line 59) | pub async fn read_agent_config(
function write_agent_config (line 88) | pub async fn write_agent_config(
function write_jsonc_preserving_comments (line 106) | async fn write_jsonc_preserving_comments(
function update_jsonc_content (line 120) | fn update_jsonc_content(current_content: &str, new_config: &Value) -> St...
function deep_merge_cst_object (line 135) | fn deep_merge_cst_object(cst_obj: &CstObject, new_obj: &Map<String, Valu...
function serde_json_to_cst_input (line 165) | fn serde_json_to_cst_input(value: &Value) -> jsonc_parser::cst::CstInput...
type ServerMap (line 192) | type ServerMap = Map<String, Value>;
function is_http_server (line 194) | fn is_http_server(s: &Map<String, Value>) -> bool {
function is_stdio (line 198) | fn is_stdio(s: &Map<String, Value>) -> bool {
function extract_meta (line 202) | fn extract_meta(mut obj: ServerMap) -> (ServerMap, Option<Value>) {
function attach_meta (line 207) | fn attach_meta(mut obj: ServerMap, meta: Option<Value>) -> Value {
function ensure_header (line 214) | fn ensure_header(headers: &mut Map<String, Value>, key: &str, val: &str) {
function transform_http_servers (line 223) | fn transform_http_servers<F>(mut servers: ServerMap, mut f: F) -> ServerMap
function adapt_passthrough (line 240) | fn adapt_passthrough(servers: ServerMap, meta: Option<Value>) -> Value {
function adapt_gemini (line 244) | fn adapt_gemini(servers: ServerMap, meta: Option<Value>) -> Value {
function adapt_cursor (line 267) | fn adapt_cursor(servers: ServerMap, meta: Option<Value>) -> Value {
function adapt_codex (line 280) | fn adapt_codex(mut servers: ServerMap, mut meta: Option<Value>) -> Value {
function adapt_opencode (line 291) | fn adapt_opencode(servers: ServerMap, meta: Option<Value>) -> Value {
function adapt_copilot (line 356) | fn adapt_copilot(mut servers: ServerMap, meta: Option<Value>) -> Value {
type Adapter (line 370) | enum Adapter {
function apply_adapter (line 379) | fn apply_adapter(adapter: Adapter, canonical: Value) -> Value {
method preconfigured_mcp (line 396) | pub fn preconfigured_mcp(&self) -> Value {
FILE: crates/executors/src/model_selector.rs
type ModelProvider (line 7) | pub struct ModelProvider {
type ModelInfo (line 16) | pub struct ModelInfo {
type ReasoningOption (line 31) | pub struct ReasoningOption {
method from_names (line 84) | pub fn from_names(names: impl IntoIterator<Item = impl Into<String>>) ...
method from_names_with_labels (line 88) | pub fn from_names_with_labels(
type AgentInfo (line 40) | pub struct AgentInfo {
type PermissionPolicy (line 53) | pub enum PermissionPolicy {
type ModelSelectorConfig (line 65) | pub struct ModelSelectorConfig {
function reasoning_label (line 125) | fn reasoning_label(id: &str) -> String {
FILE: crates/executors/src/profile.rs
function canonical_variant_key (line 21) | pub fn canonical_variant_key<S: AsRef<str>>(raw: S) -> String {
type ProfileError (line 32) | pub enum ProfileError {
constant DEFAULT_PROFILES_JSON (line 59) | const DEFAULT_PROFILES_JSON: &str = include_str!("../default_profiles.js...
type ExecutorProfileId (line 63) | pub struct ExecutorProfileId {
method new (line 87) | pub fn new(executor: BaseCodingAgent) -> Self {
method with_variant (line 95) | pub fn with_variant(executor: BaseCodingAgent, variant: String) -> Self {
method cache_key (line 103) | pub fn cache_key(&self) -> String {
method fmt (line 112) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
function de_base_coding_agent_kebab (line 74) | fn de_base_coding_agent_kebab<'de, D>(de: D) -> Result<BaseCodingAgent, ...
type ExecutorConfig (line 125) | pub struct ExecutorConfig {
method new (line 148) | pub fn new(executor: BaseCodingAgent) -> Self {
method profile_id (line 160) | pub fn profile_id(&self) -> ExecutorProfileId {
method has_overrides (line 168) | pub fn has_overrides(&self) -> bool {
method from (line 177) | fn from(id: ExecutorProfileId) -> Self {
method fmt (line 190) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
type ExecutorProfile (line 196) | pub struct ExecutorProfile {
method get_variant (line 205) | pub fn get_variant(&self, variant: &str) -> Option<&CodingAgent> {
method get_default (line 210) | pub fn get_default(&self) -> Option<&CodingAgent> {
method new_with_default (line 215) | pub fn new_with_default(default_config: CodingAgent) -> Self {
method set_variant (line 225) | pub fn set_variant(
method set_default (line 241) | pub fn set_default(&mut self, config: CodingAgent) {
method variant_names (line 246) | pub fn variant_names(&self) -> Vec<&String> {
type ExecutorRecentModels (line 255) | pub struct ExecutorRecentModels {
type ExecutorConfigs (line 265) | pub struct ExecutorConfigs {
method canonicalise (line 271) | fn canonicalise(&mut self) {
method get_cached (line 290) | pub fn get_cached() -> ExecutorConfigs {
method reload (line 295) | pub fn reload() {
method load (line 301) | pub fn load() -> Self {
method save_overrides (line 335) | pub fn save_overrides(&self) -> Result<(), ProfileError> {
method merge_with_defaults (line 360) | fn merge_with_defaults(mut defaults: Self, overrides: Self) -> Self {
method compute_overrides (line 384) | fn compute_overrides(defaults: &Self, current: &Self) -> Result<Self, ...
method validate_merged (line 458) | fn validate_merged(merged: &Self) -> Result<(), ProfileError> {
method from_defaults (line 487) | pub fn from_defaults() -> Self {
method get_coding_agent (line 494) | pub fn get_coding_agent(&self, executor_profile_id: &ExecutorProfileId...
method get_coding_agent_or_default (line 508) | pub fn get_coding_agent_or_default(
method get_recommended_executor_profile (line 520) | pub async fn get_recommended_executor_profile(
function to_default_variant (line 583) | pub fn to_default_variant(id: &ExecutorProfileId) -> ExecutorProfileId {
FILE: crates/executors/src/stdout_dup.rs
function duplicate_stdout (line 26) | pub fn duplicate_stdout(
type StdoutAppender (line 82) | pub struct StdoutAppender {
method append_line (line 87) | pub fn append_line<S: Into<String>>(&self, line: S) {
function tee_stdout_with_appender (line 100) | pub fn tee_stdout_with_appender(
function create_stdout_pipe_writer (line 174) | pub fn create_stdout_pipe_writer<'b>(
function spawn_local_output_process (line 188) | pub fn spawn_local_output_process()
function wrap_fd_as_child_stdout (line 244) | fn wrap_fd_as_child_stdout(
function wrap_fd_as_tokio_writer (line 267) | fn wrap_fd_as_tokio_writer(
FILE: crates/git-host/src/azure/cli.rs
type AzureRepoInfo (line 21) | pub struct AzureRepoInfo {
type AzPrResponse (line 31) | struct AzPrResponse {
type AzRepository (line 41) | struct AzRepository {
type AzCommit (line 47) | struct AzCommit {
type AzThreadsResponse (line 52) | struct AzThreadsResponse {
type AzThread (line 58) | struct AzThread {
type AzThreadContext (line 65) | struct AzThreadContext {
type AzFilePosition (line 71) | struct AzFilePosition {
type AzThreadComment (line 77) | struct AzThreadComment {
type AzAuthor (line 87) | struct AzAuthor {
type AzRepoListItem (line 94) | struct AzRepoListItem {
type AzRepoProject (line 103) | struct AzRepoProject {
type AzCliError (line 109) | pub enum AzCliError {
type AzCli (line 121) | pub struct AzCli;
method new (line 124) | pub fn new() -> Self {
method ensure_available (line 129) | fn ensure_available(&self) -> Result<(), AzCliError> {
method run (line 134) | fn run<I, S>(&self, args: I, dir: Option<&Path>) -> Result<String, AzC...
method get_repo_info (line 177) | pub fn get_repo_info(
method urls_match (line 238) | fn urls_match(url1: &str, url2: &str) -> bool {
method extract_organization_url (line 252) | fn extract_organization_url(url: &str) -> Option<String> {
method create_pr (line 274) | pub fn create_pr(
method view_pr (line 312) | pub fn view_pr(&self, pr_url: &str) -> Result<PullRequestInfo, AzCliEr...
method list_prs_for_branch (line 337) | pub fn list_prs_for_branch(
method get_pr_threads (line 368) | pub fn get_pr_threads(
method parse_pr_url (line 401) | pub fn parse_pr_url(url: &str) -> Option<(String, i64)> {
method parse_pr_response (line 440) | fn parse_pr_response(raw: &str) -> Result<PullRequestInfo, AzCliError> {
method parse_pr_list_response (line 447) | fn parse_pr_list_response(raw: &str) -> Result<Vec<PullRequestInfo>, A...
method az_pr_to_info (line 455) | fn az_pr_to_info(pr: AzPrResponse) -> PullRequestInfo {
method parse_pr_threads (line 478) | fn parse_pr_threads(raw: &str) -> Result<Vec<UnifiedPrComment>, AzCliE...
method map_azure_status (line 549) | fn map_azure_status(status: &str) -> MergeStatus {
function test_parse_pr_url (line 564) | fn test_parse_pr_url() {
function test_parse_pr_url_visualstudio (line 575) | fn test_parse_pr_url_visualstudio() {
function test_parse_pr_url_invalid (line 586) | fn test_parse_pr_url_invalid() {
function test_map_azure_status (line 594) | fn test_map_azure_status() {
function test_urls_match (line 614) | fn test_urls_match() {
function test_extract_organization_url_dev_azure (line 659) | fn test_extract_organization_url_dev_azure() {
function test_extract_organization_url_visualstudio (line 667) | fn test_extract_organization_url_visualstudio() {
function test_extract_organization_url_invalid (line 675) | fn test_extract_organization_url_invalid() {
FILE: crates/git-host/src/azure/mod.rs
type AzureDevOpsProvider (line 21) | pub struct AzureDevOpsProvider {
method new (line 26) | pub fn new() -> Result<Self, GitHostError> {
method get_repo_info (line 32) | async fn get_repo_info(
method from (line 48) | fn from(error: AzCliError) -> Self {
method create_pr (line 73) | async fn create_pr(
method get_pr_status (line 132) | async fn get_pr_status(&self, pr_url: &str) -> Result<PullRequestInfo, G...
method list_prs_for_branch (line 164) | async fn list_prs_for_branch(
method get_pr_comments (line 208) | async fn get_pr_comments(
method list_open_prs (line 251) | async fn list_open_prs(
method provider_kind (line 260) | fn provider_kind(&self) -> ProviderKind {
FILE: crates/git-host/src/detection.rs
function detect_provider_from_url (line 11) | pub fn detect_provider_from_url(url: &str) -> ProviderKind {
function detect_provider_from_pr_url (line 46) | fn detect_provider_from_pr_url(pr_url: &str) -> ProviderKind {
function test_github_com_https (line 71) | fn test_github_com_https() {
function test_github_com_ssh (line 83) | fn test_github_com_ssh() {
function test_github_enterprise (line 91) | fn test_github_enterprise() {
function test_azure_devops_https (line 107) | fn test_azure_devops_https() {
function test_azure_devops_ssh (line 115) | fn test_azure_devops_ssh() {
function test_azure_devops_legacy_visualstudio (line 123) | fn test_azure_devops_legacy_visualstudio() {
function test_azure_devops_git_path (line 131) | fn test_azure_devops_git_path() {
function test_unknown_provider (line 140) | fn test_unknown_provider() {
function test_pr_url_github (line 152) | fn test_pr_url_github() {
function test_pr_url_azure (line 164) | fn test_pr_url_azure() {
FILE: crates/git-host/src/github/cli.rs
type GitHubRepoInfo (line 26) | pub struct GitHubRepoInfo {
method repo_spec (line 34) | pub fn repo_spec(&self) -> String {
type GhRepoViewResponse (line 43) | struct GhRepoViewResponse {
type GhRepoOwner (line 50) | struct GhRepoOwner {
type GhCommentResponse (line 56) | struct GhCommentResponse {
type GhCommentsWrapper (line 69) | struct GhCommentsWrapper {
type GhUserLogin (line 74) | struct GhUserLogin {
type GhReviewCommentResponse (line 79) | struct GhReviewCommentResponse {
type GhMergeCommit (line 98) | struct GhMergeCommit {
type GhPrResponse (line 104) | struct GhPrResponse {
type GhPrListExtendedResponse (line 115) | struct GhPrListExtendedResponse {
type GhCliError (line 125) | pub enum GhCliError {
type GhCli (line 137) | pub struct GhCli;
method new (line 140) | pub fn new() -> Self {
method ensure_available (line 145) | fn ensure_available(&self) -> Result<(), GhCliError> {
method run (line 150) | fn run<I, S>(&self, args: I, dir: Option<&Path>) -> Result<String, GhC...
method get_repo_info (line 194) | pub fn get_repo_info(
method parse_repo_info_response (line 206) | fn parse_repo_info_response(raw: &str) -> Result<GitHubRepoInfo, GhCli...
method create_pr (line 227) | pub fn create_pr(
method view_pr (line 266) | pub fn view_pr(&self, pr_url: &str) -> Result<PullRequestInfo, GhCliEr...
method list_prs_for_branch (line 281) | pub fn list_prs_for_branch(
method list_open_prs (line 305) | pub fn list_open_prs(&self, owner: &str, repo: &str) -> Result<Vec<Ope...
method get_pr_comments (line 323) | pub fn get_pr_comments(
method get_pr_review_comments (line 345) | pub fn get_pr_review_comments(
method pr_checkout (line 365) | pub fn pr_checkout(
method parse_pr_create_text (line 388) | fn parse_pr_create_text(raw: &str) -> Result<PullRequestInfo, GhCliErr...
method parse_pr_view (line 428) | fn parse_pr_view(raw: &str) -> Result<PullRequestInfo, GhCliError> {
method parse_pr_list (line 437) | fn parse_pr_list(raw: &str) -> Result<Vec<PullRequestInfo>, GhCliError> {
method parse_open_pr_list (line 446) | fn parse_open_pr_list(raw: &str) -> Result<Vec<OpenPrInfo>, GhCliError> {
method pr_response_to_info (line 465) | fn pr_response_to_info(pr: GhPrResponse) -> PullRequestInfo {
method parse_pr_comments (line 485) | fn parse_pr_comments(raw: &str) -> Result<Vec<PrComment>, GhCliError> {
method parse_pr_review_comments (line 511) | fn parse_pr_review_comments(raw: &str) -> Result<Vec<PrReviewComment>,...
FILE: crates/git-host/src/github/mod.rs
type GitHubProvider (line 24) | pub struct GitHubProvider {
method new (line 29) | pub fn new() -> Result<Self, GitHostError> {
method get_repo_info (line 35) | async fn get_repo_info(
method fetch_general_comments (line 51) | async fn fetch_general_comments(
method fetch_review_comments (line 91) | async fn fetch_review_comments(
method from (line 134) | fn from(error: GhCliError) -> Self {
method create_pr (line 159) | async fn create_pr(
method get_pr_status (line 224) | async fn get_pr_status(&self, pr_url: &str) -> Result<PullRequestInfo, G...
method list_prs_for_branch (line 258) | async fn list_prs_for_branch(
method get_pr_comments (line 301) | async fn get_pr_comments(
method list_open_prs (line 356) | async fn list_open_prs(
method provider_kind (line 397) | fn provider_kind(&self) -> ProviderKind {
FILE: crates/git-host/src/lib.rs
type GitHostProvider (line 22) | pub trait GitHostProvider: Send + Sync {
method create_pr (line 23) | async fn create_pr(
method get_pr_status (line 30) | async fn get_pr_status(&self, pr_url: &str) -> Result<PullRequestInfo,...
method list_prs_for_branch (line 32) | async fn list_prs_for_branch(
method get_pr_comments (line 39) | async fn get_pr_comments(
method list_open_prs (line 46) | async fn list_open_prs(
method provider_kind (line 52) | fn provider_kind(&self) -> ProviderKind;
type GitHostService (line 56) | pub enum GitHostService {
method from_url (line 62) | pub fn from_url(url: &str) -> Result<Self, GitHostError> {
FILE: crates/git-host/src/types.rs
type ProviderKind (line 8) | pub enum ProviderKind {
method fmt (line 15) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
type CreatePrRequest (line 25) | pub struct CreatePrRequest {
type GitHostError (line 36) | pub enum GitHostError {
method should_retry (line 58) | pub fn should_retry(&self) -> bool {
type PrCommentAuthor (line 72) | pub struct PrCommentAuthor {
type PrComment (line 78) | pub struct PrComment {
type ReviewCommentUser (line 88) | pub struct ReviewCommentUser {
type PrReviewComment (line 93) | pub struct PrReviewComment {
type UnifiedPrComment (line 109) | pub enum UnifiedPrComment {
method created_at (line 133) | pub fn created_at(&self) -> DateTime<Utc> {
type OpenPrInfo (line 142) | pub struct OpenPrInfo {
FILE: crates/git/src/cli.rs
type GitCliError (line 31) | pub enum GitCliError {
type GitCli (line 45) | pub struct GitCli;
method new (line 81) | pub fn new() -> Self {
method worktree_add (line 85) | pub fn worktree_add(
method worktree_remove (line 111) | pub fn worktree_remove(
method worktree_move (line 128) | pub fn worktree_move(
method worktree_prune (line 152) | pub fn worktree_prune(&self, repo_path: &Path) -> Result<(), GitCliErr...
method has_changes (line 158) | pub fn has_changes(&self, worktree_path: &Path) -> Result<bool, GitCli...
method diff_status (line 168) | pub fn diff_status(
method get_worktree_status (line 231) | pub fn get_worktree_status(&self, worktree_path: &Path) -> Result<Work...
method add_all (line 291) | pub fn add_all(&self, worktree_path: &Path) -> Result<(), GitCliError> {
method list_worktrees (line 299) | pub fn list_worktrees(&self, repo_path: &Path) -> Result<Vec<WorktreeE...
method commit (line 341) | pub fn commit(&self, worktree_path: &Path, message: &str) -> Result<()...
method fetch_with_refspec (line 346) | pub fn fetch_with_refspec(
method push (line 368) | pub fn push(
method check_remote_branch_exists (line 396) | pub fn check_remote_branch_exists(
method delete_branch (line 419) | pub fn delete_branch(&self, repo_path: &Path, branch_name: &str) -> Re...
method get_remote_url (line 425) | pub fn get_remote_url(
method list_remotes (line 436) | pub fn list_remotes(&self, repo_path: &Path) -> Result<Vec<(String, St...
method parse_name_status (line 468) | fn parse_name_status(output: &str) -> Vec<StatusDiffEntry> {
method merge_base (line 514) | pub fn merge_base(
method rebase_onto (line 527) | pub fn rebase_onto(
method is_rebase_in_progress (line 555) | pub fn is_rebase_in_progress(&self, worktree_path: &Path) -> Result<bo...
method is_merge_in_progress (line 564) | pub fn is_merge_in_progress(&self, worktree_path: &Path) -> Result<boo...
method is_cherry_pick_in_progress (line 573) | pub fn is_cherry_pick_in_progress(&self, worktree_path: &Path) -> Resu...
method is_revert_in_progress (line 582) | pub fn is_revert_in_progress(&self, worktree_path: &Path) -> Result<bo...
method abort_rebase (line 592) | pub fn abort_rebase(&self, worktree_path: &Path) -> Result<(), GitCliE...
method quit_rebase (line 603) | pub fn quit_rebase(&self, worktree_path: &Path) -> Result<(), GitCliEr...
method continue_rebase (line 612) | pub fn continue_rebase(&self, worktree_path: &Path) -> Result<(), GitC...
method has_staged_changes (line 623) | pub fn has_staged_changes(&self, repo_path: &Path) -> Result<bool, Git...
method merge_squash_commit (line 646) | pub fn merge_squash_commit(
method update_ref (line 665) | pub fn update_ref(
method abort_merge (line 675) | pub fn abort_merge(&self, worktree_path: &Path) -> Result<(), GitCliEr...
method abort_cherry_pick (line 682) | pub fn abort_cherry_pick(&self, worktree_path: &Path) -> Result<(), Gi...
method abort_revert (line 690) | pub fn abort_revert(&self, worktree_path: &Path) -> Result<(), GitCliE...
method get_conflicted_files (line 698) | pub fn get_conflicted_files(&self, worktree_path: &Path) -> Result<Vec...
method classify_cli_error (line 714) | fn classify_cli_error(&self, msg: String) -> GitCliError {
method ensure_available (line 733) | fn ensure_available(&self) -> Result<(), GitCliError> {
method git_impl (line 761) | fn git_impl<I, S>(
method git (line 840) | pub fn git<I, S>(&self, repo_path: &Path, args: I) -> Result<String, G...
method git_with_env (line 849) | fn git_with_env<I, S>(
method git_with_stdin (line 863) | fn git_with_stdin<I, S>(
method apply_default_excludes (line 878) | fn apply_default_excludes<I, S>(args: I) -> Vec<OsString>
method apply_pathspec_filter (line 886) | fn apply_pathspec_filter<I, S>(args: I, pathspecs: Option<&Vec<String>...
method build_pathspec_filter (line 903) | fn build_pathspec_filter(pathspecs: Option<&Vec<String>>) -> Vec<OsStr...
method get_default_pathspec_excludes (line 917) | fn get_default_pathspec_excludes() -> Vec<OsString> {
type ChangeType (line 49) | pub enum ChangeType {
type StatusDiffEntry (line 62) | pub struct StatusDiffEntry {
type WorktreeEntry (line 70) | pub struct WorktreeEntry {
type StatusDiffOptions (line 76) | pub struct StatusDiffOptions {
type StatusEntry (line 926) | pub struct StatusEntry {
type WorktreeStatus (line 941) | pub struct WorktreeStatus {
FILE: crates/git/src/lib.rs
type FileStat (line 23) | pub struct FileStat {
type GitServiceError (line 33) | pub enum GitServiceError {
type GitService (line 58) | pub struct GitService {}
method new (line 171) | pub fn new() -> Self {
method is_branch_name_valid (line 175) | pub fn is_branch_name_valid(&self, name: &str) -> bool {
method open_repo (line 180) | pub fn open_repo(&self, repo_path: &Path) -> Result<Repository, GitSer...
method ensure_cli_commit_identity (line 186) | fn ensure_cli_commit_identity(&self, repo_path: &Path) -> Result<(), G...
method signature_with_fallback (line 200) | fn signature_with_fallback<'a>(
method default_remote (line 211) | fn default_remote(
method initialize_repo_with_main_branch (line 236) | pub fn initialize_repo_with_main_branch(
method ensure_main_branch_exists (line 260) | pub fn ensure_main_branch_exists(&self, repo_path: &Path) -> Result<()...
method create_initial_commit (line 279) | pub fn create_initial_commit(&self, repo: &Repository) -> Result<(), G...
method commit (line 304) | pub fn commit(&self, path: &Path, message: &str) -> Result<bool, GitSe...
method get_diffs (line 325) | pub fn get_diffs(
method convert_diff_to_file_diffs (line 446) | fn convert_diff_to_file_diffs(
method diff_path (line 585) | pub fn diff_path(diff: &Diff) -> String {
method blob_to_string (line 593) | fn blob_to_string(blob: &git2::Blob) -> Option<String> {
method read_file_to_string (line 604) | fn read_file_to_string(repo: &Repository, rel_path: &Path) -> Option<S...
method create_file_details (line 644) | fn create_file_details(
method status_entry_to_diff (line 678) | fn status_entry_to_diff(repo: &Repository, base_tree: &git2::Tree, e: ...
method find_checkout_path_for_branch (line 797) | fn find_checkout_path_for_branch(
method merge_changes (line 818) | pub fn merge_changes(
method get_branch_status_inner (line 917) | fn get_branch_status_inner(
method get_branch_status (line 936) | pub fn get_branch_status(
method get_base_commit (line 952) | pub fn get_base_commit(
method get_remote_branch_status (line 971) | pub fn get_remote_branch_status(
method is_worktree_clean (line 992) | pub fn is_worktree_clean(&self, worktree_path: &Path) -> Result<bool, ...
method check_worktree_clean (line 1002) | fn check_worktree_clean(&self, repo: &Repository) -> Result<(), GitSer...
method get_head_info (line 1048) | pub fn get_head_info(&self, repo_path: &Path) -> Result<HeadInfo, GitS...
method get_current_branch (line 1070) | pub fn get_current_branch(&self, repo_path: &Path) -> Result<String, g...
method get_branch_oid (line 1080) | pub fn get_branch_oid(
method get_fork_point (line 1091) | pub fn get_fork_point(
method get_commit_subject (line 1102) | pub fn get_commit_subject(
method ahead_behind_commits_by_oid (line 1116) | pub fn ahead_behind_commits_by_oid(
method get_worktree_status (line 1132) | pub fn get_worktree_status(
method get_worktree_change_counts (line 1142) | pub fn get_worktree_change_counts(
method reconcile_worktree_to_commit (line 1152) | pub fn reconcile_worktree_to_commit(
method reset_worktree_to_commit (line 1193) | pub fn reset_worktree_to_commit(
method add_worktree (line 1220) | pub fn add_worktree(
method remove_worktree (line 1234) | pub fn remove_worktree(
method move_worktree (line 1247) | pub fn move_worktree(
method prune_worktrees (line 1259) | pub fn prune_worktrees(&self, repo_path: &Path) -> Result<(), GitServi...
method delete_branch (line 1266) | pub fn delete_branch(
method get_all_branches (line 1277) | pub fn get_all_branches(&self, repo_path: &Path) -> Result<Vec<GitBran...
method perform_squash_merge (line 1342) | fn perform_squash_merge(
method rebase_branch (line 1389) | pub fn rebase_branch(
method find_branch_type (line 1485) | pub fn find_branch_type(
method check_branch_exists (line 1504) | pub fn check_branch_exists(
method rename_local_branch (line 1519) | pub fn rename_local_branch(
method is_rebase_in_progress (line 1539) | pub fn is_rebase_in_progress(&self, worktree_path: &Path) -> Result<bo...
method detect_conflict_op (line 1546) | pub fn detect_conflict_op(
method get_conflicted_files (line 1570) | pub fn get_conflicted_files(
method abort_rebase (line 1581) | pub fn abort_rebase(&self, worktree_path: &Path) -> Result<(), GitServ...
method continue_rebase (line 1589) | pub fn continue_rebase(&self, worktree_path: &Path) -> Result<(), GitS...
method abort_conflicts (line 1596) | pub fn abort_conflicts(&self, worktree_path: &Path) -> Result<(), GitS...
method find_branch (line 1633) | pub fn find_branch<'a>(
method get_remote_from_branch_name (line 1650) | pub fn get_remote_from_branch_name(
method get_remote_url (line 1671) | pub fn get_remote_url(
method get_default_remote (line 1681) | pub fn get_default_remote(&self, repo_path: &Path) -> Result<GitRemote...
method list_remotes (line 1686) | pub fn list_remotes(&self, repo_path: &Path) -> Result<Vec<GitRemote>,...
method check_remote_branch_exists (line 1696) | pub fn check_remote_branch_exists(
method fetch_branch (line 1708) | pub fn fetch_branch(
method resolve_remote_for_branch (line 1721) | pub fn resolve_remote_for_branch(
method get_remote_from_branch_ref (line 1730) | fn get_remote_from_branch_ref<'a>(
method push_to_remote (line 1755) | pub fn push_to_remote(
method fetch_from_remote (line 1791) | fn fetch_from_remote(
method fetch_branch_from_remote (line 1811) | fn fetch_branch_from_remote(
method fetch_all_from_remote (line 1829) | fn fetch_all_from_remote(
method clone_repository (line 1842) | pub fn clone_repository(
method collect_recent_file_stats (line 1897) | pub fn collect_recent_file_stats(
constant MAX_INLINE_DIFF_BYTES (line 62) | const MAX_INLINE_DIFF_BYTES: usize = 2 * 1024 * 1024;
type ConflictOp (line 67) | pub enum ConflictOp {
type GitBranch (line 75) | pub struct GitBranch {
type GitRemote (line 84) | pub struct GitRemote {
type HeadInfo (line 90) | pub struct HeadInfo {
type Commit (line 96) | pub struct Commit(git2::Oid);
method new (line 99) | pub fn new(id: git2::Oid) -> Self {
method as_oid (line 102) | pub fn as_oid(&self) -> git2::Oid {
method fmt (line 108) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
type WorktreeResetOptions (line 114) | pub struct WorktreeResetOptions {
method new (line 122) | pub fn new(
type WorktreeResetOutcome (line 138) | pub struct WorktreeResetOutcome {
type DiffTarget (line 144) | pub enum DiffTarget<'p> {
method default (line 164) | fn default() -> Self {
FILE: crates/git/src/validation.rs
function is_valid_branch_prefix (line 1) | pub fn is_valid_branch_prefix(prefix: &str) -> bool {
function test_valid_prefixes (line 18) | fn test_valid_prefixes() {
function test_invalid_prefixes (line 29) | fn test_invalid_prefixes() {
FILE: crates/git/tests/git_ops_safety.rs
function write_file (line 12) | fn write_file<P: AsRef<Path>>(base: P, rel: &str, content: &str) {
function commit_all (line 21) | fn commit_all(repo: &Repository, message: &str) {
function checkout_branch (line 45) | fn checkout_branch(repo: &Repository, name: &str) {
function create_branch_from_head (line 52) | fn create_branch_from_head(repo: &Repository, name: &str) {
function configure_user (line 57) | fn configure_user(repo: &Repository) {
function push_ref (line 63) | fn push_ref(repo: &Repository, local: &str, remote: &str) {
function add_path (line 72) | fn add_path(repo_path: &Path, path: &str) {
function setup_repo_with_worktree (line 80) | fn setup_repo_with_worktree(root: &TempDir) -> (PathBuf, PathBuf) {
function setup_conflict_repo_with_worktree (line 122) | fn setup_conflict_repo_with_worktree(root: &TempDir) -> (PathBuf, PathBu...
function setup_no_unique_feature_repo (line 166) | fn setup_no_unique_feature_repo(root: &TempDir) -> (PathBuf, PathBuf) {
function setup_direct_conflict_repo (line 202) | fn setup_direct_conflict_repo(root: &TempDir) -> (PathBuf, PathBuf) {
function push_reports_non_fast_forward (line 236) | fn push_reports_non_fast_forward() {
function fetch_with_missing_ref_returns_error (line 297) | fn fetch_with_missing_ref_returns_error() {
function push_and_fetch_roundtrip_updates_tracking_branch (line 337) | fn push_and_fetch_roundtrip_updates_tracking_branch() {
function rebase_preserves_untracked_files (line 410) | fn rebase_preserves_untracked_files() {
function rebase_aborts_on_uncommitted_tracked_changes (line 432) | fn rebase_aborts_on_uncommitted_tracked_changes() {
function rebase_aborts_if_untracked_would_be_overwritten_by_base (line 453) | fn rebase_aborts_if_untracked_would_be_overwritten_by_base() {
function merge_does_not_overwrite_main_repo_untracked_files (line 477) | fn merge_does_not_overwrite_main_repo_untracked_files() {
function merge_does_not_touch_tracked_uncommitted_changes_in_base_worktree (line 508) | fn merge_does_not_touch_tracked_uncommitted_changes_in_base_worktree() {
function merge_refuses_with_staged_changes_on_base (line 555) | fn merge_refuses_with_staged_changes_on_base() {
function merge_preserves_unstaged_changes_on_base (line 577) | fn merge_preserves_unstaged_changes_on_base() {
function update_ref_does_not_destroy_feature_worktree_dirty_state (line 602) | fn update_ref_does_not_destroy_feature_worktree_dirty_state() {
function libgit2_merge_updates_base_ref_in_both_repos (line 632) | fn libgit2_merge_updates_base_ref_in_both_repos() {
function libgit2_merge_updates_task_ref_and_feature_head_preserves_dirty (line 656) | fn libgit2_merge_updates_task_ref_and_feature_head_preserves_dirty() {
function rebase_refuses_to_abort_existing_rebase (line 687) | fn rebase_refuses_to_abort_existing_rebase() {
function rebase_fast_forwards_when_no_unique_commits (line 717) | fn rebase_fast_forwards_when_no_unique_commits() {
function rebase_applies_multiple_commits_onto_ahead_base (line 739) | fn rebase_applies_multiple_commits_onto_ahead_base() {
function merge_when_base_ahead_and_feature_ahead_fails (line 773) | fn merge_when_base_ahead_and_feature_ahead_fails() {
function merge_conflict_does_not_move_base_ref (line 814) | fn merge_conflict_does_not_move_base_ref() {
function merge_delete_vs_modify_conflict_behaves_safely (line 839) | fn merge_delete_vs_modify_conflict_behaves_safely() {
function rebase_preserves_rename_changes (line 884) | fn rebase_preserves_rename_changes() {
function merge_refreshes_main_worktree_when_on_base (line 915) | fn merge_refreshes_main_worktree_when_on_base() {
function sparse_checkout_respected_in_worktree_diffs_and_commit (line 949) | fn sparse_checkout_respected_in_worktree_diffs_and_commit() {
function worktree_diff_ignores_commits_where_base_branch_is_ahead (line 1029) | fn worktree_diff_ignores_commits_where_base_branch_is_ahead() {
function init_repo_only_service (line 1073) | fn init_repo_only_service(root: &TempDir) -> PathBuf {
function merge_binary_conflict_does_not_move_ref (line 1084) | fn merge_binary_conflict_does_not_move_ref() {
function merge_rename_vs_modify_conflict_does_not_move_ref (line 1115) | fn merge_rename_vs_modify_conflict_does_not_move_ref() {
function merge_leaves_no_staged_changes_on_target_branch (line 1179) | fn merge_leaves_no_staged_changes_on_target_branch() {
function worktree_to_worktree_merge_leaves_no_staged_changes (line 1224) | fn worktree_to_worktree_merge_leaves_no_staged_changes() {
function merge_into_orphaned_branch_uses_libgit2_fallback (line 1294) | fn merge_into_orphaned_branch_uses_libgit2_fallback() {
function merge_base_ahead_of_task_should_error (line 1357) | fn merge_base_ahead_of_task_should_error() {
FILE: crates/git/tests/git_workflow.rs
function add_path (line 12) | fn add_path(repo_path: &Path, path: &str) {
function get_commit_author (line 17) | fn get_commit_author(repo_path: &Path, commit_sha: &str) -> (Option<Stri...
function get_head_author (line 28) | fn get_head_author(repo_path: &Path) -> (Option<String>, Option<String>) {
function write_file (line 40) | fn write_file<P: AsRef<Path>>(base: P, rel: &str, content: &str) {
function configure_user (line 49) | fn configure_user(repo_path: &Path, name: &str, email: &str) {
function init_repo_main (line 56) | fn init_repo_main(root: &TempDir) -> PathBuf {
function checkout_branch (line 65) | fn checkout_branch(repo_path: &Path, name: &str) {
function create_branch (line 73) | fn create_branch(repo_path: &Path, name: &str) {
function commit_empty_message_behaviour (line 80) | fn commit_empty_message_behaviour() {
function has_global_git_identity (line 94) | fn has_global_git_identity() -> bool {
function initialize_repo_without_user_creates_initial_commit (line 104) | fn initialize_repo_without_user_creates_initial_commit() {
function commit_without_user_config_succeeds (line 124) | fn commit_without_user_config_succeeds() {
function commit_fails_when_index_locked (line 136) | fn commit_fails_when_index_locked() {
function staged_but_uncommitted_changes_is_dirty (line 150) | fn staged_but_uncommitted_changes_is_dirty() {
function worktree_clean_detects_staged_deleted_and_renamed (line 164) | fn worktree_clean_detects_staged_deleted_and_renamed() {
function diff_added_binary_file_has_no_content (line 184) | fn diff_added_binary_file_has_no_content() {
function initialize_and_default_branch_and_head_info (line 218) | fn initialize_and_default_branch_and_head_info() {
function commit_and_is_worktree_clean (line 232) | fn commit_and_is_worktree_clean() {
function commit_in_detached_head_succeeds_via_service (line 260) | fn commit_in_detached_head_succeeds_via_service() {
function branch_status_ahead_and_behind (line 278) | fn branch_status_ahead_and_behind() {
function get_all_branches_lists_current_and_others (line 312) | fn get_all_branches_lists_current_and_others() {
function get_branch_diffs_between_branches (line 328) | fn get_branch_diffs_between_branches() {
function worktree_diff_respects_path_filter (line 357) | fn worktree_diff_respects_path_filter() {
function get_branch_oid_nonexistent_errors (line 399) | fn get_branch_oid_nonexistent_errors() {
function create_unicode_branch_and_list (line 408) | fn create_unicode_branch_and_list() {
function worktree_diff_permission_only_change (line 429) | fn worktree_diff_permission_only_change() {
function squash_merge_libgit2_sets_author_without_user (line 467) | fn squash_merge_libgit2_sets_author_without_user() {
FILE: crates/local-deployment/build.rs
function main (line 3) | fn main() {
FILE: crates/local-deployment/src/command.rs
function kill_process_group (line 4) | pub async fn kill_process_group(child: &mut AsyncGroupChild) -> Result<(...
FILE: crates/local-deployment/src/container.rs
constant WORKSPACE_TOUCH_DEBOUNCE (line 66) | const WORKSPACE_TOUCH_DEBOUNCE: Duration = Duration::from_mins(2);
type LocalContainerService (line 69) | pub struct LocalContainerService {
method new (line 92) | pub async fn new(
method map_workspace_manager_error (line 135) | fn map_workspace_manager_error(err: WorkspaceError) -> ContainerError {
method workspace_repo_inputs (line 160) | async fn workspace_repo_inputs(
method get_child_from_store (line 196) | pub async fn get_child_from_store(&self, id: &Uuid) -> Option<Arc<RwLo...
method add_child_to_store (line 201) | pub async fn add_child_to_store(&self, id: Uuid, exec: AsyncGroupChild) {
method remove_child_from_store (line 206) | pub async fn remove_child_from_store(&self, id: &Uuid) {
method add_cancellation_token (line 211) | async fn add_cancellation_token(&self, id: Uuid, token: CancellationTo...
method take_cancellation_token (line 216) | async fn take_cancellation_token(&self, id: &Uuid) -> Option<Cancellat...
method add_db_stream_handle (line 221) | async fn add_db_stream_handle(&self, id: Uuid, handle: JoinHandle<()>) {
method take_db_stream_handle (line 226) | async fn take_db_stream_handle(&self, id: &Uuid) -> Option<JoinHandle<...
method add_exit_monitor_handle (line 231) | async fn add_exit_monitor_handle(&self, id: Uuid, handle: JoinHandle<(...
method take_exit_monitor_handle (line 236) | async fn take_exit_monitor_handle(&self, id: &Uuid) -> Option<JoinHand...
method cleanup_workspace (line 241) | pub async fn cleanup_workspace(&self, workspace: &Workspace) {
method cleanup_expired_workspaces (line 276) | pub async fn cleanup_expired_workspaces(&self) -> Result<(), Deploymen...
method spawn_workspace_cleanup (line 299) | pub fn spawn_workspace_cleanup(&self) {
method update_after_head_commits (line 325) | async fn update_after_head_commits(&self, exec_id: Uuid) {
method get_commit_message (line 344) | async fn get_commit_message(&self, ctx: &ExecutionContext) -> String {
method check_repos_for_changes (line 390) | fn check_repos_for_changes(
method has_commits_from_execution (line 421) | async fn has_commits_from_execution(
method commit_repos (line 451) | fn commit_repos(&self, repos_with_changes: Vec<(Repo, PathBuf)>, messa...
method spawn_exit_monitor (line 480) | pub fn spawn_exit_monitor(
method spawn_os_exit_watcher (line 809) | pub fn spawn_os_exit_watcher(
method dir_name_from_workspace (line 846) | pub fn dir_name_from_workspace(workspace_id: &Uuid, task_title: &str) ...
method track_child_msgs_in_store (line 851) | async fn track_child_msgs_in_store(&self, id: Uuid, child: &mut AsyncG...
method create_live_diff_stream (line 877) | async fn create_live_diff_stream(
method extract_last_assistant_message (line 887) | fn extract_last_assistant_message(&self, exec_id: &Uuid) -> Option<Str...
method update_executor_session_summary (line 918) | async fn update_executor_session_summary(&self, exec_id: &Uuid) -> Res...
method copy_files_and_images (line 938) | async fn copy_files_and_images(
method create_workspace_config_files (line 984) | async fn create_workspace_config_files(
method start_queued_follow_up (line 1038) | async fn start_queued_follow_up(
function failure_exit_status (line 1111) | fn failure_exit_status() -> std::process::ExitStatus {
method msg_stores (line 1126) | fn msg_stores(&self) -> &Arc<RwLock<HashMap<Uuid, Arc<MsgStore>>>> {
method db (line 1130) | fn db(&self) -> &DBService {
method git (line 1134) | fn git(&self) -> &GitService {
method notification_service (line 1138) | fn notification_service(&self) -> &NotificationService {
method touch (line 1142) | async fn touch(&self, workspace: &Workspace) -> Result<(), ContainerErro...
method store_db_stream_handle (line 1175) | async fn store_db_stream_handle(&self, id: Uuid, handle: JoinHandle<()>) {
method take_db_stream_handle (line 1179) | async fn take_db_stream_handle(&self, id: &Uuid) -> Option<JoinHandle<()...
method git_branch_prefix (line 1183) | async fn git_branch_prefix(&self) -> String {
method workspace_to_current_dir (line 1187) | fn workspace_to_current_dir(&self, workspace: &Workspace) -> PathBuf {
method create (line 1191) | async fn create(&self, workspace: &Workspace) -> Result<ContainerRef, Co...
method delete (line 1227) | async fn delete(&self, workspace: &Workspace) -> Result<(), ContainerErr...
method ensure_container_exists (line 1233) | async fn ensure_container_exists(
method is_container_clean (line 1279) | async fn is_container_clean(&self, workspace: &Workspace) -> Result<bool...
method start_execution_inner (line 1306) | async fn start_execution_inner(
method stop_execution (line 1390) | async fn stop_execution(
method stream_diff (line 1464) | async fn stream_diff(
method try_commit_changes (line 1539) | async fn try_commit_changes(&self, ctx: &ExecutionContext) -> Result<boo...
method copy_project_files (line 1567) | async fn copy_project_files(
method kill_all_running_processes (line 1588) | async fn kill_all_running_processes(&self) -> Result<(), ContainerError> {
function success_exit_status (line 1620) | fn success_exit_status() -> std::process::ExitStatus {
FILE: crates/local-deployment/src/copy.rs
function normalize_pattern (line 12) | fn normalize_pattern(pattern: &str) -> String {
function copy_project_files_impl (line 18) | pub(crate) fn copy_project_files_impl(
function copy_single_file (line 76) | fn copy_single_file(
function test_copy_project_files_mixed_patterns (line 125) | fn test_copy_project_files_mixed_patterns() {
function test_copy_project_files_nonexistent_pattern_ok (line 156) | fn test_copy_project_files_nonexistent_pattern_ok() {
function test_copy_project_files_empty_pattern_ok (line 168) | fn test_copy_project_files_empty_pattern_ok() {
function test_copy_project_files_whitespace_handling (line 179) | fn test_copy_project_files_whitespace_handling() {
function test_copy_project_files_nested_directory (line 191) | fn test_copy_project_files_nested_directory() {
function test_copy_project_files_outside_source_skips_without_copying (line 210) | fn test_copy_project_files_outside_source_skips_without_copying() {
function test_copy_project_files_recursive_glob_extension_filter (line 227) | fn test_copy_project_files_recursive_glob_extension_filter() {
function test_copy_project_files_duplicate_patterns_ok (line 270) | fn test_copy_project_files_duplicate_patterns_ok() {
function test_copy_project_files_single_file_path (line 294) | fn test_copy_project_files_single_file_path() {
function test_symlink_loop_is_skipped (line 314) | fn test_symlink_loop_is_skipped() {
FILE: crates/local-deployment/src/lib.rs
type LocalDeployment (line 44) | pub struct LocalDeployment {
method workspace_manager (line 329) | pub fn workspace_manager(&self) -> &WorkspaceManager {
method remote_client (line 333) | pub fn remote_client(&self) -> Result<RemoteClient, RemoteClientNotCon...
method get_login_status (line 337) | pub async fn get_login_status(&self) -> LoginStatus {
method store_oauth_handoff (line 367) | pub async fn store_oauth_handoff(
method take_oauth_handoff (line 382) | pub async fn take_oauth_handoff(&self, handoff_id: &Uuid) -> Option<(S...
method pty (line 390) | pub fn pty(&self) -> &PtyService {
type PendingHandoff (line 71) | struct PendingHandoff {
method new (line 78) | async fn new() -> Result<Self, DeploymentError> {
method user_id (line 251) | fn user_id(&self) -> &str {
method config (line 255) | fn config(&self) -> &Arc<RwLock<Config>> {
method db (line 259) | fn db(&self) -> &DBService {
method analytics (line 263) | fn analytics(&self) -> &Option<AnalyticsService> {
method container (line 267) | fn container(&self) -> &impl ContainerService {
method git (line 271) | fn git(&self) -> &GitService {
method repo (line 275) | fn repo(&self) -> &RepoService {
method file (line 279) | fn file(&self) -> &FileService {
method filesystem (line 283) | fn filesystem(&self) -> &FilesystemService {
method events (line 287) | fn events(&self) -> &EventService {
method file_search_cache (line 291) | fn file_search_cache(&self) -> &Arc<FileSearchCache> {
method approvals (line 295) | fn approvals(&self) -> &Approvals {
method queued_message_service (line 299) | fn queued_message_service(&self) -> &QueuedMessageService {
method auth_context (line 303) | fn auth_context(&self) -> &AuthContext {
method relay_control (line 307) | fn relay_control(&self) -> &Arc<RelayControl> {
method relay_signing (line 311) | fn relay_signing(&self) -> &RelaySigningService {
method server_info (line 315) | fn server_info(&self) -> &Arc<ServerInfo> {
method trusted_key_auth (line 319) | fn trusted_key_auth(&self) -> &TrustedKeyAuthRuntime {
method shared_api_base (line 323) | fn shared_api_base(&self) -> Option<String> {
FILE: crates/local-deployment/src/pty.rs
type PtyError (line 16) | pub enum PtyError {
type PtySession (line 29) | struct PtySession {
type PtyService (line 37) | pub struct PtyService {
method new (line 42) | pub fn new() -> Self {
method create_session (line 48) | pub async fn create_session(
method write (line 157) | pub async fn write(&self, session_id: Uuid, data: &[u8]) -> Result<(),...
method resize (line 183) | pub async fn resize(&self, session_id: Uuid, cols: u16, rows: u16) -> ...
method close_session (line 209) | pub async fn close_session(&self, session_id: Uuid) -> Result<(), PtyE...
method session_exists (line 221) | pub fn session_exists(&self, session_id: &Uuid) -> bool {
method default (line 230) | fn default() -> Self {
FILE: crates/mcp/src/bin/vibe_kanban_mcp.rs
constant HOST_ENV (line 9) | const HOST_ENV: &str = "MCP_HOST";
constant PORT_ENV (line 10) | const PORT_ENV: &str = "MCP_PORT";
type McpLaunchMode (line 13) | enum McpLaunchMode {
type LaunchConfig (line 19) | struct LaunchConfig {
function main (line 23) | fn main() -> anyhow::Result<()> {
function resolve_launch_config (line 52) | fn resolve_launch_config() -> anyhow::Result<LaunchConfig> {
function resolve_launch_config_from_iter (line 56) | fn resolve_launch_config_from_iter<I>(mut args: I) -> anyhow::Result<Lau...
function resolve_base_url (line 100) | async fn resolve_base_url(log_prefix: &str) -> anyhow::Result<String> {
function init_process_logging (line 136) | fn init_process_logging(log_prefix: &str, version: &str) {
function orchestrator_mode_does_not_require_session_id (line 164) | fn orchestrator_mode_does_not_require_session_id() {
function session_id_flag_is_rejected (line 179) | fn session_id_flag_is_rejected() {
FILE: crates/mcp/src/lib.rs
type ApiResponseEnvelope (line 4) | pub struct ApiResponseEnvelope<T> {
FILE: crates/mcp/src/task_server/handler.rs
method get_info (line 11) | fn get_info(&self) -> ServerInfo {
FILE: crates/mcp/src/task_server/mod.rs
type McpRepoContext (line 15) | pub struct McpRepoContext {
type McpContext (line 25) | pub struct McpContext {
type McpMode (line 44) | pub enum McpMode {
type McpServer (line 50) | pub struct McpServer {
method new_global (line 59) | pub fn new_global(base_url: &str) -> Self {
method new_orchestrator (line 69) | pub fn new_orchestrator(base_url: &str) -> Self {
method url (line 79) | fn url(&self, path: &str) -> String {
method init (line 87) | pub async fn init(mut self) -> anyhow::Result<Self> {
method mode (line 101) | pub fn mode(&self) -> &McpMode {
method fetch_context_at_startup (line 105) | async fn fetch_context_at_startup(&self) -> anyhow::Result<Option<McpC...
method try_fetch_attempt_context (line 122) | async fn try_fetch_attempt_context(
method build_mcp_context_from_workspace_context (line 155) | async fn build_mcp_context_from_workspace_context(&self, ctx: &Workspa...
method fetch_remote_workspace_context (line 190) | async fn fetch_remote_workspace_context(
method fetch_remote_organization_id (line 226) | async fn fetch_remote_organization_id(&self, project_id: Uuid) -> Opti...
FILE: crates/mcp/src/task_server/tools/context.rs
method get_context (line 10) | async fn get_context(&self) -> Result<CallToolResult, ErrorData> {
FILE: crates/mcp/src/task_server/tools/issue_assignees.rs
type McpListIssueAssigneesRequest (line 14) | struct McpListIssueAssigneesRequest {
type IssueAssigneeSummary (line 20) | struct IssueAssigneeSummary {
type McpListIssueAssigneesResponse (line 32) | struct McpListIssueAssigneesResponse {
type McpAssignIssueRequest (line 39) | struct McpAssignIssueRequest {
type McpAssignIssueResponse (line 47) | struct McpAssignIssueResponse {
type McpUnassignIssueRequest (line 52) | struct McpUnassignIssueRequest {
type McpUnassignIssueResponse (line 58) | struct McpUnassignIssueResponse {
method list_issue_assignees (line 66) | async fn list_issue_assignees(
method assign_issue (line 101) | async fn assign_issue(
method unassign_issue (line 124) | async fn unassign_issue(
FILE: crates/mcp/src/task_server/tools/issue_relationships.rs
type McpCreateIssueRelationshipRequest (line 14) | struct McpCreateIssueRelationshipRequest {
type McpCreateIssueRelationshipResponse (line 24) | struct McpCreateIssueRelationshipResponse {
type McpDeleteIssueRelationshipRequest (line 29) | struct McpDeleteIssueRelationshipRequest {
type McpDeleteIssueRelationshipResponse (line 37) | struct McpDeleteIssueRelationshipResponse {
method create_issue_relationship (line 47) | async fn create_issue_relationship(
method delete_issue_relationship (line 75) | async fn delete_issue_relationship(
FILE: crates/mcp/src/task_server/tools/issue_tags.rs
type McpListTagsRequest (line 14) | struct McpListTagsRequest {
type TagSummary (line 22) | struct TagSummary {
type McpListTagsResponse (line 34) | struct McpListTagsResponse {
type McpListIssueTagsRequest (line 41) | struct McpListIssueTagsRequest {
type IssueTagSummary (line 47) | struct IssueTagSummary {
type McpListIssueTagsResponse (line 57) | struct McpListIssueTagsResponse {
type McpAddIssueTagRequest (line 64) | struct McpAddIssueTagRequest {
type McpAddIssueTagResponse (line 72) | struct McpAddIssueTagResponse {
type McpRemoveIssueTagRequest (line 77) | struct McpRemoveIssueTagRequest {
type McpRemoveIssueTagResponse (line 83) | struct McpRemoveIssueTagResponse {
method list_tags (line 93) | async fn list_tags(
method list_issue_tags (line 127) | async fn list_issue_tags(
method add_issue_tag (line 155) | async fn add_issue_tag(
method remove_issue_tag (line 178) | async fn remove_issue_tag(
FILE: crates/mcp/src/task_server/tools/mod.rs
method global_mode_router (line 29) | pub fn global_mode_router() -> rmcp::handler::server::tool::ToolRouter<S...
method orchestrator_mode_router (line 43) | pub fn orchestrator_mode_router() -> rmcp::handler::server::tool::ToolRo...
method orchestrator_session_id (line 54) | fn orchestrator_session_id(&self) -> Option<Uuid> {
method scoped_workspace_id (line 60) | fn scoped_workspace_id(&self) -> Option<Uuid> {
method success (line 64) | fn success<T: Serialize>(data: &T) -> Result<CallToolResult, ErrorData> {
method err_value (line 71) | fn err_value(v: serde_json::Value) -> Result<CallToolResult, ErrorData> {
method err (line 78) | fn err<S: Into<String>>(msg: S, details: Option<S>) -> Result<CallToolRe...
method send_json (line 86) | async fn send_json<T: DeserializeOwned>(
method send_empty_json (line 116) | async fn send_empty_json(&self, rb: reqwest::RequestBuilder) -> Result<(...
method resolve_workspace_id (line 147) | fn resolve_workspace_id(&self, explicit: Option<Uuid>) -> Result<Uuid, C...
method scope_allows_workspace (line 161) | fn scope_allows_workspace(&self, workspace_id: Uuid) -> Result<(), CallT...
method expand_tags (line 180) | async fn expand_tags(&self, text: &str) -> String {
method resolve_project_id (line 225) | fn resolve_project_id(&self, explicit: Option<Uuid>) -> Result<Uuid, Cal...
method resolve_organization_id (line 242) | fn resolve_organization_id(&self, explicit: Option<Uuid>) -> Result<Uuid...
method fetch_project_statuses (line 259) | async fn fetch_project_statuses(
method resolve_status_id (line 272) | async fn resolve_status_id(
method default_status_id (line 296) | async fn default_status_id(&self, project_id: Uuid) -> Result<Uuid, Call...
method resolve_status_name (line 309) | async fn resolve_status_name(&self, project_id: Uuid, status_id: Uuid) -...
method link_workspace_to_issue (line 321) | async fn link_workspace_to_issue(
method parse_executor_agent (line 338) | fn parse_executor_agent(executor: &str) -> Result<BaseCodingAgent, CallT...
method normalize_executor_name (line 345) | fn normalize_executor_name(executor: Option<&str>) -> Result<String, Cal...
method execution_process_status_label (line 361) | fn execution_process_status_label(status: &ExecutionProcessStatus) -> &'...
function install_rustls_provider (line 383) | fn install_rustls_provider() {
function tool_names (line 391) | fn tool_names(router: rmcp::handler::server::tool::ToolRouter<McpServer>...
function orchestrator_mode_exposes_only_scoped_workflow_tools (line 400) | fn orchestrator_mode_exposes_only_scoped_workflow_tools() {
function global_mode_keeps_workspace_admin_and_discovery_tools (line 416) | fn global_mode_keeps_workspace_admin_and_discovery_tools() {
function orchestrator_session_id_is_resolved_from_context (line 425) | fn orchestrator_session_id_is_resolved_from_context() {
function orchestrator_scope_requires_context_when_missing (line 454) | fn orchestrator_scope_requires_context_when_missing() {
function global_context_omits_orchestrator_session_id_from_serialized_output (line 470) | fn global_context_omits_orchestrator_session_id_from_serialized_output() {
FILE: crates/mcp/src/task_server/tools/organizations.rs
type OrganizationSummary (line 12) | struct OrganizationSummary {
type McpListOrganizationsResponse (line 24) | struct McpListOrganizationsResponse {
type McpListOrgMembersRequest (line 30) | struct McpListOrgMembersRequest {
type OrganizationMemberSummary (line 38) | struct OrganizationMemberSummary {
type McpListOrgMembersResponse (line 58) | struct McpListOrgMembersResponse {
method list_organizations (line 67) | async fn list_organizations(&self) -> Result<CallToolResult, ErrorData> {
method list_org_members (line 95) | async fn list_org_members(
FILE: crates/mcp/src/task_server/tools/remote_issues.rs
type McpCreateIssueRequest (line 19) | struct McpCreateIssueRequest {
type McpCreateIssueResponse (line 37) | struct McpCreateIssueResponse {
type McpListIssuesRequest (line 42) | struct McpListIssuesRequest {
type IssueSummary (line 78) | struct IssueSummary {
type PullRequestSummary (line 106) | struct PullRequestSummary {
type McpTagSummary (line 120) | struct McpTagSummary {
type McpRelationshipSummary (line 130) | struct McpRelationshipSummary {
type McpSubIssueSummary (line 142) | struct McpSubIssueSummary {
type IssueDetails (line 154) | struct IssueDetails {
type McpListIssuesResponse (line 192) | struct McpListIssuesResponse {
type McpUpdateIssueRequest (line 202) | struct McpUpdateIssueRequest {
type McpUpdateIssueResponse (line 222) | struct McpUpdateIssueResponse {
type McpDeleteIssueRequest (line 227) | struct McpDeleteIssueRequest {
type McpDeleteIssueResponse (line 233) | struct McpDeleteIssueResponse {
type McpGetIssueRequest (line 238) | struct McpGetIssueRequest {
type McpGetIssueResponse (line 244) | struct McpGetIssueResponse {
type McpListIssuePrioritiesResponse (line 249) | struct McpListIssuePrioritiesResponse {
method create_issue (line 258) | async fn create_issue(
method list_issues (line 322) | async fn list_issues(
method get_issue (line 468) | async fn get_issue(
method update_issue (line 486) | async fn update_issue(
method list_issue_priorities (line 559) | async fn list_issue_priorities(&self) -> Result<CallToolResult, ErrorDat...
method delete_issue (line 569) | async fn delete_issue(
method parse_issue_sort_field (line 585) | fn parse_issue_sort_field(sort_field: Option<&str>) -> Result<IssueSortF...
method parse_sort_direction (line 603) | fn parse_sort_direction(sort_direction: Option<&str>) -> Result<SortDire...
method issue_to_summary (line 623) | fn issue_to_summary(
method issue_to_details (line 651) | async fn issue_to_details(
method fetch_pull_requests (line 704) | async fn fetch_pull_requests(&self, issue_id: Uuid) -> ListPullRequestsR...
method fetch_issue_tags_resolved (line 718) | async fn fetch_issue_tags_resolved(
method fetch_issue_relationships_resolved (line 752) | async fn fetch_issue_relationships_resolved(
method fetch_sub_issues (line 810) | async fn fetch_sub_issues(
method parse_issue_priority (line 852) | fn parse_issue_priority(priority: &str) -> Result<IssuePriority, CallToo...
method issue_priority_label (line 869) | fn issue_priority_label(priority: IssuePriority) -> &'static str {
method find_tag_ids_by_name (line 878) | async fn find_tag_ids_by_name(
method matching_ids_by_name (line 891) | fn matching_ids_by_name<'a>(
method resolve_tag_filters (line 902) | fn resolve_tag_filters(
function collects_all_matching_status_ids_case_insensitively (line 933) | fn collects_all_matching_status_ids_case_insensitively() {
function collects_all_matching_tag_ids_case_insensitively (line 949) | fn collects_all_matching_tag_ids_case_insensitively() {
function resolve_tag_filters_requires_explicit_tag_id_to_match_tag_name (line 965) | fn resolve_tag_filters_requires_explicit_tag_id_to_match_tag_name() {
function resolve_tag_filters_preserves_exact_tag_id_intersection (line 976) | fn resolve_tag_filters_preserves_exact_tag_id_intersection() {
FILE: crates/mcp/src/task_server/tools/remote_projects.rs
type McpListProjectsRequest (line 12) | struct McpListProjectsRequest {
type ProjectSummary (line 18) | struct ProjectSummary {
method from_remote_project (line 30) | fn from_remote_project(project: api_types::Project) -> Self {
type McpListProjectsResponse (line 41) | struct McpListProjectsResponse {
method list_projects (line 49) | async fn list_projects(
FILE: crates/mcp/src/task_server/tools/repos.rs
type McpRepoSummary (line 12) | struct McpRepoSummary {
type GetRepoRequest (line 20) | struct GetRepoRequest {
type RepoDetails (line 26) | struct RepoDetails {
type UpdateSetupScriptRequest (line 42) | struct UpdateSetupScriptRequest {
type UpdateCleanupScriptRequest (line 50) | struct UpdateCleanupScriptRequest {
type UpdateDevServerScriptRequest (line 58) | struct UpdateDevServerScriptRequest {
type UpdateRepoScriptResponse (line 66) | struct UpdateRepoScriptResponse {
type ListReposResponse (line 76) | struct ListReposResponse {
method list_repos (line 84) | async fn list_repos(&self) -> Result<CallToolResult, ErrorData> {
method get_repo (line 110) | async fn get_repo(
method update_setup_script (line 132) | async fn update_setup_script(
method update_cleanup_script (line 161) | async fn update_cleanup_script(
method update_dev_server_script (line 190) | async fn update_dev_server_script(
FILE: crates/mcp/src/task_server/tools/sessions.rs
type CreateSessionRequest (line 15) | struct CreateSessionRequest {
type CreateSessionPayload (line 27) | struct CreateSessionPayload {
type SessionSummary (line 34) | struct SessionSummary {
type CreateSessionResponse (line 52) | struct CreateSessionResponse {
type ListSessionsRequest (line 57) | struct ListSessionsRequest {
type ListSessionsResponse (line 65) | struct ListSessionsResponse {
type RunCodingAgentInSessionRequest (line 73) | struct RunCodingAgentInSessionRequest {
type FollowUpPayload (line 81) | struct FollowUpPayload {
type ExecutorConfigPayload (line 90) | struct ExecutorConfigPayload {
type RunCodingAgentInSessionResponse (line 100) | struct RunCodingAgentInSessionResponse {
type UpdateSessionRequest (line 107) | struct UpdateSessionRequest {
type UpdateSessionPayload (line 115) | struct UpdateSessionPayload {
type UpdateSessionResponse (line 120) | struct UpdateSessionResponse {
type GetExecutionRequest (line 127) | struct GetExecutionRequest {
type GetExecutionResponse (line 133) | struct GetExecutionResponse {
method create_session (line 146) | async fn create_session(
method list_sessions (line 194) | async fn list_sessions(
method update_session (line 225) | async fn update_session(
method run_session_prompt (line 258) | async fn run_session_prompt(
method get_execution (line 321) | async fn get_execution(
method executor_config_payload_for_session (line 360) | fn executor_config_payload_for_session(
method session_summary (line 373) | fn session_summary(&self, session: Session) -> SessionSummary {
method serialize_execution_process (line 386) | fn serialize_execution_process(
FILE: crates/mcp/src/task_server/tools/task_attempts.rs
type McpWorkspaceRepoInput (line 16) | struct McpWorkspaceRepoInput {
type StartWorkspaceRequest (line 24) | struct StartWorkspaceRequest {
type StartWorkspaceResponse (line 46) | struct StartWorkspaceResponse {
type LinkWorkspaceIssueRequest (line 51) | struct LinkWorkspaceIssueRequest {
type LinkWorkspaceIssueResponse (line 59) | struct LinkWorkspaceIssueResponse {
function build_workspace_prompt_from_issue (line 68) | fn build_workspace_prompt_from_issue(issue: &api_types::Issue) -> Option...
method start_workspace (line 95) | async fn start_workspace(
method link_workspace_issue (line 227) | async fn link_workspace_issue(
FILE: crates/mcp/src/task_server/tools/workspaces.rs
type McpListWorkspacesRequest (line 12) | struct McpListWorkspacesRequest {
type WorkspaceSummary (line 28) | struct WorkspaceSummary {
type McpListWorkspacesResponse (line 46) | struct McpListWorkspacesResponse {
type McpUpdateWorkspaceRequest (line 55) | struct McpUpdateWorkspaceRequest {
type McpUpdateWorkspaceResponse (line 69) | struct McpUpdateWorkspaceResponse {
type McpDeleteWorkspaceRequest (line 78) | struct McpDeleteWorkspaceRequest {
type McpDeleteWorkspaceResponse (line 92) | struct McpDeleteWorkspaceResponse {
method list_workspaces (line 102) | async fn list_workspaces(
method update_workspace (line 172) | async fn update_workspace(
method delete_workspace (line 213) | async fn delete_workspace(
FILE: crates/relay-control/src/lib.rs
type RelayControl (line 10) | pub struct RelayControl {
method new (line 22) | pub fn new() -> Self {
method reset (line 30) | pub async fn reset(&self) -> CancellationToken {
method stop (line 41) | pub async fn stop(&self) {
method default (line 16) | fn default() -> Self {
FILE: crates/relay-control/src/signing.rs
type RelaySigningSession (line 15) | struct RelaySigningSession {
type RelaySignatureValidationError (line 23) | pub enum RelaySignatureValidationError {
method as_str (line 32) | pub fn as_str(self) -> &'static str {
constant RELAY_SIGNATURE_MAX_TIMESTAMP_DRIFT_SECS (line 43) | const RELAY_SIGNATURE_MAX_TIMESTAMP_DRIFT_SECS: i64 = 30;
constant RELAY_SIGNING_SESSION_TTL (line 44) | const RELAY_SIGNING_SESSION_TTL: Duration = Duration::from_secs(60 * 60);
constant RELAY_SIGNING_SESSION_IDLE_TTL (line 45) | const RELAY_SIGNING_SESSION_IDLE_TTL: Duration = Duration::from_secs(15 ...
constant RELAY_NONCE_TTL (line 46) | const RELAY_NONCE_TTL: Duration = Duration::from_secs(2 * 60);
type RelaySigningService (line 49) | pub struct RelaySigningService {
method new (line 55) | pub fn new(server_signing_key: SigningKey) -> Self {
method load_or_generate (line 62) | pub fn load_or_generate(key_path: &Path) -> io::Result<Self> {
method server_public_key (line 94) | pub fn server_public_key(&self) -> VerifyingKey {
method create_session (line 98) | pub async fn create_session(&self, browser_public_key: VerifyingKey) -...
method verify_message (line 114) | pub async fn verify_message(
method sign_message (line 151) | pub async fn sign_message(
method verify_signature (line 163) | pub async fn verify_signature(
method get_valid_session (line 181) | async fn get_valid_session(
function validate_timestamp (line 197) | fn validate_timestamp(timestamp: i64) -> Result<(), RelaySignatureValida...
function parse_signature_b64 (line 213) | fn parse_signature_b64(signature_b64: &str) -> Result<Signature, RelaySi...
FILE: crates/relay-tunnel/src/bin/relay_server.rs
function main (line 9) | async fn main() -> anyhow::Result<()> {
FILE: crates/relay-tunnel/src/client.rs
type RelayClientConfig (line 22) | pub struct RelayClientConfig {
function start_relay_client (line 32) | pub async fn start_relay_client(config: RelayClientConfig) -> anyhow::Re...
function handle_inbound_stream (line 82) | async fn handle_inbound_stream(
function proxy_to_local (line 100) | async fn proxy_to_local(
function simple_response (line 170) | fn simple_response(status: StatusCode, body: &'static str) -> Response<B...
function read_client_message (line 177) | fn read_client_message(message: tungstenite::Message) -> WsIoReadMessage {
function write_client_message (line 186) | fn write_client_message(bytes: Vec<u8>) -> tungstenite::Message {
FILE: crates/relay-tunnel/src/server.rs
type SharedControl (line 20) | pub type SharedControl = Arc<Mutex<Control>>;
function run_control_channel (line 26) | pub async fn run_control_channel<F, Fut>(socket: WebSocket, on_connected...
function proxy_request_over_control (line 52) | pub async fn proxy_request_over_control(
function normalized_relay_path (line 125) | fn normalized_relay_path(uri: &axum::http::Uri, strip_prefix: &str) -> S...
function read_server_message (line 133) | fn read_server_message(message: AxumWsMessage) -> WsIoReadMessage {
function write_server_message (line 142) | fn write_server_message(bytes: Vec<u8>) -> AxumWsMessage {
FILE: crates/relay-tunnel/src/server_bin/auth.rs
type AccessTokenClaims (line 31) | struct AccessTokenClaims {
type AccessTokenDetails (line 40) | pub struct AccessTokenDetails {
type JwtError (line 47) | pub enum JwtError {
constant DEFAULT_JWT_LEEWAY_SECONDS (line 56) | const DEFAULT_JWT_LEEWAY_SECONDS: u64 = 60;
type JwtService (line 59) | pub struct JwtService {
method fmt (line 64) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
method new (line 72) | pub fn new(secret: SecretString) -> Self {
method decode_access_token (line 78) | pub fn decode_access_token(&self, token: &str) -> Result<AccessTokenDe...
type RequestContext (line 107) | pub struct RequestContext {
function require_session (line 116) | pub async fn require_session(
function request_context_from_access_token (line 135) | async fn request_context_fro
Condensed preview — 1782 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (9,644K chars).
[
{
"path": ".cargo/config.toml",
"chars": 659,
"preview": "[target.x86_64-apple-darwin]\nrustflags = [\n \"-C\", \"link-arg=-framework\",\n \"-C\", \"link-arg=AppKit\",\n \"-C\", \"link"
},
{
"path": ".dockerignore",
"chars": 763,
"preview": "# Node modules\nnode_modules/\n**/node_modules\n.pnpm-store/\n.pnpm/\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\nlerna-de"
},
{
"path": ".github/actions/cargo-checks-common-setup/action.yml",
"chars": 1754,
"preview": "name: 'Cargo checks common setup'\ndescription: 'Common setup for cargo checks in CI'\n\ninputs:\n toolchain:\n descripti"
},
{
"path": ".github/actions/setup-jsign/action.yml",
"chars": 1241,
"preview": "name: 'Setup Jsign'\ndescription: 'Downloads and caches Jsign for cross-platform Windows code signing'\n\ninputs:\n version"
},
{
"path": ".github/actions/setup-node/action.yml",
"chars": 825,
"preview": "name: 'Setup Node.js and pnpm'\ndescription: 'Sets up Node.js and pnpm with caching'\n\nruns:\n using: 'composite'\n steps:"
},
{
"path": ".github/workflows/pre-release.yml",
"chars": 46240,
"preview": "name: Create GitHub Pre-Release\n\non:\n workflow_dispatch:\n inputs:\n version_type:\n description: \"Version "
},
{
"path": ".github/workflows/publish.yml",
"chars": 5713,
"preview": "name: Publish to npm\n\non:\n release:\n types: [released]\n workflow_dispatch:\n inputs:\n tag_name:\n desc"
},
{
"path": ".github/workflows/relay-deploy-dev.yml",
"chars": 730,
"preview": "name: Relay Deploy Dev\n\non:\n push:\n branches:\n - main\n paths:\n - crates/relay-tunnel/**\n workflow_disp"
},
{
"path": ".github/workflows/relay-deploy-prod.yml",
"chars": 3412,
"preview": "name: Deploy Relay Prod\n\non:\n workflow_dispatch:\n inputs:\n version_type:\n description: \"Version bump typ"
},
{
"path": ".github/workflows/relay-release.yml",
"chars": 573,
"preview": "name: Create Relay Release\n\non:\n repository_dispatch:\n types: [relay-deploy-success]\n\njobs:\n create-release:\n ru"
},
{
"path": ".github/workflows/remote-deploy-dev.yml",
"chars": 761,
"preview": "name: Remote Deploy Dev\n\non:\n push:\n branches:\n - main \n paths:\n - crates/remote/**\n - packages/re"
},
{
"path": ".github/workflows/remote-deploy-prod.yml",
"chars": 3596,
"preview": "name: Deploy Remote Prod\n\non:\n workflow_dispatch:\n inputs:\n version_type:\n description: \"Version bump ty"
},
{
"path": ".github/workflows/remote-release.yml",
"chars": 571,
"preview": "name: Create Remote Release\n\non:\n repository_dispatch:\n types: [remote-deploy-success]\n\njobs:\n create-release:\n "
},
{
"path": ".github/workflows/test.yml",
"chars": 10461,
"preview": "name: Test\n\non:\n pull_request:\n branches:\n - main\n paths-ignore:\n - .github/workflows/**\n - '!.git"
},
{
"path": ".gitignore",
"chars": 1088,
"preview": "# Rust\ntarget/\n**/*.rs.bk\n\n# Node.js\nnode_modules/\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n.pnpm-debug.log*\n\n# Bu"
},
{
"path": ".npmrc",
"chars": 19,
"preview": "engine-strict=true\n"
},
{
"path": "AGENTS.md",
"chars": 3980,
"preview": "# Repository Guidelines\n\n## Project Structure & Module Organization\n- `crates/`: Rust workspace crates — `server` (API +"
},
{
"path": "CODE-OF-CONDUCT.md",
"chars": 3861,
"preview": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nWe as members, contributors, and leaders pledge to make participa"
},
{
"path": "CONTRIBUTORS.md",
"chars": 3136,
"preview": "# Contributing & Change Control\n\n## Change Control Policy\n\nAll changes to production code are governed by formal change "
},
{
"path": "Cargo.toml",
"chars": 1738,
"preview": "[workspace]\nresolver = \"3\"\nmembers = [\n \"crates/api-types\",\n \"crates/server\",\n \"crates/trusted-key-auth\",\n \""
},
{
"path": "Dockerfile",
"chars": 4711,
"preview": "# syntax=docker/dockerfile:1.6\n\nFROM node:24-alpine AS fe-builder\n\nARG POSTHOG_API_KEY=\"\"\nARG POSTHOG_API_ENDPOINT=\"\"\n\nW"
},
{
"path": "LICENSE",
"chars": 11357,
"preview": " Apache License\n Version 2.0, January 2004\n "
},
{
"path": "README.md",
"chars": 7384,
"preview": "<p align=\"center\">\n <a href=\"https://vibekanban.com\">\n <picture>\n <source srcset=\"packages/public/vibe-kanban-l"
},
{
"path": "assets/scripts/toast-notification.ps1",
"chars": 1064,
"preview": "param(\n [Parameter(Mandatory=$true)]\n [string]$Title,\n \n [Parameter(Mandatory=$true)]\n [string]$Message,\n"
},
{
"path": "crates/api-types/Cargo.toml",
"chars": 419,
"preview": "[package]\nname = \"api-types\"\nversion = \"0.1.33\"\nedition = \"2024\"\n\n[dependencies]\nchrono = { version = \"0.4\", features = "
},
{
"path": "crates/api-types/src/attachment.rs",
"chars": 1594,
"preview": "use chrono::{DateTime, Utc};\nuse serde::{Deserialize, Serialize};\nuse ts_rs::TS;\nuse uuid::Uuid;\n\n/// An attachment link"
},
{
"path": "crates/api-types/src/auth.rs",
"chars": 688,
"preview": "use chrono::{DateTime, Duration, Utc};\nuse serde::Serialize;\nuse uuid::Uuid;\n\n#[derive(Debug, Clone, sqlx::FromRow, Seri"
},
{
"path": "crates/api-types/src/blob.rs",
"chars": 526,
"preview": "use chrono::{DateTime, Utc};\nuse serde::{Deserialize, Serialize};\nuse ts_rs::TS;\nuse uuid::Uuid;\n\n#[derive(Debug, Clone,"
},
{
"path": "crates/api-types/src/issue.rs",
"chars": 6054,
"preview": "use chrono::{DateTime, Utc};\nuse serde::{Deserialize, Serialize};\nuse serde_json::Value;\nuse sqlx::Type;\nuse ts_rs::TS;\n"
},
{
"path": "crates/api-types/src/issue_assignee.rs",
"chars": 1060,
"preview": "use chrono::{DateTime, Utc};\nuse serde::{Deserialize, Serialize};\nuse ts_rs::TS;\nuse uuid::Uuid;\n\nuse crate::some_if_pre"
},
{
"path": "crates/api-types/src/issue_comment.rs",
"chars": 1269,
"preview": "use chrono::{DateTime, Utc};\nuse serde::{Deserialize, Serialize};\nuse ts_rs::TS;\nuse uuid::Uuid;\n\nuse crate::some_if_pre"
},
{
"path": "crates/api-types/src/issue_comment_reaction.rs",
"chars": 1114,
"preview": "use chrono::{DateTime, Utc};\nuse serde::{Deserialize, Serialize};\nuse ts_rs::TS;\nuse uuid::Uuid;\n\nuse crate::some_if_pre"
},
{
"path": "crates/api-types/src/issue_follower.rs",
"chars": 971,
"preview": "use serde::{Deserialize, Serialize};\nuse ts_rs::TS;\nuse uuid::Uuid;\n\nuse crate::some_if_present;\n\n#[derive(Debug, Clone,"
},
{
"path": "crates/api-types/src/issue_relationship.rs",
"chars": 1656,
"preview": "use chrono::{DateTime, Utc};\nuse schemars::JsonSchema;\nuse serde::{Deserialize, Serialize};\nuse sqlx::Type;\nuse ts_rs::T"
},
{
"path": "crates/api-types/src/issue_tag.rs",
"chars": 957,
"preview": "use serde::{Deserialize, Serialize};\nuse ts_rs::TS;\nuse uuid::Uuid;\n\nuse crate::some_if_present;\n\n#[derive(Debug, Clone,"
},
{
"path": "crates/api-types/src/lib.rs",
"chars": 1656,
"preview": "//! API types shared between local and remote backends.\n//!\n//! This crate contains:\n//! - Row types (e.g., `Issue`, `Pr"
},
{
"path": "crates/api-types/src/migration.rs",
"chars": 1269,
"preview": "use chrono::{DateTime, Utc};\nuse serde::{Deserialize, Serialize};\nuse uuid::Uuid;\n\n#[derive(Debug, Clone, Serialize, Des"
},
{
"path": "crates/api-types/src/notification.rs",
"chars": 3024,
"preview": "use chrono::{DateTime, Utc};\nuse serde::{Deserialize, Serialize};\nuse sqlx::Type;\nuse ts_rs::TS;\nuse uuid::Uuid;\n\nuse cr"
},
{
"path": "crates/api-types/src/oauth.rs",
"chars": 1906,
"preview": "use serde::{Deserialize, Serialize};\nuse ts_rs::TS;\nuse uuid::Uuid;\n\n#[derive(Debug, Serialize, Deserialize, Clone, TS)]"
},
{
"path": "crates/api-types/src/organization_member.rs",
"chars": 793,
"preview": "use chrono::{DateTime, Utc};\nuse serde::{Deserialize, Serialize};\nuse sqlx::Type;\nuse ts_rs::TS;\nuse uuid::Uuid;\n\n#[deri"
},
{
"path": "crates/api-types/src/organizations.rs",
"chars": 4157,
"preview": "use chrono::{DateTime, Utc};\nuse serde::{Deserialize, Serialize};\nuse sqlx::Type;\nuse ts_rs::TS;\nuse uuid::Uuid;\n\nuse cr"
},
{
"path": "crates/api-types/src/project.rs",
"chars": 1716,
"preview": "use chrono::{DateTime, Utc};\nuse serde::{Deserialize, Serialize};\nuse ts_rs::TS;\nuse uuid::Uuid;\n\nuse crate::some_if_pre"
},
{
"path": "crates/api-types/src/project_status.rs",
"chars": 1468,
"preview": "use chrono::{DateTime, Utc};\nuse serde::{Deserialize, Serialize};\nuse ts_rs::TS;\nuse uuid::Uuid;\n\nuse crate::some_if_pre"
},
{
"path": "crates/api-types/src/pull_request.rs",
"chars": 1058,
"preview": "use chrono::{DateTime, Utc};\nuse schemars::JsonSchema;\nuse serde::{Deserialize, Serialize};\nuse sqlx::Type;\nuse ts_rs::T"
},
{
"path": "crates/api-types/src/pull_requests_local.rs",
"chars": 534,
"preview": "use chrono::{DateTime, Utc};\nuse serde::{Deserialize, Serialize};\nuse uuid::Uuid;\n\nuse crate::PullRequestStatus;\n\n#[deri"
},
{
"path": "crates/api-types/src/relay.rs",
"chars": 1078,
"preview": "use chrono::{DateTime, Utc};\nuse serde::{Deserialize, Serialize};\nuse ts_rs::TS;\nuse uuid::Uuid;\n\n#[derive(Debug, Clone,"
},
{
"path": "crates/api-types/src/response.rs",
"chars": 424,
"preview": "use serde::{Deserialize, Serialize};\nuse ts_rs::TS;\n\n/// Response wrapper for mutation endpoints (create/update).\n/// In"
},
{
"path": "crates/api-types/src/tag.rs",
"chars": 1053,
"preview": "use serde::{Deserialize, Serialize};\nuse ts_rs::TS;\nuse uuid::Uuid;\n\nuse crate::some_if_present;\n\n#[derive(Debug, Clone,"
},
{
"path": "crates/api-types/src/user.rs",
"chars": 606,
"preview": "use chrono::{DateTime, Utc};\nuse serde::{Deserialize, Serialize};\nuse ts_rs::TS;\nuse uuid::Uuid;\n\n#[derive(Debug, Clone,"
},
{
"path": "crates/api-types/src/workspace.rs",
"chars": 616,
"preview": "use chrono::{DateTime, Utc};\nuse serde::{Deserialize, Serialize};\nuse ts_rs::TS;\nuse uuid::Uuid;\n\n/// Workspace metadata"
},
{
"path": "crates/api-types/src/workspaces.rs",
"chars": 1340,
"preview": "use serde::{Deserialize, Serialize};\nuse uuid::Uuid;\n\n#[derive(Debug, Deserialize, Serialize)]\npub struct DeleteWorkspac"
},
{
"path": "crates/db/.sqlx/query-039c2290b6cf7cdc905c8ddc44293f067fe7e8f246da737e4baad3f494ac8b8f.json",
"chars": 468,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"INSERT INTO execution_processes (\\n id, session_id, run_reason, "
},
{
"path": "crates/db/.sqlx/query-04c207be2c3c2c07ff42c695542504c358d67c1f40ca2b1e75a396a90c173a53.json",
"chars": 753,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT eprs.after_head_commit\\n FROM execution_process_repo_states ep"
},
{
"path": "crates/db/.sqlx/query-04e5a05c7cad438d39c4c8590410889ab1eefa7376d474a10c119d3f4d9143c7.json",
"chars": 1826,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT\\n id as \\\"id!: Uuid\\\",\\n execution_process_id "
},
{
"path": "crates/db/.sqlx/query-04f17449e3e12785affab91e4eab308103491e34c022199b7b060e04fa8aed0f.json",
"chars": 1611,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT id as \\\"id!: Uuid\\\",\\n file_path as \\\"file_path!\\\",\\n "
},
{
"path": "crates/db/.sqlx/query-0a805c219c9028b2677bd94ccabd47916e60d26c1cede27e467f0ae91f6639ab.json",
"chars": 464,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"UPDATE migration_state\\n SET status = 'migrated',\\n remot"
},
{
"path": "crates/db/.sqlx/query-0ab07fb562e61148f3f07f33f766ea12c73d467df4522240008370f681c8409a.json",
"chars": 576,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"UPDATE workspace_repos\\n SET target_branch = $1, updated_at = datetim"
},
{
"path": "crates/db/.sqlx/query-0ac0d0f3826330836e3fd1bf57c42777eb489ac41a650f9361e6b563fc69bf35.json",
"chars": 413,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"UPDATE migration_state\\n SET status = 'pending',\\n error_"
},
{
"path": "crates/db/.sqlx/query-0c7b20643f119afd3e233105b0fa2920e8e940bdad86cdc95d01e485a20d6ed4.json",
"chars": 2595,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT\\n ep.id as \\\"id!: Uuid\\\",\\n ep.session"
},
{
"path": "crates/db/.sqlx/query-0f90844fc62261ed140e02515ae464b940743113814507313c9fdc176000d1bf.json",
"chars": 428,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"UPDATE migration_state\\n SET status = 'skipped',\\n error_"
},
{
"path": "crates/db/.sqlx/query-1085d1f8107c7e16fc2058ef610918760d8d420f0fca97adecd76d698f6f3a51.json",
"chars": 2350,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT\\n id as \\\"id!: Uuid\\\",\\n workspace_id as \\\"wor"
},
{
"path": "crates/db/.sqlx/query-11793c98a4bee67fce9972ed6b10a18226e0455a0e8d113d04c4d5148b72aec7.json",
"chars": 1015,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT id as \\\"id!: Uuid\\\", tag_name, content as \\\"content!\\\", created_at as \\\"crea"
},
{
"path": "crates/db/.sqlx/query-12a5c0a8b95d8cb87f1c869ff35692a2cee52bc418b06d00a31a4c139e12d18a.json",
"chars": 781,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"\\n SELECT \\n ep.id as \\\"execution_id!: Uuid\\\", \\n "
},
{
"path": "crates/db/.sqlx/query-13826fc6fdd367255cb921640e5972f30905ac7a81ad477cf8bbcfc24f06f39b.json",
"chars": 2526,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"\\n SELECT\\n ep.id as \\\"id!: Uuid\\\",\\n ep.session_id as"
},
{
"path": "crates/db/.sqlx/query-167c1d13ee37ebe62cd2316feaf6b5354eb26d0a8fc16efb22827a5cde59a60e.json",
"chars": 527,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT COUNT(1) as \\\"count!: i64\\\"\\n FROM merges\\n WHER"
},
{
"path": "crates/db/.sqlx/query-1b186dc075846fc1f7270a942afbf82a88806ee6ababdb437ab5e97ddd2122da.json",
"chars": 559,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT COUNT(*) as \\\"count!: i64\\\"\\n FROM execution_processes ep\\n "
},
{
"path": "crates/db/.sqlx/query-1c2201b0ca9305283634fe5c72df6eac3ad954c1238088a84a4b9085b1dbdb74.json",
"chars": 258,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"DELETE FROM workspaces WHERE id = $1\",\n \"describe\": {\n \"columns\": [],\n \"para"
},
{
"path": "crates/db/.sqlx/query-218f1d14c72148ea88d75e816e1ba111c8f4678a7e428b15462e6dfc74c25b03.json",
"chars": 1108,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"UPDATE tags\\n SET tag_name = $2, content = $3, updated_at = datetime("
},
{
"path": "crates/db/.sqlx/query-2547a5d06fd3b17360bff34a04b7d3d929c13ef0d86395a9201834d8fc955295.json",
"chars": 950,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT\\n cat.agent_session_id as \\\"session_id!\\\",\\n c"
},
{
"path": "crates/db/.sqlx/query-256f9e937384933464e6d4d00ee977bbb2915ef80930c8b5c0b0525367a5264d.json",
"chars": 321,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"UPDATE repos SET name = $1, display_name = $2, updated_at = datetime('now', 'subsec"
},
{
"path": "crates/db/.sqlx/query-29cc3aa8d0ad5deda94494402500a4125e29381d63f18ef083cc4da95e2c5db5.json",
"chars": 462,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT w.id as \\\"workspace_id!: Uuid\\\"\\n FROM workspaces w\\n "
},
{
"path": "crates/db/.sqlx/query-2a57b702e52b3cc9bdbc361267985958b11d4493b01a9ab8daedf5d951422897.json",
"chars": 295,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"UPDATE workspaces SET updated_at = datetime('now', 'subsec') WHERE id = ?\",\n \"desc"
},
{
"path": "crates/db/.sqlx/query-2b253f92ac5daa4864e7335fde1b82625f504fd73d19b21992497219a9c3170a.json",
"chars": 2687,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"INSERT INTO repos (id, path, name, display_name)\\n VALUES ($1, $2, $3"
},
{
"path": "crates/db/.sqlx/query-2c0172d5b2c5bff0914727a57983d5c336f5b2dfa73ca6c2efa4ea23bb526e05.json",
"chars": 1327,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT id as \\\"id!: Uuid\\\",\\n name,\\n def"
},
{
"path": "crates/db/.sqlx/query-2c71bf4dd5683e0dedf2341e52880ff2c0765659d3cf53d62faa54adc91071dd.json",
"chars": 553,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT w.name AS \\\"name: String\\\"\\n FROM workspaces w\\n "
},
{
"path": "crates/db/.sqlx/query-2cb5a269045f23da9f4ee0ee679ccb7fffc39d4b37b1b58357b11a7abfdba125.json",
"chars": 301,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"UPDATE sessions SET executor = $1, updated_at = CURRENT_TIMESTAMP WHERE id = $2\",\n "
},
{
"path": "crates/db/.sqlx/query-31f4e685fc0b1103ff662b3866b3bb422cc7fc8e0661ebfed30ffd16ea7ed8c0.json",
"chars": 1333,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT id as \\\"id!: Uuid\\\",\\n workspace_id as \\\"workspace_id!:"
},
{
"path": "crates/db/.sqlx/query-3266b6a544952177f84e2e7c31be9dba212c92d91b997de7f6aa811e08ed6c72.json",
"chars": 2538,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT\\n ep.id as \\\"id!: Uuid\\\",\\n ep.session"
},
{
"path": "crates/db/.sqlx/query-33f23656ba343bd75a88b0fadf2a4ba01eda330f9b549e625e27701e3b0b5a31.json",
"chars": 1901,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT\\n id as \\\"id!: Uuid\\\",\\n entity_type as \\\"enti"
},
{
"path": "crates/db/.sqlx/query-3634e2bab8fef106721bb64a791edd81d3d49eb34fbabd34e4feadfb5f229a6e.json",
"chars": 617,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT id as \\\"id!: Uuid\\\",\\n container_ref as \\\"container_ref"
},
{
"path": "crates/db/.sqlx/query-3a9148e9e914d644d4d82a1c2dc8bd0e093d4f4c638afa7fd8f5211892fb6d84.json",
"chars": 253,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"DELETE FROM repos WHERE id = $1\",\n \"describe\": {\n \"columns\": [],\n \"parameter"
},
{
"path": "crates/db/.sqlx/query-3ace1ee8dba0669400d69891912b86823e41ca643092d990b12c1a6160112427.json",
"chars": 2732,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT\\n m.id as \\\"id!: Uuid\\\",\\n m.workspace_id as \\"
},
{
"path": "crates/db/.sqlx/query-3d34580933bc02a168f4a7c483460a6ad13ef72b508532f5a6cd5e53aff04a69.json",
"chars": 1987,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"\\n SELECT\\n workspace_id as \\\"workspace_id!: Uuid\\\",\\n "
},
{
"path": "crates/db/.sqlx/query-3d85256618729c1c0bf2758ffab9cdb4ec2af0751e3a37db4009c02f95f6f556.json",
"chars": 2466,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"INSERT INTO merges (\\n id, workspace_id, repo_id, merge_type, pr_num"
},
{
"path": "crates/db/.sqlx/query-3f4b2179dcd8857fc18f1e5f6e6cf10f152eebbb141b2d3604dd4191e0c2f367.json",
"chars": 2417,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT\\n ep.id as \\\"id!: Uuid\\\",\\n ep.session"
},
{
"path": "crates/db/.sqlx/query-420a0c490f1e4d549fb194265e971d8c03b86fe75b595091f6425de11d120a6b.json",
"chars": 448,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"UPDATE execution_processes\\n SET dropped = TRUE\\n WHERE s"
},
{
"path": "crates/db/.sqlx/query-4506eeeb85b49f00143a9d23636c976159e1c72c9cfce005599c5eb52dc15095.json",
"chars": 1859,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT s.id AS \\\"id!: Uuid\\\",\\n s.workspace_id AS \\\"workspace_"
},
{
"path": "crates/db/.sqlx/query-48c556a5317e6ea77595a8fdc410d30df50c8405adf38b371fdf0a1bde8c0083.json",
"chars": 398,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"UPDATE execution_process_repo_states\\n SET before_head_commit = $1, u"
},
{
"path": "crates/db/.sqlx/query-4ac35216ead7e5be9cc2de504a06b6e375e23ca2ed14493ec991f53e458a6a34.json",
"chars": 259,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"DELETE FROM attachments WHERE id = $1\",\n \"describe\": {\n \"columns\": [],\n \"par"
},
{
"path": "crates/db/.sqlx/query-4b59b958807be54c7c9949d96ced96e4ab1498f1056e7d0d7956aff46352d90f.json",
"chars": 2333,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT\\n id as \\\"id!: Uuid\\\",\\n workspace_id as \\\"wor"
},
{
"path": "crates/db/.sqlx/query-4b952fb779fbcf70bd402b6bcc0eec07b75879333614b8ef98e5b8073ad66ca6.json",
"chars": 1722,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"INSERT INTO attachments (id, file_path, original_name, mime_type, size_bytes, hash)"
},
{
"path": "crates/db/.sqlx/query-4c9b1b539ec383ace94ef29c58967bbf08112ebdc61276e9710663a083318211.json",
"chars": 1496,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT id as \\\"id!: Uuid\\\", project_id as \\\"project_id!: Uuid\\\", title, description"
},
{
"path": "crates/db/.sqlx/query-4d84b308a2cc7677da65111d080bf02e5e35c052048360d3dbea656bbbcd3edb.json",
"chars": 392,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"UPDATE execution_process_repo_states\\n SET merge_commit = $1, updated"
},
{
"path": "crates/db/.sqlx/query-4d86dcbf754f971ff3acffe9e85b5c2f455e77c40c624e09736be9480238110b.json",
"chars": 311,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"UPDATE workspaces SET archived = $1, updated_at = datetime('now', 'subsec') WHERE i"
},
{
"path": "crates/db/.sqlx/query-5154289c5a9ddbc061d42de2baf129e03a75061b8b305110921688f01d112de1.json",
"chars": 3322,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT\\n w.id AS \\\"id!: Uuid\\\",\\n w.task_id AS \\\"task"
},
{
"path": "crates/db/.sqlx/query-517fb82570b9624e166696af53963ec499966562b23b5833fc4ca4cf43bcaccc.json",
"chars": 1878,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT\\n id as \\\"id!: Uuid\\\",\\n entity_type as \\\"enti"
},
{
"path": "crates/db/.sqlx/query-557963b950205b10db273762da5fd24c9db96c1f366a796c319e4adc888d7414.json",
"chars": 338,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"UPDATE workspace_repos SET target_branch = $1, updated_at = datetime('now') WHERE w"
},
{
"path": "crates/db/.sqlx/query-570f62a32921c4a9a7e4e1006e9b31c4c58e69ab8681d76dfe9b184ff1e0bc65.json",
"chars": 2341,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT\\n id as \\\"id!: Uuid\\\",\\n workspace_id as \\\"wor"
},
{
"path": "crates/db/.sqlx/query-5785a10c3d51ff9b001aa455f6296a4dcba61cec700a4b72031c5c643b273938.json",
"chars": 373,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"UPDATE merges\\n SET pr_status = $1,\\n pr_merge_commit_sha"
},
{
"path": "crates/db/.sqlx/query-57d6335c98deb608cf961836f73a67163af6484f91954c0577aea1cc2fddac4f.json",
"chars": 486,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"UPDATE workspaces SET\\n archived = COALESCE($1, archived),\\n "
},
{
"path": "crates/db/.sqlx/query-586d5ab95899967c8a8f74996c4a598a73661823bc2bcb240cebb7cd0533abb6.json",
"chars": 1752,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT i.id as \\\"id!: Uuid\\\",\\n i.file_path as \\\"file_path!\\\","
},
{
"path": "crates/db/.sqlx/query-5884e7baa4a061166cb2911f717d3fd92852d62975a910dd9cb05e7908fdf8b6.json",
"chars": 2545,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT id as \\\"id!: Uuid\\\",\\n path,\\n nam"
},
{
"path": "crates/db/.sqlx/query-592656b17a5f78d117365909e47afba7d3df545ac1078c307c6b968e75c8e2ba.json",
"chars": 3303,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT\\n w.id AS \\\"id!: Uuid\\\",\\n w.task_id AS \\\"task"
},
{
"path": "crates/db/.sqlx/query-5a5eb8f05ddf515b4e568d8e209e9722d8b7ce62f76a1eb084af880c2a4dfad2.json",
"chars": 1184,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"\\n INSERT INTO scratch (id, scratch_type, payload)\\n VALUES ("
},
{
"path": "crates/db/.sqlx/query-5d9739705372b113b1bb45d441ebdf2846dc4cd83b8547128c733cd282b5b4f2.json",
"chars": 345,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"UPDATE execution_processes\\n SET status = $1, exit_code = $2, complet"
},
{
"path": "crates/db/.sqlx/query-5ff9809face43fe1f071dfda62b6a30f4a32a9aaace29caf89b95c224482201b.json",
"chars": 846,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT r.id as \\\"id!: Uuid\\\", r.path, r.name, r.copy_files\\n FROM rep"
},
{
"path": "crates/db/.sqlx/query-606016bf31cf0abd87d7eb95ea99d7c8c014523cb02e482d608299ceefaeffc5.json",
"chars": 656,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT EXISTS(\\n SELECT 1 FROM coding_agent_turns cat\\n "
},
{
"path": "crates/db/.sqlx/query-61c6546164ba21a659d32d4e345926b0ee1a611fe4e46bb8db51a4e41f781af9.json",
"chars": 345,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"UPDATE coding_agent_turns\\n SET summary = $1, updated_at = $2\\n "
},
{
"path": "crates/db/.sqlx/query-64f31710ab7ba14047f31cce44ad36c60a53624f9bcb03a5eaff5d61ca8cc9cf.json",
"chars": 2213,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT id AS \\\"id!: Uuid\\\",\\n task_id AS \\\"task_id: Uuid\\\""
},
{
"path": "crates/db/.sqlx/query-686810c5271e1d44042b6ea2c6cc434eb2e3f5d3540c97d703c34dd4e978c690.json",
"chars": 1859,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT\\n id as \\\"id!: Uuid\\\",\\n entity_type as \\\"enti"
},
{
"path": "crates/db/.sqlx/query-6ae5eb2719382d4d081ee17dbd5de654c156b06e2af4ddfb917d36002146be5b.json",
"chars": 495,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"INSERT INTO workspace_attachments (id, workspace_id, attachment_id)\\n "
},
{
"path": "crates/db/.sqlx/query-70b21c5c0a2ba5c21c9c1132f14a68c02a8a2cd555caea74e57a0aeb206770d3.json",
"chars": 394,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT COUNT(*) as \\\"count!: i64\\\" FROM workspaces\",\n \"describe\": {\n \"columns\":"
},
{
"path": "crates/db/.sqlx/query-7364150098bec681451c43762117a1f5c5b4e27f5f65186c3cc16092b3491c37.json",
"chars": 1995,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"INSERT INTO migration_state (id, entity_type, local_id)\\n VALUES ($1, $2"
},
{
"path": "crates/db/.sqlx/query-73aee4cb95294087554eafaf3126556df244f4b6639d5a188f0badb6739c1a70.json",
"chars": 1023,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT id as \\\"id!: Uuid\\\", tag_name, content as \\\"content!\\\", created_at as \\\"crea"
},
{
"path": "crates/db/.sqlx/query-7410e8128e63af1c3127e833accee637e65f7efcd9111ecb891587294042129c.json",
"chars": 2015,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"INSERT INTO workspaces (id, task_id, container_ref, branch, setup_completed_at, nam"
},
{
"path": "crates/db/.sqlx/query-766fa107de23b7e6c579223b083d916e252d422e2908c27f6718fcbd851de2c1.json",
"chars": 2230,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT id AS \\\"id!: Uuid\\\",\\n task_id "
},
{
"path": "crates/db/.sqlx/query-7807cb09da72c5a1e35bf4f4da1bea1743a578588e72444ede98f5f969af08c1.json",
"chars": 1842,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT\\n id as \\\"id!: Uuid\\\",\\n entity_type as \\\"enti"
},
{
"path": "crates/db/.sqlx/query-784e59a5259f046a74bbfd3cc5a78500797ccf3e67928e5f1520623c5c04ac9f.json",
"chars": 1429,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"INSERT INTO workspace_repos (id, workspace_id, repo_id, target_branch)\\n "
},
{
"path": "crates/db/.sqlx/query-79e1e11b83c786c6d5a985ab045b6bd122d5efa920225dadc9fedb6592c6e0a3.json",
"chars": 397,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"UPDATE execution_process_repo_states\\n SET after_head_commit = $1, up"
},
{
"path": "crates/db/.sqlx/query-79f6b9f999c33900ae87475d72651b274cc94ab3b1f36e9c5517bc5572ea9947.json",
"chars": 3013,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"UPDATE repos\\n SET display_name = $1,\\n setup_scrip"
},
{
"path": "crates/db/.sqlx/query-7d12bf106e68365fc1aa239b8b39065430f30ad658d0bf9801c81e3ced2127da.json",
"chars": 2420,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT\\n ep.id as \\\"id!: Uuid\\\",\\n ep.session"
},
{
"path": "crates/db/.sqlx/query-80669005bff96b45015f095ccf28598df604540e2aaf3828fcb8db7d55538dc7.json",
"chars": 1055,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"INSERT INTO tags (id, tag_name, content)\\n VALUES ($1, $2, $3)\\n "
},
{
"path": "crates/db/.sqlx/query-80e6cfb4e27fcaa79b7dbd37ac16aac255f46a646c75aa65111b2f58ec03f892.json",
"chars": 2456,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT\\n ep.id as \\\"id!: Uuid\\\",\\n ep.session"
},
{
"path": "crates/db/.sqlx/query-82b92577d15b92908cecca7bff6ff21478c90a16eb6123165f0bd16d2d60bca4.json",
"chars": 700,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT DISTINCT s.workspace_id as \\\"workspace_id!: Uuid\\\"\\n FROM codi"
},
{
"path": "crates/db/.sqlx/query-82f7bba858a26732ad9d4122c3a0bca4209ae37c59dcd7353a68e2dec434c48a.json",
"chars": 2673,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT r.id as \\\"id!: Uuid\\\",\\n r.path,\\n "
},
{
"path": "crates/db/.sqlx/query-84ee994f0aad005cf62ca318eb20ae29d218a72cdd1fadf2a5ae399b0719ca19.json",
"chars": 1873,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT\\n id as \\\"id!: Uuid\\\",\\n entity_type as \\\"enti"
},
{
"path": "crates/db/.sqlx/query-891bad4b14f75be20c70a5cec02fb3b4fb3cbb84ce322bf5da3791d75b1deae7.json",
"chars": 2537,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT id as \\\"id!: Uuid\\\",\\n path,\\n nam"
},
{
"path": "crates/db/.sqlx/query-8f3ab3ad20de3261703b0bdaf01a3d3c4289754381b47af7cd97acce767163e8.json",
"chars": 277,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"DELETE FROM scratch WHERE id = $1 AND scratch_type = $2\",\n \"describe\": {\n \"colu"
},
{
"path": "crates/db/.sqlx/query-9139f8d02c4ff94db0f2e8de7a6d5a53092479499815531962b7c84f5e0b2129.json",
"chars": 471,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT logs\\n FROM execution_process_logs \\n WHERE exec"
},
{
"path": "crates/db/.sqlx/query-91810eeed4804827717a182ad1b61c641648e2659100f43ef9504fc60e5d244e.json",
"chars": 3370,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"\\n SELECT\\n w.id as \\\"id!: Uuid\\\",\\n w.tas"
},
{
"path": "crates/db/.sqlx/query-93efe07b91d232fc0c371be8ee618ba6ccfd6930454fc11845d5dfc2ba0bad62.json",
"chars": 1883,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT s.id AS \\\"id!: Uuid\\\",\\n s.workspace_id AS \\\"workspace_"
},
{
"path": "crates/db/.sqlx/query-973e43902b05d671f69b24a0aeeb07bc0cbcd22d75b20c83c49a122f92c6b231.json",
"chars": 2525,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT id as \\\"id!: Uuid\\\",\\n path,\\n nam"
},
{
"path": "crates/db/.sqlx/query-9747ebaebd562d65f0c333b0f5efc74fa63ab9fcb35a43f75f57da3fcb9a2588.json",
"chars": 364,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"INSERT INTO execution_process_logs (execution_id, logs, byte_size, inserted_at)\\n "
},
{
"path": "crates/db/.sqlx/query-9821ee63362e96cf3fd936e2d54a641fb30f239a8137dc6c1b3a670b2c6138c1.json",
"chars": 1350,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT id as \\\"id!: Uuid\\\",\\n workspace_id as \\\"workspace_id!:"
},
{
"path": "crates/db/.sqlx/query-99399425f53b140a8de232a4de3c6c056bc422f2fbdb8ead6aab3f6945906e51.json",
"chars": 2610,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT\\n ep.id as \\\"id!: Uuid\\\",\\n "
},
{
"path": "crates/db/.sqlx/query-9dd37bd520d651339fa13078ea5cb76847c8c74970b195b0e5ee33e4c5a777fb.json",
"chars": 310,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"UPDATE projects\\n SET remote_project_id = $2\\n WHERE id"
},
{
"path": "crates/db/.sqlx/query-9f783d1b275548a59429235991e5299b7aaf071effebbd62f006404b3ce83dc8.json",
"chars": 2828,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT r.id as \\\"id!: Uuid\\\",\\n r.path,\\n "
},
{
"path": "crates/db/.sqlx/query-9f8ab7d7c2660321412117bfb55e3b2b9ccd7b9ed2679fb8ccca0a36996e6e21.json",
"chars": 631,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"INSERT INTO execution_process_repo_states (\\n id,\\n "
},
{
"path": "crates/db/.sqlx/query-a1574f21db387b0e4a2c3f5723de6df4ee42d98145d16e9d135345dd60128429.json",
"chars": 998,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT \\n execution_id as \\\"execution_id!: Uuid\\\",\\n "
},
{
"path": "crates/db/.sqlx/query-a3d14f90b59d6cb15c42d1e6400c040a86eab49095c89fcef9d1585890056856.json",
"chars": 1342,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"\\n INSERT INTO scratch (id, scratch_type, payload)\\n VALUES ("
},
{
"path": "crates/db/.sqlx/query-a4a50fcfb903e6d0a315676f4f760e5bb7718e10ea550aedf990c9da84834416.json",
"chars": 249,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"DELETE FROM migration_state\",\n \"describe\": {\n \"columns\": [],\n \"parameters\": "
},
{
"path": "crates/db/.sqlx/query-a915c22f5ed0bb86c3a242ca38cbc1bfca40ebfe9096058c27e94479b67c7c02.json",
"chars": 479,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"UPDATE migration_state\\n SET status = 'failed',\\n error_m"
},
{
"path": "crates/db/.sqlx/query-a9446d873a2f199e7120e9faeda1b2135383396f82623813d734e321114d4623.json",
"chars": 1151,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"\\n SELECT\\n id as \\\"id!: Uuid\\\",\\n "
},
{
"path": "crates/db/.sqlx/query-aa598f6943fbf773ca00deb113f3955bdf689d1c22df63849bc5ce36c7c76382.json",
"chars": 293,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"UPDATE workspaces SET container_ref = $1, updated_at = $2 WHERE id = $3\",\n \"descri"
},
{
"path": "crates/db/.sqlx/query-ab2693e557142354564a2882f3c321b350828419c440885c0f88840079b1c94e.json",
"chars": 539,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"UPDATE coding_agent_turns\\n SET seen = 1, updated_at = $1\\n "
},
{
"path": "crates/db/.sqlx/query-abbda92ba42bea0f7d17d0945d51b011bf50e7b36ee50ed74988e053f6fb0eec.json",
"chars": 384,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"UPDATE sessions SET\\n name = CASE WHEN $1 THEN $2 ELSE name END,\\n "
},
{
"path": "crates/db/.sqlx/query-abff188fc81caf44081e2053cb7841d1dc6c1a8965f4b862caa2f9cebcae0176.json",
"chars": 1616,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT id as \\\"id!: Uuid\\\",\\n file_path as \\\"file_path!\\\",\\n "
},
{
"path": "crates/db/.sqlx/query-b1edd509d00577007680243589ce59570182b98a1e9059d9702d97e9eaa9cbf5.json",
"chars": 615,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT COUNT(*) as \\\"count!: i64\\\"\\n FROM execution_processes ep\\n "
},
{
"path": "crates/db/.sqlx/query-b4476bedb8e5c0f7bc21654dc62fb00fbd8a41e24efaba55be8278031d71cc59.json",
"chars": 2442,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"INSERT INTO merges (\\n id, workspace_id, repo_id, merge_type, merge_"
},
{
"path": "crates/db/.sqlx/query-b4ff8dabb0d5c99319fad3f2f7e620523c96b89beaf1edd97f79d9972b93c8fe.json",
"chars": 354,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"UPDATE coding_agent_turns\\n SET agent_session_id = $1, updated_at = $"
},
{
"path": "crates/db/.sqlx/query-c097fa44c48e55f0e74f56577c0c1c4b3b92b2875d12c0bd1a70a1dcc4eda58e.json",
"chars": 430,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT EXISTS(SELECT 1 FROM workspaces WHERE container_ref = ?) as \\\"exists!: bool\\"
},
{
"path": "crates/db/.sqlx/query-c24119a35ed2099b886a0b1a9a41adf01d1a1f86792abf3d3a410c6cbab2ec0f.json",
"chars": 2807,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT r.id as \\\"id!: Uuid\\\",\\n r.path,\\n "
},
{
"path": "crates/db/.sqlx/query-c27f2fd6b3696cb5a8ec54226608440786a6cec601783f797be3a8c515080d62.json",
"chars": 377,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"DELETE FROM repos\\n WHERE id NOT IN (SELECT repo_id FROM project_repo"
},
{
"path": "crates/db/.sqlx/query-c422aa419f267df88b65557ccb897ba98c01970a68866eb7028b791f04da2b39.json",
"chars": 1162,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"\\n SELECT\\n id as \\\"id!: Uuid\\\",\\n "
},
{
"path": "crates/db/.sqlx/query-c5a45e39543468b57c2e3662735c640210c3948113dcbd1be8339f2c27506b76.json",
"chars": 299,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"UPDATE workspaces SET branch = $1, updated_at = datetime('now') WHERE id = $2\",\n \""
},
{
"path": "crates/db/.sqlx/query-c793ee8493c54ea295a62a51650d00894fdad2f2cadc5665ae1e16a605626cb2.json",
"chars": 495,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT remote_id as \\\"remote_id: Uuid\\\"\\n FROM migration_state\\n "
},
{
"path": "crates/db/.sqlx/query-cac90f2884c7c0eed4d2ab621016a5bc62dfbcb65539eb4a52e3306f96c0698a.json",
"chars": 1523,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"INSERT INTO sessions (id, workspace_id, name, executor, agent_working_dir)\\n "
},
{
"path": "crates/db/.sqlx/query-cd6d7ca74442a100d9caf170ac43118795226f50b8392069b47abd4f7564c135.json",
"chars": 1309,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT\\n COALESCE(SUM(CASE WHEN status = 'pending' THEN 1 ELSE 0 END"
},
{
"path": "crates/db/.sqlx/query-d41acd2bd3c805f9787c0d468a25ce62bfa8b268131c19b83fd76acb59a8c9ea.json",
"chars": 311,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"UPDATE workspaces SET worktree_deleted = FALSE, updated_at = datetime('now') WHERE "
},
{
"path": "crates/db/.sqlx/query-d7a11078522c029b71a75f4a45abc941536d3ce08d8ee0fcbde3eacf6360b7d5.json",
"chars": 2604,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT\\n ep.id as \\\"id!: Uuid\\\",\\n "
},
{
"path": "crates/db/.sqlx/query-d9f7205a1a749c23c928ef2861783446bd99a7b7939929dee1f8a409bb99ab04.json",
"chars": 707,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"\\n SELECT DISTINCT s.workspace_id as \\\"workspace_id!: Uuid\\\"\\n "
},
{
"path": "crates/db/.sqlx/query-db1b29e1ea843ee4024c914820978a558f0ac4cc65da76645ccff4748240e565.json",
"chars": 1950,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"INSERT INTO coding_agent_turns (\\n id, execution_process_id, agent_s"
},
{
"path": "crates/db/.sqlx/query-db39f7ab7391c1289299e7f8aa7e1f642874eed0179e91a9558f9df534db797c.json",
"chars": 1427,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT id AS \\\"id!: Uuid\\\",\\n workspace_id AS \\\"workspace_id!:"
},
{
"path": "crates/db/.sqlx/query-dc5d0ad507cbd962235c9e85c3e43f34c7c38eb2e08ab7899073010a6e77b37d.json",
"chars": 1609,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT id as \\\"id!: Uuid\\\",\\n file_path as \\\"file_path!\\\",\\n "
},
{
"path": "crates/db/.sqlx/query-dc88d70bb25b6437580480c346ed29fb90115e3b83fa36d8966b62f02990b9c7.json",
"chars": 354,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"UPDATE coding_agent_turns\\n SET agent_message_id = $1, updated_at = $"
},
{
"path": "crates/db/.sqlx/query-dd0d0e3fd03f130aab947d13580796eee9a786e2ca01d339fd0e8356f8ad3824.json",
"chars": 252,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"DELETE FROM tags WHERE id = $1\",\n \"describe\": {\n \"columns\": [],\n \"parameters"
},
{
"path": "crates/db/.sqlx/query-df2f35912a8055dff6cb24c83ea67fc49b432f457961fa584c6a13389bfdcea5.json",
"chars": 1721,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT i.id as \\\"id!: Uuid\\\",\\n i.file_path as \\\"file_path!\\\","
},
{
"path": "crates/db/.sqlx/query-df66eae37a24c07c2ae0a521c802e3828ac153e6c087edcf2ba4dbe621dc79d3.json",
"chars": 1486,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT id as \\\"id!: Uuid\\\", project_id as \\\"project_id!: Uuid\\\", title, description"
},
{
"path": "crates/db/.sqlx/query-e41bedcff88553343a55112c9c0688efdae03ddb4249d0636b69934f5cd4d8fd.json",
"chars": 1143,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"\\n SELECT\\n id as \\\"id!: Uuid\\\",\\n "
},
{
"path": "crates/db/.sqlx/query-ee06dfd8dc7fc2ffc239db9635a3a5cac2e603992392a632bff7d450c6bca061.json",
"chars": 1876,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"INSERT INTO migration_state (id, entity_type, local_id)\\n VALUES ($1, $2"
},
{
"path": "crates/db/.sqlx/query-efce74898a8e81dafc3933231e8ac3c07be392e1c073e62c621138c00d0ed30d.json",
"chars": 310,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"UPDATE workspaces SET worktree_deleted = TRUE, updated_at = datetime('now') WHERE i"
},
{
"path": "crates/db/.sqlx/query-f2dbb49b2f839e84a46fdd865d9982b758160517b93bc92d8e12060426daa05d.json",
"chars": 2233,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT id AS \\\"id!: Uuid\\\",\\n task_id "
},
{
"path": "crates/db/.sqlx/query-f584dbe0f2f2a4f1e7dcf5b8f675eb2a6d954bb3f148ac0fece10652f05fb49b.json",
"chars": 678,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT ep.executor_action as \\\"executor_action!: sqlx::types::Json<ExecutorActionFi"
},
{
"path": "crates/db/.sqlx/query-f9e8640c28fae8aebf3d8b0d3984804fdb3f197c8cc2d5750fd267c82e3e68a1.json",
"chars": 2736,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT DISTINCT r.id as \\\"id!: Uuid\\\",\\n r.path,\\n "
},
{
"path": "crates/db/.sqlx/query-faae305f6ac9dc7d04d21c76531cde3912647430195267ffa5b99bb9a7df1feb.json",
"chars": 2365,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT\\n id as \\\"id!: Uuid\\\",\\n workspace_id as \\\"wor"
},
{
"path": "crates/db/.sqlx/query-fb1ab168509b38eccf3064e2a90690a3fdef67a98fee7e5943689e61818d34f0.json",
"chars": 1755,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT\\n id as \\\"id!: Uuid\\\",\\n "
},
{
"path": "crates/db/.sqlx/query-fc90f4dd7a408d6129aff95538de22c3a1ca018bc7837e3dc1c5aa0007844887.json",
"chars": 1766,
"preview": "{\n \"db_name\": \"SQLite\",\n \"query\": \"SELECT\\n id as \\\"id!: Uuid\\\",\\n execution_process_id "
},
{
"path": "crates/db/Cargo.toml",
"chars": 664,
"preview": "[package]\nname = \"db\"\nversion = \"0.1.33\"\nedition = \"2024\"\n\n[dependencies]\nutils = { path = \"../utils\" }\nexecutors = { pa"
},
{
"path": "crates/db/migrations/20250617183714_init.sql",
"chars": 1764,
"preview": "PRAGMA foreign_keys = ON;\n\nCREATE TABLE projects (\n id BLOB PRIMARY KEY,\n name TEXT NOT NULL,\n"
},
{
"path": "crates/db/migrations/20250620212427_execution_processes.sql",
"chars": 1228,
"preview": "PRAGMA foreign_keys = ON;\n\nCREATE TABLE execution_processes (\n id BLOB PRIMARY KEY,\n task_attempt_i"
},
{
"path": "crates/db/migrations/20250620214100_remove_stdout_stderr_from_task_attempts.sql",
"chars": 1126,
"preview": "PRAGMA foreign_keys = ON;\n\n-- Remove stdout and stderr columns from task_attempts table\n-- These are now tracked in the "
},
{
"path": "crates/db/migrations/20250621120000_relate_activities_to_execution_processes.sql",
"chars": 1140,
"preview": "-- Migration to relate task_attempt_activities to execution_processes instead of task_attempts\n-- This migration will:\n-"
},
{
"path": "crates/db/migrations/20250623120000_executor_sessions.sql",
"chars": 928,
"preview": "PRAGMA foreign_keys = ON;\n\nCREATE TABLE executor_sessions (\n id BLOB PRIMARY KEY,\n task_attempt"
},
{
"path": "crates/db/migrations/20250623130000_add_executor_type_to_execution_processes.sql",
"chars": 147,
"preview": "PRAGMA foreign_keys = ON;\n\n-- Add executor_type column to execution_processes table\nALTER TABLE execution_processes ADD "
},
{
"path": "crates/db/migrations/20250625000000_add_dev_script_to_projects.sql",
"chars": 130,
"preview": "PRAGMA foreign_keys = ON;\n\n-- Add dev_script column to projects table\nALTER TABLE projects ADD COLUMN dev_script TEXT DE"
},
{
"path": "crates/db/migrations/20250701000000_add_branch_to_task_attempts.sql",
"chars": 114,
"preview": "-- Add branch column to task_attempts table\nALTER TABLE task_attempts ADD COLUMN branch TEXT NOT NULL DEFAULT '';\n"
},
{
"path": "crates/db/migrations/20250701000001_add_pr_tracking_to_task_attempts.sql",
"chars": 292,
"preview": "-- Add PR tracking fields to task_attempts table\nALTER TABLE task_attempts ADD COLUMN pr_url TEXT;\nALTER TABLE task_atte"
},
{
"path": "crates/db/migrations/20250701120000_add_assistant_message_to_executor_sessions.sql",
"chars": 104,
"preview": "-- Add summary column to executor_sessions table\nALTER TABLE executor_sessions ADD COLUMN summary TEXT;\n"
},
{
"path": "crates/db/migrations/20250708000000_add_base_branch_to_task_attempts.sql",
"chars": 147,
"preview": "-- Add base_branch column to task_attempts table with default value\nALTER TABLE task_attempts ADD COLUMN base_branch TEX"
},
{
"path": "crates/db/migrations/20250709000000_add_worktree_deleted_flag.sql",
"chars": 153,
"preview": "-- Add worktree_deleted flag to track when worktrees are cleaned up\nALTER TABLE task_attempts ADD COLUMN worktree_delete"
},
{
"path": "crates/db/migrations/20250710000000_add_setup_completion.sql",
"chars": 194,
"preview": "-- Add setup completion tracking to task_attempts table\n-- This enables automatic setup script execution for recreated w"
},
{
"path": "crates/db/migrations/20250715154859_add_task_templates.sql",
"chars": 1050,
"preview": "-- Add task templates tables\nCREATE TABLE task_templates (\n id BLOB PRIMARY KEY,\n project_id BLOB, "
},
{
"path": "crates/db/migrations/20250716143725_add_default_templates.sql",
"chars": 5082,
"preview": "-- Add default global templates\n\n-- 1. Bug Analysis template\nINSERT INTO task_templates (\n id,\n project_id,\n ti"
},
{
"path": "crates/db/migrations/20250716161432_update_executor_names_to_kebab_case.sql",
"chars": 656,
"preview": "-- Migration to update executor type names from snake_case/camelCase to kebab-case\n-- This handles the change from charm"
},
{
"path": "crates/db/migrations/20250716170000_add_parent_task_to_tasks.sql",
"chars": 282,
"preview": "PRAGMA foreign_keys = ON;\n\n-- Add parent_task_attempt column to tasks table\nALTER TABLE tasks ADD COLUMN parent_task_att"
},
{
"path": "crates/db/migrations/20250717000000_drop_task_attempt_activities.sql",
"chars": 336,
"preview": "-- Migration to drop task_attempt_activities table\n-- This removes the task attempt activity tracking functionality\n\n-- "
},
{
"path": "crates/db/migrations/20250719000000_add_cleanup_script_to_projects.sql",
"chars": 100,
"preview": "-- Add cleanup_script column to projects table\nALTER TABLE projects ADD COLUMN cleanup_script TEXT;\n"
},
{
"path": "crates/db/migrations/20250720000000_add_cleanupscript_to_process_type_constraint.sql",
"chars": 919,
"preview": "-- 1. Add the replacement column with the wider CHECK\nALTER TABLE execution_processes\n ADD COLUMN process_type_new TEXT"
},
{
"path": "crates/db/migrations/20250726182144_update_worktree_path_to_container_ref.sql",
"chars": 297,
"preview": "-- Add migration script here\n\nALTER TABLE task_attempts ADD COLUMN container_ref TEXT; -- nullable\nUPDATE task_attempts"
},
{
"path": "crates/db/migrations/20250726210910_make_branch_optional.sql",
"chars": 545,
"preview": "-- Add migration script here\n\n-- 1) Create replacement column (nullable TEXT)\nALTER TABLE task_attempts ADD COLUMN branc"
}
]
// ... and 1582 more files (download for full content)
About this extraction
This page contains the full source code of the BloopAI/vibe-kanban GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1782 files (8.6 MB), approximately 2.4M tokens, and a symbol index with 8062 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.