Credit codes, server-side Goals, proactive Spaces, and image-heavy session fixes
Credit codes, server-side Goals, proactive Spaces, and image-heavy session fixes
New
- Credit codes: redeem a code at
/redeemfor credits, and a/redeem?code=link survives sign-up. Admins create codes with an expiry and a redemption limit. (#11939, #11944, #11945) - Goals run on the API: goal state lives on the server, and only a verifier session can mark a goal done. Goals are in the command palette. (#11910, #11882)
- Proactive Spaces: a watcher reads a Space's event feed and speaks up only when it matters. A Space's agents are its router's team; the router does quick work itself and links results as files. (#11865, #11861)
- Every agent gets its session ids, and a subagent can read its parent's conversation. (#11940)
- Watcher Apps: watcher health on the App page, links from a run to its event, one-trigger tests, and a silent or crashing watcher can wake a repair agent. Deleting an App removes the triggers that name it. (#11908, #11907, #11906)
- Hover Artifacts in the sidebar to open any artifact in one click. (#11905)
Improved
- Spaces keep one conversation: agents read the thread's session log instead of copies. (#11896)
- Only production reports product analytics; dev and staging send nothing. (#11937, #11936)
- Old OpenCode-era code is removed. New audit rows of agent runtime events are named
agent.*(old rows keepopencode.*): update a saved filter or SIEM rule onopencode.. (#11938) - 35 Artifact fixes: comments, drawings, rename, conflicts, load errors, ⌘S retry, link cards, share, hit areas and screen readers. (#11911, #11912, #11916)
- The navbar GitHub link shows at every width; Goals buttons match the menu height. (#11887, #11884)
Fixed
- Self-host updates apply migrations again: the API image ships every file the migration runner imports. (#11956)
- Image-heavy sessions no longer fail with "Input is too long", on Bedrock and in Claude Code sessions. (#11934, #11943)
- A session's Stop, probes and failed streams settle; a turn stays busy until it ends; one Stop sends one hold and one abort. (#11928, #11931)
- Session streams end on access loss and never bleed between sessions; client lifecycles survive restarts, stalls and transient errors. (#11929, #11925)
- Lifecycle status writes are compare-and-set, so a stale billing webhook never undoes a newer state. (#11932)
- A session created during a deploy gets a retryable 503 instead of a failure. (#11933)
- History recovery reads session stores larger than 256 MiB. (#11942)
- The Desktop panel stops blinking. (#11930)
- A click after the browser session went stale opens the page instead of the sign-in page. (#11922, #11921)
- An App's restart budget and crash episode, and an app trigger's silence window, survive a deploy or an edit. (#11917, #11909)
- Private channel threads and asks stay private. (#11868)
- A malformed JSON request body gets 400, not 500; a Composio HTML error page becomes a short 502; edge rate-limit headers stay on every route. (#11881, #11897, #11893)
send_messagedrops a stray approve instead of refusing the message. (#11862)- An unknown code-fence language renders as plain text. (#11883)
What's Changed
- feat(spaces): a Space's agents are its router's team; the router does quick work itself and links results as files by @markokraemer in #11861
- fix(kortixd): send_message drops a stray approve instead of refusing the message by @markokraemer in #11862
- fix(release): manifest writes keep "all"; the v0.15.0 release suite goes green by @DimitrijeGlibic in #11863
- fix(ci): gitleaks allows pod checksums and the public PostHog client key by @DimitrijeGlibic in #11866
- feat(spaces): proactive Spaces — a watcher reads the Space's event feed and speaks up only when it matters by @markokraemer in #11865
- ci(release): the Strix review is advisory in the release gate by @DimitrijeGlibic in #11869
- fix(security): private channel threads and asks stay private; the HEIC test launches Playwright's Chromium by @markokraemer in #11868
- fix(ui): give the declaration build its own 6 GB heap (release v0.15.0 red) by @agent-kortix in #11878
- refactor(mobile): one logger factory, one HSL parser, drop dead lib exports (KRTX-4263) by @agent-kortix in #11877
- feat(web): add the Goals page to the command palette (KRTX-4222) by @agent-kortix in #11882
- refactor(api): one subscriber isolation boundary and one claimed-delivery update (KRTX-4002) by @agent-kortix in #11875
- fix(ui): an unknown code-fence language renders plain without a rejection (KRTX-4265) by @agent-kortix in #11883
- fix(api): answer a malformed JSON request body with 400, not 500 (KRTX-4279) by @agent-kortix in #11881
- fix(tests): the reskin e2e build gets a 4 GB heap by @DimitrijeGlibic in #11885
- fix(web): the navbar GitHub link shows at every width, phones included by @markokraemer in #11887
- fix(web): Goals action buttons match the menu height; grouped buttons share one corner radius by @agent-kortix in #11884
- refactor(cli): call the session peer and approval routes through the SDK (KRTX-4293) by @agent-kortix in #11889
- fix(api): keep edge rate-limit headers on raw-Response routes (KRTX-4302) by @agent-kortix in #11893
- fix(ci): verify the gitleaks release archive before it runs (KRTX-4321) by @agent-kortix in #11894
- refactor(spaces): one conversation, no copies; agents read the thread's session log by @markokraemer in #11896
- fix(api): stop trusting the dangling new.kortix.com origin (KRTX-2773) by @agent-kortix in #11895
- fix(api): short upstream 502 when Composio's edge returns an HTML page (KRTX-4325) by @agent-kortix in #11897
- fix(ui): the npm build keeps a 6 GB tsc heap when the caller sets a smaller one (KRTX-4286) by @agent-kortix in #11898
- refactor(cli): split the artifacts dispatcher and unify the time formatters (KRTX-4323) by @agent-kortix in #11900
- refactor(cli): dedupe manifest splice, box frame, git runner and repo walker; drop dead selectMany (KRTX-4328) by @agent-kortix in #11899
- refactor(shared): keep one pixel-mark algorithm in @kortix/shared for web and mobile (KRTX-4331) by @agent-kortix in #11901
- refactor(sdk): one SDK home for the multi-agent tool parsers and message rules (KRTX-4330) by @agent-kortix in #11902
- feat(ui): hover Artifacts in the sidebar to open any artifact in one click; Customize keeps only + by @sutharjay1 in #11905
- refactor(db): one ledger-repair helper, migration-file predicate and flag reader; delete 2 dead scripts (KRTX-4338) by @agent-kortix in #11904
- feat(apps): deleting an App removes the triggers that name it by @Ino-Bagaric in #11906
- feat(apps): a silent or crashing watcher can wake a repair agent by @Ino-Bagaric in #11907
- feat(apps): watcher health on the App page, run-to-event links, one-trigger tests by @Ino-Bagaric in #11908
- fix(artifacts): 21 UI fixes from the Artifact audit: comments, drawings, rename, conflicts, load errors by @Ino-Bagaric in #11911
- refactor(tui): one sheet-flow module, the sheets and RepoView split, one screen table (KRTX-4336) by @agent-kortix in #11903
- chore(release): staging VERSION → 0.15.1 [skip ci] by @github-actions[bot] in #11913
- fix(artifacts): 14 polish fixes from the Artifact audit: ⌘S retry, link cards, share, hit areas, screen readers by @Ino-Bagaric in #11912
- chore(release): VERSION → 0.15.1 [skip ci] by @github-actions[bot] in #11914
- ci(release): Promote refuses a release PR body as notes by @DimitrijeGlibic in #11915
- fix(triggers): keep an app trigger's silence window when it is edited (KRTX-4340) by @agent-kortix in #11909
- fix(apps): the restart budget and the crash episode survive a deploy by @Ino-Bagaric in #11917
- fix(artifacts): comments stay mapped with a leading space; read-only viewers never see a stale co-edited doc by @Ino-Bagaric in #11916
- docs(learnings): keep an hourly budget in the database, not the leader's memory by @Ino-Bagaric in #11919
- ci(capture): verify the versitygw release archive before it runs (KRTX-4345) by @agent-kortix in #11918
- fix(web): a click after the session went stale opens the page, not /auth (KRTX-4356) by @Ino-Bagaric in #11922
- fix(web): drop an injected script's redeclaration SyntaxError (KRTX-4353) by @agent-kortix in #11920
- fix(ci): failed promotes resume, gates survive rehearsals, dev deploys retry failed surfaces by @markokraemer in #11924
- fix(clients): client lifecycles survive restarts, stalls and transient errors by @markokraemer in #11925
- feat(goals): goal state moves to the API; only a verifier can mark done by @sutharjay1 in #11910
- fix(runtime): a turn is busy until it ends; Stop, probes and failed streams settle by @markokraemer in #11928
- fix(sdk): one value set per session wire concept; session streams end on access loss and never bleed by @markokraemer in #11929
- fix(sandbox): the Desktop panel stops blinking: one viewer sizes the desktop (KRTX-4362) by @Ino-Bagaric in #11930
- fix(ui): one Stop sends one hold and one abort; nine more UI state fixes by @markokraemer in #11931
- fix(web): stop refreshing a Supabase session that does not exist (KRTX-4347) by @agent-kortix in #11921
- fix(api): lifecycle status writes are compare-and-set; stale webhooks never undo newer billing state by @markokraemer in #11932
- refactor(manifest-schema): split convertLegacyManifest into named steps (KRTX-4344) by @agent-kortix in #11927
- fix(gateway,pi): image-heavy sessions no longer fail with "Input is too long" on Bedrock by @markokraemer in #11934
- chore(analytics): mirror the prod PostHog key in apps/api/.env.prod by @DimitrijeGlibic in #11935
- fix(security): anchor the .gitleaks allowlist to dotenvx assignments (KRTX-4304) by @agent-kortix in #11923
- fix(analytics): server events report environment=production on prod by @DimitrijeGlibic in #11936
- feat(analytics): only production reports to PostHog; dev and staging send nothing by @DimitrijeGlibic in #11937
- fix(sessions): a create during a deploy answers a retryable 503 (KRTX-4341) by @agent-kortix in #11933
- refactor!: delete dead OpenCode code, give live code neutral names by @DimitrijeGlibic in #11938
- feat(billing): credit codes — redeem FRONTIER for $100 in credits by @markokraemer in #11939
- feat(agents): every agent gets its session ids; a subagent reads its parent's conversation by @markokraemer in #11940
- refactor(shared): unify the duplicated scanners and helpers (KRTX-4361) by @agent-kortix in #11926
- fix(kortixd): Claude Code sessions no longer break at Anthropic's 32 MB request cap by @markokraemer in #11943
- fix(auth): a /redeem?code= link survives sign-up by @markokraemer in #11944
- fix(admin): credit codes show expiry with time and zone by @markokraemer in #11945
- fix(api): the history recovery reads stores over Platinum's 256 MiB download cap by @DimitrijeGlibic in #11942
- docs(blog): posts stop naming OpenCode as Kortix's runtime by @DimitrijeGlibic in #11947
- refactor(desktop,agent-tunnel): one message-box dispatch, one overlay window block, typed tunnel sockets (KRTX-4364) by @agent-kortix in #11946
- docs(learnings): widen a session read per route, never in the shared verdict by @markokraemer in #11949
- Promote dev 68b069c to staging by @github-actions[bot] in #11951
- fix(release): cherry-pick #11956 onto staging for v0.15.1 by @markokraemer in #11957
- fix(release): cherry-pick #11948 onto staging for v0.15.1 (kortix-api lint) by @agent-kortix in #11964
- fix(release): cherry-pick #11968 onto staging for v0.15.1 (test stub exports) by @agent-kortix in #11969
- fix(release): cherry-pick #11974 onto staging for v0.15.1 (@kortix/db --isolate) by @agent-kortix in #11975
- fix(release): cherry-pick #11978 onto staging for v0.15.1 (@kortix/voice --isolate) by @agent-kortix in #11980
- fix(release): cherry-pick #11982 onto staging for v0.15.1 (runner contract) by @agent-kortix in #11983
- Release v0.15.1 — Credit codes, server-side Goals, proactive Spaces, and image-heavy session fixes by @github-actions[bot] in #11953
Full Changelog: v0.15.0...v0.15.1