diff --git a/crates/db/.sqlx/query-04520564f1eaac8491598976ff58b540443f2f1dc35b5a186f243b297089e34b.json b/crates/db/.sqlx/query-04520564f1eaac8491598976ff58b540443f2f1dc35b5a186f243b297089e34b.json deleted file mode 100644 index ddac89474d..0000000000 --- a/crates/db/.sqlx/query-04520564f1eaac8491598976ff58b540443f2f1dc35b5a186f243b297089e34b.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "db_name": "SQLite", - "query": "SELECT r.id as \"id!: Uuid\",\n r.path,\n r.name,\n r.display_name, \n r.created_at as \"created_at!: DateTime\",\n r.updated_at as \"updated_at!: DateTime\"\n FROM repos r\n JOIN project_repos pr ON r.id = pr.repo_id\n WHERE pr.project_id = $1\n ORDER BY r.display_name ASC", - "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": "created_at!: DateTime", - "ordinal": 4, - "type_info": "Text" - }, - { - "name": "updated_at!: DateTime", - "ordinal": 5, - "type_info": "Text" - } - ], - "parameters": { - "Right": 1 - }, - "nullable": [ - true, - false, - false, - false, - false, - false - ] - }, - "hash": "04520564f1eaac8491598976ff58b540443f2f1dc35b5a186f243b297089e34b" -} diff --git a/crates/db/.sqlx/query-0c9ee0273c78ae47634deb65dba5c052d7d21810b34bcd0bd498e4fc3de0b259.json b/crates/db/.sqlx/query-0c9ee0273c78ae47634deb65dba5c052d7d21810b34bcd0bd498e4fc3de0b259.json deleted file mode 100644 index 3d5279f246..0000000000 --- a/crates/db/.sqlx/query-0c9ee0273c78ae47634deb65dba5c052d7d21810b34bcd0bd498e4fc3de0b259.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "db_name": "SQLite", - "query": "SELECT pr.id as \"id!: Uuid\",\n pr.project_id as \"project_id!: Uuid\",\n pr.repo_id as \"repo_id!: Uuid\",\n r.name as \"repo_name!\",\n pr.setup_script,\n pr.cleanup_script,\n pr.copy_files,\n pr.parallel_setup_script as \"parallel_setup_script!: bool\"\n FROM project_repos pr\n JOIN repos r ON r.id = pr.repo_id\n WHERE pr.project_id = $1\n ORDER BY r.display_name ASC", - "describe": { - "columns": [ - { - "name": "id!: Uuid", - "ordinal": 0, - "type_info": "Blob" - }, - { - "name": "project_id!: Uuid", - "ordinal": 1, - "type_info": "Blob" - }, - { - "name": "repo_id!: Uuid", - "ordinal": 2, - "type_info": "Blob" - }, - { - "name": "repo_name!", - "ordinal": 3, - "type_info": "Text" - }, - { - "name": "setup_script", - "ordinal": 4, - "type_info": "Text" - }, - { - "name": "cleanup_script", - "ordinal": 5, - "type_info": "Text" - }, - { - "name": "copy_files", - "ordinal": 6, - "type_info": "Text" - }, - { - "name": "parallel_setup_script!: bool", - "ordinal": 7, - "type_info": "Integer" - } - ], - "parameters": { - "Right": 1 - }, - "nullable": [ - true, - false, - false, - false, - true, - true, - true, - false - ] - }, - "hash": "0c9ee0273c78ae47634deb65dba5c052d7d21810b34bcd0bd498e4fc3de0b259" -} diff --git a/crates/db/.sqlx/query-0de4c4f0d2e2eb13dad04fe330b452361ab582a973ca51b2272bd2e1829cfd50.json b/crates/db/.sqlx/query-0de4c4f0d2e2eb13dad04fe330b452361ab582a973ca51b2272bd2e1829cfd50.json deleted file mode 100644 index 136cc665fd..0000000000 --- a/crates/db/.sqlx/query-0de4c4f0d2e2eb13dad04fe330b452361ab582a973ca51b2272bd2e1829cfd50.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "db_name": "SQLite", - "query": "SELECT DISTINCT r.id as \"id!: Uuid\",\n r.path,\n r.name,\n r.display_name,\n r.created_at as \"created_at!: DateTime\",\n r.updated_at as \"updated_at!: DateTime\"\n FROM repos r\n JOIN workspace_repos wr ON r.id = wr.repo_id\n JOIN workspaces w ON wr.workspace_id = w.id\n WHERE w.task_id = $1\n ORDER BY r.display_name ASC", - "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": "created_at!: DateTime", - "ordinal": 4, - "type_info": "Text" - }, - { - "name": "updated_at!: DateTime", - "ordinal": 5, - "type_info": "Text" - } - ], - "parameters": { - "Right": 1 - }, - "nullable": [ - true, - false, - false, - false, - false, - false - ] - }, - "hash": "0de4c4f0d2e2eb13dad04fe330b452361ab582a973ca51b2272bd2e1829cfd50" -} diff --git a/crates/db/.sqlx/query-11c9a90eade69a77abc178d1692426951cf5a6988f17c9fa01cd60cd29d3decf.json b/crates/db/.sqlx/query-11c9a90eade69a77abc178d1692426951cf5a6988f17c9fa01cd60cd29d3decf.json new file mode 100644 index 0000000000..d9b3f3f277 --- /dev/null +++ b/crates/db/.sqlx/query-11c9a90eade69a77abc178d1692426951cf5a6988f17c9fa01cd60cd29d3decf.json @@ -0,0 +1,80 @@ +{ + "db_name": "SQLite", + "query": "SELECT r.id as \"id!: Uuid\",\n r.path,\n r.name,\n r.display_name,\n r.setup_script,\n r.cleanup_script,\n r.copy_files,\n r.parallel_setup_script as \"parallel_setup_script!: bool\",\n r.dev_server_script,\n r.created_at as \"created_at!: DateTime\",\n r.updated_at as \"updated_at!: DateTime\"\n FROM repos r\n JOIN workspace_repos wr ON r.id = wr.repo_id\n WHERE wr.workspace_id = $1\n ORDER BY r.display_name ASC", + "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": "copy_files", + "ordinal": 6, + "type_info": "Text" + }, + { + "name": "parallel_setup_script!: bool", + "ordinal": 7, + "type_info": "Integer" + }, + { + "name": "dev_server_script", + "ordinal": 8, + "type_info": "Text" + }, + { + "name": "created_at!: DateTime", + "ordinal": 9, + "type_info": "Text" + }, + { + "name": "updated_at!: DateTime", + "ordinal": 10, + "type_info": "Text" + } + ], + "parameters": { + "Right": 1 + }, + "nullable": [ + true, + false, + false, + false, + true, + true, + true, + false, + true, + false, + false + ] + }, + "hash": "11c9a90eade69a77abc178d1692426951cf5a6988f17c9fa01cd60cd29d3decf" +} diff --git a/crates/db/.sqlx/query-1a91842cd32944b358169caa306d79bfa1fc5a7141a7b767a3bfb578ea33d215.json b/crates/db/.sqlx/query-1a91842cd32944b358169caa306d79bfa1fc5a7141a7b767a3bfb578ea33d215.json new file mode 100644 index 0000000000..b07d66ae11 --- /dev/null +++ b/crates/db/.sqlx/query-1a91842cd32944b358169caa306d79bfa1fc5a7141a7b767a3bfb578ea33d215.json @@ -0,0 +1,80 @@ +{ + "db_name": "SQLite", + "query": "SELECT DISTINCT r.id as \"id!: Uuid\",\n r.path,\n r.name,\n r.display_name,\n r.setup_script,\n r.cleanup_script,\n r.copy_files,\n r.parallel_setup_script as \"parallel_setup_script!: bool\",\n r.dev_server_script,\n r.created_at as \"created_at!: DateTime\",\n r.updated_at as \"updated_at!: DateTime\"\n FROM repos r\n JOIN workspace_repos wr ON r.id = wr.repo_id\n JOIN workspaces w ON wr.workspace_id = w.id\n WHERE w.task_id = $1\n ORDER BY r.display_name ASC", + "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": "copy_files", + "ordinal": 6, + "type_info": "Text" + }, + { + "name": "parallel_setup_script!: bool", + "ordinal": 7, + "type_info": "Integer" + }, + { + "name": "dev_server_script", + "ordinal": 8, + "type_info": "Text" + }, + { + "name": "created_at!: DateTime", + "ordinal": 9, + "type_info": "Text" + }, + { + "name": "updated_at!: DateTime", + "ordinal": 10, + "type_info": "Text" + } + ], + "parameters": { + "Right": 1 + }, + "nullable": [ + true, + false, + false, + false, + true, + true, + true, + false, + true, + false, + false + ] + }, + "hash": "1a91842cd32944b358169caa306d79bfa1fc5a7141a7b767a3bfb578ea33d215" +} diff --git a/crates/db/.sqlx/query-1c513f6c9d9025fa5dda8133a1be2d620301068c177d13b12a776c8c88104e2b.json b/crates/db/.sqlx/query-1c513f6c9d9025fa5dda8133a1be2d620301068c177d13b12a776c8c88104e2b.json deleted file mode 100644 index ff319618f8..0000000000 --- a/crates/db/.sqlx/query-1c513f6c9d9025fa5dda8133a1be2d620301068c177d13b12a776c8c88104e2b.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "db_name": "SQLite", - "query": "INSERT INTO project_repos (id, project_id, repo_id)\n VALUES ($1, $2, $3)\n RETURNING id as \"id!: Uuid\",\n project_id as \"project_id!: Uuid\",\n repo_id as \"repo_id!: Uuid\",\n setup_script,\n cleanup_script,\n copy_files,\n parallel_setup_script as \"parallel_setup_script!: bool\"", - "describe": { - "columns": [ - { - "name": "id!: Uuid", - "ordinal": 0, - "type_info": "Blob" - }, - { - "name": "project_id!: Uuid", - "ordinal": 1, - "type_info": "Blob" - }, - { - "name": "repo_id!: Uuid", - "ordinal": 2, - "type_info": "Blob" - }, - { - "name": "setup_script", - "ordinal": 3, - "type_info": "Text" - }, - { - "name": "cleanup_script", - "ordinal": 4, - "type_info": "Text" - }, - { - "name": "copy_files", - "ordinal": 5, - "type_info": "Text" - }, - { - "name": "parallel_setup_script!: bool", - "ordinal": 6, - "type_info": "Integer" - } - ], - "parameters": { - "Right": 3 - }, - "nullable": [ - true, - false, - false, - true, - true, - true, - false - ] - }, - "hash": "1c513f6c9d9025fa5dda8133a1be2d620301068c177d13b12a776c8c88104e2b" -} diff --git a/crates/db/.sqlx/query-ff1ddf3ed4bed81adf8e1d3b8e3c3c8f0fcb9dc51511250f3c32501d8d60f0f0.json b/crates/db/.sqlx/query-1c537a70bcefc0439d1194329ac1e9f3b91bfbfa0d21d377eaaa6bf847320664.json similarity index 62% rename from crates/db/.sqlx/query-ff1ddf3ed4bed81adf8e1d3b8e3c3c8f0fcb9dc51511250f3c32501d8d60f0f0.json rename to crates/db/.sqlx/query-1c537a70bcefc0439d1194329ac1e9f3b91bfbfa0d21d377eaaa6bf847320664.json index b076836a5e..4cb50e8855 100644 --- a/crates/db/.sqlx/query-ff1ddf3ed4bed81adf8e1d3b8e3c3c8f0fcb9dc51511250f3c32501d8d60f0f0.json +++ b/crates/db/.sqlx/query-1c537a70bcefc0439d1194329ac1e9f3b91bfbfa0d21d377eaaa6bf847320664.json @@ -1,6 +1,6 @@ { "db_name": "SQLite", - "query": "INSERT INTO projects (\n id,\n name\n ) VALUES (\n $1, $2\n )\n RETURNING id as \"id!: Uuid\",\n name,\n dev_script,\n dev_script_working_dir,\n default_agent_working_dir,\n remote_project_id as \"remote_project_id: Uuid\",\n created_at as \"created_at!: DateTime\",\n updated_at as \"updated_at!: DateTime\"", + "query": "INSERT INTO projects (\n id,\n name\n ) VALUES (\n $1, $2\n )\n RETURNING 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\",\n updated_at as \"updated_at!: DateTime\"", "describe": { "columns": [ { @@ -13,34 +13,24 @@ "ordinal": 1, "type_info": "Text" }, - { - "name": "dev_script", - "ordinal": 2, - "type_info": "Text" - }, - { - "name": "dev_script_working_dir", - "ordinal": 3, - "type_info": "Text" - }, { "name": "default_agent_working_dir", - "ordinal": 4, + "ordinal": 2, "type_info": "Text" }, { "name": "remote_project_id: Uuid", - "ordinal": 5, + "ordinal": 3, "type_info": "Blob" }, { "name": "created_at!: DateTime", - "ordinal": 6, + "ordinal": 4, "type_info": "Text" }, { "name": "updated_at!: DateTime", - "ordinal": 7, + "ordinal": 5, "type_info": "Text" } ], @@ -48,8 +38,6 @@ "Right": 2 }, "nullable": [ - true, - false, true, false, false, @@ -58,5 +46,5 @@ false ] }, - "hash": "ff1ddf3ed4bed81adf8e1d3b8e3c3c8f0fcb9dc51511250f3c32501d8d60f0f0" + "hash": "1c537a70bcefc0439d1194329ac1e9f3b91bfbfa0d21d377eaaa6bf847320664" } diff --git a/crates/db/.sqlx/query-1eae64d51ea1d81c7239fc3640bb15bb59a51333602e7050bec3f5e8fc7fc782.json b/crates/db/.sqlx/query-20ca258823c512b29c3ce0088ec6d1595e13eadce66575987af9970fa4590069.json similarity index 56% rename from crates/db/.sqlx/query-1eae64d51ea1d81c7239fc3640bb15bb59a51333602e7050bec3f5e8fc7fc782.json rename to crates/db/.sqlx/query-20ca258823c512b29c3ce0088ec6d1595e13eadce66575987af9970fa4590069.json index 263900474a..0ed7303e14 100644 --- a/crates/db/.sqlx/query-1eae64d51ea1d81c7239fc3640bb15bb59a51333602e7050bec3f5e8fc7fc782.json +++ b/crates/db/.sqlx/query-20ca258823c512b29c3ce0088ec6d1595e13eadce66575987af9970fa4590069.json @@ -1,6 +1,6 @@ { "db_name": "SQLite", - "query": "SELECT id as \"id!: Uuid\",\n name,\n dev_script,\n dev_script_working_dir,\n default_agent_working_dir,\n remote_project_id as \"remote_project_id: Uuid\",\n created_at as \"created_at!: DateTime\",\n updated_at as \"updated_at!: DateTime\"\n FROM projects\n WHERE id = $1", + "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\",\n updated_at as \"updated_at!: DateTime\"\n FROM projects\n WHERE rowid = $1", "describe": { "columns": [ { @@ -13,34 +13,24 @@ "ordinal": 1, "type_info": "Text" }, - { - "name": "dev_script", - "ordinal": 2, - "type_info": "Text" - }, - { - "name": "dev_script_working_dir", - "ordinal": 3, - "type_info": "Text" - }, { "name": "default_agent_working_dir", - "ordinal": 4, + "ordinal": 2, "type_info": "Text" }, { "name": "remote_project_id: Uuid", - "ordinal": 5, + "ordinal": 3, "type_info": "Blob" }, { "name": "created_at!: DateTime", - "ordinal": 6, + "ordinal": 4, "type_info": "Text" }, { "name": "updated_at!: DateTime", - "ordinal": 7, + "ordinal": 5, "type_info": "Text" } ], @@ -52,11 +42,9 @@ false, true, true, - true, - true, false, false ] }, - "hash": "1eae64d51ea1d81c7239fc3640bb15bb59a51333602e7050bec3f5e8fc7fc782" + "hash": "20ca258823c512b29c3ce0088ec6d1595e13eadce66575987af9970fa4590069" } diff --git a/crates/db/.sqlx/query-23049e8ff32ee491346afb47628d71d1748508dabc033dd2fd059bab8c422630.json b/crates/db/.sqlx/query-23049e8ff32ee491346afb47628d71d1748508dabc033dd2fd059bab8c422630.json deleted file mode 100644 index 0d5b9832e2..0000000000 --- a/crates/db/.sqlx/query-23049e8ff32ee491346afb47628d71d1748508dabc033dd2fd059bab8c422630.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "db_name": "SQLite", - "query": "SELECT r.id as \"id!: Uuid\",\n r.path,\n r.name,\n r.display_name,\n r.created_at as \"created_at!: DateTime\",\n r.updated_at as \"updated_at!: DateTime\"\n FROM repos r\n JOIN workspace_repos wr ON r.id = wr.repo_id\n WHERE wr.workspace_id = $1\n ORDER BY r.display_name ASC", - "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": "created_at!: DateTime", - "ordinal": 4, - "type_info": "Text" - }, - { - "name": "updated_at!: DateTime", - "ordinal": 5, - "type_info": "Text" - } - ], - "parameters": { - "Right": 1 - }, - "nullable": [ - true, - false, - false, - false, - false, - false - ] - }, - "hash": "23049e8ff32ee491346afb47628d71d1748508dabc033dd2fd059bab8c422630" -} diff --git a/crates/db/.sqlx/query-9cdc6d55c24ff020a6599f59560c7f0d3feacfe64136bb1338bb4c447022f69b.json b/crates/db/.sqlx/query-2c0172d5b2c5bff0914727a57983d5c336f5b2dfa73ca6c2efa4ea23bb526e05.json similarity index 55% rename from crates/db/.sqlx/query-9cdc6d55c24ff020a6599f59560c7f0d3feacfe64136bb1338bb4c447022f69b.json rename to crates/db/.sqlx/query-2c0172d5b2c5bff0914727a57983d5c336f5b2dfa73ca6c2efa4ea23bb526e05.json index 08cd108b94..75186f56ee 100644 --- a/crates/db/.sqlx/query-9cdc6d55c24ff020a6599f59560c7f0d3feacfe64136bb1338bb4c447022f69b.json +++ b/crates/db/.sqlx/query-2c0172d5b2c5bff0914727a57983d5c336f5b2dfa73ca6c2efa4ea23bb526e05.json @@ -1,6 +1,6 @@ { "db_name": "SQLite", - "query": "SELECT id as \"id!: Uuid\",\n name,\n dev_script,\n dev_script_working_dir,\n default_agent_working_dir,\n remote_project_id as \"remote_project_id: Uuid\",\n created_at as \"created_at!: DateTime\",\n updated_at as \"updated_at!: DateTime\"\n FROM projects\n ORDER BY created_at DESC", + "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\",\n updated_at as \"updated_at!: DateTime\"\n FROM projects\n ORDER BY created_at DESC", "describe": { "columns": [ { @@ -13,34 +13,24 @@ "ordinal": 1, "type_info": "Text" }, - { - "name": "dev_script", - "ordinal": 2, - "type_info": "Text" - }, - { - "name": "dev_script_working_dir", - "ordinal": 3, - "type_info": "Text" - }, { "name": "default_agent_working_dir", - "ordinal": 4, + "ordinal": 2, "type_info": "Text" }, { "name": "remote_project_id: Uuid", - "ordinal": 5, + "ordinal": 3, "type_info": "Blob" }, { "name": "created_at!: DateTime", - "ordinal": 6, + "ordinal": 4, "type_info": "Text" }, { "name": "updated_at!: DateTime", - "ordinal": 7, + "ordinal": 5, "type_info": "Text" } ], @@ -52,11 +42,9 @@ false, true, true, - true, - true, false, false ] }, - "hash": "9cdc6d55c24ff020a6599f59560c7f0d3feacfe64136bb1338bb4c447022f69b" + "hash": "2c0172d5b2c5bff0914727a57983d5c336f5b2dfa73ca6c2efa4ea23bb526e05" } diff --git a/crates/db/.sqlx/query-368d9be9608fea5002627625bf8abd3e9073e06bb72fc75f11c2af13f1d43a10.json b/crates/db/.sqlx/query-368d9be9608fea5002627625bf8abd3e9073e06bb72fc75f11c2af13f1d43a10.json deleted file mode 100644 index 910193cc88..0000000000 --- a/crates/db/.sqlx/query-368d9be9608fea5002627625bf8abd3e9073e06bb72fc75f11c2af13f1d43a10.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "db_name": "SQLite", - "query": "\n SELECT p.id as \"id!: Uuid\", p.name, p.dev_script, p.dev_script_working_dir,\n p.default_agent_working_dir,\n p.remote_project_id as \"remote_project_id: Uuid\",\n p.created_at as \"created_at!: DateTime\", p.updated_at as \"updated_at!: DateTime\"\n FROM projects p\n WHERE p.id IN (\n SELECT DISTINCT t.project_id\n FROM tasks t\n INNER JOIN workspaces w ON w.task_id = t.id\n ORDER BY w.updated_at DESC\n )\n LIMIT $1\n ", - "describe": { - "columns": [ - { - "name": "id!: Uuid", - "ordinal": 0, - "type_info": "Blob" - }, - { - "name": "name", - "ordinal": 1, - "type_info": "Text" - }, - { - "name": "dev_script", - "ordinal": 2, - "type_info": "Text" - }, - { - "name": "dev_script_working_dir", - "ordinal": 3, - "type_info": "Text" - }, - { - "name": "default_agent_working_dir", - "ordinal": 4, - "type_info": "Text" - }, - { - "name": "remote_project_id: Uuid", - "ordinal": 5, - "type_info": "Blob" - }, - { - "name": "created_at!: DateTime", - "ordinal": 6, - "type_info": "Text" - }, - { - "name": "updated_at!: DateTime", - "ordinal": 7, - "type_info": "Text" - } - ], - "parameters": { - "Right": 1 - }, - "nullable": [ - true, - false, - true, - true, - true, - true, - false, - false - ] - }, - "hash": "368d9be9608fea5002627625bf8abd3e9073e06bb72fc75f11c2af13f1d43a10" -} diff --git a/crates/db/.sqlx/query-17789c934ca49a04a85505f1a9c861a575ee8fa2e8b6c9e9f4fc177c09caa53d.json b/crates/db/.sqlx/query-46226e272418a9080d4e350da68358dbe7c2a8b70af321e4a026ad985bbbc6fd.json similarity index 55% rename from crates/db/.sqlx/query-17789c934ca49a04a85505f1a9c861a575ee8fa2e8b6c9e9f4fc177c09caa53d.json rename to crates/db/.sqlx/query-46226e272418a9080d4e350da68358dbe7c2a8b70af321e4a026ad985bbbc6fd.json index 4b5eed086e..52e5f14157 100644 --- a/crates/db/.sqlx/query-17789c934ca49a04a85505f1a9c861a575ee8fa2e8b6c9e9f4fc177c09caa53d.json +++ b/crates/db/.sqlx/query-46226e272418a9080d4e350da68358dbe7c2a8b70af321e4a026ad985bbbc6fd.json @@ -1,6 +1,6 @@ { "db_name": "SQLite", - "query": "SELECT id as \"id!: Uuid\",\n name,\n dev_script,\n dev_script_working_dir,\n default_agent_working_dir,\n remote_project_id as \"remote_project_id: Uuid\",\n created_at as \"created_at!: DateTime\",\n updated_at as \"updated_at!: DateTime\"\n FROM projects\n WHERE rowid = $1", + "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\",\n updated_at as \"updated_at!: DateTime\"\n FROM projects\n WHERE remote_project_id = $1\n LIMIT 1", "describe": { "columns": [ { @@ -13,34 +13,24 @@ "ordinal": 1, "type_info": "Text" }, - { - "name": "dev_script", - "ordinal": 2, - "type_info": "Text" - }, - { - "name": "dev_script_working_dir", - "ordinal": 3, - "type_info": "Text" - }, { "name": "default_agent_working_dir", - "ordinal": 4, + "ordinal": 2, "type_info": "Text" }, { "name": "remote_project_id: Uuid", - "ordinal": 5, + "ordinal": 3, "type_info": "Blob" }, { "name": "created_at!: DateTime", - "ordinal": 6, + "ordinal": 4, "type_info": "Text" }, { "name": "updated_at!: DateTime", - "ordinal": 7, + "ordinal": 5, "type_info": "Text" } ], @@ -52,11 +42,9 @@ false, true, true, - true, - true, false, false ] }, - "hash": "17789c934ca49a04a85505f1a9c861a575ee8fa2e8b6c9e9f4fc177c09caa53d" + "hash": "46226e272418a9080d4e350da68358dbe7c2a8b70af321e4a026ad985bbbc6fd" } diff --git a/crates/db/.sqlx/query-5ec16f85616366bad8bdcccd9e57d6a7081f974c2f985cd65bfa89b6803edb45.json b/crates/db/.sqlx/query-5ec16f85616366bad8bdcccd9e57d6a7081f974c2f985cd65bfa89b6803edb45.json new file mode 100644 index 0000000000..8c6fc286aa --- /dev/null +++ b/crates/db/.sqlx/query-5ec16f85616366bad8bdcccd9e57d6a7081f974c2f985cd65bfa89b6803edb45.json @@ -0,0 +1,80 @@ +{ + "db_name": "SQLite", + "query": "SELECT r.id as \"id!: Uuid\",\n r.path,\n r.name,\n r.display_name,\n r.setup_script,\n r.cleanup_script,\n r.copy_files,\n r.parallel_setup_script as \"parallel_setup_script!: bool\",\n r.dev_server_script,\n r.created_at as \"created_at!: DateTime\",\n r.updated_at as \"updated_at!: DateTime\"\n FROM repos r\n JOIN project_repos pr ON r.id = pr.repo_id\n WHERE pr.project_id = $1\n ORDER BY r.display_name ASC", + "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": "copy_files", + "ordinal": 6, + "type_info": "Text" + }, + { + "name": "parallel_setup_script!: bool", + "ordinal": 7, + "type_info": "Integer" + }, + { + "name": "dev_server_script", + "ordinal": 8, + "type_info": "Text" + }, + { + "name": "created_at!: DateTime", + "ordinal": 9, + "type_info": "Text" + }, + { + "name": "updated_at!: DateTime", + "ordinal": 10, + "type_info": "Text" + } + ], + "parameters": { + "Right": 1 + }, + "nullable": [ + true, + false, + false, + false, + true, + true, + true, + false, + true, + false, + false + ] + }, + "hash": "5ec16f85616366bad8bdcccd9e57d6a7081f974c2f985cd65bfa89b6803edb45" +} diff --git a/crates/db/.sqlx/query-929007c0ea1cd26a8ddc2ee2993285009017dc33e4472bd4bbe7a0adff798f2b.json b/crates/db/.sqlx/query-5ff9809face43fe1f071dfda62b6a30f4a32a9aaace29caf89b95c224482201b.json similarity index 53% rename from crates/db/.sqlx/query-929007c0ea1cd26a8ddc2ee2993285009017dc33e4472bd4bbe7a0adff798f2b.json rename to crates/db/.sqlx/query-5ff9809face43fe1f071dfda62b6a30f4a32a9aaace29caf89b95c224482201b.json index b5f8868659..908fa82e2d 100644 --- a/crates/db/.sqlx/query-929007c0ea1cd26a8ddc2ee2993285009017dc33e4472bd4bbe7a0adff798f2b.json +++ b/crates/db/.sqlx/query-5ff9809face43fe1f071dfda62b6a30f4a32a9aaace29caf89b95c224482201b.json @@ -1,6 +1,6 @@ { "db_name": "SQLite", - "query": "SELECT r.id as \"id!: Uuid\", r.path, r.name, pr.copy_files\n FROM repos r\n JOIN workspace_repos wr ON r.id = wr.repo_id\n JOIN workspaces w ON w.id = wr.workspace_id\n JOIN tasks t ON t.id = w.task_id\n LEFT JOIN project_repos pr ON pr.project_id = t.project_id AND pr.repo_id = r.id\n WHERE wr.workspace_id = $1", + "query": "SELECT r.id as \"id!: Uuid\", r.path, r.name, r.copy_files\n FROM repos r\n JOIN workspace_repos wr ON r.id = wr.repo_id\n WHERE wr.workspace_id = $1", "describe": { "columns": [ { @@ -34,5 +34,5 @@ true ] }, - "hash": "929007c0ea1cd26a8ddc2ee2993285009017dc33e4472bd4bbe7a0adff798f2b" + "hash": "5ff9809face43fe1f071dfda62b6a30f4a32a9aaace29caf89b95c224482201b" } diff --git a/crates/db/.sqlx/query-64b5d84eb77fbd8dd733cd92faad07842b1093ec3e8120fefac5c5f7cd7f2f8e.json b/crates/db/.sqlx/query-64b5d84eb77fbd8dd733cd92faad07842b1093ec3e8120fefac5c5f7cd7f2f8e.json deleted file mode 100644 index a3309d85e8..0000000000 --- a/crates/db/.sqlx/query-64b5d84eb77fbd8dd733cd92faad07842b1093ec3e8120fefac5c5f7cd7f2f8e.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "db_name": "SQLite", - "query": "SELECT r.id as \"id!: Uuid\",\n r.path,\n r.name,\n r.display_name,\n r.created_at as \"created_at!: DateTime\",\n r.updated_at as \"updated_at!: DateTime\",\n wr.target_branch\n FROM repos r\n JOIN workspace_repos wr ON r.id = wr.repo_id\n WHERE wr.workspace_id = $1\n ORDER BY r.display_name ASC", - "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": "created_at!: DateTime", - "ordinal": 4, - "type_info": "Text" - }, - { - "name": "updated_at!: DateTime", - "ordinal": 5, - "type_info": "Text" - }, - { - "name": "target_branch", - "ordinal": 6, - "type_info": "Text" - } - ], - "parameters": { - "Right": 1 - }, - "nullable": [ - true, - false, - false, - false, - false, - false, - false - ] - }, - "hash": "64b5d84eb77fbd8dd733cd92faad07842b1093ec3e8120fefac5c5f7cd7f2f8e" -} diff --git a/crates/db/.sqlx/query-88c15c5c9f2c8edeef4d48c5fcad3607fbc3f7d1402d379d19ad3f4ae2dd0f7d.json b/crates/db/.sqlx/query-668116cde33817d78c0d2425a949c86bb5abfbffd291196bfa9b5c62a8f6e1fd.json similarity index 54% rename from crates/db/.sqlx/query-88c15c5c9f2c8edeef4d48c5fcad3607fbc3f7d1402d379d19ad3f4ae2dd0f7d.json rename to crates/db/.sqlx/query-668116cde33817d78c0d2425a949c86bb5abfbffd291196bfa9b5c62a8f6e1fd.json index 4099b7f012..16dac509e7 100644 --- a/crates/db/.sqlx/query-88c15c5c9f2c8edeef4d48c5fcad3607fbc3f7d1402d379d19ad3f4ae2dd0f7d.json +++ b/crates/db/.sqlx/query-668116cde33817d78c0d2425a949c86bb5abfbffd291196bfa9b5c62a8f6e1fd.json @@ -1,6 +1,6 @@ { "db_name": "SQLite", - "query": "SELECT id as \"id!: Uuid\",\n name,\n dev_script,\n dev_script_working_dir,\n default_agent_working_dir,\n remote_project_id as \"remote_project_id: Uuid\",\n created_at as \"created_at!: DateTime\",\n updated_at as \"updated_at!: DateTime\"\n FROM projects\n WHERE remote_project_id = $1\n LIMIT 1", + "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\",\n updated_at as \"updated_at!: DateTime\"\n FROM projects\n WHERE id = $1", "describe": { "columns": [ { @@ -13,34 +13,24 @@ "ordinal": 1, "type_info": "Text" }, - { - "name": "dev_script", - "ordinal": 2, - "type_info": "Text" - }, - { - "name": "dev_script_working_dir", - "ordinal": 3, - "type_info": "Text" - }, { "name": "default_agent_working_dir", - "ordinal": 4, + "ordinal": 2, "type_info": "Text" }, { "name": "remote_project_id: Uuid", - "ordinal": 5, + "ordinal": 3, "type_info": "Blob" }, { "name": "created_at!: DateTime", - "ordinal": 6, + "ordinal": 4, "type_info": "Text" }, { "name": "updated_at!: DateTime", - "ordinal": 7, + "ordinal": 5, "type_info": "Text" } ], @@ -52,11 +42,9 @@ false, true, true, - true, - true, false, false ] }, - "hash": "88c15c5c9f2c8edeef4d48c5fcad3607fbc3f7d1402d379d19ad3f4ae2dd0f7d" + "hash": "668116cde33817d78c0d2425a949c86bb5abfbffd291196bfa9b5c62a8f6e1fd" } diff --git a/crates/db/.sqlx/query-697001fc14562702ea84061e74bdcc6b9fbef679b8366ab46c1f629a633e9919.json b/crates/db/.sqlx/query-697001fc14562702ea84061e74bdcc6b9fbef679b8366ab46c1f629a633e9919.json deleted file mode 100644 index b814774124..0000000000 --- a/crates/db/.sqlx/query-697001fc14562702ea84061e74bdcc6b9fbef679b8366ab46c1f629a633e9919.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "db_name": "SQLite", - "query": "UPDATE projects\n SET name = $2, dev_script = $3, dev_script_working_dir = $4, default_agent_working_dir = $5\n WHERE id = $1\n RETURNING id as \"id!: Uuid\",\n name,\n dev_script,\n dev_script_working_dir,\n default_agent_working_dir,\n remote_project_id as \"remote_project_id: Uuid\",\n created_at as \"created_at!: DateTime\",\n updated_at as \"updated_at!: DateTime\"", - "describe": { - "columns": [ - { - "name": "id!: Uuid", - "ordinal": 0, - "type_info": "Blob" - }, - { - "name": "name", - "ordinal": 1, - "type_info": "Text" - }, - { - "name": "dev_script", - "ordinal": 2, - "type_info": "Text" - }, - { - "name": "dev_script_working_dir", - "ordinal": 3, - "type_info": "Text" - }, - { - "name": "default_agent_working_dir", - "ordinal": 4, - "type_info": "Text" - }, - { - "name": "remote_project_id: Uuid", - "ordinal": 5, - "type_info": "Blob" - }, - { - "name": "created_at!: DateTime", - "ordinal": 6, - "type_info": "Text" - }, - { - "name": "updated_at!: DateTime", - "ordinal": 7, - "type_info": "Text" - } - ], - "parameters": { - "Right": 5 - }, - "nullable": [ - true, - false, - true, - true, - true, - true, - false, - false - ] - }, - "hash": "697001fc14562702ea84061e74bdcc6b9fbef679b8366ab46c1f629a633e9919" -} diff --git a/crates/db/.sqlx/query-74e7bb2262fe70a09d8d2ff43f8ab85f6ae4effcd5e9547ee6f732e6b84c7fe1.json b/crates/db/.sqlx/query-74e7bb2262fe70a09d8d2ff43f8ab85f6ae4effcd5e9547ee6f732e6b84c7fe1.json new file mode 100644 index 0000000000..a7b01faa40 --- /dev/null +++ b/crates/db/.sqlx/query-74e7bb2262fe70a09d8d2ff43f8ab85f6ae4effcd5e9547ee6f732e6b84c7fe1.json @@ -0,0 +1,86 @@ +{ + "db_name": "SQLite", + "query": "SELECT r.id as \"id!: Uuid\",\n r.path,\n r.name,\n r.display_name,\n r.setup_script,\n r.cleanup_script,\n r.copy_files,\n r.parallel_setup_script as \"parallel_setup_script!: bool\",\n r.dev_server_script,\n r.created_at as \"created_at!: DateTime\",\n r.updated_at as \"updated_at!: DateTime\",\n wr.target_branch\n FROM repos r\n JOIN workspace_repos wr ON r.id = wr.repo_id\n WHERE wr.workspace_id = $1\n ORDER BY r.display_name ASC", + "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": "copy_files", + "ordinal": 6, + "type_info": "Text" + }, + { + "name": "parallel_setup_script!: bool", + "ordinal": 7, + "type_info": "Integer" + }, + { + "name": "dev_server_script", + "ordinal": 8, + "type_info": "Text" + }, + { + "name": "created_at!: DateTime", + "ordinal": 9, + "type_info": "Text" + }, + { + "name": "updated_at!: DateTime", + "ordinal": 10, + "type_info": "Text" + }, + { + "name": "target_branch", + "ordinal": 11, + "type_info": "Text" + } + ], + "parameters": { + "Right": 1 + }, + "nullable": [ + true, + false, + false, + false, + true, + true, + true, + false, + true, + false, + false, + false + ] + }, + "hash": "74e7bb2262fe70a09d8d2ff43f8ab85f6ae4effcd5e9547ee6f732e6b84c7fe1" +} diff --git a/crates/db/.sqlx/query-7b2ab5f95df4b4044595b99352f94aff0fb372fd14d9a24f3e826300d662c33c.json b/crates/db/.sqlx/query-7b2ab5f95df4b4044595b99352f94aff0fb372fd14d9a24f3e826300d662c33c.json deleted file mode 100644 index efc11b0be1..0000000000 --- a/crates/db/.sqlx/query-7b2ab5f95df4b4044595b99352f94aff0fb372fd14d9a24f3e826300d662c33c.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "db_name": "SQLite", - "query": "SELECT id as \"id!: Uuid\",\n project_id as \"project_id!: Uuid\",\n repo_id as \"repo_id!: Uuid\",\n setup_script,\n cleanup_script,\n copy_files,\n parallel_setup_script as \"parallel_setup_script!: bool\"\n FROM project_repos\n WHERE project_id = $1 AND repo_id = $2", - "describe": { - "columns": [ - { - "name": "id!: Uuid", - "ordinal": 0, - "type_info": "Blob" - }, - { - "name": "project_id!: Uuid", - "ordinal": 1, - "type_info": "Blob" - }, - { - "name": "repo_id!: Uuid", - "ordinal": 2, - "type_info": "Blob" - }, - { - "name": "setup_script", - "ordinal": 3, - "type_info": "Text" - }, - { - "name": "cleanup_script", - "ordinal": 4, - "type_info": "Text" - }, - { - "name": "copy_files", - "ordinal": 5, - "type_info": "Text" - }, - { - "name": "parallel_setup_script!: bool", - "ordinal": 6, - "type_info": "Integer" - } - ], - "parameters": { - "Right": 2 - }, - "nullable": [ - true, - false, - false, - true, - true, - true, - false - ] - }, - "hash": "7b2ab5f95df4b4044595b99352f94aff0fb372fd14d9a24f3e826300d662c33c" -} diff --git a/crates/db/.sqlx/query-7de695b99239b7357d072eccea37dc827fecdad8a7e927b9fbf9a075fd229648.json b/crates/db/.sqlx/query-7de695b99239b7357d072eccea37dc827fecdad8a7e927b9fbf9a075fd229648.json new file mode 100644 index 0000000000..597492c129 --- /dev/null +++ b/crates/db/.sqlx/query-7de695b99239b7357d072eccea37dc827fecdad8a7e927b9fbf9a075fd229648.json @@ -0,0 +1,80 @@ +{ + "db_name": "SQLite", + "query": "SELECT id as \"id!: Uuid\",\n path,\n name,\n display_name,\n setup_script,\n cleanup_script,\n copy_files,\n parallel_setup_script as \"parallel_setup_script!: bool\",\n dev_server_script,\n created_at as \"created_at!: DateTime\",\n updated_at as \"updated_at!: DateTime\"\n FROM repos\n WHERE name = '__NEEDS_BACKFILL__'", + "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": "copy_files", + "ordinal": 6, + "type_info": "Text" + }, + { + "name": "parallel_setup_script!: bool", + "ordinal": 7, + "type_info": "Integer" + }, + { + "name": "dev_server_script", + "ordinal": 8, + "type_info": "Text" + }, + { + "name": "created_at!: DateTime", + "ordinal": 9, + "type_info": "Text" + }, + { + "name": "updated_at!: DateTime", + "ordinal": 10, + "type_info": "Text" + } + ], + "parameters": { + "Right": 0 + }, + "nullable": [ + true, + false, + false, + false, + true, + true, + true, + false, + true, + false, + false + ] + }, + "hash": "7de695b99239b7357d072eccea37dc827fecdad8a7e927b9fbf9a075fd229648" +} diff --git a/crates/db/.sqlx/query-7edace28ea37dd4b02df4025976e5cc5ac1ebd50d183b9d7059b7850d37a8f58.json b/crates/db/.sqlx/query-7edace28ea37dd4b02df4025976e5cc5ac1ebd50d183b9d7059b7850d37a8f58.json new file mode 100644 index 0000000000..f5c978e255 --- /dev/null +++ b/crates/db/.sqlx/query-7edace28ea37dd4b02df4025976e5cc5ac1ebd50d183b9d7059b7850d37a8f58.json @@ -0,0 +1,80 @@ +{ + "db_name": "SQLite", + "query": "SELECT id as \"id!: Uuid\",\n path,\n name,\n display_name,\n setup_script,\n cleanup_script,\n copy_files,\n parallel_setup_script as \"parallel_setup_script!: bool\",\n dev_server_script,\n created_at as \"created_at!: DateTime\",\n updated_at as \"updated_at!: DateTime\"\n FROM repos\n ORDER BY display_name ASC", + "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": "copy_files", + "ordinal": 6, + "type_info": "Text" + }, + { + "name": "parallel_setup_script!: bool", + "ordinal": 7, + "type_info": "Integer" + }, + { + "name": "dev_server_script", + "ordinal": 8, + "type_info": "Text" + }, + { + "name": "created_at!: DateTime", + "ordinal": 9, + "type_info": "Text" + }, + { + "name": "updated_at!: DateTime", + "ordinal": 10, + "type_info": "Text" + } + ], + "parameters": { + "Right": 0 + }, + "nullable": [ + true, + false, + false, + false, + true, + true, + true, + false, + true, + false, + false + ] + }, + "hash": "7edace28ea37dd4b02df4025976e5cc5ac1ebd50d183b9d7059b7850d37a8f58" +} diff --git a/crates/db/.sqlx/query-8348406206f4853743a834ebe9929ee82d10805be336aeac6e914176398afc05.json b/crates/db/.sqlx/query-8348406206f4853743a834ebe9929ee82d10805be336aeac6e914176398afc05.json new file mode 100644 index 0000000000..48b865e751 --- /dev/null +++ b/crates/db/.sqlx/query-8348406206f4853743a834ebe9929ee82d10805be336aeac6e914176398afc05.json @@ -0,0 +1,32 @@ +{ + "db_name": "SQLite", + "query": "SELECT id as \"id!: Uuid\",\n project_id as \"project_id!: Uuid\",\n repo_id as \"repo_id!: Uuid\"\n FROM project_repos\n WHERE repo_id = $1", + "describe": { + "columns": [ + { + "name": "id!: Uuid", + "ordinal": 0, + "type_info": "Blob" + }, + { + "name": "project_id!: Uuid", + "ordinal": 1, + "type_info": "Blob" + }, + { + "name": "repo_id!: Uuid", + "ordinal": 2, + "type_info": "Blob" + } + ], + "parameters": { + "Right": 1 + }, + "nullable": [ + true, + false, + false + ] + }, + "hash": "8348406206f4853743a834ebe9929ee82d10805be336aeac6e914176398afc05" +} diff --git a/crates/db/.sqlx/query-522e135173280ab71f7ba25b35efccb3eaeb7dc5fe778595887f70f62aae8df7.json b/crates/db/.sqlx/query-83509bd233fc17609ceca5820f63b7319f0e5f75246a916370efd655db5314e1.json similarity index 51% rename from crates/db/.sqlx/query-522e135173280ab71f7ba25b35efccb3eaeb7dc5fe778595887f70f62aae8df7.json rename to crates/db/.sqlx/query-83509bd233fc17609ceca5820f63b7319f0e5f75246a916370efd655db5314e1.json index 6a20d5bb28..e875995e7a 100644 --- a/crates/db/.sqlx/query-522e135173280ab71f7ba25b35efccb3eaeb7dc5fe778595887f70f62aae8df7.json +++ b/crates/db/.sqlx/query-83509bd233fc17609ceca5820f63b7319f0e5f75246a916370efd655db5314e1.json @@ -1,6 +1,6 @@ { "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 created_at as \"created_at!: DateTime\",\n updated_at as \"updated_at!: DateTime\"", + "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 copy_files,\n parallel_setup_script as \"parallel_setup_script!: bool\",\n dev_server_script,\n created_at as \"created_at!: DateTime\",\n updated_at as \"updated_at!: DateTime\"", "describe": { "columns": [ { @@ -24,14 +24,39 @@ "type_info": "Text" }, { - "name": "created_at!: DateTime", + "name": "setup_script", "ordinal": 4, "type_info": "Text" }, { - "name": "updated_at!: DateTime", + "name": "cleanup_script", "ordinal": 5, "type_info": "Text" + }, + { + "name": "copy_files", + "ordinal": 6, + "type_info": "Text" + }, + { + "name": "parallel_setup_script!: bool", + "ordinal": 7, + "type_info": "Integer" + }, + { + "name": "dev_server_script", + "ordinal": 8, + "type_info": "Text" + }, + { + "name": "created_at!: DateTime", + "ordinal": 9, + "type_info": "Text" + }, + { + "name": "updated_at!: DateTime", + "ordinal": 10, + "type_info": "Text" } ], "parameters": { @@ -42,9 +67,14 @@ false, false, false, + true, + true, + true, + false, + true, false, false ] }, - "hash": "522e135173280ab71f7ba25b35efccb3eaeb7dc5fe778595887f70f62aae8df7" + "hash": "83509bd233fc17609ceca5820f63b7319f0e5f75246a916370efd655db5314e1" } diff --git a/crates/db/.sqlx/query-89abf784f6f0f38649512169dd4f6d49eb13184deeb91fbd32587343ff0d86ef.json b/crates/db/.sqlx/query-89abf784f6f0f38649512169dd4f6d49eb13184deeb91fbd32587343ff0d86ef.json new file mode 100644 index 0000000000..3d7b297a99 --- /dev/null +++ b/crates/db/.sqlx/query-89abf784f6f0f38649512169dd4f6d49eb13184deeb91fbd32587343ff0d86ef.json @@ -0,0 +1,32 @@ +{ + "db_name": "SQLite", + "query": "INSERT INTO project_repos (id, project_id, repo_id)\n VALUES ($1, $2, $3)\n RETURNING id as \"id!: Uuid\",\n project_id as \"project_id!: Uuid\",\n repo_id as \"repo_id!: Uuid\"", + "describe": { + "columns": [ + { + "name": "id!: Uuid", + "ordinal": 0, + "type_info": "Blob" + }, + { + "name": "project_id!: Uuid", + "ordinal": 1, + "type_info": "Blob" + }, + { + "name": "repo_id!: Uuid", + "ordinal": 2, + "type_info": "Blob" + } + ], + "parameters": { + "Right": 3 + }, + "nullable": [ + true, + false, + false + ] + }, + "hash": "89abf784f6f0f38649512169dd4f6d49eb13184deeb91fbd32587343ff0d86ef" +} diff --git a/crates/db/.sqlx/query-97531ada6561e0e08312b7e54a580d391ec093499d0becd3c9634156d5cfc11d.json b/crates/db/.sqlx/query-97531ada6561e0e08312b7e54a580d391ec093499d0becd3c9634156d5cfc11d.json new file mode 100644 index 0000000000..6d7cdc8d0a --- /dev/null +++ b/crates/db/.sqlx/query-97531ada6561e0e08312b7e54a580d391ec093499d0becd3c9634156d5cfc11d.json @@ -0,0 +1,32 @@ +{ + "db_name": "SQLite", + "query": "SELECT id as \"id!: Uuid\",\n project_id as \"project_id!: Uuid\",\n repo_id as \"repo_id!: Uuid\"\n FROM project_repos\n WHERE project_id = $1", + "describe": { + "columns": [ + { + "name": "id!: Uuid", + "ordinal": 0, + "type_info": "Blob" + }, + { + "name": "project_id!: Uuid", + "ordinal": 1, + "type_info": "Blob" + }, + { + "name": "repo_id!: Uuid", + "ordinal": 2, + "type_info": "Blob" + } + ], + "parameters": { + "Right": 1 + }, + "nullable": [ + true, + false, + false + ] + }, + "hash": "97531ada6561e0e08312b7e54a580d391ec093499d0becd3c9634156d5cfc11d" +} diff --git a/crates/db/.sqlx/query-a235097176aa925424bf705f8a08dfb2e2b118324b9bee1b711a79a916b53810.json b/crates/db/.sqlx/query-a235097176aa925424bf705f8a08dfb2e2b118324b9bee1b711a79a916b53810.json deleted file mode 100644 index 4306668a90..0000000000 --- a/crates/db/.sqlx/query-a235097176aa925424bf705f8a08dfb2e2b118324b9bee1b711a79a916b53810.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "db_name": "SQLite", - "query": "SELECT id as \"id!: Uuid\",\n path,\n name,\n display_name,\n created_at as \"created_at!: DateTime\",\n updated_at as \"updated_at!: DateTime\"\n FROM repos\n WHERE id = $1", - "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": "created_at!: DateTime", - "ordinal": 4, - "type_info": "Text" - }, - { - "name": "updated_at!: DateTime", - "ordinal": 5, - "type_info": "Text" - } - ], - "parameters": { - "Right": 1 - }, - "nullable": [ - true, - false, - false, - false, - false, - false - ] - }, - "hash": "a235097176aa925424bf705f8a08dfb2e2b118324b9bee1b711a79a916b53810" -} diff --git a/crates/db/.sqlx/query-b2a5ded645013226c6c89950cc228ab7cbd620fb3548bce1ebf51266ecb89334.json b/crates/db/.sqlx/query-b2a5ded645013226c6c89950cc228ab7cbd620fb3548bce1ebf51266ecb89334.json new file mode 100644 index 0000000000..c3423c348d --- /dev/null +++ b/crates/db/.sqlx/query-b2a5ded645013226c6c89950cc228ab7cbd620fb3548bce1ebf51266ecb89334.json @@ -0,0 +1,80 @@ +{ + "db_name": "SQLite", + "query": "UPDATE repos\n SET display_name = $1,\n setup_script = $2,\n cleanup_script = $3,\n copy_files = $4,\n parallel_setup_script = $5,\n dev_server_script = $6,\n updated_at = datetime('now', 'subsec')\n WHERE id = $7\n RETURNING id as \"id!: Uuid\",\n path,\n name,\n display_name,\n setup_script,\n cleanup_script,\n copy_files,\n parallel_setup_script as \"parallel_setup_script!: bool\",\n dev_server_script,\n created_at as \"created_at!: DateTime\",\n updated_at as \"updated_at!: DateTime\"", + "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": "copy_files", + "ordinal": 6, + "type_info": "Text" + }, + { + "name": "parallel_setup_script!: bool", + "ordinal": 7, + "type_info": "Integer" + }, + { + "name": "dev_server_script", + "ordinal": 8, + "type_info": "Text" + }, + { + "name": "created_at!: DateTime", + "ordinal": 9, + "type_info": "Text" + }, + { + "name": "updated_at!: DateTime", + "ordinal": 10, + "type_info": "Text" + } + ], + "parameters": { + "Right": 7 + }, + "nullable": [ + true, + false, + false, + false, + true, + true, + true, + false, + true, + false, + false + ] + }, + "hash": "b2a5ded645013226c6c89950cc228ab7cbd620fb3548bce1ebf51266ecb89334" +} diff --git a/crates/db/.sqlx/query-b3f813568712e971b44f6cdffa6d136700abaa3fc99417b1107c341899f293af.json b/crates/db/.sqlx/query-b3f813568712e971b44f6cdffa6d136700abaa3fc99417b1107c341899f293af.json new file mode 100644 index 0000000000..153ce178d8 --- /dev/null +++ b/crates/db/.sqlx/query-b3f813568712e971b44f6cdffa6d136700abaa3fc99417b1107c341899f293af.json @@ -0,0 +1,80 @@ +{ + "db_name": "SQLite", + "query": "SELECT id as \"id!: Uuid\",\n path,\n name,\n display_name,\n setup_script,\n cleanup_script,\n copy_files,\n parallel_setup_script as \"parallel_setup_script!: bool\",\n dev_server_script,\n created_at as \"created_at!: DateTime\",\n updated_at as \"updated_at!: DateTime\"\n FROM repos\n WHERE id = $1", + "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": "copy_files", + "ordinal": 6, + "type_info": "Text" + }, + { + "name": "parallel_setup_script!: bool", + "ordinal": 7, + "type_info": "Integer" + }, + { + "name": "dev_server_script", + "ordinal": 8, + "type_info": "Text" + }, + { + "name": "created_at!: DateTime", + "ordinal": 9, + "type_info": "Text" + }, + { + "name": "updated_at!: DateTime", + "ordinal": 10, + "type_info": "Text" + } + ], + "parameters": { + "Right": 1 + }, + "nullable": [ + true, + false, + false, + false, + true, + true, + true, + false, + true, + false, + false + ] + }, + "hash": "b3f813568712e971b44f6cdffa6d136700abaa3fc99417b1107c341899f293af" +} diff --git a/crates/db/.sqlx/query-b5bd7735bd092073e7f643cdbe3644919764a83158e6d8cfb2238ebc13fc9b4b.json b/crates/db/.sqlx/query-b5bd7735bd092073e7f643cdbe3644919764a83158e6d8cfb2238ebc13fc9b4b.json new file mode 100644 index 0000000000..634c6e7d3b --- /dev/null +++ b/crates/db/.sqlx/query-b5bd7735bd092073e7f643cdbe3644919764a83158e6d8cfb2238ebc13fc9b4b.json @@ -0,0 +1,32 @@ +{ + "db_name": "SQLite", + "query": "SELECT id as \"id!: Uuid\",\n project_id as \"project_id!: Uuid\",\n repo_id as \"repo_id!: Uuid\"\n FROM project_repos\n WHERE project_id = $1 AND repo_id = $2", + "describe": { + "columns": [ + { + "name": "id!: Uuid", + "ordinal": 0, + "type_info": "Blob" + }, + { + "name": "project_id!: Uuid", + "ordinal": 1, + "type_info": "Blob" + }, + { + "name": "repo_id!: Uuid", + "ordinal": 2, + "type_info": "Blob" + } + ], + "parameters": { + "Right": 2 + }, + "nullable": [ + true, + false, + false + ] + }, + "hash": "b5bd7735bd092073e7f643cdbe3644919764a83158e6d8cfb2238ebc13fc9b4b" +} diff --git a/crates/db/.sqlx/query-c00f47bc6ad969ae325c15a5ade865489b8b90309f68101b7ed39a517cf473cb.json b/crates/db/.sqlx/query-c00f47bc6ad969ae325c15a5ade865489b8b90309f68101b7ed39a517cf473cb.json deleted file mode 100644 index ea1358ef76..0000000000 --- a/crates/db/.sqlx/query-c00f47bc6ad969ae325c15a5ade865489b8b90309f68101b7ed39a517cf473cb.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "db_name": "SQLite", - "query": "UPDATE project_repos\n SET setup_script = $1,\n cleanup_script = $2,\n copy_files = $3,\n parallel_setup_script = $4\n WHERE project_id = $5 AND repo_id = $6\n RETURNING id as \"id!: Uuid\",\n project_id as \"project_id!: Uuid\",\n repo_id as \"repo_id!: Uuid\",\n setup_script,\n cleanup_script,\n copy_files,\n parallel_setup_script as \"parallel_setup_script!: bool\"", - "describe": { - "columns": [ - { - "name": "id!: Uuid", - "ordinal": 0, - "type_info": "Blob" - }, - { - "name": "project_id!: Uuid", - "ordinal": 1, - "type_info": "Blob" - }, - { - "name": "repo_id!: Uuid", - "ordinal": 2, - "type_info": "Blob" - }, - { - "name": "setup_script", - "ordinal": 3, - "type_info": "Text" - }, - { - "name": "cleanup_script", - "ordinal": 4, - "type_info": "Text" - }, - { - "name": "copy_files", - "ordinal": 5, - "type_info": "Text" - }, - { - "name": "parallel_setup_script!: bool", - "ordinal": 6, - "type_info": "Integer" - } - ], - "parameters": { - "Right": 6 - }, - "nullable": [ - true, - false, - false, - true, - true, - true, - false - ] - }, - "hash": "c00f47bc6ad969ae325c15a5ade865489b8b90309f68101b7ed39a517cf473cb" -} diff --git a/crates/db/.sqlx/query-c6ca04f8ad0f3f918e83a3960b78f1f5215066f9bb46917fc8e50afe86a6da73.json b/crates/db/.sqlx/query-c6ca04f8ad0f3f918e83a3960b78f1f5215066f9bb46917fc8e50afe86a6da73.json deleted file mode 100644 index 916d224b3c..0000000000 --- a/crates/db/.sqlx/query-c6ca04f8ad0f3f918e83a3960b78f1f5215066f9bb46917fc8e50afe86a6da73.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "db_name": "SQLite", - "query": "SELECT id as \"id!: Uuid\",\n path,\n name,\n display_name,\n created_at as \"created_at!: DateTime\",\n updated_at as \"updated_at!: DateTime\"\n FROM repos\n WHERE name = '__NEEDS_BACKFILL__'", - "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": "created_at!: DateTime", - "ordinal": 4, - "type_info": "Text" - }, - { - "name": "updated_at!: DateTime", - "ordinal": 5, - "type_info": "Text" - } - ], - "parameters": { - "Right": 0 - }, - "nullable": [ - true, - false, - false, - false, - false, - false - ] - }, - "hash": "c6ca04f8ad0f3f918e83a3960b78f1f5215066f9bb46917fc8e50afe86a6da73" -} diff --git a/crates/db/.sqlx/query-c72348c44cbae9a9605c6d069b97e1391a7fb3600290df9521cf2d8841a3f2b2.json b/crates/db/.sqlx/query-c72348c44cbae9a9605c6d069b97e1391a7fb3600290df9521cf2d8841a3f2b2.json deleted file mode 100644 index 3c79c826aa..0000000000 --- a/crates/db/.sqlx/query-c72348c44cbae9a9605c6d069b97e1391a7fb3600290df9521cf2d8841a3f2b2.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "db_name": "SQLite", - "query": "SELECT id as \"id!: Uuid\",\n project_id as \"project_id!: Uuid\",\n repo_id as \"repo_id!: Uuid\",\n setup_script,\n cleanup_script,\n copy_files,\n parallel_setup_script as \"parallel_setup_script!: bool\"\n FROM project_repos\n WHERE repo_id = $1", - "describe": { - "columns": [ - { - "name": "id!: Uuid", - "ordinal": 0, - "type_info": "Blob" - }, - { - "name": "project_id!: Uuid", - "ordinal": 1, - "type_info": "Blob" - }, - { - "name": "repo_id!: Uuid", - "ordinal": 2, - "type_info": "Blob" - }, - { - "name": "setup_script", - "ordinal": 3, - "type_info": "Text" - }, - { - "name": "cleanup_script", - "ordinal": 4, - "type_info": "Text" - }, - { - "name": "copy_files", - "ordinal": 5, - "type_info": "Text" - }, - { - "name": "parallel_setup_script!: bool", - "ordinal": 6, - "type_info": "Integer" - } - ], - "parameters": { - "Right": 1 - }, - "nullable": [ - true, - false, - false, - true, - true, - true, - false - ] - }, - "hash": "c72348c44cbae9a9605c6d069b97e1391a7fb3600290df9521cf2d8841a3f2b2" -} diff --git a/crates/db/.sqlx/query-dcfb1acc0883f660f3300aece1d8e7541bf474fe970664581dfb971345196ee9.json b/crates/db/.sqlx/query-dcfb1acc0883f660f3300aece1d8e7541bf474fe970664581dfb971345196ee9.json new file mode 100644 index 0000000000..03a3318351 --- /dev/null +++ b/crates/db/.sqlx/query-dcfb1acc0883f660f3300aece1d8e7541bf474fe970664581dfb971345196ee9.json @@ -0,0 +1,50 @@ +{ + "db_name": "SQLite", + "query": "\n SELECT p.id as \"id!: Uuid\", p.name,\n p.default_agent_working_dir,\n p.remote_project_id as \"remote_project_id: Uuid\",\n p.created_at as \"created_at!: DateTime\", p.updated_at as \"updated_at!: DateTime\"\n FROM projects p\n WHERE p.id IN (\n SELECT DISTINCT t.project_id\n FROM tasks t\n INNER JOIN workspaces w ON w.task_id = t.id\n ORDER BY w.updated_at DESC\n )\n LIMIT $1\n ", + "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", + "ordinal": 4, + "type_info": "Text" + }, + { + "name": "updated_at!: DateTime", + "ordinal": 5, + "type_info": "Text" + } + ], + "parameters": { + "Right": 1 + }, + "nullable": [ + true, + false, + true, + true, + false, + false + ] + }, + "hash": "dcfb1acc0883f660f3300aece1d8e7541bf474fe970664581dfb971345196ee9" +} diff --git a/crates/db/.sqlx/query-e3f01fc53c00ee217b823ca588dc9a5320c9ba6ddf2bd718c817dfbf5fefd21c.json b/crates/db/.sqlx/query-e3f01fc53c00ee217b823ca588dc9a5320c9ba6ddf2bd718c817dfbf5fefd21c.json new file mode 100644 index 0000000000..5dfa4f8648 --- /dev/null +++ b/crates/db/.sqlx/query-e3f01fc53c00ee217b823ca588dc9a5320c9ba6ddf2bd718c817dfbf5fefd21c.json @@ -0,0 +1,50 @@ +{ + "db_name": "SQLite", + "query": "UPDATE projects\n SET name = $2, default_agent_working_dir = $3\n WHERE id = $1\n RETURNING 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\",\n updated_at as \"updated_at!: DateTime\"", + "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", + "ordinal": 4, + "type_info": "Text" + }, + { + "name": "updated_at!: DateTime", + "ordinal": 5, + "type_info": "Text" + } + ], + "parameters": { + "Right": 3 + }, + "nullable": [ + true, + false, + true, + true, + false, + false + ] + }, + "hash": "e3f01fc53c00ee217b823ca588dc9a5320c9ba6ddf2bd718c817dfbf5fefd21c" +} diff --git a/crates/db/.sqlx/query-eeb190cd03af76eb61174d8b27812f2f3a7b6f4bdafdb298b46aedea19ca5623.json b/crates/db/.sqlx/query-eeb190cd03af76eb61174d8b27812f2f3a7b6f4bdafdb298b46aedea19ca5623.json deleted file mode 100644 index ae0e581c06..0000000000 --- a/crates/db/.sqlx/query-eeb190cd03af76eb61174d8b27812f2f3a7b6f4bdafdb298b46aedea19ca5623.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "db_name": "SQLite", - "query": "SELECT id as \"id!: Uuid\",\n project_id as \"project_id!: Uuid\",\n repo_id as \"repo_id!: Uuid\",\n setup_script,\n cleanup_script,\n copy_files,\n parallel_setup_script as \"parallel_setup_script!: bool\"\n FROM project_repos\n WHERE project_id = $1", - "describe": { - "columns": [ - { - "name": "id!: Uuid", - "ordinal": 0, - "type_info": "Blob" - }, - { - "name": "project_id!: Uuid", - "ordinal": 1, - "type_info": "Blob" - }, - { - "name": "repo_id!: Uuid", - "ordinal": 2, - "type_info": "Blob" - }, - { - "name": "setup_script", - "ordinal": 3, - "type_info": "Text" - }, - { - "name": "cleanup_script", - "ordinal": 4, - "type_info": "Text" - }, - { - "name": "copy_files", - "ordinal": 5, - "type_info": "Text" - }, - { - "name": "parallel_setup_script!: bool", - "ordinal": 6, - "type_info": "Integer" - } - ], - "parameters": { - "Right": 1 - }, - "nullable": [ - true, - false, - false, - true, - true, - true, - false - ] - }, - "hash": "eeb190cd03af76eb61174d8b27812f2f3a7b6f4bdafdb298b46aedea19ca5623" -} diff --git a/crates/db/migrations/20260107000000_move_scripts_to_repos.sql b/crates/db/migrations/20260107000000_move_scripts_to_repos.sql new file mode 100644 index 0000000000..71f186ff35 --- /dev/null +++ b/crates/db/migrations/20260107000000_move_scripts_to_repos.sql @@ -0,0 +1,37 @@ +-- Add script columns to repos +ALTER TABLE repos ADD COLUMN setup_script TEXT; +ALTER TABLE repos ADD COLUMN cleanup_script TEXT; +ALTER TABLE repos ADD COLUMN copy_files TEXT; +ALTER TABLE repos ADD COLUMN parallel_setup_script INTEGER NOT NULL DEFAULT 0; +ALTER TABLE repos ADD COLUMN dev_server_script TEXT; + +-- Migrate from first project_repo (by rowid) for each repo +UPDATE repos +SET + setup_script = (SELECT pr.setup_script FROM project_repos pr WHERE pr.repo_id = repos.id ORDER BY pr.rowid ASC LIMIT 1), + cleanup_script = (SELECT pr.cleanup_script FROM project_repos pr WHERE pr.repo_id = repos.id ORDER BY pr.rowid ASC LIMIT 1), + copy_files = (SELECT pr.copy_files FROM project_repos pr WHERE pr.repo_id = repos.id ORDER BY pr.rowid ASC LIMIT 1), + parallel_setup_script = COALESCE((SELECT pr.parallel_setup_script FROM project_repos pr WHERE pr.repo_id = repos.id ORDER BY pr.rowid ASC LIMIT 1), 0); + +-- Migrate dev_script directly from projects to repos (via first project_repo) +UPDATE repos +SET dev_server_script = ( + SELECT p.dev_script + FROM projects p + JOIN project_repos pr ON pr.project_id = p.id + WHERE pr.repo_id = repos.id + AND p.dev_script IS NOT NULL + AND p.dev_script != '' + ORDER BY pr.rowid ASC + LIMIT 1 +); + +-- Remove script columns from project_repos +ALTER TABLE project_repos DROP COLUMN setup_script; +ALTER TABLE project_repos DROP COLUMN cleanup_script; +ALTER TABLE project_repos DROP COLUMN copy_files; +ALTER TABLE project_repos DROP COLUMN parallel_setup_script; + +-- Remove dev_script columns from projects +ALTER TABLE projects DROP COLUMN dev_script; +ALTER TABLE projects DROP COLUMN dev_script_working_dir; diff --git a/crates/db/src/models/project.rs b/crates/db/src/models/project.rs index c8a61e4698..e22086f881 100644 --- a/crates/db/src/models/project.rs +++ b/crates/db/src/models/project.rs @@ -21,8 +21,6 @@ pub enum ProjectError { pub struct Project { pub id: Uuid, pub name: String, - pub dev_script: Option, - pub dev_script_working_dir: Option, pub default_agent_working_dir: Option, pub remote_project_id: Option, #[ts(type = "Date")] @@ -40,8 +38,6 @@ pub struct CreateProject { #[derive(Debug, Deserialize, TS)] pub struct UpdateProject { pub name: Option, - pub dev_script: Option, - pub dev_script_working_dir: Option, pub default_agent_working_dir: Option, } @@ -74,8 +70,6 @@ impl Project { Project, r#"SELECT id as "id!: Uuid", name, - dev_script, - dev_script_working_dir, default_agent_working_dir, remote_project_id as "remote_project_id: Uuid", created_at as "created_at!: DateTime", @@ -92,7 +86,7 @@ impl Project { sqlx::query_as!( Project, r#" - SELECT p.id as "id!: Uuid", p.name, p.dev_script, p.dev_script_working_dir, + SELECT p.id as "id!: Uuid", p.name, p.default_agent_working_dir, p.remote_project_id as "remote_project_id: Uuid", p.created_at as "created_at!: DateTime", p.updated_at as "updated_at!: DateTime" @@ -116,8 +110,6 @@ impl Project { Project, r#"SELECT id as "id!: Uuid", name, - dev_script, - dev_script_working_dir, default_agent_working_dir, remote_project_id as "remote_project_id: Uuid", created_at as "created_at!: DateTime", @@ -135,8 +127,6 @@ impl Project { Project, r#"SELECT id as "id!: Uuid", name, - dev_script, - dev_script_working_dir, default_agent_working_dir, remote_project_id as "remote_project_id: Uuid", created_at as "created_at!: DateTime", @@ -157,8 +147,6 @@ impl Project { Project, r#"SELECT id as "id!: Uuid", name, - dev_script, - dev_script_working_dir, default_agent_working_dir, remote_project_id as "remote_project_id: Uuid", created_at as "created_at!: DateTime", @@ -187,8 +175,6 @@ impl Project { ) RETURNING id as "id!: Uuid", name, - dev_script, - dev_script_working_dir, default_agent_working_dir, remote_project_id as "remote_project_id: Uuid", created_at as "created_at!: DateTime", @@ -210,27 +196,21 @@ impl Project { .ok_or(sqlx::Error::RowNotFound)?; let name = payload.name.clone().unwrap_or(existing.name); - let dev_script = payload.dev_script.clone(); - let dev_script_working_dir = payload.dev_script_working_dir.clone(); let default_agent_working_dir = payload.default_agent_working_dir.clone(); sqlx::query_as!( Project, r#"UPDATE projects - SET name = $2, dev_script = $3, dev_script_working_dir = $4, default_agent_working_dir = $5 + SET name = $2, default_agent_working_dir = $3 WHERE id = $1 RETURNING id as "id!: Uuid", name, - dev_script, - dev_script_working_dir, default_agent_working_dir, remote_project_id as "remote_project_id: Uuid", created_at as "created_at!: DateTime", updated_at as "updated_at!: DateTime""#, id, name, - dev_script, - dev_script_working_dir, default_agent_working_dir, ) .fetch_one(pool) diff --git a/crates/db/src/models/project_repo.rs b/crates/db/src/models/project_repo.rs index f1ff36162d..a5ee455779 100644 --- a/crates/db/src/models/project_repo.rs +++ b/crates/db/src/models/project_repo.rs @@ -24,23 +24,6 @@ pub struct ProjectRepo { pub id: Uuid, pub project_id: Uuid, pub repo_id: Uuid, - pub setup_script: Option, - pub cleanup_script: Option, - pub copy_files: Option, - pub parallel_setup_script: bool, -} - -/// ProjectRepo with the associated repo name (for script execution in worktrees) -#[derive(Debug, Clone, FromRow)] -pub struct ProjectRepoWithName { - pub id: Uuid, - pub project_id: Uuid, - pub repo_id: Uuid, - pub repo_name: String, - pub setup_script: Option, - pub cleanup_script: Option, - pub copy_files: Option, - pub parallel_setup_script: bool, } #[derive(Debug, Clone, Deserialize, TS)] @@ -49,15 +32,6 @@ pub struct CreateProjectRepo { pub git_repo_path: String, } -#[derive(Debug, Clone, Deserialize, TS)] -#[ts(export)] -pub struct UpdateProjectRepo { - pub setup_script: Option, - pub cleanup_script: Option, - pub copy_files: Option, - pub parallel_setup_script: Option, -} - impl ProjectRepo { pub async fn find_by_project_id( pool: &SqlitePool, @@ -67,11 +41,7 @@ impl ProjectRepo { ProjectRepo, r#"SELECT id as "id!: Uuid", project_id as "project_id!: Uuid", - repo_id as "repo_id!: Uuid", - setup_script, - cleanup_script, - copy_files, - parallel_setup_script as "parallel_setup_script!: bool" + repo_id as "repo_id!: Uuid" FROM project_repos WHERE project_id = $1"#, project_id @@ -88,11 +58,7 @@ impl ProjectRepo { ProjectRepo, r#"SELECT id as "id!: Uuid", project_id as "project_id!: Uuid", - repo_id as "repo_id!: Uuid", - setup_script, - cleanup_script, - copy_files, - parallel_setup_script as "parallel_setup_script!: bool" + repo_id as "repo_id!: Uuid" FROM project_repos WHERE repo_id = $1"#, repo_id @@ -101,30 +67,6 @@ impl ProjectRepo { .await } - pub async fn find_by_project_id_with_names( - pool: &SqlitePool, - project_id: Uuid, - ) -> Result, sqlx::Error> { - sqlx::query_as!( - ProjectRepoWithName, - r#"SELECT pr.id as "id!: Uuid", - pr.project_id as "project_id!: Uuid", - pr.repo_id as "repo_id!: Uuid", - r.name as "repo_name!", - pr.setup_script, - pr.cleanup_script, - pr.copy_files, - pr.parallel_setup_script as "parallel_setup_script!: bool" - FROM project_repos pr - JOIN repos r ON r.id = pr.repo_id - WHERE pr.project_id = $1 - ORDER BY r.display_name ASC"#, - project_id - ) - .fetch_all(pool) - .await - } - pub async fn find_repos_for_project( pool: &SqlitePool, project_id: Uuid, @@ -134,7 +76,12 @@ impl ProjectRepo { r#"SELECT r.id as "id!: Uuid", r.path, r.name, - r.display_name, + r.display_name, + r.setup_script, + r.cleanup_script, + r.copy_files, + r.parallel_setup_script as "parallel_setup_script!: bool", + r.dev_server_script, r.created_at as "created_at!: DateTime", r.updated_at as "updated_at!: DateTime" FROM repos r @@ -156,11 +103,7 @@ impl ProjectRepo { ProjectRepo, r#"SELECT id as "id!: Uuid", project_id as "project_id!: Uuid", - repo_id as "repo_id!: Uuid", - setup_script, - cleanup_script, - copy_files, - parallel_setup_script as "parallel_setup_script!: bool" + repo_id as "repo_id!: Uuid" FROM project_repos WHERE project_id = $1 AND repo_id = $2"#, project_id, @@ -231,11 +174,7 @@ impl ProjectRepo { VALUES ($1, $2, $3) RETURNING id as "id!: Uuid", project_id as "project_id!: Uuid", - repo_id as "repo_id!: Uuid", - setup_script, - cleanup_script, - copy_files, - parallel_setup_script as "parallel_setup_script!: bool""#, + repo_id as "repo_id!: Uuid""#, id, project_id, repo_id @@ -243,47 +182,4 @@ impl ProjectRepo { .fetch_one(executor) .await } - - pub async fn update( - pool: &SqlitePool, - project_id: Uuid, - repo_id: Uuid, - payload: &UpdateProjectRepo, - ) -> Result { - let existing = Self::find_by_project_and_repo(pool, project_id, repo_id).await?; - let existing = existing.ok_or(ProjectRepoError::NotFound)?; - - let setup_script = payload.setup_script.clone(); - let cleanup_script = payload.cleanup_script.clone(); - let copy_files = payload.copy_files.clone(); - let parallel_setup_script = payload - .parallel_setup_script - .unwrap_or(existing.parallel_setup_script); - - sqlx::query_as!( - ProjectRepo, - r#"UPDATE project_repos - SET setup_script = $1, - cleanup_script = $2, - copy_files = $3, - parallel_setup_script = $4 - WHERE project_id = $5 AND repo_id = $6 - RETURNING id as "id!: Uuid", - project_id as "project_id!: Uuid", - repo_id as "repo_id!: Uuid", - setup_script, - cleanup_script, - copy_files, - parallel_setup_script as "parallel_setup_script!: bool""#, - setup_script, - cleanup_script, - copy_files, - parallel_setup_script, - project_id, - repo_id - ) - .fetch_one(pool) - .await - .map_err(ProjectRepoError::from) - } } diff --git a/crates/db/src/models/repo.rs b/crates/db/src/models/repo.rs index b39aec4d3d..abeb3517c6 100644 --- a/crates/db/src/models/repo.rs +++ b/crates/db/src/models/repo.rs @@ -21,12 +21,28 @@ pub struct Repo { pub path: PathBuf, pub name: String, pub display_name: String, + pub setup_script: Option, + pub cleanup_script: Option, + pub copy_files: Option, + pub parallel_setup_script: bool, + pub dev_server_script: Option, #[ts(type = "Date")] pub created_at: DateTime, #[ts(type = "Date")] pub updated_at: DateTime, } +#[derive(Debug, Clone, Deserialize, TS)] +#[ts(export)] +pub struct UpdateRepo { + pub display_name: Option, + pub setup_script: Option, + pub cleanup_script: Option, + pub copy_files: Option, + pub parallel_setup_script: Option, + pub dev_server_script: Option, +} + impl Repo { /// Get repos that still have the migration sentinel as their name. /// Used by the startup backfill to fix repo names. @@ -37,6 +53,11 @@ impl Repo { path, name, display_name, + setup_script, + cleanup_script, + copy_files, + parallel_setup_script as "parallel_setup_script!: bool", + dev_server_script, created_at as "created_at!: DateTime", updated_at as "updated_at!: DateTime" FROM repos @@ -70,6 +91,11 @@ impl Repo { path, name, display_name, + setup_script, + cleanup_script, + copy_files, + parallel_setup_script as "parallel_setup_script!: bool", + dev_server_script, created_at as "created_at!: DateTime", updated_at as "updated_at!: DateTime" FROM repos @@ -120,6 +146,11 @@ impl Repo { path, name, display_name, + setup_script, + cleanup_script, + copy_files, + parallel_setup_script as "parallel_setup_script!: bool", + dev_server_script, created_at as "created_at!: DateTime", updated_at as "updated_at!: DateTime""#, id, @@ -141,4 +172,81 @@ impl Repo { .await?; Ok(result.rows_affected()) } + + pub async fn list_all(pool: &SqlitePool) -> Result, sqlx::Error> { + sqlx::query_as!( + Repo, + r#"SELECT id as "id!: Uuid", + path, + name, + display_name, + setup_script, + cleanup_script, + copy_files, + parallel_setup_script as "parallel_setup_script!: bool", + dev_server_script, + created_at as "created_at!: DateTime", + updated_at as "updated_at!: DateTime" + FROM repos + ORDER BY display_name ASC"# + ) + .fetch_all(pool) + .await + } + + pub async fn update( + pool: &SqlitePool, + id: Uuid, + payload: &UpdateRepo, + ) -> Result { + let existing = Self::find_by_id(pool, id) + .await? + .ok_or(RepoError::NotFound)?; + + let display_name = payload + .display_name + .clone() + .unwrap_or(existing.display_name); + let setup_script = payload.setup_script.clone(); + let cleanup_script = payload.cleanup_script.clone(); + let copy_files = payload.copy_files.clone(); + let parallel_setup_script = payload + .parallel_setup_script + .unwrap_or(existing.parallel_setup_script); + let dev_server_script = payload.dev_server_script.clone(); + + sqlx::query_as!( + Repo, + r#"UPDATE repos + SET display_name = $1, + setup_script = $2, + cleanup_script = $3, + copy_files = $4, + parallel_setup_script = $5, + dev_server_script = $6, + updated_at = datetime('now', 'subsec') + WHERE id = $7 + RETURNING id as "id!: Uuid", + path, + name, + display_name, + setup_script, + cleanup_script, + copy_files, + parallel_setup_script as "parallel_setup_script!: bool", + dev_server_script, + created_at as "created_at!: DateTime", + updated_at as "updated_at!: DateTime""#, + display_name, + setup_script, + cleanup_script, + copy_files, + parallel_setup_script, + dev_server_script, + id + ) + .fetch_one(pool) + .await + .map_err(RepoError::from) + } } diff --git a/crates/db/src/models/workspace.rs b/crates/db/src/models/workspace.rs index cf53808d15..a99c67831e 100644 --- a/crates/db/src/models/workspace.rs +++ b/crates/db/src/models/workspace.rs @@ -1,6 +1,6 @@ use chrono::{DateTime, Utc}; use serde::{Deserialize, Serialize}; -use sqlx::{FromRow, SqlitePool, Type}; +use sqlx::{FromRow, SqlitePool}; use thiserror::Error; use ts_rs::TS; use uuid::Uuid; @@ -32,18 +32,6 @@ pub struct ContainerInfo { pub project_id: Uuid, } -#[derive(Debug, Clone, Type, Serialize, Deserialize, PartialEq, TS)] -#[sqlx(type_name = "workspace_status", rename_all = "lowercase")] -#[serde(rename_all = "lowercase")] -pub enum WorkspaceStatus { - SetupRunning, - SetupComplete, - SetupFailed, - ExecutorRunning, - ExecutorComplete, - ExecutorFailed, -} - #[derive(Debug, Clone, FromRow, Serialize, Deserialize, TS)] pub struct Workspace { pub id: Uuid, diff --git a/crates/db/src/models/workspace_repo.rs b/crates/db/src/models/workspace_repo.rs index 60a408dfde..4c198f3537 100644 --- a/crates/db/src/models/workspace_repo.rs +++ b/crates/db/src/models/workspace_repo.rs @@ -34,7 +34,7 @@ pub struct RepoWithTargetBranch { pub target_branch: String, } -/// Repo info with copy_files configuration from project_repos. +/// Repo info with copy_files configuration. #[derive(Debug, Clone)] pub struct RepoWithCopyFiles { pub id: Uuid, @@ -106,6 +106,11 @@ impl WorkspaceRepo { r.path, r.name, r.display_name, + r.setup_script, + r.cleanup_script, + r.copy_files, + r.parallel_setup_script as "parallel_setup_script!: bool", + r.dev_server_script, r.created_at as "created_at!: DateTime", r.updated_at as "updated_at!: DateTime" FROM repos r @@ -127,6 +132,11 @@ impl WorkspaceRepo { r.path, r.name, r.display_name, + r.setup_script, + r.cleanup_script, + r.copy_files, + r.parallel_setup_script as "parallel_setup_script!: bool", + r.dev_server_script, r.created_at as "created_at!: DateTime", r.updated_at as "updated_at!: DateTime", wr.target_branch @@ -147,6 +157,11 @@ impl WorkspaceRepo { path: PathBuf::from(row.path), name: row.name, display_name: row.display_name, + setup_script: row.setup_script, + cleanup_script: row.cleanup_script, + copy_files: row.copy_files, + parallel_setup_script: row.parallel_setup_script, + dev_server_script: row.dev_server_script, created_at: row.created_at, updated_at: row.updated_at, }, @@ -228,6 +243,11 @@ impl WorkspaceRepo { r.path, r.name, r.display_name, + r.setup_script, + r.cleanup_script, + r.copy_files, + r.parallel_setup_script as "parallel_setup_script!: bool", + r.dev_server_script, r.created_at as "created_at!: DateTime", r.updated_at as "updated_at!: DateTime" FROM repos r @@ -242,18 +262,14 @@ impl WorkspaceRepo { } /// Find repos for a workspace with their copy_files configuration. - /// Uses LEFT JOIN so repos without project_repo entries still appear (with NULL copy_files). pub async fn find_repos_with_copy_files( pool: &SqlitePool, workspace_id: Uuid, ) -> Result, sqlx::Error> { let rows = sqlx::query!( - r#"SELECT r.id as "id!: Uuid", r.path, r.name, pr.copy_files + r#"SELECT r.id as "id!: Uuid", r.path, r.name, r.copy_files FROM repos r JOIN workspace_repos wr ON r.id = wr.repo_id - JOIN workspaces w ON w.id = wr.workspace_id - JOIN tasks t ON t.id = w.task_id - LEFT JOIN project_repos pr ON pr.project_id = t.project_id AND pr.repo_id = r.id WHERE wr.workspace_id = $1"#, workspace_id ) diff --git a/crates/local-deployment/src/container.rs b/crates/local-deployment/src/container.rs index e5d9a449ad..1c92542dd6 100644 --- a/crates/local-deployment/src/container.rs +++ b/crates/local-deployment/src/container.rs @@ -18,7 +18,6 @@ use db::{ ExecutionContext, ExecutionProcess, ExecutionProcessRunReason, ExecutionProcessStatus, }, execution_process_repo_state::ExecutionProcessRepoState, - project_repo::ProjectRepo, repo::Repo, scratch::{DraftFollowUpData, Scratch, ScratchType}, task::{Task, TaskStatus}, @@ -828,9 +827,9 @@ impl LocalContainerService { ) .await?; - let project_repos = - ProjectRepo::find_by_project_id_with_names(&self.db.pool, ctx.project.id).await?; - let cleanup_action = self.cleanup_actions_for_repos(&project_repos); + let repos = + WorkspaceRepo::find_repos_for_workspace(&self.db.pool, ctx.workspace.id).await?; + let cleanup_action = self.cleanup_actions_for_repos(&repos); let working_dir = ctx .workspace diff --git a/crates/server/src/bin/generate_types.rs b/crates/server/src/bin/generate_types.rs index 1e977dddcd..50f00dace8 100644 --- a/crates/server/src/bin/generate_types.rs +++ b/crates/server/src/bin/generate_types.rs @@ -21,9 +21,9 @@ fn generate_types_content() -> String { db::models::project::SearchResult::decl(), db::models::project::SearchMatchType::decl(), db::models::repo::Repo::decl(), + db::models::repo::UpdateRepo::decl(), db::models::project_repo::ProjectRepo::decl(), db::models::project_repo::CreateProjectRepo::decl(), - db::models::project_repo::UpdateProjectRepo::decl(), db::models::workspace_repo::WorkspaceRepo::decl(), db::models::workspace_repo::CreateWorkspaceRepo::decl(), db::models::workspace_repo::RepoWithTargetBranch::decl(), @@ -134,7 +134,6 @@ fn generate_types_content() -> String { server::routes::task_attempts::pr::PrError::decl(), server::routes::task_attempts::BranchStatus::decl(), server::routes::task_attempts::RunScriptError::decl(), - server::routes::task_attempts::DeleteWorkspaceError::decl(), server::routes::task_attempts::pr::AttachPrResponse::decl(), server::routes::task_attempts::pr::AttachExistingPrRequest::decl(), server::routes::task_attempts::pr::PrCommentsResponse::decl(), diff --git a/crates/server/src/routes/projects.rs b/crates/server/src/routes/projects.rs index b5c856629d..c08424db54 100644 --- a/crates/server/src/routes/projects.rs +++ b/crates/server/src/routes/projects.rs @@ -14,7 +14,7 @@ use axum::{ }; use db::models::{ project::{CreateProject, Project, ProjectError, SearchResult, UpdateProject}, - project_repo::{CreateProjectRepo, ProjectRepo, UpdateProjectRepo}, + project_repo::{CreateProjectRepo, ProjectRepo}, repo::Repo, }; use deployment::Deployment; @@ -568,20 +568,6 @@ pub async fn get_project_repository( } } -pub async fn update_project_repository( - State(deployment): State, - Path((project_id, repo_id)): Path<(Uuid, Uuid)>, - Json(payload): Json, -) -> Result>, ApiError> { - match ProjectRepo::update(&deployment.db().pool, project_id, repo_id, &payload).await { - Ok(project_repo) => Ok(ResponseJson(ApiResponse::success(project_repo))), - Err(db::models::project_repo::ProjectRepoError::NotFound) => Err(ApiError::BadRequest( - "Repository not found in project".to_string(), - )), - Err(e) => Err(e.into()), - } -} - pub fn router(deployment: &DeploymentImpl) -> Router { let project_id_router = Router::new() .route( @@ -609,9 +595,7 @@ pub fn router(deployment: &DeploymentImpl) -> Router { .route("/", get(get_projects).post(create_project)) .route( "/{project_id}/repositories/{repo_id}", - get(get_project_repository) - .put(update_project_repository) - .delete(delete_project_repository), + get(get_project_repository).delete(delete_project_repository), ) .route("/stream/ws", get(stream_projects_ws)) .nest("/{id}", project_id_router); diff --git a/crates/server/src/routes/repo.rs b/crates/server/src/routes/repo.rs index 40e96b3230..476dcb9f21 100644 --- a/crates/server/src/routes/repo.rs +++ b/crates/server/src/routes/repo.rs @@ -4,7 +4,7 @@ use axum::{ response::Json as ResponseJson, routing::{get, post}, }; -use db::models::repo::Repo; +use db::models::repo::{Repo, UpdateRepo}; use deployment::Deployment; use serde::Deserialize; use services::services::git::GitBranch; @@ -92,6 +92,33 @@ pub async fn get_repos_batch( Ok(ResponseJson(ApiResponse::success(repos))) } +pub async fn get_repos( + State(deployment): State, +) -> Result>>, ApiError> { + let repos = Repo::list_all(&deployment.db().pool).await?; + Ok(ResponseJson(ApiResponse::success(repos))) +} + +pub async fn get_repo( + State(deployment): State, + Path(repo_id): Path, +) -> Result>, ApiError> { + let repo = deployment + .repo() + .get_by_id(&deployment.db().pool, repo_id) + .await?; + Ok(ResponseJson(ApiResponse::success(repo))) +} + +pub async fn update_repo( + State(deployment): State, + Path(repo_id): Path, + ResponseJson(payload): ResponseJson, +) -> Result>, ApiError> { + let repo = Repo::update(&deployment.db().pool, repo_id, &payload).await?; + Ok(ResponseJson(ApiResponse::success(repo))) +} + pub async fn open_repo_in_editor( State(deployment): State, Path(repo_id): Path, @@ -141,9 +168,10 @@ pub async fn open_repo_in_editor( pub fn router() -> Router { Router::new() - .route("/repos", post(register_repo)) + .route("/repos", get(get_repos).post(register_repo)) .route("/repos/init", post(init_repo)) .route("/repos/batch", post(get_repos_batch)) + .route("/repos/{repo_id}", get(get_repo).put(update_repo)) .route("/repos/{repo_id}/branches", get(get_repo_branches)) .route("/repos/{repo_id}/open-editor", post(open_repo_in_editor)) } diff --git a/crates/server/src/routes/sessions/mod.rs b/crates/server/src/routes/sessions/mod.rs index 83547e2880..ccf689b4db 100644 --- a/crates/server/src/routes/sessions/mod.rs +++ b/crates/server/src/routes/sessions/mod.rs @@ -11,10 +11,10 @@ use axum::{ }; use db::models::{ execution_process::{ExecutionProcess, ExecutionProcessRunReason}, - project_repo::ProjectRepo, scratch::{Scratch, ScratchType}, session::{CreateSession, Session}, workspace::{Workspace, WorkspaceError}, + workspace_repo::WorkspaceRepo, }; use deployment::Deployment; use executors::{ @@ -26,7 +26,6 @@ use executors::{ }; use serde::Deserialize; use services::services::container::ContainerService; -use sqlx::Error as SqlxError; use ts_rs::TS; use utils::response::ApiResponse; use uuid::Uuid; @@ -144,18 +143,6 @@ pub async fn follow_up( variant: payload.variant, }; - // Get parent task - let task = workspace - .parent_task(pool) - .await? - .ok_or(SqlxError::RowNotFound)?; - - // Get parent project - let project = task - .parent_project(pool) - .await? - .ok_or(SqlxError::RowNotFound)?; - // If retry settings provided, perform replace-logic before proceeding if let Some(proc_id) = payload.retry_process_id { // Validate process belongs to this session @@ -196,10 +183,8 @@ pub async fn follow_up( let prompt = payload.prompt; - let project_repos = ProjectRepo::find_by_project_id_with_names(pool, project.id).await?; - let cleanup_action = deployment - .container() - .cleanup_actions_for_repos(&project_repos); + let repos = WorkspaceRepo::find_repos_for_workspace(pool, workspace.id).await?; + let cleanup_action = deployment.container().cleanup_actions_for_repos(&repos); let working_dir = workspace .agent_working_dir diff --git a/crates/server/src/routes/task_attempts.rs b/crates/server/src/routes/task_attempts.rs index 6c68ad843c..9a2811dbd5 100644 --- a/crates/server/src/routes/task_attempts.rs +++ b/crates/server/src/routes/task_attempts.rs @@ -26,7 +26,6 @@ use db::models::{ coding_agent_turn::CodingAgentTurn, execution_process::{ExecutionProcess, ExecutionProcessRunReason, ExecutionProcessStatus}, merge::{Merge, MergeStatus, PrMerge, PullRequestInfo}, - project_repo::ProjectRepo, repo::{Repo, RepoError}, session::{CreateSession, Session}, task::{Task, TaskRelationships, TaskStatus}, @@ -1230,33 +1229,18 @@ pub async fn start_dev_server( } } - // Get dev script from project (dev_script is project-level, not per-repo) - let dev_script = match &project.dev_script { - Some(script) if !script.is_empty() => script.clone(), - _ => { - return Ok(ResponseJson(ApiResponse::error( - "No dev server script configured for this project", - ))); - } - }; - - let working_dir = project - .dev_script_working_dir - .as_ref() - .filter(|dir| !dir.is_empty()) - .cloned(); + let repos = WorkspaceRepo::find_repos_for_workspace(pool, workspace.id).await?; + let repos_with_dev_script: Vec<_> = repos + .iter() + .filter(|r| r.dev_server_script.as_ref().is_some_and(|s| !s.is_empty())) + .collect(); - let executor_action = ExecutorAction::new( - ExecutorActionType::ScriptRequest(ScriptRequest { - script: dev_script, - language: ScriptRequestLanguage::Bash, - context: ScriptContext::DevServer, - working_dir, - }), - None, - ); + if repos_with_dev_script.is_empty() { + return Ok(ResponseJson(ApiResponse::error( + "No dev server script configured for any repository in this workspace", + ))); + } - // Get or create a session for dev server let session = match Session::find_latest_by_workspace_id(pool, workspace.id).await? { Some(s) => s, None => { @@ -1272,15 +1256,27 @@ pub async fn start_dev_server( } }; - deployment - .container() - .start_execution( - &workspace, - &session, - &executor_action, - &ExecutionProcessRunReason::DevServer, - ) - .await?; + for repo in repos_with_dev_script { + let executor_action = ExecutorAction::new( + ExecutorActionType::ScriptRequest(ScriptRequest { + script: repo.dev_server_script.clone().unwrap(), + language: ScriptRequestLanguage::Bash, + context: ScriptContext::DevServer, + working_dir: Some(repo.name.clone()), + }), + None, + ); + + deployment + .container() + .start_execution( + &workspace, + &session, + &executor_action, + &ExecutionProcessRunReason::DevServer, + ) + .await?; + } deployment .track_if_analytics_allowed( @@ -1373,7 +1369,6 @@ pub async fn run_setup_script( .ensure_container_exists(&workspace) .await?; - // Get parent task and project let task = workspace .parent_task(pool) .await? @@ -1383,11 +1378,9 @@ pub async fn run_setup_script( .parent_project(pool) .await? .ok_or(SqlxError::RowNotFound)?; - let project_repos = ProjectRepo::find_by_project_id_with_names(pool, project.id).await?; - let executor_action = match deployment - .container() - .setup_actions_for_repos(&project_repos) - { + + let repos = WorkspaceRepo::find_repos_for_workspace(pool, workspace.id).await?; + let executor_action = match deployment.container().setup_actions_for_repos(&repos) { Some(action) => action, None => { return Ok(ResponseJson(ApiResponse::error_with_data( @@ -1457,7 +1450,6 @@ pub async fn run_cleanup_script( .ensure_container_exists(&workspace) .await?; - // Get parent task and project let task = workspace .parent_task(pool) .await? @@ -1467,11 +1459,9 @@ pub async fn run_cleanup_script( .parent_project(pool) .await? .ok_or(SqlxError::RowNotFound)?; - let project_repos = ProjectRepo::find_by_project_id_with_names(pool, project.id).await?; - let executor_action = match deployment - .container() - .cleanup_actions_for_repos(&project_repos) - { + + let repos = WorkspaceRepo::find_repos_for_workspace(pool, workspace.id).await?; + let executor_action = match deployment.container().cleanup_actions_for_repos(&repos) { Some(action) => action, None => { return Ok(ResponseJson(ApiResponse::error_with_data( @@ -1580,34 +1570,19 @@ pub async fn get_first_user_message( Ok(ResponseJson(ApiResponse::success(message))) } -#[derive(Debug, Serialize, Deserialize, TS)] -#[serde(tag = "type", rename_all = "snake_case")] -#[ts(tag = "type", rename_all = "snake_case")] -pub enum DeleteWorkspaceError { - HasRunningProcesses, -} - pub async fn delete_workspace( Extension(workspace): Extension, State(deployment): State, -) -> Result< - ( - StatusCode, - ResponseJson>, - ), - ApiError, -> { +) -> Result<(StatusCode, ResponseJson>), ApiError> { let pool = &deployment.db().pool; // Check for running execution processes if ExecutionProcess::has_running_non_dev_server_processes_for_workspace(pool, workspace.id) .await? { - return Ok(( - StatusCode::CONFLICT, - ResponseJson(ApiResponse::error_with_data( - DeleteWorkspaceError::HasRunningProcesses, - )), + return Err(ApiError::Conflict( + "Cannot delete workspace while processes are running. Stop all processes first." + .to_string(), )); } diff --git a/crates/services/src/services/container.rs b/crates/services/src/services/container.rs index 5e3c4c6ebb..ae46a06cdc 100644 --- a/crates/services/src/services/container.rs +++ b/crates/services/src/services/container.rs @@ -19,7 +19,7 @@ use db::{ CreateExecutionProcessRepoState, ExecutionProcessRepoState, }, project::{Project, UpdateProject}, - project_repo::{ProjectRepo, ProjectRepoWithName}, + project_repo::ProjectRepo, repo::Repo, session::{CreateSession, Session, SessionError}, task::{Task, TaskStatus}, @@ -372,47 +372,26 @@ pub trait ContainerService { Repo::update_name(pool, repo.id, &name, &name).await?; - // Also update dev_script_working_dir and agent_working_dir for single-repo projects + // Update agent_working_dir for single-repo projects let project_repos = ProjectRepo::find_by_repo_id(pool, repo.id).await?; for pr in project_repos { let all_repos = ProjectRepo::find_by_project_id(pool, pr.project_id).await?; if all_repos.len() == 1 && let Some(project) = Project::find_by_id(pool, pr.project_id).await? { - let needs_dev_script_working_dir = project - .dev_script - .as_ref() - .map(|s| !s.is_empty()) - .unwrap_or(false) - && project - .dev_script_working_dir - .as_ref() - .map(|s| s.is_empty()) - .unwrap_or(true); - let needs_default_agent_working_dir = project .default_agent_working_dir .as_ref() .map(|s| s.is_empty()) .unwrap_or(true); - if needs_dev_script_working_dir || needs_default_agent_working_dir { + if needs_default_agent_working_dir { Project::update( pool, pr.project_id, &UpdateProject { name: Some(project.name.clone()), - dev_script: project.dev_script.clone(), - dev_script_working_dir: if needs_dev_script_working_dir { - Some(name.clone()) - } else { - project.dev_script_working_dir.clone() - }, - default_agent_working_dir: if needs_default_agent_working_dir { - Some(name.clone()) - } else { - project.default_agent_working_dir.clone() - }, + default_agent_working_dir: Some(name.clone()), }, ) .await?; @@ -424,7 +403,7 @@ pub trait ContainerService { Ok(()) } - fn cleanup_actions_for_repos(&self, repos: &[ProjectRepoWithName]) -> Option { + fn cleanup_actions_for_repos(&self, repos: &[Repo]) -> Option { let repos_with_cleanup: Vec<_> = repos .iter() .filter(|r| r.cleanup_script.is_some()) @@ -441,7 +420,7 @@ pub trait ContainerService { script: first.cleanup_script.clone().unwrap(), language: ScriptRequestLanguage::Bash, context: ScriptContext::CleanupScript, - working_dir: Some(first.repo_name.clone()), + working_dir: Some(first.name.clone()), }), None, ); @@ -452,7 +431,7 @@ pub trait ContainerService { script: repo.cleanup_script.clone().unwrap(), language: ScriptRequestLanguage::Bash, context: ScriptContext::CleanupScript, - working_dir: Some(repo.repo_name.clone()), + working_dir: Some(repo.name.clone()), }), None, )); @@ -461,7 +440,7 @@ pub trait ContainerService { Some(root_action) } - fn setup_actions_for_repos(&self, repos: &[ProjectRepoWithName]) -> Option { + fn setup_actions_for_repos(&self, repos: &[Repo]) -> Option { let repos_with_setup: Vec<_> = repos.iter().filter(|r| r.setup_script.is_some()).collect(); if repos_with_setup.is_empty() { @@ -475,7 +454,7 @@ pub trait ContainerService { script: first.setup_script.clone().unwrap(), language: ScriptRequestLanguage::Bash, context: ScriptContext::SetupScript, - working_dir: Some(first.repo_name.clone()), + working_dir: Some(first.name.clone()), }), None, ); @@ -486,7 +465,7 @@ pub trait ContainerService { script: repo.setup_script.clone().unwrap(), language: ScriptRequestLanguage::Bash, context: ScriptContext::SetupScript, - working_dir: Some(repo.repo_name.clone()), + working_dir: Some(repo.name.clone()), }), None, )); @@ -495,14 +474,14 @@ pub trait ContainerService { Some(root_action) } - fn setup_action_for_repo(repo: &ProjectRepoWithName) -> Option { + fn setup_action_for_repo(repo: &Repo) -> Option { repo.setup_script.as_ref().map(|script| { ExecutorAction::new( ExecutorActionType::ScriptRequest(ScriptRequest { script: script.clone(), language: ScriptRequestLanguage::Bash, context: ScriptContext::SetupScript, - working_dir: Some(repo.repo_name.clone()), + working_dir: Some(repo.name.clone()), }), None, ) @@ -510,7 +489,7 @@ pub trait ContainerService { } fn build_sequential_setup_chain( - repos: &[&ProjectRepoWithName], + repos: &[&Repo], next_action: ExecutorAction, ) -> ExecutorAction { let mut chained = next_action; @@ -521,7 +500,7 @@ pub trait ContainerService { script: script.clone(), language: ScriptRequestLanguage::Bash, context: ScriptContext::SetupScript, - working_dir: Some(repo.repo_name.clone()), + working_dir: Some(repo.name.clone()), }), Some(Box::new(chained)), ); @@ -894,14 +873,7 @@ pub trait ContainerService { .await? .ok_or(SqlxError::RowNotFound)?; - // Get parent project - let project = task - .parent_project(&self.db().pool) - .await? - .ok_or(SqlxError::RowNotFound)?; - - let project_repos = - ProjectRepo::find_by_project_id_with_names(&self.db().pool, project.id).await?; + let repos = WorkspaceRepo::find_repos_for_workspace(&self.db().pool, workspace.id).await?; let workspace = Workspace::find_by_id(&self.db().pool, workspace.id) .await? @@ -920,14 +892,11 @@ pub trait ContainerService { let prompt = task.to_prompt(); - let repos_with_setup: Vec<_> = project_repos - .iter() - .filter(|pr| pr.setup_script.is_some()) - .collect(); + let repos_with_setup: Vec<_> = repos.iter().filter(|r| r.setup_script.is_some()).collect(); - let all_parallel = repos_with_setup.iter().all(|pr| pr.parallel_setup_script); + let all_parallel = repos_with_setup.iter().all(|r| r.parallel_setup_script); - let cleanup_action = self.cleanup_actions_for_repos(&project_repos); + let cleanup_action = self.cleanup_actions_for_repos(&repos); let working_dir = workspace .agent_working_dir diff --git a/crates/services/src/services/events.rs b/crates/services/src/services/events.rs index 7fe6b98feb..f26a9b33c6 100644 --- a/crates/services/src/services/events.rs +++ b/crates/services/src/services/events.rs @@ -3,8 +3,8 @@ use std::{str::FromStr, sync::Arc}; use db::{ DBService, models::{ - execution_process::ExecutionProcess, project::Project, scratch::Scratch, task::Task, - workspace::Workspace, + execution_process::ExecutionProcess, project::Project, scratch::Scratch, session::Session, + task::Task, workspace::Workspace, }, }; use serde_json::json; @@ -67,7 +67,6 @@ impl EventService { msg_store: Arc, session_id: Uuid, ) -> Result<(), SqlxError> { - use db::models::session::Session; if let Some(session) = Session::find_by_id(pool, session_id).await? && let Some(workspace) = Workspace::find_by_id(pool, session.workspace_id).await? { @@ -82,7 +81,6 @@ impl EventService { msg_store: Arc, session_id: Uuid, ) -> Result<(), SqlxError> { - use db::models::session::Session; if let Some(session) = Session::find_by_id(pool, session_id).await? && let Some(workspace_with_status) = Workspace::find_by_id_with_status(pool, session.workspace_id).await? diff --git a/crates/services/src/services/project.rs b/crates/services/src/services/project.rs index 854c08f4d4..b56c8a02d1 100644 --- a/crates/services/src/services/project.rs +++ b/crates/services/src/services/project.rs @@ -129,8 +129,6 @@ impl ProjectService { project.id, &UpdateProject { name: None, - dev_script: None, - dev_script_working_dir: None, default_agent_working_dir: Some(repo.name), }, ) diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index e2166e250f..f19103c203 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -17,6 +17,7 @@ import { McpSettings, OrganizationSettings, ProjectSettings, + ReposSettings, SettingsLayout, } from '@/pages/settings/'; import { UserSystemProvider, useUserSystem } from '@/components/ConfigProvider'; @@ -156,6 +157,7 @@ function AppContent() { } /> } /> } /> + } /> } diff --git a/frontend/src/components/NormalizedConversation/NextActionCard.tsx b/frontend/src/components/NormalizedConversation/NextActionCard.tsx index 611756930b..d23e0a4c3e 100644 --- a/frontend/src/components/NormalizedConversation/NextActionCard.tsx +++ b/frontend/src/components/NormalizedConversation/NextActionCard.tsx @@ -17,6 +17,7 @@ import { GitActionsDialog } from '@/components/dialogs/tasks/GitActionsDialog'; import { useOpenInEditor } from '@/hooks/useOpenInEditor'; import { useDiffSummary } from '@/hooks/useDiffSummary'; import { useDevServer } from '@/hooks/useDevServer'; +import { useHasDevServerScript } from '@/hooks/useHasDevServerScript'; import { Button } from '@/components/ui/button'; import { IdeIcon } from '@/components/ide/IdeIcon'; import { useUserSystem } from '@/components/ConfigProvider'; @@ -57,7 +58,7 @@ export function NextActionCard({ }: NextActionCardProps) { const { t } = useTranslation('tasks'); const { config } = useUserSystem(); - const { project } = useProject(); + const { projectId } = useProject(); const navigate = useNavigate(); const [copied, setCopied] = useState(false); @@ -77,11 +78,14 @@ export function NextActionCard({ stop, isStarting, isStopping, - runningDevServer, - latestDevServerProcess, + runningDevServers, + devServerProcesses, } = useDevServer(attemptId); - const projectHasDevScript = Boolean(project?.dev_script); + const hasRunningDevServer = runningDevServers.length > 0; + + const { data: projectHasDevScript = false } = + useHasDevServerScript(projectId); const handleCopy = useCallback(async () => { if (!containerRef) return; @@ -103,10 +107,10 @@ export function NextActionCard({ if (sessionId) { ViewProcessesDialog.show({ sessionId, - initialProcessId: latestDevServerProcess?.id, + initialProcessId: devServerProcesses[0]?.id, }); } - }, [sessionId, latestDevServerProcess?.id]); + }, [sessionId, devServerProcesses]); const handleOpenDiffs = useCallback(() => { navigate({ search: '?view=diffs' }); @@ -302,19 +306,21 @@ export function NextActionCard({ variant="ghost" size="sm" className="h-7 w-7 p-0" - onClick={runningDevServer ? () => stop() : () => start()} + onClick={ + hasRunningDevServer ? () => stop() : () => start() + } disabled={ - (runningDevServer ? isStopping : isStarting) || + (hasRunningDevServer ? isStopping : isStarting) || !attemptId || !projectHasDevScript } aria-label={ - runningDevServer + hasRunningDevServer ? t('attempt.pauseDev') : t('attempt.startDev') } > - {runningDevServer ? ( + {hasRunningDevServer ? ( ) : ( @@ -325,13 +331,13 @@ export function NextActionCard({ {!projectHasDevScript ? t('attempt.devScriptMissingTooltip') - : runningDevServer + : hasRunningDevServer ? t('attempt.pauseDev') : t('attempt.startDev')} - {latestDevServerProcess && ( + {devServerProcesses.length > 0 && ( + ))} + )} + )} diff --git a/frontend/src/components/tasks/TaskDetails/preview/NoServerContent.tsx b/frontend/src/components/tasks/TaskDetails/preview/NoServerContent.tsx index 5faa7ebc20..9442ca1325 100644 --- a/frontend/src/components/tasks/TaskDetails/preview/NoServerContent.tsx +++ b/frontend/src/components/tasks/TaskDetails/preview/NoServerContent.tsx @@ -1,25 +1,16 @@ -import { useState } from 'react'; import { useTranslation } from 'react-i18next'; +import { useNavigate } from 'react-router-dom'; import { Play, - Edit3, Square, SquareTerminal, - Save, - X, + Settings, ExternalLink, } from 'lucide-react'; import { Button } from '@/components/ui/button'; -import { Textarea } from '@/components/ui/textarea'; -import { Alert, AlertDescription } from '@/components/ui/alert'; -import { ExecutionProcess, Project } from 'shared/types'; -import { - createScriptPlaceholderStrategy, - ScriptPlaceholderContext, -} from '@/utils/scriptPlaceholders'; +import { Project } from 'shared/types'; import { useUserSystem } from '@/components/ConfigProvider'; import { useTaskMutations } from '@/hooks/useTaskMutations'; -import { useProjectMutations } from '@/hooks/useProjectMutations'; import { useProjectRepos } from '@/hooks'; import { COMPANION_INSTALL_TASK_TITLE, @@ -28,7 +19,7 @@ import { interface NoServerContentProps { projectHasDevScript: boolean; - runningDevServer: ExecutionProcess | undefined; + runningDevServer: boolean; isStartingDevServer: boolean; startDevServer: () => void; stopDevServer: () => void; @@ -44,77 +35,18 @@ export function NoServerContent({ project, }: NoServerContentProps) { const { t } = useTranslation('tasks'); - const [devScriptInput, setDevScriptInput] = useState(''); - const [saveError, setSaveError] = useState(null); - const [isEditingExistingScript, setIsEditingExistingScript] = useState(false); - const { system, config } = useUserSystem(); + const navigate = useNavigate(); + const { config } = useUserSystem(); const { createAndStart } = useTaskMutations(project?.id); - const { updateProject } = useProjectMutations(); - const { data: projectRepos = [] } = useProjectRepos(project?.id); - // Create strategy-based placeholders - const placeholders = system.environment - ? new ScriptPlaceholderContext( - createScriptPlaceholderStrategy(system.environment.os_type) - ).getPlaceholders() - : { - setup: '#!/bin/bash\nnpm install\n# Add any setup commands here...', - dev: '#!/bin/bash\nnpm run dev\n# Add dev server start command here...', - cleanup: - '#!/bin/bash\n# Add cleanup commands here...\n# This runs after coding agent execution', - }; - - const handleSaveDevScript = async (startAfterSave?: boolean) => { - setSaveError(null); - if (!project) { - setSaveError(t('preview.devScript.errors.notLoaded')); - return; - } - - const script = devScriptInput.trim(); - if (!script) { - setSaveError(t('preview.devScript.errors.empty')); - return; - } - - updateProject.mutate( - { - projectId: project.id, - data: { - name: null, - dev_script: script, - dev_script_working_dir: project.dev_script_working_dir ?? null, - default_agent_working_dir: project.default_agent_working_dir ?? null, - }, - }, - { - onSuccess: () => { - setIsEditingExistingScript(false); - if (startAfterSave) { - startDevServer(); - } - }, - onError: (err) => { - setSaveError((err as Error)?.message || 'Failed to save dev script'); - }, - } - ); - }; - - const handleEditExistingScript = () => { - if (project?.dev_script) { - setDevScriptInput(project.dev_script); + const handleConfigureDevScript = () => { + if (projectRepos.length === 1) { + navigate(`/settings/repos?repoId=${projectRepos[0].id}`); + } else { + navigate('/settings/repos'); } - setIsEditingExistingScript(true); - setSaveError(null); - }; - - const handleCancelEdit = () => { - setIsEditingExistingScript(false); - setDevScriptInput(''); - setSaveError(null); }; const handleInstallCompanion = () => { @@ -159,114 +91,45 @@ export function NoServerContent({

- {!isEditingExistingScript ? ( -
+
+ + + {!runningDevServer && ( - - {!runningDevServer && ( - - )} -
- ) : ( -
-
-