@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,240 @@
|
|
|
1
|
+
"""HTTP router for the tdmcp bridge.
|
|
2
|
+
|
|
3
|
+
Maps the REST endpoints the Node MCP server calls onto the service layer and
|
|
4
|
+
wraps every response in the standard `{ ok, data | error }` envelope.
|
|
5
|
+
|
|
6
|
+
Node-path URL segments are percent-encoded by the client (a TD path contains
|
|
7
|
+
slashes), so they are `unquote`d here.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
import hmac
|
|
11
|
+
import json
|
|
12
|
+
import os
|
|
13
|
+
from urllib.parse import parse_qs, unquote, urlparse
|
|
14
|
+
|
|
15
|
+
from mcp import events
|
|
16
|
+
from mcp.services import analysis_service, api_service, batch_service, preview_service
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def _required_token():
|
|
20
|
+
"""The shared bearer token the bridge enforces, or None when auth is off.
|
|
21
|
+
|
|
22
|
+
Off by default (zero-config local flow). Launch TouchDesigner with the
|
|
23
|
+
`TDMCP_BRIDGE_TOKEN` environment variable set — to the SAME value the Node
|
|
24
|
+
server uses — to require authentication on every request.
|
|
25
|
+
"""
|
|
26
|
+
token = os.environ.get("TDMCP_BRIDGE_TOKEN")
|
|
27
|
+
return token or None
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def _exec_allowed():
|
|
31
|
+
"""Whether the arbitrary-code endpoints (`/api/exec`, node `method`) are enabled.
|
|
32
|
+
|
|
33
|
+
On by default. Set `TDMCP_BRIDGE_ALLOW_EXEC` to 0/false/no/off in TouchDesigner's
|
|
34
|
+
environment to reject them at the bridge — defense in depth that holds even against
|
|
35
|
+
a direct network caller, independent of the Node server's own `TDMCP_RAW_PYTHON`
|
|
36
|
+
gate (which only hides the tools client-side). Structured endpoints stay available.
|
|
37
|
+
"""
|
|
38
|
+
raw = os.environ.get("TDMCP_BRIDGE_ALLOW_EXEC")
|
|
39
|
+
if raw is None:
|
|
40
|
+
return True
|
|
41
|
+
return raw.strip().lower() not in ("0", "false", "no", "off")
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def _find_header(request, name):
|
|
45
|
+
"""Case-insensitively find an HTTP header in TouchDesigner's request dict.
|
|
46
|
+
|
|
47
|
+
TD builds vary in how they expose headers (top-level keys, or nested under a
|
|
48
|
+
'headers'/'header'/'fields' dict), so scan defensively for the first match.
|
|
49
|
+
"""
|
|
50
|
+
target = name.lower()
|
|
51
|
+
|
|
52
|
+
def scan(node, depth=0):
|
|
53
|
+
if not isinstance(node, dict) or depth > 2:
|
|
54
|
+
return None
|
|
55
|
+
for key, value in node.items():
|
|
56
|
+
if isinstance(key, str) and key.lower() == target and isinstance(value, str):
|
|
57
|
+
return value
|
|
58
|
+
for nested in ("headers", "header", "fields"):
|
|
59
|
+
sub = node.get(nested)
|
|
60
|
+
hit = scan(sub, depth + 1) if isinstance(sub, dict) else None
|
|
61
|
+
if hit is not None:
|
|
62
|
+
return hit
|
|
63
|
+
return None
|
|
64
|
+
|
|
65
|
+
return scan(request)
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def _check_auth(request):
|
|
69
|
+
token = _required_token()
|
|
70
|
+
if not token:
|
|
71
|
+
return # auth disabled (default)
|
|
72
|
+
provided = (_find_header(request, "authorization") or "").strip()
|
|
73
|
+
if not hmac.compare_digest(provided, "Bearer " + token):
|
|
74
|
+
raise PermissionError("Unauthorized: missing or invalid bearer token.")
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def _qs(query, key, default=None):
|
|
78
|
+
values = query.get(key)
|
|
79
|
+
return values[0] if values else default
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def _parse_body(request):
|
|
83
|
+
data = request.get("data")
|
|
84
|
+
if isinstance(data, (bytes, bytearray)):
|
|
85
|
+
data = data.decode("utf-8", "ignore")
|
|
86
|
+
if not data: # None, "", b"" all become an empty body
|
|
87
|
+
return {}
|
|
88
|
+
if isinstance(data, str):
|
|
89
|
+
data = data.strip()
|
|
90
|
+
if not data:
|
|
91
|
+
return {}
|
|
92
|
+
return json.loads(data)
|
|
93
|
+
return data
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def _node_path(segments):
|
|
97
|
+
# TouchDesigner's WebServer DAT decodes %2F into "/", so a node path arrives
|
|
98
|
+
# split across URL segments with its leading slash dropped. Re-join (unquote is
|
|
99
|
+
# a no-op when already decoded) and restore the leading slash.
|
|
100
|
+
raw = "/".join(unquote(s) for s in segments)
|
|
101
|
+
return "/" + raw.lstrip("/")
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def _route(method, path, query, body):
|
|
105
|
+
parts = [p for p in path.split("/") if p]
|
|
106
|
+
if not parts or parts[0] != "api":
|
|
107
|
+
raise ValueError("Not found: %s" % path)
|
|
108
|
+
rest = parts[1:]
|
|
109
|
+
|
|
110
|
+
if rest == ["info"] and method == "GET":
|
|
111
|
+
return api_service.get_info()
|
|
112
|
+
|
|
113
|
+
if rest == ["nodes"] and method == "POST":
|
|
114
|
+
return api_service.create_node(
|
|
115
|
+
body["parent_path"], body["type"], body.get("name"), body.get("parameters")
|
|
116
|
+
)
|
|
117
|
+
if rest == ["nodes"] and method == "GET":
|
|
118
|
+
return api_service.get_nodes(_qs(query, "parent"))
|
|
119
|
+
|
|
120
|
+
if rest == ["exec"] and method == "POST":
|
|
121
|
+
if not _exec_allowed():
|
|
122
|
+
raise PermissionError("Forbidden: arbitrary code execution is disabled (TDMCP_BRIDGE_ALLOW_EXEC=0).")
|
|
123
|
+
return api_service.exec_script(body["script"], body.get("return_output", True))
|
|
124
|
+
|
|
125
|
+
if rest == ["batch"] and method == "POST":
|
|
126
|
+
return batch_service.run(body.get("operations", []))
|
|
127
|
+
|
|
128
|
+
if rest[0] == "nodes" and len(rest) >= 2:
|
|
129
|
+
if rest[-1] == "method" and method == "POST":
|
|
130
|
+
if not _exec_allowed():
|
|
131
|
+
raise PermissionError(
|
|
132
|
+
"Forbidden: arbitrary method calls are disabled (TDMCP_BRIDGE_ALLOW_EXEC=0)."
|
|
133
|
+
)
|
|
134
|
+
return api_service.call_method(
|
|
135
|
+
_node_path(rest[1:-1]),
|
|
136
|
+
body["method"],
|
|
137
|
+
body.get("args", []),
|
|
138
|
+
body.get("kwargs", {}),
|
|
139
|
+
)
|
|
140
|
+
if rest[-1] == "errors" and method == "GET":
|
|
141
|
+
return api_service.get_node_errors(_node_path(rest[1:-1]), recursive=False)
|
|
142
|
+
node_path = _node_path(rest[1:])
|
|
143
|
+
if method == "GET":
|
|
144
|
+
return api_service.get_node(node_path)
|
|
145
|
+
if method == "PATCH":
|
|
146
|
+
return api_service.update_parameters(node_path, body.get("parameters", {}))
|
|
147
|
+
if method == "DELETE":
|
|
148
|
+
return api_service.delete_node(node_path)
|
|
149
|
+
|
|
150
|
+
if rest[0] == "preview" and method == "GET" and len(rest) >= 2:
|
|
151
|
+
return preview_service.capture(
|
|
152
|
+
_node_path(rest[1:]), int(_qs(query, "width", 640)), int(_qs(query, "height", 360))
|
|
153
|
+
)
|
|
154
|
+
|
|
155
|
+
if rest[0] == "network" and method == "GET" and len(rest) >= 3:
|
|
156
|
+
kind = rest[-1]
|
|
157
|
+
node_path = _node_path(rest[1:-1])
|
|
158
|
+
if kind == "errors":
|
|
159
|
+
return analysis_service.errors(node_path)
|
|
160
|
+
if kind == "topology":
|
|
161
|
+
return analysis_service.topology(node_path, recursive=_qs(query, "recursive") == "true")
|
|
162
|
+
if kind == "performance":
|
|
163
|
+
return analysis_service.performance(node_path)
|
|
164
|
+
|
|
165
|
+
raise ValueError("Unsupported %s %s" % (method, path))
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
def _send(response, status, payload):
|
|
169
|
+
response["statusCode"] = status
|
|
170
|
+
response["statusReason"] = "OK" if status < 400 else "Error"
|
|
171
|
+
response["content-type"] = "application/json"
|
|
172
|
+
response["data"] = json.dumps(payload)
|
|
173
|
+
return response
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
def _merge_query(request, query):
|
|
177
|
+
# TD may surface query params separately from the uri; merge defensively.
|
|
178
|
+
for key in ("pars", "params", "queryString", "query", "args"):
|
|
179
|
+
extra = request.get(key)
|
|
180
|
+
if isinstance(extra, dict):
|
|
181
|
+
for k, v in extra.items():
|
|
182
|
+
query.setdefault(k, v if isinstance(v, list) else [v])
|
|
183
|
+
elif isinstance(extra, str) and extra:
|
|
184
|
+
for k, v in parse_qs(extra).items():
|
|
185
|
+
query.setdefault(k, v)
|
|
186
|
+
return query
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
def _emit_node_errors(webserver, path):
|
|
190
|
+
if not path:
|
|
191
|
+
return
|
|
192
|
+
try:
|
|
193
|
+
report = api_service.get_node_errors(path, recursive=False)
|
|
194
|
+
except Exception: # noqa: BLE001
|
|
195
|
+
return
|
|
196
|
+
for err in report.get("errors", []):
|
|
197
|
+
events.broadcast(webserver, "node.error", err)
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
def _emit_event(webserver, method, path, data):
|
|
201
|
+
if webserver is None:
|
|
202
|
+
return
|
|
203
|
+
parts = [p for p in path.split("/") if p]
|
|
204
|
+
rest = parts[1:] if parts[:1] == ["api"] else []
|
|
205
|
+
try:
|
|
206
|
+
if method == "POST" and rest == ["nodes"]:
|
|
207
|
+
events.broadcast(webserver, "node.created", data)
|
|
208
|
+
_emit_node_errors(webserver, (data or {}).get("path"))
|
|
209
|
+
elif method == "PATCH" and len(rest) >= 2 and rest[0] == "nodes":
|
|
210
|
+
_emit_node_errors(webserver, (data or {}).get("path"))
|
|
211
|
+
elif method == "DELETE" and len(rest) >= 2 and rest[0] == "nodes":
|
|
212
|
+
events.broadcast(webserver, "node.deleted", data)
|
|
213
|
+
elif method == "POST" and rest == ["batch"]:
|
|
214
|
+
for result in (data or {}).get("results", []):
|
|
215
|
+
if not result.get("ok"):
|
|
216
|
+
continue
|
|
217
|
+
if result.get("action") == "create":
|
|
218
|
+
node = result.get("data")
|
|
219
|
+
events.broadcast(webserver, "node.created", node)
|
|
220
|
+
_emit_node_errors(webserver, (node or {}).get("path"))
|
|
221
|
+
elif result.get("action") == "delete":
|
|
222
|
+
events.broadcast(webserver, "node.deleted", {"path": result.get("path")})
|
|
223
|
+
except Exception: # noqa: BLE001
|
|
224
|
+
pass
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
def handle(request, response, webserver=None):
|
|
228
|
+
try:
|
|
229
|
+
_check_auth(request)
|
|
230
|
+
method = (request.get("method") or "GET").upper()
|
|
231
|
+
parsed = urlparse(request.get("uri", "/"))
|
|
232
|
+
query = _merge_query(request, parse_qs(parsed.query))
|
|
233
|
+
body = _parse_body(request)
|
|
234
|
+
data = _route(method, parsed.path, query, body)
|
|
235
|
+
_emit_event(webserver, method, parsed.path, data)
|
|
236
|
+
return _send(response, 200, {"ok": True, "data": data})
|
|
237
|
+
except PermissionError as exc:
|
|
238
|
+
return _send(response, 401, {"ok": False, "error": {"message": str(exc)}})
|
|
239
|
+
except Exception as exc: # noqa: BLE001
|
|
240
|
+
return _send(response, 400, {"ok": False, "error": {"message": str(exc)}})
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"""Developer helper: hot-reload the bridge's Python in a running TouchDesigner.
|
|
2
|
+
|
|
3
|
+
Editing files under ``td/`` does NOT reload the modules already imported by a running
|
|
4
|
+
TouchDesigner, so the bridge keeps serving the stale code it loaded at project open.
|
|
5
|
+
After editing the bridge, call :func:`reload_bridge` -- from the Textport
|
|
6
|
+
(``from mcp import dev; dev.reload_bridge()``) or via the ``execute_python_script``
|
|
7
|
+
tool -- to pick up the changes without reopening the project.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
import importlib
|
|
11
|
+
import sys
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def reload_bridge():
|
|
15
|
+
"""Reimport every loaded ``mcp.*`` / ``utils.*`` module, deepest first.
|
|
16
|
+
|
|
17
|
+
Controllers import service modules as module objects (``from mcp.services import x``),
|
|
18
|
+
so reloading the modules in place propagates the new functions to their callers.
|
|
19
|
+
Modules are reloaded deepest-first so packages re-bind to freshly reloaded submodules.
|
|
20
|
+
|
|
21
|
+
Returns the list of reloaded module names.
|
|
22
|
+
"""
|
|
23
|
+
targets = [
|
|
24
|
+
name
|
|
25
|
+
for name in sys.modules
|
|
26
|
+
if name in ("mcp", "utils") or name.startswith("mcp.") or name.startswith("utils.")
|
|
27
|
+
]
|
|
28
|
+
targets.sort(key=lambda name: name.count("."), reverse=True)
|
|
29
|
+
reloaded = []
|
|
30
|
+
for name in targets:
|
|
31
|
+
module = sys.modules.get(name)
|
|
32
|
+
if module is None:
|
|
33
|
+
continue
|
|
34
|
+
try:
|
|
35
|
+
importlib.reload(module)
|
|
36
|
+
reloaded.append(name)
|
|
37
|
+
except Exception:
|
|
38
|
+
# A module that fails to reload (e.g. caught mid-edit) must not abort the rest.
|
|
39
|
+
pass
|
|
40
|
+
return reloaded
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"""Broadcast TD-side events to all connected WebSocket clients.
|
|
2
|
+
|
|
3
|
+
Events use the shape { "event": "<name>", "data": <payload> }, matching what the
|
|
4
|
+
Node server's event stream expects.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import json
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def broadcast(webserver, event, data=None):
|
|
11
|
+
if webserver is None:
|
|
12
|
+
return
|
|
13
|
+
try:
|
|
14
|
+
message = json.dumps({"event": event, "data": data})
|
|
15
|
+
except Exception: # noqa: BLE001
|
|
16
|
+
return
|
|
17
|
+
try:
|
|
18
|
+
connections = webserver.webSocketConnections or []
|
|
19
|
+
except Exception: # noqa: BLE001
|
|
20
|
+
return
|
|
21
|
+
for client in connections:
|
|
22
|
+
try:
|
|
23
|
+
webserver.webSocketSendText(client, message)
|
|
24
|
+
except Exception: # noqa: BLE001
|
|
25
|
+
pass
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
"""One-call installer for the tdmcp bridge.
|
|
2
|
+
|
|
3
|
+
Once `td/modules` is on TouchDesigner's Python module path (Preferences ->
|
|
4
|
+
"Python 64-bit Module Path"), an artist can bring the whole bridge up with a
|
|
5
|
+
single line in the Textport:
|
|
6
|
+
|
|
7
|
+
from mcp import install; install.run()
|
|
8
|
+
|
|
9
|
+
It creates a tidy `tdmcp_bridge` base COMP containing a Web Server DAT (port
|
|
10
|
+
9980) and its callbacks, then activates it. Idempotent: re-running reconfigures
|
|
11
|
+
the existing ops. Pass `export_tox="/path/mcp_webserver_base.tox"` to also save a
|
|
12
|
+
reusable component you can drag into any project.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def _callbacks_source(modules_dir=None):
|
|
17
|
+
header = ""
|
|
18
|
+
if modules_dir:
|
|
19
|
+
header = (
|
|
20
|
+
"import sys\n"
|
|
21
|
+
"if %r not in sys.path:\n"
|
|
22
|
+
" sys.path.insert(0, %r)\n\n" % (modules_dir, modules_dir)
|
|
23
|
+
)
|
|
24
|
+
return header + (
|
|
25
|
+
"def onHTTPRequest(webServerDAT, request, response):\n"
|
|
26
|
+
" from mcp.controllers import api_controller # per-request: hot-reloads after cache clear\n"
|
|
27
|
+
" return api_controller.handle(request, response, webServerDAT)\n\n"
|
|
28
|
+
"def onWebSocketOpen(webServerDAT, client, uri): return\n"
|
|
29
|
+
"def onWebSocketReceiveText(webServerDAT, client, data): return\n"
|
|
30
|
+
"def onWebSocketReceiveBinary(webServerDAT, client, data): return\n"
|
|
31
|
+
"def onWebSocketReceivePing(webServerDAT, client, data):\n"
|
|
32
|
+
" webServerDAT.webSocketSendPong(client, data=data)\n"
|
|
33
|
+
"def onWebSocketReceivePong(webServerDAT, client, data): return\n"
|
|
34
|
+
"def onServerStart(webServerDAT): return\n"
|
|
35
|
+
"def onServerStop(webServerDAT): return\n"
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def _event_hooks_source(modules_dir=None):
|
|
40
|
+
header = ""
|
|
41
|
+
if modules_dir:
|
|
42
|
+
header = (
|
|
43
|
+
"import sys\n"
|
|
44
|
+
"if %r not in sys.path:\n"
|
|
45
|
+
" sys.path.insert(0, %r)\n\n" % (modules_dir, modules_dir)
|
|
46
|
+
)
|
|
47
|
+
return header + (
|
|
48
|
+
"def _broadcast(event, data):\n"
|
|
49
|
+
" try:\n"
|
|
50
|
+
" from mcp import events\n"
|
|
51
|
+
" events.broadcast(me.parent().op('webserver'), event, data)\n"
|
|
52
|
+
" except Exception:\n"
|
|
53
|
+
" pass\n\n"
|
|
54
|
+
"def onFrameEnd(frame):\n"
|
|
55
|
+
" try:\n"
|
|
56
|
+
" f = int(frame)\n"
|
|
57
|
+
" if f % 30 == 0:\n"
|
|
58
|
+
" _broadcast('timeline.frame', {'frame': f, 'seconds': float(absTime.seconds)})\n"
|
|
59
|
+
" if f % 120 == 0:\n"
|
|
60
|
+
" scope = me.parent().parent()\n"
|
|
61
|
+
" if scope is not None:\n"
|
|
62
|
+
" emitted = 0\n"
|
|
63
|
+
" for child in scope.findChildren(depth=3):\n"
|
|
64
|
+
" try:\n"
|
|
65
|
+
" ct = float(getattr(child, 'cookTime', 0.0) or 0.0)\n"
|
|
66
|
+
" except Exception:\n"
|
|
67
|
+
" ct = 0.0\n"
|
|
68
|
+
" if ct > 5.0:\n"
|
|
69
|
+
" _broadcast('node.cook', {'path': child.path, 'cook_time_ms': ct})\n"
|
|
70
|
+
" emitted += 1\n"
|
|
71
|
+
" if emitted >= 10:\n"
|
|
72
|
+
" break\n"
|
|
73
|
+
" except Exception:\n"
|
|
74
|
+
" pass\n\n"
|
|
75
|
+
"def onProjectPostSave():\n"
|
|
76
|
+
" try:\n"
|
|
77
|
+
" _broadcast('project.saved', {'filename': project.name})\n"
|
|
78
|
+
" except Exception:\n"
|
|
79
|
+
" pass\n\n"
|
|
80
|
+
"def onStart(): return\n"
|
|
81
|
+
"def onCreate(): return\n"
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def run(port=9980, parent_path="/project1", container="tdmcp_bridge", modules_dir=None, export_tox=None):
|
|
86
|
+
import td # TouchDesigner globals are only available via the td module here
|
|
87
|
+
|
|
88
|
+
if modules_dir:
|
|
89
|
+
import sys
|
|
90
|
+
|
|
91
|
+
if modules_dir not in sys.path:
|
|
92
|
+
sys.path.insert(0, modules_dir)
|
|
93
|
+
|
|
94
|
+
root = td.op(parent_path) or td.op("/")
|
|
95
|
+
comp = root.op(container) or root.create(td.baseCOMP, container)
|
|
96
|
+
|
|
97
|
+
callbacks = comp.op("callbacks") or comp.create(td.textDAT, "callbacks")
|
|
98
|
+
callbacks.text = _callbacks_source(modules_dir)
|
|
99
|
+
|
|
100
|
+
server = comp.op("webserver") or comp.create(td.webserverDAT, "webserver")
|
|
101
|
+
server.par.port = port
|
|
102
|
+
server.par.callbacks = callbacks
|
|
103
|
+
server.par.active = True
|
|
104
|
+
|
|
105
|
+
# Execute DAT that emits project.saved / timeline.frame events over WebSocket.
|
|
106
|
+
hooks = comp.op("events_hook") or comp.create(td.executeDAT, "events_hook")
|
|
107
|
+
hooks.text = _event_hooks_source(modules_dir)
|
|
108
|
+
hooks.par.active = True
|
|
109
|
+
hooks.par.frameend = True
|
|
110
|
+
hooks.par.projectpostsave = True
|
|
111
|
+
|
|
112
|
+
if export_tox:
|
|
113
|
+
comp.save(export_tox)
|
|
114
|
+
|
|
115
|
+
print("[tdmcp] bridge running on port %d (%s)" % (port, comp.path))
|
|
116
|
+
print(
|
|
117
|
+
"[tdmcp] SECURITY: the Web Server DAT listens on ALL network interfaces and, by "
|
|
118
|
+
"default, executes arbitrary Python (the /api/exec and node-method endpoints) with "
|
|
119
|
+
"no authentication. On a shared/untrusted network, harden it: (1) set the "
|
|
120
|
+
"TDMCP_BRIDGE_TOKEN env var (same value on the Node server) to require a bearer "
|
|
121
|
+
"token; (2) set TDMCP_BRIDGE_ALLOW_EXEC=0 to refuse the arbitrary-code endpoints; "
|
|
122
|
+
"and/or firewall port %d to localhost." % port
|
|
123
|
+
)
|
|
124
|
+
return comp
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
def export(path, modules_dir=None, port=9980, parent_path="/project1", container="tdmcp_bridge"):
|
|
128
|
+
"""Build the bridge and save it as a reusable .tox you can drag into any project.
|
|
129
|
+
|
|
130
|
+
Run this once in your own TouchDesigner, commit the resulting .tox, and from
|
|
131
|
+
then on the bridge install is just drag-and-drop. Pass `modules_dir` (the
|
|
132
|
+
absolute path to `td/modules`) to bake the import path into the .tox so it
|
|
133
|
+
keeps working in projects that don't have that folder on the Preferences
|
|
134
|
+
"Python 64-bit Module Path"; otherwise the target machine still needs it set.
|
|
135
|
+
|
|
136
|
+
from mcp import install
|
|
137
|
+
install.export("/path/to/mcp_webserver_base.tox")
|
|
138
|
+
"""
|
|
139
|
+
return run(
|
|
140
|
+
port=port,
|
|
141
|
+
parent_path=parent_path,
|
|
142
|
+
container=container,
|
|
143
|
+
modules_dir=modules_dir,
|
|
144
|
+
export_tox=path,
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
def uninstall(parent_path="/project1", container="tdmcp_bridge"):
|
|
149
|
+
import td
|
|
150
|
+
|
|
151
|
+
root = td.op(parent_path) or td.op("/")
|
|
152
|
+
comp = root.op(container)
|
|
153
|
+
if comp is not None:
|
|
154
|
+
comp.destroy()
|
|
155
|
+
print("[tdmcp] bridge removed")
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Business-logic services for the tdmcp bridge."""
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"""Recursive network analysis: errors, topology and performance."""
|
|
2
|
+
|
|
3
|
+
import td
|
|
4
|
+
|
|
5
|
+
from mcp.services import api_service
|
|
6
|
+
|
|
7
|
+
op = td.op # TD globals are not available inside imported modules; reach via td
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def errors(path):
|
|
11
|
+
return api_service.get_node_errors(path, recursive=True)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def topology(path, recursive=False):
|
|
15
|
+
root = op(path)
|
|
16
|
+
if root is None:
|
|
17
|
+
return {"nodes": [], "connections": []}
|
|
18
|
+
nodes, connections = [], []
|
|
19
|
+
if not hasattr(root, "findChildren"):
|
|
20
|
+
children = []
|
|
21
|
+
elif recursive:
|
|
22
|
+
children = root.findChildren() # all descendants
|
|
23
|
+
else:
|
|
24
|
+
children = root.findChildren(depth=1) # direct children only
|
|
25
|
+
for child in children:
|
|
26
|
+
nodes.append(
|
|
27
|
+
{"path": child.path, "type": api_service.op_type(child), "name": child.name}
|
|
28
|
+
)
|
|
29
|
+
for index, connector in enumerate(getattr(child, "inputConnectors", [])):
|
|
30
|
+
# `connector.connections` yields the source-side output Connectors; each
|
|
31
|
+
# carries its own `.index` (the source output index) and `.owner` (the op).
|
|
32
|
+
for source in getattr(connector, "connections", []):
|
|
33
|
+
owner = getattr(source, "owner", None)
|
|
34
|
+
if owner is None:
|
|
35
|
+
continue
|
|
36
|
+
connections.append(
|
|
37
|
+
{
|
|
38
|
+
"source_path": owner.path,
|
|
39
|
+
"source_output": int(getattr(source, "index", 0) or 0),
|
|
40
|
+
"target_path": child.path,
|
|
41
|
+
"target_input": index,
|
|
42
|
+
}
|
|
43
|
+
)
|
|
44
|
+
return {"nodes": nodes, "connections": connections}
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def performance(path):
|
|
48
|
+
root = op(path) # noqa: F821
|
|
49
|
+
if root is None:
|
|
50
|
+
return {"nodes": [], "total_cook_time_ms": 0.0}
|
|
51
|
+
nodes = []
|
|
52
|
+
total = 0.0
|
|
53
|
+
children = root.findChildren(depth=1) if hasattr(root, "findChildren") else []
|
|
54
|
+
for child in children:
|
|
55
|
+
cook_time = float(getattr(child, "cookTime", 0.0) or 0.0)
|
|
56
|
+
total += cook_time
|
|
57
|
+
nodes.append(
|
|
58
|
+
{
|
|
59
|
+
"path": child.path,
|
|
60
|
+
"cook_time_ms": cook_time,
|
|
61
|
+
"cook_count": int(getattr(child, "cookCount", 0) or 0),
|
|
62
|
+
}
|
|
63
|
+
)
|
|
64
|
+
return {"nodes": nodes, "total_cook_time_ms": total}
|