Changelog
2026-08-11v0.49.1· Tracer Bullet
Added
-
Desktop slice 2: the Tauri app at
apps/desktop/now picks a project folder, spawns or joins the systemkandowndaemon (join-before-spawn: a daemon started from a terminal wins, the app does not start a second one), and navigates the webview tohttp://127.0.0.1:<port>/. The first-launch experience is a native folder picker; on subsequent launches with a remembered project, the app auto-resolves and a "Reopen last" button is offered. Slice 2 brings the Tauri bundle to its first useful end-to-end flow; slices 3 onward add multi-window, recents, and native chrome. -
Bundled picker page in
apps/desktop/src/index.htmlplus itsapps/desktop/src/main.tsdriver. Talks to the Rust side through six commands (cmd_kandown_installed,cmd_min_version_check,cmd_pick_project,cmd_get_last_project,cmd_resolve_daemon,cmd_open_window_with_url,cmd_stop_daemon). When the CLI is absent from PATH the page renders a copy-pasteable install hint with a Retry button; when it is present but below the documented minimum, a non-blocking yellow banner appears. -
apps/desktop/src-tauri/src/daemon.rsmirrors the CLI's daemon lifecycle (src/cli/lib/daemon.ts) rather than re-implementing it:which::whichfor the locate step, a direct TCP probe and a small inline HTTP/1.1 GET for the/api/daemonownership check, and adaemon startspawn viaCommandthat writes stderr to the daily rolling log file. A daemon owned by the app is stopped on window close; a daemon joined from a terminal is left alone. -
KANDOWN_DAEMON_UPGRADED_TO=offis now set on every daemon the app spawns (Decision 8 in [[t280]]), disabling the CLI's self-upgrade timer so the Tauri updater is the single owner of the update surface.
Changed
-
apps/desktop/src-tauri/Cargo.tomlnow declares the slice 2 deps (tauri-plugin-dialog,serde,serde_json,which,semver,url); slice 1's empty-features pin is gone. -
apps/desktop/src-tauri/tauri.conf.jsonnow setsapp.withGlobalTauri = true(so the bundled picker talks to the Rust side throughwindow.__TAURI__without dragging the@tauri-apps/apipackage into the bundle) and a CSP that allowsconnect-srctohttp://127.0.0.1:*,http://localhost:*, and the Tauri IPC protocols. Slice 1'scsp: nullis gone. -
apps/desktop/src-tauri/capabilities/default.jsongrantsdialog:defaultso the native folder picker works under Tauri 2's capabilities model. -
apps/desktop/src-tauri/src/logging.rsswitches the panic-hook file computation from local time to UTC, matchingtracing_appender::rolling::daily's internal date. Slice 1's log filename agreed with the panic hook only during the day in CEST; at UTC midnight the two would have drifted apart and a panic and a normalerror!would have landed in different files. -
apps/desktop/package.jsondev/build scripts now transpilemain.tstomain.jsviatscbeforetauri build/tauri devso the bundled HTML can<script type="module" src="./main.js">without a Vite pipeline. The compiled JS is registered as a generated file inscripts/build-codemap.js. -
scripts/build-codemap.jsnow treatsapps/desktop/src/main.jsas generated output (sourced fromapps/desktop/src/main.ts), so the codemap index does not double- report the file.
Fixed
- The slice 1
daemon.rswas a placeholder. Slice 2'sdaemon.rscloses that gap, so the Tauri window no longer renders a blank page: the picker renders when there is no project, the daemon URL renders once the daemon is up, and the install screen renders when the CLI is missing.