From fe9b26c49e2ec29e55bfe347ca3c31b8d17dd482 Mon Sep 17 00:00:00 2001 From: Cody Seibert Date: Fri, 12 Dec 2025 19:41:52 -0500 Subject: [PATCH] feat: add delete session functionality with confirmation dialog - Introduced a new DeleteSessionDialog component for confirming session deletions. - Integrated the delete session dialog into the SessionManager component, allowing users to delete sessions with a confirmation prompt. - Updated the UI to handle session deletion more intuitively, enhancing user experience. - Refactored existing delete confirmation logic to utilize the new DeleteConfirmDialog component for consistency across the application. --- .../src/components/delete-session-dialog.tsx | 52 +++++ apps/app/src/components/session-manager.tsx | 58 ++++-- .../components/ui/delete-confirm-dialog.tsx | 88 +++++++++ apps/app/src/components/views/kanban-card.tsx | 44 +---- .../components/delete-project-dialog.tsx | 66 ++----- apps/app/src/store/app-store.ts | 16 +- .../msg_1765523524581_xhk6u45v2.json | 38 ---- .../msg_1765525491205_xeuqv7i9v.json | 14 -- apps/server/data/sessions-metadata.json | 18 -- apps/server/src/services/auto-mode-service.ts | 47 ++++- package-lock.json | 182 ++---------------- 11 files changed, 289 insertions(+), 334 deletions(-) create mode 100644 apps/app/src/components/delete-session-dialog.tsx create mode 100644 apps/app/src/components/ui/delete-confirm-dialog.tsx delete mode 100644 apps/server/data/agent-sessions/msg_1765523524581_xhk6u45v2.json delete mode 100644 apps/server/data/agent-sessions/msg_1765525491205_xeuqv7i9v.json delete mode 100644 apps/server/data/sessions-metadata.json diff --git a/apps/app/src/components/delete-session-dialog.tsx b/apps/app/src/components/delete-session-dialog.tsx new file mode 100644 index 00000000..e40cbed8 --- /dev/null +++ b/apps/app/src/components/delete-session-dialog.tsx @@ -0,0 +1,52 @@ +import { MessageSquare } from "lucide-react"; +import { DeleteConfirmDialog } from "@/components/ui/delete-confirm-dialog"; +import type { SessionListItem } from "@/types/electron"; + +interface DeleteSessionDialogProps { + open: boolean; + onOpenChange: (open: boolean) => void; + session: SessionListItem | null; + onConfirm: (sessionId: string) => void; +} + +export function DeleteSessionDialog({ + open, + onOpenChange, + session, + onConfirm, +}: DeleteSessionDialogProps) { + const handleConfirm = () => { + if (session) { + onConfirm(session.id); + } + }; + + return ( + + {session && ( +
+
+ +
+
+

+ {session.name} +

+

+ {session.messageCount} messages +

+
+
+ )} +
+ ); +} diff --git a/apps/app/src/components/session-manager.tsx b/apps/app/src/components/session-manager.tsx index f566a0fb..d8a86b3d 100644 --- a/apps/app/src/components/session-manager.tsx +++ b/apps/app/src/components/session-manager.tsx @@ -26,6 +26,7 @@ import { cn } from "@/lib/utils"; import type { SessionListItem } from "@/types/electron"; import { useKeyboardShortcutsConfig } from "@/hooks/use-keyboard-shortcuts"; import { getElectronAPI } from "@/lib/electron"; +import { DeleteSessionDialog } from "@/components/delete-session-dialog"; // Random session name generator const adjectives = [ @@ -113,6 +114,8 @@ export function SessionManager({ const [runningSessions, setRunningSessions] = useState>( new Set() ); + const [isDeleteDialogOpen, setIsDeleteDialogOpen] = useState(false); + const [sessionToDelete, setSessionToDelete] = useState(null); // Check running state for all sessions const checkRunningSessions = async (sessionList: SessionListItem[]) => { @@ -286,11 +289,16 @@ export function SessionManager({ } }; - // Delete session - const handleDeleteSession = async (sessionId: string) => { + // Open delete session dialog + const handleDeleteSession = (session: SessionListItem) => { + setSessionToDelete(session); + setIsDeleteDialogOpen(true); + }; + + // Confirm delete session + const confirmDeleteSession = async (sessionId: string) => { const api = getElectronAPI(); if (!api?.sessions) return; - if (!confirm("Are you sure you want to delete this session?")) return; const result = await api.sessions.delete(sessionId); if (result.success) { @@ -303,6 +311,7 @@ export function SessionManager({ } } } + setSessionToDelete(null); }; const activeSessions = sessions.filter((s) => !s.isArchived); @@ -315,20 +324,24 @@ export function SessionManager({
Agent Sessions - {activeTab === "active" && ( - - - New - - )} + { + // Switch to active tab if on archived tab + if (activeTab === "archived") { + setActiveTab("active"); + } + handleQuickCreateSession(); + }} + hotkey={shortcuts.newSession} + hotkeyActive={false} + data-testid="new-session-button" + title={`New Session (${shortcuts.newSession})`} + > + + New +
handleDeleteSession(session.id)} + onClick={() => handleDeleteSession(session)} className="h-7 w-7 p-0 text-destructive" + data-testid={`delete-session-${session.id}`} > @@ -552,6 +566,14 @@ export function SessionManager({ )} + + {/* Delete Session Confirmation Dialog */} + ); } diff --git a/apps/app/src/components/ui/delete-confirm-dialog.tsx b/apps/app/src/components/ui/delete-confirm-dialog.tsx new file mode 100644 index 00000000..ebfa9038 --- /dev/null +++ b/apps/app/src/components/ui/delete-confirm-dialog.tsx @@ -0,0 +1,88 @@ +import { Trash2 } from "lucide-react"; +import { + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, +} from "@/components/ui/dialog"; +import { Button } from "@/components/ui/button"; +import { HotkeyButton } from "@/components/ui/hotkey-button"; +import type { ReactNode } from "react"; + +interface DeleteConfirmDialogProps { + open: boolean; + onOpenChange: (open: boolean) => void; + onConfirm: () => void; + title: string; + description: string; + /** Optional content to show between description and buttons (e.g., item preview card) */ + children?: ReactNode; + /** Text for the confirm button. Defaults to "Delete" */ + confirmText?: string; + /** Test ID for the dialog */ + testId?: string; + /** Test ID for the confirm button */ + confirmTestId?: string; +} + +export function DeleteConfirmDialog({ + open, + onOpenChange, + onConfirm, + title, + description, + children, + confirmText = "Delete", + testId = "delete-confirm-dialog", + confirmTestId = "confirm-delete-button", +}: DeleteConfirmDialogProps) { + const handleConfirm = () => { + onConfirm(); + onOpenChange(false); + }; + + return ( + + + + + + {title} + + + {description} + + + + {children} + + + + + + {confirmText} + + + + + ); +} diff --git a/apps/app/src/components/views/kanban-card.tsx b/apps/app/src/components/views/kanban-card.tsx index 41a35729..a0e06ad1 100644 --- a/apps/app/src/components/views/kanban-card.tsx +++ b/apps/app/src/components/views/kanban-card.tsx @@ -21,6 +21,7 @@ import { DialogHeader, DialogTitle, } from "@/components/ui/dialog"; +import { DeleteConfirmDialog } from "@/components/ui/delete-confirm-dialog"; import { DropdownMenu, DropdownMenuContent, @@ -195,14 +196,9 @@ export const KanbanCard = memo(function KanbanCard({ }; const handleConfirmDelete = () => { - setIsDeleteDialogOpen(false); onDelete(); }; - const handleCancelDelete = () => { - setIsDeleteDialogOpen(false); - }; - // Dragging logic: // - Backlog items can always be dragged // - skipTests items can be dragged even when in_progress or verified (unless currently running) @@ -805,35 +801,15 @@ export const KanbanCard = memo(function KanbanCard({ {/* Delete Confirmation Dialog */} - - - - Delete Feature - - Are you sure you want to delete this feature? This action cannot - be undone. - - - - - - Delete - - - - + {/* Summary Modal */} diff --git a/apps/app/src/components/views/settings-view/components/delete-project-dialog.tsx b/apps/app/src/components/views/settings-view/components/delete-project-dialog.tsx index c60ce76f..e257d695 100644 --- a/apps/app/src/components/views/settings-view/components/delete-project-dialog.tsx +++ b/apps/app/src/components/views/settings-view/components/delete-project-dialog.tsx @@ -1,13 +1,5 @@ -import { Trash2, Folder } from "lucide-react"; -import { - Dialog, - DialogContent, - DialogDescription, - DialogFooter, - DialogHeader, - DialogTitle, -} from "@/components/ui/dialog"; -import { Button } from "@/components/ui/button"; +import { Folder, Trash2 } from "lucide-react"; +import { DeleteConfirmDialog } from "@/components/ui/delete-confirm-dialog"; import type { Project } from "@/lib/electron"; interface DeleteProjectDialogProps { @@ -26,24 +18,22 @@ export function DeleteProjectDialog({ const handleConfirm = () => { if (project) { onConfirm(project.id); - onOpenChange(false); } }; return ( - - - - - - Delete Project - - - Are you sure you want to move this project to Trash? - - - - {project && ( + + {project && ( + <>
@@ -57,27 +47,13 @@ export function DeleteProjectDialog({

- )} -

- The folder will remain on disk until you permanently delete it from - Trash. -

- - - - - -
-
+

+ The folder will remain on disk until you permanently delete it from + Trash. +

+ + )} +
); } diff --git a/apps/app/src/store/app-store.ts b/apps/app/src/store/app-store.ts index 81d50617..8b83e7e5 100644 --- a/apps/app/src/store/app-store.ts +++ b/apps/app/src/store/app-store.ts @@ -147,7 +147,7 @@ export const DEFAULT_KEYBOARD_SHORTCUTS: KeyboardShortcuts = { // Note: Some shortcuts share the same key (e.g., "N" for addFeature, newSession, addProfile) // This is intentional as they are context-specific and only active in their respective views addFeature: "N", // Only active in board view - addContextFile: "F", // Only active in context view + addContextFile: "N", // Only active in context view startNext: "G", // Only active in board view newSession: "N", // Only active in agent view openProject: "O", // Global shortcut @@ -1136,6 +1136,20 @@ export const useAppStore = create()( }), { name: "automaker-storage", + version: 1, // Increment when making breaking changes to persisted state + migrate: (persistedState: unknown, version: number) => { + const state = persistedState as Partial; + + // Migration from version 0 (no version) to version 1: + // - Change addContextFile shortcut from "F" to "N" + if (version === 0) { + if (state.keyboardShortcuts?.addContextFile === "F") { + state.keyboardShortcuts.addContextFile = "N"; + } + } + + return state as AppState; + }, partialize: (state) => ({ // Project management projects: state.projects, diff --git a/apps/server/data/agent-sessions/msg_1765523524581_xhk6u45v2.json b/apps/server/data/agent-sessions/msg_1765523524581_xhk6u45v2.json deleted file mode 100644 index ed50f4be..00000000 --- a/apps/server/data/agent-sessions/msg_1765523524581_xhk6u45v2.json +++ /dev/null @@ -1,38 +0,0 @@ -[ - { - "id": "msg_1765523527444_d8xyk8rh9", - "role": "user", - "content": "this is a test", - "timestamp": "2025-12-12T07:12:07.444Z" - }, - { - "id": "msg_1765523534075_351i0rcft", - "role": "assistant", - "content": "Hello! This is a test response. I'm working correctly and ready to help you with your software development projects.\n\nIs there something specific you'd like to work on today? I can help you with:\n\n- **Planning a new project** - Define requirements, architecture, and technical approach\n- **Writing code** - Create new files, implement features, or build components\n- **Editing existing code** - Modify, refactor, or fix bugs in your codebase\n- **Running commands** - Execute tests, builds, or other terminal commands\n- **Exploring your codebase** - Search for patterns, understand existing code structure\n\nJust let me know what you need!", - "timestamp": "2025-12-12T07:12:14.075Z" - }, - { - "id": "msg_1765524006202_3d2cuya6b", - "role": "user", - "content": "test", - "timestamp": "2025-12-12T07:20:06.202Z" - }, - { - "id": "msg_1765524011389_sdfbuai3k", - "role": "assistant", - "content": "Hello! I'm here to help you build software. How can I assist you today?\n\nI can help you with:\n\n- **Planning** - Define requirements, discuss architecture, and design your project\n- **Coding** - Write, edit, and modify code files\n- **Debugging** - Analyze issues and fix bugs\n- **Testing** - Run tests and verify functionality\n- **Exploring** - Search and understand existing codebases\n\nWhat would you like to work on?", - "timestamp": "2025-12-12T07:20:11.389Z" - }, - { - "id": "msg_1765524491273_7ocghnbb5", - "role": "user", - "content": "test", - "timestamp": "2025-12-12T07:28:11.273Z" - }, - { - "id": "msg_1765524498237_x8b4148gc", - "role": "assistant", - "content": "Hello! I'm here to help you build software. How can I assist you today?\n\nI can help you with:\n- **Planning** - Define requirements, architecture, and technical approaches\n- **Coding** - Write, edit, and modify code files\n- **Debugging** - Find and fix issues in your codebase\n- **Testing** - Run tests and help improve test coverage\n- **Exploring** - Search and analyze your existing codebase\n\nWhat would you like to work on?", - "timestamp": "2025-12-12T07:28:18.237Z" - } -] \ No newline at end of file diff --git a/apps/server/data/agent-sessions/msg_1765525491205_xeuqv7i9v.json b/apps/server/data/agent-sessions/msg_1765525491205_xeuqv7i9v.json deleted file mode 100644 index 19d19935..00000000 --- a/apps/server/data/agent-sessions/msg_1765525491205_xeuqv7i9v.json +++ /dev/null @@ -1,14 +0,0 @@ -[ - { - "id": "msg_1765525503241_ewyx52vkc", - "role": "user", - "content": "what are some features you think would be great to add into this automaker project we are missing", - "timestamp": "2025-12-12T07:45:03.241Z" - }, - { - "id": "msg_1765525507772_ptlosigyu", - "role": "assistant", - "content": "Now I have a comprehensive understanding of the Automaker project! This is an impressive AI-powered development studio with a Kanban board, multi-model agent support, and autonomous feature development. Let me provide you with some great feature ideas that would enhance this project:\n\n---\n\n## ๐Ÿš€ Feature Suggestions for Automaker\n\nBased on my analysis of your codebase, here are some features that would be valuable additions:\n\n### 1. **๐Ÿ“Š Analytics Dashboard**\n- **What**: A view showing metrics like features completed over time, agent success rates, time-to-completion per feature, cost tracking per model used, etc.\n- **Why**: Helps users understand productivity gains and optimize their AI model selections\n\n### 2. **๐Ÿ”„ Feature Dependencies/Linking**\n- **What**: Allow features to have dependencies on other features (e.g., \"Feature B can only start after Feature A is verified\")\n- **Why**: Complex projects often have dependent features; this enables better planning and automatic sequencing\n\n### 3. **๐Ÿ“ Code Review View**\n- **What**: A dedicated view showing all changes made by agents with inline diff annotations, approval/rejection buttons, and the ability to cherry-pick specific changes\n- **Why**: Currently you have `git-diff-panel.tsx` but a full code review experience would improve verification workflows\n\n### 4. **๐Ÿ—‚๏ธ Feature Templates**\n- **What**: Pre-defined feature templates (e.g., \"Add REST endpoint\", \"Create React component\", \"Add database migration\") with common steps already filled in\n- **Why**: Reduces repetitive work and standardizes feature definitions\n\n### 5. **๐Ÿ’ฌ Agent Chat per Feature**\n- **What**: Attach a chat/conversation thread to each feature card for discussing implementation details, asking clarifying questions, or giving additional context mid-execution\n- **Why**: Enables more interactive feature development rather than one-shot execution\n\n### 6. **๐Ÿ“… Sprint/Milestone Management**\n- **What**: Group features into sprints or milestones with deadlines, progress tracking, and burndown charts\n- **Why**: Brings more project management capabilities for teams or long-term projects\n\n### 7. **๐Ÿ”” Notification System**\n- **What**: Desktop notifications when agents complete, fail, or need approval + optional integrations (Slack, Discord, email)\n- **Why**: Users can context-switch while agents work and get notified of important events\n\n### 8. **๐Ÿงช Test Runner Integration**\n- **What**: Built-in test runner view that shows test results, coverage reports, and allows re-running specific tests\n- **Why**: Currently tests are run by agents but a dedicated UI would improve the TDD workflow\n\n### 9. **๐Ÿ“ธ Screenshot/Recording Capture**\n- **What**: Ability to capture screenshots or record short videos of the running app and attach them to features\n- **Why**: Great for bug reports, visual features, and documentation\n\n### 10. **๐ŸŽฏ Smart Feature Estimation**\n- **What**: AI-powered complexity/effort estimation for features based on codebase analysis and historical data\n- **Why**: Helps with planning and setting realistic expectations\n\n### 11. **๐Ÿ” Codebase Search**\n- **What**: A dedicated search view with semantic search capabilities (find code by describing what it does, not just keywords)\n- **Why**: Helps users navigate large codebases and find relevant code faster\n\n### 12. **๐Ÿ“‹ Clipboard/Snippet Manager**\n- **What**: Quick-access panel for frequently used code snippets, prompts, or context that can be dragged into features\n- **Why**: Speeds up feature creation with reusable components\n\n### 13. **๐Ÿ”€ Branch Visualization**\n- **What**: Visual git graph showing feature branches, their status, and relationship to main branch\n- **Why**: With worktree support, visualizing the git state becomes more important\n\n### 14. **๐Ÿ“œ Activity Feed/Timeline**\n- **What**: A timeline view showing all activity across the project (features started, completed, commits made, errors occurred)\n- **Why**: Provides at-a-glance project activity overview\n\n### 15. **๐Ÿค– Agent Collaboration Mode**\n- **What**: Allow multiple agents to work on related features simultaneously with awareness of each other's changes\n- **Why**: Your concurrent agent support could be enhanced with coordination\n\n### 16. **๐Ÿ“š Documentation Generator**\n- **What**: Auto-generate README, API docs, or component documentation from the codebase and features\n- **Why**: Keep documentation in sync with code automatically\n\n### 17. **๐Ÿ” Secrets/Environment Management**\n- **What**: Secure storage and management for API keys, environment variables per project\n- **Why**: Currently using `.env` files; a more robust secrets manager would be valuable\n\n### 18. **๐ŸŽจ Custom Agent Prompts/Instructions**\n- **What**: Project-specific or feature-specific custom instructions that modify agent behavior (coding style, preferred libraries, etc.)\n- **Why**: The context system exists but a more structured \"agent instructions\" feature would be cleaner\n\n### 19. **โฐ Scheduled/Automated Runs**\n- **What**: Schedule features to run at specific times or trigger runs based on git events (like new commits to main)\n- **Why**: Enables CI/CD-like automation\n\n### 20. **๐ŸŒ Remote Project Support**\n- **What**: Work on projects hosted on remote servers via SSH, not just local filesystem\n- **Why**: Expands use cases to cloud development environments\n\n---\n\n## My Top 5 Recommendations (Highest Impact)\n\n1. **Feature Dependencies** - Critical for real-world project planning\n2. **Analytics Dashboard** - Great for demonstrating ROI and optimizing workflows \n3. **Notification System** - Quality-of-life improvement for async workflows\n4. **Feature Templates** - Reduces friction in feature creation significantly\n5. **Code Review View** - Improves the verification/approval workflow which is core to the app\n\nWould you like me to elaborate on any of these, or help plan/implement one of them?", - "timestamp": "2025-12-12T07:45:07.772Z" - } -] \ No newline at end of file diff --git a/apps/server/data/sessions-metadata.json b/apps/server/data/sessions-metadata.json deleted file mode 100644 index 28993ad1..00000000 --- a/apps/server/data/sessions-metadata.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "msg_1765523524581_xhk6u45v2": { - "id": "msg_1765523524581_xhk6u45v2", - "name": "Bright Agent 2", - "projectPath": "/Users/webdevcody/Workspace/automaker", - "workingDirectory": "/Users/webdevcody/Workspace/automaker", - "createdAt": "2025-12-12T07:12:04.582Z", - "updatedAt": "2025-12-12T07:28:18.571Z" - }, - "msg_1765525491205_xeuqv7i9v": { - "id": "msg_1765525491205_xeuqv7i9v", - "name": "Optimal Helper 52", - "projectPath": "/Users/webdevcody/Workspace/automaker", - "workingDirectory": "/Users/webdevcody/Workspace/automaker", - "createdAt": "2025-12-12T07:44:51.205Z", - "updatedAt": "2025-12-12T07:46:03.339Z" - } -} \ No newline at end of file diff --git a/apps/server/src/services/auto-mode-service.ts b/apps/server/src/services/auto-mode-service.ts index 8015de91..37af90c9 100644 --- a/apps/server/src/services/auto-mode-service.ts +++ b/apps/server/src/services/auto-mode-service.ts @@ -313,6 +313,46 @@ export class AutoModeService { // No worktree, use project path } + // Load feature info for context + const feature = await this.loadFeature(projectPath, featureId); + + // Load previous agent output if it exists + const contextPath = path.join( + projectPath, + ".automaker", + "features", + featureId, + "agent-output.md" + ); + let previousContext = ""; + try { + previousContext = await fs.readFile(contextPath, "utf-8"); + } catch { + // No previous context + } + + // Build complete prompt with feature info, previous context, and follow-up instructions + let fullPrompt = `## Follow-up on Feature Implementation + +${feature ? this.buildFeaturePrompt(feature) : `**Feature ID:** ${featureId}`} +`; + + if (previousContext) { + fullPrompt += ` +## Previous Agent Work +The following is the output from the previous implementation attempt: + +${previousContext} +`; + } + + fullPrompt += ` +## Follow-up Instructions +${prompt} + +## Task +Address the follow-up instructions above. Review the previous work and make the requested changes or fixes.`; + this.runningFeatures.set(featureId, { featureId, projectPath, @@ -326,11 +366,14 @@ export class AutoModeService { this.emitAutoModeEvent("auto_mode_feature_start", { featureId, projectPath, - feature: { id: featureId, title: "Follow-up", description: prompt.substring(0, 100) }, + feature: feature || { id: featureId, title: "Follow-up", description: prompt.substring(0, 100) }, }); try { - await this.runAgent(workDir, featureId, prompt, abortController, imagePaths); + await this.runAgent(workDir, featureId, fullPrompt, abortController, imagePaths); + + // Mark as waiting_approval for user review + await this.updateFeatureStatus(projectPath, featureId, "waiting_approval"); this.emitAutoModeEvent("auto_mode_feature_complete", { featureId, diff --git a/package-lock.json b/package-lock.json index 53530370..a8c3184c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,11 +17,9 @@ "version": "0.1.0", "license": "Unlicense", "dependencies": { - "@anthropic-ai/claude-agent-sdk": "^0.1.61", "@dnd-kit/core": "^6.3.1", "@dnd-kit/sortable": "^10.0.0", "@dnd-kit/utilities": "^3.2.2", - "@homebridge/node-pty-prebuilt-multiarch": "^0.13.1", "@radix-ui/react-checkbox": "^1.3.3", "@radix-ui/react-dialog": "^1.1.15", "@radix-ui/react-dropdown-menu": "^2.1.16", @@ -1216,22 +1214,6 @@ "@hapi/hoek": "^11.0.2" } }, - "apps/app/node_modules/@homebridge/node-pty-prebuilt-multiarch": { - "version": "0.13.1", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "node-addon-api": "^7.1.0", - "prebuild-install": "^7.1.2" - }, - "engines": { - "node": ">=18.0.0 <25.0.0" - } - }, - "apps/app/node_modules/@homebridge/node-pty-prebuilt-multiarch/node_modules/node-addon-api": { - "version": "7.1.1", - "license": "MIT" - }, "apps/app/node_modules/@humanfs/core": { "version": "0.19.1", "dev": true, @@ -3554,6 +3536,7 @@ }, "apps/app/node_modules/base64-js": { "version": "1.5.1", + "dev": true, "funding": [ { "type": "github", @@ -3580,6 +3563,7 @@ }, "apps/app/node_modules/bl": { "version": "4.1.0", + "dev": true, "license": "MIT", "dependencies": { "buffer": "^5.5.0", @@ -3638,6 +3622,7 @@ }, "apps/app/node_modules/buffer": { "version": "5.7.1", + "dev": true, "funding": [ { "type": "github", @@ -4351,6 +4336,7 @@ }, "apps/app/node_modules/decompress-response": { "version": "6.0.0", + "dev": true, "license": "MIT", "dependencies": { "mimic-response": "^3.1.0" @@ -4364,6 +4350,7 @@ }, "apps/app/node_modules/decompress-response/node_modules/mimic-response": { "version": "3.1.0", + "dev": true, "license": "MIT", "engines": { "node": ">=10" @@ -4785,6 +4772,7 @@ }, "apps/app/node_modules/end-of-stream": { "version": "1.4.5", + "dev": true, "license": "MIT", "dependencies": { "once": "^1.4.0" @@ -5364,13 +5352,6 @@ "node": ">=0.10.0" } }, - "apps/app/node_modules/expand-template": { - "version": "2.0.3", - "license": "(MIT OR WTFPL)", - "engines": { - "node": ">=6" - } - }, "apps/app/node_modules/exponential-backoff": { "version": "3.1.3", "dev": true, @@ -5615,10 +5596,6 @@ "node": ">= 6" } }, - "apps/app/node_modules/fs-constants": { - "version": "1.0.0", - "license": "MIT" - }, "apps/app/node_modules/fs-extra": { "version": "8.1.0", "dev": true, @@ -5748,10 +5725,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "apps/app/node_modules/github-from-package": { - "version": "0.0.0", - "license": "MIT" - }, "apps/app/node_modules/glob": { "version": "7.2.3", "dev": true, @@ -6083,6 +6056,7 @@ }, "apps/app/node_modules/ieee754": { "version": "1.2.1", + "dev": true, "funding": [ { "type": "github", @@ -7730,18 +7704,10 @@ "node": ">=10" } }, - "apps/app/node_modules/mkdirp-classic": { - "version": "0.5.3", - "license": "MIT" - }, "apps/app/node_modules/ms": { "version": "2.1.3", "license": "MIT" }, - "apps/app/node_modules/napi-build-utils": { - "version": "2.0.0", - "license": "MIT" - }, "apps/app/node_modules/napi-postinstall": { "version": "0.3.4", "dev": true, @@ -8358,50 +8324,6 @@ "node": "^12.20.0 || >=14" } }, - "apps/app/node_modules/prebuild-install": { - "version": "7.1.3", - "license": "MIT", - "dependencies": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^2.0.0", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" - }, - "engines": { - "node": ">=10" - } - }, - "apps/app/node_modules/prebuild-install/node_modules/node-abi": { - "version": "3.85.0", - "license": "MIT", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, - "apps/app/node_modules/prebuild-install/node_modules/semver": { - "version": "7.7.3", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "apps/app/node_modules/prelude-ls": { "version": "1.2.1", "dev": true, @@ -8468,6 +8390,7 @@ }, "apps/app/node_modules/pump": { "version": "3.0.3", + "dev": true, "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", @@ -8610,6 +8533,7 @@ }, "apps/app/node_modules/readable-stream": { "version": "3.6.2", + "dev": true, "license": "MIT", "dependencies": { "inherits": "^2.0.3", @@ -8991,47 +8915,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "apps/app/node_modules/simple-concat": { - "version": "1.0.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "apps/app/node_modules/simple-get": { - "version": "4.0.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, "apps/app/node_modules/simple-update-notifier": { "version": "2.0.0", "dev": true, @@ -9188,6 +9071,7 @@ }, "apps/app/node_modules/string_decoder": { "version": "1.3.0", + "dev": true, "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" @@ -9462,34 +9346,6 @@ "node": ">=10" } }, - "apps/app/node_modules/tar-fs": { - "version": "2.1.4", - "license": "MIT", - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "apps/app/node_modules/tar-fs/node_modules/chownr": { - "version": "1.1.4", - "license": "ISC" - }, - "apps/app/node_modules/tar-stream": { - "version": "2.2.0", - "license": "MIT", - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, "apps/app/node_modules/tar/node_modules/minipass": { "version": "5.0.0", "dev": true, @@ -9731,16 +9587,6 @@ "json5": "lib/cli.js" } }, - "apps/app/node_modules/tunnel-agent": { - "version": "0.6.0", - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, "apps/app/node_modules/tw-animate-css": { "version": "1.4.0", "dev": true, @@ -10094,6 +9940,7 @@ }, "apps/app/node_modules/util-deprecate": { "version": "1.0.2", + "dev": true, "license": "MIT" }, "apps/app/node_modules/verror": { @@ -12668,6 +12515,7 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, "license": "MIT", "engines": { "node": ">=4.0.0" @@ -12686,6 +12534,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "devOptional": true, "license": "Apache-2.0", "engines": { "node": ">=8" @@ -13228,6 +13077,7 @@ "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true, "license": "ISC" }, "node_modules/ipaddr.js": { @@ -13573,6 +13423,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -13881,6 +13732,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", "dependencies": { "deep-extend": "^0.6.0", @@ -14010,6 +13862,7 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, "funding": [ { "type": "github", @@ -14407,6 +14260,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0"