mirror of
https://github.com/Significant-Gravitas/AutoGPT.git
synced 2026-02-18 18:44:42 -05:00
Simplifies and improves the Google Sheets/Drive integration by merging
credentials with the file picker and using narrower OAuth scopes.
### Changes 🏗️
- Merge Google credentials and file picker into a single unified input
field for better UX
- Create spreadsheets using Drive API instead of Sheets API for proper
scope support
- Simplify Google Drive OAuth scope to only use `drive.file` (narrowest
permission needed)
- Clean up unused imports (NormalizedPickedFile)
### Checklist 📋
#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
- [x] Test creating a new Google Spreadsheet with
GoogleSheetsCreateSpreadsheetBlock
- [x] Test reading from existing spreadsheets with GoogleSheetsReadBlock
- [x] Test writing to spreadsheets with GoogleSheetsWriteBlock
- [x] Verify OAuth flow works with simplified scopes
- [x] Verify file picker works with merged credentials field
#### For configuration changes:
- [x] `.env.default` is updated or already compatible with my changes
- [x] `docker-compose.yml` is updated or already compatible with my
changes
- [x] I have included a list of my configuration changes in the PR
description (under **Changes**)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
<!-- CURSOR_SUMMARY -->
---
> [!NOTE]
> Unifies Google Drive picker and credentials with auto-credentials
across backend and frontend, updates all Sheets blocks and execution to
use it, and adds Drive-based spreadsheet creation plus supporting tests
and UI fixes.
>
> - **Backend**:
> - **Google Drive model/field**: Introduce `GoogleDriveFile` (with
`_credentials_id`) and `GoogleDriveFileField()` for unified auth+picker
(`backend/blocks/google/_drive.py`).
> - **Sheets blocks**: Replace `GoogleDrivePickerField` and explicit
credentials with `GoogleDriveFileField` across all Sheets blocks;
preserve and emit credentials for chaining; add Drive service; create
spreadsheets via Drive API then manage via Sheets API.
> - **IO block**: Add `AgentGoogleDriveFileInputBlock` providing a Drive
picker input.
> - **Execution**: Support auto-generated credentials via
`BlockSchema.get_auto_credentials_fields()`; acquire/release multiple
credential locks; pass creds by `credentials_kwarg`
(`executor/manager.py`, `data/block.py`, `util/test.py`).
> - **Tests**: Add validation tests for duplicate/unique
`auto_credentials.kwarg_name` and defaults.
> - **Frontend**:
> - **Picker**: Enhance Google Drive picker to require/use saved
platform credentials, pass `_credentials_id`, validate scopes, and
manage dialog z-index/interaction; expose `requirePlatformCredentials`.
> - **UI**: Update dialogs/CSS to keep Google picker on top and prevent
overlay interactions.
> - **Types**: Extend `GoogleDrivePickerConfig` with `auto_credentials`
and related typings.
>
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
7d25534def. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
---------
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>
166 lines
3.7 KiB
CSS
166 lines
3.7 KiB
CSS
@tailwind base;
|
|
@tailwind components;
|
|
@tailwind utilities;
|
|
|
|
@layer base {
|
|
:root {
|
|
--background: 0 0% 98%; /* neutral-50#FAFAFA */
|
|
--foreground: 240 10% 3.9%;
|
|
--card: 0 0% 100%;
|
|
--card-foreground: 240 10% 3.9%;
|
|
--popover: 0 0% 100%;
|
|
--popover-foreground: 240 10% 3.9%;
|
|
--primary: 240 5.9% 10%;
|
|
--primary-foreground: 0 0% 98%;
|
|
--secondary: 240 4.8% 95.9%;
|
|
--secondary-foreground: 240 5.9% 10%;
|
|
--muted: 240 4.8% 95.9%;
|
|
--muted-foreground: 240 3.8% 46.1%;
|
|
--accent: 262 83% 58%;
|
|
--accent-foreground: 0 0% 100%;
|
|
--destructive: 0 84.2% 60.2%;
|
|
--destructive-foreground: 0 0% 98%;
|
|
--border: 240 5.9% 90%;
|
|
--input: 240 5.9% 85%;
|
|
--ring: 240 5.9% 10%;
|
|
--radius: 0.5rem;
|
|
--chart-1: 12 76% 61%;
|
|
--chart-2: 173 58% 39%;
|
|
--chart-3: 197 37% 24%;
|
|
--chart-4: 43 74% 66%;
|
|
--chart-5: 27 87% 67%;
|
|
}
|
|
|
|
.dark {
|
|
--background: 240 10% 3.9%;
|
|
--foreground: 0 0% 98%;
|
|
--card: 240 10% 3.9%;
|
|
--card-foreground: 0 0% 98%;
|
|
--popover: 240 10% 3.9%;
|
|
--popover-foreground: 0 0% 98%;
|
|
--primary: 0 0% 98%;
|
|
--primary-foreground: 240 5.9% 10%;
|
|
--secondary: 240 3.7% 15.9%;
|
|
--secondary-foreground: 0 0% 98%;
|
|
--muted: 240 3.7% 15.9%;
|
|
--muted-foreground: 240 5% 64.9%;
|
|
--accent: 240 3.7% 15.9%;
|
|
--accent-foreground: 0 0% 98%;
|
|
--destructive: 0 62.8% 30.6%;
|
|
--destructive-foreground: 0 0% 98%;
|
|
--border: 240 3.7% 15.9%;
|
|
--input: 240 3.7% 15.9%;
|
|
--ring: 240 4.9% 83.9%;
|
|
--chart-1: 220 70% 50%;
|
|
--chart-2: 160 60% 45%;
|
|
--chart-3: 30 80% 55%;
|
|
--chart-4: 280 65% 60%;
|
|
--chart-5: 340 75% 55%;
|
|
}
|
|
|
|
* {
|
|
@apply border-border;
|
|
}
|
|
body {
|
|
@apply bg-[#F6F7F8] font-sans text-foreground antialiased transition-colors;
|
|
}
|
|
}
|
|
|
|
/* *** AutoGPT Design Components *** */
|
|
|
|
@layer components {
|
|
.agpt-border-input {
|
|
@apply m-0.5 border border-input data-[state=open]:border-gray-400 data-[state=open]:ring-1 data-[state=open]:ring-gray-400 focus:border-gray-400 focus:outline-none focus:ring-1 focus:ring-gray-400;
|
|
}
|
|
|
|
.agpt-shadow-input {
|
|
@apply shadow-sm focus-visible:shadow-md;
|
|
}
|
|
|
|
.agpt-rounded-card {
|
|
@apply rounded-2xl;
|
|
}
|
|
|
|
.agpt-rounded-box {
|
|
@apply rounded-3xl;
|
|
}
|
|
|
|
.agpt-card {
|
|
@apply agpt-rounded-card border border-zinc-300 bg-white p-[1px];
|
|
}
|
|
|
|
.agpt-box {
|
|
@apply agpt-card agpt-rounded-box;
|
|
}
|
|
|
|
.agpt-div {
|
|
@apply border-zinc-200 p-5;
|
|
}
|
|
}
|
|
|
|
@layer utilities {
|
|
.agpt-card-selected {
|
|
@apply border-2 border-accent bg-violet-50/50 p-0;
|
|
}
|
|
}
|
|
|
|
@layer utilities {
|
|
/* TODO: 1. remove unused utility classes */
|
|
/* TODO: 2. fix naming of numbered dimensions so that the number is 4*dimension */
|
|
/* TODO: 3. move to tailwind.config.ts spacing config */
|
|
.h-7\.5 {
|
|
height: 1.1875rem;
|
|
}
|
|
.h-18 {
|
|
height: 4.5rem;
|
|
}
|
|
.h-238 {
|
|
height: 14.875rem;
|
|
}
|
|
.top-158 {
|
|
top: 9.875rem;
|
|
}
|
|
.top-254 {
|
|
top: 15.875rem;
|
|
}
|
|
.top-284 {
|
|
top: 17.75rem;
|
|
}
|
|
.top-360 {
|
|
top: 22.5rem;
|
|
}
|
|
.left-297 {
|
|
left: 18.5625rem;
|
|
}
|
|
.left-34 {
|
|
left: 2.125rem;
|
|
}
|
|
|
|
.text-balance {
|
|
text-wrap: balance;
|
|
}
|
|
}
|
|
|
|
input[type="number"]::-webkit-outer-spin-button,
|
|
input[type="number"]::-webkit-inner-spin-button {
|
|
-webkit-appearance: none;
|
|
margin: 0;
|
|
}
|
|
|
|
input[type="number"] {
|
|
-moz-appearance: textfield;
|
|
}
|
|
|
|
/* Google Drive Picker: ensure picker appears above dialogs and can receive clicks */
|
|
[class*="picker-dialog"] {
|
|
z-index: 10000 !important;
|
|
pointer-events: auto !important;
|
|
}
|
|
|
|
/* When Google picker is open, lower dialog z-index so picker renders on top */
|
|
body[data-google-picker-open="true"] [data-dialog-overlay],
|
|
body[data-google-picker-open="true"] [data-dialog-content] {
|
|
z-index: 1 !important;
|
|
pointer-events: none !important;
|
|
}
|