@viji-dev/core 0.7.0 → 0.7.5

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.
@@ -1,4 +1,4 @@
1
- import { g as kn } from "./index-BCIUaaLW.js";
1
+ import { g as kn } from "./index-B1JJ8Mko.js";
2
2
  function jn(Oe, ot) {
3
3
  for (var ve = 0; ve < ot.length; ve++) {
4
4
  const Z = ot[ve];
@@ -3374,4 +3374,4 @@ const xn = /* @__PURE__ */ kn(yi), Ln = /* @__PURE__ */ jn({
3374
3374
  export {
3375
3375
  Ln as e
3376
3376
  };
3377
- //# sourceMappingURL=essentia-wasm.web-iwIx5LHu.js.map
3377
+ //# sourceMappingURL=essentia-wasm.web-Bh9tTilM.js.map
@@ -536,7 +536,7 @@ class DB {
536
536
  }
537
537
  }
538
538
  }
539
- const oB = "" + new URL("assets/viji.worker-sMAb5DcQ.js", import.meta.url).href, hB = new URL("assets/wasm/vision_wasm_internal.js", import.meta.url).href, RB = new URL("assets/wasm/vision_wasm_internal.wasm", import.meta.url).href, wB = new URL("assets/wasm/vision_wasm_nosimd_internal.js", import.meta.url).href, sB = new URL("assets/wasm/vision_wasm_nosimd_internal.wasm", import.meta.url).href;
539
+ const oB = "" + new URL("assets/viji.worker-CXp6CGrq.js", import.meta.url).href, hB = new URL("assets/wasm/vision_wasm_internal.js", import.meta.url).href, RB = new URL("assets/wasm/vision_wasm_internal.wasm", import.meta.url).href, wB = new URL("assets/wasm/vision_wasm_nosimd_internal.js", import.meta.url).href, sB = new URL("assets/wasm/vision_wasm_nosimd_internal.wasm", import.meta.url).href;
540
540
  class FB {
541
541
  constructor(A, B, I) {
542
542
  this.iframeManager = A, this.sceneCode = B, this.init = I;
@@ -1520,7 +1520,7 @@ class YB {
1520
1520
  if (!this.isInitialized)
1521
1521
  return this.initPromise ? this.initPromise : (this.initPromise = (async () => {
1522
1522
  try {
1523
- const A = await import("./essentia.js-core.es-CC_3Ap1i.js"), B = await import("./essentia-wasm.web-iwIx5LHu.js").then((g) => g.e), I = A.Essentia || A.default?.Essentia || A.default;
1523
+ const A = await import("./essentia.js-core.es-CC_3Ap1i.js"), B = await import("./essentia-wasm.web-Bh9tTilM.js").then((g) => g.e), I = A.Essentia || A.default?.Essentia || A.default;
1524
1524
  let Q = B.default || B.EssentiaWASM || B.default?.EssentiaWASM;
1525
1525
  if (!Q)
1526
1526
  throw new Error("WASM module not found - check essentia-wasm.web.js export");
@@ -8398,7 +8398,7 @@ function DI(R) {
8398
8398
  expectedVersion: 1
8399
8399
  } : typeof A.senderTime != "number" ? { code: "invalid-field", details: "senderTime must be a number", field: "senderTime" } : null;
8400
8400
  }
8401
- const oI = "0.7.0";
8401
+ const oI = "0.7.4";
8402
8402
  export {
8403
8403
  yA as A,
8404
8404
  oI as V,
@@ -8406,4 +8406,4 @@ export {
8406
8406
  S as b,
8407
8407
  vB as g
8408
8408
  };
8409
- //# sourceMappingURL=index-BCIUaaLW.js.map
8409
+ //# sourceMappingURL=index-B1JJ8Mko.js.map
package/dist/index.d.ts CHANGED
@@ -1111,15 +1111,25 @@ declare interface FaceBlendshapes {
1111
1111
  }
1112
1112
 
1113
1113
  /**
1114
- * One detected face produced by the video CV pipeline. Always carries `id`,
1115
- * `bounds`, `center`, and `confidence`; the rest is populated only when the
1116
- * matching CV feature is enabled (face mesh for `landmarks` and `headPose`,
1117
- * emotion detection for `expressions` and `blendshapes`).
1114
+ * One detected face produced by the video CV pipeline. Each field is
1115
+ * populated only by its source model; fields whose source model is not
1116
+ * enabled read as `null` so the absence is loud rather than silent. Enable
1117
+ * the relevant `enable*` verb on `viji.video.cv` to populate each group:
1118
+ *
1119
+ * - `bounds`, `center`, `confidence`: populated by `enableFaceDetection(true)`.
1120
+ * - `landmarks`: populated by `enableFaceMesh(true)` (empty array otherwise).
1121
+ * - `headPose`: populated by `enableFaceMesh(true)`.
1122
+ * - `blendshapes`, `expressions`: populated by `enableEmotionDetection(true)`.
1123
+ *
1124
+ * If a field is `null`, call the corresponding `enable*` verb on
1125
+ * `viji.video.cv` to populate it. Each active CV feature consumes its own
1126
+ * WebGL context for MediaPipe; enabling many at once on lower-end hardware
1127
+ * can hit context limits.
1118
1128
  */
1119
1129
  export declare interface FaceData {
1120
1130
  /** Index-based face identifier (`0`, `1`, …). Stable within a single frame, may change between frames. */
1121
1131
  id: number;
1122
- /** Bounding box, all components normalized to 0..1 of the source frame. */
1132
+ /** Bounding box, all components normalized to 0..1 of the source frame. `null` unless face detection is enabled. */
1123
1133
  bounds: {
1124
1134
  /** Left edge of the face bounding box, normalized 0..1. */
1125
1135
  x: number;
@@ -1129,16 +1139,16 @@ export declare interface FaceData {
1129
1139
  width: number;
1130
1140
  /** Height of the face bounding box, normalized 0..1. */
1131
1141
  height: number;
1132
- };
1133
- /** Center of the bounding box, normalized 0..1. */
1142
+ } | null;
1143
+ /** Center of the bounding box, normalized 0..1. `null` unless face detection is enabled. */
1134
1144
  center: {
1135
1145
  /** Horizontal center of the face, normalized 0..1. */
1136
1146
  x: number;
1137
1147
  /** Vertical center of the face, normalized 0..1. */
1138
1148
  y: number;
1139
- };
1140
- /** Detection confidence in 0..1. */
1141
- confidence: number;
1149
+ } | null;
1150
+ /** Detection confidence in 0..1. `null` unless face detection is enabled. */
1151
+ confidence: number | null;
1142
1152
  /** 468 normalized face mesh landmarks when face mesh is enabled; empty array otherwise. */
1143
1153
  landmarks: {
1144
1154
  /** Horizontal landmark coordinate, normalized 0..1. */
@@ -1148,7 +1158,16 @@ export declare interface FaceData {
1148
1158
  /** Optional depth (relative). */
1149
1159
  z?: number;
1150
1160
  }[];
1151
- /** Seven expression confidence scores in 0..1. All zero unless emotion detection is enabled. */
1161
+ /** Estimated head rotation in degrees. `null` unless face mesh is enabled. */
1162
+ headPose: {
1163
+ /** Up/down rotation in degrees (-90..90). Positive = head looking up, negative = looking down. */
1164
+ pitch: number;
1165
+ /** Left/right rotation in degrees (-90..90). Positive = head turned to the subject's right, negative = to the left. */
1166
+ yaw: number;
1167
+ /** Tilt rotation in degrees (-180..180). Positive = head tilted to the subject's right (right ear toward right shoulder). */
1168
+ roll: number;
1169
+ } | null;
1170
+ /** Seven expression confidence scores in 0..1. `null` unless emotion detection is enabled. */
1152
1171
  expressions: {
1153
1172
  /** Confidence (0..1) of a neutral expression. */
1154
1173
  neutral: number;
@@ -1164,18 +1183,9 @@ export declare interface FaceData {
1164
1183
  disgusted: number;
1165
1184
  /** Confidence (0..1) of a fearful expression. */
1166
1185
  fearful: number;
1167
- };
1168
- /** Estimated head rotation. All zero unless face mesh is enabled. */
1169
- headPose: {
1170
- /** Up/down rotation in degrees (-90..90). Positive = head looking up, negative = looking down. */
1171
- pitch: number;
1172
- /** Left/right rotation in degrees (-90..90). Positive = head turned to the subject's right, negative = to the left. */
1173
- yaw: number;
1174
- /** Tilt rotation in degrees (-180..180). Positive = head tilted to the subject's right (right ear toward right shoulder). */
1175
- roll: number;
1176
- };
1177
- /** 52 ARKit-compatible facial muscle coefficients. All zero unless emotion detection is enabled. */
1178
- blendshapes: FaceBlendshapes;
1186
+ } | null;
1187
+ /** 52 ARKit-compatible facial muscle coefficients. `null` unless emotion detection is enabled. */
1188
+ blendshapes: FaceBlendshapes | null;
1179
1189
  }
1180
1190
 
1181
1191
  declare interface FrameRateInfo {
@@ -1711,6 +1721,10 @@ export declare type Resolution = {
1711
1721
  * inspection, a per-argument byte cap (`consoleArgMaxBytes`), and an argument
1712
1722
  * count cap (`consoleMaxArgsPerCall`). High-cardinality logs are rate-limited
1713
1723
  * by `consoleMaxUniqueSignaturesPerSecond`.
1724
+ *
1725
+ * Coalescing semantics match `SceneRuntimeError`: `count` and `firstSeenAt`
1726
+ * are cumulative for the scene session (monotonically non-decreasing across
1727
+ * coalescing windows), reset only when the worker terminates.
1714
1728
  */
1715
1729
  export declare interface SceneConsoleMessage {
1716
1730
  /** Console method invoked. */
@@ -1719,9 +1733,19 @@ export declare interface SceneConsoleMessage {
1719
1733
  args: string[];
1720
1734
  /** Stable hash of `level` and the stringified arguments, used for coalescing. */
1721
1735
  signatureHash: string;
1722
- /** Number of occurrences of this signature accumulated in the current window. */
1736
+ /**
1737
+ * Cumulative number of occurrences of this signature since it was first
1738
+ * seen in this scene session. Monotonically non-decreasing across
1739
+ * coalescing windows; each fire carries the up-to-date total. Consumers
1740
+ * that maintain a per-signature view should REPLACE their stored count
1741
+ * with this value on each fire, not add to it.
1742
+ */
1723
1743
  count: number;
1724
- /** Millisecond timestamp of the first occurrence of this signature in the current window. */
1744
+ /**
1745
+ * Millisecond timestamp of the FIRST occurrence of this signature in this
1746
+ * scene session. Set once and unchanged for every subsequent fire of the
1747
+ * same signature.
1748
+ */
1725
1749
  firstSeenAt: number;
1726
1750
  /** Millisecond timestamp of the most recent occurrence. */
1727
1751
  lastSeenAt: number;
@@ -1749,9 +1773,15 @@ export declare type SceneErrorCode = 'SCENE_CODE_ERROR' | 'RENDER_ERROR' | 'UNCA
1749
1773
  /**
1750
1774
  * Structured scene runtime error envelope surfaced via `VijiCore.onSceneRuntimeError`.
1751
1775
  *
1752
- * Identical signatures are coalesced inside the worker: the first occurrence in
1753
- * a window fires with `count: 1`, subsequent occurrences increment `count`, and
1754
- * a trailing rollup fires at window close if more than one occurrence was seen.
1776
+ * Identical signatures are coalesced inside the worker. The first ever
1777
+ * occurrence of a signature in this scene session fires immediately with
1778
+ * `count: 1`; further occurrences within the coalescing window are absorbed
1779
+ * silently and emitted as a single trailing rollup with the up-to-date
1780
+ * cumulative count at window close. Subsequent bursts of the same signature
1781
+ * refire a leading edge with the up-to-date cumulative count and re-arm the
1782
+ * rollup timer. `count` and `firstSeenAt` are cumulative for the scene
1783
+ * session — they persist across coalescing windows and are reset only when
1784
+ * the worker terminates (scene teardown).
1755
1785
  *
1756
1786
  * The host-side `console.error('Scene error:', data)` tee continues to fire
1757
1787
  * alongside the listener (never silenced based on listener presence).
@@ -1775,9 +1805,20 @@ export declare interface SceneRuntimeError {
1775
1805
  code: SceneErrorCode;
1776
1806
  /** Stable hash of `message` and the first artist stack frame, used for coalescing. */
1777
1807
  signatureHash: string;
1778
- /** Number of occurrences of this signature accumulated in the current window. */
1808
+ /**
1809
+ * Cumulative number of occurrences of this signature since it was first
1810
+ * seen in this scene session. Monotonically non-decreasing across
1811
+ * coalescing windows; each fire carries the up-to-date total. Consumers
1812
+ * that maintain a per-signature view should REPLACE their stored count
1813
+ * with this value on each fire, not add to it.
1814
+ */
1779
1815
  count: number;
1780
- /** Millisecond timestamp of the first occurrence of this signature in the current window. */
1816
+ /**
1817
+ * Millisecond timestamp of the FIRST occurrence of this signature in this
1818
+ * scene session. Set once and unchanged for every subsequent fire of the
1819
+ * same signature — `Date.now() - firstSeenAt` is the lifetime of the
1820
+ * signature in this session, useful for chronicity reasoning.
1821
+ */
1781
1822
  firstSeenAt: number;
1782
1823
  /** Millisecond timestamp of the most recent occurrence. */
1783
1824
  lastSeenAt: number;
@@ -2368,7 +2409,7 @@ declare type TrackingState = 'TRACKING' | 'LOCKED' | 'BREAKDOWN' | 'LOST';
2368
2409
  /** Returned by `on*` listener registration calls; invoke to unsubscribe. */
2369
2410
  export declare type Unsubscribe = () => void;
2370
2411
 
2371
- export declare const VERSION = "0.7.0";
2412
+ export declare const VERSION = "0.7.4";
2372
2413
 
2373
2414
  /**
2374
2415
  * Real-time video API: drawable frame, dimensions, and the source-side
@@ -2477,35 +2518,73 @@ export declare interface VideoCVAPI {
2477
2518
  /** Body segmentation mask, or `null` when segmentation is off. */
2478
2519
  segmentation: SegmentationData | null;
2479
2520
  /**
2480
- * Toggle face detection (bounding box, center, confidence, id).
2521
+ * Toggle face detection. Populates `face.bounds`, `face.center`,
2522
+ * `face.confidence` on each detected face. Independent of face mesh and
2523
+ * emotion detection.
2524
+ *
2525
+ * Safe to call from module scope as well as from inside `render()`. The
2526
+ * verb is idempotent and reference-counted; per-frame calls inside
2527
+ * `render()` (the canonical toggle-gated pattern) are cheap.
2528
+ *
2481
2529
  * @returns Resolves once the underlying pipeline has finished switching.
2482
2530
  */
2483
2531
  enableFaceDetection(enabled: boolean): Promise<void>;
2484
2532
  /**
2485
- * Toggle 468-point face mesh + head pose (`pitch`, `yaw`, `roll`). Implies
2486
- * face detection.
2533
+ * Toggle 468-point face mesh and computed head pose (`pitch`, `yaw`,
2534
+ * `roll`). Populates `face.landmarks` and `face.headPose` on the face
2535
+ * entry. Does NOT populate `face.bounds` / `face.center` / `face.confidence`
2536
+ * — those are produced only by face detection. Enable both if you need
2537
+ * both, or compute bounds from `face.landmarks` min/max yourself.
2538
+ *
2539
+ * Safe to call from module scope as well as from inside `render()`. The
2540
+ * verb is idempotent and reference-counted.
2541
+ *
2487
2542
  * @returns Resolves once the pipeline has finished switching.
2488
2543
  */
2489
2544
  enableFaceMesh(enabled: boolean): Promise<void>;
2490
2545
  /**
2491
2546
  * Toggle 7 expressions + 52 ARKit blendshape coefficients on each face.
2492
- * Implies face mesh.
2547
+ * Populates `face.blendshapes` and `face.expressions`. Internally requires
2548
+ * the face landmarker model (loads it alongside `enableFaceMesh` if both
2549
+ * are enabled; loads it on its own otherwise so `face.landmarks` and
2550
+ * `face.headPose` are also populated). Does NOT populate
2551
+ * `face.bounds` / `face.center` / `face.confidence` — enable face
2552
+ * detection for those.
2553
+ *
2554
+ * Safe to call from module scope as well as from inside `render()`. The
2555
+ * verb is idempotent and reference-counted.
2556
+ *
2493
2557
  * @returns Resolves once the pipeline has finished switching.
2494
2558
  */
2495
2559
  enableEmotionDetection(enabled: boolean): Promise<void>;
2496
2560
  /**
2497
- * Toggle 21-point hand landmarks + ML-classified gesture confidences for up
2498
- * to two hands.
2561
+ * Toggle 21-point hand landmarks and ML-classified gesture confidences
2562
+ * for up to two hands. Populates `viji.video.cv.hands[]` with `landmarks`,
2563
+ * `palm`, `bounds` (computed from landmarks), and `gestures`.
2564
+ *
2565
+ * Safe to call from module scope as well as from inside `render()`. The
2566
+ * verb is idempotent and reference-counted.
2567
+ *
2499
2568
  * @returns Resolves once the pipeline has finished switching.
2500
2569
  */
2501
2570
  enableHandTracking(enabled: boolean): Promise<void>;
2502
2571
  /**
2503
2572
  * Toggle 33-point BlazePose body landmarks (face / torso / arms / legs).
2573
+ * Populates `viji.video.cv.pose`.
2574
+ *
2575
+ * Safe to call from module scope as well as from inside `render()`. The
2576
+ * verb is idempotent and reference-counted.
2577
+ *
2504
2578
  * @returns Resolves once the pipeline has finished switching.
2505
2579
  */
2506
2580
  enablePoseDetection(enabled: boolean): Promise<void>;
2507
2581
  /**
2508
- * Toggle per-pixel person/background segmentation mask.
2582
+ * Toggle per-pixel person/background segmentation mask. Populates
2583
+ * `viji.video.cv.segmentation`.
2584
+ *
2585
+ * Safe to call from module scope as well as from inside `render()`. The
2586
+ * verb is idempotent and reference-counted.
2587
+ *
2509
2588
  * @returns Resolves once the pipeline has finished switching.
2510
2589
  */
2511
2590
  enableBodySegmentation(enabled: boolean): Promise<void>;
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { A as a, V as i, a as s, b as e } from "./index-BCIUaaLW.js";
1
+ import { A as a, V as i, a as s, b as e } from "./index-B1JJ8Mko.js";
2
2
  export {
3
3
  a as AudioSystem,
4
4
  i as VERSION,
package/package.json CHANGED
@@ -1,100 +1,100 @@
1
- {
2
- "name": "@viji-dev/core",
3
- "version": "0.7.0",
4
- "description": "Universal execution engine for Viji Creative scenes",
5
- "type": "module",
6
- "main": "./dist/index.js",
7
- "module": "./dist/index.js",
8
- "types": "./dist/index.d.ts",
9
- "exports": {
10
- ".": {
11
- "import": "./dist/index.js",
12
- "types": "./dist/index.d.ts"
13
- },
14
- "./artist-global": {
15
- "types": "./dist/artist-global.d.ts"
16
- },
17
- "./artist-dts": {
18
- "import": "./dist/artist-dts.js",
19
- "types": "./dist/artist-dts.d.ts"
20
- },
21
- "./artist-jsdoc": {
22
- "types": "./dist/artist-jsdoc.d.ts"
23
- },
24
- "./artist-js-ambient": {
25
- "types": "./dist/artist-js-ambient.d.ts"
26
- },
27
- "./artist-dts-p5": {
28
- "import": "./dist/artist-dts-p5.js",
29
- "types": "./dist/artist-dts-p5.d.ts"
30
- },
31
- "./artist-global-p5": {
32
- "types": "./dist/artist-global-p5.d.ts"
33
- },
34
- "./shader-uniforms": {
35
- "import": "./dist/shader-uniforms.js",
36
- "types": "./dist/shader-uniforms.d.ts"
37
- },
38
- "./docs-api": {
39
- "import": "./dist/docs-api.js",
40
- "types": "./dist/docs-api.d.ts"
41
- }
42
- },
43
- "files": [
44
- "dist/*.js",
45
- "dist/*.d.ts",
46
- "dist/assets",
47
- "!dist/**/*.map",
48
- "README.md"
49
- ],
50
- "scripts": {
51
- "prebuild": "node scripts/prebuild-clean.mjs",
52
- "build": "vite build && node scripts/copy-tasks-assets.mjs && node scripts/build-artist-types.mjs && node scripts/build-docs-api.mjs",
53
- "build:docs": "node scripts/build-docs-api.mjs",
54
- "lint:ai-prompts-drift": "node scripts/lint-ai-prompts-drift.mjs",
55
- "dev": "vite build --watch",
56
- "integration": "vite --config integration-example/vite.config.ts",
57
- "test": "vitest",
58
- "test:coverage": "vitest --coverage",
59
- "type-check": "tsc --noEmit",
60
- "lint": "eslint src --ext .ts"
61
- },
62
- "keywords": [
63
- "viji",
64
- "creative",
65
- "webgl",
66
- "audio-reactive",
67
- "canvas",
68
- "webworker"
69
- ],
70
- "author": "Viji Team",
71
- "license": "SEE LICENSE IN LICENSE",
72
- "devDependencies": {
73
- "@types/node": "^20.0.0",
74
- "@types/p5": "^1.7.6",
75
- "@typescript-eslint/eslint-plugin": "^6.0.0",
76
- "@typescript-eslint/parser": "^6.0.0",
77
- "@vitest/coverage-v8": "^1.0.0",
78
- "dts-bundle-generator": "^9.5.1",
79
- "eslint": "^8.0.0",
80
- "github-slugger": "^2.0.0",
81
- "happy-dom": "^18.0.1",
82
- "mdast-util-to-string": "^4.0.0",
83
- "remark-parse": "^11.0.0",
84
- "typescript": "^5.0.0",
85
- "unified": "^11.0.5",
86
- "vite": "^5.0.0",
87
- "vite-plugin-dts": "^3.0.0",
88
- "vitest": "^1.0.0"
89
- },
90
- "engines": {
91
- "node": ">=18.0.0"
92
- },
93
- "dependencies": {
94
- "@mediapipe/tasks-vision": "^0.10.20",
95
- "@noble/curves": "^2.2.0",
96
- "essentia.js": "^0.1.3",
97
- "fft.js": "^4.0.4",
98
- "sucrase": "^3.35.1"
99
- }
100
- }
1
+ {
2
+ "name": "@viji-dev/core",
3
+ "version": "0.7.5",
4
+ "description": "Universal execution engine for Viji Creative scenes",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "import": "./dist/index.js",
12
+ "types": "./dist/index.d.ts"
13
+ },
14
+ "./artist-global": {
15
+ "types": "./dist/artist-global.d.ts"
16
+ },
17
+ "./artist-dts": {
18
+ "import": "./dist/artist-dts.js",
19
+ "types": "./dist/artist-dts.d.ts"
20
+ },
21
+ "./artist-jsdoc": {
22
+ "types": "./dist/artist-jsdoc.d.ts"
23
+ },
24
+ "./artist-js-ambient": {
25
+ "types": "./dist/artist-js-ambient.d.ts"
26
+ },
27
+ "./artist-dts-p5": {
28
+ "import": "./dist/artist-dts-p5.js",
29
+ "types": "./dist/artist-dts-p5.d.ts"
30
+ },
31
+ "./artist-global-p5": {
32
+ "types": "./dist/artist-global-p5.d.ts"
33
+ },
34
+ "./shader-uniforms": {
35
+ "import": "./dist/shader-uniforms.js",
36
+ "types": "./dist/shader-uniforms.d.ts"
37
+ },
38
+ "./docs-api": {
39
+ "import": "./dist/docs-api.js",
40
+ "types": "./dist/docs-api.d.ts"
41
+ }
42
+ },
43
+ "files": [
44
+ "dist/*.js",
45
+ "dist/*.d.ts",
46
+ "dist/assets",
47
+ "!dist/**/*.map",
48
+ "README.md"
49
+ ],
50
+ "scripts": {
51
+ "prebuild": "node scripts/prebuild-clean.mjs",
52
+ "build": "vite build && node scripts/copy-tasks-assets.mjs && node scripts/build-artist-types.mjs && node scripts/build-docs-api.mjs",
53
+ "build:docs": "node scripts/build-docs-api.mjs",
54
+ "lint:ai-prompts-drift": "node scripts/lint-ai-prompts-drift.mjs",
55
+ "dev": "vite build --watch",
56
+ "integration": "vite --config integration-example/vite.config.ts",
57
+ "test": "vitest",
58
+ "test:coverage": "vitest --coverage",
59
+ "type-check": "tsc --noEmit",
60
+ "lint": "eslint src --ext .ts"
61
+ },
62
+ "keywords": [
63
+ "viji",
64
+ "creative",
65
+ "webgl",
66
+ "audio-reactive",
67
+ "canvas",
68
+ "webworker"
69
+ ],
70
+ "author": "Viji Team",
71
+ "license": "SEE LICENSE IN LICENSE",
72
+ "devDependencies": {
73
+ "@types/node": "^20.0.0",
74
+ "@types/p5": "^1.7.6",
75
+ "@typescript-eslint/eslint-plugin": "^6.0.0",
76
+ "@typescript-eslint/parser": "^6.0.0",
77
+ "@vitest/coverage-v8": "^1.0.0",
78
+ "dts-bundle-generator": "^9.5.1",
79
+ "eslint": "^8.0.0",
80
+ "github-slugger": "^2.0.0",
81
+ "happy-dom": "^18.0.1",
82
+ "mdast-util-to-string": "^4.0.0",
83
+ "remark-parse": "^11.0.0",
84
+ "typescript": "^5.0.0",
85
+ "unified": "^11.0.5",
86
+ "vite": "^5.0.0",
87
+ "vite-plugin-dts": "^3.0.0",
88
+ "vitest": "^1.0.0"
89
+ },
90
+ "engines": {
91
+ "node": ">=18.0.0"
92
+ },
93
+ "dependencies": {
94
+ "@mediapipe/tasks-vision": "^0.10.20",
95
+ "@noble/curves": "^2.2.0",
96
+ "essentia.js": "^0.1.3",
97
+ "fft.js": "^4.0.4",
98
+ "sucrase": "^3.35.1"
99
+ }
100
+ }