-
Notifications
You must be signed in to change notification settings - Fork 41
example code editor open
The Code editor ships as the standalone OpenStation — Code Editor extension (extensions/desktop-mode-code-editor/). The deep-link surfaces below only work when that plugin is active alongside OpenStation.
The editor exposes two surfaces for opening a file from elsewhere on the desktop — one for plugin authors writing JavaScript inside an iframe window, one for the user.
Pressing Cmd+Shift+E (macOS) / Ctrl+Shift+E (Linux/Windows) anywhere on the desktop opens the editor window — or focuses it if already open. No file picker; the editor returns to its last-active tab.
The shortcut is gated by the same edit_plugins capability that gates the editor window itself, so users without the cap never get the affordance (the JS bundle isn't enqueued for them).
Any frame on the desktop — an iframe-based plugin window, a chromeless wp-admin page, the shell itself — can request the editor open at a specific path + line by posting:
window.parent.postMessage(
{
type: 'os-code-open',
path: 'plugins/my-plugin/main.php',
line: 42, // optional, defaults to 1
},
window.location.origin,
);Behaviour:
- If the editor window is closed → it opens, then the message is replayed once the editor's render callback has mounted, then it scrolls to the requested line.
- If the editor is already open → the message goes straight to the in-window listener, which fetches the file, opens (or focuses) a tab, and scrolls to the line.
- The path is resolved through the editor's normal
openstation_code_editor_resolve_path()safety check —..escapes, symlinks pointing outside the workspace, and disallowed extensions all fail closed.
A plugin that renders an admin page inside an iframe window (the standard wp-admin path) can offer a "View source" link that jumps the user straight into the editor:
?>
<a href="#" id="my-view-source" class="button">View source</a>
<script>
document.getElementById('my-view-source').addEventListener('click', (e) => {
e.preventDefault();
window.parent.postMessage(
{
type: 'os-code-open',
path: 'plugins/my-plugin/admin/page.php',
line: 1,
},
window.location.origin
);
});
</script>
<?phpA registered AI command that returns a code reference can drop the user into the editor at the relevant line:
wp.os.registerCommand( {
slug: 'open-in-editor',
label: 'Open in Code editor',
aiCallable: true,
run( args ) {
const [ path, line ] = args.split( ':' );
window.postMessage(
{ type: 'os-code-open', path, line: parseInt( line, 10 ) || 1 },
window.location.origin
);
},
} );The editor's listener rejects messages from any origin other than window.location.origin. Cross-origin embeds (rare in WP admin) won't work; this is intentional — the editor exposes file-read capability and we don't want a third-party origin to drive it.
For JS code running in the same realm as the desktop shell (rare — most plugin code runs inside iframes), the same effect is one call away:
wp.os.openWindow( 'wpdc-editor' );
// then — once you know the editor is ready —
window.postMessage(
{ type: 'os-code-open', path: '...', line: 12 },
window.location.origin
);openWindow( id ) works for any registered native window, not just the editor. Returns true if a window with that id exists and was opened (or focused), false otherwise.
- Register a desktop icon — the canonical pattern for a clickable wallpaper tile that opens any registered native window.
-
wp.os.windowManager— full window-manager API for advanced cases.
This wiki is generated from the docs/ directory — edits made here are overwritten by the next sync.
To change a page, open a pull request against docs/.
Guides
- Development guide
- Releasing openstation
- Agents security model
- API Index
- Architecture
- Bridge protocol — wiring overview
- <os-*> component reference
- Native Desktop Host — Experimental
- Desktop themes
- Dock customization — two registries, one mental model
- The event-driven framework
- Files on the Desktop
- Folder sharing
- Getting Started
- Hooks Reference
- Icons
- JavaScript Reference
- The Living Tree — algorithm definition
- Mio
- Native Windows & Framework Interop
- Plugin compatibility layer
- Progressive Web App (PWA)
- Station Home
- Using openstation from your own plugin
Migration notes
- Migration: built-in activity channels move to the os/ namespace
- Migration: window, wallpaper and widget bundles load on demand
- Migration — the navigation model
- Migration: a native window's tabs move to the window chrome
All examples
- AI Agents — extend and invoke from a plugin
- wp.os.ai.ask() — programmatic AI Copilot
- Tune the AI model config
- Custom arrange-menu action
- Open a child window its owner can't cover
- Style a specific admin page inside the iframe
- Code Blue — register your plugin's log file
- Open a file in the Code editor (deep-link from any window)
- Connect to a window — title-bar button + iframe pub/sub
- Content changes — live-refresh every window listing your type
- Custom window chrome (Experimental)
- Register a custom unfocused-window effect
- Example: render a data table
- Real file storage — react to uploads, gate policy, share from PHP
- React to a window being set free onto the real desktop
- Cross-window devtools — instrumentation primitives
- Add a dock item with a badge
- Decorate the dock without forking the renderer
- Replace the dock rail entirely
- Retune the Drafts widget's AI writing assistant
- Gate OpenStation by role
- Iframe-initiated window opens
- Build a feed reader without the bookkeeping
- Inject data into openStationConfig
- Render a list without losing clicks — renderKeyedList()
- Example: layout primitives (body → panel → row → col)
- Use <os-*> components from a plugin that ships as a zip
- Restyle and drive Mio
- Add an action that works on a whole selection
- WP Explorer — custom post types and their folder
- Add an action button to a WP Explorer preview pane
- Example: native Posts window
- Example: native window with tabs
- Native windows
- Customize note → post conversion
- Send a notification
- OAuth relay — connect to an external service
- OS-file drop
- <os-flyout> — window-scoped sliding card
- Plugins window — extras
- Track who's around — wp.os.presence
- Example: progress bar
- PWA install — surface your own button
- React to window events
- Example: extend the Trash
- Register a slash-command
- Register a desktop theme from a plugin
- Register a game
- Example: register a desktop icon (Jorvy)
- Register a wallpaper
- Register a widget
- Related entities — extend the title bar's "Related" menu
- The native-window render ctx
- Programmatic folder sharing
- Share state across multi-bundle plugins — wp.os.createSharedStore()
- Example: loading spinner
- Add an opt-in card to Station Home
- Accept drops on your desktop icon
- Give a tile two icons, one per state
- Add a row to a window's ⋯ menu
- Example: window activity & the status ring
- Window controls
- Subscribe to window lifecycle events
- Window links — relate windows and restyle the ties (Experimental)
- Window loading state — spinner overlay & ready signal
- Show a banner at the top of a window
- Pulse a window's icon — Window.requestAttention()
- Register a custom window reveal
- Window slots
- Window themes
- Native window with bundle-bound config