Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
1041 commits
Select commit Hold shift + click to select a range
2301ed6
refactor(run-engine): make taskIdentifier optional on run-queue messa…
ericallam May 12, 2026
1e4b896
Fix(webapp): Notification style updates (#3553)
samejr May 12, 2026
41a486e
chore: release v4.4.6 (#3501)
github-actions[bot] May 12, 2026
8e675a4
fix(core): retry TASK_PROCESS_SIGSEGV under the user's retry policy (…
matt-aitken May 12, 2026
3cbe9f2
chore: add .claude/REVIEW.md with CI drift check (#3561)
ericallam May 12, 2026
e4981d1
feat(webapp): consolidate auth path + add comprehensive auth tests (#…
matt-aitken May 12, 2026
e8ef374
fix(webapp,run-engine): honor per-queue length cap on concurrency-key…
ericallam May 12, 2026
5c4e064
chore(docker): disable ClickHouse system log tables in local dev (#3565)
ericallam May 12, 2026
6b0e78f
chore: raise REVIEW.md drift-audit turn budget and steer selective sa…
ericallam May 12, 2026
759214e
fix(webapp): Evict legacy resizable-panel localStorage on client boot…
samejr May 13, 2026
b23740b
docs(self-hosting): NodeLocal DNS and ClickHouse task events (#3568)
isshaddad May 13, 2026
d144220
ci: path-based skip and gate job in pr_checks (#3615)
nicktrn May 13, 2026
8ba067d
feat(webapp): preserve admin tabs search query between Users and Orga…
nicktrn May 13, 2026
be1a6cf
feat: Sessions primitive — durable run-aware streams + dashboard
ericallam May 10, 2026
09f5354
fix(core): cap idempotencyKey length at the API boundary (#3560)
d-cs May 14, 2026
979655c
feat: Sessions dashboard, task_kind, and chat-ready hardening (1/4) (…
ericallam May 14, 2026
9caf4ce
ci: skip typecheck for workflow-only PRs (#3619)
nicktrn May 14, 2026
b62c8a1
ci: add dependabot weekly summary workflow (#3616)
nicktrn May 14, 2026
16720a5
feat(sdk): chat.agent — runtime + browser transport
ericallam May 10, 2026
a97365d
feat(sdk): chat.agent — runtime + browser transport (2/4) (#3543)
ericallam May 14, 2026
5022769
fix(webapp): retry on version collision when initializing a deploymen…
d-cs May 14, 2026
23ff763
feat(webapp): agent-view dashboard for chat.agent runs
ericallam May 10, 2026
16538f6
feat(webapp): agent-view dashboard for chat.agent runs (3/4) (#3545)
ericallam May 14, 2026
8673d42
feat: ai-chat reference project + MCP agent-chat tooling
ericallam May 10, 2026
15b7cde
feat: ai-chat reference project + MCP agent-chat tooling (4/4) (#3546)
ericallam May 14, 2026
e59291e
docs(ai-chat): clarify local setup with .env.example (#3623)
ericallam May 14, 2026
0510fd6
ci: skip typecheck for refs and non-code file PRs (#3624)
nicktrn May 14, 2026
ac02c0f
fix(core): drop unique-symbol brand on LocalsKey to fix dual-package …
ericallam May 15, 2026
bff4b46
fix(webapp): log Google auth conflict as warn instead of error (#3627)
d-cs May 15, 2026
454f0c9
perf(webapp): cache task metadata in Redis for the trigger hotpath (#…
ericallam May 15, 2026
4c42f6c
feat(webapp,core,cli): filter runs by region in dashboard, API, and M…
ericallam May 15, 2026
dfa3ede
feat(ci): support release candidates via changesets pre mode (#3628)
ericallam May 15, 2026
eedde27
chore: rewrite v4.5.0 release content around AI Agents (#3629)
ericallam May 15, 2026
5788573
chore: enter prerelease mode (rc) to ship v4.5.0-rc.0 (#3630)
ericallam May 15, 2026
032b5a1
fix(clickhouse): renumber task_kind migration 029 → 031 (#3631)
ericallam May 15, 2026
05d3ab1
docs(clickhouse): require max+1 numbering and idempotent DDL (#3633)
ericallam May 15, 2026
a8280f1
ci: fix code path filter negation (#3637)
nicktrn May 16, 2026
627e059
feat(trigger-sdk): add streamBaseURL to TriggerChatTransport (#3641)
ericallam May 17, 2026
55fa2d4
fix(cli): TRIGGER_BUILD_SKIP_REWRITE_TIMESTAMP escape hatch for local…
ericallam May 17, 2026
9623e88
fix(webapp): collapse Prisma P1001 errors into a single Sentry issue …
d-cs May 18, 2026
f88d401
fix(webapp): dedupe realtimeStreams array push on stream create (#3653)
ericallam May 18, 2026
82853de
feat(webapp,core,sdk,cli): bound session.out via per-turn trim (#3644)
ericallam May 18, 2026
6c9f1f1
chore: parameterize docker host ports and wire s2-lite by default (#3…
ericallam May 18, 2026
906d5fa
feat(mollifier): trigger burst smoothing — Phase 1 (monitoring) (#3614)
d-cs May 18, 2026
8b98e21
fix(sdk,core): cache realtime-stream credentials per slot with refres…
ericallam May 18, 2026
427d9e0
feat(sdk): functional baseURL and fetch override on chat transports (…
ericallam May 18, 2026
02d61af
fix(webapp): sanitize OTel attributes on ClickHouse JSON parse reject…
0ski May 18, 2026
5dacab0
fix: validate email format on magic link login (#3660)
nicktrn May 18, 2026
2f261e5
fix(webapp): catch loader/action throws before Remix serializes them …
d-cs May 19, 2026
e825409
ci(release): exit changeset pre mode before snapshot prerelease (#3665)
ericallam May 19, 2026
2fbac48
feat(webapp): prompt to clear TRIGGER_VERSION on disabling Vercel ato…
0ski May 19, 2026
436b7a9
fix(webapp): fold S2 token scope into access-token cache key (#3668)
ericallam May 19, 2026
204a766
feat(webapp): expose is_warm_start in TRQL runs schema (#3667)
isshaddad May 19, 2026
12d2125
fix(sdk,core,build): SDK hardening pass (#3670)
ericallam May 19, 2026
f91b96e
feat(sdk,core): preserve chat.agent context after cancel / OOM / cras…
ericallam May 20, 2026
6b46a34
fix(webapp): return 404 instead of 500 for missing env/project/schedu…
d-cs May 20, 2026
aec7e0a
perf(webapp): index EnvironmentVariableValue.environmentId (#3675)
ericallam May 20, 2026
d343727
fix(webapp,sdk): keep chat.agent snapshots on one object store (#3679)
ericallam May 20, 2026
9ff410b
feat(sdk): type chat.createStartSessionAction against your chat agent…
ericallam May 21, 2026
89d085a
fix(references): repair ai-chat typecheck against current wire shape …
ericallam May 21, 2026
422f9f0
ci: unblock changesets release PRs (#3687)
ericallam May 21, 2026
acfba02
chore: release v4.5.0-rc.0 (#3563)
github-actions[bot] May 21, 2026
dbf9b4e
fix(core,cli): register tasks loaded via dynamic import during run (#…
nicktrn May 21, 2026
5ddb81a
fix(cli): stop chat.agent skills silently disappearing from trigger d…
ericallam May 21, 2026
0b5b817
chore: release v4.5.0-rc.1 (#3691)
github-actions[bot] May 21, 2026
80bb600
docs(ai-chat): AI Agents documentation for v4.5 (#3226)
ericallam May 21, 2026
c80b85e
docs(ai-chat): atomic onTurnComplete writes + Anthropic prose (#3693)
ericallam May 21, 2026
c0b9fdf
docs(ai-chat): clarify lastEventId is sessionId-keyed across run boun…
ericallam May 22, 2026
18d7144
ci: daily dependabot critical-severity slack alerts (#3701)
nicktrn May 22, 2026
832cf72
feat(sdk,core): add TriggerClient for per-instance SDK configuration …
ericallam May 22, 2026
71d98b4
Support for org-scoped ClickHouse (#3333)
matt-aitken May 22, 2026
1015876
feat(webapp): user-based Sentry attribution with tenant tags (#3678)
d-cs May 22, 2026
ddad970
fix(supervisor): compat shim for COMPUTE checkpoint type (#3703)
nicktrn May 22, 2026
2cbfcfa
chore(webapp): make HTTP keep-alive timeout configurable (#3705)
myftija May 22, 2026
0d4891a
perf(database): drop unused TaskRun(scheduleId, createdAt) index (#3706)
ericallam May 22, 2026
61ca40b
perf(run-engine,webapp): look up PENDING_VERSION runs via ClickHouse …
ericallam May 22, 2026
2fcc484
fix(webapp): route OrganizationDataStoresRegistry writes through the …
matt-aitken May 23, 2026
c0365d3
fix(webapp): precise S2 record cap + CORS 413 on session append (#3720)
ericallam May 23, 2026
75679c7
fix(sdk): chat HITL continuations no longer break the next LLM call (…
ericallam May 23, 2026
d34014d
chore: release v4.5.0-rc.2 (#3702)
github-actions[bot] May 23, 2026
9f64bf4
docs(ai-chat): slim-wire HITL continuations + field-level merge contr…
ericallam May 23, 2026
eefb96c
fix(webapp): recover from ClickHouse JSON parse failures in runs repl…
matt-aitken May 23, 2026
596a9bb
fix(webapp): retain sessions-replication singleton import via globalT…
matt-aitken May 24, 2026
37eeaa3
fix(webapp): skip V1 WAITING_FOR_DEPLOY drain on V2 promotes (#3742)
ericallam May 25, 2026
5ba1b32
fix(core): handle conflicting dotted paths in unflattenAttributes (#3…
0ski May 27, 2026
90bbbd1
fix(webapp): recover from ClickHouse JSON parse failures on out-of-ra…
matt-aitken May 27, 2026
df96a93
docs: troubleshoot "Stream is being deleted" during long waits (#3704)
isshaddad May 27, 2026
7324a33
chore(webapp): rename support tier to "Priority" on plan cards and li…
isshaddad May 27, 2026
8399aa2
fix(core): retry TASK_MIDDLEWARE_ERROR under the task's retry policy …
isshaddad May 27, 2026
5083d16
docs: adds relevant env vars to self hosting docs (#3148)
isshaddad May 27, 2026
816986d
fix(webapp): treat Phase 2 batch-stream retries as idempotent (TRI-99…
matt-aitken May 28, 2026
c043c4a
fix(core): external trace context leaks across warm-started runs (#3768)
nicktrn May 28, 2026
9cb6fd1
fix(webapp): idempotent `DeploymentBackgroundWorker` creation (#3772)
myftija May 29, 2026
9211032
chore(database): drop unused TaskRun status composite index (#3743)
ericallam Jun 1, 2026
8f066ac
chore: release v4.5.0-rc.3 (#3763)
github-actions[bot] Jun 1, 2026
181d9ba
feat: preview environment dispatch workflow (#3786)
myftija Jun 1, 2026
3924aa4
feat(redis-worker,webapp): mollifier buffer extensions + snapshot typ…
d-cs Jun 1, 2026
577f35e
feat(webapp): mollifier trigger-time decisions — mollify, claim, read…
d-cs Jun 1, 2026
20a676d
fix(core,webapp): coerce numeric concurrencyKey to string (#3789)
d-cs Jun 1, 2026
4745754
feat(webapp,run-engine): mollifier drainer replay + stale sweep + can…
d-cs Jun 1, 2026
a1dc3c5
feat(webapp): mollifier API GET read-fallback — synthetic primitives …
d-cs Jun 1, 2026
e195077
feat(webapp): mollifier API mutations on buffered runs (#3756)
d-cs Jun 1, 2026
e21b68c
feat(webapp): dashboard parity for mollifier-buffered runs (#3757)
d-cs Jun 1, 2026
e9e2ec1
fix(sdk): re-apply tool toModelOutput across chat.agent turns (#3790)
ericallam Jun 1, 2026
2dd9f37
fix(core,cli): stop chat.agent uncaught exception on mid-stream abort…
ericallam Jun 1, 2026
952139d
fix(webapp): bump @slack/web-api to 7.16.0 for patched axios (#3796)
nicktrn Jun 2, 2026
e35f574
fix(webapp): upgrade posthog-node to v5, drop axios + stale override …
nicktrn Jun 2, 2026
e0681d2
chore: release v4.5.0-rc.4 (#3788)
github-actions[bot] Jun 2, 2026
4c4ed22
docs(ai-chat): document the chat.agent tools option (#3791)
ericallam Jun 2, 2026
cd25280
feat: dashboard agent - package upgrades (#3793)
danton267 Jun 2, 2026
b23ec26
chore: vouch ConProgramming (#3804)
matt-aitken Jun 2, 2026
11631c1
chore: bump node to latest patch release (#3802)
nicktrn Jun 2, 2026
fa5fc6a
chore(webapp): remove Vercel install Loops event (#3805)
D-K-P Jun 2, 2026
0bbb4f1
chore: add ConProgramming to vouch list (#3807)
ericallam Jun 2, 2026
139eede
feat(redis-worker): batched pop in MollifierDrainer for fast single-e…
d-cs Jun 2, 2026
005d7e0
chore: add pkg.pr.new preview package releases (#3806)
ericallam Jun 2, 2026
4b78d7e
feat(core,webapp): support isSecret on environment variable imports (…
ericallam Jun 2, 2026
6961004
fix(webapp): restore Postgres fallback for non-ClickHouse OTLP spans …
matt-aitken Jun 2, 2026
4f8cf4c
feat(webapp): runs live updating
kathiekiwi Jun 2, 2026
d541cae
feat(supervisor): wide events + warm-start trace propagation (#3669)
nicktrn Jun 2, 2026
a4d8c9f
chore(deps): update OpenTelemetry suite to 0.218.0 / 2.7.1 (#3810)
nicktrn Jun 2, 2026
a9f756b
chore: move reference projects to their own repo (#3812)
nicktrn Jun 2, 2026
8ab5b48
chore: default local dev event store to ClickHouse in .env.example (#…
ericallam Jun 3, 2026
55d85d0
chore(emails): upgrade react-email to latest (#3819)
nicktrn Jun 3, 2026
e47ba19
chore(deps): bump transitive dependency overrides (#3818)
nicktrn Jun 3, 2026
9818ad5
fix(sdk): recover chat transport when a restored session no longer ex…
ericallam Jun 3, 2026
359e250
feat(database,webapp): add LlmModel pricing_unit column and admin sel…
ericallam Jun 3, 2026
d1f4302
chore(deps): bump the github-actions group across 1 directory with 6 …
dependabot[bot] Jun 3, 2026
bb7d7dc
feat(sdk,core): offload large trigger payloads via object storage (#3…
kathiekiwi Jun 4, 2026
4ea3ef1
chore(webapp,redis-worker): make mollifier constants configurable (#3…
d-cs Jun 4, 2026
cae3dcb
Env vars page performance fix (#3829)
kathiekiwi Jun 4, 2026
64151d6
chore(webapp): reduce telemetry ingestion log volume (#3832)
ericallam Jun 4, 2026
8d5cf31
fix(webapp): fix AI agent dashboard rendering and snapshot loads (#3834)
ericallam Jun 5, 2026
8c9fee3
feat(sdk): add AI SDK 7 support (#3833)
ericallam Jun 5, 2026
db4074d
fix(webapp): validate packet storage paths (#3830)
kathiekiwi Jun 5, 2026
884bea6
fix(cli): stop the MCP waiting for every triggered run by default (#3…
ericallam Jun 5, 2026
85886b9
feat(webapp,supervisor): isolate scheduled runs on a dedicated worker…
ericallam Jun 5, 2026
35c56f1
feat(supervisor): add opt-in dequeue backpressure (#3836)
nicktrn Jun 5, 2026
aa9f111
fix(database): include the Prisma CLI in production builds (#3843)
ericallam Jun 5, 2026
a730faa
chore: release v4.5.0-rc.5 (#3808)
github-actions[bot] Jun 5, 2026
1466a15
docs(ai-chat): document AI SDK 7 support and version compatibility (#…
ericallam Jun 5, 2026
4711ade
fix(webapp): don't reload runs list when toggling bulk action inspect…
kathiekiwi Jun 5, 2026
96f4c1b
chore(core,sdk): make the ai-v7 typecheck pass deterministic (#3847)
ericallam Jun 5, 2026
16d59aa
chore: harden webapp docker image (#3845)
nicktrn Jun 5, 2026
707bf1a
ci: reduce unit test flakiness and shard re-run cost (#3844)
nicktrn Jun 5, 2026
fa4804e
chore(core,sdk): move the AI SDK v7 forward-compat typecheck out of C…
ericallam Jun 6, 2026
97036fb
feat(webapp,clickhouse): export run traces as log, markdown, or jsonl…
ericallam Jun 6, 2026
fa15438
perf(ci): speed up unit tests with LPT sharding + container scoping (…
nicktrn Jun 7, 2026
f261ff2
chore(docker): tidy dev postgres + clickhouse images (#3859)
nicktrn Jun 7, 2026
ef04cc3
fix(webapp): use composite keyset cursor for run pagination (#3852)
matt-aitken Jun 8, 2026
8b85da1
feat(cli): install Trigger.dev agent skills into your coding agent (#…
ericallam Jun 8, 2026
93532cd
feat(supervisor): forward per-run labels to the compute provider (#3821)
0ski Jun 8, 2026
d7028e2
feat(webapp): label mollifier decisions by enrolled org (#3869)
d-cs Jun 8, 2026
e9c459f
ci: allow forks to override published container image namespace (#3866)
d-cs Jun 9, 2026
18b9028
feat(cli): set up AI tooling in trigger init and add getting-started …
ericallam Jun 9, 2026
0ee1461
fix(webapp): show scheduled runs under their correct region (#3873)
ericallam Jun 9, 2026
6bcd369
feat(webapp,rbac): REQUIRE_PLUGINS=1 fail-fast for required plugin lo…
matt-aitken Jun 9, 2026
f4a96bd
Fail dev and deploy on duplicate task ids (#3865)
matt-aitken Jun 9, 2026
1b0f2c7
fix(webapp): correct backward pagination slice in listRunIds (#3867)
matt-aitken Jun 9, 2026
df964ea
feat(ci): dispatch a repository event when the main webapp image is p…
matt-aitken Jun 9, 2026
774a979
fix(webapp): paginate shared Vercel env var fetch in onboarding + pul…
0ski Jun 9, 2026
d973359
docs: add a database connections guide for tasks (#3881)
ericallam Jun 9, 2026
3bc88c4
perf(webapp): memoize react-router per-request route matching via pnp…
ericallam Jun 9, 2026
bc01f6e
fix(webapp): stop writer DB connectivity errors leaking to trigger() …
d-cs Jun 10, 2026
b28c6d0
fix(webapp): sanitize streamed agent URLs before rendering in the age…
ericallam Jun 10, 2026
87448cc
feat(webapp,core): add an endpoint to list a project's environments (…
ericallam Jun 10, 2026
459dce2
ci: make the main-image dispatch repo and ref configurable (#3883)
d-cs Jun 10, 2026
081b6ba
feat(supervisor): publish client-side dequeue API latency as a Promet…
myftija Jun 10, 2026
6afc9bf
fix(run-engine): retry getSnapshotsSince on the replica then primary …
d-cs Jun 10, 2026
f9d57d3
feat(webapp): add a new backend for the realtime runs feed (#3864)
ericallam Jun 11, 2026
b82d100
fix(webapp): harden the realtime session routes (#3890)
ericallam Jun 11, 2026
f5f29ce
fix(sdk,core): chat.agent delivery, idempotency, and recovery fixes (…
ericallam Jun 11, 2026
1c7e64a
feat(supervisor): stamp org identity label on compute microVMs (#3899)
0ski Jun 11, 2026
7b4443a
test(webapp): stop streamBatchItems container tests timing out on col…
d-cs Jun 11, 2026
2397ca2
fix(supervisor): retry transient instance create failures in compute …
myftija Jun 11, 2026
d0b2d79
fix(supervisor): cancel pending delayed snapshots when the run comple…
myftija Jun 11, 2026
93b4715
feat(webapp): hipaa baa add-on on paid pricing tiers (#3904)
D-K-P Jun 11, 2026
2b6d249
fix(sdk,core): head-start handover correctness and continuation boot …
ericallam Jun 11, 2026
187c047
perf(webapp): shrink run trace loader payload and add trace span cap …
ericallam Jun 11, 2026
cc9eabd
test(webapp): use relative fixture dates in runs cursor pagination te…
ericallam Jun 11, 2026
8dc77c0
fix(webapp): only load env var values for displayed environments (#3903)
ericallam Jun 11, 2026
954ee5c
fix(webapp): deliver realtime changes with current content when the r…
ericallam Jun 12, 2026
de8231c
chore: bump shell-quote to 1.8.4 (#3913)
nicktrn Jun 12, 2026
78b7136
chore: vouch saasjesus as a contributor (#3917)
ericallam Jun 12, 2026
5d6ea33
refactor: share the public-token JWT scope decoder; make @trigger.dev…
matt-aitken Jun 12, 2026
f48c897
perf(webapp): parallelize streaming batch-item ingest (#3777)
matt-aitken Jun 12, 2026
eb498d1
fix(plugins): drop unused gitBranch re-export from the package entry …
matt-aitken Jun 12, 2026
a04cdff
fix(webapp): stop replica lag from double-triggering session runs and…
ericallam Jun 12, 2026
4783419
fix(sdk): stop chat.createSession wedging on stop and erroring on con…
ericallam Jun 12, 2026
002c441
feat(webapp): self serve schedules add-on (#3811)
isshaddad Jun 12, 2026
5fab8ca
chore: release v4.5.0-rc.6 (#3870)
github-actions[bot] Jun 12, 2026
97c12e2
docs(management): document TriggerClient for multi-target SDK usage (…
ericallam Jun 12, 2026
b8a576a
docs: document the trigger skills installer (replaces agent rules) (#…
ericallam Jun 12, 2026
51af9ae
docs(ai-chat): correct chat.agent reference drift (#3892)
ericallam Jun 12, 2026
84809b0
docs(ai-chat): head-start persistence contract and a clearer sessions…
ericallam Jun 12, 2026
3bc3a17
docs(ai-chat): custom agents page, backend decision table, and a buil…
ericallam Jun 12, 2026
43b4936
docs(ai-chat): add the 4.5.0-rc.6 changelog entry (#3927)
ericallam Jun 12, 2026
3d5cffc
fix(cli): point to init when dev or update runs without a project (#3…
ericallam Jun 12, 2026
5232067
fix(webapp): stop locked-version triggers failing on stale replica re…
ericallam Jun 12, 2026
8b40571
feat(supervisor): workload create duration histogram with backend and…
myftija Jun 12, 2026
034058b
feat(webapp): add task metadata cache resolution metrics (#3934)
ericallam Jun 12, 2026
85d93ff
perf(webapp): skip queue search count (#3925)
kathiekiwi Jun 13, 2026
1f1a366
fix(sdk): custom agent loop parity for continuations, steering, and s…
ericallam Jun 14, 2026
e092919
feat(sdk,cli): bundle agent skills + docs in the SDK for zero-drift (…
ericallam Jun 14, 2026
911a1cf
docs: document the Sessions HTTP API (reference, channels, scopes) (#…
ericallam Jun 14, 2026
a7312b1
fix(webapp): stop logging expected auth/restore conditions as errors …
d-cs Jun 15, 2026
f073d87
ci: gate optional Claude and security-scan jobs behind repository var…
d-cs Jun 15, 2026
ef998a5
fix(webapp): make native realtime change publishing fail-safe (#3946)
ericallam Jun 15, 2026
b7ef51d
fix(webapp): make SDK bundle-docs build step work in pruned Docker im…
d-cs Jun 15, 2026
af526de
feat(webapp): chat AI UI improvements, new task landing pages and sid…
samejr Jun 15, 2026
1cf56e5
ci: gate optional publish/notify jobs behind repository variables (#3…
d-cs Jun 15, 2026
530b388
feat(webapp): hide self-serve billing UI for managed-billing orgs (#3…
kathiekiwi Jun 15, 2026
3b91999
feat(sdk): make the chat.agent system prompt cacheable (#3952)
ericallam Jun 15, 2026
545ecf7
feat(plugins): add SSO plugin contract to @trigger.dev/plugins (#3949)
0ski Jun 15, 2026
7094771
fix(release-pr): stop dropping changeset entries and stripping code b…
ericallam Jun 15, 2026
39fca87
docs: add troubleshooting entry for runs not dequeuing in dev (#3955)
isshaddad Jun 15, 2026
ab3a1e5
docs: use one canonical definition of a Session everywhere (#3956)
ericallam Jun 15, 2026
38f2804
chore(deps): pin js-cookie, tmp and brace-expansion (#3961)
nicktrn Jun 16, 2026
19c0763
chore(webapp): prevent db:seed script hang (#3962)
carderne Jun 16, 2026
002b845
feat(supervisor): verify warm-start delivery, cold-start silently los…
myftija Jun 16, 2026
17482c0
feat(sdk): chat.headStart handover for customAgent and createSession …
ericallam Jun 16, 2026
afe6dd9
Feat(webapp): schedules fixes and UI improvement (#3965)
samejr Jun 16, 2026
2936382
ci: add docs-release-* tag workflow to publish docs at release (#3969)
ericallam Jun 16, 2026
63d6432
docs(ai-chat): headStart handover for custom agents + triggerConfig (…
ericallam Jun 16, 2026
cf4aa7e
fix(webapp): Vercel env var sync rejecting batches containing only re…
0ski Jun 16, 2026
1495800
docs(ai-chat): add prompt caching guide (#3951)
ericallam Jun 16, 2026
723c994
docs(ai-chat): correct the extractNewToolResults return type (#3959)
ericallam Jun 16, 2026
07a0e4a
feat(webapp): split Models into Your models and Model library tabs (#…
ericallam Jun 16, 2026
e829edd
docs(skills): reflect the SDK-bundled, version-pinned agent reference…
ericallam Jun 16, 2026
5f2d437
fix(webapp): Fix for task page search bar re-rendering bug (#3971)
samejr Jun 16, 2026
0c839e8
feat(sdk,cli): namespace agent skills with trigger- and add cost-savi…
ericallam Jun 16, 2026
7aa871f
feat(webapp): plan-aware compute migration (#3957)
nicktrn Jun 17, 2026
4e919e7
fix(webapp): Task page table scroll view fix (#3972)
samejr Jun 17, 2026
015106d
chore: release v4.5.0-rc.7 (#3932)
github-actions[bot] Jun 17, 2026
6bdf800
feat(clickhouse): replicate run plan type to task_runs_v2 (#3978)
nicktrn Jun 17, 2026
d34b699
fix(webapp): capture Prisma infra errors and obfuscate leaked message…
d-cs Jun 17, 2026
ae08c9c
fix(webapp): admin feature flag number inputs and scrolling (#3979)
nicktrn Jun 17, 2026
9feb765
docs(ai-chat): document HITL pause suspension and maxDuration (#3987)
ericallam Jun 18, 2026
ca43ab8
docs(ai-chat): document stopping generation for custom agents (#3976)
ericallam Jun 18, 2026
5740955
feat(webapp): enforce RBAC permissions on run, prompt, member, and bi…
matt-aitken Jun 18, 2026
e34d524
docs: technical SEO cleanup for CLI pages, titles, and links (#3986)
D-K-P Jun 18, 2026
3fdfe21
chore(webapp): add currency unit to agent LLM spend chart label (#3988)
samejr Jun 18, 2026
c97d246
feat(webapp): sync new orgs + users to Attio CRM on signup (#3896)
isshaddad Jun 18, 2026
e5fca6b
docs(ai-chat): add the 4.5.0-rc.7 changelog entry (#3991)
ericallam Jun 18, 2026
e98a547
feat(sso): SAML/OIDC single sign-on (#3911)
0ski Jun 19, 2026
b5977ec
feat(webapp): show a PAT's maximum role on the tokens page (#3995)
matt-aitken Jun 19, 2026
a6400f9
feat(webapp): segmented control for the task type filter (#3985)
samejr Jun 19, 2026
315baf2
refactor(run-engine,webapp): route TaskRun writes through a new RunSt…
d-cs Jun 19, 2026
06969b2
feat(cli,webapp): mint short-lived delegated tokens that act as a use…
ericallam Jun 19, 2026
135c7e9
ci: raise CLAUDE.md audit turn limit and pin Opus 4.8 (#3999)
d-cs Jun 19, 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
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
6 changes: 6 additions & 0 deletions .changeset/agent-skills-bundled-in-sdk.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"@trigger.dev/sdk": patch
"trigger.dev": patch
---

`@trigger.dev/sdk` now bundles the Trigger.dev agent skills and a curated snapshot of the docs those skills reference. The skills that `trigger skills` installs into your coding agent read this content from node_modules, so the guidance your AI assistant follows is pinned to the SDK version installed in your project and stays current across upgrades instead of going stale until the next reinstall.
16 changes: 16 additions & 0 deletions .changeset/agent-skills.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
---
"@trigger.dev/sdk": patch
"@trigger.dev/core": patch
"@trigger.dev/build": patch
"trigger.dev": patch
---

Add Agent Skills for `chat.agent`. Drop a folder with a `SKILL.md` and any helper scripts/references next to your task code, register it with `skills.define({ id, path })`, and the CLI bundles it into the deploy image automatically — no `trigger.config.ts` changes. The agent gets a one-line summary in its system prompt and discovers full instructions on demand via `loadSkill`, with `bash` and `readFile` tools scoped per-skill (path-traversal guards, output caps, abort-signal propagation).

```ts
const pdfSkill = skills.define({ id: "pdf-extract", path: "./skills/pdf-extract" });

chat.skills.set([await pdfSkill.local()]);
```

Built on the [AI SDK cookbook pattern](https://ai-sdk.dev/cookbook/guides/agent-skills) — portable across providers. SDK + CLI only for now; dashboard-editable `SKILL.md` text is on the roadmap.
52 changes: 52 additions & 0 deletions .changeset/ai-prompts.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
---
"@trigger.dev/sdk": minor
---

**AI Prompts** — define prompt templates as code alongside your tasks, version them on deploy, and override the text or model from the dashboard without redeploying. Prompts integrate with the Vercel AI SDK via `toAISDKTelemetry()` (links every generation span back to the prompt) and with `chat.agent` via `chat.prompt.set()` + `chat.toStreamTextOptions()`.

```ts
import { prompts } from "@trigger.dev/sdk";
import { generateText } from "ai";
import { openai } from "@ai-sdk/openai";
import { z } from "zod";

export const supportPrompt = prompts.define({
id: "customer-support",
model: "gpt-4o",
config: { temperature: 0.7 },
variables: z.object({
customerName: z.string(),
plan: z.string(),
issue: z.string(),
}),
content: `You are a support agent for Acme.

Customer: {{customerName}} ({{plan}} plan)
Issue: {{issue}}`,
});

const resolved = await supportPrompt.resolve({
customerName: "Alice",
plan: "Pro",
issue: "Can't access billing",
});

const result = await generateText({
model: openai(resolved.model ?? "gpt-4o"),
system: resolved.text,
prompt: "Can't access billing",
...resolved.toAISDKTelemetry(),
});
```

**What you get:**

- **Code-defined, deploy-versioned templates** — define with `prompts.define({ id, model, config, variables, content })`. Every deploy creates a new version visible in the dashboard. Mustache-style placeholders (`{{var}}`, `{{#cond}}...{{/cond}}`) with Zod / ArkType / Valibot-typed variables.
- **Dashboard overrides** — change a prompt's text or model from the dashboard without redeploying. Overrides take priority over the deployed "current" version and are environment-scoped (dev / staging / production independent).
- **Resolve API** — `prompt.resolve(vars, { version?, label? })` returns the compiled `text`, resolved `model`, `version`, and labels. Standalone `prompts.resolve<typeof handle>(slug, vars)` for cross-file resolution with full type inference on slug and variable shape.
- **AI SDK integration** — spread `resolved.toAISDKTelemetry({ ...extra })` into any `generateText` / `streamText` call and every generation span links to the prompt in the dashboard alongside its input variables, model, tokens, and cost.
- **`chat.agent` integration** — `chat.prompt.set(resolved)` stores the resolved prompt run-scoped; `chat.toStreamTextOptions({ registry })` pulls `system`, `model` (resolved via the AI SDK provider registry), `temperature` / `maxTokens` / etc., and telemetry into a single spread for `streamText`.
- **Management SDK** — `prompts.list()`, `prompts.versions(slug)`, `prompts.promote(slug, version)`, `prompts.createOverride(slug, body)`, `prompts.updateOverride(slug, body)`, `prompts.removeOverride(slug)`, `prompts.reactivateOverride(slug, version)`.
- **Dashboard** — prompts list with per-prompt usage sparklines; per-prompt detail with Template / Details / Versions / Generations / Metrics tabs. AI generation spans get a custom inspector showing the linked prompt's metadata, input variables, and template content alongside model, tokens, cost, and the message thread.

See [/docs/ai/prompts](https://trigger.dev/docs/ai/prompts) for the full reference — template syntax, version resolution order, override workflow, and type utilities (`PromptHandle`, `PromptIdentifier`, `PromptVariables`).
5 changes: 5 additions & 0 deletions .changeset/ai-sdk-7-support.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@trigger.dev/sdk": patch
---

Adds AI SDK 7 support. The `ai` peer range now includes v7, and the `chat.agent` / chat surfaces work against v7's ESM-only build. On v7, install `@ai-sdk/otel` alongside `ai` and the SDK registers it for you so `experimental_telemetry` spans keep flowing into your run traces (v7 stopped emitting them from `ai` core). v5 and v6 keep working unchanged.
15 changes: 15 additions & 0 deletions .changeset/ai-tool-helpers.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
"@trigger.dev/sdk": patch
---

Add `ai.toolExecute(task)` so you can wire a Trigger subtask in as the `execute` handler of an AI SDK `tool()` while defining `description` and `inputSchema` yourself — useful when you want full control over the tool surface and just need Trigger's subtask machinery for the body.

```ts
const myTool = tool({
description: "...",
inputSchema: z.object({ ... }),
execute: ai.toolExecute(mySubtask),
});
```

`ai.tool(task)` (`toolFromTask`) keeps doing the all-in-one wrap and now aligns its return type with AI SDK's `ToolSet`. Minimum `ai` peer raised to `^6.0.116` to avoid cross-version `ToolSet` mismatches in monorepos.
5 changes: 5 additions & 0 deletions .changeset/backpressure-scale-up-freeze.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@trigger.dev/core": patch
---

Add optional `shouldPauseScaling` to the supervisor consumer pool scaling options to freeze scale-up while it returns true (scale-down stays allowed).
5 changes: 0 additions & 5 deletions .changeset/beige-horses-juggle.md

This file was deleted.

5 changes: 0 additions & 5 deletions .changeset/big-carrots-fail.md

This file was deleted.

6 changes: 0 additions & 6 deletions .changeset/blue-eyes-tickle.md

This file was deleted.

10 changes: 0 additions & 10 deletions .changeset/breezy-turtles-talk.md

This file was deleted.

5 changes: 5 additions & 0 deletions .changeset/bundle-skills-single-pass.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"trigger.dev": patch
---

Fix `chat.agent` skills silently missing in `trigger dev` for projects whose task files read `process.env` at module top level (e.g. a third-party SDK client initialized at import). Skill folders now bundle into `.trigger/skills/` reliably regardless of which env vars are set when the CLI launches.
5 changes: 5 additions & 0 deletions .changeset/cap-idempotency-key-length.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@trigger.dev/core": patch
---

Reject overlong `idempotencyKey` values at the API boundary so they no longer trip an internal size limit on the underlying unique index and surface as a generic 500. Inputs are capped at 2048 characters — well above what `idempotencyKeys.create()` produces (a 64-character hash) and above any realistic raw key. Applies to `tasks.trigger`, `tasks.batchTrigger`, `batch.create` (Phase 1 streaming batches), `wait.createToken`, `wait.forDuration`, and the input/session stream waitpoint endpoints. Over-limit requests now return a structured 400 instead.
6 changes: 6 additions & 0 deletions .changeset/chat-agent-hardening.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"@trigger.dev/sdk": patch
"@trigger.dev/core": patch
---

Reliability fixes for `chat.agent`. A user message sent while the agent is streaming is no longer delivered twice (which could run a duplicate turn), input appends now carry an idempotency key so a retried send can't duplicate a message, stopping a generation clears the streaming state so a page reload doesn't replay the stopped turn, and runs can now carry the full set of dashboard tags instead of being silently truncated. `onTurnComplete` now fires on errored turns (with the thrown error attached) and the failed turn's user message is persisted so it isn't lost on the next run. Custom agents and manual `chat.writeTurnComplete` callers now trim the output stream, sending a custom action no longer leaves a second stream reader running, and a long-lived `watch` subscription no longer grows its dedupe set without bound.
21 changes: 21 additions & 0 deletions .changeset/chat-agent-on-boot-hook.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
---
"@trigger.dev/sdk": minor
---

Adds `onBoot` to `chat.agent` — a lifecycle hook that fires once per worker process picking up the chat. Runs for the initial run, preloaded runs, AND reactive continuation runs (post-cancel, crash, `endRun`, `requestUpgrade`, OOM retry), before any other hook. Use it to initialize `chat.local`, open per-process resources, or re-hydrate state from your DB on continuation — anywhere the SAME run picking up after suspend/resume isn't enough.

```ts
const userContext = chat.local<{ name: string; plan: string }>({ id: "userContext" });

export const myChat = chat.agent({
id: "my-chat",
onBoot: async ({ clientData, continuation }) => {
const user = await db.user.findUnique({ where: { id: clientData.userId } });
userContext.init({ name: user.name, plan: user.plan });
},
run: async ({ messages, signal }) =>
streamText({ model: openai("gpt-4o"), messages, abortSignal: signal }),
});
```

Use `onBoot` (not `onChatStart`) for state setup that must run every time a worker picks up the chat — `onChatStart` fires once per chat and won't run on continuation, leaving `chat.local` uninitialized when `run()` tries to use it.
15 changes: 15 additions & 0 deletions .changeset/chat-agent-tools.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
"@trigger.dev/sdk": patch
---

Add a `tools` option to `chat.agent`. Declaring your tools here threads them into the SDK's internal `convertToModelMessages`, so each tool's `toModelOutput` is re-applied when prior-turn history is re-converted.

```ts
chat.agent({
tools: { readFile, search },
run: async ({ messages, tools, signal }) =>
streamText({ model, messages, tools, abortSignal: signal }),
});
```

Also exports `InferChatUIMessageFromTools<typeof tools>` to derive the chat `UIMessage` type (typed tool parts) directly from a tool set.
44 changes: 44 additions & 0 deletions .changeset/chat-agent.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
---
"@trigger.dev/sdk": minor
"@trigger.dev/core": patch
---

**AI Agents** — run AI SDK chat completions as durable Trigger.dev agents instead of fragile API routes. Define an agent in one function, point `useChat` at it from React, and the conversation survives page refreshes, network blips, and process restarts.

```ts
import { chat } from "@trigger.dev/sdk/ai";
import { streamText } from "ai";
import { openai } from "@ai-sdk/openai";

export const myChat = chat.agent({
id: "my-chat",
run: async ({ messages, signal }) =>
streamText({ model: openai("gpt-4o"), messages, abortSignal: signal }),
});
```

```tsx
import { useChat } from "@ai-sdk/react";
import { useTriggerChatTransport } from "@trigger.dev/sdk/chat/react";

const transport = useTriggerChatTransport({ task: "my-chat", accessToken, startSession });
const { messages, sendMessage } = useChat({ transport });
```

**What you get:**

- **AI SDK `useChat` integration** — a custom [`ChatTransport`](https://sdk.vercel.ai/docs/ai-sdk-ui/transport) (`useTriggerChatTransport`) plugs straight into Vercel AI SDK's `useChat` hook. Text streaming, tool calls, reasoning, and `data-*` parts all work natively over Trigger.dev's realtime streams. No custom API routes needed.
- **First-turn fast path (`chat.headStart`)** — opt-in handler that runs the first turn's `streamText` step in your warm server process while the agent run boots in parallel, cutting cold-start TTFC by roughly half (measured 2801ms → 1218ms on `claude-sonnet-4-6`). The agent owns step 2+ (tool execution, persistence, hooks) so heavy deps stay where they belong. Web Fetch handler works natively in Next.js, Hono, SvelteKit, Remix, Workers, etc.; bridge to Express/Fastify/Koa via `chat.toNodeListener`. New `@trigger.dev/sdk/chat-server` subpath.
- **Multi-turn durability via Sessions** — every chat is backed by a durable Session that outlives any individual run. Conversations resume across page refreshes, idle timeout, crashes, and deploys; `resume: true` reconnects via `lastEventId` so clients only see new chunks. `sessions.list` enumerates chats for inbox-style UIs.
- **Auto-accumulated history, delta-only wire** — the backend accumulates the full conversation across turns; clients only ship the new message each turn. Long chats never hit the 512 KiB body cap. Register `hydrateMessages` to be the source of truth yourself.
- **Lifecycle hooks** — `onPreload`, `onChatStart`, `onValidateMessages`, `hydrateMessages`, `onTurnStart`, `onBeforeTurnComplete`, `onTurnComplete`, `onChatSuspend`, `onChatResume` — for persistence, validation, and post-turn work.
- **Stop generation** — client-driven `transport.stopGeneration(chatId)` aborts mid-stream; the run stays alive for the next message, partial response is captured, and aborted parts (stuck `partial-call` tools, in-progress reasoning) are auto-cleaned.
- **Tool approvals (HITL)** — tools with `needsApproval: true` pause until the user approves or denies via `addToolApprovalResponse`. The runtime reconciles the updated assistant message by ID and continues `streamText`.
- **Steering and background injection** — `pendingMessages` injects user messages between tool-call steps so users can steer the agent mid-execution; `chat.inject()` + `chat.defer()` adds context from background work (self-review, RAG, safety checks) between turns.
- **Actions** — non-turn frontend commands (undo, rollback, regenerate, edit) sent via `transport.sendAction`. Fire `hydrateMessages` + `onAction` only — no turn hooks, no `run()`. `onAction` can return a `StreamTextResult` for a model response, or `void` for side-effect-only.
- **Typed state primitives** — `chat.local<T>` for per-run state accessible from hooks, `run()`, tools, and subtasks (auto-serialized through `ai.toolExecute`); `chat.store` for typed shared data between agent and client; `chat.history` for reading and mutating the message chain; `clientDataSchema` for typed `clientData` in every hook.
- **`chat.toStreamTextOptions()`** — one spread into `streamText` wires up versioned system [Prompts](https://trigger.dev/docs/ai/prompts), model resolution, telemetry metadata, compaction, steering, and background injection.
- **Multi-tab coordination** — `multiTab: true` + `useMultiTabChat` prevents duplicate sends and syncs state across browser tabs via `BroadcastChannel`. Non-active tabs go read-only with live updates.
- **Network resilience** — built-in indefinite retry with bounded backoff, reconnect on `online` / tab refocus / bfcache restore, `Last-Event-ID` mid-stream resume. No app code needed.

See [/docs/ai-chat](https://trigger.dev/docs/ai-chat/overview) for the full surface — quick start, three backend approaches (`chat.agent`, `chat.createSession`, raw task), persistence and code-sandbox patterns, type-level guides, and API reference.
6 changes: 6 additions & 0 deletions .changeset/chat-boot-cursor.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"@trigger.dev/sdk": patch
"@trigger.dev/core": patch
---

Continuation chat boots no longer stall for around 10 seconds before the first turn. The `session.in` resume cursor is now found with a non-blocking records read instead of draining an SSE long-poll (which always waited out its full 5 second inactivity window, twice per boot), the boot reads run concurrently, and chat snapshots carry the cursor so subsequent boots skip the scan entirely.
26 changes: 26 additions & 0 deletions .changeset/chat-headstart-custom-backends.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
---
"@trigger.dev/sdk": patch
---

`chat.headStart` now works with the `chat.customAgent` and `chat.createSession` backends, not only `chat.agent`. The warm step-1 response hands over to your loop the same way it does for a managed agent.

In a `chat.customAgent` loop, consume the handover on turn 0:

```ts
const conversation = new chat.MessageAccumulator();
const { isFinal, skipped } = await conversation.consumeHandover({ payload });
if (skipped) return; // warm handler aborted, so exit without a turn
if (isFinal) {
await chat.writeTurnComplete(); // step 1 is the response, no streamText
} else {
const result = streamText({ model, messages: conversation.modelMessages, tools });
// Pass originalMessages so the handed-over tool round merges into the
// step-1 assistant instead of starting a new message.
const response = await chat.pipeAndCapture(result, {
originalMessages: conversation.uiMessages,
});
if (response) await conversation.addResponse(response);
}
```

With `chat.createSession`, the iterator surfaces it as `turn.handover`; call `turn.complete()` with no argument on a final handover. The lower-level `chat.waitForHandover()` and `accumulator.applyHandover()` are also exported for hand-rolled loops.
5 changes: 5 additions & 0 deletions .changeset/chat-headstart-hydrate.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@trigger.dev/sdk": patch
---

Fix `chat.headStart` when `hydrateMessages` is registered. The warm route's step-1 partial now reaches the agent's accumulator on the hydrate path, so `onTurnComplete` carries the full first turn (the head-start user message included), tool-call handovers resume from step 2 instead of re-running step 1, and the assistant `messageId` stays stable across the handover.
5 changes: 5 additions & 0 deletions .changeset/chat-headstart-reasoning.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@trigger.dev/sdk": patch
---

Preserve reasoning parts across the `chat.headStart` handover. Extended-thinking models' step-1 reasoning now lands in the durable session history (and `onTurnComplete`) under the same assistant `messageId`, with provider metadata intact so Anthropic thinking signatures survive replays.
15 changes: 15 additions & 0 deletions .changeset/chat-headstart-trigger-config.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
"@trigger.dev/sdk": patch
---

Add `triggerConfig` support to `chat.headStart()` and `chat.openSession()`, so the auto-triggered handover-prepare run inherits tags, queue, machine, and other session trigger options the same way `chat.createStartSessionAction()` does. The `chat:{chatId}` tag is prepended automatically.

```ts
export const POST = chat.headStart({
agentId: "my-agent",
triggerConfig: { tags: ["org:acme"], queue: "chat" },
run: async ({ chat }) => streamText({ ...chat.toStreamTextOptions(), model }),
});
```

Because the session is created once on the first head-start turn and is idempotent on the chat id, this is the only place to set those options for a head-start chat's lifetime. `chat.createStartSessionAction()` now also forwards `maxDuration`, `region`, and `lockToVersion` so both session entry points stay consistent.
21 changes: 21 additions & 0 deletions .changeset/chat-history-read-primitives.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
---
"@trigger.dev/sdk": minor
---

Add read primitives to `chat.history` for HITL flows: `getPendingToolCalls()`, `getResolvedToolCalls()`, `extractNewToolResults(message)`, `getChain()`, and `findMessage(messageId)`. These lift the accumulator-walking logic that customers building human-in-the-loop tools were re-implementing into the SDK.

Use `getPendingToolCalls()` to gate fresh user turns while a tool call is awaiting an answer. Use `extractNewToolResults(message)` to dedup tool results when persisting to your own store — the helper returns only the parts whose `toolCallId` is not already resolved on the chain.

```ts
const pending = chat.history.getPendingToolCalls();
if (pending.length > 0) {
// an addToolOutput is expected before a new user message
}

onTurnComplete: async ({ responseMessage }) => {
const newResults = chat.history.extractNewToolResults(responseMessage);
for (const r of newResults) {
await db.toolResults.upsert({ id: r.toolCallId, output: r.output, errorText: r.errorText });
}
};
```
Loading