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,610 +0,0 @@
|
|
1
|
-
import { useCallback, useState } from 'react';
|
2
|
-
import {
|
3
|
-
Card,
|
4
|
-
CardContent,
|
5
|
-
CardDescription,
|
6
|
-
CardHeader,
|
7
|
-
CardTitle,
|
8
|
-
} from '@/components/ui/card';
|
9
|
-
import { Button } from '@/components/ui/button';
|
10
|
-
import {
|
11
|
-
Select,
|
12
|
-
SelectContent,
|
13
|
-
SelectItem,
|
14
|
-
SelectTrigger,
|
15
|
-
SelectValue,
|
16
|
-
} from '@/components/ui/select';
|
17
|
-
import { Label } from '@/components/ui/label';
|
18
|
-
import { Alert, AlertDescription } from '@/components/ui/alert';
|
19
|
-
import { Checkbox } from '@/components/ui/checkbox';
|
20
|
-
import { Input } from '@/components/ui/input';
|
21
|
-
import { Key, Loader2, Volume2 } from 'lucide-react';
|
22
|
-
import type { EditorType, SoundFile, ThemeMode } from 'shared/types';
|
23
|
-
import {
|
24
|
-
EDITOR_LABELS,
|
25
|
-
EDITOR_TYPES,
|
26
|
-
EXECUTOR_LABELS,
|
27
|
-
EXECUTOR_TYPES,
|
28
|
-
SOUND_FILES,
|
29
|
-
SOUND_LABELS,
|
30
|
-
} from 'shared/types';
|
31
|
-
import { useTheme } from '@/components/theme-provider';
|
32
|
-
import { useConfig } from '@/components/config-provider';
|
33
|
-
import { GitHubLoginDialog } from '@/components/GitHubLoginDialog';
|
34
|
-
import { TaskTemplateManager } from '@/components/TaskTemplateManager';
|
35
|
-
|
36
|
-
export function Settings() {
|
37
|
-
const { config, updateConfig, saveConfig, loading, updateAndSaveConfig } =
|
38
|
-
useConfig();
|
39
|
-
const [saving, setSaving] = useState(false);
|
40
|
-
const [error, setError] = useState<string | null>(null);
|
41
|
-
const [success, setSuccess] = useState(false);
|
42
|
-
const { setTheme } = useTheme();
|
43
|
-
const [showGitHubLogin, setShowGitHubLogin] = useState(false);
|
44
|
-
|
45
|
-
const playSound = async (soundFile: SoundFile) => {
|
46
|
-
const audio = new Audio(`/api/sounds/${soundFile}.wav`);
|
47
|
-
try {
|
48
|
-
await audio.play();
|
49
|
-
} catch (err) {
|
50
|
-
console.error('Failed to play sound:', err);
|
51
|
-
}
|
52
|
-
};
|
53
|
-
|
54
|
-
const handleSave = async () => {
|
55
|
-
if (!config) return;
|
56
|
-
|
57
|
-
setSaving(true);
|
58
|
-
setError(null);
|
59
|
-
setSuccess(false);
|
60
|
-
|
61
|
-
try {
|
62
|
-
// Save the main configuration
|
63
|
-
const success = await saveConfig();
|
64
|
-
|
65
|
-
if (success) {
|
66
|
-
setSuccess(true);
|
67
|
-
// Update theme provider to reflect the saved theme
|
68
|
-
setTheme(config.theme);
|
69
|
-
|
70
|
-
setTimeout(() => setSuccess(false), 3000);
|
71
|
-
} else {
|
72
|
-
setError('Failed to save configuration');
|
73
|
-
}
|
74
|
-
} catch (err) {
|
75
|
-
setError('Failed to save configuration');
|
76
|
-
console.error('Error saving config:', err);
|
77
|
-
} finally {
|
78
|
-
setSaving(false);
|
79
|
-
}
|
80
|
-
};
|
81
|
-
|
82
|
-
const resetDisclaimer = async () => {
|
83
|
-
if (!config) return;
|
84
|
-
|
85
|
-
updateConfig({ disclaimer_acknowledged: false });
|
86
|
-
};
|
87
|
-
|
88
|
-
const resetOnboarding = async () => {
|
89
|
-
if (!config) return;
|
90
|
-
|
91
|
-
updateConfig({ onboarding_acknowledged: false });
|
92
|
-
};
|
93
|
-
|
94
|
-
const isAuthenticated = !!(config?.github?.username && config?.github?.token);
|
95
|
-
|
96
|
-
const handleLogout = useCallback(async () => {
|
97
|
-
if (!config) return;
|
98
|
-
updateAndSaveConfig({
|
99
|
-
github: {
|
100
|
-
...config.github,
|
101
|
-
token: null,
|
102
|
-
username: null,
|
103
|
-
primary_email: null,
|
104
|
-
},
|
105
|
-
});
|
106
|
-
}, [config, updateAndSaveConfig]);
|
107
|
-
|
108
|
-
if (loading) {
|
109
|
-
return (
|
110
|
-
<div className="container mx-auto px-4 py-8">
|
111
|
-
<div className="flex items-center justify-center">
|
112
|
-
<Loader2 className="h-8 w-8 animate-spin" />
|
113
|
-
<span className="ml-2">Loading settings...</span>
|
114
|
-
</div>
|
115
|
-
</div>
|
116
|
-
);
|
117
|
-
}
|
118
|
-
|
119
|
-
if (!config) {
|
120
|
-
return (
|
121
|
-
<div className="container mx-auto px-4 py-8">
|
122
|
-
<Alert variant="destructive">
|
123
|
-
<AlertDescription>Failed to load settings. {error}</AlertDescription>
|
124
|
-
</Alert>
|
125
|
-
</div>
|
126
|
-
);
|
127
|
-
}
|
128
|
-
|
129
|
-
return (
|
130
|
-
<div className="container mx-auto px-4 py-8 max-w-4xl">
|
131
|
-
<div className="space-y-6">
|
132
|
-
<div>
|
133
|
-
<h1 className="text-3xl font-bold">Settings</h1>
|
134
|
-
<p className="text-muted-foreground">
|
135
|
-
Configure your preferences and application settings.
|
136
|
-
</p>
|
137
|
-
</div>
|
138
|
-
|
139
|
-
{error && (
|
140
|
-
<Alert variant="destructive">
|
141
|
-
<AlertDescription>{error}</AlertDescription>
|
142
|
-
</Alert>
|
143
|
-
)}
|
144
|
-
|
145
|
-
{success && (
|
146
|
-
<Alert className="border-green-200 bg-green-50 text-green-800 dark:border-green-800 dark:bg-green-950 dark:text-green-200">
|
147
|
-
<AlertDescription className="font-medium">
|
148
|
-
✓ Settings saved successfully!
|
149
|
-
</AlertDescription>
|
150
|
-
</Alert>
|
151
|
-
)}
|
152
|
-
|
153
|
-
<div className="grid gap-6">
|
154
|
-
<Card>
|
155
|
-
<CardHeader>
|
156
|
-
<CardTitle>Appearance</CardTitle>
|
157
|
-
<CardDescription>
|
158
|
-
Customize how the application looks and feels.
|
159
|
-
</CardDescription>
|
160
|
-
</CardHeader>
|
161
|
-
<CardContent className="space-y-4">
|
162
|
-
<div className="space-y-2">
|
163
|
-
<Label htmlFor="theme">Theme</Label>
|
164
|
-
<Select
|
165
|
-
value={config.theme}
|
166
|
-
onValueChange={(value: ThemeMode) => {
|
167
|
-
updateConfig({ theme: value });
|
168
|
-
setTheme(value);
|
169
|
-
}}
|
170
|
-
>
|
171
|
-
<SelectTrigger id="theme">
|
172
|
-
<SelectValue placeholder="Select theme" />
|
173
|
-
</SelectTrigger>
|
174
|
-
<SelectContent>
|
175
|
-
<SelectItem value="light">Light</SelectItem>
|
176
|
-
<SelectItem value="dark">Dark</SelectItem>
|
177
|
-
<SelectItem value="system">System</SelectItem>
|
178
|
-
<SelectItem value="purple">Purple</SelectItem>
|
179
|
-
<SelectItem value="green">Green</SelectItem>
|
180
|
-
<SelectItem value="blue">Blue</SelectItem>
|
181
|
-
<SelectItem value="orange">Orange</SelectItem>
|
182
|
-
<SelectItem value="red">Red</SelectItem>
|
183
|
-
</SelectContent>
|
184
|
-
</Select>
|
185
|
-
<p className="text-sm text-muted-foreground">
|
186
|
-
Choose your preferred color scheme.
|
187
|
-
</p>
|
188
|
-
</div>
|
189
|
-
</CardContent>
|
190
|
-
</Card>
|
191
|
-
|
192
|
-
<Card>
|
193
|
-
<CardHeader>
|
194
|
-
<CardTitle>Task Execution</CardTitle>
|
195
|
-
<CardDescription>
|
196
|
-
Configure how tasks are executed and processed.
|
197
|
-
</CardDescription>
|
198
|
-
</CardHeader>
|
199
|
-
<CardContent className="space-y-4">
|
200
|
-
<div className="space-y-2">
|
201
|
-
<Label htmlFor="executor">Default Executor</Label>
|
202
|
-
<Select
|
203
|
-
value={config.executor.type}
|
204
|
-
onValueChange={(value: 'echo' | 'claude' | 'amp') =>
|
205
|
-
updateConfig({ executor: { type: value } })
|
206
|
-
}
|
207
|
-
>
|
208
|
-
<SelectTrigger id="executor">
|
209
|
-
<SelectValue placeholder="Select executor" />
|
210
|
-
</SelectTrigger>
|
211
|
-
<SelectContent>
|
212
|
-
{EXECUTOR_TYPES.map((type) => (
|
213
|
-
<SelectItem key={type} value={type}>
|
214
|
-
{EXECUTOR_LABELS[type]}
|
215
|
-
</SelectItem>
|
216
|
-
))}
|
217
|
-
</SelectContent>
|
218
|
-
</Select>
|
219
|
-
<p className="text-sm text-muted-foreground">
|
220
|
-
Choose the default executor for running tasks.
|
221
|
-
</p>
|
222
|
-
</div>
|
223
|
-
</CardContent>
|
224
|
-
</Card>
|
225
|
-
|
226
|
-
<Card>
|
227
|
-
<CardHeader>
|
228
|
-
<CardTitle>Editor</CardTitle>
|
229
|
-
<CardDescription>
|
230
|
-
Configure which editor to open when viewing task attempts.
|
231
|
-
</CardDescription>
|
232
|
-
</CardHeader>
|
233
|
-
<CardContent className="space-y-4">
|
234
|
-
<div className="space-y-2">
|
235
|
-
<Label htmlFor="editor">Preferred Editor</Label>
|
236
|
-
<Select
|
237
|
-
value={config.editor.editor_type}
|
238
|
-
onValueChange={(value: EditorType) =>
|
239
|
-
updateConfig({
|
240
|
-
editor: {
|
241
|
-
...config.editor,
|
242
|
-
editor_type: value,
|
243
|
-
custom_command:
|
244
|
-
value === 'custom'
|
245
|
-
? config.editor.custom_command
|
246
|
-
: null,
|
247
|
-
},
|
248
|
-
})
|
249
|
-
}
|
250
|
-
>
|
251
|
-
<SelectTrigger id="editor">
|
252
|
-
<SelectValue placeholder="Select editor" />
|
253
|
-
</SelectTrigger>
|
254
|
-
<SelectContent>
|
255
|
-
{EDITOR_TYPES.map((type) => (
|
256
|
-
<SelectItem key={type} value={type}>
|
257
|
-
{EDITOR_LABELS[type]}
|
258
|
-
</SelectItem>
|
259
|
-
))}
|
260
|
-
</SelectContent>
|
261
|
-
</Select>
|
262
|
-
<p className="text-sm text-muted-foreground">
|
263
|
-
Choose your preferred code editor for opening task attempts.
|
264
|
-
</p>
|
265
|
-
</div>
|
266
|
-
|
267
|
-
{config.editor.editor_type === 'custom' && (
|
268
|
-
<div className="space-y-2">
|
269
|
-
<Label htmlFor="custom-command">Custom Command</Label>
|
270
|
-
<Input
|
271
|
-
id="custom-command"
|
272
|
-
placeholder="e.g., code, subl, vim"
|
273
|
-
value={config.editor.custom_command || ''}
|
274
|
-
onChange={(e) =>
|
275
|
-
updateConfig({
|
276
|
-
editor: {
|
277
|
-
...config.editor,
|
278
|
-
custom_command: e.target.value || null,
|
279
|
-
},
|
280
|
-
})
|
281
|
-
}
|
282
|
-
/>
|
283
|
-
<p className="text-sm text-muted-foreground">
|
284
|
-
Enter the command to run your custom editor. Use spaces for
|
285
|
-
arguments (e.g., "code --wait").
|
286
|
-
</p>
|
287
|
-
</div>
|
288
|
-
)}
|
289
|
-
</CardContent>
|
290
|
-
</Card>
|
291
|
-
|
292
|
-
<Card>
|
293
|
-
<CardHeader>
|
294
|
-
<CardTitle className="flex items-center gap-2">
|
295
|
-
<Key className="h-5 w-5" />
|
296
|
-
GitHub Integration
|
297
|
-
</CardTitle>
|
298
|
-
<CardDescription>
|
299
|
-
Configure GitHub settings for creating pull requests from task
|
300
|
-
attempts.
|
301
|
-
</CardDescription>
|
302
|
-
</CardHeader>
|
303
|
-
<CardContent className="space-y-4">
|
304
|
-
<div className="space-y-2">
|
305
|
-
<Label htmlFor="github-token">Personal Access Token</Label>
|
306
|
-
<Input
|
307
|
-
id="github-token"
|
308
|
-
type="password"
|
309
|
-
placeholder="ghp_xxxxxxxxxxxxxxxxxxxx"
|
310
|
-
value={config.github.pat || ''}
|
311
|
-
onChange={(e) =>
|
312
|
-
updateConfig({
|
313
|
-
github: {
|
314
|
-
...config.github,
|
315
|
-
pat: e.target.value || null,
|
316
|
-
},
|
317
|
-
})
|
318
|
-
}
|
319
|
-
/>
|
320
|
-
<p className="text-sm text-muted-foreground">
|
321
|
-
GitHub Personal Access Token with 'repo' permissions. Required
|
322
|
-
for creating pull requests.{' '}
|
323
|
-
<a
|
324
|
-
href="https://github.com/settings/tokens"
|
325
|
-
target="_blank"
|
326
|
-
rel="noopener noreferrer"
|
327
|
-
className="text-blue-600 hover:underline"
|
328
|
-
>
|
329
|
-
Create token here
|
330
|
-
</a>
|
331
|
-
</p>
|
332
|
-
</div>
|
333
|
-
{config && isAuthenticated ? (
|
334
|
-
<div className="flex items-center justify-between gap-4">
|
335
|
-
<div>
|
336
|
-
<Label>Signed in as</Label>
|
337
|
-
<div className="text-lg font-mono">
|
338
|
-
{config.github.username}
|
339
|
-
</div>
|
340
|
-
</div>
|
341
|
-
<Button variant="outline" onClick={handleLogout}>
|
342
|
-
Log out
|
343
|
-
</Button>
|
344
|
-
</div>
|
345
|
-
) : (
|
346
|
-
<Button onClick={() => setShowGitHubLogin(true)}>
|
347
|
-
Sign in with GitHub
|
348
|
-
</Button>
|
349
|
-
)}
|
350
|
-
<GitHubLoginDialog
|
351
|
-
open={showGitHubLogin}
|
352
|
-
onOpenChange={setShowGitHubLogin}
|
353
|
-
/>
|
354
|
-
<div className="space-y-2 pt-4">
|
355
|
-
<Label htmlFor="default-pr-base">Default PR Base Branch</Label>
|
356
|
-
<Input
|
357
|
-
id="default-pr-base"
|
358
|
-
placeholder="main"
|
359
|
-
value={config.github.default_pr_base || ''}
|
360
|
-
onChange={(e) =>
|
361
|
-
updateConfig({
|
362
|
-
github: {
|
363
|
-
...config.github,
|
364
|
-
default_pr_base: e.target.value || null,
|
365
|
-
},
|
366
|
-
})
|
367
|
-
}
|
368
|
-
/>
|
369
|
-
<p className="text-sm text-muted-foreground">
|
370
|
-
Default base branch for pull requests. Defaults to 'main' if
|
371
|
-
not specified.
|
372
|
-
</p>
|
373
|
-
</div>
|
374
|
-
</CardContent>
|
375
|
-
</Card>
|
376
|
-
|
377
|
-
<Card>
|
378
|
-
<CardHeader>
|
379
|
-
<CardTitle>Notifications</CardTitle>
|
380
|
-
<CardDescription>
|
381
|
-
Configure how you receive notifications about task completion.
|
382
|
-
</CardDescription>
|
383
|
-
</CardHeader>
|
384
|
-
<CardContent className="space-y-4">
|
385
|
-
<div className="flex items-center space-x-2">
|
386
|
-
<Checkbox
|
387
|
-
id="sound-alerts"
|
388
|
-
checked={config.sound_alerts}
|
389
|
-
onCheckedChange={(checked: boolean) =>
|
390
|
-
updateConfig({ sound_alerts: checked })
|
391
|
-
}
|
392
|
-
/>
|
393
|
-
<div className="space-y-0.5">
|
394
|
-
<Label htmlFor="sound-alerts" className="cursor-pointer">
|
395
|
-
Sound Alerts
|
396
|
-
</Label>
|
397
|
-
<p className="text-sm text-muted-foreground">
|
398
|
-
Play a sound when task attempts finish running.
|
399
|
-
</p>
|
400
|
-
</div>
|
401
|
-
</div>
|
402
|
-
|
403
|
-
{config.sound_alerts && (
|
404
|
-
<div className="space-y-2 ml-6">
|
405
|
-
<Label htmlFor="sound-file">Sound</Label>
|
406
|
-
<div className="flex items-center gap-2">
|
407
|
-
<Select
|
408
|
-
value={config.sound_file}
|
409
|
-
onValueChange={(value: SoundFile) =>
|
410
|
-
updateConfig({ sound_file: value })
|
411
|
-
}
|
412
|
-
>
|
413
|
-
<SelectTrigger id="sound-file" className="flex-1">
|
414
|
-
<SelectValue placeholder="Select sound" />
|
415
|
-
</SelectTrigger>
|
416
|
-
<SelectContent>
|
417
|
-
{SOUND_FILES.map((soundFile) => (
|
418
|
-
<SelectItem key={soundFile} value={soundFile}>
|
419
|
-
{SOUND_LABELS[soundFile]}
|
420
|
-
</SelectItem>
|
421
|
-
))}
|
422
|
-
</SelectContent>
|
423
|
-
</Select>
|
424
|
-
<Button
|
425
|
-
variant="outline"
|
426
|
-
size="sm"
|
427
|
-
onClick={() => playSound(config.sound_file)}
|
428
|
-
className="px-3"
|
429
|
-
>
|
430
|
-
<Volume2 className="h-4 w-4" />
|
431
|
-
</Button>
|
432
|
-
</div>
|
433
|
-
<p className="text-sm text-muted-foreground">
|
434
|
-
Choose the sound to play when tasks complete. Click the
|
435
|
-
volume button to preview.
|
436
|
-
</p>
|
437
|
-
</div>
|
438
|
-
)}
|
439
|
-
<div className="flex items-center space-x-2">
|
440
|
-
<Checkbox
|
441
|
-
id="push-notifications"
|
442
|
-
checked={config.push_notifications}
|
443
|
-
onCheckedChange={(checked: boolean) =>
|
444
|
-
updateConfig({ push_notifications: checked })
|
445
|
-
}
|
446
|
-
/>
|
447
|
-
<div className="space-y-0.5">
|
448
|
-
<Label
|
449
|
-
htmlFor="push-notifications"
|
450
|
-
className="cursor-pointer"
|
451
|
-
>
|
452
|
-
Push Notifications
|
453
|
-
</Label>
|
454
|
-
<p className="text-sm text-muted-foreground">
|
455
|
-
Show system notifications when task attempts finish running.
|
456
|
-
</p>
|
457
|
-
</div>
|
458
|
-
</div>
|
459
|
-
</CardContent>
|
460
|
-
</Card>
|
461
|
-
|
462
|
-
<Card>
|
463
|
-
<CardHeader>
|
464
|
-
<CardTitle>Privacy</CardTitle>
|
465
|
-
<CardDescription>
|
466
|
-
Help improve Automagik-Forge by sharing anonymous usage data.
|
467
|
-
</CardDescription>
|
468
|
-
</CardHeader>
|
469
|
-
<CardContent className="space-y-4">
|
470
|
-
<div className="flex items-center space-x-2">
|
471
|
-
<Checkbox
|
472
|
-
id="analytics-enabled"
|
473
|
-
checked={config.analytics_enabled ?? false}
|
474
|
-
onCheckedChange={(checked: boolean) =>
|
475
|
-
updateConfig({ analytics_enabled: checked })
|
476
|
-
}
|
477
|
-
/>
|
478
|
-
<div className="space-y-0.5">
|
479
|
-
<Label htmlFor="analytics-enabled" className="cursor-pointer">
|
480
|
-
Enable Telemetry
|
481
|
-
</Label>
|
482
|
-
<p className="text-sm text-muted-foreground">
|
483
|
-
Enables anonymous usage events tracking to help improve the
|
484
|
-
application. No prompts or project information are
|
485
|
-
collected.
|
486
|
-
</p>
|
487
|
-
</div>
|
488
|
-
</div>
|
489
|
-
</CardContent>
|
490
|
-
</Card>
|
491
|
-
|
492
|
-
<Card>
|
493
|
-
<CardHeader>
|
494
|
-
<CardTitle>Task Templates</CardTitle>
|
495
|
-
<CardDescription>
|
496
|
-
Manage global task templates that can be used across all
|
497
|
-
projects.
|
498
|
-
</CardDescription>
|
499
|
-
</CardHeader>
|
500
|
-
<CardContent>
|
501
|
-
<TaskTemplateManager isGlobal={true} />
|
502
|
-
</CardContent>
|
503
|
-
</Card>
|
504
|
-
|
505
|
-
<Card>
|
506
|
-
<CardHeader>
|
507
|
-
<CardTitle>Safety & Disclaimers</CardTitle>
|
508
|
-
<CardDescription>
|
509
|
-
Manage safety warnings and acknowledgments.
|
510
|
-
</CardDescription>
|
511
|
-
</CardHeader>
|
512
|
-
<CardContent className="space-y-6">
|
513
|
-
<div className="space-y-2">
|
514
|
-
<div className="flex items-center justify-between">
|
515
|
-
<div>
|
516
|
-
<Label>Disclaimer Status</Label>
|
517
|
-
<p className="text-sm text-muted-foreground">
|
518
|
-
{config.disclaimer_acknowledged
|
519
|
-
? 'You have acknowledged the safety disclaimer.'
|
520
|
-
: 'The safety disclaimer has not been acknowledged.'}
|
521
|
-
</p>
|
522
|
-
</div>
|
523
|
-
<Button
|
524
|
-
onClick={resetDisclaimer}
|
525
|
-
variant="outline"
|
526
|
-
size="sm"
|
527
|
-
disabled={!config.disclaimer_acknowledged}
|
528
|
-
>
|
529
|
-
Reset Disclaimer
|
530
|
-
</Button>
|
531
|
-
</div>
|
532
|
-
<p className="text-xs text-muted-foreground">
|
533
|
-
Resetting the disclaimer will require you to acknowledge the
|
534
|
-
safety warning again.
|
535
|
-
</p>
|
536
|
-
</div>
|
537
|
-
<div className="space-y-2">
|
538
|
-
<div className="flex items-center justify-between">
|
539
|
-
<div>
|
540
|
-
<Label>Onboarding Status</Label>
|
541
|
-
<p className="text-sm text-muted-foreground">
|
542
|
-
{config.onboarding_acknowledged
|
543
|
-
? 'You have completed the onboarding process.'
|
544
|
-
: 'The onboarding process has not been completed.'}
|
545
|
-
</p>
|
546
|
-
</div>
|
547
|
-
<Button
|
548
|
-
onClick={resetOnboarding}
|
549
|
-
variant="outline"
|
550
|
-
size="sm"
|
551
|
-
disabled={!config.onboarding_acknowledged}
|
552
|
-
>
|
553
|
-
Reset Onboarding
|
554
|
-
</Button>
|
555
|
-
</div>
|
556
|
-
<p className="text-xs text-muted-foreground">
|
557
|
-
Resetting the onboarding will show the setup screen again.
|
558
|
-
</p>
|
559
|
-
</div>
|
560
|
-
<div className="space-y-2">
|
561
|
-
<div className="flex items-center justify-between">
|
562
|
-
<div>
|
563
|
-
<Label>Telemetry Acknowledgment</Label>
|
564
|
-
<p className="text-sm text-muted-foreground">
|
565
|
-
{config.telemetry_acknowledged
|
566
|
-
? 'You have acknowledged the telemetry notice.'
|
567
|
-
: 'The telemetry notice has not been acknowledged.'}
|
568
|
-
</p>
|
569
|
-
</div>
|
570
|
-
<Button
|
571
|
-
onClick={() =>
|
572
|
-
updateConfig({ telemetry_acknowledged: false })
|
573
|
-
}
|
574
|
-
variant="outline"
|
575
|
-
size="sm"
|
576
|
-
disabled={!config.telemetry_acknowledged}
|
577
|
-
>
|
578
|
-
Reset Acknowledgment
|
579
|
-
</Button>
|
580
|
-
</div>
|
581
|
-
<p className="text-xs text-muted-foreground">
|
582
|
-
Resetting the acknowledgment will require you to acknowledge
|
583
|
-
the telemetry notice again.
|
584
|
-
</p>
|
585
|
-
</div>
|
586
|
-
</CardContent>
|
587
|
-
</Card>
|
588
|
-
</div>
|
589
|
-
|
590
|
-
{/* Sticky save button */}
|
591
|
-
<div className="fixed bottom-0 left-0 right-0 bg-background/80 backdrop-blur-sm border-t p-4 z-10">
|
592
|
-
<div className="container mx-auto max-w-4xl flex justify-end">
|
593
|
-
<Button
|
594
|
-
onClick={handleSave}
|
595
|
-
disabled={saving || success}
|
596
|
-
className={success ? 'bg-green-600 hover:bg-green-700' : ''}
|
597
|
-
>
|
598
|
-
{saving && <Loader2 className="mr-2 h-4 w-4 animate-spin" />}
|
599
|
-
{success && <span className="mr-2">✓</span>}
|
600
|
-
{success ? 'Settings Saved!' : 'Save Settings'}
|
601
|
-
</Button>
|
602
|
-
</div>
|
603
|
-
</div>
|
604
|
-
|
605
|
-
{/* Spacer to prevent content from being hidden behind sticky button */}
|
606
|
-
<div className="h-20"></div>
|
607
|
-
</div>
|
608
|
-
</div>
|
609
|
-
);
|
610
|
-
}
|