agentic-drive 0.10.0 → 0.10.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.10.2
4
+
5
+ - Document all public exports and entry points. Check export names against README and llms.txt.
6
+
7
+ ## 0.10.1
8
+
9
+ - Allow `agentic-design` versions 0.8 and 0.9 and `agentic-identity` versions 0.9 and 0.10.
10
+
3
11
  ## 0.10.0
4
12
 
5
13
  ### Added
package/README.md CHANGED
@@ -7,7 +7,7 @@
7
7
 
8
8
  Store, sort, and share files and folders.
9
9
 
10
- > Status: 0.10.0, early. The library, CLI, MCP server, and HTTP API work, with sharing in the SDK, the HTTP API, the CLI, and the MCP server.
10
+ > Status: 0.10.2, early. The library, CLI, MCP server, and HTTP API work, with sharing in the SDK, the HTTP API, the CLI, and the MCP server.
11
11
  > A small web UI works. See [UI](#ui).
12
12
 
13
13
  ## Live demo
@@ -163,6 +163,105 @@ The root export, `agentic-drive`, also exports these names. The package typings
163
163
  The local functions trust their caller. Local data is the trust boundary: anyone who can write the folder
164
164
  can act as any principal in it.
165
165
 
166
+ ## Public exports
167
+
168
+ Each import path below is part of the package. The examples use TypeScript.
169
+ The CLI and MCP are commands, not import paths. The package does not export
170
+ `agentic-drive/cli`, `agentic-drive/mcp`, or an adapters subpath.
171
+
172
+ ### Root: `agentic-drive`
173
+
174
+ ```ts
175
+ import { ROOT_ID, parseName, type SearchQuery } from "agentic-drive";
176
+ const name = parseName("report.txt");
177
+ const query: SearchQuery = { name: name.name };
178
+ console.log(ROOT_ID, query);
179
+ ```
180
+
181
+ The root values are `VERSION` (version), `ROOT_ID` (root id), `ACTOR_KINDS`
182
+ (principal kinds), `createDrive` (drive factory), `DriveError` and `ERROR_STATUS`
183
+ (errors and HTTP statuses), `parseName`, `parseSubject`, `subjectKindOf` (input
184
+ checks), `upload`, `sniffMime`, `DEFAULT_MAX_BYTES` (upload helpers), `buildExport`
185
+ (account ZIP), `readZip` and `writeZip` (stored ZIP entries), `importLegacyLocal`
186
+ (old local data), `AuthError`, `openLocal`, `addPrincipal`, `issueKey`,
187
+ `resolveToken`, `revokeKey`, `revokePrincipal`, `publicNode` (local access),
188
+ `backfillAuthorIds` and `backfillResources` (migrations), and `driveAccount`
189
+ (account plug-in). See Other exports and Features for behavior and limits.
190
+
191
+ Root types: `ActivityAction`, `ActivityEntry`, `Action`, `Actor`, `ActorKind`,
192
+ `Can`, `Ctx`, `Drive`, `DriveDeps`, `ErrorCode`, `Node`, `OnConflict`,
193
+ `UploadOptions`, `SearchQuery`, `BackfillOptions`, `BackfillResult`,
194
+ `DriveAccount`, and `DriveAccountDeps`. They describe activity, callers, drive
195
+ operations, uploads, migrations, and account operations.
196
+
197
+ ### Client: `agentic-drive/client`
198
+
199
+ ```ts
200
+ import { createClient, type ClientOptions } from "agentic-drive/client";
201
+ const options: ClientOptions = { baseUrl: "https://drive.example.com", token: "your-token" };
202
+ const client = createClient(options);
203
+ await client.list("/");
204
+ ```
205
+
206
+ `createClient` makes the HTTP client; `DriveApiError` reports failures. Types:
207
+ `ActivityAction`, `ActivityEntry`, `ErrorCode`, `Node`, `Role`, `OnConflict`,
208
+ `SubjectKind`, `Subject`, `Item`, `PathItem`, `ApiErrorCode`, `ClientErrorCode`,
209
+ `ClientOptions`, `CallOptions`, `UploadBody`, `Downloaded`, and `DriveClient`.
210
+ These describe API data, options, errors, and results.
211
+
212
+ ### Account: `agentic-drive/account`
213
+
214
+ ```ts
215
+ import { driveAccount, type DriveAccountDeps } from "agentic-drive/account";
216
+ // Use the subject's own drive and context.
217
+ async function exportMine(deps: DriveAccountDeps) {
218
+ return driveAccount.exportAccount({ id: "u1", kind: "human" }, deps);
219
+ }
220
+ ```
221
+
222
+ `driveAccount` exports and erases an account. `DriveAccount` describes the plug-in;
223
+ `DriveAccountDeps` describes its drive and caller context.
224
+
225
+ ### Worker: `agentic-drive/worker`
226
+
227
+ ```ts
228
+ import { createApp, type WorkerEnv } from "agentic-drive/worker";
229
+ const app = createApp<WorkerEnv>();
230
+ export default { fetch: app.fetch };
231
+ ```
232
+
233
+ The `default` export is the ready Worker. `createApp` makes an app with optional
234
+ injected ports. `authenticate` resolves a bearer token. `ERROR_STATUS` maps drive
235
+ errors to HTTP statuses. `backfillAuthorIds` and `backfillResources` migrate old
236
+ stores. Types: `ErrorCode`, `Node`, `BackfillOptions`, `BackfillResult`, `WorkerEnv`,
237
+ and `AppOptions` describe errors, items, migrations, bindings, and injected ports.
238
+
239
+ ### UI: `agentic-drive/ui` and `agentic-drive/ui.css`
240
+
241
+ ```ts
242
+ import "agentic-design/styles.css";
243
+ import "agentic-drive/ui.css";
244
+ import { mount, type DriveUiOptions } from "agentic-drive/ui";
245
+ const options: DriveUiOptions = { baseUrl: "https://drive.example.com", getToken: () => "your-token" };
246
+ const view = mount(document.getElementById("drive")!, options);
247
+ view.unmount();
248
+ ```
249
+
250
+ `mount` returns a `MountedDrive` handle. `DriveBrowser` is the React component;
251
+ `DriveUiOptions` is its configuration. The CSS path supplies its styles.
252
+
253
+ ### CLI, MCP, and adapters
254
+
255
+ ```sh
256
+ npx agentic-drive ls /
257
+ npx agentic-drive mcp
258
+ ```
259
+
260
+ The CLI uses `AGENTIC_DRIVE_TOKEN`. The MCP command serves tools over stdio;
261
+ call `drive_ls` with a path. Storage adapters are provided by `agentic-identity`,
262
+ not by a drive subpath. The Quick start shows `createFileStore` and
263
+ `createFileBlobs`; the Worker uses D1 and R2 adapters by default.
264
+
166
265
  ## Account export and erase
167
266
 
168
267
  A host that runs account export and erase across many packages calls `driveAccount` (from `agentic-drive/account`). It has `exportAccount(subject, { drive, ctx })` and `eraseAccount(subject, { drive, ctx })`, so the host does not read the storage layout. `subject` is an id and a kind (`human`, or `agent` with its own identity), and `ctx` is the drive context of that subject. A context for someone else throws `FORBIDDEN`. A bad subject, or a missing `drive` or `ctx`, throws a `TypeError`.
@@ -209,7 +308,7 @@ drive.update({ baseUrl, getToken }); // use another server or callback
209
308
  drive.unmount(); // remove the UI
210
309
  ```
211
310
 
212
- `getToken` returns 1 to 512 letters, digits, `-` or `_`, or `undefined` to send no `authorization` header. A bad `baseUrl` or a `getToken` that is not a function makes `mount` throw a `TypeError`. The server still checks every request against the token. The embed shows files and trash with upload, rename, move, share, and the "Created by agent" label. It has no sign-in form, because your app owns sign-in. It does not change the page address, and it has no theme switch. `agentic-design/styles.css` sets base styles for the whole page, and it follows the dark mode of the system unless your page sets `data-theme`. Add `agentic-design@^0.5.0` to your own dependencies, because your page imports its files. The Worker sends no CORS headers, so the server must be on the origin of your page. Set `baseUrl` to the same address as `DRIVE_PUBLIC_URL`, or the UI refuses its download links. `unmount` and `update` abort the requests that run and stop an upload that has more files to send. The UI keeps the list or grid choice in `localStorage` under `agentic-drive-view`, and it has its own heading for each view. Dialogs, menus, and messages render in `document.body`, outside your element. A click with Ctrl, Cmd, Shift, or the middle button on a folder link does not open the folder. The class names start with `drive-`. The design-system classes start with `agd-`. `DriveBrowser` is the same UI as a React component. It closes its requests when it unmounts. Wrap it in `TooltipProvider` and `ToastProvider` from `agentic-design/react`. `react` and `react-dom` (version 19 or later) are optional peer dependencies. Install them in your project when you use `agentic-drive/ui`. The web UI that the Worker serves uses the same views.
311
+ `getToken` returns 1 to 512 letters, digits, `-` or `_`, or `undefined` to send no `authorization` header. A bad `baseUrl` or a `getToken` that is not a function makes `mount` throw a `TypeError`. The server still checks every request against the token. The embed shows files and trash with upload, rename, move, share, and the "Created by agent" label. It has no sign-in form, because your app owns sign-in. It does not change the page address, and it has no theme switch. `agentic-design/styles.css` sets base styles for the whole page, and it follows the dark mode of the system unless your page sets `data-theme`. Add `agentic-design@">=0.8.0 <0.10.0"` to your own dependencies, because your page imports its files. The Worker sends no CORS headers, so the server must be on the origin of your page. Set `baseUrl` to the same address as `DRIVE_PUBLIC_URL`, or the UI refuses its download links. `unmount` and `update` abort the requests that run and stop an upload that has more files to send. The UI keeps the list or grid choice in `localStorage` under `agentic-drive-view`, and it has its own heading for each view. Dialogs, menus, and messages render in `document.body`, outside your element. A click with Ctrl, Cmd, Shift, or the middle button on a folder link does not open the folder. The class names start with `drive-`. The design-system classes start with `agd-`. `DriveBrowser` is the same UI as a React component. It closes its requests when it unmounts. Wrap it in `TooltipProvider` and `ToastProvider` from `agentic-design/react`. `react` and `react-dom` (version 19 or later) are optional peer dependencies. Install them in your project when you use `agentic-drive/ui`. The web UI that the Worker serves uses the same views.
213
312
 
214
313
  ### Serve the UI from the package
215
314
 
@@ -1,6 +1,6 @@
1
1
  // src/version.ts
2
2
  import { createRequire } from "module";
3
- var VERSION = true ? "0.10.0" : readPackageVersion();
3
+ var VERSION = true ? "0.10.2" : readPackageVersion();
4
4
 
5
5
  export {
6
6
  VERSION
package/dist/cli.js CHANGED
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-AB2RTTHJ.js";
5
5
  import {
6
6
  VERSION
7
- } from "./chunk-NHHBNW64.js";
7
+ } from "./chunk-WOA2S56W.js";
8
8
  import {
9
9
  buildExport,
10
10
  upload
package/dist/index.js CHANGED
@@ -6,7 +6,7 @@ import {
6
6
  } from "./chunk-AB2RTTHJ.js";
7
7
  import {
8
8
  VERSION
9
- } from "./chunk-NHHBNW64.js";
9
+ } from "./chunk-WOA2S56W.js";
10
10
  import {
11
11
  DEFAULT_MAX_BYTES,
12
12
  buildExport,
package/dist/mcp.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  VERSION
3
- } from "./chunk-NHHBNW64.js";
3
+ } from "./chunk-WOA2S56W.js";
4
4
  import {
5
5
  buildExport,
6
6
  upload
package/llms.txt CHANGED
@@ -4,13 +4,7 @@ Store, sort, and share files and folders.
4
4
 
5
5
  Keywords: drive,files,folders,storage,upload,sharing,agents,mcp,cli,r2.
6
6
 
7
- - SDK: import { createDrive } from "agentic-drive".
8
- - Other SDK exports: VERSION, ROOT_ID, ACTOR_KINDS, DEFAULT_MAX_BYTES, sniffMime, parseName, parseSubject, subjectKindOf, DriveError,
9
- readZip, writeZip, AuthError, openLocal, addPrincipal, issueKey, resolveToken, revokeKey, revokePrincipal, publicNode.
10
- See README, "Other exports".
11
- - Remote SDK: import { createClient } from "agentic-drive/client". createClient({ baseUrl, token, fetch?, retries? }) has one method for each bearer route and each shared route (list, stat, mkdir, upload, download, move, trash, restore, purge, search, share, createLink, and more). A failed call throws DriveApiError with code and status. It runs in browsers, Workers, and Node 22.
12
- - Worker: import { createApp } from "agentic-drive/worker". createApp({ store?, blobs?, auth? }) takes an injected Store, Blobs, and auth callback `(request, store, env) => Ctx | null`. Each may be a value or a function of the env. With no options, it uses D1, R2, and bearer tokens from the store. See README, "Inject a store, blobs, and sign-in".
13
- - UI: import { mount } from "agentic-drive/ui"; import "agentic-drive/ui.css" (with agentic-design/styles.css). mount(element, { baseUrl, getToken }) renders the drive (files, trash, upload, share) and returns { update(options), unmount() }. getToken is called before each request and returns a token or undefined. It does not touch the page address or theme. DriveBrowser is the same as a React component. React 19 is an optional peer dependency.
7
+ - SDK: import { createDrive } from "agentic-drive". See the root example below.
14
8
  - CLI: agentic-drive ls /. Needs a principal: set AGENTIC_DRIVE_TOKEN (or --token) to an API key. Make one with `principal add <id> [--of <person>]` and `key issue <id>`. No key, or a revoked key, exits 3.
15
9
  - MCP: run agentic-drive mcp, then call drive_ls.
16
10
 
@@ -18,3 +12,112 @@ Keywords: drive,files,folders,storage,upload,sharing,agents,mcp,cli,r2.
18
12
 
19
13
  - README: https://github.com/pooriaarab/agentic-drive
20
14
  - License: MIT
15
+
16
+ ## Public exports and usage
17
+
18
+ Each import path below is part of the package. The examples use TypeScript.
19
+ The CLI and MCP are commands, not import paths. The package does not export
20
+ `agentic-drive/cli`, `agentic-drive/mcp`, or an adapters subpath.
21
+
22
+ ### Root: `agentic-drive`
23
+
24
+ ```ts
25
+ import { ROOT_ID, parseName, type SearchQuery } from "agentic-drive";
26
+ const name = parseName("report.txt");
27
+ const query: SearchQuery = { name: name.name };
28
+ console.log(ROOT_ID, query);
29
+ ```
30
+
31
+ The root values are `VERSION` (version), `ROOT_ID` (root id), `ACTOR_KINDS`
32
+ (principal kinds), `createDrive` (drive factory), `DriveError` and `ERROR_STATUS`
33
+ (errors and HTTP statuses), `parseName`, `parseSubject`, `subjectKindOf` (input
34
+ checks), `upload`, `sniffMime`, `DEFAULT_MAX_BYTES` (upload helpers), `buildExport`
35
+ (account ZIP), `readZip` and `writeZip` (stored ZIP entries), `importLegacyLocal`
36
+ (old local data), `AuthError`, `openLocal`, `addPrincipal`, `issueKey`,
37
+ `resolveToken`, `revokeKey`, `revokePrincipal`, `publicNode` (local access),
38
+ `backfillAuthorIds` and `backfillResources` (migrations), and `driveAccount`
39
+ (account plug-in). See README for behavior and limits.
40
+
41
+ Root types: `ActivityAction`, `ActivityEntry`, `Action`, `Actor`, `ActorKind`,
42
+ `Can`, `Ctx`, `Drive`, `DriveDeps`, `ErrorCode`, `Node`, `OnConflict`,
43
+ `UploadOptions`, `SearchQuery`, `BackfillOptions`, `BackfillResult`,
44
+ `DriveAccount`, and `DriveAccountDeps`. They describe activity, callers, drive
45
+ operations, uploads, migrations, and account operations.
46
+
47
+ ### Client: `agentic-drive/client`
48
+
49
+ ```ts
50
+ import { createClient, type ClientOptions } from "agentic-drive/client";
51
+ const options: ClientOptions = { baseUrl: "https://drive.example.com", token: "your-token" };
52
+ const client = createClient(options);
53
+ await client.list("/");
54
+ ```
55
+
56
+ `createClient` makes the HTTP client; `DriveApiError` reports failures. Types:
57
+ `ActivityAction`, `ActivityEntry`, `ErrorCode`, `Node`, `Role`, `OnConflict`,
58
+ `SubjectKind`, `Subject`, `Item`, `PathItem`, `ApiErrorCode`, `ClientErrorCode`,
59
+ `ClientOptions`, `CallOptions`, `UploadBody`, `Downloaded`, and `DriveClient`.
60
+ These describe API data, options, errors, and results. The client runs in browsers,
61
+ Workers, and Node 22. It has a method for each bearer and shared route.
62
+ `DriveApiError` carries `code` and `status`. Client options also accept
63
+ a `fetch` function and a `retries` count for reads.
64
+
65
+ ### Account: `agentic-drive/account`
66
+
67
+ ```ts
68
+ import { driveAccount, type DriveAccountDeps } from "agentic-drive/account";
69
+ // Use the subject's own drive and context.
70
+ async function exportMine(deps: DriveAccountDeps) {
71
+ return driveAccount.exportAccount({ id: "u1", kind: "human" }, deps);
72
+ }
73
+ ```
74
+
75
+ `driveAccount` exports and erases an account. `DriveAccount` describes the plug-in;
76
+ `DriveAccountDeps` describes its drive and caller context.
77
+
78
+ ### Worker: `agentic-drive/worker`
79
+
80
+ ```ts
81
+ import { createApp, type WorkerEnv } from "agentic-drive/worker";
82
+ const app = createApp<WorkerEnv>();
83
+ export default { fetch: app.fetch };
84
+ ```
85
+
86
+ The `default` export is the ready Worker. `createApp` makes an app with optional
87
+ injected ports. `authenticate` resolves a bearer token. `ERROR_STATUS` maps drive
88
+ errors to HTTP statuses. `backfillAuthorIds` and `backfillResources` migrate old
89
+ stores. Types: `ErrorCode`, `Node`, `BackfillOptions`, `BackfillResult`, `WorkerEnv`,
90
+ and `AppOptions` describe errors, items, migrations, bindings, and injected ports.
91
+ The `store`, `blobs`, and `auth` options each accept a value or a function of
92
+ the env. The auth callback has the signature `(request, store, env) => Ctx | null`
93
+ or returns a Promise of that result. With no options, the Worker uses bearer
94
+ tokens from the store.
95
+
96
+ ### UI: `agentic-drive/ui` and `agentic-drive/ui.css`
97
+
98
+ ```ts
99
+ import "agentic-design/styles.css";
100
+ import "agentic-drive/ui.css";
101
+ import { mount, type DriveUiOptions } from "agentic-drive/ui";
102
+ const options: DriveUiOptions = { baseUrl: "https://drive.example.com", getToken: () => "your-token" };
103
+ const view = mount(document.getElementById("drive")!, options);
104
+ view.unmount();
105
+ ```
106
+
107
+ `mount` returns a `MountedDrive` handle. `DriveBrowser` is the React component;
108
+ `DriveUiOptions` is its configuration. The CSS path supplies its styles. The handle
109
+ has `update` and `unmount` methods. The `getToken` callback runs before each request
110
+ and may return undefined. The UI does not change the page address or theme.
111
+ React 19 and React DOM 19 are optional peer dependencies.
112
+
113
+ ### CLI, MCP, and adapters
114
+
115
+ ```sh
116
+ npx agentic-drive ls /
117
+ npx agentic-drive mcp
118
+ ```
119
+
120
+ The CLI uses `AGENTIC_DRIVE_TOKEN`. The MCP command serves tools over stdio;
121
+ call `drive_ls` with a path. Storage adapters are provided by `agentic-identity`,
122
+ not by a drive subpath. For example: `import { createFileStore, createFileBlobs } from "agentic-identity/file"`;
123
+ pass `createFileStore({ path: "./data/db" })` and `createFileBlobs({ dir: "./data/blobs" })` to `createDrive`. The Worker uses D1 and R2 adapters by default.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentic-drive",
3
- "version": "0.10.0",
3
+ "version": "0.10.2",
4
4
  "description": "Store, sort, and share files and folders.",
5
5
  "keywords": [
6
6
  "drive",
@@ -78,8 +78,8 @@
78
78
  },
79
79
  "dependencies": {
80
80
  "@modelcontextprotocol/sdk": "^1.12.0",
81
- "agentic-design": "^0.5.0",
82
- "agentic-identity": "^0.9.0",
81
+ "agentic-design": ">=0.8.0 <0.10.0",
82
+ "agentic-identity": ">=0.9.0 <0.11.0",
83
83
  "hono": "^4.13.14",
84
84
  "zod": "^4.6.6"
85
85
  },
@@ -0,0 +1 @@
1
+ @font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2) format("woff2-variations");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/inter-latin-wght-normal-Dx4kXJAl.woff2) format("woff2-variations");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url(/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2) format("woff2-variations");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url(/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2) format("woff2-variations");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}:root,[data-theme=light]{color-scheme:light;--agd-color-bg: #FAFAFA;--agd-color-surface: #FFFFFF;--agd-color-surface-raised: #FFFFFF;--agd-color-surface-sunken: #F4F4F5;--agd-color-surface-hover: #ECECEE;--agd-color-text: #1D1D20;--agd-color-text-muted: #52525B;--agd-color-text-on-accent: #FFFFFF;--agd-color-border: #E4E4E7;--agd-color-border-strong: #82828B;--agd-color-accent: #4F46E5;--agd-color-accent-hover: #4338CA;--agd-color-accent-subtle: #EEF0FF;--agd-color-accent-text: #4338CA;--agd-color-agent: #8E2C86;--agd-color-agent-subtle: #F7E8F5;--agd-color-agent-text: #7A2273;--agd-color-danger: #B42318;--agd-color-danger-subtle: #FDECEA;--agd-color-danger-text: #A11D14;--agd-color-warning: #92520A;--agd-color-warning-subtle: #FDF1DC;--agd-color-warning-text: #7A4208;--agd-color-success: #1B6B3A;--agd-color-success-subtle: #E6F5EC;--agd-color-success-text: #175C32;--agd-color-focus: #4F46E5;--agd-color-scrim: rgb(24 24 27 / .32);--agd-shadow-raised: 0 1px 2px rgb(24 24 27 / .04), 0 2px 8px rgb(24 24 27 / .05);--agd-shadow-floating: 0 2px 4px rgb(24 24 27 / .04), 0 8px 24px rgb(24 24 27 / .1)}:root{--agd-space-1: .25rem;--agd-space-2: .5rem;--agd-space-3: .75rem;--agd-space-4: 1rem;--agd-space-6: 1.5rem;--agd-space-8: 2rem;--agd-space-12: 3rem;--agd-space-16: 4rem;--agd-space-24: 6rem;--agd-radius-sm: .25rem;--agd-radius-md: .5rem;--agd-radius-lg: 1rem;--agd-radius-full: 9999px;--agd-font-family-sans: "Inter Variable", ui-sans-serif, system-ui, sans-serif;--agd-font-family-mono: "JetBrains Mono Variable", ui-monospace, "SF Mono", Menlo, monospace;--agd-font-size-xs: .75rem;--agd-font-size-sm: .875rem;--agd-font-size-md: 1rem;--agd-font-size-lg: 1.125rem;--agd-font-size-xl: 1.375rem;--agd-font-size-2xl: 1.75rem;--agd-line-height-tight: 1.25;--agd-line-height-snug: 1.4;--agd-line-height-normal: 1.55;--agd-font-weight-regular: 400;--agd-font-weight-medium: 500;--agd-font-weight-semibold: 600;--agd-duration-fast: .1s;--agd-duration-base: .16s;--agd-duration-slow: .24s;--agd-easing-out: cubic-bezier(.16, 1, .3, 1);--agd-size-control: 2.25rem;--agd-size-control-touch: 2.75rem;--agd-size-sidebar: 16rem;--agd-size-sidebar-rail: 3.5rem;--agd-size-panel: 20rem;--agd-size-topbar: 3rem;--agd-size-content: 46rem}@media(prefers-color-scheme:dark){:root:not([data-theme]){color-scheme:dark;--agd-color-bg: #151517;--agd-color-surface: #1B1B1E;--agd-color-surface-raised: #232326;--agd-color-surface-sunken: #101012;--agd-color-surface-hover: #2C2C31;--agd-color-text: #ECECEE;--agd-color-text-muted: #A1A1AA;--agd-color-text-on-accent: #14142E;--agd-color-border: #2C2C31;--agd-color-border-strong: #7E7E88;--agd-color-accent: #90A4FF;--agd-color-accent-hover: #A9B8FF;--agd-color-accent-subtle: #26264F;--agd-color-accent-text: #C3CDFF;--agd-color-agent: #E49BDC;--agd-color-agent-subtle: #3A1F37;--agd-color-agent-text: #F0B8E9;--agd-color-danger: #F2877D;--agd-color-danger-subtle: #3B1A17;--agd-color-danger-text: #F8A39B;--agd-color-warning: #E8B04A;--agd-color-warning-subtle: #3A2A0F;--agd-color-warning-text: #F0C677;--agd-color-success: #6FCF97;--agd-color-success-subtle: #14301F;--agd-color-success-text: #8BDBAC;--agd-color-focus: #A9B8FF;--agd-color-scrim: rgb(0 0 0 / .6);--agd-shadow-raised: 0 1px 2px rgb(0 0 0 / .3), 0 2px 16px rgb(0 0 0 / .3);--agd-shadow-floating: 0 2px 6px rgb(0 0 0 / .3), 0 8px 40px rgb(0 0 0 / .5)}}[data-theme=dark]{color-scheme:dark;--agd-color-bg: #151517;--agd-color-surface: #1B1B1E;--agd-color-surface-raised: #232326;--agd-color-surface-sunken: #101012;--agd-color-surface-hover: #2C2C31;--agd-color-text: #ECECEE;--agd-color-text-muted: #A1A1AA;--agd-color-text-on-accent: #14142E;--agd-color-border: #2C2C31;--agd-color-border-strong: #7E7E88;--agd-color-accent: #90A4FF;--agd-color-accent-hover: #A9B8FF;--agd-color-accent-subtle: #26264F;--agd-color-accent-text: #C3CDFF;--agd-color-agent: #E49BDC;--agd-color-agent-subtle: #3A1F37;--agd-color-agent-text: #F0B8E9;--agd-color-danger: #F2877D;--agd-color-danger-subtle: #3B1A17;--agd-color-danger-text: #F8A39B;--agd-color-warning: #E8B04A;--agd-color-warning-subtle: #3A2A0F;--agd-color-warning-text: #F0C677;--agd-color-success: #6FCF97;--agd-color-success-subtle: #14301F;--agd-color-success-text: #8BDBAC;--agd-color-focus: #A9B8FF;--agd-color-scrim: rgb(0 0 0 / .6);--agd-shadow-raised: 0 1px 2px rgb(0 0 0 / .3), 0 2px 16px rgb(0 0 0 / .3);--agd-shadow-floating: 0 2px 6px rgb(0 0 0 / .3), 0 8px 40px rgb(0 0 0 / .5)}@media(prefers-reduced-motion:reduce){:root{--agd-duration-fast: .01ms;--agd-duration-base: .01ms;--agd-duration-slow: .01ms}}*,*:before,*:after{box-sizing:border-box}html{-webkit-text-size-adjust:100%;text-size-adjust:100%}body{margin:0;background:var(--agd-color-bg);color:var(--agd-color-text);font-family:var(--agd-font-family-sans);font-size:var(--agd-font-size-sm);line-height:var(--agd-line-height-normal);font-feature-settings:"cv11","ss03";-webkit-font-smoothing:antialiased}h1,h2,h3,h4{margin:0;line-height:var(--agd-line-height-tight);font-weight:var(--agd-font-weight-semibold);text-wrap:balance}h1{font-size:var(--agd-font-size-2xl);letter-spacing:-.015em}h2{font-size:var(--agd-font-size-xl);letter-spacing:-.01em}h3{font-size:var(--agd-font-size-lg)}h4{font-size:var(--agd-font-size-md)}p{margin:0;text-wrap:pretty}a{color:var(--agd-color-accent-text);text-underline-offset:.2em}code,kbd,pre{font-family:var(--agd-font-family-mono);font-size:.9em}:focus-visible{outline:2px solid var(--agd-color-focus);outline-offset:2px}::selection{background:var(--agd-color-accent-subtle);color:var(--agd-color-accent-text)}.agd-sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}.agd-skip-link{position:absolute;inset-block-start:var(--agd-space-2);inset-inline-start:var(--agd-space-2);z-index:100;padding:var(--agd-space-2) var(--agd-space-4);border-radius:var(--agd-radius-md);background:var(--agd-color-surface-raised);color:var(--agd-color-text);box-shadow:var(--agd-shadow-floating);transform:translateY(-200%)}.agd-skip-link:focus{transform:none}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;scroll-behavior:auto!important;transition-duration:.01ms!important}}:root{--agd-control-h: var(--agd-size-control)}@media(pointer:coarse){:root{--agd-control-h: var(--agd-size-control-touch)}}.agd-button{--button-bg: var(--agd-color-surface);--button-bg-hover: var(--agd-color-surface-hover);--button-bg-active: var(--agd-color-surface-sunken);--button-fg: var(--agd-color-text);--button-border: var(--agd-color-border);display:inline-flex;align-items:center;justify-content:center;gap:var(--agd-space-2);min-height:var(--agd-control-h);padding:0 var(--agd-space-4);border:1px solid var(--button-border);border-radius:var(--agd-radius-md);background:var(--button-bg);color:var(--button-fg);font:inherit;font-weight:var(--agd-font-weight-medium);line-height:1;white-space:nowrap;cursor:pointer;transition:background-color var(--agd-duration-fast) var(--agd-easing-out)}.agd-button:hover{background:var(--button-bg-hover)}.agd-button:active{background:var(--button-bg-active)}.agd-button--sm{min-height:1.75rem;padding:0 var(--agd-space-3);font-size:var(--agd-font-size-xs)}@media(pointer:coarse){.agd-button--sm{min-height:var(--agd-control-h)}}.agd-button--primary{--button-bg: var(--agd-color-accent);--button-bg-hover: var(--agd-color-accent-hover);--button-bg-active: var(--agd-color-accent-hover);--button-fg: var(--agd-color-text-on-accent);--button-border: transparent}.agd-button--ghost{--button-bg: transparent;--button-border: transparent}.agd-button--danger{--button-bg-hover: var(--agd-color-danger-subtle);--button-bg-active: var(--agd-color-danger-subtle);--button-fg: var(--agd-color-danger-text);--button-border: var(--agd-color-border)}.agd-button:disabled{--button-bg: var(--agd-color-surface-sunken);--button-bg-hover: var(--agd-color-surface-sunken);--button-fg: var(--agd-color-text-muted);--button-border: var(--agd-color-border);border-style:dashed;cursor:not-allowed}.agd-button[aria-busy=true]{cursor:progress}.agd-icon-button{width:var(--agd-control-h);padding:0}.agd-icon-button.agd-button--sm{width:1.75rem}@media(pointer:coarse){.agd-icon-button.agd-button--sm{width:var(--agd-control-h)}}.agd-spinner{width:1em;height:1em;border:2px solid currentColor;border-right-color:transparent;border-radius:50%;animation:agd-spin .7s linear infinite}@keyframes agd-spin{to{transform:rotate(360deg)}}.agd-field{display:grid;gap:var(--agd-space-1)}.agd-field__label{font-weight:var(--agd-font-weight-medium)}.agd-field__hint{color:var(--agd-color-text-muted);font-size:var(--agd-font-size-xs)}.agd-field__error{display:flex;align-items:flex-start;gap:var(--agd-space-1);color:var(--agd-color-danger-text);font-size:var(--agd-font-size-xs)}.agd-field__error svg{flex:none;margin-top:-.1em}.agd-input{width:100%;min-height:var(--agd-control-h);padding:0 var(--agd-space-3);border:1px solid var(--agd-color-border-strong);border-radius:var(--agd-radius-md);background:var(--agd-color-surface);color:var(--agd-color-text);font:inherit}.agd-input::placeholder{color:var(--agd-color-text-muted);opacity:1}.agd-input:hover:not(:disabled){background:var(--agd-color-surface-sunken)}.agd-input[aria-invalid=true]{border-color:var(--agd-color-danger);box-shadow:inset 0 0 0 1px var(--agd-color-danger)}.agd-input:disabled{background:var(--agd-color-surface-sunken);border-color:var(--agd-color-border);color:var(--agd-color-text-muted);cursor:not-allowed}.agd-textarea{min-height:5rem;padding:var(--agd-space-2) var(--agd-space-3);resize:vertical}.agd-select{position:relative;display:block}.agd-select select{appearance:none;padding-inline-end:var(--agd-space-8);cursor:pointer}.agd-select:after{content:"";position:absolute;inset-inline-end:var(--agd-space-3);inset-block-start:50%;width:.45rem;height:.45rem;border:solid var(--agd-color-text-muted);border-width:0 2px 2px 0;transform:translateY(-75%) rotate(45deg);pointer-events:none}.agd-toggle{display:grid;gap:var(--agd-space-1)}.agd-toggle__row{display:flex;align-items:center;gap:var(--agd-space-3);min-height:var(--agd-control-h);cursor:pointer}.agd-checkbox,.agd-switch{appearance:none;flex:none;margin:0;border:1px solid var(--agd-color-border-strong);background:var(--agd-color-surface);cursor:pointer;transition:background-color var(--agd-duration-fast) var(--agd-easing-out)}.agd-checkbox{display:grid;place-items:center;width:1.25rem;height:1.25rem;border-radius:var(--agd-radius-sm)}.agd-checkbox:before{content:"";width:.75rem;height:.75rem;background:var(--agd-color-text-on-accent);clip-path:polygon(14% 52%,0 66%,38% 100%,100% 20%,86% 8%,38% 72%);transform:scale(0);transition:transform var(--agd-duration-fast) var(--agd-easing-out)}.agd-checkbox:checked{background:var(--agd-color-accent);border-color:var(--agd-color-accent)}.agd-checkbox:checked:before{transform:scale(1)}.agd-switch{position:relative;width:2.25rem;height:1.375rem;border-radius:var(--agd-radius-full);background:var(--agd-color-surface-sunken)}.agd-switch:before{content:"";position:absolute;inset-block-start:50%;inset-inline-start:.2rem;width:.875rem;height:.875rem;border-radius:var(--agd-radius-full);background:var(--agd-color-text-muted);transform:translateY(-50%);transition:inset-inline-start var(--agd-duration-base) var(--agd-easing-out)}.agd-switch:checked{background:var(--agd-color-accent);border-color:var(--agd-color-accent)}.agd-switch:checked:before{background:var(--agd-color-text-on-accent);inset-inline-start:calc(100% - 1.075rem)}.agd-checkbox:disabled,.agd-switch:disabled{background:var(--agd-color-surface-sunken);border-color:var(--agd-color-border);cursor:not-allowed}.agd-checkbox:disabled:before{background:var(--agd-color-text-muted)}.agd-switch:disabled:before{background:var(--agd-color-border)}@keyframes agd-fade-in{0%{opacity:0}}@keyframes agd-pop-in{0%{opacity:0;scale:.97}}.agd-overlay{position:fixed;z-index:50;inset:0;background:var(--agd-color-scrim);animation:agd-fade-in var(--agd-duration-base) var(--agd-easing-out)}.agd-dialog{position:fixed;z-index:50;inset:0;margin:auto;width:min(32rem,calc(100vw - 2rem));height:fit-content;max-height:calc(100vh - 2rem);overflow:auto;padding:var(--agd-space-8);border:1px solid var(--agd-color-border);border-radius:var(--agd-radius-lg);background:var(--agd-color-surface-raised);box-shadow:var(--agd-shadow-floating);animation:agd-pop-in var(--agd-duration-base) var(--agd-easing-out)}.agd-dialog__title{padding-inline-end:var(--agd-space-8);font-size:var(--agd-font-size-lg)}.agd-dialog__description{margin-top:var(--agd-space-2);color:var(--agd-color-text-muted)}.agd-dialog__body{margin-top:var(--agd-space-4)}.agd-dialog__footer{display:flex;justify-content:flex-end;gap:var(--agd-space-2);margin-top:var(--agd-space-8)}.agd-dialog__close{position:absolute;inset-block-start:var(--agd-space-3);inset-inline-end:var(--agd-space-3)}.agd-tooltip{z-index:60;max-width:16rem;padding:var(--agd-space-1) var(--agd-space-2);border-radius:var(--agd-radius-sm);background:var(--agd-color-text);color:var(--agd-color-bg);font-size:var(--agd-font-size-xs);animation:agd-fade-in var(--agd-duration-fast) var(--agd-easing-out)}.agd-menu{z-index:60;min-width:11rem;padding:var(--agd-space-2);border:1px solid var(--agd-color-border);border-radius:var(--agd-radius-lg);background:var(--agd-color-surface-raised);box-shadow:var(--agd-shadow-floating);animation:agd-pop-in var(--agd-duration-fast) var(--agd-easing-out)}.agd-menu__item{display:flex;align-items:center;gap:var(--agd-space-2);min-height:var(--agd-control-h);padding:0 var(--agd-space-3);border-radius:var(--agd-radius-md);color:var(--agd-color-text);cursor:pointer;outline:none;-webkit-user-select:none;user-select:none}.agd-menu__item[data-highlighted]{background:var(--agd-color-surface-hover)}.agd-menu__item[data-highlighted]:focus-visible,.agd-menu__item:focus-visible{outline:2px solid var(--agd-color-focus);outline-offset:-2px}.agd-menu__item[data-disabled]{color:var(--agd-color-text-muted);cursor:not-allowed}.agd-menu__item--danger{color:var(--agd-color-danger-text)}.agd-menu__shortcut{margin-inline-start:auto;color:var(--agd-color-text-muted);font-size:var(--agd-font-size-xs)}.agd-menu__separator{height:1px;margin:var(--agd-space-1) 0;background:var(--agd-color-border)}.agd-toast-viewport{position:fixed;inset-block-end:var(--agd-space-4);inset-inline-end:var(--agd-space-4);z-index:70;display:grid;gap:var(--agd-space-2);width:min(24rem,calc(100vw - 2rem));margin:0;padding:0;list-style:none}.agd-toast{display:grid;grid-template-columns:auto 1fr auto;align-items:start;gap:var(--agd-space-3);padding:var(--agd-space-3) var(--agd-space-3) var(--agd-space-3) var(--agd-space-4);border:1px solid var(--agd-color-border);border-radius:var(--agd-radius-md);background:var(--agd-color-surface-raised);box-shadow:var(--agd-shadow-floating)}.agd-toast[data-state=open]{animation:agd-pop-in var(--agd-duration-base) var(--agd-easing-out)}.agd-toast__icon{margin-top:var(--agd-space-1)}.agd-toast--info .agd-toast__icon{color:var(--agd-color-accent)}.agd-toast--success .agd-toast__icon{color:var(--agd-color-success)}.agd-toast--warning .agd-toast__icon{color:var(--agd-color-warning)}.agd-toast--danger .agd-toast__icon{color:var(--agd-color-danger)}.agd-toast__title{font-weight:var(--agd-font-weight-medium)}.agd-toast__description{margin-top:var(--agd-space-1);color:var(--agd-color-text-muted)}.agd-tabs__list{display:flex;gap:var(--agd-space-1);border-bottom:1px solid var(--agd-color-border)}.agd-tabs__trigger{position:relative;min-height:var(--agd-control-h);padding:0 var(--agd-space-3);border:0;background:transparent;color:var(--agd-color-text-muted);font:inherit;cursor:pointer}.agd-tabs__trigger:hover{color:var(--agd-color-text)}.agd-tabs__trigger[data-state=active]{color:var(--agd-color-text);font-weight:var(--agd-font-weight-semibold)}.agd-tabs__trigger[data-state=active]:after{content:"";position:absolute;inset:auto var(--agd-space-3) -1px;height:2px;background:var(--agd-color-accent)}.agd-tabs__panel{padding-top:var(--agd-space-4)}.agd-shell{display:grid;grid-template-columns:var(--agd-size-sidebar) minmax(0,1fr);grid-template-rows:auto 1fr;grid-template-areas:"sidebar topbar" "sidebar content";min-height:100vh}.agd-shell__sidebar{grid-area:sidebar;display:flex;flex-direction:column;gap:var(--agd-space-4);padding:var(--agd-space-4) var(--agd-space-3);border-inline-end:1px solid var(--agd-color-border);background:var(--agd-color-surface-sunken)}.agd-shell__brand{margin:0;font-weight:var(--agd-font-weight-semibold)}.agd-shell__topbar{grid-area:topbar;display:flex;align-items:center;gap:var(--agd-space-3);min-height:var(--agd-size-topbar);padding:0 var(--agd-space-6);border-bottom:1px solid var(--agd-color-border);background:var(--agd-color-bg)}.agd-shell__title{min-width:0;flex:0 1 auto}.agd-shell__actions,.agd-shell__secondary{display:flex;align-items:center;gap:var(--agd-space-4)}.agd-shell__actions{margin-inline-start:auto}.agd-shell__more{display:none}.agd-shell__content{grid-area:content;min-width:0;padding:var(--agd-space-8) var(--agd-space-6) var(--agd-space-24);outline:none}.agd-shell__menu{display:none}.agd-shell[data-panel]{grid-template-rows:auto 1fr auto;grid-template-areas:"sidebar topbar" "sidebar content" "sidebar panel"}@media(min-width:64rem){.agd-shell[data-panel]{grid-template-columns:var(--agd-size-sidebar) minmax(0,1fr) var(--agd-size-panel);grid-template-rows:auto 1fr;grid-template-areas:"sidebar topbar topbar" "sidebar content panel"}}.agd-shell__panel{grid-area:panel;min-width:0;padding:var(--agd-space-6) var(--agd-space-4);border-block-start:1px solid var(--agd-color-border);background:var(--agd-color-surface-sunken)}@media(min-width:64rem){.agd-shell__panel{border-block-start:0;border-inline-start:1px solid var(--agd-color-border)}}@media(max-width:47.99rem){.agd-shell{grid-template-columns:minmax(0,1fr);grid-template-rows:auto auto 1fr;grid-template-areas:"topbar" "sidebar" "content"}.agd-shell__menu{display:inline-flex}.agd-shell[data-panel]{grid-template-columns:minmax(0,1fr);grid-template-rows:auto auto 1fr auto;grid-template-areas:"topbar" "sidebar" "content" "panel"}.agd-shell__sidebar[data-open=false]{display:none}.agd-shell__sidebar{border-inline-end:0;border-bottom:1px solid var(--agd-color-border)}.agd-shell__topbar,.agd-shell__content{padding-inline:var(--agd-space-4)}.agd-shell__topbar{flex-wrap:wrap;gap:var(--agd-space-2) var(--agd-space-3);padding-block:var(--agd-space-2)}.agd-shell__brand{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:var(--agd-space-1);margin:calc(var(--agd-space-1) * -1)}.agd-shell__title{flex:1 1 8rem;overflow-wrap:anywhere}.agd-shell__actions{flex-wrap:wrap;gap:var(--agd-space-2) var(--agd-space-3);min-width:0}.agd-shell__more{display:inline-flex}.agd-shell__secondary{flex:1 0 100%;justify-content:flex-end}.agd-shell__secondary[data-open=false]:not(:focus-within){display:none}}.agd-sidebar-nav{display:grid;gap:var(--agd-space-1);margin:0;padding:0;list-style:none}.agd-sidebar-nav__link{display:flex;align-items:center;gap:var(--agd-space-2);min-height:var(--agd-control-h);padding:0 var(--agd-space-3);border-radius:var(--agd-radius-md);color:var(--agd-color-text);text-decoration:none}.agd-sidebar-nav__link:hover{background:var(--agd-color-surface-hover)}.agd-sidebar-nav__link[aria-current=page]{background:var(--agd-color-accent-subtle);color:var(--agd-color-accent-text);font-weight:var(--agd-font-weight-semibold)}.agd-toolbar{display:inline-flex;align-items:center;gap:var(--agd-space-1);padding:var(--agd-space-1);border:1px solid var(--agd-color-border);border-radius:var(--agd-radius-md);background:var(--agd-color-surface)}.agd-toolbar__separator{align-self:stretch;width:1px;margin:var(--agd-space-1);background:var(--agd-color-border)}.agd-toolbar__group{display:inline-flex;align-items:center;gap:var(--agd-space-1)}.agd-button[aria-pressed=true]{box-shadow:inset 0 0 0 1px var(--button-border);font-weight:var(--agd-font-weight-semibold);--button-bg: var(--agd-color-accent-subtle);--button-bg-hover: var(--agd-color-accent-subtle);--button-fg: var(--agd-color-accent-text);--button-border: var(--agd-color-accent)}.agd-empty{display:grid;justify-items:center;gap:var(--agd-space-3);padding:var(--agd-space-12) var(--agd-space-6);text-align:center}.agd-empty__title{font-size:var(--agd-font-size-lg)}.agd-empty__description{max-width:28rem;color:var(--agd-color-text-muted)}.agd-files{margin:0;padding:0;list-style:none;border-top:1px solid var(--agd-color-border)}.agd-file-row{display:grid;grid-template-columns:auto minmax(0,1fr) auto auto auto;align-items:center;gap:var(--agd-space-4);min-height:3rem;padding:var(--agd-space-1) var(--agd-space-2);border-bottom:1px solid var(--agd-color-border)}.agd-file-row:hover{background:var(--agd-color-surface-sunken)}.agd-file-row__icon{display:inline-flex;color:var(--agd-color-text-muted)}.agd-file-row__name{min-height:1.5rem;overflow:hidden;color:var(--agd-color-text);font-weight:var(--agd-font-weight-medium);text-overflow:ellipsis;white-space:nowrap}.agd-file-row__meta,.agd-file-row__time{display:inline-flex;align-items:center;gap:var(--agd-space-2);color:var(--agd-color-text-muted);font-size:var(--agd-font-size-xs)}.agd-file-row__actions{display:inline-flex}@media(max-width:47.99rem){.agd-file-row{grid-template-columns:auto minmax(0,1fr) auto;grid-template-areas:"icon name actions" ". meta meta" ". time time"}.agd-file-row__icon{grid-area:icon}.agd-file-row__name{grid-area:name}.agd-file-row__meta{grid-area:meta}.agd-file-row__time{grid-area:time}.agd-file-row__actions{grid-area:actions}}.agd-filetable{width:100%;table-layout:fixed;border-collapse:collapse;border-top:1px solid var(--agd-color-border)}.agd-filetable th,.agd-filetable td{padding:var(--agd-space-1) var(--agd-space-3);border-bottom:1px solid var(--agd-color-border);text-align:start;vertical-align:middle}.agd-filetable th{color:var(--agd-color-text-muted);font-size:var(--agd-font-size-xs);font-weight:var(--agd-font-weight-semibold)}.agd-filetable th:nth-child(1){width:36%}.agd-filetable th:nth-child(2){width:36%}.agd-filetable th:nth-child(3){width:16%}.agd-filetable th:nth-child(4){width:12%}.agd-filetable td{height:3rem}.agd-filetable td:first-child{overflow:hidden}.agd-filetable .agd-chip{flex-wrap:wrap;row-gap:0}.agd-filetable tbody tr:hover{background:var(--agd-color-surface-sunken)}.agd-filetable__sort{display:inline-flex;align-items:center;gap:var(--agd-space-1);min-height:var(--agd-control-h);padding:0 var(--agd-space-2);border:0;border-radius:var(--agd-radius-md);background:none;color:inherit;font:inherit;cursor:pointer}.agd-filetable__sort:hover{background:var(--agd-color-surface-hover)}.agd-filetable__arrow{display:inline-block;min-width:1ch}.agd-filetable__name{display:flex;align-items:center;gap:var(--agd-space-3);min-width:0}.agd-filetable__name .agd-file-row__name{min-width:0;flex:1 1 auto}.agd-filetable td:has(.agd-skeleton){padding-block:var(--agd-space-3)}.agd-filegrid-wrap{display:grid;gap:var(--agd-space-4)}.agd-filegrid-wrap>.agd-field{max-width:16rem}.agd-filegrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(14rem,1fr));gap:var(--agd-space-4);margin:0;padding:0;list-style:none}.agd-filegrid__item{display:grid;align-content:start;gap:var(--agd-space-2);min-height:7rem;padding:var(--agd-space-3);border:1px solid var(--agd-color-border);border-radius:var(--agd-radius-md);background:var(--agd-color-surface)}.agd-filegrid__head{display:flex;align-items:center;gap:var(--agd-space-2);min-width:0}.agd-filegrid__item .agd-file-row__actions{justify-self:end}.agd-skeleton{display:block;height:1rem;border-radius:var(--agd-radius-sm);background:var(--agd-color-surface-hover);animation:agd-pulse 1.4s ease-in-out infinite}.agd-filegrid__item.agd-skeleton{height:auto;min-height:7rem;border:1px solid var(--agd-color-border);border-radius:var(--agd-radius-md)}@keyframes agd-pulse{50%{opacity:.5}}@media(max-width:47.99rem){.agd-filetable,.agd-filetable tbody,.agd-filetable tr,.agd-filetable thead{display:block}.agd-filetable thead tr{display:flex;flex-wrap:wrap}.agd-filetable thead th:last-child{display:none}.agd-filetable thead th{width:auto}.agd-filetable tbody tr{display:grid;grid-template-columns:minmax(0,1fr) auto;grid-template-areas:"name actions" "owner owner" "time time";padding-block:var(--agd-space-1);border-bottom:1px solid var(--agd-color-border)}.agd-filetable tbody td{padding:var(--agd-space-1) var(--agd-space-3);border-bottom:0}.agd-filetable tbody td:nth-child(1){grid-area:name}.agd-filetable tbody td:nth-child(2){grid-area:owner}.agd-filetable tbody td:nth-child(3){grid-area:time}.agd-filetable tbody td:nth-child(4){grid-area:actions}}.agd-avatar{display:inline-grid;flex:none;place-items:center;width:1.5rem;height:1.5rem;border:1px solid var(--agd-color-border-strong);background:var(--agd-color-surface-sunken);color:var(--agd-color-text);font-size:var(--agd-font-size-xs);font-weight:var(--agd-font-weight-medium);line-height:1}.agd-avatar svg{width:.9rem;height:.9rem}.agd-avatar--person{border-radius:var(--agd-radius-full)}.agd-avatar--agent{border-color:var(--agd-color-agent);border-radius:var(--agd-radius-sm);background:var(--agd-color-agent-subtle);color:var(--agd-color-agent-text)}.agd-avatar--more{border-radius:var(--agd-radius-full);background:var(--agd-color-surface);color:var(--agd-color-text-muted)}.agd-chip{display:inline-flex;align-items:center;gap:var(--agd-space-2);max-width:100%;min-width:0}.agd-chip__name{overflow:hidden;color:var(--agd-color-text);font-weight:var(--agd-font-weight-medium);text-overflow:ellipsis;white-space:nowrap}.agd-chip__meta{color:var(--agd-color-text-muted);font-size:var(--agd-font-size-xs);min-width:0;overflow-wrap:anywhere}.agd-pill{flex:none;padding:.125rem var(--agd-space-2);border:1px solid var(--agd-color-agent);border-radius:var(--agd-radius-full);color:var(--agd-color-agent-text);font-size:var(--agd-font-size-xs);font-weight:var(--agd-font-weight-semibold);letter-spacing:.02em;line-height:1.2;text-transform:uppercase}.agd-agent-badge{display:inline-flex;align-items:center;gap:var(--agd-space-2);max-width:100%;padding:.125rem var(--agd-space-2) .125rem .125rem;border:1px solid var(--agd-color-agent);border-radius:var(--agd-radius-md);background:var(--agd-color-agent-subtle);color:var(--agd-color-agent-text);font-size:var(--agd-font-size-xs)}.agd-agent-badge--compact{padding:0;border:0;background:none}.agd-agent-badge__label{font-weight:var(--agd-font-weight-semibold);white-space:nowrap}.agd-agent-badge__meta{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.agd-title{display:inline-grid;min-width:0;max-width:100%}.agd-title__button,.agd-title__input,.agd-title__text{min-width:0;padding:var(--agd-space-1) var(--agd-space-2);font:inherit;font-size:var(--agd-font-size-lg);font-weight:var(--agd-font-weight-semibold)}.agd-title__button{border:1px solid transparent;border-radius:var(--agd-radius-md);background:none;color:var(--agd-color-text);cursor:text;text-align:start}.agd-title__button:hover{border-color:var(--agd-color-border-strong)}.agd-title__text{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.agd-title__input{width:min(28rem,100%);border:1px solid var(--agd-color-border-strong);border-radius:var(--agd-radius-md);background:var(--agd-color-surface-raised);color:var(--agd-color-text)}.agd-title__input[aria-invalid=true]{border-color:var(--agd-color-danger-text)}.agd-title__error{padding-inline:var(--agd-space-2);color:var(--agd-color-danger-text);font-size:var(--agd-font-size-xs)}.agd-stack{display:inline-flex;align-items:center;gap:var(--agd-space-3)}.agd-stack__list{display:flex;margin:0;padding:0;list-style:none}.agd-stack__list li+li{margin-inline-start:-.25rem}.agd-stack__list .agd-avatar{width:1.75rem;height:1.75rem;box-shadow:0 0 0 2px var(--agd-color-bg)}.agd-stack__summary{color:var(--agd-color-text-muted);font-size:var(--agd-font-size-xs);white-space:nowrap}@media(forced-colors:active){.agd-checkbox:checked,.agd-switch:checked{background:Highlight;border-color:Highlight}.agd-checkbox:before{background:HighlightText}.agd-switch{background:Canvas;border-color:ButtonText}.agd-switch:before{background:ButtonText}.agd-switch:checked:before{background:HighlightText}.agd-button[aria-busy=true]{border-style:dashed}.agd-button[aria-pressed=true]{background:Highlight;color:HighlightText;border-color:Highlight}.agd-tabs__trigger[data-state=active]:after{background:Highlight}.agd-skeleton{background:GrayText}.agd-filegrid__item,.agd-agent-badge,.agd-title__button:hover,.agd-title__input{border-color:CanvasText}.agd-agent-badge--compact{border:0}.agd-menu__item[data-highlighted]{outline:2px solid Highlight;outline-offset:-2px}}.agd-dialog:has(.agd-share){width:min(36rem,calc(100vw - 2rem))}.agd-share{display:grid;gap:var(--agd-space-4)}.agd-share__invite{display:grid;grid-template-columns:minmax(0,1fr) auto auto;align-items:start;gap:var(--agd-space-3)}.agd-share__invite .agd-field:first-child{grid-column:1 / -1}.agd-share__invite .agd-button{align-self:end}.agd-share__sent{color:var(--agd-color-success-text);font-size:var(--agd-font-size-xs)}.agd-share__people{display:grid;margin:0;padding:0;list-style:none;border-top:1px solid var(--agd-color-border)}.agd-share__people li{display:flex;align-items:center;justify-content:space-between;gap:var(--agd-space-3);padding:var(--agd-space-2) 0;border-bottom:1px solid var(--agd-color-border)}.agd-share__people .agd-field{min-width:9rem}.agd-share__controls{display:inline-flex;align-items:center;gap:var(--agd-space-2)}.agd-share__owner{padding-inline:var(--agd-space-3);color:var(--agd-color-text-muted)}.agd-share__row{display:grid;grid-template-columns:1fr 1fr;gap:var(--agd-space-3)}.agd-share__copy{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:end;gap:var(--agd-space-3)}@media(max-width:30rem){.agd-share__invite,.agd-share__row,.agd-share__copy{grid-template-columns:1fr}}.agd-cursor{position:relative;display:inline-block;width:0;vertical-align:baseline;-webkit-user-select:none;user-select:none}.agd-cursor__caret{position:absolute;inset-block:-.2em -.15em;inset-inline-start:0;width:2px;background:var(--agd-color-accent)}.agd-cursor__tag{position:absolute;inset-block-end:1.45em;inset-inline-start:var(--agd-cursor-shift, 0px);padding:.0625rem var(--agd-space-2);border:1px solid var(--agd-color-accent);border-radius:var(--agd-radius-sm) var(--agd-radius-sm) var(--agd-radius-sm) 0;background:var(--agd-color-accent);color:var(--agd-color-text-on-accent);font-size:var(--agd-font-size-xs);font-weight:var(--agd-font-weight-medium);line-height:1.3;width:max-content;max-inline-size:calc(100vw - 1rem);overflow-wrap:anywhere}.agd-cursor--agent .agd-cursor__caret{background:var(--agd-color-agent)}.agd-cursor--agent .agd-cursor__tag{border-color:var(--agd-color-agent);border-radius:var(--agd-radius-sm);background:var(--agd-color-agent-subtle);color:var(--agd-color-agent-text)}.agd-datatable{display:grid;gap:var(--agd-space-3);min-width:0}.agd-datatable__frame{position:relative;border:1px solid var(--agd-color-border);border-radius:var(--agd-radius-md);background:var(--agd-color-surface);overflow:hidden}.agd-datatable__scroller{height:var(--agd-dt-height);overflow:auto;overscroll-behavior:contain}.agd-datatable__inner{min-width:var(--agd-dt-min)}.agd-datatable__head{position:sticky;top:0;z-index:1;background:var(--agd-color-surface-sunken)}.agd-datatable__head .agd-datatable__row{border-bottom:1px solid var(--agd-color-border)}.agd-datatable__row{box-sizing:border-box;display:grid;grid-template-columns:var(--agd-dt-cols);align-items:center;height:var(--agd-dt-row)}.agd-datatable__body{position:relative}.agd-datatable__row--body{position:absolute;inset-inline:0;border-bottom:1px solid var(--agd-color-border)}.agd-datatable__row--body:hover{background:var(--agd-color-surface-sunken)}.agd-datatable__row--body.agd-datatable__row--selected{background:var(--agd-color-accent-subtle)}.agd-datatable__row--body:focus-visible{outline:2px solid var(--agd-color-focus);outline-offset:-2px}.agd-datatable__cell{min-width:0;padding:0 var(--agd-space-3);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--agd-font-size-sm)}.agd-datatable__head .agd-datatable__cell{color:var(--agd-color-text-muted);font-size:var(--agd-font-size-xs);font-weight:var(--agd-font-weight-semibold)}.agd-datatable__cell--check{display:grid;place-items:center;padding:0}.agd-datatable__cell .agd-skeleton{width:70%}.agd-datatable__state{position:absolute;inset:var(--agd-dt-row) 0 0;display:grid;place-items:center}.agd-datatable__bar{position:absolute;inset-inline:var(--agd-space-3);inset-block-end:var(--agd-space-3);display:flex;flex-wrap:wrap;align-items:center;gap:var(--agd-space-3);padding:var(--agd-space-2) var(--agd-space-3);border:1px solid var(--agd-color-border);border-radius:var(--agd-radius-md);background:var(--agd-color-surface-raised);box-shadow:var(--agd-shadow-floating)}.agd-datatable__bar-count{font-size:var(--agd-font-size-sm);font-weight:var(--agd-font-weight-medium)}.agd-datatable__bar-actions{display:flex;flex:1;flex-wrap:wrap;gap:var(--agd-space-2)}@media(forced-colors:active){.agd-datatable__row--body.agd-datatable__row--selected{border-inline-start:.25rem solid Highlight}}.agd-datatable__group{position:absolute;inset-inline:0;display:grid;align-items:center;height:var(--agd-dt-row);background:var(--agd-color-surface-sunken);border-bottom:1px solid var(--agd-color-border);box-sizing:border-box}.agd-datatable__group-cell{padding:0 var(--agd-space-3);font-size:var(--agd-font-size-xs);font-weight:var(--agd-font-weight-semibold)}.agd-datatable__group-count{margin-inline-start:var(--agd-space-1);color:var(--agd-color-text-muted);font-weight:var(--agd-font-weight-regular)}.agd-datatoolbar{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:var(--agd-space-2)}.agd-datatoolbar__start,.agd-datatoolbar__end{display:flex;flex-wrap:wrap;align-items:center;gap:var(--agd-space-2);min-width:0}.agd-tablesearch{position:relative;display:flex;align-items:center}.agd-tablesearch__icon{position:absolute;inset-inline-start:var(--agd-space-3);color:var(--agd-color-text-muted);pointer-events:none}.agd-tablesearch__input{width:min(16rem,60vw);padding-inline-start:var(--agd-space-8);animation:agd-fade-in var(--agd-duration-base) var(--agd-easing-out)}.agd-filterchips,.agd-filterchips__list{display:flex;flex-wrap:wrap;align-items:center;gap:var(--agd-space-2);margin:0;padding:0;list-style:none}.agd-filterchip{display:inline-flex;align-items:center;gap:var(--agd-space-1);padding-inline-start:var(--agd-space-3);border:1px solid var(--agd-color-border-strong);border-radius:var(--agd-radius-full);background:var(--agd-color-surface);font-size:var(--agd-font-size-sm)}.agd-filterchip__label{padding-block:var(--agd-space-1)}.agd-filterchip__remove{border-radius:var(--agd-radius-full)}.agd-popover{z-index:60;padding:var(--agd-space-3);border:1px solid var(--agd-color-border);border-radius:var(--agd-radius-md);background:var(--agd-color-surface-raised);box-shadow:var(--agd-shadow-floating);animation:agd-pop-in var(--agd-duration-fast) var(--agd-easing-out)}.agd-display{display:grid;gap:var(--agd-space-3);width:min(20rem,calc(100vw - 2rem))}.agd-display__order{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:var(--agd-space-2)}.agd-display__columns{display:grid;gap:var(--agd-space-1);margin:0;padding:0;border:0}.agd-display__columns legend{padding:0;margin-block-end:var(--agd-space-1);font-weight:var(--agd-font-weight-medium)}.agd-display .agd-button[aria-disabled=true]{--button-bg: var(--agd-color-surface-sunken);--button-bg-hover: var(--agd-color-surface-sunken);--button-fg: var(--agd-color-text-muted);--button-border: var(--agd-color-border);border-style:dashed;cursor:not-allowed}.agd-appsidebar{display:flex;flex-direction:column;gap:var(--agd-space-2);flex:none;box-sizing:border-box;width:var(--agd-size-sidebar);padding:var(--agd-space-2);border-inline-end:1px solid var(--agd-color-border);background:var(--agd-color-surface-sunken)}.agd-appsidebar[data-ready]{transition:width var(--agd-duration-base) var(--agd-easing-out)}@media(max-width:47.99rem){.agd-appsidebar:not([data-collapsed=true]){max-width:60vw}}.agd-appsidebar[data-collapsed=true]{width:var(--agd-size-sidebar-rail);align-items:center;padding-inline:var(--agd-space-1)}.agd-appsidebar__toggle{align-self:flex-start}.agd-appsidebar[data-collapsed=true] .agd-appsidebar__toggle{align-self:center}.agd-appsidebar__content{flex:1;box-sizing:border-box;padding:var(--agd-space-1);min-width:0;min-height:0;width:100%;overflow-x:hidden;overflow-y:auto}.agd-appsidebar__content[hidden]{display:none}.drive-main{max-width:72rem}.drive-muted{color:var(--agd-color-text-muted)}.drive-status{display:flex;align-items:center;gap:var(--agd-space-2);color:var(--agd-color-text-muted)}.drive-signin{display:grid;gap:var(--agd-space-4);max-width:24rem}.drive-form{display:grid;gap:var(--agd-space-4)}.drive-form__actions{display:flex;justify-content:flex-end;gap:var(--agd-space-2)}.drive-drop{min-height:60vh;border:2px dashed transparent;border-radius:var(--agd-radius-md);padding:var(--agd-space-2)}.drive-drop--over{border-color:var(--agd-color-accent);background:var(--agd-color-accent-subtle)}.drive-bar{display:flex;align-items:center;justify-content:space-between;gap:var(--agd-space-4);flex-wrap:wrap;margin-bottom:var(--agd-space-4)}.drive-bar h1{margin:0;font-size:var(--agd-font-size-xl);overflow-wrap:anywhere}.drive-crumbs ol{display:flex;flex-wrap:wrap;gap:var(--agd-space-2);list-style:none;margin:0 0 var(--agd-space-2);padding:0;color:var(--agd-color-text-muted)}.drive-crumbs li+li:before{content:"/";margin-right:var(--agd-space-2)}.drive-crumbs [aria-current=page]{color:var(--agd-color-text);font-weight:var(--agd-font-weight-semibold)}.drive-split{display:grid;grid-template-columns:14rem minmax(0,1fr);gap:var(--agd-space-6)}@media(max-width:48rem){.drive-split{grid-template-columns:1fr}}.drive-tree{list-style:none;margin:0;padding:0}.drive-tree .drive-tree{padding-left:var(--agd-space-4)}.drive-tree a{display:flex;align-items:center;gap:var(--agd-space-2);padding:var(--agd-space-1) var(--agd-space-2);border-radius:var(--agd-radius-sm);color:var(--agd-color-text);text-decoration:none}.drive-tree a:hover{background:var(--agd-color-surface-hover)}.drive-tree a[aria-current=page]{background:var(--agd-color-accent-subtle);color:var(--agd-color-accent-text);font-weight:var(--agd-font-weight-semibold)}.drive-tree svg{width:1rem;height:1rem;flex:none}.drive-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(12rem,1fr));gap:var(--agd-space-4);list-style:none;margin:0;padding:0}.drive-card{position:relative;display:grid;gap:var(--agd-space-2);padding:var(--agd-space-4);border:1px solid var(--agd-color-border);border-radius:var(--agd-radius-md);background:var(--agd-color-surface)}.drive-card__icon svg{width:2rem;height:2rem}.drive-card__name{overflow-wrap:anywhere;font-weight:var(--agd-font-weight-medium);color:var(--agd-color-text)}.drive-card__meta{font-size:var(--agd-font-size-sm);color:var(--agd-color-text-muted)}.drive-card__actions{display:flex;align-items:center;justify-content:space-between;gap:var(--agd-space-2)}.drive-root{display:grid;grid-template-columns:12rem minmax(0,1fr);gap:var(--agd-space-6);color:var(--agd-color-text)}@media(max-width:48rem){.drive-root{grid-template-columns:1fr}}.drive-sr{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}.drive-tools{display:flex;justify-content:flex-end;margin-bottom:var(--agd-space-2)}.drive-search{display:flex;align-items:center;gap:var(--agd-space-2)}.drive-search__input{min-width:14rem;min-height:2.25rem;padding:0 var(--agd-space-3);border:1px solid var(--agd-color-border);border-radius:var(--agd-radius-md);background:var(--agd-color-surface);color:var(--agd-color-text);font:inherit}.drive-search__input:focus-visible,.drive-sort:focus-visible{outline:2px solid var(--agd-color-accent);outline-offset:2px}.drive-table{width:100%;border-collapse:collapse}.drive-table th{padding:var(--agd-space-2) var(--agd-space-3);text-align:left;font-size:var(--agd-font-size-sm);font-weight:var(--agd-font-weight-medium);color:var(--agd-color-text-muted);border-bottom:1px solid var(--agd-color-border)}.drive-table td{padding:var(--agd-space-2) var(--agd-space-3);border-bottom:1px solid var(--agd-color-border);vertical-align:middle}.drive-table .drive-table__date{color:var(--agd-color-text-muted);white-space:nowrap}.drive-table__check{width:2.5rem}.drive-table__name{display:flex;align-items:center;gap:var(--agd-space-2);overflow-wrap:anywhere}.drive-table__name a{color:var(--agd-color-text);font-weight:var(--agd-font-weight-medium);text-decoration:none}.drive-table__name a:hover{text-decoration:underline}.drive-table__icon svg{width:1.25rem;height:1.25rem;color:var(--agd-color-text-muted)}.drive-table__actions>*{vertical-align:middle}.drive-table__actions{text-align:right;white-space:nowrap}.drive-row:hover,.drive-row[data-selected]{background:var(--agd-color-surface-sunken)}.drive-sort{all:unset;cursor:pointer;border-radius:var(--agd-radius-sm)}.drive-bulk{position:fixed;inset:auto 0 var(--agd-space-4);margin-inline:auto;width:max-content;max-width:calc(100vw - 2rem);display:flex;align-items:center;gap:var(--agd-space-3);padding:var(--agd-space-2) var(--agd-space-4);border:1px solid var(--agd-color-border);border-radius:var(--agd-radius-md);background:var(--agd-color-surface);box-shadow:0 4px 16px #00000029;z-index:20}@media(max-width:40rem){.drive-table .drive-table__who{display:none}}.drive-title{display:flex;align-items:center;gap:var(--agd-space-3);flex-wrap:wrap;min-width:0}.drive-title h1{margin:0}.drive-drop--bulk{padding-bottom:6rem}html:has(.drive-bulk){scroll-padding-bottom:6rem}.agd-checkbox:indeterminate{background-color:var(--agd-color-accent);border-color:var(--agd-color-accent);background-image:linear-gradient(var(--agd-color-surface),var(--agd-color-surface));background-size:60% 2px;background-repeat:no-repeat;background-position:center}.drive-activity{list-style:none;margin:0;padding:0;display:grid;gap:var(--agd-space-2)}.drive-activity li{padding:var(--agd-space-2) 0;border-bottom:1px solid var(--agd-color-border)}.drive-activity time{color:var(--agd-color-text-muted);font-size:.875em}