Skip to content

feat(appkit): migrate files to modular @databricks/sdk-files - #638

Open
MarioCadenas wants to merge 6 commits into
feat/modular-jobsfrom
feat/modular-files
Open

MarioCadenas wants to merge 6 commits into
feat/modular-jobsfrom
feat/modular-files

Conversation

@MarioCadenas

Copy link
Copy Markdown
Collaborator

Part of the migration off @databricks/sdk-experimental onto the modular @databricks/sdk-* SDK (see #562). Base: feat/modular-sdk-integration.

Changes

feat(appkit): migrate files to modular @databricks/sdk-files

Swap the facade's files accessor to a lazily built FilesClient
(sdk-files 0.52.0, accepts sdk-core/auth/options 0.51.0).

  • list/download/createDirectory/delete use listDirectoryContentsIter,
    downloadFile, createDirectory, deleteFile; results are mapped back to
    the legacy snake_case / header-keyed shapes.
  • metadata uses a raw HEAD via request(): the generated getFileMetadata
    parses the empty HEAD body and drops the metadata headers.
  • Modular ApiError (httpStatusCode) is converted to the wrapper ApiError
    so exists() and the plugin's 4xx mapping keep working.
  • DirectoryEntry / DownloadResponse are now AppKit-owned types with the
    same shape.

Draft: implemented by an agent; needs review and a deployed SP + OBO check before it's marked ready.

This pull request and its description were written by Isaac.

@MarioCadenas
MarioCadenas changed the base branch from feat/modular-sdk-integration to feat/modular-jobs October 8, 2026 14:37
@MarioCadenas
MarioCadenas added this pull request to stack #636 October 8, 2026 14:38
@github-actions

github-actions Bot commented Oct 8, 2026 •

Copy link
Copy Markdown
Contributor

📦 Bundle size report

Compared against bundle-size-baseline.json (main).

@databricks/appkit

npm tarball (packed): 1.2 MB (+25 KB) — gzipped download (dist + bin; excludes release-only docs/NOTICE).

dist raw gzip
JS (runtime) 1.3 MB (+24 KB) 456 KB (+9.1 KB)
Type declarations 462 KB (+6.5 KB) 168 KB (+2.5 KB)
Source maps 2.5 MB (+49 KB) 854 KB (+17 KB)
Other 11 KB 3.7 KB
Total 4.2 MB (+79 KB) 1.4 MB (+28 KB)
Per-entry composition (own code — deps external (as shipped))
Entry Initial (gz) Lazy (gz) Total (gz) node_modules (min) Own code (min)
. 105 KB (+2.9 KB) 2.5 KB (+1 B) 107 KB (+2.9 KB) external 340 KB (+8.0 KB)
./beta 101 KB (+2.7 KB) 484 B (-1 B) 102 KB (+2.7 KB) external 304 KB (+7.1 KB)
./testing 44 KB (+2.5 KB) 32 KB (-43 B) 77 KB (+2.4 KB) external 221 KB (+6.6 KB)
./tsdown 520 B 0 B 520 B external 813 B
./type-generator 25 KB (+2.3 KB) 0 B 25 KB (+2.3 KB) external 73 KB (+6.2 KB)

Chunks:

Entry Chunk Load Size (gz)
. index.js initial 100 KB
. utils.js initial 4.6 KB
. remote-tunnel-manager.js lazy 2.5 KB
./beta beta.js initial 82 KB
./beta stream-manager.js initial 5.9 KB
./beta modular.js initial 5.6 KB
./beta service-context.js initial 4.2 KB
./beta databricks.js initial 3.3 KB
./beta client.js initial 594 B
./beta index.js initial 20 B
./beta supervisor-api.js lazy 192 B
./beta databricks.js lazy 177 B
./beta index.js lazy 115 B
./testing manifest.js initial 31 KB
./testing index.js initial 10 KB
./testing wide-event-emitter.js initial 2.9 KB
./testing index.js lazy 28 KB
./testing remote-tunnel-manager.js lazy 2.5 KB
./testing utils.js lazy 1.8 KB
./tsdown index.js initial 520 B
./type-generator index.js initial 25 KB

@databricks/appkit-ui

npm tarball (packed): 397 KB (+550 B) — gzipped download (dist + bin; excludes release-only docs/NOTICE).

dist raw gzip
JS (runtime) 429 KB (+235 B) 147 KB (+108 B)
Type declarations 267 KB (+768 B) 98 KB (+349 B)
Source maps 853 KB (+314 B) 286 KB (+143 B)
CSS 16 KB 3.2 KB
Total 1.5 MB (+1.3 KB) 534 KB (+600 B)
Per-entry composition (consumer bundle — deps bundled, peerDeps external)
Entry Initial (gz) Lazy (gz) Total (gz) node_modules (min) Own code (min)
./js 5.3 KB 49 KB 55 KB 208 KB 14 KB
./js/beta 2.1 KB 0 B 2.1 KB 0 B 5.0 KB
./react 433 KB (+12 B) 49 KB 481 KB (+12 B) 1.3 MB 177 KB (+41 B)
./react/beta 4.9 KB 0 B 4.9 KB 0 B 12 KB

Chunks:

Entry Chunk Load Size (gz)
./js index.js initial 5.2 KB
./js chunk initial 120 B
./js apache-arrow lazy 49 KB
./js/beta beta.js initial 2.1 KB
./react index.js initial 431 KB
./react tslib initial 2.1 KB
./react apache-arrow lazy 49 KB
./react/beta beta.js initial 4.9 KB

@github-actions

github-actions Bot commented Oct 9, 2026 •

Copy link
Copy Markdown
Contributor

🤖 AppKit PR bot

🔬 Run evals

Start an eval for this PR from the evals-monitor app: Go to Evals Monitor →

📦 Try this PR's app template

Scaffolds a new app from this PR's SDK build. Run it in any folder (requires the GitHub CLI — gh auth login — and the Databricks CLI):

gh run download 38918716064 -R databricks/appkit -n appkit-template-0.88.1-pr.9589be0-feat-modular-files-638 -D appkit-pr-638 \
  && unzip -o "appkit-pr-638/appkit-template-0.88.1-pr.9589be0-feat-modular-files-638.zip" -d "appkit-pr-638" \
  && databricks apps init --template "appkit-pr-638"

The template pins @databricks/appkit and @databricks/appkit-ui to tarballs built from this branch, so the scaffolded app runs against this PR's code.

@MarioCadenas
MarioCadenas removed this pull request from stack #636 October 13, 2026 08:32
@MarioCadenas
MarioCadenas added this pull request to stack #664 October 13, 2026 08:33
@MarioCadenas
MarioCadenas removed this pull request from stack #664 October 13, 2026 15:47
@MarioCadenas
MarioCadenas added this pull request to stack #669 October 13, 2026 15:48
@MarioCadenas
MarioCadenas marked this pull request as ready for review October 14, 2026 09:26
@MarioCadenas
MarioCadenas requested a review from a team as a code owner October 14, 2026 09:26
@MarioCadenas
MarioCadenas requested a review from ditadi October 14, 2026 09:26
@MarioCadenas
MarioCadenas force-pushed the feat/modular-files branch 2 times, most recently from 6fb96b8 to 1e04d9f Compare October 15, 2026 16:29
MarioCadenas and others added 6 commits October 16, 2026 16:43
Swap the facade's files accessor to a lazily built FilesClient
(sdk-files 0.52.0, accepts sdk-core/auth/options 0.51.0).

- list/download/createDirectory/delete use listDirectoryContentsIter,
  downloadFile, createDirectory, deleteFile; results are mapped back to
  the legacy snake_case / header-keyed shapes.
- metadata uses a raw HEAD via request(): the generated getFileMetadata
  parses the empty HEAD body and drops the metadata headers.
- Modular ApiError (httpStatusCode) is converted to the wrapper ApiError
  so exists() and the plugin's 4xx mapping keep working.
- DirectoryEntry / DownloadResponse are now AppKit-owned types with the
  same shape.

Co-authored-by: Isaac <no-reply@databricks.com>
Signed-off-by: MarioCadenas <MarioCadenas@users.noreply.github.com>
…mples

Files metadata now reads a raw HEAD through client.request, so the
files.getMetadata seed never reached the route.

Co-authored-by: Isaac <no-reply@databricks.com>
Signed-off-by: MarioCadenas <MarioCadenas@users.noreply.github.com>
Export FilesDirectoryEntry / FilesDownloadResponse (modular SDK shapes)
from the package root alongside the legacy DirectoryEntry /
DownloadResponse, now marked @deprecated. list() and download() keep
returning the legacy shapes. Add TODOs for the /list camelCase migration
and for switching metadata to getFileMetadata once sdk-files reads the
HEAD headers.

Co-authored-by: Isaac <no-reply@databricks.com>
Signed-off-by: MarioCadenas <MarioCadenas@users.noreply.github.com>
Replace the raw PUT workaround in FilesConnector.upload() with
client.files.uploadFile. Buffer/string bodies are wrapped in a stream
(uploadFile only takes a ReadableStream). Errors keep the UPLOAD_FAILED
re-wrap with the upstream status and 200-char safe message. The route
now passes the execute() timeout signal through.

uploadFile does not go through executeCall, so the SDK never retries it,
and FILES_WRITE_DEFAULTS disables AppKit retry; a consumed stream body
is never replayed.

Co-authored-by: Isaac <no-reply@databricks.com>
Signed-off-by: MarioCadenas <MarioCadenas@users.noreply.github.com>
metadata() sent the raw resolved path through client.request(), whose
new URL(path, host) parses '#' and '?' in a file name as fragment/query.
'report#1.csv' hit '.../report', so exists() could report a different
file. Encode each segment like the typed SDK calls do.

Co-authored-by: Isaac <no-reply@databricks.com>
Signed-off-by: MarioCadenas <MarioCadenas@users.noreply.github.com>
Buffer and string uploads were wrapped as a ReadableStream for uploadFile,
which sends them chunked with no Content-Length and makes them impossible
to retry. Send in-memory contents as bytes through the request seam
instead; real streams still go through uploadFile.

Co-authored-by: Isaac <no-reply@databricks.com>
Signed-off-by: MarioCadenas <MarioCadenas@users.noreply.github.com>

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants