Repository navigation
feat(chat): a light travels round the message box while LevelCode works - #116
Merged
Merged
Conversation
Like the border beam in VS Code's own chat: while a run is busy (thinking, writing, running a command, checking its edits, or a message on its way) a short bright arc circles the message box over a faint whole ring, in the theme's progress colour. While the run waits on the person (a command to approve, a question to answer) it stops and dims to a thin ring with no glow, so a paused run does not look busy. Idle, there is nothing. Reduced motion draws a still ring; high contrast draws none. How: two pseudo-elements on #composer, masked to a band on its edge so the box's inside and its clicks are untouched, turned by one typed @Property angle. syncAura() picks off / working / waiting from busy() and agentParked(); setStreaming and syncSendBtn call it, and a MutationObserver on the transcript catches an approval card or a question appearing or being answered. One turn takes 1.6-3 s, set from the box's size when the light starts and growing slower than the box, so a wide panel stays calm. Setting: levelcode.ai.chat.workingAura (boolean, application scope, on by default), sent with both config messages. The browser edition shows it too: it uses the same chat page, and the rings inherit the skin's 24px corners. Tested: test/workingAura.test.js lifts auraState, auraDuration and syncAura from chat.html and runs them (the states, the speed's bounds, the switching, the setting turned on mid-run, no throw before layout), and pins the CSS and the wiring from source; each of 30 one-edit mutations fails it. planProgressUi.test.js's lifted syncSendBtn gets a syncAura stub.
scripts/working-aura-editor-check.js runs the dev build with this extension and a stand-in provider that holds each turn open, and checks in the chat webview: working (the class, both rings shown, the animation running, the angle moving, a turn of 1.6-3 s), idle, waiting on an approval card (still, no glow), after the approval, reduced motion (no animation), the setting off (no light), and no page exceptions. It saves screenshots; --theme picks a colour theme. Ran on macOS: 9/9 in the default dark theme and in LevelCode One Light.
ndemianc
marked this pull request as ready for review
October 20, 2026 03:34
Contributor
There was a problem hiding this comment.
Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.
An organization owner can choose the repository organization as the billing source for reviews requested by members with a paid Copilot license. Learn about Copilot code review billing.
This was referenced Oct 20, 2026
Merged
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What it does
While LevelCode works, a light travels round the message box, like the border beam in VS Code's own chat (Copilot).
One turn takes 1.6–3 s, set from the box's size when the light starts. It grows slower than the box, so a wide panel stays calm; most boxes wider than ~450px get 3 s.
Setting:
levelcode.ai.chat.workingAura: boolean, on by default, application scope, so a folder's settings cannot switch it (#113's policy).The browser edition gets it too: it uses the same chat page, and the rings inherit the skin's 24px corners.
How
media/chat.html: two pseudo-elements on#composer, masked to a band on its edge (mask-composite: exclude) so the box's inside and its clicks are untouched.::afteris the sharp line,::beforethe blurred glow; both turn on one typed@property --aura-angle.syncAura()picks off / working / waiting frombusy()andagentParked().setStreamingandsyncSendBtncall it, and aMutationObserveron the transcript catches an approval card or question appearing or being answered, so no card has to remember to tell it.var, notlet:syncSendBtncan reach it before its line has run.extension.js: the setting is sent with bothconfigmessages (gateway and your own key).Tested
test/workingAura.test.js(13): liftsauraState,auraDurationandsyncAurafrom chat.html and runs them (the states, the speed's bounds, the switching, the setting turned on mid-run, no throw before layout); pins the CSS and wiring from source. Each of 30 one-edit mutations fails it.scripts/test-extensions.sh: 137 files pass on macOS, Node 24.tsc --checkJson extension.js: the same 28 errors as develop's copy, none new. 0 in the new test and script.scripts/working-aura-editor-check.js, dev build + a stand-in provider): 9/9 in the default dark theme and in LevelCode One Light: working, idle, waiting on an approval card, after approval, reduced motion, setting off, no page exceptions.web/ai-extension/skin.jsapplied and the web-dark / web-light colours, in headless Chrome: 12/12 (lights up, follows the 24px corners, moves, clears at the end of the run, no page errors).web/test/unit/skin.test.jspasses.Not run
e2e-look.mjs); the skin check above renders the page the way the build skins it, not the built bundle.