@happyvertical/smrt-assets 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 (119) hide show
  1. package/AGENTS.md +78 -0
  2. package/CLAUDE.md +1 -0
  3. package/LICENSE +7 -0
  4. package/README.md +136 -0
  5. package/dist/__smrt-register__.d.ts +2 -0
  6. package/dist/__smrt-register__.d.ts.map +1 -0
  7. package/dist/asset-association.d.ts +16 -0
  8. package/dist/asset-association.d.ts.map +1 -0
  9. package/dist/asset-associations.d.ts +27 -0
  10. package/dist/asset-associations.d.ts.map +1 -0
  11. package/dist/asset-capabilities.d.ts +137 -0
  12. package/dist/asset-capabilities.d.ts.map +1 -0
  13. package/dist/asset-conventions.d.ts +76 -0
  14. package/dist/asset-conventions.d.ts.map +1 -0
  15. package/dist/asset-metafield.d.ts +27 -0
  16. package/dist/asset-metafield.d.ts.map +1 -0
  17. package/dist/asset-metafields.d.ts +27 -0
  18. package/dist/asset-metafields.d.ts.map +1 -0
  19. package/dist/asset-runtime.d.ts +218 -0
  20. package/dist/asset-runtime.d.ts.map +1 -0
  21. package/dist/asset-serving.d.ts +146 -0
  22. package/dist/asset-serving.d.ts.map +1 -0
  23. package/dist/asset-status.d.ts +15 -0
  24. package/dist/asset-status.d.ts.map +1 -0
  25. package/dist/asset-statuses.d.ts +25 -0
  26. package/dist/asset-statuses.d.ts.map +1 -0
  27. package/dist/asset-store.d.ts +200 -0
  28. package/dist/asset-store.d.ts.map +1 -0
  29. package/dist/asset-type.d.ts +15 -0
  30. package/dist/asset-type.d.ts.map +1 -0
  31. package/dist/asset-types.d.ts +28 -0
  32. package/dist/asset-types.d.ts.map +1 -0
  33. package/dist/asset.d.ts +158 -0
  34. package/dist/asset.d.ts.map +1 -0
  35. package/dist/assets.d.ts +125 -0
  36. package/dist/assets.d.ts.map +1 -0
  37. package/dist/folder.d.ts +16 -0
  38. package/dist/folder.d.ts.map +1 -0
  39. package/dist/folders.d.ts +45 -0
  40. package/dist/folders.d.ts.map +1 -0
  41. package/dist/index.d.ts +21 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +2285 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/manifest.json +4079 -0
  46. package/dist/media-bundle-persistence.d.ts +99 -0
  47. package/dist/media-bundle-persistence.d.ts.map +1 -0
  48. package/dist/owned-asset-helpers.d.ts +20 -0
  49. package/dist/owned-asset-helpers.d.ts.map +1 -0
  50. package/dist/playground.d.ts +2 -0
  51. package/dist/playground.d.ts.map +1 -0
  52. package/dist/playground.js +127 -0
  53. package/dist/playground.js.map +1 -0
  54. package/dist/smrt-knowledge.json +1922 -0
  55. package/dist/svelte/ActionBar.svelte +203 -0
  56. package/dist/svelte/ActionBar.svelte.d.ts +5 -0
  57. package/dist/svelte/ActionBar.svelte.d.ts.map +1 -0
  58. package/dist/svelte/AssetDetail.svelte +521 -0
  59. package/dist/svelte/AssetDetail.svelte.d.ts +35 -0
  60. package/dist/svelte/AssetDetail.svelte.d.ts.map +1 -0
  61. package/dist/svelte/AssetGrid.svelte +351 -0
  62. package/dist/svelte/AssetGrid.svelte.d.ts +5 -0
  63. package/dist/svelte/AssetGrid.svelte.d.ts.map +1 -0
  64. package/dist/svelte/AssetList.svelte +436 -0
  65. package/dist/svelte/AssetList.svelte.d.ts +5 -0
  66. package/dist/svelte/AssetList.svelte.d.ts.map +1 -0
  67. package/dist/svelte/AssetManager.svelte +381 -0
  68. package/dist/svelte/AssetManager.svelte.d.ts +5 -0
  69. package/dist/svelte/AssetManager.svelte.d.ts.map +1 -0
  70. package/dist/svelte/AssetToolbar.svelte +388 -0
  71. package/dist/svelte/AssetToolbar.svelte.d.ts +5 -0
  72. package/dist/svelte/AssetToolbar.svelte.d.ts.map +1 -0
  73. package/dist/svelte/CreateAssetModal.svelte +373 -0
  74. package/dist/svelte/CreateAssetModal.svelte.d.ts +19 -0
  75. package/dist/svelte/CreateAssetModal.svelte.d.ts.map +1 -0
  76. package/dist/svelte/__tests__/ActionBar.test.js +72 -0
  77. package/dist/svelte/__tests__/AssetDetail.test.js +57 -0
  78. package/dist/svelte/__tests__/AssetGrid.test.js +69 -0
  79. package/dist/svelte/__tests__/AssetList.test.js +72 -0
  80. package/dist/svelte/__tests__/AssetManager.test.js +21 -0
  81. package/dist/svelte/__tests__/AssetManagerRoute.test.js +16 -0
  82. package/dist/svelte/__tests__/AssetToolbar.test.js +39 -0
  83. package/dist/svelte/__tests__/CreateAssetModal.test.js +42 -0
  84. package/dist/svelte/i18n.d.ts +76 -0
  85. package/dist/svelte/i18n.d.ts.map +1 -0
  86. package/dist/svelte/i18n.js +87 -0
  87. package/dist/svelte/index.d.ts +19 -0
  88. package/dist/svelte/index.d.ts.map +1 -0
  89. package/dist/svelte/index.js +30 -0
  90. package/dist/svelte/playground/AssetDetailPreview.svelte +131 -0
  91. package/dist/svelte/playground/AssetDetailPreview.svelte.d.ts +8 -0
  92. package/dist/svelte/playground/AssetDetailPreview.svelte.d.ts.map +1 -0
  93. package/dist/svelte/playground/CreateAssetModalPreview.svelte +151 -0
  94. package/dist/svelte/playground/CreateAssetModalPreview.svelte.d.ts +4 -0
  95. package/dist/svelte/playground/CreateAssetModalPreview.svelte.d.ts.map +1 -0
  96. package/dist/svelte/playground.d.ts +60 -0
  97. package/dist/svelte/playground.d.ts.map +1 -0
  98. package/dist/svelte/playground.js +93 -0
  99. package/dist/svelte/routes/AssetManagerRoute.svelte +209 -0
  100. package/dist/svelte/routes/AssetManagerRoute.svelte.d.ts +4 -0
  101. package/dist/svelte/routes/AssetManagerRoute.svelte.d.ts.map +1 -0
  102. package/dist/svelte/routes/index.d.ts +2 -0
  103. package/dist/svelte/routes/index.d.ts.map +1 -0
  104. package/dist/svelte/routes/index.js +1 -0
  105. package/dist/svelte/routes/shared.d.ts +25 -0
  106. package/dist/svelte/routes/shared.d.ts.map +1 -0
  107. package/dist/svelte/routes/shared.js +31 -0
  108. package/dist/svelte/types.d.ts +179 -0
  109. package/dist/svelte/types.d.ts.map +1 -0
  110. package/dist/svelte/types.js +6 -0
  111. package/dist/types.d.ts +80 -0
  112. package/dist/types.d.ts.map +1 -0
  113. package/dist/types.js +2 -0
  114. package/dist/types.js.map +1 -0
  115. package/dist/ui.d.ts +10 -0
  116. package/dist/ui.d.ts.map +1 -0
  117. package/dist/ui.js +85 -0
  118. package/dist/ui.js.map +1 -0
  119. package/package.json +102 -0
package/AGENTS.md ADDED
@@ -0,0 +1,78 @@
1
+ # @happyvertical/smrt-assets
2
+
3
+ Provider-agnostic asset management with versioning, type classification, and generic/provenance associations.
4
+
5
+ ## Models
6
+
7
+ - **Asset** (STI base): versioning via `primaryVersionId` chain + `version` number. `ownerProfileId`, `typeSlug`, `statusSlug`, `mimeType`, `sourceUri`. Derivation chain via `sourceAssetId` (R3-D — was `parentId` before the rename; column `source_asset_id`).
8
+ - **AssetType** / **AssetStatus**: lookup tables for classification and lifecycle.
9
+ - **AssetMetafield**: custom metadata field definitions with JSON validation rules.
10
+ - **Folder**: hierarchical container for assets. Own `SmrtHierarchical` model with its own `folders` table (R3-D — was an STI subclass of Asset before). `Asset.folderId` points to the folder.
11
+ - **AssetAssociation**: generic/provenance polymorphic join — `assetId` + `metaType` + `metaId` + `role` + `sortOrder`. Use it when a relationship is not owned by a base/domain model join table like `content_assets`, `profile_assets`, `event_assets`, `place_assets`, or `product_assets`.
12
+
13
+ ## Key Patterns
14
+
15
+ - **Versioning**: `createNewVersion()` increments version, chains via `primaryVersionId`. `findVersions()` to retrieve history.
16
+ - **Tag integration**: `addTag()`/`removeTag()` use raw `db.upsert()` on `asset_tags` join table (not a SMRT model).
17
+ - **AssetStore**: abstraction for provider-agnostic file I/O (S3, local, etc.).
18
+ - **Ownership rule**: base/domain-owned asset relationships should live on noun join tables such as `content_assets`, `profile_assets`, `event_assets`, `place_assets`, and `product_assets`; keep `AssetAssociation` for generic/provenance links like image derivation.
19
+
20
+ ## Runtime surface
21
+
22
+ Apps and agents should depend on the public **asset runtime** rather than hand-wiring a collection + store per-package (#1128).
23
+
24
+ - `createAssetRuntime({ db, storage })` → `AssetRuntime` bundling `AssetCollection`, `AssetAssociationCollection`, and an initialized `AssetStore`.
25
+ - `AssetRuntime.storeSourceAsset(name, data, opts)` — create a new source asset (record + bytes).
26
+ - `AssetRuntime.storeDerivedAsset(source, name, data, opts)` — create a derivative with `sourceAssetId` set and (by default) a provenance `AssetAssociation` under a chosen role.
27
+ - `AssetRuntime.linkDerivation(source, derivative, { role })` — record provenance without touching bytes.
28
+ - `AssetRuntime.setExtractionStatus(asset, status, { error?, extractedAt? })` — write canonical extraction metadata into the asset's description JSON sidecar. Non-destructive: if `description` is free-form prose or non-object JSON, the original value is preserved under the reserved `text` key instead of being overwritten. Existing JSON objects are merged into.
29
+
30
+ Agents that need asset I/O should accept an `AssetRuntimeLike` in their options rather than asking callers to pass a store + collection separately.
31
+
32
+ ## Serving contract
33
+
34
+ - `serveAsset({ runtime, asset, tenantId?, disposition?, canAccess?, headers?, remoteMode? })` → standard Web `Response`.
35
+ - `404` when the id doesn't resolve; `403` when the tenant mismatches or `canAccess` denies; `302` when `remoteMode: 'redirect'` and the asset's `sourceUri` is `http(s)`; `502` when `remoteMode: 'proxy'` and the origin fetch fails; `500` on store read errors or unexpected failures; `200` otherwise with `Content-Type`, `Content-Length`, and `Content-Disposition` set.
36
+ - Assets whose `sourceUri` is `http(s)` are supported via `remoteMode`: `'proxy'` (default, fetch and return bytes), `'redirect'` (302 to the origin), or `'error'` (treat as misconfiguration). Pass `fetchImpl` to swap the fetch client.
37
+ - `Content-Disposition` filenames are sanitised (control characters stripped, `"` / `\` / `/` replaced) to prevent header injection on untrusted asset names.
38
+ - The 500 body is a generic `'Internal error serving asset'`; the underlying error is logged via `console.error` so operators can debug without leaking paths/bucket names to clients.
39
+ - Works in SvelteKit `+server.ts` endpoints, Hono, and any runtime with a global `Response` (Node 18+). Pass `responseCtor` for older runtimes.
40
+ - `resolveAssetForServing(options)` → `{ asset, data, contentType, filename, size }` when callers want to render their own framework response. Throws `AssetServeError(status)` on the same failure modes.
41
+
42
+ ## Source/derived vocabulary
43
+
44
+ The following roles are exported as `ASSET_ROLES` and should be preferred over ad-hoc strings when apps want cross-package tooling (serving, UI pickers) to agree on meaning:
45
+
46
+ | Role | Use |
47
+ |------|-----|
48
+ | `source_document` | original upstream document (agenda PDF, minutes) |
49
+ | `document_image` | page/extracted image derived from a source document |
50
+ | `thumbnail` | preview rendition of another asset |
51
+ | `proof` | non-canonical evidence asset backing a fact |
52
+ | `derivation_source` | "came from" link on generated media |
53
+ | `attachment` | generic owner-join link |
54
+ | `hero` | primary/featured asset on an owner |
55
+
56
+ Canonical metadata keys are exported as `ASSET_METADATA_KEYS`: `extractionStatus`, `extractionError`, `extractedAt`, `sourceUrl`, `sourceHash`, `pageNumber`. Extraction status values live in `ASSET_EXTRACTION_STATUS` (`pending | running | succeeded | failed`).
57
+
58
+ ## UI Registry
59
+
60
+ The `./ui` subpath exports `ASSETS_MODULE_META` and `ASSETS_UI_SLOTS` so registry-driven hosts (smrt-chat, dynamic admin shells) can discover the package's Svelte components without a hard import.
61
+
62
+ ```ts
63
+ import { ASSETS_MODULE_META, ASSETS_UI_SLOTS } from '@happyvertical/smrt-assets/ui';
64
+ import '@happyvertical/smrt-assets/svelte'; // side-effect: ModuleUIRegistry.register(...)
65
+ import { ModuleUIRegistry } from '@happyvertical/smrt-svelte/registry';
66
+
67
+ const AssetManager = ModuleUIRegistry.get('@happyvertical/smrt-assets', 'asset-manager');
68
+ ```
69
+
70
+ Registered slots: `asset-manager` (admin), `asset-grid` / `asset-list` (list), `asset-detail` (detail), `asset-toolbar` / `asset-action-bar` (action), `asset-create-modal` (form). Slot IDs are stable contracts — host apps reference them by string.
71
+
72
+ ## Gotchas
73
+
74
+ - **Version history manual**: `findVersions()` chaining required — no ORM shortcut
75
+ - **Tag management uses raw SQL**: `asset_tags` is a join table, not an SMRT model
76
+ - **Folder tree traversal**: via `SmrtHierarchical` (`getParent`/`getChildren`/`getAncestors`/`getDescendants`/`getHierarchy`/`moveTo`); `FolderCollection.getTree(rootId?)` and `getPath(folderId)` wrap these for convenience
77
+ - **AssetAssociation polymorphic FK**: requires manual `metaType` string matching
78
+ - **Optional tenancy**: assets can be global (tenantId=null) or tenant-scoped
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,136 @@
1
+ # @happyvertical/smrt-assets
2
+
3
+ Provider-agnostic asset management with versioning, type classification, metadata fields, and generic/provenance associations.
4
+
5
+ `AssetAssociation` is the generic exception path for linking assets to arbitrary
6
+ objects when there is not a model-owned noun join table. Base/domain-owned
7
+ relationships should use dedicated joins such as `content_assets`,
8
+ `profile_assets`, `event_assets`, `place_assets`, and `product_assets`.
9
+
10
+ ## Installation
11
+
12
+ ```bash
13
+ pnpm add @happyvertical/smrt-assets
14
+ ```
15
+
16
+ ## Usage
17
+
18
+ ```typescript
19
+ import {
20
+ Asset, AssetCollection,
21
+ AssetType, AssetStatus, AssetMetafield,
22
+ AssetAssociation, AssetAssociationCollection,
23
+ Folder, FolderCollection,
24
+ AssetStore,
25
+ } from '@happyvertical/smrt-assets';
26
+
27
+ // Create lookup records
28
+ const imageType = new AssetType({ slug: 'image', name: 'Image' });
29
+ await imageType.save();
30
+
31
+ const published = new AssetStatus({ slug: 'published', name: 'Published' });
32
+ await published.save();
33
+
34
+ // Create an asset
35
+ const photo = new Asset({
36
+ name: 'Product Photo',
37
+ slug: 'product-photo-001',
38
+ sourceUri: 's3://bucket/products/photo-001.jpg',
39
+ mimeType: 'image/jpeg',
40
+ typeSlug: 'image',
41
+ statusSlug: 'published',
42
+ version: 1,
43
+ });
44
+ await photo.save();
45
+
46
+ // Versioning -- chain via primaryVersionId, increment version number
47
+ const v2 = new Asset({
48
+ ...photo, slug: 'product-photo-002', version: 2, primaryVersionId: photo.id,
49
+ sourceUri: 's3://bucket/products/photo-002.jpg',
50
+ });
51
+ await v2.save();
52
+
53
+ // Derivatives via sourceAssetId (renamed from `parentId` in R3-D)
54
+ const thumb = new Asset({
55
+ name: 'Thumbnail', slug: 'product-photo-001-thumb', sourceAssetId: photo.id,
56
+ sourceUri: 's3://bucket/products/photo-001-thumb.jpg',
57
+ mimeType: 'image/jpeg', typeSlug: 'image', statusSlug: 'published',
58
+ });
59
+ await thumb.save();
60
+
61
+ // Generic/provenance association -- link asset to an arbitrary object
62
+ const assoc = new AssetAssociation({
63
+ assetId: photo.id,
64
+ metaType: 'Image',
65
+ metaId: 'derived-image-123',
66
+ role: 'derivation-source',
67
+ sortOrder: 0,
68
+ });
69
+ await assoc.save();
70
+
71
+ // Base/domain-owned asset relationships should use dedicated noun joins instead:
72
+ // content_assets, profile_assets, event_assets, place_assets, product_assets
73
+
74
+ // Folder organization (its own SmrtHierarchical model, `folders` table)
75
+ const folder = new Folder({ name: 'Product Images', slug: 'product-images' });
76
+ await folder.save();
77
+ // Move an asset into a folder
78
+ photo.folderId = folder.id;
79
+ await photo.save();
80
+
81
+ // AssetStore -- provider-agnostic file I/O + record creation
82
+ const store = new AssetStore({ collection, filesystem });
83
+ await store.store({ buffer, mimeType: 'image/png', name: 'screenshot' });
84
+ ```
85
+
86
+ ## API
87
+
88
+ ### Models (SmrtObject)
89
+
90
+ | Export | Description |
91
+ |--------|------------|
92
+ | `Asset` | Core asset with versioning (`primaryVersionId`, `version`), derivation chain (`sourceAssetId`), `sourceUri`, `mimeType`, `typeSlug`, `statusSlug`, `ownerProfileId` |
93
+ | `AssetAssociation` | Generic/provenance polymorphic join: `assetId` + `metaType` + `metaId` + `role` + `sortOrder`; not for base/domain-owned joins that already have noun tables |
94
+ | `AssetType` | Lookup table for asset type classification |
95
+ | `AssetStatus` | Lookup table for lifecycle status |
96
+ | `AssetMetafield` | Custom metadata field definitions with JSON validation rules |
97
+ | `Folder` | Hierarchical container for assets; own `folders` table extending `SmrtHierarchical` |
98
+
99
+ ### Collections (SmrtCollection)
100
+
101
+ | Export | Description |
102
+ |--------|------------|
103
+ | `AssetCollection` | Collection for Asset |
104
+ | `AssetAssociationCollection` | Collection for AssetAssociation |
105
+ | `AssetTypeCollection` | Collection for AssetType |
106
+ | `AssetStatusCollection` | Collection for AssetStatus |
107
+ | `AssetMetafieldCollection` | Collection for AssetMetafield |
108
+ | `FolderCollection` | Collection for Folder |
109
+
110
+ ### Utilities
111
+
112
+ | Export | Description |
113
+ |--------|------------|
114
+ | `AssetStore` | Provider-agnostic file I/O that writes buffers to storage and creates Asset records |
115
+
116
+ ### Types
117
+
118
+ | Export | Description |
119
+ |--------|------------|
120
+ | `AssetOptions` | Options for `Asset` constructor |
121
+ | `AssetAssociationOptions` | Options for `AssetAssociation` constructor |
122
+ | `AssetTypeOptions` | Options for `AssetType` constructor |
123
+ | `AssetStatusOptions` | Options for `AssetStatus` constructor |
124
+ | `AssetMetafieldOptions` | Options for `AssetMetafield` constructor |
125
+ | `FolderOptions` | Options for `Folder` constructor |
126
+ | `StoreOptions` | Options for `AssetStore.store()` |
127
+ | `ProviderOptions` | Provider configuration for `AssetStore` |
128
+
129
+ ## Dependencies
130
+
131
+ | Package | Purpose |
132
+ |---------|---------|
133
+ | `@happyvertical/smrt-core` | ORM base (SmrtObject, SmrtCollection) |
134
+ | `@happyvertical/smrt-tags` | Tag integration (`addTag`/`removeTag` on assets) |
135
+ | `@happyvertical/smrt-tenancy` | Optional tenant scoping |
136
+ | `@happyvertical/files` | Provider-agnostic filesystem for AssetStore |
@@ -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,16 @@
1
+ import { SmrtPolymorphicAssociation } from '@happyvertical/smrt-core';
2
+ import { AssetAssociationOptions } from './types';
3
+ export declare class AssetAssociation extends SmrtPolymorphicAssociation {
4
+ /**
5
+ * Optional tenant scope. Without this, the generated `api`/`mcp` `create`
6
+ * routes let any caller forge a polymorphic link between an asset and an
7
+ * arbitrary object across tenant boundaries — the #1540 generated-route
8
+ * tenant-context fix only filters models that ARE `@TenantScoped`, so this
9
+ * model must opt in to be covered (S5 #1396).
10
+ */
11
+ tenantId: string | null;
12
+ /** FK to Asset.id */
13
+ assetId: string;
14
+ constructor(options?: AssetAssociationOptions);
15
+ }
16
+ //# sourceMappingURL=asset-association.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asset-association.d.ts","sourceRoot":"","sources":["../src/asset-association.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAEL,0BAA0B,EAE3B,MAAM,0BAA0B,CAAC;AAElC,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAEvD,qBAOa,gBAAiB,SAAQ,0BAA0B;IAC9D;;;;;;OAMG;IAEH,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE/B,qBAAqB;IAErB,OAAO,SAAM;gBAED,OAAO,GAAE,uBAA4B;CAKlD"}
@@ -0,0 +1,27 @@
1
+ import { JunctionAttachOptions, JunctionFilterOptions, SmrtJunction } from '@happyvertical/smrt-core';
2
+ import { AssetAssociation } from './asset-association';
3
+ export declare class AssetAssociationCollection extends SmrtJunction<AssetAssociation> {
4
+ static readonly _itemClass: typeof AssetAssociation;
5
+ protected leftField: string;
6
+ protected rightField: string;
7
+ /**
8
+ * List associations for a polymorphic owner.
9
+ *
10
+ * Composite left key — pass both halves.
11
+ */
12
+ byLeft(metaType: string, metaId: string, opts?: JunctionFilterOptions): Promise<AssetAssociation[]>;
13
+ /**
14
+ * Create an association. Composite left (metaType, metaId) precedes right (assetId).
15
+ */
16
+ attach(metaType: string, metaId: string, assetId: string, opts?: JunctionAttachOptions): Promise<AssetAssociation>;
17
+ /**
18
+ * Delete matching associations. Composite left (metaType, metaId) precedes right (assetId).
19
+ */
20
+ detach(metaType: string, metaId: string, assetId: string, opts?: JunctionFilterOptions): Promise<void>;
21
+ /**
22
+ * Replace all associations for a polymorphic owner with the given asset IDs.
23
+ * Not transactional — see `SmrtJunction.setLinks` for caveats.
24
+ */
25
+ setLinks(metaType: string, metaId: string, assetIds: string[], opts?: JunctionAttachOptions): Promise<void>;
26
+ }
27
+ //# sourceMappingURL=asset-associations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asset-associations.d.ts","sourceRoot":"","sources":["../src/asset-associations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EACL,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAC1B,YAAY,EAEb,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAMvD,qBACa,0BAA2B,SAAQ,YAAY,CAAC,gBAAgB,CAAC;IAC5E,MAAM,CAAC,QAAQ,CAAC,UAAU,0BAAoB;IAK9C,SAAS,CAAC,SAAS,SAAY;IAC/B,SAAS,CAAC,UAAU,SAAa;IAEjC;;;;OAIG;IAEG,MAAM,CACV,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,IAAI,GAAE,qBAA0B,GAC/B,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAQ9B;;OAEG;IAEG,MAAM,CACV,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,qBAA0B,GAC/B,OAAO,CAAC,gBAAgB,CAAC;IAU5B;;OAEG;IAEG,MAAM,CACV,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,qBAA0B,GAC/B,OAAO,CAAC,IAAI,CAAC;IAShB;;;OAGG;IAEG,QAAQ,CACZ,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAAE,EAClB,IAAI,GAAE,qBAA0B,GAC/B,OAAO,CAAC,IAAI,CAAC;CAuBjB"}
@@ -0,0 +1,137 @@
1
+ import { Asset } from './asset';
2
+ import { AssetAssociationCollection } from './asset-associations';
3
+ import { AssetStore, StoreOptions } from './asset-store';
4
+ import { AssetCollection } from './assets';
5
+ export type AssetVariantFit = 'cover' | 'contain' | 'inside';
6
+ export type AssetCapabilitySource = 'cached' | 'generated' | 'external';
7
+ export interface AssetCapabilityRuntime {
8
+ readonly collection: AssetCollection;
9
+ readonly associations: AssetAssociationCollection;
10
+ readonly store: AssetStore;
11
+ storeDerivedAsset(source: Asset, name: string, data: Buffer, opts: Omit<StoreOptions, 'sourceAssetId'> & {
12
+ role?: string;
13
+ derivativeMetaType?: string;
14
+ linkAssociation?: boolean;
15
+ }): Promise<Asset>;
16
+ }
17
+ export interface AssetVariantRequest {
18
+ variant: string;
19
+ width?: number;
20
+ height?: number;
21
+ fit?: AssetVariantFit;
22
+ mimeType?: string;
23
+ metadata?: Record<string, unknown>;
24
+ }
25
+ export interface AssetVariantResult {
26
+ asset: Asset;
27
+ variant: string;
28
+ source: AssetCapabilitySource;
29
+ url?: string | null;
30
+ metadata?: Record<string, unknown> | null;
31
+ }
32
+ export interface AssetProcessInput {
33
+ runtime: AssetCapabilityRuntime;
34
+ asset: Asset;
35
+ variants?: AssetVariantRequest[];
36
+ metadata?: Record<string, unknown>;
37
+ }
38
+ export interface AssetProcessResult {
39
+ asset: Asset;
40
+ metadata?: Record<string, unknown> | null;
41
+ variants?: AssetVariantResult[];
42
+ warnings?: string[];
43
+ }
44
+ export interface AssetEnsureVariantInput {
45
+ runtime: AssetCapabilityRuntime;
46
+ asset: Asset;
47
+ request: AssetVariantRequest;
48
+ }
49
+ export interface AssetNearbySearchInput {
50
+ runtime: AssetCapabilityRuntime;
51
+ tenantId?: string | null;
52
+ latitude: number;
53
+ longitude: number;
54
+ radiusMeters?: number;
55
+ limit?: number;
56
+ source?: string;
57
+ metadata?: Record<string, unknown>;
58
+ }
59
+ export interface AssetSearchItem {
60
+ asset?: Asset | null;
61
+ assetId: string;
62
+ origin: string;
63
+ title?: string | null;
64
+ previewUrl?: string | null;
65
+ deliveryUrl?: string | null;
66
+ mimeType?: string | null;
67
+ width?: number | null;
68
+ height?: number | null;
69
+ distanceMeters?: number | null;
70
+ metadata?: Record<string, unknown> | null;
71
+ }
72
+ export interface AssetSearchResult {
73
+ items: AssetSearchItem[];
74
+ nextCursor?: string | null;
75
+ }
76
+ export interface AssetExternalSyncInput {
77
+ runtime: AssetCapabilityRuntime;
78
+ asset: Asset;
79
+ externalId?: string | null;
80
+ sourceRef?: AssetExternalSourceRef | null;
81
+ metadata?: Record<string, unknown>;
82
+ }
83
+ export interface AssetExternalSourceRef {
84
+ system: string;
85
+ id: string;
86
+ kind?: string | null;
87
+ }
88
+ export interface AssetExternalSyncResult {
89
+ asset: Asset;
90
+ provider: string;
91
+ status: 'ready' | 'pending' | 'skipped';
92
+ externalAssetId?: string | null;
93
+ externalId?: string | null;
94
+ metadata?: Record<string, unknown> | null;
95
+ }
96
+ export interface AssetWorkflowInputSelection {
97
+ slotKey: string;
98
+ assetIds: string[];
99
+ }
100
+ export interface AssetWorkflowInput {
101
+ runtime: AssetCapabilityRuntime;
102
+ asset: Asset;
103
+ workflowSlug: string;
104
+ clientRequestId?: string | null;
105
+ name?: string;
106
+ inputSelections?: AssetWorkflowInputSelection[];
107
+ sourceAssetIds?: string[];
108
+ parameters?: Record<string, unknown>;
109
+ requestContext?: Record<string, unknown>;
110
+ requestedPlacement?: string | null;
111
+ priority?: number | null;
112
+ }
113
+ export interface AssetWorkflowResult {
114
+ provider: string;
115
+ jobId: string;
116
+ status: string;
117
+ idempotent?: boolean;
118
+ metadata?: Record<string, unknown> | null;
119
+ }
120
+ export interface AssetCapabilityProvider {
121
+ readonly name: string;
122
+ processAsset?(input: AssetProcessInput): Promise<AssetProcessResult>;
123
+ ensureVariant?(input: AssetEnsureVariantInput): Promise<AssetVariantResult>;
124
+ searchNearbyAssets?(input: AssetNearbySearchInput): Promise<AssetSearchResult>;
125
+ syncExternalAsset?(input: AssetExternalSyncInput): Promise<AssetExternalSyncResult>;
126
+ submitAssetWorkflow?(input: AssetWorkflowInput): Promise<AssetWorkflowResult>;
127
+ }
128
+ export type AssetCapabilityName = 'processAsset' | 'ensureVariant' | 'searchNearbyAssets' | 'syncExternalAsset' | 'submitAssetWorkflow';
129
+ export declare class AssetCapabilityUnavailableError extends Error {
130
+ readonly capability: AssetCapabilityName;
131
+ constructor(capability: AssetCapabilityName, message?: string);
132
+ }
133
+ export declare class AssetCapabilitySkippedError extends Error {
134
+ readonly capability: AssetCapabilityName;
135
+ constructor(capability: AssetCapabilityName, message: string);
136
+ }
137
+ //# sourceMappingURL=asset-capabilities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asset-capabilities.d.ts","sourceRoot":"","sources":["../src/asset-capabilities.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Asset conventions
3
+ *
4
+ * Shared constants and metadata-key conventions for how apps and agents
5
+ * describe asset relationships and derivation state on top of `smrt-assets`.
6
+ *
7
+ * These are advisory: `AssetAssociation.role` and `Asset` metadata fields
8
+ * accept any string, but standardising on these values makes cross-agent
9
+ * serving, filtering, and UI work possible without everybody inventing
10
+ * their own vocabulary.
11
+ */
12
+ /**
13
+ * Canonical association roles used with `AssetAssociation` and noun join
14
+ * tables like `content_assets`.
15
+ *
16
+ * - `source_document`: original upstream document (e.g. agenda PDF) that
17
+ * later derivatives are extracted from.
18
+ * - `document_image`: page image or other visual derived from a source
19
+ * document.
20
+ * - `thumbnail`: small preview rendition of another asset.
21
+ * - `asset_variant`: deterministic sized rendition of another asset.
22
+ * - `proof`: non-canonical evidence asset (e.g. a screenshot used to
23
+ * back a fact).
24
+ * - `derivation_source`: source side of a derivation link (used when a
25
+ * derivative points back to the asset it was produced from).
26
+ * - `attachment`: generic "this asset belongs to that object" link —
27
+ * the default for noun join tables.
28
+ * - `hero`: primary/featured asset for an owner.
29
+ */
30
+ export declare const ASSET_ROLES: {
31
+ readonly SOURCE_DOCUMENT: "source_document";
32
+ readonly DOCUMENT_IMAGE: "document_image";
33
+ readonly THUMBNAIL: "thumbnail";
34
+ readonly ASSET_VARIANT: "asset_variant";
35
+ readonly PROOF: "proof";
36
+ readonly DERIVATION_SOURCE: "derivation_source";
37
+ readonly ATTACHMENT: "attachment";
38
+ readonly HERO: "hero";
39
+ };
40
+ export type AssetRole = (typeof ASSET_ROLES)[keyof typeof ASSET_ROLES];
41
+ /**
42
+ * Canonical metadata keys used on `Asset.description`-adjacent metadata
43
+ * surfaces or stored via `AssetAssociation` sidecars. These keys are the
44
+ * recommended names for cross-package extraction, provenance, and
45
+ * content-addressing state.
46
+ *
47
+ * Apps are free to add their own keys; using these for the common cases
48
+ * keeps derived-asset tooling portable.
49
+ *
50
+ * - `extractionStatus`: `'pending' | 'running' | 'succeeded' | 'failed'`
51
+ * - `extractionError`: error string from the last extraction attempt
52
+ * - `extractedAt`: ISO timestamp of the last successful extraction
53
+ * - `sourceUrl`: upstream URL the asset was fetched from
54
+ * - `sourceHash`: content-address hash of the source bytes (e.g. sha256)
55
+ * - `pageNumber`: 1-based page number within a multi-page source document
56
+ */
57
+ export declare const ASSET_METADATA_KEYS: {
58
+ readonly EXTRACTION_STATUS: "extractionStatus";
59
+ readonly EXTRACTION_ERROR: "extractionError";
60
+ readonly EXTRACTED_AT: "extractedAt";
61
+ readonly SOURCE_URL: "sourceUrl";
62
+ readonly SOURCE_HASH: "sourceHash";
63
+ readonly PAGE_NUMBER: "pageNumber";
64
+ };
65
+ export type AssetMetadataKey = (typeof ASSET_METADATA_KEYS)[keyof typeof ASSET_METADATA_KEYS];
66
+ /**
67
+ * Known extraction status values for `ASSET_METADATA_KEYS.EXTRACTION_STATUS`.
68
+ */
69
+ export declare const ASSET_EXTRACTION_STATUS: {
70
+ readonly PENDING: "pending";
71
+ readonly RUNNING: "running";
72
+ readonly SUCCEEDED: "succeeded";
73
+ readonly FAILED: "failed";
74
+ };
75
+ export type AssetExtractionStatus = (typeof ASSET_EXTRACTION_STATUS)[keyof typeof ASSET_EXTRACTION_STATUS];
76
+ //# sourceMappingURL=asset-conventions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asset-conventions.d.ts","sourceRoot":"","sources":["../src/asset-conventions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,WAAW;;;;;;;;;CASd,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,OAAO,WAAW,CAAC,CAAC;AAEvE;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,mBAAmB;;;;;;;CAOtB,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAC1B,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,OAAO,mBAAmB,CAAC,CAAC;AAEjE;;GAEG;AACH,eAAO,MAAM,uBAAuB;;;;;CAK1B,CAAC;AAEX,MAAM,MAAM,qBAAqB,GAC/B,CAAC,OAAO,uBAAuB,CAAC,CAAC,MAAM,OAAO,uBAAuB,CAAC,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { SmrtObject } from '@happyvertical/smrt-core';
2
+ import { AssetMetafieldOptions } from './types';
3
+ export declare class AssetMetafield extends SmrtObject {
4
+ name: string;
5
+ validation: string;
6
+ constructor(options?: AssetMetafieldOptions);
7
+ /**
8
+ * Get validation rules as parsed object
9
+ *
10
+ * @returns Parsed validation object or empty object if no validation
11
+ */
12
+ getValidation(): Record<string, unknown>;
13
+ /**
14
+ * Set validation rules from object
15
+ *
16
+ * @param rules - Validation rules object
17
+ */
18
+ setValidation(rules: Record<string, unknown>): void;
19
+ /**
20
+ * Get asset metafield by slug
21
+ *
22
+ * @param slug - The slug to search for
23
+ * @returns AssetMetafield instance or null
24
+ */
25
+ static getBySlug(_slug: string): Promise<AssetMetafield | null>;
26
+ }
27
+ //# sourceMappingURL=asset-metafield.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asset-metafield.d.ts","sourceRoot":"","sources":["../src/asset-metafield.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAQ,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAErD,qBAMa,cAAe,SAAQ,UAAU;IAE5C,IAAI,SAAM;IACV,UAAU,SAAM;gBAEJ,OAAO,GAAE,qBAA0B;IAO/C;;;;OAIG;IACH,aAAa,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IASxC;;;;OAIG;IACH,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAInD;;;;;OAKG;WACU,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;CAItE"}
@@ -0,0 +1,27 @@
1
+ import { SmrtCollection } from '@happyvertical/smrt-core';
2
+ import { AssetMetafield } from './asset-metafield';
3
+ export declare class AssetMetafieldCollection extends SmrtCollection<AssetMetafield> {
4
+ static readonly _itemClass: typeof AssetMetafield;
5
+ /**
6
+ * Get or create an asset metafield by slug
7
+ *
8
+ * @param slug - The metafield slug
9
+ * @param name - The display name (defaults to slug)
10
+ * @param validation - Optional validation rules (JSON string or object)
11
+ * @returns The existing or newly created AssetMetafield
12
+ */
13
+ getOrCreate(slug: string, name?: string, validation?: string | Record<string, unknown>): Promise<AssetMetafield>;
14
+ /**
15
+ * Initialize common asset metafields
16
+ *
17
+ * Creates standard metafields with validation rules:
18
+ * - width (integer, min: 0)
19
+ * - height (integer, min: 0)
20
+ * - duration (number, min: 0)
21
+ * - size (integer, min: 0)
22
+ * - author (string)
23
+ * - copyright (string)
24
+ */
25
+ initializeCommonMetafields(): Promise<void>;
26
+ }
27
+ //# sourceMappingURL=asset-metafields.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asset-metafields.d.ts","sourceRoot":"","sources":["../src/asset-metafields.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,qBAAa,wBAAyB,SAAQ,cAAc,CAAC,cAAc,CAAC;IAC1E,MAAM,CAAC,QAAQ,CAAC,UAAU,wBAAkB;IAE5C;;;;;;;OAOG;IACG,WAAW,CACf,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,MAAM,EACb,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5C,OAAO,CAAC,cAAc,CAAC;IAoB1B;;;;;;;;;;OAUG;IACG,0BAA0B,IAAI,OAAO,CAAC,IAAI,CAAC;CA8BlD"}