Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .claude/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"enabledPlugins": {
"frontend-design@claude-plugins-official": true
}
}
14 changes: 7 additions & 7 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ jobs:
steps:
- uses: actions/checkout@v6

- uses: dorny/paths-filter@v3
- uses: dorny/paths-filter@v4
id: filter
with:
filters: |
Expand Down Expand Up @@ -72,14 +72,14 @@ jobs:
otp-version: ${{ env.OTP_VERSION }}

- name: Restore dependencies cache
uses: actions/cache@v4
uses: actions/cache@v6
with:
path: durable/deps
key: ${{ runner.os }}-durable-mix-${{ hashFiles('durable/mix.lock') }}
restore-keys: ${{ runner.os }}-durable-mix-

- name: Restore build cache
uses: actions/cache@v4
uses: actions/cache@v6
with:
path: durable/_build
key: ${{ runner.os }}-durable-build-${{ env.OTP_VERSION }}-${{ env.ELIXIR_VERSION }}-${{ hashFiles('durable/mix.lock') }}
Expand Down Expand Up @@ -120,26 +120,26 @@ jobs:
otp-version: ${{ env.OTP_VERSION }}

- name: Set up pnpm
uses: pnpm/action-setup@v4
uses: pnpm/action-setup@v6
with:
version: 9

- name: Set up Node
uses: actions/setup-node@v4
uses: actions/setup-node@v6
with:
node-version: "20"
cache: pnpm
cache-dependency-path: durable_dashboard/assets/pnpm-lock.yaml

- name: Restore dependencies cache
uses: actions/cache@v4
uses: actions/cache@v6
with:
path: durable_dashboard/deps
key: ${{ runner.os }}-dashboard-mix-${{ hashFiles('durable_dashboard/mix.lock', 'durable/mix.lock') }}
restore-keys: ${{ runner.os }}-dashboard-mix-

- name: Restore build cache
uses: actions/cache@v4
uses: actions/cache@v6
with:
path: durable_dashboard/_build
key: ${{ runner.os }}-dashboard-build-${{ env.OTP_VERSION }}-${{ env.ELIXIR_VERSION }}-${{ hashFiles('durable_dashboard/mix.lock', 'durable/mix.lock') }}
Expand Down
9 changes: 5 additions & 4 deletions durable/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -544,13 +544,14 @@ The macro adds the dashboard's pipelines, asset routes, and live routes
in-place — no `forward`, no extra endpoint. You get:

- Overview with live status counts and recent executions
- Workflow list with filters, search, and pagination
- Workflow detail with summary, ReactFlow graph, topology, logs, I/O,
and child execution history
- Workflow catalog + an Executions list with a faceted filter bar (workflow,
status, time range, execution id) driven by shareable URL params
- Execution detail with Summary, ReactFlow graph, Timeline, Logs, I/O, and
History trace (plus a Family tab for parent/child runs)
- Pending inputs queue
- Schedules list with toggle / trigger actions
- Settings view
- ⌘K command palette
- ⌘K command palette — jump to any page, workflow, or recent run

See [`durable_dashboard/README.md`](durable_dashboard/) for the full
option list and design notes.
Expand Down
16 changes: 16 additions & 0 deletions durable/lib/durable/config.ex
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@ defmodule Durable.Config do
heartbeat_interval: pos_integer(),
scheduled_modules: [module()],
scheduler_interval: pos_integer(),
sleep_waker_interval: pos_integer(),
sleep_waker_batch_size: pos_integer(),
log_level: false | :debug | :info | :warning | :error,
pubsub: atom() | nil,
owns_pubsub?: boolean()
Expand All @@ -60,6 +62,8 @@ defmodule Durable.Config do
:heartbeat_interval,
:scheduled_modules,
:scheduler_interval,
:sleep_waker_interval,
:sleep_waker_batch_size,
:log_level,
:pubsub,
owns_pubsub?: false
Expand Down Expand Up @@ -111,6 +115,18 @@ defmodule Durable.Config do
default: 60_000,
doc: "Milliseconds between scheduler polls for due schedules"
],
sleep_waker_interval: [
type: :pos_integer,
default: 1_000,
doc:
"Milliseconds between sleep-waker sweeps that revive workflows " <>
"whose `sleep/1` or `schedule_at/1` wait has elapsed"
],
sleep_waker_batch_size: [
type: :pos_integer,
default: 100,
doc: "Maximum number of sleeping workflows to wake in a single sweep"
],
log_level: [
type: {:in, [false, :debug, :info, :warning, :error]},
default: false,
Expand Down
Loading