Skip to content

Commit 1b45f0b

Browse files
luluizctw-joao-luisrodrigo-p-rodriguesdependabot[bot]gabriela-almeida-ctw
authored
Release v1.27.0 (minor) (#1206)
Minor release to v1.27.0. This PR targets `main` to trigger the `release.yml` pipeline on merge, which will: - Bump the root and `packages/suite` versions (minor: 1.26.0 -> 1.27.0) - Update sonar-project.properties, tag `v1.27.0`, and commit the version bump - Build binaries for Linux/macOS/Windows/web and create the GitHub Release - Trigger `post-release.yml` (NPM + GHCR) and `release-sync.yml` (sync back to develop) Branch created from `origin/develop` (commit a6e9939). Do not bump versions manually. Release type: minor. --------- Signed-off-by: Bezerra Luiz, (Luiz.Bezerra@ctw.bmwgroup.com) <luiz.bezerra+QCOM@ctw.bmwgroup.com> Signed-off-by: dependabot[bot] <support@github.com> Signed-off-by: ctw-joao-luis <Joao.Luis@ctw.bmwgroup.com> Signed-off-by: Thomas Sedlmayer <tsedlmayer@pmsfit.de> Signed-off-by: Taeseung Sohn <paulsohnjp@gmail.com> Signed-off-by: Gabriela Almeida <gabriela.almeida@criticaltechworks.com> Signed-off-by: Bezerra Luiz, (Luiz.Bezerra@ctw.bmwgroup.com) <198787532+luiz-bezerra-ctw-bmwgroup-com_QCOM@users.noreply.github.com> Signed-off-by: joao-oliveira-ctw <joao.alves.oliveira@criticaltechworks.com> Signed-off-by: Bezerra Luiz, (Luiz.Bezerra@ctw.bmwgroup.com) <luiz.bezerra@ctw.bmwgroup.com> Signed-off-by: Benedikt Schwering <mail@bschwer.ing> Co-authored-by: ctw-joao-luis <Joao.Luis@ctw.bmwgroup.com> Co-authored-by: Rodrigo CTW <rodrigo.PE.rodrigues@ctw.bmwgroup.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Gabriela Almeida <gabriela.almeida@criticaltechworks.com> Co-authored-by: Alexandre Neuwald CTW <Alexandre.Neuwald@ctw.bmwgroup.com> Co-authored-by: Bezerra Luiz, (Luiz.Bezerra@ctw.bmwgroup.com) <luiz.bezerra+QCOM@ctw.bmwgroup.com> Co-authored-by: Alexandre Neuwald <alexandre.neuwald@criticaltechworks.com> Co-authored-by: Bruno Abreu <bmachadorj@gmail.com> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> Co-authored-by: Bezerra Luiz, (Luiz.Bezerra@ctw.bmwgroup.com) <198787532+luiz-bezerra-ctw-bmwgroup-com_QCOM@users.noreply.github.com> Co-authored-by: Thomas Sedlmayer <tsedlmayer@pmsfit.de> Co-authored-by: Taeseung Sohn <paulsohnjp@gmail.com> Co-authored-by: Planck-Ho <wenloong.he@gmail.com> Co-authored-by: lichtblick-bot <lichtblick@bmwgroup.com> Co-authored-by: Joao Luis <joao.miguel.luis@criticaltechworks.com> Co-authored-by: andremarques94 <90326088+andremarques94@users.noreply.github.com> Co-authored-by: Taeseung Sohn <taeseung.sohn@tier4.jp> Co-authored-by: joao-oliveira-ctw <joao.alves.oliveira@criticaltechworks.com> Co-authored-by: cadkin <adkinscv@ornl.gov> Co-authored-by: udovonbmw <udo.rietschel@bmw.de> Co-authored-by: Copilot <copilot@github.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: xucheng.zhang <xucheng.zhang@vbot.cn> Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> Co-authored-by: Benedikt Schwering <mail@bschwer.ing> Co-authored-by: skrutzler-knapp <stefan.krutzler3@knapp.com> Co-authored-by: Carlos Alvarez <candres.alv@gmail.com>
1 parent 635393f commit 1b45f0b

382 files changed

Lines changed: 26716 additions & 12089 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎.coderabbit.yaml‎

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,13 @@ language: "en-US"
55

66
reviews:
77
profile: "chill"
8+
tone_instructions: |
9+
Pay special attention to performance in hot paths — players, MessagePipeline, 3D and Plot
10+
rendering, Web Workers, and frequently re-rendering React components. Flag allocations in
11+
render/tick loops, lost reference stability or missing memoization, main-thread work that
12+
belongs in a Worker, and buffer copies that should be zero-copy transfers. Follow "measure
13+
before you optimize": raise performance concerns only with concrete, high-confidence impact and
14+
avoid speculative micro-optimizations.
815
request_changes_workflow: false
916
high_level_summary: true
1017
high_level_summary_placeholder: "@coderabbitai summary"
@@ -62,6 +69,47 @@ reviews:
6269
Type definition files. Check for accurate and comprehensive type definitions.
6370
Ensure no `any` types are used without justification.
6471
72+
- path: "packages/suite-base/src/players/**"
73+
instructions: |
74+
Performance-critical player and data-source code. Flag allocations inside tick loops or
75+
per-message hot paths, missing message batching, and subscriptions that iterate topics no
76+
panel requested. Verify message-cache/memory budgets are respected and that large buffers
77+
are released behind the read head. Flag concrete regressions only — do not restate the
78+
generic rules already in .github/instructions/performance.instructions.md.
79+
80+
- path: "packages/suite-base/src/components/MessagePipeline/**"
81+
instructions: |
82+
Hot render-state path. Verify renderState fields keep stable references when their data is
83+
unchanged (reference equality drives panel re-renders), zustand selectors stay
84+
fine-grained, and subscription merging is preserved. Flag changes that would make all
85+
panels re-render every frame.
86+
87+
- path: "packages/suite-base/src/panels/ThreeDeeRender/**"
88+
instructions: |
89+
GPU/render hot path. Flag per-frame allocations (new THREE objects, arrays, or closures
90+
created inside render/update loops), GPU buffers recreated per frame instead of reused or
91+
grown, unbounded draw-call growth, and bypassed object pools. Verify temp objects are
92+
reused for frequently created/destroyed values.
93+
94+
- path: "packages/suite-base/src/panels/Plot/**"
95+
instructions: |
96+
Chart rendering hot path. Verify heavy dataset work stays off the main thread (Workers or
97+
OffscreenCanvas), the per-series point cap is respected, and updates are incremental rather
98+
than full rebuilds. Flag main-thread processing of large datasets.
99+
100+
- path: "**/*.worker.ts"
101+
instructions: |
102+
Web Worker boundary. Verify large ArrayBuffer/TypedArray payloads use zero-copy
103+
Comlink.transfer instead of structured-clone copies, and that worker proxies are disposed
104+
to avoid leaks. Flag large buffers copied across the worker boundary.
105+
106+
- path: "**/*.tsx"
107+
instructions: |
108+
React render path. Raise only clear, high-impact render-performance issues: inline
109+
object/array/function literals passed to memoized children, expensive work run directly in
110+
render instead of useMemo, or setState called unconditionally inside useEffect. Do not
111+
nitpick low-traffic components — respect the project's "measure before you optimize" rule.
112+
65113
auto_review:
66114
enabled: true
67115
ignore_title_keywords:

‎.dockerignore‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22
*.tsbuildinfo
33
.DS_Store
44
.webpack/
5+
.caddy-certs/
6+
.caddy-data/
7+
.tls/
58
dist/
69
node_modules/
710
Dockerfile
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
name: SDD Feature Request
2+
description: Propose a feature with explicit specification, acceptance criteria, and definition of done.
3+
title: "[Feature]: "
4+
labels:
5+
- enhancement
6+
body:
7+
- type: markdown
8+
attributes:
9+
value: |
10+
Use this template to define the feature specification before implementation.
11+
12+
- type: textarea
13+
id: problem
14+
attributes:
15+
label: Problem statement
16+
description: What user or developer problem should be solved?
17+
placeholder: Describe the current pain point.
18+
validations:
19+
required: true
20+
21+
- type: textarea
22+
id: proposed-solution
23+
attributes:
24+
label: Proposed solution
25+
description: What behavior or capability should be added?
26+
placeholder: Describe the desired solution at a high level.
27+
validations:
28+
required: true
29+
30+
- type: textarea
31+
id: acceptance-criteria
32+
attributes:
33+
label: Acceptance criteria
34+
description: Provide measurable criteria that must be true for completion.
35+
placeholder: |
36+
- [ ] Criterion 1
37+
- [ ] Criterion 2
38+
- [ ] Criterion 3
39+
validations:
40+
required: true
41+
42+
- type: textarea
43+
id: definition-of-done
44+
attributes:
45+
label: Definition of done
46+
description: Provide completion checks for implementation quality.
47+
placeholder: |
48+
- [ ] Required tests added/updated
49+
- [ ] Documentation updated
50+
- [ ] Lint/type-check/tests pass
51+
validations:
52+
required: true
53+
54+
- type: textarea
55+
id: scope
56+
attributes:
57+
label: Scope and non-goals
58+
description: Clarify what is in scope and explicitly out of scope.
59+
placeholder: |
60+
In scope:
61+
-
62+
63+
Out of scope:
64+
-
65+
validations:
66+
required: true
67+
68+
- type: textarea
69+
id: risk
70+
attributes:
71+
label: Risks and dependencies
72+
description: List technical risks, migration concerns, and dependencies.
73+
placeholder: |
74+
Risks:
75+
-
76+
77+
Dependencies:
78+
-
79+
validations:
80+
required: false
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
---
2+
description: "Deserialization specialist covering schema parsing and message decoding for protobuf/flatbuffer/ROS/JSON. Use for data format issues, schema resolution, and decoding performance after message bytes are available."
3+
tools: ["read", "search"]
4+
---
5+
6+
# Deserialization Agent
7+
8+
You are an expert on the Lichtblick deserialization layer — converting raw binary message data into structured JavaScript objects.
9+
10+
## Architecture
11+
12+
```
13+
Raw bytes (from source)
14+
│
15+
▼
16+
DeserializingIterableSource (applies parseChannel-based decode)
17+
│
18+
▼
19+
Decoded message objects (ready for panels)
20+
```
21+
22+
## Schema Encodings Supported
23+
24+
| Encoding | Schema Format | Deserializer |
25+
|----------|--------------|--------------|
26+
| `ros1msg` | ROS 1 message definition text | `@lichtblick/rosmsg-serialization` MessageReader |
27+
| `ros2msg` | ROS 2 message definition text | `@lichtblick/rosmsg2-serialization` MessageReader |
28+
| `ros2idl` | OMG IDL text | `@lichtblick/omgidl-serialization` MessageReader |
29+
| `jsonschema` | JSON Schema object | JSON.parse + postprocessValue (base64 decode) |
30+
| `protobuf` | FileDescriptorSet binary | `protobufjs` Root.fromDescriptor |
31+
| `flatbuffer` | Binary reflection schema | `flatbuffers_reflection` Parser |
32+
33+
## Core Entry Point: `parseChannel()`
34+
35+
Located in `packages/mcap-support/src/parseChannel.ts`:
36+
37+
```typescript
38+
function parseChannel(channel: Channel): ParsedChannel {
39+
// Returns { deserialize: (data: ArrayBufferView) => unknown, datatypes: Map }
40+
// Dispatches based on channel.schema.encoding
41+
}
42+
```
43+
44+
This is the single function that resolves any channel's schema into a deserializer.
45+
46+
## DeserializingIterableSource
47+
48+
- Wraps a serialized source (`ISerializedIterableSource`)
49+
- Applies `parseChannel()` to each channel's schema at initialization
50+
- Deserializes messages on-the-fly as they're iterated
51+
- Produces `IDeserializedIterableSource` (messages are JS objects, not raw bytes)
52+
53+
## Key Files
54+
- `packages/mcap-support/src/parseChannel.ts` — schema → deserializer dispatch
55+
- `packages/mcap-support/src/parseProtobufSchema.ts` — Protobuf handling
56+
- `packages/mcap-support/src/parseFlatbufferSchema.ts` — Flatbuffer handling
57+
- `packages/mcap-support/src/parseJsonSchema.ts` — JSON Schema handling
58+
- `packages/suite-base/src/players/IterablePlayer/DeserializingIterableSource.ts`
59+
60+
## Performance Considerations
61+
62+
- Deserialization is CPU-bound — runs in Worker via `WorkerIterableSource`
63+
- Protobuf: `root.lookupType()` is cached after first call
64+
- JSON: `postprocessValue` handles base64→Uint8Array conversion for `bytes` fields
65+
- Flatbuffers: zero-copy read from shared buffer (fastest)
66+
- ROS: `MessageReader` pre-compiles field offsets at schema parse time
67+
68+
## Skills Reference
69+
- MCAP format, chunk structure, and indexed reading: `read_file(".github/skills/mcap-format/SKILL.md")`
70+
- Worker/Comlink patterns (offloading decode to SharedWorker): `read_file(".github/skills/web-workers/SKILL.md")`
71+
- Decode throughput profiling or allocation reduction: `read_file(".github/skills/performance/SKILL.md")`

‎.github/agents/lb-desktop.agent.md‎

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
---
2+
description: "Desktop/Electron platform specialist covering the main process, preload scripts, IPC communication, BrowserWindow management, native menus, and file system access. Use for Electron-specific features and desktop app behavior."
3+
tools: ["read", "edit", "search", "execute"]
4+
---
5+
6+
# Desktop Agent
7+
8+
You are an expert on the Lichtblick desktop application built with Electron.
9+
10+
## Ownership
11+
12+
This agent is the designated **writer** for the Electron desktop platform. Only this agent edits files in these paths. All other agents treat them as **read-only**.
13+
14+
**Owned paths:**
15+
- `desktop/**`
16+
- `packages/suite-desktop/**`
17+
18+
**Read-only context** (inform decisions but never edit):
19+
- `packages/suite-base/src/**` — shared application code
20+
- `web/**` — web platform, owned by `@lb-web`
21+
22+
## Architecture
23+
24+
```text
25+
Main Process (Node.js)
26+
│
27+
├── App lifecycle (single instance, deep links)
28+
├── StudioWindow (BrowserWindow management)
29+
├── Native menus (File, Edit, View, Help)
30+
└── File system access (layouts, extensions)
31+
│
32+
▼ (IPC via contextBridge)
33+
Preload Script
34+
│
35+
├── desktopBridge (app operations)
36+
├── storageBridge (key-value storage)
37+
├── menuBridge (menu events)
38+
└── ctxbridge (OS context)
39+
│
40+
▼
41+
Renderer Process (React app)
42+
│
43+
├── DesktopExtensionLoader (filesystem)
44+
├── DesktopLayoutLoader (filesystem)
45+
└── NativeAppMenu / NativeWindow
46+
```
47+
48+
## Core Components
49+
50+
| File | Role |
51+
|------|------|
52+
| `packages/suite-desktop/src/main/index.ts` | App entry, single instance, lifecycle |
53+
| `packages/suite-desktop/src/main/StudioWindow.ts` | BrowserWindow creation, preload config |
54+
| `packages/suite-desktop/src/preload/index.ts` | contextBridge API exposure |
55+
| `packages/suite-desktop/src/common/types.ts` | IPC type definitions (Desktop, Storage, etc.) |
56+
| `packages/suite-desktop/src/renderer/Root.tsx` | Renderer entry with desktop-specific loaders |
57+
58+
## IPC Bridges
59+
60+
### desktopBridge (Desktop interface)
61+
- `updateNativeColorScheme()` — sync theme with OS
62+
- `updateLanguage()` — update app language
63+
- `getDeepLinks()` — retrieve pending deep link URLs
64+
- `fetchLayouts()` — load layout files from disk
65+
66+
### storageBridge (Storage interface)
67+
- Key-value storage backed by files on disk
68+
- Used for app configuration persistence
69+
- Alternative to localStorage (works across windows)
70+
71+
### menuBridge (NativeMenuBridge)
72+
- Forwards native menu events to renderer
73+
- `ForwardedMenuEvent`: open-file, open-connection, preferences, etc.
74+
75+
## Single Instance Enforcement
76+
77+
```typescript
78+
const gotLock = app.requestSingleInstanceLock();
79+
if (!gotLock) {
80+
app.quit(); // Another instance already running
81+
}
82+
app.on("second-instance", (_, argv) => {
83+
// Forward deep links to existing window
84+
});
85+
```
86+
87+
## Extension & Layout Loading (Desktop-specific)
88+
89+
- `DesktopExtensionLoader`: Reads `.foxe` files from filesystem (type: "filesystem")
90+
- `DesktopLayoutLoader`: Reads `.json` layout files from configured directory
91+
- Both communicate via IPC through the preload bridge
92+
93+
## Key Conventions
94+
95+
- All IPC must go through contextBridge (no `remote` module)
96+
- Type-safe bridges defined in `common/types.ts`
97+
- Renderer cannot directly access Node.js APIs
98+
- CSP headers enforced in BrowserWindow webPreferences
99+
100+
## Performance Considerations
101+
102+
1. **Startup time**: Preload script should be minimal — defer heavy imports
103+
2. **IPC overhead**: Batch related IPC calls where possible
104+
3. **File watching**: Use efficient OS-level watchers (not polling)
105+
4. **Window creation**: Lazy — don't create windows until needed
106+
107+
## Key Files
108+
- `packages/suite-desktop/src/main/index.ts`
109+
- `packages/suite-desktop/src/main/StudioWindow.ts`
110+
- `packages/suite-desktop/src/preload/index.ts`
111+
- `packages/suite-desktop/src/common/types.ts`
112+
- `packages/suite-desktop/src/renderer/Root.tsx`
113+
- `packages/suite-desktop/src/renderer/services/DesktopExtensionLoader.ts`
114+
- `packages/suite-desktop/src/renderer/services/DesktopLayoutLoader.ts`
115+
116+
## Skills Reference
117+
- Deep Electron IPC, preload scripts, BrowserWindow, or native API patterns: `read_file(".github/skills/electron-internals/SKILL.md")`

‎.github/agents/lb-e2e-test.agent.md‎

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,21 @@ tools: [read, edit, search, browser, todo]
99

1010
You create Playwright E2E tests for the Lichtblick desktop (Electron) and web apps.
1111

12+
## Ownership
13+
14+
This agent is the designated **writer** for E2E test files. Only this agent edits files in these paths. All other agents treat them as **read-only**.
15+
16+
**Owned paths:**
17+
- `e2e/**`
18+
19+
**Read-only context** (read source to discover selectors, but never edit source):
20+
- `packages/suite-base/src/**` — source components for selector discovery
21+
- `packages/suite-desktop/**` — desktop entry points
22+
- `packages/suite-web/**` — web entry points
1223
**Before writing any test**, always:
1324

25+
## Skills Reference
26+
1427
1. **Ask the user to start the application** before proceeding. For web tests, confirm that `yarn web:serve` is running at `http://localhost:8080`. For desktop tests, confirm that the desktop build exists (`yarn desktop:build:dev`). Do not proceed until the user confirms the app is running.
1528
2. Read the **test-conventions** skill — `read_file(".github/skills/test-conventions/SKILL.md")`
1629
3. Read the **e2e-playwright-mcp** skill — `read_file(".github/skills/e2e-playwright-mcp/SKILL.md")`

0 commit comments

Comments
 (0)