Cut group sessions, camera, and the browser panel #9
Labels
No labels
needs-info
needs-triage
ready-for-agent
ready-for-human
v2
wayfinder:grilling
wayfinder:map
wayfinder:prototype
wayfinder:research
wayfinder:task
wayfinder:ticket
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
aiko/denpa#9
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
What to build
Remove the three surfaces the redesign drops, before anything is built on top of them.
Group / multi-user sessions. Half-finished upstream (
invite-dialog.tsxanduse-invite-dialog.tsare empty files) and the receiver metaphor is single-listener by design. RemoveGroupContext, the group drawer, the entry point, and thegroup.*i18n keys. Keep thename/avatarfields on AI messages — they identify the character, not a group member.Camera. Removed entirely, context and all.
Browser panel. Removed entirely.
Screen capture stays in the tree, unwired — it is reworked into a grant in #21, not deleted here. (An earlier edit of this issue said to delete it, on the basis that #21 was permanently cut. #21 is reopened: Hermes does support image input, just not on the
/v1/runsendpoint the bridge uses.)Design reference:
docs/design/denpa-receiver/README.md(card ids1a,4a… index intoDenpa Receiver.dc.html, openable in a browser).Acceptance criteria
GroupContext, group drawer, or group entry point remains;group.*i18n keys gonename/avataron AI messages still worknpm run typecheck,npm run lintand the test suite passBlocked by
None - can start immediately
Screen-capture scope changed under this issue
This issue says "Screen capture stays in the tree for now — it is reworked into a grant in a later slice, not deleted here." That later slice was #21 (画面共有), which has since been cut:
HermesAgent.chat()builds its prompt frominput_data.textsonly and never readsinput_data.images, so a captured frame has nowhere to go and nothing can request one.#21's closing note says the removal "makes that removal total rather than partial" — i.e. it expects this issue to take the screen-capture code with the camera and browser panel, not preserve it for a rework that is no longer coming.
Worth confirming which you want before this is picked up, because the two issues currently point in opposite directions:
Either is defensible; the drift is that both are currently written down.
Reverting the screen-capture instruction — keep it parked
My earlier comment and body edit said to delete the screen-capture path along with the camera and browser panel, following #21's "total rather than partial" note. #21 is reopened, so that no longer holds: the blocker was misidentified as "Hermes has no image support" when Hermes does have it, on
/v1/chat/completionsrather than the/v1/runsendpoint the bridge uses (api_server.py:471-547vs:6084+).Back to this issue as originally written: camera and browser panel are removed entirely; screen capture stays in the tree, unwired, for the grant rework in #21.
Apologies for the churn — the direction changed twice in one session. This is the settled version, and it matches what the issue said before I touched it.
Screen capture: keep it, and now for a positive reason
Small correction to the reference in this issue. It says screen capture stays in the tree for the grant rework in #21 - #21 is now closed and refiled as #31, which is unblocked: under ADR-0001 a captured frame is a
MessageType.PHOTOMessageEvent that Hermes routes through its own vision pipeline.So the capture path is not parked speculatively any more; it is about to be used. Camera and browser panel still go, entirely.
Landed on
issue/denpa-9-cut-group-camera-browserDeletion only, 187 insertions / 1195 deletions across 26 files.
npm testis 207 passed in 23 files (main was 200 in 22).npm run typecheckstill reports exactly 585 errors, the same number asmain, and none of them are in a file this branch touched.Files deleted outright
context/group-context.tsx,context/camera-context.tsx,context/browser-context.tsx,components/sidebar/group-drawer.tsx,components/sidebar/invite-dialog.tsx(was empty),components/sidebar/camera-panel.tsx,components/sidebar/browser-panel.tsx,hooks/sidebar/use-group-drawer.tsx,hooks/sidebar/use-invite-dialog.ts(was empty),hooks/sidebar/use-camera-panel.ts.Consumers followed
App.tsx—GroupProvider,CameraProviderandBrowserProviderunmounted; nothing is left wrapping an empty subtree.ScreenCaptureProvideris now the outermost provider.websocket-handler.tsx—group-updateandgroup-operation-resultcases gone, thebrowser_viewbranch insidetool_call_statusgone,setSelfUidcall gone, dep array trimmed.websocket-service.tsx—members,is_owner,client_uidand the wholebrowser_viewshape dropped fromMessageEvent.background.tsx/bgurl-context.tsx/use-general-settings.ts/general.tsx— the camera-background path, including the 設定 toggle, is gone; the background image select is now unconditional.use-media-capture.tsx— keeps the screen path, loses the camera one.ImageData.sourceis now'screen'only.bottom-tab.tsx— 画面 is the only remaining tab.sidebar.tsx— theFiUsersgroup entry point is gone.sidebarStyles.cameraPanel,sidebarStyles.browserPanel,sidebarStyles.groupDrawer,canvasStyles.background.video.CLAUDE.mdno longer listsGroupContextas a core context provider or group sessions as a feature.i18n
group.*gone from bothenandzh, plussidebar.camera,sidebar.browser,sidebar.browserSession,sidebar.noBrowserSession,footer.cameraControl,footer.cameraStopping,settings.general.useCameraBackground,error.cameraApiNotSupported,error.noCameraFound,error.failedStartCamera,error.failedStartBackgroundCamera,error.enterValidUuid. A repo-wide grep for every one of those keys and symbols returns nothing outside the guard test.Tests
Added, none fixed, none deleted. No test on
maincovered group, camera or the browser panel, so there was nothing to fix or remove — the 200 that were green before are the same 200, untouched.New:
src/renderer/src/cut-surfaces.test.ts, 7 cases in the source-scanning stylechrome-is-mounted.test.tsalready uses. It walks the renderer tree and fails if any of the three creeps back — a re-added provider, hook or panel; a re-addedgroup-update/add-client-to-group/browser_viewon the wire; a re-added i18n key. Watched it fail 4/7 before the deletion and pass 7/7 after. The three that passed from the start are the survivor assertions, which is the point: screen capture still in the tree (screen-capture-context,screen-panel,use-capture-screen, anduseMediaCapturestill reaching for the screen stream), 画面 still the tab, andname/avatarstill flowing fromMessageEventthroughappendAIMessageto the log rail.Followed the third comment here, not the first: screen capture is kept, for #31.
Assumed / left out
Two entries in the ledger. Short version:
client_uidwas dropped from the wire becauseGroupContext.setSelfUidwas its only consumer; andsidebar.tsx,bottom-tab.tsx,screen-panel.tsx,background.tsxandfooter.tsxare all unreferenced fromApp.tsxsince the receiver chrome landed, but I left the files in place and only cleaned the group/camera/browser references inside them — deleting the whole upstream layout is the chrome owner's call, not this issue's.Not verified: I cannot run the app or look at rendered output, so "app still builds and connects" rests on the typecheck delta and the suite, not on a launch.
Branch:
issue/denpa-9-cut-group-camera-browser(pushed, not merged, no PR).What changed
Deleted outright:
context/group-context.tsx,context/camera-context.tsx,context/browser-context.tsx,components/sidebar/group-drawer.tsx,components/sidebar/camera-panel.tsx,components/sidebar/browser-panel.tsx,hooks/sidebar/use-group-drawer.tsx,hooks/sidebar/use-camera-panel.ts, plus two already-empty files (components/sidebar/invite-dialog.tsx,hooks/sidebar/use-invite-dialog.ts).Edited to remove references:
App.tsx(unmounted GroupProvider / CameraProvider / BrowserProvider),services/websocket-handler.tsx(droppedgroup-update,group-operation-result, thebrowser_viewbranch,setSelfUid),services/websocket-service.tsx(droppedmembers,is_owner,client_uid,browser_viewfromMessageEvent),components/canvas/background.tsx(camera-background branch),components/canvas/canvas-styles.tsx(deadbackground.video),context/bgurl-context.tsx(useCameraBackground),hooks/sidebar/setting/use-general-settings.ts(handleCameraToggleand the camera setting),components/sidebar/setting/general.tsx(camera switch gone, background fields now unconditional),hooks/utils/use-media-capture.tsx(camera path removed, screen path kept),components/sidebar/bottom-tab.tsx(screen is the only tab),components/sidebar/sidebar.tsx(group entry point),components/sidebar/sidebar-styles.tsx(cameraPanel,browserPanel,groupDrawerblocks), bothlocales/{en,zh}/translation.json, andCLAUDE.md(it claimed GroupContext and group sessions as core, which the issue flagged).Also cut during review follow-up, in
hooks/utils/use-audio-task.ts: theaudio-play-startsendMessageblock and the deadspeaker_uidfield, plusforwardedfromMessageEventandforwarded: message.forwarded || falsein the handler. That message existed only so the server could echo a speaking turn to other group members. Verified against the go-between rather than assumed:src/open_llm_vtuber/websocket_handler.py:303-308has no handler for it and only whitelistsfrontend-playback-completefrom the unknown-type warning, andprepare_audio_payload(utils/stream_audio.py:31,63,83) defaultsforwarded: bool = Falsewith no caller passingTrue, so the client'sif (!forwarded)guard was always true — one unhandled message and one server warning per utterance.Tests
One new file,
src/renderer/src/cut-surfaces.test.ts— a guard test, not behaviour coverage. It asserts by repo-wide grep that the removed symbols, the removed wire message types (group-update,group-operation-result,browser_view,audio-play-start,speaker_uid,forwarded) and the removed i18n keys do not reappear anywhere outside the test itself, and that the deleted files stay deleted. It also pinsname/avataron AI messages as present, since those sat next to the group fields and should not have gone with them. The wire assertions were confirmed red before the deletions: that block reported the 5 expected hits (use-audio-task.tsx3,websocket-handler.tsx,websocket-service.tsx), then green after.Main's baseline was 200 in 22 files. No test was deleted and none needed fixing — nothing in the existing suite touched the removed surfaces.
Typecheck:
npm run typecheckreports exactly 585 errors, the documentedmaincount. The only error in a file this branch touched ishooks/utils/use-audio-task.ts(18,6)TS6196 (Live2DModeldeclared but never used), verified byte-identical on the stashed pre-change tree.npm run lintwas not run — pre-existing breakage per the brief, out of scope.Deliberately left out
Screen capture in full:
screen-capture-context.tsx,screen-panel.tsx,use-capture-screen.ts, and the screen branch ofuse-media-capture.tsx. The third and latest comment on this issue (07/30 00:04) settles that it stays, for #31 under ADR-0001 as aMessageType.PHOTOMessageEvent. The first two comments say otherwise; I followed the latest.Also left standing:
sidebar.tsx,bottom-tab.tsx,screen-panel.tsx,background.tsxandfooter.tsxare all unreferenced fromApp.tsxsince the receiver chrome landed. Deleting the whole upstream layout is the chrome owner's call, so I only cleaned the group/camera/browser references inside them. The 585 typecheck errors were not touched.Not verified
I could not launch the app, so "still builds and connects" is unobserved — no
tauri dev, nodev:web, no rendered output, no websocket against a live go-between. The evidence is indirect: the typecheck count is identical to main's with nothing new in any touched file, so no removal left a dangling import or broken type, and a repo-wide grep for every removed symbol, message type and i18n key comes back empty outside the guard test. What that cannot catch is a runtime-only regression — a ChakraTabs.Rootwith a single child behaving differently now, or a translation lookup built from a runtime-assembled key rather than a literal. I also cannot see the rendered 設定 panel, so I cannot confirm the background-image select and custom-URL field look right now that the!useCameraBackgroundwrapper around them is gone.Assumptions
client_uidon the wire existed only to feed GroupContext'sselfUid, so it went out withmembersandis_owner. If the go-between wants to hand a client its own connection id for some non-group reason, the field has to come back.error.enterValidUuidwas only ever the group-invite validation message, so it went with the group keys.sidebarStyles.cameraPanel/browserPanel/groupDrawer,canvasStyles.background.video) counts as part of the deletion, not unrelated cleanup — each existed solely for a deleted component.CLAUDE.md's claim that GroupContext is a core context provider is in scope, since the issue named that listing.All of the above are in
.denpa-work/QUESTIONS.md.Review findings
Two findings, both addressed, none skipped. The major one was the surviving
audio-play-startemitter described above — a half-removed subsystem with a live emitter, correctly caught. The minor one wassidebar.live, orphaned in both locales oncecamera-panel.tsx'sLiveIndicatorwent (screen-panel's indicator usessidebar.screen); removed from both bundles and added to the guard test.One out-of-band incident worth flagging because it is not visible in the diff:
git worktree remove --forceon the stale #9 worktree followed itsnode_modulesjunction and emptieddenpa-client/node_modules, which is the shared target for the sibling worktrees too. Restored withnpm ciin the main checkout (547 packages) and the suite is green on the restored tree, but if another agent hit a missing-module failure in that window, that is why. Noted in the ledger so the next teardown removes the junction first.Shipped. Merged to
mainat19bf953(phase B3 — remaining ungated).Closed as part of reconciling the board with
main: the autonomous run's policy was not to auto-close, so shipped work stayed open and the tracker read as though nothing had landed. That policy is now reversed — issues close when they land.