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,92 +0,0 @@
|
|
1
|
-
import { Hammer } from 'lucide-react';
|
2
|
-
import { Loader } from '@/components/ui/loader.tsx';
|
3
|
-
import MarkdownRenderer from '@/components/ui/markdown-renderer.tsx';
|
4
|
-
import type { ExecutionProcess, WorktreeDiff } from 'shared/types.ts';
|
5
|
-
import DisplayConversationEntry from '@/components/tasks/TaskDetails/DisplayConversationEntry.tsx';
|
6
|
-
import useNormalizedConversation from '@/hooks/useNormalizedConversation';
|
7
|
-
|
8
|
-
interface NormalizedConversationViewerProps {
|
9
|
-
executionProcess: ExecutionProcess;
|
10
|
-
onConversationUpdate?: () => void;
|
11
|
-
onDisplayEntriesChange?: (num: number) => void;
|
12
|
-
visibleEntriesNum?: number;
|
13
|
-
diff?: WorktreeDiff | null;
|
14
|
-
isBackgroundRefreshing?: boolean;
|
15
|
-
diffDeletable?: boolean;
|
16
|
-
}
|
17
|
-
|
18
|
-
export function NormalizedConversationViewer({
|
19
|
-
executionProcess,
|
20
|
-
diffDeletable,
|
21
|
-
onConversationUpdate,
|
22
|
-
visibleEntriesNum,
|
23
|
-
onDisplayEntriesChange,
|
24
|
-
}: NormalizedConversationViewerProps) {
|
25
|
-
const { loading, error, conversation, displayEntries } =
|
26
|
-
useNormalizedConversation({
|
27
|
-
executionProcess,
|
28
|
-
onConversationUpdate,
|
29
|
-
onDisplayEntriesChange,
|
30
|
-
visibleEntriesNum,
|
31
|
-
});
|
32
|
-
|
33
|
-
if (loading) {
|
34
|
-
return (
|
35
|
-
<Loader message="Loading conversation..." size={24} className="py-4" />
|
36
|
-
);
|
37
|
-
}
|
38
|
-
|
39
|
-
if (error) {
|
40
|
-
return <div className="text-xs text-red-600 text-center">{error}</div>;
|
41
|
-
}
|
42
|
-
|
43
|
-
if (!conversation || conversation.entries.length === 0) {
|
44
|
-
// If the execution process is still running, show loading instead of "no data"
|
45
|
-
if (executionProcess.status === 'running') {
|
46
|
-
return (
|
47
|
-
<div className="text-xs text-muted-foreground italic text-center">
|
48
|
-
Waiting for logs...
|
49
|
-
</div>
|
50
|
-
);
|
51
|
-
}
|
52
|
-
|
53
|
-
return (
|
54
|
-
<div className="text-xs text-muted-foreground italic text-center">
|
55
|
-
No conversation data available
|
56
|
-
</div>
|
57
|
-
);
|
58
|
-
}
|
59
|
-
|
60
|
-
return (
|
61
|
-
<div>
|
62
|
-
{/* Display prompt if available */}
|
63
|
-
{conversation.prompt && (
|
64
|
-
<div className="flex items-start gap-3">
|
65
|
-
<div className="flex-shrink-0 mt-1">
|
66
|
-
<Hammer className="h-4 w-4 text-blue-600" />
|
67
|
-
</div>
|
68
|
-
<div className="flex-1 min-w-0">
|
69
|
-
<div className="text-sm whitespace-pre-wrap text-foreground">
|
70
|
-
<MarkdownRenderer
|
71
|
-
content={conversation.prompt}
|
72
|
-
className="whitespace-pre-wrap break-words"
|
73
|
-
/>
|
74
|
-
</div>
|
75
|
-
</div>
|
76
|
-
</div>
|
77
|
-
)}
|
78
|
-
|
79
|
-
{/* Display conversation entries */}
|
80
|
-
<div className="space-y-2">
|
81
|
-
{displayEntries.map((entry, index) => (
|
82
|
-
<DisplayConversationEntry
|
83
|
-
key={entry.timestamp || index}
|
84
|
-
entry={entry}
|
85
|
-
index={index}
|
86
|
-
diffDeletable={diffDeletable}
|
87
|
-
/>
|
88
|
-
))}
|
89
|
-
</div>
|
90
|
-
</div>
|
91
|
-
);
|
92
|
-
}
|
@@ -1,22 +0,0 @@
|
|
1
|
-
import MarkdownRenderer from '@/components/ui/markdown-renderer';
|
2
|
-
import { Hammer } from 'lucide-react';
|
3
|
-
|
4
|
-
const Prompt = ({ prompt }: { prompt: string }) => {
|
5
|
-
return (
|
6
|
-
<div className="flex items-start gap-3">
|
7
|
-
<div className="flex-shrink-0 mt-1">
|
8
|
-
<Hammer className="h-4 w-4 text-blue-600" />
|
9
|
-
</div>
|
10
|
-
<div className="flex-1 min-w-0">
|
11
|
-
<div className="text-sm whitespace-pre-wrap text-foreground">
|
12
|
-
<MarkdownRenderer
|
13
|
-
content={prompt}
|
14
|
-
className="whitespace-pre-wrap break-words"
|
15
|
-
/>
|
16
|
-
</div>
|
17
|
-
</div>
|
18
|
-
</div>
|
19
|
-
);
|
20
|
-
};
|
21
|
-
|
22
|
-
export default Prompt;
|
@@ -1,49 +0,0 @@
|
|
1
|
-
import { useEffect, useMemo, useRef } from 'react';
|
2
|
-
import { ExecutionProcess } from 'shared/types.ts';
|
3
|
-
|
4
|
-
type Props = {
|
5
|
-
setupProcessId: string | null;
|
6
|
-
runningProcessDetails: Record<string, ExecutionProcess>;
|
7
|
-
};
|
8
|
-
|
9
|
-
function SetupScriptRunning({ setupProcessId, runningProcessDetails }: Props) {
|
10
|
-
const setupScrollRef = useRef<HTMLDivElement>(null);
|
11
|
-
|
12
|
-
// Auto-scroll setup script logs to bottom
|
13
|
-
useEffect(() => {
|
14
|
-
if (setupScrollRef.current) {
|
15
|
-
setupScrollRef.current.scrollTop = setupScrollRef.current.scrollHeight;
|
16
|
-
}
|
17
|
-
}, [runningProcessDetails]);
|
18
|
-
|
19
|
-
const setupProcess = useMemo(
|
20
|
-
() =>
|
21
|
-
setupProcessId
|
22
|
-
? runningProcessDetails[setupProcessId]
|
23
|
-
: Object.values(runningProcessDetails).find(
|
24
|
-
(process) => process.process_type === 'setupscript'
|
25
|
-
),
|
26
|
-
[setupProcessId, runningProcessDetails]
|
27
|
-
);
|
28
|
-
|
29
|
-
return (
|
30
|
-
<div ref={setupScrollRef} className="h-full overflow-y-auto">
|
31
|
-
<div className="mb-4">
|
32
|
-
<p className="text-lg font-semibold mb-2">Setup Script Running</p>
|
33
|
-
<p className="text-muted-foreground mb-4">
|
34
|
-
Preparing the environment for the coding agent...
|
35
|
-
</p>
|
36
|
-
</div>
|
37
|
-
|
38
|
-
{setupProcess && (
|
39
|
-
<div className="font-mono text-sm whitespace-pre-wrap text-muted-foreground">
|
40
|
-
{[setupProcess.stdout || '', setupProcess.stderr || '']
|
41
|
-
.filter(Boolean)
|
42
|
-
.join('\n') || 'Waiting for setup script output...'}
|
43
|
-
</div>
|
44
|
-
)}
|
45
|
-
</div>
|
46
|
-
);
|
47
|
-
}
|
48
|
-
|
49
|
-
export default SetupScriptRunning;
|
@@ -1,186 +0,0 @@
|
|
1
|
-
import { useContext } from 'react';
|
2
|
-
import { MessageSquare } from 'lucide-react';
|
3
|
-
import { NormalizedConversationViewer } from '@/components/tasks/TaskDetails/LogsTab/NormalizedConversationViewer.tsx';
|
4
|
-
import {
|
5
|
-
TaskAttemptDataContext,
|
6
|
-
TaskAttemptLoadingContext,
|
7
|
-
TaskExecutionStateContext,
|
8
|
-
TaskSelectedAttemptContext,
|
9
|
-
} from '@/components/context/taskDetailsContext.ts';
|
10
|
-
import Conversation from '@/components/tasks/TaskDetails/LogsTab/Conversation.tsx';
|
11
|
-
import { Loader } from '@/components/ui/loader';
|
12
|
-
import SetupScriptRunning from '@/components/tasks/TaskDetails/LogsTab/SetupScriptRunning.tsx';
|
13
|
-
|
14
|
-
function LogsTab() {
|
15
|
-
const { loading } = useContext(TaskAttemptLoadingContext);
|
16
|
-
const { executionState } = useContext(TaskExecutionStateContext);
|
17
|
-
const { selectedAttempt } = useContext(TaskSelectedAttemptContext);
|
18
|
-
const { attemptData } = useContext(TaskAttemptDataContext);
|
19
|
-
|
20
|
-
if (loading) {
|
21
|
-
return (
|
22
|
-
<div className="flex items-center justify-center h-full">
|
23
|
-
<Loader message="Loading..." size={32} />
|
24
|
-
</div>
|
25
|
-
);
|
26
|
-
}
|
27
|
-
|
28
|
-
// If no attempt is selected, show message
|
29
|
-
if (!selectedAttempt) {
|
30
|
-
return (
|
31
|
-
<div className="text-center py-8 text-muted-foreground">
|
32
|
-
<MessageSquare className="h-12 w-12 mx-auto mb-4 opacity-50" />
|
33
|
-
<p className="text-lg font-medium mb-2">No attempt selected</p>
|
34
|
-
<p className="text-sm">Select an attempt to view its logs</p>
|
35
|
-
</div>
|
36
|
-
);
|
37
|
-
}
|
38
|
-
|
39
|
-
// If no execution state, execution hasn't started yet
|
40
|
-
if (!executionState) {
|
41
|
-
return (
|
42
|
-
<div className="text-center py-8 text-muted-foreground">
|
43
|
-
<MessageSquare className="h-12 w-12 mx-auto mb-4 opacity-50" />
|
44
|
-
<p className="text-lg font-medium mb-2">
|
45
|
-
Task execution not started yet
|
46
|
-
</p>
|
47
|
-
<p className="text-sm">
|
48
|
-
Logs will appear here once the task execution begins
|
49
|
-
</p>
|
50
|
-
</div>
|
51
|
-
);
|
52
|
-
}
|
53
|
-
|
54
|
-
const isSetupRunning = executionState.execution_state === 'SetupRunning';
|
55
|
-
const isSetupComplete = executionState.execution_state === 'SetupComplete';
|
56
|
-
const isSetupFailed = executionState.execution_state === 'SetupFailed';
|
57
|
-
const isSetupStopped = executionState.execution_state === 'SetupStopped';
|
58
|
-
const isCodingAgentRunning =
|
59
|
-
executionState.execution_state === 'CodingAgentRunning';
|
60
|
-
const isCodingAgentComplete =
|
61
|
-
executionState.execution_state === 'CodingAgentComplete';
|
62
|
-
const isCodingAgentFailed =
|
63
|
-
executionState.execution_state === 'CodingAgentFailed';
|
64
|
-
const isCodingAgentStopped =
|
65
|
-
executionState.execution_state === 'CodingAgentStopped';
|
66
|
-
const isComplete = executionState.execution_state === 'Complete';
|
67
|
-
const hasChanges = executionState.has_changes;
|
68
|
-
|
69
|
-
// When setup script is running, show setup execution stdio
|
70
|
-
if (isSetupRunning) {
|
71
|
-
return (
|
72
|
-
<SetupScriptRunning
|
73
|
-
setupProcessId={executionState.setup_process_id}
|
74
|
-
runningProcessDetails={attemptData.runningProcessDetails}
|
75
|
-
/>
|
76
|
-
);
|
77
|
-
}
|
78
|
-
|
79
|
-
// When setup failed or was stopped
|
80
|
-
if (isSetupFailed || isSetupStopped) {
|
81
|
-
let setupProcess = executionState.setup_process_id
|
82
|
-
? attemptData.runningProcessDetails[executionState.setup_process_id]
|
83
|
-
: Object.values(attemptData.runningProcessDetails).find(
|
84
|
-
(process) => process.process_type === 'setupscript'
|
85
|
-
);
|
86
|
-
|
87
|
-
// If not found in runningProcessDetails, try to find in processes array
|
88
|
-
if (!setupProcess) {
|
89
|
-
const setupSummary = attemptData.processes.find(
|
90
|
-
(process) => process.process_type === 'setupscript'
|
91
|
-
);
|
92
|
-
|
93
|
-
if (setupSummary) {
|
94
|
-
setupProcess = Object.values(attemptData.runningProcessDetails).find(
|
95
|
-
(process) => process.id === setupSummary.id
|
96
|
-
);
|
97
|
-
|
98
|
-
if (!setupProcess) {
|
99
|
-
setupProcess = {
|
100
|
-
...setupSummary,
|
101
|
-
stdout: null,
|
102
|
-
stderr: null,
|
103
|
-
} as any;
|
104
|
-
}
|
105
|
-
}
|
106
|
-
}
|
107
|
-
|
108
|
-
return (
|
109
|
-
<div className="h-full overflow-y-auto">
|
110
|
-
<div className="mb-4">
|
111
|
-
<p
|
112
|
-
className={`text-lg font-semibold mb-2 ${isSetupFailed ? 'text-destructive' : ''}`}
|
113
|
-
>
|
114
|
-
{isSetupFailed ? 'Setup Script Failed' : 'Setup Script Stopped'}
|
115
|
-
</p>
|
116
|
-
{isSetupFailed && (
|
117
|
-
<p className="text-muted-foreground mb-4">
|
118
|
-
The setup script encountered an error. Error details below:
|
119
|
-
</p>
|
120
|
-
)}
|
121
|
-
</div>
|
122
|
-
|
123
|
-
{setupProcess && (
|
124
|
-
<NormalizedConversationViewer executionProcess={setupProcess} />
|
125
|
-
)}
|
126
|
-
</div>
|
127
|
-
);
|
128
|
-
}
|
129
|
-
|
130
|
-
// When coding agent is in any state (running, complete, failed, stopped)
|
131
|
-
if (
|
132
|
-
isCodingAgentRunning ||
|
133
|
-
isCodingAgentComplete ||
|
134
|
-
isCodingAgentFailed ||
|
135
|
-
isCodingAgentStopped ||
|
136
|
-
hasChanges
|
137
|
-
) {
|
138
|
-
return <Conversation />;
|
139
|
-
}
|
140
|
-
|
141
|
-
// When setup is complete but coding agent hasn't started, show waiting state
|
142
|
-
if (
|
143
|
-
isSetupComplete &&
|
144
|
-
!isCodingAgentRunning &&
|
145
|
-
!isCodingAgentComplete &&
|
146
|
-
!isCodingAgentFailed &&
|
147
|
-
!isCodingAgentStopped &&
|
148
|
-
!hasChanges
|
149
|
-
) {
|
150
|
-
return (
|
151
|
-
<div className="text-center py-8 text-muted-foreground">
|
152
|
-
<MessageSquare className="h-12 w-12 mx-auto mb-4 opacity-50" />
|
153
|
-
<p className="text-lg font-semibold mb-2">Setup Complete</p>
|
154
|
-
<p>Waiting for coding agent to start...</p>
|
155
|
-
</div>
|
156
|
-
);
|
157
|
-
}
|
158
|
-
|
159
|
-
// When task is complete, show completion message
|
160
|
-
if (isComplete) {
|
161
|
-
return (
|
162
|
-
<div className="text-center py-8 text-green-600">
|
163
|
-
<MessageSquare className="h-12 w-12 mx-auto mb-4 opacity-50" />
|
164
|
-
<p className="text-lg font-semibold mb-2">Task Complete</p>
|
165
|
-
<p className="text-muted-foreground">
|
166
|
-
The task has been completed successfully.
|
167
|
-
</p>
|
168
|
-
</div>
|
169
|
-
);
|
170
|
-
}
|
171
|
-
|
172
|
-
// When coding agent is running or complete, show conversation
|
173
|
-
if (isCodingAgentRunning || isCodingAgentComplete || hasChanges) {
|
174
|
-
return <Conversation />;
|
175
|
-
}
|
176
|
-
|
177
|
-
// Default case - unexpected state
|
178
|
-
return (
|
179
|
-
<div className="text-center py-8 text-muted-foreground">
|
180
|
-
<MessageSquare className="h-12 w-12 mx-auto mb-4 opacity-50" />
|
181
|
-
<p>Unknown execution state</p>
|
182
|
-
</div>
|
183
|
-
);
|
184
|
-
}
|
185
|
-
|
186
|
-
export default LogsTab;
|
@@ -1,288 +0,0 @@
|
|
1
|
-
import { useContext, useState } from 'react';
|
2
|
-
import {
|
3
|
-
Play,
|
4
|
-
Square,
|
5
|
-
AlertCircle,
|
6
|
-
CheckCircle,
|
7
|
-
Clock,
|
8
|
-
Cog,
|
9
|
-
ArrowLeft,
|
10
|
-
} from 'lucide-react';
|
11
|
-
import { TaskAttemptDataContext } from '@/components/context/taskDetailsContext.ts';
|
12
|
-
import { executionProcessesApi } from '@/lib/api.ts';
|
13
|
-
import type {
|
14
|
-
ExecutionProcessStatus,
|
15
|
-
ExecutionProcessSummary,
|
16
|
-
} from 'shared/types.ts';
|
17
|
-
|
18
|
-
function ProcessesTab() {
|
19
|
-
const { attemptData, setAttemptData } = useContext(TaskAttemptDataContext);
|
20
|
-
const [selectedProcessId, setSelectedProcessId] = useState<string | null>(
|
21
|
-
null
|
22
|
-
);
|
23
|
-
const [loadingProcessId, setLoadingProcessId] = useState<string | null>(null);
|
24
|
-
|
25
|
-
const getStatusIcon = (status: ExecutionProcessStatus) => {
|
26
|
-
switch (status) {
|
27
|
-
case 'running':
|
28
|
-
return <Play className="h-4 w-4 text-blue-500" />;
|
29
|
-
case 'completed':
|
30
|
-
return <CheckCircle className="h-4 w-4 text-green-500" />;
|
31
|
-
case 'failed':
|
32
|
-
return <AlertCircle className="h-4 w-4 text-red-500" />;
|
33
|
-
case 'killed':
|
34
|
-
return <Square className="h-4 w-4 text-gray-500" />;
|
35
|
-
default:
|
36
|
-
return <Clock className="h-4 w-4 text-gray-400" />;
|
37
|
-
}
|
38
|
-
};
|
39
|
-
|
40
|
-
const getStatusColor = (status: ExecutionProcessStatus) => {
|
41
|
-
switch (status) {
|
42
|
-
case 'running':
|
43
|
-
return 'bg-blue-50 border-blue-200 text-blue-800';
|
44
|
-
case 'completed':
|
45
|
-
return 'bg-green-50 border-green-200 text-green-800';
|
46
|
-
case 'failed':
|
47
|
-
return 'bg-red-50 border-red-200 text-red-800';
|
48
|
-
case 'killed':
|
49
|
-
return 'bg-gray-50 border-gray-200 text-gray-800';
|
50
|
-
default:
|
51
|
-
return 'bg-gray-50 border-gray-200 text-gray-800';
|
52
|
-
}
|
53
|
-
};
|
54
|
-
|
55
|
-
const formatDate = (dateString: string) => {
|
56
|
-
const date = new Date(dateString);
|
57
|
-
return date.toLocaleString();
|
58
|
-
};
|
59
|
-
|
60
|
-
const fetchProcessDetails = async (processId: string) => {
|
61
|
-
try {
|
62
|
-
setLoadingProcessId(processId);
|
63
|
-
const result = await executionProcessesApi.getDetails(processId);
|
64
|
-
|
65
|
-
if (result !== undefined) {
|
66
|
-
setAttemptData((prev) => ({
|
67
|
-
...prev,
|
68
|
-
runningProcessDetails: {
|
69
|
-
...prev.runningProcessDetails,
|
70
|
-
[processId]: result,
|
71
|
-
},
|
72
|
-
}));
|
73
|
-
}
|
74
|
-
} catch (err) {
|
75
|
-
console.error('Failed to fetch process details:', err);
|
76
|
-
} finally {
|
77
|
-
setLoadingProcessId(null);
|
78
|
-
}
|
79
|
-
};
|
80
|
-
|
81
|
-
const handleProcessClick = async (process: ExecutionProcessSummary) => {
|
82
|
-
setSelectedProcessId(process.id);
|
83
|
-
|
84
|
-
// If we don't have details for this process, fetch them
|
85
|
-
if (!attemptData.runningProcessDetails[process.id]) {
|
86
|
-
await fetchProcessDetails(process.id);
|
87
|
-
}
|
88
|
-
};
|
89
|
-
|
90
|
-
const selectedProcess = selectedProcessId
|
91
|
-
? attemptData.runningProcessDetails[selectedProcessId]
|
92
|
-
: null;
|
93
|
-
|
94
|
-
if (!attemptData.processes || attemptData.processes.length === 0) {
|
95
|
-
return (
|
96
|
-
<div className="flex-1 flex items-center justify-center text-muted-foreground">
|
97
|
-
<div className="text-center">
|
98
|
-
<Cog className="h-12 w-12 mx-auto mb-4 opacity-50" />
|
99
|
-
<p>No execution processes found for this attempt.</p>
|
100
|
-
</div>
|
101
|
-
</div>
|
102
|
-
);
|
103
|
-
}
|
104
|
-
|
105
|
-
return (
|
106
|
-
<div className="flex-1 flex flex-col min-h-0">
|
107
|
-
{!selectedProcessId ? (
|
108
|
-
<div className="flex-1 overflow-auto px-4 pb-20">
|
109
|
-
<div className="space-y-3">
|
110
|
-
{attemptData.processes.map((process) => (
|
111
|
-
<div
|
112
|
-
key={process.id}
|
113
|
-
className={`border rounded-lg p-4 hover:bg-muted/30 cursor-pointer transition-colors ${
|
114
|
-
loadingProcessId === process.id
|
115
|
-
? 'opacity-50 cursor-wait'
|
116
|
-
: ''
|
117
|
-
}`}
|
118
|
-
onClick={() => handleProcessClick(process)}
|
119
|
-
>
|
120
|
-
<div className="flex items-start justify-between">
|
121
|
-
<div className="flex items-center space-x-3">
|
122
|
-
{getStatusIcon(process.status)}
|
123
|
-
<div>
|
124
|
-
<h3 className="font-medium text-sm">
|
125
|
-
{process.process_type}
|
126
|
-
{process.executor_type && (
|
127
|
-
<span className="text-muted-foreground">
|
128
|
-
{' '}
|
129
|
-
({process.executor_type})
|
130
|
-
</span>
|
131
|
-
)}
|
132
|
-
</h3>
|
133
|
-
<p className="text-sm text-muted-foreground mt-1">
|
134
|
-
{process.command}
|
135
|
-
</p>
|
136
|
-
{process.args && (
|
137
|
-
<p className="text-xs text-muted-foreground mt-1">
|
138
|
-
Args: {process.args}
|
139
|
-
</p>
|
140
|
-
)}
|
141
|
-
</div>
|
142
|
-
</div>
|
143
|
-
<div className="text-right">
|
144
|
-
<span
|
145
|
-
className={`inline-block px-2 py-1 text-xs font-medium border rounded-full ${getStatusColor(
|
146
|
-
process.status
|
147
|
-
)}`}
|
148
|
-
>
|
149
|
-
{process.status}
|
150
|
-
</span>
|
151
|
-
{process.exit_code !== null && (
|
152
|
-
<p className="text-xs text-muted-foreground mt-1">
|
153
|
-
Exit: {process.exit_code.toString()}
|
154
|
-
</p>
|
155
|
-
)}
|
156
|
-
</div>
|
157
|
-
</div>
|
158
|
-
<div className="mt-3 text-xs text-muted-foreground">
|
159
|
-
<div className="flex justify-between">
|
160
|
-
<span>Started: {formatDate(process.started_at)}</span>
|
161
|
-
{process.completed_at && (
|
162
|
-
<span>Completed: {formatDate(process.completed_at)}</span>
|
163
|
-
)}
|
164
|
-
</div>
|
165
|
-
<div className="mt-1">
|
166
|
-
Working directory: {process.working_directory}
|
167
|
-
</div>
|
168
|
-
</div>
|
169
|
-
</div>
|
170
|
-
))}
|
171
|
-
</div>
|
172
|
-
</div>
|
173
|
-
) : (
|
174
|
-
<div className="flex-1 flex flex-col min-h-0">
|
175
|
-
<div className="flex items-center justify-between p-4 border-b flex-shrink-0">
|
176
|
-
<h2 className="text-lg font-semibold">Process Details</h2>
|
177
|
-
<button
|
178
|
-
onClick={() => setSelectedProcessId(null)}
|
179
|
-
className="flex items-center gap-2 px-3 py-2 text-sm font-medium text-muted-foreground hover:text-foreground hover:bg-muted/50 rounded-md border border-border transition-colors"
|
180
|
-
>
|
181
|
-
<ArrowLeft className="h-4 w-4" />
|
182
|
-
Back to list
|
183
|
-
</button>
|
184
|
-
</div>
|
185
|
-
<div className="flex-1 overflow-y-auto p-4 pb-20">
|
186
|
-
{selectedProcess ? (
|
187
|
-
<div className="space-y-4">
|
188
|
-
<div className="grid grid-cols-2 gap-4">
|
189
|
-
<div>
|
190
|
-
<h3 className="font-medium text-sm mb-2">Process Info</h3>
|
191
|
-
<div className="space-y-1 text-sm">
|
192
|
-
<p>
|
193
|
-
<span className="font-medium">Type:</span>{' '}
|
194
|
-
{selectedProcess.process_type}
|
195
|
-
</p>
|
196
|
-
<p>
|
197
|
-
<span className="font-medium">Status:</span>{' '}
|
198
|
-
{selectedProcess.status}
|
199
|
-
</p>
|
200
|
-
{selectedProcess.executor_type && (
|
201
|
-
<p>
|
202
|
-
<span className="font-medium">Executor:</span>{' '}
|
203
|
-
{selectedProcess.executor_type}
|
204
|
-
</p>
|
205
|
-
)}
|
206
|
-
<p>
|
207
|
-
<span className="font-medium">Exit Code:</span>{' '}
|
208
|
-
{selectedProcess.exit_code?.toString() ?? 'N/A'}
|
209
|
-
</p>
|
210
|
-
</div>
|
211
|
-
</div>
|
212
|
-
<div>
|
213
|
-
<h3 className="font-medium text-sm mb-2">Timing</h3>
|
214
|
-
<div className="space-y-1 text-sm">
|
215
|
-
<p>
|
216
|
-
<span className="font-medium">Started:</span>{' '}
|
217
|
-
{formatDate(selectedProcess.started_at)}
|
218
|
-
</p>
|
219
|
-
{selectedProcess.completed_at && (
|
220
|
-
<p>
|
221
|
-
<span className="font-medium">Completed:</span>{' '}
|
222
|
-
{formatDate(selectedProcess.completed_at)}
|
223
|
-
</p>
|
224
|
-
)}
|
225
|
-
</div>
|
226
|
-
</div>
|
227
|
-
</div>
|
228
|
-
|
229
|
-
<div>
|
230
|
-
<h3 className="font-medium text-sm mb-2">Command</h3>
|
231
|
-
<div className="bg-muted/50 p-3 rounded-md font-mono text-sm">
|
232
|
-
{selectedProcess.command}
|
233
|
-
{selectedProcess.args && (
|
234
|
-
<div className="mt-1 text-muted-foreground">
|
235
|
-
Args: {selectedProcess.args}
|
236
|
-
</div>
|
237
|
-
)}
|
238
|
-
</div>
|
239
|
-
</div>
|
240
|
-
|
241
|
-
<div>
|
242
|
-
<h3 className="font-medium text-sm mb-2">
|
243
|
-
Working Directory
|
244
|
-
</h3>
|
245
|
-
<div className="bg-muted/50 p-3 rounded-md font-mono text-sm">
|
246
|
-
{selectedProcess.working_directory}
|
247
|
-
</div>
|
248
|
-
</div>
|
249
|
-
|
250
|
-
{selectedProcess.stdout && (
|
251
|
-
<div>
|
252
|
-
<h3 className="font-medium text-sm mb-2">Stdout</h3>
|
253
|
-
<div className="bg-black text-green-400 p-3 rounded-md font-mono text-sm h-64 overflow-auto">
|
254
|
-
<pre className="whitespace-pre-wrap">
|
255
|
-
{selectedProcess.stdout}
|
256
|
-
</pre>
|
257
|
-
</div>
|
258
|
-
</div>
|
259
|
-
)}
|
260
|
-
|
261
|
-
{selectedProcess.stderr && (
|
262
|
-
<div>
|
263
|
-
<h3 className="font-medium text-sm mb-2">Stderr</h3>
|
264
|
-
<div className="bg-black text-red-400 p-3 rounded-md font-mono text-sm h-64 overflow-auto">
|
265
|
-
<pre className="whitespace-pre-wrap">
|
266
|
-
{selectedProcess.stderr}
|
267
|
-
</pre>
|
268
|
-
</div>
|
269
|
-
</div>
|
270
|
-
)}
|
271
|
-
</div>
|
272
|
-
) : loadingProcessId === selectedProcessId ? (
|
273
|
-
<div className="text-center text-muted-foreground">
|
274
|
-
<p>Loading process details...</p>
|
275
|
-
</div>
|
276
|
-
) : (
|
277
|
-
<div className="text-center text-muted-foreground">
|
278
|
-
<p>Failed to load process details. Please try again.</p>
|
279
|
-
</div>
|
280
|
-
)}
|
281
|
-
</div>
|
282
|
-
</div>
|
283
|
-
)}
|
284
|
-
</div>
|
285
|
-
);
|
286
|
-
}
|
287
|
-
|
288
|
-
export default ProcessesTab;
|