These commits are when the Protocol Buffers files have changed: (only the last 100 relevant commits are shown)
| Commit: | 98d17b1 | |
|---|---|---|
| Author: | Flo | |
feat(ctrl): reconcile ClickHouse user grants Amp-Thread-ID: https://ampcode.com/threads/T-01a0270b-1187-758e-839e-664130c79425
| Commit: | d958a2c | |
|---|---|---|
| Author: | Flo | |
feat(ctrl): add deployment garbage collection protocol Amp-Thread-ID: https://ampcode.com/threads/T-01a01a39-49f1-70cd-9ffe-0a4c383b146e
| Commit: | defc875 | |
|---|---|---|
| Author: | Flo | |
| Committer: | Flo | |
feat: manage Git and Docker app sources Amp-Thread-ID: https://ampcode.com/threads/T-019ff0e6-00a6-7028-afbb-9c2ac8ed94aa
| Commit: | 556b517 | |
|---|---|---|
| Author: | Flo | |
| Committer: | Flo | |
fix: return persisted Docker image source Return the normalized image reference from ctrl so updateApp matches subsequent getApp and listApps responses. Amp-Thread-ID: https://ampcode.com/threads/T-019fd25a-fe32-7754-a268-ae5239b34471
| Commit: | 206dc60 | |
|---|---|---|
| Author: | Flo | |
| Committer: | Flo | |
fix: address Docker app review feedback Amp-Thread-ID: https://ampcode.com/threads/T-019fd25a-fe32-7754-a268-ae5239b34471
| Commit: | f117adc | |
|---|---|---|
| Author: | Flo | |
| Committer: | Flo | |
feat: separate git/docker in an app
| Commit: | 730c757 | |
|---|---|---|
| Author: | Andreas Thomas | |
| Committer: | GitHub | |
feat(api): submit deployment rollbacks to Restate (#7046) Amp-Thread-ID: https://ampcode.com/threads/T-01a00ea7-7b5c-73fe-baef-483eef7756b2
| Commit: | ee8aafb | |
|---|---|---|
| Author: | Andreas Thomas | |
| Committer: | GitHub | |
feat(api): submit deployment promotions to Restate (#7045) Amp-Thread-ID: https://ampcode.com/threads/T-01a00ea7-7b5c-73fe-baef-483eef7756b2
| Commit: | 833623c | |
|---|---|---|
| Author: | Andreas Thomas | |
| Committer: | GitHub | |
feat(api): submit deployment starts to Restate (#7044) Amp-Thread-ID: https://ampcode.com/threads/T-01a00ea7-7b5c-73fe-baef-483eef7756b2
| Commit: | ff96f8b | |
|---|---|---|
| Author: | Andreas Thomas | |
| Committer: | GitHub | |
feat(api): submit deployment stops to Restate (#7043) Amp-Thread-ID: https://ampcode.com/threads/T-01a00ea7-7b5c-73fe-baef-483eef7756b2
| Commit: | 156f25f | |
|---|---|---|
| Author: | Flo | |
| Committer: | Flo | |
fix: address Docker app review feedback Amp-Thread-ID: https://ampcode.com/threads/T-019fd25a-fe32-7754-a268-ae5239b34471
| Commit: | fc8e3a4 | |
|---|---|---|
| Author: | Flo | |
| Committer: | Flo | |
fix: return persisted Docker image source Return the normalized image reference from ctrl so updateApp matches subsequent getApp and listApps responses. Amp-Thread-ID: https://ampcode.com/threads/T-019fd25a-fe32-7754-a268-ae5239b34471
| Commit: | 1020d89 | |
|---|---|---|
| Author: | Flo | |
| Committer: | Flo | |
feat: separate git/docker in an app
| Commit: | cd426b3 | |
|---|---|---|
| Author: | Andreas Thomas | |
| Committer: | GitHub | |
feat(api): submit deployment starts to Restate Amp-Thread-ID: https://ampcode.com/threads/T-01a00ea7-7b5c-73fe-baef-483eef7756b2
| Commit: | e6ee24c | |
|---|---|---|
| Author: | Andreas Thomas | |
| Committer: | GitHub | |
chore(ctrl): remove unused deploy key auth field (#7048) Amp-Thread-ID: https://ampcode.com/threads/T-01a00e68-146d-739f-b594-59999705fcc0
| Commit: | ac0c54f | |
|---|---|---|
| Author: | Oz | |
| Committer: | GitHub | |
refactor(dashboard, ctrl): move stopDeployment to the SDK (#6943) * refactor(dashboard, ctrl): move stopDeployment to the SDK and audit it in ctrl The dashboard reached ctrl through a trpc router that wrote the deployment.stop audit entry itself, so a root key calling the public API produced no entry at all. Move the write into ctrl, which every surface routes through, and point the dialog at the SDK instead. Also lands the plumbing the remaining lifecycle verbs reuse: ActorInfo on their ctrl requests, the audit event constants, and recordLifecycleAudit. * refactor: move permissions to deployments from environments
| Commit: | 803950f | |
|---|---|---|
| Author: | Oz | |
| Committer: | Meg Stepp | |
feat(api,ctrl): add verifyDomain endpoint (#6941) * feat: add spec * feat: add handler * feat: add permissions * tests: add test for verify handler * refactor: add actor and tx to retryverification * fix: retry bug Retry was failling immeditealy when creation was a day old, but it should actually take the invocations start date instead of row createDate * chore: STE fix better specs * chore: tidy up spec * chore: tidy * chore: drop useless comments * chore: diff * chore: drop redudant comment * chore: address comments
| Commit: | 6feef05 | |
|---|---|---|
| Author: | Oz | |
| Committer: | Meg Stepp | |
feat(api, ctrl): add delete domain endpoint (#6931) * feat(api, ctrl): add delete domain endpoint * refactor: use uid * fix: specs * chore: tidy * chore: tidy punctuation issues * chore: update specs
| Commit: | 8204b68 | |
|---|---|---|
| Author: | Flo | |
| Committer: | Meg Stepp | |
feat(gateway): always-on base request log with five opt-in capture settings (#6921) * feat(gateway): move sentinel request logging behind a logging policy Request logging through the gateway was always on. It is now controlled by a new config-less `logging` sentinel policy: without an enabled, matching logging policy the gateway captures no request/response bodies and writes no ClickHouse row. - proto: new frontline.v1.Logging message, Policy oneof field 11 - frontline: engine sets Result.LogRequest; handler, forwarder, and ClickHouse middleware gate body capture and row emission on it - api: LoggingPolicy in OpenAPI spec, policyconfig conversion, and updatePolicy patch handling - dashboard: logging policy type in canonical schema, tRPC sentinel.logging router, add/edit panel form, and list row label - docs: note that logging is opt-in Closes #5424 (ENG-2612) Amp-Thread-ID: https://ampcode.com/threads/T-019fcd3b-b313-7359-a7a0-53150fc0e498 * feat(frontline): add proxy logging-overhead benchmarks; simplify logging policy UI copy Benchmarks drive real HTTP through the production middleware chain into a real upstream and assert whether ClickHouse rows were buffered, so each variant provably measures the intended logging path. UI copy for the logging policy form rewritten in Simplified Technical English. Amp-Thread-ID: https://ampcode.com/threads/T-019fcd3b-b313-7359-a7a0-53150fc0e498 * docs(gateway): state that a logging policy without match conditions logs all requests An empty match list matches every request. Pin the catch-all semantics with an integration test and state it in the proto comment, OpenAPI description, dashboard schema comment, and policy form copy. Amp-Thread-ID: https://ampcode.com/threads/T-019fcd3b-b313-7359-a7a0-53150fc0e498 * test(gateway): use typed policy fixtures and generated ids Replace raw protojson string literals and hardcoded pol_* ids in update-policy tests with typed frontlinev1.Policy fixtures marshaled through policyconfig and ids from uid.New. Also fix a broken link in the ratelimit analytics docs. Amp-Thread-ID: https://ampcode.com/threads/T-019fcd3b-b313-7359-a7a0-53150fc0e498 * chore: drop proxy benchmark, restore ratelimit analytics docs link Amp-Thread-ID: https://ampcode.com/threads/T-019fcd3b-b313-7359-a7a0-53150fc0e498 * feat(frontline): always write base request log, make headers/bodies capture opt-in The base log row (method, host, path, status, latency, user agent, IP) is now written for every proxied request so traffic and latency charts always work. The logging policy gains two capture flags, headers and bodies; headers also covers query string and parameters since URLs carry secrets. Without an enabled matching logging policy only the base row is stored. Redaction is unchanged. Amp-Thread-ID: https://ampcode.com/threads/T-019fcd3b-b313-7359-a7a0-53150fc0e498 * feat(gateway): split logging capture into four independent opt-ins Request headers, response headers, request body, and response body are now separate capture flags on the logging policy. User agent and client IP move from the always-on base row to the request-headers opt-in since they identify the client. Amp-Thread-ID: https://ampcode.com/threads/T-019fcd3b-b313-7359-a7a0-53150fc0e498 * docs(gateway): use plain active-voice wording, say gateway instead of frontline Amp-Thread-ID: https://ampcode.com/threads/T-019fcd3b-b313-7359-a7a0-53150fc0e498 * fix(dashboard): align logging policy switches right, tune wording Amp-Thread-ID: https://ampcode.com/threads/T-019fcd3b-b313-7359-a7a0-53150fc0e498 * feat(migrate): backfill full-capture logging policy for existing apps Amp-Thread-ID: https://ampcode.com/threads/T-019fcd3b-b313-7359-a7a0-53150fc0e498 * fix(dashboard): center logging policy switches on their text block Amp-Thread-ID: https://ampcode.com/threads/T-019fcd3b-b313-7359-a7a0-53150fc0e498 * feat(gateway): split query capture into its own logging policy setting Review feedback: query data is not a header. Adds a fifth opt-in capture flag (query) for the query string and parameters; request headers keep user agent and client IP. Also softens docs/OpenAPI wording and links plan-based log retention. Amp-Thread-ID: https://ampcode.com/threads/T-019fcd3b-b313-7359-a7a0-53150fc0e498 * docs: align observability pages with plan-based retention and opt-in capture Request-log retention is plan-dependent; link quotas. Headers, bodies, and query data appear only when a logging policy captures them. Amp-Thread-ID: https://ampcode.com/threads/T-019fcd3b-b313-7359-a7a0-53150fc0e498
| Commit: | 2c1233b | |
|---|---|---|
| Author: | Flo | |
| Committer: | Flo | |
fix(ctrl): reap stale deployment instances Amp-Thread-ID: https://ampcode.com/threads/T-019ffb60-1256-71bc-a8f6-bea8a32dd059
| Commit: | 0350029 | |
|---|---|---|
| Author: | Flo | |
| Committer: | GitHub | |
feat(gateway): always-on base request log with five opt-in capture settings (#6921) * feat(gateway): move sentinel request logging behind a logging policy Request logging through the gateway was always on. It is now controlled by a new config-less `logging` sentinel policy: without an enabled, matching logging policy the gateway captures no request/response bodies and writes no ClickHouse row. - proto: new frontline.v1.Logging message, Policy oneof field 11 - frontline: engine sets Result.LogRequest; handler, forwarder, and ClickHouse middleware gate body capture and row emission on it - api: LoggingPolicy in OpenAPI spec, policyconfig conversion, and updatePolicy patch handling - dashboard: logging policy type in canonical schema, tRPC sentinel.logging router, add/edit panel form, and list row label - docs: note that logging is opt-in Closes #5424 (ENG-2612) Amp-Thread-ID: https://ampcode.com/threads/T-019fcd3b-b313-7359-a7a0-53150fc0e498 * feat(frontline): add proxy logging-overhead benchmarks; simplify logging policy UI copy Benchmarks drive real HTTP through the production middleware chain into a real upstream and assert whether ClickHouse rows were buffered, so each variant provably measures the intended logging path. UI copy for the logging policy form rewritten in Simplified Technical English. Amp-Thread-ID: https://ampcode.com/threads/T-019fcd3b-b313-7359-a7a0-53150fc0e498 * docs(gateway): state that a logging policy without match conditions logs all requests An empty match list matches every request. Pin the catch-all semantics with an integration test and state it in the proto comment, OpenAPI description, dashboard schema comment, and policy form copy. Amp-Thread-ID: https://ampcode.com/threads/T-019fcd3b-b313-7359-a7a0-53150fc0e498 * test(gateway): use typed policy fixtures and generated ids Replace raw protojson string literals and hardcoded pol_* ids in update-policy tests with typed frontlinev1.Policy fixtures marshaled through policyconfig and ids from uid.New. Also fix a broken link in the ratelimit analytics docs. Amp-Thread-ID: https://ampcode.com/threads/T-019fcd3b-b313-7359-a7a0-53150fc0e498 * chore: drop proxy benchmark, restore ratelimit analytics docs link Amp-Thread-ID: https://ampcode.com/threads/T-019fcd3b-b313-7359-a7a0-53150fc0e498 * feat(frontline): always write base request log, make headers/bodies capture opt-in The base log row (method, host, path, status, latency, user agent, IP) is now written for every proxied request so traffic and latency charts always work. The logging policy gains two capture flags, headers and bodies; headers also covers query string and parameters since URLs carry secrets. Without an enabled matching logging policy only the base row is stored. Redaction is unchanged. Amp-Thread-ID: https://ampcode.com/threads/T-019fcd3b-b313-7359-a7a0-53150fc0e498 * feat(gateway): split logging capture into four independent opt-ins Request headers, response headers, request body, and response body are now separate capture flags on the logging policy. User agent and client IP move from the always-on base row to the request-headers opt-in since they identify the client. Amp-Thread-ID: https://ampcode.com/threads/T-019fcd3b-b313-7359-a7a0-53150fc0e498 * docs(gateway): use plain active-voice wording, say gateway instead of frontline Amp-Thread-ID: https://ampcode.com/threads/T-019fcd3b-b313-7359-a7a0-53150fc0e498 * fix(dashboard): align logging policy switches right, tune wording Amp-Thread-ID: https://ampcode.com/threads/T-019fcd3b-b313-7359-a7a0-53150fc0e498 * feat(migrate): backfill full-capture logging policy for existing apps Amp-Thread-ID: https://ampcode.com/threads/T-019fcd3b-b313-7359-a7a0-53150fc0e498 * fix(dashboard): center logging policy switches on their text block Amp-Thread-ID: https://ampcode.com/threads/T-019fcd3b-b313-7359-a7a0-53150fc0e498 * feat(gateway): split query capture into its own logging policy setting Review feedback: query data is not a header. Adds a fifth opt-in capture flag (query) for the query string and parameters; request headers keep user agent and client IP. Also softens docs/OpenAPI wording and links plan-based log retention. Amp-Thread-ID: https://ampcode.com/threads/T-019fcd3b-b313-7359-a7a0-53150fc0e498 * docs: align observability pages with plan-based retention and opt-in capture Request-log retention is plan-dependent; link quotas. Headers, bodies, and query data appear only when a logging policy captures them. Amp-Thread-ID: https://ampcode.com/threads/T-019fcd3b-b313-7359-a7a0-53150fc0e498
| Commit: | 19d0bd2 | |
|---|---|---|
| Author: | Oz | |
| Committer: | GitHub | |
feat(api,ctrl): add verifyDomain endpoint (#6941) * feat: add spec * feat: add handler * feat: add permissions * tests: add test for verify handler * refactor: add actor and tx to retryverification * fix: retry bug Retry was failling immeditealy when creation was a day old, but it should actually take the invocations start date instead of row createDate * chore: STE fix better specs * chore: tidy up spec * chore: tidy * chore: drop useless comments * chore: diff * chore: drop redudant comment * chore: address comments
| Commit: | 554cd94 | |
|---|---|---|
| Author: | Oz | |
| Committer: | GitHub | |
feat(api, ctrl): add delete domain endpoint (#6931) * feat(api, ctrl): add delete domain endpoint * refactor: use uid * fix: specs * chore: tidy * chore: tidy punctuation issues * chore: update specs
| Commit: | 0f74927 | |
|---|---|---|
| Author: | Flo | |
| Committer: | Flo | |
fix: address Docker app review feedback Amp-Thread-ID: https://ampcode.com/threads/T-019fd25a-fe32-7754-a268-ae5239b34471
| Commit: | e609714 | |
|---|---|---|
| Author: | Flo | |
| Committer: | Flo | |
fix: return persisted Docker image source Return the normalized image reference from ctrl so updateApp matches subsequent getApp and listApps responses. Amp-Thread-ID: https://ampcode.com/threads/T-019fd25a-fe32-7754-a268-ae5239b34471
| Commit: | 778504b | |
|---|---|---|
| Author: | Flo | |
| Committer: | Flo | |
feat: separate git/docker in an app
| Commit: | 69093fd | |
|---|---|---|
| Author: | Flo | |
Merge remote-tracking branch 'origin/main' into flo/docker-image-apps Amp-Thread-ID: https://ampcode.com/threads/T-019ff0e6-00a6-7028-afbb-9c2ac8ed94aa # Conflicts: # svc/api/routes/v2_portal_create_session/200_app_test.go # web/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/(project)/requests/components/table/request-log-details/index.tsx
| Commit: | ac4ced5 | |
|---|---|---|
| Author: | Flo | |
fix(ctrl): reap stale deployment instances Amp-Thread-ID: https://ampcode.com/threads/T-019ffb60-1256-71bc-a8f6-bea8a32dd059
| Commit: | 0aa4556 | |
|---|---|---|
| Author: | James P | |
| Committer: | GitHub | |
feat(frontline): allow per-policy credit cost overrides for keyauth (#7009) * fix: allow credits to be 0 * fix: make the UI better * Expose key credits on gateway principals * Reject negative keyauth credit costs
| Commit: | 1525ede | |
|---|---|---|
| Author: | ogzhanolguncu | |
feat: add gitlab provider slop
| Commit: | 0711b22 | |
|---|---|---|
| Author: | James | |
fix: allow credits to be 0
| Commit: | 36b898b | |
|---|---|---|
| Author: | Flo | |
| Committer: | GitHub | |
feat(sentinel): compound identifiers for ratelimit policies (#6942) * feat(sentinel): support compound identifiers in ratelimit policies A ratelimit policy previously grouped requests by a single identifier source. Compound keys such as [authenticatedSubject, path] were not possible without one policy per route or per-key ratelimit updates. - proto: add repeated identifiers alongside legacy identifier - api: accept exactly one of identifier or identifiers (max 5) - frontline: compose escaped multi-dimension bucket keys; legacy single identifiers keep their raw keys - dashboard: repeatable identifier rows in the sentinel policy form Amp-Thread-ID: https://ampcode.com/threads/T-019fd2b3-a828-76fa-a589-4b3c461ab5ee * docs(gateway): document compound ratelimit identifiers Also point the dashboard docs link at the current page anchor; the old sentinel path and rate-limit-subjects anchor no longer exist. Amp-Thread-ID: https://ampcode.com/threads/T-019fd2b3-a828-76fa-a589-4b3c461ab5ee * perf(frontline): single-pass compound ratelimit key composition Replace the two-pass ReplaceAll escaping and slice+Join composition with one pre-sized builder and one scan per part. Compound keys now cost one allocation; the legacy single-identifier path allocates nothing. BenchmarkExtractIdentifier (Xeon 2.60GHz): legacy single 4.3 ns/op 0 allocs compound clean 86.0 ns/op 1 alloc compound escaped 98.8 ns/op 1 alloc Amp-Thread-ID: https://ampcode.com/threads/T-019fd2b3-a828-76fa-a589-4b3c461ab5ee * refactor: write ratelimit policies with identifiers array only Legacy single identifier stays readable everywhere, but every write path now emits the repeated identifiers form: - API normalizes deprecated identifier input to a one-entry identifiers proto list and never populates the deprecated proto field. - API responses always render identifiers, also for stored legacy blobs. - Dashboard serializes identifiers for one row too. - Proto and OpenAPI mark the single identifier deprecated. This lets us remove the legacy field later without a data migration. Amp-Thread-ID: https://ampcode.com/threads/T-019fd2b3-a828-76fa-a589-4b3c461ab5ee * test(api): expect identifiers array in list_policies responses Missed in the write-path migration: responses now always render the identifiers array, also for legacy stored blobs. The test dereferenced the legacy field and panicked. Amp-Thread-ID: https://ampcode.com/threads/T-019fd2b3-a828-76fa-a589-4b3c461ab5ee
| Commit: | 055bc6c | |
|---|---|---|
| Author: | Flo | |
| Committer: | GitHub | |
fix(ctrl): harden BuildSlotService against stuck and leaked build slots (#6966) * fix(ctrl): harden BuildSlotService against stuck and leaked build slots Bound the build-slot wait with a 6h timeout, bound the limits fetch inside the workspace VO (a missing limits row previously retried forever while holding the key lock), add a self-expiring lease (new ExpireSlot handler) that reclaims slots from dead or stuck deployments, and set an explicit kill-on-exhaustion invocation retry policy on the service binding. Amp-Thread-ID: https://ampcode.com/threads/T-019fdcd2-17aa-7578-b633-6eb653aa7f9a * fix(ctrl): verify build slot occupancy against Restate invocation liveness VO state outlives invocations: a killed or purged Deploy invocation never runs its Release compensation, so its deployment ID stays in active_slots forever. Scheduled leases alone cannot cover entries that predate their own deployment or kills that land between journal entries. Add a pull-based audit: when a workspace is at capacity, AcquireOrWait now verifies every active slot against the deployments table AND Restate's sys_invocation introspection (dropped rows = dead invocation), reclaims stale slots on the spot, and promotes waiters. ExpireSlot uses the same liveness check so a dead-but-DB-active deployment is force-failed immediately instead of after the full lease. Amp-Thread-ID: https://ampcode.com/threads/T-019fdcd2-17aa-7578-b633-6eb653aa7f9a * docs(ctrl): simplify build slot comments Amp-Thread-ID: https://ampcode.com/threads/T-019fdcd2-17aa-7578-b633-6eb653aa7f9a * fix(ctrl): cut build slot max wait from 6h to 1h Amp-Thread-ID: https://ampcode.com/threads/T-019fdcd2-17aa-7578-b633-6eb653aa7f9a * feat(ctrl): renew build slot lease while deploy invocation is live Amp-Thread-ID: https://ampcode.com/threads/T-019fdcd2-17aa-7578-b633-6eb653aa7f9a * fix(restate): make liveness query robust and dedupe admin client HTTP handling Amp-Thread-ID: https://ampcode.com/threads/T-019fdcd2-17aa-7578-b633-6eb653aa7f9a * refactor(ctrl): journal effective build limit as plain number Amp-Thread-ID: https://ampcode.com/threads/T-019fdcd2-17aa-7578-b633-6eb653aa7f9a * test(ctrl): reproduce stale build slot recovery against real Restate Amp-Thread-ID: https://ampcode.com/threads/T-019fdcd2-17aa-7578-b633-6eb653aa7f9a * refactor(restate): fold admin HTTP handling into one send helper and generic call Amp-Thread-ID: https://ampcode.com/threads/T-019fdcd2-17aa-7578-b633-6eb653aa7f9a * fix(ctrl): force-fail reclaimed deployments and prune dead waiters before promotion Amp-Thread-ID: https://ampcode.com/threads/T-019fdcd2-17aa-7578-b633-6eb653aa7f9a
| Commit: | ab67721 | |
|---|---|---|
| Author: | Flo | |
| Committer: | Flo | |
fix: address Docker app review feedback Amp-Thread-ID: https://ampcode.com/threads/T-019fd25a-fe32-7754-a268-ae5239b34471
| Commit: | bb15db0 | |
|---|---|---|
| Author: | Flo | |
| Committer: | Flo | |
fix: return persisted Docker image source Return the normalized image reference from ctrl so updateApp matches subsequent getApp and listApps responses. Amp-Thread-ID: https://ampcode.com/threads/T-019fd25a-fe32-7754-a268-ae5239b34471
| Commit: | de24bd1 | |
|---|---|---|
| Author: | Flo | |
| Committer: | Flo | |
feat: separate git/docker in an app
| Commit: | 087cbbf | |
|---|---|---|
| Author: | Flo | |
feat(ctrl): renew build slot lease while deploy invocation is live Amp-Thread-ID: https://ampcode.com/threads/T-019fdcd2-17aa-7578-b633-6eb653aa7f9a
| Commit: | 1432ea5 | |
|---|---|---|
| Author: | Flo | |
docs(ctrl): simplify build slot comments Amp-Thread-ID: https://ampcode.com/threads/T-019fdcd2-17aa-7578-b633-6eb653aa7f9a
| Commit: | ba74b32 | |
|---|---|---|
| Author: | Flo | |
feat(ctrl): migrate build concurrency to Restate vqueues Amp-Thread-ID: https://ampcode.com/threads/T-019fe134-cebd-729b-b74f-3d8246d7247d
| Commit: | 75b42e1 | |
|---|---|---|
| Author: | Flo | |
fix(ctrl): harden BuildSlotService against stuck and leaked build slots Bound the build-slot wait with a 6h timeout, bound the limits fetch inside the workspace VO (a missing limits row previously retried forever while holding the key lock), add a self-expiring lease (new ExpireSlot handler) that reclaims slots from dead or stuck deployments, and set an explicit kill-on-exhaustion invocation retry policy on the service binding. Amp-Thread-ID: https://ampcode.com/threads/T-019fdcd2-17aa-7578-b633-6eb653aa7f9a
| Commit: | 1685ce9 | |
|---|---|---|
| Author: | Flo | |
fix: return persisted Docker image source Return the normalized image reference from ctrl so updateApp matches subsequent getApp and listApps responses. Amp-Thread-ID: https://ampcode.com/threads/T-019fd25a-fe32-7754-a268-ae5239b34471
| Commit: | 37513b8 | |
|---|---|---|
| Author: | Flo | |
feat(gateway): split query capture into its own logging policy setting Review feedback: query data is not a header. Adds a fifth opt-in capture flag (query) for the query string and parameters; request headers keep user agent and client IP. Also softens docs/OpenAPI wording and links plan-based log retention. Amp-Thread-ID: https://ampcode.com/threads/T-019fcd3b-b313-7359-a7a0-53150fc0e498
| Commit: | 3f75633 | |
|---|---|---|
| Author: | ogzhanolguncu | |
| Committer: | ogzhanolguncu | |
refactor: add actor and tx to retryverification
| Commit: | f80ce8b | |
|---|---|---|
| Author: | ogzhanolguncu | |
| Committer: | ogzhanolguncu | |
refactor(dashboard, ctrl): move stopDeployment to the SDK and audit it in ctrl The dashboard reached ctrl through a trpc router that wrote the deployment.stop audit entry itself, so a root key calling the public API produced no entry at all. Move the write into ctrl, which every surface routes through, and point the dialog at the SDK instead. Also lands the plumbing the remaining lifecycle verbs reuse: ActorInfo on their ctrl requests, the audit event constants, and recordLifecycleAudit.
| Commit: | 0aa152c | |
|---|---|---|
| Author: | ogzhanolguncu | |
| Committer: | ogzhanolguncu | |
feat(api, ctrl): add delete domain endpoint
| Commit: | 90a4706 | |
|---|---|---|
| Author: | Flo | |
| Committer: | Flo | |
feat: separate git/docker in an app
| Commit: | 3c02acd | |
|---|---|---|
| Author: | Oz | |
| Committer: | GitHub | |
feat(api): add createDomain endpoint (#6915) * feat(api): add createDomain endpoint * refactor: response body * refactor: drop redundant field * chore: update specs * feat: add sdk * chore: drop redundant comments * chore: tidy up spec * refactor: add limits, tighten regex and tests This commit also adds shared domaingate to enforce same checks for both RPC and API * chore: fix smell and minor test issues * fix: error name * refactor: group connectURL * fix: wording * fix: spec * chore: tidy * refactor: add retry for verifyDomain workflow call * refactor: move helper queries to sqlc instead of inlining * fix: wording * refactor: use limitsCache * chore: add missing cache remove * fix: wording * chore: tidy * chore: tidy * chore: add missing gen files * chore: use "attached" instead of "registered" everywhere * refactor(spec): share DomainId schema for createDomain * feat(spec): report per-record verification on dns records * chore: move from attached to exists * refactor: move domain gate to its own pkg * fix: typos and descriptions * chore: remove redaction * refactor: use uidDNS and remove redundant query * refactor: update proto * refactor: remove retry * refactor: instead of regex use our own validator for domains * refactor: handle custom domain insertions gracefully We used to add custom domain row then fire workflow, but when db commit didnt land properly before the workflow call it was failing right away. So now we give workflow some grace period and rollback everything if invocation fails before that actual workflow starts. so API can stay idempotent * refactor: proto so it doesnt break dashboard * chore: fix spec punctuation * chore: tidy up
| Commit: | 2da44de | |
|---|---|---|
| Author: | Flo | |
docs(gateway): use plain active-voice wording, say gateway instead of frontline Amp-Thread-ID: https://ampcode.com/threads/T-019fcd3b-b313-7359-a7a0-53150fc0e498
| Commit: | 250e35d | |
|---|---|---|
| Author: | Flo | |
| Committer: | Flo | |
refactor: write ratelimit policies with identifiers array only Legacy single identifier stays readable everywhere, but every write path now emits the repeated identifiers form: - API normalizes deprecated identifier input to a one-entry identifiers proto list and never populates the deprecated proto field. - API responses always render identifiers, also for stored legacy blobs. - Dashboard serializes identifiers for one row too. - Proto and OpenAPI mark the single identifier deprecated. This lets us remove the legacy field later without a data migration. Amp-Thread-ID: https://ampcode.com/threads/T-019fd2b3-a828-76fa-a589-4b3c461ab5ee
| Commit: | 984e866 | |
|---|---|---|
| Author: | Flo | |
| Committer: | Flo | |
feat(sentinel): support compound identifiers in ratelimit policies A ratelimit policy previously grouped requests by a single identifier source. Compound keys such as [authenticatedSubject, path] were not possible without one policy per route or per-key ratelimit updates. - proto: add repeated identifiers alongside legacy identifier - api: accept exactly one of identifier or identifiers (max 5) - frontline: compose escaped multi-dimension bucket keys; legacy single identifiers keep their raw keys - dashboard: repeatable identifier rows in the sentinel policy form Amp-Thread-ID: https://ampcode.com/threads/T-019fd2b3-a828-76fa-a589-4b3c461ab5ee
| Commit: | 8880c18 | |
|---|---|---|
| Author: | Flo | |
Merge branch 'main' into eng-2612-logging-policy Amp-Thread-ID: https://ampcode.com/threads/T-019fcd3b-b313-7359-a7a0-53150fc0e498
| Commit: | 338e0cf | |
|---|---|---|
| Author: | Flo | |
feat(gateway): split logging capture into four independent opt-ins Request headers, response headers, request body, and response body are now separate capture flags on the logging policy. User agent and client IP move from the always-on base row to the request-headers opt-in since they identify the client. Amp-Thread-ID: https://ampcode.com/threads/T-019fcd3b-b313-7359-a7a0-53150fc0e498
| Commit: | f03d254 | |
|---|---|---|
| Author: | Flo | |
feat(frontline): always write base request log, make headers/bodies capture opt-in The base log row (method, host, path, status, latency, user agent, IP) is now written for every proxied request so traffic and latency charts always work. The logging policy gains two capture flags, headers and bodies; headers also covers query string and parameters since URLs carry secrets. Without an enabled matching logging policy only the base row is stored. Redaction is unchanged. Amp-Thread-ID: https://ampcode.com/threads/T-019fcd3b-b313-7359-a7a0-53150fc0e498
| Commit: | 720f7b3 | |
|---|---|---|
| Author: | ogzhanolguncu | |
| Committer: | ogzhanolguncu | |
refactor: add actor and tx to retryverification
| Commit: | 7dd3873 | |
|---|---|---|
| Author: | ogzhanolguncu | |
| Committer: | ogzhanolguncu | |
feat(api, ctrl): add delete domain endpoint
| Commit: | bdc6238 | |
|---|---|---|
| Author: | ogzhanolguncu | |
| Committer: | ogzhanolguncu | |
refactor: proto so it doesnt break dashboard
| Commit: | 249255a | |
|---|---|---|
| Author: | ogzhanolguncu | |
| Committer: | ogzhanolguncu | |
refactor: update proto
| Commit: | 5cd0ba5 | |
|---|---|---|
| Author: | ogzhanolguncu | |
| Committer: | ogzhanolguncu | |
feat(api): add createDomain endpoint
| Commit: | a538d9d | |
|---|---|---|
| Author: | Andreas Thomas | |
| Committer: | GitHub | |
Remove workspace quotas table (#6913) * Remove workspace quotas table * style: fmt * test: set autoscaling limit for environment settings success
| Commit: | fb96fc4 | |
|---|---|---|
| Author: | Flo | |
docs(gateway): state that a logging policy without match conditions logs all requests An empty match list matches every request. Pin the catch-all semantics with an integration test and state it in the proto comment, OpenAPI description, dashboard schema comment, and policy form copy. Amp-Thread-ID: https://ampcode.com/threads/T-019fcd3b-b313-7359-a7a0-53150fc0e498
| Commit: | afc6431 | |
|---|---|---|
| Author: | Flo | |
| Committer: | Flo | |
feat(gateway): move sentinel request logging behind a logging policy Request logging through the gateway was always on. It is now controlled by a new config-less `logging` sentinel policy: without an enabled, matching logging policy the gateway captures no request/response bodies and writes no ClickHouse row. - proto: new frontline.v1.Logging message, Policy oneof field 11 - frontline: engine sets Result.LogRequest; handler, forwarder, and ClickHouse middleware gate body capture and row emission on it - api: LoggingPolicy in OpenAPI spec, policyconfig conversion, and updatePolicy patch handling - dashboard: logging policy type in canonical schema, tRPC sentinel.logging router, add/edit panel form, and list row label - docs: note that logging is opt-in Closes #5424 (ENG-2612) Amp-Thread-ID: https://ampcode.com/threads/T-019fcd3b-b313-7359-a7a0-53150fc0e498
| Commit: | c7704a9 | |
|---|---|---|
| Author: | Flo | |
| Committer: | Flo | |
feat: separate git/docker in an app
| Commit: | c3b2dde | |
|---|---|---|
| Author: | Flo | |
feat(gateway): move sentinel request logging behind a logging policy Request logging through the gateway was always on. It is now controlled by a new config-less `logging` sentinel policy: without an enabled, matching logging policy the gateway captures no request/response bodies and writes no ClickHouse row. - proto: new frontline.v1.Logging message, Policy oneof field 11 - frontline: engine sets Result.LogRequest; handler, forwarder, and ClickHouse middleware gate body capture and row emission on it - api: LoggingPolicy in OpenAPI spec, policyconfig conversion, and updatePolicy patch handling - dashboard: logging policy type in canonical schema, tRPC sentinel.logging router, add/edit panel form, and list row label - docs: note that logging is opt-in Closes #5424 (ENG-2612) Amp-Thread-ID: https://ampcode.com/threads/T-019fcd3b-b313-7359-a7a0-53150fc0e498
| Commit: | cb0fd48 | |
|---|---|---|
| Author: | ogzhanolguncu | |
| Committer: | ogzhanolguncu | |
feat(api): add createDomain endpoint
| Commit: | 8b981e7 | |
|---|---|---|
| Author: | chronark | |
| Committer: | chronark | |
Remove workspace quotas table
| Commit: | fb9290d | |
|---|---|---|
| Author: | ogzhanolguncu | |
| Committer: | ogzhanolguncu | |
feat(api): add createDomain endpoint
| Commit: | 645415f | |
|---|---|---|
| Author: | chronark | |
Remove workspace quotas table
| Commit: | a1e1967 | |
|---|---|---|
| Author: | Andreas Thomas | |
| Committer: | GitHub | |
Add durable legacy billing invoice workflow (#6909) - Create resumable, fail-closed Stripe draft invoices from legacy pricing - Validate workspace state, usage tiers, and invoice reconciliation - Document manual invocation, review, and recovery procedures
| Commit: | 2b9f2fa | |
|---|---|---|
| Author: | Andreas Thomas | |
| Committer: | GitHub | |
Merge branch 'main' into chronark/billing
| Commit: | 9f9b795 | |
|---|---|---|
| Author: | chronark | |
Add durable legacy billing invoice workflow - Create resumable, fail-closed Stripe draft invoices from legacy pricing - Validate workspace state, usage tiers, and invoice reconciliation - Document manual invocation, review, and recovery procedures
| Commit: | 77f762a | |
|---|---|---|
| Author: | Andreas Thomas | |
| Committer: | GitHub | |
Add second frontline cert (#6894) * Identify Krane clusters by immutable cell ID - Replace region-scoped RPC keys with cell, platform, and region identities - Persist and validate one-time cell claims to prevent cluster collisions - Document and configure the new Krane cluster identity fields * Remove redundant cluster lookup from heartbeat registration * Refresh cluster cell identity on every heartbeat * Provision wildcard certificates for frontline cells --------- Co-authored-by: Amp <amp@ampcode.com>
| Commit: | bb502d6 | |
|---|---|---|
| Author: | Flo | |
| Committer: | Flo | |
feat: separate git/docker in an app
| Commit: | 45dbd2b | |
|---|---|---|
| Author: | Flo | |
| Committer: | Flo | |
feat: separate git/docker in an app
| Commit: | 176ed7c | |
|---|---|---|
| Author: | chronark | |
Identify Krane clusters by immutable cell ID - Replace region-scoped RPC keys with cell, platform, and region identities - Persist and validate one-time cell claims to prevent cluster collisions - Document and configure the new Krane cluster identity fields
| Commit: | 5aa2260 | |
|---|---|---|
| Author: | Flo | |
feat: separate git/docker in an app
| Commit: | da334b6 | |
|---|---|---|
| Author: | Flo | |
| Committer: | Flo | |
feat(ctrl): Compute billing reconcile engine (D9) Reconcile one (workspace, period) — the finalized Stripe invoice against live ClickHouse usage — and return a verdict (clean / late_data_underbill / overbill / structural). No DB, no snapshot: the invoice is the durable billed record and T+72h is inside the 95-day checkpoint TTL. Design and decisions in svc/ctrl/internal/billingreconcile/DECISIONS.md.
| Commit: | cf80b62 | |
|---|---|---|
| Author: | Flo | |
| Committer: | Flo | |
feat(ctrl): Compute billing reconcile engine (D9) Reconcile one (workspace, period) — the finalized Stripe invoice against live ClickHouse usage — and return a verdict (clean / late_data_underbill / overbill / structural). No DB, no snapshot: the invoice is the durable billed record and T+72h is inside the 95-day checkpoint TTL. Design and decisions in svc/ctrl/internal/billingreconcile/DECISIONS.md.
| Commit: | 86b2d71 | |
|---|---|---|
| Author: | Flo | |
| Committer: | Flo | |
feat: sepeerate git/docker from app
| Commit: | cf4a019 | |
|---|---|---|
| Author: | chronark | |
Merge branch 'main' of github.com:unkeyed/unkey into chronark/prune-registry # Conflicts: # gen/proto/hydra/v1/cron.pb.go # gen/proto/hydra/v1/cron_restate.pb.go # go.mod # svc/ctrl/integration/harness/BUILD.bazel # svc/ctrl/integration/harness/harness.go # svc/ctrl/internal/db/deployment_status.go # svc/ctrl/proto/hydra/v1/cron.proto # svc/ctrl/worker/BUILD.bazel # svc/ctrl/worker/config.go # svc/ctrl/worker/cron/BUILD.bazel # svc/ctrl/worker/cron/cron.go # svc/ctrl/worker/project/BUILD.bazel # svc/ctrl/worker/run.go
| Commit: | d16a502 | |
|---|---|---|
| Author: | chronark | |
refactor(ctrl): unify deployment resource pruning
| Commit: | 5e7ca94 | |
|---|---|---|
| Author: | chronark | |
feat(ctrl): prune orphaned deployment resources
| Commit: | 6e00bfc | |
|---|---|---|
| Author: | Flo | |
| Committer: | GitHub | |
feat(ctrl): Deploy spend-cap enforcement suspend/resume (ENG-2923) (#6542)
| Commit: | df8ade7 | |
|---|---|---|
| Author: | Flo | |
| Committer: | Flo | |
feat(ctrl): Deploy spend-cap enforcement suspend/resume (ENG-2923)
| Commit: | 64a09e7 | |
|---|---|---|
| Author: | Flo | |
| Committer: | GitHub | |
feat(ctrl): rewire Deploy cancel through ctrl-api (ENG-2922) (#6541)
| Commit: | e701097 | |
|---|---|---|
| Author: | Flo | |
| Committer: | GitHub | |
feat(ctrl): Deploy teardown service (ENG-2922) (#6540)
| Commit: | d906767 | |
|---|---|---|
| Author: | Flo | |
| Committer: | Flo | |
feat(ctrl): Deploy spend-cap enforcement suspend/resume (ENG-2923)
| Commit: | 8067893 | |
|---|---|---|
| Author: | Flo | |
| Committer: | Flo | |
feat(ctrl): Deploy teardown service (ENG-2922)
| Commit: | e012b60 | |
|---|---|---|
| Author: | Flo | |
| Committer: | Flo | |
feat(ctrl): rewire Deploy cancel through ctrl-api (ENG-2922)
| Commit: | 464040c | |
|---|---|---|
| Author: | Flo | |
| Committer: | GitHub | |
feat(billing): Deploy spend-cap detection and budget alerts (ENG-2904) (#6486)
| Commit: | 2e52631 | |
|---|---|---|
| Author: | Oz | |
| Committer: | GitHub | |
feat: add schema (#6698)
| Commit: | ad030ed | |
|---|---|---|
| Author: | Flo | |
| Committer: | Flo | |
feat(ctrl): Deploy spend-cap enforcement suspend/resume (ENG-2923)
| Commit: | 7efdfbd | |
|---|---|---|
| Author: | Flo | |
| Committer: | Flo | |
feat(ctrl): rewire Deploy cancel through ctrl-api (ENG-2922)
| Commit: | c34b1ea | |
|---|---|---|
| Author: | Flo | |
| Committer: | Flo | |
feat(billing): Deploy spend-cap detection and budget alerts (ENG-2904)
| Commit: | c71d7b1 | |
|---|---|---|
| Author: | Flo | |
| Committer: | Flo | |
feat(ctrl): Deploy teardown service (ENG-2922)
| Commit: | 0f43036 | |
|---|---|---|
| Author: | Flo | |
| Committer: | GitHub | |
refactor(ctrl)!: per-workspace push invocations for deploy billing (#6452)
| Commit: | 89ffdb2 | |
|---|---|---|
| Author: | ogzhanolguncu | |
| Committer: | ogzhanolguncu | |
refactor: validate through protojson marshal if it fails we know payload is broken
| Commit: | 325831e | |
|---|---|---|
| Author: | Flo | |
| Committer: | Flo | |
feat(ctrl): Deploy spend-cap enforcement suspend/resume (ENG-2923)
| Commit: | a3a88df | |
|---|---|---|
| Author: | Flo | |
| Committer: | Flo | |
feat(ctrl): rewire Deploy cancel through ctrl-api (ENG-2922)
| Commit: | 37fabe5 | |
|---|---|---|
| Author: | Flo | |
| Committer: | Flo | |
feat(ctrl): Deploy teardown service (ENG-2922)
| Commit: | 6899fb9 | |
|---|---|---|
| Author: | Flo | |
| Committer: | Flo | |
feat(billing): Deploy spend-cap detection and budget alerts (ENG-2904)