@ai-matrx/media 0.8.0 → 0.9.1

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.
Files changed (185) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/files/engine/api/assets.d.ts +223 -0
  3. package/dist/files/engine/api/assets.js +124 -0
  4. package/dist/files/engine/api/assets.js.map +1 -0
  5. package/dist/files/engine/api/direct.d.ts +43 -0
  6. package/dist/files/engine/api/direct.js +73 -0
  7. package/dist/files/engine/api/direct.js.map +1 -0
  8. package/dist/files/engine/api/fileOrganization.d.ts +34 -0
  9. package/dist/files/engine/api/fileOrganization.js +38 -0
  10. package/dist/files/engine/api/fileOrganization.js.map +1 -0
  11. package/dist/files/engine/api/files.d.ts +249 -0
  12. package/dist/files/engine/api/files.js +231 -0
  13. package/dist/files/engine/api/files.js.map +1 -0
  14. package/dist/files/engine/api/folders.d.ts +63 -0
  15. package/dist/files/engine/api/folders.js +56 -0
  16. package/dist/files/engine/api/folders.js.map +1 -0
  17. package/dist/files/engine/api/office.d.ts +27 -0
  18. package/dist/files/engine/api/office.js +19 -0
  19. package/dist/files/engine/api/office.js.map +1 -0
  20. package/dist/files/engine/api/permissions.d.ts +37 -0
  21. package/dist/files/engine/api/permissions.js +109 -0
  22. package/dist/files/engine/api/permissions.js.map +1 -0
  23. package/dist/files/engine/api/versions.d.ts +26 -0
  24. package/dist/files/engine/api/versions.js +37 -0
  25. package/dist/files/engine/api/versions.js.map +1 -0
  26. package/dist/files/engine/cache/idb-store.d.ts +95 -0
  27. package/dist/files/engine/cache/idb-store.js +172 -0
  28. package/dist/files/engine/cache/idb-store.js.map +1 -0
  29. package/dist/files/engine/cache/policy.d.ts +14 -0
  30. package/dist/files/engine/cache/policy.js +40 -0
  31. package/dist/files/engine/cache/policy.js.map +1 -0
  32. package/dist/files/engine/cache/register-service-worker.d.ts +57 -0
  33. package/dist/files/engine/cache/register-service-worker.js +80 -0
  34. package/dist/files/engine/cache/register-service-worker.js.map +1 -0
  35. package/dist/files/engine/db-types.d.ts +48865 -0
  36. package/dist/files/engine/db-types.js +1 -0
  37. package/dist/files/engine/db-types.js.map +1 -0
  38. package/dist/files/engine/filesDb.d.ts +1913 -0
  39. package/dist/files/engine/filesDb.js +28 -0
  40. package/dist/files/engine/filesDb.js.map +1 -0
  41. package/dist/files/engine/handler/handler.d.ts +82 -0
  42. package/dist/files/engine/handler/handler.js +124 -0
  43. package/dist/files/engine/handler/handler.js.map +1 -0
  44. package/dist/files/engine/handler/hooks/useFile.d.ts +17 -0
  45. package/dist/files/engine/handler/hooks/useFile.js +75 -0
  46. package/dist/files/engine/handler/hooks/useFile.js.map +1 -0
  47. package/dist/files/engine/handler/hooks/useFileUpload.d.ts +76 -0
  48. package/dist/files/engine/handler/hooks/useFileUpload.js +67 -0
  49. package/dist/files/engine/handler/hooks/useFileUpload.js.map +1 -0
  50. package/dist/files/engine/handler/input/normalize.d.ts +14 -0
  51. package/dist/files/engine/handler/input/normalize.js +365 -0
  52. package/dist/files/engine/handler/input/normalize.js.map +1 -0
  53. package/dist/files/engine/handler/intelligence/access.d.ts +35 -0
  54. package/dist/files/engine/handler/intelligence/access.js +85 -0
  55. package/dist/files/engine/handler/intelligence/access.js.map +1 -0
  56. package/dist/files/engine/handler/intelligence/magic-bytes.d.ts +21 -0
  57. package/dist/files/engine/handler/intelligence/magic-bytes.js +67 -0
  58. package/dist/files/engine/handler/intelligence/magic-bytes.js.map +1 -0
  59. package/dist/files/engine/handler/output/target.d.ts +19 -0
  60. package/dist/files/engine/handler/output/target.js +222 -0
  61. package/dist/files/engine/handler/output/target.js.map +1 -0
  62. package/dist/files/engine/handler/resolver.d.ts +34 -0
  63. package/dist/files/engine/handler/resolver.js +133 -0
  64. package/dist/files/engine/handler/resolver.js.map +1 -0
  65. package/dist/files/engine/handler/types.d.ts +367 -0
  66. package/dist/files/engine/handler/types.js +1 -0
  67. package/dist/files/engine/handler/types.js.map +1 -0
  68. package/dist/files/engine/handler/upload.d.ts +32 -0
  69. package/dist/files/engine/handler/upload.js +295 -0
  70. package/dist/files/engine/handler/upload.js.map +1 -0
  71. package/dist/files/engine/handler/utils/classify.d.ts +14 -0
  72. package/dist/files/engine/handler/utils/classify.js +27 -0
  73. package/dist/files/engine/handler/utils/classify.js.map +1 -0
  74. package/dist/files/engine/handler/utils/prefer-locator.d.ts +32 -0
  75. package/dist/files/engine/handler/utils/prefer-locator.js +34 -0
  76. package/dist/files/engine/handler/utils/prefer-locator.js.map +1 -0
  77. package/dist/files/engine/handler/utils/python-base.d.ts +129 -0
  78. package/dist/files/engine/handler/utils/python-base.js +60 -0
  79. package/dist/files/engine/handler/utils/python-base.js.map +1 -0
  80. package/dist/files/engine/hooks/blob-cache.d.ts +130 -0
  81. package/dist/files/engine/hooks/blob-cache.js +162 -0
  82. package/dist/files/engine/hooks/blob-cache.js.map +1 -0
  83. package/dist/files/engine/hooks/office-extraction-cache.d.ts +28 -0
  84. package/dist/files/engine/hooks/office-extraction-cache.js +67 -0
  85. package/dist/files/engine/hooks/office-extraction-cache.js.map +1 -0
  86. package/dist/files/engine/host/configure.d.ts +166 -0
  87. package/dist/files/engine/host/configure.js +31 -0
  88. package/dist/files/engine/host/configure.js.map +1 -0
  89. package/dist/files/engine/host/org.d.ts +8 -0
  90. package/dist/files/engine/host/org.js +16 -0
  91. package/dist/files/engine/host/org.js.map +1 -0
  92. package/dist/files/engine/host/python-client.d.ts +60 -0
  93. package/dist/files/engine/host/python-client.js +46 -0
  94. package/dist/files/engine/host/python-client.js.map +1 -0
  95. package/dist/files/engine/host/share-links.d.ts +20 -0
  96. package/dist/files/engine/host/share-links.js +32 -0
  97. package/dist/files/engine/host/share-links.js.map +1 -0
  98. package/dist/files/engine/host/store.d.ts +24 -0
  99. package/dist/files/engine/host/store.js +23 -0
  100. package/dist/files/engine/host/store.js.map +1 -0
  101. package/dist/files/engine/host/supabase.d.ts +3808 -0
  102. package/dist/files/engine/host/supabase.js +33 -0
  103. package/dist/files/engine/host/supabase.js.map +1 -0
  104. package/dist/files/engine/host/toast.d.ts +14 -0
  105. package/dist/files/engine/host/toast.js +20 -0
  106. package/dist/files/engine/host/toast.js.map +1 -0
  107. package/dist/files/engine/host/typed-client.d.ts +136 -0
  108. package/dist/files/engine/host/typed-client.js +66 -0
  109. package/dist/files/engine/host/typed-client.js.map +1 -0
  110. package/dist/files/engine/index.d.ts +22 -0
  111. package/dist/files/engine/index.js +49 -0
  112. package/dist/files/engine/index.js.map +1 -0
  113. package/dist/files/engine/media/our-file-sources.d.ts +39 -0
  114. package/dist/files/engine/media/our-file-sources.js +83 -0
  115. package/dist/files/engine/media/our-file-sources.js.map +1 -0
  116. package/dist/files/engine/media/signed-url.d.ts +1 -0
  117. package/dist/files/engine/media/signed-url.js +6 -0
  118. package/dist/files/engine/media/signed-url.js.map +1 -0
  119. package/dist/files/engine/redux/converters.d.ts +73 -0
  120. package/dist/files/engine/redux/converters.js +286 -0
  121. package/dist/files/engine/redux/converters.js.map +1 -0
  122. package/dist/files/engine/redux/file-hydration.d.ts +15 -0
  123. package/dist/files/engine/redux/file-hydration.js +46 -0
  124. package/dist/files/engine/redux/file-hydration.js.map +1 -0
  125. package/dist/files/engine/redux/file-tree-auth-boundary.d.ts +5 -0
  126. package/dist/files/engine/redux/file-tree-auth-boundary.js +28 -0
  127. package/dist/files/engine/redux/file-tree-auth-boundary.js.map +1 -0
  128. package/dist/files/engine/redux/file-tree-timeout.d.ts +32 -0
  129. package/dist/files/engine/redux/file-tree-timeout.js +73 -0
  130. package/dist/files/engine/redux/file-tree-timeout.js.map +1 -0
  131. package/dist/files/engine/redux/mutation-toast-middleware.d.ts +27 -0
  132. package/dist/files/engine/redux/mutation-toast-middleware.js +103 -0
  133. package/dist/files/engine/redux/mutation-toast-middleware.js.map +1 -0
  134. package/dist/files/engine/redux/realtime-middleware.d.ts +61 -0
  135. package/dist/files/engine/redux/realtime-middleware.js +431 -0
  136. package/dist/files/engine/redux/realtime-middleware.js.map +1 -0
  137. package/dist/files/engine/redux/request-ledger.d.ts +68 -0
  138. package/dist/files/engine/redux/request-ledger.js +66 -0
  139. package/dist/files/engine/redux/request-ledger.js.map +1 -0
  140. package/dist/files/engine/redux/selectors.d.ts +3254 -0
  141. package/dist/files/engine/redux/selectors.js +428 -0
  142. package/dist/files/engine/redux/selectors.js.map +1 -0
  143. package/dist/files/engine/redux/slice.d.ts +157 -0
  144. package/dist/files/engine/redux/slice.js +836 -0
  145. package/dist/files/engine/redux/slice.js.map +1 -0
  146. package/dist/files/engine/redux/thunks.d.ts +449 -0
  147. package/dist/files/engine/redux/thunks.js +1684 -0
  148. package/dist/files/engine/redux/thunks.js.map +1 -0
  149. package/dist/files/engine/redux/tree-utils.d.ts +90 -0
  150. package/dist/files/engine/redux/tree-utils.js +200 -0
  151. package/dist/files/engine/redux/tree-utils.js.map +1 -0
  152. package/dist/files/engine/support/claimsUser.d.ts +77 -0
  153. package/dist/files/engine/support/claimsUser.js +48 -0
  154. package/dist/files/engine/support/claimsUser.js.map +1 -0
  155. package/dist/files/engine/support/datetime.d.ts +6 -0
  156. package/dist/files/engine/support/datetime.js +15 -0
  157. package/dist/files/engine/support/datetime.js.map +1 -0
  158. package/dist/files/engine/support/document-visibility.d.ts +14 -0
  159. package/dist/files/engine/support/document-visibility.js +28 -0
  160. package/dist/files/engine/support/document-visibility.js.map +1 -0
  161. package/dist/files/engine/support/logger.d.ts +28 -0
  162. package/dist/files/engine/support/logger.js +36 -0
  163. package/dist/files/engine/support/logger.js.map +1 -0
  164. package/dist/files/engine/types.d.ts +1081 -0
  165. package/dist/files/engine/types.js +30 -0
  166. package/dist/files/engine/types.js.map +1 -0
  167. package/dist/files/engine/upload/cloudUpload.d.ts +182 -0
  168. package/dist/files/engine/upload/cloudUpload.js +418 -0
  169. package/dist/files/engine/upload/cloudUpload.js.map +1 -0
  170. package/dist/files/engine/upload/tusUpload.d.ts +100 -0
  171. package/dist/files/engine/upload/tusUpload.js +258 -0
  172. package/dist/files/engine/upload/tusUpload.js.map +1 -0
  173. package/dist/files/engine/upload/uploadDedupGuard.d.ts +58 -0
  174. package/dist/files/engine/upload/uploadDedupGuard.js +41 -0
  175. package/dist/files/engine/upload/uploadDedupGuard.js.map +1 -0
  176. package/dist/files/engine/upload/uploadGuardOpeners.d.ts +70 -0
  177. package/dist/files/engine/upload/uploadGuardOpeners.js +54 -0
  178. package/dist/files/engine/upload/uploadGuardOpeners.js.map +1 -0
  179. package/dist/files/engine/utils/file-types.d.ts +243 -0
  180. package/dist/files/engine/utils/file-types.js +1722 -0
  181. package/dist/files/engine/utils/file-types.js.map +1 -0
  182. package/dist/files/engine/utils/user-visible.d.ts +133 -0
  183. package/dist/files/engine/utils/user-visible.js +115 -0
  184. package/dist/files/engine/utils/user-visible.js.map +1 -0
  185. package/package.json +392 -8
@@ -0,0 +1,243 @@
1
+ /**
2
+ * features/files/utils/file-types.ts
3
+ *
4
+ * THE SINGLE SOURCE OF TRUTH for cloud-files type capabilities.
5
+ *
6
+ * If you need to:
7
+ * - Add support for a new file type
8
+ * - Change which previewer a type uses
9
+ * - Change which icon / color a type renders with
10
+ * - Change whether a type renders a real thumbnail or a fallback icon
11
+ * - Add or remove a thumbnail strategy
12
+ * - Change a size cap for a particular kind
13
+ *
14
+ * → edit THIS file. Nothing else in the cloud-files feature should
15
+ * encode this knowledge.
16
+ *
17
+ * The supporting modules (`mime.ts`, `icon-map.ts`,
18
+ * `preview-capabilities.ts`) are thin wrappers that read from this
19
+ * registry and exist only for backwards-compat with older imports.
20
+ *
21
+ * ─────────────────────────────────────────────────────────────────────
22
+ * Structure
23
+ * ─────────────────────────────────────────────────────────────────────
24
+ *
25
+ * FILE_TYPES is an array of declarative entries. Each entry says:
26
+ *
27
+ * - which extensions match it
28
+ * - the canonical MIME type (used as a fallback when the server
29
+ * didn't send one and to canonicalize between the dozens of
30
+ * legacy aliases the web has accumulated)
31
+ * - which preview component to use
32
+ * - which thumbnail strategy to use in grid / list views
33
+ * - the icon + color tokens that drive the iconography
34
+ * - a human-friendly display name (e.g. "PDF Document" vs "pdf")
35
+ * - any size cap that overrides the global preview cap
36
+ *
37
+ * Mime-first override: when the browser knows a MIME (e.g. it set
38
+ * `image/avif` even though we don't have `.avif` in the extension
39
+ * table), the wrapper helpers fall back to MIME-prefix matching for
40
+ * `image/*`, `video/*`, `audio/*`, and `application/pdf`, so adding a
41
+ * brand-new image format never requires more than a one-line entry.
42
+ */
43
+ import { type LucideIcon } from "lucide-react";
44
+ /** Top-level grouping. Drives sidebar filters and color rhythm. */
45
+ export type FileCategory = "CODE" | "DOCUMENT" | "AUDIO" | "IMAGE" | "VIDEO" | "ARCHIVE" | "DATA" | "NOTEBOOK" | "SUBTITLES" | "EMAIL" | "EBOOK" | "MODEL_3D" | "UNKNOWN" | "FOLDER";
46
+ /** Which previewer should render this kind. `generic` means "no preview".
47
+ *
48
+ * `svg` is split out from `image` on purpose: SVG is text-shaped (XML), so
49
+ * it has a dedicated previewer (`SvgPreview` — renders with a transparency
50
+ * grid and lets the user toggle to the raw markup) AND is editable in the
51
+ * standard Monaco inline editor with XML syntax highlighting. Routing it
52
+ * through `image` would hide the editor handoff and the source-view toggle.
53
+ */
54
+ export type PreviewKind = "code" | "image" | "svg" | "html" | "audio" | "video" | "pdf" | "text" | "markdown" | "data" | "spreadsheet" | "office" | "generic";
55
+ /**
56
+ * Strategy hint for the small inline thumbnail rendered in grid / list views.
57
+ *
58
+ * Phase 1b note: server-rendered thumbnails are now **universal** —
59
+ * every uploaded file has `FileRecord.thumbnail_url` populated (image,
60
+ * PDF page 1, video frame, audio waveform, or mime-family icon for
61
+ * unknown). `MediaThumbnail` reads `file.thumbnailUrl` first regardless
62
+ * of the strategy below; this enum now only controls the "live render"
63
+ * fallback for the brief window between upload and variant render.
64
+ *
65
+ * "image" — `<img src={masterCdnUrl}>` fallback when the
66
+ * backend variant hasn't finished rendering yet.
67
+ * "video-poster" — `<video preload="metadata">` fallback for the
68
+ * same window.
69
+ * "pdf-firstpage" — historic; Phase 1c now ships `page1_url` via
70
+ * the variants store. The grid path uses
71
+ * `file.thumbnailUrl`; full-page detail views can
72
+ * bind `Asset.variants["page1_url"].url`.
73
+ * "backend-thumb" — historic; now equivalent to `icon` for the live
74
+ * render fallback because the universal pipeline
75
+ * handles every backend-thumb case automatically.
76
+ * "icon" — no live render fallback. The `file.thumbnailUrl`
77
+ * lookup (or icon) is the only source.
78
+ */
79
+ export type ThumbnailStrategy = "image" | "video-poster" | "pdf-firstpage" | "backend-thumb" | "icon";
80
+ /**
81
+ * One row in the registry. Most fields are static; the `extensions`,
82
+ * `aliases`, `aliasPrefixes`, and `mime` fields are the lookup keys.
83
+ */
84
+ export interface FileTypeEntry {
85
+ /** Extensions (lowercased, no dot) that map to this entry. First wins. */
86
+ extensions: readonly string[];
87
+ /**
88
+ * Exact filenames (matched as-is, then case-insensitively) that resolve to
89
+ * this entry — covers the universe of "no extension OR purely dotfile"
90
+ * text-config files. e.g. `["Dockerfile", ".dockerignore"]`.
91
+ */
92
+ aliases?: readonly string[];
93
+ /**
94
+ * Filename prefixes that resolve to this entry. Matched after exact
95
+ * extensions / aliases fail. Useful for `.env*` style variants
96
+ * (`.env.local`, `.env.production`, ...). Compared case-insensitively.
97
+ */
98
+ aliasPrefixes?: readonly string[];
99
+ /** Canonical MIME. Used to fill `mime_type` when the server didn't send one. */
100
+ mime: string;
101
+ category: FileCategory;
102
+ /** Specific name within the category, e.g. "PYTHON", "MP3". UPPERCASE. */
103
+ subCategory: string;
104
+ /** Human-friendly name shown in tooltips / "What can I preview?" lists. */
105
+ displayName: string;
106
+ previewKind: PreviewKind;
107
+ thumbnailStrategy: ThumbnailStrategy;
108
+ /** Tailwind text color token, e.g. `text-emerald-500`. */
109
+ color: string;
110
+ icon: LucideIcon;
111
+ /** Override the global 10MB preview cap if the previewer can stream. */
112
+ previewSizeCapOverride?: number | null;
113
+ }
114
+ /** What a caller actually needs to render any given file. */
115
+ export interface FileTypeDetails {
116
+ category: FileCategory;
117
+ subCategory: string;
118
+ displayName: string;
119
+ previewKind: PreviewKind;
120
+ thumbnailStrategy: ThumbnailStrategy;
121
+ color: string;
122
+ icon: LucideIcon;
123
+ /** Convenience — true when previewKind !== "generic". */
124
+ canPreview: boolean;
125
+ /** Convenience — null = use the global cap. */
126
+ previewSizeCapOverride: number | null;
127
+ /** The canonical MIME for the resolved type. */
128
+ mime: string;
129
+ }
130
+ /** Global default preview cap. Bigger files render a "too large" message. */
131
+ export declare const MAX_INLINE_PREVIEW_BYTES: number;
132
+ /**
133
+ * The registry. Order matters only when an extension belongs to multiple
134
+ * entries — the first match wins. In practice every extension is unique.
135
+ *
136
+ * Adding a new file type:
137
+ * 1. Append a new entry.
138
+ * 2. If the previewKind is something new (not in `PreviewKind`), add it
139
+ * to that union AND register a previewer in
140
+ * `components/core/FilePreview/FilePreview.tsx`.
141
+ * 3. If the thumbnail strategy is new, extend `ThumbnailStrategy` and
142
+ * handle it in `MediaThumbnail`.
143
+ *
144
+ * That's it. No edits to `mime.ts`, `icon-map.ts`, etc.
145
+ */
146
+ export declare const FILE_TYPES: readonly FileTypeEntry[];
147
+ /** Look up details by file name (basename / alias / prefix / extension match). */
148
+ export declare function getFileTypeDetails(filename: string): FileTypeDetails;
149
+ /**
150
+ * Same as `getFileTypeDetails` but never falls through to UNKNOWN — used
151
+ * by the binary viewer's "View as text" override and any caller that has
152
+ * already decided "treat this as text, no matter what."
153
+ */
154
+ export declare function getAssumedTextDetails(filename: string): FileTypeDetails;
155
+ /** True when the filename is recognized as text-bearing without sniffing bytes. */
156
+ export declare function isLikelyTextFilename(filename: string): boolean;
157
+ /** Folder details — used by sidebar + tree rendering. */
158
+ export declare function getFolderTypeDetails(open?: boolean): FileTypeDetails;
159
+ /** Canonical MIME for an extension (or `application/octet-stream`). */
160
+ export declare function mimeFromFilename(filename: string): string;
161
+ /**
162
+ * Resolve a final MIME, preferring the server-supplied value when it's
163
+ * meaningful, otherwise falling back to the extension table.
164
+ *
165
+ * Parameters are stripped so `audio/webm;codecs=opus` resolves like
166
+ * `audio/webm` — required for BY_MIME lookup and audio/video disambiguation
167
+ * on `.webm` containers (MediaRecorder speech captures).
168
+ */
169
+ export declare function resolveMime(explicit: string | null | undefined, filename: string): string;
170
+ /**
171
+ * Given a (filename, mime, size) tuple, return the full preview profile —
172
+ * what to render at full size, what to render in a grid thumbnail, whether
173
+ * either is allowed at the file's current byte size, and the resolved MIME.
174
+ *
175
+ * This is THE function components should call. `getPreviewCapability` and
176
+ * `useFileTypeDetails` are thin views on top.
177
+ */
178
+ export interface FilePreviewProfile {
179
+ details: FileTypeDetails;
180
+ /** Effective `previewKind` after MIME-prefix override. */
181
+ previewKind: PreviewKind;
182
+ /** True when the type is renderable AND the byte size fits the cap. */
183
+ canPreview: boolean;
184
+ /** False = file is too big for inline preview; offer download instead. */
185
+ sizeOk: boolean;
186
+ /** The cap that was effectively applied (in bytes). */
187
+ effectiveSizeCap: number;
188
+ /** True iff the registry says this file should render a real thumbnail. */
189
+ thumbnailStrategy: ThumbnailStrategy;
190
+ /** Resolved canonical MIME. */
191
+ mime: string;
192
+ }
193
+ export declare function getFilePreviewProfile(fileName: string, mimeType: string | null, fileSize: number | null): FilePreviewProfile;
194
+ export declare function isTextMime(mime: string): boolean;
195
+ export declare function isImageMime(mime: string): boolean;
196
+ /** Image bytes evergreen browsers can decode directly through `<img>`. */
197
+ export declare function isBrowserRenderableImageMime(mime: string): boolean;
198
+ export declare function isVideoMime(mime: string): boolean;
199
+ export declare function isAudioMime(mime: string): boolean;
200
+ export declare function isPdfMime(mime: string): boolean;
201
+ /**
202
+ * Result of `sniffTextBytes`. We split "definitely text" from "looks text-y
203
+ * but we're not sure" so the UI can pick a different default action:
204
+ *
205
+ * - `confidence === "high"` — safe to render in Monaco automatically.
206
+ * - `confidence === "medium"` — probably text; offer a button.
207
+ * - `confidence === "low"` — almost certainly binary; only show on
208
+ * manual override.
209
+ */
210
+ export interface TextSniffResult {
211
+ isText: boolean;
212
+ confidence: "high" | "medium" | "low";
213
+ reason: string;
214
+ }
215
+ /**
216
+ * Heuristic byte-level text detector. Inspects the first ~4KB of the
217
+ * sample and answers "could this be displayed as text?". Designed to be
218
+ * permissive — false positives are recoverable (the user sees garbage
219
+ * and closes the tab), while false negatives are exactly the bug we're
220
+ * fighting (.bashrc, authorized_keys, etc. being declared "binary").
221
+ *
222
+ * Rules, in order:
223
+ * 1. Empty bytes → text (an empty file is fine to open in Monaco).
224
+ * 2. UTF-8 BOM, UTF-16 BOM, UTF-32 BOM → text (high confidence).
225
+ * 3. Strict UTF-8 decode succeeds → text (high confidence).
226
+ * 4. Otherwise count printable / control bytes:
227
+ * - any null byte (0x00) → binary (high confidence).
228
+ * - >= 95% printable + tab/newline/CR → text (medium).
229
+ * - everything else → binary (low).
230
+ */
231
+ export declare function sniffTextBytes(bytes: Uint8Array, sampleSize?: number): TextSniffResult;
232
+ /** Every supported (extension, displayName, previewKind, thumbnailStrategy). */
233
+ export interface SupportedTypeRow {
234
+ extensions: readonly string[];
235
+ mime: string;
236
+ category: FileCategory;
237
+ displayName: string;
238
+ previewKind: PreviewKind;
239
+ thumbnailStrategy: ThumbnailStrategy;
240
+ /** True when previewKind !== "generic" — i.e. we have a real previewer. */
241
+ canPreview: boolean;
242
+ }
243
+ export declare function listSupportedTypes(): SupportedTypeRow[];