automagik-forge 0.1.13 → 0.1.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +143 -447
- package/dist/linux-x64/automagik-forge-mcp.zip +0 -0
- package/{npx-cli/automagik-forge-0.0.55.tgz → dist/linux-x64/automagik-forge.zip} +0 -0
- package/package.json +13 -23
- package/.cargo/config.toml +0 -13
- package/.claude/commands/commit.md +0 -376
- package/.claude/commands/prompt.md +0 -871
- package/.env.example +0 -20
- package/.github/actions/setup-node/action.yml +0 -29
- package/.github/images/automagik-logo.png +0 -0
- package/.github/workflows/pre-release.yml +0 -470
- package/.github/workflows/publish.yml +0 -145
- package/.github/workflows/test.yml +0 -63
- package/.mcp.json +0 -57
- package/AGENT.md +0 -40
- package/CLAUDE.md +0 -40
- package/CODE-OF-CONDUCT.md +0 -89
- package/Cargo.toml +0 -19
- package/Dockerfile +0 -43
- package/LICENSE +0 -201
- package/Makefile +0 -97
- package/backend/.sqlx/query-01b7e2bac1261d8be3d03c03df3e5220590da6c31c77f161074fc62752d63881.json +0 -12
- package/backend/.sqlx/query-03f2b02ba6dc5ea2b3cf6b1004caea0ad6bcc10ebd63f441d321a389f026e263.json +0 -12
- package/backend/.sqlx/query-0923b77d137a29fc54d399a873ff15fc4af894490bc65a4d344a7575cb0d8643.json +0 -12
- package/backend/.sqlx/query-0f808bcdb63c5f180836e448dd64c435c51758b2fc54a52ce9e67495b1ab200e.json +0 -68
- package/backend/.sqlx/query-1268afe9ca849daa6722e3df7ca8e9e61f0d37052e782bb5452ab8e1018d9b63.json +0 -12
- package/backend/.sqlx/query-1b082630a9622f8667ee7a9aba2c2d3176019a68c6bb83d33008594821415a57.json +0 -12
- package/backend/.sqlx/query-1c7b06ba1e112abf6b945a2ff08a0b40ec23f3738c2e7399f067b558cf8d490e.json +0 -12
- package/backend/.sqlx/query-1f619f01f46859a64ded531dd0ef61abacfe62e758abe7030a6aa745140b95ca.json +0 -104
- package/backend/.sqlx/query-1fca1ce14b4b20205364cd1f1f45ebe1d2e30cd745e59e189d56487b5639dfbb.json +0 -12
- package/backend/.sqlx/query-212828320e8d871ab9d83705a040b23bcf0393dc7252177fc539a74657f578ef.json +0 -32
- package/backend/.sqlx/query-290ce5c152be8d36e58ff42570f9157beb07ab9e77a03ec6fc30b4f56f9b8f6b.json +0 -56
- package/backend/.sqlx/query-2b471d2c2e8ffbe0cd42d2a91b814c0d79f9d09200f147e3cea33ba4ce673c8a.json +0 -68
- package/backend/.sqlx/query-354a48c705bb9bb2048c1b7f10fcb714e23f9db82b7a4ea6932486197b2ede6a.json +0 -92
- package/backend/.sqlx/query-36c9e3dd10648e94b949db5c91a774ecb1e10a899ef95da74066eccedca4d8b2.json +0 -12
- package/backend/.sqlx/query-36e4ba7bbd81b402d5a20b6005755eafbb174c8dda442081823406ac32809a94.json +0 -56
- package/backend/.sqlx/query-3a5b3c98a55ca183ab20c74708e3d7e579dda37972c059e7515c4ceee4bd8dd3.json +0 -62
- package/backend/.sqlx/query-3d0a1cabf2a52e9d90cdfd29c509ca89aeb448d0c1d2446c65cd43db40735e86.json +0 -62
- package/backend/.sqlx/query-3d6bd16fbce59efe30b7f67ea342e0e4ea6d1432389c02468ad79f1f742d4031.json +0 -56
- package/backend/.sqlx/query-4049ca413b285a05aca6b25385e9c8185575f01e9069e4e8581aa45d713f612f.json +0 -32
- package/backend/.sqlx/query-412bacd3477d86369082e90f52240407abce436cb81292d42b2dbe1e5c18eea1.json +0 -104
- package/backend/.sqlx/query-417a8b1ff4e51de82aea0159a3b97932224dc325b23476cb84153d690227fd8b.json +0 -62
- package/backend/.sqlx/query-461cc1b0bb6fd909afc9dd2246e8526b3771cfbb0b22ae4b5d17b51af587b9e2.json +0 -56
- package/backend/.sqlx/query-58408c7a8cdeeda0bef359f1f9bd91299a339dc2b191462fc58c9736a56d5227.json +0 -92
- package/backend/.sqlx/query-5a886026d75d515c01f347cc203c8d99dd04c61dc468e2e4c5aa548436d13834.json +0 -62
- package/backend/.sqlx/query-5b902137b11022d2e1a5c4f6a9c83fec1a856c6a710aff831abd2382ede76b43.json +0 -12
- package/backend/.sqlx/query-5ed1238e52e59bb5f76c0f153fd99a14093f7ce2585bf9843585608f17ec575b.json +0 -104
- package/backend/.sqlx/query-6e8b860b14decfc2227dc57213f38442943d3fbef5c8418fd6b634c6e0f5e2ea.json +0 -104
- package/backend/.sqlx/query-6ec414276994c4ccb2433eaa5b1b342168557d17ddf5a52dac84cb1b59b9de8f.json +0 -68
- package/backend/.sqlx/query-6ecfa16d0cf825aacf233544b5baf151e9adfdca26c226ad71020d291fd802d5.json +0 -62
- package/backend/.sqlx/query-72509d252c39fce77520aa816cb2acbc1fb35dc2605e7be893610599b2427f2e.json +0 -62
- package/backend/.sqlx/query-75239b2da188f749707d77f3c1544332ca70db3d6d6743b2601dc0d167536437.json +0 -62
- package/backend/.sqlx/query-83d10e29f8478aff33434f9ac67068e013b888b953a2657e2bb72a6f619d04f2.json +0 -50
- package/backend/.sqlx/query-8610803360ea18b9b9d078a6981ea56abfbfe84e6354fc1d5ae4c622e01410ed.json +0 -68
- package/backend/.sqlx/query-86d03eb70eef39c59296416867f2ee66c9f7cd8b7f961fbda2f89fc0a1c442c2.json +0 -12
- package/backend/.sqlx/query-87d0feb5a6b442bad9c60068ea7569599cc6fc91a0e2692ecb42e93b03201b9d.json +0 -68
- package/backend/.sqlx/query-8a67b3b3337248f06a57bdf8a908f7ef23177431eaed82dc08c94c3e5944340e.json +0 -12
- package/backend/.sqlx/query-8f01ebd64bdcde6a090479f14810d73ba23020e76fd70854ac57f2da251702c3.json +0 -12
- package/backend/.sqlx/query-90fd607fcb2dca72239ff25e618e21e174b195991eaa33722cbf5f76da84cfab.json +0 -62
- package/backend/.sqlx/query-92e8bdbcd80c5ff3db7a35cf79492048803ef305cbdef0d0a1fe5dc881ca8c71.json +0 -104
- package/backend/.sqlx/query-93a1605f90e9672dad29b472b6ad85fa9a55ea3ffa5abcb8724b09d61be254ca.json +0 -20
- package/backend/.sqlx/query-9472c8fb477958167f5fae40b85ac44252468c5226b2cdd7770f027332eed6d7.json +0 -104
- package/backend/.sqlx/query-96036c4f9e0f48bdc5a4a4588f0c5f288ac7aaa5425cac40fc33f337e1a351f2.json +0 -56
- package/backend/.sqlx/query-9edb2c01e91fd0f0fe7b56e988c7ae0393150f50be3f419a981e035c0121dfc7.json +0 -104
- package/backend/.sqlx/query-a157cf00616f703bfba21927f1eb1c9eec2a81c02da15f66efdba0b6c375de1b.json +0 -26
- package/backend/.sqlx/query-a31fff84f3b8e532fd1160447d89d700f06ae08821fee00c9a5b60492b05259c.json +0 -62
- package/backend/.sqlx/query-a5ba908419fb3e456bdd2daca41ba06cc3212ffffb8520fc7dbbcc8b60ada314.json +0 -12
- package/backend/.sqlx/query-a6d2961718dbc3b1a925e549f49a159c561bef58c105529275f274b27e2eba5b.json +0 -104
- package/backend/.sqlx/query-a9e93d5b09b29faf66e387e4d7596a792d81e75c4d3726e83c2963e8d7c9b56f.json +0 -104
- package/backend/.sqlx/query-ac5247c8d7fb86e4650c4b0eb9420031614c831b7b085083bac20c1af314c538.json +0 -12
- package/backend/.sqlx/query-afef9467be74c411c4cb119a8b2b1aea53049877dfc30cc60b486134ba4b4c9f.json +0 -68
- package/backend/.sqlx/query-b2b2c6b4d0b1a347b5c4cb63c3a46a265d4db53be9554989a814b069d0af82f2.json +0 -62
- package/backend/.sqlx/query-c50d2ff0b12e5bcc81e371089ee2d007e233e7db93aefba4fef08e7aa68f5ab7.json +0 -20
- package/backend/.sqlx/query-c614e6056b244ca07f1b9d44e7edc9d5819225c6f8d9e077070c6e518a17f50b.json +0 -12
- package/backend/.sqlx/query-c67259be8bf4ee0cfd32167b2aa3b7fe9192809181a8171bf1c2d6df731967ae.json +0 -12
- package/backend/.sqlx/query-d2d0a1b985ebbca6a2b3e882a221a219f3199890fa640afc946ef1a792d6d8de.json +0 -12
- package/backend/.sqlx/query-d30aa5786757f32bf2b9c5fe51a45e506c71c28c5994e430d9b0546adb15ffa2.json +0 -20
- package/backend/.sqlx/query-d3b9ea1de1576af71b312924ce7f4ea8ae5dbe2ac138ea3b4470f2d5cd734846.json +0 -12
- package/backend/.sqlx/query-ed8456646fa69ddd412441955f06ff22bfb790f29466450735e0b8bb1bc4ec94.json +0 -12
- package/backend/Cargo.toml +0 -71
- package/backend/build.rs +0 -32
- package/backend/migrations/20250617183714_init.sql +0 -44
- package/backend/migrations/20250620212427_execution_processes.sql +0 -25
- package/backend/migrations/20250620214100_remove_stdout_stderr_from_task_attempts.sql +0 -28
- package/backend/migrations/20250621120000_relate_activities_to_execution_processes.sql +0 -23
- package/backend/migrations/20250623120000_executor_sessions.sql +0 -17
- package/backend/migrations/20250623130000_add_executor_type_to_execution_processes.sql +0 -4
- package/backend/migrations/20250625000000_add_dev_script_to_projects.sql +0 -4
- package/backend/migrations/20250701000000_add_branch_to_task_attempts.sql +0 -2
- package/backend/migrations/20250701000001_add_pr_tracking_to_task_attempts.sql +0 -5
- package/backend/migrations/20250701120000_add_assistant_message_to_executor_sessions.sql +0 -2
- package/backend/migrations/20250708000000_add_base_branch_to_task_attempts.sql +0 -2
- package/backend/migrations/20250709000000_add_worktree_deleted_flag.sql +0 -2
- package/backend/migrations/20250710000000_add_setup_completion.sql +0 -3
- package/backend/migrations/20250715154859_add_task_templates.sql +0 -25
- package/backend/migrations/20250716143725_add_default_templates.sql +0 -174
- package/backend/migrations/20250716161432_update_executor_names_to_kebab_case.sql +0 -20
- package/backend/migrations/20250716170000_add_parent_task_to_tasks.sql +0 -7
- package/backend/migrations/20250717000000_drop_task_attempt_activities.sql +0 -9
- package/backend/migrations/20250719000000_add_cleanup_script_to_projects.sql +0 -2
- package/backend/migrations/20250720000000_add_cleanupscript_to_process_type_constraint.sql +0 -25
- package/backend/migrations/20250723000000_add_wish_to_tasks.sql +0 -7
- package/backend/migrations/20250724000000_remove_unique_wish_constraint.sql +0 -5
- package/backend/scripts/toast-notification.ps1 +0 -23
- package/backend/sounds/abstract-sound1.wav +0 -0
- package/backend/sounds/abstract-sound2.wav +0 -0
- package/backend/sounds/abstract-sound3.wav +0 -0
- package/backend/sounds/abstract-sound4.wav +0 -0
- package/backend/sounds/cow-mooing.wav +0 -0
- package/backend/sounds/phone-vibration.wav +0 -0
- package/backend/sounds/rooster.wav +0 -0
- package/backend/src/app_state.rs +0 -218
- package/backend/src/bin/generate_types.rs +0 -189
- package/backend/src/bin/mcp_task_server.rs +0 -191
- package/backend/src/execution_monitor.rs +0 -1193
- package/backend/src/executor.rs +0 -1053
- package/backend/src/executors/amp.rs +0 -697
- package/backend/src/executors/ccr.rs +0 -91
- package/backend/src/executors/charm_opencode.rs +0 -113
- package/backend/src/executors/claude.rs +0 -887
- package/backend/src/executors/cleanup_script.rs +0 -124
- package/backend/src/executors/dev_server.rs +0 -53
- package/backend/src/executors/echo.rs +0 -79
- package/backend/src/executors/gemini/config.rs +0 -67
- package/backend/src/executors/gemini/streaming.rs +0 -363
- package/backend/src/executors/gemini.rs +0 -765
- package/backend/src/executors/mod.rs +0 -23
- package/backend/src/executors/opencode_ai.rs +0 -113
- package/backend/src/executors/setup_script.rs +0 -130
- package/backend/src/executors/sst_opencode/filter.rs +0 -184
- package/backend/src/executors/sst_opencode/tools.rs +0 -139
- package/backend/src/executors/sst_opencode.rs +0 -756
- package/backend/src/lib.rs +0 -45
- package/backend/src/main.rs +0 -324
- package/backend/src/mcp/mod.rs +0 -1
- package/backend/src/mcp/task_server.rs +0 -850
- package/backend/src/middleware/mod.rs +0 -3
- package/backend/src/middleware/model_loaders.rs +0 -242
- package/backend/src/models/api_response.rs +0 -36
- package/backend/src/models/config.rs +0 -375
- package/backend/src/models/execution_process.rs +0 -430
- package/backend/src/models/executor_session.rs +0 -225
- package/backend/src/models/mod.rs +0 -12
- package/backend/src/models/project.rs +0 -356
- package/backend/src/models/task.rs +0 -345
- package/backend/src/models/task_attempt.rs +0 -1214
- package/backend/src/models/task_template.rs +0 -146
- package/backend/src/openapi.rs +0 -93
- package/backend/src/routes/auth.rs +0 -297
- package/backend/src/routes/config.rs +0 -385
- package/backend/src/routes/filesystem.rs +0 -228
- package/backend/src/routes/health.rs +0 -16
- package/backend/src/routes/mod.rs +0 -9
- package/backend/src/routes/projects.rs +0 -562
- package/backend/src/routes/stream.rs +0 -244
- package/backend/src/routes/task_attempts.rs +0 -1172
- package/backend/src/routes/task_templates.rs +0 -229
- package/backend/src/routes/tasks.rs +0 -353
- package/backend/src/services/analytics.rs +0 -216
- package/backend/src/services/git_service.rs +0 -1321
- package/backend/src/services/github_service.rs +0 -307
- package/backend/src/services/mod.rs +0 -13
- package/backend/src/services/notification_service.rs +0 -263
- package/backend/src/services/pr_monitor.rs +0 -214
- package/backend/src/services/process_service.rs +0 -940
- package/backend/src/utils/path.rs +0 -96
- package/backend/src/utils/shell.rs +0 -19
- package/backend/src/utils/text.rs +0 -24
- package/backend/src/utils/worktree_manager.rs +0 -578
- package/backend/src/utils.rs +0 -125
- package/backend/test.db +0 -0
- package/build-npm-package.sh +0 -61
- package/dev_assets_seed/config.json +0 -19
- package/frontend/.eslintrc.json +0 -25
- package/frontend/.prettierrc.json +0 -8
- package/frontend/components.json +0 -17
- package/frontend/index.html +0 -19
- package/frontend/package-lock.json +0 -7321
- package/frontend/package.json +0 -61
- package/frontend/postcss.config.js +0 -6
- package/frontend/public/android-chrome-192x192.png +0 -0
- package/frontend/public/android-chrome-512x512.png +0 -0
- package/frontend/public/apple-touch-icon.png +0 -0
- package/frontend/public/automagik-forge-logo-dark.svg +0 -3
- package/frontend/public/automagik-forge-logo.svg +0 -3
- package/frontend/public/automagik-forge-screenshot-overview.png +0 -0
- package/frontend/public/favicon-16x16.png +0 -0
- package/frontend/public/favicon-32x32.png +0 -0
- package/frontend/public/favicon.ico +0 -0
- package/frontend/public/site.webmanifest +0 -1
- package/frontend/public/viba-kanban-favicon.png +0 -0
- package/frontend/src/App.tsx +0 -157
- package/frontend/src/components/DisclaimerDialog.tsx +0 -106
- package/frontend/src/components/GitHubLoginDialog.tsx +0 -314
- package/frontend/src/components/OnboardingDialog.tsx +0 -185
- package/frontend/src/components/PrivacyOptInDialog.tsx +0 -130
- package/frontend/src/components/ProvidePatDialog.tsx +0 -98
- package/frontend/src/components/TaskTemplateManager.tsx +0 -336
- package/frontend/src/components/config-provider.tsx +0 -119
- package/frontend/src/components/context/TaskDetailsContextProvider.tsx +0 -470
- package/frontend/src/components/context/taskDetailsContext.ts +0 -125
- package/frontend/src/components/keyboard-shortcuts-demo.tsx +0 -35
- package/frontend/src/components/layout/navbar.tsx +0 -86
- package/frontend/src/components/logo.tsx +0 -44
- package/frontend/src/components/projects/ProjectCard.tsx +0 -155
- package/frontend/src/components/projects/project-detail.tsx +0 -251
- package/frontend/src/components/projects/project-form-fields.tsx +0 -238
- package/frontend/src/components/projects/project-form.tsx +0 -301
- package/frontend/src/components/projects/project-list.tsx +0 -200
- package/frontend/src/components/projects/projects-page.tsx +0 -20
- package/frontend/src/components/tasks/BranchSelector.tsx +0 -169
- package/frontend/src/components/tasks/DeleteFileConfirmationDialog.tsx +0 -94
- package/frontend/src/components/tasks/EditorSelectionDialog.tsx +0 -119
- package/frontend/src/components/tasks/TaskCard.tsx +0 -154
- package/frontend/src/components/tasks/TaskDetails/CollapsibleToolbar.tsx +0 -33
- package/frontend/src/components/tasks/TaskDetails/DiffCard.tsx +0 -109
- package/frontend/src/components/tasks/TaskDetails/DiffChunkSection.tsx +0 -135
- package/frontend/src/components/tasks/TaskDetails/DiffFile.tsx +0 -296
- package/frontend/src/components/tasks/TaskDetails/DiffTab.tsx +0 -32
- package/frontend/src/components/tasks/TaskDetails/DisplayConversationEntry.tsx +0 -392
- package/frontend/src/components/tasks/TaskDetails/LogsTab/Conversation.tsx +0 -256
- package/frontend/src/components/tasks/TaskDetails/LogsTab/ConversationEntry.tsx +0 -56
- package/frontend/src/components/tasks/TaskDetails/LogsTab/NormalizedConversationViewer.tsx +0 -92
- package/frontend/src/components/tasks/TaskDetails/LogsTab/Prompt.tsx +0 -22
- package/frontend/src/components/tasks/TaskDetails/LogsTab/SetupScriptRunning.tsx +0 -49
- package/frontend/src/components/tasks/TaskDetails/LogsTab.tsx +0 -186
- package/frontend/src/components/tasks/TaskDetails/ProcessesTab.tsx +0 -288
- package/frontend/src/components/tasks/TaskDetails/RelatedTasksTab.tsx +0 -216
- package/frontend/src/components/tasks/TaskDetails/TabNavigation.tsx +0 -93
- package/frontend/src/components/tasks/TaskDetailsHeader.tsx +0 -169
- package/frontend/src/components/tasks/TaskDetailsPanel.tsx +0 -126
- package/frontend/src/components/tasks/TaskDetailsToolbar.tsx +0 -302
- package/frontend/src/components/tasks/TaskFollowUpSection.tsx +0 -130
- package/frontend/src/components/tasks/TaskFormDialog.tsx +0 -400
- package/frontend/src/components/tasks/TaskKanbanBoard.tsx +0 -180
- package/frontend/src/components/tasks/Toolbar/CreateAttempt.tsx +0 -259
- package/frontend/src/components/tasks/Toolbar/CreatePRDialog.tsx +0 -243
- package/frontend/src/components/tasks/Toolbar/CurrentAttempt.tsx +0 -899
- package/frontend/src/components/tasks/index.ts +0 -2
- package/frontend/src/components/theme-provider.tsx +0 -82
- package/frontend/src/components/theme-toggle.tsx +0 -36
- package/frontend/src/components/ui/alert.tsx +0 -59
- package/frontend/src/components/ui/auto-expanding-textarea.tsx +0 -70
- package/frontend/src/components/ui/badge.tsx +0 -36
- package/frontend/src/components/ui/button.tsx +0 -56
- package/frontend/src/components/ui/card.tsx +0 -86
- package/frontend/src/components/ui/checkbox.tsx +0 -44
- package/frontend/src/components/ui/chip.tsx +0 -25
- package/frontend/src/components/ui/dialog.tsx +0 -124
- package/frontend/src/components/ui/dropdown-menu.tsx +0 -198
- package/frontend/src/components/ui/file-search-textarea.tsx +0 -292
- package/frontend/src/components/ui/folder-picker.tsx +0 -279
- package/frontend/src/components/ui/input.tsx +0 -25
- package/frontend/src/components/ui/label.tsx +0 -24
- package/frontend/src/components/ui/loader.tsx +0 -26
- package/frontend/src/components/ui/markdown-renderer.tsx +0 -75
- package/frontend/src/components/ui/select.tsx +0 -160
- package/frontend/src/components/ui/separator.tsx +0 -31
- package/frontend/src/components/ui/shadcn-io/kanban/index.tsx +0 -185
- package/frontend/src/components/ui/table.tsx +0 -117
- package/frontend/src/components/ui/tabs.tsx +0 -53
- package/frontend/src/components/ui/textarea.tsx +0 -22
- package/frontend/src/components/ui/tooltip.tsx +0 -28
- package/frontend/src/hooks/useNormalizedConversation.ts +0 -440
- package/frontend/src/index.css +0 -225
- package/frontend/src/lib/api.ts +0 -630
- package/frontend/src/lib/keyboard-shortcuts.ts +0 -266
- package/frontend/src/lib/responsive-config.ts +0 -70
- package/frontend/src/lib/types.ts +0 -39
- package/frontend/src/lib/utils.ts +0 -10
- package/frontend/src/main.tsx +0 -50
- package/frontend/src/pages/McpServers.tsx +0 -418
- package/frontend/src/pages/Settings.tsx +0 -610
- package/frontend/src/pages/project-tasks.tsx +0 -575
- package/frontend/src/pages/projects.tsx +0 -18
- package/frontend/src/vite-env.d.ts +0 -1
- package/frontend/tailwind.config.js +0 -125
- package/frontend/tsconfig.json +0 -26
- package/frontend/tsconfig.node.json +0 -10
- package/frontend/vite.config.ts +0 -33
- package/npx-cli/README.md +0 -159
- package/npx-cli/automagik-forge-0.1.0.tgz +0 -0
- package/npx-cli/automagik-forge-0.1.10.tgz +0 -0
- package/npx-cli/package.json +0 -17
- package/npx-cli/vibe-kanban-0.0.55.tgz +0 -0
- package/pnpm-workspace.yaml +0 -2
- package/rust-toolchain.toml +0 -11
- package/rustfmt.toml +0 -3
- package/scripts/load-env.js +0 -43
- package/scripts/mcp_test.js +0 -374
- package/scripts/prepare-db.js +0 -45
- package/scripts/setup-dev-environment.js +0 -274
- package/scripts/start-mcp-sse.js +0 -70
- package/scripts/test-debug.js +0 -32
- package/scripts/test-mcp-sse.js +0 -138
- package/scripts/test-simple.js +0 -44
- package/scripts/test-wish-final.js +0 -179
- package/scripts/test-wish-system.js +0 -221
- package/shared/types.ts +0 -182
- package/test-npm-package.sh +0 -42
- /package/{npx-cli/bin → bin}/cli.js +0 -0
@@ -1,430 +0,0 @@
|
|
1
|
-
use chrono::{DateTime, Utc};
|
2
|
-
use serde::{Deserialize, Serialize, Serializer};
|
3
|
-
use sqlx::{FromRow, SqlitePool, Type};
|
4
|
-
use ts_rs::TS;
|
5
|
-
use uuid::Uuid;
|
6
|
-
|
7
|
-
use crate::app_state::ExecutionType;
|
8
|
-
|
9
|
-
/// Filter out stderr boundary markers from output
|
10
|
-
fn filter_stderr_boundary_markers(stderr: &Option<String>) -> Option<String> {
|
11
|
-
stderr
|
12
|
-
.as_ref()
|
13
|
-
.map(|s| s.replace("---STDERR_CHUNK_BOUNDARY---", ""))
|
14
|
-
}
|
15
|
-
|
16
|
-
/// Custom serializer for stderr field that filters out boundary markers
|
17
|
-
fn serialize_filtered_stderr<S>(stderr: &Option<String>, serializer: S) -> Result<S::Ok, S::Error>
|
18
|
-
where
|
19
|
-
S: Serializer,
|
20
|
-
{
|
21
|
-
let filtered = filter_stderr_boundary_markers(stderr);
|
22
|
-
filtered.serialize(serializer)
|
23
|
-
}
|
24
|
-
|
25
|
-
#[derive(Debug, Clone, Type, Serialize, Deserialize, PartialEq, TS)]
|
26
|
-
#[sqlx(type_name = "execution_process_status", rename_all = "lowercase")]
|
27
|
-
#[serde(rename_all = "lowercase")]
|
28
|
-
#[ts(export)]
|
29
|
-
pub enum ExecutionProcessStatus {
|
30
|
-
Running,
|
31
|
-
Completed,
|
32
|
-
Failed,
|
33
|
-
Killed,
|
34
|
-
}
|
35
|
-
|
36
|
-
#[derive(Debug, Clone, Type, Serialize, Deserialize, PartialEq, TS)]
|
37
|
-
#[sqlx(type_name = "execution_process_type", rename_all = "lowercase")]
|
38
|
-
#[serde(rename_all = "lowercase")]
|
39
|
-
#[ts(export)]
|
40
|
-
pub enum ExecutionProcessType {
|
41
|
-
SetupScript,
|
42
|
-
CleanupScript,
|
43
|
-
CodingAgent,
|
44
|
-
DevServer,
|
45
|
-
}
|
46
|
-
|
47
|
-
impl From<ExecutionType> for ExecutionProcessType {
|
48
|
-
fn from(exec_type: ExecutionType) -> Self {
|
49
|
-
match exec_type {
|
50
|
-
ExecutionType::SetupScript => ExecutionProcessType::SetupScript,
|
51
|
-
ExecutionType::CleanupScript => ExecutionProcessType::CleanupScript,
|
52
|
-
ExecutionType::CodingAgent => ExecutionProcessType::CodingAgent,
|
53
|
-
ExecutionType::DevServer => ExecutionProcessType::DevServer,
|
54
|
-
}
|
55
|
-
}
|
56
|
-
}
|
57
|
-
|
58
|
-
impl From<ExecutionProcessType> for ExecutionType {
|
59
|
-
fn from(exec_type: ExecutionProcessType) -> Self {
|
60
|
-
match exec_type {
|
61
|
-
ExecutionProcessType::SetupScript => ExecutionType::SetupScript,
|
62
|
-
ExecutionProcessType::CleanupScript => ExecutionType::CleanupScript,
|
63
|
-
ExecutionProcessType::CodingAgent => ExecutionType::CodingAgent,
|
64
|
-
ExecutionProcessType::DevServer => ExecutionType::DevServer,
|
65
|
-
}
|
66
|
-
}
|
67
|
-
}
|
68
|
-
|
69
|
-
#[derive(Debug, Clone, FromRow, Serialize, Deserialize, TS)]
|
70
|
-
#[ts(export)]
|
71
|
-
pub struct ExecutionProcess {
|
72
|
-
pub id: Uuid,
|
73
|
-
pub task_attempt_id: Uuid,
|
74
|
-
pub process_type: ExecutionProcessType,
|
75
|
-
pub executor_type: Option<String>, // "echo", "claude", "amp", etc. - only for CodingAgent processes
|
76
|
-
pub status: ExecutionProcessStatus,
|
77
|
-
pub command: String,
|
78
|
-
pub args: Option<String>, // JSON array of arguments
|
79
|
-
pub working_directory: String,
|
80
|
-
pub stdout: Option<String>,
|
81
|
-
#[serde(serialize_with = "serialize_filtered_stderr")]
|
82
|
-
pub stderr: Option<String>,
|
83
|
-
pub exit_code: Option<i64>,
|
84
|
-
pub started_at: DateTime<Utc>,
|
85
|
-
pub completed_at: Option<DateTime<Utc>>,
|
86
|
-
pub created_at: DateTime<Utc>,
|
87
|
-
pub updated_at: DateTime<Utc>,
|
88
|
-
}
|
89
|
-
|
90
|
-
#[derive(Debug, Deserialize, TS)]
|
91
|
-
#[ts(export)]
|
92
|
-
pub struct CreateExecutionProcess {
|
93
|
-
pub task_attempt_id: Uuid,
|
94
|
-
pub process_type: ExecutionProcessType,
|
95
|
-
pub executor_type: Option<String>,
|
96
|
-
pub command: String,
|
97
|
-
pub args: Option<String>,
|
98
|
-
pub working_directory: String,
|
99
|
-
}
|
100
|
-
|
101
|
-
#[derive(Debug, Deserialize, TS)]
|
102
|
-
#[ts(export)]
|
103
|
-
#[allow(dead_code)]
|
104
|
-
pub struct UpdateExecutionProcess {
|
105
|
-
pub status: Option<ExecutionProcessStatus>,
|
106
|
-
pub exit_code: Option<i64>,
|
107
|
-
pub completed_at: Option<DateTime<Utc>>,
|
108
|
-
}
|
109
|
-
|
110
|
-
#[derive(Debug, Clone, FromRow, Serialize, Deserialize, TS)]
|
111
|
-
#[ts(export)]
|
112
|
-
pub struct ExecutionProcessSummary {
|
113
|
-
pub id: Uuid,
|
114
|
-
pub task_attempt_id: Uuid,
|
115
|
-
pub process_type: ExecutionProcessType,
|
116
|
-
pub executor_type: Option<String>, // "echo", "claude", "amp", etc. - only for CodingAgent processes
|
117
|
-
pub status: ExecutionProcessStatus,
|
118
|
-
pub command: String,
|
119
|
-
pub args: Option<String>, // JSON array of arguments
|
120
|
-
pub working_directory: String,
|
121
|
-
pub exit_code: Option<i64>,
|
122
|
-
pub started_at: DateTime<Utc>,
|
123
|
-
pub completed_at: Option<DateTime<Utc>>,
|
124
|
-
pub created_at: DateTime<Utc>,
|
125
|
-
pub updated_at: DateTime<Utc>,
|
126
|
-
}
|
127
|
-
|
128
|
-
impl ExecutionProcess {
|
129
|
-
/// Find execution process by ID
|
130
|
-
pub async fn find_by_id(pool: &SqlitePool, id: Uuid) -> Result<Option<Self>, sqlx::Error> {
|
131
|
-
sqlx::query_as!(
|
132
|
-
ExecutionProcess,
|
133
|
-
r#"SELECT
|
134
|
-
id as "id!: Uuid",
|
135
|
-
task_attempt_id as "task_attempt_id!: Uuid",
|
136
|
-
process_type as "process_type!: ExecutionProcessType",
|
137
|
-
executor_type,
|
138
|
-
status as "status!: ExecutionProcessStatus",
|
139
|
-
command,
|
140
|
-
args,
|
141
|
-
working_directory,
|
142
|
-
stdout,
|
143
|
-
stderr,
|
144
|
-
exit_code,
|
145
|
-
started_at as "started_at!: DateTime<Utc>",
|
146
|
-
completed_at as "completed_at?: DateTime<Utc>",
|
147
|
-
created_at as "created_at!: DateTime<Utc>",
|
148
|
-
updated_at as "updated_at!: DateTime<Utc>"
|
149
|
-
FROM execution_processes
|
150
|
-
WHERE id = $1"#,
|
151
|
-
id
|
152
|
-
)
|
153
|
-
.fetch_optional(pool)
|
154
|
-
.await
|
155
|
-
}
|
156
|
-
|
157
|
-
/// Find all execution processes for a task attempt
|
158
|
-
pub async fn find_by_task_attempt_id(
|
159
|
-
pool: &SqlitePool,
|
160
|
-
task_attempt_id: Uuid,
|
161
|
-
) -> Result<Vec<Self>, sqlx::Error> {
|
162
|
-
sqlx::query_as!(
|
163
|
-
ExecutionProcess,
|
164
|
-
r#"SELECT
|
165
|
-
id as "id!: Uuid",
|
166
|
-
task_attempt_id as "task_attempt_id!: Uuid",
|
167
|
-
process_type as "process_type!: ExecutionProcessType",
|
168
|
-
executor_type,
|
169
|
-
status as "status!: ExecutionProcessStatus",
|
170
|
-
command,
|
171
|
-
args,
|
172
|
-
working_directory,
|
173
|
-
stdout,
|
174
|
-
stderr,
|
175
|
-
exit_code,
|
176
|
-
started_at as "started_at!: DateTime<Utc>",
|
177
|
-
completed_at as "completed_at?: DateTime<Utc>",
|
178
|
-
created_at as "created_at!: DateTime<Utc>",
|
179
|
-
updated_at as "updated_at!: DateTime<Utc>"
|
180
|
-
FROM execution_processes
|
181
|
-
WHERE task_attempt_id = $1
|
182
|
-
ORDER BY created_at ASC"#,
|
183
|
-
task_attempt_id
|
184
|
-
)
|
185
|
-
.fetch_all(pool)
|
186
|
-
.await
|
187
|
-
}
|
188
|
-
|
189
|
-
/// Find execution process summaries for a task attempt (excluding stdio)
|
190
|
-
pub async fn find_summaries_by_task_attempt_id(
|
191
|
-
pool: &SqlitePool,
|
192
|
-
task_attempt_id: Uuid,
|
193
|
-
) -> Result<Vec<ExecutionProcessSummary>, sqlx::Error> {
|
194
|
-
sqlx::query_as!(
|
195
|
-
ExecutionProcessSummary,
|
196
|
-
r#"SELECT
|
197
|
-
id as "id!: Uuid",
|
198
|
-
task_attempt_id as "task_attempt_id!: Uuid",
|
199
|
-
process_type as "process_type!: ExecutionProcessType",
|
200
|
-
executor_type,
|
201
|
-
status as "status!: ExecutionProcessStatus",
|
202
|
-
command,
|
203
|
-
args,
|
204
|
-
working_directory,
|
205
|
-
exit_code,
|
206
|
-
started_at as "started_at!: DateTime<Utc>",
|
207
|
-
completed_at as "completed_at?: DateTime<Utc>",
|
208
|
-
created_at as "created_at!: DateTime<Utc>",
|
209
|
-
updated_at as "updated_at!: DateTime<Utc>"
|
210
|
-
FROM execution_processes
|
211
|
-
WHERE task_attempt_id = $1
|
212
|
-
ORDER BY created_at ASC"#,
|
213
|
-
task_attempt_id
|
214
|
-
)
|
215
|
-
.fetch_all(pool)
|
216
|
-
.await
|
217
|
-
}
|
218
|
-
|
219
|
-
/// Find running execution processes
|
220
|
-
pub async fn find_running(pool: &SqlitePool) -> Result<Vec<Self>, sqlx::Error> {
|
221
|
-
sqlx::query_as!(
|
222
|
-
ExecutionProcess,
|
223
|
-
r#"SELECT
|
224
|
-
id as "id!: Uuid",
|
225
|
-
task_attempt_id as "task_attempt_id!: Uuid",
|
226
|
-
process_type as "process_type!: ExecutionProcessType",
|
227
|
-
executor_type,
|
228
|
-
status as "status!: ExecutionProcessStatus",
|
229
|
-
command,
|
230
|
-
args,
|
231
|
-
working_directory,
|
232
|
-
stdout,
|
233
|
-
stderr,
|
234
|
-
exit_code,
|
235
|
-
started_at as "started_at!: DateTime<Utc>",
|
236
|
-
completed_at as "completed_at?: DateTime<Utc>",
|
237
|
-
created_at as "created_at!: DateTime<Utc>",
|
238
|
-
updated_at as "updated_at!: DateTime<Utc>"
|
239
|
-
FROM execution_processes
|
240
|
-
WHERE status = 'running'
|
241
|
-
ORDER BY created_at ASC"#
|
242
|
-
)
|
243
|
-
.fetch_all(pool)
|
244
|
-
.await
|
245
|
-
}
|
246
|
-
|
247
|
-
/// Find running dev servers for a specific project
|
248
|
-
pub async fn find_running_dev_servers_by_project(
|
249
|
-
pool: &SqlitePool,
|
250
|
-
project_id: Uuid,
|
251
|
-
) -> Result<Vec<Self>, sqlx::Error> {
|
252
|
-
sqlx::query_as!(
|
253
|
-
ExecutionProcess,
|
254
|
-
r#"SELECT
|
255
|
-
ep.id as "id!: Uuid",
|
256
|
-
ep.task_attempt_id as "task_attempt_id!: Uuid",
|
257
|
-
ep.process_type as "process_type!: ExecutionProcessType",
|
258
|
-
ep.executor_type,
|
259
|
-
ep.status as "status!: ExecutionProcessStatus",
|
260
|
-
ep.command,
|
261
|
-
ep.args,
|
262
|
-
ep.working_directory,
|
263
|
-
ep.stdout,
|
264
|
-
ep.stderr,
|
265
|
-
ep.exit_code,
|
266
|
-
ep.started_at as "started_at!: DateTime<Utc>",
|
267
|
-
ep.completed_at as "completed_at?: DateTime<Utc>",
|
268
|
-
ep.created_at as "created_at!: DateTime<Utc>",
|
269
|
-
ep.updated_at as "updated_at!: DateTime<Utc>"
|
270
|
-
FROM execution_processes ep
|
271
|
-
JOIN task_attempts ta ON ep.task_attempt_id = ta.id
|
272
|
-
JOIN tasks t ON ta.task_id = t.id
|
273
|
-
WHERE ep.status = 'running'
|
274
|
-
AND ep.process_type = 'devserver'
|
275
|
-
AND t.project_id = $1
|
276
|
-
ORDER BY ep.created_at ASC"#,
|
277
|
-
project_id
|
278
|
-
)
|
279
|
-
.fetch_all(pool)
|
280
|
-
.await
|
281
|
-
}
|
282
|
-
|
283
|
-
/// Create a new execution process
|
284
|
-
pub async fn create(
|
285
|
-
pool: &SqlitePool,
|
286
|
-
data: &CreateExecutionProcess,
|
287
|
-
process_id: Uuid,
|
288
|
-
) -> Result<Self, sqlx::Error> {
|
289
|
-
let now = Utc::now();
|
290
|
-
|
291
|
-
sqlx::query_as!(
|
292
|
-
ExecutionProcess,
|
293
|
-
r#"INSERT INTO execution_processes (
|
294
|
-
id, task_attempt_id, process_type, executor_type, status, command, args,
|
295
|
-
working_directory, stdout, stderr, exit_code, started_at,
|
296
|
-
completed_at, created_at, updated_at
|
297
|
-
)
|
298
|
-
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15)
|
299
|
-
RETURNING
|
300
|
-
id as "id!: Uuid",
|
301
|
-
task_attempt_id as "task_attempt_id!: Uuid",
|
302
|
-
process_type as "process_type!: ExecutionProcessType",
|
303
|
-
executor_type,
|
304
|
-
status as "status!: ExecutionProcessStatus",
|
305
|
-
command,
|
306
|
-
args,
|
307
|
-
working_directory,
|
308
|
-
stdout,
|
309
|
-
stderr,
|
310
|
-
exit_code,
|
311
|
-
started_at as "started_at!: DateTime<Utc>",
|
312
|
-
completed_at as "completed_at?: DateTime<Utc>",
|
313
|
-
created_at as "created_at!: DateTime<Utc>",
|
314
|
-
updated_at as "updated_at!: DateTime<Utc>""#,
|
315
|
-
process_id,
|
316
|
-
data.task_attempt_id,
|
317
|
-
data.process_type,
|
318
|
-
data.executor_type,
|
319
|
-
ExecutionProcessStatus::Running,
|
320
|
-
data.command,
|
321
|
-
data.args,
|
322
|
-
data.working_directory,
|
323
|
-
None::<String>, // stdout
|
324
|
-
None::<String>, // stderr
|
325
|
-
None::<i64>, // exit_code
|
326
|
-
now, // started_at
|
327
|
-
None::<DateTime<Utc>>, // completed_at
|
328
|
-
now, // created_at
|
329
|
-
now // updated_at
|
330
|
-
)
|
331
|
-
.fetch_one(pool)
|
332
|
-
.await
|
333
|
-
}
|
334
|
-
|
335
|
-
/// Update execution process status and completion info
|
336
|
-
pub async fn update_completion(
|
337
|
-
pool: &SqlitePool,
|
338
|
-
id: Uuid,
|
339
|
-
status: ExecutionProcessStatus,
|
340
|
-
exit_code: Option<i64>,
|
341
|
-
) -> Result<(), sqlx::Error> {
|
342
|
-
let completed_at = if matches!(status, ExecutionProcessStatus::Running) {
|
343
|
-
None
|
344
|
-
} else {
|
345
|
-
Some(Utc::now())
|
346
|
-
};
|
347
|
-
|
348
|
-
sqlx::query!(
|
349
|
-
r#"UPDATE execution_processes
|
350
|
-
SET status = $1, exit_code = $2, completed_at = $3, updated_at = datetime('now')
|
351
|
-
WHERE id = $4"#,
|
352
|
-
status,
|
353
|
-
exit_code,
|
354
|
-
completed_at,
|
355
|
-
id
|
356
|
-
)
|
357
|
-
.execute(pool)
|
358
|
-
.await?;
|
359
|
-
|
360
|
-
Ok(())
|
361
|
-
}
|
362
|
-
|
363
|
-
/// Append to stdout for this execution process (for streaming updates)
|
364
|
-
pub async fn append_stdout(
|
365
|
-
pool: &SqlitePool,
|
366
|
-
id: Uuid,
|
367
|
-
stdout_append: &str,
|
368
|
-
) -> Result<(), sqlx::Error> {
|
369
|
-
sqlx::query!(
|
370
|
-
"UPDATE execution_processes SET stdout = COALESCE(stdout, '') || $1, updated_at = datetime('now') WHERE id = $2",
|
371
|
-
stdout_append,
|
372
|
-
id
|
373
|
-
)
|
374
|
-
.execute(pool)
|
375
|
-
.await?;
|
376
|
-
|
377
|
-
Ok(())
|
378
|
-
}
|
379
|
-
|
380
|
-
/// Append to stderr for this execution process (for streaming updates)
|
381
|
-
pub async fn append_stderr(
|
382
|
-
pool: &SqlitePool,
|
383
|
-
id: Uuid,
|
384
|
-
stderr_append: &str,
|
385
|
-
) -> Result<(), sqlx::Error> {
|
386
|
-
sqlx::query!(
|
387
|
-
"UPDATE execution_processes SET stderr = COALESCE(stderr, '') || $1, updated_at = datetime('now') WHERE id = $2",
|
388
|
-
stderr_append,
|
389
|
-
id
|
390
|
-
)
|
391
|
-
.execute(pool)
|
392
|
-
.await?;
|
393
|
-
|
394
|
-
Ok(())
|
395
|
-
}
|
396
|
-
|
397
|
-
/// Append to both stdout and stderr for this execution process
|
398
|
-
pub async fn append_output(
|
399
|
-
pool: &SqlitePool,
|
400
|
-
id: Uuid,
|
401
|
-
stdout_append: Option<&str>,
|
402
|
-
stderr_append: Option<&str>,
|
403
|
-
) -> Result<(), sqlx::Error> {
|
404
|
-
if let Some(stdout_data) = stdout_append {
|
405
|
-
Self::append_stdout(pool, id, stdout_data).await?;
|
406
|
-
}
|
407
|
-
|
408
|
-
if let Some(stderr_data) = stderr_append {
|
409
|
-
Self::append_stderr(pool, id, stderr_data).await?;
|
410
|
-
}
|
411
|
-
|
412
|
-
Ok(())
|
413
|
-
}
|
414
|
-
|
415
|
-
/// Delete execution processes for a task attempt (cleanup)
|
416
|
-
#[allow(dead_code)]
|
417
|
-
pub async fn delete_by_task_attempt_id(
|
418
|
-
pool: &SqlitePool,
|
419
|
-
task_attempt_id: Uuid,
|
420
|
-
) -> Result<(), sqlx::Error> {
|
421
|
-
sqlx::query!(
|
422
|
-
"DELETE FROM execution_processes WHERE task_attempt_id = $1",
|
423
|
-
task_attempt_id
|
424
|
-
)
|
425
|
-
.execute(pool)
|
426
|
-
.await?;
|
427
|
-
|
428
|
-
Ok(())
|
429
|
-
}
|
430
|
-
}
|
@@ -1,225 +0,0 @@
|
|
1
|
-
use chrono::{DateTime, Utc};
|
2
|
-
use serde::{Deserialize, Serialize};
|
3
|
-
use sqlx::{FromRow, SqlitePool};
|
4
|
-
use ts_rs::TS;
|
5
|
-
use uuid::Uuid;
|
6
|
-
|
7
|
-
#[derive(Debug, Clone, FromRow, Serialize, Deserialize, TS)]
|
8
|
-
#[ts(export)]
|
9
|
-
pub struct ExecutorSession {
|
10
|
-
pub id: Uuid,
|
11
|
-
pub task_attempt_id: Uuid,
|
12
|
-
pub execution_process_id: Uuid,
|
13
|
-
pub session_id: Option<String>, // External session ID from Claude/Amp
|
14
|
-
pub prompt: Option<String>, // The prompt sent to the executor
|
15
|
-
pub summary: Option<String>, // Final assistant message/summary
|
16
|
-
pub created_at: DateTime<Utc>,
|
17
|
-
pub updated_at: DateTime<Utc>,
|
18
|
-
}
|
19
|
-
|
20
|
-
#[derive(Debug, Deserialize, TS)]
|
21
|
-
#[ts(export)]
|
22
|
-
pub struct CreateExecutorSession {
|
23
|
-
pub task_attempt_id: Uuid,
|
24
|
-
pub execution_process_id: Uuid,
|
25
|
-
pub prompt: Option<String>,
|
26
|
-
}
|
27
|
-
|
28
|
-
#[derive(Debug, Deserialize, TS)]
|
29
|
-
#[ts(export)]
|
30
|
-
#[allow(dead_code)]
|
31
|
-
pub struct UpdateExecutorSession {
|
32
|
-
pub session_id: Option<String>,
|
33
|
-
pub prompt: Option<String>,
|
34
|
-
pub summary: Option<String>,
|
35
|
-
}
|
36
|
-
|
37
|
-
impl ExecutorSession {
|
38
|
-
/// Find executor session by ID
|
39
|
-
#[allow(dead_code)]
|
40
|
-
pub async fn find_by_id(pool: &SqlitePool, id: Uuid) -> Result<Option<Self>, sqlx::Error> {
|
41
|
-
sqlx::query_as!(
|
42
|
-
ExecutorSession,
|
43
|
-
r#"SELECT
|
44
|
-
id as "id!: Uuid",
|
45
|
-
task_attempt_id as "task_attempt_id!: Uuid",
|
46
|
-
execution_process_id as "execution_process_id!: Uuid",
|
47
|
-
session_id,
|
48
|
-
prompt,
|
49
|
-
summary,
|
50
|
-
created_at as "created_at!: DateTime<Utc>",
|
51
|
-
updated_at as "updated_at!: DateTime<Utc>"
|
52
|
-
FROM executor_sessions
|
53
|
-
WHERE id = $1"#,
|
54
|
-
id
|
55
|
-
)
|
56
|
-
.fetch_optional(pool)
|
57
|
-
.await
|
58
|
-
}
|
59
|
-
|
60
|
-
/// Find executor session by execution process ID
|
61
|
-
pub async fn find_by_execution_process_id(
|
62
|
-
pool: &SqlitePool,
|
63
|
-
execution_process_id: Uuid,
|
64
|
-
) -> Result<Option<Self>, sqlx::Error> {
|
65
|
-
sqlx::query_as!(
|
66
|
-
ExecutorSession,
|
67
|
-
r#"SELECT
|
68
|
-
id as "id!: Uuid",
|
69
|
-
task_attempt_id as "task_attempt_id!: Uuid",
|
70
|
-
execution_process_id as "execution_process_id!: Uuid",
|
71
|
-
session_id,
|
72
|
-
prompt,
|
73
|
-
summary,
|
74
|
-
created_at as "created_at!: DateTime<Utc>",
|
75
|
-
updated_at as "updated_at!: DateTime<Utc>"
|
76
|
-
FROM executor_sessions
|
77
|
-
WHERE execution_process_id = $1"#,
|
78
|
-
execution_process_id
|
79
|
-
)
|
80
|
-
.fetch_optional(pool)
|
81
|
-
.await
|
82
|
-
}
|
83
|
-
|
84
|
-
/// Find all executor sessions for a task attempt
|
85
|
-
#[allow(dead_code)]
|
86
|
-
pub async fn find_by_task_attempt_id(
|
87
|
-
pool: &SqlitePool,
|
88
|
-
task_attempt_id: Uuid,
|
89
|
-
) -> Result<Vec<Self>, sqlx::Error> {
|
90
|
-
sqlx::query_as!(
|
91
|
-
ExecutorSession,
|
92
|
-
r#"SELECT
|
93
|
-
id as "id!: Uuid",
|
94
|
-
task_attempt_id as "task_attempt_id!: Uuid",
|
95
|
-
execution_process_id as "execution_process_id!: Uuid",
|
96
|
-
session_id,
|
97
|
-
prompt,
|
98
|
-
summary,
|
99
|
-
created_at as "created_at!: DateTime<Utc>",
|
100
|
-
updated_at as "updated_at!: DateTime<Utc>"
|
101
|
-
FROM executor_sessions
|
102
|
-
WHERE task_attempt_id = $1
|
103
|
-
ORDER BY created_at ASC"#,
|
104
|
-
task_attempt_id
|
105
|
-
)
|
106
|
-
.fetch_all(pool)
|
107
|
-
.await
|
108
|
-
}
|
109
|
-
|
110
|
-
/// Create a new executor session
|
111
|
-
pub async fn create(
|
112
|
-
pool: &SqlitePool,
|
113
|
-
data: &CreateExecutorSession,
|
114
|
-
session_id: Uuid,
|
115
|
-
) -> Result<Self, sqlx::Error> {
|
116
|
-
let now = Utc::now();
|
117
|
-
|
118
|
-
tracing::debug!(
|
119
|
-
"Creating executor session: id={}, task_attempt_id={}, execution_process_id={}, external_session_id=None (will be set later)",
|
120
|
-
session_id, data.task_attempt_id, data.execution_process_id
|
121
|
-
);
|
122
|
-
|
123
|
-
sqlx::query_as!(
|
124
|
-
ExecutorSession,
|
125
|
-
r#"INSERT INTO executor_sessions (
|
126
|
-
id, task_attempt_id, execution_process_id, session_id, prompt, summary,
|
127
|
-
created_at, updated_at
|
128
|
-
)
|
129
|
-
VALUES ($1, $2, $3, $4, $5, $6, $7, $8)
|
130
|
-
RETURNING
|
131
|
-
id as "id!: Uuid",
|
132
|
-
task_attempt_id as "task_attempt_id!: Uuid",
|
133
|
-
execution_process_id as "execution_process_id!: Uuid",
|
134
|
-
session_id,
|
135
|
-
prompt,
|
136
|
-
summary,
|
137
|
-
created_at as "created_at!: DateTime<Utc>",
|
138
|
-
updated_at as "updated_at!: DateTime<Utc>""#,
|
139
|
-
session_id,
|
140
|
-
data.task_attempt_id,
|
141
|
-
data.execution_process_id,
|
142
|
-
None::<String>, // session_id initially None until parsed from output
|
143
|
-
data.prompt,
|
144
|
-
None::<String>, // summary initially None
|
145
|
-
now, // created_at
|
146
|
-
now // updated_at
|
147
|
-
)
|
148
|
-
.fetch_one(pool)
|
149
|
-
.await
|
150
|
-
}
|
151
|
-
|
152
|
-
/// Update executor session with external session ID
|
153
|
-
pub async fn update_session_id(
|
154
|
-
pool: &SqlitePool,
|
155
|
-
execution_process_id: Uuid,
|
156
|
-
external_session_id: &str,
|
157
|
-
) -> Result<(), sqlx::Error> {
|
158
|
-
sqlx::query!(
|
159
|
-
r#"UPDATE executor_sessions
|
160
|
-
SET session_id = $1, updated_at = datetime('now')
|
161
|
-
WHERE execution_process_id = $2"#,
|
162
|
-
external_session_id,
|
163
|
-
execution_process_id
|
164
|
-
)
|
165
|
-
.execute(pool)
|
166
|
-
.await?;
|
167
|
-
|
168
|
-
Ok(())
|
169
|
-
}
|
170
|
-
|
171
|
-
/// Update executor session prompt
|
172
|
-
#[allow(dead_code)]
|
173
|
-
pub async fn update_prompt(
|
174
|
-
pool: &SqlitePool,
|
175
|
-
id: Uuid,
|
176
|
-
prompt: &str,
|
177
|
-
) -> Result<(), sqlx::Error> {
|
178
|
-
sqlx::query!(
|
179
|
-
r#"UPDATE executor_sessions
|
180
|
-
SET prompt = $1, updated_at = datetime('now')
|
181
|
-
WHERE id = $2"#,
|
182
|
-
prompt,
|
183
|
-
id
|
184
|
-
)
|
185
|
-
.execute(pool)
|
186
|
-
.await?;
|
187
|
-
|
188
|
-
Ok(())
|
189
|
-
}
|
190
|
-
|
191
|
-
/// Update executor session summary
|
192
|
-
pub async fn update_summary(
|
193
|
-
pool: &SqlitePool,
|
194
|
-
execution_process_id: Uuid,
|
195
|
-
summary: &str,
|
196
|
-
) -> Result<(), sqlx::Error> {
|
197
|
-
sqlx::query!(
|
198
|
-
r#"UPDATE executor_sessions
|
199
|
-
SET summary = $1, updated_at = datetime('now')
|
200
|
-
WHERE execution_process_id = $2"#,
|
201
|
-
summary,
|
202
|
-
execution_process_id
|
203
|
-
)
|
204
|
-
.execute(pool)
|
205
|
-
.await?;
|
206
|
-
|
207
|
-
Ok(())
|
208
|
-
}
|
209
|
-
|
210
|
-
/// Delete executor sessions for a task attempt (cleanup)
|
211
|
-
#[allow(dead_code)]
|
212
|
-
pub async fn delete_by_task_attempt_id(
|
213
|
-
pool: &SqlitePool,
|
214
|
-
task_attempt_id: Uuid,
|
215
|
-
) -> Result<(), sqlx::Error> {
|
216
|
-
sqlx::query!(
|
217
|
-
"DELETE FROM executor_sessions WHERE task_attempt_id = $1",
|
218
|
-
task_attempt_id
|
219
|
-
)
|
220
|
-
.execute(pool)
|
221
|
-
.await?;
|
222
|
-
|
223
|
-
Ok(())
|
224
|
-
}
|
225
|
-
}
|