@aelionsdk/audio 1.0.0-rc.1 → 1.2.0-rc.1

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 CHANGED
@@ -1,7 +1,28 @@
1
- # @aelionsdk/audio
1
+ # `@aelionsdk/audio`
2
2
 
3
- AudioWorklet clock, PCM buffering and audio mixing for AelionSDK
3
+ Audio scheduling and deterministic PCM processing primitives for AelionSDK.
4
4
 
5
- Install with `npm install @aelionsdk/audio@next`.
5
+ ## Install
6
6
 
7
- Version 1.0.0-rc.1 is a prerelease and its API may change before the first stable release. This package is part of [AelionSDK](https://github.com/FoyonaCZY/AelionSDK); see the repository README for supported browsers, examples and deployment requirements.
7
+ ```bash
8
+ npm install @aelionsdk/audio@next
9
+ ```
10
+
11
+ `next` currently resolves to `1.2.0-rc.1`. Product applications should prefer
12
+ `@aelionsdk/sdk`; use this package directly when building a custom audio host,
13
+ analysis pipeline or renderer integration.
14
+
15
+ ## Public surface
16
+
17
+ - IR audio mixing and channel matrices;
18
+ - streaming resampling and pitch-preserving time stretch;
19
+ - SharedArrayBuffer and transferable PCM queues;
20
+ - AudioWorklet clocks, device state and video scheduling.
21
+
22
+ Queue and clock instances own browser and buffer resources. Stop producers,
23
+ cancel pending work and dispose the owning session or primitive when playback
24
+ ends.
25
+
26
+ See the [package map](https://foyonaczy.github.io/AelionSDK/reference/packages/)
27
+ and [API reference](https://foyonaczy.github.io/AelionSDK/api/aelionsdk/audio/overview/).
28
+ Licensed under MIT.
@@ -0,0 +1,58 @@
1
+ /** A bounded PCM source for offline analysis, mirroring the waveform readFrames contract. */
2
+ export interface AnalysisSource {
3
+ readonly sampleRate: number;
4
+ readonly channelCount: number;
5
+ readonly totalFrames: number;
6
+ readonly readFrames: (startFrame: number, frameCount: number, signal?: AbortSignal) => Promise<Float32Array>;
7
+ readonly signal?: AbortSignal;
8
+ readonly onProgress?: (progress: number) => void;
9
+ }
10
+ /** A single detected beat. */
11
+ export interface BeatMarker {
12
+ /** Beat start frame. */
13
+ readonly frame: number;
14
+ /** Frame-based duration (estimated from the analysis window). */
15
+ readonly frameCount: number;
16
+ /** Normalized beat strength, 0..1. */
17
+ readonly strength: number;
18
+ }
19
+ /** Result of beat detection over a PCM source. */
20
+ export interface BeatDetectionResult {
21
+ readonly sampleRate: number;
22
+ readonly totalFrames: number;
23
+ readonly beats: readonly BeatMarker[];
24
+ }
25
+ /** A single detected scene boundary. */
26
+ export interface SceneBoundary {
27
+ /** Frame where the scene change is detected. */
28
+ readonly frame: number;
29
+ /** Normalized change magnitude, 0..1. */
30
+ readonly magnitude: number;
31
+ }
32
+ /** Result of scene-boundary detection over a PCM source. */
33
+ export interface SceneDetectionResult {
34
+ readonly sampleRate: number;
35
+ readonly totalFrames: number;
36
+ readonly scenes: readonly SceneBoundary[];
37
+ }
38
+ /**
39
+ * Detect beats from an interleaved PCM source using a bounded energy-envelope
40
+ * onset detector. The signal is processed in fixed windows, computing a local
41
+ * RMS envelope; an onset is flagged where the envelope rises above the local
42
+ * noise floor by `minimumOnsetDb`. Bounded memory: only the current window and
43
+ * a rolling floor are retained.
44
+ */
45
+ export declare function detectBeats(options: AnalysisSource & {
46
+ readonly minimumOnsetDb?: number;
47
+ }): Promise<BeatDetectionResult>;
48
+ /**
49
+ * Detect scene boundaries as audio-energy discontinuities. A scene change in
50
+ * video is usually accompanied by an abrupt change in the audio envelope, so a
51
+ * large window-to-window energy jump is reported as a candidate boundary.
52
+ * This is a deterministic, media-agnostic approximation driven by the same
53
+ * readFrames source; it does not inspect video pixels.
54
+ */
55
+ export declare function detectScenes(options: AnalysisSource & {
56
+ readonly minimumJumpDb?: number;
57
+ }): Promise<SceneDetectionResult>;
58
+ //# sourceMappingURL=analysis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analysis.d.ts","sourceRoot":"","sources":["../src/analysis.ts"],"names":[],"mappings":"AAEA,6FAA6F;AAC7F,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,CACnB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,WAAW,KACjB,OAAO,CAAC,YAAY,CAAC,CAAC;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CAClD;AAED,8BAA8B;AAC9B,MAAM,WAAW,UAAU;IACzB,wBAAwB;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,iEAAiE;IACjE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,sCAAsC;IACtC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,kDAAkD;AAClD,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,CAAC;CACvC;AAED,wCAAwC;AACxC,MAAM,WAAW,aAAa;IAC5B,gDAAgD;IAChD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,yCAAyC;IACzC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,4DAA4D;AAC5D,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,SAAS,aAAa,EAAE,CAAC;CAC3C;AAID;;;;;;GAMG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,cAAc,GAAG;IAAE,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7D,OAAO,CAAC,mBAAmB,CAAC,CAgC9B;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,cAAc,GAAG;IAAE,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5D,OAAO,CAAC,oBAAoB,CAAC,CA6B/B"}
@@ -0,0 +1,81 @@
1
+ import { throwIfAborted } from '@aelionsdk/core';
2
+ const MIN_CHANGE_DB = 6;
3
+ /**
4
+ * Detect beats from an interleaved PCM source using a bounded energy-envelope
5
+ * onset detector. The signal is processed in fixed windows, computing a local
6
+ * RMS envelope; an onset is flagged where the envelope rises above the local
7
+ * noise floor by `minimumOnsetDb`. Bounded memory: only the current window and
8
+ * a rolling floor are retained.
9
+ */
10
+ export async function detectBeats(options) {
11
+ const sampleRate = options.sampleRate;
12
+ const channelCount = options.channelCount;
13
+ const totalFrames = options.totalFrames;
14
+ const minimumOnsetDb = options.minimumOnsetDb ?? MIN_CHANGE_DB;
15
+ const windowFrames = Math.max(1, Math.round(sampleRate / 20));
16
+ const beats = [];
17
+ let previousDb = 0;
18
+ let floor = 0;
19
+ let lastBeatFrame = -windowFrames;
20
+ for (let startFrame = 0; startFrame < totalFrames; startFrame += windowFrames) {
21
+ throwIfAborted(options.signal, 'Beat detection');
22
+ const frameCount = Math.min(windowFrames, totalFrames - startFrame);
23
+ const pcm = await options.readFrames(startFrame, frameCount, options.signal);
24
+ if (pcm.length !== frameCount * channelCount) {
25
+ throw new RangeError('Beat source returned an unexpected PCM length');
26
+ }
27
+ let squares = 0;
28
+ for (const sample of pcm)
29
+ squares += sample * sample;
30
+ const envelope = Math.sqrt(squares / Math.max(1, frameCount * channelCount));
31
+ const db = 20 * Math.log10(Math.max(1e-9, envelope));
32
+ floor = floor === 0 ? db : Math.max(-120, floor * 0.95 + db * 0.05);
33
+ const onset = db - floor > minimumOnsetDb && db > previousDb;
34
+ if (onset && startFrame - lastBeatFrame >= windowFrames) {
35
+ const strength = Math.min(1, Math.max(0, (db - floor) / 24));
36
+ beats.push({ frame: startFrame, frameCount: windowFrames, strength });
37
+ lastBeatFrame = startFrame;
38
+ }
39
+ previousDb = db;
40
+ options.onProgress?.((startFrame + frameCount) / totalFrames);
41
+ }
42
+ return { sampleRate, totalFrames, beats };
43
+ }
44
+ /**
45
+ * Detect scene boundaries as audio-energy discontinuities. A scene change in
46
+ * video is usually accompanied by an abrupt change in the audio envelope, so a
47
+ * large window-to-window energy jump is reported as a candidate boundary.
48
+ * This is a deterministic, media-agnostic approximation driven by the same
49
+ * readFrames source; it does not inspect video pixels.
50
+ */
51
+ export async function detectScenes(options) {
52
+ const sampleRate = options.sampleRate;
53
+ const channelCount = options.channelCount;
54
+ const totalFrames = options.totalFrames;
55
+ const minimumJumpDb = options.minimumJumpDb ?? MIN_CHANGE_DB;
56
+ const windowFrames = Math.max(1, Math.round(sampleRate / 10));
57
+ const scenes = [];
58
+ let previousDb = 0;
59
+ for (let startFrame = 0; startFrame < totalFrames; startFrame += windowFrames) {
60
+ throwIfAborted(options.signal, 'Scene detection');
61
+ const frameCount = Math.min(windowFrames, totalFrames - startFrame);
62
+ const pcm = await options.readFrames(startFrame, frameCount, options.signal);
63
+ if (pcm.length !== frameCount * channelCount) {
64
+ throw new RangeError('Scene source returned an unexpected PCM length');
65
+ }
66
+ let squares = 0;
67
+ for (const sample of pcm)
68
+ squares += sample * sample;
69
+ const envelope = Math.sqrt(squares / Math.max(1, frameCount * channelCount));
70
+ const db = 20 * Math.log10(Math.max(1e-9, envelope));
71
+ if (startFrame > 0) {
72
+ const jump = Math.abs(db - previousDb);
73
+ if (jump >= minimumJumpDb) {
74
+ scenes.push({ frame: startFrame, magnitude: Math.min(1, jump / 24) });
75
+ }
76
+ }
77
+ previousDb = db;
78
+ options.onProgress?.((startFrame + frameCount) / totalFrames);
79
+ }
80
+ return { sampleRate, totalFrames, scenes };
81
+ }
package/dist/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  export * from './ir-mixer.js';
2
2
  export * from './processing.js';
3
+ export * from './analysis.js';
3
4
  export * from './pcm-ring.js';
4
5
  export * from './worklet-clock.js';
5
6
  export * from './video-scheduler.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC;AAChD,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC;AAChD,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC"}
package/dist/index.js CHANGED
@@ -1,5 +1,6 @@
1
1
  export * from './ir-mixer.js';
2
2
  export * from './processing.js';
3
+ export * from './analysis.js';
3
4
  export * from './pcm-ring.js';
4
5
  export * from './worklet-clock.js';
5
6
  export * from './video-scheduler.js';
@@ -0,0 +1,3 @@
1
+ export declare function positiveInteger(value: number, name: string): void;
2
+ export declare function concat(left: Float32Array, right: Float32Array): Float32Array;
3
+ //# sourceMappingURL=pcm-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pcm-utils.d.ts","sourceRoot":"","sources":["../src/pcm-utils.ts"],"names":[],"mappings":"AAAA,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAIjE;AAED,wBAAgB,MAAM,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,GAAG,YAAY,CAO5E"}
@@ -0,0 +1,15 @@
1
+ export function positiveInteger(value, name) {
2
+ if (!Number.isSafeInteger(value) || value <= 0) {
3
+ throw new RangeError(`${name} must be a positive safe integer`);
4
+ }
5
+ }
6
+ export function concat(left, right) {
7
+ if (left.length === 0)
8
+ return right.slice();
9
+ if (right.length === 0)
10
+ return left;
11
+ const result = new Float32Array(left.length + right.length);
12
+ result.set(left);
13
+ result.set(right, left.length);
14
+ return result;
15
+ }
@@ -76,6 +76,7 @@ export interface BuildWaveformPeaksOptions {
76
76
  readonly onProgress?: (progress: number) => void;
77
77
  }
78
78
  export declare function buildWaveformPeaks(options: BuildWaveformPeaksOptions): Promise<WaveformPeakResult>;
79
+ /** A contiguous range of audio frames. */
79
80
  export interface AudioFrameRange {
80
81
  readonly startFrame: number;
81
82
  readonly frameCount: number;
@@ -1 +1 @@
1
- {"version":3,"file":"processing.d.ts","sourceRoot":"","sources":["../src/processing.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"processing.d.ts","sourceRoot":"","sources":["../src/processing.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"resampler.d.ts","sourceRoot":"","sources":["../src/resampler.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAiBD;;;;;;;GAOG;AACH,qBAAa,qBAAqB;;gBAUb,OAAO,EAAE,4BAA4B;IAUxD,IAAW,WAAW,IAAI,MAAM,CAE/B;IAED,IAAW,YAAY,IAAI,MAAM,CAEhC;IAEM,IAAI,CAAC,WAAW,EAAE,YAAY,EAAE,KAAK,UAAQ,GAAG,YAAY;CAyDpE;AAED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,YAAY,EACnB,OAAO,EAAE,4BAA4B,GACpC,YAAY,CAEd"}
1
+ {"version":3,"file":"resampler.d.ts","sourceRoot":"","sources":["../src/resampler.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAED;;;;;;;GAOG;AACH,qBAAa,qBAAqB;;gBAUb,OAAO,EAAE,4BAA4B;IAUxD,IAAW,WAAW,IAAI,MAAM,CAE/B;IAED,IAAW,YAAY,IAAI,MAAM,CAEhC;IAEM,IAAI,CAAC,WAAW,EAAE,YAAY,EAAE,KAAK,UAAQ,GAAG,YAAY;CAyDpE;AAED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,YAAY,EACnB,OAAO,EAAE,4BAA4B,GACpC,YAAY,CAEd"}
package/dist/resampler.js CHANGED
@@ -1,18 +1,4 @@
1
- function positiveInteger(value, name) {
2
- if (!Number.isSafeInteger(value) || value <= 0) {
3
- throw new RangeError(`${name} must be a positive safe integer`);
4
- }
5
- }
6
- function concat(left, right) {
7
- if (left.length === 0)
8
- return right.slice();
9
- if (right.length === 0)
10
- return left;
11
- const result = new Float32Array(left.length + right.length);
12
- result.set(left);
13
- result.set(right, left.length);
14
- return result;
15
- }
1
+ import { concat, positiveInteger } from './pcm-utils.js';
16
2
  /**
17
3
  * Deterministic, chunk-boundary-independent linear PCM resampler.
18
4
  *
@@ -1 +1 @@
1
- {"version":3,"file":"time-stretch.d.ts","sourceRoot":"","sources":["../src/time-stretch.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iCAAiC;IAChD,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,gFAAgF;IAChF,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,0CAA0C;IACzD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAiBD;;;;;;;GAOG;AACH,qBAAa,mCAAmC;;gBAiB3B,OAAO,EAAE,0CAA0C;IAkB/D,IAAI,CAAC,WAAW,EAAE,YAAY,EAAE,KAAK,UAAQ,GAAG,YAAY;CAmHpE;AAED,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,iCAAiC,GACzC,YAAY,CAwBd"}
1
+ {"version":3,"file":"time-stretch.d.ts","sourceRoot":"","sources":["../src/time-stretch.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,iCAAiC;IAChD,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,gFAAgF;IAChF,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,0CAA0C;IACzD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED;;;;;;;GAOG;AACH,qBAAa,mCAAmC;;gBAiB3B,OAAO,EAAE,0CAA0C;IAkB/D,IAAI,CAAC,WAAW,EAAE,YAAY,EAAE,KAAK,UAAQ,GAAG,YAAY;CAmHpE;AAED,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,iCAAiC,GACzC,YAAY,CAwBd"}
@@ -1,18 +1,4 @@
1
- function positiveInteger(value, name) {
2
- if (!Number.isSafeInteger(value) || value <= 0) {
3
- throw new RangeError(`${name} must be a positive safe integer`);
4
- }
5
- }
6
- function concat(left, right) {
7
- if (left.length === 0)
8
- return right.slice();
9
- if (right.length === 0)
10
- return left;
11
- const result = new Float32Array(left.length + right.length);
12
- result.set(left);
13
- result.set(right, left.length);
14
- return result;
15
- }
1
+ import { concat, positiveInteger } from './pcm-utils.js';
16
2
  /**
17
3
  * Stateful deterministic synchronous overlap-add time stretch.
18
4
  *
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aelionsdk/audio",
3
- "version": "1.0.0-rc.1",
3
+ "version": "1.2.0-rc.1",
4
4
  "description": "AudioWorklet clock, PCM buffering and audio mixing for AelionSDK",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -27,15 +27,15 @@
27
27
  "!dist/.tsbuildinfo"
28
28
  ],
29
29
  "engines": {
30
- "node": ">=20.19"
30
+ "node": ">=24 <25"
31
31
  },
32
32
  "publishConfig": {
33
33
  "access": "public",
34
34
  "provenance": true
35
35
  },
36
36
  "dependencies": {
37
- "@aelionsdk/core": "1.0.0-rc.1",
38
- "@aelionsdk/render-ir": "1.0.0-rc.1"
37
+ "@aelionsdk/core": "1.2.0-rc.1",
38
+ "@aelionsdk/render-ir": "1.2.0-rc.1"
39
39
  },
40
40
  "scripts": {
41
41
  "build": "tsc -b",