New
- Steer a running turn. A message sent with Enter while the agent works reaches the running turn at its next step, and the turn does not stop. The message waits above the composer as "Read at next step". Cmd/Ctrl+Enter still queues a message for after the turn, and a queued message has a "Stop and send" action. The CLI has
kortix sessions chat --steer. - Live queue state. The queue above the composer updates from the session stream instead of a once-a-second poll.
- Spend by source. LLM credit usage shows which trigger, member or caller spent it.
- Trigger templates can use
cron.scheduled_dateandcron.scheduled_hour. - CLI:
kortix validatewarns about large repositories, andkortix shipruns it first. - New skill form: a skill can be created from a form without a model.
- The new-project handoff shows each provisioning step as it happens.
Improved
- A ChatGPT connection that reached its plan limit is tried again after 15 minutes, and its owner can retry it at once.
- pi compacts the conversation at a token budget instead of at the model's full window.
- A sandbox that cannot start because the provider's storage quota is full says so.
- A slow session restore shows as waiting, not as stalled or failed.
- A scheduled account deletion now runs when it is due. It removes the account's data and login, cancels the subscription and stops the sandboxes.
- Members no longer see Restart, Stop or Delete on sessions they cannot control. A manually fired trigger is labeled as manual.
Fixed
- YAML and JSON files preview again.
- A 401 makes every app fetch a fresh token.
- Usage metering closes gaps where a stream could go unbilled, and refunds are clawed back correctly.
- Monthly renewals keep credit balances to the full four decimals.
- An "Only you" secret stays private when its holder's role or group changes.
- Only live account tokens are listed, and a 401 from a revoked token names it.
- Security hardening: tenant isolation for invites, usage and setup links, agent app preview isolation, MFA step-up, and sandbox proxy access checks.
- The API finishes in-flight work on shutdown and retries webhooks until they are acknowledged.
- CLI fixes for
projects link --host,approvals lsand change requests. - Slack and Teams file downloads stay inside the project.
- An approval request sends one notification, not one per server.
- A change to who can use a secret or a connected account applies on every server at once.
What's Changed
- refactor(api): R4 API layers — explicit routes, services free of HTTP, workers/, iam read models by @DimitrijeGlibic in #9200
- feat(infra): prepare dev and staging to leave us-west-2 (region consolidation, phase 0) by @DimitrijeGlibic in #9201
- fix(web): members are not offered session Restart, Stop or Delete they cannot use by @Ino-Bagaric in #9211
- refactor(api): break the project-snapshot barrel import cycles (KRTX-1598) by @agent-kortix in #9140
- fix(tunnel): parse the rpc body with the shared tolerant parser (KRTX-1569) by @agent-kortix in #9139
- fix(web): one CodeMirror state/view/lezer copy, so yaml and json files preview again by @markokraemer in #9217
- fix(cli): resolve one principal for the change-request commands (KRTX-1486) by @agent-kortix in #9102
- fix(cli): show approvals ls action ids with one connector prefix (KRTX-1668) by @agent-kortix in #9215
- fix(api): name the real manifest file in the oauth1 auth rejection (KRTX-1558) by @agent-kortix in #9137
- fix(cli): projects link --host authenticates with the named host's stored key (KRTX-1673) by @agent-kortix in #9220
- feat(web): show the streamed provisioning steps on /new's handoff (KRTX-1543) by @agent-kortix in #9216
- chore(release): VERSION → 0.13.52 [skip ci] by @github-actions[bot] in #9234
- chore(release): staging VERSION → 0.13.52 [skip ci] by @github-actions[bot] in #9233
- fix(api): a held prompt no longer loops the drain, and a shutdown hands its claims back by @DimitrijeGlibic in #9229
- fix(api): an "Only you" secret stays closed when its holder is promoted, removed or its group deleted by @Ino-Bagaric in #9231
- fix(web): label a manual trigger fire as manual in the sessions list (KRTX-1676) by @agent-kortix in #9224
- fix(sessions): a full sandbox-provider storage quota says so instead of "could not start. Try again" by @Ino-Bagaric in #9236
- refactor(api): split sandbox env transport, flatten monitors and access casts (KRTX-1499) by @agent-kortix in #9101
- feat(infra): switch dev to its us-east-2 stack (region consolidation, phase 2) by @DimitrijeGlibic in #9230
- fix(api): normalize x-forwarded-proto in the public-share origin (KRTX-1570) by @agent-kortix in #9138
- feat(triggers): cron.scheduled_date and cron.scheduled_hour template fields by @markokraemer in #9239
- feat(gateway): spend by source — which trigger, member or caller spent LLM credits by @markokraemer in #9242
- fix(billing): execute scheduled account deletions from a leader-elected worker (KRTX-1260) by @agent-kortix in #8993
- fix(pi): compact at a token budget, not at the model window by @markokraemer in #9245
- fix(api,cli): name the revoked account token in the dead-credential 401 (KRTX-1564) by @agent-kortix in #9227
- feat(skills): give the skill New flow a no-model form path (KRTX-1537) by @agent-kortix in #9232
- fix(api): list only live account tokens (KRTX-1675) by @agent-kortix in #9221
- feat(api): R9 prompt queue — one state definition, NOTIFY-driven drain, restart-safe dedupe, every sender through the queue by @DimitrijeGlibic in #9255
- feat(infra): switch staging to its eu-west-2 stack (region consolidation) by @DimitrijeGlibic in #9254
- fix(gateway): re-try a ChatGPT connection 15 min after a plan limit; owner retry now by @markokraemer in #9257
- docs(learnings): give every provider cooldown a short re-try by @markokraemer in #9259
- feat(cli): kortix validate warns on large repositories; kortix ship runs validate by @DimitrijeGlibic in #9261
- fix(sdk): a 401 forces a fresh token in every host; raw SDK fetches go through send() by @markokraemer in #9262
- feat(sessions): steer a running turn (R10) + queue state from the session stream by @DimitrijeGlibic in #9260
- fix(billing): metering integrity — no free streams, refund clawback, fail-closed gate by @markokraemer in #9265
- fix(sandbox-proxy): canonical gate path, project-level access, edge and egress hardening by @markokraemer in #9258
- fix(ci): point workflows at the dev trunk; main no longer exists by @markokraemer in #9268
- fix(web): isolate agent app previews; MFA step-up, demo-request and shell hardening by @markokraemer in #9267
- fix(api): drain on SIGTERM, ack-or-retry webhooks, fence the leader lease, bound worker state by @markokraemer in #9271
- fix(authz): tenant-isolation hardening (invites, usage, gateway edge, setup links, impersonation) by @markokraemer in #9272
- fix(runtime): a keep-alive poll never undoes a stop; release dedupe claims; bound the runtime streams by @markokraemer in #9273
- fix(ci): trust the dev branch in the Terraform apply gate after the main → dev rename by @markokraemer in #9274
- fix(ci): prod deploy role scoped to the prod environment, trunk rename main->dev, fail-closed gates (audit 09) by @markokraemer in #9276
- fix(web): a slow restore is a waiting state, not a stall or an error by @Ino-Bagaric in #9266
- fix(billing): scheduled account deletion deletes data and auth user, claims atomically, retries failed steps by @markokraemer in #9277
- fix(release): unblock the v0.13.52 staging gate by @markokraemer in #9270
- docs(billing): correct the deletion-guard comment about auth-user deletes by @markokraemer in #9279
- perf(db): index trigger session lookups by (project, slug, key) by @markokraemer in #9282
- fix(release): v0.13.52 gate round 2 — deletion snapshot, stale suppression, learnings index by @markokraemer in #9280
- Promote dev 938fe72 to staging by @markokraemer in #9285
- fix(channels): confine Slack and Teams file downloads to the project; no sync needed (KRTX-933) by @Ino-Bagaric in #9291
- fix(ci): staging web reads its Vercel credentials from us-west-2 by @markokraemer in #9293
- fix(web): a small avatar holds one initial at its own size (KRTX-1047) by @Ino-Bagaric in #9295
- Promote dev 0ccced2 to staging by @markokraemer in #9294
- docs(learnings): rename the trunk only together with every workflow, test and hook that names it by @markokraemer in #9298
- fix(web): pin the "Sending" label under a sent message so it never slides by @DimitrijeGlibic in #9297
- fix(ci): staging verify reads the Vercel bypass from us-west-2 by @markokraemer in #9301
- fix(api): one permission push per request id across every API replica; AUD-6 polls its delivery by @markokraemer in #9304
- test(e2e): IAM-40 waits out the IAM cache window; IAM-27 asserts the exact cap only on one replica by @markokraemer in #9305
- test(e2e): accounts flow passes a defined userId to the member delete by @markokraemer in #9306
- fix(iam): never cache secret and connection grants; SEC-AUD flows run on deployed targets by @markokraemer in #9307
- test(flows): CONN-29 polls the widen past the object-grant cache TTL by @markokraemer in #9308
- chore: dead-code sweep (-18.9k lines, 7 web deps) by @markokraemer in #9310
- test(e2e): journeys 23, 27 and 38 follow staging's real behavior (v0.13.52 gate) by @markokraemer in #9309
- Promote dev a44ba90 to staging by @markokraemer in #9311
- Release v0.13.52 — Steer a running turn, live queue state, and spend by source by @github-actions[bot] in #9302
Full Changelog: v0.13.51...v0.13.52