@dungle-scrubs/tallow 0.8.21 → 0.8.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +35 -4
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +1 -1
- package/dist/config.js +1 -1
- package/dist/interactive-mode-patch.d.ts +2 -0
- package/dist/interactive-mode-patch.d.ts.map +1 -1
- package/dist/interactive-mode-patch.js +82 -0
- package/dist/interactive-mode-patch.js.map +1 -1
- package/dist/sdk.d.ts +17 -0
- package/dist/sdk.d.ts.map +1 -1
- package/dist/sdk.js +68 -1
- package/dist/sdk.js.map +1 -1
- package/dist/workspace-transition-relay.d.ts +40 -7
- package/dist/workspace-transition-relay.d.ts.map +1 -1
- package/dist/workspace-transition-relay.js +81 -16
- package/dist/workspace-transition-relay.js.map +1 -1
- package/extensions/__integration__/background-task-widget-ownership.test.ts +216 -0
- package/extensions/__integration__/claude-hooks-compat.test.ts +156 -0
- package/extensions/__integration__/slash-command-bridge.test.ts +169 -23
- package/extensions/_shared/atomic-write.ts +1 -1
- package/extensions/_shared/bordered-box.ts +102 -0
- package/extensions/_shared/interop-events.ts +5 -0
- package/extensions/_shared/pid-registry.ts +1 -1
- package/extensions/agent-commands-tool/index.ts +4 -1
- package/extensions/background-task-tool/__tests__/lifecycle.test.ts +50 -25
- package/extensions/background-task-tool/index.ts +139 -221
- package/extensions/bash-tool-enhanced/index.ts +1 -75
- package/extensions/cd-tool/index.ts +2 -2
- package/extensions/context-fork/spawn.ts +4 -1
- package/extensions/health/index.ts +6 -6
- package/extensions/hooks/__tests__/claude-compat.test.ts +35 -0
- package/extensions/hooks/__tests__/subprocess-hardening.test.ts +73 -0
- package/extensions/hooks/index.ts +27 -4
- package/extensions/loop/__tests__/loop.test.ts +168 -4
- package/extensions/loop/extension.json +6 -5
- package/extensions/loop/index.ts +242 -31
- package/extensions/plan-mode-tool/__tests__/agent-end-execution.test.ts +373 -0
- package/extensions/plan-mode-tool/index.ts +103 -41
- package/extensions/prompt-suggestions/__tests__/editor-compatibility.test.ts +42 -0
- package/extensions/prompt-suggestions/index.ts +41 -6
- package/extensions/slash-command-bridge/__tests__/slash-command-bridge.test.ts +267 -671
- package/extensions/slash-command-bridge/extension.json +1 -1
- package/extensions/slash-command-bridge/index.ts +230 -116
- package/extensions/subagent-tool/index.ts +2 -2
- package/extensions/subagent-tool/process.ts +4 -5
- package/extensions/tasks/commands/register-tasks-extension.ts +41 -0
- package/extensions/teams-tool/__tests__/peer-messaging.test.ts +29 -24
- package/extensions/teams-tool/dashboard.ts +3 -5
- package/extensions/teams-tool/dispatch/auto-dispatch.ts +18 -1
- package/extensions/teams-tool/tools/teammate-tools.ts +9 -6
- package/extensions/wezterm-pane-control/__tests__/index.test.ts +88 -4
- package/extensions/wezterm-pane-control/index.ts +113 -8
- package/package.json +6 -4
- package/packages/tallow-tui/README.md +51 -0
- package/packages/tallow-tui/dist/autocomplete.d.ts +48 -0
- package/packages/tallow-tui/dist/autocomplete.d.ts.map +1 -0
- package/packages/tallow-tui/dist/autocomplete.js +564 -0
- package/packages/tallow-tui/dist/autocomplete.js.map +1 -0
- package/packages/tallow-tui/dist/border-styles.d.ts +32 -0
- package/packages/tallow-tui/dist/border-styles.d.ts.map +1 -0
- package/packages/tallow-tui/dist/border-styles.js +46 -0
- package/packages/tallow-tui/dist/border-styles.js.map +1 -0
- package/packages/tallow-tui/dist/components/bordered-box.d.ts +52 -0
- package/packages/tallow-tui/dist/components/bordered-box.d.ts.map +1 -0
- package/packages/tallow-tui/dist/components/bordered-box.js +89 -0
- package/packages/tallow-tui/dist/components/bordered-box.js.map +1 -0
- package/packages/tallow-tui/dist/components/box.d.ts +22 -0
- package/packages/tallow-tui/dist/components/box.d.ts.map +1 -0
- package/packages/tallow-tui/dist/components/box.js +104 -0
- package/packages/tallow-tui/dist/components/box.js.map +1 -0
- package/packages/tallow-tui/dist/components/cancellable-loader.d.ts +22 -0
- package/packages/tallow-tui/dist/components/cancellable-loader.d.ts.map +1 -0
- package/packages/tallow-tui/dist/components/cancellable-loader.js +35 -0
- package/packages/tallow-tui/dist/components/cancellable-loader.js.map +1 -0
- package/packages/tallow-tui/dist/components/editor.d.ts +240 -0
- package/packages/tallow-tui/dist/components/editor.d.ts.map +1 -0
- package/packages/tallow-tui/dist/components/editor.js +1766 -0
- package/packages/tallow-tui/dist/components/editor.js.map +1 -0
- package/packages/tallow-tui/dist/components/image.d.ts +126 -0
- package/packages/tallow-tui/dist/components/image.d.ts.map +1 -0
- package/packages/tallow-tui/dist/components/image.js +245 -0
- package/packages/tallow-tui/dist/components/image.js.map +1 -0
- package/packages/tallow-tui/dist/components/input.d.ts +37 -0
- package/packages/tallow-tui/dist/components/input.d.ts.map +1 -0
- package/packages/tallow-tui/dist/components/input.js +439 -0
- package/packages/tallow-tui/dist/components/input.js.map +1 -0
- package/packages/tallow-tui/dist/components/loader.d.ts +88 -0
- package/packages/tallow-tui/dist/components/loader.d.ts.map +1 -0
- package/packages/tallow-tui/dist/components/loader.js +146 -0
- package/packages/tallow-tui/dist/components/loader.js.map +1 -0
- package/packages/tallow-tui/dist/components/markdown.d.ts +95 -0
- package/packages/tallow-tui/dist/components/markdown.d.ts.map +1 -0
- package/packages/tallow-tui/dist/components/markdown.js +633 -0
- package/packages/tallow-tui/dist/components/markdown.js.map +1 -0
- package/packages/tallow-tui/dist/components/select-list.d.ts +32 -0
- package/packages/tallow-tui/dist/components/select-list.d.ts.map +1 -0
- package/packages/tallow-tui/dist/components/select-list.js +156 -0
- package/packages/tallow-tui/dist/components/select-list.js.map +1 -0
- package/packages/tallow-tui/dist/components/settings-list.d.ts +50 -0
- package/packages/tallow-tui/dist/components/settings-list.d.ts.map +1 -0
- package/packages/tallow-tui/dist/components/settings-list.js +189 -0
- package/packages/tallow-tui/dist/components/settings-list.js.map +1 -0
- package/packages/tallow-tui/dist/components/spacer.d.ts +12 -0
- package/packages/tallow-tui/dist/components/spacer.d.ts.map +1 -0
- package/packages/tallow-tui/dist/components/spacer.js +23 -0
- package/packages/tallow-tui/dist/components/spacer.js.map +1 -0
- package/packages/tallow-tui/dist/components/text.d.ts +19 -0
- package/packages/tallow-tui/dist/components/text.d.ts.map +1 -0
- package/packages/tallow-tui/dist/components/text.js +91 -0
- package/packages/tallow-tui/dist/components/text.js.map +1 -0
- package/packages/tallow-tui/dist/components/truncated-text.d.ts +13 -0
- package/packages/tallow-tui/dist/components/truncated-text.d.ts.map +1 -0
- package/packages/tallow-tui/dist/components/truncated-text.js +51 -0
- package/packages/tallow-tui/dist/components/truncated-text.js.map +1 -0
- package/packages/tallow-tui/dist/editor-component.d.ts +50 -0
- package/packages/tallow-tui/dist/editor-component.d.ts.map +1 -0
- package/packages/tallow-tui/dist/editor-component.js +2 -0
- package/packages/tallow-tui/dist/editor-component.js.map +1 -0
- package/packages/tallow-tui/dist/fuzzy.d.ts +16 -0
- package/packages/tallow-tui/dist/fuzzy.d.ts.map +1 -0
- package/packages/tallow-tui/dist/fuzzy.js +107 -0
- package/packages/tallow-tui/dist/fuzzy.js.map +1 -0
- package/packages/tallow-tui/dist/index.d.ts +25 -0
- package/packages/tallow-tui/dist/index.d.ts.map +1 -0
- package/packages/tallow-tui/dist/index.js +35 -0
- package/packages/tallow-tui/dist/index.js.map +1 -0
- package/packages/tallow-tui/dist/keybindings.d.ts +39 -0
- package/packages/tallow-tui/dist/keybindings.d.ts.map +1 -0
- package/packages/tallow-tui/dist/keybindings.js +114 -0
- package/packages/tallow-tui/dist/keybindings.js.map +1 -0
- package/packages/tallow-tui/dist/keys.d.ts +168 -0
- package/packages/tallow-tui/dist/keys.d.ts.map +1 -0
- package/packages/tallow-tui/dist/keys.js +971 -0
- package/packages/tallow-tui/dist/keys.js.map +1 -0
- package/packages/tallow-tui/dist/kill-ring.d.ts +28 -0
- package/packages/tallow-tui/dist/kill-ring.d.ts.map +1 -0
- package/packages/tallow-tui/dist/kill-ring.js +44 -0
- package/packages/tallow-tui/dist/kill-ring.js.map +1 -0
- package/packages/tallow-tui/dist/stdin-buffer.d.ts +48 -0
- package/packages/tallow-tui/dist/stdin-buffer.d.ts.map +1 -0
- package/packages/tallow-tui/dist/stdin-buffer.js +317 -0
- package/packages/tallow-tui/dist/stdin-buffer.js.map +1 -0
- package/packages/tallow-tui/dist/terminal-image.d.ts +161 -0
- package/packages/tallow-tui/dist/terminal-image.d.ts.map +1 -0
- package/packages/tallow-tui/dist/terminal-image.js +460 -0
- package/packages/tallow-tui/dist/terminal-image.js.map +1 -0
- package/packages/tallow-tui/dist/terminal.d.ts +102 -0
- package/packages/tallow-tui/dist/terminal.d.ts.map +1 -0
- package/packages/tallow-tui/dist/terminal.js +263 -0
- package/packages/tallow-tui/dist/terminal.js.map +1 -0
- package/packages/tallow-tui/dist/test-utils/capability-env.d.ts +14 -0
- package/packages/tallow-tui/dist/test-utils/capability-env.d.ts.map +1 -0
- package/packages/tallow-tui/dist/test-utils/capability-env.js +55 -0
- package/packages/tallow-tui/dist/test-utils/capability-env.js.map +1 -0
- package/packages/tallow-tui/dist/tui.d.ts +239 -0
- package/packages/tallow-tui/dist/tui.d.ts.map +1 -0
- package/packages/tallow-tui/dist/tui.js +1058 -0
- package/packages/tallow-tui/dist/tui.js.map +1 -0
- package/packages/tallow-tui/dist/undo-stack.d.ts +17 -0
- package/packages/tallow-tui/dist/undo-stack.d.ts.map +1 -0
- package/packages/tallow-tui/dist/undo-stack.js +25 -0
- package/packages/tallow-tui/dist/undo-stack.js.map +1 -0
- package/packages/tallow-tui/dist/utils.d.ts +96 -0
- package/packages/tallow-tui/dist/utils.d.ts.map +1 -0
- package/packages/tallow-tui/dist/utils.js +843 -0
- package/packages/tallow-tui/dist/utils.js.map +1 -0
- package/packages/tallow-tui/package.json +24 -0
- package/packages/tallow-tui/src/__tests__/__snapshots__/render.test.ts.snap +121 -0
- package/packages/tallow-tui/src/__tests__/editor-border.test.ts +72 -0
- package/packages/tallow-tui/src/__tests__/editor-change-listener.test.ts +121 -0
- package/packages/tallow-tui/src/__tests__/editor-ghost-text.test.ts +112 -0
- package/packages/tallow-tui/src/__tests__/fuzzy.test.ts +91 -0
- package/packages/tallow-tui/src/__tests__/image-component.test.ts +113 -0
- package/packages/tallow-tui/src/__tests__/keys.test.ts +141 -0
- package/packages/tallow-tui/src/__tests__/render.test.ts +179 -0
- package/packages/tallow-tui/src/__tests__/stdin-buffer.test.ts +82 -0
- package/packages/tallow-tui/src/__tests__/terminal-image.test.ts +363 -0
- package/packages/tallow-tui/src/__tests__/tui-diff-regression.test.ts +454 -0
- package/packages/tallow-tui/src/__tests__/tui-render-scheduling.test.ts +256 -0
- package/packages/tallow-tui/src/__tests__/utils.test.ts +259 -0
- package/packages/tallow-tui/src/autocomplete.ts +716 -0
- package/packages/tallow-tui/src/border-styles.ts +60 -0
- package/packages/tallow-tui/src/components/bordered-box.ts +113 -0
- package/packages/tallow-tui/src/components/box.ts +137 -0
- package/packages/tallow-tui/src/components/cancellable-loader.ts +40 -0
- package/packages/tallow-tui/src/components/editor.ts +2143 -0
- package/packages/tallow-tui/src/components/image.ts +315 -0
- package/packages/tallow-tui/src/components/input.ts +522 -0
- package/packages/tallow-tui/src/components/loader.ts +187 -0
- package/packages/tallow-tui/src/components/markdown.ts +780 -0
- package/packages/tallow-tui/src/components/select-list.ts +197 -0
- package/packages/tallow-tui/src/components/settings-list.ts +264 -0
- package/packages/tallow-tui/src/components/spacer.ts +28 -0
- package/packages/tallow-tui/src/components/text.ts +113 -0
- package/packages/tallow-tui/src/components/truncated-text.ts +65 -0
- package/packages/tallow-tui/src/editor-component.ts +92 -0
- package/packages/tallow-tui/src/fuzzy.ts +133 -0
- package/packages/tallow-tui/src/index.ts +118 -0
- package/packages/tallow-tui/src/keybindings.ts +183 -0
- package/packages/tallow-tui/src/keys.ts +1189 -0
- package/packages/tallow-tui/src/kill-ring.ts +46 -0
- package/packages/tallow-tui/src/stdin-buffer.ts +386 -0
- package/packages/tallow-tui/src/terminal-image.ts +619 -0
- package/packages/tallow-tui/src/terminal.ts +350 -0
- package/packages/tallow-tui/src/test-utils/capability-env.ts +56 -0
- package/packages/tallow-tui/src/tui.ts +1336 -0
- package/packages/tallow-tui/src/undo-stack.ts +28 -0
- package/packages/tallow-tui/src/utils.ts +948 -0
- package/packages/tallow-tui/tsconfig.build.json +21 -0
- package/runtime/agent-runner.ts +20 -0
- package/runtime/atomic-write.ts +8 -0
- package/runtime/otel.ts +12 -0
- package/runtime/resolve-module.ts +23 -0
- package/runtime/runtime-path-provider.ts +12 -0
- package/runtime/runtime-provenance.ts +17 -0
- package/runtime/workspace-transition-relay.ts +21 -0
- package/runtime/workspace-transition.ts +29 -0
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
export type ImageProtocol = "kitty" | "iterm2" | null;
|
|
2
|
+
export interface TerminalCapabilities {
|
|
3
|
+
images: ImageProtocol;
|
|
4
|
+
trueColor: boolean;
|
|
5
|
+
hyperlinks: boolean;
|
|
6
|
+
}
|
|
7
|
+
export interface CellDimensions {
|
|
8
|
+
widthPx: number;
|
|
9
|
+
heightPx: number;
|
|
10
|
+
}
|
|
11
|
+
export interface ImageDimensions {
|
|
12
|
+
widthPx: number;
|
|
13
|
+
heightPx: number;
|
|
14
|
+
}
|
|
15
|
+
export interface ImageRenderOptions {
|
|
16
|
+
maxWidthCells?: number;
|
|
17
|
+
maxHeightCells?: number;
|
|
18
|
+
preserveAspectRatio?: boolean;
|
|
19
|
+
/** Kitty image ID. If provided, reuses/replaces existing image with this ID. */
|
|
20
|
+
imageId?: number;
|
|
21
|
+
}
|
|
22
|
+
export declare function getCellDimensions(): CellDimensions;
|
|
23
|
+
export declare function setCellDimensions(dims: CellDimensions): void;
|
|
24
|
+
export declare function detectCapabilities(): TerminalCapabilities;
|
|
25
|
+
export declare function getCapabilities(): TerminalCapabilities;
|
|
26
|
+
export declare function resetCapabilitiesCache(): void;
|
|
27
|
+
export declare function isImageLine(line: string): boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Generate a random image ID for Kitty graphics protocol.
|
|
30
|
+
* Uses random IDs to avoid collisions between different module instances
|
|
31
|
+
* (e.g., main app vs extensions).
|
|
32
|
+
*/
|
|
33
|
+
export declare function allocateImageId(): number;
|
|
34
|
+
export declare function encodeKitty(base64Data: string, options?: {
|
|
35
|
+
columns?: number;
|
|
36
|
+
rows?: number;
|
|
37
|
+
imageId?: number;
|
|
38
|
+
}): string;
|
|
39
|
+
/**
|
|
40
|
+
* Delete a Kitty graphics image by ID.
|
|
41
|
+
* Uses uppercase 'I' to also free the image data.
|
|
42
|
+
*/
|
|
43
|
+
export declare function deleteKittyImage(imageId: number): string;
|
|
44
|
+
/**
|
|
45
|
+
* Delete all visible Kitty graphics images.
|
|
46
|
+
* Uses uppercase 'A' to also free the image data.
|
|
47
|
+
*/
|
|
48
|
+
export declare function deleteAllKittyImages(): string;
|
|
49
|
+
export declare function encodeITerm2(base64Data: string, options?: {
|
|
50
|
+
width?: number | string;
|
|
51
|
+
height?: number | string;
|
|
52
|
+
name?: string;
|
|
53
|
+
preserveAspectRatio?: boolean;
|
|
54
|
+
inline?: boolean;
|
|
55
|
+
}): string;
|
|
56
|
+
/** Layout dimensions for a rendered image in terminal cells. */
|
|
57
|
+
export interface ImageLayout {
|
|
58
|
+
/** Number of terminal rows the image occupies. */
|
|
59
|
+
rows: number;
|
|
60
|
+
/** Number of terminal columns the image occupies. */
|
|
61
|
+
columns: number;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Calculate the cell layout for an image at a given max width.
|
|
65
|
+
* Clamps to the image's natural pixel width (prevents upscaling),
|
|
66
|
+
* then optionally clamps height and back-calculates width to preserve aspect ratio.
|
|
67
|
+
*
|
|
68
|
+
* Uses nearest-integer quantization instead of always rounding up to reduce
|
|
69
|
+
* narrow-width aspect distortion.
|
|
70
|
+
*
|
|
71
|
+
* @param imageDimensions - Native pixel dimensions of the image
|
|
72
|
+
* @param maxWidthCells - Maximum column count for the image
|
|
73
|
+
* @param cellDims - Terminal cell pixel dimensions
|
|
74
|
+
* @param maxHeightCells - Optional row cap (portrait images)
|
|
75
|
+
* @returns Layout with rows and columns the image will occupy
|
|
76
|
+
*/
|
|
77
|
+
export declare function calculateImageLayout(imageDimensions: ImageDimensions, maxWidthCells: number, cellDims?: CellDimensions, maxHeightCells?: number): ImageLayout;
|
|
78
|
+
export declare function getPngDimensions(base64Data: string): ImageDimensions | null;
|
|
79
|
+
export declare function getJpegDimensions(base64Data: string): ImageDimensions | null;
|
|
80
|
+
export declare function getGifDimensions(base64Data: string): ImageDimensions | null;
|
|
81
|
+
export declare function getWebpDimensions(base64Data: string): ImageDimensions | null;
|
|
82
|
+
/** Supported image format identifiers returned by `detectImageFormat`. */
|
|
83
|
+
export type ImageFormat = "png" | "jpeg" | "gif" | "webp";
|
|
84
|
+
/**
|
|
85
|
+
* Detect image format from file header bytes (magic numbers).
|
|
86
|
+
*
|
|
87
|
+
* Checks the first few bytes of a buffer for known image signatures:
|
|
88
|
+
* - PNG: `89 50 4E 47 0D 0A 1A 0A` (8 bytes)
|
|
89
|
+
* - JPEG: `FF D8 FF` (3 bytes)
|
|
90
|
+
* - GIF: `47 49 46 38` + `37`/`39` + `61` (GIF87a / GIF89a)
|
|
91
|
+
* - WebP: `52 49 46 46 ... 57 45 42 50` (RIFF at 0-3, WEBP at 8-11)
|
|
92
|
+
*
|
|
93
|
+
* @param buffer - Raw file bytes (only first 12 bytes are inspected)
|
|
94
|
+
* @returns Detected format string, or null if not a recognized image
|
|
95
|
+
*/
|
|
96
|
+
export declare function detectImageFormat(buffer: Buffer): ImageFormat | null;
|
|
97
|
+
/**
|
|
98
|
+
* Map an `ImageFormat` to its standard MIME type string.
|
|
99
|
+
*
|
|
100
|
+
* @param format - Detected image format
|
|
101
|
+
* @returns MIME type (e.g., `"image/png"`)
|
|
102
|
+
*/
|
|
103
|
+
export declare function imageFormatToMime(format: ImageFormat): string;
|
|
104
|
+
/** Metadata about an image's original and display dimensions after processing. */
|
|
105
|
+
export interface ImageMetadata {
|
|
106
|
+
/** Original pixel width before any resizing. */
|
|
107
|
+
readonly originalWidth: number;
|
|
108
|
+
/** Original pixel height before any resizing. */
|
|
109
|
+
readonly originalHeight: number;
|
|
110
|
+
/** Display pixel width after resizing (equals original if not resized). */
|
|
111
|
+
readonly displayWidth: number;
|
|
112
|
+
/** Display pixel height after resizing (equals original if not resized). */
|
|
113
|
+
readonly displayHeight: number;
|
|
114
|
+
/** Whether the image was resized from its original dimensions. */
|
|
115
|
+
readonly resized: boolean;
|
|
116
|
+
/** Detected image format (e.g., "png", "jpeg"). */
|
|
117
|
+
readonly format: ImageFormat | null;
|
|
118
|
+
/** File size in bytes, if known. */
|
|
119
|
+
readonly sizeBytes?: number;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Create an `ImageMetadata` object from original and display dimensions.
|
|
123
|
+
*
|
|
124
|
+
* Sets `resized` automatically by comparing original and display dimensions.
|
|
125
|
+
*
|
|
126
|
+
* @param original - Original pixel dimensions before resizing
|
|
127
|
+
* @param display - Display pixel dimensions after resizing
|
|
128
|
+
* @param format - Detected image format, or null if unknown
|
|
129
|
+
* @param sizeBytes - File size in bytes (optional)
|
|
130
|
+
* @returns Populated ImageMetadata
|
|
131
|
+
*/
|
|
132
|
+
export declare function createImageMetadata(original: ImageDimensions, display: ImageDimensions, format: ImageFormat | null, sizeBytes?: number): ImageMetadata;
|
|
133
|
+
/**
|
|
134
|
+
* Format a compact dimension string for display.
|
|
135
|
+
*
|
|
136
|
+
* - Not resized: `"1920×1080"`
|
|
137
|
+
* - Resized: `"3840×2160 → 1920×1080"`
|
|
138
|
+
*
|
|
139
|
+
* @param meta - Image metadata with dimension info
|
|
140
|
+
* @returns Formatted dimension string
|
|
141
|
+
*/
|
|
142
|
+
export declare function formatImageDimensions(meta: ImageMetadata): string;
|
|
143
|
+
export declare function getImageDimensions(base64Data: string, mimeType: string): ImageDimensions | null;
|
|
144
|
+
/**
|
|
145
|
+
* Render an image as a terminal escape sequence (Kitty or iTerm2 protocol).
|
|
146
|
+
* Returns the escape sequence, the number of rows/columns it occupies, and
|
|
147
|
+
* an optional Kitty image ID for later cleanup.
|
|
148
|
+
*
|
|
149
|
+
* @param base64Data - Base64-encoded image data
|
|
150
|
+
* @param imageDimensions - Native pixel dimensions
|
|
151
|
+
* @param options - Width/height caps, aspect ratio, image ID
|
|
152
|
+
* @returns Rendered sequence with layout info, or null if unsupported
|
|
153
|
+
*/
|
|
154
|
+
export declare function renderImage(base64Data: string, imageDimensions: ImageDimensions, options?: ImageRenderOptions): {
|
|
155
|
+
sequence: string;
|
|
156
|
+
rows: number;
|
|
157
|
+
columns: number;
|
|
158
|
+
imageId?: number;
|
|
159
|
+
} | null;
|
|
160
|
+
export declare function imageFallback(mimeType: string, dimensions?: ImageDimensions, filename?: string): string;
|
|
161
|
+
//# sourceMappingURL=terminal-image.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal-image.d.ts","sourceRoot":"","sources":["../src/terminal-image.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,460 @@
|
|
|
1
|
+
let cachedCapabilities = null;
|
|
2
|
+
// Default cell dimensions - updated by TUI when terminal responds to query
|
|
3
|
+
let cellDimensions = { widthPx: 9, heightPx: 18 };
|
|
4
|
+
export function getCellDimensions() {
|
|
5
|
+
return cellDimensions;
|
|
6
|
+
}
|
|
7
|
+
export function setCellDimensions(dims) {
|
|
8
|
+
if (dims.widthPx > 0 && dims.heightPx > 0) {
|
|
9
|
+
cellDimensions = dims;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export function detectCapabilities() {
|
|
13
|
+
const termProgram = process.env.TERM_PROGRAM?.toLowerCase() || "";
|
|
14
|
+
const term = process.env.TERM?.toLowerCase() || "";
|
|
15
|
+
const colorTerm = process.env.COLORTERM?.toLowerCase() || "";
|
|
16
|
+
if (process.env.KITTY_WINDOW_ID || termProgram === "kitty") {
|
|
17
|
+
return { images: "kitty", trueColor: true, hyperlinks: true };
|
|
18
|
+
}
|
|
19
|
+
if (termProgram === "ghostty" || term.includes("ghostty") || process.env.GHOSTTY_RESOURCES_DIR) {
|
|
20
|
+
return { images: "kitty", trueColor: true, hyperlinks: true };
|
|
21
|
+
}
|
|
22
|
+
if (process.env.WEZTERM_PANE || termProgram === "wezterm") {
|
|
23
|
+
return { images: "kitty", trueColor: true, hyperlinks: true };
|
|
24
|
+
}
|
|
25
|
+
if (process.env.ITERM_SESSION_ID || termProgram === "iterm.app") {
|
|
26
|
+
return { images: "iterm2", trueColor: true, hyperlinks: true };
|
|
27
|
+
}
|
|
28
|
+
if (termProgram === "vscode") {
|
|
29
|
+
return { images: null, trueColor: true, hyperlinks: true };
|
|
30
|
+
}
|
|
31
|
+
if (termProgram === "alacritty") {
|
|
32
|
+
return { images: null, trueColor: true, hyperlinks: true };
|
|
33
|
+
}
|
|
34
|
+
const trueColor = colorTerm === "truecolor" || colorTerm === "24bit";
|
|
35
|
+
return { images: null, trueColor, hyperlinks: true };
|
|
36
|
+
}
|
|
37
|
+
export function getCapabilities() {
|
|
38
|
+
if (!cachedCapabilities) {
|
|
39
|
+
cachedCapabilities = detectCapabilities();
|
|
40
|
+
}
|
|
41
|
+
return cachedCapabilities;
|
|
42
|
+
}
|
|
43
|
+
export function resetCapabilitiesCache() {
|
|
44
|
+
cachedCapabilities = null;
|
|
45
|
+
}
|
|
46
|
+
const KITTY_PREFIX = "\x1b_G";
|
|
47
|
+
const ITERM2_PREFIX = "\x1b]1337;File=";
|
|
48
|
+
export function isImageLine(line) {
|
|
49
|
+
// Fast path: sequence at line start (single-row images)
|
|
50
|
+
if (line.startsWith(KITTY_PREFIX) || line.startsWith(ITERM2_PREFIX)) {
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
// Slow path: sequence elsewhere (multi-row images have cursor-up prefix)
|
|
54
|
+
return line.includes(KITTY_PREFIX) || line.includes(ITERM2_PREFIX);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Generate a random image ID for Kitty graphics protocol.
|
|
58
|
+
* Uses random IDs to avoid collisions between different module instances
|
|
59
|
+
* (e.g., main app vs extensions).
|
|
60
|
+
*/
|
|
61
|
+
export function allocateImageId() {
|
|
62
|
+
// Use random ID in range [1, 0xffffffff] to avoid collisions
|
|
63
|
+
return Math.floor(Math.random() * 0xfffffffe) + 1;
|
|
64
|
+
}
|
|
65
|
+
export function encodeKitty(base64Data, options = {}) {
|
|
66
|
+
const CHUNK_SIZE = 4096;
|
|
67
|
+
const params = ["a=T", "f=100", "q=2"];
|
|
68
|
+
if (options.columns)
|
|
69
|
+
params.push(`c=${options.columns}`);
|
|
70
|
+
if (options.rows)
|
|
71
|
+
params.push(`r=${options.rows}`);
|
|
72
|
+
if (options.imageId)
|
|
73
|
+
params.push(`i=${options.imageId}`);
|
|
74
|
+
if (base64Data.length <= CHUNK_SIZE) {
|
|
75
|
+
return `\x1b_G${params.join(",")};${base64Data}\x1b\\`;
|
|
76
|
+
}
|
|
77
|
+
const chunks = [];
|
|
78
|
+
let offset = 0;
|
|
79
|
+
let isFirst = true;
|
|
80
|
+
while (offset < base64Data.length) {
|
|
81
|
+
const chunk = base64Data.slice(offset, offset + CHUNK_SIZE);
|
|
82
|
+
const isLast = offset + CHUNK_SIZE >= base64Data.length;
|
|
83
|
+
if (isFirst) {
|
|
84
|
+
chunks.push(`\x1b_G${params.join(",")},m=1;${chunk}\x1b\\`);
|
|
85
|
+
isFirst = false;
|
|
86
|
+
}
|
|
87
|
+
else if (isLast) {
|
|
88
|
+
chunks.push(`\x1b_Gm=0;${chunk}\x1b\\`);
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
chunks.push(`\x1b_Gm=1;${chunk}\x1b\\`);
|
|
92
|
+
}
|
|
93
|
+
offset += CHUNK_SIZE;
|
|
94
|
+
}
|
|
95
|
+
return chunks.join("");
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Delete a Kitty graphics image by ID.
|
|
99
|
+
* Uses uppercase 'I' to also free the image data.
|
|
100
|
+
*/
|
|
101
|
+
export function deleteKittyImage(imageId) {
|
|
102
|
+
return `\x1b_Ga=d,d=I,i=${imageId}\x1b\\`;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Delete all visible Kitty graphics images.
|
|
106
|
+
* Uses uppercase 'A' to also free the image data.
|
|
107
|
+
*/
|
|
108
|
+
export function deleteAllKittyImages() {
|
|
109
|
+
return `\x1b_Ga=d,d=A\x1b\\`;
|
|
110
|
+
}
|
|
111
|
+
export function encodeITerm2(base64Data, options = {}) {
|
|
112
|
+
const params = [`inline=${options.inline !== false ? 1 : 0}`];
|
|
113
|
+
if (options.width !== undefined)
|
|
114
|
+
params.push(`width=${options.width}`);
|
|
115
|
+
if (options.height !== undefined)
|
|
116
|
+
params.push(`height=${options.height}`);
|
|
117
|
+
if (options.name) {
|
|
118
|
+
const nameBase64 = Buffer.from(options.name).toString("base64");
|
|
119
|
+
params.push(`name=${nameBase64}`);
|
|
120
|
+
}
|
|
121
|
+
if (options.preserveAspectRatio === false) {
|
|
122
|
+
params.push("preserveAspectRatio=0");
|
|
123
|
+
}
|
|
124
|
+
return `\x1b]1337;File=${params.join(";")}:${base64Data}\x07`;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Pick the closest valid integer terminal cell count for a fractional target.
|
|
128
|
+
*
|
|
129
|
+
* @param target - Ideal (fractional) cell count
|
|
130
|
+
* @param min - Minimum allowed cell count (inclusive)
|
|
131
|
+
* @param max - Maximum allowed cell count (inclusive)
|
|
132
|
+
* @returns Closest in-range integer cell count
|
|
133
|
+
*/
|
|
134
|
+
function closestCellCount(target, min, max) {
|
|
135
|
+
const lower = Math.max(min, Math.min(max, Math.floor(target)));
|
|
136
|
+
const upper = Math.max(min, Math.min(max, Math.ceil(target)));
|
|
137
|
+
if (lower === upper) {
|
|
138
|
+
return lower;
|
|
139
|
+
}
|
|
140
|
+
return Math.abs(target - upper) < Math.abs(target - lower) ? upper : lower;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Calculate the cell layout for an image at a given max width.
|
|
144
|
+
* Clamps to the image's natural pixel width (prevents upscaling),
|
|
145
|
+
* then optionally clamps height and back-calculates width to preserve aspect ratio.
|
|
146
|
+
*
|
|
147
|
+
* Uses nearest-integer quantization instead of always rounding up to reduce
|
|
148
|
+
* narrow-width aspect distortion.
|
|
149
|
+
*
|
|
150
|
+
* @param imageDimensions - Native pixel dimensions of the image
|
|
151
|
+
* @param maxWidthCells - Maximum column count for the image
|
|
152
|
+
* @param cellDims - Terminal cell pixel dimensions
|
|
153
|
+
* @param maxHeightCells - Optional row cap (portrait images)
|
|
154
|
+
* @returns Layout with rows and columns the image will occupy
|
|
155
|
+
*/
|
|
156
|
+
export function calculateImageLayout(imageDimensions, maxWidthCells, cellDims = { widthPx: 9, heightPx: 18 }, maxHeightCells) {
|
|
157
|
+
const safeImageWidthPx = Math.max(1, imageDimensions.widthPx);
|
|
158
|
+
const safeImageHeightPx = Math.max(1, imageDimensions.heightPx);
|
|
159
|
+
const safeCellWidthPx = Math.max(1, cellDims.widthPx);
|
|
160
|
+
const safeCellHeightPx = Math.max(1, cellDims.heightPx);
|
|
161
|
+
const safeMaxWidthCells = Math.max(1, Math.floor(maxWidthCells));
|
|
162
|
+
const safeMaxHeightCells = maxHeightCells === undefined ? undefined : Math.max(1, Math.floor(maxHeightCells));
|
|
163
|
+
// Clamp to natural width — prevents upscaling small images.
|
|
164
|
+
const naturalCols = Math.max(1, Math.ceil(safeImageWidthPx / safeCellWidthPx));
|
|
165
|
+
const maxColumns = Math.min(safeMaxWidthCells, naturalCols);
|
|
166
|
+
let columns = maxColumns;
|
|
167
|
+
const idealRows = (columns * safeCellWidthPx * safeImageHeightPx) / (safeImageWidthPx * safeCellHeightPx);
|
|
168
|
+
let rows = closestCellCount(idealRows, 1, Number.MAX_SAFE_INTEGER);
|
|
169
|
+
// When height-clamped, reduce columns proportionally to preserve aspect ratio.
|
|
170
|
+
// Without this, the terminal receives a wide column count but the text layer
|
|
171
|
+
// only reserves maxHeightCells rows, causing the image to overflow or squish.
|
|
172
|
+
if (safeMaxHeightCells !== undefined && rows > safeMaxHeightCells) {
|
|
173
|
+
rows = safeMaxHeightCells;
|
|
174
|
+
const idealColumns = (rows * safeCellHeightPx * safeImageWidthPx) / (safeImageHeightPx * safeCellWidthPx);
|
|
175
|
+
columns = closestCellCount(idealColumns, 1, maxColumns);
|
|
176
|
+
}
|
|
177
|
+
return { columns: Math.max(1, columns), rows: Math.max(1, rows) };
|
|
178
|
+
}
|
|
179
|
+
export function getPngDimensions(base64Data) {
|
|
180
|
+
try {
|
|
181
|
+
const buffer = Buffer.from(base64Data, "base64");
|
|
182
|
+
if (buffer.length < 24) {
|
|
183
|
+
return null;
|
|
184
|
+
}
|
|
185
|
+
if (buffer[0] !== 0x89 || buffer[1] !== 0x50 || buffer[2] !== 0x4e || buffer[3] !== 0x47) {
|
|
186
|
+
return null;
|
|
187
|
+
}
|
|
188
|
+
const width = buffer.readUInt32BE(16);
|
|
189
|
+
const height = buffer.readUInt32BE(20);
|
|
190
|
+
return { widthPx: width, heightPx: height };
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
return null;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
export function getJpegDimensions(base64Data) {
|
|
197
|
+
try {
|
|
198
|
+
const buffer = Buffer.from(base64Data, "base64");
|
|
199
|
+
if (buffer.length < 2) {
|
|
200
|
+
return null;
|
|
201
|
+
}
|
|
202
|
+
if (buffer[0] !== 0xff || buffer[1] !== 0xd8) {
|
|
203
|
+
return null;
|
|
204
|
+
}
|
|
205
|
+
let offset = 2;
|
|
206
|
+
while (offset < buffer.length - 9) {
|
|
207
|
+
if (buffer[offset] !== 0xff) {
|
|
208
|
+
offset++;
|
|
209
|
+
continue;
|
|
210
|
+
}
|
|
211
|
+
const marker = buffer[offset + 1];
|
|
212
|
+
if (marker >= 0xc0 && marker <= 0xc2) {
|
|
213
|
+
const height = buffer.readUInt16BE(offset + 5);
|
|
214
|
+
const width = buffer.readUInt16BE(offset + 7);
|
|
215
|
+
return { widthPx: width, heightPx: height };
|
|
216
|
+
}
|
|
217
|
+
if (offset + 3 >= buffer.length) {
|
|
218
|
+
return null;
|
|
219
|
+
}
|
|
220
|
+
const length = buffer.readUInt16BE(offset + 2);
|
|
221
|
+
if (length < 2) {
|
|
222
|
+
return null;
|
|
223
|
+
}
|
|
224
|
+
offset += 2 + length;
|
|
225
|
+
}
|
|
226
|
+
return null;
|
|
227
|
+
}
|
|
228
|
+
catch {
|
|
229
|
+
return null;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
export function getGifDimensions(base64Data) {
|
|
233
|
+
try {
|
|
234
|
+
const buffer = Buffer.from(base64Data, "base64");
|
|
235
|
+
if (buffer.length < 10) {
|
|
236
|
+
return null;
|
|
237
|
+
}
|
|
238
|
+
const sig = buffer.slice(0, 6).toString("ascii");
|
|
239
|
+
if (sig !== "GIF87a" && sig !== "GIF89a") {
|
|
240
|
+
return null;
|
|
241
|
+
}
|
|
242
|
+
const width = buffer.readUInt16LE(6);
|
|
243
|
+
const height = buffer.readUInt16LE(8);
|
|
244
|
+
return { widthPx: width, heightPx: height };
|
|
245
|
+
}
|
|
246
|
+
catch {
|
|
247
|
+
return null;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
export function getWebpDimensions(base64Data) {
|
|
251
|
+
try {
|
|
252
|
+
const buffer = Buffer.from(base64Data, "base64");
|
|
253
|
+
if (buffer.length < 30) {
|
|
254
|
+
return null;
|
|
255
|
+
}
|
|
256
|
+
const riff = buffer.slice(0, 4).toString("ascii");
|
|
257
|
+
const webp = buffer.slice(8, 12).toString("ascii");
|
|
258
|
+
if (riff !== "RIFF" || webp !== "WEBP") {
|
|
259
|
+
return null;
|
|
260
|
+
}
|
|
261
|
+
const chunk = buffer.slice(12, 16).toString("ascii");
|
|
262
|
+
if (chunk === "VP8 ") {
|
|
263
|
+
if (buffer.length < 30)
|
|
264
|
+
return null;
|
|
265
|
+
const width = buffer.readUInt16LE(26) & 0x3fff;
|
|
266
|
+
const height = buffer.readUInt16LE(28) & 0x3fff;
|
|
267
|
+
return { widthPx: width, heightPx: height };
|
|
268
|
+
}
|
|
269
|
+
else if (chunk === "VP8L") {
|
|
270
|
+
if (buffer.length < 25)
|
|
271
|
+
return null;
|
|
272
|
+
const bits = buffer.readUInt32LE(21);
|
|
273
|
+
const width = (bits & 0x3fff) + 1;
|
|
274
|
+
const height = ((bits >> 14) & 0x3fff) + 1;
|
|
275
|
+
return { widthPx: width, heightPx: height };
|
|
276
|
+
}
|
|
277
|
+
else if (chunk === "VP8X") {
|
|
278
|
+
if (buffer.length < 30)
|
|
279
|
+
return null;
|
|
280
|
+
const width = (buffer[24] | (buffer[25] << 8) | (buffer[26] << 16)) + 1;
|
|
281
|
+
const height = (buffer[27] | (buffer[28] << 8) | (buffer[29] << 16)) + 1;
|
|
282
|
+
return { widthPx: width, heightPx: height };
|
|
283
|
+
}
|
|
284
|
+
return null;
|
|
285
|
+
}
|
|
286
|
+
catch {
|
|
287
|
+
return null;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Detect image format from file header bytes (magic numbers).
|
|
292
|
+
*
|
|
293
|
+
* Checks the first few bytes of a buffer for known image signatures:
|
|
294
|
+
* - PNG: `89 50 4E 47 0D 0A 1A 0A` (8 bytes)
|
|
295
|
+
* - JPEG: `FF D8 FF` (3 bytes)
|
|
296
|
+
* - GIF: `47 49 46 38` + `37`/`39` + `61` (GIF87a / GIF89a)
|
|
297
|
+
* - WebP: `52 49 46 46 ... 57 45 42 50` (RIFF at 0-3, WEBP at 8-11)
|
|
298
|
+
*
|
|
299
|
+
* @param buffer - Raw file bytes (only first 12 bytes are inspected)
|
|
300
|
+
* @returns Detected format string, or null if not a recognized image
|
|
301
|
+
*/
|
|
302
|
+
export function detectImageFormat(buffer) {
|
|
303
|
+
if (buffer.length < 3)
|
|
304
|
+
return null;
|
|
305
|
+
// PNG: 89 50 4E 47 0D 0A 1A 0A
|
|
306
|
+
if (buffer.length >= 8 &&
|
|
307
|
+
buffer[0] === 0x89 &&
|
|
308
|
+
buffer[1] === 0x50 &&
|
|
309
|
+
buffer[2] === 0x4e &&
|
|
310
|
+
buffer[3] === 0x47 &&
|
|
311
|
+
buffer[4] === 0x0d &&
|
|
312
|
+
buffer[5] === 0x0a &&
|
|
313
|
+
buffer[6] === 0x1a &&
|
|
314
|
+
buffer[7] === 0x0a) {
|
|
315
|
+
return "png";
|
|
316
|
+
}
|
|
317
|
+
// JPEG: FF D8 FF
|
|
318
|
+
if (buffer[0] === 0xff && buffer[1] === 0xd8 && buffer[2] === 0xff) {
|
|
319
|
+
return "jpeg";
|
|
320
|
+
}
|
|
321
|
+
// GIF: 47 49 46 38 (37|39) 61
|
|
322
|
+
if (buffer.length >= 6 &&
|
|
323
|
+
buffer[0] === 0x47 &&
|
|
324
|
+
buffer[1] === 0x49 &&
|
|
325
|
+
buffer[2] === 0x46 &&
|
|
326
|
+
buffer[3] === 0x38 &&
|
|
327
|
+
(buffer[4] === 0x37 || buffer[4] === 0x39) &&
|
|
328
|
+
buffer[5] === 0x61) {
|
|
329
|
+
return "gif";
|
|
330
|
+
}
|
|
331
|
+
// WebP: RIFF....WEBP (bytes 0-3 = "RIFF", bytes 8-11 = "WEBP")
|
|
332
|
+
if (buffer.length >= 12 &&
|
|
333
|
+
buffer[0] === 0x52 &&
|
|
334
|
+
buffer[1] === 0x49 &&
|
|
335
|
+
buffer[2] === 0x46 &&
|
|
336
|
+
buffer[3] === 0x46 &&
|
|
337
|
+
buffer[8] === 0x57 &&
|
|
338
|
+
buffer[9] === 0x45 &&
|
|
339
|
+
buffer[10] === 0x42 &&
|
|
340
|
+
buffer[11] === 0x50) {
|
|
341
|
+
return "webp";
|
|
342
|
+
}
|
|
343
|
+
return null;
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* Map an `ImageFormat` to its standard MIME type string.
|
|
347
|
+
*
|
|
348
|
+
* @param format - Detected image format
|
|
349
|
+
* @returns MIME type (e.g., `"image/png"`)
|
|
350
|
+
*/
|
|
351
|
+
export function imageFormatToMime(format) {
|
|
352
|
+
switch (format) {
|
|
353
|
+
case "png":
|
|
354
|
+
return "image/png";
|
|
355
|
+
case "jpeg":
|
|
356
|
+
return "image/jpeg";
|
|
357
|
+
case "gif":
|
|
358
|
+
return "image/gif";
|
|
359
|
+
case "webp":
|
|
360
|
+
return "image/webp";
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
/**
|
|
364
|
+
* Create an `ImageMetadata` object from original and display dimensions.
|
|
365
|
+
*
|
|
366
|
+
* Sets `resized` automatically by comparing original and display dimensions.
|
|
367
|
+
*
|
|
368
|
+
* @param original - Original pixel dimensions before resizing
|
|
369
|
+
* @param display - Display pixel dimensions after resizing
|
|
370
|
+
* @param format - Detected image format, or null if unknown
|
|
371
|
+
* @param sizeBytes - File size in bytes (optional)
|
|
372
|
+
* @returns Populated ImageMetadata
|
|
373
|
+
*/
|
|
374
|
+
export function createImageMetadata(original, display, format, sizeBytes) {
|
|
375
|
+
return {
|
|
376
|
+
originalWidth: original.widthPx,
|
|
377
|
+
originalHeight: original.heightPx,
|
|
378
|
+
displayWidth: display.widthPx,
|
|
379
|
+
displayHeight: display.heightPx,
|
|
380
|
+
resized: original.widthPx !== display.widthPx || original.heightPx !== display.heightPx,
|
|
381
|
+
format,
|
|
382
|
+
sizeBytes,
|
|
383
|
+
};
|
|
384
|
+
}
|
|
385
|
+
/**
|
|
386
|
+
* Format a compact dimension string for display.
|
|
387
|
+
*
|
|
388
|
+
* - Not resized: `"1920×1080"`
|
|
389
|
+
* - Resized: `"3840×2160 → 1920×1080"`
|
|
390
|
+
*
|
|
391
|
+
* @param meta - Image metadata with dimension info
|
|
392
|
+
* @returns Formatted dimension string
|
|
393
|
+
*/
|
|
394
|
+
export function formatImageDimensions(meta) {
|
|
395
|
+
if (meta.resized) {
|
|
396
|
+
return `${meta.originalWidth}×${meta.originalHeight} → ${meta.displayWidth}×${meta.displayHeight}`;
|
|
397
|
+
}
|
|
398
|
+
return `${meta.originalWidth}×${meta.originalHeight}`;
|
|
399
|
+
}
|
|
400
|
+
export function getImageDimensions(base64Data, mimeType) {
|
|
401
|
+
if (mimeType === "image/png") {
|
|
402
|
+
return getPngDimensions(base64Data);
|
|
403
|
+
}
|
|
404
|
+
if (mimeType === "image/jpeg") {
|
|
405
|
+
return getJpegDimensions(base64Data);
|
|
406
|
+
}
|
|
407
|
+
if (mimeType === "image/gif") {
|
|
408
|
+
return getGifDimensions(base64Data);
|
|
409
|
+
}
|
|
410
|
+
if (mimeType === "image/webp") {
|
|
411
|
+
return getWebpDimensions(base64Data);
|
|
412
|
+
}
|
|
413
|
+
return null;
|
|
414
|
+
}
|
|
415
|
+
/**
|
|
416
|
+
* Render an image as a terminal escape sequence (Kitty or iTerm2 protocol).
|
|
417
|
+
* Returns the escape sequence, the number of rows/columns it occupies, and
|
|
418
|
+
* an optional Kitty image ID for later cleanup.
|
|
419
|
+
*
|
|
420
|
+
* @param base64Data - Base64-encoded image data
|
|
421
|
+
* @param imageDimensions - Native pixel dimensions
|
|
422
|
+
* @param options - Width/height caps, aspect ratio, image ID
|
|
423
|
+
* @returns Rendered sequence with layout info, or null if unsupported
|
|
424
|
+
*/
|
|
425
|
+
export function renderImage(base64Data, imageDimensions, options = {}) {
|
|
426
|
+
const caps = getCapabilities();
|
|
427
|
+
if (!caps.images) {
|
|
428
|
+
return null;
|
|
429
|
+
}
|
|
430
|
+
const maxWidth = options.maxWidthCells ?? 80;
|
|
431
|
+
const layout = calculateImageLayout(imageDimensions, maxWidth, getCellDimensions(), options.maxHeightCells);
|
|
432
|
+
if (caps.images === "kitty") {
|
|
433
|
+
// Omit rows — let Kitty auto-calculate from the image's native aspect ratio.
|
|
434
|
+
// This avoids rounding errors in our row calculation that cause subtle stretching.
|
|
435
|
+
const sequence = encodeKitty(base64Data, {
|
|
436
|
+
columns: layout.columns,
|
|
437
|
+
imageId: options.imageId,
|
|
438
|
+
});
|
|
439
|
+
return { sequence, rows: layout.rows, columns: layout.columns, imageId: options.imageId };
|
|
440
|
+
}
|
|
441
|
+
if (caps.images === "iterm2") {
|
|
442
|
+
const sequence = encodeITerm2(base64Data, {
|
|
443
|
+
width: layout.columns,
|
|
444
|
+
height: "auto",
|
|
445
|
+
preserveAspectRatio: options.preserveAspectRatio ?? true,
|
|
446
|
+
});
|
|
447
|
+
return { sequence, rows: layout.rows, columns: layout.columns };
|
|
448
|
+
}
|
|
449
|
+
return null;
|
|
450
|
+
}
|
|
451
|
+
export function imageFallback(mimeType, dimensions, filename) {
|
|
452
|
+
const parts = [];
|
|
453
|
+
if (filename)
|
|
454
|
+
parts.push(filename);
|
|
455
|
+
parts.push(`[${mimeType}]`);
|
|
456
|
+
if (dimensions)
|
|
457
|
+
parts.push(`${dimensions.widthPx}x${dimensions.heightPx}`);
|
|
458
|
+
return `[Image: ${parts.join(" ")}]`;
|
|
459
|
+
}
|
|
460
|
+
//# sourceMappingURL=terminal-image.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal-image.js","sourceRoot":"","sources":["../src/terminal-image.ts"],"names":[],"mappings":"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"}
|