Skip to content

Render asynchronous operations with Rich Live and spinners#97

Merged
sodejm merged 1 commit into
mainfrom
feature/52-rich-live-progress
Jul 24, 2026
Merged

Render asynchronous operations with Rich Live and spinners#97
sodejm merged 1 commit into
mainfrom
feature/52-rich-live-progress

Conversation

@sodejm

@sodejm sodejm commented Jul 24, 2026

Copy link
Copy Markdown
Owner

Summary

  • publish validated, redacted progress events through the background job lifecycle
  • render concurrent jobs with prompt-safe Rich Live spinners and determinate progress bars
  • expose progress through jobs list / jobs show, add help jobs, and document the authoring and console contracts
  • preserve non-animated one-shot and JSON behavior

Validation

  • make test — 416 passed, 8 skipped
  • make lint
  • make typecheck
  • make security — dependency audit clean; Semgrep ran 1,102 rules with 0 findings
  • git diff --check

Fixes #52

- Publish validated, redacted job progress events.
- Render prompt-safe spinners and determinate bars.
- Document and test the interactive progress lifecycle.

Fixes #52
@sodejm
sodejm force-pushed the feature/52-rich-live-progress branch from 7b0c402 to 1f915e7 Compare July 24, 2026 01:53
@sodejm
sodejm merged commit 71abaf4 into main Jul 24, 2026
5 checks passed
@sodejm
sodejm deleted the feature/52-rich-live-progress branch July 24, 2026 01:55

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 7b0c402e5e

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

self._live.update(self._render(), refresh=True)
elif self._live is not None:
self._stop_live()
self.console.print(self._summary(snapshot))

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Route job progress away from JSON stdout

This final status is written to the same console that ReplApplication uses for normal stdout, so any background job that completes while a user is producing --json output can interleave a plain-text j000001 completed... line into the machine-readable stream. This also affects a background command submitted with --json, where the job response/result shares stdout with the progress summary; progress/status should go to stderr or be suppressed while JSON output is active.

Useful? React with 👍 / 👎.

normalized_keys,
)
except BaseException:
self._notify(snapshot)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Notify listeners after storing the future

The queued snapshot is published before _executor.submit() returns and before record.future is assigned, so a subscriber that reacts to the new queued event by calling wait(job_id) sees future is None and returns the still-queued snapshot immediately; cancel_queued() has the same race and reports JOB_ALREADY_RUNNING. This only affects consumers of the new listener API, but it makes queued notifications unsafe to act on; publish the queued event after the future has been stored.

Useful? React with 👍 / 👎.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Render asynchronous operations with Rich Live and spinners

1 participant