5bf3612ecf
The row settle, the transcript and the session state were three separate operations. Once the row was terminal, a failed transcript write left a card that read `in_progress` forever: the stale sweep only selects `in_progress` rows, so nothing was left to repair it. Both lanes now commit the pair atomically. The live turn hands its pending settlements to `persistTurn`, which upserts the revisions, appends their cards and writes the session in one transaction; the process-local entry survives until that commits, so a retried `onTurnComplete` still settles. The sweep goes through `settleInvestigationAndCloseCard`, whose rollback restores the `in_progress` row the sweep already selects. That also removes the last reader of the per-run `chatOwners` map, which had no `delete` and grew for the life of the worker: the failure record now travels in the transcript write, which needs no userId. Separately, the consented watch investigation gets the rolling step cache. Its ten-step `streamText` re-sent every accumulated tool output uncached; the breakpoint helper and the per-step cache telemetry now live in `step-cache.ts` and both lanes use them, wrapping any `prepareStep` the resolved options carry.
Trigger webapp - powered by Remix
To start, run with pnpm run dev --filter webapp
Build the docker image locally:
pnpm run docker:build:webapp
docker run -it triggerdotdev-webapp sh