v0.13.7 — Faster sessions, Sign in with Kortix, and organization branding
Highlights
- Add Sign in with Kortix OAuth 2.1 flows, headless authentication, and app viewer tokens.
- Add enterprise organization branding for logos, icons, favicons, and product names.
- Improve session startup, auto-resume, streaming, queue state, transcript mirrors, terminal cards, and stopped-session recovery.
- Restore GitHub repository sources on workspace creation and correct People with access visibility.
- Add GLM 5.3 Flash and remove retired AsterLab and GLM 5.2 routes.
- Improve secrets, connectors, Slack routing, sandbox lifecycle, preview durability, and provider failover.
- Allow registered OAuth loopback redirects through the WAF while preserving API redirect validation.
Release validation
- Staging SHA:
309e0afe1ce19a5674d137e749d8a6511576f2f5 - Build Staging Artifacts:
33258635866 - Deploy Staging:
33258801944 - Full release QA:
33259390663
What's Changed
- fix(compliance): retire ALB TargetResponseTime alarms; reconciler deletes stale + legacy duplicates by @markokraemer in #6919
- fix(api,sdk): readiness clocks die with their attempt; a stopped queue re-delivers exactly once by @markokraemer in #6920
- fix(compliance): grant DescribeTargetGroups to the ALB alarm reconciler; alarm on reconciler errors by @markokraemer in #6921
- fix(web): the command palette can switch workspaces by @sutharjay1 in #6922
- feat: compile OpenCode boot artifacts by @Ino-Bagaric in #6871
- ci(release-gate): pin pnpm/action-setup@v4 in the browser shard (v6 on Blacksmith runs pnpm on bundled Node 18.5.0) by @markokraemer in #6925
- test(ke2e): re-quarantine SESS-23 — stop→wake still 503s on the first post-wake read (gate run 32992496089) by @markokraemer in #6927
- test(ke2e): quarantine CONN-26 — real-agent Composio flow never passed a deployed gate (run 32992496089) by @markokraemer in #6929
- docs(learnings): a release-gate flow is added or un-quarantined only with its green deployed run by @markokraemer in #6931
- fix(sandbox,triggers): make provider failover reachable + jitter fleet crons by @kubet in #6932
- fix(tests): keep the Vercel bypass storage state (_vercel_jwt) out of uploaded CI artifacts by @markokraemer in #6933
- docs(learnings): a never-fired guard is untested; an artifact upload path is a publish path by @markokraemer in #6935
- test(e2e): quarantine the Composio Gmail Connect-Link browser journey (unauthorized runtime skip fails the gate) by @markokraemer in #6936
- fix(web): Apps gallery is a 4:5 container-query grid, no size control by @sutharjay1 in #6939
- fix(release): pin npm@^11.5.1 in publish-npm-package.sh (npm@12 breaks prod npm publishes on node 22.22.0) by @markokraemer in #6940
- chore(release): VERSION → 0.13.7 [skip ci] by @markokraemer in #6941
- chore(release): staging VERSION → 0.13.7 [skip ci] by @markokraemer in #6942
- docs(learnings): npm-publish failure silently strips the release record from a shipped prod deploy by @markokraemer in #6943
- feat(auth): Sign in with Kortix + headless /v1/auth — the SDK owns third-party auth end to end by @markokraemer in #6945
- spike(worker): harness/environment split — plan + working Alpine worker by @Ino-Bagaric in #6924
- feat(api,worker): compile a pi worker runtime artifact per push, behind a pi_worker flag by @Ino-Bagaric in #6944
- chore(secrets): local .env gets its own KORTIX_GITHUB_APP_STATE_SECRET by @markokraemer in #6948
- perf(session-open): kill the prefetch storm, serial queries, audit flood, and boot chorus by @markokraemer in #6946
- fix(web): OAuth consent page — one shared load/approve per request id (spinner forever on dev) by @markokraemer in #6949
- feat(accounts): organization branding — own logo, icon, favicon (light + dark) and product name as the Enterprise
brandingentitlement by @markokraemer in #6947 - fix(api): compress middleware fails open without CompressionStream — dev returned 500 for every response ≥ 1 KiB (Bun 1.2 image) by @markokraemer in #6951
- feat(web): docs surface rework, tool-row disclosure, mono badge system by @sutharjay1 in #6952
- fix(api): compress middleware 500s on Bun 1.2 image — CompressionStream undefined, fall back to node:zlib by @markokraemer in #6950
- feat: Kortix Runtime API — one sequenced session stream + runtime projection, opencode-shaped polls DELETED by @markokraemer in #6953
- fix(web): drop "In progress" from SOC 2 Type I trust badge by @agent-kortix in #6954
- fix(web): mark SOC 2 Type I as certified on /security by @agent-kortix in #6955
- fix(sdk,api): session stream dies cross-origin — drop non-safelisted Cache-Control request header by @markokraemer in #6959
- feat(llm-catalog): add GLM 5.3 Flash (z-ai/glm-5.3-flash via OpenRouter) to Kortix managed by @markokraemer in #6958
- fix(sdk): healBedrockModelKey is inert on the gateway — picker was pinning every pick to Claude Opus 5 by @markokraemer in #6960
- feat(desktop): install prod, staging and dev side by side by @sutharjay1 in #6956
- fix(worker): compiled artifact double-started and died with EADDRINUSE by @Ino-Bagaric in #6962
- fix(web): webhook wizard signing secrets rejected by trigger validation by @ArtemShatokhin in #6961
- Fix working status order after a fresh prompt by @Ino-Bagaric in #6965
- feat(apps): a Kortix-hosted App is already signed in — gate-minted viewer identity + token by @markokraemer in #6963
- Revert "feat(desktop): install prod, staging and dev side by side (#6956)" by @sutharjay1 in #6967
- perf(boot): zero proxied git requests at session boot + OpenCode spawns before checkout by @markokraemer in #6964
- test(daemon): per-test ephemeral ports in egress-shim suites by @Ino-Bagaric in #6969
- docs(learnings): a new import edge into a widely-mocked graph breaks hand-written mocks suite-wide by @markokraemer in #6968
- Fix working status order and elapsed timer by @Ino-Bagaric in #6970
- feat(api,worker): sessions boot the pi worker (P1.5 + P1.6) by @Ino-Bagaric in #6966
- fix(web): the markdown source toggle, and the oversized SVG thumbnail by @Ino-Bagaric in #6971
- fix(api): fresh-session git fast path gets its own switch (KORTIX_FAST_GIT_BOOT_ENABLED) by @markokraemer in #6973
- fix(worker): gateway-mode model resolution killed the first dev pi session by @Ino-Bagaric in #6975
- Fix idle messages appearing queued by @Ino-Bagaric in #6974
- Keep snapshot builder test doubles complete by @Ino-Bagaric in #6977
- feat(kortixd): daemon single-binary management CLI + safe self-update/rollback by @markokraemer in #6972
- perf(api): warm the fresh-session git hint on push and at provision by @markokraemer in #6976
- perf(api): slim the pi worker boot control plane by @Ino-Bagaric in #6980
- docs(learnings): an experiment flag deploy-dev pins to false cannot be a kill switch by @markokraemer in #6979
- feat(api): pi worker pool — parked boxes claimed at session create (P1.8) by @Ino-Bagaric in #6981
- fix(web): a menu click never reloads the page — 83 nav controls become anchors by @markokraemer in #6978
- fix(api): pi worker env — only an explicit session model overrides the bake by @Ino-Bagaric in #6983
- perf(web): stop blurring text the user is trying to read by @sutharjay1 in #6984
- fix(api): pi pool — never trust the Daytona list's labels for reap or claim by @Ino-Bagaric in #6985
- feat(api): session environments — lazy compute for pi worker sessions (P1.7 E1) by @Ino-Bagaric in #6986
- feat: pi worker tools act on the lazy environment (P1.7 E2) by @Ino-Bagaric in #6989
- fix(api): session environments idle-stop at 60min, not the 12h backstop by @Ino-Bagaric in #6990
- feat(kortixd): context-aware update/rollback — stage via supervisor in-sandbox (Option A) by @markokraemer in #6988
- feat(sdk,api,daemon): own the session read+realtime surface — /kortix reads, one /events SSE, zero polls, /snapshot by @markokraemer in #6987
- fix(web): remove leftover diff3 base block in session-chat — frontend build was red by @Ino-Bagaric in #6991
- feat(worker): pi sessions render in the product — the Kortix Runtime API on the worker by @Ino-Bagaric in #6993
- fix(worker): skip pi's user-role message frames — the worker publishes the user turn itself by @Ino-Bagaric in #6994
- fix(worker): answer the raw /session pin probe; only assistant roles translate by @Ino-Bagaric in #6995
- fix(api): defer the ensurePiWorkerImage import so builder mocks cannot SyntaxError by @markokraemer in #6982
- cleanup(sdk,web): fix stale open-bundle/stream refs after own-the-surface rename by @markokraemer in #6992
- perf(daemon): decompose opencode-ready into named marks; prefetch the initial-turn claim by @markokraemer in #6996
- fix(web): every URL the tab system writes to history is now a real route by @markokraemer in #6997
- docs(learnings): deployed configuration has one truth, and it is not the file in git by @markokraemer in #7001
- fix(daemon): never build an OpenCode Instance before the workspace is complete by @markokraemer in #7002
- fix(sdk): stopped-box 'not-running' 404 is wakeable, not 'Couldn't load this conversation' by @markokraemer in #6999
- docs(learnings): down box has two proxy responses — classify both wakeable by @markokraemer in #7003
- chore(secrets): 1:1 parity between apps/api/.env. and AWS Secrets Manager by @markokraemer in #7000
- fix(daemon): open the Instance gate where the workspace is complete, not right after spawn by @markokraemer in #7004
- fix(api): /events attaches to a reachable box, not only an 'active' row by @markokraemer in #7007
- fix(preview): every Server Action 500s — pin the public host for Next's CSRF guard by @Ino-Bagaric in #7006
- fix(web): stop shipping every frontend log to the raw sandbox /log route by @markokraemer in #7008
- chore(docs): delete agent work artifacts; SDK rules become the
sdkskill by @markokraemer in #7010 - fix(sdk): retire the transcript-poll fallback — /events is the single feed by @markokraemer in #7011
- fix(preview): route the API's non-/v1 paths through the preview edge by @Ino-Bagaric in #7012
- docs(learnings): a shared-origin environment must enumerate the API's non-/v1 paths by @Ino-Bagaric in #7013
- docs(learnings): compose does not restart a container for new bytes in a mounted file by @Ino-Bagaric in #7015
- feat(preview): the preview label keeps an environment online until it is removed by @Ino-Bagaric in #7017
- refactor(snapshots): delete the per-project warm image system (−5,959 lines) by @markokraemer in #7014
- fix(preview): keep the --target-full gate on the label deploy by @Ino-Bagaric in #7018
- fix: seven prod faults behind one report — secrets, Slack routing, zombie boxes, terminal 1006, connector honesty by @kubet in #7016
- feat(preview): re-point a stable hostname's worker on every deploy by @Ino-Bagaric in #7019
- fix(preview): ship the pi-router worker to main so the deploy can re-point it by @Ino-Bagaric in #7021
- revert: restore the OpenCode client, remove the Kortix Runtime client by @markokraemer in #7022
- fix(secrets): the server stops guessing secret delivery from the name by @kubet in #7020
- chore(secrets): delete the Kortix-managed Anthropic proxy and the unused SES keys by @markokraemer in #7009
- fix: nested- markdown hydration error + daemon staleness false-positive by @markokraemer in #7025
- fix(sandbox-agent): re-wire turn auto-resume — transient provider errors were surfacing raw by @markokraemer in #7026
- Remove AsterLab and managed GLM 5.2 by @markokraemer in #7029
- Fix staging release gates by @markokraemer in #7028
- fix(web,sdk): slider Reset, @-menu Enter, Interrupted placement, tab indicator by @Ino-Bagaric in #7030
- Promote main to staging — 2026-08-28 by @markokraemer in #7027
- Slack channel takeover + secret delivery: targeted release candidate by @kubet in #7032
- feat(preview): a preview environment lives until its BRANCH is deleted by @Ino-Bagaric in #7023
- Promote main to staging — 2026-08-28 follow-up by @markokraemer in #7033
- fix(session): thirteen session-runtime defects — stop button, keepalive evidence, history pages, terminal cards, boot flag, agent roster, queue clock, dead open-bundle, redirect loop, atomic paint by @sutharjay1 in #6957
- fix(waf): allow OAuth loopback redirects by @markokraemer in #7034
- release: promote main to staging by @markokraemer in #7035
- fix(preview): do not point a stable hostname at a stack that is down by @Ino-Bagaric in #7036
- fix(web): restore GitHub repo sources on /new, fix People-with-access gate by @Ino-Bagaric in #7037
- fix(tests): follow stopped-session transcript mirror contract by @markokraemer in #7038
- release: refresh v0.13.7 candidate from main by @markokraemer in #7039
- Release v0.13.7 — Faster sessions, Sign in with Kortix, and organization branding by @github-actions[bot] in #7041
New Contributors
- @ArtemShatokhin made their first contribution in #6961
Full Changelog: v0.13.6...v0.13.7