@vib3code/sdk 2.0.3-canary.6f35b4c → 2.0.3-canary.75a3290

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 (48) hide show
  1. package/DOCS/dev-tracks/DEV_TRACK_SESSION_2026-02-15.md +142 -0
  2. package/package.json +10 -1
  3. package/src/agent/index.js +1 -3
  4. package/src/agent/mcp/MCPServer.js +196 -0
  5. package/src/agent/mcp/index.js +1 -1
  6. package/src/agent/mcp/tools.js +87 -0
  7. package/src/cli/index.js +374 -44
  8. package/src/core/VIB3Engine.js +55 -3
  9. package/src/core/index.js +18 -0
  10. package/src/core/renderers/FacetedRendererAdapter.js +10 -9
  11. package/src/core/renderers/HolographicRendererAdapter.js +11 -7
  12. package/src/core/renderers/QuantumRendererAdapter.js +11 -7
  13. package/src/creative/index.js +11 -0
  14. package/src/export/index.js +11 -1
  15. package/src/faceted/FacetedSystem.js +8 -4
  16. package/src/holograms/RealHolographicSystem.js +126 -31
  17. package/src/math/index.js +7 -7
  18. package/src/reactivity/index.js +3 -5
  19. package/src/render/LayerPresetManager.js +372 -0
  20. package/src/render/LayerReactivityBridge.js +344 -0
  21. package/src/render/LayerRelationshipGraph.js +610 -0
  22. package/src/render/MultiCanvasBridge.js +148 -25
  23. package/src/render/index.js +27 -2
  24. package/src/scene/index.js +4 -4
  25. package/src/testing/ParallelTestFramework.js +2 -2
  26. package/src/viewer/GalleryUI.js +17 -0
  27. package/src/viewer/ViewerPortal.js +2 -2
  28. package/types/adaptive-sdk.d.ts +204 -5
  29. package/types/agent/cli.d.ts +78 -0
  30. package/types/agent/index.d.ts +18 -0
  31. package/types/agent/mcp.d.ts +87 -0
  32. package/types/agent/telemetry.d.ts +190 -0
  33. package/types/core/VIB3Engine.d.ts +26 -0
  34. package/types/core/index.d.ts +261 -0
  35. package/types/creative/AestheticMapper.d.ts +72 -0
  36. package/types/creative/ChoreographyPlayer.d.ts +96 -0
  37. package/types/creative/index.d.ts +17 -0
  38. package/types/export/index.d.ts +243 -0
  39. package/types/geometry/index.d.ts +164 -0
  40. package/types/math/index.d.ts +214 -0
  41. package/types/render/LayerPresetManager.d.ts +78 -0
  42. package/types/render/LayerReactivityBridge.d.ts +85 -0
  43. package/types/render/LayerRelationshipGraph.d.ts +174 -0
  44. package/types/render/index.d.ts +3 -0
  45. package/types/scene/index.d.ts +204 -0
  46. package/types/systems/index.d.ts +244 -0
  47. package/types/variations/index.d.ts +62 -0
  48. package/types/viewer/index.d.ts +225 -0
@@ -0,0 +1,142 @@
1
+ # Development Session — 2026-02-15
2
+
3
+ **Session type**: Layer Architecture Redesign, Codebase Audit, Preset/Reactivity Expansion
4
+ **Branch**: `claude/vib3-sdk-handoff-p00R8`
5
+ **Operator**: Claude Code (Opus 4.6)
6
+ **Parent work**: Builds on Feb 13 agent harness + Feb 6 RendererContract work
7
+
8
+ ---
9
+
10
+ ## Session Overview
11
+
12
+ ### Phase 1 — Layer Architecture Redesign
13
+
14
+ The original 5-layer canvas system used static multipliers — every layer received identical parameters scaled by hardcoded opacity/density/speed factors. This produced "the same shader pasted 5 times with different opacity" instead of actual inter-layer dynamics.
15
+
16
+ **Built**: `LayerRelationshipGraph` — a keystone-driven system where one layer drives and others derive their parameters through configurable relationship functions.
17
+
18
+ 6 preset relationship types:
19
+ | Preset | Behavior |
20
+ |--------|----------|
21
+ | `echo` | Attenuated follower (same params, scaled down) |
22
+ | `mirror` | Inverts rotation planes, shifts hue 180° |
23
+ | `complement` | Color complement, density inverted around pivot |
24
+ | `harmonic` | Density at integer multiples, hue at golden angle intervals |
25
+ | `reactive` | Amplifies parameter deltas over time |
26
+ | `chase` | Lerps toward keystone with configurable delay |
27
+
28
+ 5 named profiles that configure the full 5-layer graph:
29
+ - `holographic` — content drives, echo/complement/harmonic/reactive
30
+ - `symmetry` — mirror mode with chase accent
31
+ - `chord` — all harmonic at musical intervals
32
+ - `storm` — all reactive with increasing gain
33
+ - `legacy` — replicates old static multiplier behavior exactly
34
+
35
+ ### Phase 2 — TypeScript Type Audit
36
+
37
+ Found and fixed 4 type definition issues:
38
+ 1. Export name mismatch (RELATIONSHIP_PRESETS → PRESET_REGISTRY)
39
+ 2. Missing MultiCanvasBridge type definition
40
+ 3. Broken barrel file (types/render/index.d.ts)
41
+ 4. Incorrect exports in types/adaptive-sdk.d.ts
42
+
43
+ ### Phase 3 — Comprehensive Codebase Audit
44
+
45
+ Found and fixed 7 critical issues across the SDK:
46
+
47
+ | File | Problem | Fix |
48
+ |------|---------|-----|
49
+ | `src/math/index.js` | Top-level `await import()` breaks bundlers | Static imports |
50
+ | `src/render/index.js` | `require()` in ESM package | Static ESM import |
51
+ | `src/scene/index.js` | `require()` in `createSceneContext()` | Use already-imported classes |
52
+ | `src/export/index.js` | 8 missing exports | Added ShaderExporter, VIB3PackageExporter, etc. |
53
+ | `src/reactivity/index.js` | `console.log()` side effect in barrel | Removed |
54
+ | `package.json` | Missing `./creative`, `./export`, `./variations` entry points | Added |
55
+ | `types/` | Mismatched export names, missing barrel re-exports | Fixed all |
56
+
57
+ ### Phase 4 — CLAUDE.md Rewrite
58
+
59
+ Rewrote CLAUDE.md from 224 → 366 lines:
60
+ - Fixed MCP tool count (12 → 31) with full categorized table
61
+ - Added LayerRelationshipGraph documentation
62
+ - Added all new file references
63
+ - Added recent session work section
64
+ - Added 4 new gotchas (ESM only, 31 tools, layer defaults, initialize check)
65
+ - Updated test count, status, documentation map with staleness notes
66
+
67
+ ### Phase 5 — LayerPresetManager + Reactivity Wiring + MCP Tools
68
+
69
+ Built the preset management and reactivity-driven layer modulation system:
70
+
71
+ **LayerPresetManager** (`src/render/LayerPresetManager.js`):
72
+ - Save/load/delete/list user presets
73
+ - Create presets from current graph state
74
+ - Tune individual relationship parameters at runtime
75
+ - Persist presets to localStorage
76
+ - Import/export preset libraries as JSON
77
+
78
+ **Reactivity-driven layer modulation** (`src/render/LayerReactivityBridge.js`):
79
+ - Audio frequency bands modulate relationship parameters (e.g., bass → reactive gain)
80
+ - Device tilt/gyroscope modulates relationship configs
81
+ - Configurable modulation mappings per input source
82
+ - Pre-built modulation profiles (audioStorm, tiltHarmonic, etc.)
83
+
84
+ **MCP tools** (5 new layer control tools):
85
+ - `set_layer_profile` — Load a named layer profile
86
+ - `set_layer_relationship` — Set relationship for a specific layer
87
+ - `set_layer_keystone` — Change the keystone layer
88
+ - `get_layer_config` — Get current layer configuration
89
+ - `tune_layer_relationship` — Adjust config on an active relationship
90
+
91
+ ---
92
+
93
+ ## Files Created
94
+
95
+ | File | Purpose | ~Lines |
96
+ |------|---------|--------|
97
+ | `src/render/LayerRelationshipGraph.js` | Keystone-driven inter-layer parameter system | 610 |
98
+ | `src/render/LayerPresetManager.js` | Preset save/load/tune for layer relationships | ~300 |
99
+ | `src/render/LayerReactivityBridge.js` | Audio/tilt/input → layer relationship modulation | ~280 |
100
+ | `types/render/LayerRelationshipGraph.d.ts` | Full TypeScript definitions | 120 |
101
+ | `types/render/LayerPresetManager.d.ts` | TypeScript definitions for preset manager | ~60 |
102
+ | `types/render/LayerReactivityBridge.d.ts` | TypeScript definitions for reactivity bridge | ~70 |
103
+ | `tests/render/LayerRelationshipGraph.test.js` | 63 tests for relationship graph | 450 |
104
+ | `tests/render/LayerPresetManager.test.js` | Tests for preset manager | ~200 |
105
+ | `tests/render/LayerReactivityBridge.test.js` | Tests for reactivity bridge | ~200 |
106
+ | `pages/layer-demo.html` | Visual demo for testing layer dynamics | ~300 |
107
+ | `DOCS/dev-tracks/DEV_TRACK_SESSION_2026-02-15.md` | This file | — |
108
+
109
+ ## Files Modified
110
+
111
+ | File | Change |
112
+ |------|--------|
113
+ | `src/render/MultiCanvasBridge.js` | Integrated LayerRelationshipGraph for per-layer parameter resolution |
114
+ | `src/holograms/RealHolographicSystem.js` | Added layer graph integration, `loadRelationshipProfile()`, `setKeystone()`, `setLayerRelationship()` |
115
+ | `src/render/index.js` | Fixed `require()` → ESM, added LayerRelationshipGraph + PresetManager + ReactivityBridge exports |
116
+ | `src/math/index.js` | Fixed top-level `await import()` → static imports |
117
+ | `src/scene/index.js` | Fixed `require()` → use imported classes |
118
+ | `src/export/index.js` | Added 8 missing exports |
119
+ | `src/reactivity/index.js` | Removed `console.log()` side effect |
120
+ | `src/agent/mcp/tools.js` | Added 5 layer control tool definitions |
121
+ | `src/agent/mcp/MCPServer.js` | Added 5 layer control handlers |
122
+ | `package.json` | Added `./creative`, `./export`, `./variations` entry points |
123
+ | `types/adaptive-sdk.d.ts` | Fixed export names, added layer system re-exports |
124
+ | `types/render/index.d.ts` | Added LayerRelationshipGraph, PresetManager, ReactivityBridge re-exports |
125
+ | `types/systems/index.d.ts` | Added layer relationship API to RealHolographicSystem |
126
+ | `CLAUDE.md` | Comprehensive rewrite (224 → 366 lines) |
127
+
128
+ ## Test Results
129
+
130
+ - **Before session**: 1430 tests, 70 files
131
+ - **After session**: 1702+ tests, 75+ files
132
+ - All passing
133
+
134
+ ## Commits
135
+
136
+ | Hash | Message |
137
+ |------|---------|
138
+ | `59fb951` | feat(render): add LayerRelationshipGraph — keystone-driven inter-layer parameter system |
139
+ | `bec4cad` | fix(types): correct export names and barrel re-exports for LayerRelationshipGraph |
140
+ | `aeac38c` | fix: resolve 7 broken barrel files, require() in ESM, missing exports |
141
+ | `4031700` | docs: comprehensive CLAUDE.md rewrite |
142
+ | (pending) | feat: LayerPresetManager, LayerReactivityBridge, MCP layer tools, demo page |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vib3code/sdk",
3
- "version": "2.0.3-canary.6f35b4c",
3
+ "version": "2.0.3-canary.75a3290",
4
4
  "description": "VIB3+ 4D Visualization SDK - Unified engine with 6D rotation, MCP agentic integration, and cross-platform support",
5
5
  "type": "module",
6
6
  "main": "src/core/VIB3Engine.js",
@@ -200,6 +200,9 @@
200
200
  "./reactivity/config": {
201
201
  "import": "./src/reactivity/ReactivityConfig.js"
202
202
  },
203
+ "./creative": {
204
+ "import": "./src/creative/index.js"
205
+ },
203
206
  "./creative/color-presets": {
204
207
  "import": "./src/creative/ColorPresetsSystem.js"
205
208
  },
@@ -212,6 +215,9 @@
212
215
  "./creative/timeline": {
213
216
  "import": "./src/creative/ParameterTimeline.js"
214
217
  },
218
+ "./export": {
219
+ "import": "./src/export/index.js"
220
+ },
215
221
  "./integrations/react": {
216
222
  "import": "./src/integrations/frameworks/Vib3React.js"
217
223
  },
@@ -248,6 +254,9 @@
248
254
  "./advanced/offscreen": {
249
255
  "import": "./src/advanced/OffscreenWorker.js"
250
256
  },
257
+ "./variations": {
258
+ "import": "./src/variations/VariationManager.js"
259
+ },
251
260
  "./tools/shader-sync": {
252
261
  "import": "./tools/shader-sync-verify.js"
253
262
  },
@@ -68,6 +68,4 @@ export {
68
68
  createStreamingCLI
69
69
  } from './cli/index.js';
70
70
 
71
- // Default exports
72
- export { telemetry } from './telemetry/index.js';
73
- export { mcpServer } from './mcp/index.js';
71
+ // telemetry and mcpServer already exported above
@@ -9,6 +9,7 @@ import { telemetry, EventType, withTelemetry } from '../telemetry/index.js';
9
9
  import { AestheticMapper } from '../../creative/AestheticMapper.js';
10
10
  import { ChoreographyPlayer } from '../../creative/ChoreographyPlayer.js';
11
11
  import { ParameterTimeline } from '../../creative/ParameterTimeline.js';
12
+ import { PRESET_REGISTRY } from '../../render/LayerRelationshipGraph.js';
12
13
 
13
14
  /**
14
15
  * Generate unique IDs
@@ -204,6 +205,22 @@ export class MCPServer {
204
205
  case 'control_timeline':
205
206
  result = this.controlTimeline(args);
206
207
  break;
208
+ // Layer relationship tools (Phase 8)
209
+ case 'set_layer_profile':
210
+ result = this.setLayerProfile(args);
211
+ break;
212
+ case 'set_layer_relationship':
213
+ result = this.setLayerRelationship(args);
214
+ break;
215
+ case 'set_layer_keystone':
216
+ result = this.setLayerKeystone(args);
217
+ break;
218
+ case 'get_layer_config':
219
+ result = this.getLayerConfig();
220
+ break;
221
+ case 'tune_layer_relationship':
222
+ result = this.tuneLayerRelationship(args);
223
+ break;
207
224
  default:
208
225
  throw new Error(`Unknown tool: ${toolName}`);
209
226
  }
@@ -1665,6 +1682,185 @@ export class MCPServer {
1665
1682
  suggested_next_actions: ['control_timeline', 'describe_visual_state', 'capture_screenshot']
1666
1683
  };
1667
1684
  }
1685
+
1686
+ // ====================================================================
1687
+ // Layer Relationship Tools (Phase 8)
1688
+ // ====================================================================
1689
+
1690
+ /**
1691
+ * Get the holographic system's layer graph (if available).
1692
+ * @private
1693
+ * @returns {import('../../render/LayerRelationshipGraph.js').LayerRelationshipGraph|null}
1694
+ */
1695
+ _getLayerGraph() {
1696
+ if (!this.engine) return null;
1697
+ // Try to access the current system's layer graph
1698
+ const system = this.engine.currentSystem || this.engine._activeSystem;
1699
+ if (system && system.layerGraph) {
1700
+ return system.layerGraph;
1701
+ }
1702
+ if (system && system._layerGraph) {
1703
+ return system._layerGraph;
1704
+ }
1705
+ return null;
1706
+ }
1707
+
1708
+ /**
1709
+ * Load a named layer relationship profile.
1710
+ */
1711
+ setLayerProfile(args) {
1712
+ const { profile } = args;
1713
+ const graph = this._getLayerGraph();
1714
+
1715
+ if (!graph) {
1716
+ return {
1717
+ error: 'Layer relationship graph not available. Switch to holographic system first.',
1718
+ suggested_next_actions: ['switch_system']
1719
+ };
1720
+ }
1721
+
1722
+ graph.loadProfile(profile);
1723
+ telemetry.recordEvent(EventType.PARAMETER_CHANGE, { type: 'layer_profile', profile });
1724
+
1725
+ return {
1726
+ profile,
1727
+ keystone: graph.keystone,
1728
+ active_profile: graph.activeProfile,
1729
+ available_profiles: ['holographic', 'symmetry', 'chord', 'storm', 'legacy'],
1730
+ suggested_next_actions: ['get_layer_config', 'set_layer_relationship', 'tune_layer_relationship']
1731
+ };
1732
+ }
1733
+
1734
+ /**
1735
+ * Set relationship for a specific layer.
1736
+ */
1737
+ setLayerRelationship(args) {
1738
+ const { layer, relationship, config } = args;
1739
+ const graph = this._getLayerGraph();
1740
+
1741
+ if (!graph) {
1742
+ return {
1743
+ error: 'Layer relationship graph not available. Switch to holographic system first.',
1744
+ suggested_next_actions: ['switch_system']
1745
+ };
1746
+ }
1747
+
1748
+ if (config) {
1749
+ graph.setRelationship(layer, { preset: relationship, config });
1750
+ } else {
1751
+ graph.setRelationship(layer, relationship);
1752
+ }
1753
+
1754
+ telemetry.recordEvent(EventType.PARAMETER_CHANGE, {
1755
+ type: 'layer_relationship', layer, relationship
1756
+ });
1757
+
1758
+ return {
1759
+ layer,
1760
+ relationship,
1761
+ config: config || {},
1762
+ keystone: graph.keystone,
1763
+ suggested_next_actions: ['get_layer_config', 'tune_layer_relationship', 'describe_visual_state']
1764
+ };
1765
+ }
1766
+
1767
+ /**
1768
+ * Change the keystone (driver) layer.
1769
+ */
1770
+ setLayerKeystone(args) {
1771
+ const { layer } = args;
1772
+ const graph = this._getLayerGraph();
1773
+
1774
+ if (!graph) {
1775
+ return {
1776
+ error: 'Layer relationship graph not available. Switch to holographic system first.',
1777
+ suggested_next_actions: ['switch_system']
1778
+ };
1779
+ }
1780
+
1781
+ graph.setKeystone(layer);
1782
+ telemetry.recordEvent(EventType.PARAMETER_CHANGE, { type: 'layer_keystone', layer });
1783
+
1784
+ return {
1785
+ keystone: layer,
1786
+ note: 'Other layers\' relationships are preserved. Set new relationships for the old keystone if needed.',
1787
+ suggested_next_actions: ['set_layer_relationship', 'get_layer_config']
1788
+ };
1789
+ }
1790
+
1791
+ /**
1792
+ * Get current layer configuration.
1793
+ */
1794
+ getLayerConfig() {
1795
+ const graph = this._getLayerGraph();
1796
+
1797
+ if (!graph) {
1798
+ return {
1799
+ error: 'Layer relationship graph not available. Switch to holographic system first.',
1800
+ suggested_next_actions: ['switch_system']
1801
+ };
1802
+ }
1803
+
1804
+ const config = graph.exportConfig();
1805
+
1806
+ return {
1807
+ keystone: config.keystone,
1808
+ active_profile: config.profile,
1809
+ relationships: config.relationships,
1810
+ shaders: config.shaders,
1811
+ available_profiles: ['holographic', 'symmetry', 'chord', 'storm', 'legacy'],
1812
+ available_presets: ['echo', 'mirror', 'complement', 'harmonic', 'reactive', 'chase'],
1813
+ suggested_next_actions: ['set_layer_profile', 'set_layer_relationship', 'tune_layer_relationship']
1814
+ };
1815
+ }
1816
+
1817
+ /**
1818
+ * Tune a layer's relationship config.
1819
+ */
1820
+ tuneLayerRelationship(args) {
1821
+ const { layer, config: configOverrides } = args;
1822
+ const graph = this._getLayerGraph();
1823
+
1824
+ if (!graph) {
1825
+ return {
1826
+ error: 'Layer relationship graph not available. Switch to holographic system first.',
1827
+ suggested_next_actions: ['switch_system']
1828
+ };
1829
+ }
1830
+
1831
+ const graphConfig = graph.exportConfig();
1832
+ const currentRel = graphConfig.relationships[layer];
1833
+
1834
+ if (!currentRel || !currentRel.preset) {
1835
+ return {
1836
+ error: `Layer "${layer}" has no tunable preset relationship. Set one first with set_layer_relationship.`,
1837
+ suggested_next_actions: ['set_layer_relationship']
1838
+ };
1839
+ }
1840
+
1841
+ const factory = PRESET_REGISTRY[currentRel.preset];
1842
+ if (!factory) {
1843
+ return {
1844
+ error: `Unknown preset "${currentRel.preset}" on layer "${layer}".`,
1845
+ suggested_next_actions: ['set_layer_relationship']
1846
+ };
1847
+ }
1848
+
1849
+ const newConfig = { ...(currentRel.config || {}), ...configOverrides };
1850
+ graph.setRelationship(layer, { preset: currentRel.preset, config: newConfig });
1851
+
1852
+ telemetry.recordEvent(EventType.PARAMETER_CHANGE, {
1853
+ type: 'layer_tune', layer, tuned_keys: Object.keys(configOverrides)
1854
+ });
1855
+
1856
+ return {
1857
+ layer,
1858
+ preset: currentRel.preset,
1859
+ previous_config: currentRel.config,
1860
+ new_config: newConfig,
1861
+ suggested_next_actions: ['get_layer_config', 'describe_visual_state', 'capture_screenshot']
1862
+ };
1863
+ }
1668
1864
  }
1669
1865
 
1670
1866
  // Singleton instance
@@ -6,4 +6,4 @@
6
6
  export { MCPServer, mcpServer } from './MCPServer.js';
7
7
  export { toolDefinitions, getToolList, getToolNames, getTool, validateToolInput } from './tools.js';
8
8
 
9
- export default mcpServer from './MCPServer.js';
9
+ export { mcpServer as default } from './MCPServer.js';
@@ -762,6 +762,93 @@ export const toolDefinitions = {
762
762
  },
763
763
  required: ['timeline_id', 'action']
764
764
  }
765
+ },
766
+
767
+ // Layer Relationship Tools (Phase 8)
768
+ set_layer_profile: {
769
+ name: 'set_layer_profile',
770
+ description: 'Loads a named layer relationship profile that configures how the 5 canvas layers relate to each other. Profiles: holographic (default), symmetry, chord, storm, legacy (original static behavior).',
771
+ inputSchema: {
772
+ type: 'object',
773
+ properties: {
774
+ profile: {
775
+ type: 'string',
776
+ enum: ['holographic', 'symmetry', 'chord', 'storm', 'legacy'],
777
+ description: 'Named profile to load'
778
+ }
779
+ },
780
+ required: ['profile']
781
+ }
782
+ },
783
+
784
+ set_layer_relationship: {
785
+ name: 'set_layer_relationship',
786
+ description: 'Sets the relationship type for a specific layer relative to the keystone. Available relationships: echo (attenuated follower), mirror (inverted rotation/hue), complement (color opposite), harmonic (musical intervals), reactive (amplifies changes), chase (delayed follower).',
787
+ inputSchema: {
788
+ type: 'object',
789
+ properties: {
790
+ layer: {
791
+ type: 'string',
792
+ enum: ['background', 'shadow', 'content', 'highlight', 'accent'],
793
+ description: 'Target layer name'
794
+ },
795
+ relationship: {
796
+ type: 'string',
797
+ enum: ['echo', 'mirror', 'complement', 'harmonic', 'reactive', 'chase'],
798
+ description: 'Relationship preset name'
799
+ },
800
+ config: {
801
+ type: 'object',
802
+ description: 'Optional config overrides for the relationship (e.g., { opacity: 0.5, gain: 3 })'
803
+ }
804
+ },
805
+ required: ['layer', 'relationship']
806
+ }
807
+ },
808
+
809
+ set_layer_keystone: {
810
+ name: 'set_layer_keystone',
811
+ description: 'Changes which layer acts as the keystone (driver) for the layer relationship graph. Other layers derive their parameters from the keystone through relationship functions.',
812
+ inputSchema: {
813
+ type: 'object',
814
+ properties: {
815
+ layer: {
816
+ type: 'string',
817
+ enum: ['background', 'shadow', 'content', 'highlight', 'accent'],
818
+ description: 'Layer to designate as keystone'
819
+ }
820
+ },
821
+ required: ['layer']
822
+ }
823
+ },
824
+
825
+ get_layer_config: {
826
+ name: 'get_layer_config',
827
+ description: 'Returns the current layer relationship configuration including keystone, profile, and per-layer relationships with their config parameters.',
828
+ inputSchema: {
829
+ type: 'object',
830
+ properties: {}
831
+ }
832
+ },
833
+
834
+ tune_layer_relationship: {
835
+ name: 'tune_layer_relationship',
836
+ description: 'Hot-patches a layer relationship config without replacing the full graph. Merges provided config values into the existing relationship (e.g., increase reactive gain, shift harmonic hue angle).',
837
+ inputSchema: {
838
+ type: 'object',
839
+ properties: {
840
+ layer: {
841
+ type: 'string',
842
+ enum: ['background', 'shadow', 'content', 'highlight', 'accent'],
843
+ description: 'Layer to tune'
844
+ },
845
+ config: {
846
+ type: 'object',
847
+ description: 'Config values to merge (e.g., { opacity: 0.6, gain: 3.0, hueAngle: 120 })'
848
+ }
849
+ },
850
+ required: ['layer', 'config']
851
+ }
765
852
  }
766
853
  };
767
854