Skip to content

Console Activity: switch Workloads/Storage/Threads to server-side list behavior + filter bars + updated org switching #83

@rowan-stein

Description

@rowan-stein

User request

Update Console UI so Activity lists (Workloads / Storage / Threads) use server-side sort/filter/pagination and reflect updated authorization + cluster-admin org switching behavior.

Source spec: https://github.com/agynio/architecture/blob/main/changes/2026-04-24-activity-server-side-lists.md

Specification (architecture/product)

From:

  • changes/2026-04-24-activity-server-side-lists.md
  • product/console/console.md (Workloads, Storage, Threads, Resource Lists, Real-Time Updates)

Key requirements:

  • Replace client-side sorting/filtering/search with server-side list APIs.
  • Add filter bars (and search for Storage) per spec.
  • Deterministic cursor pagination (UI treats page_token as opaque; changing sort/filter/search resets paging).
  • Real-time updates:
    • On workload.updated / volume.updated, if any sort/filter/search is active, refetch the current page from server.
  • Auth / org switching:
    • Cluster admins can context switch across all orgs via Organizations.ListOrganizations.
    • Non-admin users should use Organizations.ListMyMemberships.

Work items

1) Update generated clients

  • After agynio/api changes land, update buf.lock / regenerate so console has:
    • Runners list envelope fields + name/attachment enrichment fields
    • Threads ListOrganizationThreads
    • Identity nickname batch lookup (if console needs it for any view)

2) Workloads Activity tab

  • Render the columns per spec (Agent name + link, Runner name + link, Thread ID, Status, Containers, Started, Duration).
  • Replace useListControls client-side search/sort with:
    • server-side sort + filter + pagination via runnersClient.listWorkloads
  • Implement the filter bar:
    • Agent multi-select (by name)
    • Runner multi-select (by name)
    • Status multi-select
    • Started date range
  • Ensure changing sort/filter resets pagination and refetches from the first page.

3) Storage Activity tab

  • Replace current client-side search/sort and per-volume attachment queries with server-side list behavior:
    • use runnersClient.listVolumes with filter/sort/page_token
    • use volume_name + attachments[] from the list response
  • Implement:
    • Search: case-insensitive substring match on volume name
    • Filters: Status, Runner, Attached-to kind (agent/mcp/hook/unattached)
    • Sortable columns: Name, Size, Status, Created
  • Render attachment column as: primary attachment name + “+N more”.

4) Threads Activity tab

  • Implement the org threads list view using threadsClient.listOrganizationThreads:
    • columns: ID (truncated), participants (@NickNames), message_count, status, created date
    • filters: status, participant, created range
    • sorts: created, updated, message_count, status
    • cursor pagination

5) Real-time update refetch rules

  • Update notifications subscription/invalidation logic so:
    • When any sort/filter/search is active on Workloads/Storage, workload.updated / volume.updated triggers a refetch of the current page (instead of patching local state).
    • With default (no active controls), keep existing in-place update behavior if still desired.

6) Cluster-admin org switching

  • Update org context selection logic:
    • Cluster admins: use Organizations.ListOrganizations
    • Non-admin users: use Organizations.ListMyMemberships
  • Ensure Activity pages (and any other org-scoped pages as needed) respect the selected org context.

Acceptance

  • Workloads/Storage/Threads Activity lists are fully server-driven for sort/filter/pagination (client does not sort/filter across pages).
  • UI does not display raw agent/runner/volume IDs when a server-provided name exists.
  • Real-time update behavior matches the spec.
  • Cluster admins can switch across all orgs; non-admins only see their memberships.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions