x11vnc against display :0 — the session the owner is actually logged into, not a second one Officer installs. sidecar/, api/, web/ and the host setup script, moved out of src/ whole. Dormant when it moved: the websocket was commented out in server.tsx and the router in hono.ts since 2026-08-13, and no officer-vnc process was running on any machine. Nothing regressed and nothing was restored — this took switched-off code out of the platform. The point of the move is what the platform stopped knowing. Its sidecar/protocol.ts carried a VNC section — vnc:start, vnc:ensure-password, vnc:stop, four reply variants, VncStartParams, VncSessionInfo — and sidecar-registry.ts carried startVnc, ensureVncPassword, stopVnc and isVncConnected. That is the platform speaking a plugin's vocabulary, which CLAUDE.md names as a rule and this was the clearest breach of. All of it is in sidecar/protocol.ts here now. The permission made a round trip worth recording. It was kind: 'execution' — "runs as the server owner and cannot be shared" — and a plugin permission has no kind, deliberately, because a permission nobody can delegate is a contradiction. So the property is expressed as ownerOnly: ['/'] instead: every path under this plugin refused to anyone but the owner. Same answer, reached from the paths rather than from a kind, and the first real use of a mechanism that landed the same day. The property is real — there is one physical screen and it is the owner's. Not finished, and BLOCKERS.md says so rather than the commit implying otherwise: the websocket is dormant because a plugin cannot claim a WebSocket provider, host setup needs a reboot and no manifest can express that, and there is no artwork. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
20 lines
730 B
TypeScript
20 lines
730 B
TypeScript
// `panels.ts`, not `.tsx` — discovery checks for that exact name.
|
|
import type { AppRegistryMeta } from 'officerdev';
|
|
import { MonitorSmartphone } from 'lucide-react';
|
|
import { DesktopWrapper } from './DesktopWrapper';
|
|
import { DesktopHeader } from './DesktopHeader';
|
|
|
|
export const appRegistryMetas: AppRegistryMeta[] = [
|
|
{
|
|
key: 'officerdev/desktop',
|
|
name: 'Remote Desktop',
|
|
icon: MonitorSmartphone,
|
|
component: DesktopWrapper,
|
|
header: DesktopHeader,
|
|
availableOnPanel: false,
|
|
// noVNC scales the remote framebuffer itself and maps pointer coordinates against that; a wrapping
|
|
// CSS transform would leave every click landing somewhere other than where it was aimed.
|
|
zoomable: false,
|
|
},
|
|
];
|