@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.
- package/AGENTS.md +48 -0
- package/CLAUDE.md +1 -0
- package/LICENSE +7 -0
- package/README.md +92 -0
- package/dist/__smrt-register__.d.ts +2 -0
- package/dist/__smrt-register__.d.ts.map +1 -0
- package/dist/categorizer.d.ts +26 -0
- package/dist/categorizer.d.ts.map +1 -0
- package/dist/deriver.d.ts +33 -0
- package/dist/deriver.d.ts.map +1 -0
- package/dist/editor.d.ts +72 -0
- package/dist/editor.d.ts.map +1 -0
- package/dist/image.d.ts +53 -0
- package/dist/image.d.ts.map +1 -0
- package/dist/images.d.ts +80 -0
- package/dist/images.d.ts.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +839 -0
- package/dist/index.js.map +1 -0
- package/dist/manifest.json +1179 -0
- package/dist/media-bundle-persistence.d.ts +15 -0
- package/dist/media-bundle-persistence.d.ts.map +1 -0
- package/dist/metadata.d.ts +19 -0
- package/dist/metadata.d.ts.map +1 -0
- package/dist/playground.d.ts +2 -0
- package/dist/playground.d.ts.map +1 -0
- package/dist/playground.js +140 -0
- package/dist/playground.js.map +1 -0
- package/dist/prompts.d.ts +8 -0
- package/dist/prompts.d.ts.map +1 -0
- package/dist/search.d.ts +42 -0
- package/dist/search.d.ts.map +1 -0
- package/dist/smrt-knowledge.json +561 -0
- package/dist/svelte/components/AssetsGallery.svelte +436 -0
- package/dist/svelte/components/AssetsGallery.svelte.d.ts +11 -0
- package/dist/svelte/components/AssetsGallery.svelte.d.ts.map +1 -0
- package/dist/svelte/components/ImageEditor.svelte +485 -0
- package/dist/svelte/components/ImageEditor.svelte.d.ts +12 -0
- package/dist/svelte/components/ImageEditor.svelte.d.ts.map +1 -0
- package/dist/svelte/components/ImageUploader.svelte +922 -0
- package/dist/svelte/components/ImageUploader.svelte.d.ts +15 -0
- package/dist/svelte/components/ImageUploader.svelte.d.ts.map +1 -0
- package/dist/svelte/i18n.d.ts +42 -0
- package/dist/svelte/i18n.d.ts.map +1 -0
- package/dist/svelte/i18n.js +46 -0
- package/dist/svelte/image-clients.d.ts +45 -0
- package/dist/svelte/image-clients.d.ts.map +1 -0
- package/dist/svelte/image-clients.js +1 -0
- package/dist/svelte/index.d.ts +14 -0
- package/dist/svelte/index.d.ts.map +1 -0
- package/dist/svelte/index.js +21 -0
- package/dist/svelte/playground.d.ts +74 -0
- package/dist/svelte/playground.d.ts.map +1 -0
- package/dist/svelte/playground.js +105 -0
- package/dist/svelte/routes/ImageStudioRoute.svelte +194 -0
- package/dist/svelte/routes/ImageStudioRoute.svelte.d.ts +7 -0
- package/dist/svelte/routes/ImageStudioRoute.svelte.d.ts.map +1 -0
- package/dist/svelte/routes/index.d.ts +2 -0
- package/dist/svelte/routes/index.d.ts.map +1 -0
- package/dist/svelte/routes/index.js +1 -0
- package/dist/svelte/routes/shared.d.ts +25 -0
- package/dist/svelte/routes/shared.d.ts.map +1 -0
- package/dist/svelte/routes/shared.js +31 -0
- package/dist/types.d.ts +51 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/ui.d.ts +10 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +42 -0
- package/dist/ui.js.map +1 -0
- package/dist/upstream.d.ts +65 -0
- package/dist/upstream.d.ts.map +1 -0
- 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 @@
|
|
|
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"}
|
package/dist/editor.d.ts
ADDED
|
@@ -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"}
|
package/dist/image.d.ts
ADDED
|
@@ -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"}
|
package/dist/images.d.ts
ADDED
|
@@ -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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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"}
|