Commit 2b41ae6
Mobile Ui Fixes (#212)
* Add mobile project icons and work controls
* Update ship-lane force-finalize guidance
* ship: iter 1 — address PR #212 review (greptile P2 + coderabbit + capy + copilot)
Greptile P2:
- registerIpc: validate projectResolveIcon rootPath via resolveAllowedRendererPath
- TopBar: bound projectIconCache with LRU(24); honor disabled before cache lookup
- ChatAttachmentTray: focus-trap lightbox (focus close on mount, Tab cycle,
restore on unmount, Escape to close)
CodeRabbit:
- registerIpc: return realpath from resolveAllowedRendererPath (TOCTOU defense);
switch image data URL handler to async fs.promises with size pre-check
- ptyService: restore Codex storage fallback for session-list hydration
(regression flagged); only resume-launch keeps the live-capture exclusion
- App.tsx: gate PersistentWorkSurface reveal on project-hydrated state, not
just `active`
- TopBar: don't reuse cached icons for newly-disabled projects
- ChatAttachmentTray: split attachmentName on /\\ for Windows paths;
aria-label on file remove button
- browserMock: add project.resolveIcon mock
- cliLaunch/useLaneWorkSessions/useWorkSessions: extract resolveLaunchFields()
so caller overrides are atomic — defaults only fire when no field supplied
- SyncService: refresh active-session snapshot when chatSummary cache mutates;
fall back to `now` for running sessions with no activity timestamp
- LaneAdvancedScreen: deny branch-switch for any mission lane (incl. nil role)
- LaneCommitSheet: TODO + broader needles for AI-setup error detection
(proper structured error code is a follow-up)
- LaneDetailContentSections: Pull/Fetch label + a11y reflect actual action
- LaneDetailScreen: drop divider when footer renders no content
- ADELiveActivityViews: trim modelId before isEmpty check
- ADETests: shortcut-vs-saved-host test uses fresh discovery timestamp
capy-ai (High Bug):
- SyncService: long-lived running sessions no longer fall through the
recency cutoff via stale `started` fallback
Copilot (selected, high-impact):
- ptyService: shrink readFilePrefix scan to 16 KB when scanning for
required marker (session meta is at the top)
- LaneCommitSheet: restore .onAppear focus on commit message field
Skipped: BrandMark retina assets (no source); Copilot ANSI-renderer
limitations (known/experimental, not regressions); Copilot design nits.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* ship: iter 2 — Copilot followup
- shell.ts: ANSI-C quote ($'...') args with embedded newlines/tabs/etc so the
PTY shell-fallback doesn't fire PS2 continuation prompts mid-startup-command.
Adds tests covering the codex preamble case.
- ChatAttachmentTray: lock body scroll while ImageLightbox is open so the
wheel doesn't move content behind the overlay; restore on close.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* ship: iter 3 — address PR #212 iter-2 review
Greptile P1 / security:
- projectIconResolver: use realpath-based resolvePathWithinRoot for both
the source-file scan and the candidate-icon stat path so a `public ->
/etc` symlink in a checked-out repo can't escape the project root.
Defensive try/catch on stat/read returns "no icon" rather than crashing.
- Added a regression test that symlinks `<root>/public` to an outside dir
and asserts no icon is returned.
CodeRabbit Critical:
- registerIpc.appGetImageDataUrl no longer derives MIME from the path
extension. Magic-byte sniffer (PNG, JPEG, GIF87/89, WebP, BMP, SVG with
optional <?xml prelude / BOM / leading whitespace) plus stat preflight
is the only path now; non-images throw "Path is not an image."
CodeRabbit Major:
- registerIpc.appWriteClipboardImage now runs the same readImageFileAndSniffMime
preflight before nativeImage.createFromPath, so the renderer can't make
the main process sync-read an arbitrarily large or non-image file.
- App.tsx PersistentWorkSurface inert effect deps extended to
[active, projectHydrated, hasActiveProject, showWelcome] so the effect
re-runs once the early-return guards settle and the workSurfaceRef is
a real node (fix for first cold /work mount).
CodeRabbit Minor:
- ChatAttachmentTray chip remove button: title now uses attachmentName(...)
to match aria-label, so sighted hover and AT both see the basename.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* ship: iter 4 — Copilot iter-3 followup
- sniffImageMimeType: recognize ICO (00 00 01 00) so .ico chat
attachments render their preview instead of failing through to
"Path is not an image."
- appWriteClipboardImage: hand the already-read buffer from
readImageFileAndSniffMime to nativeImage.createFromBuffer so the
file isn't re-read off the main thread (avoids a 10 MB sync read
pair for the largest allowed images).
Skipped: resolveLaunchFields permission-mode injection — verified via
git history that this was a deliberate part of the lane's main feature
commit (9d35235), not a review-loop regression. LiveActivityCoordinator
focused-lane flicker — pre-existing behavior, out of scope.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* ship: iter 5 — bump aiOrchestratorService overlap test budget for CI flake
The "does not enter a run body while another health sweep owns it" test
polls reconcileCalls in a 200 * 25ms = 5s window before asserting it
reached the gated onTrackedSessionEnded callback. That window has flaked
twice on the test-desktop(8) shard for this PR's pushes (and once on the
shard rerun after the same failure) while passing 3/3 locally — the
gated callback simply doesn't fire within 5s on a heavily loaded
runner.
Bump the wait window to 600 * 25ms = 15s and raise the test timeout
from 15s to 30s. Test exits immediately when the callback fires, so the
larger ceiling only kicks in for slow runners. No semantic change.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* ship: iter 6 (force-finalize) — fix iter-1 projectResolveIcon regression
Iter 1's "validate rootPath against allowlist" fix used the generic
file allowlist (project root + Downloads/Documents/Temp), which broke
tab/catalog icon resolution for any project living outside those
folders (e.g. ~/code/*). Switch to a project-root allowlist sourced
from globalState.recentProjects + current project root, so the access
boundary is the legitimate set of known projects.
CI stays green; Greptile + CodeRabbit + Copilot all reported terminal
on iter 5. This pass addresses the one new diff-line comment
(coderabbitai #3146852140) inline because it's a clear regression I
introduced earlier in the loop.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>1 parent 1418b0c commit 2b41ae6
70 files changed
Lines changed: 3248 additions & 1243 deletions
File tree
- .claude
- apps
- ade-cli
- desktop/src
- main
- services
- ipc
- orchestrator
- projects
- pty
- sync
- preload
- renderer
- components
- app
- chat
- lanes
- terminals
- lib
- ios
- ADE.xcodeproj
- ADETests
- ADEWidgets
- ADE
- App
- Assets.xcassets/BrandMark.imageset
- Models
- Services
- Views
- Lanes
- Work
- docs
- features
- chat
- lanes
- project-home
- pull-requests
- sync-and-multi-device
- terminals-and-sessions
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
This file was deleted.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
10 | 10 | | |
11 | 11 | | |
12 | 12 | | |
| 13 | + | |
13 | 14 | | |
14 | 15 | | |
15 | 16 | | |
| |||
45 | 46 | | |
46 | 47 | | |
47 | 48 | | |
| 49 | + | |
48 | 50 | | |
49 | 51 | | |
50 | 52 | | |
| |||
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
50 | 50 | | |
51 | 51 | | |
52 | 52 | | |
| 53 | + | |
53 | 54 | | |
54 | 55 | | |
55 | 56 | | |
| |||
955 | 956 | | |
956 | 957 | | |
957 | 958 | | |
| 959 | + | |
| 960 | + | |
| 961 | + | |
| 962 | + | |
958 | 963 | | |
959 | 964 | | |
960 | 965 | | |
| |||
3938 | 3943 | | |
3939 | 3944 | | |
3940 | 3945 | | |
| 3946 | + | |
3941 | 3947 | | |
3942 | 3948 | | |
3943 | 3949 | | |
| |||
3953 | 3959 | | |
3954 | 3960 | | |
3955 | 3961 | | |
| 3962 | + | |
3956 | 3963 | | |
3957 | 3964 | | |
3958 | 3965 | | |
3959 | 3966 | | |
3960 | 3967 | | |
3961 | 3968 | | |
3962 | 3969 | | |
| 3970 | + | |
| 3971 | + | |
| 3972 | + | |
| 3973 | + | |
| 3974 | + | |
| 3975 | + | |
| 3976 | + | |
| 3977 | + | |
| 3978 | + | |
| 3979 | + | |
| 3980 | + | |
| 3981 | + | |
| 3982 | + | |
| 3983 | + | |
| 3984 | + | |
| 3985 | + | |
3963 | 3986 | | |
3964 | 3987 | | |
3965 | 3988 | | |
| |||
3971 | 3994 | | |
3972 | 3995 | | |
3973 | 3996 | | |
3974 | | - | |
3975 | | - | |
3976 | | - | |
| 3997 | + | |
| 3998 | + | |
| 3999 | + | |
| 4000 | + | |
| 4001 | + | |
3977 | 4002 | | |
3978 | 4003 | | |
3979 | 4004 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | | - | |
| 1 | + | |
2 | 2 | | |
3 | 3 | | |
4 | 4 | | |
| |||
13 | 13 | | |
14 | 14 | | |
15 | 15 | | |
| 16 | + | |
16 | 17 | | |
17 | 18 | | |
18 | 19 | | |
| |||
258 | 259 | | |
259 | 260 | | |
260 | 261 | | |
| 262 | + | |
261 | 263 | | |
262 | 264 | | |
263 | 265 | | |
| |||
1890 | 1892 | | |
1891 | 1893 | | |
1892 | 1894 | | |
| 1895 | + | |
| 1896 | + | |
| 1897 | + | |
| 1898 | + | |
| 1899 | + | |
| 1900 | + | |
| 1901 | + | |
| 1902 | + | |
| 1903 | + | |
| 1904 | + | |
| 1905 | + | |
| 1906 | + | |
| 1907 | + | |
| 1908 | + | |
| 1909 | + | |
| 1910 | + | |
| 1911 | + | |
| 1912 | + | |
| 1913 | + | |
| 1914 | + | |
| 1915 | + | |
| 1916 | + | |
| 1917 | + | |
| 1918 | + | |
| 1919 | + | |
| 1920 | + | |
| 1921 | + | |
| 1922 | + | |
| 1923 | + | |
| 1924 | + | |
| 1925 | + | |
| 1926 | + | |
| 1927 | + | |
| 1928 | + | |
| 1929 | + | |
| 1930 | + | |
| 1931 | + | |
| 1932 | + | |
| 1933 | + | |
| 1934 | + | |
| 1935 | + | |
| 1936 | + | |
| 1937 | + | |
| 1938 | + | |
| 1939 | + | |
| 1940 | + | |
| 1941 | + | |
| 1942 | + | |
| 1943 | + | |
| 1944 | + | |
| 1945 | + | |
| 1946 | + | |
| 1947 | + | |
| 1948 | + | |
| 1949 | + | |
| 1950 | + | |
| 1951 | + | |
| 1952 | + | |
| 1953 | + | |
| 1954 | + | |
| 1955 | + | |
| 1956 | + | |
| 1957 | + | |
| 1958 | + | |
| 1959 | + | |
| 1960 | + | |
| 1961 | + | |
| 1962 | + | |
| 1963 | + | |
| 1964 | + | |
| 1965 | + | |
| 1966 | + | |
| 1967 | + | |
| 1968 | + | |
| 1969 | + | |
| 1970 | + | |
| 1971 | + | |
| 1972 | + | |
| 1973 | + | |
| 1974 | + | |
| 1975 | + | |
| 1976 | + | |
| 1977 | + | |
| 1978 | + | |
| 1979 | + | |
| 1980 | + | |
| 1981 | + | |
| 1982 | + | |
| 1983 | + | |
| 1984 | + | |
| 1985 | + | |
| 1986 | + | |
| 1987 | + | |
| 1988 | + | |
| 1989 | + | |
| 1990 | + | |
| 1991 | + | |
| 1992 | + | |
| 1993 | + | |
| 1994 | + | |
| 1995 | + | |
1893 | 1996 | | |
1894 | 1997 | | |
1895 | 1998 | | |
| |||
1940 | 2043 | | |
1941 | 2044 | | |
1942 | 2045 | | |
| 2046 | + | |
| 2047 | + | |
| 2048 | + | |
| 2049 | + | |
| 2050 | + | |
| 2051 | + | |
| 2052 | + | |
| 2053 | + | |
| 2054 | + | |
| 2055 | + | |
| 2056 | + | |
| 2057 | + | |
| 2058 | + | |
| 2059 | + | |
| 2060 | + | |
| 2061 | + | |
| 2062 | + | |
| 2063 | + | |
| 2064 | + | |
| 2065 | + | |
| 2066 | + | |
| 2067 | + | |
| 2068 | + | |
| 2069 | + | |
| 2070 | + | |
| 2071 | + | |
| 2072 | + | |
| 2073 | + | |
| 2074 | + | |
1943 | 2075 | | |
1944 | 2076 | | |
1945 | 2077 | | |
| |||
2146 | 2278 | | |
2147 | 2279 | | |
2148 | 2280 | | |
| 2281 | + | |
| 2282 | + | |
| 2283 | + | |
| 2284 | + | |
| 2285 | + | |
| 2286 | + | |
| 2287 | + | |
| 2288 | + | |
| 2289 | + | |
| 2290 | + | |
| 2291 | + | |
| 2292 | + | |
| 2293 | + | |
| 2294 | + | |
| 2295 | + | |
| 2296 | + | |
| 2297 | + | |
| 2298 | + | |
| 2299 | + | |
| 2300 | + | |
| 2301 | + | |
| 2302 | + | |
| 2303 | + | |
| 2304 | + | |
| 2305 | + | |
| 2306 | + | |
| 2307 | + | |
| 2308 | + | |
| 2309 | + | |
| 2310 | + | |
| 2311 | + | |
| 2312 | + | |
| 2313 | + | |
| 2314 | + | |
| 2315 | + | |
| 2316 | + | |
| 2317 | + | |
| 2318 | + | |
| 2319 | + | |
| 2320 | + | |
| 2321 | + | |
| 2322 | + | |
| 2323 | + | |
| 2324 | + | |
| 2325 | + | |
| 2326 | + | |
| 2327 | + | |
| 2328 | + | |
2149 | 2329 | | |
2150 | 2330 | | |
2151 | 2331 | | |
| |||
Lines changed: 6 additions & 4 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
3278 | 3278 | | |
3279 | 3279 | | |
3280 | 3280 | | |
3281 | | - | |
3282 | | - | |
3283 | | - | |
| 3281 | + | |
| 3282 | + | |
| 3283 | + | |
| 3284 | + | |
| 3285 | + | |
3284 | 3286 | | |
3285 | 3287 | | |
3286 | 3288 | | |
| |||
3295 | 3297 | | |
3296 | 3298 | | |
3297 | 3299 | | |
3298 | | - | |
| 3300 | + | |
3299 | 3301 | | |
3300 | 3302 | | |
3301 | 3303 | | |
| |||
0 commit comments