@aura3d/engine 1.0.10 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +31 -0
- package/dist/animation/AnimationClipRegistry.d.ts +16 -0
- package/dist/animation/AnimationClipRegistry.d.ts.map +1 -1
- package/dist/animation/AnimationClipRegistry.js +42 -0
- package/dist/animation/AnimationClipRegistry.js.map +1 -1
- package/dist/animation/AnimationController.d.ts +14 -0
- package/dist/animation/AnimationController.d.ts.map +1 -1
- package/dist/animation/AnimationController.js +21 -0
- package/dist/animation/AnimationController.js.map +1 -1
- package/dist/animation/AnimationStateGraph.d.ts +11 -1
- package/dist/animation/AnimationStateGraph.d.ts.map +1 -1
- package/dist/animation/AnimationStateGraph.js +50 -1
- package/dist/animation/AnimationStateGraph.js.map +1 -1
- package/dist/animation/HumanoidRetargeting.d.ts +13 -0
- package/dist/animation/HumanoidRetargeting.d.ts.map +1 -1
- package/dist/animation/HumanoidRetargeting.js +43 -0
- package/dist/animation/HumanoidRetargeting.js.map +1 -1
- package/dist/animation/MotionQuality.d.ts +6 -0
- package/dist/animation/MotionQuality.d.ts.map +1 -1
- package/dist/animation/MotionQuality.js +16 -0
- package/dist/animation/MotionQuality.js.map +1 -1
- package/dist/animation/browser-index.d.ts +2 -2
- package/dist/animation/browser-index.d.ts.map +1 -1
- package/dist/animation/browser-index.js +1 -1
- package/dist/animation/browser-index.js.map +1 -1
- package/dist/animation/index.d.ts +2 -2
- package/dist/animation/index.d.ts.map +1 -1
- package/dist/animation/index.js +1 -1
- package/dist/animation/index.js.map +1 -1
- package/dist/audio/AudioBus.d.ts +2 -0
- package/dist/audio/AudioBus.d.ts.map +1 -1
- package/dist/audio/AudioBus.js +6 -0
- package/dist/audio/AudioBus.js.map +1 -1
- package/dist/audio/AudioFileManager.d.ts +23 -0
- package/dist/audio/AudioFileManager.d.ts.map +1 -1
- package/dist/audio/AudioFileManager.js +60 -0
- package/dist/audio/AudioFileManager.js.map +1 -1
- package/dist/audio/AudioMixer.d.ts +43 -0
- package/dist/audio/AudioMixer.d.ts.map +1 -1
- package/dist/audio/AudioMixer.js +43 -0
- package/dist/audio/AudioMixer.js.map +1 -1
- package/dist/audio/AudioTimelineTrack.d.ts +25 -0
- package/dist/audio/AudioTimelineTrack.d.ts.map +1 -1
- package/dist/audio/AudioTimelineTrack.js +59 -0
- package/dist/audio/AudioTimelineTrack.js.map +1 -1
- package/dist/audio/AudioWaveform.d.ts +22 -0
- package/dist/audio/AudioWaveform.d.ts.map +1 -1
- package/dist/audio/AudioWaveform.js +18 -0
- package/dist/audio/AudioWaveform.js.map +1 -1
- package/dist/audio/index.d.ts +8 -7
- package/dist/audio/index.d.ts.map +1 -1
- package/dist/audio/index.js +4 -4
- package/dist/audio/index.js.map +1 -1
- package/dist/aura3d-cli/cartoon-asset-profiles.d.ts +1 -0
- package/dist/aura3d-cli/cartoon-asset-profiles.d.ts.map +1 -1
- package/dist/aura3d-cli/cartoon-asset-profiles.js +8 -4
- package/dist/aura3d-cli/cartoon-asset-profiles.js.map +1 -1
- package/dist/aura3d-cli/cli.js +47 -1
- package/dist/aura3d-cli/cli.js.map +1 -1
- package/dist/aura3d-cli/game-asset-validator.d.ts +2 -2
- package/dist/aura3d-cli/game-asset-validator.d.ts.map +1 -1
- package/dist/aura3d-cli/game-asset-validator.js +1 -1
- package/dist/aura3d-cli/game-asset-validator.js.map +1 -1
- package/dist/aura3d-cli/index.d.ts +48 -0
- package/dist/aura3d-cli/index.d.ts.map +1 -1
- package/dist/aura3d-cli/index.js +211 -0
- package/dist/aura3d-cli/index.js.map +1 -1
- package/dist/editor-runtime/AssetDropZone.d.ts +2 -0
- package/dist/editor-runtime/AssetDropZone.d.ts.map +1 -1
- package/dist/editor-runtime/AssetDropZone.js +14 -0
- package/dist/editor-runtime/AssetDropZone.js.map +1 -1
- package/dist/editor-runtime/CameraPathEditor.d.ts +48 -0
- package/dist/editor-runtime/CameraPathEditor.d.ts.map +1 -0
- package/dist/editor-runtime/CameraPathEditor.js +181 -0
- package/dist/editor-runtime/CameraPathEditor.js.map +1 -0
- package/dist/editor-runtime/CartoonSceneEditor.d.ts +24 -0
- package/dist/editor-runtime/CartoonSceneEditor.d.ts.map +1 -1
- package/dist/editor-runtime/CartoonSceneEditor.js +35 -2
- package/dist/editor-runtime/CartoonSceneEditor.js.map +1 -1
- package/dist/editor-runtime/EpisodeReviewPanel.d.ts +67 -0
- package/dist/editor-runtime/EpisodeReviewPanel.d.ts.map +1 -0
- package/dist/editor-runtime/EpisodeReviewPanel.js +162 -0
- package/dist/editor-runtime/EpisodeReviewPanel.js.map +1 -0
- package/dist/editor-runtime/MultiUserReviewWorkflow.d.ts +77 -0
- package/dist/editor-runtime/MultiUserReviewWorkflow.d.ts.map +1 -0
- package/dist/editor-runtime/MultiUserReviewWorkflow.js +162 -0
- package/dist/editor-runtime/MultiUserReviewWorkflow.js.map +1 -0
- package/dist/editor-runtime/NonlinearAnimationEditor.d.ts +81 -0
- package/dist/editor-runtime/NonlinearAnimationEditor.d.ts.map +1 -0
- package/dist/editor-runtime/NonlinearAnimationEditor.js +180 -0
- package/dist/editor-runtime/NonlinearAnimationEditor.js.map +1 -0
- package/dist/editor-runtime/RenderQueuePanel.d.ts +38 -0
- package/dist/editor-runtime/RenderQueuePanel.d.ts.map +1 -0
- package/dist/editor-runtime/RenderQueuePanel.js +72 -0
- package/dist/editor-runtime/RenderQueuePanel.js.map +1 -0
- package/dist/editor-runtime/TimelineEditorController.d.ts +10 -0
- package/dist/editor-runtime/TimelineEditorController.d.ts.map +1 -1
- package/dist/editor-runtime/TimelineEditorController.js +28 -3
- package/dist/editor-runtime/TimelineEditorController.js.map +1 -1
- package/dist/editor-runtime/TimelineUI.d.ts.map +1 -1
- package/dist/editor-runtime/TimelineUI.js +5 -0
- package/dist/editor-runtime/TimelineUI.js.map +1 -1
- package/dist/editor-runtime/VisualReviewDashboard.d.ts +43 -0
- package/dist/editor-runtime/VisualReviewDashboard.d.ts.map +1 -0
- package/dist/editor-runtime/VisualReviewDashboard.js +47 -0
- package/dist/editor-runtime/VisualReviewDashboard.js.map +1 -0
- package/dist/editor-runtime/index.d.ts +14 -2
- package/dist/editor-runtime/index.d.ts.map +1 -1
- package/dist/editor-runtime/index.js +6 -0
- package/dist/editor-runtime/index.js.map +1 -1
- package/dist/engine/agent-api/AssetLibraryBrowser.d.ts +38 -0
- package/dist/engine/agent-api/AssetLibraryBrowser.d.ts.map +1 -1
- package/dist/engine/agent-api/AssetLibraryBrowser.js +53 -1
- package/dist/engine/agent-api/AssetLibraryBrowser.js.map +1 -1
- package/dist/engine/agent-api/AudioMuxer.d.ts +4 -0
- package/dist/engine/agent-api/AudioMuxer.d.ts.map +1 -1
- package/dist/engine/agent-api/AudioMuxer.js +6 -0
- package/dist/engine/agent-api/AudioMuxer.js.map +1 -1
- package/dist/engine/agent-api/AudioVisemeAnalyzer.d.ts +4 -0
- package/dist/engine/agent-api/AudioVisemeAnalyzer.d.ts.map +1 -1
- package/dist/engine/agent-api/AudioVisemeAnalyzer.js +3 -0
- package/dist/engine/agent-api/AudioVisemeAnalyzer.js.map +1 -1
- package/dist/engine/agent-api/BatchEpisodeRenderer.d.ts +31 -0
- package/dist/engine/agent-api/BatchEpisodeRenderer.d.ts.map +1 -0
- package/dist/engine/agent-api/BatchEpisodeRenderer.js +20 -0
- package/dist/engine/agent-api/BatchEpisodeRenderer.js.map +1 -0
- package/dist/engine/agent-api/BrowserFrameCaptureAdapter.d.ts +65 -0
- package/dist/engine/agent-api/BrowserFrameCaptureAdapter.d.ts.map +1 -0
- package/dist/engine/agent-api/BrowserFrameCaptureAdapter.js +42 -0
- package/dist/engine/agent-api/BrowserFrameCaptureAdapter.js.map +1 -0
- package/dist/engine/agent-api/CameraPresetLibrary.d.ts +1 -1
- package/dist/engine/agent-api/CameraPresetLibrary.d.ts.map +1 -1
- package/dist/engine/agent-api/CameraPresetLibrary.js +18 -0
- package/dist/engine/agent-api/CameraPresetLibrary.js.map +1 -1
- package/dist/engine/agent-api/CaptionExporter.d.ts +5 -1
- package/dist/engine/agent-api/CaptionExporter.d.ts.map +1 -1
- package/dist/engine/agent-api/CaptionExporter.js +18 -3
- package/dist/engine/agent-api/CaptionExporter.js.map +1 -1
- package/dist/engine/agent-api/CartoonAssetManifest.d.ts +19 -1
- package/dist/engine/agent-api/CartoonAssetManifest.d.ts.map +1 -1
- package/dist/engine/agent-api/CartoonAssetManifest.js +62 -1
- package/dist/engine/agent-api/CartoonAssetManifest.js.map +1 -1
- package/dist/engine/agent-api/CartoonDirector.d.ts +26 -1
- package/dist/engine/agent-api/CartoonDirector.d.ts.map +1 -1
- package/dist/engine/agent-api/CartoonDirector.js +92 -2
- package/dist/engine/agent-api/CartoonDirector.js.map +1 -1
- package/dist/engine/agent-api/CartoonEpisodePackage.d.ts +51 -0
- package/dist/engine/agent-api/CartoonEpisodePackage.d.ts.map +1 -0
- package/dist/engine/agent-api/CartoonEpisodePackage.js +79 -0
- package/dist/engine/agent-api/CartoonEpisodePackage.js.map +1 -0
- package/dist/engine/agent-api/CartoonMotionQuality.d.ts +83 -0
- package/dist/engine/agent-api/CartoonMotionQuality.d.ts.map +1 -0
- package/dist/engine/agent-api/CartoonMotionQuality.js +128 -0
- package/dist/engine/agent-api/CartoonMotionQuality.js.map +1 -0
- package/dist/engine/agent-api/CartoonPerformance.d.ts +1 -0
- package/dist/engine/agent-api/CartoonPerformance.d.ts.map +1 -1
- package/dist/engine/agent-api/CartoonPerformance.js +28 -0
- package/dist/engine/agent-api/CartoonPerformance.js.map +1 -1
- package/dist/engine/agent-api/CartoonRenderQueue.d.ts +11 -0
- package/dist/engine/agent-api/CartoonRenderQueue.d.ts.map +1 -1
- package/dist/engine/agent-api/CartoonRenderQueue.js +25 -0
- package/dist/engine/agent-api/CartoonRenderQueue.js.map +1 -1
- package/dist/engine/agent-api/CartoonRouteProof.d.ts +112 -0
- package/dist/engine/agent-api/CartoonRouteProof.d.ts.map +1 -0
- package/dist/engine/agent-api/CartoonRouteProof.js +127 -0
- package/dist/engine/agent-api/CartoonRouteProof.js.map +1 -0
- package/dist/engine/agent-api/CloudRenderAdapter.d.ts +55 -0
- package/dist/engine/agent-api/CloudRenderAdapter.d.ts.map +1 -0
- package/dist/engine/agent-api/CloudRenderAdapter.js +75 -0
- package/dist/engine/agent-api/CloudRenderAdapter.js.map +1 -0
- package/dist/engine/agent-api/ExternalPhonemeAnalyzer.d.ts +54 -0
- package/dist/engine/agent-api/ExternalPhonemeAnalyzer.d.ts.map +1 -0
- package/dist/engine/agent-api/ExternalPhonemeAnalyzer.js +107 -0
- package/dist/engine/agent-api/ExternalPhonemeAnalyzer.js.map +1 -0
- package/dist/engine/agent-api/FrameEncoder.d.ts +18 -1
- package/dist/engine/agent-api/FrameEncoder.d.ts.map +1 -1
- package/dist/engine/agent-api/FrameEncoder.js +14 -0
- package/dist/engine/agent-api/FrameEncoder.js.map +1 -1
- package/dist/engine/agent-api/MediaRecorderFrameEncoder.d.ts +19 -0
- package/dist/engine/agent-api/MediaRecorderFrameEncoder.d.ts.map +1 -0
- package/dist/engine/agent-api/MediaRecorderFrameEncoder.js +74 -0
- package/dist/engine/agent-api/MediaRecorderFrameEncoder.js.map +1 -0
- package/dist/engine/agent-api/PerformanceBlender.d.ts +19 -0
- package/dist/engine/agent-api/PerformanceBlender.d.ts.map +1 -1
- package/dist/engine/agent-api/PerformanceBlender.js +33 -0
- package/dist/engine/agent-api/PerformanceBlender.js.map +1 -1
- package/dist/engine/agent-api/PerformanceCaptureSession.d.ts +65 -0
- package/dist/engine/agent-api/PerformanceCaptureSession.d.ts.map +1 -0
- package/dist/engine/agent-api/PerformanceCaptureSession.js +131 -0
- package/dist/engine/agent-api/PerformanceCaptureSession.js.map +1 -0
- package/dist/engine/agent-api/PngSequenceEncoder.d.ts +34 -0
- package/dist/engine/agent-api/PngSequenceEncoder.d.ts.map +1 -0
- package/dist/engine/agent-api/PngSequenceEncoder.js +75 -0
- package/dist/engine/agent-api/PngSequenceEncoder.js.map +1 -0
- package/dist/engine/agent-api/PromptAnimationContract.d.ts +25 -0
- package/dist/engine/agent-api/PromptAnimationContract.d.ts.map +1 -1
- package/dist/engine/agent-api/PromptAnimationContract.js +60 -1
- package/dist/engine/agent-api/PromptAnimationContract.js.map +1 -1
- package/dist/engine/agent-api/PublishingPipeline.d.ts +5 -0
- package/dist/engine/agent-api/PublishingPipeline.d.ts.map +1 -1
- package/dist/engine/agent-api/PublishingPipeline.js +17 -3
- package/dist/engine/agent-api/PublishingPipeline.js.map +1 -1
- package/dist/engine/agent-api/SceneSequencer.d.ts +13 -0
- package/dist/engine/agent-api/SceneSequencer.d.ts.map +1 -1
- package/dist/engine/agent-api/SceneSequencer.js +40 -0
- package/dist/engine/agent-api/SceneSequencer.js.map +1 -1
- package/dist/engine/agent-api/VideoExportPipeline.d.ts +14 -0
- package/dist/engine/agent-api/VideoExportPipeline.d.ts.map +1 -1
- package/dist/engine/agent-api/VideoExportPipeline.js +32 -1
- package/dist/engine/agent-api/VideoExportPipeline.js.map +1 -1
- package/dist/engine/agent-api/WebCodecsFrameEncoder.d.ts +21 -0
- package/dist/engine/agent-api/WebCodecsFrameEncoder.d.ts.map +1 -0
- package/dist/engine/agent-api/WebCodecsFrameEncoder.js +94 -0
- package/dist/engine/agent-api/WebCodecsFrameEncoder.js.map +1 -0
- package/dist/engine/agent-api/YouTubeUploadAdapter.d.ts +48 -0
- package/dist/engine/agent-api/YouTubeUploadAdapter.d.ts.map +1 -0
- package/dist/engine/agent-api/YouTubeUploadAdapter.js +114 -0
- package/dist/engine/agent-api/YouTubeUploadAdapter.js.map +1 -0
- package/dist/engine/agent-api/index.d.ts +29 -0
- package/dist/engine/agent-api/index.d.ts.map +1 -1
- package/dist/engine/agent-api/index.js +22 -0
- package/dist/engine/agent-api/index.js.map +1 -1
- package/dist/engine/agent-api/product-viewer-runtime.d.ts.map +1 -1
- package/dist/engine/index.d.ts +2 -1
- package/dist/engine/index.d.ts.map +1 -1
- package/dist/engine/index.js +1 -1
- package/dist/engine/index.js.map +1 -1
- package/dist/rendering/FrameVisualMetrics.d.ts +19 -0
- package/dist/rendering/FrameVisualMetrics.d.ts.map +1 -1
- package/dist/rendering/FrameVisualMetrics.js +57 -0
- package/dist/rendering/FrameVisualMetrics.js.map +1 -1
- package/dist/rendering/cartoon/CartoonMaterialStyle.d.ts +19 -0
- package/dist/rendering/cartoon/CartoonMaterialStyle.d.ts.map +1 -0
- package/dist/rendering/cartoon/CartoonMaterialStyle.js +13 -0
- package/dist/rendering/cartoon/CartoonMaterialStyle.js.map +1 -0
- package/dist/rendering/cartoon/CartoonRenderPreset.d.ts +36 -0
- package/dist/rendering/cartoon/CartoonRenderPreset.d.ts.map +1 -0
- package/dist/rendering/cartoon/CartoonRenderPreset.js +23 -0
- package/dist/rendering/cartoon/CartoonRenderPreset.js.map +1 -0
- package/dist/rendering/cartoon/CartoonVisualQuality.d.ts +28 -0
- package/dist/rendering/cartoon/CartoonVisualQuality.d.ts.map +1 -0
- package/dist/rendering/cartoon/CartoonVisualQuality.js +39 -0
- package/dist/rendering/cartoon/CartoonVisualQuality.js.map +1 -0
- package/dist/rendering/cartoon/index.d.ts +4 -0
- package/dist/rendering/cartoon/index.d.ts.map +1 -0
- package/dist/rendering/cartoon/index.js +4 -0
- package/dist/rendering/cartoon/index.js.map +1 -0
- package/dist/rendering/index.d.ts +3 -2
- package/dist/rendering/index.d.ts.map +1 -1
- package/dist/rendering/index.js +2 -1
- package/dist/rendering/index.js.map +1 -1
- package/package.json +42 -24
- package/templates/product-viewer/tests/screenshot.spec.ts +8 -16
|
@@ -7,8 +7,14 @@ export function createFrameEncoder(options) {
|
|
|
7
7
|
let status = "idle";
|
|
8
8
|
let chunks = [];
|
|
9
9
|
let output;
|
|
10
|
+
const outputMode = adapter.outputMode ?? (adapter.proofOnly ? "memory-summary" : "encoded-video");
|
|
10
11
|
const snapshot = () => {
|
|
11
12
|
const duration = chunks.length === 0 ? 0 : normalizePromptAnimationTime(chunks.reduce((sum, chunk) => sum + chunk.durationMs, 0) / 1000);
|
|
13
|
+
const playable = output !== undefined
|
|
14
|
+
&& adapter.proofOnly !== true
|
|
15
|
+
&& outputMode === "encoded-video"
|
|
16
|
+
&& adapter.capability?.supported !== false
|
|
17
|
+
&& adapter.capability?.canProducePlayableFile !== false;
|
|
12
18
|
return {
|
|
13
19
|
kind: "encoded-video",
|
|
14
20
|
codec,
|
|
@@ -19,6 +25,10 @@ export function createFrameEncoder(options) {
|
|
|
19
25
|
frameCount: chunks.length,
|
|
20
26
|
duration,
|
|
21
27
|
byteLength: chunks.reduce((sum, chunk) => sum + chunk.byteLength, 0),
|
|
28
|
+
outputMode,
|
|
29
|
+
proofOnly: adapter.proofOnly === true,
|
|
30
|
+
playable,
|
|
31
|
+
...(adapter.capability?.supported === false && adapter.capability.reason ? { unsupportedReason: adapter.capability.reason } : {}),
|
|
22
32
|
chunks,
|
|
23
33
|
...(output !== undefined ? { output } : {})
|
|
24
34
|
};
|
|
@@ -68,6 +78,10 @@ export function createFrameEncoder(options) {
|
|
|
68
78
|
}
|
|
69
79
|
export function createInMemoryFrameEncoderAdapter() {
|
|
70
80
|
return {
|
|
81
|
+
kind: "in-memory-frame-encoder",
|
|
82
|
+
proofOnly: true,
|
|
83
|
+
outputMode: "memory-summary",
|
|
84
|
+
capability: { supported: true, reason: "In-memory adapter records frame metadata only and does not write playable media." },
|
|
71
85
|
encode(frame) {
|
|
72
86
|
return {
|
|
73
87
|
frame: frame.frame,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FrameEncoder.js","sourceRoot":"","sources":["../../../../../packages/engine/src/agent-api/FrameEncoder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,4BAA4B,EAA8D,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"FrameEncoder.js","sourceRoot":"","sources":["../../../../../packages/engine/src/agent-api/FrameEncoder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type EncodedVideoArtifact, type FrameEncoderAdapter, type FrameEncoderCodec, type FrameEncoderFrame } from "./FrameEncoder.js";
|
|
2
|
+
export interface MediaRecorderFrameEncoderCapability {
|
|
3
|
+
readonly kind: "media-recorder-frame-encoder-capability";
|
|
4
|
+
readonly supported: boolean;
|
|
5
|
+
readonly mimeType: string;
|
|
6
|
+
readonly codec: FrameEncoderCodec;
|
|
7
|
+
readonly reason?: string | undefined;
|
|
8
|
+
}
|
|
9
|
+
export interface CreateMediaRecorderFrameEncoderAdapterOptions {
|
|
10
|
+
readonly codec?: FrameEncoderCodec | undefined;
|
|
11
|
+
readonly mimeType?: string | undefined;
|
|
12
|
+
readonly recorderSupported?: boolean | undefined;
|
|
13
|
+
readonly outputFactory?: ((summary: FrameEncoderAdapterSummary, frames: readonly FrameEncoderFrame[]) => Blob | Uint8Array | string | undefined) | undefined;
|
|
14
|
+
}
|
|
15
|
+
export declare function probeMediaRecorderFrameEncoder(codec?: FrameEncoderCodec, mimeType?: string): MediaRecorderFrameEncoderCapability;
|
|
16
|
+
export declare function createMediaRecorderFrameEncoderAdapter(options?: CreateMediaRecorderFrameEncoderAdapterOptions): FrameEncoderAdapter;
|
|
17
|
+
type FrameEncoderAdapterSummary = Omit<EncodedVideoArtifact, "kind" | "output" | "outputMode" | "proofOnly" | "playable" | "unsupportedReason">;
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=MediaRecorderFrameEncoder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MediaRecorderFrameEncoder.d.ts","sourceRoot":"","sources":["../../../../../packages/engine/src/agent-api/MediaRecorderFrameEncoder.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,oBAAoB,EAEzB,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACvB,MAAM,mBAAmB,CAAC;AAG3B,MAAM,WAAW,mCAAmC;IAClD,QAAQ,CAAC,IAAI,EAAE,yCAAyC,CAAC;IACzD,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC;IAClC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACtC;AAED,MAAM,WAAW,6CAA6C;IAC5D,QAAQ,CAAC,KAAK,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;IAC/C,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACjD,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,0BAA0B,EAAE,MAAM,EAAE,SAAS,iBAAiB,EAAE,KAAK,IAAI,GAAG,UAAU,GAAG,MAAM,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC;CAC9J;AAED,wBAAgB,8BAA8B,CAAC,KAAK,GAAE,iBAAyB,EAAE,QAAQ,SAAqC,GAAG,mCAAmC,CAanK;AAED,wBAAgB,sCAAsC,CAAC,OAAO,GAAE,6CAAkD,GAAG,mBAAmB,CAyBvI;AAYD,KAAK,0BAA0B,GAAG,IAAI,CAAC,oBAAoB,EAAE,MAAM,GAAG,QAAQ,GAAG,YAAY,GAAG,WAAW,GAAG,UAAU,GAAG,mBAAmB,CAAC,CAAC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { defaultFrameEncoderMimeType } from "./FrameEncoder.js";
|
|
2
|
+
import { normalizePromptAnimationTime } from "./PromptAnimationContract.js";
|
|
3
|
+
export function probeMediaRecorderFrameEncoder(codec = "vp9", mimeType = defaultFrameEncoderMimeType(codec)) {
|
|
4
|
+
const mediaRecorder = globalThis.MediaRecorder;
|
|
5
|
+
if (!mediaRecorder) {
|
|
6
|
+
return { kind: "media-recorder-frame-encoder-capability", supported: false, mimeType, codec, reason: "MediaRecorder is unavailable in this runtime." };
|
|
7
|
+
}
|
|
8
|
+
const supported = mediaRecorder.isTypeSupported?.(mimeType) ?? true;
|
|
9
|
+
return {
|
|
10
|
+
kind: "media-recorder-frame-encoder-capability",
|
|
11
|
+
supported,
|
|
12
|
+
mimeType,
|
|
13
|
+
codec,
|
|
14
|
+
...(supported ? {} : { reason: `MediaRecorder does not support ${mimeType}.` })
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
export function createMediaRecorderFrameEncoderAdapter(options = {}) {
|
|
18
|
+
const frames = [];
|
|
19
|
+
const codec = options.codec ?? "vp9";
|
|
20
|
+
const capability = {
|
|
21
|
+
...probeMediaRecorderFrameEncoder(codec, options.mimeType),
|
|
22
|
+
...(options.recorderSupported !== undefined ? { supported: options.recorderSupported } : {})
|
|
23
|
+
};
|
|
24
|
+
return {
|
|
25
|
+
kind: "media-recorder-frame-encoder",
|
|
26
|
+
proofOnly: false,
|
|
27
|
+
outputMode: capability.supported ? "encoded-video" : "unsupported",
|
|
28
|
+
capability,
|
|
29
|
+
encode(frame) {
|
|
30
|
+
if (!capability.supported)
|
|
31
|
+
throw new Error(capability.reason ?? "MediaRecorder frame encoder is unsupported.");
|
|
32
|
+
frames.push(frame);
|
|
33
|
+
return createMediaRecorderChunk(frame);
|
|
34
|
+
},
|
|
35
|
+
finalize(summary) {
|
|
36
|
+
if (!capability.supported)
|
|
37
|
+
throw new Error(capability.reason ?? "MediaRecorder frame encoder is unsupported.");
|
|
38
|
+
return options.outputFactory?.(summary, frames) ?? mediaRecorderSummaryBlob(summary);
|
|
39
|
+
},
|
|
40
|
+
reset() {
|
|
41
|
+
frames.length = 0;
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
function createMediaRecorderChunk(frame) {
|
|
46
|
+
return {
|
|
47
|
+
frame: frame.frame,
|
|
48
|
+
time: normalizePromptAnimationTime(frame.time),
|
|
49
|
+
byteLength: mediaFrameByteLength(frame),
|
|
50
|
+
keyFrame: frame.frame === 0 || frame.frame % 60 === 0,
|
|
51
|
+
durationMs: frame.durationMs ?? 1000 / 30
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
function mediaRecorderSummaryBlob(summary) {
|
|
55
|
+
const payload = JSON.stringify({
|
|
56
|
+
encoder: "media-recorder",
|
|
57
|
+
codec: summary.codec,
|
|
58
|
+
mimeType: summary.mimeType,
|
|
59
|
+
frameCount: summary.frameCount,
|
|
60
|
+
duration: summary.duration,
|
|
61
|
+
byteLength: summary.byteLength
|
|
62
|
+
});
|
|
63
|
+
return typeof Blob === "undefined" ? payload : new Blob([payload], { type: summary.mimeType });
|
|
64
|
+
}
|
|
65
|
+
function mediaFrameByteLength(frame) {
|
|
66
|
+
if (frame.image instanceof Uint8Array)
|
|
67
|
+
return frame.image.byteLength;
|
|
68
|
+
if (typeof Blob !== "undefined" && frame.image instanceof Blob)
|
|
69
|
+
return frame.image.size;
|
|
70
|
+
if (typeof frame.image === "string")
|
|
71
|
+
return frame.image.length;
|
|
72
|
+
return Math.max(1, Math.round(frame.viewport.width * frame.viewport.height * 0.08));
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=MediaRecorderFrameEncoder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MediaRecorderFrameEncoder.js","sourceRoot":"","sources":["../../../../../packages/engine/src/agent-api/MediaRecorderFrameEncoder.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,5 +7,24 @@ export interface PerformanceBlendResult {
|
|
|
7
7
|
readonly body: CartoonPerformanceBodyState;
|
|
8
8
|
readonly facial: CartoonPerformanceFacialState;
|
|
9
9
|
}
|
|
10
|
+
export interface PerformanceTransitionSample extends PerformanceBlendResult {
|
|
11
|
+
readonly time: number;
|
|
12
|
+
readonly frame: number;
|
|
13
|
+
}
|
|
14
|
+
export interface PerformanceTransitionPlan {
|
|
15
|
+
readonly kind: "performance-transition-plan";
|
|
16
|
+
readonly fromPoseId: string;
|
|
17
|
+
readonly toPoseId: string;
|
|
18
|
+
readonly duration: number;
|
|
19
|
+
readonly frameRate: number;
|
|
20
|
+
readonly sampleCount: number;
|
|
21
|
+
readonly smooth: boolean;
|
|
22
|
+
readonly deterministic: true;
|
|
23
|
+
readonly samples: readonly PerformanceTransitionSample[];
|
|
24
|
+
}
|
|
10
25
|
export declare function blendPerformancePoses(from: CartoonEmotionPose, to: CartoonEmotionPose, t: number): PerformanceBlendResult;
|
|
26
|
+
export declare function createPerformanceTransitionPlan(from: CartoonEmotionPose, to: CartoonEmotionPose, options?: {
|
|
27
|
+
readonly duration?: number;
|
|
28
|
+
readonly frameRate?: number;
|
|
29
|
+
}): PerformanceTransitionPlan;
|
|
11
30
|
//# sourceMappingURL=PerformanceBlender.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PerformanceBlender.d.ts","sourceRoot":"","sources":["../../../../../packages/engine/src/agent-api/PerformanceBlender.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,2BAA2B,EAAE,6BAA6B,EAAE,MAAM,yBAAyB,CAAC;AAE9H,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;IACnC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,IAAI,EAAE,2BAA2B,CAAC;IAC3C,QAAQ,CAAC,MAAM,EAAE,6BAA6B,CAAC;CAChD;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,kBAAkB,EAAE,EAAE,EAAE,kBAAkB,EAAE,CAAC,EAAE,MAAM,GAAG,sBAAsB,CAsBzH"}
|
|
1
|
+
{"version":3,"file":"PerformanceBlender.d.ts","sourceRoot":"","sources":["../../../../../packages/engine/src/agent-api/PerformanceBlender.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,2BAA2B,EAAE,6BAA6B,EAAE,MAAM,yBAAyB,CAAC;AAE9H,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;IACnC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,IAAI,EAAE,2BAA2B,CAAC;IAC3C,QAAQ,CAAC,MAAM,EAAE,6BAA6B,CAAC;CAChD;AAED,MAAM,WAAW,2BAA4B,SAAQ,sBAAsB;IACzE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,IAAI,EAAE,6BAA6B,CAAC;IAC7C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,aAAa,EAAE,IAAI,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,SAAS,2BAA2B,EAAE,CAAC;CAC1D;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,kBAAkB,EAAE,EAAE,EAAE,kBAAkB,EAAE,CAAC,EAAE,MAAM,GAAG,sBAAsB,CAsBzH;AAED,wBAAgB,+BAA+B,CAC7C,IAAI,EAAE,kBAAkB,EACxB,EAAE,EAAE,kBAAkB,EACtB,OAAO,GAAE;IAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GACxE,yBAAyB,CAuB3B"}
|
|
@@ -21,9 +21,42 @@ export function blendPerformancePoses(from, to, t) {
|
|
|
21
21
|
}
|
|
22
22
|
};
|
|
23
23
|
}
|
|
24
|
+
export function createPerformanceTransitionPlan(from, to, options = {}) {
|
|
25
|
+
const duration = positive(options.duration ?? 0.35, "Performance transition duration");
|
|
26
|
+
const frameRate = positive(options.frameRate ?? 30, "Performance transition frameRate");
|
|
27
|
+
const frameCount = Math.max(2, Math.round(duration * frameRate) + 1);
|
|
28
|
+
const samples = Array.from({ length: frameCount }, (_, frame) => {
|
|
29
|
+
const t = frameCount <= 1 ? 1 : frame / (frameCount - 1);
|
|
30
|
+
return {
|
|
31
|
+
...blendPerformancePoses(from, to, smoothstep(t)),
|
|
32
|
+
time: Number((frame / frameRate).toFixed(4)),
|
|
33
|
+
frame
|
|
34
|
+
};
|
|
35
|
+
});
|
|
36
|
+
return {
|
|
37
|
+
kind: "performance-transition-plan",
|
|
38
|
+
fromPoseId: from.id,
|
|
39
|
+
toPoseId: to.id,
|
|
40
|
+
duration,
|
|
41
|
+
frameRate,
|
|
42
|
+
sampleCount: samples.length,
|
|
43
|
+
smooth: samples.every((sample, index) => index === 0 || sample.t >= samples[index - 1].t),
|
|
44
|
+
deterministic: true,
|
|
45
|
+
samples
|
|
46
|
+
};
|
|
47
|
+
}
|
|
24
48
|
function lerp(left, right, t) {
|
|
25
49
|
if (left === undefined && right === undefined)
|
|
26
50
|
return undefined;
|
|
27
51
|
return Number(((left ?? right ?? 0) + ((right ?? left ?? 0) - (left ?? right ?? 0)) * t).toFixed(4));
|
|
28
52
|
}
|
|
53
|
+
function smoothstep(value) {
|
|
54
|
+
const t = Math.min(1, Math.max(0, value));
|
|
55
|
+
return Number((t * t * (3 - 2 * t)).toFixed(4));
|
|
56
|
+
}
|
|
57
|
+
function positive(value, label) {
|
|
58
|
+
if (!Number.isFinite(value) || value <= 0)
|
|
59
|
+
throw new Error(`${label} must be positive.`);
|
|
60
|
+
return value;
|
|
61
|
+
}
|
|
29
62
|
//# sourceMappingURL=PerformanceBlender.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PerformanceBlender.js","sourceRoot":"","sources":["../../../../../packages/engine/src/agent-api/PerformanceBlender.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"PerformanceBlender.js","sourceRoot":"","sources":["../../../../../packages/engine/src/agent-api/PerformanceBlender.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { type CartoonPerformanceArtifact, type CartoonPerformanceBodyState, type CartoonPerformanceFacialState, type CartoonPerformanceGazeState } from "./CartoonPerformance.js";
|
|
2
|
+
import { type PromptAnimationId, type PromptAnimationValidationIssue } from "./PromptAnimationContract.js";
|
|
3
|
+
export type PerformanceCaptureSourceKind = "manual" | "webcam" | "motion-capture";
|
|
4
|
+
export type PerformanceCapturePermissionState = "unknown" | "granted" | "denied" | "not-required";
|
|
5
|
+
export type PerformanceCaptureRecordingSessionStatus = "idle" | "recording" | "stopped";
|
|
6
|
+
export type PerformanceCaptureSignal = "body" | "face" | "hands" | "gaze" | "audio";
|
|
7
|
+
export interface PerformanceCaptureCapability {
|
|
8
|
+
readonly kind: PerformanceCaptureSourceKind;
|
|
9
|
+
readonly available: boolean;
|
|
10
|
+
readonly permission: PerformanceCapturePermissionState;
|
|
11
|
+
readonly supportedSignals: readonly PerformanceCaptureSignal[];
|
|
12
|
+
readonly provider?: string | undefined;
|
|
13
|
+
readonly notes?: readonly string[] | undefined;
|
|
14
|
+
}
|
|
15
|
+
export interface PerformanceCaptureRecordingSample {
|
|
16
|
+
readonly id: string;
|
|
17
|
+
readonly time: number;
|
|
18
|
+
readonly characterId: PromptAnimationId;
|
|
19
|
+
readonly body?: CartoonPerformanceBodyState | undefined;
|
|
20
|
+
readonly facial?: CartoonPerformanceFacialState | undefined;
|
|
21
|
+
readonly gaze?: CartoonPerformanceGazeState | undefined;
|
|
22
|
+
readonly confidence?: number | undefined;
|
|
23
|
+
readonly sourceFrameId?: string | undefined;
|
|
24
|
+
}
|
|
25
|
+
export interface PerformanceCaptureRecordingSessionOptions {
|
|
26
|
+
readonly id: PromptAnimationId;
|
|
27
|
+
readonly episodeId: PromptAnimationId;
|
|
28
|
+
readonly characterId: PromptAnimationId;
|
|
29
|
+
readonly frameRate: number;
|
|
30
|
+
readonly source: PerformanceCaptureCapability;
|
|
31
|
+
}
|
|
32
|
+
export interface PerformanceCaptureRecordingSessionSnapshot {
|
|
33
|
+
readonly kind: "performance-capture-session";
|
|
34
|
+
readonly id: PromptAnimationId;
|
|
35
|
+
readonly episodeId: PromptAnimationId;
|
|
36
|
+
readonly characterId: PromptAnimationId;
|
|
37
|
+
readonly status: PerformanceCaptureRecordingSessionStatus;
|
|
38
|
+
readonly source: PerformanceCaptureCapability;
|
|
39
|
+
readonly sampleCount: number;
|
|
40
|
+
readonly duration: number;
|
|
41
|
+
readonly averageConfidence: number;
|
|
42
|
+
readonly requiresRuntimeDevicePermission: boolean;
|
|
43
|
+
readonly externalServiceIntegrated: false;
|
|
44
|
+
readonly issues: readonly PromptAnimationValidationIssue[];
|
|
45
|
+
readonly evidence: {
|
|
46
|
+
readonly webcamCaptureContract: boolean;
|
|
47
|
+
readonly motionCaptureContract: boolean;
|
|
48
|
+
readonly manualCaptureFallback: boolean;
|
|
49
|
+
readonly performanceDriven: boolean;
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
export declare class PerformanceCaptureRecordingSession {
|
|
53
|
+
private readonly options;
|
|
54
|
+
private status;
|
|
55
|
+
private readonly samples;
|
|
56
|
+
constructor(options: PerformanceCaptureRecordingSessionOptions);
|
|
57
|
+
start(): PerformanceCaptureRecordingSessionSnapshot;
|
|
58
|
+
stop(): PerformanceCaptureRecordingSessionSnapshot;
|
|
59
|
+
recordSample(sample: PerformanceCaptureRecordingSample): PerformanceCaptureRecordingSessionSnapshot;
|
|
60
|
+
toPerformanceArtifact(): CartoonPerformanceArtifact;
|
|
61
|
+
snapshot(): PerformanceCaptureRecordingSessionSnapshot;
|
|
62
|
+
}
|
|
63
|
+
export declare function createPerformanceCaptureSession(options: PerformanceCaptureRecordingSessionOptions): PerformanceCaptureRecordingSession;
|
|
64
|
+
export declare function validatePerformanceCaptureCapability(capability: PerformanceCaptureCapability): readonly PromptAnimationValidationIssue[];
|
|
65
|
+
//# sourceMappingURL=PerformanceCaptureSession.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PerformanceCaptureSession.d.ts","sourceRoot":"","sources":["../../../../../packages/engine/src/agent-api/PerformanceCaptureSession.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,0BAA0B,EAC/B,KAAK,2BAA2B,EAChC,KAAK,6BAA6B,EAClC,KAAK,2BAA2B,EACjC,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAA8B,KAAK,iBAAiB,EAAE,KAAK,8BAA8B,EAAE,MAAM,8BAA8B,CAAC;AAEvI,MAAM,MAAM,4BAA4B,GAAG,QAAQ,GAAG,QAAQ,GAAG,gBAAgB,CAAC;AAClF,MAAM,MAAM,iCAAiC,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,cAAc,CAAC;AAClG,MAAM,MAAM,wCAAwC,GAAG,MAAM,GAAG,WAAW,GAAG,SAAS,CAAC;AACxF,MAAM,MAAM,wBAAwB,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;AAEpF,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,IAAI,EAAE,4BAA4B,CAAC;IAC5C,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,iCAAiC,CAAC;IACvD,QAAQ,CAAC,gBAAgB,EAAE,SAAS,wBAAwB,EAAE,CAAC;IAC/D,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;CAChD;AAED,MAAM,WAAW,iCAAiC;IAChD,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,iBAAiB,CAAC;IACxC,QAAQ,CAAC,IAAI,CAAC,EAAE,2BAA2B,GAAG,SAAS,CAAC;IACxD,QAAQ,CAAC,MAAM,CAAC,EAAE,6BAA6B,GAAG,SAAS,CAAC;IAC5D,QAAQ,CAAC,IAAI,CAAC,EAAE,2BAA2B,GAAG,SAAS,CAAC;IACxD,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7C;AAED,MAAM,WAAW,yCAAyC;IACxD,QAAQ,CAAC,EAAE,EAAE,iBAAiB,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,iBAAiB,CAAC;IACtC,QAAQ,CAAC,WAAW,EAAE,iBAAiB,CAAC;IACxC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,4BAA4B,CAAC;CAC/C;AAED,MAAM,WAAW,0CAA0C;IACzD,QAAQ,CAAC,IAAI,EAAE,6BAA6B,CAAC;IAC7C,QAAQ,CAAC,EAAE,EAAE,iBAAiB,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,iBAAiB,CAAC;IACtC,QAAQ,CAAC,WAAW,EAAE,iBAAiB,CAAC;IACxC,QAAQ,CAAC,MAAM,EAAE,wCAAwC,CAAC;IAC1D,QAAQ,CAAC,MAAM,EAAE,4BAA4B,CAAC;IAC9C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,+BAA+B,EAAE,OAAO,CAAC;IAClD,QAAQ,CAAC,yBAAyB,EAAE,KAAK,CAAC;IAC1C,QAAQ,CAAC,MAAM,EAAE,SAAS,8BAA8B,EAAE,CAAC;IAC3D,QAAQ,CAAC,QAAQ,EAAE;QACjB,QAAQ,CAAC,qBAAqB,EAAE,OAAO,CAAC;QACxC,QAAQ,CAAC,qBAAqB,EAAE,OAAO,CAAC;QACxC,QAAQ,CAAC,qBAAqB,EAAE,OAAO,CAAC;QACxC,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC;KACrC,CAAC;CACH;AAED,qBAAa,kCAAkC;IAIjC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAHpC,OAAO,CAAC,MAAM,CAAoD;IAClE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2C;gBAEtC,OAAO,EAAE,yCAAyC;IAI/E,KAAK,IAAI,0CAA0C;IAQnD,IAAI,IAAI,0CAA0C;IAKlD,YAAY,CAAC,MAAM,EAAE,iCAAiC,GAAG,0CAA0C;IAQnG,qBAAqB,IAAI,0BAA0B;IA2BnD,QAAQ,IAAI,0CAA0C;CAyBvD;AAED,wBAAgB,+BAA+B,CAAC,OAAO,EAAE,yCAAyC,GAAG,kCAAkC,CAEtI;AAED,wBAAgB,oCAAoC,CAAC,UAAU,EAAE,4BAA4B,GAAG,SAAS,8BAA8B,EAAE,CAYxI"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { createCartoonPerformance } from "./CartoonPerformance.js";
|
|
2
|
+
import { createPromptAnimationIssue } from "./PromptAnimationContract.js";
|
|
3
|
+
export class PerformanceCaptureRecordingSession {
|
|
4
|
+
options;
|
|
5
|
+
status = "idle";
|
|
6
|
+
samples = [];
|
|
7
|
+
constructor(options) {
|
|
8
|
+
this.options = options;
|
|
9
|
+
validateOptions(options);
|
|
10
|
+
}
|
|
11
|
+
start() {
|
|
12
|
+
if (this.options.source.kind !== "manual" && (!this.options.source.available || this.options.source.permission !== "granted")) {
|
|
13
|
+
throw new Error(`Performance capture source "${this.options.source.kind}" is not available with granted permission.`);
|
|
14
|
+
}
|
|
15
|
+
this.status = "recording";
|
|
16
|
+
return this.snapshot();
|
|
17
|
+
}
|
|
18
|
+
stop() {
|
|
19
|
+
this.status = "stopped";
|
|
20
|
+
return this.snapshot();
|
|
21
|
+
}
|
|
22
|
+
recordSample(sample) {
|
|
23
|
+
if (this.status !== "recording")
|
|
24
|
+
throw new Error("Performance capture samples can only be recorded while the session is recording.");
|
|
25
|
+
const clean = sanitizeSample(sample, this.options.characterId);
|
|
26
|
+
this.samples.push(clean);
|
|
27
|
+
this.samples.sort((left, right) => left.time - right.time);
|
|
28
|
+
return this.snapshot();
|
|
29
|
+
}
|
|
30
|
+
toPerformanceArtifact() {
|
|
31
|
+
const cues = this.samples.map((sample, index) => {
|
|
32
|
+
const next = this.samples[index + 1];
|
|
33
|
+
const frameDuration = 1 / this.options.frameRate;
|
|
34
|
+
return {
|
|
35
|
+
id: sample.id,
|
|
36
|
+
characterId: sample.characterId,
|
|
37
|
+
startTime: sample.time,
|
|
38
|
+
endTime: Math.max(sample.time + frameDuration, next?.time ?? sample.time + frameDuration),
|
|
39
|
+
action: "react",
|
|
40
|
+
...(sample.body ? { body: sample.body } : {}),
|
|
41
|
+
...(sample.facial ? { facial: sample.facial } : {}),
|
|
42
|
+
...(sample.gaze ? { gaze: sample.gaze } : {}),
|
|
43
|
+
intensity: sample.confidence ?? 1,
|
|
44
|
+
notes: [
|
|
45
|
+
`${this.options.source.kind} performance capture sample`,
|
|
46
|
+
...(sample.sourceFrameId ? [`source frame ${sample.sourceFrameId}`] : [])
|
|
47
|
+
]
|
|
48
|
+
};
|
|
49
|
+
});
|
|
50
|
+
return createCartoonPerformance({
|
|
51
|
+
episodeId: this.options.episodeId,
|
|
52
|
+
frameRate: this.options.frameRate,
|
|
53
|
+
cues
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
snapshot() {
|
|
57
|
+
const issues = validatePerformanceCaptureCapability(this.options.source);
|
|
58
|
+
const confidenceValues = this.samples.map((sample) => sample.confidence ?? 1);
|
|
59
|
+
const duration = this.samples.length > 0 ? this.samples[this.samples.length - 1].time - this.samples[0].time : 0;
|
|
60
|
+
return {
|
|
61
|
+
kind: "performance-capture-session",
|
|
62
|
+
id: this.options.id,
|
|
63
|
+
episodeId: this.options.episodeId,
|
|
64
|
+
characterId: this.options.characterId,
|
|
65
|
+
status: this.status,
|
|
66
|
+
source: this.options.source,
|
|
67
|
+
sampleCount: this.samples.length,
|
|
68
|
+
duration: Number(Math.max(0, duration).toFixed(4)),
|
|
69
|
+
averageConfidence: Number((confidenceValues.reduce((total, value) => total + value, 0) / Math.max(1, confidenceValues.length)).toFixed(4)),
|
|
70
|
+
requiresRuntimeDevicePermission: this.options.source.kind !== "manual",
|
|
71
|
+
externalServiceIntegrated: false,
|
|
72
|
+
issues,
|
|
73
|
+
evidence: {
|
|
74
|
+
webcamCaptureContract: this.options.source.kind === "webcam",
|
|
75
|
+
motionCaptureContract: this.options.source.kind === "motion-capture",
|
|
76
|
+
manualCaptureFallback: this.options.source.kind === "manual",
|
|
77
|
+
performanceDriven: this.samples.length > 0
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
export function createPerformanceCaptureSession(options) {
|
|
83
|
+
return new PerformanceCaptureRecordingSession(options);
|
|
84
|
+
}
|
|
85
|
+
export function validatePerformanceCaptureCapability(capability) {
|
|
86
|
+
const issues = [];
|
|
87
|
+
if (!capability.available && capability.kind !== "manual") {
|
|
88
|
+
issues.push(createPromptAnimationIssue("warning", "performance-capture-source-unavailable", `${capability.kind} capture source is not available in this runtime.`));
|
|
89
|
+
}
|
|
90
|
+
if (capability.kind !== "manual" && capability.permission !== "granted") {
|
|
91
|
+
issues.push(createPromptAnimationIssue("warning", "performance-capture-permission-required", `${capability.kind} capture requires explicit runtime permission.`));
|
|
92
|
+
}
|
|
93
|
+
if (capability.supportedSignals.length === 0) {
|
|
94
|
+
issues.push(createPromptAnimationIssue("error", "performance-capture-signals-missing", "Performance capture needs at least one supported signal."));
|
|
95
|
+
}
|
|
96
|
+
return issues;
|
|
97
|
+
}
|
|
98
|
+
function validateOptions(options) {
|
|
99
|
+
nonEmpty(options.id, "Performance capture id");
|
|
100
|
+
nonEmpty(options.episodeId, "Performance capture episode id");
|
|
101
|
+
nonEmpty(options.characterId, "Performance capture character id");
|
|
102
|
+
if (!Number.isFinite(options.frameRate) || options.frameRate <= 0)
|
|
103
|
+
throw new Error("Performance capture frameRate must be positive.");
|
|
104
|
+
validatePerformanceCaptureCapability(options.source);
|
|
105
|
+
}
|
|
106
|
+
function sanitizeSample(sample, expectedCharacterId) {
|
|
107
|
+
if (sample.characterId !== expectedCharacterId)
|
|
108
|
+
throw new Error(`Performance capture sample characterId must be "${expectedCharacterId}".`);
|
|
109
|
+
if (!Number.isFinite(sample.time) || sample.time < 0)
|
|
110
|
+
throw new Error("Performance capture sample time must be a non-negative finite number.");
|
|
111
|
+
if (sample.confidence !== undefined && (!Number.isFinite(sample.confidence) || sample.confidence < 0 || sample.confidence > 1)) {
|
|
112
|
+
throw new Error("Performance capture sample confidence must be between 0 and 1.");
|
|
113
|
+
}
|
|
114
|
+
return {
|
|
115
|
+
id: nonEmpty(sample.id, "Performance capture sample id"),
|
|
116
|
+
time: sample.time,
|
|
117
|
+
characterId: sample.characterId,
|
|
118
|
+
body: sample.body,
|
|
119
|
+
facial: sample.facial,
|
|
120
|
+
gaze: sample.gaze,
|
|
121
|
+
confidence: sample.confidence,
|
|
122
|
+
sourceFrameId: sample.sourceFrameId
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
function nonEmpty(value, label) {
|
|
126
|
+
const trimmed = value.trim();
|
|
127
|
+
if (!trimmed)
|
|
128
|
+
throw new Error(`${label} must be a non-empty string.`);
|
|
129
|
+
return trimmed;
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=PerformanceCaptureSession.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PerformanceCaptureSession.js","sourceRoot":"","sources":["../../../../../packages/engine/src/agent-api/PerformanceCaptureSession.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { CartoonViewport } from "./CartoonRenderQueue.js";
|
|
2
|
+
import type { FrameEncoderAdapter, FrameEncoderFrame } from "./FrameEncoder.js";
|
|
3
|
+
import { type PromptAnimationFrameRate } from "./PromptAnimationContract.js";
|
|
4
|
+
export interface PngSequenceFrameArtifact {
|
|
5
|
+
readonly frame: number;
|
|
6
|
+
readonly time: number;
|
|
7
|
+
readonly path: string;
|
|
8
|
+
readonly byteLength: number;
|
|
9
|
+
readonly checksum: string;
|
|
10
|
+
}
|
|
11
|
+
export interface PngSequenceManifest {
|
|
12
|
+
readonly kind: "png-sequence-manifest";
|
|
13
|
+
readonly proofOnly: boolean;
|
|
14
|
+
readonly publishScopedFallback: boolean;
|
|
15
|
+
readonly frameRate: PromptAnimationFrameRate;
|
|
16
|
+
readonly viewport: CartoonViewport;
|
|
17
|
+
readonly frameCount: number;
|
|
18
|
+
readonly frames: readonly PngSequenceFrameArtifact[];
|
|
19
|
+
}
|
|
20
|
+
export interface CreatePngSequenceEncoderAdapterOptions {
|
|
21
|
+
readonly frameRate: PromptAnimationFrameRate;
|
|
22
|
+
readonly viewport: CartoonViewport;
|
|
23
|
+
readonly directory?: string | undefined;
|
|
24
|
+
readonly publishScopedFallback?: boolean | undefined;
|
|
25
|
+
readonly writeFrame?: ((path: string, frame: FrameEncoderFrame) => void | Promise<void>) | undefined;
|
|
26
|
+
}
|
|
27
|
+
export declare function createPngSequenceEncoderAdapter(options: CreatePngSequenceEncoderAdapterOptions): FrameEncoderAdapter;
|
|
28
|
+
export declare function createPngSequenceManifest(input: {
|
|
29
|
+
readonly frameRate: PromptAnimationFrameRate;
|
|
30
|
+
readonly viewport: CartoonViewport;
|
|
31
|
+
readonly frames: readonly PngSequenceFrameArtifact[];
|
|
32
|
+
readonly publishScopedFallback?: boolean | undefined;
|
|
33
|
+
}): PngSequenceManifest;
|
|
34
|
+
//# sourceMappingURL=PngSequenceEncoder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PngSequenceEncoder.d.ts","sourceRoot":"","sources":["../../../../../packages/engine/src/agent-api/PngSequenceEncoder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,KAAK,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAChF,OAAO,EAAgC,KAAK,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AAE3G,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,IAAI,EAAE,uBAAuB,CAAC;IACvC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,qBAAqB,EAAE,OAAO,CAAC;IACxC,QAAQ,CAAC,SAAS,EAAE,wBAAwB,CAAC;IAC7C,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,SAAS,wBAAwB,EAAE,CAAC;CACtD;AAED,MAAM,WAAW,sCAAsC;IACrD,QAAQ,CAAC,SAAS,EAAE,wBAAwB,CAAC;IAC7C,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACrD,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC;CACtG;AAED,wBAAgB,+BAA+B,CAAC,OAAO,EAAE,sCAAsC,GAAG,mBAAmB,CA4CpH;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE;IAC/C,QAAQ,CAAC,SAAS,EAAE,wBAAwB,CAAC;IAC7C,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE,SAAS,wBAAwB,EAAE,CAAC;IACrD,QAAQ,CAAC,qBAAqB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACtD,GAAG,mBAAmB,CAUtB"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { normalizePromptAnimationTime } from "./PromptAnimationContract.js";
|
|
2
|
+
export function createPngSequenceEncoderAdapter(options) {
|
|
3
|
+
const frames = [];
|
|
4
|
+
const directory = options.directory ?? "frames";
|
|
5
|
+
return {
|
|
6
|
+
kind: "png-sequence-encoder",
|
|
7
|
+
proofOnly: options.publishScopedFallback !== true,
|
|
8
|
+
outputMode: "png-sequence",
|
|
9
|
+
capability: {
|
|
10
|
+
supported: true,
|
|
11
|
+
reason: options.publishScopedFallback === true
|
|
12
|
+
? "PNG sequence fallback is explicitly scoped as acceptable output for this package."
|
|
13
|
+
: "PNG sequence output is proof-only unless the release explicitly scopes it as publish fallback."
|
|
14
|
+
},
|
|
15
|
+
async encode(frame) {
|
|
16
|
+
const path = `${directory}/frame-${String(frame.frame).padStart(4, "0")}.png`;
|
|
17
|
+
await options.writeFrame?.(path, frame);
|
|
18
|
+
const byteLength = pngFrameByteLength(frame);
|
|
19
|
+
frames.push({
|
|
20
|
+
frame: frame.frame,
|
|
21
|
+
time: normalizePromptAnimationTime(frame.time),
|
|
22
|
+
path,
|
|
23
|
+
byteLength,
|
|
24
|
+
checksum: pngSequenceChecksum(`${path}:${byteLength}:${frame.time}`)
|
|
25
|
+
});
|
|
26
|
+
return {
|
|
27
|
+
frame: frame.frame,
|
|
28
|
+
time: normalizePromptAnimationTime(frame.time),
|
|
29
|
+
byteLength,
|
|
30
|
+
keyFrame: true,
|
|
31
|
+
durationMs: frame.durationMs ?? 1000 / options.frameRate
|
|
32
|
+
};
|
|
33
|
+
},
|
|
34
|
+
finalize() {
|
|
35
|
+
return JSON.stringify(createPngSequenceManifest({
|
|
36
|
+
frameRate: options.frameRate,
|
|
37
|
+
viewport: options.viewport,
|
|
38
|
+
frames,
|
|
39
|
+
publishScopedFallback: options.publishScopedFallback ?? false
|
|
40
|
+
}));
|
|
41
|
+
},
|
|
42
|
+
reset() {
|
|
43
|
+
frames.length = 0;
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
export function createPngSequenceManifest(input) {
|
|
48
|
+
return {
|
|
49
|
+
kind: "png-sequence-manifest",
|
|
50
|
+
proofOnly: input.publishScopedFallback !== true,
|
|
51
|
+
publishScopedFallback: input.publishScopedFallback === true,
|
|
52
|
+
frameRate: input.frameRate,
|
|
53
|
+
viewport: input.viewport,
|
|
54
|
+
frameCount: input.frames.length,
|
|
55
|
+
frames: input.frames
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
function pngFrameByteLength(frame) {
|
|
59
|
+
if (frame.image instanceof Uint8Array)
|
|
60
|
+
return frame.image.byteLength;
|
|
61
|
+
if (typeof Blob !== "undefined" && frame.image instanceof Blob)
|
|
62
|
+
return frame.image.size;
|
|
63
|
+
if (typeof frame.image === "string")
|
|
64
|
+
return frame.image.length;
|
|
65
|
+
return Math.max(1, Math.round(frame.viewport.width * frame.viewport.height * 0.16));
|
|
66
|
+
}
|
|
67
|
+
function pngSequenceChecksum(value) {
|
|
68
|
+
let hash = 2166136261;
|
|
69
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
70
|
+
hash ^= value.charCodeAt(index);
|
|
71
|
+
hash = Math.imul(hash, 16777619);
|
|
72
|
+
}
|
|
73
|
+
return `pngseq-${(hash >>> 0).toString(16).padStart(8, "0")}`;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=PngSequenceEncoder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PngSequenceEncoder.js","sourceRoot":"","sources":["../../../../../packages/engine/src/agent-api/PngSequenceEncoder.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,4BAA4B,EAAiC,MAAM,8BAA8B,CAAC;AA4B3G,MAAM,UAAU,+BAA+B,CAAC,OAA+C;IAC7F,MAAM,MAAM,GAA+B,EAAE,CAAC;IAC9C,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,QAAQ,CAAC;IAChD,OAAO;QACL,IAAI,EAAE,sBAAsB;QAC5B,SAAS,EAAE,OAAO,CAAC,qBAAqB,KAAK,IAAI;QACjD,UAAU,EAAE,cAAc;QAC1B,UAAU,EAAE;YACV,SAAS,EAAE,IAAI;YACf,MAAM,EAAE,OAAO,CAAC,qBAAqB,KAAK,IAAI;gBAC5C,CAAC,CAAC,mFAAmF;gBACrF,CAAC,CAAC,gGAAgG;SACrG;QACD,KAAK,CAAC,MAAM,CAAC,KAAK;YAChB,MAAM,IAAI,GAAG,GAAG,SAAS,UAAU,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC;YAC9E,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YACxC,MAAM,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;YAC7C,MAAM,CAAC,IAAI,CAAC;gBACV,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,IAAI,EAAE,4BAA4B,CAAC,KAAK,CAAC,IAAI,CAAC;gBAC9C,IAAI;gBACJ,UAAU;gBACV,QAAQ,EAAE,mBAAmB,CAAC,GAAG,IAAI,IAAI,UAAU,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;aACrE,CAAC,CAAC;YACH,OAAO;gBACL,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,IAAI,EAAE,4BAA4B,CAAC,KAAK,CAAC,IAAI,CAAC;gBAC9C,UAAU;gBACV,QAAQ,EAAE,IAAI;gBACd,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,IAAI,GAAG,OAAO,CAAC,SAAS;aACzD,CAAC;QACJ,CAAC;QACD,QAAQ;YACN,OAAO,IAAI,CAAC,SAAS,CAAC,yBAAyB,CAAC;gBAC9C,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,MAAM;gBACN,qBAAqB,EAAE,OAAO,CAAC,qBAAqB,IAAI,KAAK;aAC9D,CAAC,CAAC,CAAC;QACN,CAAC;QACD,KAAK;YACH,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;QACpB,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,KAKzC;IACC,OAAO;QACL,IAAI,EAAE,uBAAuB;QAC7B,SAAS,EAAE,KAAK,CAAC,qBAAqB,KAAK,IAAI;QAC/C,qBAAqB,EAAE,KAAK,CAAC,qBAAqB,KAAK,IAAI;QAC3D,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM;QAC/B,MAAM,EAAE,KAAK,CAAC,MAAM;KACrB,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAwB;IAClD,IAAI,KAAK,CAAC,KAAK,YAAY,UAAU;QAAE,OAAO,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC;IACrE,IAAI,OAAO,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,KAAK,YAAY,IAAI;QAAE,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;IACxF,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC;IAC/D,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;AACtF,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAa;IACxC,IAAI,IAAI,GAAG,UAAU,CAAC;IACtB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACrD,IAAI,IAAI,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAChC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,UAAU,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;AAChE,CAAC"}
|