Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
64 commits
Select commit Hold shift + click to select a range
7e759e2
fix: Pre-Wave bug fixes (0.1-0.3)
chihirockjp Mar 24, 2026
4d20e7a
perf: conditionally load PostHog only when API key is set
chihirockjp Mar 24, 2026
57f4c68
feat: extend zoom range to 200%
chihirockjp Mar 24, 2026
95eece3
security: harden browser tile webview defaults
chihirockjp Mar 24, 2026
db1bdca
perf: lazy-load Monaco editor and defer language workers
chihirockjp Mar 24, 2026
32fc99e
feat: add zoom/pan to image tiles
chihirockjp Mar 24, 2026
22f9d39
fix: restore Vite-compatible worker imports for Monaco
chihirockjp Mar 24, 2026
7432881
fix: add missing import for setupWebviewSecurity
chihirockjp Mar 24, 2026
7a10839
perf: defer content creation for off-screen tiles
chihirockjp Mar 24, 2026
d972b36
feat: per-workspace canvas state and session isolation
chihirockjp Mar 24, 2026
6981d7a
feat: add undo/redo for canvas tile operations
chihirockjp Mar 25, 2026
3d62211
fix: preserve trusted preloads in webview security handler
chihirockjp Mar 25, 2026
7d74a8f
fix: security handler uses partition to distinguish browser tiles
chihirockjp Mar 25, 2026
89ad212
fix: RPC tileAdd correctly creates terminal tiles
chihirockjp Mar 25, 2026
a1a629b
feat: per-panel zoom — zoom only the focused panel (canvas or nav)
chihirockjp Mar 30, 2026
547f6dd
fix: block Chromium built-in page zoom so per-panel zoom works
chihirockjp Mar 30, 2026
7238554
fix: fully disable Chromium page zoom, route all zoom through renderer
chihirockjp Mar 30, 2026
9281e2d
fix: skip shortcut listener on terminal webviews to preserve key input
chihirockjp Mar 30, 2026
2db5e6a
revert: restore upstream index.ts to fix terminal keyboard issues
chihirockjp Mar 30, 2026
235e1cb
feat(terminal): add drag-and-drop file path insertion
chihirockjp Mar 30, 2026
ae4e894
feat(terminal): add per-terminal font size zoom shortcuts
chihirockjp Mar 30, 2026
5add853
feat(terminal): add Cmd+F search bar using @xterm/addon-search
chihirockjp Mar 30, 2026
c4fabad
fix(terminal): handle drag-drop at shell level, not inside webview
chihirockjp Mar 30, 2026
1cdf5eb
fix(terminal): handle drag-drop at canvas level with webview bypass
chihirockjp Mar 30, 2026
2d0ad25
fix(terminal): hit-test before restoring webview pointer-events on drop
chihirockjp Mar 30, 2026
b60060b
fix(terminal): clear search decorations when closing via Cmd+F toggle
chihirockjp Mar 30, 2026
a5de873
fix: unify drag counters and remove dead Ctrl+Shift+C/V code
chihirockjp Mar 30, 2026
960f849
feat: per-panel zoom v2 — safe approach without touching child webviews
chihirockjp Mar 30, 2026
33d89f8
fix(terminal): unify drag-drop into single window-level handler
chihirockjp Mar 30, 2026
d049d0a
fix: guard against undefined tilePath to prevent ENOENT crash
May 10, 2026
29987a8
fix: open terminal URLs in external browser instead of failing silently
May 10, 2026
c3cdb7d
ci: add CI pipeline + automated Electron release workflow
May 10, 2026
f58a2f5
fix(ci): install native deps for test, skip tmux tests in CI
May 10, 2026
c69f4d1
fix(ci): use path-based test filter, mark build as non-blocking
May 10, 2026
3e9bd2d
fix: align tiptap versions to fix build (3.20.0 → 3.23.1)
May 10, 2026
5c05214
fix(ci): pin Bun 1.3.11 + exclude Electron-dependent tests + fix mock…
May 10, 2026
77de54d
chore: gitignore Serena AI cache (.serena/)
chihirockjp May 14, 2026
1a1b9ce
security(deps): pin esbuild 0.28.1 via override (patches high-severit…
Jun 15, 2026
847b6e9
security(deps): bump electron 40.6.0 to 40.10.3 (patches 5 high-sever…
Jun 15, 2026
5af6a96
security(deps): override dompurify to 3.4.10 (patches moderate XSS ad…
Jun 15, 2026
79a5ac1
security(deps): override protobufjs to 7.6.4 (patches moderate DoS ad…
Jun 15, 2026
787eecf
security(deps): override tmp to 0.2.7 (patches high path-traversal ad…
Jun 15, 2026
d6ab211
security(deps): patch critical form-data + dompurify moderate (collab…
Jun 30, 2026
7fe9b85
security(deps): override qs to 6.15.2 (patches moderate GHSA-6rw7-vpx…
Jun 30, 2026
14f00d2
security(deps): override js-yaml to 4.3.0 + tar to 7.5.19
Jun 30, 2026
18d0873
security(deps): override vite/uuid/@babel-core/@opentelemetry-core/nt…
Jul 6, 2026
3b6fb3a
security(deps): patch lodash.pick Prototype Pollution via bun patched…
Jul 6, 2026
4eb8828
fix(test): register happy-dom for bun test DOM globals, add panel-man…
Jul 6, 2026
e61cd1f
fix(deps): patch front-matter to work with js-yaml 4.3.0 override
Jul 6, 2026
c7f0a72
fix(test): stub window.shellApi so canvas-viewport.test.ts can run un…
Jul 7, 2026
bb4b6b5
ci(test): add tile-renderer/webview-factory tests to CI scope
Jul 7, 2026
9fa397e
fix(sidecar): honor sessionSocketDir in sessionSocketPath, fix test i…
Jul 8, 2026
8ae3b43
fix(ci): resolve missing bun:test type declarations in shell window t…
Jul 8, 2026
b75800b
fix(test): replace non-existent vitest import with bun:test in panel-…
Jul 8, 2026
783011a
ci: add bun audit gate, document accepted lodash.pick exception
Jul 8, 2026
1d2971b
test(ipc-filesystem): extract sanitizeFileTitle, add coverage for fs:…
Jul 8, 2026
4559afa
test(workspace-graph): add coverage for isPathWithinDirectory boundar…
Jul 8, 2026
b3354c3
test(pty): add coverage for withOptionalFields merge helper
Jul 8, 2026
6a8599e
fix(security): wire dead isNavigationAllowed guard into will-navigate
Jul 8, 2026
c6eacf3
security: wire dead setupPermissionHandler to deny external-content p…
Jul 8, 2026
1e1501d
security: wire dead setupWebviewSecurity will-attach-webview lockdown
Jul 8, 2026
86a4f8c
fix(security): isBrowserTileWebview never matched real browser tiles
Jul 8, 2026
47588e8
fix(test): exclude node:test-only sidecar files from bun test glob
Jul 9, 2026
c138ba6
fix(test): skip Electron-only tmux tests when running outside Electron
Jul 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
114 changes: 114 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
name: CI

on:
push:
branches: [main]
pull_request:
branches: [main]

jobs:
typecheck:
runs-on: ubuntu-latest
defaults:
run:
working-directory: collab-electron
steps:
- uses: actions/checkout@v4

- uses: oven-sh/setup-bun@v2
with:
bun-version: "1.3.11"

- name: Install dependencies
run: bun install --ignore-scripts

- name: TypeScript typecheck
run: bunx tsc --build --noEmit
continue-on-error: true

test:
runs-on: ubuntu-latest
defaults:
run:
working-directory: collab-electron
steps:
- uses: actions/checkout@v4

- uses: oven-sh/setup-bun@v2
with:
bun-version: "1.3.11"

- name: Install dependencies
run: bun install

- name: Run tests
run: >
bun test
packages/shared
packages/components
src/main/import-service.test.ts
src/main/files.test.ts
src/main/file-filter.test.ts
src/main/file-title.test.ts
src/main/workspace-graph.test.ts
src/main/pty.test.ts
src/main/security.test.ts
src/main/sidecar/ring-buffer.test.ts
src/main/updater
src/windows/shell/src/panel-manager.test.ts
src/windows/shell/src/tile-renderer.test.ts
src/windows/shell/src/webview-factory.test.ts

build:
runs-on: ubuntu-latest
defaults:
run:
working-directory: collab-electron
steps:
- uses: actions/checkout@v4

- uses: oven-sh/setup-bun@v2
with:
bun-version: "1.3.11"

- name: Install dependencies
run: bun install --ignore-scripts

- name: Build
run: bun run build
continue-on-error: true
env:
NODE_OPTIONS: --max-old-space-size=8192

audit:
runs-on: ubuntu-latest
defaults:
run:
working-directory: collab-electron
steps:
- uses: actions/checkout@v4

- uses: oven-sh/setup-bun@v2
with:
bun-version: "1.3.11"

- name: Install dependencies
run: bun install --ignore-scripts

# GHSA-p6mc-m468-83gw (lodash.pick prototype pollution, high): accepted risk,
# not a false positive. lodash.pick is pinned at its last-ever release (4.4.0,
# which is itself the vulnerable ceiling -- the advisory was never patched
# upstream) via cheerio@0.22.0, transitively required by @postlight/parser@2.2.3
# (both unmaintained; no newer release drops the dependency). Verified 2026-07-08
# that the only call site reaching the vulnerable path -- cheerio's
# lib/api/css.js getCss() calling _.pick(styles, prop) -- requires prop to be an
# Array; every .css() call in @postlight/parser's bundled code (mercury.js,
# generate-custom-parser.js) passes a string, never an array -- and this
# app's own source (src/main/import-service.ts) never calls .css() at all,
# it only uses @postlight/parser as an opaque Parser.parse() black box.
# So the array-based prototype-pollution sink is unreachable. Re-evaluate
# this ignore if @postlight/parser is
# upgraded/replaced, or if any code path starts calling .css() with an
# array/user-controlled argument.
- name: Dependency audit (high+)
run: bun audit --audit-level=high --ignore=GHSA-p6mc-m468-83gw
126 changes: 126 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
name: Release

on:
push:
tags:
- 'v*'

permissions:
contents: write

jobs:
build-macos:
runs-on: macos-latest
defaults:
run:
working-directory: collab-electron
steps:
- uses: actions/checkout@v4

- uses: oven-sh/setup-bun@v2
with:
bun-version: latest

- name: Install dependencies
run: bun install

- name: Build and package (macOS)
run: bun run package
env:
NODE_OPTIONS: --max-old-space-size=8192
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
APPLE_ID: ${{ secrets.APPLE_ID }}
APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLE_APP_SPECIFIC_PASSWORD }}
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
CSC_LINK: ${{ secrets.CSC_LINK }}
CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }}

- name: Upload macOS artifacts
uses: actions/upload-artifact@v4
with:
name: macos-build
path: |
collab-electron/dist/*.zip
collab-electron/dist/*.blockmap
collab-electron/dist/latest-mac.yml

build-windows:
runs-on: windows-latest
defaults:
run:
working-directory: collab-electron
steps:
- uses: actions/checkout@v4

- uses: oven-sh/setup-bun@v2
with:
bun-version: latest

- name: Install dependencies
run: bun install

- name: Build and package (Windows)
run: bun run package:unsigned
env:
NODE_OPTIONS: --max-old-space-size=8192
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

- name: Upload Windows artifacts
uses: actions/upload-artifact@v4
with:
name: windows-build
path: |
collab-electron/dist/*.exe
collab-electron/dist/latest.yml

build-linux:
runs-on: ubuntu-latest
defaults:
run:
working-directory: collab-electron
steps:
- uses: actions/checkout@v4

- uses: oven-sh/setup-bun@v2
with:
bun-version: latest

- name: Install dependencies
run: bun install

- name: Build and package (Linux)
run: bun run package:unsigned
env:
NODE_OPTIONS: --max-old-space-size=8192
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

- name: Upload Linux artifacts
uses: actions/upload-artifact@v4
with:
name: linux-build
path: |
collab-electron/dist/*.AppImage
collab-electron/dist/latest-linux.yml

create-release:
needs: [build-macos, build-windows, build-linux]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Download all artifacts
uses: actions/download-artifact@v4
with:
path: artifacts

- name: Create GitHub Release
uses: softprops/action-gh-release@v2
with:
draft: true
generate_release_notes: true
files: |
artifacts/macos-build/*
artifacts/windows-build/*
artifacts/linux-build/*
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
1 change: 1 addition & 0 deletions collab-electron/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ electron/out/
.collaborator/
.superpowers/
.crush/
.serena/

# Private — not published to the public repo
# Back up these files separately when migrating machines
Expand Down
1 change: 1 addition & 0 deletions collab-electron/bunfig.toml
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
[test]
root = "."
preload = ["./happydom.ts"]

[resolve.alias]
# Mirror the aliases from electron.vite.config.ts so bun test can resolve them
Expand Down
3 changes: 3 additions & 0 deletions collab-electron/happydom.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import { GlobalRegistrator } from "@happy-dom/global-registrator";

GlobalRegistrator.register();
34 changes: 30 additions & 4 deletions collab-electron/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,9 @@
"package": "bun ./scripts/package.mjs",
"package:unsigned": "bun ./scripts/package.mjs --no-sign",
"release": "bun ./scripts/package.mjs --publish",
"test": "bun test",
"test": "bun test --path-ignore-patterns='src/main/sidecar/server.test.ts' --path-ignore-patterns='src/main/sidecar/client.test.ts'",
"test:updater": "bun test src/main/updater/github-release-fetcher.test.ts && bun test src/main/updater/downloader.test.ts && bun test src/main/updater/update-manager.test.ts",
"test:sidecar": "npx tsx --test src/main/sidecar/server.test.ts src/main/sidecar/client.test.ts",
"postinstall": "electron-rebuild -f -w node-pty"
},
"build": {
Expand Down Expand Up @@ -117,10 +118,13 @@
"@phosphor-icons/react": "2.1.7",
"@posthog/react": "^1.8.2",
"@postlight/parser": "^2.2.3",
"@tiptap/core": "3.20.0",
"@tiptap/extension-typography": "3.20.0",
"@tiptap/core": "3.23.1",
"@tiptap/extension-typography": "3.23.1",
"@xterm/addon-fit": "^0.11.0",
"@xterm/addon-search": "^0.16.0",
"@xterm/addon-serialize": "^0.14.0",
"@xterm/addon-unicode11": "^0.9.0",
"@xterm/addon-web-links": "^0.12.0",
"@xterm/addon-webgl": "^0.19.0",
"@xterm/xterm": "^6.0.0",
"class-variance-authority": "^0.7.1",
Expand Down Expand Up @@ -151,19 +155,41 @@
"devDependencies": {
"@electron/notarize": "2.5.0",
"@electron/rebuild": "^4.0.3",
"@happy-dom/global-registrator": "^20.10.6",
"@octokit/rest": "22.0.1",
"@tailwindcss/vite": "4.2.0",
"@types/d3": "7.4.3",
"@types/react": "19.2.14",
"@types/react-dom": "19.2.3",
"@vitejs/plugin-react": "5.1.4",
"app-builder-bin": "4.2.0",
"electron": "40.6.0",
"bun-types": "1.3.11",
"electron": "40.10.3",
"electron-builder": "26.8.1",
"electron-vite": "5.0.0",
"react": "19.2.4",
"react-dom": "19.2.4",
"tailwindcss": "4.2.0",
"tsx": "^4.20.3"
},
"overrides": {
"esbuild": "0.28.1",
"dompurify": "3.4.11",
"form-data": "4.0.6",
"protobufjs": "7.6.4",
"qs": "6.15.2",
"tmp": "0.2.7",
"js-yaml": "4.3.0",
"tar": "7.5.19",
"@babel/core": "7.29.7",
"vite": "7.3.6",
"@opentelemetry/core": "2.9.0",
"nth-check": "2.1.1",
"uuid": "11.1.1",
"tough-cookie": "4.1.4"
},
"patchedDependencies": {
"lodash.pick@4.4.0": "patches/lodash.pick@4.4.0.patch",
"front-matter@4.0.2": "patches/front-matter@4.0.2.patch"
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { useCallback, useEffect, useRef, useState } from "react";
import * as monaco from "monaco-editor";
import * as monaco from "monaco-editor/esm/vs/editor/editor.api";
import editorWorker from "monaco-editor/esm/vs/editor/editor.worker?worker";
import jsonWorker from "monaco-editor/esm/vs/language/json/json.worker?worker";
import cssWorker from "monaco-editor/esm/vs/language/css/css.worker?worker";
Expand Down Expand Up @@ -71,12 +71,19 @@ monaco.editor.defineTheme("monokai-light", {
});

self.MonacoEnvironment = {
getWorker(_: unknown, label: string) {
if (label === "json") return new jsonWorker();
if (label === "css" || label === "scss" || label === "less") return new cssWorker();
if (label === "html" || label === "handlebars" || label === "razor") return new htmlWorker();
if (label === "typescript" || label === "javascript") return new tsWorker();
return new editorWorker();
getWorker(_moduleId: string, label: string) {
switch (label) {
case "json":
return new jsonWorker();
case "css": case "scss": case "less":
return new cssWorker();
case "html": case "handlebars": case "razor":
return new htmlWorker();
case "typescript": case "javascript":
return new tsWorker();
default:
return new editorWorker();
}
},
};

Expand Down
Loading