Skip to content

Commit 1dde6f9

Browse files
committed
Merge branch 'main' into feat/doctor-command
Signed-off-by: Galymzhan <zhangazy2004@gmail.com>
2 parents 0744f9a + af65ac3 commit 1dde6f9

86 files changed

Lines changed: 8061 additions & 506 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
/**
2+
* Upserts the sticky "PR bot" comment built by the pr-template-artifact job:
3+
* the evals-monitor link plus the run-anywhere command to scaffold an app from
4+
* this PR's template artifact.
5+
*
6+
* Invoked via `actions/github-script`. The comment body is read from the file
7+
* at COMMENT_PATH (built by the workflow step so the run id, artifact name, and
8+
* output dir are interpolated from CI context). The body carries the marker
9+
* below as its first line, which we reuse to find and update an existing
10+
* comment instead of posting a new one on every push.
11+
*/
12+
13+
const fs = require("node:fs");
14+
15+
const MARKER = "<!-- pr-bot -->";
16+
17+
module.exports = async ({ github, context }) => {
18+
const { owner, repo } = context.repo;
19+
const issue_number = context.issue.number;
20+
const body = fs.readFileSync(process.env.COMMENT_PATH, "utf-8");
21+
22+
const comments = await github.paginate(github.rest.issues.listComments, {
23+
owner,
24+
repo,
25+
issue_number,
26+
per_page: 100,
27+
});
28+
const existing = comments.find((c) => c.body?.includes(MARKER));
29+
30+
if (existing) {
31+
await github.rest.issues.updateComment({
32+
owner,
33+
repo,
34+
comment_id: existing.id,
35+
body,
36+
});
37+
} else {
38+
await github.rest.issues.createComment({
39+
owner,
40+
repo,
41+
issue_number,
42+
body,
43+
});
44+
}
45+
};

.github/workflows/ci.yml

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,13 @@ jobs:
171171
runs-on:
172172
group: databricks-protected-runner-group
173173
labels: linux-ubuntu-latest
174+
# Job-level permissions REPLACE (not merge with) the top-level set, so all
175+
# three must be listed: pull-requests: write for the sticky comment step,
176+
# and id-token: write which setup-jfrog-npm needs for its OIDC token.
177+
permissions:
178+
contents: read
179+
pull-requests: write
180+
id-token: write
174181

175182
steps:
176183
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
@@ -226,6 +233,55 @@ jobs:
226233
name: appkit-template-${{ steps.version.outputs.version }}
227234
path: appkit-template-${{ steps.version.outputs.version }}.zip
228235

236+
# Build the PR-bot comment: a link to the evals-monitor app, plus a
237+
# self-contained, run-anywhere command that downloads this run's artifact
238+
# and scaffolds an app from it. Every value (run id, repo, artifact name,
239+
# output dir) is baked in so the reader can paste it into any folder — no
240+
# repo checkout or specific cwd required.
241+
- name: Build PR-bot comment
242+
env:
243+
VERSION: ${{ steps.version.outputs.version }}
244+
RUN_ID: ${{ github.run_id }}
245+
REPO: ${{ github.repository }}
246+
PR_NUMBER: ${{ github.event.pull_request.number }}
247+
run: |
248+
ARTIFACT="appkit-template-${VERSION}"
249+
OUT="appkit-pr-${PR_NUMBER}"
250+
EVALS_URL="https://evals-monitor-6051921418418893.staging.aws.databricksapps.com/prs/appkit/${PR_NUMBER}"
251+
{
252+
echo "<!-- pr-bot -->"
253+
echo "## 🤖 AppKit PR bot"
254+
echo ""
255+
echo "### 🔬 Run evals"
256+
echo ""
257+
echo "Start an eval for this PR from the evals-monitor app: [**Go to Evals Monitor →**](${EVALS_URL})"
258+
echo ""
259+
echo "### 📦 Try this PR's app template"
260+
echo ""
261+
echo "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):"
262+
echo ""
263+
echo '```bash'
264+
echo "gh run download ${RUN_ID} -R ${REPO} -n ${ARTIFACT} -D ${OUT} \\"
265+
echo " && unzip -o \"${OUT}/${ARTIFACT}.zip\" -d \"${OUT}\" \\"
266+
echo " && databricks apps init --template \"${OUT}\""
267+
echo '```'
268+
echo ""
269+
echo "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."
270+
} > pr-bot-comment.md
271+
272+
# Fork PRs get a read-only GITHUB_TOKEN, so commenting would 403 and fail
273+
# a job the author can't fix. Skip for forks — the command is still in the
274+
# job log above. Matches bundle-size.yml.
275+
- name: Upsert PR-bot comment
276+
if: github.event.pull_request.head.repo.full_name == github.repository
277+
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
278+
env:
279+
COMMENT_PATH: pr-bot-comment.md
280+
with:
281+
script: |
282+
const upsert = require('./.github/scripts/upsert-pr-bot-comment.cjs');
283+
await upsert({ github, context });
284+
229285
docs-build:
230286
name: Docs Build
231287
needs: detect-changes

.github/workflows/eval-pr-comment.yml

Lines changed: 0 additions & 60 deletions
This file was deleted.

CHANGELOG.md

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,53 @@ All notable changes to this project will be documented in this file.
8282

8383
# Changelog
8484

85+
# Changelog
86+
87+
# Changelog
88+
89+
# Changelog
90+
91+
# Changelog
92+
93+
## [0.48.0](https://github.com/databricks/appkit/compare/v0.47.1...v0.48.0) (2026-07-24)
94+
95+
### appkit
96+
97+
* **appkit:** /ui visual variant picker ([#476](https://github.com/databricks/appkit/issues/476)) ([8f62d59](https://github.com/databricks/appkit/commit/8f62d594428fd79818a2b336d7502917cef3a6ea))
98+
99+
100+
## [0.47.1](https://github.com/databricks/appkit/compare/v0.47.0...v0.47.1) (2026-07-23)
101+
102+
### cli
103+
104+
* **cli:** match lint test-file exclusion relative to scan root ([#490](https://github.com/databricks/appkit/issues/490)) ([716a219](https://github.com/databricks/appkit/commit/716a2196bc7123e4f1341f3da3c4e299b857fef7))
105+
106+
107+
## [0.47.0](https://github.com/databricks/appkit/compare/v0.46.0...v0.47.0) (2026-07-23)
108+
109+
* metric-view runtime ([#474](https://github.com/databricks/appkit/issues/474)) ([1b1a122](https://github.com/databricks/appkit/commit/1b1a122d3e08baf600df982b5f52d4c37d93aa04)), closes [#341](https://github.com/databricks/appkit/issues/341) [#484](https://github.com/databricks/appkit/issues/484) [#487](https://github.com/databricks/appkit/issues/487)
110+
111+
112+
## [0.46.0](https://github.com/databricks/appkit/compare/v0.45.0...v0.46.0) (2026-07-22)
113+
114+
### appkit
115+
116+
* **appkit:** forward async handler rejections to a terminal error middleware instead of crashing ([#439](https://github.com/databricks/appkit/issues/439)) ([5ef5404](https://github.com/databricks/appkit/commit/5ef5404d9b4497cd3b399b03f7027705d5e20314))
117+
* **appkit:** report only the actually-missing env vars in resource errors ([#486](https://github.com/databricks/appkit/issues/486)) ([2e2af02](https://github.com/databricks/appkit/commit/2e2af02acb61d639b793764ac5c663244d0608d8))
118+
119+
### server
120+
121+
* **server:** invoke plugin shutdown hooks and close connections during graceful shutdown ([#441](https://github.com/databricks/appkit/issues/441)) ([f8cd9ec](https://github.com/databricks/appkit/commit/f8cd9ecb00071c2f4b11c5a3cb029f89b0377ba7))
122+
123+
### stream
124+
125+
* **stream:** remove completed/errored streams from registry after buffer TTL ([#438](https://github.com/databricks/appkit/issues/438)) ([e606900](https://github.com/databricks/appkit/commit/e6069008547caf156f3077b7bb02d9f460349053))
126+
127+
### agents
128+
129+
* **agents:** forward generation params (temperature/top_p/stop/...) to the serving adapter ([#450](https://github.com/databricks/appkit/issues/450)) ([44cb589](https://github.com/databricks/appkit/commit/44cb5891be997c1acb63873a4da74cd6de236df8))
130+
131+
85132
## [0.45.0](https://github.com/databricks/appkit/compare/v0.44.0...v0.45.0) (2026-07-09)
86133

87134
* decode inline Arrow IPC + warehouse-compat fallback ([#329](https://github.com/databricks/appkit/issues/329)) ([86bebff](https://github.com/databricks/appkit/commit/86bebffa389bcbac087edd200954b7efe3123a9f))

apps/dev-playground/client/src/lib/nav.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import {
1313
SearchIcon,
1414
ServerIcon,
1515
ShieldIcon,
16+
Wand2Icon,
1617
ZapIcon,
1718
} from "lucide-react";
1819

@@ -162,6 +163,13 @@ export const NAV_GROUPS: ReadonlyArray<NavGroup> = [
162163
"Resilient SSE streams: automatic Last-Event-ID tracking and reconnection.",
163164
icon: RadioIcon,
164165
},
166+
{
167+
to: "/ui-variants",
168+
label: "UI Variants",
169+
description:
170+
"Author UI in variants, pick one live in the browser, and let the agent finalize it into source.",
171+
icon: Wand2Icon,
172+
},
165173
],
166174
},
167175
];

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

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
import { Route as rootRouteImport } from './routes/__root'
1212
import { Route as VectorSearchRouteRouteImport } from './routes/vector-search.route'
13+
import { Route as UiVariantsRouteRouteImport } from './routes/ui-variants.route'
1314
import { Route as TypeSafetyRouteRouteImport } from './routes/type-safety.route'
1415
import { Route as TelemetryRouteRouteImport } from './routes/telemetry.route'
1516
import { Route as SqlHelpersRouteRouteImport } from './routes/sql-helpers.route'
@@ -33,6 +34,11 @@ const VectorSearchRouteRoute = VectorSearchRouteRouteImport.update({
3334
path: '/vector-search',
3435
getParentRoute: () => rootRouteImport,
3536
} as any)
37+
const UiVariantsRouteRoute = UiVariantsRouteRouteImport.update({
38+
id: '/ui-variants',
39+
path: '/ui-variants',
40+
getParentRoute: () => rootRouteImport,
41+
} as any)
3642
const TypeSafetyRouteRoute = TypeSafetyRouteRouteImport.update({
3743
id: '/type-safety',
3844
path: '/type-safety',
@@ -137,6 +143,7 @@ export interface FileRoutesByFullPath {
137143
'/sql-helpers': typeof SqlHelpersRouteRoute
138144
'/telemetry': typeof TelemetryRouteRoute
139145
'/type-safety': typeof TypeSafetyRouteRoute
146+
'/ui-variants': typeof UiVariantsRouteRoute
140147
'/vector-search': typeof VectorSearchRouteRoute
141148
}
142149
export interface FileRoutesByTo {
@@ -157,6 +164,7 @@ export interface FileRoutesByTo {
157164
'/sql-helpers': typeof SqlHelpersRouteRoute
158165
'/telemetry': typeof TelemetryRouteRoute
159166
'/type-safety': typeof TypeSafetyRouteRoute
167+
'/ui-variants': typeof UiVariantsRouteRoute
160168
'/vector-search': typeof VectorSearchRouteRoute
161169
}
162170
export interface FileRoutesById {
@@ -178,6 +186,7 @@ export interface FileRoutesById {
178186
'/sql-helpers': typeof SqlHelpersRouteRoute
179187
'/telemetry': typeof TelemetryRouteRoute
180188
'/type-safety': typeof TypeSafetyRouteRoute
189+
'/ui-variants': typeof UiVariantsRouteRoute
181190
'/vector-search': typeof VectorSearchRouteRoute
182191
}
183192
export interface FileRouteTypes {
@@ -200,6 +209,7 @@ export interface FileRouteTypes {
200209
| '/sql-helpers'
201210
| '/telemetry'
202211
| '/type-safety'
212+
| '/ui-variants'
203213
| '/vector-search'
204214
fileRoutesByTo: FileRoutesByTo
205215
to:
@@ -220,6 +230,7 @@ export interface FileRouteTypes {
220230
| '/sql-helpers'
221231
| '/telemetry'
222232
| '/type-safety'
233+
| '/ui-variants'
223234
| '/vector-search'
224235
id:
225236
| '__root__'
@@ -240,6 +251,7 @@ export interface FileRouteTypes {
240251
| '/sql-helpers'
241252
| '/telemetry'
242253
| '/type-safety'
254+
| '/ui-variants'
243255
| '/vector-search'
244256
fileRoutesById: FileRoutesById
245257
}
@@ -261,6 +273,7 @@ export interface RootRouteChildren {
261273
SqlHelpersRouteRoute: typeof SqlHelpersRouteRoute
262274
TelemetryRouteRoute: typeof TelemetryRouteRoute
263275
TypeSafetyRouteRoute: typeof TypeSafetyRouteRoute
276+
UiVariantsRouteRoute: typeof UiVariantsRouteRoute
264277
VectorSearchRouteRoute: typeof VectorSearchRouteRoute
265278
}
266279

@@ -273,6 +286,13 @@ declare module '@tanstack/react-router' {
273286
preLoaderRoute: typeof VectorSearchRouteRouteImport
274287
parentRoute: typeof rootRouteImport
275288
}
289+
'/ui-variants': {
290+
id: '/ui-variants'
291+
path: '/ui-variants'
292+
fullPath: '/ui-variants'
293+
preLoaderRoute: typeof UiVariantsRouteRouteImport
294+
parentRoute: typeof rootRouteImport
295+
}
276296
'/type-safety': {
277297
id: '/type-safety'
278298
path: '/type-safety'
@@ -413,6 +433,7 @@ const rootRouteChildren: RootRouteChildren = {
413433
SqlHelpersRouteRoute: SqlHelpersRouteRoute,
414434
TelemetryRouteRoute: TelemetryRouteRoute,
415435
TypeSafetyRouteRoute: TypeSafetyRouteRoute,
436+
UiVariantsRouteRoute: UiVariantsRouteRoute,
416437
VectorSearchRouteRoute: VectorSearchRouteRoute,
417438
}
418439
export const routeTree = rootRouteImport

0 commit comments

Comments
 (0)