<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Dotnet | The .NET Blog</title><link>https://thedotnetblog.com/id/tags/dotnet/</link><description>Articles, tutorials and insights from the .NET community.</description><generator>Hugo</generator><language>id</language><managingEditor>@thedotnetblog (The .NET Blog)</managingEditor><webMaster>@thedotnetblog</webMaster><lastBuildDate>Thu, 23 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://thedotnetblog.com/id/tags/dotnet/index.xml" rel="self" type="application/rss+xml"/><item><title>Hooks azd dengan Python, TypeScript, dan .NET: Selamat Tinggal Shell Script</title><link>https://thedotnetblog.com/id/posts/emiliano-montesdeoca/azd-hooks-python-javascript-typescript-dotnet/</link><pubDate>Thu, 23 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/id/posts/emiliano-montesdeoca/azd-hooks-python-javascript-typescript-dotnet/</guid><description>Azure Developer CLI kini mendukung hooks dalam Python, JavaScript, TypeScript, dan .NET. Tidak perlu lagi beralih ke Bash hanya untuk menjalankan script migrasi.</description><content:encoded>&lt;p&gt;&lt;em&gt;Postingan ini diterjemahkan secara otomatis. Untuk versi aslinya, &lt;a href="https://thedotnetblog.com/id/posts/emiliano-montesdeoca/azd-hooks-python-javascript-typescript-dotnet/"&gt;klik di sini&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Jika pernah memiliki proyek yang sepenuhnya ditulis dalam .NET namun tetap harus menulis script Bash untuk hooks azd, rasa frustrasi itu sudah pasti familiar. Mengapa harus beralih ke sintaks shell di langkah pre-provisioning ketika seluruh proyek menggunakan C#?&lt;/p&gt;
&lt;p&gt;Masalah ini kini memiliki solusi resmi. Azure Developer CLI &lt;a href="https://devblogs.microsoft.com/azure-sdk/azd-multi-language-hooks/"&gt;baru saja meluncurkan dukungan multi-bahasa untuk hooks&lt;/a&gt;, dan hasilnya sesuai ekspektasi.&lt;/p&gt;
&lt;h2 id="apa-itu-hooks"&gt;Apa itu hooks&lt;/h2&gt;
&lt;p&gt;Hooks adalah script yang berjalan di titik-titik penting dalam siklus hidup &lt;code&gt;azd&lt;/code&gt; — sebelum provisioning, setelah deployment, dan lainnya. Didefinisikan di &lt;code&gt;azure.yaml&lt;/code&gt;, mereka memungkinkan injeksi logika kustom tanpa memodifikasi CLI.&lt;/p&gt;
&lt;p&gt;Sebelumnya hanya Bash dan PowerShell yang didukung. Kini bisa menggunakan &lt;strong&gt;Python, JavaScript, TypeScript, atau .NET&lt;/strong&gt; — dan &lt;code&gt;azd&lt;/code&gt; menangani sisanya secara otomatis.&lt;/p&gt;
&lt;h2 id="cara-kerja-deteksi-bahasa"&gt;Cara kerja deteksi bahasa&lt;/h2&gt;
&lt;p&gt;Cukup arahkan hook ke sebuah file dan &lt;code&gt;azd&lt;/code&gt; akan menyimpulkan bahasa dari ekstensinya:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;hooks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;preprovision&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;./hooks/setup.py&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;postdeploy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;./hooks/seed.ts&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;postprovision&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;./hooks/migrate.cs&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Tanpa konfigurasi tambahan. Jika ekstensinya ambigu, bisa menambahkan &lt;code&gt;kind: python&lt;/code&gt; (atau bahasa yang sesuai) secara eksplisit.&lt;/p&gt;
&lt;h2 id="detail-penting-per-bahasa"&gt;Detail penting per bahasa&lt;/h2&gt;
&lt;h3 id="python"&gt;Python&lt;/h3&gt;
&lt;p&gt;Letakkan &lt;code&gt;requirements.txt&lt;/code&gt; atau &lt;code&gt;pyproject.toml&lt;/code&gt; di samping script (atau direktori induknya). &lt;code&gt;azd&lt;/code&gt; akan otomatis membuat virtual environment, menginstal dependensi, dan menjalankan script.&lt;/p&gt;
&lt;h3 id="javascript-dan-typescript"&gt;JavaScript dan TypeScript&lt;/h3&gt;
&lt;p&gt;Pola yang sama — letakkan &lt;code&gt;package.json&lt;/code&gt; dekat script dan &lt;code&gt;azd&lt;/code&gt; akan menjalankan &lt;code&gt;npm install&lt;/code&gt; terlebih dahulu. Untuk TypeScript, menggunakan &lt;code&gt;npx tsx&lt;/code&gt; tanpa langkah kompilasi dan tanpa &lt;code&gt;tsconfig.json&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="net"&gt;.NET&lt;/h3&gt;
&lt;p&gt;Dua mode tersedia:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Mode project&lt;/strong&gt;: Jika ada &lt;code&gt;.csproj&lt;/code&gt; di samping script, &lt;code&gt;azd&lt;/code&gt; otomatis menjalankan &lt;code&gt;dotnet restore&lt;/code&gt; dan &lt;code&gt;dotnet build&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mode single-file&lt;/strong&gt;: Di .NET 10+, file &lt;code&gt;.cs&lt;/code&gt; mandiri dapat dijalankan langsung via &lt;code&gt;dotnet run script.cs&lt;/code&gt;. Tidak perlu file project.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="konfigurasi-per-executor"&gt;Konfigurasi per executor&lt;/h2&gt;
&lt;p&gt;Setiap bahasa mendukung blok &lt;code&gt;config&lt;/code&gt; opsional:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;hooks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;preprovision&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;./hooks/setup.ts&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;packageManager&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;pnpm&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;postprovision&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;./hooks/migrate.cs&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;configuration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Release&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;framework&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;net10.0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="mengapa-ini-penting-bagi-developer-net"&gt;Mengapa ini penting bagi developer .NET&lt;/h2&gt;
&lt;p&gt;Hooks adalah tempat terakhir dalam proyek berbasis azd yang memaksa pergantian bahasa. Sekarang seluruh deployment pipeline — dari kode aplikasi hingga lifecycle hooks — bisa hidup dalam satu bahasa. Utility .NET yang sudah ada bisa digunakan kembali di hooks, shared library bisa direferensikan, dan pemeliharaan shell script pun berakhir.&lt;/p&gt;
&lt;h2 id="penutup"&gt;Penutup&lt;/h2&gt;
&lt;p&gt;Salah satu perubahan yang terlihat kecil namun benar-benar mengurangi gesekan dalam workflow azd sehari-hari. Dukungan multi-bahasa untuk hooks sudah tersedia sekarang — cek &lt;a href="https://devblogs.microsoft.com/azure-sdk/azd-multi-language-hooks/"&gt;post resmi&lt;/a&gt; untuk dokumentasi lengkap.&lt;/p&gt;</content:encoded></item><item><title>Windows App Dev CLI v0.3: F5 dari Terminal dan UI Automation untuk Agen AI</title><link>https://thedotnetblog.com/id/posts/emiliano-montesdeoca/windows-app-dev-cli-v03-run-ui-automation/</link><pubDate>Thu, 23 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/id/posts/emiliano-montesdeoca/windows-app-dev-cli-v03-run-ui-automation/</guid><description>Windows App Development CLI v0.3 menghadirkan winapp run untuk peluncuran debug dari terminal, winapp ui untuk otomasi antarmuka, dan paket NuGet baru yang membuat dotnet run bekerja dengan aplikasi yang dikemas.</description><content:encoded>&lt;p&gt;&lt;em&gt;Postingan ini diterjemahkan secara otomatis. Untuk versi aslinya, &lt;a href="https://thedotnetblog.com/id/posts/emiliano-montesdeoca/windows-app-dev-cli-v03-run-ui-automation/"&gt;klik di sini&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Pengalaman F5 di Visual Studio sangat bagus. Tapi harus membuka VS hanya untuk menjalankan dan men-debug aplikasi Windows yang dikemas — baik di pipeline CI, workflow otomatis, atau saat agen AI menjalankan pengujian — terlalu berlebihan.&lt;/p&gt;
&lt;p&gt;Windows App Development CLI v0.3 baru saja &lt;a href="https://devblogs.microsoft.com/ifdef-windows/windows-app-development-cli-v0-3-new-run-and-ui-commands-plus-dotnet-run-support-for-packaged-apps/"&gt;dirilis&lt;/a&gt; dan menangani hal ini secara langsung dengan dua fitur utama: &lt;code&gt;winapp run&lt;/code&gt; dan &lt;code&gt;winapp ui&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="winapp-run-f5-dari-mana-saja"&gt;winapp run: F5 dari Mana Saja&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;winapp run&lt;/code&gt; menerima folder aplikasi yang tidak dikemas dan sebuah manifest, lalu melakukan semua yang VS lakukan saat debug launch: mendaftarkan loose package, menjalankan aplikasi, dan mempertahankan &lt;code&gt;LocalState&lt;/code&gt; antar re-deploy.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Build aplikasi, lalu jalankan sebagai aplikasi yang dikemas&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;winapp run ./bin/Debug
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Bekerja untuk WinUI, WPF, WinForms, Console, Avalonia, dan lainnya. Mode dirancang untuk developer maupun workflow otomatis:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;--detach&lt;/code&gt;&lt;/strong&gt;: Meluncurkan dan segera mengembalikan kontrol ke terminal. Sempurna untuk CI.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;--unregister-on-exit&lt;/code&gt;&lt;/strong&gt;: Membersihkan package yang terdaftar saat aplikasi ditutup.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;--debug-output&lt;/code&gt;&lt;/strong&gt;: Menangkap pesan &lt;code&gt;OutputDebugString&lt;/code&gt; dan exception secara real-time.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="paket-nuget-baru-dotnet-run-untuk-aplikasi-yang-dikemas"&gt;Paket NuGet Baru: dotnet run untuk Aplikasi yang Dikemas&lt;/h2&gt;
&lt;p&gt;Untuk developer .NET ada paket NuGet baru: &lt;code&gt;Microsoft.Windows.SDK.BuildTools.WinApp&lt;/code&gt;. Setelah diinstal, &lt;code&gt;dotnet run&lt;/code&gt; menangani seluruh inner loop: build, menyiapkan loose-layout package, mendaftar di Windows, dan meluncurkan — semuanya dalam satu langkah.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;winapp init
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# atau&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dotnet add package Microsoft.Windows.SDK.BuildTools.WinApp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="winapp-ui-ui-automation-dari-command-line"&gt;winapp ui: UI Automation dari Command Line&lt;/h2&gt;
&lt;p&gt;Inilah fitur yang membuka skenario agentik. &lt;code&gt;winapp ui&lt;/code&gt; memberikan akses UI Automation penuh ke aplikasi Windows mana pun yang sedang berjalan — WPF, WinForms, Win32, Electron, WinUI3 — langsung dari terminal.&lt;/p&gt;
&lt;p&gt;Yang bisa dilakukan:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Menampilkan semua jendela tingkat teratas&lt;/li&gt;
&lt;li&gt;Menelusuri pohon UI Automation lengkap dari sebuah jendela&lt;/li&gt;
&lt;li&gt;Mencari elemen berdasarkan nama, tipe, atau ID otomasi&lt;/li&gt;
&lt;li&gt;Klik, invoke, dan set nilai&lt;/li&gt;
&lt;li&gt;Mengambil screenshot&lt;/li&gt;
&lt;li&gt;Menunggu elemen muncul — ideal untuk sinkronisasi pengujian&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Menggabungkan &lt;code&gt;winapp ui&lt;/code&gt; dengan &lt;code&gt;winapp run&lt;/code&gt; menghasilkan workflow build → jalankan → verifikasi yang lengkap dari terminal. Agen dapat menjalankan aplikasi, memeriksa status UI, berinteraksi secara programatik, dan memvalidasi hasilnya.&lt;/p&gt;
&lt;h2 id="fitur-lainnya"&gt;Fitur Lainnya&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;winapp unregister&lt;/code&gt;&lt;/strong&gt;: Menghapus package yang sideloaded setelah selesai.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;winapp manifest add-alias&lt;/code&gt;&lt;/strong&gt;: Menambahkan alias untuk menjalankan aplikasi berdasarkan nama dari terminal.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tab completion&lt;/strong&gt;: Satu perintah untuk mengatur tab completion PowerShell.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="cara-mendapatkannya"&gt;Cara Mendapatkannya&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;winget install Microsoft.WinAppCli
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# atau&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install -g @microsoft/winappcli
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;CLI dalam public preview. Lihat &lt;a href="https://github.com/microsoft/WinAppCli"&gt;repositori GitHub&lt;/a&gt; untuk dokumentasi lengkap dan &lt;a href="https://devblogs.microsoft.com/ifdef-windows/windows-app-development-cli-v0-3-new-run-and-ui-commands-plus-dotnet-run-support-for-packaged-apps/"&gt;pengumuman asli&lt;/a&gt; untuk semua detailnya.&lt;/p&gt;</content:encoded></item><item><title>Berhenti Mengawasi Terminal: Mode Terpisah Aspire Mengubah Alur Kerja</title><link>https://thedotnetblog.com/id/posts/emiliano-montesdeoca/aspire-detached-mode-free-your-terminal/</link><pubDate>Fri, 17 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/id/posts/emiliano-montesdeoca/aspire-detached-mode-free-your-terminal/</guid><description>Aspire 13.2 memungkinkan Anda menjalankan AppHost di background dan mengambil kembali terminal Anda. Dikombinasikan dengan perintah CLI baru dan dukungan agen, ini lebih besar dari yang terlihat.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Postingan ini diterjemahkan secara otomatis. Untuk versi aslinya, &lt;a href="https://thedotnetblog.com/id/posts/emiliano-montesdeoca/aspire-detached-mode-free-your-terminal/"&gt;klik di sini&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Setiap kali Anda menjalankan Aspire AppHost, terminal Anda hilang. Terkunci. Terpakai hingga Ctrl+C. Perlu menjalankan perintah cepat? Buka tab baru. Ingin memeriksa log? Tab lain. Gesekan kecil ini menumpuk dengan cepat.&lt;/p&gt;
&lt;p&gt;Aspire 13.2 memperbaiki ini. James Newton-King &lt;a href="https://devblogs.microsoft.com/aspire/aspire-detached-mode-and-process-management/"&gt;menulis semua detailnya&lt;/a&gt;, dan jujur, ini adalah salah satu fitur yang segera mengubah cara Anda bekerja.&lt;/p&gt;
&lt;h2 id="mode-terpisah-satu-perintah-terminal-kembali"&gt;Mode terpisah: satu perintah, terminal kembali&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire start
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ini singkatan dari &lt;code&gt;aspire run --detach&lt;/code&gt;. AppHost Anda boot di background dan Anda mendapatkan terminal kembali segera.&lt;/p&gt;
&lt;h2 id="mengelola-yang-sedang-berjalan"&gt;Mengelola yang sedang berjalan&lt;/h2&gt;
&lt;p&gt;Berjalan di background hanya berguna jika Anda bisa mengelola apa yang berjalan. Aspire 13.2 menyertakan set lengkap perintah CLI:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Daftar semua AppHost yang berjalan&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire ps
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Periksa state AppHost tertentu&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire describe
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Stream log dari AppHost yang berjalan&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire logs
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Hentikan AppHost tertentu&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire stop
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="gabungkan-dengan-mode-terisolasi"&gt;Gabungkan dengan mode terisolasi&lt;/h2&gt;
&lt;p&gt;Mode terpisah secara alami berpasangan dengan mode terisolasi:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire start --isolated
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire start --isolated
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Setiap instance mendapat port acak, rahasia terpisah, dan siklus hidupnya sendiri.&lt;/p&gt;
&lt;h2 id="mengapa-ini-besar-untuk-agen-coding"&gt;Mengapa ini besar untuk agen coding&lt;/h2&gt;
&lt;p&gt;Agen coding yang bekerja di terminal Anda sekarang dapat:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Memulai aplikasi dengan &lt;code&gt;aspire start&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Mengkueri statusnya dengan &lt;code&gt;aspire describe&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Memeriksa log dengan &lt;code&gt;aspire logs&lt;/code&gt; untuk mendiagnosis masalah&lt;/li&gt;
&lt;li&gt;Menghentikannya dengan &lt;code&gt;aspire stop&lt;/code&gt; saat selesai&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Menjalankan &lt;code&gt;aspire agent init&lt;/code&gt; menyiapkan file skill Aspire yang mengajarkan agen perintah-perintah ini.&lt;/p&gt;
&lt;h2 id="kesimpulan"&gt;Kesimpulan&lt;/h2&gt;
&lt;p&gt;Mode terpisah adalah peningkatan alur kerja yang menyamar sebagai flag sederhana. Baca &lt;a href="https://devblogs.microsoft.com/aspire/aspire-detached-mode-and-process-management/"&gt;postingan lengkap&lt;/a&gt; dan dapatkan Aspire 13.2 dengan &lt;code&gt;aspire update --self&lt;/code&gt;.&lt;/p&gt;</content:encoded></item><item><title>Pin Clustering Akhirnya Hadir di .NET MAUI Maps — Satu Properti, Nol Rasa Sakit</title><link>https://thedotnetblog.com/id/posts/emiliano-montesdeoca/maui-maps-pin-clustering-finally/</link><pubDate>Thu, 16 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/id/posts/emiliano-montesdeoca/maui-maps-pin-clustering-finally/</guid><description>.NET MAUI 11 Preview 3 menambahkan pengelompokan pin native ke kontrol Map. Satu properti, grup clustering terpisah, dan penanganan ketukan — semuanya bawaan.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Postingan ini diterjemahkan secara otomatis. Untuk versi aslinya, &lt;a href="https://thedotnetblog.com/id/posts/emiliano-montesdeoca/maui-maps-pin-clustering-finally/"&gt;klik di sini&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Anda tahu momen ketika memuat peta dengan seratus pin dan semuanya menjadi gumpalan yang tidak terbaca? Itulah pengalaman .NET MAUI Maps — sampai sekarang.&lt;/p&gt;
&lt;p&gt;David Ortinau &lt;a href="https://devblogs.microsoft.com/dotnet/pin-clustering-in-dotnet-maui-maps/"&gt;baru saja mengumumkan&lt;/a&gt; bahwa .NET MAUI 11 Preview 3 hadir dengan pin clustering bawaan di Android dan iOS/Mac Catalyst.&lt;/p&gt;
&lt;h2 id="satu-properti-untuk-menguasai-semuanya"&gt;Satu properti untuk menguasai semuanya&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;maps:Map&lt;/span&gt; &lt;span class="na"&gt;IsClusteringEnabled=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;True&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Itu saja. Pin yang berdekatan dikelompokkan ke dalam cluster dengan lencana hitungan.&lt;/p&gt;
&lt;h2 id="grup-clustering-independen"&gt;Grup clustering independen&lt;/h2&gt;
&lt;p&gt;Properti &lt;code&gt;ClusteringIdentifier&lt;/code&gt; memungkinkan Anda memisahkan pin ke dalam grup independen:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Pins&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Pin&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Label&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Pike Place Coffee&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Location&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Location&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;47.6097&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="m"&gt;122.3331&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ClusteringIdentifier&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;coffee&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="menangani-ketukan-cluster"&gt;Menangani ketukan cluster&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ClusterClicked&lt;/span&gt; &lt;span class="p"&gt;+=&lt;/span&gt; &lt;span class="kd"&gt;async&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;names&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;\n&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Pins&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Select&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Label&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;DisplayAlert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$&amp;#34;Cluster ({e.Pins.Count} pins)&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;OK&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="mulai"&gt;Mulai&lt;/h2&gt;
&lt;p&gt;Instal &lt;a href="https://dotnet.microsoft.com/download/dotnet/11.0"&gt;.NET 11 Preview 3&lt;/a&gt; dan perbarui workload .NET MAUI.&lt;/p&gt;</content:encoded></item><item><title>.NET April 2026 Servicing — Patch Keamanan yang Harus Anda Terapkan Hari Ini</title><link>https://thedotnetblog.com/id/posts/emiliano-montesdeoca/dotnet-april-2026-servicing-security-patches/</link><pubDate>Wed, 15 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/id/posts/emiliano-montesdeoca/dotnet-april-2026-servicing-security-patches/</guid><description>Rilis servicing April 2026 menambal 6 CVE di .NET 10, .NET 9, .NET 8, dan .NET Framework — termasuk dua kerentanan eksekusi kode jarak jauh.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Postingan ini diterjemahkan secara otomatis. Untuk versi aslinya, &lt;a href="https://thedotnetblog.com/id/posts/emiliano-montesdeoca/dotnet-april-2026-servicing-security-patches/"&gt;klik di sini&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://devblogs.microsoft.com/dotnet/dotnet-and-dotnet-framework-april-2026-servicing-updates/"&gt;Pembaruan servicing April 2026&lt;/a&gt; untuk .NET dan .NET Framework sudah tersedia, dan versi ini mencakup perbaikan keamanan yang ingin Anda terapkan segera. Enam CVE ditambal, termasuk dua kerentanan eksekusi kode jarak jauh (RCE).&lt;/p&gt;
&lt;h2 id="yang-ditambal"&gt;Yang ditambal&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;CVE&lt;/th&gt;
&lt;th&gt;Tipe&lt;/th&gt;
&lt;th&gt;Mempengaruhi&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CVE-2026-26171&lt;/td&gt;
&lt;td&gt;Bypass Fitur Keamanan&lt;/td&gt;
&lt;td&gt;.NET 10, 9, 8 + .NET Framework&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVE-2026-32178&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Eksekusi Kode Jarak Jauh&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;.NET 10, 9, 8 + .NET Framework&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVE-2026-33116&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Eksekusi Kode Jarak Jauh&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;.NET 10, 9, 8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVE-2026-32203&lt;/td&gt;
&lt;td&gt;Penolakan Layanan&lt;/td&gt;
&lt;td&gt;.NET 10, 9, 8 + .NET Framework&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVE-2026-23666&lt;/td&gt;
&lt;td&gt;Penolakan Layanan&lt;/td&gt;
&lt;td&gt;.NET Framework 3.0–4.8.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVE-2026-32226&lt;/td&gt;
&lt;td&gt;Penolakan Layanan&lt;/td&gt;
&lt;td&gt;.NET Framework 2.0–4.8.1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="versi-yang-diperbarui"&gt;Versi yang diperbarui&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;.NET 10&lt;/strong&gt;: 10.0.6&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;.NET 9&lt;/strong&gt;: 9.0.15&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;.NET 8&lt;/strong&gt;: 8.0.26&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="yang-harus-dilakukan"&gt;Yang harus dilakukan&lt;/h2&gt;
&lt;p&gt;Perbarui proyek dan pipeline CI/CD Anda ke versi patch terbaru. Dua kerentanan RCE bukan sesuatu yang Anda tunda.&lt;/p&gt;</content:encoded></item><item><title>Azure MCP Server 2.0 Baru Dirilis — Otomasi Cloud Agentic Self-Hosted Sudah Ada</title><link>https://thedotnetblog.com/id/posts/emiliano-montesdeoca/azure-mcp-server-2-self-hosted-agentic-cloud/</link><pubDate>Sat, 11 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/id/posts/emiliano-montesdeoca/azure-mcp-server-2-self-hosted-agentic-cloud/</guid><description>Azure MCP Server 2.0 mencapai stabilitas dengan deployment remote self-hosted, 276 alat di 57 layanan Azure, dan keamanan tingkat enterprise.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Postingan ini diterjemahkan secara otomatis. Untuk versi aslinya, &lt;a href="https://thedotnetblog.com/id/posts/emiliano-montesdeoca/azure-mcp-server-2-self-hosted-agentic-cloud/"&gt;klik di sini&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Jika Anda baru-baru ini membangun sesuatu dengan MCP dan Azure, Anda mungkin sudah tahu bahwa pengalaman lokal bekerja dengan baik. Tapi ketika Anda perlu berbagi pengaturan itu ke seluruh tim? Di situlah hal-hal menjadi rumit.&lt;/p&gt;
&lt;p&gt;Tidak lagi. Azure MCP Server &lt;a href="https://devblogs.microsoft.com/azure-sdk/announcing-azure-mcp-server-2-0-stable-release/"&gt;baru saja mencapai 2.0 stabil&lt;/a&gt;, dan fitur utamanya adalah persis yang telah diminta tim enterprise: &lt;strong&gt;dukungan server MCP remote self-hosted&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="apa-itu-azure-mcp-server"&gt;Apa itu Azure MCP Server?&lt;/h2&gt;
&lt;p&gt;Azure MCP Server mengimplementasikan spesifikasi &lt;a href="https://modelcontextprotocol.io/docs/getting-started/intro"&gt;Model Context Protocol&lt;/a&gt; dan mengekspos kemampuan Azure sebagai alat terstruktur dan dapat ditemukan. Angkanya berbicara sendiri: &lt;strong&gt;276 alat MCP di 57 layanan Azure&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="hal-besar-deployment-remote-self-hosted"&gt;Hal besar: deployment remote self-hosted&lt;/h2&gt;
&lt;p&gt;Dalam skenario tim nyata, Anda membutuhkan:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Akses bersama untuk developer dan sistem agen internal&lt;/li&gt;
&lt;li&gt;Konfigurasi terpusat&lt;/li&gt;
&lt;li&gt;Batas jaringan dan kebijakan enterprise&lt;/li&gt;
&lt;li&gt;Integrasi ke pipeline CI/CD&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Azure MCP Server 2.0 mengatasi semua ini. Untuk autentikasi, ada dua opsi:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Managed Identity&lt;/strong&gt; — saat berjalan bersama &lt;a href="https://aka.ms/azmcp/self-host/foundry"&gt;Microsoft Foundry&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Alur On-Behalf-Of (OBO)&lt;/strong&gt; — delegasi OpenID Connect dengan izin pengguna yang sebenarnya&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="pengerasan-keamanan"&gt;Pengerasan keamanan&lt;/h2&gt;
&lt;p&gt;Rilis 2.0 menambahkan validasi endpoint yang lebih kuat, perlindungan terhadap pola injection, dan kontrol isolasi yang lebih ketat.&lt;/p&gt;
&lt;h2 id="memulai"&gt;Memulai&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://aka.ms/azmcp"&gt;GitHub Repo&lt;/a&gt;&lt;/strong&gt; — kode sumber, dokumentasi&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://aka.ms/azmcp/download/docker"&gt;Docker Image&lt;/a&gt;&lt;/strong&gt; — deployment dalam container&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://aka.ms/azmcp/download/vscode"&gt;Ekstensi VS Code&lt;/a&gt;&lt;/strong&gt; — integrasi IDE&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://aka.ms/azmcp/self-host"&gt;Panduan self-hosting&lt;/a&gt;&lt;/strong&gt; — fitur unggulan 2.0&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title>.NET Aspire 13.2 Ingin Menjadi Sahabat Terbaik Agen AI Anda</title><link>https://thedotnetblog.com/id/posts/emiliano-montesdeoca/aspire-agentic-development-build-run-observe/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/id/posts/emiliano-montesdeoca/aspire-agentic-development-build-run-observe/</guid><description>Aspire 13.2 all-in pada pengembangan agentik — output CLI terstruktur, eksekusi terisolasi, lingkungan yang menyembuhkan sendiri, dan data OpenTelemetry penuh agar agen AI Anda benar-benar dapat membangun, menjalankan, dan mengamati aplikasi Anda.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Postingan ini diterjemahkan secara otomatis. Untuk versi aslinya, &lt;a href="https://thedotnetblog.com/id/posts/emiliano-montesdeoca/aspire-agentic-development-build-run-observe/"&gt;klik di sini&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Anda tahu momen ketika agen coding AI Anda menulis kode yang solid, Anda bersemangat, kemudian semuanya berantakan saat mencoba &lt;em&gt;menjalankannya&lt;/em&gt;? Konflik port, phantom process, variabel lingkungan yang salah — tiba-tiba agen Anda membakar token untuk men-debug masalah startup alih-alih membangun fitur.&lt;/p&gt;
&lt;p&gt;Tim Aspire baru saja merilis &lt;a href="https://devblogs.microsoft.com/aspire/agentic-dev-aspirations/"&gt;post yang sangat bijaksana&lt;/a&gt; tentang masalah ini, dan jawaban mereka menarik: Aspire 13.2 dirancang tidak hanya untuk manusia, tetapi untuk agen AI.&lt;/p&gt;
&lt;h2 id="aspire-sebagai-infrastruktur-agen"&gt;Aspire sebagai infrastruktur agen&lt;/h2&gt;
&lt;p&gt;Inilah yang dibawa Aspire 13.2 ke meja pengembangan agentik:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Seluruh stack dalam kode bertipe.&lt;/strong&gt; AppHost mendefinisikan topologi lengkap — dalam TypeScript atau C# yang dapat dikompilasi:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createBuilder&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="kr"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;./.modules/aspire.js&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;builder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;createBuilder&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;postgres&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addPostgres&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;pg&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;addDatabase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;catalog&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cache&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addRedis&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;cache&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;api&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;builder&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addNodeApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;api&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;./api&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;src/index.ts&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;withHttpEndpoint&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;PORT&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;withReference&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;postgres&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;withReference&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cache&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;builder&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addViteApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;frontend&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;./frontend&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;withReference&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;waitFor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;build&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Satu perintah untuk semuanya.&lt;/strong&gt; Alih-alih menyulap &lt;code&gt;docker compose up&lt;/code&gt;, &lt;code&gt;npm run dev&lt;/code&gt;, dan skrip startup database — semuanya hanya &lt;code&gt;aspire start&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mode terisolasi untuk agen paralel.&lt;/strong&gt; Dengan &lt;code&gt;--isolated&lt;/code&gt;, setiap jalankan Aspire mendapat port acak sendiri dan rahasia pengguna terpisah.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mata agen melalui telemetri.&lt;/strong&gt; Aspire CLI mengekspos data OpenTelemetry penuh selama development — trace, metrik, log terstruktur.&lt;/p&gt;
&lt;h2 id="analogi-bowling-bumper"&gt;Analogi bowling bumper&lt;/h2&gt;
&lt;p&gt;Tim Aspire menggunakan analogi yang bagus: pikirkan Aspire sebagai bumper jalur bowling untuk agen AI. Jika agennya tidak sempurna (dan memang tidak akan), bumper mencegahnya melempar ke selokan.&lt;/p&gt;
&lt;h2 id="kesimpulan"&gt;Kesimpulan&lt;/h2&gt;
&lt;p&gt;Aspire 13.2 bukan hanya framework aplikasi terdistribusi — ini menjadi infrastruktur agen yang esensial. Baca &lt;a href="https://devblogs.microsoft.com/aspire/agentic-dev-aspirations/"&gt;post lengkap&lt;/a&gt; dari tim Aspire.&lt;/p&gt;</content:encoded></item><item><title>Aplikasi MCP Mendapatkan Fluent API — Buat UI Alat AI Kaya di .NET dalam Tiga Langkah</title><link>https://thedotnetblog.com/id/posts/emiliano-montesdeoca/mcp-fluent-api-azure-functions-dotnet/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/id/posts/emiliano-montesdeoca/mcp-fluent-api-azure-functions-dotnet/</guid><description>API konfigurasi fluent baru untuk Aplikasi MCP di Azure Functions memungkinkan Anda mengubah alat MCP .NET mana pun menjadi aplikasi lengkap dengan tampilan, izin, dan kebijakan CSP.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Postingan ini diterjemahkan secara otomatis. Untuk versi aslinya, &lt;a href="https://thedotnetblog.com/id/posts/emiliano-montesdeoca/mcp-fluent-api-azure-functions-dotnet/"&gt;klik di sini&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Alat MCP sangat bagus untuk memberikan kemampuan kepada agen AI. Tapi bagaimana jika alat Anda perlu menampilkan sesuatu kepada pengguna?&lt;/p&gt;
&lt;p&gt;Lilian Kasem dari tim Azure SDK &lt;a href="https://devblogs.microsoft.com/azure-sdk/mcp-as-easy-as-1-2-3-introducing-the-fluent-api-for-mcp-apps/"&gt;memperkenalkan API konfigurasi fluent baru&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="fluent-api-dalam-tiga-langkah"&gt;Fluent API dalam tiga langkah&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Langkah 1: Definisikan fungsi Anda:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;[Function(nameof(HelloApp))]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;HelloApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt; [McpToolTrigger(&amp;#34;HelloApp&amp;#34;, &amp;#34;A simple MCP App that says hello.&amp;#34;)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ToolInvocationContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Hello from app&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Langkah 2: Promosikan ke Aplikasi MCP:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ConfigureMcpTool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;HelloApp&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AsMcpApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithView&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;assets/hello-app.html&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithTitle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Hello App&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithPermissions&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;McpAppPermissions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ClipboardWrite&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;McpAppPermissions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ClipboardRead&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithCsp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;csp&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;csp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AllowBaseUri&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;https://www.microsoft.com&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ConnectTo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;https://www.microsoft.com&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Langkah 3: Tambahkan tampilan HTML Anda.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Tambahkan paket:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dotnet add package Microsoft.Azure.Functions.Worker.Extensions.Mcp --version 1.5.0-preview.1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Baca &lt;a href="https://devblogs.microsoft.com/azure-sdk/mcp-as-easy-as-1-2-3-introducing-the-fluent-api-for-mcp-apps/"&gt;posting lengkap&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Hubungkan Server MCP Anda di Azure Functions ke Agen Foundry — Begini Caranya</title><link>https://thedotnetblog.com/id/posts/emiliano-montesdeoca/foundry-agents-mcp-servers-azure-functions/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/id/posts/emiliano-montesdeoca/foundry-agents-mcp-servers-azure-functions/</guid><description>Bangun server MCP Anda sekali, deploy ke Azure Functions, dan hubungkan ke agen Microsoft Foundry dengan autentikasi yang tepat.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Postingan ini diterjemahkan secara otomatis. Untuk versi aslinya, &lt;a href="https://thedotnetblog.com/id/posts/emiliano-montesdeoca/foundry-agents-mcp-servers-azure-functions/"&gt;klik di sini&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Ada satu hal yang saya sukai tentang ekosistem MCP: Anda membangun server sekali dan bekerja di mana saja.&lt;/p&gt;
&lt;p&gt;Lily Ma dari tim Azure SDK &lt;a href="https://devblogs.microsoft.com/azure-sdk/give-your-foundry-agent-custom-tools-with-mcp-servers-on-azure-functions/"&gt;menerbitkan panduan praktis&lt;/a&gt; tentang menghubungkan server MCP yang di-deploy ke Azure Functions dengan agen Microsoft Foundry.&lt;/p&gt;
&lt;h2 id="mengapa-kombinasi-ini-masuk-akal"&gt;Mengapa kombinasi ini masuk akal&lt;/h2&gt;
&lt;p&gt;Azure Functions memberi Anda infrastruktur yang dapat diskalakan, autentikasi bawaan, dan penagihan tanpa server. Microsoft Foundry memberi Anda agen AI yang dapat bernalar dan bertindak. Menghubungkan keduanya berarti alat kustom Anda menjadi kemampuan agen AI perusahaan.&lt;/p&gt;
&lt;h2 id="opsi-autentikasi"&gt;Opsi autentikasi&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metode&lt;/th&gt;
&lt;th&gt;Kasus Penggunaan&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Berbasis kunci&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Pengembangan atau server tanpa Entra auth&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Microsoft Entra&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Produksi dengan managed identity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OAuth identity passthrough&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Produksi dengan konteks pengguna&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tanpa autentikasi&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dev/pengujian atau data publik saja&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="pengaturan"&gt;Pengaturan&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Deploy server MCP ke Azure Functions&lt;/strong&gt; — sampel tersedia untuk &lt;a href="https://github.com/Azure-Samples/remote-mcp-functions-dotnet"&gt;.NET&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Aktifkan autentikasi MCP bawaan&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dapatkan URL endpoint&lt;/strong&gt; — &lt;code&gt;https://&amp;lt;FUNCTION_APP_NAME&amp;gt;.azurewebsites.net/runtime/webhooks/mcp&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tambahkan server MCP sebagai alat di Foundry&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Baca &lt;a href="https://devblogs.microsoft.com/azure-sdk/give-your-foundry-agent-custom-tools-with-mcp-servers-on-azure-functions/"&gt;panduan lengkap&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Mode Terisolasi Aspire Memperbaiki Mimpi Buruk Konflik Port dalam Pengembangan Paralel</title><link>https://thedotnetblog.com/id/posts/emiliano-montesdeoca/aspire-isolated-mode-parallel-instances/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/id/posts/emiliano-montesdeoca/aspire-isolated-mode-parallel-instances/</guid><description>Aspire 13.2 memperkenalkan mode --isolated: port acak, rahasia terpisah, dan nol tabrakan saat menjalankan beberapa instans AppHost yang sama. Sempurna untuk agen AI, worktree, dan alur kerja paralel.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Postingan ini diterjemahkan secara otomatis. Untuk versi aslinya, &lt;a href="https://thedotnetblog.com/id/posts/emiliano-montesdeoca/aspire-isolated-mode-parallel-instances/"&gt;klik di sini&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Jika Anda pernah mencoba menjalankan dua instans proyek yang sama secara bersamaan, Anda tahu rasa sakitnya. Port 8080 sudah digunakan.&lt;/p&gt;
&lt;p&gt;Aspire 13.2 memperbaiki ini dengan satu flag. James Newton-King &lt;a href="https://devblogs.microsoft.com/aspire/aspire-isolated-mode-parallel-development/"&gt;menulis semua detailnya&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="perbaikan---isolated"&gt;Perbaikan: &lt;code&gt;--isolated&lt;/code&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire run --isolated
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Setiap run mendapat:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Port acak&lt;/strong&gt; — tidak ada tabrakan antar instans&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;User secrets terisolasi&lt;/strong&gt; — connection string dan API key tetap terpisah per instans&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="skenario-nyata"&gt;Skenario nyata&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Beberapa checkout:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Terminal 1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/projects/my-app-feature
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire run --isolated
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Terminal 2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/projects/my-app-bugfix
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire run --isolated
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Keduanya berjalan tanpa konflik.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Agen latar belakang di VS Code.&lt;/strong&gt; Ketika agen latar belakang Copilot Chat membuat git worktree untuk bekerja secara independen, mode terisolasi memastikan kedua instans berfungsi.&lt;/p&gt;
&lt;h2 id="kesimpulan"&gt;Kesimpulan&lt;/h2&gt;
&lt;p&gt;Mode terisolasi adalah fitur kecil yang memecahkan masalah nyata yang semakin umum. Dapatkan 13.2 dengan &lt;code&gt;aspire update --self&lt;/code&gt;.&lt;/p&gt;</content:encoded></item><item><title>Penilaian Modernisasi GitHub Copilot Adalah Alat Migrasi Terbaik yang Belum Anda Gunakan</title><link>https://thedotnetblog.com/id/posts/emiliano-montesdeoca/dotnet-modernization-assessment-github-copilot/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/id/posts/emiliano-montesdeoca/dotnet-modernization-assessment-github-copilot/</guid><description>Ekstensi modernisasi GitHub Copilot tidak hanya menyarankan perubahan kode — melainkan menghasilkan penilaian migrasi lengkap dengan masalah yang dapat ditindaklanjuti, perbandingan target Azure, dan alur kerja kolaboratif.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Postingan ini diterjemahkan secara otomatis. Untuk versi aslinya, &lt;a href="https://thedotnetblog.com/id/posts/emiliano-montesdeoca/dotnet-modernization-assessment-github-copilot/"&gt;klik di sini&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Memigrasikan aplikasi .NET Framework lama ke .NET modern adalah salah satu tugas yang semua orang tahu harus dilakukan tapi tidak ada yang ingin memulainya.&lt;/p&gt;
&lt;p&gt;Jeffrey Fritz baru saja menerbitkan &lt;a href="https://devblogs.microsoft.com/dotnet/your-migrations-source-of-truth-the-modernization-assessment/"&gt;analisis mendalam tentang penilaian modernisasi GitHub Copilot&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="ini-bukan-sekadar-mesin-saran-kode"&gt;Ini bukan sekadar mesin saran kode&lt;/h2&gt;
&lt;p&gt;Ekstensi VS Code mengikuti model &lt;strong&gt;Nilai → Rencanakan → Eksekusi&lt;/strong&gt;. Fase penilaian menganalisis seluruh basis kode dan menghasilkan dokumen terstruktur yang menangkap semuanya.&lt;/p&gt;
&lt;p&gt;Penilaian disimpan di bawah &lt;code&gt;.github/modernize/assessment/&lt;/code&gt;. Setiap run menghasilkan laporan independen.&lt;/p&gt;
&lt;h2 id="dua-cara-untuk-memulai"&gt;Dua cara untuk memulai&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Penilaian yang Direkomendasikan&lt;/strong&gt; — jalur cepat. Pilih dari domain yang dikurasi (Peningkatan Java/.NET, Kesiapan Cloud, Keamanan).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Penilaian Kustom&lt;/strong&gt; — jalur terarah. Konfigurasikan apa yang akan dianalisis: komputasi target (App Service, AKS, Container Apps), OS target, analisis kontainerisasi.&lt;/p&gt;
&lt;h2 id="rincian-masalah-dapat-ditindaklanjuti"&gt;Rincian masalah dapat ditindaklanjuti&lt;/h2&gt;
&lt;p&gt;Setiap masalah dilengkapi level kritis:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Wajib&lt;/strong&gt; — harus diperbaiki atau migrasi akan gagal&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Potensial&lt;/strong&gt; — mungkin berdampak pada migrasi, memerlukan penilaian manusia&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Opsional&lt;/strong&gt; — perbaikan yang direkomendasikan, tidak akan memblokir migrasi&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="pendapat-saya"&gt;Pendapat saya&lt;/h2&gt;
&lt;p&gt;Jika Anda memiliki aplikasi .NET Framework lama, ini adalah alat &lt;em&gt;terbaik&lt;/em&gt; untuk memulai. Dokumen penilaian saja sudah sepadan dengan waktunya.&lt;/p&gt;
&lt;p&gt;Baca &lt;a href="https://devblogs.microsoft.com/dotnet/your-migrations-source-of-truth-the-modernization-assessment/"&gt;panduan lengkap&lt;/a&gt; dan unduh &lt;a href="https://aka.ms/ghcp-appmod/vscode-ext"&gt;ekstensi VS Code&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>C# 15 Mendapatkan Tipe Union — Dan Itu Persis Yang Kita Minta</title><link>https://thedotnetblog.com/id/posts/emiliano-montesdeoca/csharp-15-union-types-exhaustive-matching/</link><pubDate>Sun, 05 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/id/posts/emiliano-montesdeoca/csharp-15-union-types-exhaustive-matching/</guid><description>C# 15 memperkenalkan kata kunci `union` — union diskriminasi yang dipaksakan kompiler dengan pencocokan pola yang lengkap. Seperti apa tampilannya, mengapa penting, dan cara mencobanya hari ini.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Postingan ini diterjemahkan secara otomatis. Untuk versi aslinya, &lt;a href="https://thedotnetblog.com/id/posts/emiliano-montesdeoca/csharp-15-union-types-exhaustive-matching/"&gt;klik di sini&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Inilah yang saya tunggu-tunggu. C# 15 memperkenalkan kata kunci &lt;code&gt;union&lt;/code&gt; — union diskriminasi yang tepat dengan pencocokan pola lengkap yang dipaksakan kompiler.&lt;/p&gt;
&lt;p&gt;Bill Wagner &lt;a href="https://devblogs.microsoft.com/dotnet/csharp-15-union-types/"&gt;menerbitkan analisis mendalam&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="masalah-yang-diselesaikan-union"&gt;Masalah yang diselesaikan union&lt;/h2&gt;
&lt;p&gt;Sebelum C# 15, mengembalikan &amp;ldquo;salah satu dari beberapa tipe yang mungkin&amp;rdquo; dari metode selalu merupakan kompromi. Anda tidak pernah mendapatkan apa yang sebenarnya Anda inginkan: kumpulan tipe tertutup di mana kompiler menjamin Anda telah menangani setiap kasus.&lt;/p&gt;
&lt;h2 id="sintaksnya-sederhana-dengan-indah"&gt;Sintaksnya sederhana dengan indah&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="k"&gt;record&lt;/span&gt; &lt;span class="nc"&gt;class&lt;/span&gt; &lt;span class="n"&gt;Cat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="k"&gt;record&lt;/span&gt; &lt;span class="nc"&gt;class&lt;/span&gt; &lt;span class="n"&gt;Dog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="k"&gt;record&lt;/span&gt; &lt;span class="nc"&gt;class&lt;/span&gt; &lt;span class="n"&gt;Bird&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="n"&gt;union&lt;/span&gt; &lt;span class="n"&gt;Pet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Cat&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Dog&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Bird&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Dan inilah keajaibannya — kompiler memaksakan pencocokan lengkap:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pet&lt;/span&gt; &lt;span class="k"&gt;switch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Dog&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Cat&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Bird&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Tidak perlu &lt;code&gt;_&lt;/code&gt;. Jika Anda nanti menambahkan tipe keempat ke union, setiap ekspresi switch yang tidak menanganinya menghasilkan peringatan.&lt;/p&gt;
&lt;h2 id="di-mana-ini-menjadi-praktis"&gt;Di mana ini menjadi praktis&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="n"&gt;union&lt;/span&gt; &lt;span class="n"&gt;ApiResult&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ApiError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ValidationFailure&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Sekarang setiap konsumen dipaksa untuk menangani sukses, error, dan kegagalan validasi.&lt;/p&gt;
&lt;h2 id="coba-hari-ini"&gt;Coba hari ini&lt;/h2&gt;
&lt;p&gt;Tipe union tersedia di .NET 11 Preview 2. Lihat &lt;a href="https://learn.microsoft.com/dotnet/csharp/language-reference/builtin-types/union"&gt;referensi bahasa lengkap&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Aspire 13.2 Memiliki CLI Dokumentasi — dan Agen AI Anda Bisa Menggunakannya Juga</title><link>https://thedotnetblog.com/id/posts/emiliano-montesdeoca/aspire-docs-cli-ai-skills/</link><pubDate>Sat, 04 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/id/posts/emiliano-montesdeoca/aspire-docs-cli-ai-skills/</guid><description>.NET Aspire 13.2 menambahkan aspire docs — CLI untuk mencari, menelusuri, dan membaca dokumentasi resmi tanpa meninggalkan terminal. Juga berfungsi sebagai alat untuk agen AI.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Postingan ini diterjemahkan secara otomatis. Untuk versi aslinya, &lt;a href="https://thedotnetblog.com/id/posts/emiliano-montesdeoca/aspire-docs-cli-ai-skills/"&gt;klik di sini&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Anda tahu momen ketika Anda sedang dalam Aspire AppHost, menghubungkan integrasi, dan perlu memeriksa parameter apa yang diharapkan integrasi Redis? Anda alt-tab ke browser, berburu di aspire.dev. Konteks hilang.&lt;/p&gt;
&lt;p&gt;Aspire 13.2 baru saja &lt;a href="https://devblogs.microsoft.com/aspire/aspire-docs-in-your-terminal/"&gt;mengirimkan perbaikan untuk itu&lt;/a&gt;. CLI &lt;code&gt;aspire docs&lt;/code&gt; memungkinkan Anda mencari, menelusuri, dan membaca dokumentasi Aspire resmi langsung dari terminal.&lt;/p&gt;
&lt;h2 id="tiga-perintah-nol-tab-browser"&gt;Tiga perintah, nol tab browser&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Daftar semua dokumen&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire docs list
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Cari topik&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire docs search &lt;span class="s2"&gt;&amp;#34;redis&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Baca halaman penuh&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire docs get redis-integration
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Hanya satu bagian&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire docs get redis-integration --section &lt;span class="s2"&gt;&amp;#34;Add Redis resource&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="sudut-agen-ai"&gt;Sudut agen AI&lt;/h2&gt;
&lt;p&gt;Perintah &lt;code&gt;aspire docs&lt;/code&gt; yang sama berfungsi sebagai alat untuk agen AI. Alih-alih mengarang API Aspire berdasarkan data pelatihan lama, agen bisa memanggil &lt;code&gt;aspire docs search &amp;quot;postgres&amp;quot;&lt;/code&gt;, menemukan dokumen integrasi resmi, dan membaca halaman yang tepat.&lt;/p&gt;
&lt;h2 id="kesimpulan"&gt;Kesimpulan&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;aspire docs&lt;/code&gt; adalah fitur kecil yang memecahkan masalah nyata dengan bersih. Lihat &lt;a href="https://davidpine.dev/posts/aspire-docs-mcp-tools/"&gt;deep dive David Pine&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Microsoft Agent Framework Mencapai Versi 1.0 — Inilah yang Benar-Benar Penting bagi Developer .NET</title><link>https://thedotnetblog.com/id/posts/emiliano-montesdeoca/agent-framework-1-0-production-ready/</link><pubDate>Fri, 03 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/id/posts/emiliano-montesdeoca/agent-framework-1-0-production-ready/</guid><description>Microsoft Agent Framework 1.0 siap produksi dengan API stabil, orkestrasi multi-agen, dan konektor untuk setiap penyedia AI utama. Inilah yang perlu Anda ketahui sebagai developer .NET.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Postingan ini diterjemahkan secara otomatis. Untuk versi aslinya, &lt;a href="https://thedotnetblog.com/id/posts/emiliano-montesdeoca/agent-framework-1-0-production-ready/"&gt;klik di sini&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Jika Anda telah mengikuti perjalanan Agent Framework dari hari-hari awal Semantic Kernel dan AutoGen, ini adalah momen yang berarti. Microsoft Agent Framework baru saja &lt;a href="https://devblogs.microsoft.com/agent-framework/microsoft-agent-framework-version-1-0/"&gt;mencapai versi 1.0&lt;/a&gt; — siap produksi, API stabil, komitmen dukungan jangka panjang. Tersedia untuk .NET dan Python, dan benar-benar siap untuk beban kerja nyata.&lt;/p&gt;
&lt;p&gt;Mari kita potong kebisingan pengumuman dan fokus pada apa yang penting jika Anda membangun aplikasi bertenaga AI dengan .NET.&lt;/p&gt;
&lt;h2 id="versi-singkat"&gt;Versi singkat&lt;/h2&gt;
&lt;p&gt;Agent Framework 1.0 menyatukan apa yang dulu Semantic Kernel dan AutoGen menjadi satu SDK open-source. Satu abstraksi agen. Satu mesin orkestrasi. Beberapa penyedia AI. Jika Anda bolak-balik antara Semantic Kernel untuk pola enterprise dan AutoGen untuk alur kerja multi-agen tingkat penelitian, Anda bisa berhenti. Inilah satu SDK-nya sekarang.&lt;/p&gt;
&lt;h2 id="memulai-hampir-terlalu-mudah"&gt;Memulai hampir terlalu mudah&lt;/h2&gt;
&lt;p&gt;Berikut agen yang berfungsi di .NET:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// dotnet add package Microsoft.Agents.AI.OpenAI --prerelease&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Microsoft.Agents.AI&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Microsoft.Agents.AI.Foundry&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Azure.Identity&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;AIProjectClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;endpoint&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;https://your-project.services.ai.azure.com&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetResponsesClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;gpt-5.3&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AsAIAgent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;HaikuBot&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;instructions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;You are an upbeat assistant that writes beautifully.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RunAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Write a haiku about shipping 1.0.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Hanya itu. Beberapa baris dan Anda memiliki agen AI yang berjalan di Azure Foundry. Padanannya dalam Python sama singkatnya. Tambahkan function tools, percakapan multi-turn, dan streaming seiring kemajuan Anda — permukaan API berkembang tanpa menjadi aneh.&lt;/p&gt;
&lt;h2 id="orkestrasi-multi-agen--inilah-yang-nyata"&gt;Orkestrasi multi-agen — inilah yang nyata&lt;/h2&gt;
&lt;p&gt;Agen tunggal cocok untuk demo, tapi skenario produksi biasanya membutuhkan koordinasi. Agent Framework 1.0 hadir dengan pola orkestrasi yang telah teruji langsung dari Microsoft Research dan AutoGen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Sequential&lt;/strong&gt; — agen memproses secara berurutan (penulis → reviewer → editor)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Concurrent&lt;/strong&gt; — fan out ke beberapa agen secara paralel, konvergensi hasil&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Handoff&lt;/strong&gt; — satu agen mendelegasikan ke agen lain berdasarkan intent&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Group chat&lt;/strong&gt; — beberapa agen berdiskusi dan berkonvergensi pada solusi&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Magentic-One&lt;/strong&gt; — pola multi-agen tingkat penelitian dari MSR&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Semuanya mendukung streaming, checkpointing, persetujuan human-in-the-loop, dan pause/resume. Bagian checkpointing sangat penting — alur kerja yang berjalan lama bertahan dari restart proses.&lt;/p&gt;
&lt;h2 id="fitur-yang-paling-penting"&gt;Fitur yang paling penting&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Hook Middleware.&lt;/strong&gt; Tahu pipeline middleware di ASP.NET Core? Konsep yang sama, tapi untuk eksekusi agen. Cegat setiap tahap — tambahkan keamanan konten, logging, kebijakan kepatuhan — tanpa menyentuh prompt agen.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Memori yang dapat dicolokkan.&lt;/strong&gt; Riwayat percakapan, status key-value persisten, pengambilan berbasis vektor. Pilih backend Anda: Foundry Agent Service, Mem0, Redis, Neo4j, atau buat sendiri.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Agen YAML deklaratif.&lt;/strong&gt; Definisikan instruksi, alat, memori, dan topologi orkestrasi agen Anda dalam file YAML yang dikontrol versi. Muat dan jalankan dengan satu panggilan API.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dukungan A2A dan MCP.&lt;/strong&gt; MCP (Model Context Protocol) memungkinkan agen menemukan dan memanggil alat eksternal secara dinamis. A2A (Agent-to-Agent protocol) memungkinkan kolaborasi lintas runtime.&lt;/p&gt;
&lt;h2 id="fitur-preview-yang-layak-ditonton"&gt;Fitur preview yang layak ditonton&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DevUI&lt;/strong&gt; — debugger lokal berbasis browser untuk memvisualisasikan eksekusi agen, aliran pesan, dan panggilan alat secara real-time.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitHub Copilot SDK dan Claude Code SDK&lt;/strong&gt; — gunakan Copilot atau Claude sebagai harness agen langsung dari kode orkestrasi Anda.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Agent Harness&lt;/strong&gt; — runtime lokal yang dapat dikustomisasi yang memberi agen akses ke shell, sistem file, dan loop pesan.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Skills&lt;/strong&gt; — paket kemampuan domain yang dapat digunakan kembali.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="migrasi-dari-semantic-kernel-atau-autogen"&gt;Migrasi dari Semantic Kernel atau AutoGen&lt;/h2&gt;
&lt;p&gt;Jika Anda memiliki kode Semantic Kernel atau AutoGen yang ada, tersedia asisten migrasi khusus yang menganalisis kode Anda dan menghasilkan rencana migrasi langkah demi langkah.&lt;/p&gt;
&lt;h2 id="kesimpulan"&gt;Kesimpulan&lt;/h2&gt;
&lt;p&gt;Agent Framework 1.0 adalah tonggak produksi yang telah ditunggu oleh tim enterprise. API stabil, dukungan multi-penyedia, dan pola orkestrasi yang benar-benar bekerja pada skala besar.&lt;/p&gt;
&lt;p&gt;Framework ini &lt;a href="https://github.com/microsoft/agent-framework"&gt;sepenuhnya open source di GitHub&lt;/a&gt;. Jika Anda menunggu sinyal &amp;ldquo;aman digunakan di produksi&amp;rdquo; — inilah saatnya.&lt;/p&gt;</content:encoded></item><item><title>azd Kini Memungkinkan Anda Menjalankan dan Men-debug Agen AI Secara Lokal — Apa yang Berubah di Maret 2026</title><link>https://thedotnetblog.com/id/posts/emiliano-montesdeoca/azd-march-2026-local-ai-agent-debugging/</link><pubDate>Thu, 02 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/id/posts/emiliano-montesdeoca/azd-march-2026-local-ai-agent-debugging/</guid><description>Azure Developer CLI merilis tujuh rilis di Maret 2026. Highlight: loop jalankan-dan-debug lokal untuk agen AI, integrasi GitHub Copilot dalam pengaturan proyek, dan dukungan Container App Jobs.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Postingan ini diterjemahkan secara otomatis. Untuk versi aslinya, &lt;a href="https://thedotnetblog.com/id/posts/emiliano-montesdeoca/azd-march-2026-local-ai-agent-debugging/"&gt;klik di sini&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Tujuh rilis dalam satu bulan. Itulah yang didorong oleh tim Azure Developer CLI (&lt;code&gt;azd&lt;/code&gt;) di Maret 2026, dan fitur unggulan adalah yang sudah saya tunggu: &lt;strong&gt;loop jalankan-dan-debug lokal untuk agen AI&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="jalankan-dan-debug-agen-ai-tanpa-deploy"&gt;Jalankan dan debug agen AI tanpa deploy&lt;/h2&gt;
&lt;p&gt;Ini yang besar. Ekstensi &lt;code&gt;azure.ai.agents&lt;/code&gt; baru menambahkan serangkaian perintah:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;azd ai agent run&lt;/code&gt; — memulai agen Anda secara lokal&lt;/li&gt;
&lt;li&gt;&lt;code&gt;azd ai agent invoke&lt;/code&gt; — mengirim pesan ke agen (lokal atau ter-deploy)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;azd ai agent show&lt;/code&gt; — menampilkan status dan kesehatan container&lt;/li&gt;
&lt;li&gt;&lt;code&gt;azd ai agent monitor&lt;/code&gt; — streaming log container secara real time&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sebelumnya, menguji agen AI berarti deploy ke Microsoft Foundry setiap kali ada perubahan. Sekarang Anda bisa beriterasi secara lokal.&lt;/p&gt;
&lt;h2 id="github-copilot-men-scaffold-proyek-azd-anda"&gt;GitHub Copilot men-scaffold proyek azd Anda&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;azd init&lt;/code&gt; kini menawarkan opsi &amp;ldquo;Set up with GitHub Copilot (Preview)&amp;rdquo;. Agen Copilot men-scaffold konfigurasi untuk struktur proyek Anda.&lt;/p&gt;
&lt;h2 id="container-app-jobs-dan-peningkatan-deployment"&gt;Container App Jobs dan peningkatan deployment&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Container App Jobs&lt;/strong&gt;: &lt;code&gt;azd&lt;/code&gt; kini men-deploy &lt;code&gt;Microsoft.App/jobs&lt;/code&gt; melalui konfigurasi &lt;code&gt;host: containerapp&lt;/code&gt; yang ada&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Timeout deployment yang dapat dikonfigurasi&lt;/strong&gt;: Flag &lt;code&gt;--timeout&lt;/code&gt; baru pada &lt;code&gt;azd deploy&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fallback build lokal&lt;/strong&gt;: Ketika remote ACR build gagal, &lt;code&gt;azd&lt;/code&gt; otomatis beralih ke Docker/Podman lokal&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Validasi preflight lokal&lt;/strong&gt;: Parameter Bicep divalidasi secara lokal sebelum deploy&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="kesimpulan"&gt;Kesimpulan&lt;/h2&gt;
&lt;p&gt;Loop debugging agen AI lokal adalah bintang rilis ini. Cek &lt;a href="https://devblogs.microsoft.com/azure-sdk/azure-developer-cli-azd-march-2026/"&gt;catatan rilis lengkap&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Dashboard Aspire 13.2 Kini Memiliki Telemetry API — dan Ini Mengubah Segalanya</title><link>https://thedotnetblog.com/id/posts/emiliano-montesdeoca/aspire-132-dashboard-export-telemetry/</link><pubDate>Thu, 02 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/id/posts/emiliano-montesdeoca/aspire-132-dashboard-export-telemetry/</guid><description>.NET Aspire 13.2 hadir dengan ekspor telemetri yang lebih cerdas, API yang dapat diprogram untuk trace dan log, dan peningkatan visualisasi GenAI. Inilah mengapa ini penting untuk alur kerja debugging Anda.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Postingan ini diterjemahkan secara otomatis. Untuk versi aslinya, &lt;a href="https://thedotnetblog.com/id/posts/emiliano-montesdeoca/aspire-132-dashboard-export-telemetry/"&gt;klik di sini&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Jika Anda membangun aplikasi terdistribusi dengan .NET Aspire, Anda sudah tahu bahwa dashboard adalah bagian terbaik dari seluruh pengalaman. Aspire 13.2 membuatnya jauh lebih baik.&lt;/p&gt;
&lt;h2 id="mengekspor-telemetri-dengan-cara-yang-masuk-akal"&gt;Mengekspor telemetri dengan cara yang masuk akal&lt;/h2&gt;
&lt;p&gt;Aspire 13.2 menambahkan dialog &lt;strong&gt;Kelola log dan telemetri&lt;/strong&gt; yang tepat di mana Anda dapat:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Menghapus semua telemetri&lt;/li&gt;
&lt;li&gt;Mengekspor telemetri yang dipilih ke file ZIP dalam format OTLP/JSON standar&lt;/li&gt;
&lt;li&gt;Mengimpor ulang ZIP tersebut ke dashboard Aspire mana pun nanti&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bagian terakhir adalah fitur unggulan. Reproduksi bug, ekspor telemetri, lampirkan ke item kerja, dan rekan tim Anda dapat mengimpornya ke dashboard mereka sendiri.&lt;/p&gt;
&lt;h2 id="telemetry-api-adalah-pengubah-permainan-sesungguhnya"&gt;Telemetry API adalah pengubah permainan sesungguhnya&lt;/h2&gt;
&lt;p&gt;Dashboard kini mengekspos HTTP API di bawah &lt;code&gt;/api/telemetry&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;GET /api/telemetry/resources&lt;/code&gt; — daftar sumber daya dengan telemetri&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET /api/telemetry/spans&lt;/code&gt; — kueri span dengan filter&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET /api/telemetry/logs&lt;/code&gt; — kueri log dengan filter&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET /api/telemetry/traces&lt;/code&gt; — daftar trace&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ini mendukung perintah CLI &lt;code&gt;aspire agent mcp&lt;/code&gt; dan &lt;code&gt;aspire otel&lt;/code&gt; yang baru.&lt;/p&gt;
&lt;h2 id="telemetri-genai-menjadi-praktis"&gt;Telemetri GenAI menjadi praktis&lt;/h2&gt;
&lt;p&gt;VS Code Copilot chat dan Copilot CLI mendukung konfigurasi &lt;code&gt;OTEL_EXPORTER_OTLP_ENDPOINT&lt;/code&gt; — arahkan ke dashboard Aspire dan Anda bisa melihat agen AI Anda berpikir secara real-time melalui telemetri.&lt;/p&gt;
&lt;h2 id="kesimpulan"&gt;Kesimpulan&lt;/h2&gt;
&lt;p&gt;Aspire 13.2 mengubah dashboard dari &amp;ldquo;UI debugging yang bagus&amp;rdquo; menjadi &amp;ldquo;platform observabilitas yang dapat diprogram&amp;rdquo;. Kunjungi &lt;a href="https://aspire.dev"&gt;aspire.dev&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Pembaruan Maret Visual Studio Memungkinkan Kamu Membangun Agen Copilot Kustom — dan Alat find_symbol Adalah Hal Besar</title><link>https://thedotnetblog.com/id/posts/emiliano-montesdeoca/visual-studio-march-2026-custom-copilot-agents/</link><pubDate>Thu, 02 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/id/posts/emiliano-montesdeoca/visual-studio-march-2026-custom-copilot-agents/</guid><description>Pembaruan Maret 2026 Visual Studio menghadirkan agen Copilot kustom, skill agen yang dapat digunakan ulang, alat find_symbol yang sadar bahasa, dan profiling bertenaga Copilot dari Test Explorer. Inilah yang penting.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Postingan ini diterjemahkan secara otomatis. Untuk versi aslinya, &lt;a href="https://thedotnetblog.com/id/posts/emiliano-montesdeoca/visual-studio-march-2026-custom-copilot-agents/"&gt;klik di sini&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Visual Studio baru saja mendapatkan pembaruan Copilot paling signifikan hingga saat ini. Mark Downie &lt;a href="https://devblogs.microsoft.com/visualstudio/visual-studio-march-update-build-your-own-custom-agents/"&gt;mengumumkan rilis Maret&lt;/a&gt;, dan judul utamanya adalah agen kustom — tapi jujur saja, alat &lt;code&gt;find_symbol&lt;/code&gt; yang tersembunyi lebih jauh mungkin adalah fitur yang paling mengubah alur kerjamu.&lt;/p&gt;
&lt;p&gt;Mari saya uraikan apa yang sebenarnya ada di sini.&lt;/p&gt;
&lt;h2 id="agen-copilot-kustom-di-repo-kamu"&gt;Agen Copilot kustom di repo kamu&lt;/h2&gt;
&lt;p&gt;Ingin Copilot mengikuti standar pengkodean timmu, menjalankan pipeline build, atau mengquery dokumen internal? Sekarang kamu bisa membangun persis itu.&lt;/p&gt;
&lt;p&gt;Agen kustom didefinisikan sebagai file &lt;code&gt;.agent.md&lt;/code&gt; yang kamu letakkan di &lt;code&gt;.github/agents/&lt;/code&gt; di repositorimu. Setiap agen mendapatkan akses penuh ke kesadaran workspace, pemahaman kode, alat, model pilihanmu, dan koneksi MCP ke layanan eksternal.&lt;/p&gt;
&lt;p&gt;Ini adalah pola yang sama yang sudah didukung VS Code — dan sangat menyenangkan melihat Visual Studio menyusul.&lt;/p&gt;
&lt;h2 id="skill-agen-paket-instruksi-yang-dapat-digunakan-ulang"&gt;Skill agen: paket instruksi yang dapat digunakan ulang&lt;/h2&gt;
&lt;p&gt;Skill secara otomatis diambil dari &lt;code&gt;.github/skills/&lt;/code&gt; di repositorimu atau &lt;code&gt;~/.copilot/skills/&lt;/code&gt; di profilmu.&lt;/p&gt;
&lt;h2 id="find_symbol-navigasi-sadar-bahasa-untuk-agen"&gt;find_symbol: navigasi sadar bahasa untuk agen&lt;/h2&gt;
&lt;p&gt;Di sinilah hal-hal menjadi sangat menarik. Alat &lt;code&gt;find_symbol&lt;/code&gt; baru memberikan mode agen Copilot navigasi simbol yang benar-benar didukung oleh layanan bahasa. Alih-alih mencari kode sebagai teks, agen dapat:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Menemukan semua referensi ke simbol di seluruh proyekmu&lt;/li&gt;
&lt;li&gt;Mengakses informasi tipe, deklarasi, dan metadata cakupan&lt;/li&gt;
&lt;li&gt;Menavigasi situs panggilan dengan kesadaran bahasa penuh&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Artinya dalam praktik: ketika kamu meminta Copilot untuk refaktor metode atau memperbarui tanda tangan parameter di seluruh situs panggilan, ia benar-benar dapat melihat struktur kodemu.&lt;/p&gt;
&lt;h2 id="profil-tes-dengan-copilot"&gt;Profil tes dengan Copilot&lt;/h2&gt;
&lt;p&gt;Sekarang ada perintah &lt;strong&gt;Profile with Copilot&lt;/strong&gt; di menu konteks Test Explorer. Pilih tes, klik profil, dan Profiling Agent secara otomatis menjalankannya dan menganalisis performa.&lt;/p&gt;
&lt;h2 id="kesimpulan"&gt;Kesimpulan&lt;/h2&gt;
&lt;p&gt;Agen kustom dan skill adalah judul utama, tapi &lt;code&gt;find_symbol&lt;/code&gt; adalah pahlawan diam-diam — ini secara fundamental mengubah seberapa akurat Copilot bisa dalam merefaktor kode .NET. Unduh &lt;a href="https://visualstudio.microsoft.com/downloads/"&gt;Visual Studio 2026 Insiders&lt;/a&gt; untuk mencoba semuanya.&lt;/p&gt;</content:encoded></item><item><title>KubeCon Europe 2026: Yang Sebenarnya Perlu Diperhatikan Pengembang .NET</title><link>https://thedotnetblog.com/id/posts/emiliano-montesdeoca/kubecon-2026-aks-updates-dotnet-developers/</link><pubDate>Sun, 29 Mar 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/id/posts/emiliano-montesdeoca/kubecon-2026-aks-updates-dotnet-developers/</guid><description>Microsoft menjatuhkan tembok pengumuman Kubernetes di KubeCon Europe 2026. Inilah versi tersaringnya — hanya pembaruan AKS dan cloud-native yang penting jika Anda mengekspedisi aplikasi .NET.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Postingan ini diterjemahkan secara otomatis. Untuk versi aslinya, &lt;a href="https://thedotnetblog.com/id/posts/emiliano-montesdeoca/kubecon-2026-aks-updates-dotnet-developers/"&gt;klik di sini&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Microsoft baru saja menerbitkan &lt;a href="https://opensource.microsoft.com/blog/2026/03/24/whats-new-with-microsoft-in-open-source-and-kubernetes-at-kubecon-cloudnativecon-europe-2026/"&gt;rekap lengkap KubeCon Europe 2026 mereka&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="mtls-tanpa-pajak-service-mesh"&gt;mTLS tanpa pajak service mesh&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://aka.ms/aks/application-network"&gt;Azure Kubernetes Application Network&lt;/a&gt; memberi Anda mutual TLS, otorisasi berbasis aplikasi, dan telemetri traffic — tanpa menerapkan mesh sidecar berat. API ASP.NET Core yang berkomunikasi dengan background worker — semua terenkripsi di tingkat jaringan, tanpa perubahan kode aplikasi.&lt;/p&gt;
&lt;h2 id="observabilitas-gpu"&gt;Observabilitas GPU&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://aka.ms/aks/managed-gpu-metrics"&gt;AKS kini menampilkan metrik GPU secara native&lt;/a&gt; ke Prometheus dan Grafana terkelola. Tanpa exporter kustom.&lt;/p&gt;
&lt;h2 id="jaringan-lintas-kluster"&gt;Jaringan lintas kluster&lt;/h2&gt;
&lt;p&gt;Azure Kubernetes Fleet Manager kini mengirimkan &lt;a href="https://aka.ms/kubernetes-fleet/networking/cross-cluster"&gt;jaringan lintas kluster&lt;/a&gt; — konektivitas terpadu, registri layanan global.&lt;/p&gt;
&lt;h2 id="upgrade-yang-lebih-aman"&gt;Upgrade yang lebih aman&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Upgrade agent pool biru-hijau&lt;/strong&gt; membuat node pool paralel. &lt;strong&gt;Rollback agent pool&lt;/strong&gt; memungkinkan Anda kembali ke versi sebelumnya.&lt;/p&gt;
&lt;h2 id="dari-mana-memulai"&gt;Dari mana memulai&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Observabilitas dulu&lt;/strong&gt; — aktifkan metrik GPU dan log aliran jaringan&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Coba upgrade biru-hijau&lt;/strong&gt; — uji alur kerja rollback&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pilot jaringan berbasis identitas&lt;/strong&gt; — aktifkan mTLS untuk satu jalur layanan&lt;/li&gt;
&lt;/ol&gt;</content:encoded></item><item><title>Foundry Agent Service Sudah GA: Yang Benar-benar Penting untuk Pengembang Agen .NET</title><link>https://thedotnetblog.com/id/posts/emiliano-montesdeoca/foundry-agent-service-ga-what-matters/</link><pubDate>Thu, 26 Mar 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/id/posts/emiliano-montesdeoca/foundry-agent-service-ga-what-matters/</guid><description>Foundry Agent Service Microsoft baru saja mencapai GA dengan jaringan privat, Voice Live, evaluasi produksi, dan runtime multi-model terbuka.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Postingan ini diterjemahkan secara otomatis. Untuk versi aslinya, &lt;a href="https://thedotnetblog.com/id/posts/emiliano-montesdeoca/foundry-agent-service-ga-what-matters/"&gt;klik di sini&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Mari jujur — membangun prototipe agen AI adalah bagian yang mudah. Bagian sulitnya adalah semua yang datang setelah itu.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://devblogs.microsoft.com/foundry/foundry-agent-service-ga/"&gt;Foundry Agent Service baru saja GA&lt;/a&gt;, dan rilis ini sangat fokus pada kesenjangan &amp;ldquo;semua yang datang setelah itu&amp;rdquo;.&lt;/p&gt;
&lt;h2 id="dibangun-di-atas-responses-api"&gt;Dibangun di atas Responses API&lt;/h2&gt;
&lt;p&gt;Foundry Agent Service generasi berikutnya dibangun di atas OpenAI Responses API. Arsitekturnya sengaja terbuka — Anda tidak terkunci pada satu penyedia model.&lt;/p&gt;
&lt;h2 id="jaringan-privat-hambatan-enterprise-dihilangkan"&gt;Jaringan privat: hambatan enterprise dihilangkan&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tanpa egress publik&lt;/strong&gt; — traffic agen tidak pernah menyentuh internet publik&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Injeksi container/subnet&lt;/strong&gt; ke jaringan Anda&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Konektivitas alat disertakan&lt;/strong&gt; — server MCP, Azure AI Search melalui jalur privat&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="autentikasi-mcp"&gt;Autentikasi MCP&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metode auth&lt;/th&gt;
&lt;th&gt;Kapan digunakan&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Berbasis kunci&lt;/td&gt;
&lt;td&gt;Akses bersama sederhana&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Identitas Agen Entra&lt;/td&gt;
&lt;td&gt;Service-to-service&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Identitas Terkelola Entra&lt;/td&gt;
&lt;td&gt;Isolasi per-proyek&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Passthrough identitas OAuth&lt;/td&gt;
&lt;td&gt;Akses yang didelegasikan pengguna&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="voice-live"&gt;Voice Live&lt;/h2&gt;
&lt;p&gt;Voice Live menggabungkan STT, LLM, dan TTS menjadi satu API terkelola.&lt;/p&gt;
&lt;h2 id="evaluasi"&gt;Evaluasi&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Evaluator siap pakai&lt;/strong&gt; — koherensi, relevansi, keterpancaran&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Evaluator kustom&lt;/strong&gt; — logika bisnis Anda sendiri&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Evaluasi berkelanjutan&lt;/strong&gt; — pengambilan sampel traffic produksi langsung&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Lihat &lt;a href="https://learn.microsoft.com/azure/foundry/quickstarts/get-started-code"&gt;panduan quickstart&lt;/a&gt; dan &lt;a href="https://devblogs.microsoft.com/foundry/foundry-agent-service-ga/"&gt;pengumuman GA&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Respons Latar Belakang di Microsoft Agent Framework: Tidak Ada Lagi Kecemasan Timeout</title><link>https://thedotnetblog.com/id/posts/emiliano-montesdeoca/background-responses-agent-framework-long-running-tasks/</link><pubDate>Thu, 26 Mar 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/id/posts/emiliano-montesdeoca/background-responses-agent-framework-long-running-tasks/</guid><description>Microsoft Agent Framework kini memungkinkan Anda membongkar tugas AI yang berjalan lama dengan token kelanjutan. Begini cara respons latar belakang bekerja dan mengapa itu penting untuk agen .NET Anda.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Postingan ini diterjemahkan secara otomatis. Untuk versi aslinya, &lt;a href="https://thedotnetblog.com/id/posts/emiliano-montesdeoca/background-responses-agent-framework-long-running-tasks/"&gt;klik di sini&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Jika Anda pernah membangun sesuatu dengan model penalaran seperti o3 atau GPT-5.2, Anda tahu rasa sakitnya. Agen Anda mulai memproses tugas yang kompleks, klien menunggu, dan di suatu titik koneksi habis waktu.&lt;/p&gt;
&lt;p&gt;Microsoft Agent Framework baru saja merilis &lt;a href="https://devblogs.microsoft.com/agent-framework/handling-long-running-operations-with-background-responses/"&gt;respons latar belakang&lt;/a&gt; — dan sejujurnya, ini adalah salah satu fitur yang seharusnya ada sejak hari pertama.&lt;/p&gt;
&lt;h2 id="cara-token-kelanjutan-bekerja"&gt;Cara token kelanjutan bekerja&lt;/h2&gt;
&lt;p&gt;Alih-alih memblokir, Anda memulai tugas agen dan mendapatkan kembali &lt;strong&gt;token kelanjutan&lt;/strong&gt;. Anggap seperti klaim tiket di bengkel reparasi:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Kirim permintaan Anda dengan &lt;code&gt;AllowBackgroundResponses = true&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Jika agen mendukung pemrosesan latar belakang, Anda mendapat token kelanjutan&lt;/li&gt;
&lt;li&gt;Poll sesuai jadwal Anda hingga token kembali &lt;code&gt;null&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;AgentRunOptions&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;AllowBackgroundResponses&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;AgentSession&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CreateSessionAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;AgentResponse&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RunAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;&amp;#34;Write a detailed market analysis for the Q4 product launch.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ContinuationToken&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="n"&gt;not&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TimeSpan&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FromSeconds&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ContinuationToken&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ContinuationToken&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RunAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="kapan-sebenarnya-menggunakan-ini"&gt;Kapan sebenarnya menggunakan ini&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tugas penalaran kompleks&lt;/strong&gt; — analisis multi-langkah, penelitian mendalam&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pembuatan konten panjang&lt;/strong&gt; — laporan terperinci, dokumen multi-bagian&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Jaringan tidak dapat diandalkan&lt;/strong&gt; — klien mobile, deployment edge&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pola UX asinkron&lt;/strong&gt; — kirim tugas, lakukan hal lain, kembali untuk hasil&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Lihat &lt;a href="https://devblogs.microsoft.com/agent-framework/handling-long-running-operations-with-background-responses/"&gt;dokumentasi lengkap&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>VS Code 1.112: Apa yang Benar-benar Perlu Diperhatikan Developer .NET</title><link>https://thedotnetblog.com/id/posts/emiliano-montesdeoca/vscode-1-112-dotnet-developers/</link><pubDate>Thu, 26 Mar 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/id/posts/emiliano-montesdeoca/vscode-1-112-dotnet-developers/</guid><description>VS Code 1.112 baru saja rilis dan penuh dengan peningkatan agen, debugger browser terintegrasi, sandboxing MCP, dan dukungan monorepo. Inilah yang sebenarnya penting jika kamu membangun dengan .NET.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Postingan ini diterjemahkan secara otomatis. Untuk versi aslinya, &lt;a href="https://thedotnetblog.com/id/posts/emiliano-montesdeoca/vscode-1-112-dotnet-developers/"&gt;klik di sini&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;VS Code 1.112 baru saja mendarat, dan jujur saja? Yang satu ini terasa berbeda jika kamu menghabiskan hari-harimu di dunia .NET. Ada banyak hal di &lt;a href="https://code.visualstudio.com/updates/v1_112"&gt;catatan rilis resmi&lt;/a&gt;, tapi biarkan aku menghemat scrolling dan fokus pada apa yang sebenarnya penting bagi kita.&lt;/p&gt;
&lt;h2 id="copilot-cli-menjadi-jauh-lebih-berguna"&gt;Copilot CLI menjadi jauh lebih berguna&lt;/h2&gt;
&lt;p&gt;Tema besar rilis ini adalah &lt;strong&gt;otonomi agen&lt;/strong&gt; — memberi Copilot lebih banyak ruang untuk bekerja tanpa kamu mengawasi setiap langkah.&lt;/p&gt;
&lt;h3 id="steering-pesan-dan-antrian"&gt;Steering pesan dan antrian&lt;/h3&gt;
&lt;p&gt;Kamu tahu momen saat Copilot CLI sedang di tengah-tengah tugas dan kamu menyadari lupa menyebutkan sesuatu? Sebelumnya, kamu harus menunggu. Sekarang kamu bisa mengirim pesan saat permintaan masih berjalan — baik untuk mengarahkan respons saat ini atau mengantri instruksi tindak lanjut.&lt;/p&gt;
&lt;h3 id="tingkat-izin"&gt;Tingkat izin&lt;/h3&gt;
&lt;p&gt;Ini yang paling bikin saya antusias. Sesi Copilot CLI sekarang mendukung tiga tingkat izin:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Default Permissions&lt;/strong&gt; — alur biasa di mana alat meminta konfirmasi sebelum berjalan&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bypass Approvals&lt;/strong&gt; — menyetujui segalanya secara otomatis dan mencoba ulang saat kesalahan&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Autopilot&lt;/strong&gt; — berjalan sepenuhnya otonom: menyetujui alat, menjawab pertanyaannya sendiri, dan terus berjalan sampai tugas selesai&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Kamu bisa mengaktifkan Autopilot dengan pengaturan &lt;code&gt;chat.autopilot.enabled&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="debug-aplikasi-web-tanpa-meninggalkan-vs-code"&gt;Debug aplikasi web tanpa meninggalkan VS Code&lt;/h2&gt;
&lt;p&gt;Browser terintegrasi sekarang mendukung &lt;strong&gt;debugging penuh&lt;/strong&gt;. Kamu bisa menetapkan breakpoint, melangkah melalui kode, dan memeriksa variabel — semua di dalam VS Code.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;editor-browser&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;request&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;launch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Debug Blazor App&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;url&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://localhost:5001&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Untuk developer Blazor, ini adalah perubahan besar.&lt;/p&gt;
&lt;h2 id="sandboxing-server-mcp"&gt;Sandboxing server MCP&lt;/h2&gt;
&lt;p&gt;Jika kamu menggunakan server MCP, sekarang kamu bisa mem-sandbox-nya:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;servers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;my-azure-tools&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;node&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;args&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;./mcp-server.js&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;sandboxEnabled&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="penemuan-kustomisasi-monorepo"&gt;Penemuan kustomisasi monorepo&lt;/h2&gt;
&lt;p&gt;Jika kamu bekerja di monorepo, dengan pengaturan &lt;code&gt;chat.useCustomizationsInParentRepositories&lt;/code&gt;, VS Code berjalan naik ke root &lt;code&gt;.git&lt;/code&gt; dan menemukan segalanya.&lt;/p&gt;
&lt;h2 id="troubleshoot-untuk-debugging-agen"&gt;/troubleshoot untuk debugging agen&lt;/h2&gt;
&lt;p&gt;Pernah menyiapkan instruksi atau skill kustom dan bertanya-tanya mengapa tidak terpilih? Aktifkan skill &lt;code&gt;/troubleshoot&lt;/code&gt; baru dengan:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;github.copilot.chat.agentDebugLog.enabled&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;github.copilot.chat.agentDebugLog.fileLogging.enabled&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="kesimpulan"&gt;Kesimpulan&lt;/h2&gt;
&lt;p&gt;VS Code 1.112 jelas mendorong keras pengalaman agen — lebih banyak otonomi, debugging yang lebih baik, keamanan yang lebih ketat. &lt;a href="https://code.visualstudio.com/updates/v1_112"&gt;Unduh VS Code 1.112&lt;/a&gt; atau perbarui dari dalam VS Code melalui &lt;strong&gt;Help &amp;gt; Check for Updates&lt;/strong&gt;.&lt;/p&gt;</content:encoded></item></channel></rss>