gitextract_6kt6d70a/ ├── .agents/ │ └── skills/ │ ├── logging-best-practices/ │ │ └── SKILL.md │ ├── trigger-agents/ │ │ ├── SKILL.md │ │ └── references/ │ │ ├── ai-tool.md │ │ ├── orchestration.md │ │ ├── streaming.md │ │ └── waitpoints.md │ ├── trigger-config/ │ │ ├── SKILL.md │ │ └── references/ │ │ └── config.md │ ├── trigger-cost-savings/ │ │ ├── SKILL.md │ │ └── references/ │ │ └── cost-reduction.md │ ├── trigger-realtime/ │ │ ├── SKILL.md │ │ └── references/ │ │ └── realtime.md │ ├── trigger-setup/ │ │ ├── SKILL.md │ │ └── references/ │ │ ├── environment-setup.md │ │ └── project-structure.md │ ├── trigger-tasks/ │ │ ├── SKILL.md │ │ └── references/ │ │ ├── advanced-tasks.md │ │ ├── basic-tasks.md │ │ └── scheduled-tasks.md │ ├── vercel-composition-patterns/ │ │ ├── AGENTS.md │ │ ├── SKILL.md │ │ └── rules/ │ │ ├── architecture-avoid-boolean-props.md │ │ ├── architecture-compound-components.md │ │ ├── patterns-children-over-render-props.md │ │ ├── patterns-explicit-variants.md │ │ ├── react19-no-forwardref.md │ │ ├── state-context-interface.md │ │ ├── state-decouple-implementation.md │ │ └── state-lift-state.md │ ├── vercel-react-best-practices/ │ │ ├── AGENTS.md │ │ ├── SKILL.md │ │ └── rules/ │ │ ├── advanced-event-handler-refs.md │ │ ├── advanced-init-once.md │ │ ├── advanced-use-latest.md │ │ ├── async-api-routes.md │ │ ├── async-defer-await.md │ │ ├── async-dependencies.md │ │ ├── async-parallel.md │ │ ├── async-suspense-boundaries.md │ │ ├── bundle-barrel-imports.md │ │ ├── bundle-conditional.md │ │ ├── bundle-defer-third-party.md │ │ ├── bundle-dynamic-imports.md │ │ ├── bundle-preload.md │ │ ├── client-event-listeners.md │ │ ├── client-localstorage-schema.md │ │ ├── client-passive-event-listeners.md │ │ ├── client-swr-dedup.md │ │ ├── js-batch-dom-css.md │ │ ├── js-cache-function-results.md │ │ ├── js-cache-property-access.md │ │ ├── js-cache-storage.md │ │ ├── js-combine-iterations.md │ │ ├── js-early-exit.md │ │ ├── js-hoist-regexp.md │ │ ├── js-index-maps.md │ │ ├── js-length-check-first.md │ │ ├── js-min-max-loop.md │ │ ├── js-set-map-lookups.md │ │ ├── js-tosorted-immutable.md │ │ ├── rendering-activity.md │ │ ├── rendering-animate-svg-wrapper.md │ │ ├── rendering-conditional-render.md │ │ ├── rendering-content-visibility.md │ │ ├── rendering-hoist-jsx.md │ │ ├── rendering-hydration-no-flicker.md │ │ ├── rendering-hydration-suppress-warning.md │ │ ├── rendering-svg-precision.md │ │ ├── rendering-usetransition-loading.md │ │ ├── rerender-defer-reads.md │ │ ├── rerender-dependencies.md │ │ ├── rerender-derived-state-no-effect.md │ │ ├── rerender-derived-state.md │ │ ├── rerender-functional-setstate.md │ │ ├── rerender-lazy-state-init.md │ │ ├── rerender-memo-with-default-value.md │ │ ├── rerender-memo.md │ │ ├── rerender-move-effect-to-event.md │ │ ├── rerender-simple-expression-in-memo.md │ │ ├── rerender-transitions.md │ │ ├── rerender-use-ref-transient-values.md │ │ ├── server-after-nonblocking.md │ │ ├── server-auth-actions.md │ │ ├── server-cache-lru.md │ │ ├── server-cache-react.md │ │ ├── server-dedup-props.md │ │ ├── server-parallel-fetching.md │ │ └── server-serialization.md │ └── web-design-guidelines/ │ └── SKILL.md ├── .claude/ │ └── agents/ │ └── trigger-dev-task-writer.md ├── .cursor/ │ └── rules/ │ ├── convex_rules.mdc │ ├── trigger.advanced-tasks.mdc │ ├── trigger.basic.mdc │ ├── trigger.config.mdc │ ├── trigger.realtime.mdc │ └── trigger.scheduled-tasks.mdc ├── .env.e2e.example ├── .env.local.example ├── .github/ │ ├── skills/ │ │ ├── vercel-react-best-practices/ │ │ │ ├── AGENTS.md │ │ │ ├── README.md │ │ │ ├── SKILL.md │ │ │ ├── metadata.json │ │ │ └── rules/ │ │ │ ├── _sections.md │ │ │ ├── _template.md │ │ │ ├── advanced-event-handler-refs.md │ │ │ ├── advanced-use-latest.md │ │ │ ├── async-api-routes.md │ │ │ ├── async-defer-await.md │ │ │ ├── async-dependencies.md │ │ │ ├── async-parallel.md │ │ │ ├── async-suspense-boundaries.md │ │ │ ├── bundle-barrel-imports.md │ │ │ ├── bundle-conditional.md │ │ │ ├── bundle-defer-third-party.md │ │ │ ├── bundle-dynamic-imports.md │ │ │ ├── bundle-preload.md │ │ │ ├── client-event-listeners.md │ │ │ ├── client-swr-dedup.md │ │ │ ├── js-batch-dom-css.md │ │ │ ├── js-cache-function-results.md │ │ │ ├── js-cache-property-access.md │ │ │ ├── js-cache-storage.md │ │ │ ├── js-combine-iterations.md │ │ │ ├── js-early-exit.md │ │ │ ├── js-hoist-regexp.md │ │ │ ├── js-index-maps.md │ │ │ ├── js-length-check-first.md │ │ │ ├── js-min-max-loop.md │ │ │ ├── js-set-map-lookups.md │ │ │ ├── js-tosorted-immutable.md │ │ │ ├── rendering-activity.md │ │ │ ├── rendering-animate-svg-wrapper.md │ │ │ ├── rendering-conditional-render.md │ │ │ ├── rendering-content-visibility.md │ │ │ ├── rendering-hoist-jsx.md │ │ │ ├── rendering-hydration-no-flicker.md │ │ │ ├── rendering-svg-precision.md │ │ │ ├── rerender-defer-reads.md │ │ │ ├── rerender-dependencies.md │ │ │ ├── rerender-derived-state.md │ │ │ ├── rerender-functional-setstate.md │ │ │ ├── rerender-lazy-state-init.md │ │ │ ├── rerender-memo.md │ │ │ ├── rerender-transitions.md │ │ │ ├── server-after-nonblocking.md │ │ │ ├── server-cache-lru.md │ │ │ ├── server-cache-react.md │ │ │ ├── server-parallel-fetching.md │ │ │ └── server-serialization.md │ │ └── web-design-guidelines/ │ │ └── SKILL.md │ └── workflows/ │ ├── desktop-build.yml │ ├── docker-sandbox.yml │ └── test.yml ├── .gitignore ├── .husky/ │ └── pre-commit ├── .prettierignore ├── LICENSE ├── README.md ├── __mocks__/ │ ├── @aws-sdk/ │ │ ├── client-s3.ts │ │ └── s3-request-presigner.ts │ ├── @upstash/ │ │ ├── ratelimit.ts │ │ └── redis.ts │ ├── convex/ │ │ └── browser.ts │ ├── convex-react.ts │ ├── franc-min.ts │ ├── jose.ts │ ├── next/ │ │ └── navigation.ts │ ├── react-hotkeys-hook.ts │ ├── react-markdown.tsx │ ├── react-shiki.tsx │ ├── shiki.ts │ ├── streamdown.tsx │ ├── stripe.ts │ ├── use-stick-to-bottom.ts │ ├── uuid.ts │ ├── workos-authkit.ts │ ├── workos-node.ts │ └── workos.ts ├── app/ │ ├── (chat)/ │ │ ├── c/ │ │ │ └── [id]/ │ │ │ └── page.tsx │ │ ├── layout.tsx │ │ └── page.tsx │ ├── api/ │ │ ├── agent/ │ │ │ └── route.ts │ │ ├── agent-long/ │ │ │ ├── cancel/ │ │ │ │ └── route.ts │ │ │ ├── resume/ │ │ │ │ └── route.ts │ │ │ └── route.ts │ │ ├── auth/ │ │ │ └── desktop-callback/ │ │ │ └── route.ts │ │ ├── chat/ │ │ │ ├── [id]/ │ │ │ │ └── stream/ │ │ │ │ └── route.ts │ │ │ └── route.ts │ │ ├── clear-auth-cookies/ │ │ │ └── route.ts │ │ ├── delete-account/ │ │ │ └── route.ts │ │ ├── delete-sandboxes/ │ │ │ └── route.ts │ │ ├── entitlements/ │ │ │ └── route.ts │ │ ├── extra-usage/ │ │ │ ├── confirm/ │ │ │ │ └── route.ts │ │ │ └── webhook/ │ │ │ └── route.ts │ │ ├── fraud/ │ │ │ └── webhook/ │ │ │ └── route.ts │ │ ├── logout-all/ │ │ │ └── route.ts │ │ ├── mfa/ │ │ │ ├── delete/ │ │ │ │ └── route.ts │ │ │ ├── enroll/ │ │ │ │ └── route.ts │ │ │ ├── factors/ │ │ │ │ └── route.ts │ │ │ └── verify/ │ │ │ └── route.ts │ │ ├── migrate-pentestgpt/ │ │ │ └── route.ts │ │ ├── sandbox/ │ │ │ └── presence/ │ │ │ └── route.ts │ │ ├── stripe.ts │ │ ├── subscribe/ │ │ │ └── route.ts │ │ ├── subscription/ │ │ │ └── webhook/ │ │ │ └── route.ts │ │ ├── subscription-details/ │ │ │ └── route.ts │ │ ├── team/ │ │ │ ├── extra-usage/ │ │ │ │ ├── confirm/ │ │ │ │ │ └── route.ts │ │ │ │ ├── members/ │ │ │ │ │ └── [userId]/ │ │ │ │ │ └── route.ts │ │ │ │ ├── purchase/ │ │ │ │ │ └── route.ts │ │ │ │ ├── route.ts │ │ │ │ └── webhook/ │ │ │ │ └── route.ts │ │ │ ├── invite/ │ │ │ │ └── route.ts │ │ │ ├── members/ │ │ │ │ └── route.ts │ │ │ ├── seats/ │ │ │ │ └── route.ts │ │ │ └── team-auth.ts │ │ └── workos.ts │ ├── auth-error/ │ │ ├── auto-retry-button.tsx │ │ └── page.tsx │ ├── callback/ │ │ └── route.ts │ ├── components/ │ │ ├── AccountTab.tsx │ │ ├── AgentsTab.tsx │ │ ├── AllFilesDialog.tsx │ │ ├── AttachmentButton.tsx │ │ ├── BillingFrequencySelector.tsx │ │ ├── BranchIndicator.tsx │ │ ├── CancelSubscriptionDialog.tsx │ │ ├── ChatHeader.tsx │ │ ├── ChatInput/ │ │ │ ├── AgentUpgradeDialog.tsx │ │ │ ├── ChatInput.tsx │ │ │ ├── ChatInputTextarea.tsx │ │ │ ├── ChatInputToolbar.tsx │ │ │ ├── ChatModeSelector.tsx │ │ │ ├── ModeSelectorMenu/ │ │ │ │ ├── ModeOptionItem.tsx │ │ │ │ ├── ModeSelectorContent.tsx │ │ │ │ ├── ModeSelectorTrigger.tsx │ │ │ │ └── index.ts │ │ │ ├── SubmitStopButton.tsx │ │ │ └── index.ts │ │ ├── ChatItem.tsx │ │ ├── ChatLayout.tsx │ │ ├── CodeHighlight.tsx │ │ ├── ComputerCodeBlock.tsx │ │ ├── ComputerSidebar.tsx │ │ ├── ContextUsageIndicator.tsx │ │ ├── ConvexErrorBoundary.tsx │ │ ├── CustomizeHackerAIDialog.tsx │ │ ├── DataControlsTab.tsx │ │ ├── DataStreamProvider.tsx │ │ ├── DeleteAccountDialog.tsx │ │ ├── DeleteMfaFactorDialog.tsx │ │ ├── DiffView.tsx │ │ ├── DragDropOverlay.tsx │ │ ├── ExtraUsageSection.tsx │ │ ├── FeedbackInput.tsx │ │ ├── FilePartRenderer.tsx │ │ ├── FileUploadPreview.tsx │ │ ├── FinishReasonNotice.tsx │ │ ├── Footer.tsx │ │ ├── HackingSuggestions.tsx │ │ ├── Header.tsx │ │ ├── ImageViewer.tsx │ │ ├── ManageNotesDialog.tsx │ │ ├── ManageSharedChatsDialog.tsx │ │ ├── MarkdownTable.tsx │ │ ├── MemoizedMarkdown.tsx │ │ ├── MessageActions.tsx │ │ ├── MessageEditor.tsx │ │ ├── MessageErrorState.tsx │ │ ├── MessageItem.tsx │ │ ├── MessagePartHandler.tsx │ │ ├── MessageSearchDialog.tsx │ │ ├── Messages.tsx │ │ ├── MfaVerificationDialog.tsx │ │ ├── MigratePentestgptDialog.tsx │ │ ├── ModelSelector/ │ │ │ ├── CostIndicator.tsx │ │ │ ├── __tests__/ │ │ │ │ └── options-drift.test.ts │ │ │ ├── constants.ts │ │ │ └── icons.tsx │ │ ├── ModelSelector.tsx │ │ ├── PersonalizationTab.tsx │ │ ├── PricingDialog.tsx │ │ ├── QueuedMessagesPanel.tsx │ │ ├── RateLimitWarning.tsx │ │ ├── ReasoningHandler.tsx │ │ ├── RemoteControlTab.tsx │ │ ├── SandboxSelector.tsx │ │ ├── ScrollToBottomButton.tsx │ │ ├── SecurityTab.tsx │ │ ├── SettingsDialog.tsx │ │ ├── ShareDialog.tsx │ │ ├── SharedLinksTab.tsx │ │ ├── Sidebar.tsx │ │ ├── SidebarHeader.tsx │ │ ├── SidebarHistory.tsx │ │ ├── SidebarUserNav.tsx │ │ ├── SourcesDialog.tsx │ │ ├── TeamDialogs.tsx │ │ ├── TeamExtraUsageSection.tsx │ │ ├── TeamMembersList.tsx │ │ ├── TeamPricingDialog.tsx │ │ ├── TeamTab.tsx │ │ ├── TerminalCodeBlock.tsx │ │ ├── TodoPanel.tsx │ │ ├── UpgradeConfirmationDialog.tsx │ │ ├── UsageTab.tsx │ │ ├── XtermRenderer.tsx │ │ ├── __mocks__/ │ │ │ └── DataStreamProvider.tsx │ │ ├── __tests__/ │ │ │ ├── ChatInput.integration.test.tsx │ │ │ ├── CodeHighlight.test.tsx │ │ │ ├── ContextUsageIndicator.test.tsx │ │ │ ├── FinishReasonNotice.test.tsx │ │ │ ├── MessageItem.worked-for.test.tsx │ │ │ ├── RemoteControlTab.test.tsx │ │ │ ├── ShareDialog.test.tsx │ │ │ ├── UpgradeConfirmationDialog.test.tsx │ │ │ ├── chat.integration.test.tsx │ │ │ └── worked-for-parts.test.ts │ │ ├── chat.tsx │ │ ├── computer-sidebar-utils.tsx │ │ ├── extra-usage/ │ │ │ ├── AdjustSpendingLimitDialog.tsx │ │ │ ├── AutoReloadDialog.tsx │ │ │ ├── BuyExtraUsageDialog.tsx │ │ │ ├── ExtraUsagePurchaseToast.tsx │ │ │ ├── TurnOffExtraUsageDialog.tsx │ │ │ └── index.ts │ │ ├── testUtils.tsx │ │ ├── tools/ │ │ │ ├── FileHandler.tsx │ │ │ ├── FileToolsHandler.tsx │ │ │ ├── GetTerminalFilesHandler.tsx │ │ │ ├── HttpRequestToolHandler.tsx │ │ │ ├── NotesToolHandler.tsx │ │ │ ├── ProxyToolHandler.tsx │ │ │ ├── SummarizationHandler.tsx │ │ │ ├── TerminalToolHandler.tsx │ │ │ ├── TodoToolHandler.tsx │ │ │ ├── WebToolHandler.tsx │ │ │ ├── __tests__/ │ │ │ │ └── proxy-formatters.test.ts │ │ │ ├── notes-tool-utils.tsx │ │ │ └── shell-tool-utils.ts │ │ ├── usage/ │ │ │ ├── IncludedUsageCard.tsx │ │ │ ├── OnDemandUsageCard.tsx │ │ │ ├── TokenBreakdownTooltip.tsx │ │ │ └── UsageLogsTable.tsx │ │ └── worked-for-parts.ts │ ├── contexts/ │ │ ├── FileUrlCacheContext.tsx │ │ ├── GlobalState.tsx │ │ └── TodoBlockContext.tsx │ ├── desktop-callback/ │ │ └── route.ts │ ├── desktop-login/ │ │ └── route.ts │ ├── download/ │ │ ├── DownloadPageContent.tsx │ │ ├── DownloadSection.tsx │ │ ├── constants.ts │ │ ├── icons/ │ │ │ ├── AndroidIcon.tsx │ │ │ ├── AppleIcon.tsx │ │ │ ├── DeviceIcon.tsx │ │ │ ├── DownloadIcon.tsx │ │ │ ├── LinuxIcon.tsx │ │ │ ├── WindowsIcon.tsx │ │ │ └── index.ts │ │ └── page.tsx │ ├── globals.css │ ├── hooks/ │ │ ├── __tests__/ │ │ │ ├── useAutoContinue.test.ts │ │ │ ├── useFileUpload.local-desktop.test.tsx │ │ │ ├── useImageUrlCache.test.ts │ │ │ └── useToolSidebar.test.tsx │ │ ├── useAutoContinue.ts │ │ ├── useAutoResume.ts │ │ ├── useChatHandlers.ts │ │ ├── useChats.ts │ │ ├── useDocumentDragAndDrop.ts │ │ ├── useFeedback.ts │ │ ├── useFileUpload.ts │ │ ├── useFileUrlCache.ts │ │ ├── useLatestRef.ts │ │ ├── useMessageScroll.ts │ │ ├── usePentestgptMigration.ts │ │ ├── usePricingDialog.ts │ │ ├── useSandboxPreference.ts │ │ ├── useSidebarNavigation.ts │ │ ├── useTauri.ts │ │ ├── useToolSidebar.ts │ │ ├── useTypingAnimation.ts │ │ └── useUpgrade.ts │ ├── layout.tsx │ ├── login/ │ │ └── route.ts │ ├── logout/ │ │ └── route.ts │ ├── posthog.js │ ├── privacy-policy/ │ │ └── page.tsx │ ├── providers.tsx │ ├── services/ │ │ ├── __tests__/ │ │ │ └── desktop-sandbox-bridge.test.ts │ │ └── desktop-sandbox-bridge.ts │ ├── share/ │ │ └── [shareId]/ │ │ ├── SharedChatContext.tsx │ │ ├── SharedChatView.tsx │ │ ├── SharedMessages.tsx │ │ ├── __tests__/ │ │ │ └── SharedMessages.test.tsx │ │ ├── components/ │ │ │ ├── SharedMessagePartHandler.tsx │ │ │ └── SharedTodoBlock.tsx │ │ └── page.tsx │ ├── signup/ │ │ └── route.ts │ └── terms-of-service/ │ └── page.tsx ├── components/ │ ├── ConvexClientProvider.tsx │ ├── ai-elements/ │ │ ├── __tests__/ │ │ │ ├── reasoning.test.tsx │ │ │ └── worked-for.test.tsx │ │ ├── reasoning.tsx │ │ ├── shimmer.tsx │ │ └── worked-for.tsx │ ├── icons/ │ │ └── hackerai-svg.tsx │ └── ui/ │ ├── alert-dialog.tsx │ ├── avatar.tsx │ ├── badge.tsx │ ├── button.tsx │ ├── calendar.tsx │ ├── card.tsx │ ├── code-action-buttons.tsx │ ├── collapsible.tsx │ ├── dialog.tsx │ ├── dots-spinner.tsx │ ├── dropdown-menu.tsx │ ├── input.tsx │ ├── label.tsx │ ├── loading.tsx │ ├── popover.tsx │ ├── radio-group.tsx │ ├── select.tsx │ ├── separator.tsx │ ├── shared-todo-item.tsx │ ├── sheet.tsx │ ├── sidebar.tsx │ ├── skeleton.tsx │ ├── sonner.tsx │ ├── switch.tsx │ ├── textarea.tsx │ ├── todo-block.tsx │ ├── tool-block.tsx │ ├── tooltip.tsx │ └── with-tooltip.tsx ├── components.json ├── convex/ │ ├── __tests__/ │ │ ├── chatSummaryFallback.test.ts │ │ ├── fileStorage.aggregate.test.ts │ │ ├── fileStorage.delete.test.ts │ │ ├── messages.hidden.test.ts │ │ ├── s3Actions.test.ts │ │ ├── s3Cleanup.test.ts │ │ ├── s3Utils.test.ts │ │ ├── teamExtraUsage.test.ts │ │ ├── userDeletion.test.ts │ │ ├── userSuspensions.test.ts │ │ └── webhookClaim.test.ts │ ├── _generated/ │ │ ├── api.d.ts │ │ ├── api.js │ │ ├── dataModel.d.ts │ │ ├── server.d.ts │ │ └── server.js │ ├── auth.config.ts │ ├── chatStreams.ts │ ├── chats.ts │ ├── constants.ts │ ├── convex.config.ts │ ├── crons.ts │ ├── extraUsage.ts │ ├── extraUsageActions.ts │ ├── feedback.ts │ ├── fileActions.ts │ ├── fileAggregate.ts │ ├── fileStorage.ts │ ├── lib/ │ │ ├── logger.ts │ │ └── utils.ts │ ├── localSandbox.ts │ ├── messages.ts │ ├── notes.ts │ ├── rateLimitStatus.ts │ ├── redisPubsub.ts │ ├── s3Actions.ts │ ├── s3Cleanup.ts │ ├── s3Utils.ts │ ├── schema.ts │ ├── sharedChats.ts │ ├── teamExtraUsage.ts │ ├── teamExtraUsageActions.ts │ ├── tempStreams.ts │ ├── usageLogs.ts │ ├── userCustomization.ts │ ├── userDeletion.ts │ └── userSuspensions.ts ├── docker/ │ ├── Dockerfile │ ├── build.sh │ ├── centrifugo/ │ │ ├── README.md │ │ ├── config.json │ │ └── docker-compose.yml │ └── run.sh ├── e2b/ │ ├── README.md │ ├── build.dev.ts │ ├── build.prod.ts │ └── template.ts ├── e2e/ │ ├── README.md │ ├── chat-agent.spec.ts │ ├── chat-files-pro.spec.ts │ ├── chat-free.spec.ts │ ├── chat-pinned.spec.ts │ ├── chat-switching.spec.ts │ ├── constants.ts │ ├── fixtures/ │ │ └── auth.ts │ ├── helpers/ │ │ ├── convex-helpers.ts │ │ ├── mock-handlers.ts │ │ └── test-helpers.ts │ ├── page-objects/ │ │ ├── BasePage.ts │ │ ├── ChatComponent.ts │ │ ├── ChatModeSelector.ts │ │ ├── ChatPage.ts │ │ ├── FileAttachment.ts │ │ ├── HomePage.ts │ │ ├── SettingsDialog.ts │ │ ├── SidebarComponent.ts │ │ ├── UpgradeDialog.ts │ │ ├── UserMenuComponent.ts │ │ └── index.ts │ ├── resource/ │ │ └── secret.txt │ └── setup/ │ └── auth.setup.ts ├── eslint.config.mjs ├── global.d.ts ├── hooks/ │ ├── use-is-standalone.ts │ └── use-mobile.ts ├── instrumentation.ts ├── jest.config.js ├── jest.setup.js ├── lib/ │ ├── __tests__/ │ │ ├── desktop-auth.test.ts │ │ ├── extra-usage.test.ts │ │ ├── resolve-customer-users.test.ts │ │ ├── suspensionMessage.test.ts │ │ ├── suspensions.test.ts │ │ ├── usage-tracker.test.ts │ │ └── utils.test.ts │ ├── actions/ │ │ ├── billing-portal.ts │ │ └── index.ts │ ├── ai/ │ │ ├── providers.ts │ │ └── tools/ │ │ ├── __tests__/ │ │ │ ├── interact-terminal-session.test.ts │ │ │ ├── run-terminal-cmd.test.ts │ │ │ └── sandbox-capabilities.test.ts │ │ ├── file.ts │ │ ├── get-terminal-files.ts │ │ ├── index.ts │ │ ├── interact-terminal-session.ts │ │ ├── notes.ts │ │ ├── open-url.ts │ │ ├── proxy-tool.ts │ │ ├── run-terminal-cmd.ts │ │ ├── todo-write.ts │ │ ├── utils/ │ │ │ ├── __tests__/ │ │ │ │ ├── centrifugo-sandbox.test.ts │ │ │ │ ├── e2b-pty-adapter.test.ts │ │ │ │ ├── platform-utils.test.ts │ │ │ │ ├── proxy-manager.test.ts │ │ │ │ ├── pty-keys.test.ts │ │ │ │ ├── pty-session-manager.test.ts │ │ │ │ ├── sandbox-file-uploader.test.ts │ │ │ │ └── tauri-sandbox.test.ts │ │ │ ├── background-process-tracker.ts │ │ │ ├── caido-proxy.ts │ │ │ ├── centrifugo-pty-adapter.ts │ │ │ ├── centrifugo-sandbox.ts │ │ │ ├── e2b-errors.ts │ │ │ ├── e2b-pty-adapter.ts │ │ │ ├── file-accumulator.ts │ │ │ ├── guardrails.ts │ │ │ ├── hybrid-sandbox-manager.ts │ │ │ ├── path-validation.ts │ │ │ ├── perplexity.ts │ │ │ ├── pid-discovery.ts │ │ │ ├── platform-utils.ts │ │ │ ├── process-termination.ts │ │ │ ├── proxy-manager.ts │ │ │ ├── pty-exited-promise.ts │ │ │ ├── pty-keys.ts │ │ │ ├── pty-output-formatter.ts │ │ │ ├── pty-output.ts │ │ │ ├── pty-session-manager.ts │ │ │ ├── pty-wait-utils.ts │ │ │ ├── retry-with-backoff.ts │ │ │ ├── sandbox-command-options.ts │ │ │ ├── sandbox-file-uploader.ts │ │ │ ├── sandbox-health.ts │ │ │ ├── sandbox-manager.ts │ │ │ ├── sandbox-tools.ts │ │ │ ├── sandbox-types.ts │ │ │ ├── sandbox.ts │ │ │ ├── terminal-output-saver.ts │ │ │ └── todo-manager.ts │ │ └── web-search.ts │ ├── api/ │ │ ├── __tests__/ │ │ │ ├── agent-long-contracts.test.ts │ │ │ ├── build-extra-usage-config.test.ts │ │ │ ├── chat-handler-pty-cleanup.test.ts │ │ │ ├── chat-logger.test.ts │ │ │ ├── chat-stream-helpers-fallback.test.ts │ │ │ └── chat-stream-helpers-notes.test.ts │ │ ├── agent-stream-runner.ts │ │ ├── chat-handler.ts │ │ ├── chat-logger.ts │ │ ├── chat-stream-helpers.ts │ │ └── response.ts │ ├── auth/ │ │ ├── __tests__/ │ │ │ ├── cross-tab-mutex.test.ts │ │ │ ├── feature-flags.test.ts │ │ │ ├── shared-token.test.ts │ │ │ ├── use-auth-from-authkit.test.ts │ │ │ └── workos-organization-name.test.ts │ │ ├── auth-redirect-intents.ts │ │ ├── cross-tab-mutex.ts │ │ ├── entitlements.ts │ │ ├── feature-flags.ts │ │ ├── get-user-id.ts │ │ ├── shared-token.ts │ │ ├── use-auth-from-authkit.ts │ │ └── workos-organization-name.ts │ ├── billing/ │ │ └── resolve-customer-users.ts │ ├── centrifugo/ │ │ ├── __tests__/ │ │ │ └── jwt.test.ts │ │ ├── jwt.ts │ │ └── types.ts │ ├── chat/ │ │ ├── __tests__/ │ │ │ ├── agent-long-heartbeat.test.ts │ │ │ ├── agent-long-tool-input-dedup.test.ts │ │ │ ├── agent-routing.test.ts │ │ │ ├── chat-processor.test.ts │ │ │ ├── doom-loop-detection.test.ts │ │ │ └── stop-conditions.test.ts │ │ ├── agent-long-heartbeat.ts │ │ ├── agent-long-tool-input-dedup.ts │ │ ├── agent-long-transport.ts │ │ ├── agent-routing.ts │ │ ├── auth-disclaimer.ts │ │ ├── budget-monitor.ts │ │ ├── chat-processor.ts │ │ ├── compaction/ │ │ │ ├── __tests__/ │ │ │ │ └── prune-tool-outputs.test.ts │ │ │ └── prune-tool-outputs.ts │ │ ├── doom-loop-detection.ts │ │ ├── stop-conditions.ts │ │ ├── summarization/ │ │ │ ├── __tests__/ │ │ │ │ └── index.test.ts │ │ │ ├── constants.ts │ │ │ ├── helpers.ts │ │ │ ├── index.ts │ │ │ └── prompts.ts │ │ └── tool-abort-utils.ts │ ├── constants/ │ │ └── s3.ts │ ├── db/ │ │ ├── __tests__/ │ │ │ ├── convex-value-sanitizer.test.ts │ │ │ └── message-persistence-diagnostics.test.ts │ │ ├── actions.ts │ │ ├── convex-client.ts │ │ ├── convex-value-sanitizer.ts │ │ └── message-persistence-diagnostics.ts │ ├── desktop-auth.ts │ ├── errors.ts │ ├── extra-usage.ts │ ├── logger.ts │ ├── moderation.ts │ ├── posthog/ │ │ ├── server.ts │ │ └── worker.ts │ ├── pricing/ │ │ └── features.ts │ ├── rate-limit/ │ │ ├── __tests__/ │ │ │ ├── index.test.ts │ │ │ ├── refund.test.ts │ │ │ ├── sliding-window.test.ts │ │ │ ├── token-bucket.integration.test.ts │ │ │ └── token-bucket.test.ts │ │ ├── index.ts │ │ ├── redis.ts │ │ ├── refund.ts │ │ ├── sliding-window.ts │ │ └── token-bucket.ts │ ├── suspensionMessage.ts │ ├── suspensions.ts │ ├── system-prompt/ │ │ ├── bio.ts │ │ ├── notes.ts │ │ ├── personality.ts │ │ └── resume.ts │ ├── system-prompt.ts │ ├── token-utils.ts │ ├── usage-projection.ts │ ├── usage-tracker.ts │ ├── utils/ │ │ ├── __tests__/ │ │ │ ├── client-storage.test.ts │ │ │ ├── error-utils.test.ts │ │ │ ├── file-transform-utils.test.ts │ │ │ ├── message-utils.test.ts │ │ │ ├── pro-max-notice-cookie.test.ts │ │ │ ├── sandbox-file-utils.test.ts │ │ │ ├── stream-writer-utils.test.ts │ │ │ └── todo-utils.test.ts │ │ ├── accumulate-ui-chunks.ts │ │ ├── client-storage.ts │ │ ├── error-utils.ts │ │ ├── file-download.ts │ │ ├── file-token-utils.ts │ │ ├── file-transform-utils.ts │ │ ├── file-utils.ts │ │ ├── logout.ts │ │ ├── message-processor.ts │ │ ├── message-utils.ts │ │ ├── mode-helpers.ts │ │ ├── parse-rate-limit-warning.ts │ │ ├── pro-max-notice-cookie.ts │ │ ├── redis-pubsub.ts │ │ ├── safe-wait-until.ts │ │ ├── sandbox-command.ts │ │ ├── sandbox-file-utils.ts │ │ ├── scroll-events.ts │ │ ├── settings-dialog.ts │ │ ├── shiki.tsx │ │ ├── sidebar-storage.ts │ │ ├── sidebar-utils.ts │ │ ├── stream-cancellation.ts │ │ ├── stream-writer-utils.ts │ │ ├── terminal-executor.ts │ │ ├── todo-block-manager.ts │ │ └── todo-utils.ts │ └── utils.ts ├── middleware.ts ├── next.config.ts ├── package.json ├── packages/ │ ├── desktop/ │ │ ├── README.md │ │ ├── package.json │ │ ├── scripts/ │ │ │ ├── build.js │ │ │ └── generate-icons.mjs │ │ ├── src/ │ │ │ └── index.html │ │ ├── src-tauri/ │ │ │ ├── Cargo.toml │ │ │ ├── build.rs │ │ │ ├── capabilities/ │ │ │ │ └── default.json │ │ │ ├── entitlements.plist │ │ │ ├── gen/ │ │ │ │ └── schemas/ │ │ │ │ ├── acl-manifests.json │ │ │ │ ├── capabilities.json │ │ │ │ ├── desktop-schema.json │ │ │ │ └── macOS-schema.json │ │ │ ├── hackerai.desktop │ │ │ ├── icons/ │ │ │ │ └── icon.icns │ │ │ ├── permissions/ │ │ │ │ └── desktop-command-bridge.toml │ │ │ ├── scripts/ │ │ │ │ └── deb-postinstall.sh │ │ │ ├── src/ │ │ │ │ ├── lib.rs │ │ │ │ ├── main.rs │ │ │ │ ├── platform.rs │ │ │ │ └── pty.rs │ │ │ ├── tauri.conf.json │ │ │ └── tauri.dev.conf.json │ │ └── tsconfig.json │ └── local/ │ ├── .gitignore │ ├── README.md │ ├── package.json │ ├── src/ │ │ ├── __tests__/ │ │ │ └── utils.test.ts │ │ ├── index.ts │ │ ├── process-runner.ts │ │ └── utils.ts │ └── tsconfig.json ├── patches/ │ └── ai@6.0.184.patch ├── playwright.config.ts ├── pnpm-workspace.yaml ├── postcss.config.mjs ├── public/ │ └── manifest.json ├── scripts/ │ ├── README.md │ ├── accept-invitation.ts │ ├── attach-failing-card.ts │ ├── check-openrouter-gen-id.ts │ ├── create-test-users.ts │ ├── reset-rate-limit.ts │ ├── setup.ts │ ├── test-users-config.ts │ ├── validate-s3-security.ts │ ├── verify-email.ts │ └── verify-test-users.ts ├── skills-lock.json ├── trigger/ │ ├── agent-long.ts │ ├── stream-ids.ts │ └── streams.ts ├── trigger.config.ts ├── tsconfig.json ├── types/ │ ├── agent.ts │ ├── chat.ts │ ├── file.ts │ ├── index.ts │ └── user.ts └── vercel.json