Skip to content
Merged
Show file tree
Hide file tree
Changes from 250 commits
Commits
Show all changes
871 commits
Select commit Hold shift + click to select a range
70e01a3
docs(dashboard-agent): state what makes a watch fire, not how to repr…
kathiekiwi Aug 8, 2026
4961415
fix(webapp,dashboard-agent-db): settle read state, the dot and unavai…
kathiekiwi Aug 9, 2026
b8910fe
feat(webapp): let the agent's environment JWT read a queue's own row
kathiekiwi Aug 9, 2026
fcc161f
fix(webapp,dashboard-agent): settle the work count on the chat on scr…
kathiekiwi Aug 9, 2026
c86c2ed
style(webapp): drop an import the chat no longer uses
kathiekiwi Aug 9, 2026
e954d82
fix(webapp): stop a resumed turn navigating the tab that only picked …
kathiekiwi Aug 9, 2026
717a498
feat(webapp): add the agent storybook gallery
kathiekiwi Aug 5, 2026
5f9c08d
chore(webapp): drop the gallery screenshot script
kathiekiwi Aug 5, 2026
f32367e
fix(webapp): point the filtered-runs demo intent at the runs collection
kathiekiwi Aug 6, 2026
e8a6e11
fix(webapp): pin the dismissed prompt in the gallery and drop the dea…
kathiekiwi Aug 6, 2026
e2445f7
fix(webapp): repair the agent gallery's fixtures after the rebase, an…
kathiekiwi Aug 8, 2026
9a19274
test(webapp): let the demo isolation check see side-effect and dynami…
kathiekiwi Aug 8, 2026
3407254
fix(webapp): name only demo resources in the gallery's fixtures
kathiekiwi Aug 8, 2026
217facd
test(webapp): keep the gallery's fixtures out of the demo barrel
kathiekiwi Aug 9, 2026
5755c4a
refactor(webapp): drop the unused isDemoChatId helper
kathiekiwi Aug 9, 2026
57f0762
test(webapp): use a static import in the sweep card test
kathiekiwi Aug 9, 2026
61a3288
fix(webapp): scope the org-creation RBAC check to user-actor tokens
kathiekiwi Aug 9, 2026
8fbbcf0
test(webapp): pin 404-before-403 ordering for capped user-actor tokens
kathiekiwi Aug 9, 2026
7fca9f5
fix(webapp): resolved-watch adoption wording, stored queue name in pa…
kathiekiwi Aug 9, 2026
ecc8998
fix(webapp): replay keeps the recorded watch confirmation; resolved w…
kathiekiwi Aug 9, 2026
0787f0c
Merge remote-tracking branch 'origin/feat/dashboard-agent-flows' into…
kathiekiwi Aug 9, 2026
a91af3b
Merge branch 'feat/dashboard-agent-ui' into feat/dashboard-agent-flow…
kathiekiwi Aug 9, 2026
6abbd85
Merge branch 'feat/dashboard-agent-flows-watch' into feat/agent-story…
kathiekiwi Aug 9, 2026
637a2bb
test(webapp): pin that an ordinary PAT still passes the PAT-only helper
kathiekiwi Aug 9, 2026
c78eaca
Merge remote-tracking branch 'origin/feat/dashboard-agent-flows' into…
kathiekiwi Aug 9, 2026
3b1ee5e
Merge branch 'feat/dashboard-agent-ui' into feat/dashboard-agent-flow…
kathiekiwi Aug 9, 2026
feec862
Merge branch 'feat/dashboard-agent-flows-watch' into feat/agent-story…
kathiekiwi Aug 9, 2026
82b93db
fix(webapp): compute answered for view blocks in the base message ren…
kathiekiwi Aug 9, 2026
a72b797
Merge remote-tracking branch 'origin/feat/dashboard-agent-flows' into…
kathiekiwi Aug 9, 2026
8f6826e
Merge branch 'feat/dashboard-agent-ui' into feat/dashboard-agent-flow…
kathiekiwi Aug 9, 2026
a27a7af
Merge branch 'feat/dashboard-agent-flows-watch' into feat/agent-story…
kathiekiwi Aug 9, 2026
d304c1a
test(webapp): assert the org route never consults a plain PAT ability
kathiekiwi Aug 9, 2026
8f017ec
test(webapp): pin that the disabled org route never consults the toke…
kathiekiwi Aug 9, 2026
49f42de
fix(webapp): allow the org-avatar favicon endpoint in the img-src policy
kathiekiwi Aug 9, 2026
a6782c0
Merge remote-tracking branch 'origin/feat/dashboard-agent-flows' into…
kathiekiwi Aug 9, 2026
8803b8a
Merge branch 'feat/dashboard-agent-ui' into feat/dashboard-agent-flow…
kathiekiwi Aug 9, 2026
a4cb3ca
Merge branch 'feat/dashboard-agent-flows-watch' into feat/agent-story…
kathiekiwi Aug 9, 2026
edb48d5
fix(webapp): close the queued-reload race and the backslash route escape
kathiekiwi Aug 9, 2026
de84db5
Merge remote-tracking branch 'origin/feat/dashboard-agent-ui' into fe…
kathiekiwi Aug 9, 2026
7bce8f8
Merge branch 'feat/dashboard-agent-flows-watch' into feat/agent-story…
kathiekiwi Aug 9, 2026
1df17cf
test(dashboard-agent): accept the prompt-prefix measurement after the…
kathiekiwi Aug 9, 2026
a42ad77
Merge remote-tracking branch 'origin/feat/dashboard-agent-flows-watch…
kathiekiwi Aug 9, 2026
a27118c
fix(webapp): drop the watch action button when the turn already propo…
kathiekiwi Aug 9, 2026
3984b5c
fix(webapp): report card keeps its series and links, and the metric g…
kathiekiwi Aug 9, 2026
dbb4d34
Merge remote-tracking branch 'origin/feat/dashboard-agent-flows' into…
kathiekiwi Aug 9, 2026
e4ab0a5
test(webapp): the report block adapter keeps series and links
kathiekiwi Aug 9, 2026
aaa9c9c
Merge remote-tracking branch 'origin/feat/dashboard-agent-ui' into fe…
kathiekiwi Aug 9, 2026
7d34cf4
Merge branch 'feat/dashboard-agent-flows-watch' into feat/agent-story…
kathiekiwi Aug 9, 2026
4d695bb
feat(webapp): a user-cancelled watch says so in the chat
kathiekiwi Aug 9, 2026
08871bf
fix(webapp): fit the report metric row at the default panel width
kathiekiwi Aug 9, 2026
acf5a14
fix(webapp): a dead stream with a dangling tool call self-heals from …
kathiekiwi Aug 9, 2026
bf82cce
Merge remote-tracking branch 'origin/feat/dashboard-agent-flows' into…
kathiekiwi Aug 9, 2026
2c8a396
Merge branch 'feat/dashboard-agent-ui' into feat/dashboard-agent-flow…
kathiekiwi Aug 9, 2026
1a38ebc
Merge branch 'feat/dashboard-agent-flows-watch' into feat/agent-story…
kathiekiwi Aug 9, 2026
df64bec
fix(sdk): chat streams reconnect when the body ends mid-turn
kathiekiwi Aug 9, 2026
dd789e2
fix(sdk): re-earn the reconnect budget on any record and honor abort …
kathiekiwi Aug 9, 2026
4378c69
Merge remote-tracking branch 'origin/feat/dashboard-agent-flows' into…
kathiekiwi Aug 9, 2026
ea98c39
Merge branch 'feat/dashboard-agent-ui' into feat/dashboard-agent-flow…
kathiekiwi Aug 9, 2026
3237a77
Merge branch 'feat/dashboard-agent-flows-watch' into feat/agent-story…
kathiekiwi Aug 9, 2026
2f3b2ec
fix(webapp): the last-chat key stays org-true and a foreign chat heal…
kathiekiwi Aug 9, 2026
a264213
fix(webapp): lift the finding line text 2px
kathiekiwi Aug 9, 2026
0d2760e
Merge remote-tracking branch 'origin/feat/dashboard-agent-flows' into…
kathiekiwi Aug 9, 2026
955622a
Merge branch 'feat/dashboard-agent-ui' into feat/dashboard-agent-flow…
kathiekiwi Aug 9, 2026
f6af05e
Merge branch 'feat/dashboard-agent-flows-watch' into feat/agent-story…
kathiekiwi Aug 9, 2026
be99614
fix(webapp): the finding text lifts alone, the label stays with the icon
kathiekiwi Aug 9, 2026
87f1d11
fix(webapp): drop the headline icon 4px
kathiekiwi Aug 9, 2026
cd08d08
Merge remote-tracking branch 'origin/feat/dashboard-agent-flows' into…
kathiekiwi Aug 9, 2026
fcd2107
Merge branch 'feat/dashboard-agent-ui' into feat/dashboard-agent-flow…
kathiekiwi Aug 9, 2026
959e8d6
Merge branch 'feat/dashboard-agent-flows-watch' into feat/agent-story…
kathiekiwi Aug 9, 2026
df020b1
fix(webapp): finding text sits 2px up, not 4
kathiekiwi Aug 9, 2026
d6e1b4e
fix(webapp): a self-evident finding keeps its line and drops the echo…
kathiekiwi Aug 9, 2026
6fcf1cf
fix(webapp): only the warning headline icon sits lower
kathiekiwi Aug 9, 2026
c40b25d
Merge remote-tracking branch 'origin/feat/dashboard-agent-flows' into…
kathiekiwi Aug 9, 2026
94d671f
Merge branch 'feat/dashboard-agent-ui' into feat/dashboard-agent-flow…
kathiekiwi Aug 9, 2026
6f54549
Merge branch 'feat/dashboard-agent-flows-watch' into feat/agent-story…
kathiekiwi Aug 9, 2026
709065a
fix(webapp): a delta arrow without a magnitude renders nothing
kathiekiwi Aug 10, 2026
32e5b76
fix(dashboard-agent): the watch offer button closes the turn
kathiekiwi Aug 10, 2026
1d4af38
fix(webapp): a report card that offers watch recovery suppresses the …
kathiekiwi Aug 10, 2026
b603cfb
Merge remote-tracking branch 'origin/feat/dashboard-agent-flows' into…
kathiekiwi Aug 10, 2026
a58b22b
Merge branch 'feat/dashboard-agent-ui' into feat/dashboard-agent-flow…
kathiekiwi Aug 10, 2026
5779d5d
Merge branch 'feat/dashboard-agent-flows-watch' into feat/agent-story…
kathiekiwi Aug 10, 2026
7ce8bc2
test(dashboard-agent): eval pins the watch offer shape and ordering
kathiekiwi Aug 10, 2026
31e939f
Merge remote-tracking branch 'origin/feat/dashboard-agent-flows-watch…
kathiekiwi Aug 10, 2026
730ded1
test(webapp): a collapse to zero renders no arrow
kathiekiwi Aug 10, 2026
6334137
fix(webapp): watch-branch typing after the cross-org and report-offer…
kathiekiwi Aug 10, 2026
8e675a1
Merge remote-tracking branch 'origin/feat/dashboard-agent-flows' into…
kathiekiwi Aug 10, 2026
5d90f56
Merge branch 'feat/dashboard-agent-ui' into feat/dashboard-agent-flow…
kathiekiwi Aug 10, 2026
5491ffc
Merge branch 'feat/dashboard-agent-flows-watch' into feat/agent-story…
kathiekiwi Aug 10, 2026
94f786c
fix(webapp): chat code blocks render at 12px
kathiekiwi Aug 10, 2026
d1840a2
fix(webapp): revive the code block styling streamdown 2.5 renamed away
kathiekiwi Aug 10, 2026
7789d1f
Merge remote-tracking branch 'origin/feat/dashboard-agent-flows' into…
kathiekiwi Aug 10, 2026
de187d4
Merge branch 'feat/dashboard-agent-ui' into feat/dashboard-agent-flow…
kathiekiwi Aug 10, 2026
510830d
Merge branch 'feat/dashboard-agent-flows-watch' into feat/agent-story…
kathiekiwi Aug 10, 2026
676aee9
fix(webapp): a watch wake says each fact once
kathiekiwi Aug 10, 2026
2cd73ec
fix(webapp): the wake banner stops restating what the text says
kathiekiwi Aug 10, 2026
41a2f4e
Merge remote-tracking branch 'origin/feat/dashboard-agent-flows-watch…
kathiekiwi Aug 10, 2026
44b8128
fix(webapp): the server resolves a watch's queue name, whatever the m…
kathiekiwi Aug 10, 2026
4cfd0a2
Merge remote-tracking branch 'origin/feat/dashboard-agent-flows-watch…
kathiekiwi Aug 10, 2026
b73599b
fix(webapp): action rows render at the end of the turn
kathiekiwi Aug 10, 2026
accc651
merge: bring the actions reorder into the watch branch
kathiekiwi Aug 10, 2026
bddae8c
test(webapp): the watches suite stops triggering real batch runs
kathiekiwi Aug 10, 2026
00c210b
Merge remote-tracking branch 'origin/feat/dashboard-agent-flows-watch…
kathiekiwi Aug 10, 2026
c3fe17b
Merge branch 'feat/dashboard-agent-flows-watch' into feat/agent-story…
kathiekiwi Aug 10, 2026
43deaed
fix(dashboard-agent): a failed batch check keeps the chain alive
kathiekiwi Aug 10, 2026
b7f9bbb
test(webapp): the slot-claim scan survives formatting
kathiekiwi Aug 10, 2026
01ef8fd
fix(webapp): navigation filters speak the run page's language
kathiekiwi Aug 10, 2026
4d9af86
fix(dashboard-agent): navigate_to teaches the run-status vocabulary a…
kathiekiwi Aug 10, 2026
489869e
Merge remote-tracking branch 'origin/feat/dashboard-agent-flows' into…
kathiekiwi Aug 10, 2026
116bfb2
Merge branch 'feat/dashboard-agent-ui' into feat/dashboard-agent-flow…
kathiekiwi Aug 10, 2026
a36b670
Merge branch 'feat/dashboard-agent-flows-watch' into feat/agent-story…
kathiekiwi Aug 10, 2026
5e5772e
test(webapp): the email alert gate refuses when either transport var …
kathiekiwi Aug 10, 2026
69c7b02
test(webapp): report parity matches the de-duplicated untrustworthy l…
kathiekiwi Aug 10, 2026
a81b4fa
Merge remote-tracking branch 'origin/feat/dashboard-agent-ui' into fe…
kathiekiwi Aug 10, 2026
3ccaf93
Merge remote-tracking branch 'origin/feat/dashboard-agent-flows-watch…
kathiekiwi Aug 10, 2026
f6c90ec
fix(webapp): lint and env-independence in the watch test suite
kathiekiwi Aug 10, 2026
61c60af
Merge remote-tracking branch 'origin/feat/dashboard-agent-flows-watch…
kathiekiwi Aug 10, 2026
a6ae419
merge: origin/main into dashboard-agent base (resolve report-health)
kathiekiwi Aug 10, 2026
f93f8d6
fix(webapp): detect tables inside a JOIN…ON subquery for query-scope …
kathiekiwi Aug 10, 2026
fb4f0b3
fix(webapp): stop the agent body cap matching a task named dashboard-…
kathiekiwi Aug 10, 2026
bb077d4
fix(dashboard-agent): time out stalled agent HTTP calls
kathiekiwi Aug 10, 2026
28c28e6
fix(webapp): cap report cache TTL to the liveness fresh window
kathiekiwi Aug 10, 2026
aef86b3
fix(webapp): reword the healthy-execution report line to not imply fa…
kathiekiwi Aug 10, 2026
64eaf2f
fix(webapp): return 400 for ai-help with a missing query param
kathiekiwi Aug 10, 2026
35ab0c5
fix(webapp): ceiling a capless user-actor token to read-only on env-J…
kathiekiwi Aug 10, 2026
6cb0631
fix(webapp): clamp an env-JWT's lifetime to the delegated token's expiry
kathiekiwi Aug 10, 2026
e367280
fix(webapp): gate the agent maintenance cron on the agent being confi…
kathiekiwi Aug 10, 2026
3f1eec6
docs(errors-api-e2e): mint the e2e token with an explicit write cap
kathiekiwi Aug 10, 2026
502e1bd
fix(webapp): block remote images in model-authored markdown
kathiekiwi Aug 10, 2026
65c60df
fix(webapp): reject CSP-delimiter characters in the img-src allowlist
kathiekiwi Aug 10, 2026
237f01a
test(webapp): assert report cache TTL stays within the liveness fresh…
kathiekiwi Aug 10, 2026
ca2bacd
merge: base-misc review fixes (M2, M10a, H8, H13, M10r, ai-help, swee…
kathiekiwi Aug 10, 2026
b962949
test(webapp): assert StreamdownRenderer drops remote image src end-to…
kathiekiwi Aug 10, 2026
94c3a47
merge: CSP review fixes (B2 block remote model images, B4 reject CSP …
kathiekiwi Aug 10, 2026
99bbc07
merge: propagate review fixes from feat/dashboard-agent-flows
kathiekiwi Aug 10, 2026
e180df0
merge: propagate review fixes from feat/dashboard-agent-ui
kathiekiwi Aug 10, 2026
41c44b9
fix(webapp): gate the watch maintenance cron on the agent being confi…
kathiekiwi Aug 10, 2026
569fe1c
merge: propagate review fixes from feat/dashboard-agent-flows-watch
kathiekiwi Aug 10, 2026
39ba709
fix(dashboard-agent): fence and cap untrusted free-text in tool results
kathiekiwi Aug 10, 2026
5a83bcb
fix(dashboard-agent): tell the agent fenced tool text is data, not in…
kathiekiwi Aug 10, 2026
bf6872d
fix(dashboard-agent): neutralize fence delimiters in payload and fenc…
kathiekiwi Aug 10, 2026
2e58b36
fix(webapp,cli): cap user-actor token lifetime at 7 days
kathiekiwi Aug 10, 2026
1acb6b8
fix(webapp): bind user-actor tokens to their source PAT
kathiekiwi Aug 10, 2026
c18a073
fix(webapp): give the agent's env JWT a stable rate-limit key
kathiekiwi Aug 10, 2026
1e97712
test(webapp): cover the jwt-actor rate-limit branch, not just the helper
kathiekiwi Aug 10, 2026
a97ada5
fix(webapp): recheck the source PAT against the token's own claim, no…
kathiekiwi Aug 10, 2026
b14c8f3
merge: B3 prompt-injection boundary on tool results
kathiekiwi Aug 10, 2026
d6f67d4
merge: H3 PAT-bound token revocation + 7d ceiling, H9 stable rate-lim…
kathiekiwi Aug 10, 2026
876ed56
feat(webapp,dashboard-agent-db): retain and purge deleted agent chats
kathiekiwi Aug 10, 2026
8506877
merge: propagate wave-2 review fixes from feat/dashboard-agent-flows
kathiekiwi Aug 10, 2026
2d0d954
merge: propagate wave-2 review fixes from feat/dashboard-agent-ui
kathiekiwi Aug 10, 2026
23b03c0
merge: propagate wave-2 review fixes from feat/dashboard-agent-flows-…
kathiekiwi Aug 10, 2026
18379a4
fix(webapp): don't let a failed agent-purge enqueue break org deletion
kathiekiwi Aug 10, 2026
41fdffe
merge: org-delete agent-purge enqueue is best-effort
kathiekiwi Aug 10, 2026
2bcd7eb
merge: propagate org-purge best-effort from feat/dashboard-agent-flows
kathiekiwi Aug 10, 2026
28b8183
merge: propagate org-purge best-effort from feat/dashboard-agent-ui
kathiekiwi Aug 10, 2026
1407cc8
merge: propagate org-purge best-effort from feat/dashboard-agent-flow…
kathiekiwi Aug 10, 2026
d2704fa
fix(dashboard-agent): drop doubled "error" prefix in recurrence watch…
kathiekiwi Aug 10, 2026
70c1092
fix(webapp): keep the stored chat pointer when opening a chat fails t…
kathiekiwi Aug 10, 2026
3977c2d
fix(dashboard-agent): finalize the turn's own message ids from newUIM…
kathiekiwi Aug 10, 2026
bd5f8fd
fix(dashboard-agent-db): scope softDeleteChat by organizationId
kathiekiwi Aug 10, 2026
2932b88
merge: newUIMessages finalize + softDeleteChat org-scope review-comme…
kathiekiwi Aug 10, 2026
83b7f07
merge: openChat chat-pointer transient 5xx review-comment fixes
kathiekiwi Aug 10, 2026
ab7d796
merge: watch-wording shortFingerprint review-comment fixes
kathiekiwi Aug 10, 2026
c0a93b0
merge: propagate review-comment fixes from feat/dashboard-agent-flows
kathiekiwi Aug 10, 2026
8d830a0
merge: propagate review-comment fixes from feat/dashboard-agent-ui
kathiekiwi Aug 10, 2026
1e7600e
merge: propagate review-comment fixes from feat/dashboard-agent-flows…
kathiekiwi Aug 10, 2026
5b6e4d0
fix(webapp): replace a stale running step when a settled transcript i…
kathiekiwi Aug 11, 2026
f15a823
fix(webapp): show the cumulative watch-result count in the grouped toast
kathiekiwi Aug 11, 2026
917c75b
merge: replace stale running step on settled transcript re-read
kathiekiwi Aug 11, 2026
1bc64e0
merge: cumulative watch-result count in grouped toast
kathiekiwi Aug 11, 2026
29ae454
merge: propagate second-pass fixes from feat/dashboard-agent-ui
kathiekiwi Aug 11, 2026
cc576bf
merge: propagate second-pass fixes from feat/dashboard-agent-flows-watch
kathiekiwi Aug 11, 2026
40a610b
chore(server-changes): consolidate the dashboard-agent notes into one
kathiekiwi Aug 11, 2026
a1dc88a
merge: consolidate dashboard-agent server-changes 11 to 1
kathiekiwi Aug 11, 2026
12e04c2
merge: propagate server-changes consolidation from feat/dashboard-age…
kathiekiwi Aug 11, 2026
9687eff
merge: propagate server-changes consolidation from feat/dashboard-age…
kathiekiwi Aug 11, 2026
f0a55cc
merge: propagate server-changes consolidation from feat/dashboard-age…
kathiekiwi Aug 11, 2026
1424441
chore: consolidate this PR's changesets into one
kathiekiwi Aug 11, 2026
fe30aa4
docs(server-changes): restore dropped user-facing dashboard agent points
kathiekiwi Aug 11, 2026
f7dfc90
fix(webapp): stop the project-wide user-actor route 500-ing for claim…
kathiekiwi Aug 11, 2026
32ea4b0
test(webapp): add the recheck export to stale user-actor auth mocks
kathiekiwi Aug 11, 2026
4736a93
merge: add recheck/assertSourcePatActive exports to stale auth test m…
kathiekiwi Aug 11, 2026
db414b7
merge: consolidate PR changesets and restore dropped note points
kathiekiwi Aug 11, 2026
bdf1126
merge: propagate changeset consolidation and note restoration from fe…
kathiekiwi Aug 11, 2026
d34beec
merge: propagate changeset consolidation and note restoration from fe…
kathiekiwi Aug 11, 2026
51bd9c0
merge: propagate changeset consolidation and note restoration from fe…
kathiekiwi Aug 11, 2026
2aeb32f
refactor(webapp): move dashboard-agent render UI to the UI PR
kathiekiwi Aug 11, 2026
635cab2
chore: mark generated drizzle meta as generated
kathiekiwi Aug 11, 2026
f7a7753
merge: propagate base UI relocation + drizzle attribution
kathiekiwi Aug 11, 2026
b046bef
merge: propagate base UI relocation + drizzle attribution
kathiekiwi Aug 11, 2026
81e7b0a
merge: propagate base UI relocation + drizzle attribution
kathiekiwi Aug 11, 2026
24c87c3
test(webapp): assert FROM-less SELECT is valid in the tsql linter
kathiekiwi Aug 11, 2026
4962f7a
test(webapp): update the stale missing-FROM tsql linter case
kathiekiwi Aug 11, 2026
8f8fb98
merge: propagate the tsql linter test fix from feat/dashboard-agent-f…
kathiekiwi Aug 11, 2026
b6b7463
merge: propagate the tsql linter test fix from feat/dashboard-agent-ui
kathiekiwi Aug 11, 2026
ed7a111
merge: propagate the tsql linter test fix from feat/dashboard-agent-f…
kathiekiwi Aug 11, 2026
b2f1d82
test(webapp): move card/winner tests to the UI PR with their render code
kathiekiwi Aug 11, 2026
6a64769
merge: propagate card-test relocation
kathiekiwi Aug 11, 2026
6e4cd37
merge: propagate card-test relocation
kathiekiwi Aug 11, 2026
aeded42
merge: propagate card-test relocation
kathiekiwi Aug 11, 2026
54ab14f
chore: merge main into feat/dashboard-agent-flows
kathiekiwi Aug 11, 2026
eca32d2
chore: merge feat/dashboard-agent-flows (main sync)
kathiekiwi Aug 11, 2026
036b3e5
chore: merge feat/dashboard-agent-ui (main sync)
kathiekiwi Aug 11, 2026
78ea8d8
chore: merge feat/dashboard-agent-flows-watch (main sync)
kathiekiwi Aug 11, 2026
1e7f861
fix(webapp): clear the history-list thinking marker when the streamin…
kathiekiwi Aug 11, 2026
461226d
fix(webapp): make the gallery dismissed-prompts state actually dismis…
kathiekiwi Aug 11, 2026
6b26b28
fix(webapp): stop the grouped watch-updates toast counting wakes the …
kathiekiwi Aug 11, 2026
8023384
chore: merge feat/dashboard-agent-ui (review fixes)
kathiekiwi Aug 11, 2026
a0b605d
chore: merge feat/dashboard-agent-flows-watch (review fixes)
kathiekiwi Aug 11, 2026
dec52bd
chore: merge main into feat/dashboard-agent-ui (post-squash of #4418)
kathiekiwi Aug 11, 2026
eb4f824
fix(webapp): harden model-facing sanitizers, claims resolution and so…
kathiekiwi Aug 11, 2026
8ec976c
chore: merge feat/dashboard-agent-ui (review fixes round 2)
kathiekiwi Aug 11, 2026
cd96f40
chore: merge feat/dashboard-agent-flows-watch (review fixes round 2)
kathiekiwi Aug 11, 2026
a964b09
fix(webapp): keep the draft on Escape and finish polling a died-mid-t…
kathiekiwi Aug 11, 2026
6a33661
fix(webapp): don't mark the open chat unread when the history list re…
kathiekiwi Aug 11, 2026
eeabff0
fix(webapp): use the stored fingerprint form in the demo error watch
kathiekiwi Aug 11, 2026
02d60a4
chore: merge feat/dashboard-agent-ui (review fixes round 3)
kathiekiwi Aug 11, 2026
645895a
chore: merge feat/dashboard-agent-flows-watch (review fixes round 3)
kathiekiwi Aug 11, 2026
843d02b
fix(webapp): let a second Escape close the panel while keeping the fi…
kathiekiwi Aug 11, 2026
a29986b
chore: merge feat/dashboard-agent-ui (composer escape follow-up)
kathiekiwi Aug 11, 2026
3129f72
chore: merge feat/dashboard-agent-flows-watch (composer escape follow…
kathiekiwi Aug 11, 2026
b5c4d1a
chore: merge main into feat/dashboard-agent-flows-watch (post-squash …
kathiekiwi Aug 12, 2026
261a620
chore: merge feat/dashboard-agent-flows-watch (main sync post-#4529)
kathiekiwi Aug 12, 2026
9b6a679
fix(webapp): watch toast plural and container-test hygiene (review)
kathiekiwi Aug 12, 2026
773b43f
fix(dashboard-agent): settle deliveries on chat deletion, accept in-f…
kathiekiwi Aug 12, 2026
ecd293d
chore(webapp,dashboard-agent): review nitpicks — tolerant test assert…
kathiekiwi Aug 12, 2026
3536826
chore: merge review-fix packet (fix(webapp): watch toast plural and c…
kathiekiwi Aug 12, 2026
4a00424
chore: merge review-fix packet (fix(dashboard-agent): settle deliveri…
kathiekiwi Aug 12, 2026
f1f589d
chore: merge review-fix packet (chore(webapp,dashboard-agent): review…
kathiekiwi Aug 12, 2026
3b32417
chore: merge feat/dashboard-agent-flows-watch (review fixes)
kathiekiwi Aug 12, 2026
a696f61
fix(webapp): don't re-send a consumed prompt when switching back to a…
kathiekiwi Aug 12, 2026
2b75a1e
chore: merge review-fix packet (prompt re-send guard)
kathiekiwi Aug 12, 2026
6de38dc
chore: merge feat/dashboard-agent-flows-watch (prompt re-send guard)
kathiekiwi Aug 12, 2026
fa20901
chore: merge main into feat/agent-storybook-gallery (post-squash of #…
kathiekiwi Aug 12, 2026
8cf6099
fix(webapp): let a zero source line reach the URI validator instead o…
kathiekiwi Aug 12, 2026
53d1845
chore: merge review-fix packet (demo line-0 guard)
kathiekiwi Aug 12, 2026
297d6b6
fix(sdk): watch-mode chat subscriptions survive quiet windows (#4548)
kathiekiwi Aug 12, 2026
d0d06c3
fix(webapp): skip the plan-limit cache when billing isn't configured
kathiekiwi Aug 12, 2026
0315232
docs(webapp): scope the watch-limits release note to what's enforced
kathiekiwi Aug 12, 2026
1b3ba21
docs(sdk): note that aborting a resumed subscription no longer stops …
kathiekiwi Aug 12, 2026
4b307dd
fix(webapp): honor a zero message allowance and prefer the server-res…
kathiekiwi Aug 12, 2026
a70c71e
fix(webapp): don't tell paid plans their message allowance was the Fr…
kathiekiwi Aug 12, 2026
6f03c5e
fix(webapp): disable suggestion chips when the message allowance is s…
kathiekiwi Aug 12, 2026
1a2e187
fix(webapp): disable the turn-error retry when the message allowance …
kathiekiwi Aug 12, 2026
c56e3e5
fix(sdk): let a watch subscription re-establish after a reload when t…
kathiekiwi Aug 12, 2026
f15ad15
fix(webapp): release the upgrade panel when the message allowance fre…
kathiekiwi Aug 12, 2026
01eeade
fix(webapp): normalize dashboard-agent message text to well-formed UT…
kathiekiwi Aug 12, 2026
7b07c4f
fix(dashboard-agent): truncate strings without splitting surrogate pairs
kathiekiwi Aug 12, 2026
ac029e5
chore: consolidate release notes
kathiekiwi Aug 12, 2026
f03dfd9
fix(dashboard-agent): normalize message JSON to well-formed UTF-16 at…
kathiekiwi Aug 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
7 changes: 7 additions & 0 deletions .changeset/chat-stream-mid-turn-reconnect.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
"@trigger.dev/core": patch
"@trigger.dev/sdk": patch
"trigger.dev": patch
---

Chat in the browser now reconnects when the connection drops mid-turn, instead of leaving the reply stuck as if it were still generating. Reports can be fetched as structured data with the `json` format, and the shortest report period is now one minute (`30m`, `1h`, `7d`). The `mint-token` command's help is clearer too: a token minted without `--cap` is read-only, and `--ttl` shows the correct maximum lifetime of 7 days.
5 changes: 5 additions & 0 deletions .changeset/quiet-hounds-shave.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@trigger.dev/core": patch
---

The current-worker API now reports each task's queue, so you can see which tasks write to a given queue.
2 changes: 1 addition & 1 deletion .claude/skills/errors-api-e2e/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,7 @@ PASS: one run, `run_<RID>` (status maps to `FAILED`). Proves `filter[error]` ->
### 6. Attribution — `mint-token` -> JWT exchange records the acting user

```bash
TOKEN=$(cli mint-token --profile $PROFILE --client errors-api-e2e 2>/dev/null) # UAT
TOKEN=$(cli mint-token --profile $PROFILE --client errors-api-e2e --cap read:errors,write:errors 2>/dev/null) # UAT
ENVJWT=$(curl -sS -X POST "$B/api/v1/projects/$REF/dev/jwt" -H "Authorization: Bearer $TOKEN" \
-H 'Content-Type: application/json' -d '{"claims":{"scopes":["read:errors","write:errors"]}}' \
| python3 -c "import sys,json;print(json.load(sys.stdin)['token'])")
Expand Down
5 changes: 5 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# Generated, not hand-written: collapsed in diffs and excluded from language stats.
internal-packages/dashboard-agent-db/drizzle/meta/*.json linguist-generated=true
internal-packages/dashboard-agent-db/drizzle/meta/** linguist-generated=true
**/__snapshots__/*.snap linguist-generated=true
pnpm-lock.yaml linguist-generated=true
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -85,3 +85,5 @@ ailogger-output.log

# observability-map CLI output artifact, not committed
observability-map.json

.claude/worktrees/
10 changes: 10 additions & 0 deletions .server-changes/dashboard-agent.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
---
area: webapp
type: feature
---

Meet the dashboard agent: a chat in every environment that answers questions about your runs, queues, errors and health with real data and links, replacing Ask AI everywhere it used to appear. Investigate a failed run, an error, a backed-up queue or a run that hasn't started to get a worked-through answer — what happened, why, and how to fix it, with every claim linked to the runs, errors and deploys behind it. It reads your data read-only, works on preview and dev branches with that branch's own data, and reads the same everywhere — dashboard, terminal, editor. A very long chat keeps working: the agent summarises the earlier part and carries on.

**Watch…** on a run, queue, error or the health report tells you when things change: a run finishes, a queue clears or grows past a number you pick, an error comes back, an environment recovers. The answer arrives in the chat and, if you want, by email, Slack or webhook — and the agent can look into bad news on its own. A watch reaches you on any browser you sign in from, without opening the chat first.

A sample of conversations is scored automatically so the agent keeps getting better; only the score and a one-line summary are kept, never your messages, data or code, and we can switch it off for your organization on request. The Docs button is gone from page headers — ask the agent instead, or open Documentation from Help & Feedback. Separately, a queue's wait times, peak depth, throughput and throttling can now be read from the API.
6 changes: 6 additions & 0 deletions .server-changes/watch-summary-cumulative-count.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
area: webapp
type: fix
---

The grouped "watch updates" notification now shows the total number of results waiting, instead of only the most recent batch's count.
5 changes: 4 additions & 1 deletion apps/webapp/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@ node_modules
/cypress/screenshots
/cypress/videos

# Output of `pnpm run agent-ui:screenshots`
/screenshots

/app/styles/tailwind.css

# Ensure the .env symlink is not removed by accident
Expand All @@ -20,4 +23,4 @@ storybook-static

/prisma/seed.js
/prisma/populate.js
.memory-snapshots
.memory-snapshots
75 changes: 34 additions & 41 deletions apps/webapp/app/components/AskAI.tsx
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
/**
* Mostly superseded by the dashboard agent (`components/dashboard-agent`), which owns every
* entry point except two: ⌘I and the CLI's `?aiHelp=` link still open Ask AI. `AskAIRoot` is
* mounted by the `_app` layout for those; the `AskAI` button below is mounted nowhere.
*/

import {
ArrowPathIcon,
ArrowUpIcon,
Expand All @@ -11,13 +17,17 @@ import { useSearchParams } from "@remix-run/react";
import DOMPurify from "dompurify";
import { motion } from "framer-motion";
import { marked } from "marked";
import { type ReactNode, useCallback, useEffect, useRef, useState } from "react";
import { useTypedRouteLoaderData } from "remix-typedjson";
import { useCallback, useEffect, useRef, useState } from "react";
import { AISparkleIcon } from "~/assets/icons/AISparkleIcon";
import { SparkleListIcon } from "~/assets/icons/SparkleListIcon";
import { useFeatures } from "~/hooks/useFeatures";
import { useAskAiAvailability } from "~/hooks/useAskAiAvailability";
import { useShortcutKeys } from "~/hooks/useShortcutKeys";
import { type loader } from "~/root";
import {
ASK_AI_DEEP_LINK_PARAM,
ASK_AI_SHORTCUT,
askAiCanOpen,
} from "./dashboard-agent/ask-ai-channels";
import { useAskAiHost } from "./dashboard-agent/askAiOpenRequest";
import { Button } from "./primitives/Buttons";
import { Callout } from "./primitives/Callout";
import { Dialog, DialogContent, DialogHeader, DialogTitle } from "./primitives/Dialog";
Expand All @@ -34,11 +44,6 @@ import {
} from "./primitives/Tooltip";
import { ClientOnly } from "remix-utils/client-only";

function useKapaWebsiteId() {
const routeMatch = useTypedRouteLoaderData<typeof loader>("root");
return routeMatch?.kapa.websiteId;
}

/** Open/close state for the Ask AI dialog, including the `?aiHelp=` deep-link handling. */
function useAskAIState() {
const [isOpen, setIsOpen] = useState(false);
Expand All @@ -61,14 +66,14 @@ function useAskAIState() {

// Handle URL param functionality
useEffect(() => {
const aiHelp = searchParams.get("aiHelp");
const aiHelp = searchParams.get(ASK_AI_DEEP_LINK_PARAM);
if (aiHelp) {
// Delay to avoid hCaptcha bot detection
window.setTimeout(() => openAskAI(aiHelp), 1000);

// Clone instead of mutating in place
const next = new URLSearchParams(searchParams);
next.delete("aiHelp");
next.delete(ASK_AI_DEEP_LINK_PARAM);
setSearchParams(next);
}
}, [searchParams, openAskAI]);
Expand All @@ -77,43 +82,30 @@ function useAskAIState() {
}

/**
* Hosts Ask AI (Kapa provider, ⌘I shortcut, dialog) for a menu that renders its own trigger. Wrap
* it around the popover, not inside, so the dialog and shortcut survive the popover closing.
* `children` receives the open function, or undefined when Ask AI is unavailable (self-hosted, no
* Kapa website id, or SSR).
* Hosts Ask AI (Kapa provider, ⌘I shortcut, dialog). It renders no page content and wraps
* nothing: entry points reach it through `requestAskAi`, so the Kapa provider mounting after
* hydration can never remount the app around it.
*/
export function AskAIRoot({
children,
}: {
children: (openAskAI: (() => void) | undefined) => ReactNode;
}) {
const { isManagedCloud } = useFeatures();
const websiteId = useKapaWebsiteId();
export function AskAIRoot() {
const availability = useAskAiAvailability();

if (!isManagedCloud || !websiteId) {
return <>{children(undefined)}</>;
if (!askAiCanOpen(availability)) {
return null;
}

return (
<ClientOnly fallback={<>{children(undefined)}</>}>
{() => <AskAIRootProvider websiteId={websiteId}>{children}</AskAIRootProvider>}
</ClientOnly>
);
const websiteId = availability.kapaWebsiteId!;

return <ClientOnly>{() => <AskAIRootProvider websiteId={websiteId} />}</ClientOnly>;
}

function AskAIRootProvider({
websiteId,
children,
}: {
websiteId: string;
children: (openAskAI: () => void) => ReactNode;
}) {
function AskAIRootProvider({ websiteId }: { websiteId: string }) {
const { isOpen, setIsOpen, initialQuery, openAskAI, closeAskAI } = useAskAIState();

useShortcutKeys({
shortcut: { modifiers: ["mod"], key: "i", enabledOnInputElements: true },
shortcut: ASK_AI_SHORTCUT,
action: () => openAskAI(),
});
useAskAiHost(openAskAI);

return (
<KapaProvider
Expand All @@ -126,7 +118,6 @@ function AskAIRootProvider({
}}
botProtectionMechanism="hcaptcha"
>
{children(() => openAskAI())}
<AskAIDialog
initialQuery={initialQuery}
isOpen={isOpen}
Expand All @@ -137,14 +128,16 @@ function AskAIRootProvider({
);
}

/** @deprecated Mounted nowhere: the sidebar's AI entry point is the dashboard agent. */
export function AskAI({ isCollapsed = false }: { isCollapsed?: boolean }) {
const { isManagedCloud } = useFeatures();
const websiteId = useKapaWebsiteId();
const availability = useAskAiAvailability();

if (!isManagedCloud || !websiteId) {
if (!askAiCanOpen(availability)) {
return null;
}

const websiteId = availability.kapaWebsiteId!;

return (
<ClientOnly
fallback={
Expand Down
105 changes: 58 additions & 47 deletions apps/webapp/app/components/BlankStatePanels.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ import {
v3NewProjectAlertPath,
v3NewSchedulePath,
} from "~/utils/pathBuilder";
import { AskAI } from "./AskAI";
import { AskAgentButton } from "./dashboard-agent/AskAgentButton";
import { CodeBlock } from "./code/CodeBlock";
import { useDevPresence } from "./DevPresence";
import { InlineCode } from "./code/InlineCode";
Expand Down Expand Up @@ -65,6 +65,55 @@ import {
import { StepContentContainer } from "./StepContentContainer";
import { V4Badge } from "./V4Badge";

/**
* What the agent is asked when it's opened from a deployment setup panel. The panel is the docs
* answer; the agent is for the part the docs can't answer — this project, this environment.
*/
const ASK_AGENT_DEPLOY_PROMPT =
"I'm trying to deploy my tasks to this environment. Walk me through it and tell me if anything about this project or environment is going to get in the way.";

/** The docs links the deployment panels offer to anyone without the agent. */
function DeployDocsLinks() {
return (
<>
<SimpleTooltip
asChild
tabbable
button={
// Span wrapper: LinkButton drops the pointer-event props Radix injects via asChild, so
// the tooltip trigger has to be a plain element (same pattern as FavoritePageButton).
<span className="flex">
<LinkButton
variant="small-menu-item"
LeadingIcon={BookOpenIcon}
leadingIconClassName="text-blue-500"
to={docsPath("deployment/overview")}
aria-label="Deploy docs"
/>
</span>
}
content="Deploy docs"
/>
<SimpleTooltip
asChild
tabbable
button={
<span className="flex">
<LinkButton
variant="small-menu-item"
LeadingIcon={QuestionMarkCircleIcon}
leadingIconClassName="text-blue-500"
to={docsPath("troubleshooting#deployment")}
aria-label="Troubleshooting docs"
/>
</span>
}
content="Troubleshooting docs"
/>
</>
);
}

export function HasNoTasksDev({ initializedAt }: { initializedAt: Date | string | null }) {
const { isConnected } = useDevPresence();
const initialized = !!initializedAt;
Expand Down Expand Up @@ -330,29 +379,10 @@ export function DeploymentsNoneDev() {
<Header1>Deploy your tasks</Header1>
</div>
<div className="flex items-center">
<SimpleTooltip
button={
<LinkButton
variant="small-menu-item"
LeadingIcon={BookOpenIcon}
leadingIconClassName="text-blue-500"
to={docsPath("deployment/overview")}
/>
}
content="Deploy docs"
/>
<SimpleTooltip
button={
<LinkButton
variant="small-menu-item"
LeadingIcon={QuestionMarkCircleIcon}
leadingIconClassName="text-blue-500"
to={docsPath("troubleshooting#deployment")}
/>
}
content="Troubleshooting docs"
/>
<AskAI />
{/* One entry point instead of two: the docs links were a guess at which page you
needed, and the agent can look at this project and answer for it. Someone with no
agent still gets the links. */}
<AskAgentButton prompt={ASK_AGENT_DEPLOY_PROMPT} fallback={<DeployDocsLinks />} />
</div>
</div>
<StepNumber stepNumber="→" title="Switch to a deployed environment" />
Expand Down Expand Up @@ -718,29 +748,10 @@ function DeploymentOnboardingSteps() {
</Header1>
</div>
<div className="flex items-center">
<SimpleTooltip
button={
<LinkButton
variant="small-menu-item"
LeadingIcon={BookOpenIcon}
leadingIconClassName="text-blue-500"
to={docsPath("deployment/overview")}
/>
}
content="Deploy docs"
/>
<SimpleTooltip
button={
<LinkButton
variant="small-menu-item"
LeadingIcon={QuestionMarkCircleIcon}
leadingIconClassName="text-blue-500"
to={docsPath("troubleshooting#deployment")}
/>
}
content="Troubleshooting docs"
/>
<AskAI />
{/* One entry point instead of two: the docs links were a guess at which page you
needed, and the agent can look at this project and answer for it. Someone with no
agent still gets the links. */}
<AskAgentButton prompt={ASK_AGENT_DEPLOY_PROMPT} fallback={<DeployDocsLinks />} />
</div>
</div>
<ClientTabs defaultValue="github">
Expand Down
Loading
Loading