@dpantani/tdmcp 0.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/LICENSE +21 -0
- package/README.md +413 -0
- package/dist/cli/agent.d.ts +466 -0
- package/dist/cli/agent.js +1902 -0
- package/dist/cli/agent.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +4375 -0
- package/dist/index.js.map +1 -0
- package/dist/knowledge/data/glsl.json +1 -0
- package/dist/knowledge/data/meta.json +1 -0
- package/dist/knowledge/data/operators/ableton_link_chop.json +1322 -0
- package/dist/knowledge/data/operators/accumulate_pop.json +912 -0
- package/dist/knowledge/data/operators/actor_comp.json +7477 -0
- package/dist/knowledge/data/operators/add_sop.json +946 -0
- package/dist/knowledge/data/operators/add_top.json +1653 -0
- package/dist/knowledge/data/operators/alembic_sop.json +521 -0
- package/dist/knowledge/data/operators/align_sop.json +949 -0
- package/dist/knowledge/data/operators/ambient_light_comp.json +1698 -0
- package/dist/knowledge/data/operators/analyze_chop.json +710 -0
- package/dist/knowledge/data/operators/analyze_pop.json +698 -0
- package/dist/knowledge/data/operators/analyze_top.json +1276 -0
- package/dist/knowledge/data/operators/angle_chop.json +711 -0
- package/dist/knowledge/data/operators/animation_comp.json +2448 -0
- package/dist/knowledge/data/operators/annotate_comp.json +2913 -0
- package/dist/knowledge/data/operators/anti_alias_top.json +1278 -0
- package/dist/knowledge/data/operators/arm_sop.json +1747 -0
- package/dist/knowledge/data/operators/art-net_dat.json +472 -0
- package/dist/knowledge/data/operators/attribute_chop.json +617 -0
- package/dist/knowledge/data/operators/attribute_combine_pop.json +596 -0
- package/dist/knowledge/data/operators/attribute_convert_pop.json +462 -0
- package/dist/knowledge/data/operators/attribute_create_sop.json +191 -0
- package/dist/knowledge/data/operators/attribute_pop.json +1078 -0
- package/dist/knowledge/data/operators/attribute_sop.json +429 -0
- package/dist/knowledge/data/operators/audio_band_eq_chop.json +1228 -0
- package/dist/knowledge/data/operators/audio_binaural_chop.json +711 -0
- package/dist/knowledge/data/operators/audio_device_in_chop.json +1793 -0
- package/dist/knowledge/data/operators/audio_device_out_chop.json +1840 -0
- package/dist/knowledge/data/operators/audio_devices_dat.json +616 -0
- package/dist/knowledge/data/operators/audio_dynamics_chop.json +1132 -0
- package/dist/knowledge/data/operators/audio_file_in_chop.json +1605 -0
- package/dist/knowledge/data/operators/audio_file_out_chop.json +945 -0
- package/dist/knowledge/data/operators/audio_filter_chop.json +850 -0
- package/dist/knowledge/data/operators/audio_movie_chop.json +851 -0
- package/dist/knowledge/data/operators/audio_ndi_chop.json +526 -0
- package/dist/knowledge/data/operators/audio_oscillator_chop.json +1087 -0
- package/dist/knowledge/data/operators/audio_para_eq_chop.json +1276 -0
- package/dist/knowledge/data/operators/audio_play_chop.json +1744 -0
- package/dist/knowledge/data/operators/audio_render_chop.json +754 -0
- package/dist/knowledge/data/operators/audio_spectrum_chop.json +850 -0
- package/dist/knowledge/data/operators/audio_stream_in_chop.json +1039 -0
- package/dist/knowledge/data/operators/audio_stream_out_chop.json +806 -0
- package/dist/knowledge/data/operators/audio_vst_chop.json +1419 -0
- package/dist/knowledge/data/operators/audio_web_render_chop.json +523 -0
- package/dist/knowledge/data/operators/base_comp.json +1180 -0
- package/dist/knowledge/data/operators/basis_sop.json +805 -0
- package/dist/knowledge/data/operators/beat_chop.json +1745 -0
- package/dist/knowledge/data/operators/bind_chop.json +613 -0
- package/dist/knowledge/data/operators/blacktrax_chop.json +1180 -0
- package/dist/knowledge/data/operators/blend_chop.json +616 -0
- package/dist/knowledge/data/operators/blend_comp.json +3626 -0
- package/dist/knowledge/data/operators/blend_pop.json +618 -0
- package/dist/knowledge/data/operators/blend_sop.json +477 -0
- package/dist/knowledge/data/operators/blob_track_chop.json +1275 -0
- package/dist/knowledge/data/operators/blob_track_top.json +1931 -0
- package/dist/knowledge/data/operators/bloom_top.json +1370 -0
- package/dist/knowledge/data/operators/blur_top.json +1428 -0
- package/dist/knowledge/data/operators/body_track_chop.json +1233 -0
- package/dist/knowledge/data/operators/bone_comp.json +3672 -0
- package/dist/knowledge/data/operators/bone_group_sop.json +148 -0
- package/dist/knowledge/data/operators/boolean_sop.json +336 -0
- package/dist/knowledge/data/operators/box_pop.json +827 -0
- package/dist/knowledge/data/operators/box_sop.json +994 -0
- package/dist/knowledge/data/operators/bridge_sop.json +806 -0
- package/dist/knowledge/data/operators/bullet_solver_chop.json +898 -0
- package/dist/knowledge/data/operators/bullet_solver_comp.json +3720 -0
- package/dist/knowledge/data/operators/button_comp.json +6636 -0
- package/dist/knowledge/data/operators/cache_blend_pop.json +292 -0
- package/dist/knowledge/data/operators/cache_pop.json +412 -0
- package/dist/knowledge/data/operators/cache_select_pop.json +280 -0
- package/dist/knowledge/data/operators/cache_select_top.json +946 -0
- package/dist/knowledge/data/operators/cache_sop.json +478 -0
- package/dist/knowledge/data/operators/cache_top.json +1559 -0
- package/dist/knowledge/data/operators/camera_blend_comp.json +4847 -0
- package/dist/knowledge/data/operators/camera_comp.json +215 -0
- package/dist/knowledge/data/operators/cap_sop.json +527 -0
- package/dist/knowledge/data/operators/capture_region_sop.json +568 -0
- package/dist/knowledge/data/operators/capture_sop.json +619 -0
- package/dist/knowledge/data/operators/carve_sop.json +902 -0
- package/dist/knowledge/data/operators/channel_mix_top.json +1088 -0
- package/dist/knowledge/data/operators/chop_execute_dat.json +1277 -0
- package/dist/knowledge/data/operators/chop_to_dat.json +571 -0
- package/dist/knowledge/data/operators/chop_to_pop.json +1236 -0
- package/dist/knowledge/data/operators/chop_to_sop.json +714 -0
- package/dist/knowledge/data/operators/chop_to_top.json +1231 -0
- package/dist/knowledge/data/operators/chroma_key_top.json +1653 -0
- package/dist/knowledge/data/operators/circle_pop.json +821 -0
- package/dist/knowledge/data/operators/circle_sop.json +991 -0
- package/dist/knowledge/data/operators/circle_top.json +2307 -0
- package/dist/knowledge/data/operators/clay_sop.json +1231 -0
- package/dist/knowledge/data/operators/clip_blender_chop.json +1931 -0
- package/dist/knowledge/data/operators/clip_chop.json +1366 -0
- package/dist/knowledge/data/operators/clip_dat.json +849 -0
- package/dist/knowledge/data/operators/clip_sop.json +475 -0
- package/dist/knowledge/data/operators/clock_chop.json +1792 -0
- package/dist/knowledge/data/operators/composite_chop.json +1414 -0
- package/dist/knowledge/data/operators/composite_top.json +2131 -0
- package/dist/knowledge/data/operators/connectivity_pop.json +11 -0
- package/dist/knowledge/data/operators/constant_chop.json +1238 -0
- package/dist/knowledge/data/operators/constant_mat.json +2727 -0
- package/dist/knowledge/data/operators/constant_top.json +1323 -0
- package/dist/knowledge/data/operators/constraint_comp.json +2076 -0
- package/dist/knowledge/data/operators/container_comp.json +6299 -0
- package/dist/knowledge/data/operators/convert_dat.json +569 -0
- package/dist/knowledge/data/operators/convert_pop.json +322 -0
- package/dist/knowledge/data/operators/convert_sop.json +807 -0
- package/dist/knowledge/data/operators/convolve_top.json +1041 -0
- package/dist/knowledge/data/operators/copy_chop.json +993 -0
- package/dist/knowledge/data/operators/copy_pop.json +1799 -0
- package/dist/knowledge/data/operators/copy_sop.json +1887 -0
- package/dist/knowledge/data/operators/corner_pin_top.json +1512 -0
- package/dist/knowledge/data/operators/count_chop.json +1369 -0
- package/dist/knowledge/data/operators/cplusplus_chop.json +569 -0
- package/dist/knowledge/data/operators/cplusplus_dat.json +477 -0
- package/dist/knowledge/data/operators/cplusplus_pop.json +308 -0
- package/dist/knowledge/data/operators/cplusplus_sop.json +195 -0
- package/dist/knowledge/data/operators/cplusplus_top.json +1276 -0
- package/dist/knowledge/data/operators/creep_sop.json +385 -0
- package/dist/knowledge/data/operators/crop_top.json +1323 -0
- package/dist/knowledge/data/operators/cross_chop.json +478 -0
- package/dist/knowledge/data/operators/cross_top.json +1559 -0
- package/dist/knowledge/data/operators/cube_map_top.json +946 -0
- package/dist/knowledge/data/operators/curve_pop.json +1525 -0
- package/dist/knowledge/data/operators/curveclay_sop.json +618 -0
- package/dist/knowledge/data/operators/curvesect_sop.json +665 -0
- package/dist/knowledge/data/operators/cycle_chop.json +1040 -0
- package/dist/knowledge/data/operators/dat_execute_dat.json +1230 -0
- package/dist/knowledge/data/operators/dat_to_chop.json +1510 -0
- package/dist/knowledge/data/operators/dat_to_pop.json +756 -0
- package/dist/knowledge/data/operators/dat_to_sop.json +902 -0
- package/dist/knowledge/data/operators/deform_sop.json +291 -0
- package/dist/knowledge/data/operators/delay_chop.json +615 -0
- package/dist/knowledge/data/operators/delete_chop.json +1556 -0
- package/dist/knowledge/data/operators/delete_pop.json +1422 -0
- package/dist/knowledge/data/operators/delete_sop.json +1230 -0
- package/dist/knowledge/data/operators/depth_mat.json +1933 -0
- package/dist/knowledge/data/operators/depth_top.json +1322 -0
- package/dist/knowledge/data/operators/difference_top.json +1647 -0
- package/dist/knowledge/data/operators/dimension_pop.json +280 -0
- package/dist/knowledge/data/operators/direct_display_out_top.json +997 -0
- package/dist/knowledge/data/operators/directx_in_top.json +901 -0
- package/dist/knowledge/data/operators/directx_out_top.json +948 -0
- package/dist/knowledge/data/operators/displace_top.json +1322 -0
- package/dist/knowledge/data/operators/divide_sop.json +713 -0
- package/dist/knowledge/data/operators/dmx_fixture_pop.json +772 -0
- package/dist/knowledge/data/operators/dmx_in_chop.json +1420 -0
- package/dist/knowledge/data/operators/dmx_map_dat.json +11 -0
- package/dist/knowledge/data/operators/dmx_out_chop.json +1843 -0
- package/dist/knowledge/data/operators/dmx_out_pop.json +668 -0
- package/dist/knowledge/data/operators/edge_top.json +1370 -0
- package/dist/knowledge/data/operators/emboss_top.json +1275 -0
- package/dist/knowledge/data/operators/engine_comp.json +2685 -0
- package/dist/knowledge/data/operators/envelope_chop.json +946 -0
- package/dist/knowledge/data/operators/environment_light_comp.json +2121 -0
- package/dist/knowledge/data/operators/error_dat.json +949 -0
- package/dist/knowledge/data/operators/etherdream_dat.json +472 -0
- package/dist/knowledge/data/operators/evaluate_dat.json +1650 -0
- package/dist/knowledge/data/operators/event_chop.json +1653 -0
- package/dist/knowledge/data/operators/examine_dat.json +1182 -0
- package/dist/knowledge/data/operators/execute_dat.json +1184 -0
- package/dist/knowledge/data/operators/experimental +0 -0
- package/dist/knowledge/data/operators/expression_chop.json +617 -0
- package/dist/knowledge/data/operators/extend_chop.json +617 -0
- package/dist/knowledge/data/operators/extrude_pop.json +316 -0
- package/dist/knowledge/data/operators/extrude_sop.json +1081 -0
- package/dist/knowledge/data/operators/face_track_chop.json +998 -0
- package/dist/knowledge/data/operators/face_track_sop.json +244 -0
- package/dist/knowledge/data/operators/facet_pop.json +480 -0
- package/dist/knowledge/data/operators/facet_sop.json +619 -0
- package/dist/knowledge/data/operators/fan_chop.json +804 -0
- package/dist/knowledge/data/operators/fbx_comp.json +4942 -0
- package/dist/knowledge/data/operators/feedback_chop.json +664 -0
- package/dist/knowledge/data/operators/feedback_pop.json +368 -0
- package/dist/knowledge/data/operators/feedback_top.json +191 -0
- package/dist/knowledge/data/operators/field_pop.json +2304 -0
- package/dist/knowledge/data/operators/fifo_dat.json +711 -0
- package/dist/knowledge/data/operators/file_in_chop.json +1181 -0
- package/dist/knowledge/data/operators/file_in_dat.json +527 -0
- package/dist/knowledge/data/operators/file_in_pop.json +298 -0
- package/dist/knowledge/data/operators/file_in_sop.json +289 -0
- package/dist/knowledge/data/operators/file_out_chop.json +618 -0
- package/dist/knowledge/data/operators/file_out_dat.json +524 -0
- package/dist/knowledge/data/operators/fillet_sop.json +949 -0
- package/dist/knowledge/data/operators/filter_chop.json +1134 -0
- package/dist/knowledge/data/operators/fit_sop.json +1087 -0
- package/dist/knowledge/data/operators/fit_top.json +1559 -0
- package/dist/knowledge/data/operators/flip_top.json +1040 -0
- package/dist/knowledge/data/operators/folder_dat.json +1888 -0
- package/dist/knowledge/data/operators/force_comp.json +1701 -0
- package/dist/knowledge/data/operators/force_pop.json +878 -0
- package/dist/knowledge/data/operators/force_sop.json +429 -0
- package/dist/knowledge/data/operators/fractal_sop.json +479 -0
- package/dist/knowledge/data/operators/freed_in_chop.json +808 -0
- package/dist/knowledge/data/operators/freed_out_chop.json +714 -0
- package/dist/knowledge/data/operators/function_chop.json +1086 -0
- package/dist/knowledge/data/operators/function_top.json +1558 -0
- package/dist/knowledge/data/operators/geo_text_comp.json +7338 -0
- package/dist/knowledge/data/operators/geometry_comp.json +199 -0
- package/dist/knowledge/data/operators/gesture_chop.json +1133 -0
- package/dist/knowledge/data/operators/glsl_advanced_pop.json +3539 -0
- package/dist/knowledge/data/operators/glsl_comp.json +6962 -0
- package/dist/knowledge/data/operators/glsl_copy_pop.json +2128 -0
- package/dist/knowledge/data/operators/glsl_mat.json +3720 -0
- package/dist/knowledge/data/operators/glsl_multi_top.json +2922 -0
- package/dist/knowledge/data/operators/glsl_pop.json +2317 -0
- package/dist/knowledge/data/operators/glsl_select_pop.json +280 -0
- package/dist/knowledge/data/operators/glsl_top.json +2922 -0
- package/dist/knowledge/data/operators/grid_pop.json +1029 -0
- package/dist/knowledge/data/operators/grid_sop.json +1041 -0
- package/dist/knowledge/data/operators/group_pop.json +1423 -0
- package/dist/knowledge/data/operators/group_sop.json +2075 -0
- package/dist/knowledge/data/operators/handle_chop.json +712 -0
- package/dist/knowledge/data/operators/handle_comp.json +2171 -0
- package/dist/knowledge/data/operators/histogram_pop.json +533 -0
- package/dist/knowledge/data/operators/hog_chop.json +620 -0
- package/dist/knowledge/data/operators/hokuyo_chop.json +941 -0
- package/dist/knowledge/data/operators/hold_chop.json +664 -0
- package/dist/knowledge/data/operators/hole_sop.json +291 -0
- package/dist/knowledge/data/operators/hsv_adjust_top.json +1370 -0
- package/dist/knowledge/data/operators/hsv_to_rgb_top.json +847 -0
- package/dist/knowledge/data/operators/import_select_chop.json +1838 -0
- package/dist/knowledge/data/operators/import_select_pop.json +808 -0
- package/dist/knowledge/data/operators/import_select_sop.json +1463 -0
- package/dist/knowledge/data/operators/import_select_top.json +993 -0
- package/dist/knowledge/data/operators/impulse_force_comp.json +1415 -0
- package/dist/knowledge/data/operators/in_chop.json +572 -0
- package/dist/knowledge/data/operators/in_dat.json +386 -0
- package/dist/knowledge/data/operators/in_mat.json +1559 -0
- package/dist/knowledge/data/operators/in_pop.json +280 -0
- package/dist/knowledge/data/operators/in_sop.json +102 -0
- package/dist/knowledge/data/operators/in_top.json +903 -0
- package/dist/knowledge/data/operators/index.json +1 -0
- package/dist/knowledge/data/operators/indices_dat.json +526 -0
- package/dist/knowledge/data/operators/info_chop.json +757 -0
- package/dist/knowledge/data/operators/info_dat.json +430 -0
- package/dist/knowledge/data/operators/insert_dat.json +896 -0
- package/dist/knowledge/data/operators/inside_top.json +1652 -0
- package/dist/knowledge/data/operators/interpolate_chop.json +711 -0
- package/dist/knowledge/data/operators/inverse_curve_chop.json +898 -0
- package/dist/knowledge/data/operators/inverse_curve_sop.json +97 -0
- package/dist/knowledge/data/operators/inverse_kin_chop.json +850 -0
- package/dist/knowledge/data/operators/iso_surface_sop.json +337 -0
- package/dist/knowledge/data/operators/join_chop.json +1368 -0
- package/dist/knowledge/data/operators/join_sop.json +667 -0
- package/dist/knowledge/data/operators/joint_sop.json +573 -0
- package/dist/knowledge/data/operators/joystick_chop.json +1558 -0
- package/dist/knowledge/data/operators/json_dat.json +619 -0
- package/dist/knowledge/data/operators/keyboard_in_chop.json +1041 -0
- package/dist/knowledge/data/operators/keyboard_in_dat.json +950 -0
- package/dist/knowledge/data/operators/keyframe_chop.json +711 -0
- package/dist/knowledge/data/operators/kinect_azure_chop.json +1092 -0
- package/dist/knowledge/data/operators/kinect_azure_select_top.json +1187 -0
- package/dist/knowledge/data/operators/kinect_azure_top.json +2737 -0
- package/dist/knowledge/data/operators/kinect_chop.json +1700 -0
- package/dist/knowledge/data/operators/kinect_sop.json +379 -0
- package/dist/knowledge/data/operators/kinect_top.json +1700 -0
- package/dist/knowledge/data/operators/lag_chop.json +1040 -0
- package/dist/knowledge/data/operators/laser_chop.json +1746 -0
- package/dist/knowledge/data/operators/laser_device_chop.json +1228 -0
- package/dist/knowledge/data/operators/lattice_sop.json +432 -0
- package/dist/knowledge/data/operators/layout_top.json +1936 -0
- package/dist/knowledge/data/operators/leap_motion_chop.json +1699 -0
- package/dist/knowledge/data/operators/leap_motion_top.json +1323 -0
- package/dist/knowledge/data/operators/lens_distort_top.json +2262 -0
- package/dist/knowledge/data/operators/leuze_rod4_chop.json +1371 -0
- package/dist/knowledge/data/operators/level_top.json +2273 -0
- package/dist/knowledge/data/operators/lfo_chop.json +1088 -0
- package/dist/knowledge/data/operators/light_comp.json +5410 -0
- package/dist/knowledge/data/operators/limit_chop.json +1133 -0
- package/dist/knowledge/data/operators/limit_pop.json +1243 -0
- package/dist/knowledge/data/operators/limit_sop.json +2075 -0
- package/dist/knowledge/data/operators/limit_top.json +1557 -0
- package/dist/knowledge/data/operators/line_break_pop.json +447 -0
- package/dist/knowledge/data/operators/line_divide_pop.json +688 -0
- package/dist/knowledge/data/operators/line_mat.json +5551 -0
- package/dist/knowledge/data/operators/line_metrics_pop.json +548 -0
- package/dist/knowledge/data/operators/line_pop.json +1343 -0
- package/dist/knowledge/data/operators/line_smooth_pop.json +1028 -0
- package/dist/knowledge/data/operators/line_sop.json +330 -0
- package/dist/knowledge/data/operators/line_thick_sop.json +478 -0
- package/dist/knowledge/data/operators/list_comp.json +6729 -0
- package/dist/knowledge/data/operators/lod_sop.json +431 -0
- package/dist/knowledge/data/operators/logic_chop.json +946 -0
- package/dist/knowledge/data/operators/lookup_attribute_pop.json +684 -0
- package/dist/knowledge/data/operators/lookup_channel_pop.json +1140 -0
- package/dist/knowledge/data/operators/lookup_chop.json +992 -0
- package/dist/knowledge/data/operators/lookup_dat.json +664 -0
- package/dist/knowledge/data/operators/lookup_texture_pop.json +1494 -0
- package/dist/knowledge/data/operators/lookup_top.json +1510 -0
- package/dist/knowledge/data/operators/lsystem_sop.json +1699 -0
- package/dist/knowledge/data/operators/ltc_in_chop.json +760 -0
- package/dist/knowledge/data/operators/ltc_out_chop.json +1512 -0
- package/dist/knowledge/data/operators/luma_blur_top.json +1316 -0
- package/dist/knowledge/data/operators/luma_level_top.json +1746 -0
- package/dist/knowledge/data/operators/magnet_sop.json +759 -0
- package/dist/knowledge/data/operators/material_sop.json +98 -0
- package/dist/knowledge/data/operators/math_chop.json +1193 -0
- package/dist/knowledge/data/operators/math_combine_pop.json +4283 -0
- package/dist/knowledge/data/operators/math_mix_pop.json +2641 -0
- package/dist/knowledge/data/operators/math_pop.json +2163 -0
- package/dist/knowledge/data/operators/math_top.json +1885 -0
- package/dist/knowledge/data/operators/matte_top.json +994 -0
- package/dist/knowledge/data/operators/media_file_info_dat.json +571 -0
- package/dist/knowledge/data/operators/merge_chop.json +627 -0
- package/dist/knowledge/data/operators/merge_dat.json +620 -0
- package/dist/knowledge/data/operators/merge_pop.json +764 -0
- package/dist/knowledge/data/operators/merge_sop.json +100 -0
- package/dist/knowledge/data/operators/metaball_sop.json +476 -0
- package/dist/knowledge/data/operators/midi_event_dat.json +1135 -0
- package/dist/knowledge/data/operators/midi_in_chop.json +3297 -0
- package/dist/knowledge/data/operators/midi_in_dat.json +1183 -0
- package/dist/knowledge/data/operators/midi_in_map_chop.json +946 -0
- package/dist/knowledge/data/operators/midi_out_chop.json +1793 -0
- package/dist/knowledge/data/operators/mirror_top.json +1271 -0
- package/dist/knowledge/data/operators/model_sop.json +52 -0
- package/dist/knowledge/data/operators/monitors_dat.json +617 -0
- package/dist/knowledge/data/operators/monochrome_top.json +1041 -0
- package/dist/knowledge/data/operators/mosys_chop.json +804 -0
- package/dist/knowledge/data/operators/mosys_top.json +896 -0
- package/dist/knowledge/data/operators/mouse_in_chop.json +1275 -0
- package/dist/knowledge/data/operators/mouse_out_chop.json +711 -0
- package/dist/knowledge/data/operators/movie_file_in_top.json +3546 -0
- package/dist/knowledge/data/operators/movie_file_out_top.json +3390 -0
- package/dist/knowledge/data/operators/mpcdi_dat.json +711 -0
- package/dist/knowledge/data/operators/mpcdi_top.json +1369 -0
- package/dist/knowledge/data/operators/mqtt_client_dat.json +1229 -0
- package/dist/knowledge/data/operators/multi_touch_in_dat.json +1185 -0
- package/dist/knowledge/data/operators/multiply_top.json +1647 -0
- package/dist/knowledge/data/operators/ncam_chop.json +1039 -0
- package/dist/knowledge/data/operators/ncam_top.json +1039 -0
- package/dist/knowledge/data/operators/ndi_dat.json +478 -0
- package/dist/knowledge/data/operators/ndi_in_top.json +1326 -0
- package/dist/knowledge/data/operators/ndi_out_top.json +1420 -0
- package/dist/knowledge/data/operators/neighbor_pop.json +534 -0
- package/dist/knowledge/data/operators/noise_chop.json +2230 -0
- package/dist/knowledge/data/operators/noise_pop.json +2107 -0
- package/dist/knowledge/data/operators/noise_sop.json +1136 -0
- package/dist/knowledge/data/operators/noise_top.json +2356 -0
- package/dist/knowledge/data/operators/normal_map_top.json +1182 -0
- package/dist/knowledge/data/operators/normal_pop.json +1488 -0
- package/dist/knowledge/data/operators/normalize_pop.json +1298 -0
- package/dist/knowledge/data/operators/notch_top.json +1511 -0
- package/dist/knowledge/data/operators/null_chop.json +673 -0
- package/dist/knowledge/data/operators/null_comp.json +2921 -0
- package/dist/knowledge/data/operators/null_dat.json +344 -0
- package/dist/knowledge/data/operators/null_mat.json +1511 -0
- package/dist/knowledge/data/operators/null_pop.json +18 -0
- package/dist/knowledge/data/operators/null_sop.json +100 -0
- package/dist/knowledge/data/operators/null_top.json +862 -0
- package/dist/knowledge/data/operators/nvidia_background_top.json +996 -0
- package/dist/knowledge/data/operators/nvidia_denoise_top.json +1089 -0
- package/dist/knowledge/data/operators/nvidia_flex_solver_comp.json +5367 -0
- package/dist/knowledge/data/operators/nvidia_flex_top.json +995 -0
- package/dist/knowledge/data/operators/nvidia_flow_emitter_comp.json +7812 -0
- package/dist/knowledge/data/operators/nvidia_flow_top.json +3675 -0
- package/dist/knowledge/data/operators/nvidia_upscaler_top.json +1089 -0
- package/dist/knowledge/data/operators/oak_device_chop.json +1372 -0
- package/dist/knowledge/data/operators/oak_select_chop.json +947 -0
- package/dist/knowledge/data/operators/oak_select_top.json +1323 -0
- package/dist/knowledge/data/operators/object_chop.json +2356 -0
- package/dist/knowledge/data/operators/object_merge_sop.json +194 -0
- package/dist/knowledge/data/operators/oculus_audio_chop.json +1371 -0
- package/dist/knowledge/data/operators/oculus_rift_chop.json +901 -0
- package/dist/knowledge/data/operators/oculus_rift_sop.json +147 -0
- package/dist/knowledge/data/operators/oculus_rift_top.json +995 -0
- package/dist/knowledge/data/operators/op_execute_dat.json +1463 -0
- package/dist/knowledge/data/operators/op_find_dat.json +2827 -0
- package/dist/knowledge/data/operators/op_viewer_comp.json +6586 -0
- package/dist/knowledge/data/operators/op_viewer_top.json +993 -0
- package/dist/knowledge/data/operators/opencolorio_top.json +1980 -0
- package/dist/knowledge/data/operators/openvr_chop.json +1135 -0
- package/dist/knowledge/data/operators/openvr_sop.json +99 -0
- package/dist/knowledge/data/operators/openvr_top.json +900 -0
- package/dist/knowledge/data/operators/optical_flow_top.json +1230 -0
- package/dist/knowledge/data/operators/optitrack_in_chop.json +854 -0
- package/dist/knowledge/data/operators/orbbec_select_top.json +1042 -0
- package/dist/knowledge/data/operators/orbbec_top.json +1558 -0
- package/dist/knowledge/data/operators/osc_in_chop.json +1371 -0
- package/dist/knowledge/data/operators/osc_in_dat.json +1280 -0
- package/dist/knowledge/data/operators/osc_out_chop.json +1138 -0
- package/dist/knowledge/data/operators/osc_out_dat.json +1280 -0
- package/dist/knowledge/data/operators/ouster_select_top.json +1228 -0
- package/dist/knowledge/data/operators/ouster_top.json +2404 -0
- package/dist/knowledge/data/operators/out_chop.json +476 -0
- package/dist/knowledge/data/operators/out_dat.json +386 -0
- package/dist/knowledge/data/operators/out_mat.json +1982 -0
- package/dist/knowledge/data/operators/out_pop.json +286 -0
- package/dist/knowledge/data/operators/out_sop.json +93 -0
- package/dist/knowledge/data/operators/out_top.json +903 -0
- package/dist/knowledge/data/operators/outside_top.json +1651 -0
- package/dist/knowledge/data/operators/over_top.json +1651 -0
- package/dist/knowledge/data/operators/override_chop.json +663 -0
- package/dist/knowledge/data/operators/pack_top.json +946 -0
- package/dist/knowledge/data/operators/pan_tilt_chop.json +11 -0
- package/dist/knowledge/data/operators/panel_chop.json +663 -0
- package/dist/knowledge/data/operators/panel_execute_dat.json +1182 -0
- package/dist/knowledge/data/operators/pangolin_chop.json +1135 -0
- package/dist/knowledge/data/operators/parameter_chop.json +803 -0
- package/dist/knowledge/data/operators/parameter_comp.json +6962 -0
- package/dist/knowledge/data/operators/parameter_dat.json +1698 -0
- package/dist/knowledge/data/operators/parameter_execute_dat.json +1371 -0
- package/dist/knowledge/data/operators/pargroup_execute_dat.json +1271 -0
- package/dist/knowledge/data/operators/particle_pop.json +1130 -0
- package/dist/knowledge/data/operators/particle_sop.json +2214 -0
- package/dist/knowledge/data/operators/pattern_chop.json +1697 -0
- package/dist/knowledge/data/operators/pattern_pop.json +1767 -0
- package/dist/knowledge/data/operators/pbr_mat.json +4990 -0
- package/dist/knowledge/data/operators/perform_chop.json +1651 -0
- package/dist/knowledge/data/operators/perform_dat.json +1184 -0
- package/dist/knowledge/data/operators/phaser_chop.json +618 -0
- package/dist/knowledge/data/operators/phaser_pop.json +1043 -0
- package/dist/knowledge/data/operators/phong_mat.json +5458 -0
- package/dist/knowledge/data/operators/photoshop_in_top.json +1418 -0
- package/dist/knowledge/data/operators/pipe_in_chop.json +1323 -0
- package/dist/knowledge/data/operators/pipe_out_chop.json +1182 -0
- package/dist/knowledge/data/operators/point_file_in_pop.json +1246 -0
- package/dist/knowledge/data/operators/point_file_in_top.json +3343 -0
- package/dist/knowledge/data/operators/point_file_select_top.json +1086 -0
- package/dist/knowledge/data/operators/point_generator_pop.json +1407 -0
- package/dist/knowledge/data/operators/point_pop.json +752 -0
- package/dist/knowledge/data/operators/point_sop.json +2171 -0
- package/dist/knowledge/data/operators/point_sprite_mat.json +2920 -0
- package/dist/knowledge/data/operators/point_transform_top.json +2779 -0
- package/dist/knowledge/data/operators/polygonize_pop.json +386 -0
- package/dist/knowledge/data/operators/polyloft_sop.json +759 -0
- package/dist/knowledge/data/operators/polypatch_sop.json +761 -0
- package/dist/knowledge/data/operators/polyreduce_sop.json +806 -0
- package/dist/knowledge/data/operators/polyspline_sop.json +667 -0
- package/dist/knowledge/data/operators/polystitch_sop.json +336 -0
- package/dist/knowledge/data/operators/pop_to_chop.json +11 -0
- package/dist/knowledge/data/operators/pop_to_dat.json +11 -0
- package/dist/knowledge/data/operators/pop_to_sop.json +11 -0
- package/dist/knowledge/data/operators/pop_to_top.json +11 -0
- package/dist/knowledge/data/operators/posistagenet_chop.json +900 -0
- package/dist/knowledge/data/operators/prefilter_map_top.json +947 -0
- package/dist/knowledge/data/operators/primitive_pop.json +1254 -0
- package/dist/knowledge/data/operators/primitive_sop.json +2075 -0
- package/dist/knowledge/data/operators/profile_sop.json +756 -0
- package/dist/knowledge/data/operators/project_sop.json +1276 -0
- package/dist/knowledge/data/operators/projection_pop.json +1060 -0
- package/dist/knowledge/data/operators/projection_top.json +1135 -0
- package/dist/knowledge/data/operators/proximity_pop.json +505 -0
- package/dist/knowledge/data/operators/pulse_chop.json +1744 -0
- package/dist/knowledge/data/operators/quantize_pop.json +1052 -0
- package/dist/knowledge/data/operators/rails_sop.json +853 -0
- package/dist/knowledge/data/operators/ramp_top.json +1899 -0
- package/dist/knowledge/data/operators/random_pop.json +1219 -0
- package/dist/knowledge/data/operators/raster_sop.json +291 -0
- package/dist/knowledge/data/operators/ray_pop.json +497 -0
- package/dist/knowledge/data/operators/ray_sop.json +856 -0
- package/dist/knowledge/data/operators/realsense_top.json +1608 -0
- package/dist/knowledge/data/operators/record_chop.json +1040 -0
- package/dist/knowledge/data/operators/rectangle_pop.json +800 -0
- package/dist/knowledge/data/operators/rectangle_sop.json +758 -0
- package/dist/knowledge/data/operators/rectangle_top.json +2259 -0
- package/dist/knowledge/data/operators/refine_sop.json +667 -0
- package/dist/knowledge/data/operators/remap_top.json +1182 -0
- package/dist/knowledge/data/operators/rename_chop.json +522 -0
- package/dist/knowledge/data/operators/render_pass_top.json +3108 -0
- package/dist/knowledge/data/operators/render_pick_chop.json +2119 -0
- package/dist/knowledge/data/operators/render_pick_dat.json +1840 -0
- package/dist/knowledge/data/operators/render_select_top.json +1086 -0
- package/dist/knowledge/data/operators/render_top.json +218 -0
- package/dist/knowledge/data/operators/renderstream_in_chop.json +617 -0
- package/dist/knowledge/data/operators/renderstream_in_top.json +950 -0
- package/dist/knowledge/data/operators/renderstream_out_top.json +997 -0
- package/dist/knowledge/data/operators/reorder_chop.json +946 -0
- package/dist/knowledge/data/operators/reorder_dat.json +711 -0
- package/dist/knowledge/data/operators/reorder_top.json +1229 -0
- package/dist/knowledge/data/operators/replace_chop.json +568 -0
- package/dist/knowledge/data/operators/replicator_comp.json +2208 -0
- package/dist/knowledge/data/operators/rerange_pop.json +892 -0
- package/dist/knowledge/data/operators/resample_chop.json +1134 -0
- package/dist/knowledge/data/operators/resample_sop.json +619 -0
- package/dist/knowledge/data/operators/resolution_top.json +892 -0
- package/dist/knowledge/data/operators/revolve_pop.json +607 -0
- package/dist/knowledge/data/operators/revolve_sop.json +714 -0
- package/dist/knowledge/data/operators/rgb_key_top.json +1654 -0
- package/dist/knowledge/data/operators/rgb_to_hsv_top.json +853 -0
- package/dist/knowledge/data/operators/s_curve_chop.json +1176 -0
- package/dist/knowledge/data/operators/scalable_display_top.json +1042 -0
- package/dist/knowledge/data/operators/screen_grab_top.json +1465 -0
- package/dist/knowledge/data/operators/screen_top.json +1652 -0
- package/dist/knowledge/data/operators/script_chop.json +520 -0
- package/dist/knowledge/data/operators/script_dat.json +429 -0
- package/dist/knowledge/data/operators/script_sop.json +146 -0
- package/dist/knowledge/data/operators/script_top.json +947 -0
- package/dist/knowledge/data/operators/select_chop.json +899 -0
- package/dist/knowledge/data/operators/select_comp.json +5645 -0
- package/dist/knowledge/data/operators/select_dat.json +1371 -0
- package/dist/knowledge/data/operators/select_mat.json +1977 -0
- package/dist/knowledge/data/operators/select_pop.json +347 -0
- package/dist/knowledge/data/operators/select_sop.json +100 -0
- package/dist/knowledge/data/operators/select_top.json +901 -0
- package/dist/knowledge/data/operators/sequence_blend_sop.json +336 -0
- package/dist/knowledge/data/operators/serial_chop.json +1182 -0
- package/dist/knowledge/data/operators/serial_dat.json +1418 -0
- package/dist/knowledge/data/operators/shared_mem_in_chop.json +620 -0
- package/dist/knowledge/data/operators/shared_mem_in_comp.json +1323 -0
- package/dist/knowledge/data/operators/shared_mem_in_top.json +994 -0
- package/dist/knowledge/data/operators/shared_mem_out_chop.json +620 -0
- package/dist/knowledge/data/operators/shared_mem_out_comp.json +1372 -0
- package/dist/knowledge/data/operators/shared_mem_out_top.json +1137 -0
- package/dist/knowledge/data/operators/shift_chop.json +899 -0
- package/dist/knowledge/data/operators/shuffle_chop.json +612 -0
- package/dist/knowledge/data/operators/sick_top.json +1322 -0
- package/dist/knowledge/data/operators/skin_deform_pop.json +972 -0
- package/dist/knowledge/data/operators/skin_pop.json +330 -0
- package/dist/knowledge/data/operators/skin_sop.json +711 -0
- package/dist/knowledge/data/operators/slider_comp.json +6918 -0
- package/dist/knowledge/data/operators/slope_chop.json +661 -0
- package/dist/knowledge/data/operators/slope_top.json +1370 -0
- package/dist/knowledge/data/operators/socketio_dat.json +945 -0
- package/dist/knowledge/data/operators/sop_to_chop.json +1137 -0
- package/dist/knowledge/data/operators/sop_to_dat.json +622 -0
- package/dist/knowledge/data/operators/sop_to_pop.json +409 -0
- package/dist/knowledge/data/operators/sort_chop.json +805 -0
- package/dist/knowledge/data/operators/sort_dat.json +894 -0
- package/dist/knowledge/data/operators/sort_pop.json +1023 -0
- package/dist/knowledge/data/operators/sort_sop.json +569 -0
- package/dist/knowledge/data/operators/spectrum_top.json +1182 -0
- package/dist/knowledge/data/operators/speed_chop.json +1180 -0
- package/dist/knowledge/data/operators/sphere_pop.json +1141 -0
- package/dist/knowledge/data/operators/sphere_sop.json +1370 -0
- package/dist/knowledge/data/operators/splice_chop.json +1226 -0
- package/dist/knowledge/data/operators/spring_chop.json +899 -0
- package/dist/knowledge/data/operators/spring_sop.json +1463 -0
- package/dist/knowledge/data/operators/sprinkle_pop.json +420 -0
- package/dist/knowledge/data/operators/sprinkle_sop.json +337 -0
- package/dist/knowledge/data/operators/sprite_sop.json +571 -0
- package/dist/knowledge/data/operators/ssao_top.json +1510 -0
- package/dist/knowledge/data/operators/st2110_device_chop.json +11 -0
- package/dist/knowledge/data/operators/stitch_sop.json +807 -0
- package/dist/knowledge/data/operators/stretch_chop.json +945 -0
- package/dist/knowledge/data/operators/stype_in_chop.json +756 -0
- package/dist/knowledge/data/operators/stype_out_chop.json +852 -0
- package/dist/knowledge/data/operators/stype_top.json +943 -0
- package/dist/knowledge/data/operators/subdivide_pop.json +292 -0
- package/dist/knowledge/data/operators/subdivide_sop.json +618 -0
- package/dist/knowledge/data/operators/substance_select_top.json +945 -0
- package/dist/knowledge/data/operators/substance_top.json +1182 -0
- package/dist/knowledge/data/operators/substitute_dat.json +1605 -0
- package/dist/knowledge/data/operators/subtract_top.json +1650 -0
- package/dist/knowledge/data/operators/superquad_sop.json +1135 -0
- package/dist/knowledge/data/operators/surfsect_sop.json +853 -0
- package/dist/knowledge/data/operators/sweep_sop.json +947 -0
- package/dist/knowledge/data/operators/switch_chop.json +523 -0
- package/dist/knowledge/data/operators/switch_dat.json +383 -0
- package/dist/knowledge/data/operators/switch_mat.json +1553 -0
- package/dist/knowledge/data/operators/switch_pop.json +496 -0
- package/dist/knowledge/data/operators/switch_sop.json +101 -0
- package/dist/knowledge/data/operators/switch_top.json +959 -0
- package/dist/knowledge/data/operators/sync_in_chop.json +617 -0
- package/dist/knowledge/data/operators/sync_out_chop.json +993 -0
- package/dist/knowledge/data/operators/syphon_spout_in_top.json +946 -0
- package/dist/knowledge/data/operators/syphon_spout_out_top.json +948 -0
- package/dist/knowledge/data/operators/table_comp.json +7009 -0
- package/dist/knowledge/data/operators/table_dat.json +1080 -0
- package/dist/knowledge/data/operators/tablet_chop.json +1367 -0
- package/dist/knowledge/data/operators/text_comp.json +8981 -0
- package/dist/knowledge/data/operators/text_dat.json +675 -0
- package/dist/knowledge/data/operators/text_sop.json +1512 -0
- package/dist/knowledge/data/operators/text_top.json +4236 -0
- package/dist/knowledge/data/operators/texture_3d_top.json +1417 -0
- package/dist/knowledge/data/operators/texture_map_pop.json +1744 -0
- package/dist/knowledge/data/operators/texture_sop.json +992 -0
- package/dist/knowledge/data/operators/threshold_top.json +1227 -0
- package/dist/knowledge/data/operators/tile_top.json +1840 -0
- package/dist/knowledge/data/operators/time_comp.json +1745 -0
- package/dist/knowledge/data/operators/time_machine_top.json +1041 -0
- package/dist/knowledge/data/operators/time_slice_chop.json +568 -0
- package/dist/knowledge/data/operators/timecode_chop.json +1981 -0
- package/dist/knowledge/data/operators/timeline_chop.json +1038 -0
- package/dist/knowledge/data/operators/timer_chop.json +4236 -0
- package/dist/knowledge/data/operators/top_to_chop.json +2077 -0
- package/dist/knowledge/data/operators/top_to_pop.json +2144 -0
- package/dist/knowledge/data/operators/topology_pop.json +1526 -0
- package/dist/knowledge/data/operators/torus_pop.json +901 -0
- package/dist/knowledge/data/operators/torus_sop.json +1368 -0
- package/dist/knowledge/data/operators/touch_in_chop.json +1182 -0
- package/dist/knowledge/data/operators/touch_in_dat.json +618 -0
- package/dist/knowledge/data/operators/touch_in_top.json +1182 -0
- package/dist/knowledge/data/operators/touch_out_chop.json +947 -0
- package/dist/knowledge/data/operators/touch_out_dat.json +712 -0
- package/dist/knowledge/data/operators/touch_out_top.json +1134 -0
- package/dist/knowledge/data/operators/trace_sop.json +759 -0
- package/dist/knowledge/data/operators/trail_chop.json +901 -0
- package/dist/knowledge/data/operators/trail_pop.json +827 -0
- package/dist/knowledge/data/operators/trail_sop.json +616 -0
- package/dist/knowledge/data/operators/transform_chop.json +2168 -0
- package/dist/knowledge/data/operators/transform_pop.json +2659 -0
- package/dist/knowledge/data/operators/transform_sop.json +1466 -0
- package/dist/knowledge/data/operators/transform_top.json +1803 -0
- package/dist/knowledge/data/operators/transform_xyz_chop.json +1369 -0
- package/dist/knowledge/data/operators/transpose_dat.json +334 -0
- package/dist/knowledge/data/operators/trig_pop.json +1135 -0
- package/dist/knowledge/data/operators/trigger_chop.json +2214 -0
- package/dist/knowledge/data/operators/trim_chop.json +805 -0
- package/dist/knowledge/data/operators/trim_sop.json +336 -0
- package/dist/knowledge/data/operators/tristrip_sop.json +194 -0
- package/dist/knowledge/data/operators/tube_pop.json +861 -0
- package/dist/knowledge/data/operators/tube_sop.json +1323 -0
- package/dist/knowledge/data/operators/tuio_in_dat.json +806 -0
- package/dist/knowledge/data/operators/twist_pop.json +1127 -0
- package/dist/knowledge/data/operators/twist_sop.json +533 -0
- package/dist/knowledge/data/operators/udp_in_dat.json +1090 -0
- package/dist/knowledge/data/operators/udp_out_dat.json +1280 -0
- package/dist/knowledge/data/operators/under_top.json +1652 -0
- package/dist/knowledge/data/operators/usd_comp.json +4800 -0
- package/dist/knowledge/data/operators/vertex_sop.json +667 -0
- package/dist/knowledge/data/operators/video_device_in_top.json +3062 -0
- package/dist/knowledge/data/operators/video_device_out_top.json +1936 -0
- package/dist/knowledge/data/operators/video_devices_dat.json +616 -0
- package/dist/knowledge/data/operators/video_stream_in_top.json +1842 -0
- package/dist/knowledge/data/operators/video_stream_out_top.json +2548 -0
- package/dist/knowledge/data/operators/vioso_top.json +943 -0
- package/dist/knowledge/data/operators/warp_chop.json +570 -0
- package/dist/knowledge/data/operators/wave_chop.json +1510 -0
- package/dist/knowledge/data/operators/web_client_dat.json +1514 -0
- package/dist/knowledge/data/operators/web_render_top.json +1749 -0
- package/dist/knowledge/data/operators/web_server_dat.json +714 -0
- package/dist/knowledge/data/operators/webrtc_dat.json +851 -0
- package/dist/knowledge/data/operators/websocket_dat.json +901 -0
- package/dist/knowledge/data/operators/widget_comp.json +6299 -0
- package/dist/knowledge/data/operators/window_comp.json +3061 -0
- package/dist/knowledge/data/operators/wireframe_mat.json +2165 -0
- package/dist/knowledge/data/operators/wireframe_sop.json +338 -0
- package/dist/knowledge/data/operators/wrnchai_chop.json +1084 -0
- package/dist/knowledge/data/operators/xml_dat.json +1230 -0
- package/dist/knowledge/data/operators/zed_chop.json +1840 -0
- package/dist/knowledge/data/operators/zed_sop.json +712 -0
- package/dist/knowledge/data/operators/zed_top.json +1981 -0
- package/dist/knowledge/data/patterns.json +1 -0
- package/dist/knowledge/data/python-api/App.json +78 -0
- package/dist/knowledge/data/python-api/Attribute.json +43 -0
- package/dist/knowledge/data/python-api/Attributes.json +41 -0
- package/dist/knowledge/data/python-api/Bounds.json +10 -0
- package/dist/knowledge/data/python-api/CHOP.json +683 -0
- package/dist/knowledge/data/python-api/COMP.json +1019 -0
- package/dist/knowledge/data/python-api/Cell.json +80 -0
- package/dist/knowledge/data/python-api/Channel.json +100 -0
- package/dist/knowledge/data/python-api/Connector.json +43 -0
- package/dist/knowledge/data/python-api/DAT.json +1289 -0
- package/dist/knowledge/data/python-api/Dependency.json +10 -0
- package/dist/knowledge/data/python-api/Error_DAT.json +9 -0
- package/dist/knowledge/data/python-api/Group.json +54 -0
- package/dist/knowledge/data/python-api/License.json +25 -0
- package/dist/knowledge/data/python-api/MAT.json +621 -0
- package/dist/knowledge/data/python-api/MOD.json +83 -0
- package/dist/knowledge/data/python-api/Matrix.json +556 -0
- package/dist/knowledge/data/python-api/Monitor.json +25 -0
- package/dist/knowledge/data/python-api/Network.json +10 -0
- package/dist/knowledge/data/python-api/NetworkEditor.json +154 -0
- package/dist/knowledge/data/python-api/Node.json +10 -0
- package/dist/knowledge/data/python-api/OP.json +621 -0
- package/dist/knowledge/data/python-api/OP_Viewer_COMP.json +9 -0
- package/dist/knowledge/data/python-api/ObjectCOMP.json +1150 -0
- package/dist/knowledge/data/python-api/Page.json +797 -0
- package/dist/knowledge/data/python-api/Pane.json +62 -0
- package/dist/knowledge/data/python-api/Panel.json +25 -0
- package/dist/knowledge/data/python-api/PanelCOMP.json +1167 -0
- package/dist/knowledge/data/python-api/PanelValue.json +25 -0
- package/dist/knowledge/data/python-api/Par.json +115 -0
- package/dist/knowledge/data/python-api/ParGroup.json +101 -0
- package/dist/knowledge/data/python-api/Parameter.json +10 -0
- package/dist/knowledge/data/python-api/Parent.json +10 -0
- package/dist/knowledge/data/python-api/Pattern_CHOP.json +9 -0
- package/dist/knowledge/data/python-api/Peer.json +85 -0
- package/dist/knowledge/data/python-api/Point.json +32 -0
- package/dist/knowledge/data/python-api/Position.json +92 -0
- package/dist/knowledge/data/python-api/Prim.json +63 -0
- package/dist/knowledge/data/python-api/Project.json +118 -0
- package/dist/knowledge/data/python-api/PythonOp.json +140 -0
- package/dist/knowledge/data/python-api/Quaternion.json +24 -0
- package/dist/knowledge/data/python-api/Replicator_COMP.json +9 -0
- package/dist/knowledge/data/python-api/Run.json +32 -0
- package/dist/knowledge/data/python-api/Runs.json +10 -0
- package/dist/knowledge/data/python-api/SOP.json +642 -0
- package/dist/knowledge/data/python-api/ScriptOp.json +119 -0
- package/dist/knowledge/data/python-api/Segment.json +25 -0
- package/dist/knowledge/data/python-api/Sequence.json +48 -0
- package/dist/knowledge/data/python-api/Stype.json +9 -0
- package/dist/knowledge/data/python-api/SysInfo.json +25 -0
- package/dist/knowledge/data/python-api/TOP.json +724 -0
- package/dist/knowledge/data/python-api/Timecode.json +200 -0
- package/dist/knowledge/data/python-api/UI.json +73 -0
- package/dist/knowledge/data/python-api/Vertex.json +25 -0
- package/dist/knowledge/data/python-api/baseCOMP.json +1019 -0
- package/dist/knowledge/data/python-api/evaluateDAT.json +1289 -0
- package/dist/knowledge/data/python-api/examineDAT.json +1289 -0
- package/dist/knowledge/data/python-api/glslTOP.json +724 -0
- package/dist/knowledge/data/python-api/index.json +1 -0
- package/dist/knowledge/data/python-api/listCOMP.json +1516 -0
- package/dist/knowledge/data/python-api/midiinDAT.json +1328 -0
- package/dist/knowledge/data/python-api/scriptCHOP.json +24 -0
- package/dist/knowledge/data/python-api/scriptDAT.json +1335 -0
- package/dist/knowledge/data/python-api/scriptSOP.json +24 -0
- package/dist/knowledge/data/python-api/scriptTOP.json +24 -0
- package/dist/knowledge/data/python-api/serialDAT.json +1323 -0
- package/dist/knowledge/data/python-api/tcpipDAT.json +1357 -0
- package/dist/knowledge/data/python-api/td.json +646 -0
- package/dist/knowledge/data/python-api/td_Module.json +24 -0
- package/dist/knowledge/data/tutorials/anatomy_of_a_chop.json +275 -0
- package/dist/knowledge/data/tutorials/build_a_list_comp.json +268 -0
- package/dist/knowledge/data/tutorials/index.json +1 -0
- package/dist/knowledge/data/tutorials/introduction_to_python_tutorial.json +1598 -0
- package/dist/knowledge/data/tutorials/tdbitwig_user_guide.json +1986 -0
- package/dist/knowledge/data/tutorials/touchdesigner_video_server_specification_guide.json +555 -0
- package/dist/knowledge/data/tutorials/video_streaming_user_guide.json +653 -0
- package/dist/knowledge/data/tutorials/write_a_cplusplus_chop.json +139 -0
- package/dist/knowledge/data/tutorials/write_a_cplusplus_plugin.json +796 -0
- package/dist/knowledge/data/tutorials/write_a_cplusplus_top.json +104 -0
- package/dist/knowledge/data/tutorials/write_a_cuda_dll.json +259 -0
- package/dist/knowledge/data/tutorials/write_a_glsl_material.json +2353 -0
- package/dist/knowledge/data/tutorials/write_a_glsl_top.json +818 -0
- package/dist/knowledge/data/tutorials/write_a_shared_memory_chop.json +261 -0
- package/dist/knowledge/data/tutorials/write_a_shared_memory_top.json +193 -0
- package/dist/recipes/audio_spectrum_bars.json +26 -0
- package/dist/recipes/data_sonification.json +37 -0
- package/dist/recipes/feedback_tunnel.json +73 -0
- package/dist/recipes/kinect_silhouette.json +45 -0
- package/dist/recipes/led_strip_mapper.json +32 -0
- package/dist/recipes/noise_landscape.json +76 -0
- package/dist/recipes/particle_galaxy.json +52 -0
- package/dist/recipes/projection_mapping.json +25 -0
- package/dist/recipes/reaction_diffusion.json +90 -0
- package/dist/recipes/webcam_glitch.json +40 -0
- package/package.json +74 -0
- package/recipes/audio_spectrum_bars.json +26 -0
- package/recipes/data_sonification.json +37 -0
- package/recipes/feedback_tunnel.json +73 -0
- package/recipes/kinect_silhouette.json +45 -0
- package/recipes/led_strip_mapper.json +32 -0
- package/recipes/noise_landscape.json +76 -0
- package/recipes/particle_galaxy.json +52 -0
- package/recipes/projection_mapping.json +25 -0
- package/recipes/reaction_diffusion.json +90 -0
- package/recipes/webcam_glitch.json +40 -0
- package/td/README.md +160 -0
- package/td/bootstrap.py +73 -0
- package/td/modules/mcp/__init__.py +1 -0
- package/td/modules/mcp/controllers/__init__.py +1 -0
- package/td/modules/mcp/controllers/api_controller.py +240 -0
- package/td/modules/mcp/dev.py +40 -0
- package/td/modules/mcp/events.py +25 -0
- package/td/modules/mcp/install.py +155 -0
- package/td/modules/mcp/services/__init__.py +1 -0
- package/td/modules/mcp/services/analysis_service.py +64 -0
- package/td/modules/mcp/services/api_service.py +195 -0
- package/td/modules/mcp/services/batch_service.py +49 -0
- package/td/modules/mcp/services/preview_service.py +40 -0
- package/td/modules/utils/__init__.py +1 -0
- package/td/modules/utils/version.py +3 -0
- package/td/startup.py +34 -0
- package/td/templates/webserver_callbacks.py +50 -0
- package/td/tests/test_api_controller.py +242 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/installBridge.ts","../src/utils/paths.ts","../src/server/tdmcpServer.ts","../src/prompts/debugNetwork.ts","../src/prompts/types.ts","../src/prompts/explainNetwork.ts","../src/prompts/optimizePerformance.ts","../src/prompts/remixVisual.ts","../src/prompts/visualArtistMode.ts","../src/prompts/index.ts","../src/resources/glslPatternResource.ts","../src/resources/shared.ts","../src/resources/operatorResource.ts","../src/knowledge/normalize.ts","../src/resources/patternResource.ts","../src/resources/pythonApiResource.ts","../src/resources/recipeResource.ts","../src/resources/tutorialResource.ts","../src/resources/index.ts","../src/tools/layer1/applyPostProcessing.ts","../src/feedback/errorChecker.ts","../src/feedback/previewCapture.ts","../src/td-client/types.ts","../src/tools/layer2/connectHelper.ts","../src/tools/result.ts","../src/tools/layer1/orchestration.ts","../src/tools/layer1/createAudioReactive.ts","../src/tools/layer1/createDataVisualization.ts","../src/tools/layer1/createFeedbackNetwork.ts","../src/tools/layer1/createGenerativeArt.ts","../src/tools/layer1/createParticleSystem.ts","../src/tools/layer1/createVisualSystem.ts","../src/tools/layer1/intent.ts","../src/tools/layer1/describeProject.ts","../src/tools/layer1/getPreview.ts","../src/tools/layer1/setupOutput.ts","../src/tools/layer1/index.ts","../src/tools/layer2/connectNodes.ts","../src/tools/layer2/createContainer.ts","../src/tools/layer2/createGlslShader.ts","../src/tools/layer2/createNodeChain.ts","../src/tools/layer2/createPythonScript.ts","../src/tools/layer2/duplicateNetwork.ts","../src/tools/layer2/setParametersBatch.ts","../src/tools/layer2/index.ts","../src/tools/layer3/compareTdNodes.ts","../src/tools/layer3/createTdNode.ts","../src/tools/layer3/deleteTdNode.ts","../src/tools/layer3/execNodeMethod.ts","../src/tools/layer3/executePythonScript.ts","../src/tools/layer3/findTdNodes.ts","../src/td-client/validators.ts","../src/tools/layer3/nodeMatch.ts","../src/tools/layer3/getModuleHelp.ts","../src/tools/layer3/getTdClassDetails.ts","../src/tools/layer3/getTdClasses.ts","../src/tools/layer3/getTdInfo.ts","../src/tools/layer3/getTdNodeErrors.ts","../src/tools/layer3/getTdNodeParameters.ts","../src/tools/layer3/getTdNodes.ts","../src/tools/layer3/getTdPerformance.ts","../src/feedback/performanceMonitor.ts","../src/tools/layer3/getTdTopology.ts","../src/feedback/networkVerifier.ts","../src/tools/layer3/snapshotTdGraph.ts","../src/tools/layer3/summarizeTdErrors.ts","../src/tools/layer3/updateTdNodeParameters.ts","../src/tools/layer3/index.ts","../src/tools/index.ts","../src/utils/version.ts","../src/knowledge/index.ts","../src/utils/logger.ts","../src/recipes/loader.ts","../src/recipes/schema.ts","../src/td-client/touchDesignerClient.ts","../src/utils/config.ts","../src/server/connectionManager.ts","../src/server/context.ts","../src/server/transportFactory.ts","../src/td-client/eventStream.ts","../src/index.ts"],"sourcesContent":["import { cpSync, existsSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { bridgeModulesDir } from \"../utils/paths.js\";\n\n/**\n * `tdmcp install-bridge [--dir <path>]`\n *\n * Copies the packaged TouchDesigner bridge modules (`td/modules`) to a friendly,\n * stable folder on disk and prints the two things the artist needs to turn the\n * bridge on inside TouchDesigner. This is what makes the `npx` flow work without\n * cloning the repo: the modules live in the npm cache otherwise.\n */\nexport function runInstallBridge(args: string[]): void {\n const dirFlag = args.indexOf(\"--dir\");\n const explicitDir = dirFlag !== -1 ? args[dirFlag + 1] : undefined;\n const targetRoot = explicitDir ?? join(homedir(), \"tdmcp-bridge\");\n const dest = join(targetRoot, \"modules\");\n\n const src = bridgeModulesDir();\n if (!existsSync(src)) {\n console.error(\n `[tdmcp] Could not find the bridge modules to copy (looked in ${src}).\\n` +\n \"If you're running from source, build first with `npm run build`.\",\n );\n process.exitCode = 1;\n return;\n }\n\n cpSync(src, dest, { recursive: true });\n\n const oneLiner = \"from mcp import install; install.run()\";\n const noPrefs = `import sys; sys.path.insert(0, ${JSON.stringify(dest)})\\n${oneLiner.replace(\"install.run()\", `install.run(modules_dir=${JSON.stringify(dest)})`)}`;\n\n console.log(\n [\n \"\",\n \" tdmcp bridge installed.\",\n ` Modules copied to: ${dest}`,\n \"\",\n \" Now switch the bridge on inside TouchDesigner:\",\n \"\",\n \" 1. Open Preferences (Edit > Preferences, or the TouchDesigner menu on macOS).\",\n ' In \"Python 64-bit Module Path\", add this folder:',\n \"\",\n ` ${dest}`,\n \"\",\n \" 2. Open the Textport (Dialogs > Textport and DATs) and run:\",\n \"\",\n ` ${oneLiner}`,\n \"\",\n \" You should see: [tdmcp] bridge running on port 9980 (/project1/tdmcp_bridge)\",\n \"\",\n \" ⚠ Security: the bridge runs arbitrary Python inside TouchDesigner and the\",\n \" Web Server DAT listens on all network interfaces with no auth. Only run it\",\n \" on a trusted network, or firewall port 9980 to localhost.\",\n \"\",\n \" Prefer not to touch Preferences? Paste this in the Textport instead:\",\n \"\",\n ...noPrefs.split(\"\\n\").map((line) => ` ${line}`),\n \"\",\n ].join(\"\\n\"),\n );\n}\n","import { existsSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nconst moduleDir = dirname(fileURLToPath(import.meta.url));\n\nfunction firstExisting(candidates: string[], fallback: string): string {\n for (const candidate of candidates) {\n if (existsSync(candidate)) return candidate;\n }\n return fallback;\n}\n\n/**\n * Directory holding the imported knowledge base JSON.\n * - dev (tsx): `<root>/src/knowledge/data`\n * - build (node): `<root>/dist/knowledge/data` (copied by `copy-assets.mjs`)\n */\nexport function knowledgeDataDir(): string {\n return firstExisting(\n [resolve(moduleDir, \"../knowledge/data\"), resolve(moduleDir, \"knowledge/data\")],\n resolve(moduleDir, \"../knowledge/data\"),\n );\n}\n\n/**\n * Directory holding recipe JSON files.\n * - dev: `<root>/recipes`\n * - build: `<root>/dist/recipes`\n */\nexport function recipesDir(): string {\n return firstExisting(\n [resolve(moduleDir, \"../../recipes\"), resolve(moduleDir, \"recipes\")],\n resolve(moduleDir, \"../../recipes\"),\n );\n}\n\n/**\n * Directory holding the TouchDesigner-side Python bridge modules that ship with\n * the package (the `td/modules` tree). Used by the `install-bridge` CLI to copy\n * them somewhere TouchDesigner can import from.\n * - dev (tsx): `<root>/td/modules`\n * - installed package (node): `<pkgroot>/td/modules`\n */\nexport function bridgeModulesDir(): string {\n return firstExisting(\n [resolve(moduleDir, \"../td/modules\"), resolve(moduleDir, \"../../td/modules\")],\n resolve(moduleDir, \"../td/modules\"),\n );\n}\n\n/**\n * Resolves the installed `@bottobot/td-mcp` package root (the source of operator\n * data), if present. Used as a fallback when local knowledge data is missing.\n */\nexport function bottobotPackageDir(): string | undefined {\n const candidates = [\n resolve(moduleDir, \"../../node_modules/@bottobot/td-mcp\"),\n resolve(moduleDir, \"../node_modules/@bottobot/td-mcp\"),\n resolve(process.cwd(), \"node_modules/@bottobot/td-mcp\"),\n ];\n for (const candidate of candidates) {\n if (existsSync(resolve(candidate, \"wiki/data/processed\"))) return candidate;\n }\n return undefined;\n}\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { registerAllPrompts } from \"../prompts/index.js\";\nimport { registerAllResources } from \"../resources/index.js\";\nimport { registerAllTools } from \"../tools/index.js\";\nimport type { TdmcpConfig } from \"../utils/config.js\";\nimport { getVersion } from \"../utils/version.js\";\nimport { buildToolContext, type ToolContextOverrides } from \"./context.js\";\n\nconst INSTRUCTIONS = `tdmcp lets you build visual systems in TouchDesigner.\n\nWorkflow:\n1. Call get_td_info first to confirm the bridge is reachable.\n2. Consult the knowledge base resources (tdmcp://operators/..., tdmcp://recipes/...) before creating nodes — never invent operator types.\n3. Build with the highest-level tool that fits, dropping to Layer 2/3 for fine control.\n4. After building, check get_td_node_errors and capture get_preview so the artist can see the result.\n5. Prefer structured inspection/edit tools (find_td_nodes, get_td_node_parameters, summarize_td_errors, compare_td_nodes, snapshot_td_graph, update_td_node_parameters) and process their structuredContent with code. Treat execute_python_script and exec_node_method as a last resort, only when no structured tool fits.\n\nThe server stays usable even when TouchDesigner is offline; tools return a friendly error in that case.`;\n\nexport type TdmcpServerOverrides = ToolContextOverrides;\n\n/** Builds a fully wired (but not yet connected) MCP server. */\nexport function createTdmcpServer(\n config: TdmcpConfig,\n overrides: TdmcpServerOverrides = {},\n): McpServer {\n const ctx = buildToolContext(config, overrides);\n const { knowledge, recipes, logger } = ctx;\n\n const server = new McpServer(\n { name: \"tdmcp\", version: getVersion() },\n { instructions: INSTRUCTIONS },\n );\n\n registerAllTools(server, ctx);\n registerAllResources(server, { knowledge, recipes, logger });\n registerAllPrompts(server, { knowledge, recipes, logger });\n\n logger.info(\"tdmcp server initialized\", {\n version: getVersion(),\n knowledge: knowledge.stats(),\n recipes: recipes.list().length,\n });\n\n return server;\n}\n","import { z } from \"zod\";\nimport { type PromptRegistrar, userPrompt } from \"./types.js\";\n\nexport const registerDebugNetwork: PromptRegistrar = (server) => {\n server.registerPrompt(\n \"debug_network\",\n {\n title: \"Debug network\",\n description:\n \"Systematically debug a TD network: check errors, verify connections, inspect cook times, and suggest fixes.\",\n argsSchema: { root_path: z.string().describe(\"Root path to debug from, e.g. /project1.\") },\n },\n ({ root_path }) =>\n userPrompt(\n [\n `Debug the TouchDesigner network under ${root_path}. Work step by step:`,\n `1. Call get_td_node_errors with path \"${root_path}\" and recursive=true. List every error/warning.`,\n `2. Call get_td_nodes for \"${root_path}\" to map the children, and get_td_node_parameters on any node that errored.`,\n \"3. For each error, explain the likely cause (missing input, bad parameter, unsupported operator, resolution mismatch) and the concrete fix.\",\n \"4. Apply fixes with update_td_node_parameters or connect_nodes, then re-run get_td_node_errors to confirm.\",\n \"5. Finish with get_preview on the output TOP to confirm it renders.\",\n ].join(\"\\n\"),\n ),\n );\n};\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { KnowledgeBase } from \"../knowledge/index.js\";\nimport type { RecipeLibrary } from \"../recipes/loader.js\";\nimport type { Logger } from \"../utils/logger.js\";\n\nexport interface PromptContext {\n knowledge: KnowledgeBase;\n recipes: RecipeLibrary;\n logger: Logger;\n}\n\nexport type PromptRegistrar = (server: McpServer, ctx: PromptContext) => void;\n\n/** Builds a single user-message prompt result. */\nexport function userPrompt(text: string) {\n return { messages: [{ role: \"user\" as const, content: { type: \"text\" as const, text } }] };\n}\n","import { z } from \"zod\";\nimport { type PromptRegistrar, userPrompt } from \"./types.js\";\n\nexport const registerExplainNetwork: PromptRegistrar = (server) => {\n server.registerPrompt(\n \"explain_network\",\n {\n title: \"Explain network\",\n description:\n \"Generate a human-readable explanation of what a TD network does: data flow, key parameters, and artistic intent.\",\n argsSchema: { root_path: z.string().describe(\"Root path to explain, e.g. /project1.\") },\n },\n ({ root_path }) =>\n userPrompt(\n [\n `Explain the TouchDesigner network under ${root_path} for someone learning TouchDesigner.`,\n `1. Call get_td_nodes for \"${root_path}\" and follow the connections to understand the data flow.`,\n \"2. Describe the signal path from input to output in plain language (what each stage does and why).\",\n \"3. Call out the key parameters an artist would tweak and what visual effect they have.\",\n \"4. Summarize the artistic intent — what the piece looks like and the technique it uses.\",\n \"Keep it concise and friendly; avoid dumping raw parameter lists.\",\n ].join(\"\\n\"),\n ),\n );\n};\n","import { z } from \"zod\";\nimport { type PromptRegistrar, userPrompt } from \"./types.js\";\n\nexport const registerOptimizePerformance: PromptRegistrar = (server) => {\n server.registerPrompt(\n \"optimize_performance\",\n {\n title: \"Optimize performance\",\n description:\n \"Analyze a TD network for performance: identify bottlenecks, suggest resolution changes, and recommend cooking optimizations.\",\n argsSchema: { root_path: z.string().describe(\"Root path to optimize, e.g. /project1.\") },\n },\n ({ root_path }) =>\n userPrompt(\n [\n `Optimize the TouchDesigner network under ${root_path} for real-time performance.`,\n `1. Inspect cook times: read tdmcp://operators for any heavy operators and use get_td_node_parameters under \"${root_path}\".`,\n \"2. Identify the most expensive nodes and explain why (resolution too high, cooking every frame, large blurs/feedback, CPU SOPs).\",\n \"3. Recommend concrete fixes: lower TOP resolution, use Null/Select for caching, reduce blur sizes, move CPU work to GPU, limit cook rate, bypass unused branches.\",\n \"4. Apply the safe changes with update_td_node_parameters and report the expected FPS impact. Do not delete nodes unless asked.\",\n ].join(\"\\n\"),\n ),\n );\n};\n","import { z } from \"zod\";\nimport { type PromptRegistrar, userPrompt } from \"./types.js\";\n\nexport const registerRemixVisual: PromptRegistrar = (server) => {\n server.registerPrompt(\n \"remix_visual\",\n {\n title: \"Remix visual\",\n description:\n \"Take an existing visual system and create variations — change colors, swap techniques, add effects, alter timing.\",\n argsSchema: {\n source_path: z.string().describe(\"Path of the visual system to remix.\"),\n remix_direction: z\n .string()\n .describe(\"What to change, e.g. 'make it darker', 'add glitch', 'slow it down'.\"),\n },\n },\n ({ source_path, remix_direction }) =>\n userPrompt(\n [\n `Remix the visual system at ${source_path}. Direction: \"${remix_direction}\".`,\n `1. Inspect it first: get_td_nodes and get_td_node_parameters under \"${source_path}\" to understand the current setup.`,\n \"2. Plan changes that match the direction (palette via level/hsv_adjust, motion via transform/feedback gain, texture via added effects).\",\n \"3. Prefer non-destructive edits: update parameters, or use apply_post_processing to add effects after the output. Do not delete the original unless asked.\",\n \"4. After editing, run get_td_node_errors and get_preview to show the remixed result, and describe what changed.\",\n ].join(\"\\n\"),\n ),\n );\n};\n","import { z } from \"zod\";\nimport { type PromptRegistrar, userPrompt } from \"./types.js\";\n\nexport const registerVisualArtistMode: PromptRegistrar = (server, ctx) => {\n server.registerPrompt(\n \"visual_artist_mode\",\n {\n title: \"Visual artist mode\",\n description:\n \"Think in terms of visual composition, color, motion and aesthetics rather than code while building in TouchDesigner.\",\n argsSchema: {\n style: z\n .string()\n .optional()\n .describe(\"Artistic style: abstract, geometric, organic, glitch, minimal, maximal.\"),\n },\n },\n ({ style }) => {\n const recipes = ctx.recipes\n .list()\n .map((r) => r.id)\n .join(\", \");\n return userPrompt(\n [\n \"You are in Visual Artist Mode for TouchDesigner via the tdmcp server.\",\n \"Think like a VJ / installation artist — composition, color, motion, rhythm, negative space — not code.\",\n \"\",\n \"Working method:\",\n \"1. Prefer high-level tools: create_visual_system (from a description) or create_feedback_network / create_generative_art / create_audio_reactive / create_particle_system.\",\n \"2. Before creating nodes, consult the knowledge resources: tdmcp://operators/{category|name} and tdmcp://recipes/{name}. Never invent operator types.\",\n \"3. Build inside a new container; keep the project tidy.\",\n \"4. After building, run get_td_node_errors, then get_preview so we can SEE the result, and iterate on the aesthetics.\",\n `Available recipes: ${recipes || \"(none yet)\"}.`,\n style ? `\\nLean into a \"${style}\" aesthetic in your choices.` : \"\",\n ].join(\"\\n\"),\n );\n },\n );\n};\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { registerDebugNetwork } from \"./debugNetwork.js\";\nimport { registerExplainNetwork } from \"./explainNetwork.js\";\nimport { registerOptimizePerformance } from \"./optimizePerformance.js\";\nimport { registerRemixVisual } from \"./remixVisual.js\";\nimport type { PromptContext } from \"./types.js\";\nimport { registerVisualArtistMode } from \"./visualArtistMode.js\";\n\n/** Registers every MCP prompt against the server. */\nexport function registerAllPrompts(server: McpServer, ctx: PromptContext): void {\n registerVisualArtistMode(server, ctx);\n registerDebugNetwork(server, ctx);\n registerOptimizePerformance(server, ctx);\n registerExplainNetwork(server, ctx);\n registerRemixVisual(server, ctx);\n}\n\nexport type { PromptContext } from \"./types.js\";\n","import { ResourceTemplate } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { firstVar, jsonContents, type ResourceRegistrar } from \"./shared.js\";\n\nexport const registerGlslPatternResource: ResourceRegistrar = (server, ctx) => {\n const template = new ResourceTemplate(\"tdmcp://glsl/{pattern_name}\", {\n list: async () => ({\n resources: ctx.knowledge.listGlslPatterns().map((pattern) => ({\n uri: `tdmcp://glsl/${pattern.id}`,\n name: pattern.name,\n description: `${pattern.difficulty} — ${pattern.description}`,\n mimeType: \"application/json\",\n })),\n }),\n });\n\n server.registerResource(\n \"td-glsl\",\n template,\n {\n title: \"GLSL shader patterns\",\n description: \"Named GLSL shader techniques with ready-to-use fragment shader snippets.\",\n mimeType: \"application/json\",\n },\n async (uri, variables) => {\n const name = firstVar(variables.pattern_name);\n const pattern = ctx.knowledge.getGlslPattern(name);\n if (!pattern) return jsonContents(uri, { error: `GLSL pattern \"${name}\" not found.` });\n return jsonContents(uri, pattern);\n },\n );\n};\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ReadResourceResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { KnowledgeBase } from \"../knowledge/index.js\";\nimport type { RecipeLibrary } from \"../recipes/loader.js\";\nimport type { Logger } from \"../utils/logger.js\";\n\nexport interface ResourceContext {\n knowledge: KnowledgeBase;\n recipes: RecipeLibrary;\n logger: Logger;\n}\n\nexport type ResourceRegistrar = (server: McpServer, ctx: ResourceContext) => void;\n\n/** URI template variables may be string or string[]; this returns the first scalar. */\nexport function firstVar(value: string | string[] | undefined): string {\n if (Array.isArray(value)) return value[0] ?? \"\";\n return value ?? \"\";\n}\n\nexport function jsonContents(uri: URL, data: unknown): ReadResourceResult {\n return {\n contents: [\n { uri: uri.href, mimeType: \"application/json\", text: JSON.stringify(data, null, 2) },\n ],\n };\n}\n","import { ResourceTemplate } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { compactKey } from \"../knowledge/normalize.js\";\nimport { firstVar, jsonContents, type ResourceRegistrar } from \"./shared.js\";\n\nexport const registerOperatorResource: ResourceRegistrar = (server, ctx) => {\n const template = new ResourceTemplate(\"tdmcp://operators/{name}\", {\n list: async () => ({\n resources: ctx.knowledge.listOperatorCategories().map((category) => ({\n uri: `tdmcp://operators/${category}`,\n name: `Operators: ${category}`,\n description: `All ${category} operators`,\n mimeType: \"application/json\",\n })),\n }),\n complete: {\n name: async (value) => {\n const categories = ctx.knowledge.listOperatorCategories();\n const operators = ctx.knowledge.searchOperators(value, 20).map((o) => o.slug);\n return [...categories, ...operators].slice(0, 50);\n },\n },\n });\n\n server.registerResource(\n \"td-operators\",\n template,\n {\n title: \"TouchDesigner operators\",\n description:\n \"Operator catalog. Read a category (TOP, CHOP, SOP, DAT, COMP, MAT, POP) to list its operators, or an operator name/slug for full documentation.\",\n mimeType: \"application/json\",\n },\n async (uri, variables) => {\n const name = firstVar(variables.name);\n const isCategory = ctx.knowledge\n .listOperatorCategories()\n .some((category) => compactKey(category) === compactKey(name));\n\n if (isCategory) {\n const operators = ctx.knowledge.listOperators(name);\n return jsonContents(uri, { category: name, count: operators.length, operators });\n }\n\n const doc = ctx.knowledge.getOperator(name);\n if (!doc) {\n const suggestions = ctx.knowledge.searchOperators(name, 5).map((o) => o.name);\n return jsonContents(uri, { error: `Operator \"${name}\" not found.`, suggestions });\n }\n return jsonContents(uri, doc);\n },\n );\n};\n","import type {\n GlslTechnique,\n OperatorDoc,\n OperatorSummary,\n Pattern,\n PythonClass,\n PythonClassSummary,\n Tutorial,\n TutorialSummary,\n} from \"./types.js\";\n\n/** Filename-style slug: lowercase, non-alphanumerics collapse to underscores. */\nexport function slugify(value: string): string {\n return value\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\");\n}\n\n/** Lookup key that unifies \"Noise TOP\", \"noiseTOP\" and \"noise_top\" → \"noisetop\". */\nexport function compactKey(value: string): string {\n return value.toLowerCase().replace(/[^a-z0-9]/g, \"\");\n}\n\nexport function toOperatorSummary(slug: string, doc: OperatorDoc): OperatorSummary {\n return {\n slug,\n name: doc.name,\n displayName: doc.displayName ?? doc.name,\n category: doc.category ?? \"Unknown\",\n subcategory: doc.subcategory ?? \"\",\n summary: doc.summary ?? doc.description ?? \"\",\n keywords: doc.keywords ?? [],\n };\n}\n\nexport function toPythonSummary(cls: PythonClass): PythonClassSummary {\n return {\n className: cls.className,\n displayName: cls.displayName ?? cls.className,\n category: cls.category ?? \"Unknown\",\n methodCount: cls.methods?.length ?? 0,\n memberCount: cls.members?.length ?? 0,\n };\n}\n\nexport function toTutorialSummary(tut: Tutorial): TutorialSummary {\n return {\n id: tut.id,\n name: tut.name,\n category: tut.category ?? \"Unknown\",\n summary: tut.summary ?? tut.description ?? \"\",\n };\n}\n\ninterface RawPattern {\n name?: string;\n description?: string;\n category?: string;\n workflow?: string[];\n use_case?: string;\n}\n\n/**\n * The bottobot patterns file is an object with a `patterns` array (plus extra\n * metadata keys). Normalizes it into a flat, id-keyed array.\n */\nexport function normalizePatterns(raw: unknown): Pattern[] {\n let list: RawPattern[] = [];\n if (Array.isArray(raw)) {\n list = raw as RawPattern[];\n } else if (raw && typeof raw === \"object\") {\n const obj = raw as Record<string, unknown>;\n if (Array.isArray(obj.patterns)) {\n list = obj.patterns as RawPattern[];\n } else {\n list = Object.values(obj).filter((v): v is RawPattern => !!v && typeof v === \"object\");\n }\n }\n return list\n .filter((p) => typeof p.name === \"string\")\n .map((p) => ({\n id: slugify(p.name as string),\n name: p.name as string,\n description: p.description,\n category: p.category,\n workflow: Array.isArray(p.workflow) ? p.workflow : undefined,\n use_case: p.use_case,\n }));\n}\n\ninterface RawGlslFile {\n techniques?: unknown;\n}\n\n/** Extracts GLSL techniques from bottobot's `experimental/glsl.json`. */\nexport function normalizeGlsl(raw: unknown): GlslTechnique[] {\n const file = (raw ?? {}) as RawGlslFile;\n const techniques = Array.isArray(file.techniques) ? file.techniques : [];\n return techniques\n .filter((t): t is Record<string, unknown> => !!t && typeof t === \"object\")\n .map((t) => {\n const name = typeof t.name === \"string\" ? t.name : \"Untitled\";\n const id = typeof t.id === \"string\" && t.id.length > 0 ? t.id : slugify(name);\n return {\n id,\n name,\n subcategory: typeof t.subcategory === \"string\" ? t.subcategory : undefined,\n description: typeof t.description === \"string\" ? t.description : undefined,\n difficulty: typeof t.difficulty === \"string\" ? t.difficulty : undefined,\n operators: Array.isArray(t.operators) ? (t.operators as string[]) : undefined,\n tags: Array.isArray(t.tags) ? (t.tags as string[]) : undefined,\n notes: typeof t.notes === \"string\" ? t.notes : undefined,\n code: (t.code ?? undefined) as GlslTechnique[\"code\"],\n setup: typeof t.setup === \"string\" ? t.setup : undefined,\n };\n });\n}\n","import { ResourceTemplate } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { firstVar, jsonContents, type ResourceRegistrar } from \"./shared.js\";\n\nexport const registerPatternResource: ResourceRegistrar = (server, ctx) => {\n const template = new ResourceTemplate(\"tdmcp://patterns/{pattern_name}\", {\n list: async () => ({\n resources: ctx.knowledge.listPatterns().map((pattern) => ({\n uri: `tdmcp://patterns/${pattern.id}`,\n name: pattern.name,\n description: pattern.description,\n mimeType: \"application/json\",\n })),\n }),\n });\n\n server.registerResource(\n \"td-patterns\",\n template,\n {\n title: \"TouchDesigner workflow patterns\",\n description: \"Named operator-chain workflow patterns (recommended wiring for common tasks).\",\n mimeType: \"application/json\",\n },\n async (uri, variables) => {\n const name = firstVar(variables.pattern_name);\n const pattern = ctx.knowledge.getPattern(name);\n if (!pattern) return jsonContents(uri, { error: `Pattern \"${name}\" not found.` });\n return jsonContents(uri, pattern);\n },\n );\n};\n","import { ResourceTemplate } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { firstVar, jsonContents, type ResourceRegistrar } from \"./shared.js\";\n\nexport const registerPythonApiResource: ResourceRegistrar = (server, ctx) => {\n const template = new ResourceTemplate(\"tdmcp://python-api/{class_name}\", {\n list: async () => ({\n resources: ctx.knowledge.listPythonClasses().map((cls) => ({\n uri: `tdmcp://python-api/${cls.className}`,\n name: `Python: ${cls.className}`,\n description: `${cls.methodCount} methods, ${cls.memberCount} members`,\n mimeType: \"application/json\",\n })),\n }),\n complete: {\n class_name: async (value) =>\n ctx.knowledge\n .listPythonClasses()\n .map((c) => c.className)\n .filter((n) => n.toLowerCase().includes(value.toLowerCase()))\n .slice(0, 50),\n },\n });\n\n server.registerResource(\n \"td-python-api\",\n template,\n {\n title: \"TouchDesigner Python API\",\n description: \"Python class reference (members + methods) for the TouchDesigner API.\",\n mimeType: \"application/json\",\n },\n async (uri, variables) => {\n const className = firstVar(variables.class_name);\n const cls = ctx.knowledge.getPythonClass(className);\n if (!cls) return jsonContents(uri, { error: `Python class \"${className}\" not found.` });\n return jsonContents(uri, cls);\n },\n );\n};\n","import { ResourceTemplate } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { firstVar, jsonContents, type ResourceRegistrar } from \"./shared.js\";\n\nexport const registerRecipeResource: ResourceRegistrar = (server, ctx) => {\n const template = new ResourceTemplate(\"tdmcp://recipes/{recipe_name}\", {\n list: async () => ({\n resources: ctx.recipes.list().map((recipe) => ({\n uri: `tdmcp://recipes/${recipe.id}`,\n name: recipe.name,\n description: `${recipe.difficulty} — ${recipe.description}`,\n mimeType: \"application/json\",\n })),\n }),\n });\n\n server.registerResource(\n \"td-recipes\",\n template,\n {\n title: \"Composite network recipes\",\n description: \"Pre-validated composite network templates (nodes + connections + parameters).\",\n mimeType: \"application/json\",\n },\n async (uri, variables) => {\n const name = firstVar(variables.recipe_name);\n const recipe = ctx.recipes.get(name);\n if (!recipe) {\n return jsonContents(uri, {\n error: `Recipe \"${name}\" not found.`,\n available: ctx.recipes.list().map((r) => r.id),\n });\n }\n return jsonContents(uri, recipe);\n },\n );\n};\n","import { ResourceTemplate } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { firstVar, jsonContents, type ResourceRegistrar } from \"./shared.js\";\n\nexport const registerTutorialResource: ResourceRegistrar = (server, ctx) => {\n const template = new ResourceTemplate(\"tdmcp://tutorials/{tutorial_name}\", {\n list: async () => ({\n resources: ctx.knowledge.listTutorials().map((tutorial) => ({\n uri: `tdmcp://tutorials/${tutorial.id}`,\n name: tutorial.name,\n description: tutorial.summary,\n mimeType: \"application/json\",\n })),\n }),\n });\n\n server.registerResource(\n \"td-tutorials\",\n template,\n {\n title: \"TouchDesigner tutorials\",\n description: \"Long-form tutorial content covering TD fundamentals and workflows.\",\n mimeType: \"application/json\",\n },\n async (uri, variables) => {\n const name = firstVar(variables.tutorial_name);\n const tutorial = ctx.knowledge.getTutorial(name);\n if (!tutorial) return jsonContents(uri, { error: `Tutorial \"${name}\" not found.` });\n return jsonContents(uri, tutorial);\n },\n );\n};\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { registerGlslPatternResource } from \"./glslPatternResource.js\";\nimport { registerOperatorResource } from \"./operatorResource.js\";\nimport { registerPatternResource } from \"./patternResource.js\";\nimport { registerPythonApiResource } from \"./pythonApiResource.js\";\nimport { registerRecipeResource } from \"./recipeResource.js\";\nimport type { ResourceContext } from \"./shared.js\";\nimport { registerTutorialResource } from \"./tutorialResource.js\";\n\n/** Registers every MCP resource (knowledge base) against the server. */\nexport function registerAllResources(server: McpServer, ctx: ResourceContext): void {\n registerOperatorResource(server, ctx);\n registerPythonApiResource(server, ctx);\n registerPatternResource(server, ctx);\n registerGlslPatternResource(server, ctx);\n registerRecipeResource(server, ctx);\n registerTutorialResource(server, ctx);\n}\n\nexport type { ResourceContext } from \"./shared.js\";\n","import { z } from \"zod\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\nimport { createSystemContainer, finalize, type NetworkBuilder, runBuild } from \"./orchestration.js\";\n\nconst q = (value: string): string => JSON.stringify(value);\n\nconst DIRECT_EFFECTS: Record<string, { type: string; parameters?: Record<string, unknown> }> = {\n bloom: { type: \"bloomTOP\" },\n blur: { type: \"blurTOP\", parameters: { size: 4 } },\n edge_detect: { type: \"edgeTOP\" },\n sharpen: { type: \"sharpenTOP\" },\n threshold: { type: \"thresholdTOP\", parameters: { threshold: 0.5 } },\n invert: { type: \"levelTOP\", parameters: { invert: 1 } },\n color_grade: { type: \"levelTOP\", parameters: { gamma1: 1.1, blacklevel: 0.02 } },\n};\n\nconst GLSL_EFFECTS: Record<string, string> = {\n rgb_split: `out vec4 fragColor;\nvoid main(){ vec2 uv=vUV.st; vec2 o=vec2(0.004,0.0);\n float r=texture(sTD2DInputs[0],uv+o).r; float g=texture(sTD2DInputs[0],uv).g; float b=texture(sTD2DInputs[0],uv-o).b;\n fragColor=TDOutputSwizzle(vec4(r,g,b,1.0)); }\n`,\n chromatic_aberration: `out vec4 fragColor;\nvoid main(){ vec2 uv=vUV.st; vec2 o=(uv-0.5)*0.02;\n float r=texture(sTD2DInputs[0],uv+o).r; float g=texture(sTD2DInputs[0],uv).g; float b=texture(sTD2DInputs[0],uv-o).b;\n fragColor=TDOutputSwizzle(vec4(r,g,b,1.0)); }\n`,\n scanlines: `out vec4 fragColor;\nvoid main(){ vec2 uv=vUV.st; vec4 c=texture(sTD2DInputs[0],uv);\n float s=0.85+0.15*step(0.5,fract(uv.y*uTD2DInfos[0].res.w*0.5));\n fragColor=TDOutputSwizzle(vec4(c.rgb*s,c.a)); }\n`,\n vignette: `out vec4 fragColor;\nvoid main(){ vec2 uv=vUV.st; vec4 c=texture(sTD2DInputs[0],uv);\n float v=smoothstep(0.8,0.35,distance(uv,vec2(0.5)));\n fragColor=TDOutputSwizzle(vec4(c.rgb*v,c.a)); }\n`,\n posterize: `out vec4 fragColor;\nvoid main(){ vec2 uv=vUV.st; vec4 c=texture(sTD2DInputs[0],uv);\n vec3 p=floor(c.rgb*6.0)/6.0; fragColor=TDOutputSwizzle(vec4(p,c.a)); }\n`,\n film_grain: `out vec4 fragColor;\nfloat hash(vec2 p){return fract(sin(dot(p,vec2(12.9898,78.233)))*43758.5453);}\nvoid main(){ vec2 uv=vUV.st; vec4 c=texture(sTD2DInputs[0],uv);\n float g=hash(uv*uTD2DInfos[0].res.zw)*0.12-0.06; fragColor=TDOutputSwizzle(vec4(c.rgb+g,c.a)); }\n`,\n glitch: `out vec4 fragColor;\nfloat hash(float x){return fract(sin(x*127.1)*43758.5453);}\nvoid main(){ vec2 uv=vUV.st; float band=floor(uv.y*24.0);\n float off=(hash(band)-0.5)*0.06*step(0.7,hash(band*1.7));\n fragColor=TDOutputSwizzle(texture(sTD2DInputs[0],uv+vec2(off,0.0))); }\n`,\n};\n\nconst EFFECTS = [\n \"bloom\",\n \"chromatic_aberration\",\n \"film_grain\",\n \"vignette\",\n \"color_grade\",\n \"sharpen\",\n \"blur\",\n \"edge_detect\",\n \"invert\",\n \"threshold\",\n \"posterize\",\n \"glitch\",\n \"rgb_split\",\n \"scanlines\",\n] as const;\n\nexport const applyPostProcessingSchema = z.object({\n source_path: z.string().describe(\"Path of the TOP to post-process.\"),\n effects: z.array(z.enum(EFFECTS)).min(1).describe(\"Effects to apply in order.\"),\n parent_path: z.string().default(\"/project1\"),\n});\ntype ApplyPostProcessingArgs = z.infer<typeof applyPostProcessingSchema>;\n\nasync function addGlslEffect(\n builder: NetworkBuilder,\n name: string,\n fragment: string,\n): Promise<string> {\n const glsl = await builder.add(\"glslTOP\", name);\n const frag = await builder.add(\"textDAT\", `${name}_frag`);\n await builder.python(\n `op(${q(frag)}).text = ${q(fragment)}\\nop(${q(glsl)}).par.pixeldat = op(${q(frag)}).name`,\n );\n return glsl;\n}\n\nexport async function applyPostProcessingImpl(ctx: ToolContext, args: ApplyPostProcessingArgs) {\n return runBuild(async () => {\n const builder = await createSystemContainer(ctx, args.parent_path, \"post_fx\");\n // Wires can't cross COMPs, so pull the external source in via a Select TOP (references by path).\n const source = await builder.add(\"selectTOP\", \"source\");\n await builder.setParams(source, { top: args.source_path });\n let previous = source;\n let applied = 0;\n\n for (let i = 0; i < args.effects.length; i++) {\n const effect = args.effects[i];\n if (!effect) continue;\n let nodePath: string | undefined;\n const direct = DIRECT_EFFECTS[effect];\n if (direct) {\n nodePath = await builder.add(direct.type, `${effect}${i}`, direct.parameters);\n } else if (GLSL_EFFECTS[effect]) {\n nodePath = await addGlslEffect(builder, `${effect}${i}`, GLSL_EFFECTS[effect]);\n }\n if (!nodePath) {\n builder.warnings.push(`Effect \"${effect}\" is not supported and was skipped.`);\n continue;\n }\n await builder.connect(previous, nodePath);\n previous = nodePath;\n applied++;\n }\n\n const out = await builder.add(\"nullTOP\", \"out1\");\n await builder.connect(previous, out);\n\n return finalize(ctx, {\n summary: `Applied ${applied}/${args.effects.length} post-processing effect(s) to ${args.source_path}.`,\n builder,\n outputPath: out,\n extra: { source_path: args.source_path, effects: args.effects },\n });\n });\n}\n\nexport const registerApplyPostProcessing: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"apply_post_processing\",\n {\n title: \"Apply post-processing\",\n description:\n \"Chain post-processing effects (bloom, glitch, rgb_split, vignette, etc.) onto an existing TOP. Returns the processed output.\",\n inputSchema: applyPostProcessingSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },\n },\n (args) => applyPostProcessingImpl(ctx, args),\n );\n};\n","import type { TouchDesignerClient } from \"../td-client/touchDesignerClient.js\";\nimport type { TdNodeError } from \"../td-client/types.js\";\n\nexport interface ErrorReport {\n path: string;\n hasErrors: boolean;\n errors: TdNodeError[];\n}\n\n/** Checks a node (or its whole sub-network) for errors after building. */\nexport async function checkErrors(\n client: TouchDesignerClient,\n path: string,\n recursive = true,\n): Promise<ErrorReport> {\n const result = recursive ? await client.getNetworkErrors(path) : await client.getNodeErrors(path);\n return { path, hasErrors: result.errors.length > 0, errors: result.errors };\n}\n","import type { TouchDesignerClient } from \"../td-client/touchDesignerClient.js\";\n\nexport interface PreviewResult {\n path: string;\n width: number;\n height: number;\n base64: string;\n mimeType: string;\n}\n\n/** Captures a TOP as a base64 image via the bridge preview endpoint. */\nexport async function capturePreview(\n client: TouchDesignerClient,\n path: string,\n width = 640,\n height = 360,\n): Promise<PreviewResult> {\n const preview = await client.getPreview(path, width, height);\n return {\n path: preview.path,\n width: preview.width,\n height: preview.height,\n base64: preview.base64,\n mimeType: `image/${preview.format || \"png\"}`,\n };\n}\n","/** Base error for all TouchDesigner bridge failures. */\nexport class TdError extends Error {\n readonly code: string;\n\n constructor(message: string, code: string, options?: { cause?: unknown }) {\n super(message, options);\n this.name = \"TdError\";\n this.code = code;\n }\n}\n\n/** The bridge could not be reached (TD not running, wrong host/port, etc.). */\nexport class TdConnectionError extends TdError {\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, \"TD_CONNECTION\", options);\n this.name = \"TdConnectionError\";\n }\n}\n\n/** The request exceeded the configured timeout. */\nexport class TdTimeoutError extends TdError {\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, \"TD_TIMEOUT\", options);\n this.name = \"TdTimeoutError\";\n }\n}\n\n/** The bridge responded but reported an error (HTTP non-2xx or `ok: false`). */\nexport class TdApiError extends TdError {\n readonly status: number | undefined;\n readonly apiCode: string | undefined;\n\n constructor(message: string, options?: { status?: number; apiCode?: string; cause?: unknown }) {\n super(message, \"TD_API\", options);\n this.name = \"TdApiError\";\n this.status = options?.status;\n this.apiCode = options?.apiCode;\n }\n}\n\n/** Produces a human-friendly, single-line description of any error. */\nexport function friendlyTdError(err: unknown): string {\n if (err instanceof TdError) return err.message;\n if (err instanceof Error) return err.message;\n return String(err);\n}\n\nexport type {\n ApiEnvelope,\n CreateNodeInput,\n TdBatchOperation,\n TdBatchResult,\n TdConnection,\n TdDeleteResult,\n TdExecResult,\n TdInfo,\n TdMethodResult,\n TdNodeDetail,\n TdNodeError,\n TdNodeErrors,\n TdNodeList,\n TdNodeRef,\n TdPerformance,\n TdPreview,\n TdTopology,\n} from \"./validators.js\";\n","import type { TouchDesignerClient } from \"../../td-client/touchDesignerClient.js\";\nimport { TdApiError } from \"../../td-client/types.js\";\n\nexport interface ConnectResult {\n method: \"batch\" | \"python\";\n}\n\n/**\n * Connects two nodes. Prefers the bridge `/api/batch` connect op; if the bridge\n * responds with an API error (e.g. batch not supported), falls back to a Python\n * `inputConnectors[...].connect(...)` call. Connection/timeout errors propagate.\n */\nexport async function connectNodesViaBridge(\n client: TouchDesignerClient,\n sourcePath: string,\n targetPath: string,\n sourceOutput = 0,\n targetInput = 0,\n): Promise<ConnectResult> {\n try {\n const result = await client.batch([\n {\n action: \"connect\",\n source_path: sourcePath,\n target_path: targetPath,\n source_output: sourceOutput,\n target_input: targetInput,\n },\n ]);\n if (result.results[0]?.ok) return { method: \"batch\" };\n } catch (err) {\n if (!(err instanceof TdApiError)) throw err;\n }\n\n // Fallback: wire via Python inside TD.\n const src = JSON.stringify(sourcePath);\n const dst = JSON.stringify(targetPath);\n const python = `op(${dst}).inputConnectors[${targetInput}].connect(op(${src}).outputConnectors[${sourceOutput}])`;\n await client.executePythonScript(python, false);\n return { method: \"python\" };\n}\n","import type { CallToolResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport { friendlyTdError } from \"../td-client/types.js\";\n\ntype Content = CallToolResult[\"content\"];\n\nexport function textResult(text: string): CallToolResult {\n return { content: [{ type: \"text\", text }] };\n}\n\nexport function errorResult(message: string): CallToolResult {\n return { isError: true, content: [{ type: \"text\", text: message }] };\n}\n\n/** A text block followed by a pretty-printed JSON code fence. */\nexport function jsonResult(summary: string, data: unknown): CallToolResult {\n const text = `${summary}\\n\\n\\`\\`\\`json\\n${JSON.stringify(data, null, 2)}\\n\\`\\`\\``;\n return { content: [{ type: \"text\", text }] };\n}\n\n/**\n * A short text summary plus a machine-readable `structuredContent` payload.\n *\n * Use this (with an `outputSchema` on the tool) for read tools so agents can\n * process the data with code instead of re-parsing a JSON code fence out of the\n * conversation. The text block stays small on purpose — it is only a summary;\n * the full data travels on the `structuredContent` channel.\n */\nexport function structuredResult(summary: string, data: object): CallToolResult {\n return {\n content: [{ type: \"text\", text: summary }],\n structuredContent: data as { [key: string]: unknown },\n };\n}\n\n/** An image block (base64), optionally preceded by a caption. */\nexport function imageResult(\n base64: string,\n mimeType = \"image/png\",\n caption?: string,\n): CallToolResult {\n const content: Content = [];\n if (caption) content.push({ type: \"text\", text: caption });\n content.push({ type: \"image\", data: base64, mimeType });\n return { content };\n}\n\n/**\n * Runs a client call and formats the result, converting any TD error into a\n * friendly `isError` result instead of throwing out of the MCP handler.\n */\nexport async function guardTd<T>(\n fn: () => Promise<T>,\n onOk: (value: T) => CallToolResult,\n): Promise<CallToolResult> {\n try {\n return onOk(await fn());\n } catch (err) {\n return errorResult(friendlyTdError(err));\n }\n}\n","import type { CallToolResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport { checkErrors } from \"../../feedback/errorChecker.js\";\nimport { capturePreview } from \"../../feedback/previewCapture.js\";\nimport type { Recipe, RecipeGlslUniform } from \"../../recipes/schema.js\";\nimport { friendlyTdError } from \"../../td-client/types.js\";\nimport { connectNodesViaBridge } from \"../layer2/connectHelper.js\";\nimport { errorResult } from \"../result.js\";\nimport type { ToolContext } from \"../types.js\";\n\nconst q = (value: string): string => JSON.stringify(value);\n\n/**\n * Maps each GLSL TOP uniform kind to the parameter *sequence* that binds it and the\n * per-block value sub-parameter suffixes (verified against a live GLSL TOP). A scalar\n * `uniform float` and a `uniform vecN` both bind through the \"Vectors\" page (the `vec`\n * sequence) — a float just fills the first (`valuex`) component; `color` binds through\n * the \"Colors\" page (the `color` sequence). The block name lives at `<seq><i>name`,\n * the values at `<seq><i><suffix>`. (The \"Constants\" page does not feed `uniform float`.)\n */\nconst UNIFORM_KINDS: Record<\n RecipeGlslUniform[\"kind\"],\n { seq: \"vec\" | \"color\"; fields: readonly string[] }\n> = {\n float: { seq: \"vec\", fields: [\"valuex\"] },\n vec: { seq: \"vec\", fields: [\"valuex\", \"valuey\", \"valuez\", \"valuew\"] },\n color: { seq: \"color\", fields: [\"rgbr\", \"rgbg\", \"rgbb\", \"alpha\"] },\n};\n\ninterface UniformGroup {\n node: string;\n seq: \"vec\" | \"color\";\n items: RecipeGlslUniform[];\n}\n\n/**\n * Groups uniforms by node + binding sequence, preserving order (block index = position\n * in group). `float` and `vec` share the `vec` sequence, so they land in one group and\n * receive distinct block indices.\n */\nfunction groupUniforms(uniforms: readonly RecipeGlslUniform[]): UniformGroup[] {\n const groups = new Map<string, UniformGroup>();\n for (const uniform of uniforms) {\n const { seq } = UNIFORM_KINDS[uniform.kind];\n const key = `${uniform.node} ${seq}`;\n let group = groups.get(key);\n if (!group) {\n group = { node: uniform.node, seq, items: [] };\n groups.set(key, group);\n }\n group.items.push(uniform);\n }\n return [...groups.values()];\n}\n\n/**\n * Conversion operators (e.g. `choptoTOP`, `dattoCHOP`, `toptoCHOP`, `soptoDAT`)\n * read their source from a parameter named after the source family, not from a\n * connector wire. Returns that parameter name (`chop`/`dat`/`top`/`sop`) or undefined.\n */\nfunction converterSourceParam(type: string): string | undefined {\n const match = /^(chop|dat|top|sop)to/i.exec(type);\n return match?.[1]?.toLowerCase();\n}\n\n/** Wraps a Layer 1 build, converting any thrown TD error into a friendly result. */\nexport async function runBuild(fn: () => Promise<CallToolResult>): Promise<CallToolResult> {\n try {\n return await fn();\n } catch (err) {\n return errorResult(friendlyTdError(err));\n }\n}\n\nexport interface CreatedNode {\n name: string;\n path: string;\n type: string;\n}\n\n/**\n * Stateful helper for building a network inside a container. Connection / param\n * failures are collected as warnings rather than thrown, so a partial build still\n * returns useful information (fail-forward).\n */\nexport class NetworkBuilder {\n readonly created: CreatedNode[] = [];\n readonly warnings: string[] = [];\n private readonly nameToPath = new Map<string, string>();\n private readonly pathToType = new Map<string, string>();\n\n constructor(\n private readonly ctx: ToolContext,\n readonly containerPath: string,\n ) {}\n\n async add(\n type: string,\n name?: string,\n parameters?: Record<string, unknown>,\n parentPath?: string,\n ): Promise<string> {\n const ref = await this.ctx.client.createNode({\n parent_path: parentPath ?? this.containerPath,\n type,\n name,\n parameters,\n });\n if (name) this.nameToPath.set(name, ref.path);\n if (ref.name) this.nameToPath.set(ref.name, ref.path);\n this.pathToType.set(ref.path, ref.type || type);\n this.created.push({ name: ref.name || name || \"\", path: ref.path, type: ref.type || type });\n // A fresh geometryCOMP ships with a default torus1 that renders over the real\n // geometry; clear its default children before the builder populates it.\n if (/geometrycomp/i.test(type)) {\n await this.python(`_g = op(${q(ref.path)})\\nfor _c in list(_g.children):\\n _c.destroy()`);\n }\n return ref.path;\n }\n\n pathOf(name: string): string | undefined {\n return this.nameToPath.get(name);\n }\n\n async connect(fromPath: string, toPath: string, fromOutput = 0, toInput = 0): Promise<void> {\n // Conversion ops (choptoTOP, dattoCHOP, …) take their source via a parameter.\n const targetType = this.pathToType.get(toPath);\n const param = targetType ? converterSourceParam(targetType) : undefined;\n if (param) {\n await this.setParams(toPath, { [param]: fromPath });\n return;\n }\n try {\n await connectNodesViaBridge(this.ctx.client, fromPath, toPath, fromOutput, toInput);\n } catch (err) {\n this.warnings.push(`Failed to connect ${fromPath} → ${toPath}: ${friendlyTdError(err)}`);\n }\n }\n\n async setParams(path: string, parameters: Record<string, unknown>): Promise<void> {\n try {\n await this.ctx.client.updateNodeParameters(path, parameters);\n } catch (err) {\n this.warnings.push(`Failed to set parameters on ${path}: ${friendlyTdError(err)}`);\n }\n }\n\n async python(code: string): Promise<void> {\n try {\n await this.ctx.client.executePythonScript(code, false);\n } catch (err) {\n this.warnings.push(`Python step failed: ${friendlyTdError(err)}`);\n }\n }\n}\n\n/** Creates a fresh base COMP to hold a visual system and returns a builder for it. */\nexport async function createSystemContainer(\n ctx: ToolContext,\n parentPath: string,\n name: string,\n): Promise<NetworkBuilder> {\n const container = await ctx.client.createNode({\n parent_path: parentPath,\n type: \"baseCOMP\",\n name,\n });\n return new NetworkBuilder(ctx, container.path);\n}\n\nexport interface RecipeBuildResult {\n builder: NetworkBuilder;\n outputPath?: string;\n}\n\n/** Instantiates a recipe inside a new container under `parentPath`. */\nexport async function buildFromRecipe(\n ctx: ToolContext,\n recipe: Recipe,\n parentPath: string,\n): Promise<RecipeBuildResult> {\n const builder = await createSystemContainer(ctx, parentPath, recipe.id);\n\n for (const node of recipe.nodes) {\n let parentPath: string | undefined;\n if (node.parent) {\n parentPath = builder.pathOf(node.parent);\n if (!parentPath) {\n builder.warnings.push(\n `Node \"${node.name}\" references unknown parent \"${node.parent}\" (it must appear earlier in nodes).`,\n );\n }\n }\n await builder.add(node.type, node.name, node.parameters, parentPath);\n }\n\n // Inline GLSL: place each shader in a Text DAT and point the GLSL TOP's pixeldat at it.\n if (recipe.glsl_code) {\n for (const [nodeName, code] of Object.entries(recipe.glsl_code)) {\n const target = builder.pathOf(nodeName);\n if (!target) {\n builder.warnings.push(`glsl_code references unknown node \"${nodeName}\".`);\n continue;\n }\n const fragPath = await builder.add(\"textDAT\", `${nodeName}_frag`);\n await builder.python(\n `op(${q(fragPath)}).text = ${q(code)}\\nop(${q(target)}).par.pixeldat = op(${q(fragPath)}).name`,\n );\n }\n }\n\n // GLSL TOP uniforms: these live in parameter sequences, so the block count must be\n // raised (op.seq.<seq>.numBlocks, which has no structured setter) before the\n // per-block name/value sub-parameters exist and can be set the normal way.\n for (const group of groupUniforms(recipe.glsl_uniforms)) {\n const target = builder.pathOf(group.node);\n if (!target) {\n builder.warnings.push(`glsl_uniforms references unknown node \"${group.node}\".`);\n continue;\n }\n await builder.python(\n `_seq = op(${q(target)}).seq.${group.seq}\\n_seq.numBlocks = max(_seq.numBlocks, ${group.items.length})`,\n );\n for (const [i, uniform] of group.items.entries()) {\n const { fields } = UNIFORM_KINDS[uniform.kind];\n const params: Record<string, unknown> = { [`${group.seq}${i}name`]: uniform.name };\n const values = Array.isArray(uniform.value)\n ? uniform.value\n : uniform.value === undefined\n ? []\n : [uniform.value];\n for (const [j, field] of fields.entries()) {\n const value = values[j];\n if (value !== undefined) params[`${group.seq}${i}${field}`] = value;\n }\n await builder.setParams(target, params);\n }\n }\n\n // Inline Python: set the target DAT's text.\n if (recipe.python_code) {\n for (const [nodeName, code] of Object.entries(recipe.python_code)) {\n const target = builder.pathOf(nodeName);\n if (!target) {\n builder.warnings.push(`python_code references unknown node \"${nodeName}\".`);\n continue;\n }\n await builder.python(`op(${q(target)}).text = ${q(code)}`);\n }\n }\n\n // Exposed parameters; a string value matching a node name resolves to that node's path.\n for (const param of recipe.parameters) {\n const target = builder.pathOf(param.node);\n if (!target) {\n builder.warnings.push(`Parameter \"${param.name}\" references unknown node \"${param.node}\".`);\n continue;\n }\n if (param.value === undefined) continue;\n let value = param.value;\n if (typeof value === \"string\") {\n const referenced = builder.pathOf(value);\n if (referenced) value = referenced;\n }\n await builder.setParams(target, { [param.param]: value });\n }\n\n for (const connection of recipe.connections) {\n const from = builder.pathOf(connection.from);\n const to = builder.pathOf(connection.to);\n if (!from || !to) {\n builder.warnings.push(\n `Connection ${connection.from} → ${connection.to} references an unknown node.`,\n );\n continue;\n }\n await builder.connect(from, to, connection.from_output, connection.to_input);\n }\n\n // Nested render geometry: make each flagged SOP the one its parent COMP renders,\n // clearing its siblings (including the COMP's default torus).\n for (const node of recipe.nodes) {\n if (!node.render) continue;\n const target = builder.pathOf(node.name);\n if (!target) continue;\n await builder.python(\n `_n = op(${q(target)})\\n_p = _n.parent()\\nfor _c in _p.children:\\n _c.render = False\\n _c.display = False\\n_n.render = True\\n_n.display = True`,\n );\n }\n\n const outNode =\n recipe.nodes.find((n) => /^out/i.test(n.name)) ?? recipe.nodes[recipe.nodes.length - 1];\n const outputPath = outNode ? builder.pathOf(outNode.name) : undefined;\n return { builder, outputPath };\n}\n\nexport interface FinalizeOptions {\n summary: string;\n builder: NetworkBuilder;\n outputPath?: string;\n recipeId?: string;\n capturePreviewImage?: boolean;\n extra?: Record<string, unknown>;\n}\n\n/**\n * Shared \"verify → preview → respond\" step for Layer 1 tools: runs an error check,\n * captures a preview of the output TOP, and returns a structured result with an\n * inline preview image when available.\n */\nexport async function finalize(\n ctx: ToolContext,\n options: FinalizeOptions,\n): Promise<CallToolResult> {\n const { builder } = options;\n const warnings = [...builder.warnings];\n\n let errors: Array<{ path: string; message: string }> = [];\n try {\n const report = await checkErrors(ctx.client, builder.containerPath);\n errors = report.errors;\n if (report.hasErrors)\n warnings.push(`${report.errors.length} node error(s) detected after build.`);\n } catch (err) {\n warnings.push(`Error check unavailable: ${friendlyTdError(err)}`);\n }\n\n let previewBase64: string | undefined;\n let previewMime: string | undefined;\n if (options.capturePreviewImage !== false && options.outputPath) {\n try {\n const preview = await capturePreview(ctx.client, options.outputPath);\n previewBase64 = preview.base64;\n previewMime = preview.mimeType;\n } catch (err) {\n warnings.push(`Preview unavailable: ${friendlyTdError(err)}`);\n }\n }\n\n const data = {\n container: builder.containerPath,\n created: builder.created.map((c) => c.path),\n output: options.outputPath,\n recipe: options.recipeId,\n errors,\n warnings,\n ...options.extra,\n };\n\n const content: CallToolResult[\"content\"] = [\n {\n type: \"text\",\n text: `${options.summary}\\n\\n\\`\\`\\`json\\n${JSON.stringify(data, null, 2)}\\n\\`\\`\\``,\n },\n ];\n if (previewBase64) {\n content.push({ type: \"image\", data: previewBase64, mimeType: previewMime ?? \"image/png\" });\n }\n return { content };\n}\n","import { z } from \"zod\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\nimport { createSystemContainer, finalize, type NetworkBuilder, runBuild } from \"./orchestration.js\";\n\nconst q = (value: string): string => JSON.stringify(value);\n\nconst AUDIO_SPECTRUM_SHADER = `out vec4 fragColor;\nvoid main(){\n vec2 uv = vUV.st;\n float amp = texture(sTD2DInputs[0], vec2(uv.x, 0.5)).r;\n float bar = step(uv.y, clamp(amp, 0.0, 1.0));\n vec3 col = mix(vec3(0.02, 0.0, 0.08), vec3(0.1, 0.8, 1.0), uv.x) * bar;\n fragColor = TDOutputSwizzle(vec4(col, 1.0));\n}\n`;\n\nexport const createAudioReactiveSchema = z.object({\n audio_source: z.enum([\"microphone\", \"file\", \"device_in\", \"existing_chop\"]).default(\"microphone\"),\n audio_file_path: z.string().optional().describe(\"Audio file path (audio_source='file').\"),\n existing_chop_path: z\n .string()\n .optional()\n .describe(\"Existing CHOP path (audio_source='existing_chop').\"),\n visual_style: z.enum([\"geometric\", \"particle\", \"feedback\", \"glsl\", \"instancing\"]),\n frequency_bands: z\n .number()\n .int()\n .positive()\n .default(8)\n .describe(\n \"Spectrum resolution: sets the Audio Spectrum CHOP output length (TouchDesigner clamps it to 128–4096 bins). Higher = finer spectrum.\",\n ),\n beat_detection: z.boolean().default(true),\n parent_path: z.string().default(\"/project1\"),\n});\ntype CreateAudioReactiveArgs = z.infer<typeof createAudioReactiveSchema>;\n\nasync function buildAudioSource(\n builder: NetworkBuilder,\n args: CreateAudioReactiveArgs,\n): Promise<string> {\n if (args.audio_source === \"existing_chop\" && args.existing_chop_path) {\n return args.existing_chop_path;\n }\n if (args.audio_source === \"file\") {\n return builder.add(\"audiofileinCHOP\", \"audioin\", {\n ...(args.audio_file_path ? { file: args.audio_file_path } : {}),\n play: 1,\n });\n }\n return builder.add(\"audiodeviceinCHOP\", \"audioin\");\n}\n\nexport async function createAudioReactiveImpl(ctx: ToolContext, args: CreateAudioReactiveArgs) {\n return runBuild(async () => {\n const builder = await createSystemContainer(ctx, args.parent_path, \"audio_reactive\");\n\n const audioSource = await buildAudioSource(builder, args);\n // Cap the spectrum output length so the downstream CHOP-to-TOP texture stays within\n // GPU limits. Left on \"Match Length To Frequency\", the spectrum emits ~22050 samples,\n // which overflows the 16384 max texture width and triggers a clamp warning. TouchDesigner\n // clamps outlength to 128–4096, so frequency_bands maps into that range.\n const outLength = Math.min(Math.max(args.frequency_bands, 128), 4096);\n const spectrum = await builder.add(\"audiospectrumCHOP\", \"spectrum\", {\n outputmenu: \"setmanually\",\n outlength: outLength,\n });\n await builder.connect(audioSource, spectrum);\n\n const analyze = await builder.add(\"analyzeCHOP\", \"level\", { function: 6 });\n await builder.connect(audioSource, analyze);\n\n if (args.beat_detection) {\n const beat = await builder.add(\"beatCHOP\", \"beat\");\n await builder.connect(audioSource, beat);\n }\n\n const audioTex = await builder.add(\"choptoTOP\", \"audio_tex\");\n await builder.connect(spectrum, audioTex);\n\n let visual: string;\n if (args.visual_style === \"glsl\") {\n // Give the visual a real canvas + RGBA format. Left on \"use input\", the GLSL TOP\n // inherits the audio texture's Nx1 mono resolution, collapsing the output to a\n // 1px-tall grayscale strip.\n visual = await builder.add(\"glslTOP\", \"visual\", {\n outputresolution: \"custom\",\n resolutionw: 1280,\n resolutionh: 720,\n format: \"rgba8fixed\",\n });\n const frag = await builder.add(\"textDAT\", \"visual_frag\");\n await builder.python(\n `op(${q(frag)}).text = ${q(AUDIO_SPECTRUM_SHADER)}\\nop(${q(visual)}).par.pixeldat = op(${q(frag)}).name`,\n );\n await builder.connect(audioTex, visual);\n } else {\n visual = await builder.add(\"circleTOP\", \"visual\", { radius: 0.3 });\n await builder.python(\n `c = op(${q(visual)})\\nfor p in ('radiusx', 'radiusy'):\\n try:\\n par = getattr(c.par, p)\\n par.expr = \"0.2 + op('level')['chan1'] * 0.6\"\\n except Exception: pass`,\n );\n builder.warnings.push(\n `Visual style \"${args.visual_style}\" is approximated: a circle driven by the audio level. Refine the mapping for production.`,\n );\n }\n\n const out = await builder.add(\"nullTOP\", \"out1\");\n await builder.connect(visual, out);\n\n return finalize(ctx, {\n summary: `Created an audio-reactive system (source: ${args.audio_source}, style: ${args.visual_style}, ${args.frequency_bands} bands).`,\n builder,\n outputPath: out,\n extra: {\n audio_source: args.audio_source,\n visual_style: args.visual_style,\n beat_detection: args.beat_detection,\n },\n });\n });\n}\n\nexport const registerCreateAudioReactive: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"create_audio_reactive\",\n {\n title: \"Create audio-reactive visual\",\n description:\n \"Build an audio analysis chain (spectrum + level + optional beat) and a visual driven by it. The 'glsl' style renders a spectrum visualization; other styles are approximated.\",\n inputSchema: createAudioReactiveSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },\n },\n (args) => createAudioReactiveImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\nimport { createSystemContainer, finalize, runBuild } from \"./orchestration.js\";\n\nconst q = (value: string): string => JSON.stringify(value);\n\nconst BARS_SHADER = `out vec4 fragColor;\nvoid main(){\n vec2 uv = vUV.st;\n float v = texture(sTD2DInputs[0], vec2(uv.x, 0.5)).r;\n float bar = step(uv.y, clamp(v, 0.0, 1.0));\n vec3 col = mix(vec3(0.03, 0.05, 0.1), vec3(0.2, 0.9, 0.6), uv.x) * bar;\n fragColor = TDOutputSwizzle(vec4(col, 1.0));\n}\n`;\n\nconst SOURCE_TYPE = {\n table: \"tableDAT\",\n file: \"fileinDAT\",\n chop: \"constantCHOP\",\n} as const;\n\nexport const createDataVisualizationSchema = z.object({\n data_source: z.enum([\"table\", \"file\", \"chop\"]).default(\"table\"),\n chart_style: z.enum([\"bars\", \"graph\", \"points\"]).default(\"bars\"),\n parent_path: z.string().default(\"/project1\"),\n});\ntype CreateDataVisualizationArgs = z.infer<typeof createDataVisualizationSchema>;\n\nexport async function createDataVisualizationImpl(\n ctx: ToolContext,\n args: CreateDataVisualizationArgs,\n) {\n return runBuild(async () => {\n const builder = await createSystemContainer(ctx, args.parent_path, \"data_viz\");\n const source = await builder.add(SOURCE_TYPE[args.data_source], \"data\");\n\n // Seed the placeholder table so the chart shows sample bars immediately instead of a\n // blank 1x1 output; an empty table yields a single zero-valued sample.\n if (args.data_source === \"table\") {\n const rows = Array.from({ length: 16 }, (_, i) =>\n (0.5 + 0.45 * Math.sin(i * 0.6)).toFixed(3),\n );\n await builder.python(\n `d = op(${q(source)})\\nd.clear()\\nfor v in ${JSON.stringify(rows)}:\\n d.appendRow([v])`,\n );\n }\n\n let chop = source;\n if (args.data_source !== \"chop\") {\n // dattoCHOP defaults firstcolumn to \"names\", which turns a single numeric column into\n // channel *names* with value 0; read the column as values (one channel, N samples).\n chop = await builder.add(\"dattoCHOP\", \"datto\", {\n firstrow: \"values\",\n firstcolumn: \"values\",\n output: \"chanpercol\",\n });\n await builder.connect(source, chop);\n }\n\n const tex = await builder.add(\"choptoTOP\", \"data_tex\");\n await builder.connect(chop, tex);\n\n let visual = tex;\n if (args.chart_style === \"bars\") {\n // Fixed canvas + RGBA. Left on \"use input\", the chart inherits the data texture's\n // tiny Nx1 mono resolution, collapsing the output to a grayscale speck.\n const glsl = await builder.add(\"glslTOP\", \"chart\", {\n outputresolution: \"custom\",\n resolutionw: 1280,\n resolutionh: 720,\n format: \"rgba8fixed\",\n });\n const frag = await builder.add(\"textDAT\", \"chart_frag\");\n await builder.python(\n `op(${q(frag)}).text = ${q(BARS_SHADER)}\\nop(${q(glsl)}).par.pixeldat = op(${q(frag)}).name`,\n );\n await builder.connect(tex, glsl);\n visual = glsl;\n } else {\n builder.warnings.push(\n `Chart style \"${args.chart_style}\" renders the data as a texture strip; richer plotting needs customization.`,\n );\n }\n\n const out = await builder.add(\"nullTOP\", \"out1\");\n await builder.connect(visual, out);\n builder.warnings.push(\n \"Wire your real data into the 'data' node — a placeholder source was created.\",\n );\n\n return finalize(ctx, {\n summary: `Created a data visualization (source: ${args.data_source}, style: ${args.chart_style}).`,\n builder,\n outputPath: out,\n extra: { data_source: args.data_source, chart_style: args.chart_style },\n });\n });\n}\n\nexport const registerCreateDataVisualization: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"create_data_visualization\",\n {\n title: \"Create data visualization\",\n description:\n \"Build a data-driven visualization: a data source feeds a CHOP that drives a chart TOP. Wire your real data into the created 'data' node.\",\n inputSchema: createDataVisualizationSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },\n },\n (args) => createDataVisualizationImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\nimport { createSystemContainer, finalize, runBuild } from \"./orchestration.js\";\n\nconst q = (value: string): string => JSON.stringify(value);\n\n// Builds a GLSL fragment that maps the grayscale luminance through a 1- or 2-color\n// gradient, so a described palette (\"blues and magentas\") survives to the output.\nfunction colorizeShader(colors: string[]): string {\n const toVec3 = (hex: string | undefined): string => {\n const m = hex ? /^#?([0-9a-fA-F]{6})$/.exec(hex.trim()) : null;\n if (!m?.[1]) return \"vec3(1.0)\";\n const n = Number.parseInt(m[1], 16);\n const r = ((n >> 16) & 255) / 255;\n const g = ((n >> 8) & 255) / 255;\n const b = (n & 255) / 255;\n return `vec3(${r.toFixed(4)}, ${g.toFixed(4)}, ${b.toFixed(4)})`;\n };\n const lo = colors.length >= 2 ? toVec3(colors[0]) : \"vec3(0.0)\";\n const hi = toVec3(colors[colors.length - 1]);\n return `out vec4 fragColor;\nvoid main(){\n float l = texture(sTD2DInputs[0], vUV.st).r;\n fragColor = TDOutputSwizzle(vec4(mix(${lo}, ${hi}, l), 1.0));\n}\n`;\n}\n\nconst SEED_TYPES = {\n noise: \"noiseTOP\",\n shape: \"circleTOP\",\n image: \"moviefileinTOP\",\n video: \"moviefileinTOP\",\n webcam: \"videodeviceinTOP\",\n glsl: \"glslTOP\",\n} as const;\n\nconst TRANSFORM_TYPES = {\n blur: \"blurTOP\",\n displace: \"displaceTOP\",\n edge: \"edgeTOP\",\n level: \"levelTOP\",\n hsv_adjust: \"hsvadjustTOP\",\n transform: \"transformTOP\",\n mirror: \"mirrorTOP\",\n tile: \"tileTOP\",\n luma_blur: \"lumablurTOP\",\n} as const;\n\nexport const createFeedbackNetworkSchema = z.object({\n seed_type: z.enum([\"noise\", \"shape\", \"image\", \"video\", \"webcam\", \"glsl\"]).default(\"noise\"),\n transformations: z\n .array(\n z.enum([\n \"blur\",\n \"displace\",\n \"edge\",\n \"level\",\n \"hsv_adjust\",\n \"transform\",\n \"mirror\",\n \"tile\",\n \"luma_blur\",\n ]),\n )\n .default([\"blur\", \"displace\", \"level\"]),\n feedback_gain: z.number().min(0).max(1).default(0.95),\n colors: z\n .array(z.string())\n .max(2)\n .optional()\n .describe(\"Up to two hex colors to colorize the otherwise-grayscale output.\"),\n parent_path: z.string().default(\"/project1\"),\n});\ntype CreateFeedbackNetworkArgs = z.infer<typeof createFeedbackNetworkSchema>;\n\nexport async function createFeedbackNetworkImpl(ctx: ToolContext, args: CreateFeedbackNetworkArgs) {\n return runBuild(async () => {\n const builder = await createSystemContainer(ctx, args.parent_path, \"feedback_system\");\n\n const seed = await builder.add(SEED_TYPES[args.seed_type], \"seed\", {\n ...(args.seed_type === \"noise\" ? { monochrome: 1, period: 4 } : {}),\n });\n const feedback = await builder.add(\"feedbackTOP\", \"feedback1\");\n const comp = await builder.add(\"compositeTOP\", \"comp1\");\n // The TD default operand (multiply) collapses the loop to black; an additive\n // operand injects the seed each frame, and \"maximum\" stays bounded under feedback gain.\n await builder.setParams(comp, { operand: \"maximum\" });\n await builder.connect(seed, comp, 0, 0);\n await builder.connect(feedback, comp, 0, 1);\n // feedbackTOP needs an input for its first frame; seed it before the loop closes.\n await builder.connect(seed, feedback);\n\n let last = comp;\n for (const transformation of args.transformations) {\n const node = await builder.add(TRANSFORM_TYPES[transformation], transformation);\n await builder.connect(last, node);\n // displaceTOP and lumablurTOP need a second input (the displacement / luma map).\n if (transformation === \"displace\" || transformation === \"luma_blur\") {\n await builder.connect(seed, node, 0, 1);\n }\n last = node;\n }\n\n const gain = await builder.add(\"levelTOP\", \"gain\");\n await builder.setParams(gain, { gain: args.feedback_gain });\n await builder.connect(last, gain);\n\n // Colorize only the final output; the loop keeps sampling the grayscale gain node\n // so the feedback stays clean.\n let output = gain;\n if (args.colors && args.colors.length > 0) {\n const colorize = await builder.add(\"glslTOP\", \"colorize\");\n const frag = await builder.add(\"textDAT\", \"colorize_frag\");\n await builder.python(\n `op(${q(frag)}).text = ${q(colorizeShader(args.colors))}\\nop(${q(colorize)}).par.pixeldat = op(${q(frag)}).name`,\n );\n await builder.connect(gain, colorize);\n output = colorize;\n }\n\n const out = await builder.add(\"nullTOP\", \"out1\");\n await builder.connect(output, out);\n\n // Close the loop: feedbackTOP samples the gain node's output.\n await builder.python(`op(${q(feedback)}).par.top = op(${q(gain)}).name`);\n\n return finalize(ctx, {\n summary: `Created a feedback network (seed: ${args.seed_type}, gain: ${args.feedback_gain}, ${args.transformations.length} transform(s)).`,\n builder,\n outputPath: out,\n extra: { seed_type: args.seed_type, transformations: args.transformations },\n });\n });\n}\n\nexport const registerCreateFeedbackNetwork: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"create_feedback_network\",\n {\n title: \"Create feedback network\",\n description:\n \"Build a feedback-based visual system: a seed feeds a loop that is transformed (blur/displace/etc.) and fed back each frame. Great for evolving, hypnotic visuals.\",\n inputSchema: createFeedbackNetworkSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },\n },\n (args) => createFeedbackNetworkImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\nimport {\n buildFromRecipe,\n createSystemContainer,\n finalize,\n type NetworkBuilder,\n runBuild,\n} from \"./orchestration.js\";\n\nconst q = (value: string): string => JSON.stringify(value);\n\nconst DEFAULT_PLASMA = `out vec4 fragColor;\nuniform float uTime;\nvoid main(){\n vec2 uv = vUV.st;\n float v = sin(uv.x * 10.0 + uTime) + sin(uv.y * 10.0 + uTime * 0.7);\n v += sin((uv.x + uv.y) * 8.0 + uTime * 1.3);\n vec3 col = 0.5 + 0.5 * cos(vec3(0.0, 2.0, 4.0) + v);\n fragColor = TDOutputSwizzle(vec4(col, 1.0));\n}\n`;\n\nconst RECIPE_FOR = new Map<string, string>([\n [\"reaction_diffusion\", \"reaction_diffusion\"],\n [\"noise_landscape\", \"noise_landscape\"],\n]);\n\nexport const createGenerativeArtSchema = z.object({\n technique: z.enum([\n \"noise_landscape\",\n \"reaction_diffusion\",\n \"strange_attractor\",\n \"l_system\",\n \"cellular_automata\",\n \"flow_field\",\n \"voronoi\",\n \"fractal\",\n \"custom_glsl\",\n ]),\n color_palette: z.string().optional().describe(\"Free-text palette hint (best-effort).\"),\n evolution_speed: z.number().positive().default(1.0),\n custom_glsl_code: z\n .string()\n .optional()\n .describe(\"Fragment shader (only for technique 'custom_glsl').\"),\n parent_path: z.string().default(\"/project1\"),\n});\ntype CreateGenerativeArtArgs = z.infer<typeof createGenerativeArtSchema>;\n\nasync function buildGlslGenerative(\n ctx: ToolContext,\n parentPath: string,\n name: string,\n fragment: string,\n): Promise<{ builder: NetworkBuilder; outputPath: string }> {\n const builder = await createSystemContainer(ctx, parentPath, name);\n const glsl = await builder.add(\"glslTOP\", \"glsl1\");\n const frag = await builder.add(\"textDAT\", \"glsl1_frag\");\n await builder.python(\n `op(${q(frag)}).text = ${q(fragment)}\\nop(${q(glsl)}).par.pixeldat = op(${q(frag)}).name`,\n );\n const out = await builder.add(\"nullTOP\", \"out1\");\n await builder.connect(glsl, out);\n return { builder, outputPath: out };\n}\n\nexport async function createGenerativeArtImpl(ctx: ToolContext, args: CreateGenerativeArtArgs) {\n return runBuild(async () => {\n const recipeId = RECIPE_FOR.get(args.technique);\n if (recipeId) {\n const recipe = ctx.recipes.get(recipeId);\n if (recipe) {\n const { builder, outputPath } = await buildFromRecipe(ctx, recipe, args.parent_path);\n return finalize(ctx, {\n summary: `Created \"${recipe.name}\" generative system.`,\n builder,\n outputPath,\n recipeId,\n extra: { technique: args.technique, color_palette: args.color_palette },\n });\n }\n }\n\n if (args.technique === \"custom_glsl\") {\n const fragment = args.custom_glsl_code ?? DEFAULT_PLASMA;\n const { builder, outputPath } = await buildGlslGenerative(\n ctx,\n args.parent_path,\n \"generative_custom_glsl\",\n fragment,\n );\n if (!args.custom_glsl_code) {\n builder.warnings.push(\"No custom_glsl_code provided; used a default plasma shader.\");\n }\n return finalize(ctx, {\n summary: \"Created a custom GLSL generative system.\",\n builder,\n outputPath,\n extra: { technique: args.technique },\n });\n }\n\n // Other techniques: prefer a matching GLSL knowledge pattern, else animated noise.\n const pattern = ctx.knowledge.getGlslPattern(args.technique);\n if (pattern?.code?.snippet) {\n const { builder, outputPath } = await buildGlslGenerative(\n ctx,\n args.parent_path,\n `generative_${args.technique}`,\n pattern.code.snippet,\n );\n return finalize(ctx, {\n summary: `Created a \"${args.technique}\" system from the GLSL knowledge pattern \"${pattern.name}\".`,\n builder,\n outputPath,\n extra: { technique: args.technique, glsl_pattern: pattern.id },\n });\n }\n\n const builder = await createSystemContainer(\n ctx,\n args.parent_path,\n `generative_${args.technique}`,\n );\n const noise = await builder.add(\"noiseTOP\", \"noise1\", { monochrome: 0, period: 6 });\n const level = await builder.add(\"levelTOP\", \"level1\");\n const out = await builder.add(\"nullTOP\", \"out1\");\n await builder.connect(noise, level);\n await builder.connect(level, out);\n await builder.python(\n `p = op(${q(noise)}).par.tz\\np.expr = ${q(`absTime.seconds * ${args.evolution_speed}`)}`,\n );\n builder.warnings.push(\n `Technique \"${args.technique}\" is approximated with an animated-noise generator in this version.`,\n );\n return finalize(ctx, {\n summary: `Created an approximate \"${args.technique}\" generative system.`,\n builder,\n outputPath: out,\n extra: { technique: args.technique, evolution_speed: args.evolution_speed },\n });\n });\n}\n\nexport const registerCreateGenerativeArt: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"create_generative_art\",\n {\n title: \"Create generative art\",\n description:\n \"Create an evolving generative visual. Known techniques (reaction_diffusion, noise_landscape) use validated recipes; custom_glsl uses your shader; others fall back to a knowledge GLSL pattern or animated noise.\",\n inputSchema: createGenerativeArtSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },\n },\n (args) => createGenerativeArtImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\nimport { createSystemContainer, finalize, runBuild } from \"./orchestration.js\";\n\nconst q = (value: string): string => JSON.stringify(value);\n\nconst EMITTER_SOP = {\n point: \"addSOP\",\n line: \"lineSOP\",\n circle: \"circleSOP\",\n sphere: \"sphereSOP\",\n mesh: \"boxSOP\",\n image: \"gridSOP\",\n} as const;\n\nexport const createParticleSystemSchema = z.object({\n emitter_shape: z.enum([\"point\", \"line\", \"circle\", \"sphere\", \"mesh\", \"image\"]).default(\"point\"),\n particle_count: z.number().int().positive().default(10000),\n forces: z\n .array(z.enum([\"gravity\", \"noise\", \"attract\", \"repel\", \"vortex\", \"turbulence\", \"drag\"]))\n .default([\"noise\", \"gravity\"]),\n render_style: z\n .enum([\"points\", \"sprites\", \"lines\", \"trails\", \"instanced_geo\"])\n .default(\"sprites\"),\n lifetime: z.number().positive().default(3),\n parent_path: z.string().default(\"/project1\"),\n});\ntype CreateParticleSystemArgs = z.infer<typeof createParticleSystemSchema>;\n\nexport async function createParticleSystemImpl(ctx: ToolContext, args: CreateParticleSystemArgs) {\n return runBuild(async () => {\n const builder = await createSystemContainer(ctx, args.parent_path, \"particle_system\");\n\n // Geometry COMP holds the particle SOP chain so the renderer can see it.\n const geo = await builder.add(\"geometryCOMP\", \"geo\");\n\n const emitter = await ctx.client.createNode({\n parent_path: geo,\n type: EMITTER_SOP[args.emitter_shape],\n name: \"emitter\",\n });\n const particle = await ctx.client.createNode({\n parent_path: geo,\n type: \"particleSOP\",\n name: \"particle\",\n parameters: { life: args.lifetime },\n });\n builder.created.push(\n { name: \"emitter\", path: emitter.path, type: emitter.type },\n { name: \"particle\", path: particle.path, type: particle.type },\n );\n await builder.connect(emitter.path, particle.path);\n\n const mat = await builder.add(\n args.render_style === \"sprites\" ? \"pointspriteMAT\" : \"constantMAT\",\n \"mat\",\n );\n const cam = await builder.add(\"cameraCOMP\", \"cam\", { tz: 5 });\n const light = await builder.add(\"lightCOMP\", \"light\", { tx: 3, ty: 4, tz: 4 });\n const render = await builder.add(\"renderTOP\", \"render\");\n const out = await builder.add(\"nullTOP\", \"out1\");\n await builder.connect(render, out);\n\n await builder.python(\n [\n `g = op(${q(geo)})`,\n \"p = op(g.path + '/particle')\",\n \"p.render = True\",\n \"p.display = True\",\n `g.par.material = ${q(mat)}`,\n `r = op(${q(render)})`,\n `r.par.geometry = ${q(geo)}`,\n `r.par.camera = ${q(cam)}`,\n `r.par.lights = ${q(light)}`,\n ].join(\"\\n\"),\n );\n\n builder.warnings.push(\n `Particle forces (${args.forces.join(\", \")}), exact count (${args.particle_count}) and the \"${args.render_style}\" render style are scaffolded; tune the particleSOP and material for production.`,\n );\n\n return finalize(ctx, {\n summary: `Created a particle system (emitter: ${args.emitter_shape}, ~${args.particle_count} particles, render: ${args.render_style}).`,\n builder,\n outputPath: out,\n extra: {\n emitter_shape: args.emitter_shape,\n forces: args.forces,\n render_style: args.render_style,\n },\n });\n });\n}\n\nexport const registerCreateParticleSystem: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"create_particle_system\",\n {\n title: \"Create particle system\",\n description:\n \"Build a particle system: an emitter feeds a particle SOP inside a Geometry COMP, rendered with a camera + light. Forces and render style are scaffolded for further tuning.\",\n inputSchema: createParticleSystemSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },\n },\n (args) => createParticleSystemImpl(ctx, args),\n );\n};\n","import type { CallToolResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport { z } from \"zod\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\nimport { createAudioReactiveImpl } from \"./createAudioReactive.js\";\nimport { createFeedbackNetworkImpl } from \"./createFeedbackNetwork.js\";\nimport { createGenerativeArtImpl } from \"./createGenerativeArt.js\";\nimport { createParticleSystemImpl } from \"./createParticleSystem.js\";\nimport { significantTerms } from \"./intent.js\";\nimport { buildFromRecipe, finalize, runBuild } from \"./orchestration.js\";\n\nexport const createVisualSystemSchema = z.object({\n description: z.string().min(1).describe(\"Natural-language description of the visual system.\"),\n parent_path: z.string().default(\"/project1\"),\n resolution: z.enum([\"720p\", \"1080p\", \"4K\", \"custom\"]).default(\"1080p\"),\n target_fps: z.number().positive().default(60),\n});\ntype CreateVisualSystemArgs = z.infer<typeof createVisualSystemSchema>;\n\ntype Kind =\n | \"audio\"\n | \"particle\"\n | \"feedback\"\n | \"reaction_diffusion\"\n | \"noise_landscape\"\n | \"default\";\n\nfunction classify(description: string): { kind: Kind; label: string } {\n const d = description.toLowerCase();\n const has = (...words: string[]) => words.some((w) => d.includes(w));\n if (has(\"audio\", \"sound\", \"music\", \"beat\", \"frequenc\", \"spectrum\", \"reactive\")) {\n return { kind: \"audio\", label: \"audio-reactive\" };\n }\n if (has(\"particle\", \"swarm\", \"galaxy\", \"sparkle\", \"emitter\")) {\n return { kind: \"particle\", label: \"particle\" };\n }\n if (has(\"reaction\", \"diffusion\", \"gray-scott\", \"gray scott\")) {\n return { kind: \"reaction_diffusion\", label: \"reaction-diffusion\" };\n }\n if (has(\"landscape\", \"terrain\", \"mountain\", \"heightfield\")) {\n return { kind: \"noise_landscape\", label: \"noise landscape\" };\n }\n if (has(\"feedback\", \"tunnel\", \"echo\", \"trail\", \"infinite\", \"kaleido\")) {\n return { kind: \"feedback\", label: \"feedback\" };\n }\n return { kind: \"default\", label: \"generative\" };\n}\n\nfunction pickAudioStyle(\n description: string,\n): \"geometric\" | \"particle\" | \"feedback\" | \"glsl\" | \"instancing\" {\n const d = description.toLowerCase();\n if (d.includes(\"particle\")) return \"particle\";\n if (d.includes(\"feedback\") || d.includes(\"tunnel\")) return \"feedback\";\n if (d.includes(\"geometr\") || d.includes(\"shape\")) return \"geometric\";\n if (d.includes(\"instanc\")) return \"instancing\";\n return \"glsl\";\n}\n\nfunction pickEmitter(\n description: string,\n): \"point\" | \"line\" | \"circle\" | \"sphere\" | \"mesh\" | \"image\" {\n const d = description.toLowerCase();\n if (d.includes(\"galaxy\") || d.includes(\"sphere\") || d.includes(\"orbit\")) return \"sphere\";\n if (d.includes(\"ring\") || d.includes(\"circle\")) return \"circle\";\n if (d.includes(\"line\")) return \"line\";\n return \"point\";\n}\n\nconst COLOR_WORDS: Record<string, string> = {\n red: \"#e03030\",\n crimson: \"#c01040\",\n orange: \"#ff7a18\",\n amber: \"#ffb000\",\n yellow: \"#f5e050\",\n gold: \"#e8c020\",\n green: \"#30c050\",\n lime: \"#9be025\",\n teal: \"#10b0a0\",\n cyan: \"#20d0e0\",\n blue: \"#1840d0\",\n navy: \"#0a1a66\",\n indigo: \"#3010a0\",\n purple: \"#7a20c0\",\n violet: \"#8a40e0\",\n magenta: \"#d020a0\",\n pink: \"#ff60b0\",\n white: \"#f0f0f0\",\n black: \"#101015\",\n};\n\n// Best-effort: pull up to two named colors from the description so a feedback system\n// can honor a requested palette instead of rendering grayscale.\nfunction parseColors(description: string): string[] {\n const d = description.toLowerCase();\n const found: string[] = [];\n for (const [word, hex] of Object.entries(COLOR_WORDS)) {\n if (new RegExp(`\\\\b${word}`).test(d) && !found.includes(hex)) found.push(hex);\n if (found.length >= 2) break;\n }\n return found;\n}\n\nfunction withNote(result: CallToolResult, note: string): CallToolResult {\n return { ...result, content: [{ type: \"text\", text: note }, ...result.content] };\n}\n\nexport async function createVisualSystemImpl(ctx: ToolContext, args: CreateVisualSystemArgs) {\n const { kind, label } = classify(args.description);\n const note = `Interpreted \"${args.description}\" as a ${label} system (target ${args.resolution} @ ${args.target_fps}fps).`;\n ctx.logger.info(\"create_visual_system classified\", { kind, description: args.description });\n\n switch (kind) {\n case \"audio\":\n return withNote(\n await createAudioReactiveImpl(ctx, {\n audio_source: \"microphone\",\n visual_style: pickAudioStyle(args.description),\n frequency_bands: 8,\n beat_detection: true,\n parent_path: args.parent_path,\n }),\n note,\n );\n case \"particle\":\n return withNote(\n await createParticleSystemImpl(ctx, {\n emitter_shape: pickEmitter(args.description),\n particle_count: 10000,\n forces: [\"noise\", \"gravity\"],\n render_style: \"sprites\",\n lifetime: 3,\n parent_path: args.parent_path,\n }),\n note,\n );\n case \"feedback\":\n return withNote(\n await createFeedbackNetworkImpl(ctx, {\n seed_type: \"noise\",\n transformations: [\"blur\", \"displace\", \"level\"],\n feedback_gain: 0.95,\n colors: parseColors(args.description),\n parent_path: args.parent_path,\n }),\n note,\n );\n case \"reaction_diffusion\":\n case \"noise_landscape\":\n return withNote(\n await createGenerativeArtImpl(ctx, {\n technique: kind,\n evolution_speed: 1.0,\n parent_path: args.parent_path,\n }),\n note,\n );\n default: {\n // Try to match a recipe by keywords before falling back to generative GLSL.\n const recipe = ctx.recipes.findByTags(significantTerms(args.description));\n if (recipe) {\n return runBuild(async () => {\n const { builder, outputPath } = await buildFromRecipe(ctx, recipe, args.parent_path);\n return withNote(\n await finalize(ctx, {\n summary: `Built \"${recipe.name}\" from a matching recipe.`,\n builder,\n outputPath,\n recipeId: recipe.id,\n }),\n note,\n );\n });\n }\n return withNote(\n await createGenerativeArtImpl(ctx, {\n technique: \"custom_glsl\",\n evolution_speed: 1.0,\n parent_path: args.parent_path,\n }),\n note,\n );\n }\n }\n}\n\nexport const registerCreateVisualSystem: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"create_visual_system\",\n {\n title: \"Create visual system\",\n description:\n \"Create a complete visual system from a natural-language description. Classifies intent (audio-reactive, particle, feedback, reaction-diffusion, landscape, generative) and builds it in a self-contained COMP, then verifies and previews it.\",\n inputSchema: createVisualSystemSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },\n },\n (args) => createVisualSystemImpl(ctx, args),\n );\n};\n","/**\n * Words that describe almost any visual and so must not drive recipe matching.\n * \"generative\", for instance, is a tag on most recipes, so leaving it in makes\n * findByTags pick an unrelated recipe (e.g. \"glowing generative plasma\" → particle galaxy).\n */\nconst GENERIC_TERMS = new Set([\n \"generative\",\n \"visual\",\n \"visuals\",\n \"glow\",\n \"glowing\",\n \"abstract\",\n \"field\",\n \"system\",\n \"animated\",\n \"evolving\",\n \"dynamic\",\n \"background\",\n \"colorful\",\n \"colourful\",\n \"bright\",\n \"beautiful\",\n]);\n\n/** Splits a description into discriminating lowercase terms for recipe tag matching. */\nexport function significantTerms(description: string): string[] {\n return description\n .toLowerCase()\n .split(/[^a-z0-9]+/)\n .filter((t) => t.length > 3 && !GENERIC_TERMS.has(t));\n}\n","import { z } from \"zod\";\nimport { textResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\nimport { significantTerms } from \"./intent.js\";\n\nexport const describeProjectSchema = z.object({\n description: z.string().min(1).describe(\"Natural-language description of the visual you want.\"),\n});\ntype DescribeProjectArgs = z.infer<typeof describeProjectSchema>;\n\nexport function describeProjectImpl(ctx: ToolContext, args: DescribeProjectArgs) {\n const d = args.description.toLowerCase();\n const has = (...words: string[]) => words.some((w) => d.includes(w));\n\n let tool: string;\n let summary: string;\n let recipeId: string | undefined;\n\n if (has(\"audio\", \"sound\", \"music\", \"beat\", \"frequenc\", \"spectrum\", \"reactive\")) {\n tool = \"create_audio_reactive\";\n summary = \"audio-reactive visual\";\n } else if (has(\"particle\", \"swarm\", \"galaxy\", \"sparkle\", \"emitter\")) {\n tool = \"create_particle_system\";\n summary = \"particle system\";\n } else if (has(\"reaction\", \"diffusion\", \"gray-scott\", \"gray scott\")) {\n tool = \"create_generative_art\";\n summary = \"reaction-diffusion simulation\";\n recipeId = \"reaction_diffusion\";\n } else if (has(\"landscape\", \"terrain\", \"mountain\", \"heightfield\")) {\n tool = \"create_generative_art\";\n summary = \"3D noise landscape\";\n recipeId = \"noise_landscape\";\n } else if (has(\"feedback\", \"tunnel\", \"echo\", \"trail\", \"kaleido\")) {\n tool = \"create_feedback_network\";\n summary = \"feedback network\";\n } else {\n tool = \"create_generative_art\";\n summary = \"generative visual\";\n recipeId = ctx.recipes.findByTags(significantTerms(d))?.id;\n }\n\n const lines: string[] = [\n `Plan for: \"${args.description}\"`,\n \"\",\n `Interpreted as: ${summary}.`,\n `Recommended tool: ${tool}${recipeId ? ` (recipe: ${recipeId})` : \"\"}.`,\n ];\n\n if (recipeId) {\n const recipe = ctx.recipes.get(recipeId);\n if (recipe) {\n lines.push(\"\", `Recipe \"${recipe.name}\" would create:`);\n for (const node of recipe.nodes) {\n lines.push(` - ${node.name} (${node.type})${node.comment ? ` — ${node.comment}` : \"\"}`);\n }\n }\n }\n\n lines.push(\"\", \"Next: call the recommended tool, then check get_td_node_errors and get_preview.\");\n return textResult(lines.join(\"\\n\"));\n}\n\nexport const registerDescribeProject: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"plan_visual\",\n {\n title: \"Plan a visual from a description\",\n description:\n \"Turn a natural-language description of a visual you WANT into a build plan (which tool/recipe and nodes) — a dry run that creates nothing. Note: this does NOT inspect the current TouchDesigner project; to read existing nodes use get_td_nodes / get_td_topology / find_td_nodes.\",\n inputSchema: describeProjectSchema.shape,\n annotations: { readOnlyHint: true, openWorldHint: false },\n },\n (args) => describeProjectImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport { capturePreview } from \"../../feedback/previewCapture.js\";\nimport { guardTd, imageResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nexport const getPreviewSchema = z.object({\n node_path: z.string().describe(\"Path of the TOP node to capture.\"),\n width: z.number().int().positive().default(640),\n height: z.number().int().positive().default(360),\n});\ntype GetPreviewArgs = z.infer<typeof getPreviewSchema>;\n\nexport async function getPreviewImpl(ctx: ToolContext, args: GetPreviewArgs) {\n return guardTd(\n () => capturePreview(ctx.client, args.node_path, args.width, args.height),\n (preview) =>\n imageResult(\n preview.base64,\n preview.mimeType,\n `Preview of ${args.node_path} (${preview.width}×${preview.height}).`,\n ),\n );\n}\n\nexport const registerGetPreview: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"get_preview\",\n {\n title: \"Preview a TOP\",\n description: \"Capture a TOP node as an inline image so you can see what was created.\",\n inputSchema: getPreviewSchema.shape,\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n (args) => getPreviewImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport { friendlyTdError } from \"../../td-client/types.js\";\nimport { connectNodesViaBridge } from \"../layer2/connectHelper.js\";\nimport { jsonResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\nimport { runBuild } from \"./orchestration.js\";\n\nconst q = (value: string): string => JSON.stringify(value);\n\nconst OUTPUT_MAP = {\n window: \"windowCOMP\",\n ndi: \"ndioutTOP\",\n syphon_spout: \"syphonspoutoutTOP\",\n record: \"moviefileoutTOP\",\n touch_out: \"touchoutTOP\",\n} as const;\n\nconst RESOLUTIONS = {\n \"720p\": [1280, 720],\n \"1080p\": [1920, 1080],\n \"4K\": [3840, 2160],\n} as const;\n\nexport const setupOutputSchema = z.object({\n source_path: z.string().describe(\"Path of the final TOP to output.\"),\n output_type: z.enum([\"window\", \"ndi\", \"syphon_spout\", \"record\", \"touch_out\"]).default(\"window\"),\n resolution: z.enum([\"720p\", \"1080p\", \"4K\"]).default(\"1080p\"),\n record_format: z.enum([\"mp4\", \"mov\", \"image_sequence\"]).optional(),\n parent_path: z.string().default(\"/project1\"),\n});\ntype SetupOutputArgs = z.infer<typeof setupOutputSchema>;\n\nexport async function setupOutputImpl(ctx: ToolContext, args: SetupOutputArgs) {\n return runBuild(async () => {\n const warnings: string[] = [];\n const node = await ctx.client.createNode({\n parent_path: args.parent_path,\n type: OUTPUT_MAP[args.output_type],\n name: `${args.output_type}_out`,\n });\n\n if (args.output_type === \"window\") {\n const [width, height] = RESOLUTIONS[args.resolution];\n try {\n await ctx.client.executePythonScript(\n `w = op(${q(node.path)})\\nw.par.winop = ${q(args.source_path)}\\nw.par.winw = ${width}\\nw.par.winh = ${height}`,\n false,\n );\n } catch (err) {\n warnings.push(`Could not configure window: ${friendlyTdError(err)}`);\n }\n } else {\n try {\n await connectNodesViaBridge(ctx.client, args.source_path, node.path);\n } catch (err) {\n warnings.push(`Could not connect source to output: ${friendlyTdError(err)}`);\n }\n }\n\n if (args.output_type === \"record\" && args.record_format) {\n try {\n await ctx.client.updateNodeParameters(node.path, { type: args.record_format });\n } catch (err) {\n warnings.push(`Could not set record format: ${friendlyTdError(err)}`);\n }\n }\n\n return jsonResult(`Configured ${args.output_type} output for ${args.source_path}.`, {\n output: node.path,\n output_type: args.output_type,\n source_path: args.source_path,\n resolution: args.resolution,\n warnings,\n });\n });\n}\n\nexport const registerSetupOutput: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"setup_output\",\n {\n title: \"Set up output\",\n description:\n \"Route a TOP to an output: a display window, NDI stream, Syphon/Spout, a recording, or Touch Out.\",\n inputSchema: setupOutputSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },\n },\n (args) => setupOutputImpl(ctx, args),\n );\n};\n","import type { ToolRegistrar } from \"../types.js\";\nimport { registerApplyPostProcessing } from \"./applyPostProcessing.js\";\nimport { registerCreateAudioReactive } from \"./createAudioReactive.js\";\nimport { registerCreateDataVisualization } from \"./createDataVisualization.js\";\nimport { registerCreateFeedbackNetwork } from \"./createFeedbackNetwork.js\";\nimport { registerCreateGenerativeArt } from \"./createGenerativeArt.js\";\nimport { registerCreateParticleSystem } from \"./createParticleSystem.js\";\nimport { registerCreateVisualSystem } from \"./createVisualSystem.js\";\nimport { registerDescribeProject } from \"./describeProject.js\";\nimport { registerGetPreview } from \"./getPreview.js\";\nimport { registerSetupOutput } from \"./setupOutput.js\";\n\nexport const layer1Registrars: ToolRegistrar[] = [\n registerCreateFeedbackNetwork,\n registerCreateGenerativeArt,\n registerCreateAudioReactive,\n registerCreateParticleSystem,\n registerCreateDataVisualization,\n registerApplyPostProcessing,\n registerSetupOutput,\n registerGetPreview,\n registerDescribeProject,\n registerCreateVisualSystem,\n];\n","import { z } from \"zod\";\nimport { guardTd, jsonResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\nimport { connectNodesViaBridge } from \"./connectHelper.js\";\n\nexport const connectNodesSchema = z.object({\n source_path: z.string().describe(\"Path of the source node (output side).\"),\n target_path: z.string().describe(\"Path of the target node (input side).\"),\n source_output: z.number().int().nonnegative().default(0),\n target_input: z.number().int().nonnegative().default(0),\n});\ntype ConnectNodesArgs = z.infer<typeof connectNodesSchema>;\n\nexport async function connectNodesImpl(ctx: ToolContext, args: ConnectNodesArgs) {\n return guardTd(\n () =>\n connectNodesViaBridge(\n ctx.client,\n args.source_path,\n args.target_path,\n args.source_output,\n args.target_input,\n ),\n (result) =>\n jsonResult(`Connected ${args.source_path} → ${args.target_path} (via ${result.method}).`, {\n source: args.source_path,\n target: args.target_path,\n source_output: args.source_output,\n target_input: args.target_input,\n method: result.method,\n }),\n );\n}\n\nexport const registerConnectNodes: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"connect_nodes\",\n {\n title: \"Connect two nodes\",\n description:\n \"Wire one node's output into another node's input. Uses the batch endpoint when available, with a Python fallback.\",\n inputSchema: connectNodesSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },\n },\n (args) => connectNodesImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport { guardTd, jsonResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nconst COMP_MAP = {\n container: \"containerCOMP\",\n base: \"baseCOMP\",\n} as const;\n\nexport const createContainerSchema = z.object({\n parent_path: z.string().default(\"/project1\").describe(\"Parent COMP to create the container in.\"),\n name: z.string().optional(),\n comp_type: z\n .enum([\"container\", \"base\"])\n .default(\"container\")\n .describe(\"'container' (2D panel COMP) or 'base' (generic COMP).\"),\n});\ntype CreateContainerArgs = z.infer<typeof createContainerSchema>;\n\nexport async function createContainerImpl(ctx: ToolContext, args: CreateContainerArgs) {\n return guardTd(\n () =>\n ctx.client.createNode({\n parent_path: args.parent_path,\n type: COMP_MAP[args.comp_type],\n name: args.name,\n }),\n (node) => jsonResult(`Created ${args.comp_type} COMP at ${node.path}.`, { node }),\n );\n}\n\nexport const registerCreateContainer: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"create_container\",\n {\n title: \"Create container COMP\",\n description: \"Create a self-contained COMP to hold a visual system.\",\n inputSchema: createContainerSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },\n },\n (args) => createContainerImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport { guardTd, jsonResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nconst UniformSchema = z.object({\n name: z.string(),\n type: z.enum([\"float\", \"vec2\", \"vec3\", \"vec4\", \"int\", \"sampler2D\"]),\n default_value: z.string().optional(),\n});\n\nexport const createGlslShaderSchema = z.object({\n parent_path: z.string().describe(\"Parent COMP to create the GLSL TOP inside.\"),\n name: z.string().optional().describe(\"Name for the GLSL TOP (default 'glsl1').\"),\n fragment_shader: z.string().min(1).describe(\"GLSL fragment (pixel) shader source.\"),\n vertex_shader: z.string().optional().describe(\"Optional GLSL vertex shader source.\"),\n uniforms: z\n .array(UniformSchema)\n .optional()\n .describe(\"Optional uniform declarations to best-effort bind on the GLSL TOP.\"),\n resolution: z.enum([\"720p\", \"1080p\", \"4K\", \"input\"]).default(\"input\"),\n});\ntype CreateGlslShaderArgs = z.infer<typeof createGlslShaderSchema>;\n\nconst RESOLUTIONS = {\n \"720p\": [1280, 720],\n \"1080p\": [1920, 1080],\n \"4K\": [3840, 2160],\n} as const;\n\nconst q = (value: string): string => JSON.stringify(value);\n\nexport async function createGlslShaderImpl(ctx: ToolContext, args: CreateGlslShaderArgs) {\n const desiredName = args.name ?? \"glsl1\";\n return guardTd(\n async () => {\n const warnings: string[] = [];\n const glsl = await ctx.client.createNode({\n parent_path: args.parent_path,\n type: \"glslTOP\",\n name: desiredName,\n });\n const glslName = glsl.name || desiredName;\n\n const fragName = `${glslName}_frag`;\n const frag = await ctx.client.createNode({\n parent_path: args.parent_path,\n type: \"textDAT\",\n name: fragName,\n });\n\n const wiring = [\n `op(${q(frag.path)}).text = ${q(args.fragment_shader)}`,\n `op(${q(glsl.path)}).par.pixeldat = ${q(frag.name || fragName)}`,\n ];\n\n let vertexPath: string | undefined;\n if (args.vertex_shader) {\n const vertName = `${glslName}_vert`;\n const vert = await ctx.client.createNode({\n parent_path: args.parent_path,\n type: \"textDAT\",\n name: vertName,\n });\n vertexPath = vert.path;\n wiring.push(`op(${q(vert.path)}).text = ${q(args.vertex_shader)}`);\n wiring.push(`op(${q(glsl.path)}).par.vertexdat = ${q(vert.name || vertName)}`);\n }\n\n await ctx.client.executePythonScript(wiring.join(\"\\n\"), false);\n\n if (args.uniforms && args.uniforms.length > 0) {\n const names = JSON.stringify(args.uniforms.map((u) => u.name));\n const values = JSON.stringify(args.uniforms.map((u) => u.default_value ?? \"\"));\n const bind = [\n `g = op(${q(glsl.path)})`,\n `for i, nm in enumerate(${names}):`,\n \" try: setattr(g.par, 'uniname' + str(i), nm)\",\n \" except Exception: pass\",\n `for i, v in enumerate(${values}):`,\n \" try:\",\n \" if v != '': setattr(g.par, 'value' + str(i) + 'x', v)\",\n \" except Exception: pass\",\n ].join(\"\\n\");\n try {\n await ctx.client.executePythonScript(bind, false);\n } catch {\n warnings.push(\n \"Could not auto-bind uniforms; declare them in the shader and set them on the GLSL TOP manually.\",\n );\n }\n }\n\n if (args.resolution !== \"input\") {\n const [width, height] = RESOLUTIONS[args.resolution];\n await ctx.client.updateNodeParameters(glsl.path, {\n outputresolution: \"custom\",\n resolutionw: width,\n resolutionh: height,\n });\n }\n\n return { glsl, fragmentDat: frag.path, vertexDat: vertexPath, warnings };\n },\n (result) => jsonResult(`Created GLSL TOP at ${result.glsl.path}.`, result),\n );\n}\n\nexport const registerCreateGlslShader: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"create_glsl_shader\",\n {\n title: \"Create GLSL shader\",\n description:\n \"Create a GLSL TOP with a fragment shader (and optional vertex shader) supplied via Text DATs, with optional uniform binding and output resolution.\",\n inputSchema: createGlslShaderSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },\n },\n (args) => createGlslShaderImpl(ctx, args),\n );\n};\n","import type { CallToolResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport { z } from \"zod\";\nimport { friendlyTdError } from \"../../td-client/types.js\";\nimport { errorResult, jsonResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\nimport { connectNodesViaBridge } from \"./connectHelper.js\";\n\nconst ChainNodeSchema = z.object({\n type: z.string().describe(\"Operator type, e.g. 'noiseTOP'.\"),\n name: z.string().optional(),\n parameters: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport const createNodeChainSchema = z.object({\n parent_path: z.string().describe(\"Parent COMP to create the chain inside.\"),\n nodes: z.array(ChainNodeSchema).min(1).describe(\"Ordered list of nodes to create.\"),\n connect_sequentially: z\n .boolean()\n .default(true)\n .describe(\"Wire output[0] → input[0] for each consecutive pair.\"),\n});\ntype CreateNodeChainArgs = z.infer<typeof createNodeChainSchema>;\n\ninterface CreatedNode {\n path: string;\n type: string;\n name: string;\n}\n\nexport async function createNodeChainImpl(\n ctx: ToolContext,\n args: CreateNodeChainArgs,\n): Promise<CallToolResult> {\n const created: CreatedNode[] = [];\n const warnings: string[] = [];\n\n for (const node of args.nodes) {\n if (!ctx.knowledge.operatorExists(node.type)) {\n warnings.push(`Operator type \"${node.type}\" was not found in the knowledge base.`);\n }\n }\n\n for (const node of args.nodes) {\n try {\n const ref = await ctx.client.createNode({\n parent_path: args.parent_path,\n type: node.type,\n name: node.name,\n parameters: node.parameters,\n });\n created.push({\n path: ref.path,\n type: ref.type || node.type,\n name: ref.name || node.name || \"\",\n });\n } catch (err) {\n return errorResult(\n `Stopped after creating ${created.length}/${args.nodes.length} node(s). ` +\n `Failed to create \"${node.type}\": ${friendlyTdError(err)}. ` +\n `Created so far: ${created.map((c) => c.path).join(\", \") || \"(none)\"}. ` +\n \"No nodes were deleted.\",\n );\n }\n }\n\n const connections: Array<{ from: string; to: string; method: string }> = [];\n if (args.connect_sequentially && created.length > 1) {\n for (let i = 0; i < created.length - 1; i++) {\n const from = created[i];\n const to = created[i + 1];\n if (!from || !to) continue;\n try {\n const result = await connectNodesViaBridge(ctx.client, from.path, to.path);\n connections.push({ from: from.path, to: to.path, method: result.method });\n } catch (err) {\n warnings.push(`Failed to connect ${from.path} → ${to.path}: ${friendlyTdError(err)}`);\n }\n }\n }\n\n return jsonResult(\n `Created ${created.length} node(s) and ${connections.length} connection(s) under ${args.parent_path}.`,\n { created, connections, warnings },\n );\n}\n\nexport const registerCreateNodeChain: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"create_node_chain\",\n {\n title: \"Create node chain\",\n description:\n \"Create multiple nodes and (optionally) connect them in sequence. Returns all created paths; on failure it stops and reports partial progress without deleting anything.\",\n inputSchema: createNodeChainSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },\n },\n (args) => createNodeChainImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport { guardTd, jsonResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nconst TYPE_MAP = {\n text: \"textDAT\",\n execute: \"executeDAT\",\n script: \"scriptDAT\",\n} as const;\n\nexport const createPythonScriptSchema = z.object({\n parent_path: z.string().describe(\"Parent COMP to create the DAT inside.\"),\n name: z.string().optional(),\n code: z.string().min(1).describe(\"Python source to place in the DAT.\"),\n dat_type: z\n .enum([\"text\", \"execute\", \"script\"])\n .default(\"text\")\n .describe(\"Kind of DAT: 'text' (plain), 'execute' (event hooks), or 'script' (table builder).\"),\n});\ntype CreatePythonScriptArgs = z.infer<typeof createPythonScriptSchema>;\n\nexport async function createPythonScriptImpl(ctx: ToolContext, args: CreatePythonScriptArgs) {\n return guardTd(\n async () => {\n const dat = await ctx.client.createNode({\n parent_path: args.parent_path,\n type: TYPE_MAP[args.dat_type],\n name: args.name,\n });\n await ctx.client.executePythonScript(\n `op(${JSON.stringify(dat.path)}).text = ${JSON.stringify(args.code)}`,\n false,\n );\n return dat;\n },\n (dat) => jsonResult(`Created ${args.dat_type} DAT at ${dat.path}.`, { node: dat }),\n );\n}\n\nexport const registerCreatePythonScript: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"create_python_script\",\n {\n title: \"Create Python DAT\",\n description: \"Create a DAT (text/execute/script) preloaded with Python code.\",\n inputSchema: createPythonScriptSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },\n },\n (args) => createPythonScriptImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport { guardTd, jsonResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nconst q = (value: string): string => JSON.stringify(value);\n\nexport const duplicateNetworkSchema = z.object({\n source_path: z.string().describe(\"Path of the node/COMP to duplicate.\"),\n name: z.string().optional().describe(\"Name for the copy (auto-generated if omitted).\"),\n parent_path: z\n .string()\n .optional()\n .describe(\"Where to place the copy (defaults to the source's parent).\"),\n});\ntype DuplicateNetworkArgs = z.infer<typeof duplicateNetworkSchema>;\n\nexport async function duplicateNetworkImpl(ctx: ToolContext, args: DuplicateNetworkArgs) {\n const script = [\n `src = op(${q(args.source_path)})`,\n `if src is None: raise Exception('source not found: ' + ${q(args.source_path)})`,\n args.parent_path ? `parent = op(${q(args.parent_path)})` : \"parent = src.parent()\",\n \"if parent is None: raise Exception('parent not found')\",\n args.name ? `new = parent.copy(src, name=${q(args.name)})` : \"new = parent.copy(src)\",\n \"result = new.path\",\n ].join(\"\\n\");\n\n return guardTd(\n () => ctx.client.executePythonScript(script, true),\n (res) =>\n jsonResult(`Duplicated ${args.source_path} → ${res.result ?? \"(see stdout)\"}.`, {\n source: args.source_path,\n copy: res.result,\n }),\n );\n}\n\nexport const registerDuplicateNetwork: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"duplicate_network\",\n {\n title: \"Duplicate a network\",\n description:\n \"Copy a node or whole COMP (and its contents) to a new node, optionally into another parent.\",\n inputSchema: duplicateNetworkSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },\n },\n (args) => duplicateNetworkImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport { guardTd, jsonResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nconst UpdateSchema = z.object({\n path: z.string(),\n parameters: z.record(z.string(), z.unknown()),\n});\n\nexport const setParametersBatchSchema = z.object({\n updates: z\n .array(UpdateSchema)\n .min(1)\n .describe(\n \"List of { path, parameters } updates sent in one batch request (per-update results; not transactional — a failed update does not roll back the others).\",\n ),\n});\ntype SetParametersBatchArgs = z.infer<typeof setParametersBatchSchema>;\n\nexport async function setParametersBatchImpl(ctx: ToolContext, args: SetParametersBatchArgs) {\n return guardTd(\n () =>\n ctx.client.batch(\n args.updates.map((update) => ({\n action: \"update\" as const,\n path: update.path,\n parameters: update.parameters,\n })),\n ),\n (result) =>\n jsonResult(`Applied ${args.updates.length} parameter update(s) in one batch.`, result),\n );\n}\n\nexport const registerSetParametersBatch: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"set_parameters_batch\",\n {\n title: \"Set parameters (batch)\",\n description:\n \"Update parameters on multiple nodes in a single batch request. Each update reports its own success; a failure does not roll back the others.\",\n inputSchema: setParametersBatchSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },\n },\n (args) => setParametersBatchImpl(ctx, args),\n );\n};\n","import type { ToolRegistrar } from \"../types.js\";\nimport { registerConnectNodes } from \"./connectNodes.js\";\nimport { registerCreateContainer } from \"./createContainer.js\";\nimport { registerCreateGlslShader } from \"./createGlslShader.js\";\nimport { registerCreateNodeChain } from \"./createNodeChain.js\";\nimport { registerCreatePythonScript } from \"./createPythonScript.js\";\nimport { registerDuplicateNetwork } from \"./duplicateNetwork.js\";\nimport { registerSetParametersBatch } from \"./setParametersBatch.js\";\n\nexport const layer2Registrars: ToolRegistrar[] = [\n registerCreateNodeChain,\n registerConnectNodes,\n registerCreateGlslShader,\n registerCreatePythonScript,\n registerSetParametersBatch,\n registerCreateContainer,\n registerDuplicateNetwork,\n];\n","import { z } from \"zod\";\nimport { guardTd, structuredResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nexport const compareTdNodesSchema = z.object({\n path_a: z.string().describe(\"First node path.\"),\n path_b: z.string().describe(\"Second node path.\"),\n only_diff: z\n .boolean()\n .default(true)\n .describe(\"Return only the parameters that differ (true) or also list the identical ones.\"),\n});\ntype CompareTdNodesArgs = z.infer<typeof compareTdNodesSchema>;\n\nexport const compareTdNodesOutputSchema = z.object({\n a: z.string(),\n b: z.string(),\n type_a: z.string(),\n type_b: z.string(),\n type_match: z.boolean(),\n differing_count: z.number(),\n same_count: z.number(),\n differing: z.array(z.object({ param: z.string(), a: z.unknown(), b: z.unknown() })),\n identical: z.array(z.string()).optional(),\n});\n\nexport async function compareTdNodesImpl(ctx: ToolContext, args: CompareTdNodesArgs) {\n return guardTd(\n async () => {\n const [a, b] = await Promise.all([\n ctx.client.getNode(args.path_a),\n ctx.client.getNode(args.path_b),\n ]);\n return { a, b };\n },\n ({ a, b }) => {\n const keys = new Set([...Object.keys(a.parameters), ...Object.keys(b.parameters)]);\n const differing: Array<{ param: string; a: unknown; b: unknown }> = [];\n const identical: string[] = [];\n for (const key of [...keys].sort()) {\n const va = a.parameters[key];\n const vb = b.parameters[key];\n if (JSON.stringify(va) === JSON.stringify(vb)) identical.push(key);\n else differing.push({ param: key, a: va, b: vb });\n }\n const data: Record<string, unknown> = {\n a: a.path,\n b: b.path,\n type_a: a.type,\n type_b: b.type,\n type_match: a.type === b.type,\n differing_count: differing.length,\n same_count: identical.length,\n differing,\n };\n if (!args.only_diff) data.identical = identical;\n return structuredResult(\n `${differing.length} differing parameter(s) between ${a.path} and ${b.path}${a.type === b.type ? \"\" : ` (types differ: ${a.type} vs ${b.type})`}.`,\n data,\n );\n },\n );\n}\n\nexport const registerCompareTdNodes: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"compare_td_nodes\",\n {\n title: \"Compare two nodes\",\n description:\n \"Diff the parameters of two nodes, returning only the values that differ (by default). Useful for aligning settings across similar operators.\",\n inputSchema: compareTdNodesSchema.shape,\n outputSchema: compareTdNodesOutputSchema.shape,\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n (args) => compareTdNodesImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport { guardTd, jsonResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nexport const createTdNodeSchema = z.object({\n parent_path: z\n .string()\n .default(\"/project1\")\n .describe(\"Parent COMP path to create the node inside.\"),\n type: z\n .string()\n .describe(\"Operator type string, e.g. 'noiseTOP', 'feedbackTOP', 'nullTOP', 'constantCHOP'.\"),\n name: z.string().optional().describe(\"Optional node name (auto-generated if omitted).\"),\n parameters: z\n .record(z.string(), z.unknown())\n .optional()\n .describe(\"Optional initial parameter overrides as key→value pairs.\"),\n});\ntype CreateTdNodeArgs = z.infer<typeof createTdNodeSchema>;\n\nexport async function createTdNodeImpl(ctx: ToolContext, args: CreateTdNodeArgs) {\n const warnings: string[] = [];\n if (!ctx.knowledge.operatorExists(args.type)) {\n const suggestions = ctx.knowledge.searchOperators(args.type, 3).map((s) => s.name);\n warnings.push(\n `Operator type \"${args.type}\" was not found in the knowledge base.${\n suggestions.length ? ` Did you mean: ${suggestions.join(\", \")}?` : \"\"\n }`,\n );\n }\n return guardTd(\n () =>\n ctx.client.createNode({\n parent_path: args.parent_path,\n type: args.type,\n name: args.name,\n parameters: args.parameters,\n }),\n (node) => jsonResult(`Created ${node.type || args.type} at ${node.path}.`, { node, warnings }),\n );\n}\n\nexport const registerCreateTdNode: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"create_td_node\",\n {\n title: \"Create TouchDesigner node\",\n description:\n \"Create a single operator (node) inside a parent COMP. Validates the operator type against the knowledge base and warns (without blocking) on unknown types.\",\n inputSchema: createTdNodeSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },\n },\n (args) => createTdNodeImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport { guardTd, jsonResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nexport const deleteTdNodeSchema = z.object({\n path: z.string().describe(\"Full path of the node to delete, e.g. '/project1/noise1'.\"),\n});\ntype DeleteTdNodeArgs = z.infer<typeof deleteTdNodeSchema>;\n\nexport async function deleteTdNodeImpl(ctx: ToolContext, args: DeleteTdNodeArgs) {\n return guardTd(\n () => ctx.client.deleteNode(args.path),\n (result) => jsonResult(`Deleted ${result.deleted}.`, result),\n );\n}\n\nexport const registerDeleteTdNode: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"delete_td_node\",\n {\n title: \"Delete TouchDesigner node\",\n description:\n \"Delete a single node by path. Destructive — only call this when the user explicitly asks to remove a node.\",\n inputSchema: deleteTdNodeSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: true, openWorldHint: true },\n },\n (args) => deleteTdNodeImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport { guardTd, jsonResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nexport const execNodeMethodSchema = z.object({\n path: z.string().describe(\"Full path of the node to call the method on.\"),\n method: z.string().describe(\"Method name to call, e.g. 'cook', 'par', 'destroy', 'copy'.\"),\n args: z.array(z.unknown()).default([]).describe(\"Positional arguments.\"),\n kwargs: z.record(z.string(), z.unknown()).default({}).describe(\"Keyword arguments.\"),\n});\ntype ExecNodeMethodArgs = z.infer<typeof execNodeMethodSchema>;\n\nexport async function execNodeMethodImpl(ctx: ToolContext, args: ExecNodeMethodArgs) {\n return guardTd(\n () => ctx.client.execNodeMethod(args.path, args.method, args.args, args.kwargs),\n (result) => jsonResult(`Called ${args.path}.${args.method}().`, result),\n );\n}\n\nexport const registerExecNodeMethod: ToolRegistrar = (server, ctx) => {\n if (ctx.allowRawPython === false) return;\n server.registerTool(\n \"exec_node_method\",\n {\n title: \"Call node method\",\n description:\n \"Escape hatch — invoke an arbitrary Python method on a node (operator). Prefer structured tools where one exists; use this for operations they don't cover (e.g. .cook(), .copy(), .destroy()).\",\n inputSchema: execNodeMethodSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: true, openWorldHint: true },\n },\n (args) => execNodeMethodImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport { guardTd, jsonResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nexport const executePythonScriptSchema = z.object({\n script: z\n .string()\n .min(1)\n .describe(\n \"Python source to execute inside TouchDesigner (runs in the TD process, not locally).\",\n ),\n return_output: z\n .boolean()\n .default(true)\n .describe(\"Capture stdout / the value of the last expression and return it.\"),\n});\ntype ExecutePythonScriptArgs = z.infer<typeof executePythonScriptSchema>;\n\nexport async function executePythonScriptImpl(ctx: ToolContext, args: ExecutePythonScriptArgs) {\n return guardTd(\n () => ctx.client.executePythonScript(args.script, args.return_output),\n (result) => jsonResult(\"Python executed in TouchDesigner.\", result),\n );\n}\n\nexport const registerExecutePythonScript: ToolRegistrar = (server, ctx) => {\n if (ctx.allowRawPython === false) return;\n server.registerTool(\n \"execute_python_script\",\n {\n title: \"Execute Python in TouchDesigner\",\n description:\n \"Escape hatch — run an arbitrary Python script inside the TouchDesigner process. Prefer the structured tools (find_td_nodes, get_td_node_parameters, update_td_node_parameters, summarize_td_errors, snapshot_td_graph, …); reach for this only when no structured tool can express the operation. Code runs in TD only, never on the local machine.\",\n inputSchema: executePythonScriptSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: true, openWorldHint: true },\n },\n (args) => executePythonScriptImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport { NodeRefSchema } from \"../../td-client/validators.js\";\nimport { guardTd, structuredResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\nimport { globToRegExp } from \"./nodeMatch.js\";\n\nexport const findTdNodesSchema = z.object({\n parent_path: z.string().default(\"/project1\").describe(\"Where to search from.\"),\n pattern: z\n .string()\n .optional()\n .describe(\"Case-insensitive name/path filter with '*' wildcards (e.g. 'text*', '*noise*').\"),\n type: z\n .string()\n .optional()\n .describe(\"Case-insensitive operator-type substring (e.g. 'TOP', 'noise').\"),\n recursive: z\n .boolean()\n .default(true)\n .describe(\"Search the whole sub-network (true) or only direct children (false).\"),\n path_only: z.boolean().default(false).describe(\"Return only matching paths.\"),\n limit: z.number().int().positive().default(50).describe(\"Max matches to return.\"),\n});\ntype FindTdNodesArgs = z.infer<typeof findTdNodesSchema>;\n\nexport const findTdNodesOutputSchema = z.object({\n parent_path: z.string(),\n recursive: z.boolean(),\n count: z.number(),\n truncated: z.boolean(),\n paths: z.array(z.string()).optional(),\n matches: z.array(NodeRefSchema).optional(),\n});\n\nexport async function findTdNodesImpl(ctx: ToolContext, args: FindTdNodesArgs) {\n const fetch = args.recursive\n ? async () => (await ctx.client.getNetworkTopology(args.parent_path, true)).nodes\n : async () => (await ctx.client.getNodes(args.parent_path)).nodes;\n\n return guardTd(fetch, (allNodes) => {\n let nodes = allNodes;\n if (args.pattern) {\n const re = globToRegExp(args.pattern);\n nodes = nodes.filter((n) => re.test(n.name) || re.test(n.path));\n }\n if (args.type) {\n const t = args.type.toLowerCase();\n nodes = nodes.filter((n) => n.type.toLowerCase().includes(t));\n }\n const count = nodes.length;\n const truncated = count > args.limit;\n nodes = nodes.slice(0, args.limit);\n const summary = `${count} match(es) under ${args.parent_path}${truncated ? ` (showing ${args.limit})` : \"\"}.`;\n const base = { parent_path: args.parent_path, recursive: args.recursive, count, truncated };\n return args.path_only\n ? structuredResult(summary, { ...base, paths: nodes.map((n) => n.path) })\n : structuredResult(summary, { ...base, matches: nodes });\n });\n}\n\nexport const registerFindTdNodes: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"find_td_nodes\",\n {\n title: \"Find TouchDesigner nodes\",\n description:\n \"Search a network for nodes by name pattern and/or operator type. Recursive by default; pass path_only:true for a compact path list. Prefer this over get_td_nodes when you are looking for specific nodes.\",\n inputSchema: findTdNodesSchema.shape,\n outputSchema: findTdNodesOutputSchema.shape,\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n (args) => findTdNodesImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\n\n/** Standard response envelope every bridge endpoint returns. */\nexport const ApiEnvelopeSchema = z.object({\n ok: z.boolean(),\n data: z.unknown().optional(),\n error: z.object({ code: z.string().optional(), message: z.string() }).optional(),\n});\nexport type ApiEnvelope = z.infer<typeof ApiEnvelopeSchema>;\n\nexport const NodeRefSchema = z.object({\n path: z.string(),\n type: z.string().default(\"\"),\n name: z.string().default(\"\"),\n});\nexport type TdNodeRef = z.infer<typeof NodeRefSchema>;\n\nexport const NodeDetailSchema = NodeRefSchema.extend({\n parameters: z.record(z.string(), z.unknown()).default({}),\n inputs: z.array(z.string()).optional(),\n outputs: z.array(z.string()).optional(),\n family: z.string().optional(),\n errors: z.array(z.string()).optional(),\n});\nexport type TdNodeDetail = z.infer<typeof NodeDetailSchema>;\n\nexport const NodeListSchema = z.object({ nodes: z.array(NodeRefSchema).default([]) });\nexport type TdNodeList = z.infer<typeof NodeListSchema>;\n\nexport const InfoSchema = z.object({\n td_version: z.string().optional(),\n python_version: z.string().optional(),\n build: z.string().optional(),\n bridge_version: z.string().optional(),\n project: z.string().optional(),\n});\nexport type TdInfo = z.infer<typeof InfoSchema>;\n\nexport const NodeErrorSchema = z.object({\n path: z.string(),\n message: z.string(),\n type: z.string().optional(),\n});\nexport type TdNodeError = z.infer<typeof NodeErrorSchema>;\n\nexport const NodeErrorsSchema = z.object({ errors: z.array(NodeErrorSchema).default([]) });\nexport type TdNodeErrors = z.infer<typeof NodeErrorsSchema>;\n\nexport const PreviewSchema = z.object({\n path: z.string(),\n width: z.number().int().positive(),\n height: z.number().int().positive(),\n format: z.string().default(\"png\"),\n base64: z.string(),\n});\nexport type TdPreview = z.infer<typeof PreviewSchema>;\n\nexport const ExecResultSchema = z.object({\n result: z.unknown().optional(),\n stdout: z.string().optional(),\n printed: z.array(z.string()).optional(),\n});\nexport type TdExecResult = z.infer<typeof ExecResultSchema>;\n\nexport const MethodResultSchema = z.object({ result: z.unknown() });\nexport type TdMethodResult = z.infer<typeof MethodResultSchema>;\n\nexport const DeleteResultSchema = z.object({ deleted: z.string() });\nexport type TdDeleteResult = z.infer<typeof DeleteResultSchema>;\n\nexport const ConnectionSchema = z.object({\n source_path: z.string(),\n source_output: z.number().int().default(0),\n target_path: z.string(),\n target_input: z.number().int().default(0),\n});\nexport type TdConnection = z.infer<typeof ConnectionSchema>;\n\nexport const TopologySchema = z.object({\n nodes: z.array(NodeRefSchema).default([]),\n connections: z.array(ConnectionSchema).default([]),\n});\nexport type TdTopology = z.infer<typeof TopologySchema>;\n\nexport const PerformanceSchema = z.object({\n nodes: z\n .array(\n z.object({\n path: z.string(),\n cook_time_ms: z.number().default(0),\n cook_count: z.number().optional(),\n }),\n )\n .default([]),\n total_cook_time_ms: z.number().optional(),\n gpu_memory_mb: z.number().optional(),\n});\nexport type TdPerformance = z.infer<typeof PerformanceSchema>;\n\nexport const BatchOpResultSchema = z.object({\n action: z.string(),\n ok: z.boolean(),\n path: z.string().optional(),\n data: z.unknown().optional(),\n error: z.string().optional(),\n});\nexport const BatchResultSchema = z.object({ results: z.array(BatchOpResultSchema).default([]) });\nexport type TdBatchResult = z.infer<typeof BatchResultSchema>;\n\n/** Input shape for creating a node (used by the client and Layer 3 tool). */\nexport const CreateNodeInputSchema = z.object({\n parent_path: z.string(),\n type: z.string(),\n name: z.string().optional(),\n parameters: z.record(z.string(), z.unknown()).optional(),\n});\nexport type CreateNodeInput = z.infer<typeof CreateNodeInputSchema>;\n\n/** A single atomic operation accepted by `POST /api/batch`. */\nexport const BatchOperationSchema = z.discriminatedUnion(\"action\", [\n z.object({\n action: z.literal(\"create\"),\n parent_path: z.string(),\n type: z.string(),\n name: z.string().optional(),\n parameters: z.record(z.string(), z.unknown()).optional(),\n }),\n z.object({\n action: z.literal(\"update\"),\n path: z.string(),\n parameters: z.record(z.string(), z.unknown()),\n }),\n z.object({ action: z.literal(\"delete\"), path: z.string() }),\n z.object({\n action: z.literal(\"connect\"),\n source_path: z.string(),\n target_path: z.string(),\n source_output: z.number().int().default(0),\n target_input: z.number().int().default(0),\n }),\n]);\nexport type TdBatchOperation = z.infer<typeof BatchOperationSchema>;\n","/** Turns a `*`-glob into a case-insensitive RegExp (other regex metachars are escaped). */\nexport function globToRegExp(pattern: string): RegExp {\n const escaped = pattern.replace(/[.+?^${}()|[\\]\\\\]/g, \"\\\\$&\").replace(/\\*/g, \".*\");\n return new RegExp(escaped, \"i\");\n}\n\n/** The parent path of a TD node path, e.g. `/project1/moviein1` -> `/project1`. */\nexport function parentOf(path: string): string {\n const idx = path.lastIndexOf(\"/\");\n return idx <= 0 ? \"/\" : path.slice(0, idx);\n}\n","import { z } from \"zod\";\nimport { jsonResult, textResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nexport const getModuleHelpSchema = z.object({\n name: z.string().describe(\"Class or module name to get help for, e.g. 'OP', 'App', 'Project'.\"),\n});\ntype GetModuleHelpArgs = z.infer<typeof getModuleHelpSchema>;\n\nexport function getModuleHelpImpl(ctx: ToolContext, args: GetModuleHelpArgs) {\n const cls = ctx.knowledge.getPythonClass(args.name);\n if (!cls) {\n const suggestions = ctx.knowledge\n .listPythonClasses()\n .filter((c) => c.className.toLowerCase().includes(args.name.toLowerCase()))\n .slice(0, 5)\n .map((c) => c.className);\n return jsonResult(`No help found for \"${args.name}\".`, { found: false, suggestions });\n }\n\n const lines: string[] = [`# ${cls.displayName || cls.className}`, \"\"];\n if (cls.description) lines.push(cls.description, \"\");\n if (cls.members && cls.members.length > 0) {\n lines.push(\"## Members\");\n for (const m of cls.members) {\n const ro = m.readOnly ? \" (read-only)\" : \"\";\n lines.push(`- ${m.name}${m.returnType ? `: ${m.returnType}` : \"\"}${ro}`);\n }\n lines.push(\"\");\n }\n if (cls.methods && cls.methods.length > 0) {\n lines.push(\"## Methods\");\n for (const method of cls.methods) {\n const sig = method.signature || method.name || \"\";\n lines.push(`- ${sig}${method.returns ? ` -> ${method.returns}` : \"\"}`);\n }\n }\n return textResult(lines.join(\"\\n\"));\n}\n\nexport const registerGetModuleHelp: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"get_module_help\",\n {\n title: \"Get module/class help\",\n description:\n \"Human-readable help (description, members, method signatures) for a TouchDesigner Python class or module, from the knowledge base.\",\n inputSchema: getModuleHelpSchema.shape,\n annotations: { readOnlyHint: true, openWorldHint: false },\n },\n (args) => getModuleHelpImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport { structuredResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nexport const getTdClassDetailsSchema = z.object({\n class_name: z.string().describe(\"Python class name, e.g. 'OP', 'TOP', 'App', 'CHOP'.\"),\n});\ntype GetTdClassDetailsArgs = z.infer<typeof getTdClassDetailsSchema>;\n\nexport function getTdClassDetailsImpl(ctx: ToolContext, args: GetTdClassDetailsArgs) {\n const cls = ctx.knowledge.getPythonClass(args.class_name);\n if (!cls) {\n const suggestions = ctx.knowledge\n .listPythonClasses()\n .filter((c) => c.className.toLowerCase().includes(args.class_name.toLowerCase()))\n .slice(0, 5)\n .map((c) => c.className);\n return structuredResult(`Python class \"${args.class_name}\" not found.`, {\n found: false,\n suggestions,\n });\n }\n return structuredResult(\n `${cls.className} — ${cls.methods?.length ?? 0} methods, ${cls.members?.length ?? 0} members.`,\n cls,\n );\n}\n\nexport const registerGetTdClassDetails: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"get_td_class_details\",\n {\n title: \"Get TD Python class details\",\n description:\n \"Full documentation for one TouchDesigner Python class (members + methods) from the knowledge base.\",\n inputSchema: getTdClassDetailsSchema.shape,\n annotations: { readOnlyHint: true, openWorldHint: false },\n },\n (args) => getTdClassDetailsImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport { structuredResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nexport const getTdClassesSchema = z.object({\n filter: z\n .string()\n .optional()\n .describe(\"Optional case-insensitive substring to filter class names by.\"),\n});\ntype GetTdClassesArgs = z.infer<typeof getTdClassesSchema>;\n\nexport function getTdClassesImpl(ctx: ToolContext, args: GetTdClassesArgs) {\n let classes = ctx.knowledge.listPythonClasses();\n if (args.filter) {\n const needle = args.filter.toLowerCase();\n classes = classes.filter(\n (c) =>\n c.className.toLowerCase().includes(needle) || c.displayName.toLowerCase().includes(needle),\n );\n }\n return structuredResult(`Found ${classes.length} TouchDesigner Python API class(es).`, {\n classes,\n });\n}\n\nexport const registerGetTdClasses: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"get_td_classes\",\n {\n title: \"List TD Python classes\",\n description:\n \"List TouchDesigner Python API classes from the embedded knowledge base (works offline). Optionally filter by name.\",\n inputSchema: getTdClassesSchema.shape,\n annotations: { readOnlyHint: true, openWorldHint: false },\n },\n (args) => getTdClassesImpl(ctx, args),\n );\n};\n","import { friendlyTdError } from \"../../td-client/types.js\";\nimport { jsonResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nconst DESCRIPTION =\n \"Health check + TouchDesigner server info. Returns TD/Python version and bridge status when connected, plus the embedded knowledge-base stats. Use this first to confirm the bridge is reachable.\";\n\nexport async function getTdInfoImpl(ctx: ToolContext) {\n const knowledge = ctx.knowledge.stats();\n try {\n const info = await ctx.client.getInfo();\n return jsonResult(\"TouchDesigner is connected.\", {\n connected: true,\n endpoint: ctx.client.endpoint,\n touchdesigner: info,\n knowledge,\n });\n } catch (err) {\n return jsonResult(\"TouchDesigner is not reachable (the server is still running).\", {\n connected: false,\n endpoint: ctx.client.endpoint,\n reason: friendlyTdError(err),\n knowledge,\n });\n }\n}\n\nexport const registerGetTdInfo: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"get_td_info\",\n {\n title: \"Get TouchDesigner info\",\n description: DESCRIPTION,\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n () => getTdInfoImpl(ctx),\n );\n};\n","import { z } from \"zod\";\nimport { NodeErrorSchema } from \"../../td-client/validators.js\";\nimport { guardTd, structuredResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nexport const getTdNodeErrorsSchema = z.object({\n path: z.string().describe(\"Full path of the node (or network root) to check for errors.\"),\n recursive: z\n .boolean()\n .default(false)\n .describe(\"If true, check the whole network under `path`; otherwise just that node.\"),\n summary: z\n .boolean()\n .default(false)\n .describe(\"Return only counts grouped by error type instead of the full error list.\"),\n});\ntype GetTdNodeErrorsArgs = z.infer<typeof getTdNodeErrorsSchema>;\n\nexport const getTdNodeErrorsOutputSchema = z.object({\n path: z.string(),\n total: z.number(),\n errors: z.array(NodeErrorSchema).optional(),\n by_type: z.record(z.string(), z.number()).optional(),\n});\n\nexport async function getTdNodeErrorsImpl(ctx: ToolContext, args: GetTdNodeErrorsArgs) {\n return guardTd(\n () =>\n args.recursive ? ctx.client.getNetworkErrors(args.path) : ctx.client.getNodeErrors(args.path),\n (result) => {\n const errors = result.errors;\n const total = errors.length;\n const none = total === 0;\n if (args.summary) {\n const byType: Record<string, number> = {};\n for (const e of errors) {\n const key = e.type || \"error\";\n byType[key] = (byType[key] ?? 0) + 1;\n }\n return structuredResult(\n none ? `No errors found at ${args.path}.` : `${total} error(s) at ${args.path}.`,\n { path: args.path, total, by_type: byType },\n );\n }\n return structuredResult(\n none ? `No errors found at ${args.path}.` : `Found ${total} error(s) at ${args.path}.`,\n { path: args.path, total, errors },\n );\n },\n );\n}\n\nexport const registerGetTdNodeErrors: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"get_td_node_errors\",\n {\n title: \"Get node errors\",\n description:\n \"Check a node (or its whole sub-network) for cook/compile errors and warnings. Pass `summary:true` for grouped counts instead of the full list.\",\n inputSchema: getTdNodeErrorsSchema.shape,\n outputSchema: getTdNodeErrorsOutputSchema.shape,\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n (args) => getTdNodeErrorsImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport { NodeDetailSchema } from \"../../td-client/validators.js\";\nimport { guardTd, structuredResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nexport const getTdNodeParametersSchema = z.object({\n path: z.string().describe(\"Full path of the node to inspect.\"),\n keys: z\n .array(z.string())\n .optional()\n .describe(\"Only return these parameter names (case-sensitive). Omit to return all parameters.\"),\n omit_io: z\n .boolean()\n .default(false)\n .describe(\"Drop the inputs/outputs lists from the result to save context.\"),\n});\ntype GetTdNodeParametersArgs = z.infer<typeof getTdNodeParametersSchema>;\n\nexport async function getTdNodeParametersImpl(ctx: ToolContext, args: GetTdNodeParametersArgs) {\n return guardTd(\n () => ctx.client.getNode(args.path),\n (node) => {\n let parameters = node.parameters;\n if (args.keys && args.keys.length > 0) {\n const wanted = new Set(args.keys);\n parameters = Object.fromEntries(\n Object.entries(node.parameters).filter(([k]) => wanted.has(k)),\n );\n }\n const data: Record<string, unknown> = {\n path: node.path,\n type: node.type,\n name: node.name,\n parameters,\n };\n if (!args.omit_io) {\n data.inputs = node.inputs;\n data.outputs = node.outputs;\n }\n const count = Object.keys(parameters).length;\n return structuredResult(`${count} parameter(s) for ${node.path} (${node.type}).`, data);\n },\n );\n}\n\nexport const registerGetTdNodeParameters: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"get_td_node_parameters\",\n {\n title: \"Get node parameters\",\n description:\n \"Read the current parameters (and I/O) of a node. Pass `keys` to project specific parameters or `omit_io:true` to drop the inputs/outputs lists.\",\n inputSchema: getTdNodeParametersSchema.shape,\n outputSchema: NodeDetailSchema.shape,\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n (args) => getTdNodeParametersImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport { NodeRefSchema } from \"../../td-client/validators.js\";\nimport { guardTd, structuredResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\nimport { globToRegExp } from \"./nodeMatch.js\";\n\nexport const getTdNodesSchema = z.object({\n parent_path: z\n .string()\n .default(\"/project1\")\n .describe(\"Parent COMP whose direct children should be listed.\"),\n pattern: z\n .string()\n .optional()\n .describe(\n \"Case-insensitive filter on node name/path. Supports '*' wildcards (e.g. 'text*', '*noise*').\",\n ),\n path_only: z\n .boolean()\n .default(false)\n .describe(\"Return only the list of node paths, dropping type/name.\"),\n limit: z.number().int().positive().optional().describe(\"Cap the number of nodes returned.\"),\n detail_level: z\n .enum([\"summary\", \"full\"])\n .default(\"summary\")\n .describe(\n \"'summary' (default) returns a count, a type breakdown and the first few paths; 'full' returns every node. Use 'full' (or path_only) when you need the complete list.\",\n ),\n});\ntype GetTdNodesArgs = z.infer<typeof getTdNodesSchema>;\n\nconst SAMPLE_SIZE = 10;\n\nexport const getTdNodesOutputSchema = z.object({\n parent_path: z.string(),\n count: z.number(),\n detail_level: z.enum([\"summary\", \"full\"]),\n truncated: z.boolean(),\n by_type: z.record(z.string(), z.number()).optional(),\n sample: z.array(z.string()).optional(),\n paths: z.array(z.string()).optional(),\n nodes: z.array(NodeRefSchema).optional(),\n hint: z.string().optional(),\n});\n\nexport async function getTdNodesImpl(ctx: ToolContext, args: GetTdNodesArgs) {\n return guardTd(\n () => ctx.client.getNodes(args.parent_path),\n (list) => {\n let nodes = list.nodes;\n if (args.pattern) {\n const re = globToRegExp(args.pattern);\n nodes = nodes.filter((n) => re.test(n.name) || re.test(n.path));\n }\n const matched = nodes.length;\n const truncated = args.limit !== undefined && matched > args.limit;\n if (args.limit !== undefined) nodes = nodes.slice(0, args.limit);\n const where = args.pattern ? ` matching \"${args.pattern}\"` : \"\";\n const base = {\n parent_path: args.parent_path,\n count: matched,\n detail_level: args.detail_level,\n truncated,\n };\n\n if (args.path_only) {\n return structuredResult(`${matched} node(s) under ${args.parent_path}${where}.`, {\n ...base,\n paths: nodes.map((n) => n.path),\n });\n }\n\n if (args.detail_level === \"summary\") {\n const byType: Record<string, number> = {};\n for (const n of nodes) {\n const key = n.type || \"unknown\";\n byType[key] = (byType[key] ?? 0) + 1;\n }\n const sample = nodes.slice(0, SAMPLE_SIZE).map((n) => n.path);\n return structuredResult(\n `${matched} node(s) under ${args.parent_path}${where}. Summary only — pass detail_level:\"full\" or path_only:true for the full list.`,\n {\n ...base,\n by_type: byType,\n sample,\n ...(matched > sample.length\n ? {\n hint: `Showing first ${sample.length} of ${matched}. Use detail_level:\"full\" for all.`,\n }\n : {}),\n },\n );\n }\n\n return structuredResult(`${matched} node(s) under ${args.parent_path}${where}.`, {\n ...base,\n nodes,\n });\n },\n );\n}\n\nexport const registerGetTdNodes: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"get_td_nodes\",\n {\n title: \"List TouchDesigner nodes\",\n description:\n 'List the direct child nodes of a COMP. Defaults to a compact summary (count + type breakdown + sample paths); pass detail_level:\"full\" or path_only:true for the complete list, and `pattern` to filter by name.',\n inputSchema: getTdNodesSchema.shape,\n outputSchema: getTdNodesOutputSchema.shape,\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n (args) => getTdNodesImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport { checkPerformance } from \"../../feedback/performanceMonitor.js\";\nimport { guardTd, structuredResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nexport const getTdPerformanceSchema = z.object({\n root_path: z.string().default(\"/project1\").describe(\"Network root to measure cook times under.\"),\n target_fps: z\n .number()\n .positive()\n .default(60)\n .describe(\"Frame-rate target used to flag slow nodes.\"),\n});\ntype GetTdPerformanceArgs = z.infer<typeof getTdPerformanceSchema>;\n\nexport const getTdPerformanceOutputSchema = z.object({\n path: z.string(),\n targetFps: z.number(),\n frameBudgetMs: z.number(),\n totalCookMs: z.number(),\n nodes: z.array(\n z.object({\n path: z.string(),\n cook_time_ms: z.number(),\n cook_count: z.number().optional(),\n }),\n ),\n warnings: z.array(z.string()),\n});\n\nexport async function getTdPerformanceImpl(ctx: ToolContext, args: GetTdPerformanceArgs) {\n return guardTd(\n () => checkPerformance(ctx.client, args.root_path, args.target_fps),\n (report) =>\n structuredResult(\n report.warnings.length === 0\n ? `Within budget: ${report.totalCookMs.toFixed(2)}ms total under ${args.root_path} (${args.target_fps}fps).`\n : `${report.warnings.length} performance warning(s) under ${args.root_path}.`,\n report,\n ),\n );\n}\n\nexport const registerGetTdPerformance: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"get_td_performance\",\n {\n title: \"Get network performance\",\n description:\n \"Report cook times under a network and warn about nodes that exceed the frame budget.\",\n inputSchema: getTdPerformanceSchema.shape,\n outputSchema: getTdPerformanceOutputSchema.shape,\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n (args) => getTdPerformanceImpl(ctx, args),\n );\n};\n","import type { TouchDesignerClient } from \"../td-client/touchDesignerClient.js\";\n\nexport interface PerformanceReport {\n path: string;\n targetFps: number;\n frameBudgetMs: number;\n totalCookMs: number;\n nodes: Array<{ path: string; cook_time_ms: number; cook_count?: number }>;\n warnings: string[];\n}\n\n/** Reports cook times against the frame budget implied by `targetFps`. */\nexport async function checkPerformance(\n client: TouchDesignerClient,\n path: string,\n targetFps = 60,\n): Promise<PerformanceReport> {\n const perf = await client.getNetworkPerformance(path);\n const frameBudgetMs = 1000 / targetFps;\n const warnings: string[] = [];\n\n for (const node of perf.nodes) {\n if (node.cook_time_ms > frameBudgetMs) {\n warnings.push(\n `${node.path} cooks in ${node.cook_time_ms.toFixed(2)}ms, exceeding the ${frameBudgetMs.toFixed(2)}ms budget at ${targetFps}fps.`,\n );\n }\n }\n\n const totalCookMs =\n perf.total_cook_time_ms ?? perf.nodes.reduce((sum, node) => sum + node.cook_time_ms, 0);\n if (totalCookMs > frameBudgetMs) {\n warnings.push(\n `Total cook time ${totalCookMs.toFixed(2)}ms exceeds the ${frameBudgetMs.toFixed(2)}ms budget at ${targetFps}fps.`,\n );\n }\n\n return { path, targetFps, frameBudgetMs, totalCookMs, nodes: perf.nodes, warnings };\n}\n","import { z } from \"zod\";\nimport { verifyNetwork } from \"../../feedback/networkVerifier.js\";\nimport { TopologySchema } from \"../../td-client/validators.js\";\nimport { guardTd, structuredResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nexport const getTdTopologySchema = z.object({\n root_path: z.string().default(\"/project1\").describe(\"Network root to map.\"),\n});\ntype GetTdTopologyArgs = z.infer<typeof getTdTopologySchema>;\n\nexport const getTdTopologyOutputSchema = z.object({\n path: z.string(),\n nodeCount: z.number(),\n connectionCount: z.number(),\n issues: z.array(z.string()),\n topology: TopologySchema,\n});\n\nexport async function getTdTopologyImpl(ctx: ToolContext, args: GetTdTopologyArgs) {\n return guardTd(\n () => verifyNetwork(ctx.client, args.root_path),\n (report) =>\n structuredResult(\n `${report.nodeCount} node(s), ${report.connectionCount} connection(s) under ${args.root_path}.`,\n report,\n ),\n );\n}\n\nexport const registerGetTdTopology: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"get_td_topology\",\n {\n title: \"Get network topology\",\n description:\n \"Return the nodes and connections under a network root, flagging obvious structural issues.\",\n inputSchema: getTdTopologySchema.shape,\n outputSchema: getTdTopologyOutputSchema.shape,\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n (args) => getTdTopologyImpl(ctx, args),\n );\n};\n","import type { TouchDesignerClient } from \"../td-client/touchDesignerClient.js\";\nimport type { TdTopology } from \"../td-client/types.js\";\n\nexport interface VerifyReport {\n path: string;\n nodeCount: number;\n connectionCount: number;\n issues: string[];\n topology: TdTopology;\n}\n\n/** Inspects the topology under `path` and flags obvious structural issues. */\nexport async function verifyNetwork(\n client: TouchDesignerClient,\n path: string,\n): Promise<VerifyReport> {\n const topology = await client.getNetworkTopology(path);\n const issues: string[] = [];\n if (topology.nodes.length === 0) {\n issues.push(`No nodes were found under ${path}.`);\n } else if (topology.nodes.length > 1 && topology.connections.length === 0) {\n issues.push(\"Multiple nodes exist but none are connected.\");\n }\n return {\n path,\n nodeCount: topology.nodes.length,\n connectionCount: topology.connections.length,\n issues,\n topology,\n };\n}\n","import { z } from \"zod\";\nimport { verifyNetwork } from \"../../feedback/networkVerifier.js\";\nimport { ConnectionSchema } from \"../../td-client/validators.js\";\nimport { guardTd, structuredResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\n/** Cap on per-node parameter fetches so a big graph can't fan out into hundreds of requests. */\nconst MAX_PARAM_NODES = 60;\n\nexport const snapshotTdGraphSchema = z.object({\n path: z.string().default(\"/project1\").describe(\"Network root to snapshot.\"),\n include_params: z\n .boolean()\n .default(false)\n .describe(\"Also fetch each node's parameters (one request per node; capped for large graphs).\"),\n});\ntype SnapshotTdGraphArgs = z.infer<typeof snapshotTdGraphSchema>;\n\nexport const snapshotTdGraphOutputSchema = z.object({\n path: z.string(),\n nodeCount: z.number(),\n connectionCount: z.number(),\n issues: z.array(z.string()),\n params_truncated: z.boolean(),\n nodes: z.array(\n z.object({\n path: z.string(),\n type: z.string(),\n name: z.string(),\n parameters: z.record(z.string(), z.unknown()).optional(),\n }),\n ),\n connections: z.array(ConnectionSchema),\n});\n\nexport async function snapshotTdGraphImpl(ctx: ToolContext, args: SnapshotTdGraphArgs) {\n return guardTd(\n async () => {\n const report = await verifyNetwork(ctx.client, args.path);\n const refs = report.topology.nodes;\n let paramsTruncated = false;\n const params = new Map<string, Record<string, unknown>>();\n if (args.include_params) {\n const targets = refs.slice(0, MAX_PARAM_NODES);\n paramsTruncated = refs.length > MAX_PARAM_NODES;\n // Fail-forward: one unreadable node shouldn't sink the whole snapshot.\n const details = await Promise.allSettled(targets.map((n) => ctx.client.getNode(n.path)));\n for (const detail of details) {\n if (detail.status === \"fulfilled\") params.set(detail.value.path, detail.value.parameters);\n }\n }\n const nodes = refs.map((n) => ({\n path: n.path,\n type: n.type,\n name: n.name,\n ...(args.include_params ? { parameters: params.get(n.path) ?? {} } : {}),\n }));\n return { report, nodes, paramsTruncated };\n },\n ({ report, nodes, paramsTruncated }) =>\n structuredResult(\n `Snapshot of ${args.path}: ${report.nodeCount} node(s), ${report.connectionCount} connection(s)${report.issues.length ? `, ${report.issues.length} issue(s)` : \"\"}.`,\n {\n path: report.path,\n nodeCount: report.nodeCount,\n connectionCount: report.connectionCount,\n issues: report.issues,\n params_truncated: paramsTruncated,\n nodes,\n connections: report.topology.connections,\n },\n ),\n );\n}\n\nexport const registerSnapshotTdGraph: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"snapshot_td_graph\",\n {\n title: \"Snapshot network graph\",\n description:\n \"Capture a compact, serializable snapshot of a network — nodes, connections, structural issues, and optionally each node's parameters — for review, diffing, or documentation.\",\n inputSchema: snapshotTdGraphSchema.shape,\n outputSchema: snapshotTdGraphOutputSchema.shape,\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n (args) => snapshotTdGraphImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport { guardTd, structuredResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\nimport { parentOf } from \"./nodeMatch.js\";\n\nexport const summarizeTdErrorsSchema = z.object({\n path: z.string().default(\"/project1\").describe(\"Network root to collect errors under.\"),\n group_by: z\n .enum([\"message\", \"type\", \"parent\"])\n .default(\"message\")\n .describe(\n \"How to cluster errors: by exact message, by error type, or by parent container (to find a common upstream cause).\",\n ),\n});\ntype SummarizeTdErrorsArgs = z.infer<typeof summarizeTdErrorsSchema>;\n\nexport const summarizeTdErrorsOutputSchema = z.object({\n path: z.string(),\n total: z.number(),\n group_by: z.enum([\"message\", \"type\", \"parent\"]),\n groups: z.array(\n z.object({\n key: z.string(),\n count: z.number(),\n sample: z.object({ path: z.string(), message: z.string() }),\n }),\n ),\n suggestions: z.array(z.string()),\n});\n\nexport async function summarizeTdErrorsImpl(ctx: ToolContext, args: SummarizeTdErrorsArgs) {\n return guardTd(\n () => ctx.client.getNetworkErrors(args.path),\n (result) => {\n const errors = result.errors;\n const total = errors.length;\n if (total === 0) {\n return structuredResult(`No errors found under ${args.path}.`, {\n path: args.path,\n total: 0,\n group_by: args.group_by,\n groups: [],\n suggestions: [],\n });\n }\n\n const keyOf = (e: { path: string; message: string; type?: string }): string =>\n args.group_by === \"message\"\n ? e.message\n : args.group_by === \"type\"\n ? e.type || \"error\"\n : parentOf(e.path);\n\n const grouped = new Map<\n string,\n { count: number; sample: { path: string; message: string } }\n >();\n const byPath = new Map<string, number>();\n for (const e of errors) {\n const key = keyOf(e);\n const g = grouped.get(key);\n if (g) g.count += 1;\n else grouped.set(key, { count: 1, sample: { path: e.path, message: e.message } });\n byPath.set(e.path, (byPath.get(e.path) ?? 0) + 1);\n }\n\n const groups = [...grouped.entries()]\n .map(([key, g]) => ({ key, count: g.count, sample: g.sample }))\n .sort((a, b) => b.count - a.count);\n\n const worstNodes = [...byPath.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 3)\n .map(([p, c]) => `${p} (${c} error${c === 1 ? \"\" : \"s\"})`);\n\n const suggestions: string[] = [];\n if (groups[0] && groups[0].count > 1) {\n suggestions.push(\n `${groups[0].count} errors share ${args.group_by} \"${groups[0].key}\" — fixing the common cause clears them at once.`,\n );\n }\n if (worstNodes.length > 0) {\n suggestions.push(`Check first: ${worstNodes.join(\", \")}.`);\n }\n\n return structuredResult(\n `${total} error(s) under ${args.path} in ${groups.length} ${args.group_by} group(s).`,\n { path: args.path, total, group_by: args.group_by, groups, suggestions },\n );\n },\n );\n}\n\nexport const registerSummarizeTdErrors: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"summarize_td_errors\",\n {\n title: \"Summarize network errors\",\n description:\n \"Collect errors across a network and cluster them by message, type, or parent container, with the worst-offending nodes and a suggested order to investigate. Use this instead of reading every node's errors one by one.\",\n inputSchema: summarizeTdErrorsSchema.shape,\n outputSchema: summarizeTdErrorsOutputSchema.shape,\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n (args) => summarizeTdErrorsImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport { guardTd, jsonResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nexport const updateTdNodeParametersSchema = z.object({\n path: z.string().describe(\"Full path of the node whose parameters to update.\"),\n parameters: z\n .record(z.string(), z.unknown())\n .describe(\"Parameter overrides as key→value pairs, e.g. { period: 4, amplitude: 0.5 }.\"),\n});\ntype UpdateTdNodeParametersArgs = z.infer<typeof updateTdNodeParametersSchema>;\n\nexport async function updateTdNodeParametersImpl(\n ctx: ToolContext,\n args: UpdateTdNodeParametersArgs,\n) {\n return guardTd(\n () => ctx.client.updateNodeParameters(args.path, args.parameters),\n (node) =>\n jsonResult(`Updated ${Object.keys(args.parameters).length} parameter(s) on ${node.path}.`, {\n node,\n }),\n );\n}\n\nexport const registerUpdateTdNodeParameters: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"update_td_node_parameters\",\n {\n title: \"Update node parameters\",\n description: \"Set one or more parameters on an existing node.\",\n inputSchema: updateTdNodeParametersSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },\n },\n (args) => updateTdNodeParametersImpl(ctx, args),\n );\n};\n","import type { ToolRegistrar } from \"../types.js\";\nimport { registerCompareTdNodes } from \"./compareTdNodes.js\";\nimport { registerCreateTdNode } from \"./createTdNode.js\";\nimport { registerDeleteTdNode } from \"./deleteTdNode.js\";\nimport { registerExecNodeMethod } from \"./execNodeMethod.js\";\nimport { registerExecutePythonScript } from \"./executePythonScript.js\";\nimport { registerFindTdNodes } from \"./findTdNodes.js\";\nimport { registerGetModuleHelp } from \"./getModuleHelp.js\";\nimport { registerGetTdClassDetails } from \"./getTdClassDetails.js\";\nimport { registerGetTdClasses } from \"./getTdClasses.js\";\nimport { registerGetTdInfo } from \"./getTdInfo.js\";\nimport { registerGetTdNodeErrors } from \"./getTdNodeErrors.js\";\nimport { registerGetTdNodeParameters } from \"./getTdNodeParameters.js\";\nimport { registerGetTdNodes } from \"./getTdNodes.js\";\nimport { registerGetTdPerformance } from \"./getTdPerformance.js\";\nimport { registerGetTdTopology } from \"./getTdTopology.js\";\nimport { registerSnapshotTdGraph } from \"./snapshotTdGraph.js\";\nimport { registerSummarizeTdErrors } from \"./summarizeTdErrors.js\";\nimport { registerUpdateTdNodeParameters } from \"./updateTdNodeParameters.js\";\n\nexport const layer3Registrars: ToolRegistrar[] = [\n registerGetTdInfo,\n registerCreateTdNode,\n registerDeleteTdNode,\n registerUpdateTdNodeParameters,\n registerGetTdNodes,\n registerGetTdNodeParameters,\n registerGetTdNodeErrors,\n registerExecutePythonScript,\n registerExecNodeMethod,\n registerGetTdClasses,\n registerGetTdClassDetails,\n registerGetModuleHelp,\n registerGetTdPerformance,\n registerGetTdTopology,\n registerFindTdNodes,\n registerSummarizeTdErrors,\n registerCompareTdNodes,\n registerSnapshotTdGraph,\n];\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { layer1Registrars } from \"./layer1/index.js\";\nimport { layer2Registrars } from \"./layer2/index.js\";\nimport { layer3Registrars } from \"./layer3/index.js\";\nimport type { ToolContext } from \"./types.js\";\n\n/** Registers every tool (all layers) against the MCP server. */\nexport function registerAllTools(server: McpServer, ctx: ToolContext): void {\n const registrars = [...layer3Registrars, ...layer2Registrars, ...layer1Registrars];\n for (const register of registrars) register(server, ctx);\n}\n\nexport type { ToolContext, ToolRegistrar } from \"./types.js\";\n","import { readFileSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nlet cached: string | undefined;\n\n/**\n * Resolves the package version by walking up from this module until it finds\n * the `tdmcp` package.json. Works both in dev (tsx, from `src/`) and in\n * the bundled build (from `dist/`). Falls back to \"0.0.0\" if not found.\n */\nexport function getVersion(): string {\n if (cached) return cached;\n let dir = dirname(fileURLToPath(import.meta.url));\n for (let i = 0; i < 6; i++) {\n try {\n const raw = readFileSync(resolve(dir, \"package.json\"), \"utf8\");\n const pkg = JSON.parse(raw) as { name?: string; version?: string };\n if (pkg.name === \"tdmcp\" && pkg.version) {\n cached = pkg.version;\n return cached;\n }\n } catch {\n // package.json not here — keep walking up\n }\n const parent = dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n cached = \"0.0.0\";\n return cached;\n}\n","import { existsSync, readdirSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { type Logger, silentLogger } from \"../utils/logger.js\";\nimport { bottobotPackageDir, knowledgeDataDir } from \"../utils/paths.js\";\nimport {\n compactKey,\n normalizeGlsl,\n normalizePatterns,\n slugify,\n toOperatorSummary,\n toPythonSummary,\n toTutorialSummary,\n} from \"./normalize.js\";\nimport type {\n GlslSummary,\n GlslTechnique,\n KnowledgeStats,\n OperatorDoc,\n OperatorSummary,\n Pattern,\n PatternSummary,\n PythonClass,\n PythonClassSummary,\n Tutorial,\n TutorialSummary,\n} from \"./types.js\";\n\nexport interface KnowledgeBaseOptions {\n dataDir?: string;\n logger?: Logger;\n}\n\ninterface ResolvedSource {\n kind: \"local\" | \"bottobot\" | \"empty\";\n operatorsDir: string;\n operatorsIndex?: string;\n pythonDir: string;\n tutorialsDir: string;\n patternsFile: string;\n glslFile: string;\n}\n\nconst EMPTY_SOURCE: ResolvedSource = {\n kind: \"empty\",\n operatorsDir: \"\",\n pythonDir: \"\",\n tutorialsDir: \"\",\n patternsFile: \"\",\n glslFile: \"\",\n};\n\n/**\n * Read-only accessor over the embedded TouchDesigner knowledge base. Prefers the\n * imported local data directory; falls back to reading directly from an installed\n * `@bottobot/td-mcp`; otherwise degrades to empty results (never throws on lookup).\n */\nexport class KnowledgeBase {\n private readonly logger: Logger;\n private readonly source: ResolvedSource;\n\n private opIndexCache?: OperatorSummary[];\n private opLookupCache?: Map<string, string>;\n private readonly opDocCache = new Map<string, OperatorDoc | null>();\n private pyIndexCache?: PythonClassSummary[];\n private pyLookupCache?: Map<string, string>;\n private readonly pyDocCache = new Map<string, PythonClass | null>();\n private tutIndexCache?: TutorialSummary[];\n private tutLookupCache?: Map<string, string>;\n private readonly tutDocCache = new Map<string, Tutorial | null>();\n private patternsCache?: Pattern[];\n private glslCache?: GlslTechnique[];\n\n constructor(options: KnowledgeBaseOptions = {}) {\n this.logger = options.logger ?? silentLogger;\n this.source = KnowledgeBase.resolveSource(options.dataDir ?? knowledgeDataDir());\n this.logger.debug(\"knowledge source resolved\", { kind: this.source.kind });\n }\n\n private static resolveSource(localDir: string): ResolvedSource {\n if (existsSync(join(localDir, \"operators\"))) {\n return {\n kind: \"local\",\n operatorsDir: join(localDir, \"operators\"),\n operatorsIndex: join(localDir, \"operators\", \"index.json\"),\n pythonDir: join(localDir, \"python-api\"),\n tutorialsDir: join(localDir, \"tutorials\"),\n patternsFile: join(localDir, \"patterns.json\"),\n glslFile: join(localDir, \"glsl.json\"),\n };\n }\n const bb = bottobotPackageDir();\n if (bb) {\n return {\n kind: \"bottobot\",\n operatorsDir: join(bb, \"wiki/data/processed\"),\n pythonDir: join(bb, \"wiki/data/python-api\"),\n tutorialsDir: join(bb, \"wiki/data/tutorials\"),\n patternsFile: join(bb, \"data/patterns.json\"),\n glslFile: join(bb, \"wiki/data/experimental/glsl.json\"),\n };\n }\n return EMPTY_SOURCE;\n }\n\n private readJson(path: string): unknown {\n try {\n return JSON.parse(readFileSync(path, \"utf8\"));\n } catch (err) {\n this.logger.debug(\"knowledge readJson failed\", { path, error: String(err) });\n return undefined;\n }\n }\n\n private listJsonFiles(dir: string): string[] {\n if (!dir || !existsSync(dir)) return [];\n try {\n return readdirSync(dir).filter((f) => f.endsWith(\".json\") && f !== \"index.json\");\n } catch {\n return [];\n }\n }\n\n // ---- Operators -----------------------------------------------------------\n\n private operatorIndex(): OperatorSummary[] {\n if (this.opIndexCache) return this.opIndexCache;\n if (this.source.kind === \"empty\") {\n this.opIndexCache = [];\n return this.opIndexCache;\n }\n if (this.source.operatorsIndex && existsSync(this.source.operatorsIndex)) {\n const data = this.readJson(this.source.operatorsIndex);\n if (Array.isArray(data)) {\n this.opIndexCache = data as OperatorSummary[];\n return this.opIndexCache;\n }\n }\n const summaries: OperatorSummary[] = [];\n for (const file of this.listJsonFiles(this.source.operatorsDir)) {\n const doc = this.readJson(join(this.source.operatorsDir, file)) as OperatorDoc | undefined;\n if (doc?.name) summaries.push(toOperatorSummary(file.replace(/\\.json$/, \"\"), doc));\n }\n this.opIndexCache = summaries;\n return this.opIndexCache;\n }\n\n private operatorLookup(): Map<string, string> {\n if (this.opLookupCache) return this.opLookupCache;\n const map = new Map<string, string>();\n for (const summary of this.operatorIndex()) {\n map.set(compactKey(summary.slug), summary.slug);\n map.set(compactKey(summary.name), summary.slug);\n map.set(compactKey(summary.displayName), summary.slug);\n }\n this.opLookupCache = map;\n return map;\n }\n\n listOperatorCategories(): string[] {\n const set = new Set<string>();\n for (const summary of this.operatorIndex()) set.add(summary.category);\n return [...set].sort();\n }\n\n listOperators(category?: string): OperatorSummary[] {\n const all = this.operatorIndex();\n if (!category) return all;\n const wanted = compactKey(category);\n return all.filter((s) => compactKey(s.category) === wanted);\n }\n\n getOperator(nameOrSlug: string): OperatorDoc | undefined {\n if (this.source.kind === \"empty\") return undefined;\n const slug = this.operatorLookup().get(compactKey(nameOrSlug)) ?? slugify(nameOrSlug);\n const cached = this.opDocCache.get(slug);\n if (cached !== undefined) return cached ?? undefined;\n const file = join(this.source.operatorsDir, `${slug}.json`);\n const doc = existsSync(file) ? (this.readJson(file) as OperatorDoc | undefined) : undefined;\n this.opDocCache.set(slug, doc ?? null);\n return doc;\n }\n\n /** Soft existence check (by operator type, display name, or slug). */\n operatorExists(typeOrName: string): boolean {\n return this.operatorLookup().has(compactKey(typeOrName));\n }\n\n searchOperators(query: string, limit = 25): OperatorSummary[] {\n const q = query.trim().toLowerCase();\n if (!q) return [];\n const terms = q.split(/\\s+/);\n const scored: Array<{ summary: OperatorSummary; score: number }> = [];\n for (const summary of this.operatorIndex()) {\n const haystack =\n `${summary.name} ${summary.displayName} ${summary.summary} ${summary.keywords.join(\" \")}`.toLowerCase();\n let score = 0;\n for (const term of terms) {\n if (haystack.includes(term)) score += 1;\n if (summary.name.toLowerCase().includes(term)) score += 1;\n }\n if (score > 0) scored.push({ summary, score });\n }\n scored.sort((a, b) => b.score - a.score);\n return scored.slice(0, limit).map((s) => s.summary);\n }\n\n // ---- Python API ----------------------------------------------------------\n\n private pythonIndex(): PythonClassSummary[] {\n if (this.pyIndexCache) return this.pyIndexCache;\n if (this.source.kind === \"empty\") {\n this.pyIndexCache = [];\n return this.pyIndexCache;\n }\n const indexPath = join(this.source.pythonDir, \"index.json\");\n if (existsSync(indexPath)) {\n const data = this.readJson(indexPath);\n if (Array.isArray(data)) {\n this.pyIndexCache = data as PythonClassSummary[];\n return this.pyIndexCache;\n }\n }\n const summaries: PythonClassSummary[] = [];\n for (const file of this.listJsonFiles(this.source.pythonDir)) {\n const cls = this.readJson(join(this.source.pythonDir, file)) as PythonClass | undefined;\n if (cls?.className) summaries.push(toPythonSummary(cls));\n }\n this.pyIndexCache = summaries;\n return this.pyIndexCache;\n }\n\n private pythonLookup(): Map<string, string> {\n if (this.pyLookupCache) return this.pyLookupCache;\n const map = new Map<string, string>();\n for (const summary of this.pythonIndex()) {\n map.set(compactKey(summary.className), summary.className);\n map.set(compactKey(summary.displayName), summary.className);\n }\n this.pyLookupCache = map;\n return map;\n }\n\n listPythonClasses(): PythonClassSummary[] {\n return this.pythonIndex();\n }\n\n getPythonClass(name: string): PythonClass | undefined {\n if (this.source.kind === \"empty\") return undefined;\n const className = this.pythonLookup().get(compactKey(name)) ?? name;\n const cached = this.pyDocCache.get(className);\n if (cached !== undefined) return cached ?? undefined;\n const file = join(this.source.pythonDir, `${className}.json`);\n const cls = existsSync(file) ? (this.readJson(file) as PythonClass | undefined) : undefined;\n this.pyDocCache.set(className, cls ?? null);\n return cls;\n }\n\n // ---- Patterns ------------------------------------------------------------\n\n private patterns(): Pattern[] {\n if (this.patternsCache) return this.patternsCache;\n if (this.source.kind === \"empty\") {\n this.patternsCache = [];\n return this.patternsCache;\n }\n const data = this.readJson(this.source.patternsFile);\n if (Array.isArray(data) && data.length > 0 && typeof (data[0] as Pattern).id === \"string\") {\n this.patternsCache = data as Pattern[];\n } else {\n this.patternsCache = normalizePatterns(data);\n }\n return this.patternsCache;\n }\n\n listPatterns(): PatternSummary[] {\n return this.patterns().map((p) => ({\n id: p.id,\n name: p.name,\n category: p.category ?? \"Unknown\",\n description: p.description ?? \"\",\n }));\n }\n\n getPattern(name: string): Pattern | undefined {\n const key = compactKey(name);\n return this.patterns().find((p) => compactKey(p.id) === key || compactKey(p.name) === key);\n }\n\n // ---- GLSL ----------------------------------------------------------------\n\n private glsl(): GlslTechnique[] {\n if (this.glslCache) return this.glslCache;\n if (this.source.kind === \"empty\") {\n this.glslCache = [];\n return this.glslCache;\n }\n const data = this.readJson(this.source.glslFile);\n this.glslCache = Array.isArray(data) ? (data as GlslTechnique[]) : normalizeGlsl(data);\n return this.glslCache;\n }\n\n listGlslPatterns(): GlslSummary[] {\n return this.glsl().map((g) => ({\n id: g.id,\n name: g.name,\n description: g.description ?? \"\",\n difficulty: g.difficulty ?? \"unknown\",\n }));\n }\n\n getGlslPattern(name: string): GlslTechnique | undefined {\n const key = compactKey(name);\n return this.glsl().find((g) => compactKey(g.id) === key || compactKey(g.name) === key);\n }\n\n // ---- Tutorials -----------------------------------------------------------\n\n private tutorialIndex(): TutorialSummary[] {\n if (this.tutIndexCache) return this.tutIndexCache;\n if (this.source.kind === \"empty\") {\n this.tutIndexCache = [];\n return this.tutIndexCache;\n }\n const indexPath = join(this.source.tutorialsDir, \"index.json\");\n if (existsSync(indexPath)) {\n const data = this.readJson(indexPath);\n if (Array.isArray(data)) {\n this.tutIndexCache = data as TutorialSummary[];\n return this.tutIndexCache;\n }\n }\n const summaries: TutorialSummary[] = [];\n for (const file of this.listJsonFiles(this.source.tutorialsDir)) {\n const tut = this.readJson(join(this.source.tutorialsDir, file)) as Tutorial | undefined;\n if (tut?.id || tut?.name) {\n const normalized: Tutorial = {\n ...tut,\n id: tut.id ?? file.replace(/\\.json$/, \"\"),\n name: tut.name ?? file,\n };\n summaries.push(toTutorialSummary(normalized));\n }\n }\n this.tutIndexCache = summaries;\n return this.tutIndexCache;\n }\n\n private tutorialLookup(): Map<string, string> {\n if (this.tutLookupCache) return this.tutLookupCache;\n const map = new Map<string, string>();\n for (const file of this.listJsonFiles(this.source.tutorialsDir)) {\n const slug = file.replace(/\\.json$/, \"\");\n map.set(compactKey(slug), slug);\n }\n for (const summary of this.tutorialIndex()) {\n map.set(compactKey(summary.id), summary.id);\n map.set(compactKey(summary.name), summary.id);\n }\n this.tutLookupCache = map;\n return map;\n }\n\n listTutorials(): TutorialSummary[] {\n return this.tutorialIndex();\n }\n\n getTutorial(name: string): Tutorial | undefined {\n if (this.source.kind === \"empty\") return undefined;\n const slug = this.tutorialLookup().get(compactKey(name)) ?? slugify(name);\n const cached = this.tutDocCache.get(slug);\n if (cached !== undefined) return cached ?? undefined;\n const file = join(this.source.tutorialsDir, `${slug}.json`);\n const tut = existsSync(file) ? (this.readJson(file) as Tutorial | undefined) : undefined;\n this.tutDocCache.set(slug, tut ?? null);\n return tut;\n }\n\n // ---- Meta ----------------------------------------------------------------\n\n get sourceKind(): KnowledgeStats[\"source\"] {\n return this.source.kind;\n }\n\n stats(): KnowledgeStats {\n return {\n source: this.source.kind,\n operators: this.operatorIndex().length,\n pythonClasses: this.pythonIndex().length,\n patterns: this.patterns().length,\n glsl: this.glsl().length,\n tutorials: this.tutorialIndex().length,\n };\n }\n}\n","export type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\" | \"silent\";\n\nconst LEVELS: Record<LogLevel, number> = {\n debug: 10,\n info: 20,\n warn: 30,\n error: 40,\n silent: 99,\n};\n\nexport interface Logger {\n debug(message: string, meta?: Record<string, unknown>): void;\n info(message: string, meta?: Record<string, unknown>): void;\n warn(message: string, meta?: Record<string, unknown>): void;\n error(message: string, meta?: Record<string, unknown>): void;\n}\n\n/**\n * Creates a leveled logger. All output goes to **stderr** so that stdout stays\n * reserved for the MCP stdio protocol stream.\n */\nexport function createLogger(level: LogLevel = \"info\"): Logger {\n const threshold = LEVELS[level];\n\n const emit = (\n lvl: Exclude<LogLevel, \"silent\">,\n message: string,\n meta?: Record<string, unknown>,\n ) => {\n if (LEVELS[lvl] < threshold) return;\n const stamp = new Date().toISOString();\n const suffix = meta && Object.keys(meta).length > 0 ? ` ${JSON.stringify(meta)}` : \"\";\n process.stderr.write(`[tdmcp] ${stamp} ${lvl.toUpperCase()} ${message}${suffix}\\n`);\n };\n\n return {\n debug: (message, meta) => emit(\"debug\", message, meta),\n info: (message, meta) => emit(\"info\", message, meta),\n warn: (message, meta) => emit(\"warn\", message, meta),\n error: (message, meta) => emit(\"error\", message, meta),\n };\n}\n\n/** A logger that discards everything — handy for tests. */\nexport const silentLogger: Logger = {\n debug: () => {},\n info: () => {},\n warn: () => {},\n error: () => {},\n};\n","import { existsSync, readdirSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { compactKey } from \"../knowledge/normalize.js\";\nimport { type Logger, silentLogger } from \"../utils/logger.js\";\nimport { recipesDir } from \"../utils/paths.js\";\nimport { type Recipe, RecipeSchema, type RecipeSummary } from \"./schema.js\";\n\nexport interface RecipeLibraryOptions {\n dir?: string;\n logger?: Logger;\n}\n\n/** Loads and validates recipe JSON files from the recipes directory. */\nexport class RecipeLibrary {\n private readonly dir: string;\n private readonly logger: Logger;\n private cache?: Recipe[];\n\n constructor(options: RecipeLibraryOptions = {}) {\n this.dir = options.dir ?? recipesDir();\n this.logger = options.logger ?? silentLogger;\n }\n\n private load(): Recipe[] {\n if (this.cache) return this.cache;\n const recipes: Recipe[] = [];\n if (existsSync(this.dir)) {\n for (const file of readdirSync(this.dir)) {\n if (!file.endsWith(\".json\")) continue;\n try {\n const raw = JSON.parse(readFileSync(join(this.dir, file), \"utf8\"));\n const parsed = RecipeSchema.safeParse(raw);\n if (parsed.success) {\n recipes.push(parsed.data);\n } else {\n this.logger.warn(`Invalid recipe ${file}`, { issues: parsed.error.issues.length });\n }\n } catch (err) {\n this.logger.warn(`Failed to read recipe ${file}`, { error: String(err) });\n }\n }\n }\n this.cache = recipes;\n return recipes;\n }\n\n all(): Recipe[] {\n return this.load();\n }\n\n list(): RecipeSummary[] {\n return this.load().map((r) => ({\n id: r.id,\n name: r.name,\n description: r.description,\n tags: r.tags,\n difficulty: r.difficulty,\n }));\n }\n\n get(id: string): Recipe | undefined {\n const key = compactKey(id);\n return this.load().find((r) => compactKey(r.id) === key || compactKey(r.name) === key);\n }\n\n /** Finds the best recipe whose tags/name/description match any of the given terms. */\n findByTags(terms: string[]): Recipe | undefined {\n const wanted = terms.map((t) => t.toLowerCase()).filter(Boolean);\n if (wanted.length === 0) return undefined;\n let best: { recipe: Recipe; score: number } | undefined;\n for (const recipe of this.load()) {\n const haystack =\n `${recipe.name} ${recipe.description} ${recipe.tags.join(\" \")}`.toLowerCase();\n let score = 0;\n for (const term of wanted) {\n if (recipe.tags.some((tag) => tag.toLowerCase() === term)) score += 2;\n else if (haystack.includes(term)) score += 1;\n }\n if (score > 0 && (!best || score > best.score)) best = { recipe, score };\n }\n return best?.recipe;\n }\n}\n","import { z } from \"zod\";\n\nexport const RecipeNodeSchema = z.object({\n name: z.string().describe(\"Unique node name within the recipe (used for wiring).\"),\n type: z.string().describe(\"Operator type, e.g. 'noiseTOP'.\"),\n parameters: z.record(z.string(), z.unknown()).default({}),\n parent: z\n .string()\n .optional()\n .describe(\n \"Name of another recipe node (a COMP, e.g. a geometryCOMP) to nest this node inside of. \" +\n \"The parent must appear earlier in `nodes`. Used to place SOPs inside a Geometry COMP.\",\n ),\n render: z\n .boolean()\n .optional()\n .describe(\n \"For a SOP nested in a geometryCOMP: make this the rendered geometry. Sets the render/display \" +\n \"flags on it and clears its siblings, so the COMP renders this instead of its default torus.\",\n ),\n comment: z.string().optional(),\n});\n\nexport const RecipeConnectionSchema = z.object({\n from: z.string().describe(\"Source node name.\"),\n to: z.string().describe(\"Target node name.\"),\n from_output: z.number().int().nonnegative().default(0),\n to_input: z.number().int().nonnegative().default(0),\n});\n\nexport const RecipeParameterSchema = z.object({\n name: z.string().describe(\"Friendly name of the exposed control.\"),\n node: z.string().describe(\"Recipe node name the parameter belongs to.\"),\n param: z.string().describe(\"TD parameter name on that node.\"),\n value: z.unknown().optional(),\n label: z.string().optional(),\n min: z.number().optional(),\n max: z.number().optional(),\n description: z.string().optional(),\n});\n\n/**\n * A uniform exposed by a GLSL TOP. On the GLSL TOP these live in *parameter\n * sequences*, not normal parameters, so they cannot be set the usual way: the block\n * count (`op.seq.<seq>.numBlocks`) has to be raised first, after which the per-block\n * name/value sub-parameters exist. `float`/`vec` uniforms bind through the \"Vectors\"\n * page (the `vec` sequence); `color` binds through the \"Colors\" page (the `color`\n * sequence). The \"Constants\" page does NOT feed a runtime `uniform float`, so it is\n * not used here. `buildFromRecipe` handles the translation; authors just declare the\n * uniform.\n */\nexport const RecipeGlslUniformSchema = z.object({\n node: z.string().describe(\"Recipe node name of the GLSL TOP that declares the uniform.\"),\n name: z.string().describe(\"Uniform name as referenced in the shader, e.g. 'uFeed'.\"),\n kind: z\n .enum([\"float\", \"vec\", \"color\"])\n .default(\"float\")\n .describe(\n \"Uniform kind: float (uniform float), vec (uniform vec2/3/4), color (rgba). \" +\n \"float/vec use the Vectors page; color uses the Colors page.\",\n ),\n value: z\n .union([z.number(), z.array(z.number())])\n .optional()\n .describe(\"Initial value: a number for float, or an array of components for vec/color.\"),\n label: z.string().optional(),\n min: z.number().optional(),\n max: z.number().optional(),\n description: z.string().optional(),\n});\nexport type RecipeGlslUniform = z.infer<typeof RecipeGlslUniformSchema>;\n\nexport const RecipeSchema = z.object({\n id: z.string(),\n name: z.string(),\n description: z.string().default(\"\"),\n tags: z.array(z.string()).default([]),\n difficulty: z.enum([\"beginner\", \"intermediate\", \"advanced\"]).default(\"intermediate\"),\n td_version_min: z.string().default(\"2023\"),\n nodes: z.array(RecipeNodeSchema).min(1),\n connections: z.array(RecipeConnectionSchema).default([]),\n parameters: z.array(RecipeParameterSchema).default([]),\n glsl_uniforms: z.array(RecipeGlslUniformSchema).default([]),\n glsl_code: z.record(z.string(), z.string()).optional(),\n python_code: z.record(z.string(), z.string()).optional(),\n preview_description: z.string().default(\"\"),\n});\nexport type Recipe = z.infer<typeof RecipeSchema>;\n\nexport interface RecipeSummary {\n id: string;\n name: string;\n description: string;\n tags: string[];\n difficulty: Recipe[\"difficulty\"];\n}\n","import type { z } from \"zod\";\nimport { type Logger, silentLogger } from \"../utils/logger.js\";\nimport { TdApiError, TdConnectionError, TdTimeoutError } from \"./types.js\";\nimport {\n ApiEnvelopeSchema,\n BatchResultSchema,\n type CreateNodeInput,\n CreateNodeInputSchema,\n DeleteResultSchema,\n ExecResultSchema,\n InfoSchema,\n MethodResultSchema,\n NodeDetailSchema,\n NodeErrorsSchema,\n NodeListSchema,\n NodeRefSchema,\n PerformanceSchema,\n PreviewSchema,\n type TdBatchOperation,\n TopologySchema,\n} from \"./validators.js\";\n\nexport interface TouchDesignerClientOptions {\n baseUrl: string;\n timeoutMs?: number;\n logger?: Logger;\n /** Optional shared bearer token; sent as `Authorization: Bearer <token>` when set. */\n token?: string;\n /** Overridable for tests (defaults to global `fetch`). */\n fetchImpl?: typeof fetch;\n}\n\ntype QueryParams = Record<string, string | number | boolean | undefined>;\n\nfunction extractErrorMessage(json: unknown): string | undefined {\n if (json && typeof json === \"object\") {\n const obj = json as Record<string, unknown>;\n const error = obj.error;\n if (\n error &&\n typeof error === \"object\" &&\n typeof (error as Record<string, unknown>).message === \"string\"\n ) {\n return (error as Record<string, string>).message;\n }\n if (typeof obj.message === \"string\") return obj.message;\n }\n return undefined;\n}\n\n/** Encodes a TD node path (which contains slashes) into a single URL segment. */\nfunction segment(path: string): string {\n return encodeURIComponent(path);\n}\n\n/**\n * HTTP client for the TouchDesigner REST bridge. Every method maps to one of the\n * endpoints in the bridge spec. All failures surface as typed `TdError`s so MCP\n * tool handlers can convert them into friendly messages without crashing.\n */\nexport class TouchDesignerClient {\n private readonly baseUrl: string;\n private readonly timeoutMs: number;\n private readonly logger: Logger;\n private readonly token: string | undefined;\n private readonly fetchImpl: typeof fetch;\n\n constructor(options: TouchDesignerClientOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/+$/, \"\");\n this.timeoutMs = options.timeoutMs ?? 10000;\n this.logger = options.logger ?? silentLogger;\n this.token = options.token;\n this.fetchImpl = options.fetchImpl ?? fetch;\n }\n\n get endpoint(): string {\n return this.baseUrl;\n }\n\n private async request<T>(\n method: string,\n path: string,\n schema: z.ZodType<T>,\n body?: unknown,\n query?: QueryParams,\n ): Promise<T> {\n const url = new URL(`${this.baseUrl}${path}`);\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined) url.searchParams.set(key, String(value));\n }\n }\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n let response: Response;\n try {\n this.logger.debug(`TD ${method} ${path}`);\n const headers: Record<string, string> = {};\n if (body !== undefined) headers[\"content-type\"] = \"application/json\";\n if (this.token) headers.authorization = `Bearer ${this.token}`;\n response = await this.fetchImpl(url, {\n method,\n signal: controller.signal,\n headers: Object.keys(headers).length > 0 ? headers : undefined,\n body: body !== undefined ? JSON.stringify(body) : undefined,\n });\n } catch (err) {\n if (err instanceof Error && err.name === \"AbortError\") {\n throw new TdTimeoutError(\n `TouchDesigner request timed out after ${this.timeoutMs}ms (${method} ${path}).`,\n { cause: err },\n );\n }\n throw new TdConnectionError(\n `Cannot reach TouchDesigner at ${this.baseUrl}. Make sure TD is running with the tdmcp bridge (WebServer DAT) installed and listening on that port.`,\n { cause: err },\n );\n } finally {\n clearTimeout(timer);\n }\n\n const text = await response.text();\n let json: unknown;\n if (text) {\n try {\n json = JSON.parse(text);\n } catch {\n json = undefined;\n }\n }\n\n if (!response.ok) {\n const message =\n extractErrorMessage(json) ??\n `TouchDesigner bridge returned HTTP ${response.status} for ${method} ${path}.`;\n throw new TdApiError(message, { status: response.status });\n }\n\n const envelope = ApiEnvelopeSchema.safeParse(json);\n if (!envelope.success) {\n throw new TdApiError(`Malformed response from TouchDesigner bridge for ${method} ${path}.`, {\n status: response.status,\n });\n }\n if (!envelope.data.ok) {\n throw new TdApiError(\n envelope.data.error?.message ?? `TouchDesigner reported an error for ${method} ${path}.`,\n { status: response.status, apiCode: envelope.data.error?.code },\n );\n }\n\n const parsed = schema.safeParse(envelope.data.data);\n if (!parsed.success) {\n throw new TdApiError(\n `Unexpected data shape from TouchDesigner bridge for ${method} ${path}: ${parsed.error.message}`,\n { status: response.status },\n );\n }\n return parsed.data;\n }\n\n getInfo() {\n return this.request(\"GET\", \"/api/info\", InfoSchema);\n }\n\n createNode(input: CreateNodeInput) {\n return this.request(\"POST\", \"/api/nodes\", NodeRefSchema, CreateNodeInputSchema.parse(input));\n }\n\n deleteNode(path: string) {\n return this.request(\"DELETE\", `/api/nodes/${segment(path)}`, DeleteResultSchema);\n }\n\n getNodes(parentPath?: string) {\n return this.request(\"GET\", \"/api/nodes\", NodeListSchema, undefined, { parent: parentPath });\n }\n\n getNode(path: string) {\n return this.request(\"GET\", `/api/nodes/${segment(path)}`, NodeDetailSchema);\n }\n\n updateNodeParameters(path: string, parameters: Record<string, unknown>) {\n return this.request(\"PATCH\", `/api/nodes/${segment(path)}`, NodeDetailSchema, { parameters });\n }\n\n executePythonScript(script: string, returnOutput = true) {\n return this.request(\"POST\", \"/api/exec\", ExecResultSchema, {\n script,\n return_output: returnOutput,\n });\n }\n\n execNodeMethod(\n path: string,\n method: string,\n args: unknown[] = [],\n kwargs: Record<string, unknown> = {},\n ) {\n return this.request(\"POST\", `/api/nodes/${segment(path)}/method`, MethodResultSchema, {\n method,\n args,\n kwargs,\n });\n }\n\n getNodeErrors(path: string) {\n return this.request(\"GET\", `/api/nodes/${segment(path)}/errors`, NodeErrorsSchema);\n }\n\n getPreview(path: string, width = 640, height = 360) {\n return this.request(\"GET\", `/api/preview/${segment(path)}`, PreviewSchema, undefined, {\n width,\n height,\n });\n }\n\n batch(operations: TdBatchOperation[]) {\n return this.request(\"POST\", \"/api/batch\", BatchResultSchema, { operations });\n }\n\n getNetworkErrors(path: string) {\n return this.request(\"GET\", `/api/network/${segment(path)}/errors`, NodeErrorsSchema);\n }\n\n getNetworkTopology(path: string, recursive = false) {\n return this.request(\n \"GET\",\n `/api/network/${segment(path)}/topology`,\n TopologySchema,\n undefined,\n recursive ? { recursive: true } : undefined,\n );\n }\n\n getNetworkPerformance(path: string) {\n return this.request(\"GET\", `/api/network/${segment(path)}/performance`, PerformanceSchema);\n }\n}\n","import { z } from \"zod\";\n\nexport const ConfigSchema = z.object({\n /** TouchDesigner bridge host. */\n tdHost: z.string().min(1).default(\"127.0.0.1\"),\n /** TouchDesigner bridge port (WebServer DAT). */\n tdPort: z.coerce.number().int().positive().max(65535).default(9980),\n /** MCP transport: `stdio` (default, for local clients) or `http` (Streamable HTTP, loopback-only). */\n transport: z.enum([\"stdio\", \"http\"]).default(\"stdio\"),\n /** Log verbosity (written to stderr). */\n logLevel: z.enum([\"debug\", \"info\", \"warn\", \"error\", \"silent\"]).default(\"info\"),\n /** Per-request timeout against the TD bridge, in milliseconds. */\n requestTimeoutMs: z.coerce.number().int().positive().default(10000),\n /** HTTP transport port (only used when transport=http). */\n httpPort: z.coerce.number().int().positive().max(65535).default(3939),\n /** Subscribe to TD WebSocket events and forward them as MCP logging notifications. */\n events: z.enum([\"on\", \"off\"]).default(\"on\"),\n /**\n * Raw Python escape-hatch tools (`execute_python_script`, `exec_node_method`).\n * Set to \"off\" to lock them out for restricted setups; on by default.\n */\n rawPython: z.enum([\"on\", \"off\"]).default(\"on\"),\n /**\n * Optional shared bearer token for the TD bridge. When set, the server sends it\n * as `Authorization: Bearer <token>` and the bridge requires a match. Leave unset\n * (default) for the zero-config local flow. Set the SAME value in TouchDesigner's\n * environment (`TDMCP_BRIDGE_TOKEN`) to turn enforcement on.\n */\n bridgeToken: z.string().min(1).optional(),\n});\n\nexport type TdmcpConfig = z.infer<typeof ConfigSchema>;\n\n/**\n * Loads and validates configuration from environment variables. Missing values\n * fall back to sensible defaults; invalid values throw a descriptive ZodError.\n */\nexport function loadConfig(env: NodeJS.ProcessEnv = process.env): TdmcpConfig {\n return ConfigSchema.parse({\n tdHost: env.TDMCP_TD_HOST,\n tdPort: env.TDMCP_TD_PORT,\n transport: env.TDMCP_TRANSPORT,\n logLevel: env.TDMCP_LOG_LEVEL,\n requestTimeoutMs: env.TDMCP_REQUEST_TIMEOUT_MS,\n httpPort: env.TDMCP_HTTP_PORT,\n events: env.TDMCP_EVENTS,\n rawPython: env.TDMCP_RAW_PYTHON,\n bridgeToken: env.TDMCP_BRIDGE_TOKEN || undefined,\n });\n}\n\n/** Base URL for the TouchDesigner REST bridge. */\nexport function tdBaseUrl(config: Pick<TdmcpConfig, \"tdHost\" | \"tdPort\">): string {\n return `http://${config.tdHost}:${config.tdPort}`;\n}\n","import { TouchDesignerClient } from \"../td-client/touchDesignerClient.js\";\nimport { type TdmcpConfig, tdBaseUrl } from \"../utils/config.js\";\nimport type { Logger } from \"../utils/logger.js\";\n\n/**\n * Owns the TouchDesigner client and exposes a cheap health probe. The MCP server\n * stays alive whether or not TD is reachable.\n */\nexport class ConnectionManager {\n readonly client: TouchDesignerClient;\n\n constructor(config: TdmcpConfig, logger: Logger) {\n this.client = new TouchDesignerClient({\n baseUrl: tdBaseUrl(config),\n timeoutMs: config.requestTimeoutMs,\n token: config.bridgeToken,\n logger,\n });\n }\n\n async isReachable(): Promise<boolean> {\n try {\n await this.client.getInfo();\n return true;\n } catch {\n return false;\n }\n }\n}\n","import { KnowledgeBase } from \"../knowledge/index.js\";\nimport { RecipeLibrary } from \"../recipes/loader.js\";\nimport type { ToolContext } from \"../tools/types.js\";\nimport type { TdmcpConfig } from \"../utils/config.js\";\nimport { createLogger, type Logger } from \"../utils/logger.js\";\nimport { ConnectionManager } from \"./connectionManager.js\";\n\nexport interface ToolContextOverrides {\n logger?: Logger;\n knowledge?: KnowledgeBase;\n recipes?: RecipeLibrary;\n connection?: ConnectionManager;\n}\n\n/**\n * Assembles the shared {@link ToolContext} that backs every tool handler. Both\n * the MCP server and the agent CLI build their context here, so the two surfaces\n * stay on the same core (client + knowledge + recipes) without duplicating wiring.\n */\nexport function buildToolContext(\n config: TdmcpConfig,\n overrides: ToolContextOverrides = {},\n): ToolContext {\n const logger = overrides.logger ?? createLogger(config.logLevel);\n const connection = overrides.connection ?? new ConnectionManager(config, logger);\n const knowledge = overrides.knowledge ?? new KnowledgeBase({ logger });\n const recipes = overrides.recipes ?? new RecipeLibrary({ logger });\n return {\n client: connection.client,\n knowledge,\n recipes,\n logger,\n allowRawPython: config.rawPython !== \"off\",\n };\n}\n","import { randomUUID } from \"node:crypto\";\nimport { createServer, type IncomingMessage, type Server, type ServerResponse } from \"node:http\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { StreamableHTTPServerTransport } from \"@modelcontextprotocol/sdk/server/streamableHttp.js\";\nimport { isInitializeRequest } from \"@modelcontextprotocol/sdk/types.js\";\nimport { type TdEvent, TdEventStream } from \"../td-client/eventStream.js\";\nimport { type TdmcpConfig, tdBaseUrl } from \"../utils/config.js\";\nimport type { Logger } from \"../utils/logger.js\";\n\n/** A running transport plus a way to shut it down cleanly. */\nexport interface TransportHandle {\n close: () => Promise<void>;\n}\n\nconst MCP_PATH = \"/mcp\";\n\n/** Forwards one TD event to a connected MCP client as a logging notification. */\nfunction forwardEvent(server: McpServer, event: TdEvent): void {\n const level = event.event === \"node.error\" ? \"error\" : \"info\";\n void server.sendLoggingMessage({ level, logger: \"touchdesigner\", data: event }).catch(() => {\n // client may not support logging or not be connected yet — ignore\n });\n}\n\n/** Opens the TD event stream (if enabled) and routes each event to `onEvent`. */\nfunction createEventStream(\n config: TdmcpConfig,\n logger: Logger,\n onEvent: (event: TdEvent) => void,\n): TdEventStream | undefined {\n if (config.events !== \"on\") return undefined;\n const url = `${tdBaseUrl(config).replace(/^http/, \"ws\")}/`;\n const stream = new TdEventStream({ url, logger, onEvent });\n stream.start();\n return stream;\n}\n\nfunction readBody(req: IncomingMessage): Promise<unknown> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n req.on(\"data\", (chunk: Buffer) => chunks.push(chunk));\n req.on(\"end\", () => {\n const raw = Buffer.concat(chunks).toString(\"utf8\");\n if (!raw) return resolve(undefined);\n try {\n resolve(JSON.parse(raw));\n } catch (err) {\n reject(err);\n }\n });\n req.on(\"error\", reject);\n });\n}\n\nfunction sendJson(res: ServerResponse, status: number, payload: unknown): void {\n res.writeHead(status, { \"content-type\": \"application/json\" });\n res.end(JSON.stringify(payload));\n}\n\nfunction startStdio(\n createMcpServer: () => McpServer,\n config: TdmcpConfig,\n logger: Logger,\n): TransportHandle {\n const server = createMcpServer();\n const transport = new StdioServerTransport();\n void server.connect(transport);\n logger.info(\"tdmcp connected over stdio\");\n\n const events = createEventStream(config, logger, (event) => forwardEvent(server, event));\n\n return {\n close: async () => {\n events?.close();\n await server.close();\n },\n };\n}\n\n/**\n * Stateful Streamable HTTP transport: one MCP server + transport per session,\n * keyed by the `mcp-session-id` header. Sessions are created on an `initialize`\n * POST and torn down on transport close or DELETE.\n */\nfunction startHttp(\n createMcpServer: () => McpServer,\n config: TdmcpConfig,\n logger: Logger,\n): TransportHandle {\n const transports = new Map<string, StreamableHTTPServerTransport>();\n const servers = new Map<string, McpServer>();\n const events = createEventStream(config, logger, (event) => {\n for (const sessionServer of servers.values()) forwardEvent(sessionServer, event);\n });\n\n const httpServer: Server = createServer((req, res) => {\n void handle(req, res).catch((err) => {\n logger.error(\"HTTP request failed\", { error: String(err) });\n if (!res.headersSent) {\n sendJson(res, 500, {\n jsonrpc: \"2.0\",\n error: { code: -32603, message: \"Internal server error\" },\n id: null,\n });\n }\n });\n });\n\n async function handle(req: IncomingMessage, res: ServerResponse): Promise<void> {\n const url = new URL(req.url ?? \"/\", `http://${req.headers.host ?? \"localhost\"}`);\n if (url.pathname !== MCP_PATH) {\n sendJson(res, 404, { error: \"Not found. MCP endpoint is at /mcp.\" });\n return;\n }\n const sessionId = req.headers[\"mcp-session-id\"];\n const existing = typeof sessionId === \"string\" ? transports.get(sessionId) : undefined;\n\n if (req.method === \"POST\") {\n const body = await readBody(req);\n if (!existing) {\n if (!isInitializeRequest(body)) {\n sendJson(res, 400, {\n jsonrpc: \"2.0\",\n error: { code: -32000, message: \"No valid session; send an initialize request first.\" },\n id: null,\n });\n return;\n }\n const sessionServer = createMcpServer();\n const created: StreamableHTTPServerTransport = new StreamableHTTPServerTransport({\n sessionIdGenerator: () => randomUUID(),\n onsessioninitialized: (id) => {\n transports.set(id, created);\n servers.set(id, sessionServer);\n },\n // Reject Host headers other than loopback to block DNS-rebinding attacks.\n enableDnsRebindingProtection: true,\n allowedHosts: [`127.0.0.1:${config.httpPort}`, `localhost:${config.httpPort}`],\n });\n created.onclose = () => {\n if (created.sessionId) {\n transports.delete(created.sessionId);\n servers.delete(created.sessionId);\n }\n };\n await sessionServer.connect(created);\n await created.handleRequest(req, res, body);\n return;\n }\n await existing.handleRequest(req, res, body);\n return;\n }\n\n if (req.method === \"GET\" || req.method === \"DELETE\") {\n if (!existing) {\n sendJson(res, 400, { error: \"Unknown or missing mcp-session-id.\" });\n return;\n }\n await existing.handleRequest(req, res);\n return;\n }\n\n sendJson(res, 405, { error: \"Method not allowed.\" });\n }\n\n // Bind to loopback by default so HTTP isn't unexpectedly exposed.\n httpServer.listen(config.httpPort, \"127.0.0.1\", () => {\n logger.info(\"tdmcp listening over Streamable HTTP\", { port: config.httpPort, path: MCP_PATH });\n });\n\n return {\n close: async () => {\n events?.close();\n for (const transport of transports.values()) await transport.close();\n transports.clear();\n servers.clear();\n await new Promise<void>((resolve) => httpServer.close(() => resolve()));\n },\n };\n}\n\n/**\n * Connects the MCP server to a transport based on config. `stdio` is the default;\n * `http` serves Streamable HTTP. Returns a handle for clean shutdown.\n */\nexport async function startTransport(\n createMcpServer: () => McpServer,\n config: TdmcpConfig,\n logger: Logger,\n): Promise<TransportHandle> {\n if (config.transport === \"http\") {\n return startHttp(createMcpServer, config, logger);\n }\n return startStdio(createMcpServer, config, logger);\n}\n","import { type Logger, silentLogger } from \"../utils/logger.js\";\n\nexport interface TdEvent {\n event: string;\n data?: unknown;\n}\n\nexport type TdEventHandler = (event: TdEvent) => void;\n\n/** High-frequency events are dropped unless explicitly opted in, to avoid flooding. */\nconst HIGH_FREQUENCY = new Set([\"timeline.frame\", \"node.cook\"]);\n\n/**\n * Parses a raw WebSocket message into a `TdEvent`, applying the high-frequency\n * filter. Returns `undefined` for messages that should be ignored.\n */\nexport function parseEventMessage(raw: unknown, includeHighFrequency = false): TdEvent | undefined {\n if (typeof raw !== \"string\") return undefined;\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return undefined;\n }\n if (!parsed || typeof parsed !== \"object\") return undefined;\n const event = (parsed as { event?: unknown }).event;\n if (typeof event !== \"string\") return undefined;\n if (!includeHighFrequency && HIGH_FREQUENCY.has(event)) return undefined;\n return { event, data: (parsed as { data?: unknown }).data };\n}\n\nexport interface TdEventStreamOptions {\n url: string;\n onEvent: TdEventHandler;\n logger?: Logger;\n includeHighFrequency?: boolean;\n}\n\n/**\n * Connects to the TouchDesigner bridge WebSocket and forwards events. Uses the\n * built-in global `WebSocket` (Node 22+), reconnects with exponential backoff,\n * and is fully optional — the server works whether or not this connects.\n */\nexport class TdEventStream {\n private socket?: WebSocket;\n private closed = false;\n private backoffMs = 1000;\n private readonly url: string;\n private readonly onEvent: TdEventHandler;\n private readonly logger: Logger;\n private readonly includeHighFrequency: boolean;\n\n constructor(options: TdEventStreamOptions) {\n this.url = options.url;\n this.onEvent = options.onEvent;\n this.logger = options.logger ?? silentLogger;\n this.includeHighFrequency = options.includeHighFrequency ?? false;\n }\n\n start(): void {\n this.connect();\n }\n\n private connect(): void {\n if (this.closed) return;\n let socket: WebSocket;\n try {\n socket = new WebSocket(this.url);\n } catch {\n this.scheduleReconnect();\n return;\n }\n this.socket = socket;\n socket.addEventListener(\"open\", () => {\n this.backoffMs = 1000;\n this.logger.debug(\"event stream connected\", { url: this.url });\n });\n socket.addEventListener(\"message\", (ev) => {\n const event = parseEventMessage((ev as { data?: unknown }).data, this.includeHighFrequency);\n if (!event) return;\n try {\n this.onEvent(event);\n } catch (err) {\n this.logger.debug(\"event handler failed\", { error: String(err) });\n }\n });\n socket.addEventListener(\"close\", () => this.scheduleReconnect());\n socket.addEventListener(\"error\", () => {\n // a \"close\" event follows; reconnection is handled there\n });\n }\n\n private scheduleReconnect(): void {\n if (this.closed) return;\n const delay = this.backoffMs;\n this.backoffMs = Math.min(this.backoffMs * 2, 30000);\n const timer = setTimeout(() => this.connect(), delay);\n timer.unref?.();\n }\n\n close(): void {\n this.closed = true;\n try {\n this.socket?.close();\n } catch {\n // ignore\n }\n }\n}\n","import { runInstallBridge } from \"./cli/installBridge.js\";\nimport { createTdmcpServer } from \"./server/tdmcpServer.js\";\nimport { startTransport } from \"./server/transportFactory.js\";\nimport { loadConfig } from \"./utils/config.js\";\nimport { createLogger } from \"./utils/logger.js\";\n\nasync function main(): Promise<void> {\n const argv = process.argv.slice(2);\n if (argv[0] === \"install-bridge\") {\n runInstallBridge(argv.slice(1));\n return;\n }\n\n const config = loadConfig();\n const logger = createLogger(config.logLevel);\n\n try {\n const handle = await startTransport(\n () => createTdmcpServer(config, { logger }),\n config,\n logger,\n );\n\n const shutdown = () => {\n logger.info(\"tdmcp shutting down\");\n void handle.close().finally(() => process.exit(0));\n };\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n } catch (err) {\n logger.error(\"Failed to start tdmcp server\", { error: String(err) });\n process.exitCode = 1;\n }\n}\n\nvoid main();\n"],"mappings":"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","names":["existsSync","existsSync","z","z","z","z","z","z","z","z","ResourceTemplate","ResourceTemplate","ResourceTemplate","ResourceTemplate","ResourceTemplate","ResourceTemplate","ResourceTemplate","ResourceTemplate","ResourceTemplate","ResourceTemplate","z","parentPath","q","z","z","q","z","z","q","z","z","q","z","z","q","z","builder","z","q","z","z","z","z","z","z","z","z","q","z","z","z","z","z","z","z","RESOLUTIONS","q","z","z","z","z","z","q","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","fetch","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","dirname","resolve","fileURLToPath","existsSync","readFileSync","join","existsSync","join","readFileSync","cached","q","existsSync","readdirSync","readFileSync","join","z","existsSync","readdirSync","readFileSync","join","z","resolve"]}
|