Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
a423670
fix(apps): make Launch, the build-chat button and Export work, and ha…
Broccolito Oct 11, 2026
57a3748
fix(desktop): finish managed app preview and file write guards
Broccolito Oct 11, 2026
8f8460c
fix(apps): ship verified esbuild in CLI Linux packages
Broccolito Oct 11, 2026
594107c
fix(desktop): keep window authentication on its attached daemon
Broccolito Oct 11, 2026
e81a44c
test(apps): verify served handler policy in a real browser
Broccolito Oct 11, 2026
e5d9e2d
chore(apps): format hardening changes and wire packaging regression gate
Broccolito Oct 11, 2026
f5435a0
fix(apps): retire deleted runtimes and require secure browser access
Broccolito Oct 11, 2026
1bf591c
test(apps): parse socket token without unchecked string slicing
Broccolito Oct 11, 2026
28e748d
fix(apps): serialize UI bridge connection ownership
Broccolito Oct 11, 2026
4874399
docs(apps): record independent runtime lifecycle review
Broccolito Oct 11, 2026
e184507
fix(desktop): omit the seeded knowledge bundle from exports
Broccolito Oct 11, 2026
3b7fa26
fix(desktop): filter shipped skill aliases consistently
Broccolito Oct 11, 2026
2fa4f55
Preserve installed app edits and complete export runtime syncing
Broccolito Oct 11, 2026
c89a852
fix(apps): align HTTP export filtering and secure-access documentation
Broccolito Oct 11, 2026
d15322a
Close export placement symlink bypass and test legacy export checks
Broccolito Oct 11, 2026
46c6fd3
test(apps): isolate browser policy fixtures with profile roots
Broccolito Oct 11, 2026
bc603a0
docs(apps): record integrated fixes and acceptance checklist
Broccolito Oct 11, 2026
658ed8c
docs(apps): record final integration gate pass
Broccolito Oct 11, 2026
df0da88
docs(apps): regenerate website build-chat guidance
Broccolito Oct 11, 2026
cb1e525
fix(desktop): declare visible browser launch in console census
Broccolito Oct 11, 2026
f124f9a
test(desktop): verify captured launch credentials structurally
Broccolito Oct 11, 2026
cd20bf3
docs(apps): record CI corrections and full-suite findings
Broccolito Oct 11, 2026
19c42f7
fix(apps): exclude seeded bundles from HTTP exports
Broccolito Oct 11, 2026
9c38918
Keep launcher proxy tests on the isolated stand-in daemon
Broccolito Oct 11, 2026
9a727a4
fix(apps): share packaged esbuild lookup with exports
Broccolito Oct 11, 2026
d146d47
docs(apps): replace interrupted handoff with current routing
Broccolito Oct 11, 2026
194485c
Ship the selected daemon's native compiler in fat app exports
Broccolito Oct 11, 2026
0f6434f
docs(apps): record full frontend CI and bundled compiler coverage
Broccolito Oct 11, 2026
68f88b9
Exercise the packaged compiler contract through public app export
Broccolito Oct 11, 2026
109e4c9
Stage pinned native esbuild for every Rust CI test platform
Broccolito Oct 11, 2026
f24ccb9
fix(apps): bound compiler version output inspection
Broccolito Oct 11, 2026
3c0a514
test(apps): diagnose Windows launcher digests before Rust builds
Broccolito Oct 11, 2026
aff68dd
fix(apps): hash Windows export runtimes without module dependencies
Broccolito Oct 11, 2026
580459c
docs(apps): record integrated tests and native acceptance evidence
Broccolito Oct 11, 2026
cd56d90
fix(apps): import full export knowledge payload through daemon
Broccolito Oct 11, 2026
70eec21
docs(apps): document first-run export knowledge imports
Broccolito Oct 11, 2026
1367f5e
test(apps): expose Windows payload state diagnostics
Broccolito Oct 11, 2026
21b7704
fix(apps): normalize Windows export source aliases natively
Broccolito Oct 11, 2026
d74b298
test(crew): wait for observed channel before opening finished task pane
Broccolito Oct 11, 2026
e5cd7e2
Document completed built-app native and recipient acceptance
Broccolito Oct 11, 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
2 changes: 1 addition & 1 deletion .github/workflows/frontend.yml
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ jobs:
run: npm ci

- name: Packaged dependency isolation regressions
run: node --test scripts/verify-packaged-dependencies.test.cjs scripts/npm-command.test.cjs scripts/prepare-native-dependencies.test.cjs scripts/vite-optional-ws.test.mjs
run: node --test scripts/verify-packaged-dependencies.test.cjs scripts/npm-command.test.cjs scripts/prepare-native-dependencies.test.cjs scripts/vite-optional-ws.test.mjs scripts/fetch-esbuild.test.cjs

# Windows allocates a NEW, VISIBLE console for every console-subsystem
# child of a process that owns none — which the Electron main process is.
Expand Down
33 changes: 33 additions & 0 deletions .github/workflows/rust.yml
Original file line number Diff line number Diff line change
Expand Up @@ -257,6 +257,39 @@ jobs:
sudo apt-get update
sudo apt-get install --yes libdbus-1-dev libxcb1-dev pkg-config

- uses: actions/setup-node@v4
with:
node-version: 24

- name: Windows launcher runtime digest (actual PowerShell template)
if: matrix.os == 'windows-latest'
timeout-minutes: 2
run: node scripts/agent-drafter/check-windows-runtime-digest.mjs

- name: Full export payload (generated launchers and authenticated daemon fixture)
timeout-minutes: 2
run: node scripts/agent-drafter/check-export-payload.mjs

- name: Stage pinned native app compiler
timeout-minutes: 2
shell: bash
run: |
node <<'NODE'
const fs = require('node:fs');
const path = require('node:path');
const { execFileSync } = require('node:child_process');
const { fetchEsbuild, ESBUILD_VERSION } = require('./ui/desktop/scripts/fetch-esbuild.js');
const compiler = path.resolve(fetchEsbuild(process.platform, process.arch, {
binDir: path.join(process.env.RUNNER_TEMP, 'biorouter-test-tools'),
cacheDir: path.join(process.env.RUNNER_TEMP, 'biorouter-esbuild-cache'),
}));
const version = execFileSync(compiler, ['--version'], {
encoding: 'utf8', timeout: 5000, maxBuffer: 64,
}).trim();
if (version !== ESBUILD_VERSION) throw new Error('Native esbuild does not match the pinned release');
fs.appendFileSync(process.env.GITHUB_ENV, `BIOROUTER_ESBUILD_BIN=${compiler}\n`);
NODE

# Start narrow (lib + bins on every OS) so the matrix is green on arrival;
# widen as it proves stable. This selector leaves out `tests/`; those
# binaries run in their own step below, ubuntu only, with no network.
Expand Down
35 changes: 33 additions & 2 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -1060,8 +1060,16 @@ per-app agent over `GET /apps/<id>/agent`. Full design in
need no region — the SDK always provides a `.br-dock` drawer.
- **Apps vendor their own `src/sdk.ts`**, so `manifest.sdk_hash` fingerprints the
SDK a bundle was built from. `build_app` refreshes the vendored copy and stamps
it; `serve_index` rebuilds on drift. Otherwise an app built before a protocol
addition silently ignores the new frames forever.
it; `serve_index` rebuilds on drift. The bundle also records the SDK's source
version, so an older daemon preserves a newer SDK across rebuilds. The desktop
ships pinned, integrity-checked esbuild beside the daemon; CLI packages stage
the same binary. Builds publish JavaScript and imported CSS together.
- **Browser launch uses the daemon origin.** The desktop's shared-daemon proxy
requires its secret, so an external browser cannot use that proxy's address.
`POST /apps/{id}/launch` returns the daemon's own loopback URL and a one-time
access link; desktop launch and managed preview use that origin. Browser-open
failures are shown to the person. Build-chat buttons check session metadata
before opening a tab, and show a disabled reason when the chat is gone.
- **Export is directly runnable.** `export_app` writes `manifest.json` (without
it the daemon 404s the app), leaves the endpoint unset so the SDK derives it
from the page origin (the desktop app starts `biorouterd` on an *ephemeral*
Expand All @@ -1071,6 +1079,29 @@ per-app agent over `GET /apps/<id>/agent`. Full design in
binds loopback only. `.vault/` is excluded. The daemon's port env var is
**`BIOROUTER_PORT`**, not `BIOROUTER_SERVER__PORT` (only the secret key uses
the `__` form — `Settings` is a flat struct).
- **Exports have one implementation:** `agent_drafter/export.rs`. The desktop
downloads the `POST /apps/{id}/export` zip, preserves executable modes, and
safely extracts it into the person's chosen folder. Launcher, Full and bundled
daemon options reach the exporter; Full filters shipped skills and privacy
gates knowledge payloads. Exported HTML stays raw for daemon assembly, binary
assets are preserved, and working files, secrets and build-chat ids are omitted.
Launchers honor `BIOROUTER_PATH_ROOT` for an isolated recipient store and retain
backups before replacing installed contents. Full launchers start or reuse the
authenticated daemon before importing knowledge archives through its existing
multipart API. Import receipts prevent duplicate imports on retries; only
matching app declarations are rebound to allocated knowledge ids. Payload
consent and archive privacy/owner floors remain enforced.
- **App pages require a document navigation** on browser credentials in a secure
browser context (loopback or HTTPS). Plain HTTP on a network address refuses
app surfaces and the secret-bearing serve shell, because Fetch Metadata and
opener protections do not apply there. Forwarded HTTPS on a network host also
requires browser-controlled Fetch Metadata, so a spoofed proxy header alone
cannot bypass that refusal. Authored inline scripts and handlers run under a response-specific CSP;
runtime-injected handlers remain blocked. Figure frames have a separate policy
and are admitted by the desktop preview only as the same app's subframe.
Deleting an app retires its sockets and tokens; a replacement has a new
`app_uid` and a separate durable conversation. Per-app origins and private-app
classification remain the separately documented platform followups.
- **Tests:** `cargo test -p biorouter-mcp --lib agent_drafter::`,
`cargo test -p biorouter-mcp --test ui_example_apps`,
`cargo test -p biorouter-server --lib routes::apps`. Browser-level:
Expand Down
Loading
Loading