Kortix as an MCP server, Codex CLI support, reminders, approvals you can answer, and sessions that repair themselves instead of stopping.
New
- One account-level MCP server at
/v1/mcp, bound to your token like the CLI. It exposes sandbox shell and files, skills, and the session list; long commands run as jobs, and connected apps can be listed and revoked.kortix mcpruns the whole CLI as an MCP server, and a Connect MCP menu sets it up. - The LLM gateway accepts the OpenAI Responses API, so the Codex CLI works against Kortix.
- Reminders: schedule prompts into a session, with a Reminders view and a per-project flag.
- Approvals: the agent describes each gated call, the approver can reply, and approval cards reach Slack and Teams.
- New projects get a three-step onboarding and a first chat.
- GitHub projects can be created under personal GitHub accounts, and their sessions start.
- Sandbox templates can run Docker inside the sandbox.
- Agents can store secrets they already have, and long setup links load.
- ChatGPT accounts show when they need reconnection, and a failed ChatGPT turn offers Reconnect or Connect ChatGPT.
- Saved session history is 1:1 with the live session and on by default, including sub-agents.
- The mobile app signs in to self-hosted Kortix instances.
- Slack: a session's Slack thread is bound automatically so replies come back to it, and the agent can remove its own reactions.
- The CLI saves large connector results as JSON (
--out, and MCP results above 16 KB).
Improved
- A project's fallback model chain runs when a model is unavailable, when a ChatGPT plan or BYOK model fails, and when every pooled account is paused or needs reconnection.
- The LLM gateway bounds requests per credential.
- DeepSeek and GLM accept images and a thinking control; model hosting is named accurately.
- Session connection and run status are accurate across web, mobile and the SDK, without flapping.
- A session is never parked while its runtime repair is still running, and its model converges when it opens.
- Sessions move off retired managed models automatically, and the error names the cause.
- Sharing a session switches it to the project's keys instead of stranding it.
- Sandbox images carry every runtime asset, and updates move only the chunks that changed.
- Audit events are ingested and reconciled without blocking requests or scanning whole tables.
- Sandbox health polls and connector listings answer faster.
Fixed
- Every prompt file reaches the computer.
- Every agent picker lists the project's own agent roster.
- Connector toolkit search returns the same page shape as the unsearched list.
- A dead credential gets a typed 401, so retrying clients stop.
- The Firecrawl proxy rejects private and metadata URLs.
- Values can be copied out of the XLSX and CSV viewers.
- A pinned runtime that still serves no longer refuses its session.
- Old saved tool calls show what they kept; an empty session opens on its composer.
- A stopped session wakes without needing a message.
GET /kortix/partin the sandbox requires the same credential as its sibling routes.- Teams: the bot token is sent only to stored service URLs, and the sign-in link appears only in one-to-one chats.
What's Changed
- feat(slack): auto-bind a session's Slack thread so replies come back to it by @markokraemer in #7869
- chore: repo-wide dead code, asset, and dependency cleanup by @markokraemer in #7867
- docs(repo): self-merge to main when verified; release gates keep explicit approval by @markokraemer in #7873
- chore: repo cleanup follow-ups — stale paths, orphan tests, executor-sdk by @markokraemer in #7876
- feat(cli,web): kortix mcp — the whole CLI as an MCP server + Connect MCP menu by @markokraemer in #7875
- feat(slack): agent can remove its own reactions — slack unreact by @markokraemer in #7878
- feat(contributing): script a preview demo account into managed-model access by @markokraemer in #7879
- chore(release): VERSION → 0.13.41 [skip ci] by @github-actions[bot] in #7883
- fix(sandbox): gate GET /kortix/part with the same credential check as its siblings by @markokraemer in #7865
- chore(release): staging VERSION → 0.13.41 [skip ci] by @github-actions[bot] in #7884
- feat(llm-gateway): OpenAI Responses API ingress — Codex CLI support by @markokraemer in #7880
- fix(reaper): close row↔VM divergence in every direction, for every box by @markokraemer in #7861
- feat(mcp): hosted MCP server with OAuth sign-in, behind the per-project mcp flag by @markokraemer in #7881
- fix(contributing): preview-subscribe refuses live Stripe keys by @markokraemer in #7885
- ci: stop a superseded preview suite; two browser workers per shard by @markokraemer in #7886
- fix(worktree): skip the Apps runtime build when go is not installed by @markokraemer in #7898
- feat(cli): save large connector results as JSON (call --out, MCP spill above 16 KB) by @markokraemer in #7887
- fix(preview): admit suites on pool and GitHub capacity, stop idle hosts, report only this run by @markokraemer in #7909
- fix(sandbox): bake every runtime asset into the image, and move only the chunks that changed by @markokraemer in #7877
- docs(learnings): bound agent tool output that grows with upstream data by @markokraemer in #7917
- fix(preview): pull immutable images only when missing, wait out Docker Hub limits; GitHub admission at 100/h by @markokraemer in #7931
- ci(preview): the label deploys and never tests; a superseded run never deploys by @markokraemer in #7892
- fix(preview): stop preview hosts after 1 h idle, not 3 h by @markokraemer in #7951
- fix(runtime-convergence): admission refusal replaces the box, never parks it by @markokraemer in #7905
- fix(preview): create preview hosts with 8 GB, not 16 GB by @markokraemer in #7955
- fix(sessions): never park a session while its repair is still running by @markokraemer in #7954
- fix(llm-gateway): re-point sessions off retired managed models, name the cause by @markokraemer in #7953
- fix(sessions): sharing a session switches it to the project's keys, never strands it by @Ino-Bagaric in #7657
- feat(sessions): saved history is 1:1 and on by default, sub-agents included by @Ino-Bagaric in #7853
- fix(web): a share refreshes the session's provider key panel by @Ino-Bagaric in #7958
- feat(providers): ChatGPT accounts show when they need reconnection by @Ino-Bagaric in #7658
- fix(sessions): stop parking a session mid-repair, and converge its model on open by @markokraemer in #7957
- fix(sessions): a re-pointed model pin has to travel on the prompt by @markokraemer in #7959
- fix(sessions): a PINNED runtime that still serves must not refuse its session by @markokraemer in #7961
- feat(sessions): failed ChatGPT turns offer Reconnect or Connect ChatGPT by @Ino-Bagaric in #7651
- fix(sessions): old saved tool calls show what they kept; an empty session opens on its composer by @Ino-Bagaric in #7960
- fix(sessions):
unreachablemust say WHICH of its five failures happened by @markokraemer in #7962 - fix(teams): bot token only to stored service URLs; sign-in link only in one-to-one chats by @Ino-Bagaric in #7963
- Promote main 267e2d7 to staging by @markokraemer in #7967
- fix(sessions): every prompt file reaches the computer by @Ino-Bagaric in #7966
- fix(channels): a failed session start closes its own platform's card, never another's by @Ino-Bagaric in #7965
- fix(mobile): restore inline transcript link taps (KRTX-562) by @agent-kortix in #7850
- fix(sessions): stamp the
unreachablecause on the row, not only in a log by @markokraemer in #7968 - fix(worktree): refuse a commit on a foreign branch in a pnpm worktree by @markokraemer in #7973
- fix(review): remove risk labels from the Review Center by @sutharjay1 in #7978
- fix(llm-gateway): a project's fallback chain runs when a ChatGPT plan or BYOK model fails by @Ino-Bagaric in #7979
- fix(sessions): record WHO answered an unreachable, not just the status code by @markokraemer in #7974
- fix(web): copy values out of the XLSX and CSV viewers by @sutharjay1 in #7977
- fix(sessions): nest sub-agent sessions under a coordinator on an older page by @sutharjay1 in #7975
- refactor(kortixd): layer src into app, routes, services and lib, with enforced import boundaries by @DimitrijeGlibic in #7856
- fix(web): ChatGPT sign-in dialogs show a finishing state instead of an idle Reconnect button by @Ino-Bagaric in #7980
- fix(sdk): wake stopped session without a message (KRTX-570) by @agent-kortix in #7855
- fix(web): keep the viewer copy shortcut out of the hardcoded-text audit by @sutharjay1 in #7985
- fix(preview): capture preview templates at the host's 8 GB by @sutharjay1 in #7971
- fix(runtime-convergence): admission is always enforced; repair before replace by @markokraemer in #7987
- ci: a pull request into main runs nothing; the dev box is the pre-merge gate by @markokraemer in #7995
- fix(gateway): a non-streaming ChatGPT failure keeps its HTTP status by @Ino-Bagaric in #7984
- feat(mcp): sandbox shell and files, skills, session list; audit as mcp by @markokraemer in #7994
- fix(sdk,web,mobile): accurate session connection and run status, no flapping by @sutharjay1 in #7976
- fix(gateway): run the project's chain when every account is paused or needs reconnection, after the wallet gate by @Ino-Bagaric in #7983
- release(v0.13.41): ChatGPT-plan fallback fixes (#7979, #7983, #7984) by @Ino-Bagaric in #7996
- fix(mobile): hide OpenCode built-ins in agent picker (KRTX-604) by @agent-kortix in #7888
- fix(sdk): verify final transcript after in-flight poll (KRTX-450) by @agent-kortix in #7894
- fix(web): show parked computer as asleep (KRTX-191) by @agent-kortix in #7895
- refactor(api): simplify secret consumer and delivery mapping (KRTX-220) by @agent-kortix in #7896
- test(api): pin route-binding envelopes (KRTX-276) by @agent-kortix in #7900
- test(api): pin relay framing and refusal envelopes (KRTX-287) by @agent-kortix in #7901
- refactor(api): split hosted connection connect phases (KRTX-294) by @agent-kortix in #7903
- refactor(api): flatten queued continue delivery phases (KRTX-258) by @agent-kortix in #7904
- refactor(api): isolate template runtime fingerprinting (KRTX-313) by @agent-kortix in #7907
- refactor(llm-gateway): split AI SDK request modules (KRTX-341) by @agent-kortix in #7910
- refactor(web): remove unreachable sub-agent copies (KRTX-371) by @agent-kortix in #7911
- refactor(api): split GitHub integration by responsibility (KRTX-318) by @agent-kortix in #7912
- refactor(web): share provider pool editor shell (KRTX-360) by @agent-kortix in #7913
- fix(sdk): ignore replayed final response chunks (KRTX-493) by @agent-kortix in #7915
- refactor(web): share transcript export option rows (KRTX-359) by @agent-kortix in #7916
- refactor(api): split trigger responsibilities (KRTX-298) by @agent-kortix in #7920
- refactor(web): flatten session override rows (KRTX-361) by @agent-kortix in #7921
- refactor(sdk): normalize tool card aliases (KRTX-490) by @agent-kortix in #7922
- refactor(sdk): deduplicate web search source mapping (KRTX-491) by @agent-kortix in #7923
- refactor(sdk): isolate hydration part reconciliation (KRTX-511) by @agent-kortix in #7927
- refactor(web): share show action toolbar (KRTX-370) by @agent-kortix in #7928
- refactor(api): split snapshot ledger and archive publisher (KRTX-305) by @agent-kortix in #7930
- refactor(api): split auth principal resolvers (KRTX-349) by @agent-kortix in #7933
- refactor(api): split prompt attachment lifecycle modules (KRTX-323) by @agent-kortix in #7939
- refactor(api): split snapshot builder concerns (KRTX-311) by @agent-kortix in #7942
- refactor(api): break sandbox provider registry cycle (KRTX-553) by @agent-kortix in #7943
- refactor(api): split custom role policy routes (KRTX-547) by @agent-kortix in #7944
- refactor(api): dispatch create session idempotency conflicts (KRTX-268) by @agent-kortix in #7948
- fix(connectors): preserve account when chat link finalize retries (KRTX-438) by @agent-kortix in #7950
- feat(onboarding): open new projects on a first chat instead of auto-sending by @sutharjay1 in #7337
- revert(runtime-convergence): always-on admission regressed the sweep 8 PASS -> 1 by @markokraemer in #7998
- ci:
testandprevieware one-shot explicit opt-ins; a red main names its suspects by @markokraemer in #7997 - feat(mcp): one account-level MCP server at /v1/mcp, bound to the token like the CLI by @markokraemer in #7999
- chore(deps): bump bridgecrewio/checkov-action from 12.3119.0 to 12.3125.0 by @dependabot[bot] in #7989
- chore(deps): bump github/codeql-action from 4.38.1 to 4.38.2 by @dependabot[bot] in #7990
- chore(deps): bump terraform-linters/setup-tflint from 6.3.0 to 6.3.1 by @dependabot[bot] in #7992
- chore(deps): bump github/codeql-action/upload-sarif from 4.38.1 to 4.38.2 by @dependabot[bot] in #7993
- fix(api): warn once per unreadable turn episode (KRTX-544) by @agent-kortix in #7940
- fix(api): sign manual stop transcript capture as stopper (KRTX-427) by @agent-kortix in #7929
- fix(api): explain personal GitHub App repository creation refusal (KRTX-232) by @agent-kortix in #7918
- feat(desktop): hide developer Frontend URL presets in production builds (KRTX-48) by @agent-kortix in #7782
- fix(api): classify manifest push policy rejection (KRTX-518) by @agent-kortix in #7819
- test(session): pin host HTML sanitizer outputs (KRTX-366) by @agent-kortix in #7908
- refactor(api): isolate control snapshot readers (KRTX-219) by @agent-kortix in #7890
- refactor(web): remove unused provider display helpers (KRTX-569) by @agent-kortix in #7938
- feat(sandbox): container_runtime templates run Docker with bridge + overlay by @markokraemer in #8001
- refactor(api): dedupe runtime wake cleanup updates (KRTX-267) by @agent-kortix in #7897
- refactor(api): split gateway candidate resolution (KRTX-343) by @agent-kortix in #7914
- refactor(api): share token last-used throttle (KRTX-306) by @agent-kortix in #7902
- test(web): characterize session chat shell (KRTX-354) by @agent-kortix in #7937
- refactor(api): split lifecycle command store (KRTX-256) by @agent-kortix in #7899
- refactor(api): split member and invitation registration (KRTX-546) by @agent-kortix in #7946
- refactor(api): isolate Platinum discovery and uploads (KRTX-314) by @agent-kortix in #7906
- refactor(api): split public App proxy policies (KRTX-561) by @agent-kortix in #7945
- refactor(sandbox): flatten OpenCode asset guards (KRTX-515) by @agent-kortix in #7925
- refactor(llm-gateway): split server and share request admission (KRTX-344) by @agent-kortix in #7926
- fix(projects): refuse new-repo create under a personal GitHub account by @sutharjay1 in #7445
- docs(llm-gateway): restore request-path rationale dropped by the server split by @markokraemer in #8003
- ci(preview): the preview label deploys only (~7 min); only a dispatch runs --target-full by @markokraemer in #8004
- fix(sessions): the box owns its identity key — reconcile the row to it by @markokraemer in #8000
- refactor(api): split session creation modules (KRTX-222) by @agent-kortix in #7936
- refactor(web): split tool infrastructure by concern (KRTX-369) by @agent-kortix in #7932
- feat(mcp,oauth): long commands as jobs; connected apps list and revoke by @markokraemer in #8006
- fix(sdk): every agent picker reads the Kortix project roster by @sutharjay1 in #8007
- fix(audit): index account_id on the two reconciliation source tables; bound the reconciliation retry loop by @markokraemer in #7970
- Promote main 278a24c to staging by @markokraemer in #8008
- feat(secrets): agents store secrets they already have; long setup links load by @markokraemer in #8009
- fix(db): move the GitHub-installation migrations after the newest merged migration by @markokraemer in #8010
- fix(mobile): SDK composer lists, self-hosted sign-in, loader, md PDF by @sutharjay1 in #7981
- fix(deps): raise .deepsec overrides past 17 Trivy findings by @markokraemer in #8011
- fix(tests): green Tests on main — catalog order, monitor drop accounting, lifecycle races, CAS 409, revenuecat DB leak by @markokraemer in #8005
- fix(tests): the e2e env reader skips dotenvx ciphertext (every browser journey red since #7981) by @markokraemer in #8013
- fix(api): copy the SDK from deps so its llm-catalog import resolves in the image by @markokraemer in #8014
- docs(learnings): a committed env value is ciphertext; helpers treat it as absent by @markokraemer in #8015
- fix(sandbox): the secret-capabilities prompt tells agents to store a pasted value by @markokraemer in #8016
- docs(learnings): runtime workspace imports need the deps-stage copy in the API image by @markokraemer in #8017
- OpenCode decoupling W0: per-harness session flows, OpenCode-name lint ratchet, shared host health by @DimitrijeGlibic in #8002
- fix(deploy): an ECS rollout succeeds only on the revision it registered by @markokraemer in #8018
- feat(reminders): session reminders — scheduled prompts into one session by @markokraemer in #8020
- feat(approvals): agent describes gated calls; approver can reply; resume keeps the session's model by @markokraemer in #8019
- fix(models): name the US provider, not OpenRouter; restore ZDR/US line by @markokraemer in #8022
- feat(web): launch film as code + /launch page by @markokraemer in #8023
- docs(learnings): round a feed price before comparing it to a cap by @markokraemer in #8024
- fix(web): /presentations 500 on production builds; drop the Claude/Cursor subscription claim by @markokraemer in #8028
- Promote main 78395d4 (last fully green main) to staging by @markokraemer in #8025
- feat(channels): approval cards for gated connector calls in Slack and Teams by @markokraemer in #8033
- fix(reaper): stop logging transient provider throttles as errors (KRTX-617) by @agent-kortix in #8035
- fix(api): log the title-generate gateway status as upstream_status (KRTX-612) by @agent-kortix in #8034
- refactor(api): delete dead runtime-wake-fence and inbox-rows exports (KRTX-266) by @agent-kortix in #8032
- fix(sdk): exclude OpenCode built-in agents from the selectable roster (KRTX-642) by @agent-kortix in #8029
- feat(web): 'Sovereign' film on real product captures + 'Rent vs own' (16:9, 9:16) by @markokraemer in #8045
- fix(models): images + thinking control for DeepSeek/GLM, stale-capability converge, US hosting hint by @markokraemer in #8026
- docs(learnings): curate modalities and reasoning options for managed models by @markokraemer in #8052
- fix(web): stop the Kortix upgrade upsell on a provider usage limit (KRTX-621) by @agent-kortix in #8037
- fix(kortixd): stop config-release retries on a dead session token (KRTX-613) by @agent-kortix in #8036
- perf(connectors): opt catalog summary paths out of action schemas (KRTX-615) by @agent-kortix in #8046
- perf(api): serve sandbox-health polls from cache while refreshing (KRTX-620) by @agent-kortix in #8044
- fix(api): log only failed requests at WARN (KRTX-627) by @agent-kortix in #8048
- fix(kortixd): stop polling runtime-assets manifest with a refused session credential (KRTX-636) by @agent-kortix in #8050
- fix(api): log an unreachable pre-stop abort as info, not a warn (KRTX-619) by @agent-kortix in #8042
- refactor(api): split projects/secrets.ts into envelope, grant-policy and consumer modules (KRTX-322) by @agent-kortix in #8062
- test(api): characterize the preview forwarder and WS upstream resolver (KRTX-327) by @agent-kortix in #8060
- test(api): enforce the model-picker ↔ resolver parity for pooled secrets (KRTX-431) by @agent-kortix in #8065
- perf(api): one mirror fetch per session-config read (KRTX-629) by @agent-kortix in #8063
- fix(api): stop audit ingest running past the 25s request deadline (KRTX-644) by @agent-kortix in #8061
- refactor(api): dedupe SSE usage settlement into services/llm.ts (KRTX-335) by @agent-kortix in #8057
- docs(learnings): record the background-retry hot-loop rule from the accounts p95 incident (KRTX-630) by @agent-kortix in #8053
- fix(web): de-noise digest-less React #419 Suspense bailout from frontend Sentry (KRTX-628) by @agent-kortix in #8049
- fix(hooks): the .env guard checks its result and uses the pinned dotenvx by @markokraemer in #8074
- fix(kortixd): tests run with an isolated HOME; the CLI $HOME fallback is Linux-only by @markokraemer in #8080
- refactor(api): dedupe credit-reservation helpers and flatten tryAuthenticate (KRTX-334) by @agent-kortix in #8072
- fix(api): turn-end orphan repair requires the reaper's age floor (KRTX-624) by @agent-kortix in #8081
- fix(db): index provider_events.account_id for audit reconciliation (KRTX-643) by @agent-kortix in #8071
- refactor(api): route path-form public shares through the shared sandbox forwarder (KRTX-333) by @agent-kortix in #8069
- fix(kortixd): stop the dead-credential relays on a revoked session token (KRTX-446) by @agent-kortix in #8066
- fix(llm-gateway): run the fallback chain when a model is unavailable (KRTX-633) by @agent-kortix in #8030
- fix(api): bound the audit read-path flush barrier (KRTX-631) by @agent-kortix in #8070
- feat(reminders): Reminders UI + per-project reminders feature flag by @markokraemer in #8073
- fix: make main Tests green (#8019/#8057 mocks, dead-token breaker probe, SWR clock, launch i18n exemption) by @markokraemer in #8064
- docs(learnings): packages lane before merging a mocked-module change; breakers need a probe by @markokraemer in #8107
- fix(db): drop the unused audit_events account/client-source/time index by @markokraemer in #8093
- docs(skills): route "check back later" to reminders from the agent prompt, onboarding, and Slack by @markokraemer in #8112
- refactor(api): split loadProjectConfig into a manifest resolver and one resource scanner (KRTX-307) by @agent-kortix in #8097
- fix(tests): fund MCP-3's team account before it creates a session by @markokraemer in #8099
- fix(connectors): restore items/cursor wire shape for toolkit search by @markokraemer in #8100
- fix(tests): RTA-5 compares only box identity fields, not build stamp by @markokraemer in #8101
- fix(mobile): open a Show tool preview in-session, not the Browser tab (KRTX-602) by @agent-kortix in #8031
- fix(api): answer POST /internal/gateway/trace without waiting on the audit pool (KRTX-609) by @agent-kortix in #8038
- refactor(api): dedupe session-lifecycle runtime fetches into one transport (KRTX-265) by @agent-kortix in #8039
- fix(api): bound the Quick Queue interrupt re-arm loop on an unreachable runtime (KRTX-626) by @agent-kortix in #8040
- fix(api): return 499 for a client-cancelled llm-gateway proxy request (KRTX-616) by @agent-kortix in #8041
- perf(proxy): attribute upstream fetch time so slow stages are queryable (KRTX-577) by @agent-kortix in #8067
- fix(web): filter bare app:/// iOS WebView stack-overflow noise (KRTX-640) by @agent-kortix in #8068
- fix(web): pointer cursor on every clickable element (KRTX-15) by @agent-kortix in #8077
- refactor(api): flatten turn-stream kind callback into per-kind handlers (KRTX-280) by @agent-kortix in #8082
- refactor(api): split projects/triggers.ts into types, manifest-IO and entry modules (KRTX-320) by @agent-kortix in #8083
- refactor(projects): one Git connection/metadata writer shape (KRTX-302) by @agent-kortix in #8084
- fix(db): reconcile DB Drift Sentinel gaps (prod enum, dev stray column, guarded NOT NULLs) by @markokraemer in #8012
- fix(learnings): regenerate MEMORY.md so the index matches entries/ by @markokraemer in #8146
- fix(tests): green main — learnings index check ignores squash-merge order; one AsyncStorage mock in mobile tests by @markokraemer in #8144
- refactor(api): split gateway routes into focused route modules (KRTX-291) by @agent-kortix in #8086
- fix(api): return a typed 401 for a dead credential so retrying clients stop (KRTX-446) by @agent-kortix in #8087
- refactor(api): split sandbox-env-sync into snapshot, push, propagation and session-push modules (KRTX-300) by @agent-kortix in #8088
- refactor(api): split projects/agents.ts into parse/grants/crud modules (KRTX-319) by @agent-kortix in #8090
- test(web): pin dotm variant markup and resolver outputs (KRTX-654) by @agent-kortix in #8092
- refactor(api): split activateWithCas's transaction body out (KRTX-315) by @agent-kortix in #8094
- fix(api): reject private and metadata URLs at the Firecrawl proxy (KRTX-648) by @agent-kortix in #8103
- refactor(api): split commitMultipleFilesToBranch into a commit-writer module (KRTX-308) by @agent-kortix in #8106
- fix(api): repair main after 5f2ae97 (KRTX-620) by @agent-kortix in #8114
- fix(kortixd): count every terminal credential 401 toward the dead-token breaker (KRTX-636) by @agent-kortix in #8115
- refactor(web): extract the sidebar context kernel to sidebar-context.tsx (KRTX-650) by @agent-kortix in #8123
- feat(api): bound LLM gateway requests per credential (KRTX-664) by @agent-kortix in #8124
- refactor(web): delete the four dead Field subcomponents (KRTX-660) by @agent-kortix in #8127
- fix(api): keep Platinum stopping state unconfirmed (KRTX-667) by @agent-kortix in #8129
- refactor(web): merge LeftArc and RightArc into one ArcSvg (KRTX-658) by @agent-kortix in #8134
- fix(api): treat a stop-confirm timeout while stopping as a lifecycle transition (KRTX-667) by @agent-kortix in #8135
- refactor(api): split the session-scope rescope handler into decision helpers (KRTX-281) by @agent-kortix in #8139
- refactor(web): delete the dead CommandItemHoverCard and CommandKbd (KRTX-657) by @agent-kortix in #8140
- perf(connectors): stop fetching action schemas the listing discards (KRTX-665) by @agent-kortix in #8141
- perf(api): serve the maintenance config from the cached platform setting (KRTX-666) by @agent-kortix in #8145
- refactor(web): delete dead zoom helpers and dialog parts in preview-image (KRTX-662) by @agent-kortix in #8147
- fix(auth): KRTX-668 revoke logout sessions and test refresh replay by @agent-kortix in #8148
- fix(mobile): close the remaining tab-store AsyncStorage mock race by @markokraemer in #8151
- fix(audit): rate-limit the write-contention warning (KRTX-614) by @agent-kortix in #8043
- perf(api): one audit-ingest statement per relay batch (KRTX-665) by @agent-kortix in #8136
- refactor(api): flatten turn-stream kind callback into per-kind handlers (KRTX-280) by @agent-kortix in #8119
- Revert #8148: logout session revocation broke AUTH-1/AUTH-3 on main by @markokraemer in #8153
- fix(billing): warn once per wallet drain episode, not per overdraft settlement (KRTX-338) by @agent-kortix in #8047
- fix(api): classify transient Platinum guest renewal failures (KRTX-685) by @agent-kortix in #8156
- fix(web): pointer cursor on every clickable element (KRTX-15) by @agent-kortix in #8089
- refactor(api): split secrets.ts create handler and its validation ladder (KRTX-292) by @agent-kortix in #8117
- fix: green main — config archive race (CodeQL), ECS budget reason, cursor-default comments by @markokraemer in #8159
- Promote main 42bc3cc (fully green) to staging by @markokraemer in #8160
- Release v0.13.41 — Kortix as an MCP server by @github-actions[bot] in #7969
Full Changelog: v0.13.40...v0.13.41