Skip to content

add call package from lattice - #100

Draft
chee wants to merge 25 commits into
mainfrom
call-package
Draft

chee wants to merge 25 commits into
mainfrom
call-package

Conversation

@chee

@chee chee commented Nov 13, 2026

Copy link
Copy Markdown
Member

No description provided.

chee and others added 12 commits November 13, 2026 00:54
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ge area)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@patchcrow

patchcrow commented Nov 13, 2026 •

Copy link
Copy Markdown
Collaborator

✅ Patchwork glance ready

https://patchwork-preview-100--patchwork-base.netlify.app

Patchwork from inkandswitch/patchwork.inkandswitch.com, packages from this PR at ed189f1.

build-info.json

chee and others added 3 commits November 13, 2026 01:34
The stage's area reached CallFloating and CallStage as the box itself, so
calling it threw once there was one. And choosing "in the sidebar" ran as
a getter, never reaching setFaces.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Lattice's settings (lattice-wm:call) can share the origin: faces put away or
"in the sidebar" there carried over. And tabs go by name, with the first
shown when nothing's chosen: "Call" came before Chat and Comments.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟡 Changes recommended

The camera fallback loads unverified CDN code with repository and account access, while incorrectly passed area accessors cause runtime exceptions that break floating faces and the stage.

11 open issues
1 file not reviewed
  • call/pnpm-lock.yaml: Generated file
What changed in this PR

Ports Lattice’s calling functionality into a standalone Patchwork package and connects it to threepane through runtime plugin IDs, without linking the tools at build time.

Changes:

  • Adds call controls, video views, floating faces, and supporting media and session utilities.
  • Integrates an optional call provider, sidebar controls, automatic video tab, and stage area into threepane.
  • Adds standalone build configuration and tests for call behavior and frame integration.
File Description
threepane/​src/​styles.css Supports fitted and hidden sidebar widgets.
threepane/​src/​PatchworkFrame.tsx Wraps the frame in the optional call provider.
threepane/​src/​datatypes.ts Defines runtime call component IDs.
threepane/​src/​components/​SidebarWidgets.tsx Adds the call control panel to the sidebar.
threepane/​src/​components/​SidebarWidgets.test.tsx Tests panel placement, visibility, and deduplication.
threepane/​src/​components/​DocumentAreaRoot.tsx Integrates video-tab opening and marks the stage area.
threepane/​src/​components/​CallVideoOpener.tsx Coordinates video demand with sidebar selection.
threepane/​src/​components/​CallVideoOpener.test.tsx Tests video-tab selection and subscriptions.
call/​vitest.config.js Configures browser-like call tests.
call/​vite.config.js Configures standalone bundling and CSS injection.
call/​test/​wiggle.test.js Tests waveform and border geometry.
call/​test/​video.test.js Tests call video rendering.
call/​test/​sizes.test.js Tests layouts, encoding limits, and speaking thresholds.
call/​test/​room.test.js Tests room normalization and title lookup.
call/​test/​provider.test.js Tests provider lifecycle and subscription behavior.
call/​test/​layer.test.js Tests questions, floating faces, and stage areas.
call/​test/​lasting.test.js Tests state shared across module reloads.
call/​test/​kept.test.js Tests stored settings and rejoin timing.
call/​test/​fake.js Provides fake repository and media fixtures.
call/​test/​faces.test.js Tests participant face lookup and rendering.
call/​test/​control-panel.test.js Tests sidebar controls and sizing.
call/​test/​channel.test.js Tests document signaling channels.
call/​test/​call.test.js Tests call sessions, presence, and rejoining.
call/​test/​button.test.js Tests titlebar call actions and subscriptions.
call/​src/​video.js Renders call participants in a sidebar view.
call/​src/​vendor/​deepfilternet/​LICENSE Includes the vendored denoiser’s MIT license.
call/​src/​vendor/​deepfilternet/​deepfilternet.js Provides DeepFilterNet worklet setup.
call/​src/​vendor/​deepfilternet/​deepfilternet-worklet-processor.js Runs vendored audio denoising in a worklet.
call/​src/​ui/​ui.js Implements faces, call prompts, floating views, and stage.
call/​src/​ui/​styles.css Styles call controls and video surfaces.
call/​src/​ui/​icons.js Provides call-specific SVG icons.
call/​src/​ui/​colour.js Assigns fallback participant colors.
call/​src/​ui/​avatar.js Converts avatar URLs for display.
call/​src/​ui/​arriving.js Tracks newly arriving participants for animation.
call/​src/​ui/​area.js Observes the frame’s designated stage bounds.
call/​src/​ui/​along.js Supports scrolling participant rows.
call/​src/​provider.js Tracks visible rooms and serves call subscriptions.
call/​src/​protocol.js Defines call state and subscription contracts.
call/​src/​protocol-names.js Exports shared call event names.
call/​src/​index.js Registers call components and the titlebar tool.
call/​src/​engine/​wiggle.js Calculates waveform-driven face borders.
call/​src/​engine/​speaking.js Detects speaking activity from audio streams.
call/​src/​engine/​sizes.js Selects layouts, video limits, and speaking thresholds.
call/​src/​engine/​room.js Normalizes room IDs and resolves document titles.
call/​src/​engine/​rejoin.js Records recent calls for reload recovery.
call/​src/​engine/​noise.js Downloads, caches, and applies optional noise suppression.
call/​src/​engine/​lasting.js Preserves live state across module replacements.
call/​src/​engine/​kept.js Safely reads and writes session storage.
call/​src/​engine/​face.js Detects faces and centers camera previews.
call/​src/​engine/​channel.js Uses document messages for call signaling.
call/​src/​control-panel.js Implements sidebar call controls and settings.
call/​src/​call-face.js Exposes participant faces as a reusable component.
call/​src/​button.js Implements provider-backed titlebar call actions.
call/​pnpm-workspace.yaml Supplies package-local pnpm settings.
call/​package.json Declares dependencies and standalone tool scripts.
call/​.gitignore Excludes generated build and deployment files.

Review effort: Max

Comment thread call/src/engine/face.js
Comment on lines +38 to +39
const vision = await import(`${MEDIAPIPE}/vision_bundle.mjs`);
const files = await vision.FilesetResolver.forVisionTasks(`${MEDIAPIPE}/wasm`);
Comment thread call/src/provider.js Resolved
Comment thread call/src/control-panel.js Resolved
Comment thread call/src/control-panel.js Resolved
Comment thread call/src/engine/noise.js Resolved
Comment thread call/src/provider.js
element.addEventListener(CALL_EVENT, onCall);
// what was mounted before this was (it was loaded late, or swapped in
// anew): on screen already, and unmounted like the rest later
for (const view of element.querySelectorAll("patchwork-view[doc-url]")) hold(view.getAttribute("doc-url"));
Comment thread call/src/ui/avatar.js Resolved
Comment thread call/src/ui/ui.js Resolved
Comment thread call/src/ui/ui.js
Comment on lines +765 to +766
if (full && document.fullscreenElement !== stage) {
stage.requestFullscreen?.().catch(() => setFull(false));
sidebars, and carries on as docs change. Not waited on: it's
late-bound, and renders nothing without the package.
*/}
<patchwork-view component={CALL_PROVIDER}>
chee and others added 10 commits November 13, 2026 08:48
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Refactor event handling for menu button interactions.

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Add active flag to control download state updates.

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Found in two headless browsers: the control panel read call.get().… as the
call went, and choosing floating again left the video tab showing when no
tab had been chosen before.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Hearing a room threw, and lost the room's listener, when someone said bye
there before they'd been heard (a join that hadn't finished, hung up).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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.

3 participants