@nexart/codemode-sdk 1.0.1 → 1.1.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.
Files changed (88) hide show
  1. package/CHANGELOG.md +109 -0
  2. package/CODE_MODE_PROTOCOL.md +312 -0
  3. package/README.md +308 -56
  4. package/dist/core-index.d.ts +21 -0
  5. package/dist/core-index.d.ts.map +1 -0
  6. package/dist/core-index.js +26 -0
  7. package/dist/execute.d.ts +46 -0
  8. package/dist/execute.d.ts.map +1 -0
  9. package/dist/execute.js +268 -0
  10. package/dist/index.d.ts +36 -17
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +43 -17
  13. package/dist/loop-engine.d.ts +4 -1
  14. package/dist/loop-engine.d.ts.map +1 -1
  15. package/dist/loop-engine.js +17 -12
  16. package/dist/noise-bridge.d.ts +44 -0
  17. package/dist/noise-bridge.d.ts.map +1 -0
  18. package/dist/noise-bridge.js +68 -0
  19. package/dist/noise-engine.d.ts +74 -0
  20. package/dist/noise-engine.d.ts.map +1 -0
  21. package/dist/noise-engine.js +132 -0
  22. package/dist/noise-sketches/fractalNoise.d.ts +11 -0
  23. package/dist/noise-sketches/fractalNoise.d.ts.map +1 -0
  24. package/dist/noise-sketches/fractalNoise.js +121 -0
  25. package/dist/noise-sketches/index.d.ts +21 -0
  26. package/dist/noise-sketches/index.d.ts.map +1 -0
  27. package/dist/noise-sketches/index.js +28 -0
  28. package/dist/p5-runtime.d.ts +56 -4
  29. package/dist/p5-runtime.d.ts.map +1 -1
  30. package/dist/p5-runtime.js +348 -22
  31. package/dist/sound-bridge.d.ts +89 -0
  32. package/dist/sound-bridge.d.ts.map +1 -0
  33. package/dist/sound-bridge.js +128 -0
  34. package/dist/soundart-engine.d.ts +87 -0
  35. package/dist/soundart-engine.d.ts.map +1 -0
  36. package/dist/soundart-engine.js +173 -0
  37. package/dist/soundart-sketches/chladniBloom.d.ts +3 -0
  38. package/dist/soundart-sketches/chladniBloom.d.ts.map +1 -0
  39. package/dist/soundart-sketches/chladniBloom.js +53 -0
  40. package/dist/soundart-sketches/dualVortex.d.ts +3 -0
  41. package/dist/soundart-sketches/dualVortex.d.ts.map +1 -0
  42. package/dist/soundart-sketches/dualVortex.js +67 -0
  43. package/dist/soundart-sketches/geometryIllusion.d.ts +3 -0
  44. package/dist/soundart-sketches/geometryIllusion.d.ts.map +1 -0
  45. package/dist/soundart-sketches/geometryIllusion.js +89 -0
  46. package/dist/soundart-sketches/index.d.ts +39 -0
  47. package/dist/soundart-sketches/index.d.ts.map +1 -0
  48. package/dist/soundart-sketches/index.js +72 -0
  49. package/dist/soundart-sketches/isoflow.d.ts +3 -0
  50. package/dist/soundart-sketches/isoflow.d.ts.map +1 -0
  51. package/dist/soundart-sketches/isoflow.js +60 -0
  52. package/dist/soundart-sketches/loomWeave.d.ts +3 -0
  53. package/dist/soundart-sketches/loomWeave.d.ts.map +1 -0
  54. package/dist/soundart-sketches/loomWeave.js +59 -0
  55. package/dist/soundart-sketches/noiseTerraces.d.ts +3 -0
  56. package/dist/soundart-sketches/noiseTerraces.d.ts.map +1 -0
  57. package/dist/soundart-sketches/noiseTerraces.js +53 -0
  58. package/dist/soundart-sketches/orb.d.ts +3 -0
  59. package/dist/soundart-sketches/orb.d.ts.map +1 -0
  60. package/dist/soundart-sketches/orb.js +50 -0
  61. package/dist/soundart-sketches/pixelGlyphs.d.ts +3 -0
  62. package/dist/soundart-sketches/pixelGlyphs.d.ts.map +1 -0
  63. package/dist/soundart-sketches/pixelGlyphs.js +72 -0
  64. package/dist/soundart-sketches/prismFlowFields.d.ts +3 -0
  65. package/dist/soundart-sketches/prismFlowFields.d.ts.map +1 -0
  66. package/dist/soundart-sketches/prismFlowFields.js +51 -0
  67. package/dist/soundart-sketches/radialBurst.d.ts +3 -0
  68. package/dist/soundart-sketches/radialBurst.d.ts.map +1 -0
  69. package/dist/soundart-sketches/radialBurst.js +60 -0
  70. package/dist/soundart-sketches/resonantSoundBodies.d.ts +3 -0
  71. package/dist/soundart-sketches/resonantSoundBodies.d.ts.map +1 -0
  72. package/dist/soundart-sketches/resonantSoundBodies.js +89 -0
  73. package/dist/soundart-sketches/rings.d.ts +11 -0
  74. package/dist/soundart-sketches/rings.d.ts.map +1 -0
  75. package/dist/soundart-sketches/rings.js +89 -0
  76. package/dist/soundart-sketches/squares.d.ts +3 -0
  77. package/dist/soundart-sketches/squares.d.ts.map +1 -0
  78. package/dist/soundart-sketches/squares.js +52 -0
  79. package/dist/soundart-sketches/waveStripes.d.ts +3 -0
  80. package/dist/soundart-sketches/waveStripes.d.ts.map +1 -0
  81. package/dist/soundart-sketches/waveStripes.js +44 -0
  82. package/dist/static-engine.d.ts +4 -1
  83. package/dist/static-engine.d.ts.map +1 -1
  84. package/dist/static-engine.js +13 -8
  85. package/dist/types.d.ts +75 -1
  86. package/dist/types.d.ts.map +1 -1
  87. package/dist/types.js +19 -1
  88. package/package.json +23 -17
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Noise → Code Mode Engine
3
+ *
4
+ * This is the orchestrator that runs Noise rendering through the Code Mode engine.
5
+ * It replaces the legacy p5.js-based NoiseCanvas with a protocol-compliant pipeline.
6
+ *
7
+ * Architecture:
8
+ * 1. NoiseParams from UI state
9
+ * 2. NoiseParams → NoiseSnapshot conversion
10
+ * 3. NoiseSnapshot injected as N.* globals into Code Mode
11
+ * 4. Noise sketch executed via Code Mode runtime
12
+ * 5. Result: PNG output (deterministic)
13
+ */
14
+ import type { NoiseSnapshot, NoiseParams } from '../../shared/noiseSnapshot';
15
+ export interface NoiseEngineConfig {
16
+ width: number;
17
+ height: number;
18
+ seed: number;
19
+ }
20
+ export interface NoiseRenderOptions {
21
+ params: NoiseParams;
22
+ canvas: HTMLCanvasElement;
23
+ config: NoiseEngineConfig;
24
+ onProgress?: (progress: number) => void;
25
+ }
26
+ export interface NoiseRenderResult {
27
+ mode: 'noise';
28
+ snapshot: NoiseSnapshot;
29
+ metadata: NoiseMetadata;
30
+ }
31
+ export interface NoiseMetadata {
32
+ mode: 'Noise';
33
+ timestamp: string;
34
+ enforcement: 'hard';
35
+ renderedVia: 'codemode';
36
+ noiseParams: {
37
+ scale: number;
38
+ octaves: number;
39
+ persistence: number;
40
+ lacunarity: number;
41
+ cellDensity: number;
42
+ cellDistortion: number;
43
+ blendMode: string;
44
+ };
45
+ generationParams: {
46
+ seed: number;
47
+ canvasSize: {
48
+ width: number;
49
+ height: number;
50
+ };
51
+ };
52
+ }
53
+ /**
54
+ * Render noise via Code Mode runtime
55
+ *
56
+ * This is the main entry point for protocol-compliant noise rendering.
57
+ * All rendering goes through the Code Mode runtime for determinism.
58
+ */
59
+ export declare function renderNoiseViaCodeMode(options: NoiseRenderOptions): Promise<NoiseRenderResult>;
60
+ /**
61
+ * Compile noise params to a Code Mode system
62
+ * This produces a reproducible system definition
63
+ */
64
+ export declare function compileNoiseSystem(params: NoiseParams): {
65
+ sketchCode: string;
66
+ snapshot: NoiseSnapshot;
67
+ seed: number;
68
+ };
69
+ /**
70
+ * Check if noise can be rendered via Code Mode
71
+ * (Always true - no legacy fallback)
72
+ */
73
+ export declare function canRenderNoiseViaCodeMode(): boolean;
74
+ //# sourceMappingURL=noise-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"noise-engine.d.ts","sourceRoot":"","sources":["../noise-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAM7E,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,WAAW,CAAC;IACpB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,MAAM,EAAE,iBAAiB,CAAC;IAC1B,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,aAAa,CAAC;IACxB,QAAQ,EAAE,aAAa,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,UAAU,CAAC;IACxB,WAAW,EAAE;QACX,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,cAAc,EAAE,MAAM,CAAC;QACvB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,gBAAgB,EAAE;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;KAC/C,CAAC;CACH;AAED;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,iBAAiB,CAAC,CAsF5B;AAwBD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,WAAW,GAAG;IACvD,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,aAAa,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;CACd,CAUA;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,IAAI,OAAO,CAEnD"}
@@ -0,0 +1,132 @@
1
+ /**
2
+ * Noise → Code Mode Engine
3
+ *
4
+ * This is the orchestrator that runs Noise rendering through the Code Mode engine.
5
+ * It replaces the legacy p5.js-based NoiseCanvas with a protocol-compliant pipeline.
6
+ *
7
+ * Architecture:
8
+ * 1. NoiseParams from UI state
9
+ * 2. NoiseParams → NoiseSnapshot conversion
10
+ * 3. NoiseSnapshot injected as N.* globals into Code Mode
11
+ * 4. Noise sketch executed via Code Mode runtime
12
+ * 5. Result: PNG output (deterministic)
13
+ */
14
+ import { createNoiseSnapshot, validateNoiseSnapshot } from '../../shared/noiseSnapshot';
15
+ import { createP5Runtime } from './p5-runtime';
16
+ import { createNoiseGlobals, injectNoiseGlobals } from './noise-bridge';
17
+ import { getNoiseSketch } from './noise-sketches';
18
+ /**
19
+ * Render noise via Code Mode runtime
20
+ *
21
+ * This is the main entry point for protocol-compliant noise rendering.
22
+ * All rendering goes through the Code Mode runtime for determinism.
23
+ */
24
+ export async function renderNoiseViaCodeMode(options) {
25
+ const { params, canvas, config, onProgress } = options;
26
+ // Protocol enforcement logging
27
+ console.log('[Noise] Protocol enforcement: HARD | renderedVia: codemode');
28
+ onProgress?.(0.1);
29
+ // Create and validate snapshot
30
+ const rawSnapshot = createNoiseSnapshot(params);
31
+ const snapshot = validateNoiseSnapshot(rawSnapshot);
32
+ onProgress?.(0.2);
33
+ // Create N.* globals
34
+ const noiseGlobals = createNoiseGlobals(snapshot);
35
+ // Get the noise sketch
36
+ const sketchName = 'fractalNoise';
37
+ const sketchCode = getNoiseSketch(sketchName);
38
+ // Inject N.* globals into sketch
39
+ const injectedCode = injectNoiseGlobals(sketchCode, noiseGlobals);
40
+ onProgress?.(0.3);
41
+ // Set canvas dimensions
42
+ canvas.width = config.width;
43
+ canvas.height = config.height;
44
+ // Create P5 runtime with correct signature
45
+ const runtimeConfig = {
46
+ seed: config.seed,
47
+ };
48
+ const runtime = createP5Runtime(canvas, config.width, config.height, runtimeConfig);
49
+ onProgress?.(0.5);
50
+ // Build globals with all runtime functions and noise globals
51
+ const globals = {
52
+ ...runtime,
53
+ width: config.width,
54
+ height: config.height,
55
+ };
56
+ // Execute the sketch
57
+ try {
58
+ executeNoiseSketch(injectedCode, globals);
59
+ onProgress?.(0.9);
60
+ console.log('[Noise] Rendered via Code Mode runtime');
61
+ // Build metadata
62
+ const metadata = {
63
+ mode: 'Noise',
64
+ timestamp: new Date().toISOString(),
65
+ enforcement: 'hard',
66
+ renderedVia: 'codemode',
67
+ noiseParams: {
68
+ scale: snapshot.scale,
69
+ octaves: snapshot.octaves,
70
+ persistence: snapshot.persistence,
71
+ lacunarity: snapshot.lacunarity,
72
+ cellDensity: snapshot.cellDensity,
73
+ cellDistortion: snapshot.cellDistortion,
74
+ blendMode: snapshot.blendMode,
75
+ },
76
+ generationParams: {
77
+ seed: config.seed,
78
+ canvasSize: { width: config.width, height: config.height },
79
+ },
80
+ };
81
+ onProgress?.(1.0);
82
+ return {
83
+ mode: 'noise',
84
+ snapshot,
85
+ metadata,
86
+ };
87
+ }
88
+ catch (error) {
89
+ console.error('[Noise] Code Mode execution failed:', error);
90
+ throw error;
91
+ }
92
+ }
93
+ /**
94
+ * Execute a noise sketch string in the context of the runtime globals
95
+ */
96
+ function executeNoiseSketch(code, globals) {
97
+ const globalNames = Object.keys(globals);
98
+ const globalValues = Object.values(globals);
99
+ // Wrap the sketch code to call setup()
100
+ const wrappedCode = `
101
+ ${code}
102
+
103
+ // Execute setup (noise is static - single frame)
104
+ if (typeof setup === 'function') {
105
+ setup();
106
+ }
107
+ `;
108
+ // Create and execute the function
109
+ const sketchFunction = new Function(...globalNames, wrappedCode);
110
+ sketchFunction(...globalValues);
111
+ }
112
+ /**
113
+ * Compile noise params to a Code Mode system
114
+ * This produces a reproducible system definition
115
+ */
116
+ export function compileNoiseSystem(params) {
117
+ const snapshot = validateNoiseSnapshot(createNoiseSnapshot(params));
118
+ const noiseGlobals = createNoiseGlobals(snapshot);
119
+ const sketchCode = injectNoiseGlobals(getNoiseSketch('fractalNoise'), noiseGlobals);
120
+ return {
121
+ sketchCode,
122
+ snapshot,
123
+ seed: params.seed,
124
+ };
125
+ }
126
+ /**
127
+ * Check if noise can be rendered via Code Mode
128
+ * (Always true - no legacy fallback)
129
+ */
130
+ export function canRenderNoiseViaCodeMode() {
131
+ return true;
132
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Fractal Noise - Code Mode Sketch
3
+ *
4
+ * This sketch implements Perlin FBM and Cellular noise rendering
5
+ * through the Code Mode p5-runtime. Uses N.* globals for all parameters.
6
+ *
7
+ * Original: client/src/components/noise-canvas-simple.tsx
8
+ */
9
+ export declare const FRACTAL_NOISE_SKETCH = "\n// Fractal Noise - Code Mode Sketch\n// Uses N.* noise globals and standard p5-like functions\n\nfunction setup() {\n // Set seeded random for reproducibility\n randomSeed(N.seed);\n noiseSeed(N.seed);\n \n // Set background color\n background(N.bgR, N.bgG, N.bgB);\n \n // Noise rendering parameters\n const adjustedScale = N.scale * (1 / N.zoom) * 0.05;\n const cellSize = 4; // Fixed for quality\n \n // Generate cellular points if needed\n const numPoints = Math.floor(20 + N.cellDensity * 180);\n const cellPoints = [];\n for (let i = 0; i < numPoints; i++) {\n cellPoints.push([random(0, width), random(0, height)]);\n }\n \n // Helper: Perlin FBM (Fractional Brownian Motion)\n function perlinFBM(x, y, scale) {\n let value = 0;\n let amplitude = 1;\n let frequency = 1;\n let maxValue = 0;\n \n const oct = Math.min(N.octaves, 6); // Cap for performance\n \n for (let i = 0; i < oct; i++) {\n value += noise(x * scale * frequency, y * scale * frequency) * amplitude;\n maxValue += amplitude;\n amplitude *= N.persistence;\n frequency *= N.lacunarity;\n }\n \n return value / maxValue;\n }\n \n // Helper: Cellular noise (Worley)\n function cellularNoise(x, y, points) {\n let sampleX = x;\n let sampleY = y;\n \n // Warp distortion if using warp mode\n if (N.isWarp && N.cellDistortion > 0) {\n const distortionAmount = N.cellDistortion * 100;\n sampleX += noise(x * 0.01, y * 0.01) * distortionAmount;\n sampleY += noise(y * 0.01, x * 0.01) * distortionAmount;\n }\n \n // Find distances to closest points\n let minDist = 999999;\n let secondMinDist = 999999;\n \n for (let i = 0; i < points.length; i++) {\n const px = points[i][0];\n const py = points[i][1];\n const dx = sampleX - px;\n const dy = sampleY - py;\n const dist = Math.sqrt(dx * dx + dy * dy);\n \n if (dist < minDist) {\n secondMinDist = minDist;\n minDist = dist;\n } else if (dist < secondMinDist) {\n secondMinDist = dist;\n }\n }\n \n // Normalize distance\n return Math.min(1.0, (secondMinDist - minDist) / 50);\n }\n \n // Render the noise grid\n noStroke();\n \n for (let y = 0; y < height; y += cellSize) {\n for (let x = 0; x < width; x += cellSize) {\n // Calculate Perlin value\n const perlinValue = perlinFBM(x, y, adjustedScale);\n \n // Calculate final value based on blend mode\n let finalValue = perlinValue;\n \n if (!N.isPerlinOnly) {\n const cellValue = cellularNoise(x, y, cellPoints);\n \n if (N.isBlend) {\n finalValue = perlinValue * cellValue;\n } else if (N.isWarp) {\n finalValue = (perlinValue + cellValue) / 2;\n } else if (N.isInterleave) {\n finalValue = (Math.floor(x / 20) + Math.floor(y / 20)) % 2 === 0\n ? perlinValue\n : cellValue;\n }\n }\n \n // Set opacity based on noise value\n const alpha = map(finalValue, 0, 1, 0, 255);\n \n // Fill with noise color and calculated alpha\n fill(N.noiseR, N.noiseG, N.noiseB, alpha);\n rect(x, y, cellSize, cellSize);\n }\n }\n}\n";
10
+ export default FRACTAL_NOISE_SKETCH;
11
+ //# sourceMappingURL=fractalNoise.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fractalNoise.d.ts","sourceRoot":"","sources":["../../noise-sketches/fractalNoise.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,eAAO,MAAM,oBAAoB,4sGA+GhC,CAAC;AAEF,eAAe,oBAAoB,CAAC"}
@@ -0,0 +1,121 @@
1
+ /**
2
+ * Fractal Noise - Code Mode Sketch
3
+ *
4
+ * This sketch implements Perlin FBM and Cellular noise rendering
5
+ * through the Code Mode p5-runtime. Uses N.* globals for all parameters.
6
+ *
7
+ * Original: client/src/components/noise-canvas-simple.tsx
8
+ */
9
+ export const FRACTAL_NOISE_SKETCH = `
10
+ // Fractal Noise - Code Mode Sketch
11
+ // Uses N.* noise globals and standard p5-like functions
12
+
13
+ function setup() {
14
+ // Set seeded random for reproducibility
15
+ randomSeed(N.seed);
16
+ noiseSeed(N.seed);
17
+
18
+ // Set background color
19
+ background(N.bgR, N.bgG, N.bgB);
20
+
21
+ // Noise rendering parameters
22
+ const adjustedScale = N.scale * (1 / N.zoom) * 0.05;
23
+ const cellSize = 4; // Fixed for quality
24
+
25
+ // Generate cellular points if needed
26
+ const numPoints = Math.floor(20 + N.cellDensity * 180);
27
+ const cellPoints = [];
28
+ for (let i = 0; i < numPoints; i++) {
29
+ cellPoints.push([random(0, width), random(0, height)]);
30
+ }
31
+
32
+ // Helper: Perlin FBM (Fractional Brownian Motion)
33
+ function perlinFBM(x, y, scale) {
34
+ let value = 0;
35
+ let amplitude = 1;
36
+ let frequency = 1;
37
+ let maxValue = 0;
38
+
39
+ const oct = Math.min(N.octaves, 6); // Cap for performance
40
+
41
+ for (let i = 0; i < oct; i++) {
42
+ value += noise(x * scale * frequency, y * scale * frequency) * amplitude;
43
+ maxValue += amplitude;
44
+ amplitude *= N.persistence;
45
+ frequency *= N.lacunarity;
46
+ }
47
+
48
+ return value / maxValue;
49
+ }
50
+
51
+ // Helper: Cellular noise (Worley)
52
+ function cellularNoise(x, y, points) {
53
+ let sampleX = x;
54
+ let sampleY = y;
55
+
56
+ // Warp distortion if using warp mode
57
+ if (N.isWarp && N.cellDistortion > 0) {
58
+ const distortionAmount = N.cellDistortion * 100;
59
+ sampleX += noise(x * 0.01, y * 0.01) * distortionAmount;
60
+ sampleY += noise(y * 0.01, x * 0.01) * distortionAmount;
61
+ }
62
+
63
+ // Find distances to closest points
64
+ let minDist = 999999;
65
+ let secondMinDist = 999999;
66
+
67
+ for (let i = 0; i < points.length; i++) {
68
+ const px = points[i][0];
69
+ const py = points[i][1];
70
+ const dx = sampleX - px;
71
+ const dy = sampleY - py;
72
+ const dist = Math.sqrt(dx * dx + dy * dy);
73
+
74
+ if (dist < minDist) {
75
+ secondMinDist = minDist;
76
+ minDist = dist;
77
+ } else if (dist < secondMinDist) {
78
+ secondMinDist = dist;
79
+ }
80
+ }
81
+
82
+ // Normalize distance
83
+ return Math.min(1.0, (secondMinDist - minDist) / 50);
84
+ }
85
+
86
+ // Render the noise grid
87
+ noStroke();
88
+
89
+ for (let y = 0; y < height; y += cellSize) {
90
+ for (let x = 0; x < width; x += cellSize) {
91
+ // Calculate Perlin value
92
+ const perlinValue = perlinFBM(x, y, adjustedScale);
93
+
94
+ // Calculate final value based on blend mode
95
+ let finalValue = perlinValue;
96
+
97
+ if (!N.isPerlinOnly) {
98
+ const cellValue = cellularNoise(x, y, cellPoints);
99
+
100
+ if (N.isBlend) {
101
+ finalValue = perlinValue * cellValue;
102
+ } else if (N.isWarp) {
103
+ finalValue = (perlinValue + cellValue) / 2;
104
+ } else if (N.isInterleave) {
105
+ finalValue = (Math.floor(x / 20) + Math.floor(y / 20)) % 2 === 0
106
+ ? perlinValue
107
+ : cellValue;
108
+ }
109
+ }
110
+
111
+ // Set opacity based on noise value
112
+ const alpha = map(finalValue, 0, 1, 0, 255);
113
+
114
+ // Fill with noise color and calculated alpha
115
+ fill(N.noiseR, N.noiseG, N.noiseB, alpha);
116
+ rect(x, y, cellSize, cellSize);
117
+ }
118
+ }
119
+ }
120
+ `;
121
+ export default FRACTAL_NOISE_SKETCH;
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Noise Sketches Index
3
+ *
4
+ * Exports all available noise sketch generators for the Code Mode runtime.
5
+ */
6
+ import FRACTAL_NOISE_SKETCH from './fractalNoise';
7
+ export type NoiseSketchName = 'fractalNoise';
8
+ /**
9
+ * Get a noise sketch by name
10
+ */
11
+ export declare function getNoiseSketch(name: NoiseSketchName): string;
12
+ /**
13
+ * Check if a sketch name is valid
14
+ */
15
+ export declare function isValidNoiseSketch(name: string): name is NoiseSketchName;
16
+ /**
17
+ * Get list of all available noise sketch names
18
+ */
19
+ export declare function getAvailableNoiseSketchNames(): NoiseSketchName[];
20
+ export { FRACTAL_NOISE_SKETCH };
21
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../noise-sketches/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,oBAAoB,MAAM,gBAAgB,CAAC;AAElD,MAAM,MAAM,eAAe,GAAG,cAAc,CAAC;AAM7C;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,CAE5D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,IAAI,eAAe,CAExE;AAED;;GAEG;AACH,wBAAgB,4BAA4B,IAAI,eAAe,EAAE,CAEhE;AAED,OAAO,EAAE,oBAAoB,EAAE,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Noise Sketches Index
3
+ *
4
+ * Exports all available noise sketch generators for the Code Mode runtime.
5
+ */
6
+ import FRACTAL_NOISE_SKETCH from './fractalNoise';
7
+ const NOISE_SKETCHES = {
8
+ fractalNoise: FRACTAL_NOISE_SKETCH,
9
+ };
10
+ /**
11
+ * Get a noise sketch by name
12
+ */
13
+ export function getNoiseSketch(name) {
14
+ return NOISE_SKETCHES[name];
15
+ }
16
+ /**
17
+ * Check if a sketch name is valid
18
+ */
19
+ export function isValidNoiseSketch(name) {
20
+ return name in NOISE_SKETCHES;
21
+ }
22
+ /**
23
+ * Get list of all available noise sketch names
24
+ */
25
+ export function getAvailableNoiseSketchNames() {
26
+ return Object.keys(NOISE_SKETCHES);
27
+ }
28
+ export { FRACTAL_NOISE_SKETCH };
@@ -1,11 +1,41 @@
1
1
  /**
2
2
  * NexArt Code Mode Runtime SDK - p5-like Runtime
3
- * Version: 0.1.1
4
3
  *
5
- * Minimal p5.js-like runtime for deterministic generative art execution.
6
- * This is a headless runtime - no UI dependencies.
4
+ * ╔══════════════════════════════════════════════════════════════════════════╗
5
+ * ║ CODE MODE PROTOCOL v1.0.0 (Phase 1) LOCKED ║
6
+ * ║ ║
7
+ * ║ Status: HARD PROTOCOL ENFORCEMENT ║
8
+ * ║ This is the stable, canonical execution surface. ║
9
+ * ║ SDKs, ByX, and external builders can depend on this API. ║
10
+ * ║ ║
11
+ * ║ Phase 1 Surface: ║
12
+ * ║ - VAR[0..9]: 10 read-only protocol variables (0-100 range) ║
13
+ * ║ - Drawing: line, rect, ellipse, circle, triangle, quad, arc, etc. ║
14
+ * ║ - Style: fill, stroke, colorMode, strokeWeight ║
15
+ * ║ - Transform: push, pop, translate, rotate, scale ║
16
+ * ║ - Random: random(), randomSeed(), randomGaussian() (seeded) ║
17
+ * ║ - Noise: noise(), noiseSeed(), noiseDetail() (seeded) ║
18
+ * ║ - Math: map, constrain, lerp, lerpColor, dist, mag, norm ║
19
+ * ║ - Color: Full CSS format support, color extraction functions ║
20
+ * ║ - Time: frameCount, t, time, tGlobal ║
21
+ * ║ ║
22
+ * ║ Determinism Guarantees: ║
23
+ * ║ - Same code + same seed + same VARs = identical output ║
24
+ * ║ - No external state, no browser entropy, no time-based drift ║
25
+ * ║ - Randomness ONLY from: random(), noise() (both seeded) ║
26
+ * ║ ║
27
+ * ║ ⚠️ Future changes require Phase 2+ ║
28
+ * ╚══════════════════════════════════════════════════════════════════════════╝
7
29
  */
8
30
  import type { TimeVariables } from './types';
31
+ /**
32
+ * Code Mode Protocol Version
33
+ * This constant defines the locked protocol version.
34
+ * Changes to the execution surface require a version bump.
35
+ */
36
+ export declare const CODE_MODE_PROTOCOL_VERSION = "1.0.0";
37
+ export declare const CODE_MODE_PROTOCOL_PHASE = 1;
38
+ export declare const CODE_MODE_ENFORCEMENT: "HARD";
9
39
  export interface P5Runtime {
10
40
  [key: string]: any;
11
41
  width: number;
@@ -16,6 +46,28 @@ export interface P5Runtime {
16
46
  HALF_PI: number;
17
47
  QUARTER_PI: number;
18
48
  }
19
- export declare function createP5Runtime(canvas: HTMLCanvasElement, width: number, height: number): P5Runtime;
49
+ export interface P5RuntimeConfig {
50
+ seed?: number;
51
+ }
52
+ export declare function createP5Runtime(canvas: HTMLCanvasElement, width: number, height: number, config?: P5RuntimeConfig): P5Runtime;
20
53
  export declare function injectTimeVariables(p: P5Runtime, time: TimeVariables): void;
54
+ /**
55
+ * VAR Protocol Constants (Phase 1 — Protocol v1.0.0)
56
+ * SDK v1.0.2: VAR input is optional (0-10 elements), but runtime always has 10
57
+ */
58
+ export declare const VAR_COUNT = 10;
59
+ export declare const VAR_MIN = 0;
60
+ export declare const VAR_MAX = 100;
61
+ /**
62
+ * Create a protected, read-only VAR array for protocol execution.
63
+ *
64
+ * SDK v1.0.2 Rules (Protocol v1.0.0):
65
+ * - Input accepts 0-10 elements
66
+ * - Runtime VAR is ALWAYS 10 elements (padded with zeros)
67
+ * - Values are numeric, must be in 0-100 range (validated upstream)
68
+ * - Read-only: writes throw descriptive errors
69
+ * - Available in both setup() and draw()
70
+ */
71
+ export declare function createProtocolVAR(vars?: number[]): readonly number[];
72
+ export declare function injectProtocolVariables(p: P5Runtime, vars?: number[]): void;
21
73
  //# sourceMappingURL=p5-runtime.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"p5-runtime.d.ts","sourceRoot":"","sources":["../p5-runtime.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7C,MAAM,WAAW,SAAS;IACxB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,eAAe,CAC7B,MAAM,EAAE,iBAAiB,EACzB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,SAAS,CAqVX;AAED,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI,CAE3E"}
1
+ {"version":3,"file":"p5-runtime.d.ts","sourceRoot":"","sources":["../p5-runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7C;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,UAAU,CAAC;AAClD,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAC1C,eAAO,MAAM,qBAAqB,EAAG,MAAe,CAAC;AAErD,MAAM,WAAW,SAAS;IACxB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAmED,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,eAAe,CAC7B,MAAM,EAAE,iBAAiB,EACzB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,eAAe,GACvB,SAAS,CA0hBX;AAED,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI,CAE3E;AAED;;;GAGG;AACH,eAAO,MAAM,SAAS,KAAK,CAAC;AAC5B,eAAO,MAAM,OAAO,IAAI,CAAC;AACzB,eAAO,MAAM,OAAO,MAAM,CAAC;AAE3B;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,MAAM,EAAE,CAmCpE;AAED,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAE3E"}