@happyvertical/smrt-images 0.30.0

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 (75) hide show
  1. package/AGENTS.md +48 -0
  2. package/CLAUDE.md +1 -0
  3. package/LICENSE +7 -0
  4. package/README.md +92 -0
  5. package/dist/__smrt-register__.d.ts +2 -0
  6. package/dist/__smrt-register__.d.ts.map +1 -0
  7. package/dist/categorizer.d.ts +26 -0
  8. package/dist/categorizer.d.ts.map +1 -0
  9. package/dist/deriver.d.ts +33 -0
  10. package/dist/deriver.d.ts.map +1 -0
  11. package/dist/editor.d.ts +72 -0
  12. package/dist/editor.d.ts.map +1 -0
  13. package/dist/image.d.ts +53 -0
  14. package/dist/image.d.ts.map +1 -0
  15. package/dist/images.d.ts +80 -0
  16. package/dist/images.d.ts.map +1 -0
  17. package/dist/index.d.ts +12 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +839 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/manifest.json +1179 -0
  22. package/dist/media-bundle-persistence.d.ts +15 -0
  23. package/dist/media-bundle-persistence.d.ts.map +1 -0
  24. package/dist/metadata.d.ts +19 -0
  25. package/dist/metadata.d.ts.map +1 -0
  26. package/dist/playground.d.ts +2 -0
  27. package/dist/playground.d.ts.map +1 -0
  28. package/dist/playground.js +140 -0
  29. package/dist/playground.js.map +1 -0
  30. package/dist/prompts.d.ts +8 -0
  31. package/dist/prompts.d.ts.map +1 -0
  32. package/dist/search.d.ts +42 -0
  33. package/dist/search.d.ts.map +1 -0
  34. package/dist/smrt-knowledge.json +561 -0
  35. package/dist/svelte/components/AssetsGallery.svelte +436 -0
  36. package/dist/svelte/components/AssetsGallery.svelte.d.ts +11 -0
  37. package/dist/svelte/components/AssetsGallery.svelte.d.ts.map +1 -0
  38. package/dist/svelte/components/ImageEditor.svelte +485 -0
  39. package/dist/svelte/components/ImageEditor.svelte.d.ts +12 -0
  40. package/dist/svelte/components/ImageEditor.svelte.d.ts.map +1 -0
  41. package/dist/svelte/components/ImageUploader.svelte +922 -0
  42. package/dist/svelte/components/ImageUploader.svelte.d.ts +15 -0
  43. package/dist/svelte/components/ImageUploader.svelte.d.ts.map +1 -0
  44. package/dist/svelte/i18n.d.ts +42 -0
  45. package/dist/svelte/i18n.d.ts.map +1 -0
  46. package/dist/svelte/i18n.js +46 -0
  47. package/dist/svelte/image-clients.d.ts +45 -0
  48. package/dist/svelte/image-clients.d.ts.map +1 -0
  49. package/dist/svelte/image-clients.js +1 -0
  50. package/dist/svelte/index.d.ts +14 -0
  51. package/dist/svelte/index.d.ts.map +1 -0
  52. package/dist/svelte/index.js +21 -0
  53. package/dist/svelte/playground.d.ts +74 -0
  54. package/dist/svelte/playground.d.ts.map +1 -0
  55. package/dist/svelte/playground.js +105 -0
  56. package/dist/svelte/routes/ImageStudioRoute.svelte +194 -0
  57. package/dist/svelte/routes/ImageStudioRoute.svelte.d.ts +7 -0
  58. package/dist/svelte/routes/ImageStudioRoute.svelte.d.ts.map +1 -0
  59. package/dist/svelte/routes/index.d.ts +2 -0
  60. package/dist/svelte/routes/index.d.ts.map +1 -0
  61. package/dist/svelte/routes/index.js +1 -0
  62. package/dist/svelte/routes/shared.d.ts +25 -0
  63. package/dist/svelte/routes/shared.d.ts.map +1 -0
  64. package/dist/svelte/routes/shared.js +31 -0
  65. package/dist/types.d.ts +51 -0
  66. package/dist/types.d.ts.map +1 -0
  67. package/dist/types.js +2 -0
  68. package/dist/types.js.map +1 -0
  69. package/dist/ui.d.ts +10 -0
  70. package/dist/ui.d.ts.map +1 -0
  71. package/dist/ui.js +42 -0
  72. package/dist/ui.js.map +1 -0
  73. package/dist/upstream.d.ts +65 -0
  74. package/dist/upstream.d.ts.map +1 -0
  75. package/package.json +95 -0
package/AGENTS.md ADDED
@@ -0,0 +1,48 @@
1
+ # @happyvertical/smrt-images
2
+
3
+ Image management with AI categorization, editing, and metadata extraction. Extends Asset via cross-package STI.
4
+
5
+ ## Models
6
+
7
+ - **Image**: STI subclass of Asset (from smrt-assets) — stored in same `assets` table with `_meta_type='Image'`. Adds `width`, `height`, `alt` text.
8
+
9
+ ## Key Services
10
+
11
+ - **ImageCollection**: dimension/orientation filters — `getByMinDimensions()`, `getByAspectRatio()`, `getLandscape()`, `getPortrait()`, `getSquare()`, `getHighResolution()`, `getMissingAltText()`
12
+ - **ImageMetadataExtractor**: dimensions, format, EXIF from buffers (via `@happyvertical/images`)
13
+ - **ImageCategorizer**: AI vision analysis → tags, description, confidence, subjects (via `@happyvertical/ai`)
14
+ - **ImageEditor**: resize/crop/convert/thumbnail + AI editing. Creates new Image records with `parentId` linking to source.
15
+ - **ImageDeriver**: creates derived images and, when requested, records source provenance through generic `AssetAssociation` links
16
+ - **ImageSearch**: text search across name/description/alt with orientation filters
17
+ - **UpstreamManager**: import from external providers with provenance tracking
18
+
19
+ ## AI Operations
20
+
21
+ `generateAltText()` uses the `smrtImages.image.generateAltText` prompt registered via `@happyvertical/smrt-prompts` (resolves tenant overrides via `resolvePrompt()` then dispatches through `getAiClient().message()`). Computed properties: `isLandscape`, `isPortrait`, `aspectRatio`.
22
+
23
+ ## Prompt Registry
24
+
25
+ `Image.generateAltText()` is registered with `@happyvertical/smrt-prompts` so tenants can override template/model/params at runtime:
26
+
27
+ ```typescript
28
+ import { smrtImagesGenerateAltTextPrompt } from '@happyvertical/smrt-images';
29
+ // key: 'smrtImages.image.generateAltText'
30
+ ```
31
+
32
+ Only non-PII metadata fields are passed to the AI provider: `name`, `description`. Source URIs, internal foreign-key fields (`parentId`, `tenantId`), and the extensible `metadata` blob are intentionally excluded — source URIs may embed signed/private bucket paths and `metadata` may contain EXIF GPS data or tenant-private configuration.
33
+
34
+ ## UI Registry
35
+
36
+ Svelte components auto-register with `ModuleUIRegistry` on import of `@happyvertical/smrt-images/svelte`. UI slot declarations live in `src/ui.ts` and are exported via `@happyvertical/smrt-images/ui`:
37
+
38
+ - `assets-gallery` — `AssetsGallery.svelte`
39
+ - `image-editor` — `ImageEditor.svelte`
40
+ - `image-uploader` — `ImageUploader.svelte`
41
+
42
+ ## Gotchas
43
+
44
+ - **Cross-package STI**: Image extends Asset from different package — fragile if Asset schema changes
45
+ - **AssetAssociation usage is intentional here**: image derivation uses it for provenance, not for base-model-owned asset storage
46
+ - **Editor bypasses collection.create()**: creates Image instances directly (skips collection validation)
47
+ - **Derivative creation**: 3 DB calls — `collection.create()` + `store.storeFile()` + `save()`
48
+ - **Orientation filtering is in-memory**: queries all images, then filters by dimensions
package/CLAUDE.md ADDED
@@ -0,0 +1 @@
1
+ @AGENTS.md
package/LICENSE ADDED
@@ -0,0 +1,7 @@
1
+ Copyright <2025> <Happy Vertical Corporation>
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
4
+
5
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
6
+
7
+ THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,92 @@
1
+ # @happyvertical/smrt-images
2
+
3
+ Image asset management with AI-powered categorization, editing, and metadata extraction for the SMRT framework. Extends `Asset` from smrt-assets via cross-package STI -- stored in the same `assets` table with a distinct `_meta_type`.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ pnpm add @happyvertical/smrt-images
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ```typescript
14
+ import {
15
+ Image, ImageCollection,
16
+ ImageCategorizer, ImageEditor, ImageDeriver,
17
+ ImageMetadataExtractor, ImageSearch, UpstreamManager,
18
+ } from '@happyvertical/smrt-images';
19
+
20
+ // Create and query images
21
+ const images = new ImageCollection(db);
22
+ const image = await images.create({
23
+ name: 'hero.jpg',
24
+ url: 'https://cdn.example.com/hero.jpg',
25
+ mimeType: 'image/jpeg',
26
+ width: 1920,
27
+ height: 1080,
28
+ });
29
+ await image.save();
30
+
31
+ // Computed properties from dimensions
32
+ image.isLandscape; // true
33
+ image.aspectRatio; // 1.778
34
+ image.isHighResolution(); // false (below 4K)
35
+
36
+ // AI-powered categorization (returns tags, description, confidence, subjects)
37
+ const categorizer = new ImageCategorizer({ ai: aiConfig });
38
+ const result = await categorizer.categorize(image);
39
+ // Auto-tag: applies tags and sets description/alt text
40
+ await categorizer.autoTag(image, assetCollection);
41
+
42
+ // AI alt text generation via this.do()
43
+ const altText = await image.generateAltText();
44
+
45
+ // Standard editing (resize, crop, convert, thumbnail)
46
+ // Each operation creates a new derivative Image linked via parentId
47
+ const editor = new ImageEditor(store, images, { ai: aiConfig });
48
+ const thumb = await editor.thumbnail(image, 256);
49
+ const resized = await editor.resize(image, 800, 600);
50
+ const webp = await editor.convert(image, 'webp');
51
+
52
+ // AI-powered editing and variation generation
53
+ const edited = await editor.edit(image, 'add warm sunset tones');
54
+ const variations = await editor.generateVariation(image, 'winter theme', { count: 3 });
55
+ ```
56
+
57
+ ## API
58
+
59
+ ### Models
60
+
61
+ | Export | Description |
62
+ |--------|------------|
63
+ | `Image` | STI subclass of `Asset` with `width`, `height`, `alt`, and computed `aspectRatio`/`isLandscape`/`isPortrait`/`isSquare` |
64
+
65
+ ### Collections
66
+
67
+ | Export | Description |
68
+ |--------|------------|
69
+ | `ImageCollection` | Dimension/orientation filters: `getByMinDimensions()`, `getByAspectRatio()`, `getLandscape()`, `getPortrait()`, `getSquare()`, `getHighResolution()`, `getMissingAltText()` |
70
+
71
+ ### Services
72
+
73
+ | Export | Description |
74
+ |--------|------------|
75
+ | `ImageCategorizer` | AI vision analysis returning tags, description, confidence, subjects. `autoTag()` applies results to the image. |
76
+ | `ImageDeriver` | Derive new images from sources + AI prompts with generic provenance links via `AssetAssociation` |
77
+ | `ImageEditor` | Resize, crop, convert, thumbnail (via `@happyvertical/images`) + AI editing. Creates derivative Image records linked via `parentId`. |
78
+ | `ImageMetadataExtractor` | Extract dimensions, format, EXIF from image buffers |
79
+ | `ImageSearch` | Text search across name/description/alt with orientation filters |
80
+ | `UpstreamManager` | Import from external providers with provenance tracking |
81
+
82
+ ### Key Types
83
+
84
+ `ImageOptions`, `CategoryResult`, `DeriveOptions`, `ImageMetadataResult`, `ImageSearchOptions`, `AssetSourceAdapter`, `SourceAsset`, `SourceAssetMetadata`
85
+
86
+ ## Dependencies
87
+
88
+ - `@happyvertical/smrt-core` -- ORM and code generation
89
+ - `@happyvertical/smrt-assets` -- base `Asset` model and `AssetStore`
90
+ - `@happyvertical/smrt-tenancy` -- multi-tenant scoping
91
+ - `@happyvertical/ai` -- AI categorization and image generation
92
+ - `@happyvertical/images` -- resize, crop, convert, thumbnail operations
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=__smrt-register__.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"__smrt-register__.d.ts","sourceRoot":"","sources":["../src/__smrt-register__.ts"],"names":[],"mappings":""}
@@ -0,0 +1,26 @@
1
+ import { AIClientOptions } from '@happyvertical/ai';
2
+ import { AssetCollection } from '@happyvertical/smrt-assets';
3
+ import { Image } from './image';
4
+ import { CategoryResult } from './types';
5
+ export declare class ImageCategorizer {
6
+ private readonly options;
7
+ constructor(options: {
8
+ ai: AIClientOptions;
9
+ });
10
+ /**
11
+ * Categorize an image using AI vision analysis
12
+ *
13
+ * @param image - The Image instance to categorize
14
+ * @param buffer - Optional raw image data for vision analysis
15
+ * @returns Categorization results with tags, description, and subjects
16
+ */
17
+ categorize(image: Image, buffer?: Buffer): Promise<CategoryResult>;
18
+ /**
19
+ * Run categorization and apply results to the image
20
+ *
21
+ * @param image - The Image to categorize and update
22
+ * @param assetCollection - AssetCollection for tag management
23
+ */
24
+ autoTag(image: Image, assetCollection: AssetCollection): Promise<void>;
25
+ }
26
+ //# sourceMappingURL=categorizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"categorizer.d.ts","sourceRoot":"","sources":["../src/categorizer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C,qBAAa,gBAAgB;IACf,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE;QAAE,EAAE,EAAE,eAAe,CAAA;KAAE;IAE7D;;;;;;OAMG;IACG,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAyCxE;;;;;OAKG;IACG,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;CAkB7E"}
@@ -0,0 +1,33 @@
1
+ import { AIClientOptions } from '@happyvertical/ai';
2
+ import { AssetAssociationCollection, AssetStore } from '@happyvertical/smrt-assets';
3
+ import { Image } from './image';
4
+ import { ImageCollection } from './images';
5
+ import { DeriveOptions } from './types';
6
+ export declare class ImageDeriver {
7
+ private readonly store;
8
+ private readonly collection;
9
+ private readonly options;
10
+ constructor(store: AssetStore, collection: ImageCollection, options: {
11
+ ai: AIClientOptions;
12
+ });
13
+ /**
14
+ * Derive new images from source images and a creative prompt
15
+ *
16
+ * @param sources - One or more source images
17
+ * @param prompt - Creative instructions for generation
18
+ * @param deriveOptions - Generation options (count, size, style)
19
+ * @returns Array of newly created derivative Images
20
+ */
21
+ derive(sources: Image[], prompt: string, deriveOptions?: DeriveOptions): Promise<Image[]>;
22
+ /**
23
+ * Derive images and link all sources via AssetAssociation
24
+ *
25
+ * @param sources - Source images
26
+ * @param prompt - Creative instructions
27
+ * @param associations - AssetAssociationCollection for linking
28
+ * @param deriveOptions - Generation options
29
+ * @returns Array of newly created derivative Images
30
+ */
31
+ deriveWithAssociations(sources: Image[], prompt: string, associations: AssetAssociationCollection, deriveOptions?: DeriveOptions): Promise<Image[]>;
32
+ }
33
+ //# sourceMappingURL=deriver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deriver.d.ts","sourceRoot":"","sources":["../src/deriver.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,KAAK,EACV,0BAA0B,EAC1B,UAAU,EACX,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7C,qBAAa,YAAY;IAErB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAFP,KAAK,EAAE,UAAU,EACjB,UAAU,EAAE,eAAe,EAC3B,OAAO,EAAE;QAAE,EAAE,EAAE,eAAe,CAAA;KAAE;IAGnD;;;;;;;OAOG;IACG,MAAM,CACV,OAAO,EAAE,KAAK,EAAE,EAChB,MAAM,EAAE,MAAM,EACd,aAAa,GAAE,aAAkB,GAChC,OAAO,CAAC,KAAK,EAAE,CAAC;IAqDnB;;;;;;;;OAQG;IACG,sBAAsB,CAC1B,OAAO,EAAE,KAAK,EAAE,EAChB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,0BAA0B,EACxC,aAAa,GAAE,aAAkB,GAChC,OAAO,CAAC,KAAK,EAAE,CAAC;CAcpB"}
@@ -0,0 +1,72 @@
1
+ import { AIClientOptions } from '@happyvertical/ai';
2
+ import { AssetStore } from '@happyvertical/smrt-assets';
3
+ import { Image } from './image';
4
+ import { ImageCollection } from './images';
5
+ export declare class ImageEditor {
6
+ private readonly store;
7
+ private readonly collection;
8
+ private readonly options;
9
+ constructor(store: AssetStore, collection: ImageCollection, options?: {
10
+ ai?: AIClientOptions;
11
+ });
12
+ /**
13
+ * Resize an image to the specified dimensions
14
+ *
15
+ * @param image - Source image
16
+ * @param width - Target width
17
+ * @param height - Target height
18
+ * @returns New derivative Image
19
+ */
20
+ resize(image: Image, width: number, height: number): Promise<Image>;
21
+ /**
22
+ * Crop an image to the specified region
23
+ *
24
+ * @param image - Source image
25
+ * @param x - Left offset
26
+ * @param y - Top offset
27
+ * @param w - Crop width
28
+ * @param h - Crop height
29
+ * @returns New derivative Image
30
+ */
31
+ crop(image: Image, x: number, y: number, w: number, h: number): Promise<Image>;
32
+ /**
33
+ * Convert an image to a different format
34
+ *
35
+ * @param image - Source image
36
+ * @param format - Target format (e.g., 'webp', 'png', 'jpeg')
37
+ * @returns New derivative Image
38
+ */
39
+ convert(image: Image, format: string): Promise<Image>;
40
+ /**
41
+ * Generate a square thumbnail of the specified size
42
+ *
43
+ * @param image - Source image
44
+ * @param size - Thumbnail dimension (square)
45
+ * @returns New derivative Image
46
+ */
47
+ thumbnail(image: Image, size: number): Promise<Image>;
48
+ /**
49
+ * AI-powered image generation based on a prompt (creates derivative linked to source)
50
+ *
51
+ * @param image - Source image (used for metadata, linked as parent)
52
+ * @param prompt - Generation instructions (e.g., "similar image with sunset colors")
53
+ * @returns New derivative Image
54
+ */
55
+ edit(image: Image, prompt: string): Promise<Image>;
56
+ /**
57
+ * Generate variations of an image using AI
58
+ *
59
+ * @param image - Source image
60
+ * @param prompt - Variation instructions
61
+ * @param options - Number of variations to generate
62
+ * @returns Array of new derivative Images
63
+ */
64
+ generateVariation(image: Image, prompt: string, options?: {
65
+ count?: number;
66
+ }): Promise<Image[]>;
67
+ /**
68
+ * Helper: Create a derivative Image from processed buffer data
69
+ */
70
+ private createDerivative;
71
+ }
72
+ //# sourceMappingURL=editor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editor.d.ts","sourceRoot":"","sources":["../src/editor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAgBhD,qBAAa,WAAW;IAEpB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAFP,KAAK,EAAE,UAAU,EACjB,UAAU,EAAE,eAAe,EAC3B,OAAO,GAAE;QAAE,EAAE,CAAC,EAAE,eAAe,CAAA;KAAO;IAGzD;;;;;;;OAOG;IACG,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;IAwBzE;;;;;;;;;OASG;IACG,IAAI,CACR,KAAK,EAAE,KAAK,EACZ,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,GACR,OAAO,CAAC,KAAK,CAAC;IAiCjB;;;;;;OAMG;IACG,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;IA6C3D;;;;;;OAMG;IACG,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;IA2B3D;;;;;;OAMG;IACG,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;IAuBxD;;;;;;;OAOG;IACG,iBAAiB,CACrB,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,EACd,OAAO,GAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAO,GAC/B,OAAO,CAAC,KAAK,EAAE,CAAC;IAenB;;OAEG;YACW,gBAAgB;CAqC/B"}
@@ -0,0 +1,53 @@
1
+ import { Asset } from '@happyvertical/smrt-assets';
2
+ import { ImageOptions } from './types';
3
+ export declare class Image extends Asset {
4
+ width: number;
5
+ height: number;
6
+ alt: string;
7
+ constructor(options?: ImageOptions);
8
+ /**
9
+ * Calculate aspect ratio from dimensions
10
+ */
11
+ get aspectRatio(): number;
12
+ /**
13
+ * Helper to get URL from sourceUri for frontend components
14
+ */
15
+ get url(): string;
16
+ /**
17
+ * Check if dimensions indicate landscape orientation
18
+ */
19
+ get isLandscape(): boolean;
20
+ /**
21
+ * Check if dimensions indicate portrait orientation
22
+ */
23
+ get isPortrait(): boolean;
24
+ /**
25
+ * Check if dimensions indicate square aspect ratio
26
+ */
27
+ get isSquare(): boolean;
28
+ /**
29
+ * Validate that the asset is an image based on MIME type
30
+ */
31
+ isValidImageFormat(): boolean;
32
+ /**
33
+ * Check if this image is high resolution (4K+)
34
+ */
35
+ isHighResolution(): boolean;
36
+ /**
37
+ * AI-powered: Generate accessibility alt text for this image.
38
+ *
39
+ * Uses the `smrtImages.image.generateAltText` prompt registered via
40
+ * `@happyvertical/smrt-prompts`, allowing tenant- or instance-level
41
+ * overrides of the template, model, and parameters at runtime.
42
+ *
43
+ * Only non-PII metadata fields (name, description) are sent to the AI
44
+ * provider. Source URIs, internal foreign-key fields, and the
45
+ * extensible `metadata` blob are intentionally excluded — source URIs
46
+ * may embed signed/private bucket paths and metadata may contain EXIF
47
+ * GPS data or tenant-private configuration.
48
+ *
49
+ * @returns AI-generated alt text describing the image
50
+ */
51
+ generateAltText(): Promise<string>;
52
+ }
53
+ //# sourceMappingURL=image.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../src/image.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAC;AAOnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C,qBAKa,KAAM,SAAQ,KAAK;IAG9B,KAAK,EAAE,MAAM,CAAK;IAElB,MAAM,EAAE,MAAM,CAAK;IAInB,GAAG,EAAE,MAAM,CAAM;gBAEL,OAAO,GAAE,YAAiB;IAOtC;;OAEG;IACH,IAAI,WAAW,IAAI,MAAM,CAGxB;IAED;;OAEG;IACH,IAAI,GAAG,IAAI,MAAM,CAEhB;IAED;;OAEG;IACH,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED;;OAEG;IACH,IAAI,UAAU,IAAI,OAAO,CAExB;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED;;OAEG;IACH,kBAAkB,IAAI,OAAO;IAI7B;;OAEG;IACH,gBAAgB,IAAI,OAAO;IAI3B;;;;;;;;;;;;;;OAcG;IACG,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC;CAgCzC"}
@@ -0,0 +1,80 @@
1
+ import { SmrtCollection } from '@happyvertical/smrt-core';
2
+ import { Image } from './image';
3
+ export declare class ImageCollection extends SmrtCollection<Image> {
4
+ static readonly _itemClass: typeof Image;
5
+ /**
6
+ * Find all images belonging to a specific tenant
7
+ *
8
+ * @param tenantId - The tenant ID to filter by
9
+ * @returns Array of images belonging to this tenant
10
+ */
11
+ findByTenant(tenantId: string): Promise<Image[]>;
12
+ /**
13
+ * Find all global images (images without a tenant)
14
+ *
15
+ * @returns Array of global images
16
+ */
17
+ findGlobal(): Promise<Image[]>;
18
+ /**
19
+ * Find images belonging to a tenant plus all global images
20
+ *
21
+ * @param tenantId - The tenant ID to include
22
+ * @returns Array of tenant-specific and global images
23
+ */
24
+ findWithGlobals(tenantId: string): Promise<Image[]>;
25
+ /**
26
+ * Get images by minimum dimensions
27
+ *
28
+ * @param minWidth - Minimum width in pixels
29
+ * @param minHeight - Minimum height in pixels
30
+ * @returns Array of images meeting minimum dimension requirements
31
+ */
32
+ getByMinDimensions(minWidth: number, minHeight: number): Promise<Image[]>;
33
+ /**
34
+ * Get images by maximum dimensions
35
+ *
36
+ * @param maxWidth - Maximum width in pixels
37
+ * @param maxHeight - Maximum height in pixels
38
+ * @returns Array of images within maximum dimension limits
39
+ */
40
+ getByMaxDimensions(maxWidth: number, maxHeight: number): Promise<Image[]>;
41
+ /**
42
+ * Get landscape images (width > height)
43
+ *
44
+ * @returns Array of landscape-oriented images
45
+ */
46
+ getLandscape(): Promise<Image[]>;
47
+ /**
48
+ * Get portrait images (height > width)
49
+ *
50
+ * @returns Array of portrait-oriented images
51
+ */
52
+ getPortrait(): Promise<Image[]>;
53
+ /**
54
+ * Get square images (width === height)
55
+ *
56
+ * @returns Array of square images
57
+ */
58
+ getSquare(): Promise<Image[]>;
59
+ /**
60
+ * Get images missing alt text
61
+ *
62
+ * @returns Array of images without accessibility text
63
+ */
64
+ getMissingAltText(): Promise<Image[]>;
65
+ /**
66
+ * Get high resolution images (4K+)
67
+ *
68
+ * @returns Array of high resolution images
69
+ */
70
+ getHighResolution(): Promise<Image[]>;
71
+ /**
72
+ * Get images by aspect ratio range
73
+ *
74
+ * @param minRatio - Minimum aspect ratio (width/height)
75
+ * @param maxRatio - Maximum aspect ratio (width/height)
76
+ * @returns Array of images within the aspect ratio range
77
+ */
78
+ getByAspectRatio(minRatio: number, maxRatio: number): Promise<Image[]>;
79
+ }
80
+ //# sourceMappingURL=images.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"images.d.ts","sourceRoot":"","sources":["../src/images.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEhC,qBAAa,eAAgB,SAAQ,cAAc,CAAC,KAAK,CAAC;IACxD,MAAM,CAAC,QAAQ,CAAC,UAAU,eAAS;IAMnC;;;;;OAKG;IACG,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAItD;;;;OAIG;IACG,UAAU,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;IAIpC;;;;;OAKG;IACG,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAOzD;;;;;;OAMG;IACG,kBAAkB,CACtB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,KAAK,EAAE,CAAC;IASnB;;;;;;OAMG;IACG,kBAAkB,CACtB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,KAAK,EAAE,CAAC;IASnB;;;;OAIG;IACG,YAAY,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;IAMtC;;;;OAIG;IACG,WAAW,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;IAMrC;;;;OAIG;IACG,SAAS,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;IAMnC;;;;OAIG;IACG,iBAAiB,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;IAM3C;;;;OAIG;IACG,iBAAiB,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;IAM3C;;;;;;OAMG;IACG,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;CAU7E"}
@@ -0,0 +1,12 @@
1
+ export { ImageCategorizer } from './categorizer';
2
+ export { ImageDeriver } from './deriver';
3
+ export { ImageEditor } from './editor';
4
+ export { Image } from './image';
5
+ export { ImageCollection } from './images';
6
+ export { type ImageMediaBundleFileDescriptor, type ImageMediaBundleGpsTrackPoint, type ImageMediaBundleInspection, type ImageMediaBundleInspectionLike, type ImageMediaBundleNormalizedMetadata, type ImageMediaBundleSupportFileInspection, type MediaSupportFileVisibility, type PersistImageMediaBundleAssetInput, type PersistImageMediaBundleAssociationInput, type PersistImageMediaBundleInspectionOptions, type PersistImageMediaBundleInspectionResult, type PersistImageMediaBundleMetadataArtifactInput, persistImageMediaBundleInspection, type SmrtImageMediaBundlePersistenceAdapter, } from './media-bundle-persistence';
7
+ export { ImageMetadataExtractor } from './metadata';
8
+ export { smrtImagesGenerateAltTextPrompt } from './prompts';
9
+ export { ImageSearch } from './search';
10
+ export type { CategoryResult, DeriveOptions, ImageMetadataResult, ImageOptions, ImageSearchOptions, } from './types';
11
+ export { type AssetSourceAdapter, type SourceAsset, type SourceAssetMetadata, UpstreamManager, } from './upstream';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,wBAAwB,CAAC;AAIhC,OAAO,cAAc,CAAC;AAGtB,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EACL,KAAK,8BAA8B,EACnC,KAAK,6BAA6B,EAClC,KAAK,0BAA0B,EAC/B,KAAK,8BAA8B,EACnC,KAAK,kCAAkC,EACvC,KAAK,qCAAqC,EAC1C,KAAK,0BAA0B,EAC/B,KAAK,iCAAiC,EACtC,KAAK,uCAAuC,EAC5C,KAAK,wCAAwC,EAC7C,KAAK,uCAAuC,EAC5C,KAAK,4CAA4C,EACjD,iCAAiC,EACjC,KAAK,sCAAsC,GAC5C,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,+BAA+B,EAAE,MAAM,WAAW,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC,YAAY,EACV,cAAc,EACd,aAAa,EACb,mBAAmB,EACnB,YAAY,EACZ,kBAAkB,GACnB,MAAM,SAAS,CAAC;AACjB,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,WAAW,EAChB,KAAK,mBAAmB,EACxB,eAAe,GAChB,MAAM,YAAY,CAAC"}