Skip to content

Commit 12760fe

Browse files
atilafassinaclaude
andauthored
feat: Files Plugin (#115)
* feat: files plugin with multi-volume support Adds a new Files plugin for browsing, uploading, downloading, and previewing files from Databricks Unity Catalog Volumes. Includes the files connector/client, cache invalidation, security hardening, and server plugin adjustments for multipart uploads. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> Signed-off-by: Atila Fassina <atila@fassina.eu> * feat: file browser UI components Adds React components for browsing files: directory list, file entry, breadcrumb navigation, preview panel, new folder input, and format utilities. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> Signed-off-by: Atila Fassina <atila@fassina.eu> * feat: files plugin dev-playground integration Adds files plugin to the dev-playground reference app with a file browser route, updated root layout navigation, and environment configuration. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> Signed-off-by: Atila Fassina <atila@fassina.eu> * docs: files plugin documentation Adds files plugin documentation, updates plugin index, configuration guide, and generated API docs. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> Signed-off-by: Atila Fassina <atila@fassina.eu> * chore: adjusting types post-rebase * chore: refactor API to surface `.asUser(req)` * chore: simplify default docs * chore: update docs and fix tests * chore: update docs * chore: fix integration tests * chore: add some timeout tests * chore: update plugin manifest * chore: do not rethrow auth errors on Plugin * chore: add service-princpal back, update tests * chore: get build to pass * chore: update the docs * chore: update docs * chore: throw if not obo * chore: update `toPlugin` call * chore: fix tests to expect an error when SP is used --------- Signed-off-by: Atila Fassina <atila@fassina.eu> Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 03cbe2b commit 12760fe

60 files changed

Lines changed: 6624 additions & 52 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

CLAUDE.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -408,8 +408,8 @@ This project uses conventional commits (enforced by commitlint):
408408

409409
## Important Context
410410

411-
### Current Branch: improve-bundle-size
412-
This branch focuses on optimizing bundle size through tsdown configuration tuning.
411+
### Current Branch: plugin/files
412+
This branch implements the multi-volume files plugin architecture.
413413

414414
### Key Dependencies
415415
- `@databricks/sdk-experimental` v0.15.0+ - Databricks services SDK

apps/dev-playground/.env.dist

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ NODE_ENV='development'
66
OTEL_EXPORTER_OTLP_ENDPOINT='http://localhost:4318'
77
OTEL_RESOURCE_ATTRIBUTES='service.sample_attribute=dev'
88
OTEL_SERVICE_NAME='dev-playground'
9+
DATABRICKS_VOLUME_PLAYGROUND=
10+
DATABRICKS_VOLUME_OTHER=
911
DATABRICKS_GENIE_SPACE_ID=
1012
LAKEBASE_ENDPOINT='' # Run: databricks postgres list-endpoints projects/{project-id}/branches/{branch-id} — use the `name` field from the output
1113
PGHOST=

apps/dev-playground/app.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
11
env:
22
- name: DATABRICKS_WAREHOUSE_ID
33
valueFrom: sql-warehouse
4+
- name: DATABRICKS_VOLUME_PLAYGROUND
5+
valueFrom: volume
6+
- name: DATABRICKS_VOLUME_OTHER
7+
valueFrom: other-volume

apps/dev-playground/client/src/routeTree.gen.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import { Route as SqlHelpersRouteRouteImport } from './routes/sql-helpers.route'
1515
import { Route as ReconnectRouteRouteImport } from './routes/reconnect.route'
1616
import { Route as LakebaseRouteRouteImport } from './routes/lakebase.route'
1717
import { Route as GenieRouteRouteImport } from './routes/genie.route'
18+
import { Route as FilesRouteRouteImport } from './routes/files.route'
1819
import { Route as DataVisualizationRouteRouteImport } from './routes/data-visualization.route'
1920
import { Route as ChartInferenceRouteRouteImport } from './routes/chart-inference.route'
2021
import { Route as ArrowAnalyticsRouteRouteImport } from './routes/arrow-analytics.route'
@@ -51,6 +52,11 @@ const GenieRouteRoute = GenieRouteRouteImport.update({
5152
path: '/genie',
5253
getParentRoute: () => rootRouteImport,
5354
} as any)
55+
const FilesRouteRoute = FilesRouteRouteImport.update({
56+
id: '/files',
57+
path: '/files',
58+
getParentRoute: () => rootRouteImport,
59+
} as any)
5460
const DataVisualizationRouteRoute = DataVisualizationRouteRouteImport.update({
5561
id: '/data-visualization',
5662
path: '/data-visualization',
@@ -83,6 +89,7 @@ export interface FileRoutesByFullPath {
8389
'/arrow-analytics': typeof ArrowAnalyticsRouteRoute
8490
'/chart-inference': typeof ChartInferenceRouteRoute
8591
'/data-visualization': typeof DataVisualizationRouteRoute
92+
'/files': typeof FilesRouteRoute
8693
'/genie': typeof GenieRouteRoute
8794
'/lakebase': typeof LakebaseRouteRoute
8895
'/reconnect': typeof ReconnectRouteRoute
@@ -96,6 +103,7 @@ export interface FileRoutesByTo {
96103
'/arrow-analytics': typeof ArrowAnalyticsRouteRoute
97104
'/chart-inference': typeof ChartInferenceRouteRoute
98105
'/data-visualization': typeof DataVisualizationRouteRoute
106+
'/files': typeof FilesRouteRoute
99107
'/genie': typeof GenieRouteRoute
100108
'/lakebase': typeof LakebaseRouteRoute
101109
'/reconnect': typeof ReconnectRouteRoute
@@ -110,6 +118,7 @@ export interface FileRoutesById {
110118
'/arrow-analytics': typeof ArrowAnalyticsRouteRoute
111119
'/chart-inference': typeof ChartInferenceRouteRoute
112120
'/data-visualization': typeof DataVisualizationRouteRoute
121+
'/files': typeof FilesRouteRoute
113122
'/genie': typeof GenieRouteRoute
114123
'/lakebase': typeof LakebaseRouteRoute
115124
'/reconnect': typeof ReconnectRouteRoute
@@ -125,6 +134,7 @@ export interface FileRouteTypes {
125134
| '/arrow-analytics'
126135
| '/chart-inference'
127136
| '/data-visualization'
137+
| '/files'
128138
| '/genie'
129139
| '/lakebase'
130140
| '/reconnect'
@@ -138,6 +148,7 @@ export interface FileRouteTypes {
138148
| '/arrow-analytics'
139149
| '/chart-inference'
140150
| '/data-visualization'
151+
| '/files'
141152
| '/genie'
142153
| '/lakebase'
143154
| '/reconnect'
@@ -151,6 +162,7 @@ export interface FileRouteTypes {
151162
| '/arrow-analytics'
152163
| '/chart-inference'
153164
| '/data-visualization'
165+
| '/files'
154166
| '/genie'
155167
| '/lakebase'
156168
| '/reconnect'
@@ -165,6 +177,7 @@ export interface RootRouteChildren {
165177
ArrowAnalyticsRouteRoute: typeof ArrowAnalyticsRouteRoute
166178
ChartInferenceRouteRoute: typeof ChartInferenceRouteRoute
167179
DataVisualizationRouteRoute: typeof DataVisualizationRouteRoute
180+
FilesRouteRoute: typeof FilesRouteRoute
168181
GenieRouteRoute: typeof GenieRouteRoute
169182
LakebaseRouteRoute: typeof LakebaseRouteRoute
170183
ReconnectRouteRoute: typeof ReconnectRouteRoute
@@ -217,6 +230,13 @@ declare module '@tanstack/react-router' {
217230
preLoaderRoute: typeof GenieRouteRouteImport
218231
parentRoute: typeof rootRouteImport
219232
}
233+
'/files': {
234+
id: '/files'
235+
path: '/files'
236+
fullPath: '/files'
237+
preLoaderRoute: typeof FilesRouteRouteImport
238+
parentRoute: typeof rootRouteImport
239+
}
220240
'/data-visualization': {
221241
id: '/data-visualization'
222242
path: '/data-visualization'
@@ -261,6 +281,7 @@ const rootRouteChildren: RootRouteChildren = {
261281
ArrowAnalyticsRouteRoute: ArrowAnalyticsRouteRoute,
262282
ChartInferenceRouteRoute: ChartInferenceRouteRoute,
263283
DataVisualizationRouteRoute: DataVisualizationRouteRoute,
284+
FilesRouteRoute: FilesRouteRoute,
264285
GenieRouteRoute: GenieRouteRoute,
265286
LakebaseRouteRoute: LakebaseRouteRoute,
266287
ReconnectRouteRoute: ReconnectRouteRoute,

apps/dev-playground/client/src/routes/__root.tsx

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,14 @@ function RootComponent() {
9696
Chart Inference
9797
</Button>
9898
</Link>
99+
<Link to="/files" className="no-underline">
100+
<Button
101+
variant="ghost"
102+
className="text-foreground hover:text-secondary-foreground"
103+
>
104+
Files
105+
</Button>
106+
</Link>
99107
<ThemeSelector />
100108
</div>
101109
</nav>

0 commit comments

Comments
 (0)