Commit Graph

777 Commits

Author SHA1 Message Date
Gabe Ruttner
1244039e64 Fix--durable-feedback (#3240)
* feat: duration takes ms

* fix: nondeterminism err clarity

* fix: cleanup

* chore: lint

* chore: feedback

* fix: typescript

* fix: python
2026-03-13 10:04:03 -07:00
Gabe Ruttner
583bb6f4ba Feat--unify-running-and-evicted (#3248)
* feat: unify running and evicted counts with filter

* chore: gen

* chore: gen lint

* fix: opsies...

* chore: gen

* chore: feedback
2026-03-13 05:57:07 -07:00
matt
6fb50ce004 Feat: Wait wrapper signature improvements (#3241)
* fix: make memo private for now

* feat: first pass at returning structured data back

* fix: json marshalling, types

* feat: wiring

* fix: sleep for return type

* chore: add comments

* fix: tests for `expr_to_timedelta`

* fix: change examples

* feat: improve asserts

* fix: pass payloads through

* fix: add hacky fallbacks to avoid breaking changes

* feat: add memo now

* feat: add test for memo now

* fix: hack for old engine test

* fix: rm restore button

* fix: one more test

* fix: ts impls

* revert: unwind engine changes (woohoo!)

* fix: payload validation

* fix: ts

* chore: gen

* feat: sleep until

* fix: return wait result on replay

* fix: data get, pydantic warning

* fix: test assert

* fix: ts memo key, make memo private

* chore: rm comment, gen again

* chore: merge and gen
2026-03-12 12:53:03 -04:00
mrkaye97
c0204fbd8b Merge branch 'main' into feat-durable-execution 2026-03-12 12:24:32 -04:00
Gabe Ruttner
7748898c59 fix: failure after cancellation (#3243)
* fix: failure after cancellation

* chore: generate

* fix: list multiple concurrency strategies

* fix: lock concerns
2026-03-11 18:11:15 -07:00
matt
b942092ba5 Feat: env var for stream event buffer timeout (#3223)
* feat: env var for stream event buffer timeout

* chore: gen
2026-03-11 11:41:18 -04:00
Gabe Ruttner
98212cb2de Merge branch 'main' into feat-durable-execution 2026-03-10 09:01:01 -04:00
Mohammed Nafees
ab6cae4420 Test PgBouncer against our code-level partitioning logic (#3178)
* test partition drops with pgbouncer

* dedicated DDLPool to bypass pgbouncer

* fix generate

* add env var

* min env var

* update documentation

* no go mod redundancy
2026-03-10 12:24:07 +01:00
matt
918f18f127 Fix: Clean up durable exec todos (#3214)
* fix: comments

* fix: more todo comments

* fix: otel instrumentor

* fix: rm unused attrs

* chore: remove comment

---------

Co-authored-by: Gabe Ruttner <gabriel.ruttner@gmail.com>
2026-03-09 16:42:23 -04:00
Gabe Ruttner
468de0c584 feat: handle server initiated eviction on workers (#3200)
* refactor: ts in sync with python

* fix: waits respect abort signal

* chore: gen, lint

* fix: update key extraction logic in durable workflow example

* fix: flake

* fix: racey test

* chore: gen

* feat: send eviction to engine

* feat: handle eviction on workers

* fix: tests and invocation scoped eviction

* fix: cleanup scope

* refactor: cleanup how we do action keys in ts

* chore: gen, lint

* fix: test

* chore: lint

* fix: mock

* fix: cleanup

* chore: lint

* chore: copilot feedback

* fix: reconnect durable listener

* chore: feedback

* fix: bump worker status on wait and reconnect

* refactor: rename eviction notice

* fix: return error on query failure

* chore: lint

* chore: gen

* refactor: remove early completion

* Revert "refactor: remove early completion"

This reverts commit f756ce37b0.

* chore: remove unused param
2026-03-09 05:16:46 -07:00
Gabe Ruttner
a70b0899d1 fix: type 2026-03-08 17:50:56 -04:00
Gabe Ruttner
7e01f7ba94 Merge branch 'main' into feat-durable-execution 2026-03-08 17:50:42 -04:00
abelanger5
46c4297b32 feat: add callback support for tenant and tenant member updates (#3201)
* feat: add callback support for tenant and tenant member updates

* add callbacks into tenant_invite.go
2026-03-07 17:31:44 -05:00
Gabe Ruttner
fca52697a8 refactor: ts in sync with python (#3199)
* refactor: ts in sync with python

* fix: waits respect abort signal

* chore: gen, lint

* fix: update key extraction logic in durable workflow example

* fix: flake

* fix: racey test

* chore: gen
2026-03-07 05:42:42 -08:00
Gabe Ruttner
1cd9660835 rip: remove unneeded durable event log update (#3186)
* rip: update

* refactor: start cleaning up proto defs

* refactor: finish cleaning up proto definitions

* fix: rm the kind

* refactor: rewire the server to have different methods for the different paths

* refactor: more intermediate work

* fix: variables

* fix: wire the kind through

* refactor: get it to compile

* chore: start fixing python

* fix: first pass at fixing python

* chore: rm unused sql

* fix: rm invocation count, rework some logic

* fix: alias (why does sqlc not catch this)

* fix: panics

* fix: add faster timeout to durable spawn test

* fix: task id bug

* refactor: more cleanup of types

* refactor: rm stale entries logic

* fix: rework getOrCreate logic

* fix: clean up a bunch more unneeded stuff

* fix: bug

* fix: python code

* fix: dag matches bug

* fix: add parent to dag to make it more broken, add timeout

* fix: more involved tests

* fix: dag waits

* fix: tests

---------

Co-authored-by: mrkaye97 <mrkaye97@gmail.com>
2026-03-07 04:02:48 -08:00
Gabe Ruttner
12bf7514c5 feat: durable-bulk-spawn (#3173)
* feat: durable bulk spawn

* feat: bulk db operations

* chore: lint

* chore: generate

* fix: sqlc hack

* cleanup

* chore: lint

* refactor: remove duplicated code

* refactor: simplify input

* ops: rules

* fix: add missing workflows to worker

* chore: add todo

* refactor: single execution path

* comment

* refactor: remove extra class

* chore: lint

* chore: lint

* refactor: batch ack

* fix: handle empty refs

* chore: feedback

* fix: durable output

* chore: lint

* chore: lint

* chore: test fix and gen

* revert: actually use bulk

* refactor: simplify path

* chore: empty commit

Made-with: Cursor
2026-03-05 16:08:13 -08:00
matt
1bffb66bb3 Feat: Branching off branches (#3150)
* feat: add branch point table

* chore: gen

* feat: id for ordering

* feat: check for `isBranchPoint` and handle branching

* feat: wire up branching over the api

* fix: api, gen

* fix: gen

* fix: branch

* feat: remove duped parent node and branch ids

* fix: rm branch count, dupe of latest id

* refactor: resolve naming

* fix: base case

* fix: test, + it's literally always a caching issue omg

* fix: docs

* chore: lint

* refactor: make branch resolution more efficient

* feat: stable sort, add a bunch of tests

* fix: confusing naming

* fix: naming

* chore: gen

* fix: update

* fix: failing test

---------

Co-authored-by: Gabe Ruttner <gabriel.ruttner@gmail.com>
2026-03-05 16:31:01 -05:00
Gabe Ruttner
a6f5fb6871 chore: rename durable fork to branch (#3174) 2026-03-05 09:56:46 -08:00
Gabe Ruttner
5b58eed1ce tests: compat testing (#3144)
* tests: compat testing

* fix: new engine old sdk

* feat: ruby ts

* fix: namespaced tests, conditions

* chore: lint ts

* fix: python compat

* chore: lint

* fix: warn on version mismatch

* chore: lint

* fix: child spawn

* refactor: address review

* chore: lint

* chore: lint

* chore: lint

* refactor: address reviews

* chore: lint

* fix: typeguard

* tests: docker-compose

* fix: docker compose

* fix: labels?

* chore: skip new tests

* fix: backwards compat

* fix: grpc proxy
2026-03-04 18:12:45 -08:00
matt
46b3041eb1 Fix: Go unexported type (#3160)
* fix: internal types

* fix: rm unused helper
2026-03-04 17:40:13 -05:00
Gabe Ruttner
65e44d6f63 feat: OLAP status priority functions and query updates (#3156)
* feat: OLAP status priority functions and query updates

- Add v1_status_priority / v1_status_from_priority for v1_readable_status_olap
- Use priority-based aggregation in OLAP task status update queries (EVICTED
  below terminal statuses)
- Migration v1_0_84 and schema v1-olap.sql

Made-with: Cursor

* test: durable eviction tests — replay, cancel after eviction, restore idempotency

- test_eviction_plus_replay, test_evictable_cancel_after_eviction, test_restore_idempotency
- Tighter poll interval for faster test runs

Made-with: Cursor

* fix: flakes

* feedback
2026-03-04 11:11:09 -08:00
mrkaye97
5d735b4c41 fix: linting issues 2026-03-04 13:59:05 -05:00
mrkaye97
e29459f58a chore: merge main 2026-03-04 13:38:37 -05:00
matt
6c29e48204 Feat: Dynamic worker label assign (#3137)
* feat: initial wiring work on desired labels

* feat: initial wiring

* chore: gen python

* fix: use the whole desired label thing instead

* fix: more wiring, improve types

* fix: sql type

* fix: len check

* chore: gen python

* fix: initial plural label work

* fix: store the labels properly on the task

* fix: skip cache on override

* fix: bug

* fix: scoping bug whoops

* chore: lint

* fix: send labels back over the api correctly

* feat: python test

* fix: lint

* fix: comment

* fix: override

* fix: namespaces, ugh

* fix: no need for error here

* chore: version

* feat: ruby, go, ts

* feat: versions

* fix: appease the rubocop

* chore: lint

* chore: bundle install

* fix: tests

* chore: lint

* chore: lint more

* fix: ts test

* fix: rb

* chore: gen

* chore: reset gemfile

* chore: reset changelog

* fix: pgroup

* fix: tests, part i

* Revert "chore: reset changelog"

This reverts commit b63bf7d3e5.

* Revert "chore: reset gemfile"

This reverts commit bb848bb6f0.

* fix: go -> golang mapping hack

* fix: go enums

* fix: appease the cop

* fix: namespace

* chore: gen
2026-03-04 11:03:58 -05:00
Gabe Ruttner
1d3f54f4e4 Merge branch 'main' into feat-durable-execution 2026-03-03 18:17:24 -05:00
Gabe Ruttner
c8f762c12e chore: simplify ruby e2e ci scripts (#3152)
* chore: simplify start script

* chore: log

* fix: log paths

* fix: race?

* fix: deadlock?

---------

Co-authored-by: mrkaye97 <mrkaye97@gmail.com>
2026-03-03 15:16:11 -08:00
mrkaye97
a4f65454f3 Merge branch 'main' into feat-durable-execution 2026-03-03 17:24:23 -05:00
Mohammed Nafees
e72051877e Enable loadtest with PgBouncer (#3143)
* enable loadtest with pgbouncer

* use default_query_exec_mode=cache_describe for pgbouncer

* increase threshold

* make sure no regression
2026-03-03 15:24:30 +01:00
Julius Park
5e4bb9d151 Add seconds granularity to cron jobs (#3136) 2026-03-02 18:07:15 -05:00
abelanger5
e9eb65d9a8 feat: user callback additional methods (#3057)
* add more opts to create user callback

* add session callbacks

* add more options to authenticate

* add full route info to routes map

* small refactor to reduce deps on session helpers
2026-03-02 16:25:41 -05:00
matt
77f769bd66 Feat: Durable Memoization (#3112)
* feat: initial engine / db work

* chore: gen python

* feat: initial python work

* feat: wiring

* feat: initial test

* fix: scope memo key to the run id (we might not even need this)

* chore: gen, docstring

* fix: mandatory result type

* fix: docs

* fix: log a warning and don't cache

* fix: add test for non-unique keys, fix some bugs

* chore: lint

* chore: naming

* fix: more naming

* fix: comment

* chore: gen

* fix: docs

* fix: naming, ugh

* chore: gen

* chore: gen

* fix: always send event log entry and get ack

* fix: initial rework of memo to only use stream

* fix: start reworking python side

* fix: finish wiring up memo put

* chore: fmt

* chore: comment for monday

* fix: start reworking signature

* fix: docstring

* fix: union type for send event to improve typing a bunch

* fix: memo key

* chore: gen

* fix: rm unused query

* fix: comments
2026-03-01 16:27:56 -08:00
Gabe Ruttner
2d57b6793a Feat durable olap refactor (#3115)
* chore: lint

* feat: counting and partitioning

* feat: add reason field to DurableTaskEvictInvocationRequest and update eviction handling

* fix: eviction durable execution race

* chore: generate

* refactor: simplified migration

* refactor: address review

* refactor: analyze parent tables in migraiton

* fix: migration

* fix: remove no txn

* fix: one statement

* fix: we do infact need no transaction

* add down/up/down to the online migration test

* fix: or multiple statements

* fix: two migrations...

* chore: rm old migraiton

* chore: generate

* chore: feedback

* fix: idempotent migration

* refactor: update assertions in durable tests and clean up imports in cache.py

* revert: migraiton

* chore: wrap down
2026-02-27 10:58:01 -08:00
Gabe Ruttner
daff28dbfe Feat: durable eviction take 2 (#3075)
* feat: simplified eviction feature

* fix: assign new worker id

* test: shorter sleep

* fix: completion race on same worker

* chore: address todo

* chore: lint

* chore: generate

* fix: n+1 queries

* refactor: WasEvicted bool

* feat: evicted state

* chore: generate

* fix: map status

* fix: update PendingCallback structure to include InvocationCount

* revert: comment

* feat: add support for EVICTED status in waterfall component and metrics display

* fix: implicit eviction

* chore: readable cte

* refactor: queued bool

* refactor: rename eviction_policy

* fix: aio only

* chore: example return type

* fix: map

* feat: eviction error cases

* refactor: change external ID maps to use UUID type

* chore: feedback, cleanup

* tests: additional cases

* chore: generate

* chore: lint

* chore: lint generate

* chore: clean up comments to make matt happy

* refactor: more feedback

* chore: add TODO for worker state reconciliation and clean up comments in eviction policy

* tests: fix

* chore: gen

* test: increase ruby timeout...

* fix: invocation count

* fix: test cases

* fix: stale log entry

* chore: lint

* revert: durable tests to use time.time

* chore: lint
2026-02-27 09:25:50 -08:00
mrkaye97
392391b4a7 Merge branch 'main' into feat-durable-execution 2026-02-26 14:21:53 -05:00
matt
deee6e213c fix: external ids (#3111) 2026-02-26 12:57:33 -05:00
Mohammed Nafees
ef2c01a499 Add ctx.WasSkipped helper to the Go SDK (#3094)
* introduce ctx.WasSkipped just like Py SDK

* fix lint and example
2026-02-26 17:56:45 +01:00
Mohammed Nafees
fa695fc8ca non blocking ctx.Log with meaningful retries (#3106) 2026-02-25 18:55:17 +01:00
matt
5e672d0514 [Go] Feat: Details Getter (#3105)
* feat: add details getter

* fix: naming

* fix: structs
2026-02-25 12:11:19 -05:00
mrkaye97
736ecaa3c0 Merge branch 'main' into feat-durable-execution 2026-02-24 13:26:48 -08:00
Mohammed Nafees
f3ec9597a6 Add env vars for max conn lifetime and idle time for pgx (#3096)
* add env vars for max conn lifetime and idele time for pgx

* add doc
2026-02-24 21:54:09 +01:00
Mohammed Nafees
444a335c18 Fix cross-strategy slot contamination in chained concurrency gates (#3089)
* filter properly based on strategy ids

* remove remnants

* add concurency integration test

* more tests
2026-02-24 12:54:04 +01:00
Mohammed Nafees
44069cef89 make sure to use 60 seconds timeout for PutWorkflowVersion (#3085) 2026-02-23 16:20:31 +01:00
matt
df9e86081a Fix: Move event log to a tab on the task run detail (#3067)
* fix: separate tab for activity on run detail

* fix: output payload bug

* fix: couple more uuid bugs

* fix: set var

* fix: add event type check
2026-02-22 19:02:22 -08:00
matt
e2e41243bb refactor: don't need isNewInvocation anymore! (#3072) 2026-02-21 07:35:37 -08:00
matt
e85d05adfe Fix: Correctly create log files, reject events from non-current invocations (#3071)
* fix: reject non-current invocations

* fix: log file inserts

* fix: use `EXCLUDED`

* fix: default branch

* fix: update

* fix: comment
2026-02-20 23:07:42 -05:00
matt
6f3f6e08ac Feat: Replay as new (or from a node) (#3055)
* feat: new messages for reset

* chore: gen python

* feat: reset scaffolding

* feat: initial work

* feat: initial e2e wiring of resetting from a specific node

* fix: add branch to pk

* fix: wire up branches

* fix: add branch to awaited entry

* feat: start wiring up reset api

* fix: colname

* fix: add branch id more places

* fix: some bugs

* fix: replay

* fix: replay, simplify

* feat: add parent branch id

* fix: start reworking parent nodes and branches

* fix: parent branch wiring

* fix: start fixing some bugs

* fix: parent branch bug

* fix: advisory lock for locking the log file to prevent concurrent modification

* fix: move claude.md ignore path

* fix: remove eager replays of events

* fix: rm cruft

* fix: cleanup more params and such

* fix: return type

* fix: comment

* fix: comments

* fix: comment

* chore: gen

* chore: gen

* fix: decrease sleep time

* chore: gen again

* fix: add invocation count on event log entries, make it int32, fix toInt

* fix: more wiring

* chore: gen, simplify

* fix: lint

* fix: more zero values, I hate Go

* feat: add `is_durable` to v1_task

* feat: initial work wiring up dispatcher to increment log entry invocation counts

* feat: wire up assigned action

* fix: property

* fix: send is durable through to the engine

* fix: more invoc count wiring

* fix: node resetting

* fix:revert

* fix: import

* chore: gen

* fix: reset -> fork

* fix: rm a bunch of dead code

* fix: api

* fix: repo method

* fix: log file locking using `FOR UPDATE` + atomic compare-and-set update

* fix: move to shared repo

* feat: increment invocation count on the scheduler

* fix: naming

* fix: make test more reliable

* fix: props

* fix: node id reset
2026-02-20 13:01:46 -05:00
mrkaye97
f8e787cd89 Merge branch 'main' into feat-durable-execution 2026-02-19 19:35:40 -05:00
matt
7e3e3b8fc0 Feat: Non-determinism errors (#3041)
* fix: retrieve payloads in bulk

* fix: hash -> idempotency key

* feat: initial hashing work

* feat: check idempotency key if entry exists

* fix: panic

* feat: initial work on custom error for non-determinism

* fix: handle nondeterminism error properly

* feat: add error response, pub message to task controller

* chore: lint

* feat: add node id field to error proto

* chore: rm a bunch of unhelpful cancellation logs

* fix: conflict issues

* fix: rm another log

* fix: send node id properly

* fix: improve what we hash

* fix: improve error handling

* fix: python issues

* fix: don't hash or group id

* fix: rm print

* feat: add python test

* fix: add timeout

* fix: improve handling of non determinism error

* fix: propagate node id through

* fix: types, test

* fix: make serializable

* fix: no need to cancel internally anymore

* fix: hide another internal log

* fix: add link to docs

* fix: copilot

* fix: use sha256

* fix: test cleanup

* fix: add error type enum

* fix: handle exceptions on the worker

* fix: clean up a bunch of cursor imports

* fix: cursor docstring formatting

* fix: simplify idempotency key func

* fix: add back cancellation logs

* feat: tests for idempotency keys

* fix: add a couple more for priority and metadata

* chore: gen

* fix: python reconnect

* fix: noisy error

* fix: improve log

* fix: don't run durable listener if no durable tasks are registered

* fix: non-null idempotency keys
2026-02-18 11:27:02 -05:00
abelanger5
73ef4747e7 feat: new search bar component (#2909)
* fix: compute payload size correctly for pg_notify

* refactor: pull search bar into its own component

* just use tab for autocomplete

* fix: log line typing

* Refactor Search Bar (#2964)

* Add empty search state

* V1 table layout logviewer

* Add temp hatchet-worker for testing

* Fix log css grid when expanded

* undo search notfound logic, needs API logic

* Rework workflow example

* use correct info color

* better table headers

* Add back ansi formatting

* Allow enter along with tab to traverse chips

* remove tutorial

* Add syntax color to search chips

* styling progress

* styling progress

* constrain width

* Add rel time

* Readd flag conditional

* remove hatchet-worker, feature flag, and cypress test

* remove tenant hook

---------

Co-authored-by: Alexander Belanger <alexander@hatchet.run>

* fix: remove ansi-to-html, review feedback

---------

Co-authored-by: Sebastian Graz <graz@live.se>
2026-02-17 20:47:20 -08:00
matt
eaf6bba824 Refactor: Remove separate callback table (#3045)
* fix: remove callback table

* fix: type

* fix: type

* fix: wiring everything up

* fix: result payload for replays

* chore: lint

* feat: set fillfactor

* chore: gen

* fix: simplify v1 match changes

* fix: simplify v1 match wiring

* fix: rm print line

* fix: some more wiring

* fix: wiring

* chore: comments

* chore: gen, proto naming

* chore: comments

* fix: rm comment

* fix: broken listener
2026-02-17 13:25:08 -05:00