Commit Graph

605 Commits

Author SHA1 Message Date
Will Chen
75b4b7c299 Handle mentioned apps via smart context (#1412)
<!-- CURSOR_SUMMARY -->
> [!NOTE]
> Send mentioned apps (names + files) to the engine through
dyad_options, omit inline other-apps prefix when engine is enabled, and
adjust e2e to snapshot request payload.
> 
> - **Engine/Backend**:
> - Pass mentioned apps to engine via
`providerOptions['dyad-engine'].dyadMentionedApps` and forward as
`dyad_options.mentioned_apps` in `llm_engine_provider`.
> - Gate inline other-apps context: only include `otherCodebasePrefix`
when `isEngineEnabled` is false.
> - Enhance `extractMentionedAppsCodebases` to return `files` alongside
`codebaseInfo`.
> - **Tests**:
> - e2e: change `mention app (with pro)` snapshot to
`snapshotServerDump("request")` and update snapshot to assert request
payload contents.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
7ddddf6c16c53cd36b4c7e4ec6a57da0616d1bb0. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
2025-09-30 17:05:18 -07:00
Md Rakibul Islam Rocky
29d8421ce9 Enhance Azure configuration handling and UI updates (#1289)
# Changes 

- Update Azure configuration components to manage API key and resource
name settings.
- Improve visibility of conThis pull request introduces a redesigned
Azure provider settings UI and refactors the logic for configuring Azure
OpenAI credentials, both in the frontend and supporting hooks. The main
changes focus on making the Azure configuration experience clearer and
more robust by supporting both environment variable and saved settings,
improving status indicators, and updating the logic for determining
provider readiness.

**Azure Provider UI and Logic Improvements**

* Added a new `AzureConfiguration` component that provides a dedicated
form for entering and saving Azure resource name and API key, with clear
status indicators and error handling. The UI now explains precedence
between saved settings and environment variables, and guides users
through configuration.
(`src/components/settings/AzureConfiguration.tsx`)
* Updated the main provider settings page and API key configuration
logic to pass Azure-specific settings and update functions to the new
component, ensuring seamless integration and correct state management.
(`src/components/settings/ApiKeyConfiguration.tsx`,
`src/components/settings/ProviderSettingsPage.tsx`)
[[1]](diffhunk://#diff-2104fb487cda3768cc5777889100e882f51e7fb3e13abe3cc89cf8ed1444300aR35)
[[2]](diffhunk://#diff-2104fb487cda3768cc5777889100e882f51e7fb3e13abe3cc89cf8ed1444300aR51-R61)
[[3]](diffhunk://#diff-9140e707ebb56ffed3272b4661ea1e6d8388ee604a8535c58e8a1564d280057cR297)
* Refactored the logic for determining whether Azure is configured to
check both saved settings and environment variables, ensuring accurate
status display and enabling fallback to environment variables if no
settings are saved. (`src/components/settings/ProviderSettingsPage.tsx`,
`src/hooks/useLanguageModelProviders.ts`)
[[1]](diffhunk://#diff-9140e707ebb56ffed3272b4661ea1e6d8388ee604a8535c58e8a1564d280057cL72-R99)
[[2]](diffhunk://#diff-9ac9e279a0cda34a0bc519348d5474b2e355b0828a678495be3af1e8984b5be5R35-R48)
* Updated the Azure provider E2E test to verify the new UI elements,
status indicators, and guidance, ensuring the test matches the new
configuration flow and messaging.
(`e2e-tests/azure_provider_settings.spec.ts`)

**Supporting Type and Import Updates**

* Added and updated type imports for `AzureProviderSetting` and
`VertexProviderSetting` where needed to support the new logic and UI.
(`src/components/settings/ProviderSettingsPage.tsx`,
`src/hooks/useLanguageModelProviders.ts`,
`src/ipc/utils/get_model_client.ts`)
[[1]](diffhunk://#diff-9140e707ebb56ffed3272b4661ea1e6d8388ee604a8535c58e8a1564d280057cL14-R14)
[[2]](diffhunk://#diff-9ac9e279a0cda34a0bc519348d5474b2e355b0828a678495be3af1e8984b5be5L5-R5)
[[3]](diffhunk://#diff-3cd526c6c10413c1387bfef450e48b880ba6f54865e96046044586ff4192bcceR15)
* Changed Azure model client import to use `createAzure` for consistency
and future extensibility. (`src/ipc/utils/get_model_client.ts`)
[Copilot is generating a summary...]figuration status and error handling
in the UI.
- Refactor environment variable checks to prioritize saved settings.
- Add support for Azure provider settings in the schema.
- Modify tests to reflect changes in Azure configuration requirements.

# Changes in short

- **Azure settings panel**
  - Replaced with a full form that:
    - Persists API key and resource name  
    - Surfaces save state  
    - Keeps the environment-variable helper  
  - *(src/components/settings/AzureConfiguration.tsx:23-214)*

- **Settings stack workflow**
  - Threaded the new Azure workflow:
    - Config shim now passes `updateSettings`  
    - Provider status checks prefer saved Azure values before env vars  
- *(src/components/settings/ApiKeyConfiguration.tsx:40-55,
src/components/settings/ProviderSettingsPage.tsx:60-105)*

- **Provider detection**
  - Azure treated like other saved credentials by:
    - Looking for both stored fields, or  
    - The pair of env vars  
  - *(src/hooks/useLanguageModelProviders.ts:5-57)*

- **Back-end model creation**
  - Reads saved Azure credentials (falling back to env vars)  
  - Builds the client via `createAzure`  
  - *(src/ipc/utils/get_model_client.ts:316-369)*

- **Provider schema support**
  - Extended so Azure can store its resource name alongside the secret  
  - *(src/lib/schemas.ts:82-109)*  

- **E2E tests**
  - Updated Azure Playwright spec to cover the new UI  
  - *(e2e-tests/azure_provider_settings.spec.ts:4-50)*

Issues resolved: #1275
2025-09-30 13:53:52 -07:00
Will Chen
39266416c7 Add GPT 5 Codex and Sonnet 4.5 (#1398)
Fixes #1405 
    
<!-- This is an auto-generated description by cubic. -->

## Summary by cubic
Adds GPT-5 Codex (OpenAI and Azure) and Claude 4.5 Sonnet to the model
options to enable newer coding models and larger contexts. Also
increases Claude 4 Sonnet max output tokens to 32k.

<!-- End of auto-generated description by cubic. -->


<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Adds GPT‑5 Codex (OpenAI/Azure) and Claude 4.5 Sonnet, and increases
Claude 4 Sonnet max output tokens to 32k across providers and tests.
> 
> - **Models**:
>   - **OpenAI**: add `gpt-5-codex` (400k context, default temp 1).
>   - **Anthropic**:
> - add `claude-sonnet-4-5-20250929` (1M context, `maxOutputTokens:
32_000`).
> - update `claude-sonnet-4-20250514` `maxOutputTokens` from `16_000` to
`32_000`.
> - **Azure**: add `gpt-5-codex` (400k context, `maxOutputTokens:
128_000`).
>   - **Bedrock**:
> - add `us.anthropic.claude-sonnet-4-5-20250929-v1:0` (1M context,
`maxOutputTokens: 32_000`).
> - update `us.anthropic.claude-sonnet-4-20250514-v1:0`
`maxOutputTokens` to `32_000`.
> - **E2E tests**:
> - Update snapshots to reflect `max_tokens` increased to `32000` for
`anthropic/claude-sonnet-4-20250514` in engine and gateway tests.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
73298d2da0c833468f957bb436f1e33400307483. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
2025-09-30 13:46:44 -07:00
Adeniji Adekunle James
3b68fb4e48 feat: add hotkey to toggle chat modes (#1274) (#995) (#1284)
Adds Ctrl+Shift+A (Cmd+Shift+A on Mac) keyboard shortcut to toggle
between Ask and Build chat modes.

**Changes:**
- Created `useChatModeToggle` hook for shared logic
- Added shortcut to ChatInput and HomeChatInput components

**Usage:**
Press Ctrl+Shift+A (or Cmd+Shift+A on Mac) to quickly switch between
chat modes without using the UI.

<img width="434" height="123" alt="image"
src="https://github.com/user-attachments/assets/a8c167b6-2b54-46f5-8191-5019991fc8e5"
/>

Closes (#995)
    
<!-- This is an auto-generated description by cubic. -->
---

## Summary by cubic
Add a global hotkey to toggle between Ask and Build modes: Ctrl+Shift+A
(Cmd+Shift+A on Mac). Makes switching faster without touching the UI and
fulfills Linear #995.

- **New Features**
- Added useChatModeToggle hook to flip selectedChatMode, detect
platform, and track PostHog event chat:mode_toggle.
- Wired the hotkey into ChatInput and HomeChatInput via
useChatModeToggle.
  - Updated ChatModeSelector tooltip to show the shortcut.

<!-- End of auto-generated description by cubic. -->

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Adds Cmd/Ctrl + . shortcut to cycle chat modes via a new hook, and
updates the mode selector tooltip to show the shortcut.
> 
> - **UX/Hotkey**:
> - Introduces `useChatModeToggle` to cycle `settings.selectedChatMode`
(captures `chat:mode_toggle`), with platform detection
(`detectIsMac`/`useIsMac`) and `useShortcut` binding for `Cmd/Ctrl + .`.
> - **Integrations**:
> - Wires `useChatModeToggle()` into `components/chat/ChatInput.tsx` and
`components/chat/HomeChatInput.tsx` to enable the shortcut in chat
inputs.
> - **UI**:
> - Enhances `components/ChatModeSelector.tsx` tooltip to display the
platform-specific shortcut hint (`⌘ + .` or `Ctrl + .`).
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
d8cc3fff43b6eb3227623f1c084410f42392c0b3. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: Will Chen <willchen90@gmail.com>
2025-09-30 13:43:24 -07:00
Will Chen
8f31821442 super value (#1408)
<!-- CURSOR_SUMMARY -->
> [!NOTE]
> Introduces a new `auto` model `value` (Super Value Pro), adds
configurable tag colors across model types, and updates Model Picker
filtering and badges.
> 
> - **Models and Types**:
> - Add new auto model `value` ("Super Value (Pro)") with `tag: Budget`
and `tagColor`.
>   - Enhance `turbo` auto model with `tag: Fast` and `tagColor`.
>   - Extend `LanguageModel` and `ModelOption` with optional `tagColor`.
> - **Model Picker UI**:
> - Render model tags with configurable colors via `tagColor` and `cn`
utility.
> - Update "Pro only" badge logic (hide when display name already
includes "(Pro)"); adjust badge text size.
> - Refine auto model visibility: non‑Pro hides `turbo` and `value`; Pro
hides `free`.
>   - Minor styling/labeling tweaks in tag and badge rendering.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
4485fddad502237d4bceb43732043d3eaa60eaa0. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
2025-09-30 12:58:17 -07:00
Mohamed Aziz Mejri
582793eba0 Disable send button while approval is pending (#1368)
Fixes #912 

This PR implements disabling send button while approval is pending and
addresses issue #912
    
<!-- This is an auto-generated description by cubic. -->
---

## Summary by cubic
Disable the chat send button while a proposal is awaiting approval, and
re-enable it after approve or reject. Prevents accidental messages
during pending changes. Addresses issue #912.

- **New Features**
- Track pending changes with isChangesPending based on the last
assistant message’s approvalState.
- Disable the send button when a proposal is pending (in addition to the
existing empty input check).
- Re-enable after approve/reject by refreshing the proposal and
messages.
  - Added Playwright e2e tests for both approve and reject flows.

<!-- End of auto-generated description by cubic. -->

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Disable the chat send button when a code proposal is pending approval
and re-enable after approve/reject; add e2e coverage and update MCP
flow.
> 
> - **Frontend**
> - `ChatInput.tsx`: Read `messages` from `chatMessagesAtom` and derive
`disableSendButton` when the last assistant message (matching
`proposal.messageId`) has no `approvalState` and `proposal.type ===
"code-proposal"`.
> - Apply `disableSendButton` to the send button’s `disabled` condition
(in addition to empty input/attachments).
>   - Ensure proposal/messages refresh after approve/reject.
> - **Tests**
> - Add Playwright tests `e2e-tests/chat_input.spec.ts` to verify send
button disabled during pending proposal and re-enabled after approve or
reject.
> - Update `e2e-tests/mcp.spec.ts` to click "Approve" after granting
consent.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
b9b47bd6f547449cc5cf1d39a00e4e7fb5de1bcd. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: Will Chen <willchen90@gmail.com>
2025-09-29 16:19:49 -07:00
Will Chen
d96e95c1da Support web search (#1370)
<!-- This is an auto-generated description by cubic. -->

## Summary by cubic
Adds web search to Dyad Pro chats with a new UI, tag parsing, and a Pro
Mode toggle that wires through to the engine.

- **New Features**
  - Pro Mode toggle: “Web Search” (settings.enableProWebSearch).
  - New custom tags: dyad-web-search, dyad-web-search-result, dyad-read.
- Collapsible Web Search Result UI with in-progress badge and markdown
rendering.
- Engine integration: passes enable_web_search and activates DyadEngine
when web search is on.

<!-- End of auto-generated description by cubic. -->
2025-09-24 19:39:39 -07:00
Will Chen
42a406e3ab Update setup banner: navigate to settings#ai & Dyad Pro option (#1361)
<!-- This is an auto-generated description by cubic. -->

## Summary by cubic
Updated the setup banner to navigate to Settings and auto-scroll to the
AI Providers section, and added a Dyad Pro setup option to streamline
onboarding.

- **New Features**
  - Added “Setup Dyad Pro” card with logo; opens Dyad Pro signup.
- “Other providers” now jumps to Settings → Provider section with smooth
scroll.
  - OpenRouter setup card updated with new teal styling.

- **Refactors**
- Introduced useScrollAndNavigateTo hook to navigate, scroll, and set
active section.
- Centralized active section state via activeSettingsSectionAtom (used
by SettingsList).
  - SetupProviderCard supports a new “dyad” variant styling.

<!-- End of auto-generated description by cubic. -->
2025-09-23 16:06:49 -07:00
Adeniji Adekunle James
2597d50529 feat: add copy functionality for ai responses with Dyad tag formatting (#1290) (#1315)
## Summary
Adds AI response copy functionality to chat messages that preserves
formatting and converts Dyad-specific tags to clean, readable markdown.

## Changes
- **New `useCopyToClipboard` hook**: Parses Dyad tags and converts them
to professional markdown format
- **Updated `ChatMessage` component**: Positions copy button on left
side of approval status
- **Dyad tag conversion**: Transforms custom tags to readable format:
  - `<dyad-write>` → `### File: path/to/file.js` + code block
  - `<dyad-edit>` → `### Edit: path/to/file.js` + code block  
  - `<dyad-execute-sql>` → `### Execute SQL` + ```sql block
  - `<think>` → `### Thinking` + content

## Features
-  Automatic programming language detection from file extensions  
-  Professional markdown formatting with proper headings and code
blocks
-  Tooltip showing "Copied" confirmation
-  Reuses existing DyadMarkdownParser logic for consistency

closes (#1290)
    
<!-- This is an auto-generated description by cubic. -->
---

## Summary by cubic
Adds a Copy button to assistant messages that copies a clean Markdown
version of the response by converting Dyad tags and preserving code
blocks. Improves shareability and removes Dyad-only markup; addresses
Linear #1290.

- **New Features**
- Added useCopyToClipboard hook that parses Dyad tags to Markdown,
auto-detects code language, and cleans spacing.
- Updated ChatMessage to show a Copy button (with Copy/Copied tooltip)
to the left of approval status; disabled while streaming.
- Tag conversions: think → "### Thinking"; dyad-write/edit → "###
File/Edit: path" + fenced code; dyad-execute-sql → "### Execute SQL" +
sql block; other Dyad tags map to concise headings; chat-summary/command
are omitted.
- Added e2e tests for clipboard copy, Dyad tag stripping/formatting, and
tooltip states.

<!-- End of auto-generated description by cubic. -->
2025-09-22 23:32:55 -07:00
Will Chen
9cca1d2af0 Fix MCP & title bar (#1348)
<!-- This is an auto-generated description by cubic. -->

## Summary by cubic
Fixes MCP handoff by detecting an edit-code tool call and stopping
generation. Simplifies the title bar credit tooltip; also blocks dyad-*
tags in the system prompt and updates tests.

- **Bug Fixes**
- Stop generation on edit-code via hasToolCall; add a no-op edit-code
tool to signal handoff.
  - Combine tool-call stop with existing step limit for reliability.
  - Forbid <dyad-*> tags in the system prompt to prevent misuse.
- Remove credit usage/reset details from the title bar tooltip; keep the
delay note.
  - Update e2e snapshot to reflect the new prompt rule.

<!-- End of auto-generated description by cubic. -->
2025-09-22 15:50:18 -07:00
Will Chen
a0606996fc Fix package lock (#1335)
#1028 caused some issues in the package-lock.json. This should fix that
2025-09-19 22:05:36 -07:00
Will Chen
7949ef7cdc bump to v0.22 beta 1 (#1334)
<!-- This is an auto-generated description by cubic. -->

## Summary by cubic
Bump version from 0.21.0 to 0.22.0-beta.1 to prepare the v0.22 beta
release. Enables packaging and distribution under the new beta tag.

<!-- End of auto-generated description by cubic. -->
2025-09-19 16:33:20 -07:00
Will Chen
6d3c397d40 Add MCP support (#1028) 2025-09-19 15:43:39 -07:00
Will Chen
7b160b7d0b fix pro banners (#1331) 2025-09-19 10:16:53 -07:00
Adeniji Adekunle James
de2cc2b48f fix(ui): add scrolling to model dropdown when list is long (#1279) (#1323)
## Problem
The model selection dropdown doesn't scroll when there are many models
available, causing the list to extend beyond the viewport and become
unusable.

## Solution
- Added `max-h-100 overflow-y-auto` classes to the DropdownMenuContent

This closes (#1279)

    
<!-- This is an auto-generated description by cubic. -->
---

## Summary by cubic
Adds vertical scrolling to the model selection dropdown so long lists
don’t overflow the viewport. Applies max height and overflow-y auto to
DropdownMenuSubContent across provider, Ollama, and LM Studio menus to
keep the list usable.

<!-- End of auto-generated description by cubic. -->
2025-09-18 16:35:57 -07:00
Mohamed Aziz Mejri
a547aa3ac1 Implementing app search feature (#1302)
This PR implements app search feature and addresses the issue #1182.
    
<!-- This is an auto-generated description by cubic. -->
---

## Summary by cubic
Adds a fast app search with a command-style dialog so users can find
apps by name or chat content and jump to them quickly. Implements the
search experience requested in #1182.

- New Features
- Search dialog (Ctrl+K or “Search Apps” button) with result snippets
from matching chat titles/messages.
- Searches across app names, chat titles, and message content;
case-insensitive; supports partial matches; empty query lists all apps.
  - Selecting a result navigates to the app and closes the dialog.
- New IPC endpoint search-app with Zod-validated results, debounced
React Query hook, and preload allowlist update.
- Added E2E tests for dialog open/close, shortcuts, matching behavior,
empty state, and navigation.

<!-- End of auto-generated description by cubic. -->
2025-09-17 15:03:07 -07:00
Adeniji Adekunle James
2edd122d9b Feat: Add inline code editor (#1156) (#1232) (#1220) (#1235)
## 🚀 Feature: Inline Code Editor

This PR adds a comprehensive inline code editing experience to the
DyadWrite component.

###  What's New

- **Inline Monaco Editor**: Edit code directly within the component
using Monaco Editor
- **Cancel/Revert**: Cancel changes and revert to original code state
- **Language Detection**: Automatic syntax highlighting based on file
extensions
- **Theme Support**: Proper dark/light mode theming integration



https://github.com/user-attachments/assets/c44ab622-6b86-403c-904d-3f327f9719e8


    
<!-- This is an auto-generated description by cubic. -->
---

## Summary by cubic
Adds an inline Monaco-based code editor to DyadWrite so users can edit
code blocks in place, then save or cancel changes. Saves stream edits
back to the chat as a dyad-edit block.

- **New Features**
- Inline editor with Edit, Save, and Cancel; preserves original code and
auto-expands when editing.
  - Language detection from file extension and dark/light theme support.
- Save streams edits via useStreamChat as <dyad-edit
path="...">...</dyad-edit> tied to the selected chat.
- Non-edit view still uses CodeHighlight; visibility toggle and
in-progress state respected.

- **Refactors**
- ChatMessage now uses DyadMarkdownParser instead of
VanillaMarkdownParser.

<!-- End of auto-generated description by cubic. -->
2025-09-16 23:03:22 -07:00
Adeniji Adekunle James
8c3fdb0ad0 feat: add edit functionality for custom AI providers (#1232) (#1171) (#1250)
## Summary
Adds the ability to edit existing custom AI providers through the
settings UI.

## Changes Made
- **UI Changes:**
  - Added "Edit Provider" button to custom provider dropdown menu
  - Modified `CreateCustomProviderDialog` to support edit mode


- **Backend Changes:**
- Implemented `editCustomLanguageModelProvider` handler in
`language_model_handlers.ts`
  - Added corresponding IPC client method
- Database transaction ensures atomicity when updating provider and
associated models


- **Testing:**
  - Added comprehensive e2e test covering edit functionality
  - Tests verify form pre-population, field updates, and UI persistence
  
  


https://github.com/user-attachments/assets/e8c8600e-4fb7-4816-be95-993ede1224d4



## Closes
Fixes #1232 and #1171
    
<!-- This is an auto-generated description by cubic. -->
---

## Summary by cubic
Adds edit support for custom language model providers in Settings. Users
can update provider ID, name, API base URL, and API key env var, with
safe backend updates that also retarget associated models if the ID
changes.

- New Features
  - Added “Edit Provider” option in the custom provider menu.
- Dialog supports edit mode with pre-filled fields, unified loading
state, and update button text.
- New IPC handler to edit providers with validation and a transaction;
updates linked models when IDs change.
- IPC client and preload channel updated; React hook exposes
editProvider mutation with cache invalidation.
  - Added e2e test covering the full edit flow.

<!-- End of auto-generated description by cubic. -->
2025-09-16 22:58:46 -07:00
Will Chen
decd05e764 add pro banners (#1269)
<!-- This is an auto-generated description by cubic. -->

## Summary by cubic
Adds rotating Pro banners on the home page to promote Dyad Pro (AI
access, Smart Context savings, Turbo speed). Also tightens the home
layout and centers the setup headline.

- New Features
- Added ProBanner with three variants (AI Access, Smart Context, Turbo).
One shows at random and links to dyad.sh/pro with UTM tags.
- Banners are hidden when Pro is enabled or the user has a budget
(settings.enableDyadPro or userBudget).
- Added OpenAI, Google, and Anthropic logo assets for the AI Access
banner.
- Home updates: show 3 inspiration prompts (was 5), center and constrain
layout, and render ProBanner below content.
  - SetupBanner heading is centered and slightly smaller (text-5xl).

<!-- End of auto-generated description by cubic. -->
2025-09-16 22:51:46 -07:00
Will Chen
60dff9ddb7 bump to v0.21 stable (#1293) 2025-09-15 22:04:40 -07:00
Will Chen
2e53014f29 Remove URL assertions for setup.spec.ts (fails on windows) (#1258) 2025-09-11 11:13:33 -07:00
Will Chen
6e7e86bb89 Bump to 0.21.0-beta.1 (#1251) 2025-09-10 17:23:54 -07:00
Will Chen
a8e9caf7b0 Turbo models (#1249)
<!-- This is an auto-generated description by cubic. -->

## Summary by cubic
Adds “Dyad Turbo” models for Pro users and centralizes model/provider
constants. Pro users can pick fast, cost‑effective models directly from
the ModelPicker, with clearer labels and gating.

- **New Features**
- Added Dyad Turbo provider in ModelPicker with Qwen3 Coder and Kimi K2
(Pro only).
- Turbo options are hidden for non‑Pro users; “Pro only” badge shown
where applicable.
- “Smart Auto” label now applies only to the Auto model to avoid
confusion.

- **Refactors**
- Moved all model/provider constants into language_model_constants.ts
and updated imports (helpers, client, thinking utils).

<!-- End of auto-generated description by cubic. -->
2025-09-10 15:59:54 -07:00
Will Chen
9bc5e1387a Fix Azure e2e test so it doesn't leak (#1248)
<!-- This is an auto-generated description by cubic. -->

## Summary by cubic
Scoped Azure e2e test env setup to prevent leaking variables across
tests. Added testWithConfigSkipIfWindows and moved Azure env vars into a
per-test preLaunchHook; the Azure test now skips on Windows.

<!-- End of auto-generated description by cubic. -->
2025-09-10 14:48:15 -07:00
Will Chen
72acb31d59 More free models (#1244)
<!-- This is an auto-generated description by cubic. -->

## Summary by cubic
Adds support for free OpenRouter models and a new “Free (OpenRouter)”
auto option that fails over across free models for reliability. Improves
setup flow and UI with provider cards, a “Free” price badge, and an
OpenRouter setup prompt in chat.

- **New Features**
- Added OpenRouter free models: Qwen3 Coder (free), DeepSeek v3 (free),
DeepSeek v3.1 (free), marked with dollarSigns=0 and a “Free” badge.
- New auto model: “Free (OpenRouter)” that uses a fallback client to
cycle through free models with smart retry on transient errors.
- New SetupProviderCard component and updated SetupBanner with dedicated
Google and OpenRouter setup cards.
- Chat shows an OpenRouter setup prompt when “Free (OpenRouter)” is
selected and OpenRouter isn’t configured.
- New PriceBadge component in ModelPicker to display “Free” or price
tier.
- E2E: added setup flow test and option to show the setup screen in
tests.
- Model updates: added DeepSeek v3.1, updated Kimi K2 to kimi-k2-0905,
migrated providers to LanguageModelV2.

<!-- End of auto-generated description by cubic. -->
2025-09-10 14:20:17 -07:00
Will Chen
7150082f5a Add OpenRouter to setup banner (#1242)
<!-- This is an auto-generated description by cubic. -->

## Summary by cubic
Added OpenRouter as a first-class option in the setup banner and
introduced a reusable provider card component. This streamlines provider
selection and adds E2E coverage for the setup flow.

- **New Features**
- Added SetupProviderCard and used it for Google and OpenRouter in
SetupBanner.
- Clicking Google or OpenRouter routes to the correct provider settings
and logs PostHog events.
  - Kept “Other providers” link to Settings.
- Added setup.spec.ts E2E test to verify Google, OpenRouter, and Other
navigation; introduced test config flag showSetupScreen to control the
OPENAI_API_KEY shortcut.

<!-- End of auto-generated description by cubic. -->
2025-09-10 13:00:31 -07:00
Will Chen
b9672004ed include php (#1234)
<!-- This is an auto-generated description by cubic. -->

## Summary by cubic
Added .php to ALLOWED_EXTENSIONS so codebase scanning and related
features include PHP files.

<!-- End of auto-generated description by cubic. -->

Fixes #1221
2025-09-09 16:11:51 -07:00
Will Chen
74edefcb8f Support 1M tokens for anthropic (drive-by: make aws bedrock secondary… (#1233)
… provider)
    
<!-- This is an auto-generated description by cubic. -->
---

## Summary by cubic
Enables 1M-token context for Anthropic Claude 4 Sonnet and marks AWS
Bedrock as a secondary provider. Adds the required Anthropic beta header
and updates model metadata and pricing indicator.

- **New Features**
- Send header anthropic-beta: context-1m-2025-08-07 when using the
Anthropic provider.
- Update Claude 4 Sonnet configs: contextWindow to 1,000,000; add cost
warning; increase pricing tier to 5 (applies to Anthropic and Bedrock
model IDs).
  - Set AWS Bedrock as a secondary provider.

<!-- End of auto-generated description by cubic. -->
2025-09-09 11:37:04 -07:00
Will Chen
7818f2950a Chat search (#1224)
Based on https://github.com/dyad-sh/dyad/pull/1116
    
<!-- This is an auto-generated description by cubic. -->
---

## Summary by cubic
Adds a fast chat search dialog (Command Palette) to find and jump
between chats. Open via the sidebar button or Ctrl/Cmd+K, with title and
message text search plus inline snippets.

- New Features
  - Command palette using cmdk with keyboard shortcut (Ctrl/Cmd+K).
- Searches within the selected app across chat titles and message
content via a new IPC route (search-chats).
- Debounced queries (150ms) with React Query; results de-duplicated and
sorted by newest.
- Snippet preview with highlighted matches and custom ranking; selecting
a result navigates and closes the dialog.
- Search button added to ChatList; basic e2e tests added (currently
skipped).

- Dependencies
  - Added cmdk@1.1.1.
- Bumped @radix-ui/react-dialog to ^1.1.15 and updated Dialog to support
an optional close button.

<!-- End of auto-generated description by cubic. -->

---------

Co-authored-by: Evans Obeng <iamevansobeng@outlook.com>
Co-authored-by: Evans Obeng <60653146+iamevansobeng@users.noreply.github.com>
2025-09-09 00:18:48 -07:00
Will Chen
d21497659b Fix package-lock.json & merges (#1227)
<!-- This is an auto-generated description by cubic. -->

## Summary by cubic
Regenerated package-lock.json to fix inconsistencies and align with
package.json. This restores reproducible installs locally and in CI.

- **Migration**
  - Run npm ci to install with the updated lockfile.
  - If install issues persist, delete node_modules and retry.

<!-- End of auto-generated description by cubic. -->
2025-09-09 00:17:55 -07:00
Adeniji Adekunle James
f8ec10ec6b feat: add xAI (Grok) as AI provider (#1209)
# Add xAI (Grok) Provider Support

## Overview
This PR adds support for xAI's Grok models as an AI provider, focusing
on coding-optimized models.

## Changes Made

### Provider Configuration (`language_model_helpers.ts`)
- Added xAI to `MODEL_OPTIONS` with 3 coding-focused models:
  - `grok-code-fast-1`: Fast, economical coding model (256k context)
  - `grok-4`: Most capable flagship model (256k context)
  - `grok-3`: Powerful coding model (131k context)

<img width="805" height="592" alt="image"
src="https://github.com/user-attachments/assets/a99b9495-e90e-40f3-a772-be9807b24501"
/>


<img width="805" height="653" alt="image"
src="https://github.com/user-attachments/assets/aad7b333-ee74-457a-b5b7-5d20bd54d7e0"
/>

## Dependencies
- Requires `@ai-sdk/xai` package (already imported)
- Uses existing provider pattern and infrastructure


## Why xAI for Coding?
xAI's Grok models have shown impressive results in coding benchmarks:
- Trained on high-quality programming datasets reflecting real-world
tasks
- Excels at agentic coding workflows with fast reasoning capabilities
- Strong performance across multiple programming languages (TypeScript,
Python, Java, Rust, C++, Go)
- Achieved 70.8% on SWE-Bench-Verified using internal evaluation
- Optimized for rapid iteration in development environments
    
<!-- This is an auto-generated description by cubic. -->
---

## Summary by cubic
Adds xAI (Grok) as a provider so users can pick Grok coding models in
the app. Integrates provider config, client wiring, and schema updates.

- **New Features**
- Added xAI provider with env var mapping (XAI_API_KEY) and provider
metadata.
- Exposed models: grok-code-fast-1 (256k), grok-4 (256k), grok-3 (131k).
  - Hooked up get_model_client to use @ai-sdk/xai (createXai).
  - Included "xai" in validation schemas and model options.

- **Migration**
  - Set XAI_API_KEY to enable xAI.

<!-- End of auto-generated description by cubic. -->

---------

Co-authored-by: Will Chen <willchen90@gmail.com>
2025-09-08 23:01:59 -07:00
Samrat Jha
938595aab2 Add support for Amazon Bedrock provider (#1185)
- follows existing patterns for AI SDK to provide Bedrock integration
- Uses Bedrock's API token feature for authentication which provides a
standard experience
- bedrock provided models match the Anthropic provided models (for now)


**Disclaimer**: The contributing docs are extremely sparse. I don't
actually know how to build this and get this running in Electron


## Testing

- AWS Bedrock provider is available for selection
<img width="994" height="496" alt="image"
src="https://github.com/user-attachments/assets/3cb21fed-9826-40e5-8019-b2b5df5e873b"
/>

- The provider settings also show the right models and offer the right
env variable to use
<img width="949" height="862" alt="image"
src="https://github.com/user-attachments/assets/8c23d5c8-d84d-4bf7-856a-8dc8d9d6c4b4"
/>


    
<!-- This is an auto-generated description by cubic. -->
---

## Summary by cubic
Adds AWS Bedrock as a provider so users can run Claude models via
Bedrock with API token authentication. The settings now list Bedrock
with supported models and a new env var.

- New Features
- New provider: bedrock using @ai-sdk/amazon-bedrock, wired into model
client and schemas.
- Models: Claude 4 Sonnet, Claude 3.7 Sonnet, Claude 3.5 Sonnet (Bedrock
model IDs).
- Settings: shows AWS Bedrock with correct models and env var
AWS_BEARER_TOKEN_BEDROCK.
  - Default region: us-east-1.

- Migration
  - Set AWS_BEARER_TOKEN_BEDROCK with your Bedrock API token.
  - Select AWS Bedrock in settings and pick a model.

<!-- End of auto-generated description by cubic. -->

Co-authored-by: Samrat Jha <samratj@amazon.com>
Co-authored-by: Will Chen <willchen90@gmail.com>
2025-09-08 22:52:12 -07:00
Md Rakibul Islam Rocky
4db6d63b72 Add Google Vertex AI provider (#1163)
# Summary

* Adds first-class **Google Vertex AI provider** using
`@ai-sdk/google-vertex`.
* Supports **Gemini 2.5** models and partner **MaaS (Model Garden)**
models via full publisher IDs.
* New **Vertex-specific settings UI** for Project, Location, and Service
Account JSON.
* Implements a **“thinking” toggle** for Gemini 2.5 Flash

  * Pro: always on
  * Flash: toggleable
  * Flash Lite: none
* Fixes *“AI not found”* for Vertex built-ins by mapping to
`publishers/google` paths.
* Hardens **cross-platform file ops** and ensures all tests pass.

---

# What’s New

### Vertex AI Provider

* Uses `@ai-sdk/google-vertex` with `googleAuthOptions.credentials` from
pasted Service Account JSON.
* Configurable **project** and **location**.
* Base URL → `/projects/{project}/locations/{location}`

  * Built-ins: `publishers/google/models/<id>`
  * Partner MaaS: `publishers/<partner>/models/...`

### Built-in Vertex Models

* `gemini-2.5-pro`
* `gemini-2.5-flash`
* `gemini-2.5-flash-lite`

### Thinking Behavior

* Vertex + Google marked as thinking-capable.
* Pro: always thinking
* Flash: toggle in UI
* Flash Lite: none

### Vertex Settings UI

* New **Google Vertex AI panel** for Project ID, Location, Service
Account JSON.
* Keys encrypted like other secrets.

---

# Fixes

* **Model resolution:** built-ins auto-map to
`publishers/google/models/<id>`.
* **Partner MaaS support:** full publisher IDs work directly (e.g.
DeepSeek).
* **Cross-platform paths:** normalize file ops with `toPosixPath`,
preserve `safeJoin` semantics.

---

# Why This Is Better

* Users can select **Vertex alongside other providers**.
* **More models** available through Model Garden.
* **Dedicated setup UI** reduces misconfig.
* **Thinking toggle** gives control over cost vs. reasoning depth.

---

# Files Changed

* **Provider & Models**: `language_model_helpers.ts`,
`get_model_client.ts`
* **Streaming**: `chat_stream_handlers.ts`
* **Schemas & Encryption**: `schemas.ts`, `settings.ts`
* **Settings UI**: `VertexConfiguration.tsx`, `ApiKeyConfiguration.tsx`
* **Models UI**: `ModelsSection.tsx` (Flash toggle)
* **Setup Detection**: `useLanguageModelProviders.ts`
* **Path Utils**: `path_utils.ts`, `response_processor.ts`
* **Deps**: `package.json` → `@ai-sdk/google-vertex@3.0.16`

---

# Tests & Validation

* **TypeScript**: `npm run ts` → 
* **Lint**: `npm run lint` → 
* **Unit tests**: `npm test` →  231 passed, 0 failed

---

# Migration / Notes

* No breaking changes.
* For Vertex usage:

  * Ensure Vertex AI API is enabled.
  * Service Account needs `roles/aiplatform.user`.
  * Region must support model (e.g. `us-central1`).
* Thinking toggle currently affects **only** Gemini 2.5 Flash.

---

# Manual QA

1. Configure Vertex with Project/Location/Service Account JSON.
2. Test built-ins:

   * `gemini-2.5-pro`
   * `gemini-2.5-flash` (toggle on/off)
   * `gemini-2.5-flash-lite`
3. Test MaaS partner model (e.g., DeepSeek) via full publisher ID.
4. Verify other providers remain unaffected.
    
<!-- This is an auto-generated description by cubic. -->
---

## Summary by cubic
Adds a first-class Google Vertex AI provider with Gemini 2.5 models, a
Vertex settings panel, and a “thinking” toggle for Gemini 2.5 Flash.
Also fixes model resolution for Vertex and hardens cross-platform file
operations.

- **New Features**
- Vertex AI provider via @ai-sdk/google-vertex with project, location,
and service account JSON.
- Built-in models: gemini-2.5-pro, gemini-2.5-flash,
gemini-2.5-flash-lite.
- “Thinking” support: Pro always on; Flash toggle in Models UI; Flash
Lite none.
- MaaS partners supported via full publisher paths (e.g.,
publishers/<partner>/models/...).
  - Vertex settings UI with encrypted service account key storage.

- **Bug Fixes**
  - Built-in Vertex models auto-map to publishers/google/models/<id>.
  - Consistent file ops across platforms using toPosixPath.
- Vertex readiness detection requires project/location/service account
JSON.
- Streaming “thinking” behavior respects Vertex Flash toggle and Pro
always-on.

<!-- End of auto-generated description by cubic. -->

---------

Co-authored-by: Md Rakibul Islam Rocky <mdrirocky08@gmail.com>
Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com>
Co-authored-by: Will Chen <willchen90@gmail.com>
2025-09-08 22:41:12 -07:00
Will Chen
e962964afe bump to v0.20 stable (#1223) 2025-09-08 10:43:16 -07:00
Mohamed Aziz Mejri
ba115605b5 Set minimum window size to prevent UI breakage (#1195)
This PR solves issue #1194 by setting a minimum height and width
    
<!-- This is an auto-generated description by cubic. -->
---

## Summary by cubic
Set a minimum window size to prevent UI breakage when the app is resized
too small. The BrowserWindow now enforces minWidth 800 and minHeight 500
so layouts stay stable and controls remain accessible.

<!-- End of auto-generated description by cubic. -->
2025-09-05 23:59:07 -07:00
Mohamed Aziz Mejri
6ee1a93187 Component selection shortcut (#1139)
This PR introduces a new keyboard shortcut to improve the efficiency of
selecting components in the app. Users can now quickly select components
using Meta + Shift + C for Mac and Ctrl + Shift + C for Other devices
(Windows/Linux)

    
<!-- This is an auto-generated description by cubic. -->
---

## Summary by cubic
Add a shortcut to quickly activate the component selector from the
preview. Use Meta+Shift+C on macOS and Ctrl+Shift+C on Windows/Linux.

- **New Features**
- Added useShortcut hook to handle key combos and prevent default on
match.
  - Wired shortcut in PreviewIframe with OS detection for Meta vs Ctrl.
- Forwarded keydown events from the iframe to the parent via postMessage
(dyad-shortcut-triggered) so the shortcut works inside preview content.

<!-- End of auto-generated description by cubic. -->
2025-09-05 23:33:44 -07:00
Adeniji Adekunle James
207f3fc397 docs: fix typo "pull requet" to "pull request" in CONTRIBUTING.md (#1188)
<!-- This is an auto-generated description by cubic. -->

## Summary by cubic
Fix typo in CONTRIBUTING.md by correcting "pull requet" to "pull
request" in the setup section, improving clarity for contributors.

<!-- End of auto-generated description by cubic. -->
2025-09-05 23:33:05 -07:00
Adeniji Adekunle James
d6e1df3a87 fix(ui): turbo edit - prevent code editor content click from toggling accordion (#1201)
Hovering over the turbo edit code block previously showed a pointer
cursor, and clicking inside would collapse/expand the accordion. This PR
updates the DyadEdit component to use cursor-text and adds
e.stopPropagation() so clicks inside the code block no longer toggle the
accordion.




https://github.com/user-attachments/assets/1b23be66-6d8f-4e4b-a390-d59f9a2bcee8



    
<!-- This is an auto-generated description by cubic. -->
---

## Summary by cubic
Prevented the Turbo Edit accordion from toggling when clicking inside
the code block and updated the cursor to text to signal editing.

- **Bug Fixes**
- Stop click propagation inside the code block to avoid accordion
toggle.
- Apply cursor-text on the code container for proper text-selection
affordance.

<!-- End of auto-generated description by cubic. -->
2025-09-05 23:09:46 -07:00
Will Chen
56d0e76790 Make balanced smart context option the default (#1186)
<!-- This is an auto-generated description by cubic. -->

## Summary by cubic
Set “balanced” as the default smart context mode. Users now get balanced
when Smart Files Context is enabled and no mode is set; “conservative”
must be explicitly selected.

- **Refactors**
- Default fallback to balanced in UI and engine (proSmartContextOption
undefined -> "balanced").
- ProModeSelector saves "conservative" explicitly; selector reads
undefined as balanced.
  - Updated schema and types to allow "balanced" | "conservative".
- Engine payload now includes smart_context_mode with "balanced" by
default; e2e tests and snapshots updated.

- **Migration**
- No action needed. Existing users without an explicit mode will use
balanced by default; selecting conservative persists.

<!-- End of auto-generated description by cubic. -->
2025-09-04 11:06:46 -07:00
Will Chen
2842c61f7c Improve model picker UX (#1180)
1. Show less common AI providers (secondary) in submenu
2. Show $ signs for rough cost guide
3. Show "Pro" for supported AI providers with Pro is enabled

    
<!-- This is an auto-generated description by cubic. -->
---

## Summary by cubic
Improves the Model Picker UX by grouping less-used providers under an
“Other AI providers” submenu and adding clear cost and Pro indicators.
This makes picking models faster and more informative.

- **New Features**
- Grouped secondary providers under “Other AI providers” using a new
provider.secondary flag (Azure marked secondary).
- Added rough cost hints: models can set dollarSigns and the UI shows a
“$” badge accordingly.
- Shows a “Pro” badge on supported cloud providers when Pro is enabled;
added a “Custom” badge for custom providers.
- Extended types: LanguageModelProvider.secondary and
LanguageModel.dollarSigns; populated values across OpenAI, Anthropic,
Google, and OpenRouter.

<!-- End of auto-generated description by cubic. -->
2025-09-03 15:36:54 -07:00
Will Chen
b5b637f73b v0.20.0-beta.1 (#1181) 2025-09-03 15:00:12 -07:00
顾颢
06d79f89ac chore: add Windows compatibility for npm scripts (#1170)
<!-- This is an auto-generated description by cubic. -->

## Summary by cubic
Make npm scripts work on Windows by replacing rm -rf with rimraf and
using cross-env for environment variables. This enables local dev and
packaging on Windows without WSL.

- **Refactors**
- Changed clean to use rimraf and delete out and scaffold/node_modules.
- Prefixed dev:engine, staging:engine, and staging:gateway with
cross-env.

- **Dependencies**
  - Added rimraf ^6.0.1. Run npm install.

<!-- End of auto-generated description by cubic. -->

Co-authored-by: 顾颢 <guhao@dayee.com>
2025-09-03 14:57:30 -07:00
Adeniji Adekunle James
ebcf89ee6c fix: hide <dyad-command> tags from generated text output (#945) (#1162)
### Summary
This PR hides `<dyad-command type="refresh"></dyad-command>` tags from
generated text outputs. These elements are not intended for end users
and clutter the response text.

### Changes
- Filter out `<dyad-command>` tags from generated text.
- Ensure no regressions in rendering or formatting of user-visible
output.

    
<!-- This is an auto-generated description by cubic. -->
---

## Summary by cubic
Hide dyad-command tags from chat output so internal commands never
appear in user-visible text. Updates DyadMarkdownParser to detect and
drop these tags during preprocessing, parsing, and rendering.

<!-- End of auto-generated description by cubic. -->
2025-09-03 14:56:27 -07:00
Will Chen
1c0255ab12 Enable iframe sandbox (#1178)
This allows almost all the iframe sandbox tokens
https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/iframe#sandbox
except notably for allow-top-navigation*

Note: allow-same-origin should be OK because the main window is under
the `file://` origin while the iframe window is served on
`localhost:####`

    
<!-- This is an auto-generated description by cubic. -->
---

## Summary by cubic
Enable sandboxing on the preview iframe to isolate preview content while
preserving needed capabilities (allow-same-origin, scripts, forms,
popups, modals, orientation/pointer lock, presentation, downloads).
Top-level navigation remains disallowed; allow-same-origin is safe
because the app is file:// and the iframe runs on localhost.

<!-- End of auto-generated description by cubic. -->
2025-09-03 14:17:50 -07:00
Will Chen
67c67e7bec Add security policy for supported versions and reporting (#1166) 2025-09-02 16:03:49 -07:00
Will Chen
b5ab10ccb2 Bump to v0.19.0 (stable) (#1161) 2025-09-02 09:45:38 -07:00
Will Chen
1e655e1c10 Use new dyad icons (#1157)
<!-- This is an auto-generated description by cubic. -->

## Summary by cubic
Updates app branding to icon set v2 and switches the in-app logo to SVG
for sharper rendering.

- **Refactors**
  - Use assets/logo.svg in TitleBar instead of logo_transparent.png.
- Add assets/logo.svg; remove legacy PNGs (logo.png,
logo_transparent.png).
- Refresh platform icon files (logo.icns, logo.ico,
assets/icon/logo.png).

<!-- End of auto-generated description by cubic. -->
2025-09-01 21:33:44 -07:00
Toluwap
78b69ae508 Update missing direction creation (#1146)
Update the doc for missing userData for the database.
    
<!-- This is an auto-generated description by cubic. -->
---

## Summary by cubic
Add a setup step in CONTRIBUTING.md to create the userData directory
required by the database. This prevents migration commands from failing
on fresh installs.

<!-- End of auto-generated description by cubic. -->
2025-09-01 21:24:46 -07:00
Tanner-Maasen
2ffbbbca8f Add Azure OpenAI Custom Model Integration (#1001)
Fixes #710 

This PR implements comprehensive Azure OpenAI integration for Dyad,
enabling users to leverage Azure
OpenAI models through proper environment variable configuration. The
implementation adds Azure as a
supported provider with full integration into the existing language
model architecture, including support
  for GPT-5 models. Key features include environment-based
configuration using `AZURE_API_KEY` and `AZURE_RESOURCE_NAME`,
specialized UI components that provide clear
setup instructions and status indicators, and seamless integration with
Dyad's existing provider system.
The Azure provider leverages the @ai-sdk/azure package (v1.3.25) for
compatibility with the current
  TypeScript language model interfaces.

The implementation includes robust error handling for missing
configuration, comprehensive test coverage
with 9 new unit tests covering critical functionality like model client
creation and error scenarios, and
  an E2E test for the Azure-specific settings UI. 

<img width="1510" height="908" alt="Screenshot 2025-08-18 at 9 14 32 PM"
src="https://github.com/user-attachments/assets/04aa99e1-1590-4bb0-86c9-a67b97bc7500"
/>

---------

Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com>
Co-authored-by: Will Chen <willchen90@gmail.com>
2025-08-30 20:47:25 -07:00
Will Chen
86cc50c50c Switch back to anthropic (#1135) 2025-08-29 21:35:09 -07:00