@vibesdotdev/media 0.0.0-stage → 1.0.0-rc.4
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/LICENSE +18 -0
- package/README.md +95 -2
- package/dist/analyzers/frame-guard.d.ts +6 -0
- package/dist/analyzers/frame-guard.d.ts.map +1 -0
- package/dist/analyzers/frame-guard.js +10 -0
- package/dist/analyzers/frame-guard.js.map +1 -0
- package/dist/analyzers/motion-math.d.ts +66 -0
- package/dist/analyzers/motion-math.d.ts.map +1 -0
- package/dist/analyzers/motion-math.js +356 -0
- package/dist/analyzers/motion-math.js.map +1 -0
- package/dist/analyzers/reference-motion-analyzer.impl.d.ts +23 -0
- package/dist/analyzers/reference-motion-analyzer.impl.d.ts.map +1 -0
- package/dist/analyzers/reference-motion-analyzer.impl.js +69 -0
- package/dist/analyzers/reference-motion-analyzer.impl.js.map +1 -0
- package/dist/analyzers/reference-motion.descriptor.d.ts +11 -0
- package/dist/analyzers/reference-motion.descriptor.d.ts.map +1 -0
- package/dist/analyzers/reference-motion.descriptor.js +21 -0
- package/dist/analyzers/reference-motion.descriptor.js.map +1 -0
- package/dist/capture-client.d.ts +34 -0
- package/dist/capture-client.d.ts.map +1 -0
- package/dist/capture-client.js +163 -0
- package/dist/capture-client.js.map +1 -0
- package/dist/config/media.uploads.config.descriptor.d.ts +27 -0
- package/dist/config/media.uploads.config.descriptor.d.ts.map +1 -0
- package/dist/config/media.uploads.config.descriptor.js +46 -0
- package/dist/config/media.uploads.config.descriptor.js.map +1 -0
- package/dist/config/uploads.d.ts +11 -0
- package/dist/config/uploads.d.ts.map +1 -0
- package/dist/config/uploads.js +25 -0
- package/dist/config/uploads.js.map +1 -0
- package/dist/docs/artifact-references.docs.descriptor.d.ts +4 -0
- package/dist/docs/artifact-references.docs.descriptor.d.ts.map +1 -0
- package/dist/docs/artifact-references.docs.descriptor.js +69 -0
- package/dist/docs/artifact-references.docs.descriptor.js.map +1 -0
- package/dist/docs/image-transform.docs.descriptor.d.ts +4 -0
- package/dist/docs/image-transform.docs.descriptor.d.ts.map +1 -0
- package/dist/docs/image-transform.docs.descriptor.js +52 -0
- package/dist/docs/image-transform.docs.descriptor.js.map +1 -0
- package/dist/index.d.ts +48 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +49 -0
- package/dist/index.js.map +1 -0
- package/dist/interfaces/capture-provider.d.ts +33 -0
- package/dist/interfaces/capture-provider.d.ts.map +1 -0
- package/dist/interfaces/capture-provider.js +10 -0
- package/dist/interfaces/capture-provider.js.map +1 -0
- package/dist/interfaces/image-transformer.d.ts +7 -0
- package/dist/interfaces/image-transformer.d.ts.map +1 -0
- package/dist/interfaces/image-transformer.js +2 -0
- package/dist/interfaces/image-transformer.js.map +1 -0
- package/dist/interfaces/index.d.ts +7 -0
- package/dist/interfaces/index.d.ts.map +1 -0
- package/dist/interfaces/index.js +5 -0
- package/dist/interfaces/index.js.map +1 -0
- package/dist/interfaces/motion-analyzer.d.ts +55 -0
- package/dist/interfaces/motion-analyzer.d.ts.map +1 -0
- package/dist/interfaces/motion-analyzer.js +14 -0
- package/dist/interfaces/motion-analyzer.js.map +1 -0
- package/dist/kinds/capture.d.ts +58 -0
- package/dist/kinds/capture.d.ts.map +1 -0
- package/dist/kinds/capture.js +34 -0
- package/dist/kinds/capture.js.map +1 -0
- package/dist/kinds/image-transform.d.ts +91 -0
- package/dist/kinds/image-transform.d.ts.map +1 -0
- package/dist/kinds/image-transform.js +12 -0
- package/dist/kinds/image-transform.js.map +1 -0
- package/dist/kinds/index.d.ts +10 -0
- package/dist/kinds/index.d.ts.map +1 -0
- package/dist/kinds/index.js +7 -0
- package/dist/kinds/index.js.map +1 -0
- package/dist/kinds/motion.d.ts +57 -0
- package/dist/kinds/motion.d.ts.map +1 -0
- package/dist/kinds/motion.js +34 -0
- package/dist/kinds/motion.js.map +1 -0
- package/dist/media.plugin.d.ts +23 -0
- package/dist/media.plugin.d.ts.map +1 -0
- package/dist/media.plugin.js +48 -0
- package/dist/media.plugin.js.map +1 -0
- package/dist/schemas/artifact-reference.d.ts +59 -0
- package/dist/schemas/artifact-reference.d.ts.map +1 -0
- package/dist/schemas/artifact-reference.js +77 -0
- package/dist/schemas/artifact-reference.js.map +1 -0
- package/dist/schemas/capture-descriptor.d.ts +71 -0
- package/dist/schemas/capture-descriptor.d.ts.map +1 -0
- package/dist/schemas/capture-descriptor.js +74 -0
- package/dist/schemas/capture-descriptor.js.map +1 -0
- package/dist/schemas/capture-options.d.ts +51 -0
- package/dist/schemas/capture-options.d.ts.map +1 -0
- package/dist/schemas/capture-options.js +68 -0
- package/dist/schemas/capture-options.js.map +1 -0
- package/dist/schemas/capture-parse.d.ts +10 -0
- package/dist/schemas/capture-parse.d.ts.map +1 -0
- package/dist/schemas/capture-parse.js +30 -0
- package/dist/schemas/capture-parse.js.map +1 -0
- package/dist/schemas/capture-state.d.ts +77 -0
- package/dist/schemas/capture-state.d.ts.map +1 -0
- package/dist/schemas/capture-state.js +25 -0
- package/dist/schemas/capture-state.js.map +1 -0
- package/dist/schemas/image-transform.d.ts +269 -0
- package/dist/schemas/image-transform.d.ts.map +1 -0
- package/dist/schemas/image-transform.js +161 -0
- package/dist/schemas/image-transform.js.map +1 -0
- package/dist/schemas/index.d.ts +20 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +17 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/schemas/motion-analysis.d.ts +187 -0
- package/dist/schemas/motion-analysis.d.ts.map +1 -0
- package/dist/schemas/motion-analysis.js +213 -0
- package/dist/schemas/motion-analysis.js.map +1 -0
- package/dist/schemas/motion-descriptor.d.ts +53 -0
- package/dist/schemas/motion-descriptor.d.ts.map +1 -0
- package/dist/schemas/motion-descriptor.js +47 -0
- package/dist/schemas/motion-descriptor.js.map +1 -0
- package/dist/schemas/motion-frame.d.ts +63 -0
- package/dist/schemas/motion-frame.d.ts.map +1 -0
- package/dist/schemas/motion-frame.js +86 -0
- package/dist/schemas/motion-frame.js.map +1 -0
- package/dist/schemas/opaque-id.d.ts +10 -0
- package/dist/schemas/opaque-id.d.ts.map +1 -0
- package/dist/schemas/opaque-id.js +24 -0
- package/dist/schemas/opaque-id.js.map +1 -0
- package/dist/schemas/sharing-state.d.ts +43 -0
- package/dist/schemas/sharing-state.d.ts.map +1 -0
- package/dist/schemas/sharing-state.js +11 -0
- package/dist/schemas/sharing-state.js.map +1 -0
- package/dist/svelte/CaptureLoader.svelte +29 -0
- package/dist/svelte/CaptureLoader.svelte.d.ts +11 -0
- package/dist/svelte/CaptureLoader.svelte.d.ts.map +1 -0
- package/dist/svelte/CapturePanel.svelte +189 -0
- package/dist/svelte/CapturePanel.svelte.d.ts +12 -0
- package/dist/svelte/CapturePanel.svelte.d.ts.map +1 -0
- package/dist/svelte/MediaUploader.svelte +109 -0
- package/dist/svelte/MediaUploader.svelte.d.ts +5 -0
- package/dist/svelte/MediaUploader.svelte.d.ts.map +1 -0
- package/dist/svelte/capture-parse.d.ts +2 -0
- package/dist/svelte/capture-parse.d.ts.map +1 -0
- package/dist/svelte/capture-parse.js +1 -0
- package/dist/svelte/failure-message.d.ts +2 -0
- package/dist/svelte/failure-message.d.ts.map +1 -0
- package/dist/svelte/failure-message.js +1 -0
- package/dist/svelte/index.d.ts +8 -0
- package/dist/svelte/index.d.ts.map +1 -0
- package/dist/svelte/index.js +6 -0
- package/dist/svelte/runtime-log.d.ts +14 -0
- package/dist/svelte/runtime-log.d.ts.map +1 -0
- package/dist/svelte/runtime-log.js +19 -0
- package/dist/svelte/runtime.d.ts +9 -0
- package/dist/svelte/runtime.d.ts.map +1 -0
- package/dist/svelte/runtime.js +27 -0
- package/dist/svelte/sharing/README.md +38 -0
- package/dist/svelte/sharing/components/ShareButton.svelte +57 -0
- package/dist/svelte/sharing/components/ShareButton.svelte.d.ts +11 -0
- package/dist/svelte/sharing/components/ShareButton.svelte.d.ts.map +1 -0
- package/dist/svelte/sharing/components/ShareDialog.svelte +222 -0
- package/dist/svelte/sharing/components/ShareDialog.svelte.d.ts +8 -0
- package/dist/svelte/sharing/components/ShareDialog.svelte.d.ts.map +1 -0
- package/dist/svelte/sharing/components/ShareLoader.svelte +19 -0
- package/dist/svelte/sharing/components/ShareLoader.svelte.d.ts +7 -0
- package/dist/svelte/sharing/components/ShareLoader.svelte.d.ts.map +1 -0
- package/dist/svelte/sharing/index.d.ts +20 -0
- package/dist/svelte/sharing/index.d.ts.map +1 -0
- package/dist/svelte/sharing/index.js +19 -0
- package/dist/svelte/sharing/runtime.d.ts +44 -0
- package/dist/svelte/sharing/runtime.d.ts.map +1 -0
- package/dist/svelte/sharing/runtime.js +81 -0
- package/dist/svelte/sharing/state.svelte.d.ts +28 -0
- package/dist/svelte/sharing/state.svelte.d.ts.map +1 -0
- package/dist/svelte/sharing/state.svelte.js +101 -0
- package/dist/svelte/sharing/styles.css +8 -0
- package/dist/svelte/state.svelte.d.ts +38 -0
- package/dist/svelte/state.svelte.d.ts.map +1 -0
- package/dist/svelte/state.svelte.js +102 -0
- package/dist/svelte/styles.css +2 -0
- package/dist/svelte/uploader.d.ts +17 -0
- package/dist/svelte/uploader.d.ts.map +1 -0
- package/dist/svelte/uploader.js +9 -0
- package/dist/uploads/adapters/local/index.d.ts +9 -0
- package/dist/uploads/adapters/local/index.d.ts.map +1 -0
- package/dist/uploads/adapters/local/index.js +12 -0
- package/dist/uploads/adapters/local/index.js.map +1 -0
- package/dist/uploads/adapters/local/local-storage.descriptor.d.ts +24 -0
- package/dist/uploads/adapters/local/local-storage.descriptor.d.ts.map +1 -0
- package/dist/uploads/adapters/local/local-storage.descriptor.js +20 -0
- package/dist/uploads/adapters/local/local-storage.descriptor.js.map +1 -0
- package/dist/uploads/adapters/local/local-storage.impl.d.ts +123 -0
- package/dist/uploads/adapters/local/local-storage.impl.d.ts.map +1 -0
- package/dist/uploads/adapters/local/local-storage.impl.js +231 -0
- package/dist/uploads/adapters/local/local-storage.impl.js.map +1 -0
- package/dist/uploads/adapters/local/uploads-adapter-local.plugin.d.ts +9 -0
- package/dist/uploads/adapters/local/uploads-adapter-local.plugin.d.ts.map +1 -0
- package/dist/uploads/adapters/local/uploads-adapter-local.plugin.js +41 -0
- package/dist/uploads/adapters/local/uploads-adapter-local.plugin.js.map +1 -0
- package/dist/uploads/client/helper.d.ts +26 -0
- package/dist/uploads/client/helper.d.ts.map +1 -0
- package/dist/uploads/client/helper.js +27 -0
- package/dist/uploads/client/helper.js.map +1 -0
- package/dist/uploads/client/index.d.ts +11 -0
- package/dist/uploads/client/index.d.ts.map +1 -0
- package/dist/uploads/client/index.js +9 -0
- package/dist/uploads/client/index.js.map +1 -0
- package/dist/uploads/client/sharing-client.d.ts +45 -0
- package/dist/uploads/client/sharing-client.d.ts.map +1 -0
- package/dist/uploads/client/sharing-client.js +153 -0
- package/dist/uploads/client/sharing-client.js.map +1 -0
- package/dist/uploads/client/uploads-client.d.ts +200 -0
- package/dist/uploads/client/uploads-client.d.ts.map +1 -0
- package/dist/uploads/client/uploads-client.js +487 -0
- package/dist/uploads/client/uploads-client.js.map +1 -0
- package/dist/uploads/docs/uploads.docs.descriptor.d.ts +4 -0
- package/dist/uploads/docs/uploads.docs.descriptor.d.ts.map +1 -0
- package/dist/uploads/docs/uploads.docs.descriptor.js +65 -0
- package/dist/uploads/docs/uploads.docs.descriptor.js.map +1 -0
- package/dist/uploads/docs/uploads.share-links.docs.descriptor.d.ts +22 -0
- package/dist/uploads/docs/uploads.share-links.docs.descriptor.d.ts.map +1 -0
- package/dist/uploads/docs/uploads.share-links.docs.descriptor.js +86 -0
- package/dist/uploads/docs/uploads.share-links.docs.descriptor.js.map +1 -0
- package/dist/uploads/index.d.ts +12 -0
- package/dist/uploads/index.d.ts.map +1 -0
- package/dist/uploads/index.js +13 -0
- package/dist/uploads/index.js.map +1 -0
- package/dist/uploads/schemas/common.d.ts +135 -0
- package/dist/uploads/schemas/common.d.ts.map +1 -0
- package/dist/uploads/schemas/common.js +152 -0
- package/dist/uploads/schemas/common.js.map +1 -0
- package/dist/uploads/schemas/forms.d.ts +59 -0
- package/dist/uploads/schemas/forms.d.ts.map +1 -0
- package/dist/uploads/schemas/forms.js +41 -0
- package/dist/uploads/schemas/forms.js.map +1 -0
- package/dist/uploads/schemas/index.d.ts +18 -0
- package/dist/uploads/schemas/index.d.ts.map +1 -0
- package/dist/uploads/schemas/index.js +13 -0
- package/dist/uploads/schemas/index.js.map +1 -0
- package/dist/uploads/schemas/records.d.ts +81 -0
- package/dist/uploads/schemas/records.d.ts.map +1 -0
- package/dist/uploads/schemas/records.js +82 -0
- package/dist/uploads/schemas/records.js.map +1 -0
- package/dist/uploads/schemas/requests.d.ts +32 -0
- package/dist/uploads/schemas/requests.d.ts.map +1 -0
- package/dist/uploads/schemas/requests.js +30 -0
- package/dist/uploads/schemas/requests.js.map +1 -0
- package/dist/uploads/schemas/shares.d.ts +67 -0
- package/dist/uploads/schemas/shares.d.ts.map +1 -0
- package/dist/uploads/schemas/shares.js +39 -0
- package/dist/uploads/schemas/shares.js.map +1 -0
- package/dist/uploads/server/backend.d.ts +8 -0
- package/dist/uploads/server/backend.d.ts.map +1 -0
- package/dist/uploads/server/backend.js +11 -0
- package/dist/uploads/server/backend.js.map +1 -0
- package/dist/uploads/server/config.d.ts +5 -0
- package/dist/uploads/server/config.d.ts.map +1 -0
- package/dist/uploads/server/config.js +38 -0
- package/dist/uploads/server/config.js.map +1 -0
- package/dist/uploads/server/service.d.ts +77 -0
- package/dist/uploads/server/service.d.ts.map +1 -0
- package/dist/uploads/server/service.js +152 -0
- package/dist/uploads/server/service.js.map +1 -0
- package/dist/uploads/server/storage-client.d.ts +11 -0
- package/dist/uploads/server/storage-client.d.ts.map +1 -0
- package/dist/uploads/server/storage-client.js +23 -0
- package/dist/uploads/server/storage-client.js.map +1 -0
- package/dist/uploads/server/storage.d.ts +40 -0
- package/dist/uploads/server/storage.d.ts.map +1 -0
- package/dist/uploads/server/storage.js +59 -0
- package/dist/uploads/server/storage.js.map +1 -0
- package/dist/uploads/uploads.plugin.d.ts +11 -0
- package/dist/uploads/uploads.plugin.d.ts.map +1 -0
- package/dist/uploads/uploads.plugin.js +89 -0
- package/dist/uploads/uploads.plugin.js.map +1 -0
- package/dist/utils/attempt.d.ts +27 -0
- package/dist/utils/attempt.d.ts.map +1 -0
- package/dist/utils/attempt.js +39 -0
- package/dist/utils/attempt.js.map +1 -0
- package/dist/utils/failure-message.d.ts +8 -0
- package/dist/utils/failure-message.d.ts.map +1 -0
- package/dist/utils/failure-message.js +28 -0
- package/dist/utils/failure-message.js.map +1 -0
- package/package.json +257 -4
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reference Motion Analyzer — `media/motion` implementation
|
|
3
|
+
*
|
|
4
|
+
* Pure-TS `MotionAnalyzer` built on the `motion-math` kernels. Universal: no
|
|
5
|
+
* FS, no native, no async I/O — runs identically on consumer machines and in
|
|
6
|
+
* Cloudflare workers, which is why it ships inside `@vibesdotdev/media` rather
|
|
7
|
+
* than a provider package. A heavier provider (WASM SIMD, native, GPU) can
|
|
8
|
+
* register its own `media/motion` descriptor and win resolution in its scope.
|
|
9
|
+
*
|
|
10
|
+
* The runtime instantiates the default-exported class for each resolving runtime.
|
|
11
|
+
*/
|
|
12
|
+
import { FrameSequenceSchema, parseMotionInput } from "../schemas/motion-frame.js";
|
|
13
|
+
import { FrameDiffOptionsSchema, TemporalStatsOptionsSchema, OpticalFlowOptionsSchema, MotionEnergyOptionsSchema, MotionSummaryOptionsSchema } from "../schemas/motion-analysis.js";
|
|
14
|
+
import * as math from "./motion-math.js";
|
|
15
|
+
export class ReferenceMotionAnalyzer {
|
|
16
|
+
async frameDiff(a, b, options = {}) {
|
|
17
|
+
const frames = parseMotionInput(FrameSequenceSchema, [a, b]);
|
|
18
|
+
return math.frameDiff(frames[0], frames[1], parseMotionInput(FrameDiffOptionsSchema, options, true));
|
|
19
|
+
}
|
|
20
|
+
async temporalStats(frames, options = {}) {
|
|
21
|
+
return math.temporalStats(parseMotionInput(FrameSequenceSchema, frames), parseMotionInput(TemporalStatsOptionsSchema, options, true));
|
|
22
|
+
}
|
|
23
|
+
async opticalFlow(a, b, options = {}) {
|
|
24
|
+
const frames = parseMotionInput(FrameSequenceSchema, [a, b]);
|
|
25
|
+
return math.opticalFlow(frames[0], frames[1], parseMotionInput(OpticalFlowOptionsSchema, options, true));
|
|
26
|
+
}
|
|
27
|
+
async motionEnergy(frames, options = {}) {
|
|
28
|
+
return math.motionEnergy(parseMotionInput(FrameSequenceSchema, frames), parseMotionInput(MotionEnergyOptionsSchema, options, true));
|
|
29
|
+
}
|
|
30
|
+
async summarize(frames, options = {}) {
|
|
31
|
+
frames = parseMotionInput(FrameSequenceSchema, frames);
|
|
32
|
+
options = parseMotionInput(MotionSummaryOptionsSchema, options, true);
|
|
33
|
+
const ds = options.downscale;
|
|
34
|
+
const coherenceThreshold = options.coherenceThreshold ?? 0.35;
|
|
35
|
+
const staticThreshold = options.staticThreshold ?? 0.01;
|
|
36
|
+
const diff = math.frameDiff(frames[0], frames[frames.length - 1], ds ? { downscale: ds } : {});
|
|
37
|
+
const temporal = math.temporalStats(frames, ds ? { downscale: ds } : {});
|
|
38
|
+
const motion = math.motionEnergy(frames, ds ? { downscale: ds } : {});
|
|
39
|
+
let verdict;
|
|
40
|
+
if (diff.magnitude < staticThreshold && temporal.meanStd < staticThreshold) {
|
|
41
|
+
verdict = 'static';
|
|
42
|
+
}
|
|
43
|
+
else if (motion.coherence >= coherenceThreshold) {
|
|
44
|
+
verdict = 'coherent-motion';
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
verdict = 'incoherent-change';
|
|
48
|
+
}
|
|
49
|
+
return {
|
|
50
|
+
frameCount: frames.length,
|
|
51
|
+
changed: {
|
|
52
|
+
magnitude: diff.magnitude,
|
|
53
|
+
changedFraction: diff.changedFraction,
|
|
54
|
+
bbox: diff.bbox
|
|
55
|
+
},
|
|
56
|
+
motion: {
|
|
57
|
+
coherence: motion.coherence,
|
|
58
|
+
dominant: motion.dominant
|
|
59
|
+
},
|
|
60
|
+
temporal: {
|
|
61
|
+
meanStd: temporal.meanStd,
|
|
62
|
+
peakStd: temporal.peakStd
|
|
63
|
+
},
|
|
64
|
+
verdict
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
export default ReferenceMotionAnalyzer;
|
|
69
|
+
//# sourceMappingURL=reference-motion-analyzer.impl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reference-motion-analyzer.impl.js","sourceRoot":"","sources":["../../src/analyzers/reference-motion-analyzer.impl.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAgBH,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AACnF,OAAO,EACN,sBAAsB,EAAE,0BAA0B,EAAE,wBAAwB,EAC5E,yBAAyB,EAAE,0BAA0B,EACrD,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,kBAAkB,CAAC;AAEzC,MAAM,OAAO,uBAAuB;IACnC,KAAK,CAAC,SAAS,CAAC,CAAQ,EAAE,CAAQ,EAAE,UAA4B,EAAE;QACjE,MAAM,MAAM,GAAG,gBAAgB,CAAC,mBAAmB,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7D,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,gBAAgB,CAAC,sBAAsB,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;IACtG,CAAC;IAED,KAAK,CAAC,aAAa,CAClB,MAAe,EACf,UAAgC,EAAE;QAElC,OAAO,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,mBAAmB,EAAE,MAAM,CAAC,EAAE,gBAAgB,CAAC,0BAA0B,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;IACvI,CAAC;IAED,KAAK,CAAC,WAAW,CAChB,CAAQ,EACR,CAAQ,EACR,UAA8B,EAAE;QAEhC,MAAM,MAAM,GAAG,gBAAgB,CAAC,mBAAmB,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7D,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,gBAAgB,CAAC,wBAAwB,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;IAC1G,CAAC;IAED,KAAK,CAAC,YAAY,CACjB,MAAe,EACf,UAA+B,EAAE;QAEjC,OAAO,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,mBAAmB,EAAE,MAAM,CAAC,EAAE,gBAAgB,CAAC,yBAAyB,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;IACrI,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,MAAe,EAAE,UAAgC,EAAE;QAClE,MAAM,GAAG,gBAAgB,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC;QACvD,OAAO,GAAG,gBAAgB,CAAC,0BAA0B,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QACtE,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC;QAC7B,MAAM,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,IAAI,IAAI,CAAC;QAC9D,MAAM,eAAe,GAAG,OAAO,CAAC,eAAe,IAAI,IAAI,CAAC;QAExD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC/F,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACzE,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAEtE,IAAI,OAAiC,CAAC;QACtC,IAAI,IAAI,CAAC,SAAS,GAAG,eAAe,IAAI,QAAQ,CAAC,OAAO,GAAG,eAAe,EAAE,CAAC;YAC5E,OAAO,GAAG,QAAQ,CAAC;QACpB,CAAC;aAAM,IAAI,MAAM,CAAC,SAAS,IAAI,kBAAkB,EAAE,CAAC;YACnD,OAAO,GAAG,iBAAiB,CAAC;QAC7B,CAAC;aAAM,CAAC;YACP,OAAO,GAAG,mBAAmB,CAAC;QAC/B,CAAC;QAED,OAAO;YACN,UAAU,EAAE,MAAM,CAAC,MAAM;YACzB,OAAO,EAAE;gBACR,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,eAAe,EAAE,IAAI,CAAC,eAAe;gBACrC,IAAI,EAAE,IAAI,CAAC,IAAI;aACf;YACD,MAAM,EAAE;gBACP,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,QAAQ,EAAE,MAAM,CAAC,QAAQ;aACzB;YACD,QAAQ,EAAE;gBACT,OAAO,EAAE,QAAQ,CAAC,OAAO;gBACzB,OAAO,EAAE,QAAQ,CAAC,OAAO;aACzB;YACD,OAAO;SACP,CAAC;IACH,CAAC;CACD;AAED,eAAe,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* media.motion.reference — `media/motion` Descriptor
|
|
3
|
+
*
|
|
4
|
+
* Declares the built-in pure-TS motion analyzer. Universal by scope
|
|
5
|
+
* (`consumer` + `cloud`) because the implementation is pure computation, so a
|
|
6
|
+
* bare `runtime.query('media/motion').resolve()` finds it in any surface.
|
|
7
|
+
*/
|
|
8
|
+
import type { MotionAnalyzerDescriptor } from '../schemas/motion-descriptor.ts';
|
|
9
|
+
declare const descriptor: MotionAnalyzerDescriptor;
|
|
10
|
+
export default descriptor;
|
|
11
|
+
//# sourceMappingURL=reference-motion.descriptor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reference-motion.descriptor.d.ts","sourceRoot":"","sources":["../../src/analyzers/reference-motion.descriptor.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAGhF,QAAA,MAAM,UAAU,EAAE,wBAUhB,CAAC;AAEH,eAAe,UAAU,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* media.motion.reference — `media/motion` Descriptor
|
|
3
|
+
*
|
|
4
|
+
* Declares the built-in pure-TS motion analyzer. Universal by scope
|
|
5
|
+
* (`consumer` + `cloud`) because the implementation is pure computation, so a
|
|
6
|
+
* bare `runtime.query('media/motion').resolve()` finds it in any surface.
|
|
7
|
+
*/
|
|
8
|
+
import { createRuntimeAsset } from '@vibesdotdev/kernel/factory';
|
|
9
|
+
import { MEDIA_MOTION_REFERENCE_ID } from "../kinds/motion.js";
|
|
10
|
+
const descriptor = createRuntimeAsset({
|
|
11
|
+
kind: 'media/motion',
|
|
12
|
+
id: MEDIA_MOTION_REFERENCE_ID,
|
|
13
|
+
name: 'Reference Motion Analyzer',
|
|
14
|
+
description: 'Pure-TS temporal-perception analyzer: frame diff, temporal stats, block optical flow, and Reichardt/lag-1 opponent motion energy over decoded frame sequences.',
|
|
15
|
+
capabilities: ['frame-diff', 'temporal-stats', 'optical-flow', 'motion-energy', 'summarize'],
|
|
16
|
+
hardware: ['consumer', 'cloud'],
|
|
17
|
+
enabled: true,
|
|
18
|
+
tags: ['media', 'motion', 'vision', 'perception', 'temporal', 'optical-flow']
|
|
19
|
+
});
|
|
20
|
+
export default descriptor;
|
|
21
|
+
//# sourceMappingURL=reference-motion.descriptor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reference-motion.descriptor.js","sourceRoot":"","sources":["../../src/analyzers/reference-motion.descriptor.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEjE,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAE/D,MAAM,UAAU,GAA6B,kBAAkB,CAA2B;IACzF,IAAI,EAAE,cAAc;IACpB,EAAE,EAAE,yBAAyB;IAC7B,IAAI,EAAE,2BAA2B;IACjC,WAAW,EACV,gKAAgK;IACjK,YAAY,EAAE,CAAC,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAAE,eAAe,EAAE,WAAW,CAAC;IAC5F,QAAQ,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC;IAC/B,OAAO,EAAE,IAAI;IACb,IAAI,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,cAAc,CAAC;CAC7E,CAAC,CAAC;AAEH,eAAe,UAAU,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { type VibesRuntime } from '@vibesdotdev/kernel';
|
|
2
|
+
import { BaseRuntimeClient } from '@vibesdotdev/kernel/client';
|
|
3
|
+
import { type CaptureSessionState } from './schemas/capture-state.ts';
|
|
4
|
+
/** A runtime owns sessions; each UI tree opens its own selection and history. */
|
|
5
|
+
export declare class MediaCaptureClient extends BaseRuntimeClient<VibesRuntime> {
|
|
6
|
+
private readonly sessions;
|
|
7
|
+
private readonly closeSessions;
|
|
8
|
+
openSession(): CaptureSession;
|
|
9
|
+
protected onDispose(): void;
|
|
10
|
+
}
|
|
11
|
+
/** Byte-only capture state. Browser URLs belong to the Svelte projection. */
|
|
12
|
+
export declare class CaptureSession {
|
|
13
|
+
private readonly runtime;
|
|
14
|
+
private readonly release;
|
|
15
|
+
private state;
|
|
16
|
+
private readonly listeners;
|
|
17
|
+
private provider;
|
|
18
|
+
private closed;
|
|
19
|
+
private selection;
|
|
20
|
+
constructor(runtime: VibesRuntime, release: () => void);
|
|
21
|
+
get snapshot(): CaptureSessionState;
|
|
22
|
+
subscribe(listener: (state: CaptureSessionState) => void): () => void;
|
|
23
|
+
private update;
|
|
24
|
+
private fail;
|
|
25
|
+
init(providerId?: string): Promise<void>;
|
|
26
|
+
selectProvider(id: string): Promise<void>;
|
|
27
|
+
loadSources(): Promise<void>;
|
|
28
|
+
selectSource(id: string | number): void;
|
|
29
|
+
capture(): Promise<void>;
|
|
30
|
+
selectCapture(id: string): void;
|
|
31
|
+
dispose(): void;
|
|
32
|
+
}
|
|
33
|
+
export default MediaCaptureClient;
|
|
34
|
+
//# sourceMappingURL=capture-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capture-client.d.ts","sourceRoot":"","sources":["../src/capture-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,YAAY,EAAsB,MAAM,qBAAqB,CAAC;AAC7F,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAI/D,OAAO,EAAuD,KAAK,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAK3H,iFAAiF;AACjF,qBAAa,kBAAmB,SAAQ,iBAAiB,CAAC,YAAY,CAAC;IACtE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6B;IACtD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA0B;IAExD,WAAW,IAAI,cAAc;cAUV,SAAS,IAAI,IAAI;CAKpC;AAED,6EAA6E;AAC7E,qBAAa,cAAc;IAOd,OAAO,CAAC,QAAQ,CAAC,OAAO;IAAgB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAN5E,OAAO,CAAC,KAAK,CAAuC;IACpD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAmD;IAC7E,OAAO,CAAC,QAAQ,CAAgC;IAChD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAK;gBAEO,OAAO,EAAE,YAAY,EAAmB,OAAO,EAAE,MAAM,IAAI;IAExF,IAAI,QAAQ,IAAI,mBAAmB,CAAuB;IAE1D,SAAS,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,GAAG,MAAM,IAAI;IAMrE,OAAO,CAAC,MAAM;IAMd,OAAO,CAAC,IAAI;IAON,IAAI,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBxC,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBzC,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAmBlC,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAKjC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAqB9B,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAI/B,OAAO,IAAI,IAAI;CASf;AAED,eAAe,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { CapabilityError } from '@vibesdotdev/kernel';
|
|
2
|
+
import { BaseRuntimeClient } from '@vibesdotdev/kernel/client';
|
|
3
|
+
import { getLogger } from '@vibesdotdev/logging';
|
|
4
|
+
import { CaptureSessionStateSchema } from "./schemas/capture-state.js";
|
|
5
|
+
import { parseCaptureResult, parseCaptureSources } from "./schemas/capture-parse.js";
|
|
6
|
+
import { attempt, failureLabel } from "./utils/attempt.js";
|
|
7
|
+
import { failureMessage } from "./utils/failure-message.js";
|
|
8
|
+
/** A runtime owns sessions; each UI tree opens its own selection and history. */
|
|
9
|
+
export class MediaCaptureClient extends BaseRuntimeClient {
|
|
10
|
+
sessions = new Set();
|
|
11
|
+
closeSessions = () => this.onDispose();
|
|
12
|
+
openSession() {
|
|
13
|
+
if (this.runtime.lifecycle.signal.aborted)
|
|
14
|
+
throw new CapabilityError('The capture runtime is disposed.', 'UNAVAILABLE', {
|
|
15
|
+
reason: 'media-capture-runtime-disposed', retryable: false
|
|
16
|
+
});
|
|
17
|
+
this.runtime.lifecycle.signal.addEventListener('abort', this.closeSessions, { once: true });
|
|
18
|
+
const session = new CaptureSession(this.runtime, () => this.sessions.delete(session));
|
|
19
|
+
this.sessions.add(session);
|
|
20
|
+
return session;
|
|
21
|
+
}
|
|
22
|
+
onDispose() {
|
|
23
|
+
this.runtime.lifecycle.signal.removeEventListener('abort', this.closeSessions);
|
|
24
|
+
for (const session of this.sessions)
|
|
25
|
+
session.dispose();
|
|
26
|
+
this.sessions.clear();
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/** Byte-only capture state. Browser URLs belong to the Svelte projection. */
|
|
30
|
+
export class CaptureSession {
|
|
31
|
+
runtime;
|
|
32
|
+
release;
|
|
33
|
+
state = CaptureSessionStateSchema.parse({});
|
|
34
|
+
listeners = new Set();
|
|
35
|
+
provider = null;
|
|
36
|
+
closed = false;
|
|
37
|
+
selection = 0;
|
|
38
|
+
constructor(runtime, release) {
|
|
39
|
+
this.runtime = runtime;
|
|
40
|
+
this.release = release;
|
|
41
|
+
}
|
|
42
|
+
get snapshot() { return this.state; }
|
|
43
|
+
subscribe(listener) {
|
|
44
|
+
this.listeners.add(listener);
|
|
45
|
+
listener(this.state);
|
|
46
|
+
return () => this.listeners.delete(listener);
|
|
47
|
+
}
|
|
48
|
+
update(patch) {
|
|
49
|
+
if (this.closed)
|
|
50
|
+
return;
|
|
51
|
+
this.state = { ...this.state, ...patch };
|
|
52
|
+
for (const listener of this.listeners)
|
|
53
|
+
listener(this.state);
|
|
54
|
+
}
|
|
55
|
+
fail(what, fallback, failure) {
|
|
56
|
+
getLogger('media', this.runtime).child({ context: 'capture' }).warn(`media capture: ${what}`, { failure: failureLabel(failure) });
|
|
57
|
+
this.update({ error: failureMessage(failure, fallback) });
|
|
58
|
+
}
|
|
59
|
+
async init(providerId) {
|
|
60
|
+
if (this.closed)
|
|
61
|
+
return;
|
|
62
|
+
this.update({ loading: true, error: null });
|
|
63
|
+
const initialized = await attempt(async () => {
|
|
64
|
+
const providers = this.runtime.query('media/capture').enabled().descriptors();
|
|
65
|
+
this.update({ providers });
|
|
66
|
+
const selected = providers.find(provider => provider.id === providerId) ?? providers[0];
|
|
67
|
+
if (!selected)
|
|
68
|
+
throw new CapabilityError('No capture provider is available.', 'UNAVAILABLE', {
|
|
69
|
+
reason: 'media-capture-provider-unavailable', retryable: false
|
|
70
|
+
});
|
|
71
|
+
await this.selectProvider(selected.id);
|
|
72
|
+
});
|
|
73
|
+
if (this.closed)
|
|
74
|
+
return;
|
|
75
|
+
if (!initialized.ok)
|
|
76
|
+
this.fail('provider setup failed', 'Capture is not available.', initialized.failure);
|
|
77
|
+
this.update({ initialized: true, loading: false });
|
|
78
|
+
}
|
|
79
|
+
async selectProvider(id) {
|
|
80
|
+
if (this.closed)
|
|
81
|
+
return;
|
|
82
|
+
const selection = ++this.selection;
|
|
83
|
+
this.provider = null;
|
|
84
|
+
this.update({ providerId: id, sources: [], sourceId: null, loading: true, error: null });
|
|
85
|
+
const selected = await attempt(() => this.runtime.query('media/capture').withId(id).enabled().resolve());
|
|
86
|
+
if (this.closed || selection !== this.selection)
|
|
87
|
+
return;
|
|
88
|
+
if (!selected.ok) {
|
|
89
|
+
this.fail('provider setup failed', 'Capture is not available.', selected.failure);
|
|
90
|
+
this.update({ loading: false });
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
this.provider = selected.value;
|
|
94
|
+
await this.loadSources();
|
|
95
|
+
}
|
|
96
|
+
async loadSources() {
|
|
97
|
+
const provider = this.provider;
|
|
98
|
+
const selection = this.selection;
|
|
99
|
+
if (!provider || this.closed)
|
|
100
|
+
return;
|
|
101
|
+
this.update({ loading: true, error: null });
|
|
102
|
+
const listed = await attempt(async () => parseCaptureSources(await provider.listSources()));
|
|
103
|
+
if (this.closed || selection !== this.selection)
|
|
104
|
+
return;
|
|
105
|
+
if (listed.ok) {
|
|
106
|
+
const sources = listed.value;
|
|
107
|
+
const sourceId = sources.some(source => source.id === this.state.sourceId)
|
|
108
|
+
? this.state.sourceId : sources.find(source => source.isPrimary)?.id ?? sources[0]?.id ?? null;
|
|
109
|
+
this.update({ sources, sourceId });
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
this.update({ sources: [], sourceId: null });
|
|
113
|
+
this.fail('listing sources failed', 'Could not list capture sources.', listed.failure);
|
|
114
|
+
}
|
|
115
|
+
this.update({ loading: false });
|
|
116
|
+
}
|
|
117
|
+
selectSource(id) {
|
|
118
|
+
const source = this.state.sources.find(candidate => String(candidate.id) === String(id));
|
|
119
|
+
if (source)
|
|
120
|
+
this.update({ sourceId: source.id });
|
|
121
|
+
}
|
|
122
|
+
async capture() {
|
|
123
|
+
const provider = this.provider;
|
|
124
|
+
const { providerId, sourceId } = this.state;
|
|
125
|
+
if (!provider || !providerId || this.closed || this.state.capturing)
|
|
126
|
+
return;
|
|
127
|
+
this.update({ capturing: true, error: null });
|
|
128
|
+
const captured = await attempt(async () => parseCaptureResult(await provider.capture(sourceId == null ? {} : { sourceId })));
|
|
129
|
+
if (this.closed)
|
|
130
|
+
return;
|
|
131
|
+
if (captured.ok) {
|
|
132
|
+
const result = captured.value;
|
|
133
|
+
const capture = {
|
|
134
|
+
...result, id: crypto.randomUUID(), providerId,
|
|
135
|
+
timestamp: result.timestampMs ?? Date.now()
|
|
136
|
+
};
|
|
137
|
+
if (sourceId != null)
|
|
138
|
+
capture.sourceId = sourceId;
|
|
139
|
+
this.update({ captures: [capture, ...this.state.captures].slice(0, 20), selectedCaptureId: capture.id });
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
this.fail('capture failed', 'The capture failed.', captured.failure);
|
|
143
|
+
}
|
|
144
|
+
this.update({ capturing: false });
|
|
145
|
+
}
|
|
146
|
+
selectCapture(id) {
|
|
147
|
+
if (this.state.captures.some(capture => capture.id === id))
|
|
148
|
+
this.update({ selectedCaptureId: id });
|
|
149
|
+
}
|
|
150
|
+
dispose() {
|
|
151
|
+
if (this.closed)
|
|
152
|
+
return;
|
|
153
|
+
this.state = CaptureSessionStateSchema.parse({});
|
|
154
|
+
for (const listener of this.listeners)
|
|
155
|
+
listener(this.state);
|
|
156
|
+
this.closed = true;
|
|
157
|
+
this.provider = null;
|
|
158
|
+
this.listeners.clear();
|
|
159
|
+
this.release();
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
export default MediaCaptureClient;
|
|
163
|
+
//# sourceMappingURL=capture-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capture-client.js","sourceRoot":"","sources":["../src/capture-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAyC,MAAM,qBAAqB,CAAC;AAC7F,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAGjD,OAAO,EAAE,yBAAyB,EAAsD,MAAM,4BAA4B,CAAC;AAC3H,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACrF,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE5D,iFAAiF;AACjF,MAAM,OAAO,kBAAmB,SAAQ,iBAA+B;IACrD,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IACrC,aAAa,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;IAExD,WAAW;QACV,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO;YAAE,MAAM,IAAI,eAAe,CAAC,kCAAkC,EAAE,aAAa,EAAE;gBACvH,MAAM,EAAE,gCAAgC,EAAE,SAAS,EAAE,KAAK;aAC1D,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5F,MAAM,OAAO,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;QACtF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC3B,OAAO,OAAO,CAAC;IAChB,CAAC;IAEkB,SAAS;QAC3B,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAC/E,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO,CAAC,OAAO,EAAE,CAAC;QACvD,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;CACD;AAED,6EAA6E;AAC7E,MAAM,OAAO,cAAc;IAOG;IAAwC;IAN7D,KAAK,GAAG,yBAAyB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACnC,SAAS,GAAG,IAAI,GAAG,EAAwC,CAAC;IACrE,QAAQ,GAA2B,IAAI,CAAC;IACxC,MAAM,GAAG,KAAK,CAAC;IACf,SAAS,GAAG,CAAC,CAAC;IAEtB,YAA6B,OAAqB,EAAmB,OAAmB;QAA3D,YAAO,GAAP,OAAO,CAAc;QAAmB,YAAO,GAAP,OAAO,CAAY;IAAG,CAAC;IAE5F,IAAI,QAAQ,KAA0B,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAE1D,SAAS,CAAC,QAA8C;QACvD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7B,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAEO,MAAM,CAAC,KAAmC;QACjD,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QACxB,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,KAAK,EAAE,CAAC;QACzC,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS;YAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7D,CAAC;IAEO,IAAI,CAAC,IAAY,EAAE,QAAgB,EAAE,OAAsB;QAClE,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC,IAAI,CAClE,kBAAkB,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,YAAY,CAAC,OAAO,CAAC,EAAE,CAC5D,CAAC;QACF,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,cAAc,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,UAAmB;QAC7B,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QACxB,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5C,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,KAAK,IAAI,EAAE;YAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAqC,eAAe,CAAC,CAAC,OAAO,EAAE,CAAC,WAAW,EAAE,CAAC;YAClH,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;YAC3B,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAK,UAAU,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC;YACxF,IAAI,CAAC,QAAQ;gBAAE,MAAM,IAAI,eAAe,CAAC,mCAAmC,EAAE,aAAa,EAAE;oBAC5F,MAAM,EAAE,oCAAoC,EAAE,SAAS,EAAE,KAAK;iBAC9D,CAAC,CAAC;YACH,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QACH,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QACxB,IAAI,CAAC,WAAW,CAAC,EAAE;YAAE,IAAI,CAAC,IAAI,CAAC,uBAAuB,EAAE,2BAA2B,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;QAC1G,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,EAAU;QAC9B,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QACxB,MAAM,SAAS,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC;QACnC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACzF,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAqC,eAAe,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7I,IAAI,IAAI,CAAC,MAAM,IAAI,SAAS,KAAK,IAAI,CAAC,SAAS;YAAE,OAAO;QACxD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YAClB,IAAI,CAAC,IAAI,CAAC,uBAAuB,EAAE,2BAA2B,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;YAClF,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YAChC,OAAO;QACR,CAAC;QACD,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC;QAC/B,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,WAAW;QAChB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QACjC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QACrC,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,mBAAmB,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QAC5F,IAAI,IAAI,CAAC,MAAM,IAAI,SAAS,KAAK,IAAI,CAAC,SAAS;YAAE,OAAO;QACxD,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC;YAC7B,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;gBACzE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,IAAI,CAAC;YAChG,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;QACpC,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7C,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE,iCAAiC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QACxF,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;IACjC,CAAC;IAED,YAAY,CAAC,EAAmB;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,KAAK,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QACzF,IAAI,MAAM;YAAE,IAAI,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,OAAO;QACZ,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC/B,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QAC5C,IAAI,CAAC,QAAQ,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS;YAAE,OAAO;QAC5E,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,kBAAkB,CAAC,MAAM,QAAQ,CAAC,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7H,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QACxB,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC;YAC9B,MAAM,OAAO,GAAwB;gBACpC,GAAG,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,UAAU,EAAE,EAAE,UAAU;gBAC9C,SAAS,EAAE,MAAM,CAAC,WAAW,IAAI,IAAI,CAAC,GAAG,EAAE;aAC3C,CAAC;YACF,IAAI,QAAQ,IAAI,IAAI;gBAAE,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;YAClD,IAAI,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,iBAAiB,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1G,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,qBAAqB,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;QACtE,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;IACnC,CAAC;IAED,aAAa,CAAC,EAAU;QACvB,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC;YAAE,IAAI,CAAC,MAAM,CAAC,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAC,CAAC;IACpG,CAAC;IAED,OAAO;QACN,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QACxB,IAAI,CAAC,KAAK,GAAG,yBAAyB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACjD,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS;YAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5D,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACvB,IAAI,CAAC,OAAO,EAAE,CAAC;IAChB,CAAC;CACD;AAED,eAAe,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Uploads settings — config/manifest descriptor.
|
|
3
|
+
*
|
|
4
|
+
* Previous defaults (git history of media/src/uploads/server/storage.ts):
|
|
5
|
+
* backend `local`, s3Region `us-east-1`, s3ForcePathStyle `false`.
|
|
6
|
+
* Hosts override via composition `config['media.uploads']`.
|
|
7
|
+
*/
|
|
8
|
+
import * as z from 'zod/v4';
|
|
9
|
+
import type { ConfigManifestDescriptor } from '@vibesdotdev/config';
|
|
10
|
+
export declare const UploadsConfigSchema: z.ZodObject<{
|
|
11
|
+
backend: z.ZodDefault<z.ZodEnum<{
|
|
12
|
+
local: "local";
|
|
13
|
+
s3: "s3";
|
|
14
|
+
r2: "r2";
|
|
15
|
+
}>>;
|
|
16
|
+
localPath: z.ZodOptional<z.ZodString>;
|
|
17
|
+
s3Bucket: z.ZodOptional<z.ZodString>;
|
|
18
|
+
s3Region: z.ZodDefault<z.ZodString>;
|
|
19
|
+
s3Endpoint: z.ZodOptional<z.ZodString>;
|
|
20
|
+
s3ForcePathStyle: z.ZodDefault<z.ZodBoolean>;
|
|
21
|
+
s3PublicBaseUrl: z.ZodOptional<z.ZodString>;
|
|
22
|
+
}, z.core.$strip>;
|
|
23
|
+
export type UploadsConfig = z.infer<typeof UploadsConfigSchema>;
|
|
24
|
+
export declare const MEDIA_UPLOADS_MANIFEST_ID = "media.uploads";
|
|
25
|
+
declare const descriptor: ConfigManifestDescriptor;
|
|
26
|
+
export default descriptor;
|
|
27
|
+
//# sourceMappingURL=media.uploads.config.descriptor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media.uploads.config.descriptor.d.ts","sourceRoot":"","sources":["../../src/config/media.uploads.config.descriptor.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,CAAC,MAAM,QAAQ,CAAC;AAC5B,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAEpE,eAAO,MAAM,mBAAmB;;;;;;;;;;;;iBAQ9B,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,eAAO,MAAM,yBAAyB,kBAAkB,CAAC;AAEzD,QAAA,MAAM,UAAU,EAAE,wBAyBjB,CAAC;AAEF,eAAe,UAAU,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Uploads settings — config/manifest descriptor.
|
|
3
|
+
*
|
|
4
|
+
* Previous defaults (git history of media/src/uploads/server/storage.ts):
|
|
5
|
+
* backend `local`, s3Region `us-east-1`, s3ForcePathStyle `false`.
|
|
6
|
+
* Hosts override via composition `config['media.uploads']`.
|
|
7
|
+
*/
|
|
8
|
+
import * as z from 'zod/v4';
|
|
9
|
+
export const UploadsConfigSchema = z.object({
|
|
10
|
+
backend: z.enum(['local', 's3', 'r2']).default('local'),
|
|
11
|
+
localPath: z.string().optional(),
|
|
12
|
+
s3Bucket: z.string().optional(),
|
|
13
|
+
s3Region: z.string().default('us-east-1'),
|
|
14
|
+
s3Endpoint: z.string().optional(),
|
|
15
|
+
s3ForcePathStyle: z.boolean().default(false),
|
|
16
|
+
s3PublicBaseUrl: z.string().optional()
|
|
17
|
+
});
|
|
18
|
+
export const MEDIA_UPLOADS_MANIFEST_ID = 'media.uploads';
|
|
19
|
+
const descriptor = {
|
|
20
|
+
kind: 'config/manifest',
|
|
21
|
+
id: MEDIA_UPLOADS_MANIFEST_ID,
|
|
22
|
+
name: 'Uploads storage',
|
|
23
|
+
description: 'Upload storage backend and S3 settings.',
|
|
24
|
+
namespace: 'media.uploads',
|
|
25
|
+
schema: UploadsConfigSchema,
|
|
26
|
+
storedLayer: 'none',
|
|
27
|
+
allowedAdapters: ['storage.json', 'storage.localdb'],
|
|
28
|
+
scope: 'global',
|
|
29
|
+
customTables: false,
|
|
30
|
+
version: 1,
|
|
31
|
+
internal: false,
|
|
32
|
+
tier: 'system',
|
|
33
|
+
category: 'media',
|
|
34
|
+
fields: {
|
|
35
|
+
backend: { ui: { label: 'Storage backend', component: 'select' } },
|
|
36
|
+
localPath: { ui: { label: 'Local uploads root' } },
|
|
37
|
+
s3Bucket: { ui: { label: 'S3 bucket' } },
|
|
38
|
+
s3Region: { ui: { label: 'S3 region' } },
|
|
39
|
+
s3Endpoint: { ui: { label: 'S3 endpoint' } },
|
|
40
|
+
s3ForcePathStyle: { ui: { label: 'S3 force path style', component: 'switch' } },
|
|
41
|
+
s3PublicBaseUrl: { ui: { label: 'S3 public base URL' } }
|
|
42
|
+
},
|
|
43
|
+
enabled: true
|
|
44
|
+
};
|
|
45
|
+
export default descriptor;
|
|
46
|
+
//# sourceMappingURL=media.uploads.config.descriptor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media.uploads.config.descriptor.js","sourceRoot":"","sources":["../../src/config/media.uploads.config.descriptor.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,CAAC,MAAM,QAAQ,CAAC;AAG5B,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;IACvD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC;IACzC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,gBAAgB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IAC5C,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACtC,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,yBAAyB,GAAG,eAAe,CAAC;AAEzD,MAAM,UAAU,GAA6B;IAC5C,IAAI,EAAE,iBAAiB;IACvB,EAAE,EAAE,yBAAyB;IAC7B,IAAI,EAAE,iBAAiB;IACvB,WAAW,EAAE,yCAAyC;IACtD,SAAS,EAAE,eAAe;IAC1B,MAAM,EAAE,mBAAmB;IAC3B,WAAW,EAAE,MAAM;IACnB,eAAe,EAAE,CAAC,cAAc,EAAE,iBAAiB,CAAC;IACpD,KAAK,EAAE,QAAQ;IACf,YAAY,EAAE,KAAK;IACnB,OAAO,EAAE,CAAC;IACV,QAAQ,EAAE,KAAK;IACf,IAAI,EAAE,QAAQ;IACd,QAAQ,EAAE,OAAO;IACjB,MAAM,EAAE;QACP,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE;QAClE,SAAS,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE,EAAE;QAClD,QAAQ,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE;QACxC,QAAQ,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE;QACxC,UAAU,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE;QAC5C,gBAAgB,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE;QAC/E,eAAe,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE,EAAE;KACxD;IACD,OAAO,EAAE,IAAI;CACb,CAAC;AAEF,eAAe,UAAU,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Uploads config layer. Feature code reads `loadUploadsConfig(runtime)`,
|
|
3
|
+
* which is `ConfigManifest.forRuntime(runtime, 'media.uploads').load()`.
|
|
4
|
+
* Hosts overlay `config['media.uploads']`. Schema defaults apply when
|
|
5
|
+
* nothing is composed.
|
|
6
|
+
*/
|
|
7
|
+
import { type RuntimeRef } from '@vibesdotdev/kernel';
|
|
8
|
+
import { type UploadsConfig } from './media.uploads.config.descriptor.ts';
|
|
9
|
+
/** Composition + stored, parsed by the media.uploads schema (defaults local / us-east-1 / false). */
|
|
10
|
+
export declare function loadUploadsConfig(runtime: RuntimeRef): Promise<UploadsConfig>;
|
|
11
|
+
//# sourceMappingURL=uploads.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uploads.d.ts","sourceRoot":"","sources":["../../src/config/uploads.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAqB,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAGzE,OAAO,EAGN,KAAK,aAAa,EAClB,MAAM,sCAAsC,CAAC;AAE9C,qGAAqG;AACrG,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,CAenF"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Uploads config layer. Feature code reads `loadUploadsConfig(runtime)`,
|
|
3
|
+
* which is `ConfigManifest.forRuntime(runtime, 'media.uploads').load()`.
|
|
4
|
+
* Hosts overlay `config['media.uploads']`. Schema defaults apply when
|
|
5
|
+
* nothing is composed.
|
|
6
|
+
*/
|
|
7
|
+
import { isCapabilityError } from '@vibesdotdev/kernel';
|
|
8
|
+
import { attempt, rethrowFailure } from "../utils/attempt.js";
|
|
9
|
+
import { ConfigManifest } from '@vibesdotdev/config/manifest/config-manifest';
|
|
10
|
+
import { MEDIA_UPLOADS_MANIFEST_ID, UploadsConfigSchema } from "./media.uploads.config.descriptor.js";
|
|
11
|
+
/** Composition + stored, parsed by the media.uploads schema (defaults local / us-east-1 / false). */
|
|
12
|
+
export async function loadUploadsConfig(runtime) {
|
|
13
|
+
if (runtime.hasKind('config/manifest') &&
|
|
14
|
+
runtime.query('config/manifest').withId(MEDIA_UPLOADS_MANIFEST_ID).descriptors().length > 0) {
|
|
15
|
+
const loaded = await attempt(() => ConfigManifest.forRuntime(runtime, MEDIA_UPLOADS_MANIFEST_ID).load());
|
|
16
|
+
if (loaded.ok)
|
|
17
|
+
return loaded.value;
|
|
18
|
+
// Only "the manifest is not registered" falls back to the defaults; any other failure is real.
|
|
19
|
+
if (!(isCapabilityError(loaded.failure) && loaded.failure.reason === 'config-manifest-unregistered')) {
|
|
20
|
+
return rethrowFailure(loaded.failure);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return UploadsConfigSchema.parse({});
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=uploads.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uploads.js","sourceRoot":"","sources":["../../src/config/uploads.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,iBAAiB,EAAmB,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,8CAA8C,CAAC;AAC9E,OAAO,EACN,yBAAyB,EACzB,mBAAmB,EAEnB,MAAM,sCAAsC,CAAC;AAE9C,qGAAqG;AACrG,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAAmB;IAC1D,IACC,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAAC,yBAAyB,CAAC,CAAC,WAAW,EAAE,CAAC,MAAM,GAAG,CAAC,EAC1F,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,CACjC,cAAc,CAAC,UAAU,CAAgB,OAAO,EAAE,yBAAyB,CAAC,CAAC,IAAI,EAAE,CACnF,CAAC;QACF,IAAI,MAAM,CAAC,EAAE;YAAE,OAAO,MAAM,CAAC,KAAK,CAAC;QACnC,+FAA+F;QAC/F,IAAI,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,8BAA8B,CAAC,EAAE,CAAC;YACtG,OAAO,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACvC,CAAC;IACF,CAAC;IACD,OAAO,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifact-references.docs.descriptor.d.ts","sourceRoot":"","sources":["../../src/docs/artifact-references.docs.descriptor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAEvE,QAAA,MAAM,UAAU,EAAE,mBAmEjB,CAAC;AAEF,eAAe,UAAU,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
const descriptor = {
|
|
2
|
+
kind: 'docs/topic',
|
|
3
|
+
id: 'media.artifact-references',
|
|
4
|
+
title: 'Media artifact references',
|
|
5
|
+
summary: 'Stable, owner-qualified identity for an exact revision of an image, audio, video, or transcript artifact.',
|
|
6
|
+
body: {
|
|
7
|
+
type: 'markdown',
|
|
8
|
+
sourceType: 'raw',
|
|
9
|
+
source: `---
|
|
10
|
+
title: Media artifact references
|
|
11
|
+
summary: Carry exact media identity between generation, editing, and workflow surfaces.
|
|
12
|
+
tags: [media, artifacts, lineage, revisions, workflows]
|
|
13
|
+
parent: media
|
|
14
|
+
order: 1
|
|
15
|
+
surfaces: [cli, web, in-app]
|
|
16
|
+
hardware: [consumer, cloud]
|
|
17
|
+
id: media.artifact-references
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
\`MediaArtifactReference\` identifies one exact revision of a media artifact
|
|
21
|
+
without pretending that \`@vibesdotdev/media\` owns its bytes or authorization.
|
|
22
|
+
|
|
23
|
+
\`\`\`ts
|
|
24
|
+
import { createMediaArtifactReference } from '@vibesdotdev/media';
|
|
25
|
+
|
|
26
|
+
const input = createMediaArtifactReference({
|
|
27
|
+
owner: {
|
|
28
|
+
appId: 'ai',
|
|
29
|
+
collection: 'generated-images'
|
|
30
|
+
},
|
|
31
|
+
artifactId: 'image_01J...',
|
|
32
|
+
revisionId: 'image_01J...',
|
|
33
|
+
mediaType: 'image'
|
|
34
|
+
});
|
|
35
|
+
\`\`\`
|
|
36
|
+
|
|
37
|
+
The reference contains:
|
|
38
|
+
|
|
39
|
+
| Field | Meaning |
|
|
40
|
+
| --- | --- |
|
|
41
|
+
| \`schemaVersion\` | Contract version for durable parsing and migrations. |
|
|
42
|
+
| \`owner.appId\` | App responsible for resolution and authorization. |
|
|
43
|
+
| \`owner.collection\` | Owner-local artifact collection. |
|
|
44
|
+
| \`artifactId\` | Stable artifact identity. |
|
|
45
|
+
| \`revisionId\` | Exact immutable revision to reopen. |
|
|
46
|
+
| \`mediaType\` | \`image\`, \`audio\`, \`video\`, or \`transcript\`. |
|
|
47
|
+
|
|
48
|
+
## Rules
|
|
49
|
+
|
|
50
|
+
- Carry the reference unchanged between AI, Media, and Workbench contracts.
|
|
51
|
+
- Ask the named owner to resolve it; never guess a storage adapter.
|
|
52
|
+
- Keep URLs, paths, signed credentials, and provider response objects out of the
|
|
53
|
+
reference. They expire, leak implementation detail, or bypass authorization.
|
|
54
|
+
- Require the exact \`revisionId\` when reproducibility matters. A bare asset ID
|
|
55
|
+
is not enough to prove which bytes or operation were used.
|
|
56
|
+
|
|
57
|
+
The owner may return a fresh authorized URL or stream after checking the acting
|
|
58
|
+
principal. The portable reference itself is storage-neutral.
|
|
59
|
+
`
|
|
60
|
+
},
|
|
61
|
+
parent: 'media',
|
|
62
|
+
order: 1,
|
|
63
|
+
tags: ['media', 'artifacts', 'lineage', 'revisions', 'workflows'],
|
|
64
|
+
surfaces: ['cli', 'web', 'in-app'],
|
|
65
|
+
hardware: ['consumer', 'cloud'],
|
|
66
|
+
enabled: true
|
|
67
|
+
};
|
|
68
|
+
export default descriptor;
|
|
69
|
+
//# sourceMappingURL=artifact-references.docs.descriptor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifact-references.docs.descriptor.js","sourceRoot":"","sources":["../../src/docs/artifact-references.docs.descriptor.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,GAAwB;IACvC,IAAI,EAAE,YAAY;IAClB,EAAE,EAAE,2BAA2B;IAC/B,KAAK,EAAE,2BAA2B;IAClC,OAAO,EACN,2GAA2G;IAC5G,IAAI,EAAE;QACL,IAAI,EAAE,UAAU;QAChB,UAAU,EAAE,KAAK;QACjB,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkDT;KACC;IACD,MAAM,EAAE,OAAO;IACf,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,CAAC;IACjE,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC;IAClC,QAAQ,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC;IAC/B,OAAO,EAAE,IAAI;CACb,CAAC;AAEF,eAAe,UAAU,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-transform.docs.descriptor.d.ts","sourceRoot":"","sources":["../../src/docs/image-transform.docs.descriptor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAEvE,QAAA,MAAM,UAAU,EAAE,mBAiDjB,CAAC;AAEF,eAAe,UAAU,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
const descriptor = {
|
|
2
|
+
kind: 'docs/topic',
|
|
3
|
+
id: 'media.image-transform',
|
|
4
|
+
title: 'Image transformation',
|
|
5
|
+
summary: 'Decode, transform, and encode image bytes through a runtime-selected provider.',
|
|
6
|
+
body: {
|
|
7
|
+
type: 'markdown',
|
|
8
|
+
sourceType: 'raw',
|
|
9
|
+
source: `---
|
|
10
|
+
title: Image transformation
|
|
11
|
+
summary: Safely transform image bytes through a runtime-selected provider.
|
|
12
|
+
tags: [media, image, runtime, transforms]
|
|
13
|
+
parent: media
|
|
14
|
+
order: 2
|
|
15
|
+
surfaces: [cli, web, in-app]
|
|
16
|
+
hardware: [consumer, cloud]
|
|
17
|
+
id: media.image-transform
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
The \`media/image-transform\` runtime kind accepts bytes and returns bytes.
|
|
21
|
+
Callers acquire and authorize the source; providers never receive a path or URL.
|
|
22
|
+
|
|
23
|
+
\`\`\`ts
|
|
24
|
+
const image = await runtime
|
|
25
|
+
.query('media/image-transform')
|
|
26
|
+
.withId('media.image-transform.bun')
|
|
27
|
+
.resolve();
|
|
28
|
+
|
|
29
|
+
const result = await image.transform({
|
|
30
|
+
data: sourceBytes,
|
|
31
|
+
maxPixels: 40_000_000,
|
|
32
|
+
resize: { width: 512, fit: 'inside' },
|
|
33
|
+
output: { format: 'webp', quality: 82 }
|
|
34
|
+
});
|
|
35
|
+
\`\`\`
|
|
36
|
+
|
|
37
|
+
Lower \`maxPixels\` for untrusted or thumbnail workloads; providers reject a
|
|
38
|
+
request above their advertised hard ceiling. The limit applies to both source
|
|
39
|
+
pixels and requested output geometry. \`decodeFormats\` and \`encodeFormats\`
|
|
40
|
+
are portable guarantees. Query \`platformDependentFormats\` before requesting
|
|
41
|
+
optional formats such as HEIC, AVIF, or TIFF.
|
|
42
|
+
`
|
|
43
|
+
},
|
|
44
|
+
parent: 'media',
|
|
45
|
+
order: 2,
|
|
46
|
+
tags: ['media', 'image', 'runtime', 'transforms'],
|
|
47
|
+
surfaces: ['cli', 'web', 'in-app'],
|
|
48
|
+
hardware: ['consumer', 'cloud'],
|
|
49
|
+
enabled: true
|
|
50
|
+
};
|
|
51
|
+
export default descriptor;
|
|
52
|
+
//# sourceMappingURL=image-transform.docs.descriptor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-transform.docs.descriptor.js","sourceRoot":"","sources":["../../src/docs/image-transform.docs.descriptor.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,GAAwB;IACvC,IAAI,EAAE,YAAY;IAClB,EAAE,EAAE,uBAAuB;IAC3B,KAAK,EAAE,sBAAsB;IAC7B,OAAO,EAAE,gFAAgF;IACzF,IAAI,EAAE;QACL,IAAI,EAAE,UAAU;QAChB,UAAU,EAAE,KAAK;QACjB,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiCT;KACC;IACD,MAAM,EAAE,OAAO;IACf,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,CAAC;IACjD,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC;IAClC,QAAQ,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC;IAC/B,OAAO,EAAE,IAAI;CACb,CAAC;AAEF,eAAe,UAAU,CAAC"}
|