mirror of
https://github.com/stablyai/orca.git
synced 2026-10-27 16:02:42 +00:00
* Add mobile image-diff previews via shared data-URI builder - Extracts a `buildImageDataUri` helper (src/shared/image-data-uri.ts) shared by the desktop ImageViewer and mobile, so both trim whitespace-wrapped base64 and skip non-previewable mimes (e.g. application/pdf) the same way. - Adds mobile-diff-image-preview.ts to render binary git.diff results (add/modify/ delete) as images instead of falling back to "Binary preview unavailable". - Extracts resolveMobileFileTabDoc to consolidate the session file-tab loading logic (diff/image/html/text) out of the route file for testability. * Fix stale binary image fallback for empty modified diffs and relay reads - mobileDiffImageDataUri now distinguishes a true deletion (modified side absent) from a modify whose binary bytes arrived empty (relay/size-cap cases), returning null instead of the stale pre-change image - readWorkingDiffFile passes the file path to bufferToBlob so relay working-tree reads can detect previewable image extensions instead of always reporting empty binary content - add mobile-file-tab-doc.test.ts covering diff/image/binary/text resolution paths * Regenerate skill bundle manifest for 1.4.144-rc.2 Co-authored-by: Orca <help@stably.ai> * fix(review): trim comments to AGENTS.md's one/two-line why-only rule Comments in mobile-diff-image-preview.ts and mobile-file-tab-doc.ts ran 3-6 lines and narrated mechanism instead of stating only the non-obvious reason, per AGENTS.md's "Code Comments: Document the Why, Briefly" rule. Co-authored-by: Orca <help@stably.ai> * Distinguish read failures from true deletions in binary diff results - Working-tree stat/readFile errors and relay reads previously collapsed onto the same empty-content signal as a genuine deletion, letting previewers fall back to stale original bytes on a failed read. - Add modifiedDeleted/missing flags through status.ts, git-handler-ops, and git-working-file-read so only proven deletions trigger the original-bytes fallback; failed reads now return null. - Tighten buildImageDataUri to accept only image/* mimes instead of special-casing application/pdf. * fix(relay): expect missing:false on index blob maxBuffer overflow readBlobAtIndex now returns a missing flag so staged deletions are distinct from size-capped binary reads; update the overflow test. * Allow opening deleted files to show pre-delete text or image diffs Deleted files can now be opened to view their pre-delete content via git.diff (including images via modifiedDeleted). Only unresolved conflicts remain unopenable. Centralizes the canOpen rule in canOpenMobileGitStatusEntry() to keep opener guards consistent across the mobile source control UI. --------- Co-authored-by: Orca <help@stably.ai>
124 lines
3.5 KiB
TypeScript
124 lines
3.5 KiB
TypeScript
import { describe, expect, it } from 'vitest'
|
|
import { mobileDiffImageDataUri } from './mobile-diff-image-preview'
|
|
|
|
describe('mobileDiffImageDataUri', () => {
|
|
it('renders a modified image diff from the post-change bytes', () => {
|
|
expect(
|
|
mobileDiffImageDataUri({
|
|
kind: 'binary',
|
|
originalContent: 'b2xk',
|
|
modifiedContent: 'bmV3',
|
|
isImage: true,
|
|
mimeType: 'image/png'
|
|
})
|
|
).toBe('data:image/png;base64,bmV3')
|
|
})
|
|
|
|
it('renders an added image diff (no original) from the modified bytes', () => {
|
|
expect(
|
|
mobileDiffImageDataUri({
|
|
kind: 'binary',
|
|
originalContent: '',
|
|
modifiedContent: 'bmV3',
|
|
isImage: true,
|
|
mimeType: 'image/png'
|
|
})
|
|
).toBe('data:image/png;base64,bmV3')
|
|
})
|
|
|
|
it('falls back to the original bytes for a proven deletion (modifiedDeleted)', () => {
|
|
expect(
|
|
mobileDiffImageDataUri({
|
|
kind: 'binary',
|
|
originalContent: 'b2xk',
|
|
originalIsBinary: true,
|
|
modifiedContent: '',
|
|
modifiedIsBinary: false,
|
|
modifiedDeleted: true,
|
|
isImage: true,
|
|
mimeType: 'image/jpeg'
|
|
})
|
|
).toBe('data:image/jpeg;base64,b2xk')
|
|
})
|
|
|
|
// The reviewer's read-failure case: a relay/SSH read returns an empty modified
|
|
// side with modifiedIsBinary false and no modifiedDeleted flag. Without a proven
|
|
// deletion, falling back to the original would show a stale pre-change image, so
|
|
// "unavailable" (null) is the honest result.
|
|
it('returns null on a read failure (empty modified, no modifiedDeleted flag)', () => {
|
|
expect(
|
|
mobileDiffImageDataUri({
|
|
kind: 'binary',
|
|
originalContent: 'b2xk',
|
|
originalIsBinary: true,
|
|
modifiedContent: '',
|
|
modifiedIsBinary: false,
|
|
isImage: true,
|
|
mimeType: 'image/png'
|
|
})
|
|
).toBeNull()
|
|
})
|
|
|
|
// Guards the >size-cap case: the modified side IS a binary image but its bytes
|
|
// arrive empty. Falling back to the original would render the stale pre-change
|
|
// image; "unavailable" is the honest result.
|
|
it('returns null for a modify whose binary modified side is empty (no stale fallback)', () => {
|
|
expect(
|
|
mobileDiffImageDataUri({
|
|
kind: 'binary',
|
|
originalContent: 'b2xk',
|
|
originalIsBinary: true,
|
|
modifiedContent: '',
|
|
modifiedIsBinary: true,
|
|
isImage: true,
|
|
mimeType: 'image/png'
|
|
})
|
|
).toBeNull()
|
|
})
|
|
|
|
it('returns null for a non-previewable binary (no isImage/mimeType)', () => {
|
|
expect(
|
|
mobileDiffImageDataUri({
|
|
kind: 'binary',
|
|
originalContent: '',
|
|
modifiedContent: 'AAAA'
|
|
})
|
|
).toBeNull()
|
|
})
|
|
|
|
it('returns null when flagged as image but carrying no bytes', () => {
|
|
expect(
|
|
mobileDiffImageDataUri({
|
|
kind: 'binary',
|
|
originalContent: '',
|
|
modifiedContent: '',
|
|
isImage: true,
|
|
mimeType: 'image/png'
|
|
})
|
|
).toBeNull()
|
|
})
|
|
|
|
it('returns null for application/pdf even when flagged as previewable', () => {
|
|
expect(
|
|
mobileDiffImageDataUri({
|
|
kind: 'binary',
|
|
originalContent: '',
|
|
modifiedContent: 'JVBER',
|
|
isImage: true,
|
|
mimeType: 'application/pdf'
|
|
})
|
|
).toBeNull()
|
|
})
|
|
|
|
it('returns null when flagged as image but mimeType is missing', () => {
|
|
expect(
|
|
mobileDiffImageDataUri({
|
|
kind: 'binary',
|
|
originalContent: '',
|
|
modifiedContent: 'bmV3',
|
|
isImage: true
|
|
})
|
|
).toBeNull()
|
|
})
|
|
})
|