[pull] main from triggerdotdev:main#127
Merged
Merged
Conversation
…3632) ## Summary - Adds a `beforeSend` rule in `apps/webapp/sentry.server.ts` that collapses Prisma `P1001` ("Can't reach database server") errors into a single Sentry issue regardless of which call site threw, by setting `event.fingerprint = ["prisma-p1001-db-unreachable"]` and tagging `db_unreachable:true`. - Matches both `err.code === "P1001"` (Prisma's `KnownRequestError` when a connection drops mid-query) and `err.errorCode === "P1001"` (`InitializationError` when the client fails to connect at startup). - Implemented as a small extensible `FINGERPRINT_RULES` table so further fan-out errors can be added with one entry. ## Verification End-to-end verified locally with `debug: true` on the SDK: - Real Prisma `P1001` thrown from a loader (DB stopped mid-request) is captured by Sentry's Remix auto-instrumentation - `beforeSend` fires with `originalException.code === "P1001"`, rule matches - `event.fingerprint = ["prisma-p1001-db-unreachable"]` and `tags.db_unreachable = "true"` applied - Event lands in Sentry under the new fingerprint ## Test plan - [ ] Deploy to staging; confirm P1001 events appear under a single `prisma-p1001-db-unreachable` issue rather than fanning out - [ ] Confirm `db_unreachable:true` tag is filterable in Sentry - [ ] Verify non-P1001 errors are unaffected (event passes through `beforeSend` untouched) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
## Summary
The PUT handler at `/realtime/v1/streams/:runId/:target/:streamId` ran
`taskRun.update({ realtimeStreams: { push: streamId } })` on every call,
even when the `streamId` was already present. SDK call patterns that
re-initialize the same stream key on every chunk produce a per-write row
UPDATE, duplicate entries pile up in the array, and the row-lock + TOAST
rewrite cost grows unbounded on long-running stream sessions.
## Fix
Mirror the sibling append handler: read the array first and only push
when the `streamId` isn't already present. Identical behavior for
first-time stream creation; repeat creates short-circuit to a single
indexed read. The dashboard's per-run stream listing keeps working
because the first create still records the entry.
## Test plan
- [ ] A fresh PUT for a new `(run, streamId)` adds the entry to the
array
- [ ] A repeat PUT for the same pair leaves the array unchanged
- [ ] 404 is returned when the run doesn't exist; 400 when the run is
completed
## Summary Long-running chat agents were filling `session.out` forever — every `chat.agent` turn appended to the same S2 stream with no trim, and the Sessions dashboard re-streamed the entire history from `seq_num=0` on every page load. After this change the agent appends an S2 `trim` command record after each `trigger:turn-complete`, pointing back at the previous turn-complete's seq_num. `session.out` stays roughly one turn long at steady state, regardless of session age. `trigger:turn-complete` and `trigger:upgrade-required` move from `chunk.type`-shaped data records into header-form control records under a uniform `trigger-control` namespace. Built-in transports (`TriggerChatTransport`, `AgentChat`, the dashboard's `AgentView`) handle the new shape transparently. Custom transports need a one-line filter on the `trigger-control` header — see the rewritten "Records on session.out" section in the client-protocol docs. The Sessions detail page in the dashboard fetches the agent's per-turn S3 snapshot via a presigned URL and seeds the transcript view, then SSE-tails from the snapshot's `lastOutEventId`. Bandwidth and time-to-first-render scale with unread turns instead of session lifetime. Resume contract is now explicit: single-turn-boundary resume always works (the prior turn-complete is still on the stream), the S2 trim is eventually consistent over 10-60s, and multi-turn-away resume falls back to a snapshot reload.
) ## Summary Two papercuts new contributors hit running this repo locally: 1. Fresh clones default to v1 (Redis-only) realtime streams, so Sessions and `chat.agent` error with `"S2 configuration is missing"`, even though the `s2` service is already in `docker/docker-compose.yml` and pre-seeds a `trigger-local` basin. Wire `REALTIME_STREAMS_S2_*` to it in `.env.example` so the new-contributor flow just works. (Also drop the s2 healthcheck: the image is distroless, so the `wget` check always reports unhealthy.) 2. Two clones can't both run `pnpm run docker` because ports, project name, and container names are all hardcoded. Parameterize every host port as `${VAR:-default}`, drive the project name via `COMPOSE_PROJECT_NAME` (with a top-level `name:` field as the default), prefix container names with `${CONTAINER_PREFIX:-}`, and pass `--env-file .env` so compose reads the same root `.env` the webapp does. The "Running multiple instances side by side" block in `.env.example` lists every overridable knob. Also split the optional services (`electric-shard-1`, `ch-ui`, `toxiproxy`, `nginx-h2`, `otel-collector`, `prometheus`, `grafana`) into `docker-compose.extras.yml` behind a new `pnpm run docker:full` script. The core stack keeps everything the webapp actually needs to boot: postgres, redis, electric, minio, clickhouse + migrator, s2-lite. Defaults match every previous hardcoded value, so existing setups keep working without touching `.env`. ## Test plan - [x] `pnpm run docker` on a clean clone brings up the core services on the standard ports under the `triggerdotdev-docker` project name. - [x] Setting `COMPOSE_PROJECT_NAME=triggerdotdev-docker-alt` + the `*_HOST_PORT` overrides in `.env` brings up a second stack alongside the default one with no port or container-name clashes. - [x] Webapp boots cleanly against the default `.env.example` values; `/healthcheck` returns 200, no S2 errors. - [x] s2-lite basin `trigger-local` accepts an append + read via the same REST endpoints the webapp uses. - [x] `pnpm run docker:full` brings up the optional services alongside the core ones in the same project.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
See Commits and Changes for more details.
Created by
pull[bot] (v2.0.0-alpha.4)
Can you help keep this open source service alive? 💖 Please sponsor : )