Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
69 commits
Select commit Hold shift + click to select a range
ac2b314
Checkpoint remote desktop WIP
daoleno Sep 8, 2026
6f8218e
Serialize desktop input and revocation
daoleno Sep 8, 2026
d743406
Integrate opt-in Wayland portal capture
daoleno Sep 8, 2026
0270b8f
Document bounded Android module verification
daoleno Sep 8, 2026
5f0b7fc
Isolate debug packaging from local dotenv
daoleno Sep 8, 2026
47fd681
Fix native desktop streaming and keyboard input
daoleno Sep 8, 2026
5ecce42
Move Settings to the fixed drawer footer
daoleno Sep 8, 2026
bfad184
Allow paired LAN desktop access with explicit consent
daoleno Sep 8, 2026
5035da0
Implement scoped Linux unattended desktop
daoleno Sep 8, 2026
a29f620
Fix standalone Android password entry
daoleno Sep 8, 2026
e1674d7
Fix completed-session cleanup mistaking missing tmux targets for unowned
daoleno Sep 9, 2026
cf0cfc0
Refuse completed cleanup when a present owned identity cannot be proven
daoleno Sep 9, 2026
4ddee53
Dispatch desktop helper, broker and agent from one zen ELF
daoleno Sep 9, 2026
e653466
Prove zen-dev native rebuilds with linked C markers and keep last-goo…
daoleno Sep 9, 2026
f4d329a
Render fenced Mermaid flowcharts in shared Markdown
daoleno Sep 9, 2026
e14ea6d
Bound mermaid WebViews and isolate desktop LAN storage tests
daoleno Sep 9, 2026
85ca9f3
Admit unattended desktop over identity TLS with distinct native recov…
daoleno Sep 9, 2026
20b0742
Accept Unicode ellipsis in OpenCode composer readiness probe
daoleno Sep 10, 2026
f0f5d3e
Reverse OpenCode large-paste artifact before admission digest
daoleno Sep 10, 2026
f8b9fac
Preserve raw OpenCode user text in provider projection
daoleno Sep 10, 2026
bd5c1bb
Model OpenCode paste transport in delegated admission digest
daoleno Sep 10, 2026
eaa4ba5
Remove provider-specific tmux admission digest modeling
daoleno Sep 10, 2026
15e863e
Accept successful delegated tmux transport as submission
daoleno Sep 10, 2026
f0c7dcc
Require confirmed transport receipt before delegated replay success
daoleno Sep 10, 2026
bd3b3a2
Normalize and name desktop identity preflight failures
daoleno Sep 10, 2026
915ac0f
Name desktop identity preflight stage and reject empty identifiers
daoleno Sep 10, 2026
800abf3
Redesign Git Diff review and fix bottom scroll rebound
daoleno Sep 10, 2026
fb72c3d
Fix desktop capability identity echo and Android TLS negotiation
daoleno Sep 10, 2026
9fca158
Reject corrupt Link transport identity without mutation
daoleno Sep 10, 2026
7085999
Repair delegated turn liveness absence and busy signal follow-up
daoleno Sep 10, 2026
d6c8d41
Unify Git Diff back handling and wide master-detail context
daoleno Sep 10, 2026
9705e27
Synchronize broker owner handshake before capability
daoleno Sep 10, 2026
f9f2e2c
Retry broker admission while the previous agent retires
daoleno Sep 10, 2026
4ec343f
Rely on listener SO_PASSCRED and prove the credential race
daoleno Sep 10, 2026
3eb003c
Wait once for the previous owner to retire before admission
daoleno Sep 10, 2026
6b681cf
Align owner admission deadline and abort cancelled waits
daoleno Sep 10, 2026
041b043
Repair iOS remote desktop lifecycle and provision daemon native test …
daoleno Sep 10, 2026
3a35136
Align remote desktop contract test with guarded iOS presentation signal
daoleno Sep 10, 2026
03b7d33
Provision CI encoder stack and fall back to system Xvfb
daoleno Sep 10, 2026
b4ba5ae
Excuse stale live turns named by a resolved loss review
daoleno Sep 10, 2026
5772dec
Tighten resolved-loss excuse to exact Turn payload identity
daoleno Sep 10, 2026
2760c7b
Enforce system-unit cgroup owner contract and harden desktop admission
daoleno Sep 10, 2026
8a9e5b0
Enforce tmux -N no-autostart on externally selected sockets
daoleno Sep 11, 2026
41d7ac0
Isolate tmux fixtures from user config; liveness-oracle tests; quote …
daoleno Sep 11, 2026
b449e85
Guard chat worker sessions against nil watcher in fixture route
daoleno Sep 11, 2026
bda97a3
Add fixture Link v2 mint route and nil-watcher chat regression
daoleno Sep 11, 2026
f3616a3
Require network timeout in nil-watcher chat regression
daoleno Sep 11, 2026
5c9a0f6
Add persistent Agent service discovery to Services sheet
daoleno Sep 11, 2026
2bf3826
Harden persistent service discovery per review
daoleno Sep 11, 2026
a56a132
Bound managed discovery under shared frontend-safe budget
daoleno Sep 11, 2026
bc40d30
Fix desktop pan offset across PanResponder recreation
daoleno Sep 11, 2026
f827110
Raise Android version code to 28 and record native acceptance
daoleno Sep 11, 2026
4f6a2ec
Package Metro-connected Android debug launcher
daoleno Sep 11, 2026
7892885
Unify the runtime: one daemon, optional system-unit owner scope
daoleno Sep 11, 2026
d8049ee
Isolate the runtime parity test in an owned source snapshot
daoleno Sep 11, 2026
0b6b34d
Add zen boot user-unit installation for the same runtime
daoleno Sep 11, 2026
b68cf72
Document the optional zen boot entry
daoleno Sep 11, 2026
2930e38
Fix zen boot unit ownership, paths and truthful verification
daoleno Sep 11, 2026
a514934
Bind zen boot ownership to the unit cgroup
daoleno Sep 11, 2026
638a993
Bind the DEV daemon child lifetime to its watcher
daoleno Sep 11, 2026
83421e6
Confirm zen boot owner with a stable second observation
daoleno Sep 11, 2026
cd3261d
Update the DEV child-lifetime note after the pdeathsig fix
daoleno Sep 11, 2026
79e6885
Use real flock ownership for zen boot state ownership
daoleno Sep 11, 2026
5fed4d2
Fail closed on unattributable zen boot state ownership
daoleno Sep 11, 2026
d6ee6ed
Treat unknown process owner as unresolved in boot scans
daoleno Sep 11, 2026
bda3f94
Harden the runtime parity test around owned builds
daoleno Sep 11, 2026
6df46b1
Skip zombies and proven-foreign processes in boot ownership scans
daoleno Sep 11, 2026
1898416
Scope boot ownership tests to an owned proc fixture
daoleno Sep 11, 2026
afd37ba
Correct boot scan ownership-attribution wording
daoleno Sep 11, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
15 changes: 15 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,21 @@ jobs:
with:
go-version-file: daemon/go.mod
cache-dependency-path: daemon/go.sum
- name: Install Linux desktop native prerequisites
run: |
set -euo pipefail
sudo apt-get update
sudo apt-get install -y \
pkg-config gcc make binutils git rsync tmux \
xvfb \
libgtk-3-dev libglib2.0-dev \
libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev \
gstreamer1.0-plugins-good gstreamer1.0-plugins-bad \
gstreamer1.0-tools \
libx11-dev libxtst-dev
gst-inspect-1.0 openh264enc > /dev/null
gst-inspect-1.0 h264parse > /dev/null
gst-inspect-1.0 ximagesrc > /dev/null
- name: Test
run: go test ./...
- name: Executable behavior contracts (scripted, not real AI)
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ app/ios/
app/modules/zen-file-upload/android/build/
app/modules/zen-keyboard-lifecycle/android/build/
app/modules/zen-link-transport/android/build/
app/modules/zen-remote-desktop/android/build/

# Expo
.expo/
Expand Down
6 changes: 5 additions & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,13 @@ behavior on both. One supported coding CLI is enough to run a Zen Worker.
## Development

```bash
# Daemon
# Daemon (Linux desktop-capable when pkg-config libraries are present)
bun run daemon:build && cd daemon && go test ./...

# Daemon without desktop native (plain Go)
cd daemon && go test ./... && go build -o bin/zen ./cmd/zen/


# App
bun install
cd app && bun test && bunx tsc --noEmit
Expand Down
31 changes: 31 additions & 0 deletions NOTICE
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,34 @@ See the LICENSE file for the full license text.
Third-party components and bundled assets remain under their own licenses.
See docs/third-party-assets.md and the notice files under app/assets/notices/
and app/modules/zen-terminal-vt/ for attribution and redistribution details.

The Linux desktop broker uses github.com/godbus/dbus/v5 (BSD-2-Clause):

Copyright (c) 2013, Georg Reinke (<guelfey at gmail dot com>), Google
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:

1. Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

The SDDM installer uses gopkg.in/ini.v1 (Apache-2.0):
Copyright 2014 Unknwon. See LICENSE for the Apache License, Version 2.0.
2 changes: 1 addition & 1 deletion app/app.base.json
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
"monochromeImage": "./assets/android-icon-monochrome.png"
},
"package": "com.daoleno.zen",
"versionCode": 26,
"versionCode": 28,
"blockedPermissions": ["android.permission.RECORD_AUDIO"],
"permissions": ["android.permission.CAMERA"]
},
Expand Down
4 changes: 3 additions & 1 deletion app/app.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@ const {
resolveIOSNotificationMode,
} = require("./iosIdentity");

loadEnvFile(path.join(__dirname, ".env.local"));
if (process.env.EXPO_NO_DOTENV !== "1") {
loadEnvFile(path.join(__dirname, ".env.local"));
}

const projectId =
typeof process.env.ZEN_EXPO_PROJECT_ID === "string"
Expand Down
3 changes: 3 additions & 0 deletions app/app/(primary)/list.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -761,6 +761,9 @@ export default function InboxScreen() {

const openServiceTerminal = (service: DiscoveredSessionService) => {
if (!isCurrentServer(service.serverId)) return;
// Persistent services outlive their creating Session: there is no live
// worker target, so no terminal action exists for them.
if (!service.worker_id?.trim()) return;
setServiceSheetVisible(false);
router.push({
pathname: "/terminal/[id]",
Expand Down
4 changes: 4 additions & 0 deletions app/app/_layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ import {
import { syncCalendarNotifications } from "../services/calendarNotifications";
import { useAppTheme } from "../constants/tokens";
import { ThemeProvider } from "../theme";
import { MermaidEngineHost } from "../components/markdown/MermaidEngineHost";
import { wsClient } from "../services/websocket";
import {
createConnectedReadRefreshHandler,
Expand All @@ -47,6 +48,7 @@ import {
markOnboarded,
} from "../services/storage";
import { importConnection } from "../services/importConnection";
import { PairingCancelledError } from "../services/pairingScope";
import {
clearNativeTerminalCrashBreadcrumb,
getNativeTerminalCrashBreadcrumb,
Expand Down Expand Up @@ -220,6 +222,7 @@ const ConnectionLifecycle = memo(function ConnectionLifecycle({
return true;
} catch (error) {
handledConnectLinksRef.current.delete(trimmed);
if (error instanceof PairingCancelledError) return false;
console.log("Failed to import connect link:", error);
return false;
}
Expand Down Expand Up @@ -777,6 +780,7 @@ export default function RootLayout() {
<CalendarProvider>
<SafeAreaProvider>
<ThemedStatusBar />
<MermaidEngineHost />
<AppRuntime />
</SafeAreaProvider>
</CalendarProvider>
Expand Down
Loading
Loading