Includes:
- compositor.app, compositor.session, compositor.session.app, compositor.audit.log models
- /web/compositor/{token,apps,launch,audit} HTTP controllers with JWT (HS256)
- CompositorService OWL service (reusable via useService('compositor'))
- CompositorCanvas OWL component (reusable canvas wrapper)
- Security: compositor_group_user, compositor_group_manager groups + ir.access.csv rules
- 5 demo apps pre-loaded (gnome-calculator, xterm, gtk4-demo, glxgears, featherpad)
- Audit log capturing JWT issuance + app launch events
- Stub mode: launching apps returns a stub SurfaceHandle when proxy isn't connected
- Tested against Odoo 20 + PostgreSQL 17
Author: 1bspace.com
Parent company: 1B Global
License: Proprietary (1B Space internal use)
40 lines
2.2 KiB
XML
40 lines
2.2 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<odoo>
|
|
<data>
|
|
<!-- ─── Module Category (still exists in Odoo 20) ─────────────── -->
|
|
<record id="module_category_compositor" model="ir.module.category">
|
|
<field name="name">1B OS Compositor</field>
|
|
<field name="description">Wayland-to-HTML5 compositor for the Odoo web client.</field>
|
|
<field name="sequence">20</field>
|
|
</record>
|
|
|
|
<!-- ─── Privileges (Odoo 20's replacement for group categories) ──── -->
|
|
<record id="compositor_privilege_user" model="res.groups.privilege">
|
|
<field name="name">1B OS Compositor User</field>
|
|
<field name="description">Can launch apps from the launcher and see their own sessions.</field>
|
|
<field name="category_id" ref="module_category_compositor"/>
|
|
<field name="sequence">10</field>
|
|
</record>
|
|
<record id="compositor_privilege_manager" model="res.groups.privilege">
|
|
<field name="name">1B OS Compositor Manager</field>
|
|
<field name="description">Can configure apps, view all sessions, view audit log.</field>
|
|
<field name="category_id" ref="module_category_compositor"/>
|
|
<field name="sequence">20</field>
|
|
</record>
|
|
|
|
<!-- ─── Groups ───────────────────────────────────────────────────── -->
|
|
<record id="compositor_group_user" model="res.groups">
|
|
<field name="name">Compositor / User</field>
|
|
<field name="privilege_id" ref="compositor_privilege_user"/>
|
|
<field name="implied_ids" eval="[(4, ref('base.group_user'))]"/>
|
|
</record>
|
|
|
|
<record id="compositor_group_manager" model="res.groups">
|
|
<field name="name">Compositor / Manager</field>
|
|
<field name="privilege_id" ref="compositor_privilege_manager"/>
|
|
<field name="implied_ids" eval="[(4, ref('compositor_group_user'))]"/>
|
|
<field name="user_ids" eval="[(4, ref('base.user_admin'))]"/>
|
|
</record>
|
|
</data>
|
|
</odoo>
|