github kortix-ai/suna v0.13.56
v0.13.56 — Tools on every harness, one-step MCP install, and billing alerts for owners

latest release: dev-latest
6 hours ago

New

  • Tools run on both harnesses. A tool is one module that OpenCode and pi both run. Declare a project's own tools under tools: in kortix.yaml, and limit which agents see them with agents.<name>.tools.
  • The Kortix tools are listed in kortix.yaml. web_search, image_search, scrape_webpage, memory and show appear as kortix:<name>. Delete a line to remove that tool. kortix tools ls lists a project's tools, and kortix tools eject <name> copies one into the project so you can change it.
  • One-step MCP install. Installing an MCP app goes straight to the server's sign-in, and a connector you authorize with your own account loads its tools. The app and connector pages are redesigned.
  • Every connector account picks its audience. Install adds the connector to the project. Add account then asks for a name and Who can use it: only you, everyone in the project, or specific people, groups or agents.
  • Connect MCP in the project sidebar opens the MCP connect dialog.
  • Connector calls from code. Apps and scripts can call a project's connectors through @kortix/sdk, with typed handles and a stable result.
  • Reminders page. A calendar (day, week, month) and a list with bulk pause, resume and remove. Reminders is beta: enable Reminders under Settings → Feature flags.
  • App event triggers (beta). Run an agent when something happens in a connected app, such as a new email or an opened pull request. Every app that publishes events is listed, and you can browse its events before you connect it. Enable App event triggers under Settings → Feature flags.
  • Notification center (beta). Kortix tells the right person when a session needs them: an in-app inbox, Web Push and email. Off by default: enable Notification Center under Settings → Feature flags.
  • Billing alerts for owners. Owners get an email when the wallet runs out, and when a declined card turns auto top-up off. The Billing pane says why auto top-up is off. A member who runs out of credits can ask the owners from the product. Budget managers get an email at 80% and 100% of an LLM gateway budget.
  • kortix feedback "<message>" files a bug, an idea or a friction report from a terminal or from inside a session.

Improved

  • Streaming replies appear word by word, at the pace they arrive, on web and mobile.
  • A long paste (more than 1,000 characters or 10 lines) becomes a "Pasted text" tile on web and mobile.
  • Every prompt a person did not type, from a reminder, a trigger, another session or Slack, shows a source pill above a plain message.
  • The server owns session state and sends it on one stream, so open tabs stop polling for it.
  • Config releases run for every project. What merges to the base branch reaches new sessions, and a large repository no longer loses its config release.
  • A sandbox sleeps sooner: a turn that waits on a person stops keeping it awake, and an open tab keeps it awake only while someone uses it.
  • pi (experimental) loads the project's root AGENTS.md, runs the agent you pick for a prompt, and can take back an unread steer or a queued prompt.
  • Agents in a session use the kortix CLI for connectors; the in-sandbox kortix-connectors MCP server is removed. kortix connectors connect --label names the new account.
  • The hosted MCP server at api.kortix.com/v1/mcp is the one Kortix MCP server. The docs-only server at kortix.com/mcp is retired, and list_projects answers an empty list on an account with no projects.
  • File listings show folders with more than 1,000 files, with search on web and mobile.
  • The invite page names the project and the role. After you accept an invite or switch accounts, you land in that account.
  • Mobile: New session opens project home with the composer focused. Sessions draw tables on a full grid, hide thinking, and keep a floating composer.
  • CLI: sessions ls and sessions status --json show each session's model. triggers info shows the webhook signing scheme with a sample. approvals ls prints the decision link. projects info --json includes the project ID.
  • Session start, connector calls, cost summaries and the Reminders page use fewer database reads.
  • A session with many images or binary files loads them a few at a time instead of all at once.
  • Your computer shows the access the agent on that computer really has, in the browser and in the desktop app. Narrowing access applies at once from anywhere; widening it asks on the computer.
  • 30 API routes that no client calls answer 410 Gone.
  • The subprocessor list adds six vendors.
  • A finished turn folds its work into one Worked for row. The answer and any cards the agent showed stay visible below it.
  • A question from the agent docks onto the composer as one surface, with previous/next and a confirm step that links back to each answer.
  • The docs at kortix.com/docs are rewritten: 31 pages, with Git as a core page.
  • Mobile asks you to update when the installed app is older than the minimum version the API sets.
  • When you mention files on your own machine, the agent offers to connect your computer.

Fixed

  • A Stop wins over a session that is still opening and over its queued prompts.
  • A session whose sandbox provider is at capacity retries the start by itself, with backoff, instead of waiting for Restart.
  • Queued prompts go out at the turn boundary and survive a busy queue. Only a queued prompt's author can edit, send or retry it, and an idle send shows as active, not queued.
  • A session keeps its history when its runtime changes, a degraded transcript copy no longer serves a partial history, and a shorter read never deletes saved messages; only a rewind removes them.
  • A reload paints the conversation this device kept without placeholder rows first, a streamed message settles when its turn ends, and a session whose sandbox lost its state keeps the conversation this device saved.
  • Session boot: sandbox.on_boot runs again after a session resumes, the boot finds its config when a pin file is missing, a failed environment build no longer breaks the boot, and a sandbox falls back to 4 GiB of memory when no size is set.
  • A failed sub-agent run can be retried in its own thread.
  • Sessions: a failed-turn notice clears after you edit and resend, the turn outcome footer is back, the restart offer on a stuck boot follows the session's state, the session list pages correctly, and other tabs learn when a turn finishes.
  • The composer waits for the model list during boot, and a new free account can send with the default model.
  • The connector-connected notice joins the prompt queue and reaches the running turn.
  • Triggers: a cron trigger fires at most once a minute, every webhook delivery runs exactly once, a failed fire is recorded on the trigger, the list says when a trigger runs next, a fire waits when the account has no usable model, and a manual or webhook fire the account cannot pay for answers 402 with the reason instead of a server error.
  • Saving a connector credential is atomic, a Slack undo call is bounded by the call deadline, and a crash in the marketplace dialog stays inside the dialog.
  • The email channel shows on the channels page, and the inbox of a deleted account tells the sender once per thread.
  • Change requests: large change requests show their changed files, a blank diff says why, and the side-by-side toggle works on one-sided diffs.
  • Binary file previews work again, and links to a session's files open instead of showing [blocked].
  • Computer use on a connected computer works for every tool and survives restarts and app updates. The CLI and the desktop app run as one runtime.
  • Sign-in: a magic link works when the browser drops a cookie, a sign-in no longer bounces back to the sign-in page, and a sign-in or sign-up that stalls ends with an error you can retry. On mobile, SSO sign-in completes and the login stays until you sign out.
  • The onboarding wizard opens on an account's first project, owners see the create-project screen on /projects, and the account menu has a Settings row.
  • After a deploy, a page that loads stale code reloads once instead of breaking.
  • Account deletion works when a session sandbox exists, never deletes an operator's login, and works on self-host.
  • A push to GitHub that the remote rejects with a 500 is retried, and an expired checkout link answers with a clear not-found.
  • Trigger and top-up controls show only to people who may use them, and the project config lists every registered agent.
  • Translations and accessible names for icon buttons and the preview toggle.
  • /download has its site navigation again, and /blog serves the blog.
  • CLI: agents ls lists the project's agents, ship and in-sandbox host selection use the right credentials, the CLI token list hides session tokens, reminders ls shows the prompt text, and triggers fire reports the real outcome.
  • Self-host: doctor fails when sign-up is open and unconfirmed, self-host status --json prints clean JSON, the CLI refuses to rotate API_KEY_SECRET and POSTGRES_PASSWORD, and /v1/setup/status no longer stalls the API while it checks Docker.
  • Mobile: streaming turns stay stable, change requests anchor to their turn, the composer stays above the keyboard, and web links open in the in-app browser.
  • The Add account dialog that Install opens proposes a name that is still free.
  • @kortix/agent-tunnel connect and the CLI's sandbox port proxy connect under Bun again.
  • The sidebar toggle tells screen readers whether the sidebar is open.
  • The Providers tab no longer shows the Kortix-managed provider as connected when it serves no models.
  • CLI: kortix providers subcommands reject unknown flags instead of ignoring them.

Security

  • SSO is enforced at the API for every credential. Sign-up without a browser follows the sign-up policy and SSO-only domains. The admin allowlist never matches an SSO identity, and a personal account cannot set up SAML.
  • Offboarding stops what a member left behind: computer calls, reminders, pushes and group memberships. A deleted account closes every side route, account erasure removes stopped sandboxes, session files and managed repos, and deleting a project deletes its managed git repo.
  • A session push reaches only people who may still open the project, and a signed-out device stops getting pushes.
  • kortix secrets unset revokes every outstanding setup link for that secret.
  • /userinfo rejects tokens of a deactivated OAuth client.
  • A trigger with no agent runs with the permissions of the agent its run uses.
  • A single-label egress wildcard matches exactly one subdomain label.
  • The public installer verifies the release checksum.
  • Pinning a session's runtime on the turn stream requires the session's own sandbox credential.
  • Dependency updates for HIGH CVEs (gRPC, golang.org/x/net, sharp, the MCP SDK, undici and others), and the sandbox daemon and release scripts create temporary files owner-only.

Not yet offered in Settings

  • Apps hosting (static sites served without a sandbox, and server Apps on releases, machines and volumes, with a Convex backend as a template), project Files with per-folder access, session boot modes with persistent machines, and organization-wide Volumes and Stateless sessions sit behind switches only Kortix can turn on and are not offered in Settings yet.

Behind the scenes

  • CI runs on GitHub-hosted runners, and database indexes, connection pooling, audit storage and infrastructure checks are tightened.
  • Groundwork for a durable session log, off for every project.

What's Changed

  • test(e2e): journey 23 asserts the toolkit search wire contract; connect POST only when sent by @markokraemer in #9314
  • chore(release): VERSION → 0.13.53 [skip ci] by @github-actions[bot] in #9316
  • fix(api): let a session's own credential open its own session (KRTX-1688) by @agent-kortix in #9235
  • fix(audit): make the reconciliation dedupe probe an index condition (KRTX-618) by @agent-kortix in #9238
  • fix(cli): explain a foreign env session instead of a bare Not found in reminders (KRTX-1686) by @agent-kortix in #9219
  • fix(web): recover the settings panel's stale-deploy chunk with one reload (KRTX-1616) by @agent-kortix in #9222
  • fix(cli): keep self-host status JSON output clean (KRTX-1325) by @agent-kortix in #8876
  • fix(cli): include the project id in projects info --json (KRTX-1659) by @agent-kortix in #9240
  • fix(models): serve the platform default to free tier so a fresh account can send (KRTX-1067) by @agent-kortix in #8983
  • fix(api): refuse agent sessions on the project sandbox-provider pin (KRTX-1681) by @agent-kortix in #9212
  • fix(cli): print the /approve decision link in approvals ls rows (KRTX-1669) by @agent-kortix in #9246
  • fix(web): recover /auth from a stale client bundle after a deploy (KRTX-1685) by @agent-kortix in #9248
  • fix(web): owners see the create-project empty state on first /projects (KRTX-1700) by @agent-kortix in #9250
  • refactor(api): move the fast-boot bundle out of commits.ts and dedupe the diff parser (KRTX-1512) by @agent-kortix in #9218
  • feat(cli): expose the session's resolved model in sessions ls/status --json (KRTX-1695) by @agent-kortix in #9251
  • fix(projects): delete the managed git repo with its project (KRTX-1692) by @agent-kortix in #9252
  • fix(web): the stuck-boot restart offer follows the lifecycle verdict (KRTX-1671) by @agent-kortix in #9286
  • fix(api): account deletion never deletes an operator's login, and works on self-host (KRTX-1713) by @Ino-Bagaric in #9323
  • fix(api): write runtimeSessionId on the migrated-session insert (KRTX-1536) by @agent-kortix in #9288
  • test(infra): make the unit suites hermetic on a Kortix worker sandbox (KRTX-1320) by @agent-kortix in #8949
  • fix(api): require the session sandbox credential for the turn-stream runtime_session pin (KRTX-1607) by @agent-kortix in #9290
  • perf(api): one grouped scan per window for the cost summary (KRTX-1605) by @agent-kortix in #9300
  • fix(web): restore the turn-outcome footer render the session-chat split dropped (KRTX-1622) by @agent-kortix in #9303
  • fix(cli): report the real trigger fire outcome (KRTX-1504) by @agent-kortix in #9289
  • fix(api): stage the opencode config through its dependency-tree filter (KRTX-1535) by @agent-kortix in #9313
  • fix(supabase): use the current refresh-token rotation config key (KRTX-1656) by @agent-kortix in #9317
  • fix(api): a single-label egress wildcard matches exactly one subdomain label (KRTX-1654) by @agent-kortix in #9321
  • fix(api): list every registered agent from the project config summary (KRTX-1586) by @agent-kortix in #9296
  • fix(sessions): only a queued prompt's author edits, sends or retries it (KRTX-1712) by @Ino-Bagaric in #9325
  • fix(sdk): retry an errored no-data query with capped backoff so pages self-heal (KRTX-1632) by @agent-kortix in #9318
  • fix(api): dispatch queued prompts at the turn boundary, not after the whole run (KRTX-1684) by @agent-kortix in #9319
  • docs(kortix-release): edge-key rollout checklist by @markokraemer in #9327
  • fix(cli): refuse to rotate API_KEY_SECRET and POSTGRES_PASSWORD (KRTX-1719) by @Ino-Bagaric in #9328
  • fix(api): warn once per unreachable spell past its ride-out budget (KRTX-696) by @agent-kortix in #9228
  • fix(ci): pin third-party CI actions to SHAs in credential-holding workflows (KRTX-1711) by @agent-kortix in #9281
  • fix(sessions): queued-prompt writes survive the drain's admission claim (KRTX-1712) by @Ino-Bagaric in #9330
  • chore(deps): bump bridgecrewio/checkov-action from 12.3125.0 to 12.3128.0 by @dependabot[bot] in #9180
  • chore(deps): bump terraform-linters/setup-tflint from 6.3.1 to 6.3.2 by @dependabot[bot] in #9181
  • chore(deps): bump anchore/sbom-action from 0.24.2 to 0.24.3 by @dependabot[bot] in #9182
  • fix(api): the admin allowlist never matches an SSO identity; no SAML on a personal account (KRTX-1715) by @Ino-Bagaric in #9331
  • fix(cli): verify the downloaded release checksum in the public installer (KRTX-1652) by @agent-kortix in #9322
  • fix(web): the side-by-side toggle switches one-sided diffs too (KRTX-1691) by @agent-kortix in #9287
  • fix(api): make transcript-mirror strings storable as jsonb (KRTX-1701) by @agent-kortix in #9253
  • feat(cli): put the webhook signing scheme and sample in triggers info (KRTX-1666) by @agent-kortix in #9249
  • fix(cli): show the reminder prompt text in reminders ls (KRTX-1524) by @agent-kortix in #9243
  • fix(api): retry and de-noise a GitHub receive-pack 500 push rejection (KRTX-1683) by @agent-kortix in #9226
  • fix(billing): map Stripe's no-such-checkout-session to the typed 404 (KRTX-1682) by @agent-kortix in #9223
  • fix(web): reload once on a stale-deploy chunk-load error (KRTX-1613) by @agent-kortix in #9213
  • fix(cli): resolve ship from workspace host credentials (KRTX-1258) by @agent-kortix in #8865
  • fix(web): hold the composer model gate during session boot (KRTX-1667) by @agent-kortix in #9244
  • fix(web): hide the seeded harness reflector from the Triggers list (KRTX-1299) by @agent-kortix in #8921
  • fix(files): byte-accurate project reads restore binary previews (KRTX-1677) by @agent-kortix in #9247
  • fix(api,cli): hide session-minted tokens from the project CLI token list (KRTX-1193) by @agent-kortix in #8926
  • fix(web): put a Settings row in the account menu on /projects and /new (KRTX-1327) by @agent-kortix in #8925
  • feat(billing): cap the scheduled deletion sweep at 25 per tick and add ACCOUNT_DELETION_SWEEP_PAUSED by @markokraemer in #9332
  • test(api): make the audit partition suites independent of the migration week (KRTX-1633) by @agent-kortix in #9283
  • fix(api): ask the in-place recovery gate before a background pass condemns a runtime (KRTX-208) by @agent-kortix in #9036
  • test(web): preserve reporting of unknown input-stream failures (KRTX-984) by @agent-kortix in #8725
  • perf(db): cover the per-session gateway rollup with one index (KRTX-1311) by @agent-kortix in #9012
  • fix(ci): branch-deletion teardown no longer hits the 10000-row Platinum listing cap by @markokraemer in #9334
  • perf(db): index the runtime-wake fence candidates on kortix.session_sandboxes (KRTX-1308) by @agent-kortix in #9292
  • feat(web): full-screen MFA step-up and split-layout MCP connect modal by @sutharjay1 in #9335
  • fix(infra): Terraform stops resetting reconciler-owned unhealthy-hosts alarm dimensions by @markokraemer in #9336
  • fix(iam): enforce SSO only at the API for every credential (KRTX-1716) by @Ino-Bagaric in #9338
  • fix(billing): account deletion fails with HTTP 500 for any account with an established session box by @markokraemer in #9337
  • fix(web): restore the original phone screenshots on the /download mobile card by @sutharjay1 in #9339
  • fix(slack): run the agent in a channel thread only when someone tags it by @sutharjay1 in #9333
  • fix(mobile): call eas update:view without --non-interactive in the OTA publish by @sutharjay1 in #9342
  • fix(session): render an idle send as an active prompt, not a queued one by @sutharjay1 in #9191
  • fix(projects): a deleted workspace closes its side doors (KRTX-1714) by @Ino-Bagaric in #9344
  • test: remove disposable containers with their volumes (docker rm -f -v) by @Ino-Bagaric in #9345
  • fix(triggers): run every webhook delivery exactly once (KRTX-1735) by @Ino-Bagaric in #9347
  • feat(sessions): R5 session truth — the server owns session state, one stream, no polls by @DimitrijeGlibic in #9312
  • fix(platinum): list running boxes with state=running across all regions by @markokraemer in #9346
  • fix(iam): offboarding stops what a member left behind: computer calls, reminders, pushes, groups (KRTX-1722) by @Ino-Bagaric in #9349
  • fix(db): re-time session_changed_notify after migrations dev already ran; shell-quote 1.11.0 by @markokraemer in #9351
  • feat(web): Slack messages render as a source pill over a plain bubble by @sutharjay1 in #9350
  • fix(daemon): never restore the LLM proxy URL across a daemon restart by @DimitrijeGlibic in #9348
  • fix(config-releases): honor export-ignore outside the agent config dir (KRTX-1728) by @Ino-Bagaric in #9355
  • fix(sdk): an idle tab stops reading the transcript every 30 s; pre-push refuses an out-of-order migration by @DimitrijeGlibic in #9356
  • fix(files): list every folder past 1,000 files, and search on web and mobile (KRTX-1723) by @Ino-Bagaric in #9359
  • chore(dev-env): add KORTIX_INTERNAL_EDGE_KEY (encrypted) by @markokraemer in #9363
  • fix(billing): clear legacy NO ACTION references to the auth user before deleting the login by @markokraemer in #9365
  • fix(sessions): an open tab keeps the computer awake only while a person uses it (KRTX-1729) by @Ino-Bagaric in #9366
  • fix(triggers): a cron trigger fires at most once a minute (KRTX-1721) by @Ino-Bagaric in #9368
  • feat(session): one source pill for every non-typed prompt, web and mobile by @sutharjay1 in #9369
  • fix(sessions): an empty page with a cursor is not an empty list (KRTX-1727) by @Ino-Bagaric in #9370
  • fix(cli): honor an explicit in-sandbox hosts use selection; keep env-over-stored default (KRTX-1705) by @agent-kortix in #9352
  • fix(web): trigger and top-up controls follow the leaf their route asserts (KRTX-1720) by @Ino-Bagaric in #9371
  • fix(web): after an invite accept or an account switch, land in that account (KRTX-1731) by @Ino-Bagaric in #9372
  • Mobile session: aligned tables, hidden thinking, and a floating composer by @sutharjay1 in #9358
  • fix(session): clear a stale failed-turn row after the message is edited and resent by @sutharjay1 in #9361
  • test: drive the SSO-required dialog in a browser (KRTX-1716) by @Ino-Bagaric in #9374
  • fix(triggers): a failed manual or webhook fire is recorded; the listing says when a trigger runs next (KRTX-1743) by @Ino-Bagaric in #9375
  • fix(web): open workspace file links instead of rendering [blocked] by @sutharjay1 in #9376
  • test: run and attest the packages lane inside a factory sandbox (KRTX-1400) by @agent-kortix in #9353
  • fix(mobile): stabilize streaming turns, anchor change requests per turn, keep the composer above the keyboard by @sutharjay1 in #9357
  • feat(connectors): typed connector calls from code — call contract, SDK handles, codegen by @markokraemer in #9381
  • fix(mobile): keep the login until the user signs out by @sutharjay1 in #9378
  • feat(accounts): signed signup webhook for the sales factory (inert until SIGNUP_WEBHOOK_URL is set) by @markokraemer in #9382
  • fix(api): one canonical default sandbox spec, memory fallback 4 GiB (KRTX-1534) by @agent-kortix in #9367
  • chore(mobile): 1.4.4, dev builds next to the store app, manual production OTA ships prod by @sutharjay1 in #9383
  • fix(sandbox): entrypoint repairs /etc/hosts to 0644 before the privilege drop (KRTX-1814) by @agent-kortix in #9340
  • fix(web): keep the session on GoTrue's no_authorization 401 (KRTX-1693) by @agent-kortix in #9377
  • fix(infra): make audit-archive tags Drata-readable (KRTX-1649) by @agent-kortix in #9341
  • fix(api): audit ingest writes small batches the 25s budget reserve refused (KRTX-229) by @agent-kortix in #9379
  • refactor(api,sdk): R6 deletions — 30 dead routes retired with 410, Suna migration chain, dead exports, mock-DB tests, pi worker table by @DimitrijeGlibic in #9360
  • fix(web): always name ToolActionBar icon buttons (KRTX-1757) by @agent-kortix in #9373
  • feat(apps): production Apps hosting — static sites without VMs, always-on server Apps, shared images, retention by @markokraemer in #9388
  • feat(triggers): app event triggers — run an agent when something happens in a connected app (Composio first, provider-agnostic) by @markokraemer in #9390
  • fix(web): serve the real blog at /blog when KORTIX_BLOG_ORIGIN is unset (KRTX-1766) by @agent-kortix in #9395
  • fix(web): guard useFileHistory's retry against non-string error messages (KRTX-1781) by @agent-kortix in #9394
  • fix(api): return a JSON array from list_projects on an empty account (KRTX-1783) by @agent-kortix in #9393
  • test(flows): GH-8 cli-token list step fails when the minted token is missing (KRTX-1800) by @agent-kortix in #9397
  • feat(invites): the invite page names the project and role; sign out and come back to the invite (KRTX-1731) by @Ino-Bagaric in #9398
  • fix(email): a deleted workspace's inbox tells the sender, once per thread (KRTX-1714) by @Ino-Bagaric in #9399
  • perf(db): cover the account+time cost aggregates with an INCLUDE index (KRTX-1769) by @agent-kortix in #9386
  • fix(push): a signed-out device stops getting push notifications (KRTX-1722) by @Ino-Bagaric in #9400
  • feat(billing): auto top-up says why it turned off, and emails the owners when a declined card does it (KRTX-1718) by @Ino-Bagaric in #9402
  • feat(billing): Ask an owner — a member out of credits emails the owners (KRTX-1718) by @Ino-Bagaric in #9404
  • feat(gateway): email the budget managers at 80% and 100% of a gateway budget (KRTX-1718) by @Ino-Bagaric in #9405
  • fix(web): signal finished turns to tabs watching from elsewhere (KRTX-1795) by @agent-kortix in #9401
  • feat(billing): email the owners when the wallet reaches $0 (KRTX-1718) by @Ino-Bagaric in #9406
  • fix(sessions): cap what presence alone keeps a box awake, whatever the client reports (KRTX-1729) by @Ino-Bagaric in #9408
  • fix(triggers): a connection finished outside Kortix goes live by itself; connect-finalize --owner project by @markokraemer in #9392
  • feat(tools): harness-agnostic tools, kortix.yaml tools: and per-agent tool access by @DimitrijeGlibic in #9410
  • fix(connectors): kortix-connectors MCP off by default; kortix connectors connect --label by @markokraemer in #9412
  • fix(runtime): R7 — pi retract, per-prompt agent on pi, session list without a timer, /pty refusal by @DimitrijeGlibic in #9391
  • feat(triggers): app event triggers name the connector profile and, optionally, the shared account by @markokraemer in #9413
  • refactor(connectors): remove the in-sandbox kortix-connectors MCP; agents use the kortix CLI by @markokraemer in #9414
  • fix(web): give /download its site nav and brand link back (KRTX-1792) by @agent-kortix in #9407
  • test(secrets): delete the box-less sandbox rows the secrets flows insert by @Ino-Bagaric in #9415
  • fix(triggers): status text names the app for slug-named connectors; learnings: secrets go in the deployed env bundle by @markokraemer in #9416
  • feat(backends): Kortix Backends — self-hosted Convex with Kortix sign-in, ops and agent skills by @markokraemer in #9264
  • feat(pi): load the project's root AGENTS.md into the system prompt by @DimitrijeGlibic in #9411
  • fix(sessions): a turn that waits on a person stops renewing its box (KRTX-1739) by @Ino-Bagaric in #9418
  • fix(apps-router): forward a User-Agent when the client sends none by @markokraemer in #9419
  • feat(session): long pastes become a "Pasted text" tile on web and mobile by @sutharjay1 in #9380
  • fix(web): align the preview modal's source-toggle aria-pressed with the file header (KRTX-1778) by @agent-kortix in #9409
  • feat(web,mobile): smooth streaming replies, word by word by @sutharjay1 in #9420
  • fix(web): show the Email channel on the channels page (KRTX-1801) by @agent-kortix in #9403
  • fix(web): translate the command-attachment refuse description (KRTX-1710) by @agent-kortix in #9387
  • fix(self-host): doctor fails on open unconfirmed sign-up; bootstrap-owner needs the host key (KRTX-1715) by @Ino-Bagaric in #9421
  • refactor(mcp): one Kortix MCP server — remove kortix.com/mcp + WebMCP; fix dev's #9380 tests by @markokraemer in #9422
  • feat(triggers): see every app event at a glance; the event source is an adapter type (source: composio) by @markokraemer in #9425
  • feat(config-releases): build a release from the checkout or the project snapshot, so the 32 MiB archive cap no longer drops a session's config by @DimitrijeGlibic in #9424
  • fix(cli): an app event error from its connector or source names the connector fix; TRG-18 race by @markokraemer in #9426
  • learnings: run pnpm test:verify before merging into dev by @markokraemer in #9428
  • fix(config-releases): a box with no base pin builds an archive-less release from its checkout at boot by @DimitrijeGlibic in #9429
  • feat(tools): list the Kortix tools in kortix.yaml as kortix:; kortix tools ls/eject by @DimitrijeGlibic in #9427
  • fix(ci): read each env blob from its own region, not the us-west-2 default by @DimitrijeGlibic in #9430
  • docs(infra): the audit archive is a record, not a cache; copy it before a region switch by @DimitrijeGlibic in #9431
  • fix(db): scope user_roles RLS policies to their JWT roles (KRTX-1166) by @agent-kortix in #9433
  • fix(accounts): erasure removes parked boxes, session files and managed repos (KRTX-1734) by @Ino-Bagaric in #9435
  • fix(push): a session push reaches only people who may still open the project (KRTX-1722) by @Ino-Bagaric in #9436
  • fix(triggers): a failed app-event or monitor fire is recorded on the trigger (KRTX-1743) by @Ino-Bagaric in #9438
  • fix(triggers): a trigger with no agent is authorized as the agent its run uses (KRTX-1720) by @Ino-Bagaric in #9439
  • fix(auth): headless sign-up follows the sign-up policy and SSO-only domains (KRTX-1716) by @Ino-Bagaric in #9440
  • refactor(mobile): split 1k files, dedupe shared UI, delete dead code (KRTX-1292) by @agent-kortix in #9441
  • fix(session): subagent retry — reopenable thread + task_id-aware recovery prompt (KRTX-1746) by @agent-kortix in #9362
  • refactor(web): reuse the shared bounded background-worker parser (KRTX-1756) by @agent-kortix in #9364
  • feat(notifications): notify the right person on any surface: inbox, Web Push, email (KRTX-1742) by @Ino-Bagaric in #9446
  • feat(config-releases): config releases run for every project — remove the config_releases flag by @DimitrijeGlibic in #9432
  • feat(legal): add Hivelocity, OpenCode Zen, Morph, Plain, Pipedream and Expo to the subprocessor list by @markokraemer in #9451
  • feat(web): Connect MCP row in the project sidebar, official MCP icon by @sutharjay1 in #9454
  • refactor(kortixd): split config-provider and workspace-provider, share through lib/ by @DimitrijeGlibic in #9455
  • chore(mobile): upgrade to Expo SDK 57 (React Native 0.86.3), version 1.5.0 by @sutharjay1 in #9458
  • feat(mobile): New session focuses the project home composer by @sutharjay1 in #9457
  • feat(notifications): KRTX-1742 behind the notification_center flag, off by default by @Ino-Bagaric in #9459
  • feat(triggers): every app with events, browse before connecting, one clean trigger UI, and the event_triggers feature flag by @markokraemer in #9461
  • feat(apps): Backends become Apps of kind convex — capabilities, project issuer, bindings, agnostic SDK by @markokraemer in #9463
  • fix(notifications): flag-on edge cases, presence parity and copy for notification_center (KRTX-1742) by @Ino-Bagaric in #9464
  • ci: read the CI, preview and prod env blobs off us-west-2; fix the raw reader #9430 missed by @DimitrijeGlibic in #9467
  • fix(web): Next 16.4 with turbopackGc, so the dev cache stops filling the disk by @markokraemer in #9466
  • perf(api): one joined session+sandbox read per /start tick (KRTX-2018) by @agent-kortix in #9465
  • chore(release): VERSION → 0.13.54 [skip ci] by @github-actions[bot] in #9474
  • chore(release): staging VERSION → 0.13.54 [skip ci] by @github-actions[bot] in #9475
  • fix(db): wrap public.credit_ledger RLS auth.role() in an initplan scalar subquery (KRTX-1138) by @agent-kortix in #9434
  • ci: run every job on free GitHub-hosted runners; remove Blacksmith by @markokraemer in #9453
  • fix(review): show why a file's diff body is blank and stop shipping silent empty patches (KRTX-2010) by @agent-kortix in #9468
  • fix(apps): budget only for on-demand Apps, access-filtered list, renewing App sessions by @markokraemer in #9476
  • fix(triggers): gate the fire when the account has no usable model (KRTX-1505) by @agent-kortix in #9477
  • fix(apps): settle provider state-change conflicts on App stop (KRTX-2027) by @agent-kortix in #9478
  • fix(db): fold the boot schema probe into the request pool; raise DEFAULT_DB_POOL_MAX 5→6 (KRTX-2020) by @agent-kortix in #9442
  • feat(api,cli): POST /v1/feedback and a kortix feedback CLI command (KRTX-1646) by @agent-kortix in #9389
  • perf(connectors): one /call spends a bounded set of statements (KRTX-2017) by @agent-kortix in #9452
  • fix(proxy): surface the upstream's own 5xx reason in the logs; consolidate dispatch (KRTX-2073) by @agent-kortix in #9479
  • fix(sandbox): honor the KORTIX_PT_ENV_PATH seam in reloadSessionEnv (KRTX-2039) by @agent-kortix in #9481
  • fix(kortixd): fail cursor transcript reads on a degraded mirror (KRTX-2040) by @agent-kortix in #9480
  • fix(cli): list the project's agents in agents ls (KRTX-1525) by @agent-kortix in #9470
  • fix(review): render changed-file contents for large change requests (KRTX-2010) by @agent-kortix in #9460
  • feat(drives): project Files with per-folder access, mounted and synced into sessions by @allenabraham999 in #9472
  • feat(sessions): ephemeral boxes, persistent machines and release boot artifacts, behind one Volumes switch per org by @allenabraham999 in #9473
  • fix(connectors): bound the Slack misfire-undo POST by the call deadline (KRTX-2062) by @agent-kortix in #9483
  • fix(api): make upsertConnectionCredential a single atomic ON CONFLICT write (KRTX-2061) by @agent-kortix in #9485
  • fix(api): unset revokes a secret's outstanding intake links (KRTX-2056) by @agent-kortix in #9484
  • fix(marketplace): contain add-to-project dialog mount crashes to the dialog (KRTX-1950) by @agent-kortix in #9448
  • feat(connectors): one-step MCP install, member-authorized tool catalogs, redesigned app and connector pages by @sutharjay1 in #9449
  • fix(web): restore the post-signup onboarding wizard on the account's first project (KRTX-2092) by @agent-kortix in #9492
  • fix(web): preview session drive files through the drive API by @allenabraham999 in #9493
  • fix(api): /start retries a transient provision failure instead of replaying it by @allenabraham999 in #9489
  • fix(billing): lock the legacy per-seat migration and route its writes through applyStripeSync (KRTX-2089) by @agent-kortix in #9488
  • fix(api): env-build rejection can no longer escape the session boot paths unhandled (KRTX-2064) by @agent-kortix in #9494
  • fix(sessions): a user Stop wins over in-flight opens and queued prompts by @allenabraham999 in #9495
  • fix(sandbox): rerun project boot hooks after resume by @markokraemer in #9496
  • fix(connectors): Install adds the project profile; each account picks its audience by @sutharjay1 in #9497
  • fix(sessions): persistent machine Reset keeps chat; runtime assets never serve a stale digest by @allenabraham999 in #9491
  • fix(mobile): finish SSO sign-in through the web handoff (KRTX-2052) by @sutharjay1 in #9490
  • fix(web): magic-link sign-in survives a dropped action Set-Cookie (KRTX-2095) by @agent-kortix in #9498
  • feat(web): rebuild the Reminders page with a calendar, bulk actions, and a List table by @sutharjay1 in #9499
  • fix(connectors): the connector-connected notice joins the prompt queue and steers into the running turn by @DimitrijeGlibic in #9504
  • test: pin SESS-48's exhausted-reason contract and #9499's ICU-sensitive label test (KRTX-2112) by @agent-kortix in #9503
  • fix(api): attribute the boot-window 503 and stop paging it as a route 5xx (KRTX-397) by @agent-kortix in #9500
  • fix(api): /userinfo rejects tokens of deactivated OAuth clients (KRTX-2107) by @agent-kortix in #9505
  • fix(edge): drop the request body on GET/HEAD in the api-router worker (KRTX-2081) by @agent-kortix in #9501
  • fix(release): clear the staging gate for the release after v0.13.53 by @DimitrijeGlibic in #9510
  • fix(api): keep the old root's transcript rows when the runtime root changes by @DimitrijeGlibic in #9513
  • fix(computer): desktop control works for every tool, survives restarts and app updates; CLI and desktop app are one runtime by @markokraemer in #9507
  • feat(api-contract): add the kortix.session/2 session-log module (minor 1) by @DimitrijeGlibic in #9509
  • fix(sandbox): resolve the OpenCode boot root from the claimed pin when the pin file is missing by @DimitrijeGlibic in #9515
  • fix(release): clear the second staging gate round for the release after v0.13.53 by @DimitrijeGlibic in #9519
  • feat(api-contract): freeze the session-log minor 1 additions and add a shape snapshot by @DimitrijeGlibic in #9517
  • KRTX-532: batch the project-reminders session-visibility fan-out (64→~6 db statements/request) by @agent-kortix in #9437
  • fix(auth): bound every sign-up/sign-in submit and make it retryable (KRTX-2072) by @agent-kortix in #9487
  • fix(sdk): keep saved transcript rows on an empty runtime read (P0.4) by @DimitrijeGlibic in #9526
  • fix(api): /v1/setup /status no longer blocks the event loop probing docker (KRTX-2108) by @agent-kortix in #9525
  • fix(infra): pin prod API rolling overlap to 100% to fund the next DB pool raise (KRTX-586) by @agent-kortix in #9518
  • feat(apps): Apps on the Fly.io model — releases, machines, volumes; convex becomes a template by @markokraemer in #9527
  • test: clear the third staging gate round (stop-wins race, SDK poll-deadline flake) by @DimitrijeGlibic in #9528
  • Promote dev 7825eae to staging by @DimitrijeGlibic in #9523
  • feat(sandbox): session-log port and journal in kortixd (P2.4) by @DimitrijeGlibic in #9530
  • feat(computers): the agent CLI is the one control surface; Kortix relays access, the app and web render it by @markokraemer in #9532
  • fix(api): image copies manifest-schema's node_modules (dev API boot crash after #9527); restore i18n key order by @markokraemer in #9533
  • fix(sdk): bound concurrent binary file reads; ship the provision timeline (KRTX-471) by @agent-kortix in #9516
  • fix(cli): kortix apps launch keeps kortix.yaml byte-identical outside the new blocks by @markokraemer in #9535
  • feat(apps): machines get KORTIX_USES_URL_ so a server App can call an App it uses by @markokraemer in #9537
  • fix(triggers): one event-lock holder per process, so the connector sweep cannot deadlock the pool by @DimitrijeGlibic in #9541
  • fix(cli): apps launch reads kortix.yaml once; hover-store tests poll for settled timers by @DimitrijeGlibic in #9543
  • refactor(sdk): make the mobile warm-session pool an SDK adapter (KRTX-703) by @agent-kortix in #9538
  • fix(api): isolate concurrent session refusal contexts (KRTX-2133) by @agent-kortix in #9539
  • Promote dev 4987f19 to staging by @DimitrijeGlibic in #9544
  • test: J36 asserts the visible session filter; drop unused test code CodeQL flagged by @DimitrijeGlibic in #9545
  • fix(api): bound disk-quota Daytona REST fetches (KRTX-2132) by @agent-kortix in #9540
  • fix: an unpayable trigger fire answers 402; a deleted project's gone screen stays; gate flows hold on a deployed target by @DimitrijeGlibic in #9548
  • refactor(web): delete the host model flattener; the SDK is its only definition (KRTX-455) by @agent-kortix in #9536
  • test: the Platinum sizing invariant gets its own 120 s budget; drop no-effect expressions CodeQL flagged by @DimitrijeGlibic in #9551
  • Promote dev 96df3af to staging by @DimitrijeGlibic in #9549
  • fix(api): the transcript capture never deletes because a read is shorter; only a recorded rewind does (P0.3) by @DimitrijeGlibic in #9555
  • fix(worktree): run the repo's pinned supabase CLI for every worktree call by @DimitrijeGlibic in #9554
  • fix(mobile): open every web link in the in-app browser by @sutharjay1 in #9550
  • feat(api-contract): fromV1 and toV1 between the v1 mirror and the session log (P1.3) by @DimitrijeGlibic in #9556
  • feat(db): session_log tables for kortix.session/2 (P2.1) by @DimitrijeGlibic in #9557
  • test: gate round 10 — @local-only journeys stay off deployed lanes; flows wait out per-process caches by @DimitrijeGlibic in #9559
  • fix(api-contract): session-log v1 typechecks under kortixd's flags; the packages lane runs kortixd's tsc by @DimitrijeGlibic in #9561
  • feat(mobile): minimum-version gate driven by the API (P4.6) by @DimitrijeGlibic in #9562
  • feat(api-contract): modelView and oracle normalizers for the session log (P1.4) by @DimitrijeGlibic in #9564
  • feat(sandbox): pi session-log export adapter (P2.5) by @DimitrijeGlibic in #9565
  • feat(sdk): session-log types vendored from api-contract with a drift guard (P1.5) by @DimitrijeGlibic in #9568
  • test(api): Anthropic-transport resolver tests run on a fixture catalog; the daily catalog refresh goes green by @markokraemer in #9572
  • chore(catalog): refresh model seeds by @github-actions[bot] in #9573
  • feat(sandbox): OpenCode session-log export adapter (P2.6) by @DimitrijeGlibic in #9574
  • fix(sdk): the Bedrock heal test asserts the invokable-profile intent, not one day's catalog by @DimitrijeGlibic in #9575
  • Promote dev 9bbf745 to staging by @DimitrijeGlibic in #9570
  • ci(tests-browser-nightly): read the deployed staging SHA before the target preflight by @markokraemer in #9578
  • feat(api): session-log journal ingest and manifest routes (P2.2) by @DimitrijeGlibic in #9579
  • feat(apps): display config, a signed-in Convex dashboard tab, CSP policy-list fix by @markokraemer in #9581
  • fix(web): the Add account dialog that Install opens proposes a free name by @DimitrijeGlibic in #9583
  • test(web): the content-timestamp check tolerates the squash commit that carries the manifest by @DimitrijeGlibic in #9585
  • feat(sandbox): log.* events on the runtime stream behind schema=v2, capability session.log.v2 (P4.3) by @DimitrijeGlibic in #9586
  • feat(session): fold a settled turn's work into one "Worked for" row by @sutharjay1 in #9558
  • feat(api): hidden project flag session_log (P4.1) by @DimitrijeGlibic in #9587
  • fix(agent-tunnel, cli): Bun WebSockets name themselves, so Cloudflare lets them through; the probe keeps its verdict by @markokraemer in #9576
  • fix(web): KRTX-1581 make sidebar toggle state-aware for assistive tech by @agent-kortix in #9566
  • ci(db-drift): compare prod only with migrations its ledger applied; ignore runtime audit partitions by @markokraemer in #9577
  • docs: rewrite /docs from scratch — 31 pages, Git as a core Develop page by @markokraemer in #9588
  • feat(session): dock the agent question onto the composer as one surface by @sutharjay1 in #9589
  • Hotfix: the Add account dialog that Install opens proposes a free name (#9583) by @DimitrijeGlibic in #9591
  • feat(api): session reads over the session log behind the session_log flag (P4.2) by @DimitrijeGlibic in #9596
  • test(e2e): repair the five quarantined journeys against the current UI and provider contract by @markokraemer in #9597
  • refactor(api): split provider-transition-store into routing and activation modules (KRTX-1528) by @agent-kortix in #9590
  • feat(apps): previews stay loaded across the project; clean Convex template; apps// layout by @markokraemer in #9599
  • Release v0.13.54 — Tools on every harness, one-step MCP install, and billing alerts for owners by @github-actions[bot] in #9598
  • ci: fix the v0.13.54 staging gate (gitleaks docs placeholders, journeys 27 + 34) and run package quality once per Tests run by @markokraemer in #9601
  • fix(cli): reject unknown flags on providers subcommands (KRTX-1541) by @agent-kortix in #9600
  • docs(skills): the agent offers to connect the user's computer when they mention local files by @markokraemer in #9602
  • feat(sandbox): live-turn puts on the v2 session-log stream (P4.3b) by @DimitrijeGlibic in #9608
  • feat(apps): a Convex App is the project's backend, not 'db' by @markokraemer in #9607
  • feat(feature-flags): Volumes and Stateless sessions as operator-only organization flags by @allenabraham999 in #9592
  • feat(api): log.* events on the session stream behind schema=v2, converted for old daemons (P4.4) by @DimitrijeGlibic in #9610
  • fix(web, cli): a pooled App preview stays loading until it loads; apps launch writes with wx; journey 34 sub-agent fold by @markokraemer in #9611
  • feat(sdk): session-log store, selectors and v2 negotiation (P4.5) by @DimitrijeGlibic in #9612
  • fix(web): providers tab no longer claims the managed provider when zero models are served (KRTX-1482) by @agent-kortix in #9605
  • test(e2e): journey 19 reads the organization origin label (#9592) by @markokraemer in #9619
  • Promote dev ab602ab to staging by @markokraemer in #9620
  • Release v0.13.55 — Tools on every harness, one-step MCP install, and billing alerts for owners by @github-actions[bot] in #9625
  • Hotfix: prod API keeps the live 200%/100% ECS rollout so Deploy Prod's Terraform applies (v0.13.55) by @markokraemer in #9634
  • Release v0.13.56 — Tools on every harness, one-step MCP install, and billing alerts for owners by @github-actions[bot] in #9637

Full Changelog: v0.13.53...v0.13.56

Don't miss a new suna release

NewReleases is sending notifications on new releases.