Releases: tmarkovski/dbos-argus
v0.0.28
Tested against DBOS 2.23.0 — see
tested_dbos_versioninGET /versionanddbos-argus --version. Argus tracks the latest DBOS schema and does not aim for backward compatibility; the dependency floor is nowdbos>=2.23.0. Pointing Argus at an older DBOS database whosedbos.workflow_statuslackscompleted_atwill error on the workflow list / detail reads.
Added
- Workflow completion time. DBOS 2.23.0 added
dbos.workflow_status.completed_at,
the canonical wall-clock timestamp for when a workflow reached a terminal
state. Argus now reads it: it appears ascompleted_aton the workflow
list and detail API/realtime payloads, and the workflow detail pane shows
a Completed row and computes the workflow Duration from
started_at → completed_at(falling back toupdated_atwhile still
running). Null for workflows that haven't finished.
Changed
- Schema snapshot regenerated against DBOS 2.23.0 (closes the
dbos-watch
drift issue).workflow_status.completed_atis now argus-tracked. - Bumped the
dbosdependency floor to>=2.23.0to align Argus with the
DBOS release that introducedcompleted_at.
v0.0.27
Tested against DBOS 2.21.0 — see
tested_dbos_versioninGET /versionanddbos-argus --version. Other DBOS versions may still work; the in-app connection indicator surfaces any schema mismatches.
Added
- New top-level Queues page surfacing the persisted DBOS queue registry
(dbos.queues, added in DBOS 2.21). Shows each queue's concurrency,
worker concurrency, rate limit, priority/partition flags, and last-updated
timestamp. Empty / never-used queues now appear here even before any
workflow has been enqueued onto them. Each row links to the existing
workflows view filtered by queue name. - Queues page now shows live
EnqueuedandRunningcounts per queue,
joined fromworkflow_statusagainst the queue name in a single
aggregate query. Each non-zero count links straight to the workflows
list filtered by queue + status. - New
GET /api/queuesREST endpoint and matchingqueuesrealtime
channel — same payload shape on both transports. - Sidebar connection footer now reports the actual backend (PostgreSQL or
SQLite) plus its server version, replacing the previous hard-coded
"Read-only DBOS Postgres" label./healthzand thehealthrealtime
channel both expose the newdatabase_dialectanddatabase_version
fields. - Dashboard top-queues card replaces the old "DBOS queue registry"
tile: shows the top three queues byenqueued + runningas horizontal
bars (chart-3 / chart-2 / chart-1 fills against a track that adapts to
the active theme), each linking to the workflows list filtered by that
queue plus the ENQUEUED + PENDING statuses. Inactive queues stay in
the list with zero-width fills so the card doesn't collapse on quiet
databases. The registered-queue total moved to the layers badge in
the top-right corner.
Changed
- Schema snapshot regenerated against DBOS 2.21.0.
dbos.queuesis now
argus-tracked across all 11 columns;workflow_status.rate_limitedis
recorded as untracked (it's DBOS-internal accounting, not a user-facing
signal — every workflow run from a rate-limited queue gets the flag set,
not just throttled ones). - Dashboard KPI cards are now click-through: an absolutely-positioned
anchor stretches over each card so the entire surface routes to the
relevant page (/workflows/,/notifications/,/schedules/,
/queues/), with internal anchors (per-status badges, the
failed-recent link, per-queue bars) lifted above viarelative z-10
so deep links still reach the right filtered view. Cursor is
pointerover the whole card and a hover shadow + ring strengthens
the affordance. - Sidebar wrapper now darker than the inset surface in both themes
— the preset's--sidebartoken sat at ~white in light mode and was
lighter than the inset in dark mode, so the rounded inset panel had
no visible frame in either theme. Override pulls light-mode sidebar
tooklch(0.94)(vs1.0background) and dark-mode sidebar to
oklch(0.10)(vs0.145background) so the inset reads as a lifted
panel against a darker frame.
v0.0.26
Tested against DBOS 2.19.0 — see
tested_dbos_versioninGET /versionanddbos-argus --version. Other DBOS versions may still work; the in-app connection indicator surfaces any schema mismatches.
Added
- Result pane: lightweight, dependency-free JSON syntax highlighter
(JsonView). TriesJSON.parsefirst; on success, tokenizes via the
classic Crockford regex and colors keys / strings / numbers / booleans /
null using existing theme tokens (keys use--workflow-accentso they
brighten against dark muted surfaces, the same treatment workflow-graph
child names already use). Falls back to escaped plain text when the
payload isn't parseable JSON (raw base64, malformed strings) so the
box still renders the value.
Changed
- Result pane (output dialog): the bordered code box itself is now the
scroll container instead of the wrapper around it. Wrapper switched
to aflex flex-colslot and the box getsmin-h-0 flex-1 overflow-auto, so the border stays pinned at the dialog's bounds
while long JSON scrolls inside. - Result pane (side panel): output box capped at
max-h-[70vh]with
min-h-64. Long JSON now scrolls within the box up to ~70% of the
viewport instead of stretching the side pane down to match the
payload, while keeping a sensible minimum so the box stays usable
when metadata above it grows or the window shrinks.
v0.0.25
Tested against DBOS 2.19.0 — see
tested_dbos_versioninGET /versionanddbos-argus --version. Other DBOS versions may still work; the in-app connection indicator surfaces any schema mismatches.
Fixed
- Pickle decoder now survives REDUCE-path calls to unknown classes
(e.g. a timezone-awaredatetimewhosetzinforeduces to
datetime.timezone(timedelta(0))). Previously the opaque proxy
rejected positional args from REDUCE and aborted the entire decode
withTypeError: ...timedelta() takes no arguments, leaving real
step outputs as a raw base64 blob in the UI. - Allowlisted common stdlib value types —
datetime.{datetime,date,time, timedelta,timezone},decimal.Decimal,uuid.UUID— so they decode
to native Python and the JSON encoder renders them as ISO 8601 strings
/ decimal strings instead of opaque dicts.
v0.0.24
Tested against DBOS 2.19.0 — see
tested_dbos_versioninGET /versionanddbos-argus --version. Other DBOS versions may still work; the in-app connection indicator surfaces any schema mismatches.
Changed
- Pickle decoder now renders unknown classes (Pydantic
BaseModel,
dataclasses, plain Python objects) as{"__class__": "module.Name", ...fields}instead of falling back to the raw base64 blob. The
unpickler swaps unknown classes for an inert_OpaqueObjectproxy that
captures BUILD state via__setstate__— the user's module is never
imported and no user code runs, so the existing safety guarantee
holds (covered by a regression test that constructs a pickle stream
resolvingos.systemand verifies it doesn't execute). Pydantic v2's
envelope state (__pydantic_fields_set__/__pydantic_extra__/
__pydantic_private__) is stripped so the UI sees just the model's
real fields. - README:
uvx dbos-argusexamples now usedbos-argus@latestso each
invocation re-resolves the version instead of reusing the wheeluvx
cached the first time.
v0.0.23
Tested against DBOS 2.19.0 — see
tested_dbos_versioninGET /versionanddbos-argus --version. Other DBOS versions may still work; the in-app connection indicator surfaces any schema mismatches.
Fixed
- Bundled console no longer hits a
403 Forbiddenon the/wsupgrade.
ARGUS_CORS_ORIGINSnow defaults to*instead of the Vite dev port,
so the SPA served by FastAPI works on any listen port (and any custom
Vite dev port works without extra config). Argus is an unauthenticated
read-only dev tool typically bound to localhost — operators who expose
it more widely should narrowARGUS_CORS_ORIGINSto their console
origin(s).
Changed
- README: documented SQLite as a first-class backend alongside Postgres,
withuvx/pipx/ Docker examples for both, the four-slash absolute
path convention forsqlite://URLs, and an updated architecture
diagram showing the dual-backend store.
v0.0.22
Tested against DBOS 2.19.0 — see
tested_dbos_versioninGET /versionanddbos-argus --version. Other DBOS versions may still work; the in-app connection indicator surfaces any schema mismatches.
Changed
- Default preset switched to
b5TiUdXFtA(violet primary, neutral charts,
Inter sans + Roboto Slab heading) viapnpm --filter console theme:sync.
Favicon set (svg + 16/32 + apple-touch) recolored from the prior teal
#00786fto violet#6d28d9to match the new--primary. - Workflow detail flow: step pills lost their gray fill in favor of a
transparent rounded-full border. Hover gets a faintbg-muted/40tint;
selected state swaps to aborder-primaryoutline with abg-primary/5
inset. Workflow containers lost their drop shadows in all three states
(selected / current / default) — the borders alone carry the structure
now that the step layer is quieter. - Workflow detail flow, awaited and spawn rows: the directional arrow
(←forDBOS.getResult,→for child spawn) moved out of the step
body and onto the duration line on the right, so it visually anchors
at the same edge of the pill as the spawn / return xyflow handles.
Awaited rows dropped the literal "result" prefix; both rows show the
cross-workflow target name in the body slot, and child rows resolve
the spawned workflow's display name via family lookup (paralleling
the existing awaited-name resolution). - Workflow detail side pane: title bar now reads "Workflow details" /
"Step #N details" (was "... result") since the pane carries metadata- events alongside the result. New collapse toggle in the eyebrow
(PanelRightClose/PanelRightOpenvia the sameicon-smghost
Button as the layout's sidebar trigger and theme switcher) hides the
body and animates the pane width down to a 64px peek. The resize
handle stays in place; grabbing it while collapsed pulls the pane
out of the peek under the cursor instead of jumping to the saved
expanded width, and releasing below the usable minimum snaps back
to collapsed.
- events alongside the result. New collapse toggle in the eyebrow
v0.0.21
Tested against DBOS 2.19.0 — see
tested_dbos_versioninGET /versionanddbos-argus --version. Other DBOS versions may still work; the in-app connection indicator surfaces any schema mismatches.
Added
- SQLite backend support via the new
ArgusDBadapter split. Point
ARGUS_DATABASE_URLatsqlite+aiosqlite:///path/to/argus.dband
the entire stack (REST + realtime) works against the DBOS app's
SQLite store. CI matrix runs the test suite against both backends. - Realtime (WebSocket) layer at
/wsreplaces per-page polling. One
multiplexed socket carries every page's subscriptions; server-side
pollers gate heavier snapshots behind a cheap cursor query and shut
down when the last subscriber disconnects. Channels:health,
stats,stats.timeseries,workflows,workflow,schedules,
notifications— each emits the same JSON shape as its REST
counterpart, which remains authoritative for curl/debug. Cursor
queries are implemented per-dialect onArgusDBso the layer works
unchanged on both Postgres and SQLite. Configurable via
ARGUS_REALTIME_ENABLED,ARGUS_REALTIME_INTERVAL_MS,
ARGUS_REALTIME_HEALTH_INTERVAL_MS, and
ARGUS_REALTIME_MAX_SUBS_PER_CONN. - Live workflow detail page: subscribing to
workflowwith{id}
re-snapshots every tick so steps appear as they complete.
Changed
- Connection indicator now reflects WebSocket health (with a 1Hz
poll surfacing disconnects as a stickyfetchError) instead of
per-pagesetInterval(5000)/healthzfetches. While diagnostics
report issues (e.g. dbos schema absent), the indicator re-polls
/api/sql-diagnosticsevery 5s so it converges automatically once
the DBOS app provisions its tables — no hard refresh needed. - Hub suppresses
updatebroadcasts when a fresh snapshot is
byte-identical to the cached one. Cursor-less channels (workflow,
health) re-snapshot every tick; the dedupe keeps the wire quiet
and prevents xyflow edge-dash animations on the workflow detail
page from restarting on every poll.
Fixed
- Workflow flow renders the container header (name + ID) for
freshly-spawned workflows that have no steps yet — ELK was
collapsing empty containers to ~0×0, leaving only the status
badge visible until the first step landed.
v0.0.20
Tested against DBOS 2.19.0 — see
tested_dbos_versioninGET /versionanddbos-argus --version. Other DBOS versions may still work; the in-app connection indicator surfaces any schema mismatches.
Note: v0.0.19 was published to PyPI but the docker/release jobs
in the release pipeline failed —pip install dbos-argus==0.0.19
inside the Dockerfile raced PyPI's CDN propagation on the arm64
runner and died with "No matching distribution found", which then
cancelled the rest of the matrix. v0.0.20 carries the same intended
changes plus the pipeline fix, so the Docker image and GitHub
Release exist for this tag.
Fixed
- Release pipeline: each
docker-buildarch now polls PyPI's simple
index for the freshly published version (viapip download --no-deps,
60 attempts × 5s) before invoking buildx, so a wheel that hasn't yet
propagated to every Fastly edge can no longer race the in-Dockerfile
pip install.
v0.0.18
Tested against DBOS 2.19.0 — see
tested_dbos_versioninGET /versionanddbos-argus --version. Other DBOS versions may still work; the in-app connection indicator surfaces any schema mismatches.
Changed
- Workflow detail flow: child-step Workflow icon, child step name,
awaited-name inresult ← <child>, and the spawn / default-return
edges all moved off--chart-3and onto a new
--workflow-accenttoken. The token tracks--primaryin light
mode, and in dark mode lifts L to0.82and bumps chroma by
+0.06via relative-color syntax (oklch(from var(--primary) ...))
so presets that pick a deep primary (current teal is L=0.437)
still read as a clear accent against the dark card. Error /
cancelled return edges keep their--status-error/
--status-warningstrokes. - Workflow detail flow: ambient gradient gained a third point at
bottom-left (--color-chart-2, 12% mix), so the canvas reads as
a balanced three-corner wash instead of a single diagonal sweep.