diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 000000000..2e8d539bd --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,9 @@ +{ + "chat.tools.terminal.autoApprove": { + "nvm": true, + "/^source ~/\\.nvm/nvm\\.sh && nvm use v22\\.21\\.1 && npm run build$/": { + "approve": true, + "matchCommandLine": true + } + } +} \ No newline at end of file diff --git a/site/.gitignore b/site/.gitignore new file mode 100644 index 000000000..16d54bb13 --- /dev/null +++ b/site/.gitignore @@ -0,0 +1,24 @@ +# build output +dist/ +# generated types +.astro/ + +# dependencies +node_modules/ + +# logs +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + + +# environment variables +.env +.env.production + +# macOS-specific files +.DS_Store + +# jetbrains setting folder +.idea/ diff --git a/site/.vscode/extensions.json b/site/.vscode/extensions.json new file mode 100644 index 000000000..22a15055d --- /dev/null +++ b/site/.vscode/extensions.json @@ -0,0 +1,4 @@ +{ + "recommendations": ["astro-build.astro-vscode"], + "unwantedRecommendations": [] +} diff --git a/site/.vscode/launch.json b/site/.vscode/launch.json new file mode 100644 index 000000000..d64220976 --- /dev/null +++ b/site/.vscode/launch.json @@ -0,0 +1,11 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "command": "./node_modules/.bin/astro dev", + "name": "Development server", + "request": "launch", + "type": "node-terminal" + } + ] +} diff --git a/site/AGENTS.md b/site/AGENTS.md new file mode 100644 index 000000000..c5ff42975 --- /dev/null +++ b/site/AGENTS.md @@ -0,0 +1,22 @@ +## Development + +When starting the dev server, use background mode: + +``` +astro dev --background +``` + +Manage the background server with `astro dev stop`, `astro dev status`, and `astro dev logs`. + +## Documentation + +Full documentation: https://docs.astro.build + +Consult these guides before working on related tasks: + +- [Adding pages, dynamic routes, or middleware](https://docs.astro.build/en/guides/routing/) +- [Working with Astro components](https://docs.astro.build/en/basics/astro-components/) +- [Using React, Vue, Svelte, or other framework components](https://docs.astro.build/en/guides/framework-components/) +- [Adding or managing content](https://docs.astro.build/en/guides/content-collections/) +- [Adding styles or using Tailwind](https://docs.astro.build/en/guides/styling/) +- [Supporting multiple languages](https://docs.astro.build/en/guides/internationalization/) diff --git a/site/CLAUDE.md b/site/CLAUDE.md new file mode 120000 index 000000000..47dc3e3d8 --- /dev/null +++ b/site/CLAUDE.md @@ -0,0 +1 @@ +AGENTS.md \ No newline at end of file diff --git a/site/README.md b/site/README.md new file mode 100644 index 000000000..4314dc143 --- /dev/null +++ b/site/README.md @@ -0,0 +1,78 @@ +# Copilot Samples Site + +Astro-based multi-page catalog site for browsing sample projects in the repository-level `../samples` folder. + +## Tech Stack + +- Astro 7 +- Tailwind CSS v4 (via `@tailwindcss/vite`) +- TypeScript (for data and browser logic modules) + +## Routes + +- `/` Home page with quick summary stats +- `/samples` Interactive sample browser with search and type filters +- `/about` Implementation notes and catalog overview + +## Project Structure + +```text +/ +├── public/ +├── src/ +│ ├── components/ +│ │ └── SampleBrowser.astro +│ ├── layouts/ +│ │ └── SiteLayout.astro +│ ├── lib/ +│ │ └── samples.ts +│ ├── pages/ +│ │ ├── index.astro +│ │ ├── samples.astro +│ │ └── about.astro +│ ├── scripts/ +│ │ └── sample-browser.ts +│ └── styles/ +│ └── global.css +├── astro.config.mjs +└── package.json +``` + +## Responsibilities by Layer + +- `src/layouts` provides the shared page frame (header, nav, footer, and global styles). +- `src/pages` is route-level composition only. +- `src/components` contains reusable UI blocks. +- `src/lib/samples.ts` reads local sample metadata and computes summary stats. +- `src/scripts/sample-browser.ts` contains client-side search/filter behavior. +- `src/styles/global.css` holds Tailwind import, theme tokens, and shared component classes. + +## Data Source + +During build, a prebuild task consolidates metadata from `../samples/*/assets/sample.json` into `public/samples.json`. +The site then reads from this single consolidated source. + +If metadata is missing or invalid for an individual sample, fallback values are used during consolidation. + +## Local Development + +Node.js `>=22.12.0` is required. + +```sh +npm install +npm run dev +``` + +## Build + +```sh +npm run build +npm run preview +``` + +`npm run build` automatically runs `prebuild`, which generates `public/samples.json`. + +## Notes + +- This site is generated from the local repository structure. +- Add or modify sample folders under `../samples`, then refresh/rebuild the site. diff --git a/site/astro.config.mjs b/site/astro.config.mjs new file mode 100644 index 000000000..fdb8fb0be --- /dev/null +++ b/site/astro.config.mjs @@ -0,0 +1,10 @@ +// @ts-check +import { defineConfig } from 'astro/config'; +import tailwindcss from '@tailwindcss/vite'; + +// https://astro.build/config +export default defineConfig({ + vite: { + plugins: [tailwindcss()], + }, +}); diff --git a/site/package-lock.json b/site/package-lock.json new file mode 100644 index 000000000..6f530d8a0 --- /dev/null +++ b/site/package-lock.json @@ -0,0 +1,4600 @@ +{ + "name": "docs", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "docs", + "version": "0.0.1", + "dependencies": { + "@tailwindcss/vite": "^4.1.11", + "astro": "^7.0.3", + "marked": "^18.0.7", + "tailwindcss": "^4.1.11" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@astrojs/compiler-binding": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding/-/compiler-binding-0.2.3.tgz", + "integrity": "sha512-Xz3iBNse+hXXD25IXxsuXEt2ai8klAWE15CRm/EQBc9+aE3jXaF07DZx+iakk3HC6NHvWlEPzLPyxsLgPzOJsw==", + "license": "MIT", + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@astrojs/compiler-binding-darwin-arm64": "0.2.3", + "@astrojs/compiler-binding-darwin-x64": "0.2.3", + "@astrojs/compiler-binding-linux-arm64-gnu": "0.2.3", + "@astrojs/compiler-binding-linux-arm64-musl": "0.2.3", + "@astrojs/compiler-binding-linux-x64-gnu": "0.2.3", + "@astrojs/compiler-binding-linux-x64-musl": "0.2.3", + "@astrojs/compiler-binding-wasm32-wasi": "0.2.3", + "@astrojs/compiler-binding-win32-arm64-msvc": "0.2.3", + "@astrojs/compiler-binding-win32-x64-msvc": "0.2.3" + } + }, + "node_modules/@astrojs/compiler-binding-darwin-arm64": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-darwin-arm64/-/compiler-binding-darwin-arm64-0.2.3.tgz", + "integrity": "sha512-sJIHeL1ONXEBLob8ZaXfmX6iCftUno08G/cMXj2FJnL0xNbHuELcEq1mjxHVFHNgUYu4P7xJNm2mpc0zUEPoKw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@astrojs/compiler-binding-darwin-x64": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-darwin-x64/-/compiler-binding-darwin-x64-0.2.3.tgz", + "integrity": "sha512-P0NYu6aaIeLCqFfszxxBHL0a5WRaYigNVbDoO654Gi5Q2au5duDb5xZBv5EqUg4qnQVC173FXNvGZu1M7nk+/w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@astrojs/compiler-binding-linux-arm64-gnu": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-linux-arm64-gnu/-/compiler-binding-linux-arm64-gnu-0.2.3.tgz", + "integrity": "sha512-PqVN5AqhuDqfx3ejaerwrC8codpV9jnyKV+IOel027qsJ1anFUJLdjUlY8VVys0xgd8lmqveX11OkcaQj/otTg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@astrojs/compiler-binding-linux-arm64-musl": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-linux-arm64-musl/-/compiler-binding-linux-arm64-musl-0.2.3.tgz", + "integrity": "sha512-O3e2CbN4yTsRguWYNnRd0p5YQ0H3fb7KpcR0W4R319q/gq5B1pJ7eqNbiO3b8g2AuiEcRTiUz5jeGT9j69cxOQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@astrojs/compiler-binding-linux-x64-gnu": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-linux-x64-gnu/-/compiler-binding-linux-x64-gnu-0.2.3.tgz", + "integrity": "sha512-hbLBjXVp+96psMe7/7uqyrquGiULXANrq6REVxxPK/I5VzebZ7LHmSfykmByUbLyR1u+K6CTBKgvdQsK2L+2Xw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@astrojs/compiler-binding-linux-x64-musl": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-linux-x64-musl/-/compiler-binding-linux-x64-musl-0.2.3.tgz", + "integrity": "sha512-vIiEvOwrJfHZMaTmqUCrFTIwMYL0+PD3Rvy7kFDQgERyx3zhaw8CPa01MCCqa+/sj344BGrXKZ6ti37SgNLMhw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@astrojs/compiler-binding-wasm32-wasi": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-wasm32-wasi/-/compiler-binding-wasm32-wasi-0.2.3.tgz", + "integrity": "sha512-p9S2X8z/mUR2SMzAVJRFMCt8YaalKR+pjl2DgpdjzCQc6ww4bo8kiy54tgKqxZeNF5c+/2tCDTQIxVSm9V1FsA==", + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^1.1.6" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@astrojs/compiler-binding-win32-arm64-msvc": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-win32-arm64-msvc/-/compiler-binding-win32-arm64-msvc-0.2.3.tgz", + "integrity": "sha512-vcCG6JttIb5vbSmcxO2O398hpVj7lQ349iS7cjgYP6ZuLVEnw+9qPAr2MM2kJkU5wEGZqJ2gyi/M7UJoPwH1iQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@astrojs/compiler-binding-win32-x64-msvc": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-win32-x64-msvc/-/compiler-binding-win32-x64-msvc-0.2.3.tgz", + "integrity": "sha512-hKssjNvC36e00Inb1GW1JsVyCFSCGnIjKem4S8q0VIW6cpWAUpvYB4qQU2HIDGD6SDX0ork4F5sWkNWkp2hrGQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@astrojs/compiler-rs": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-rs/-/compiler-rs-0.2.3.tgz", + "integrity": "sha512-JRAtRcPxS4JeAZEIQFQ6GecBs/Wyp4m6/E8vBNxSgVfo1AtRVLUqRCl5oCGOZ0X/BSBB3Vef/7IlzyiGKi2ORA==", + "license": "MIT", + "dependencies": { + "@astrojs/compiler-binding": "0.2.3" + } + }, + "node_modules/@astrojs/internal-helpers": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.10.0.tgz", + "integrity": "sha512-Ry2R3VPeIN4uPCSA4xQc+e+vsJXkalKpEbDc07hV+a/o5Bs2N/s/uDcPJH/05L19DKh9tAy7e6JM3YZ6Cxfezw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.4", + "@types/mdast": "^4.0.4", + "js-yaml": "^4.1.1", + "picomatch": "^4.0.4", + "retext-smartypants": "^6.2.0", + "shiki": "^4.0.2", + "smol-toml": "^1.6.0", + "unified": "^11.0.5" + } + }, + "node_modules/@astrojs/markdown-satteri": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@astrojs/markdown-satteri/-/markdown-satteri-0.3.2.tgz", + "integrity": "sha512-feXuUPy41gVfeM7EHT1ciUim8ozGr+YHXab9uUBc1Hk8y60DQosO8ldL+AoPXnCAoGj1OChwHfvXmmJ6XVnY9A==", + "license": "MIT", + "dependencies": { + "@astrojs/internal-helpers": "0.10.0", + "@astrojs/prism": "4.0.2", + "github-slugger": "^2.0.0", + "satteri": "^0.9.1" + } + }, + "node_modules/@astrojs/prism": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-4.0.2.tgz", + "integrity": "sha512-KTivpmnz6lDsC6o9H4+DNm2SrE/GHzw8cNAvEJwAvUT+eoaEnn/4NtbDNfRRaxaJHdp15gf+tfHAWiXR4wB3BA==", + "license": "MIT", + "dependencies": { + "prismjs": "^1.30.0" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@astrojs/telemetry": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.3.2.tgz", + "integrity": "sha512-j8DNruA8ors99Al39RYZPJK4DC1bKkoNm93mAMuBhY9TCNC4R8n1q7ovFnJ5qhGh5Lsh7pa1gpQVpYpsJPeTHQ==", + "license": "MIT", + "dependencies": { + "ci-info": "^4.4.0", + "dset": "^3.1.4", + "is-docker": "^4.0.0", + "is-wsl": "^3.1.1", + "which-pm-runs": "^1.1.0" + }, + "engines": { + "node": "18.20.8 || ^20.3.0 || >=22.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bruits/satteri-darwin-arm64": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/@bruits/satteri-darwin-arm64/-/satteri-darwin-arm64-0.9.3.tgz", + "integrity": "sha512-dRUZZrdwh1asfTOyM1nDNmzolhnHtlIFpqYrl1Tdd3YVcaebKmrfJgGL7NAoGPjbEwYmZxaugrxA0uzw83c0dw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@bruits/satteri-darwin-x64": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/@bruits/satteri-darwin-x64/-/satteri-darwin-x64-0.9.3.tgz", + "integrity": "sha512-wgNCTRp2hPSpNMGFv5A4+6+VXgRJIlBZ7XKb3iwjV8YjRWNIjzE5zV2fUeYynyZYVRkuJ9aYFqQmWhc1e5H+UQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@bruits/satteri-linux-arm64-gnu": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/@bruits/satteri-linux-arm64-gnu/-/satteri-linux-arm64-gnu-0.9.3.tgz", + "integrity": "sha512-A/pWy8Jb/PhDYc2/JFuYh06gFJcsfBUBDl81YydGYBrL/Z4nItDfhNDNOibyeSN/lKKDRlycIHEIajjErk00sQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@bruits/satteri-linux-arm64-musl": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/@bruits/satteri-linux-arm64-musl/-/satteri-linux-arm64-musl-0.9.3.tgz", + "integrity": "sha512-L6YxmyOSickzo4pE5WmZfNTJnjX0MtgKOsuwQfNZECTx9Ir5vl2B37EIwnxe2AybuPPHl+FqVQtthNDUdH4Vgg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@bruits/satteri-linux-x64-gnu": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/@bruits/satteri-linux-x64-gnu/-/satteri-linux-x64-gnu-0.9.3.tgz", + "integrity": "sha512-RgH6GPihg9Lzs2yHUsMjqiLxfLyOdmBty8sg9pBY9B4CBnvdOzvg8vklqN+C4qrEEdA9TwpbDpHr1AshLKyRpw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@bruits/satteri-linux-x64-musl": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/@bruits/satteri-linux-x64-musl/-/satteri-linux-x64-musl-0.9.3.tgz", + "integrity": "sha512-BeWhVORjNTIomePznUKiMbHZTqC0j7sMXZFsISmbX+po5d33KLkqBqKh6K332CHJ8KUmCWx16FfPjwsoysttQg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@bruits/satteri-wasm32-wasi": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/@bruits/satteri-wasm32-wasi/-/satteri-wasm32-wasi-0.9.3.tgz", + "integrity": "sha512-dFNcOHKWV2cztCPnYTn7kZ9D7kNOt8N239z5ysFkNHLxJrfK7zaKIXQbfXYN32C+JoVFqAcTIOeWH2+VnsCOHg==", + "cpu": [ + "wasm32" + ], + "optional": true, + "dependencies": { + "@emnapi/core": "1.11.1", + "@emnapi/runtime": "1.11.1", + "@napi-rs/wasm-runtime": "^1.1.6" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@bruits/satteri-win32-arm64-msvc": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/@bruits/satteri-win32-arm64-msvc/-/satteri-win32-arm64-msvc-0.9.3.tgz", + "integrity": "sha512-VnwjBHiAra/PNNEza8eSZdQiG4A3PtTJJwUDtOPAc6iTs0BWZwZX8+OPUZE7//yQCBhgvEMcI8vpwsAwCb6qGQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@bruits/satteri-win32-x64-msvc": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/@bruits/satteri-win32-x64-msvc/-/satteri-win32-x64-msvc-0.9.3.tgz", + "integrity": "sha512-Dsoe4reWe69MyILmMwU6iISIceTW7YIFqbyym7haf9DhUvqkYfMAyp7GMM21JzV0SpG9A2BwzFVP7iq9mmxrpA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@capsizecss/unpack": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@capsizecss/unpack/-/unpack-4.0.1.tgz", + "integrity": "sha512-CuNiSqg7+e1cO/GjffyMOm5Tt2jUF9CWHHnvQ/UkqvtkGfHdgwEC0wpmq7fkN3gxwpRnrAN0WzO3vREKmNolMQ==", + "license": "MIT", + "dependencies": { + "fontkitten": "^1.0.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@clack/core": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@clack/core/-/core-1.4.2.tgz", + "integrity": "sha512-0Ty/1Gfm+Kb07sXcuESjyKfwEhSy4Ns1AgeEisHb/bDY5fWme0tTeTkU14T1Gmcs17YIjB/teiDe4uaCghbYqQ==", + "license": "MIT", + "dependencies": { + "fast-wrap-ansi": "^0.2.0", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 20.12.0" + } + }, + "node_modules/@clack/prompts": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-1.6.0.tgz", + "integrity": "sha512-EYlRokl8szrP9Z25qT5aepMdBjzBvHF9ZEhzIiUBc9guz/T31EqRgvD0QSgZcpE93xiwrr+OkB4nz0BZyF6fSA==", + "license": "MIT", + "dependencies": { + "@clack/core": "1.4.2", + "fast-string-width": "^3.0.2", + "fast-wrap-ansi": "^0.2.0", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 20.12.0" + } + }, + "node_modules/@emnapi/core": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz", + "integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.2", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz", + "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", + "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz", + "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz", + "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz", + "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz", + "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz", + "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz", + "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz", + "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz", + "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz", + "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz", + "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz", + "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz", + "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz", + "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz", + "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz", + "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz", + "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz", + "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz", + "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz", + "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz", + "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz", + "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz", + "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz", + "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz", + "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz", + "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz", + "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/colour": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", + "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "cpu": [ + "ppc64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "cpu": [ + "riscv64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "cpu": [ + "ppc64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "cpu": [ + "riscv64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.7.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz", + "integrity": "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==", + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.3" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" + } + }, + "node_modules/@oslojs/encoding": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@oslojs/encoding/-/encoding-1.1.0.tgz", + "integrity": "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==", + "license": "MIT" + }, + "node_modules/@oxc-project/types": { + "version": "0.137.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.137.0.tgz", + "integrity": "sha512-WT+Gb24i8hmvo85AIv2oEYouEXkRlKAlT9WaCa3TfLgNCN+GhrJOGZuIlMouAh38Qe4QOx26eUOVsq70qXrywA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.1.3.tgz", + "integrity": "sha512-DT6Z3PhvioeHMvxo+xHc3KtqggrI7CCTXCmC2h/5zUlp5jVitv7XEy+9q5/7v8IolhlioawpMo8Kg0EEBy7J0g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.1.3.tgz", + "integrity": "sha512-0NwgwsjM7LrsuVnXMK3koTpagBNOhloc/BNjKqZjv4V5zI5r13qx69uVhRx+o5Z0yy4Hzq+lpy7TAgUG/ocvrw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.1.3.tgz", + "integrity": "sha512-YtiBp4disu6V560loT6PjMdiRaWmVvDNrUunAalbiFx2ggeJwxdAsgZMcoGP17uyAsTwAj5V1niksxlHnVQ1Sw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.1.3.tgz", + "integrity": "sha512-yD3EkEdXk2LypPxnf/kSZHirarsI8gcPzc62SukhR9VJTyvV+F9Q/GxWNuCojc7sXyuVC4DxRGhdDK4X8VSsbw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.1.3.tgz", + "integrity": "sha512-c+8vieQbsD7HNAHKIA34w0GJ9FedFFuJGD+7E6vz7Q3uqAIugL5p45fhlsj4UaAsHpcmlqugBWMhA0/j7o0sIg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.3.tgz", + "integrity": "sha512-50jD0uUwLvur7Zz9LHz17kaAdTPjn5wN93hEgjvmYFRZwiR7ZJYovTd5ipyWJDAnXKvZ+wgc+/Ika6dwSF5OcA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.3.tgz", + "integrity": "sha512-BO9+oPL8K9poZJBfYPsXNtYjPE5uM3qeehT3aFcW4LITOl+iSqhp0abzjR2nWBUNjIZeKXjAEWBZ64WjNoHd6w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.1.3.tgz", + "integrity": "sha512-f3VpLB1vQ0Eo6ecr/6cekLnvYMFF4YBFoVGkfkvPLq1bAkbAwHYQPZKoAmG6OJyTcxxoC+AvezGx/S1obNC0Mw==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.1.3.tgz", + "integrity": "sha512-AmurZ26Pqx/RI9N1gzEOCklkKXl927yjfXWUUS0O7Puh8ARM/Ob8qfrD3qnWksScdw6cSrW5PSHE9DyLu7+PtA==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.3.tgz", + "integrity": "sha512-JJpqs8bRGITDOdbkNKnlojzBabbOHrqjSvDr0IVsZObE1lBcPjxItUEY9eWIDbxaJ3cGrXPWGfGkIxFijg/URg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.3.tgz", + "integrity": "sha512-rSJcdjPxzA/by/6/rYs+v+bXU7UjvnbUWz8MJb6kh6+knqB1dCrtHg0uu7C/4haqJvqdkYHQ5IGn+tCH9GLW/g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.1.3.tgz", + "integrity": "sha512-hQ3/PYkDJICgevvyNcVrihVeqq7k1Pp3VZ9lY+dauAYUJKO+auqApvANhvR1An9BhmqYKvW2Mu1F9u4DXSMLxQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.1.3.tgz", + "integrity": "sha512-Elcv/BtML9lXrV6JuKITc/grN2kYV9gjsQpW8Jfw4ioK0TOkjBjye0nnyqQNy9STNaI20lXNaQBRrD5gSgR0Yg==", + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.11.1", + "@emnapi/runtime": "1.11.1", + "@napi-rs/wasm-runtime": "^1.1.6" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.3.tgz", + "integrity": "sha512-2DrEfhluH9yhiaFApmsjsjwrSYbNcY1oFTzYSP1a535jDbV98zCFanA/96TBUd0iDFcxGmw9QRExwGCXz3U+/g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.3.tgz", + "integrity": "sha512-OL4OMk7UPXOeVGGd3qo5zJyPIljf4AFgk5QAkPPS+OoLuOOozhuaQGC18MxVTnw/06q93gShAJzlwnSCY9YtqA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "license": "MIT" + }, + "node_modules/@rollup/pluginutils": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.4.0.tgz", + "integrity": "sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@shikijs/core": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-4.3.0.tgz", + "integrity": "sha512-EooU3i9F6IAE8kEu+AnGf9DFZWkQBZ+hJn3tLVbsH+61mtQiva5biai66fAA6nvFPXkLgvrh7BrR7YcJU83xQQ==", + "license": "MIT", + "dependencies": { + "@shikijs/primitive": "4.3.0", + "@shikijs/types": "4.3.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.5" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/engine-javascript": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-4.3.0.tgz", + "integrity": "sha512-hTv/KiFf2tpiqlACPiztGGurEARWIutB8YUhcrA1pUC7VzzwKO+g5crUocrLztrZ5ro5Z4hbXg7bYclETn3gSQ==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.3.0", + "@shikijs/vscode-textmate": "^10.0.2", + "oniguruma-to-es": "^4.3.6" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-4.3.0.tgz", + "integrity": "sha512-1vMdN3gHfnKfLYwecUI2ITJI4RhHt96xEaJumVn7Heb0IlJ8WQMIH0Voak+2j22BpSNKdnOfB/pCTPnPm2gq7A==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.3.0", + "@shikijs/vscode-textmate": "^10.0.2" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/langs": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-4.3.0.tgz", + "integrity": "sha512-rnlqFbBRSys9bT4gl/5rw9RnS0W/I84ZldXPkO7cvlEMoV85TyF/aU01N7/NbSR776RNLjrJKjfFUXJR6wN1Cg==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.3.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/primitive": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@shikijs/primitive/-/primitive-4.3.0.tgz", + "integrity": "sha512-CPkz64PTa5diRW1ggzMZH9VM/du4RNChYgVtgqrFcgruvIybmCvySv8GkiHSczUHXYuuR8TdKEwFx+UnZMpgdg==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.3.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/themes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-4.3.0.tgz", + "integrity": "sha512-Avgt05YiT+Y3prjIc9lmQxhJzHBcCfR6cjiFW4OyaMBbt2A6trX5rfjUzx+Vj/mE9qpArYjatnqo9XPjQNW/AQ==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.3.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/types": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.3.0.tgz", + "integrity": "sha512-oc8b9U2SYvofKZk8e/737nIX0qwf6eV2vHFATeObAu7r+mUVpLs8Re0BmVkIjAWAYgkmG/CzLNo7rzuBzRu/wQ==", + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", + "license": "MIT" + }, + "node_modules/@tailwindcss/node": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.1.tgz", + "integrity": "sha512-6NDaqRoAMSXD1mr/RXu0HBvNE9a2n5tHPsxu9XHLws8o4Twes5rBM2205SUUiJ9goAtadrN6xTGX0UDEwp/N4A==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "5.21.6", + "jiti": "^2.7.0", + "lightningcss": "1.32.0", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.3.1" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.1.tgz", + "integrity": "sha512-yVPyo8RNkabVr3O2EhHEE0Rewu7YKzc1DhIqfL46LKveFrmu9XbDazNOJY7/GRuvw1h6u3utWnR29H/p5JPlgA==", + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.3.1", + "@tailwindcss/oxide-darwin-arm64": "4.3.1", + "@tailwindcss/oxide-darwin-x64": "4.3.1", + "@tailwindcss/oxide-freebsd-x64": "4.3.1", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.1", + "@tailwindcss/oxide-linux-arm64-gnu": "4.3.1", + "@tailwindcss/oxide-linux-arm64-musl": "4.3.1", + "@tailwindcss/oxide-linux-x64-gnu": "4.3.1", + "@tailwindcss/oxide-linux-x64-musl": "4.3.1", + "@tailwindcss/oxide-wasm32-wasi": "4.3.1", + "@tailwindcss/oxide-win32-arm64-msvc": "4.3.1", + "@tailwindcss/oxide-win32-x64-msvc": "4.3.1" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.1.tgz", + "integrity": "sha512-SVlyf61g374l5cHyg8x9kf5xmLcOaxvOTsbsqDnSsDJaKOEFZ7GCvi84VAVGpxojYOs1+3K6M0UjXfqPU8vmOQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.1.tgz", + "integrity": "sha512-hVnWLwv+e/l7c4WKyVtHVrIPvYdqWHjRB3MDIqARynzFtnQg85kmQEFCbV9Ja0VVx4xXTIiDWY60Y7iz/iNoDA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.1.tgz", + "integrity": "sha512-Cf7abu0WVgbhU7ANgPUnSAvm7nCvMweusHb8FnaHlLfv/Caq4GYaEZg7ZImzzmjx4lIAfuS8q+eLIS7A7IzxIg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.1.tgz", + "integrity": "sha512-ZZqzX2Y+GXtXXfqSfpJhDm60OoZfvLHLCgm+J7NVqgHHJjG/m9ugZI77RwTsVd4fnBJuCFP6Ae6kTJb71UdS8g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.1.tgz", + "integrity": "sha512-/Ah/xik0LaMYfv9DZ0S/t4pBlBNYOcqtRwusjgovHkvT8ixueWCLyJjsaF5kQIckjb4IT8Q6K6p/iPmZMixYgg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.1.tgz", + "integrity": "sha512-gqdFoVJlw444GvpnheZLHmvTzSxI/cOUUh2KSNejQjTcYkW062SVD+En0rUgD+QV91bz1XGIGtt1HJd48xUGbQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.1.tgz", + "integrity": "sha512-Bwv9KwOvE0VKa86xPFif9b9c3Y1NxOV1P0gLti/IYaWEsQYZXDlxfGEtA8mdDZ7SG3wyNXAWYT5SIn3giL57oA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.1.tgz", + "integrity": "sha512-Ymi8O8T15HYQdOUWUtTI6ldN0neHP85FC+Qz32xTcZ7iJXtem/x8ITev0o1e9e5rkqj4lONZfTRLvkmin1+tKg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.1.tgz", + "integrity": "sha512-M+P/91qJ6uILLw4k2G93GMDRAXj61SMvFQYt39AqvUqYgExXpLL5aepfns7sj4HiAQeolirQF9E0lzRvdf4zPQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.1.tgz", + "integrity": "sha512-zsM8uOeqvVGHsAXsJxsT28ttosFahLJKCLOTUBqRAtKnVgGSRitds9T432QiT8b77Yga7JIBkulIRRlJPtYhRA==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.10.0", + "@emnapi/runtime": "^1.10.0", + "@emnapi/wasi-threads": "^1.2.1", + "@napi-rs/wasm-runtime": "^1.1.4", + "@tybys/wasm-util": "^0.10.2", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.1.tgz", + "integrity": "sha512-aiNvSq9BsVk8V513lDKlrCFAgf8qBMPZTpgEhInL+NwQqs97mYmupVMrPrgBBSL8Pv/0zXu9MrMF9rMun1ZeNg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.1.tgz", + "integrity": "sha512-xDEyu1rg290472FEGaKHnzyDyh5QH+AlWvsU5hMoMtPpzmKlRI0jaYKCgSHDYtaQWZOYbMaduSyCwFwY4n1HmA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.3.1.tgz", + "integrity": "sha512-hItDHuIIlEV61R+faXu66s1K36aTurO/Qw0e45Vskz57gXl9pWOT6eg3zmcEui6CZXddbN7zd41bwmvag4JGwQ==", + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.3.1", + "@tailwindcss/oxide": "4.3.1", + "tailwindcss": "4.3.1" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7 || ^8" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", + "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "license": "MIT" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/nlcst": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/nlcst/-/nlcst-2.0.3.tgz", + "integrity": "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.2.tgz", + "integrity": "sha512-5jsZFwgR5rTdKwidH9Qmat75RKwqfpKlWWB1frDkljN127mwqBu8K0PYo7/hFpF03IEJpfVPpCQDY/eDx3iHvA==", + "license": "ISC" + }, + "node_modules/am-i-vibing": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/am-i-vibing/-/am-i-vibing-0.4.0.tgz", + "integrity": "sha512-MxT4XZL7pzLHpuvhDKdMaQHMGGkJDLluKBLsbstn+8wv9sWcFT6h+0ve9qkml95amVTZtZV83gQe2hY+ojgHLg==", + "license": "MIT", + "dependencies": { + "process-ancestry": "^0.1.0" + }, + "bin": { + "am-i-vibing": "dist/cli.mjs" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/astro": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/astro/-/astro-7.0.3.tgz", + "integrity": "sha512-CK+G+Tl2DMV1EXCwVG45vyurxf2IfRTklMxDhRKn+tst9Yl8rWXpudL62Fa6zin5Bt968FBvuyASj1aJShROZg==", + "license": "MIT", + "dependencies": { + "@astrojs/compiler-rs": "^0.2.2", + "@astrojs/internal-helpers": "0.10.0", + "@astrojs/markdown-satteri": "0.3.2", + "@astrojs/telemetry": "3.3.2", + "@capsizecss/unpack": "^4.0.0", + "@clack/prompts": "^1.1.0", + "@oslojs/encoding": "^1.1.0", + "@rollup/pluginutils": "^5.3.0", + "am-i-vibing": "^0.4.0", + "aria-query": "^5.3.2", + "axobject-query": "^4.1.0", + "ci-info": "^4.4.0", + "clsx": "^2.1.1", + "common-ancestor-path": "^2.0.0", + "cookie": "^1.1.1", + "devalue": "^5.8.1", + "diff": "^8.0.3", + "dset": "^3.1.4", + "es-module-lexer": "^2.0.0", + "esbuild": "^0.28.0", + "flattie": "^1.1.1", + "fontace": "~0.4.1", + "get-tsconfig": "5.0.0-beta.4", + "github-slugger": "^2.0.0", + "html-escaper": "3.0.3", + "http-cache-semantics": "^4.2.0", + "js-yaml": "^4.1.1", + "jsonc-parser": "^3.3.1", + "magic-string": "^0.30.21", + "magicast": "^0.5.2", + "mrmime": "^2.0.1", + "neotraverse": "^0.6.18", + "obug": "^2.1.1", + "p-limit": "^7.3.0", + "p-queue": "^9.1.0", + "package-manager-detector": "^1.6.0", + "piccolore": "^0.1.3", + "picomatch": "^4.0.4", + "rehype": "^13.0.2", + "semver": "^7.7.4", + "shiki": "^4.0.2", + "smol-toml": "^1.6.0", + "svgo": "^4.0.1", + "tinyclip": "^0.1.12", + "tinyexec": "^1.0.4", + "tinyglobby": "^0.2.15", + "ultrahtml": "^1.6.0", + "unifont": "~0.7.4", + "unist-util-visit": "^5.1.0", + "unstorage": "^1.17.5", + "vfile": "^6.0.3", + "vite": "^8.0.13", + "vitefu": "^1.1.2", + "xxhash-wasm": "^1.1.0", + "yargs-parser": "^22.0.0", + "zod": "^4.3.6" + }, + "bin": { + "astro": "bin/astro.mjs" + }, + "engines": { + "node": ">=22.12.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/astrodotbuild" + }, + "optionalDependencies": { + "sharp": "^0.34.0" + }, + "peerDependencies": { + "@astrojs/markdown-remark": "7.2.0" + }, + "peerDependenciesMeta": { + "@astrojs/markdown-remark": { + "optional": true + } + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "license": "ISC" + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "license": "MIT", + "dependencies": { + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ci-info": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", + "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/common-ancestor-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-2.0.0.tgz", + "integrity": "sha512-dnN3ibLeoRf2HNC+OlCiNc5d2zxbLJXOtiZUudNFSXZrNSydxcCsSpRzXwfu7BBWCIfHPw+xTayeBvJCP/D8Ng==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">= 18" + } + }, + "node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/cookie-es": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.2.3.tgz", + "integrity": "sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==", + "license": "MIT" + }, + "node_modules/crossws": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/crossws/-/crossws-0.3.5.tgz", + "integrity": "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==", + "license": "MIT", + "dependencies": { + "uncrypto": "^0.1.3" + } + }, + "node_modules/css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", + "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.27.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "license": "MIT", + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "license": "CC0-1.0" + }, + "node_modules/defu": { + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.7.tgz", + "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==", + "license": "MIT" + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/destr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz", + "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==", + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/devalue": { + "version": "5.8.1", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.8.1.tgz", + "integrity": "sha512-4CXDYRBGqN+57wVJkuXBYmpAVUSg3L6JAQa/DFqm238G73E1wuyc/JhGQJzN7vUf/CMphYau2zXbfWzDR5aTEw==", + "license": "MIT" + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/diff": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.4.tgz", + "integrity": "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dset": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.4.tgz", + "integrity": "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.21.6", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.6.tgz", + "integrity": "sha512-aNnGCvbJ/RIyWo1IuhNdVjnNF+EjH9wpzpNHt+ci/m9He9LJvUN8wrCcXjp9cWsGNAuvSpVFTx/vraAFQ8qGjQ==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-module-lexer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", + "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==", + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz", + "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.28.1", + "@esbuild/android-arm": "0.28.1", + "@esbuild/android-arm64": "0.28.1", + "@esbuild/android-x64": "0.28.1", + "@esbuild/darwin-arm64": "0.28.1", + "@esbuild/darwin-x64": "0.28.1", + "@esbuild/freebsd-arm64": "0.28.1", + "@esbuild/freebsd-x64": "0.28.1", + "@esbuild/linux-arm": "0.28.1", + "@esbuild/linux-arm64": "0.28.1", + "@esbuild/linux-ia32": "0.28.1", + "@esbuild/linux-loong64": "0.28.1", + "@esbuild/linux-mips64el": "0.28.1", + "@esbuild/linux-ppc64": "0.28.1", + "@esbuild/linux-riscv64": "0.28.1", + "@esbuild/linux-s390x": "0.28.1", + "@esbuild/linux-x64": "0.28.1", + "@esbuild/netbsd-arm64": "0.28.1", + "@esbuild/netbsd-x64": "0.28.1", + "@esbuild/openbsd-arm64": "0.28.1", + "@esbuild/openbsd-x64": "0.28.1", + "@esbuild/openharmony-arm64": "0.28.1", + "@esbuild/sunos-x64": "0.28.1", + "@esbuild/win32-arm64": "0.28.1", + "@esbuild/win32-ia32": "0.28.1", + "@esbuild/win32-x64": "0.28.1" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "license": "MIT" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/fast-string-truncated-width": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fast-string-truncated-width/-/fast-string-truncated-width-3.0.3.tgz", + "integrity": "sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==", + "license": "MIT" + }, + "node_modules/fast-string-width": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/fast-string-width/-/fast-string-width-3.0.2.tgz", + "integrity": "sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==", + "license": "MIT", + "dependencies": { + "fast-string-truncated-width": "^3.0.2" + } + }, + "node_modules/fast-wrap-ansi": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/fast-wrap-ansi/-/fast-wrap-ansi-0.2.2.tgz", + "integrity": "sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==", + "license": "MIT", + "dependencies": { + "fast-string-width": "^3.0.2" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/flattie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flattie/-/flattie-1.1.1.tgz", + "integrity": "sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/fontace": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/fontace/-/fontace-0.4.1.tgz", + "integrity": "sha512-lDMvbAzSnHmbYMTEld5qdtvNH2/pWpICOqpean9IgC7vUbUJc3k+k5Dokp85CegamqQpFbXf0rAVkbzpyTA8aw==", + "license": "MIT", + "dependencies": { + "fontkitten": "^1.0.2" + } + }, + "node_modules/fontkitten": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fontkitten/-/fontkitten-1.0.3.tgz", + "integrity": "sha512-Wp1zXWPVUPBmfoa3Cqc9ctaKuzKAV6uLstRqlR56kSjplf5uAce+qeyYym7F+PHbGTk+tCEdkCW6RD7DX/gBZw==", + "license": "MIT", + "dependencies": { + "tiny-inflate": "^1.0.3" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-tsconfig": { + "version": "5.0.0-beta.4", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-5.0.0-beta.4.tgz", + "integrity": "sha512-7nF7C9fIPFEMHgEMEfgIlO9wDdZ8CyHw27rWciFZfHvHDReIiPhsYuzPRXsfvBCqFy1l8RRyyWV7QLM+ZhUJsQ==", + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "engines": { + "node": ">=20.20.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/github-slugger": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", + "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==", + "license": "ISC" + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/h3": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.11.tgz", + "integrity": "sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==", + "license": "MIT", + "dependencies": { + "cookie-es": "^1.2.3", + "crossws": "^0.3.5", + "defu": "^6.1.6", + "destr": "^2.0.5", + "iron-webcrypto": "^1.2.1", + "node-mock-http": "^1.0.4", + "radix3": "^1.1.2", + "ufo": "^1.6.3", + "uncrypto": "^0.1.3" + } + }, + "node_modules/hast-util-from-html": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.3.tgz", + "integrity": "sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "devlop": "^1.1.0", + "hast-util-from-parse5": "^8.0.0", + "parse5": "^7.0.0", + "vfile": "^6.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", + "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^9.0.0", + "property-information": "^7.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-html": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", + "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", + "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/html-escaper": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-3.0.3.tgz", + "integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==", + "license": "MIT" + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "license": "BSD-2-Clause" + }, + "node_modules/iron-webcrypto": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz", + "integrity": "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/brc-dd" + } + }, + "node_modules/is-docker": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-4.0.0.tgz", + "integrity": "sha512-LHE+wROyG/Y/0ZnbktRCoTix2c1RhgWaZraMZ8o1Q7zCh0VSrICJQO5oqIIISrcSBtrXv0o233w1IYwsWCjTzA==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container/node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", + "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jiti": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-yaml": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz", + "integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "license": "MIT" + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lru-cache": { + "version": "11.5.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz", + "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/magicast": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.3.tgz", + "integrity": "sha512-pVKE4UdSQ7DvHzivsCIFx2BJn1mHG6KsyrFcaxFx6tONdneEuThrDx0Cj3AMg58KyN4pzYT+LHOotxDQDjNvkw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.3", + "@babel/types": "^7.29.0", + "source-map-js": "^1.2.1" + } + }, + "node_modules/marked": { + "version": "18.0.7", + "resolved": "https://registry.npmjs.org/marked/-/marked-18.0.7.tgz", + "integrity": "sha512-iDVQ5ldaiKXn6b2JroX5kgRfmwgqolW7NpaEzTl1k/2Zh1njIEN9yniyLV/mOvWwtsE8OGgkjsCYvijuPk1dtA==", + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.27.1", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", + "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", + "license": "CC0-1.0" + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/nanoid": { + "version": "3.3.15", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.15.tgz", + "integrity": "sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/neotraverse": { + "version": "0.6.18", + "resolved": "https://registry.npmjs.org/neotraverse/-/neotraverse-0.6.18.tgz", + "integrity": "sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/nlcst-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-4.0.0.tgz", + "integrity": "sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/node-fetch-native": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz", + "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==", + "license": "MIT" + }, + "node_modules/node-mock-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/node-mock-http/-/node-mock-http-1.0.4.tgz", + "integrity": "sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==", + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/obug": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.3.tgz", + "integrity": "sha512-9miFgM2OFba7hB+pRgvtV84pYTBaoTHohvmIgiRt6dRIzbwEOIaNaP+dIlGs2fNFoB0SeISs0Jz5WFVRid6Xyg==", + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT", + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/ofetch": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.5.1.tgz", + "integrity": "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==", + "license": "MIT", + "dependencies": { + "destr": "^2.0.5", + "node-fetch-native": "^1.6.7", + "ufo": "^1.6.1" + } + }, + "node_modules/ohash": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", + "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", + "license": "MIT" + }, + "node_modules/oniguruma-parser": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.2.tgz", + "integrity": "sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==", + "license": "MIT" + }, + "node_modules/oniguruma-to-es": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.6.tgz", + "integrity": "sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==", + "license": "MIT", + "dependencies": { + "oniguruma-parser": "^0.12.2", + "regex": "^6.1.0", + "regex-recursion": "^6.0.2" + } + }, + "node_modules/p-limit": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-7.3.0.tgz", + "integrity": "sha512-7cIXg/Z0M5WZRblrsOla88S4wAK+zOQQWeBYfV3qJuJXMr+LnbYjaadrFaS0JILfEDPVqHyKnZ1Z/1d6J9VVUw==", + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.2.1" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-queue": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-9.3.0.tgz", + "integrity": "sha512-7NED7xhQ74Ngp4JP/2e0VZHp7vSWfJfqeiR92jPgxsz6m0Se4P03YoTKa9dDXyZ3r6P616gUXttrB6nnHYKang==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^5.0.4", + "p-timeout": "^7.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-7.0.1.tgz", + "integrity": "sha512-AxTM2wDGORHGEkPCt8yqxOTMgpfbEHqF51f/5fJCmwFC3C/zNcGT63SymH2ttOAaiIws2zVg4+izQCjrakcwHg==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-manager-detector": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.6.0.tgz", + "integrity": "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==", + "license": "MIT" + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/piccolore": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/piccolore/-/piccolore-0.1.3.tgz", + "integrity": "sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw==", + "license": "ISC" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", + "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.12", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prismjs": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/process-ancestry": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/process-ancestry/-/process-ancestry-0.1.0.tgz", + "integrity": "sha512-tGqJW/UnclpYASFcM6Xh8D8l/BMtaQ9+CSG0vlJSJTcdMM4lDRv4c6H0Pdcsfted+bVczdYSfk2fdukg2gQkZg==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/property-information": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.2.0.tgz", + "integrity": "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/radix3": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz", + "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==", + "license": "MIT" + }, + "node_modules/readdirp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz", + "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==", + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-recursion": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", + "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-utilities": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", + "license": "MIT" + }, + "node_modules/rehype": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/rehype/-/rehype-13.0.2.tgz", + "integrity": "sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "rehype-parse": "^9.0.0", + "rehype-stringify": "^10.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-parse": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-9.0.1.tgz", + "integrity": "sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-from-html": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-stringify": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-10.0.1.tgz", + "integrity": "sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-to-html": "^9.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/retext-smartypants": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/retext-smartypants/-/retext-smartypants-6.2.0.tgz", + "integrity": "sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "nlcst-to-string": "^4.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rolldown": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.1.3.tgz", + "integrity": "sha512-1F1eEtUBtFvcGm1HQ9TiUIUHPQG7mSAODrhIzjxoUEFuo8OcbrGLiVLkevNgj84TE4lnHvnumwFjhJO5Eu135g==", + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.137.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.1.3", + "@rolldown/binding-darwin-arm64": "1.1.3", + "@rolldown/binding-darwin-x64": "1.1.3", + "@rolldown/binding-freebsd-x64": "1.1.3", + "@rolldown/binding-linux-arm-gnueabihf": "1.1.3", + "@rolldown/binding-linux-arm64-gnu": "1.1.3", + "@rolldown/binding-linux-arm64-musl": "1.1.3", + "@rolldown/binding-linux-ppc64-gnu": "1.1.3", + "@rolldown/binding-linux-s390x-gnu": "1.1.3", + "@rolldown/binding-linux-x64-gnu": "1.1.3", + "@rolldown/binding-linux-x64-musl": "1.1.3", + "@rolldown/binding-openharmony-arm64": "1.1.3", + "@rolldown/binding-wasm32-wasi": "1.1.3", + "@rolldown/binding-win32-arm64-msvc": "1.1.3", + "@rolldown/binding-win32-x64-msvc": "1.1.3" + } + }, + "node_modules/satteri": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/satteri/-/satteri-0.9.3.tgz", + "integrity": "sha512-2XfBh89LCnBMFkNOeVKkBLelAZcIA17VLHsgJum1tJ2fXiPZDN/TDXv4ku46rFOQXYd41LJ0kiZh5gPqExcCsg==", + "dependencies": { + "@types/estree-jsx": "^1.0.5", + "@types/hast": "^3.0.4", + "@types/mdast": "^4.0.4", + "@types/unist": "^3.0.3" + }, + "optionalDependencies": { + "@bruits/satteri-darwin-arm64": "0.9.3", + "@bruits/satteri-darwin-x64": "0.9.3", + "@bruits/satteri-linux-arm64-gnu": "0.9.3", + "@bruits/satteri-linux-arm64-musl": "0.9.3", + "@bruits/satteri-linux-x64-gnu": "0.9.3", + "@bruits/satteri-linux-x64-musl": "0.9.3", + "@bruits/satteri-wasm32-wasi": "0.9.3", + "@bruits/satteri-win32-arm64-msvc": "0.9.3", + "@bruits/satteri-win32-x64-msvc": "0.9.3" + } + }, + "node_modules/sax": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", + "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } + }, + "node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sharp": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" + } + }, + "node_modules/shiki": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-4.3.0.tgz", + "integrity": "sha512-NKKjWzR6LIGL3sXBrWDw9sDS9cxx42/DkysaNqJEeOWE8Kix5gpak0bc00OfDVEO4oyXSyz8+aRaqKoBD1yo7A==", + "license": "MIT", + "dependencies": { + "@shikijs/core": "4.3.0", + "@shikijs/engine-javascript": "4.3.0", + "@shikijs/engine-oniguruma": "4.3.0", + "@shikijs/langs": "4.3.0", + "@shikijs/themes": "4.3.0", + "@shikijs/types": "4.3.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "license": "MIT" + }, + "node_modules/smol-toml": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.7.0.tgz", + "integrity": "sha512-aqVvWoyO21L23mb+drl4RmMXbf6N7FdHjAhTRA9ZBL7apWBgfWC16KjrASI+1p9GAroljyMHj6fK67i0UiTNvQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 18" + }, + "funding": { + "url": "https://github.com/sponsors/cyyynthia" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/svgo": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.0.1.tgz", + "integrity": "sha512-XDpWUOPC6FEibaLzjfe0ucaV0YrOjYotGJO1WpF0Zd+n6ZGEQUsSugaoLq9QkEZtAfQIxT42UChcssDVPP3+/w==", + "license": "MIT", + "dependencies": { + "commander": "^11.1.0", + "css-select": "^5.1.0", + "css-tree": "^3.0.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.1.1", + "sax": "^1.5.0" + }, + "bin": { + "svgo": "bin/svgo.js" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/tailwindcss": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.1.tgz", + "integrity": "sha512-hk+TB1m+K8CYNrP6rjQaq/Y+4Zylwpa87mLYBKCunwnnQ9p+fHb7kmSfGqyEJoxF/O6CDyABWVFEafNSYKll+Q==", + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tiny-inflate": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", + "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==", + "license": "MIT" + }, + "node_modules/tinyclip": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/tinyclip/-/tinyclip-0.1.15.tgz", + "integrity": "sha512-uo33abH+Ays0xYaDysoBt494Hb3hsEczMpcC0MwFl773pazORx4fmvKhclhR1wonUbB6vvpRsvVMwnhfqeMc+A==", + "license": "MIT", + "engines": { + "node": "^16.14.0 || >= 17.3.0" + } + }, + "node_modules/tinyexec": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.4.tgz", + "integrity": "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD", + "optional": true + }, + "node_modules/ufo": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.4.tgz", + "integrity": "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==", + "license": "MIT" + }, + "node_modules/ultrahtml": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ultrahtml/-/ultrahtml-1.6.0.tgz", + "integrity": "sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==", + "license": "MIT" + }, + "node_modules/uncrypto": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/uncrypto/-/uncrypto-0.1.3.tgz", + "integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==", + "license": "MIT" + }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unifont": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/unifont/-/unifont-0.7.4.tgz", + "integrity": "sha512-oHeis4/xl42HUIeHuNZRGEvxj5AaIKR+bHPNegRq5LV1gdc3jundpONbjglKpihmJf+dswygdMJn3eftGIMemg==", + "license": "MIT", + "dependencies": { + "css-tree": "^3.1.0", + "ofetch": "^1.5.1", + "ohash": "^2.0.11" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unstorage": { + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.17.5.tgz", + "integrity": "sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg==", + "license": "MIT", + "dependencies": { + "anymatch": "^3.1.3", + "chokidar": "^5.0.0", + "destr": "^2.0.5", + "h3": "^1.15.10", + "lru-cache": "^11.2.7", + "node-fetch-native": "^1.6.7", + "ofetch": "^1.5.1", + "ufo": "^1.6.3" + }, + "peerDependencies": { + "@azure/app-configuration": "^1.8.0", + "@azure/cosmos": "^4.2.0", + "@azure/data-tables": "^13.3.0", + "@azure/identity": "^4.6.0", + "@azure/keyvault-secrets": "^4.9.0", + "@azure/storage-blob": "^12.26.0", + "@capacitor/preferences": "^6 || ^7 || ^8", + "@deno/kv": ">=0.9.0", + "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", + "@planetscale/database": "^1.19.0", + "@upstash/redis": "^1.34.3", + "@vercel/blob": ">=0.27.1", + "@vercel/functions": "^2.2.12 || ^3.0.0", + "@vercel/kv": "^1 || ^2 || ^3", + "aws4fetch": "^1.0.20", + "db0": ">=0.2.1", + "idb-keyval": "^6.2.1", + "ioredis": "^5.4.2", + "uploadthing": "^7.4.4" + }, + "peerDependenciesMeta": { + "@azure/app-configuration": { + "optional": true + }, + "@azure/cosmos": { + "optional": true + }, + "@azure/data-tables": { + "optional": true + }, + "@azure/identity": { + "optional": true + }, + "@azure/keyvault-secrets": { + "optional": true + }, + "@azure/storage-blob": { + "optional": true + }, + "@capacitor/preferences": { + "optional": true + }, + "@deno/kv": { + "optional": true + }, + "@netlify/blobs": { + "optional": true + }, + "@planetscale/database": { + "optional": true + }, + "@upstash/redis": { + "optional": true + }, + "@vercel/blob": { + "optional": true + }, + "@vercel/functions": { + "optional": true + }, + "@vercel/kv": { + "optional": true + }, + "aws4fetch": { + "optional": true + }, + "db0": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "ioredis": { + "optional": true + }, + "uploadthing": { + "optional": true + } + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", + "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vite": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.1.0.tgz", + "integrity": "sha512-BuJcQK/56NQTWDGn4ABea3q4SSBdNPWwNZKTkkUpcMPnLoquSYH8llRtSUIgoL1KSCpHt5eghLShn50mH36y7Q==", + "license": "MIT", + "dependencies": { + "lightningcss": "^1.32.0", + "picomatch": "^4.0.4", + "postcss": "^8.5.15", + "rolldown": "~1.1.2", + "tinyglobby": "^0.2.17" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.3.0", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vitefu": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.3.tgz", + "integrity": "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==", + "license": "MIT", + "workspaces": [ + "tests/deps/*", + "tests/projects/*", + "tests/projects/workspace/packages/*" + ], + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/which-pm-runs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.1.0.tgz", + "integrity": "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/xxhash-wasm": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-1.1.0.tgz", + "integrity": "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==", + "license": "MIT" + }, + "node_modules/yargs-parser": { + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", + "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", + "license": "ISC", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/yocto-queue": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", + "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/site/package.json b/site/package.json new file mode 100644 index 000000000..2ef2fbf19 --- /dev/null +++ b/site/package.json @@ -0,0 +1,21 @@ +{ + "name": "docs", + "type": "module", + "version": "0.0.1", + "engines": { + "node": ">=22.12.0" + }, + "scripts": { + "dev": "astro dev", + "prebuild": "node ./src/scripts/generate-samples-json.mjs", + "build": "astro build", + "preview": "astro preview", + "astro": "astro" + }, + "dependencies": { + "@tailwindcss/vite": "^4.1.11", + "astro": "^7.0.3", + "marked": "^18.0.7", + "tailwindcss": "^4.1.11" + } +} diff --git a/site/public/favicon.ico b/site/public/favicon.ico new file mode 100644 index 000000000..7f48a94d1 Binary files /dev/null and b/site/public/favicon.ico differ diff --git a/site/public/favicon.svg b/site/public/favicon.svg new file mode 100644 index 000000000..f157bd1c5 --- /dev/null +++ b/site/public/favicon.svg @@ -0,0 +1,9 @@ + + + + diff --git a/site/public/pnp-copilot-samples-badge.svg b/site/public/pnp-copilot-samples-badge.svg new file mode 100644 index 000000000..37be54d25 --- /dev/null +++ b/site/public/pnp-copilot-samples-badge.svg @@ -0,0 +1,8 @@ + + PnP Copilot Samples badge + A badge with PnP on the top row and Copilot Samples on the bottom row. + + + PnP + Copilot Samples + diff --git a/site/public/samples.json b/site/public/samples.json new file mode 100644 index 000000000..144ff2cac --- /dev/null +++ b/site/public/samples.json @@ -0,0 +1,2746 @@ +[ + { + "folder": "cea-techPulse-csharp", + "title": "TechPulse - Custom Engine Agent for Real-Time Technology News (C#)", + "description": "An intelligent tech news companion powered by Microsoft 365 Agents SDK and Semantic Kernel", + "type": "Custom Engine Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/cea-techPulse-csharp", + "updatedAt": "2025-10-16T00:00:00.000Z", + "longDescription": [ + "The \"TechPulse\" is a custom engine agent that acts as your intelligent tech news companion, delivering the latest technology news, trends, and insights from the most trusted sources in the industry. Built with Microsoft 365 Agents SDK and Semantic Kernel, this agent provides real-time access to tech news across multiple categories including AI/ML, startups, cybersecurity, mobile technology, and gaming. The agent understands natural language queries and can search for specific topics, provide trending tech news, and deliver company-specific updates." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": ".NET" + }, + { + "key": "LANGUAGE", + "value": "C#" + }, + { + "key": "API-PLUGIN", + "value": "No" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": null, + "imageAlt": "", + "readmeContent": "# TechPulse News Agent (C#)\n\n## Summary\n\nTechPulse is an intelligent tech news companion that delivers the latest technology news, trends, and insights from trusted sources in the industry. Built with Microsoft 365 Agents SDK and Semantic Kernel, this agent provides real-time access to tech news across multiple categories including AI/ML, startups, cybersecurity, mobile technology, and gaming. The agent understands natural language queries and can search for specific topics, provide trending tech news, and deliver company-specific updates from major tech players like Microsoft, Apple, Google, and more.\n\n![Tech Pulse News](./assets/techPulse.gif)\n\n## Version history\n\nVersion|Date|Comments\n-------|----|--------\n1.0|September 26, 2025|Initial release\n\n## Prerequisites\n\n* Microsoft 365 tenant with Microsoft 365 Copilot\n* [.NET 10 SDK](https://dotnet.microsoft.com/download)\n* [Visual Studio 2022](https://visualstudio.microsoft.com/) or later with the ASP.NET and web development workload\n* A [Microsoft 365 account for development](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts)\n* [Microsoft 365 Agents Toolkit for Visual Studio](https://learn.microsoft.com/en-us/microsoft-365/agents-sdk/create-new-toolkit-project-vs) latest version\n* [Microsoft 365 Copilot license](https://learn.microsoft.com/microsoft-365-copilot/extensibility/prerequisites#prerequisites)\n* An [OpenAI API key](https://platform.openai.com/) for general chat functionality\n* A [NewsAPI key](https://newsapi.org/) for real-time tech news data\n\n## Quick Start\n\n### Debug agent in Microsoft 365 Agents Playground\n1. Ensure your API keys are filled in `cea-techPulse-csharp/appsettings.Playground.json`:\n ```json\n \"OpenAI\": {\n \"ApiKey\": \"\"\n },\n \"NewsApi\": {\n \"ApiKey\": \"\"\n }\n ```\n2. Set `Startup Item` as `Microsoft 365 Agents Playground (browser)`.\n3. Press F5, or select the Debug > Start Debugging menu in Visual Studio.\n4. In Microsoft 365 Agents Playground from the launched browser, try asking:\n * \"Latest AI news\"\n * \"What's trending in tech?\"\n * \"News about Microsoft\"\n * \"Search for cybersecurity updates\"\n\n### Debug agent in Teams Web Client\n1. Ensure your API keys are filled in `M365Agent/env/.env.local.user`:\n ```\n SECRET_OPENAI_API_KEY=\"\"\n SECRET_NEWS_API_KEY=\"\"\n ```\n2. In the debug dropdown menu, select Dev Tunnels > Create A Tunnel (set authentication type to Public) or select an existing public dev tunnel.\n3. Right-click the 'M365Agent' project in Solution Explorer and select **Microsoft 365 Agents Toolkit > Select Microsoft 365 Account**\n4. Sign in to Microsoft 365 Agents Toolkit with a **Microsoft 365 work or school account**\n5. Set `Startup Item` as `Microsoft Teams (browser)`.\n6. Press F5, or select Debug > Start Debugging menu in Visual Studio to start your app\n7. In the opened web browser, select Add button to install the app in Teams\n8. In the chat bar, ask about tech news to get real-time results.\n\n## Features\n\nUsing this sample you can extend Microsoft 365 Copilot with an agent that:\n\n* Provides real-time tech news from trusted sources across multiple categories (AI, startups, cybersecurity, mobile, gaming)\n* Searches for specific tech topics and keywords using natural language queries\n* Delivers company-specific news about major tech companies (Microsoft, Apple, Google, Tesla, etc.)\n* Shows trending topics in technology\n* Uses Semantic Kernel plugins for intelligent news data retrieval\n* Understands various natural language ways of asking for news\n\n### Example Queries\n\n#### Category-based News\n\n* \"Latest AI news\" or \"AI updates\"\n* \"Startup news\" or \"venture capital news\"\n* \"Cybersecurity headlines\"\n* \"Mobile technology news\"\n* \"Gaming news\" or \"esports updates\"\n\n#### Company-specific News\n\n* \"News about Microsoft\"\n* \"Apple updates\"\n* \"What's happening with Google?\"\n* \"Tesla news\"\n\n#### Search & Trending\n\n* \"Search for blockchain news\"\n* \"What's trending in tech?\"\n* \"Popular tech topics\"\n* \"Find news about machine learning\"\n\n## What's included in the template\n\n| Folder | Contents |\n| - | - |\n| `.vscode/` | VS Code files for debugging |\n| `M365Agent/appPackage/` | Templates for the Teams application manifest |\n| `M365Agent/env/` | Environment files |\n| `M365Agent/infra/` | Templates for provisioning Azure resources |\n| `cea-techPulse-csharp/` | The source code for the application |\n\nThe following files can be customized and demonstrate an example implementation to get you started.\n\n| File | Contents |\n| - | - |\n|`cea-techPulse-csharp/Bot/TechNewsBot.cs`| Handles the agent app logic with tech news integration, built with Microsoft 365 Agents SDK and Semantic Kernel.|\n|`cea-techPulse-csharp/Bot/Plugins/TechNewsPlugin.cs`| Semantic Kernel plugin exposing tech news tools.|\n|`cea-techPulse-csharp/Services/TechNewsService.cs`| Service for fetching tech news from NewsAPI.|\n|`cea-techPulse-csharp/Config.cs`| Defines configuration options.|\n|`cea-techPulse-csharp/Program.cs`| Hosts the agent using ASP.NET Core.|\n\n## Help\n\nWe do not support samples, but this community is always willing to help, and we want to improve these samples. We use GitHub to track issues, which makes it easy for community members to volunteer their time and help resolve issues.\n\nYou can try looking at [issues related to this sample](https://github.com/pnp/copilot-pro-dev-samples/issues?q=label%3A%22sample%3A%20cea-techPulse-csharp%22) to see if anybody else is having the same issues.\n\nIf you encounter any issues using this sample, [create a new issue](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\nFinally, if you have an idea for improvement, [make a suggestion](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\n## Additional information and references\n\n- [Microsoft 365 Agents SDK](https://github.com/microsoft/Agents)\n- [Microsoft 365 Agents Toolkit Documentations](https://docs.microsoft.com/microsoftteams/platform/toolkit/teams-toolkit-fundamentals)\n- [Microsoft 365 Agents Toolkit CLI](https://aka.ms/teamsfx-toolkit-cli)\n- [Microsoft 365 Agents Toolkit Samples](https://github.com/OfficeDev/TeamsFx-Samples)\n- [Semantic Kernel](https://github.com/microsoft/semantic-kernel)\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n![visitor stats](https://m365-visitor-stats.azurewebsites.net/copilot-pro-dev-samples/samples/cea-techpulse-csharp)\n" + }, + { + "folder": "cea-techpulse-js", + "title": "TechPulse - Custom Engine Agent for Real-Time Technology News", + "description": "An intelligent tech news companion powered by Microsoft 365 Agents SDK and Model Context Protocol (MCP)", + "type": "Custom Engine Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/cea-techpulse-js", + "updatedAt": "2025-10-16T00:00:00.000Z", + "longDescription": [ + "The \"TechPulse\" is a custom engine agent that acts as your intelligent tech news companion, delivering the latest technology news, trends, and insights from the most trusted sources in the industry. Built with Microsoft 365 Agents SDK and powered by Model Context Protocol (MCP), this agent provides real-time access to tech news across multiple categories including AI/ML, startups, cybersecurity, mobile technology, and gaming. The agent understands natural language queries and can search for specific topics, provide trending tech news, and deliver company-specific updates." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Node.js" + }, + { + "key": "LANGUAGE", + "value": "TypeScript, JavaScript" + }, + { + "key": "API-PLUGIN", + "value": "No" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": null, + "imageAlt": "", + "readmeContent": "# TechPulse News Agent\n\n## Summary\n\nTechPulse is an intelligent tech news companion that delivers the latest technology news, trends, and insights from trusted sources in the industry. Built with Microsoft 365 Agents SDK and powered by Model Context Protocol (MCP), this agent provides real-time access to tech news across multiple categories including AI/ML, startups, cybersecurity, mobile technology, and gaming. The agent understands natural language queries and can search for specific topics, provide trending tech news, and deliver company-specific updates from major tech players like Microsoft, Apple, Google, and more.\n\n![Tech Pulse News](./assets/techPulse.gif)\n\n## Version history\n\nVersion|Date|Comments\n-------|----|--------\n1.0|September 26, 2025|Initial release\n\n## Prerequisites\n\n* Microsoft 365 tenant with Microsoft 365 Copilot\n* [Node.js](https://nodejs.org/), supported versions: 18, 20, 22\n* A [Microsoft 365 account for development](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts)\n* [Microsoft 365 Agents Toolkit Visual Studio Code Extension](https://aka.ms/teams-toolkit) version 5.0.0 and higher\n* [Microsoft 365 Copilot license](https://learn.microsoft.com/microsoft-365-copilot/extensibility/prerequisites#prerequisites)\n* An [OpenAI API key](https://platform.openai.com/) for general chat functionality\n* A [NewsAPI key](https://newsapi.org/) for real-time tech news data\n\n## Minimal path to awesome\n\n* Clone this repository (or [download this solution as a .ZIP file](https://pnp.github.io/download-partial/?url=https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/cea-techpulse-js) then unzip it)\n* Select the Microsoft 365 Agents Toolkit icon on the left in the VS Code toolbar\n* In the Account section, sign in with your [Microsoft 365 account](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts) if you haven't already\n* In file `env/.env.local.user`, fill in your API keys:\n * `SECRET_OPENAI_API_KEY=`\n * `SECRET_NEWS_API_KEY=`\n* Create Teams app by selecting **Provision** in \"Lifecycle\" section\n* Select **Preview in Copilot (Edge)** or **Preview in Copilot (Chrome)** from the launch configuration dropdown, or use **Debug in Microsoft 365 Agents Playground** for local testing\n* Once the agent is loaded, you can ask questions like:\n * \"Latest AI news\"\n * \"What's trending in tech?\"\n * \"News about Microsoft\"\n * \"Search for cybersecurity updates\"\n* The agent will respond with real-time tech news data and can handle both specific news requests and general conversations\n\n## Features\n\nUsing this sample you can extend Microsoft 365 Copilot with an agent that:\n\n* Provides real-time tech news from trusted sources across multiple categories (AI, startups, cybersecurity, mobile, gaming)\n* Searches for specific tech topics and keywords using natural language queries\n* Delivers company-specific news about major tech companies (Microsoft, Apple, Google, Tesla, etc.)\n* Shows trending topics in technology\n* Uses Model Context Protocol (MCP) for efficient news data retrieval\n* Understands various natural language ways of asking for news\n\n### Example Queries\n\n#### Category-based News\n\n* \"Latest AI news\" or \"AI updates\"\n* \"Startup news\" or \"venture capital news\"\n* \"Cybersecurity headlines\"\n* \"Mobile technology news\"\n* \"Gaming news\" or \"esports updates\"\n\n#### Company-specific News\n\n* \"News about Microsoft\"\n* \"Apple updates\"\n* \"What's happening with Google?\"\n* \"Tesla news\"\n\n#### Search & Trending\n\n* \"Search for blockchain news\"\n* \"What's trending in tech?\"\n* \"Popular tech topics\"\n* \"Find news about machine learning\"\n\n## Help\n\nWe do not support samples, but this community is always willing to help, and we want to improve these samples. We use GitHub to track issues, which makes it easy for community members to volunteer their time and help resolve issues.\n\nYou can try looking at [issues related to this sample](https://github.com/pnp/copilot-pro-dev-samples/issues?q=label%3A%22sample%3A%20cea-techpulse-js%22) to see if anybody else is having the same issues.\n\nIf you encounter any issues using this sample, [create a new issue](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\nFinally, if you have an idea for improvement, [make a suggestion](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n![visitor stats](https://m365-visitor-stats.azurewebsites.net/copilot-pro-dev-samples/samples/cea-techpulse-js)\n" + }, + { + "folder": "cea-techpulse-python", + "title": "TechPulse - Custom Engine Agent for Real-Time Technology News (Python)", + "description": "An intelligent tech news companion powered by Microsoft 365 Agents SDK and Model Context Protocol (MCP)", + "type": "Custom Engine Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/cea-techpulse-python", + "updatedAt": "2025-10-16T00:00:00.000Z", + "longDescription": [ + "The \"TechPulse\" is a custom engine agent that acts as your intelligent tech news companion, delivering the latest technology news, trends, and insights from the most trusted sources in the industry. Built with Microsoft 365 Agents SDK and powered by Model Context Protocol (MCP), this agent provides real-time access to tech news across multiple categories including AI/ML, startups, cybersecurity, mobile technology, and gaming. The agent understands natural language queries and can search for specific topics, provide trending tech news, and deliver company-specific updates." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Python" + }, + { + "key": "LANGUAGE", + "value": "Python" + }, + { + "key": "API-PLUGIN", + "value": "No" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": null, + "imageAlt": "", + "readmeContent": "# TechPulse News Agent (Python)\n\n## Summary\n\nTechPulse is an intelligent tech news companion that delivers the latest technology news, trends, and insights from trusted sources in the industry. Built with Microsoft 365 Agents SDK and powered by Model Context Protocol (MCP), this agent provides real-time access to tech news across multiple categories including AI/ML, startups, cybersecurity, mobile technology, and gaming. The agent understands natural language queries and can search for specific topics, provide trending tech news, and deliver company-specific updates from major tech players like Microsoft, Apple, Google, and more.\n\n![Tech Pulse News](./assets/techPulse.gif)\n\n## Version history\n\nVersion|Date|Comments\n-------|----|--------\n1.0|September 26, 2025|Initial release\n\n## Prerequisites\n\n* Microsoft 365 tenant with Microsoft 365 Copilot\n* [Python](https://www.python.org/), version 3.10 or higher\n* [Python extension](https://code.visualstudio.com/docs/languages/python), version v2024.0.1 or higher\n* A [Microsoft 365 account for development](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts)\n* [Microsoft 365 Agents Toolkit Visual Studio Code Extension](https://aka.ms/teams-toolkit) latest version or [Microsoft 365 Agents Toolkit CLI](https://aka.ms/teams-toolkit-cli)\n* [Microsoft 365 Copilot license](https://learn.microsoft.com/microsoft-365-copilot/extensibility/prerequisites#prerequisites)\n* An [OpenAI API key](https://platform.openai.com/) for general chat functionality\n* A [NewsAPI key](https://newsapi.org/) for real-time tech news data\n\n## Minimal path to awesome\n\n* Clone this repository (or [download this solution as a .ZIP file](https://pnp.github.io/download-partial/?url=https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/cea-techpulse-python) then unzip it)\n* Open the command box and enter `Python: Create Environment` to create and activate your desired virtual environment. Remember to select `src/requirements.txt` as dependencies to install when creating the virtual environment.\n* Select the Microsoft 365 Agents Toolkit icon on the left in the VS Code toolbar\n* In the Account section, sign in with your [Microsoft 365 account](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts) if you haven't already\n* In file `env/.env.local.user`, fill in your API keys:\n * `SECRET_OPENAI_API_KEY=`\n * `SECRET_NEWS_API_KEY=`\n* Create Teams app by selecting **Provision** in \"Lifecycle\" section\n* Select **Preview in Copilot (Edge)** or **Preview in Copilot (Chrome)** from the launch configuration dropdown, or use **Debug in Microsoft 365 Agents Playground** for local testing\n* Once the agent is loaded, you can ask questions like:\n * \"Latest AI news\"\n * \"What's trending in tech?\"\n * \"News about Microsoft\"\n * \"Search for cybersecurity updates\"\n* The agent will respond with real-time tech news data and can handle both specific news requests and general conversations\n\n## Features\n\nUsing this sample you can extend Microsoft 365 Copilot with an agent that:\n\n* Provides real-time tech news from trusted sources across multiple categories (AI, startups, cybersecurity, mobile, gaming)\n* Searches for specific tech topics and keywords using natural language queries\n* Delivers company-specific news about major tech companies (Microsoft, Apple, Google, Tesla, etc.)\n* Shows trending topics in technology\n* Uses Model Context Protocol (MCP) for efficient news data retrieval\n* Understands various natural language ways of asking for news\n\n### Example Queries\n\n#### Category-based News\n\n* \"Latest AI news\" or \"AI updates\"\n* \"Startup news\" or \"venture capital news\"\n* \"Cybersecurity headlines\"\n* \"Mobile technology news\"\n* \"Gaming news\" or \"esports updates\"\n\n#### Company-specific News\n\n* \"News about Microsoft\"\n* \"Apple updates\"\n* \"What's happening with Google?\"\n* \"Tesla news\"\n\n#### Search & Trending\n\n* \"Search for blockchain news\"\n* \"What's trending in tech?\"\n* \"Popular tech topics\"\n* \"Find news about machine learning\"\n\n## What's included in the template\n\n| Folder | Contents |\n| - | - |\n| `.vscode/` | VS Code files for debugging |\n| `appPackage/` | Templates for the Teams application manifest |\n| `env/` | Environment files |\n| `infra/` | Templates for provisioning Azure resources |\n| `src/` | The source code for the application |\n\nThe following files can be customized and demonstrate an example implementation to get you started.\n\n| File | Contents |\n| - | - |\n|`src/agent.py`| Handles the agent app logic with tech news MCP integration, built with Microsoft 365 Agents SDK.|\n|`src/config.py`| Defines the environment variables.|\n|`src/app.py`| Hosts the agent using aiohttp.|\n|`src/tech_news_mcp_service.py`| MCP client service that connects to the tech news MCP server.|\n|`src/mcpserver/tech_news.py`| MCP server providing tech news tools (get news, search, trending, company news).|\n\n## Help\n\nWe do not support samples, but this community is always willing to help, and we want to improve these samples. We use GitHub to track issues, which makes it easy for community members to volunteer their time and help resolve issues.\n\nYou can try looking at [issues related to this sample](https://github.com/pnp/copilot-pro-dev-samples/issues?q=label%3A%22sample%3A%20cea-techpulse-python%22) to see if anybody else is having the same issues.\n\nIf you encounter any issues using this sample, [create a new issue](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\nFinally, if you have an idea for improvement, [make a suggestion](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\n## Additional information and references\n\n- [Microsoft 365 Agents Toolkit Documentations](https://docs.microsoft.com/microsoftteams/platform/toolkit/teams-toolkit-fundamentals)\n- [Microsoft 365 Agents Toolkit CLI](https://aka.ms/teamsfx-toolkit-cli)\n- [Microsoft 365 Agents Toolkit Samples](https://github.com/OfficeDev/TeamsFx-Samples)\n- [Microsoft 365 Agents SDK](https://github.com/microsoft/Agents)\n- [Microsoft 365 Agents for Python](https://github.com/microsoft/Agents-for-python)\n- [Microsoft 365 Agents SDK QuickStart](https://github.com/microsoft/Agents/tree/main/samples/python/quickstart)\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n![visitor stats](https://m365-visitor-stats.azurewebsites.net/copilot-pro-dev-samples/samples/cea-techpulse-python)\n" + }, + { + "folder": "cext-trey-research-csharp", + "title": "Trey Research C#", + "description": "This sample demonstrates how to create an agent that interacts with a consulting API to provide information about consultants and projects.", + "type": "Copilot Extension", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/cext-trey-research-csharp", + "updatedAt": "2025-04-16T00:00:00.000Z", + "longDescription": [ + "This sample demonstrates how to create an agent that interacts with a consulting API to provide information about consultants and projects. The agent can answer questions about consultants and their projects" + ], + "metadata": [ + { + "key": "PLATFORM", + "value": ".NET" + }, + { + "key": "LANGUAGE", + "value": "csharp" + }, + { + "key": "TEAMS-PACKAGE", + "value": "Yes" + } + ], + "imageUrl": "https://github.com/OfficeDev/Microsoft-365-Copilot-Samples/raw/main/samples/cext-trey-research-csharp/assets/preview.png", + "imageAlt": "Screenshot of the Trey Research sample", + "readmeContent": "---\npage_type: sample\ndescription: This sample demonstrates how to create an agent that interacts with a consulting API to provide information about consultants and projects.\nproducts:\n- copilot-m365\nlanguages: \n- json\n- csharp\n---\n\n# Trey Research Copilot Declarative Agent (anonymous version)\n\nTrey Research is a fictitious consulting company that supplies talent in the software and pharmaceuticals industries. The vision for this demo is to show the full potential of Copilot extensions in a relatable business environment.\n\n> NOTE: Declarative agents were called \"declarative copilots\" during private preview; you may find the old terminology in some of our documentation and tools as they are being updated.\n\n> NOTE: This version of the Trey Research sample doesn't do authentication, but may be useful for demos\nand experimentation. See the [cext-trey-research-auth](../cext-trey-research-auth/) sample for a version that works with an authenticated API.\n\nThe solution consists of an API plugin that calls a set of Azure functions, which store the consulting data in a Azure Table storage (it uses the Azurite storage emulator when running locally).\nA declarative agent is provided to converse with users and to call the API plugin, as well as to reference the correct SharePoint document library.\n\n### Prompts that work\n\n * what projects am i assigned to?\n (NOTE: In this \"anonymous\" version of the sample, the user is assumed to be consultant \"Avery Howard\". If Copilot decides to request information using your real name, the request will fail. Unless your name happens to be \"Avery Howard\".)\n * what projects is domi working on?\n * do we have any consultants with azure certifications?\n * what projects are we doing for relecloud?\n * which consultants are working with woodgrove bank?\n * how many hours has avery delivered this month?\n * please find a consultant with python skills who is available immediately\n * are any consultants available who are AWS certified? (multi-parameter!)\n * what designers are working at woodgrove bank? (multi-parameter!)\n * please charge 10 hours to woodgrove bank (POST request)\n * please add sanjay to the contoso project (POST request with easy to forget entities, hoping to prompt the user; for now they are defaulted)\n\nIf the sample files are uploaded, these will work as well:\n\n * find my hours spreadsheet and get the hours for woodgrove, then bill the client\n * make a list of my projects, then write a summary of each based on the statement of work.\n\n## Plugin Features\n\nThe sample showcases the following features:\n\n 1. Declarative agent with branding and instructions, access to relevant SharePoint documents and the API plugin\n 1. API based plugin works with any platform that supports REST requests\n 1. Copilot will construct queries for specific data using GET requests\n 1. Copilot updates and adds data using POST requests\n 1. Multi-parameter queries to filter results\n 1. Show a confirmation card before POSTing data; capture missing parameters\n 1. Display rich adaptive cards\n\n## Setup\n\n### Prerequisites\n\n* [Visual Studio 2022 17.11+](https://visualstudio.microsoft.com)\n* You will need to create [local Azure Storage](https://learn.microsoft.com/azure/storage/common/storage-use-azurite?tabs=visual-studio%2Cblob-storage#running-azurite-from-an-aspnet-project).\n* Microsoft work or school account with [permissions to upload custom Teams applications](https://learn.microsoft.com/microsoftteams/platform/concepts/build-and-test/prepare-your-o365-tenant#enable-custom-teams-apps-and-turn-on-custom-app-uploading). The account will also need a Microsoft Copilot for Microsoft 365 license to use the extension in Copilot.\n* (optional) [Postman](https://www.postman.com/downloads/)\n\n### Setup instructions (one-time setup)\n\n1. [Install](https://learn.microsoft.com/microsoftteams/platform/toolkit/toolkit-v4/install-teams-toolkit-vs?pivots=visual-studio-v17-7) Teams Toolkit for Visual Studio\n\n![Installing Teams Toolkit in Visual Studio](./images/01-04-visual-studio-install.png)\n\n1. In the debug dropdown menu of Visual Studio, select Dev Tunnels > Create A Tunnel (set authentication type to Public) or select an existing public dev tunnel.\n\n![Create dev tunnel](./images/01-04-create-devtunnel-01.png)\n\n![Create dev tunnel](./images/01-04-create-devtunnel-02.png)\n\n1. In the debug dropdown menu of Visual Studio, select default startup project > **Microsoft Teams (browser)**\n\n![select debug profile](./images/01-04-debug-dropdown.png)\n\n1. In Visual Studio, right-click your **TeamsApp** project and **Select Teams Toolkit > Prepare Teams App Dependencies**\n\n![Prepare Teams App Dependencies](./images/01-04-prepare-dependencies-01.png)\n\n1. Sign in with your Microsoft 365 account where you have permissions to upload custom apps.\n\n![Prepare Teams App Dependencies](./images/01-04-prepare-dependencies-02.png)\n\n1. Select existing or create a new resource group and subscription. Click **Provision** button.\n\n![Prepare Teams App Dependencies](./images/01-04-prepare-dependencies-03.png)\n\n1. Once the provisioning is completed, you will receive a message box as shown below.\n\n![Prepare Teams App Dependencies](./images/01-04-prepare-dependencies-04.png)\n\n> If you do not have permission to upload custom apps (sideloading), Teams Toolkit will recommend creating and using a Microsoft 365 Developer Program account - a free program to get your own dev environment sandbox that includes Teams.\n\n1. OPTIONAL: Copy the files from the **/sampleDocs** folder to OneDrive or SharePoint. Add the location of these files in the `OneDriveAndSharePoint` capability in the declarative copilot (**/appPackage/trey-declarative-copilot.json**).\n\n### Running the solution (after each build)\n\n- Enable Multi-Project Launch Profiles\n\nClick the \"Debug\" menu in Visual Studio and then select \"Options\".\n\n![Enable Multi-Project](./images/02-01-Enable-multiprojects-01.png)\n\nNavigate to Environment > Preview Features and check the checkbox labeled \"Enable Multi-Project Launch Profiles\".\n\n![Enable Multi-Project](./images/02-01-Enable-multiprojects-02.png)\n\nClick F5 to start debugging, or click the start button 1️⃣. Make sure that the debug profile is **Microsoft Teams (browser)** 2️⃣.\n\n![Run application locally](./images/01-04-debug-dropdown.png)\n\n2. Navigate to Copilot as shown below 1️⃣\n![Running in Copilot](./assets/images/startsample.png)\n\n3. Access the declarative agent by opening the flyout 4️⃣, then select the Trey Genie Local solution 5️⃣.\n\n## API Summary\n\n![postman](https://voyager.postman.com/logo/postman-logo-icon-orange.svg) \n\nWe have a [Postman collection](https://documenter.getpostman.com/view/5938178/2sA3JJ8hfn) for you to try out the APIs. It's a great way to get to know the data that Copilot is accessing.\n\nAll API operations are included in the collection, with parameters and body provided to make it easier for you to test our GET and POST calls. \n\n> Make sure you have [Postman desktop](https://www.postman.com/downloads/) to be able to test urls with `localhost` domain. \nOr simply replace part of the URL `http://localhost:7071` with your tunnel/host URL.\n\n\n#### GET Requests\n\n~~~javascript\n\n GET /api/me/ - get my consulting profile and projects\n\nGET /api/consultants/ - get all consultants\n// Query string params can be used in any combination to filter results\nGET /api/consultants/?consultantName=Avery - get consultants with names containing \"Avery\"\nGET /api/consultants/?projectName=Foo - get consultants on projects with \"Foo\" in the name\nGET /api/consultants/?skill=Foo - get consultants with \"Foo\" in their skills list\nGET /api/consultants/?certification=Foo - get consultants with \"Foo\" in their certifications list\nGET /api/consultants/?role=Foo - get consultants who can serve the \"Foo\" role on a project\nGET /api/consultants/?availability=x - get consultants with x hours availability this month or next month\n~~~\n\nThe above requests all return an array of consultant objects, which are defined in the ApiConsultant interface in /model/apiModel.ts.\n\n~~~javascript\nGET /api/projects/ - get all projects\n// Query string params can be used in any combination to filter results\nGET /api/projects/?projectName=Foo - get projects with \"Foo\" in the name\nGET /api/projects/?consultantName=Avery - get projects where a consultant containing \"Avery\" is assigned\n\n~~~\n\nThe above requests all return an array of project objects, which are defined in the ApiProject interface in /model/apiModel.ts.\n\n#### POST Requests\n\n~~~javascript\nPOST /api/me/chargeTime - Add hours to project with \"Foo\" in the name\n\nRequest body:\n{\n projectName: \"foo\",\n hours: 5\n}\nResponse body:\n{\n status: 200,\n message: \"Charged 3 hours to Woodgrove Bank on project \\\"Financial data plugin for Microsoft Copilot\\\". You have 17 hours remaining this month\";\n}\n\nPOST /api/projects/assignConsultant - Add consultant to project with \"Foo\" in the name\nRequest body:\n{\n projectName: \"foo\",\n consultantName: \"avery\",\n role: \"architect\",\n forecast: number\n}\nResponse body:\n{\n status: 200\n message: \"Added Alice to the \\\"Financial data plugin for Microsoft Copilot\\\" project at Woodgrove Bank. She has 100 hours remaining this month.\";\n}\n~~~\n\n## API Design considerations\n\nThe process began with a bunch of sample prompts that serve as simple use cases for the service. The API is designed specifically to serve those use cases and likely prompts. In order to make it easier for use in the RAG orchestration, the service:\n\n1. Completes each prompt / use case in a single HTTP request\n\n * accept names or partial names that might be stated in a user prompt rather than requiring IDs which must be looked up\n * return enough information to allow for richer responses; err on the side of providing more detail including related entities\n\n2. For best Copilot performance, limit the number of parameter options to 10-15 \n\n3. Ensure that parameters, properties, messages, etc. are human readable, as they will be interpreted by a large language model\n\n4. Return all the data Copilot might need to fulfull a user prompt. For example, when retrieving a\nconsultant, the API has no way to know if the user was seeking the consultant's skills, location, project list, or something else. Thus, the API returns all this information.\n\n5. In GET requests, use the resource that corresponds to the entity the user is asking for. Don't expect Copilot to figure out that some data is buried in another entity.\n\n6. In POST requests, use a command style such as `/me/chargeTime`, as opposed to asking the API to update a data structure\n\n7. Don't expect Copilot to filter data; instead provide parameters and filter it server side. (I have seen some filtering by Copilot however - this is for further study)\n\n" + }, + { + "folder": "cext-trey-research-python", + "title": "Trey Research Python", + "description": "This sample demonstrates how to create an agent that interacts with a consulting API to provide information about consultants and projects.", + "type": "Copilot Extension", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/cext-trey-research-python", + "updatedAt": "2025-04-16T00:00:00.000Z", + "longDescription": [ + "This sample demonstrates how to create an agent that interacts with a consulting API to provide information about consultants and projects. The agent can answer questions about consultants and their projects" + ], + "metadata": [ + { + "key": "LANGUAGE", + "value": "python" + }, + { + "key": "TEAMS-PACKAGE", + "value": "Yes" + } + ], + "imageUrl": "https://github.com/OfficeDev/Microsoft-365-Copilot-Samples/raw/main/samples/cext-trey-research-python/assets/preview.png", + "imageAlt": "Screenshot of the Trey Research sample", + "readmeContent": "---\npage_type: sample\ndescription: This sample demonstrates how to create an agent that interacts with a consulting API to provide information about consultants and projects.\nproducts:\n- copilot-m365\nlanguages:\n- json\n- python\n---\n\n# Trey Research Copilot extension (anonymous version)\n\nTrey Research is a fictitious consulting company that supplies talent in the software and pharmaceuticals industries. The vision for this demo is to show the full potential of Copilot extensions in a relatable business environment.\n\n> NOTE: The services needed to use this sample are in private preview only\n\n> NOTE: This version of the Trey Research sample doesn't do authentication, but may be useful for demos\nand experimentation. We plan to release an authenticated version shortly.\n\n### Prompts that work\n\n * what trey projects am i assigned to?\n (NOTE: In this \"anonymous\" version of the sample, the user is assumed to be consultant \"Avery Howard\". If Copilot decides to request information using your real name, the request will fail. Unless your name happens to be \"Avery Howard\".)\n * what trey projects is domi working on?\n * do we have any trey consultants with azure certifications?\n * what trey projects are we doing for relecloud?\n * which trey consultants are working with woodgrove bank?\n * in trey research, how many hours has avery delivered this month?\n * please find a trey consultant with python skills who is available immediately\n * are any trey research consultants available who are AWS certified? (multi-parameter!)\n * does trey research have any architects with javascript skills? (multi-parameter!)\n * what trey research designers are working at woodgrove bank? (multi-parameter!)\n * please charge 10 hours to woodgrove bank in trey research (POST request)\n * please add sanjay to the contoso project for trey research (POST request with easy to forget entities, hoping to prompt the user; for now they are defaulted)\n\nNotice that each prompt mentions \"trey\"; this isn't necessary once you have mentioned Trey in a conversation, but it does help Copilot decide to call your plugin. This is an advantage of Declarative Copilots, where the plugin is explicitly declared and it's not necessary to establish intent to call it.\n\nIf the sample files are installed and accessible to the logged-in user,\n\n * find my hours spreadsheet and get the hours for woodgrove, then bill the client\n * make a list of my projects, then write a summary of each based on the statement of work.\n\n## Plugin Features\n\nThe sample showcases the following plugin features:\n\n 1. Declarative Copilot with branding and instructions, access to relevant SharePoint documents and the API plugin\n 1. API based plugin works with any platform that supports REST requests\n 1. Copilot will construct queries for specific data using GET requests\n 1. Copilot updates and adds data using POST requests\n 1. Multi-parameter queries to filter results\n 1. Show a confirmation card before POSTing data; capture missing parameters\n 1. Display rich adaptive cards\n\n## Setup\n\n### Prerequisites\n\n* [Python 3.11.x](https://www.python.org/downloads/)\n* [Visual Studio Code](https://code.visualstudio.com/Download)\n* [NodeJS 18.x](https://nodejs.org/en/download)\n* [Teams Toolkit extension for VS Code](https://marketplace.visualstudio.com/items?itemName=TeamsDevApp.ms-teams-vscode-extension)\n* [Teams Toolkit CLI](https://learn.microsoft.com/microsoftteams/platform/toolkit/teams-toolkit-cli?pivots=version-three)\n (`npm install -g @microsoft/teamsapp-cli`)\n* [Azure Functions Core Tools v4](https://learn.microsoft.com/azure/azure-functions/functions-run-local?tabs=windows%2Cisolated-process%2Cnode-v4%2Cpython-v2%2Chttp-trigger%2Ccontainer-apps&pivots=programming-language-python)\n* (optional) [Postman](https://www.postman.com/downloads/)\n\n### Setup instructions (one-time setup)\n\n1. Log into Teams Toolkit using the tenant where you will run the sample.\n\n1. Ensure the **Python extension** is installed in Visual Studio Code by searching for 'Python' in the Extensions view (Ctrl+Shift+X) and clicking Install.\n\n1. Press **CTRL+Shift+P** to open the command box and enter **Python: Create Environment** to create and activate your desired virtual environment.\n\n1. In the `./env/env.local` file, set the `TENANT_NAME` variable with your tenant name.\n ```bash\n TENANT_NAME=\n ```\n Replace with your actual tenant name\n\n1. OPTIONAL: Copy the files from the **/sampleDocs** folder to OneDrive or SharePoint. Add the location of these files in the `OneDriveAndSharePoint` capability in the declarative copilot (**/appPackage/trey-declarative-copilot.json**).\n\n### Running the solution (after each build)\n\n1. Press F5 to start the application. It will take a while on first run to download the dependencies. Eventually a browser window will open up and your package is installed.\n\n2. Navigate to Copilot as shown below 1️⃣\n![Running in Copilot](./assets/images/startsample.png)\n\n3. To use the plugin, open the plugin panel 2️⃣ and enable your plugin 3️⃣. For best results, mention \"trey\" with each prompt.\n\n4. To use the declarative Copilot, open the flyout 4️⃣ and select the Trey Genie Local solution 5️⃣.\n\n## API Summary\n\n![postman](https://voyager.postman.com/logo/postman-logo-icon-orange.svg) \n\nWe have a [Postman collection](https://documenter.getpostman.com/view/5938178/2sA3JJ8hfn) for you to try out the APIs. It's a great way to get to know the data that Copilot is accessing.\n\nAll API operations are included in the collection, with parameters and body provided to make it easier for you to test our GET and POST calls. \n\n> Make sure you have [Postman desktop](https://www.postman.com/downloads/) to be able to test urls with `localhost` domain. \nOr simply replace part of the URL `http://localhost:7071` with your tunnel/host URL.\n\n#### GET Requests\n\n~~~javascript\n\n GET /api/me/ - get my consulting profile and projects\n\nGET /api/consultants/ - get all consultants\n// Query string params can be used in any combination to filter results\nGET /api/consultants/?consultantName=Avery - get consultants with names containing \"Avery\"\nGET /api/consultants/?projectName=Foo - get consultants on projects with \"Foo\" in the name\nGET /api/consultants/?skill=Foo - get consultants with \"Foo\" in their skills list\nGET /api/consultants/?certification=Foo - get consultants with \"Foo\" in their certifications list\nGET /api/consultants/?role=Foo - get consultants who can serve the \"Foo\" role on a project\nGET /api/consultants/?availability=x - get consultants with x hours availability this month or next month\n\n~~~\n\nThe above requests all return an array of consultant objects, which are defined in the ApiConsultant interface in /model/apiModel.ts.\n\n~~~javascript\nGET /api/projects/ - get all projects\n// Query string params can be used in any combination to filter results\nGET /api/projects/?projectName=Foo - get projects with \"Foo\" in the name\nGET /api/projects/?consultantName=Avery - get projects where a consultant containing \"Avery\" is assigned\n\n~~~\n\nThe above requests all return an array of project objects, which are defined in the ApiProject interface in /model/apiModel.ts.\n\n#### POST Requests\n\n~~~javascript\nPOST /api/me/chargeTime - Add hours to project with \"Foo\" in the name\n\nRequest body:\n{\n projectName: \"foo\",\n hours: 5\n}\nResponse body:\n{\n status: 200,\n message: \"Charged 3 hours to Woodgrove Bank on project \\\"Financial data plugin for Microsoft Copilot\\\". You have 17 hours remaining this month\";\n}\n\nPOST /api/projects/assignConsultant - Add consultant to project with \"Foo\" in the name\nRequest body:\n{\n projectName: \"foo\",\n consultantName: \"avery\",\n role: \"architect\",\n forecast: number\n}\nResponse body:\n{\n status: 200\n message: \"Added Alice to the \\\"Financial data plugin for Microsoft Copilot\\\" project at Woodgrove Bank. She has 100 hours remaining this month.\";\n}\n~~~\n\n## API Design considerations\n\nThe process began with a bunch of sample prompts that serve as simple use cases for the service. The API is designed specifically to serve those use cases and likely prompts. In order to make it easier for use in the RAG orchestration, the service:\n\n1. Completes each prompt / use case in a single HTTP request\n\n * accept names or partial names that might be stated in a user prompt rather than requiring IDs which must be looked up\n * return enough information to allow for richer responses; err on the side of providing more detail including related entities\n\n2. For best Copilot performance, limit the number of parameter options to 10-15 \n\n3. Ensure that parameters, properties, messages, etc. are human readable, as they will be interpreted by a large language model\n\n4. Return all the data Copilot might need to fulfull a user prompt. For example, when retrieving a\nconsultant, the API has no way to know if the user was seeking the consultant's skills, location, project list, or something else. Thus, the API returns all this information.\n\n5. In GET requests, use the resource that corresponds to the entity the user is asking for. Don't expect Copilot to figure out that some data is buried in another entity.\n\n6. In POST requests, use a command style such as `/me/chargeTime`, as opposed to asking the API to update a data structure\n\n7. Don't expect Copilot to filter data; instead provide parameters and filter it server side. (I have seen some filtering by Copilot however - this is for further study)\n\n" + }, + { + "folder": "da-adaptive-card-dialog-csharp", + "title": "Adaptive Card dialog (C#)", + "description": "A declarative agent demonstrating how to open dialog boxes from Adaptive Cards in Microsoft 365 Copilot, built with C# and .NET 10", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-adaptive-card-dialog-csharp", + "updatedAt": "2026-04-15T00:00:00.000Z", + "longDescription": [ + "This sample demonstrates how to open dialog boxes from Adaptive Cards in a Microsoft 365 Copilot declarative agent. Users can browse programming tutorials for Node.js, JavaScript, and Git, watch official Microsoft video tutorials embedded in dialog boxes, and take interactive quizzes with instant feedback—all within the Copilot interface. The sample showcases Action.OpenUrlDialog from Adaptive Cards v1.5, an Azure Functions backend written in C# (.NET 10), and API Plugin integration." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Copilot" + }, + { + "key": "LANGUAGE", + "value": "C#" + }, + { + "key": "API-PLUGIN", + "value": "Yes" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://raw.githubusercontent.com/pnp/copilot-pro-dev-samples/refs/heads/main/samples/da-adaptive-card-dialog-csharp/assets/AdaptiveCardsDialogBox.gif", + "imageAlt": "Declarative Agent with API Plugin for Microsoft 365 Copilot Sample (C#)", + "readmeContent": "# Adaptive Card Dialog (C#)\n\n## Summary\n\nThis sample demonstrates how to open dialog boxes from Adaptive Cards in a Microsoft 365 Copilot declarative agent. Users can browse programming tutorials for Node.js, JavaScript, and Git, watch official Microsoft video tutorials embedded in dialog boxes, and take interactive quizzes with instant feedback—all within the Copilot interface.\n\nThe sample showcases Action.OpenUrlDialog from Adaptive Cards v1.5, an Azure Functions backend written in C# (.NET 10), and API Plugin integration.\n\n\"Adaptive\n\n## Version history\n\nVersion|Date|Author|Comments\n-------|----|----|--------\n1.0|April 15, 2026|[YugalPradhan31](https://github.com/YugalPradhan31)|Initial release\n\n## Prerequisites\n\n* [Microsoft 365 account with Copilot access](https://www.microsoft.com/microsoft-365/enterprise/copilot-for-microsoft-365)\n* [.NET 10 SDK](https://dotnet.microsoft.com/download/dotnet/10.0)\n* [Azure Functions Core Tools v4](https://learn.microsoft.com/azure/azure-functions/functions-run-tools)\n* [Visual Studio 2022](https://aka.ms/vs) 17.11 or higher\n* [Microsoft 365 Agents Toolkit for Visual Studio](https://aka.ms/install-teams-toolkit-vs)\n\n## Minimal Path to Awesome\n\n* Clone this repository (or download this solution as a .ZIP file then unzip it)\n ```bash\n git clone https://github.com/pnp/copilot-pro-dev-samples.git\n cd copilot-pro-dev-samples/samples/da-adaptive-card-dialog-csharp\n ```\n* Open **AdaptiveCardDialog.slnx** in Visual Studio 2022\n* In the debug dropdown menu, select **Dev Tunnels > Create a Tunnel** (set authentication type to Public) or select an existing public dev tunnel\n* Right-click the **M365Agent** project in Solution Explorer and select **Microsoft 365 Agents Toolkit > Select Microsoft 365 Account**\n* Sign in to Microsoft 365 Agents Toolkit with a **Microsoft 365 work or school account**\n* Press **F5**, or select **Debug > Start Debugging** in Visual Studio to start your app\n* When the browser launches, open the **Copilot** app, select the agent, and start asking questions like:\n - \"Show me programming tutorials\"\n - \"I want to learn JavaScript\"\n - \"Git tutorials for beginners\"\n* The agent will respond with programming tutorials and you can interact with action buttons:\n - **Watch Video** - Opens YouTube embed in a large dialog\n - **Interactive Quiz** - Opens custom HTML quiz with instant feedback\n\n> **Note:** Please make sure to switch to New Teams when Teams web client has launched.\n\n## Features\n\nThis sample illustrates the following concepts for Microsoft 365 Copilot declarative agents:\n\n* **Action.OpenUrlDialog** - Opens URLs in modal dialogs within Microsoft 365 Copilot without leaving the chat interface\n\n### What is Action.OpenUrlDialog?\n\n`Action.OpenUrlDialog` is a new Adaptive Card action (v1.5+) that opens a URL in a modal dialog within Microsoft 365 Copilot, providing an integrated experience without leaving the chat interface.\n\n**Key Characteristics:**\n- Opens URLs in modal dialogs within Copilot\n- Supports custom dialog sizes (width/height in px or predefined: small, medium, large)\n- Requires URLs to be whitelisted in `validDomains` in manifest.json\n- Works with YouTube embeds, custom HTML pages, and other web content\n\n### Interaction Flow\n\n**Step 1: Ask for tutorials**\n```\nUser: \"Show me programming tutorials\"\n```\n\n**Step 2: Browse learning resources**\nThe agent returns adaptive cards showing:\n- Topic name (Node.js, JavaScript, Git)\n- Difficulty level and duration\n- Description\n- Two action buttons\n\n**Step 3: Watch Video**\nClick \"Watch Video\" button:\n- Opens YouTube embed in a large dialog\n- Shows official Microsoft tutorial videos\n- Supports fullscreen playback\n\n**Step 4: Take Interactive Quiz**\nClick \"Interactive Quiz\" button:\n- Opens custom HTML quiz in dialog\n- 3 questions with multiple choice options\n- Instant feedback with explanations\n- Progress bar showing completion\n- Final score and key takeaways\n- Option to retake quiz\n\n## Help\n\nWe do not support samples, but this community is always willing to help, and we want to improve these samples. We use GitHub to track issues, which makes it easy for community members to volunteer their time and help resolve issues.\n\nYou can try looking at [issues related to this sample](https://github.com/pnp/copilot-pro-dev-samples/issues?q=label%3A%22sample%3A%20da-adaptive-card-dialog-csharp%22) to see if anybody else is having the same issues.\n\nIf you encounter any issues using this sample, [create a new issue](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\nFinally, if you have an idea for improvement, [make a suggestion](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n## Further reading\n\n- [Action.OpenUrlDialog Documentation](https://learn.microsoft.com/en-us/microsoft-365-copilot/extensibility/adaptive-card-dialog-box)\n- [Build declarative agents for Microsoft 365 Copilot](https://learn.microsoft.com/microsoft-365-copilot/extensibility/overview-declarative-agent)\n- [Adaptive Cards Schema Explorer](https://adaptivecards.io/explorer/)\n- [API Plugins for Microsoft 365 Copilot](https://learn.microsoft.com/microsoft-365-copilot/extensibility/overview-api-plugins)\n- [Declarative agents for Microsoft 365](https://aka.ms/teams-toolkit-declarative-agent)\n\n\n\n---\n" + }, + { + "folder": "da-adaptive-card-dialog-js", + "title": "Adaptive Card dialog", + "description": "A declarative agent demonstrating how to open dialog boxes from Adaptive Cards in Microsoft 365 Copilot", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-adaptive-card-dialog-js", + "updatedAt": "2026-01-06T00:00:00.000Z", + "longDescription": [ + "This sample demonstrates how to open dialog boxes from Adaptive Cards in a Microsoft 365 Copilot declarative agent. Users can browse programming tutorials for Node.js, JavaScript, and Git, watch official Microsoft video tutorials embedded in dialog boxes, and take interactive quizzes with instant feedback—all within the Copilot interface. The sample showcases Action.OpenUrlDialog from Adaptive Cards v1.5, Azure Functions backend, and API Plugin integration." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Copilot" + }, + { + "key": "LANGUAGE", + "value": "JavaScript" + }, + { + "key": "API-PLUGIN", + "value": "Yes" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://raw.githubusercontent.com/pnp/copilot-pro-dev-samples/refs/heads/main/samples/da-adaptive-card-dialog-js/assets/AdaptiveCardsDialogBox.gif", + "imageAlt": "Declarative Agent with API Plugin for Microsoft 365 Copilot Sample", + "readmeContent": "\n# Adaptive Card Dialog\n\n## Summary\n\nThis sample demonstrates how to open dialog boxes from Adaptive Cards in a Microsoft 365 Copilot declarative agent. Users can browse programming tutorials for Node.js, JavaScript, and Git, watch official Microsoft video tutorials embedded in dialog boxes, and take interactive quizzes with instant feedback—all within the Copilot interface.\n\nThe sample showcases Action.OpenUrlDialog from Adaptive Cards v1.5, Azure Functions backend, and API Plugin integration.\n\n\"Adaptive\n\n\n## Version history\n\nVersion|Date|Author|Comments\n-------|----|----|--------\n1.0|January 6, 2026|Microsoft|Initial release\n\n## Prerequisites\n\n* [Microsoft 365 account with Copilot access](https://www.microsoft.com/microsoft-365/enterprise/copilot-for-microsoft-365)\n* [Node.js](https://nodejs.org) version 18.x, 20.x, or 22.x\n* [Visual Studio Code](https://code.visualstudio.com/)\n* [Microsoft 365 Agents Toolkit for VS Code](https://marketplace.visualstudio.com/items?itemName=TeamsDevApp.ms-teams-vscode-extension)\n* [Dev tunnels CLI](https://learn.microsoft.com/azure/developer/dev-tunnels/get-started) for local development\n\n## Minimal Path to Awesome\n\n* Clone this repository (or download this solution as a .ZIP file then unzip it)\n ```bash\n git clone https://github.com/pnp/copilot-pro-dev-samples.git\n cd copilot-pro-dev-samples/samples/da-adaptive-card-dialog-js\n ```\n* Open the project in Visual Studio Code\n* Select the **Microsoft 365 Agents Toolkit** icon on the left in the VS Code toolbar\n* In the **Account** section, sign in with your Microsoft 365 account if you haven't already\n* Create Teams app by selecting **Provision** in the **Lifecycle** section\n* Select **Preview in Copilot (Edge)** or **Preview in Copilot (Chrome)** from the launch configuration dropdown, or use **Debug in Microsoft 365 Agents Playground** for local testing\n* Once the agent is loaded, you can ask questions like:\n - \"Show me programming tutorials\"\n - \"I want to learn JavaScript\"\n - \"Git tutorials for beginners\"\n* The agent will respond with programming tutorials and you can interact with action buttons:\n - **Watch Video** - Opens YouTube embed in a large dialog\n - **Interactive Quiz** - Opens custom HTML quiz with instant feedback\n\n## Features\n\nThis sample illustrates the following concepts for Microsoft 365 Copilot declarative agents:\n\n* **Action.OpenUrlDialog** - Opens URLs in modal dialogs within Microsoft 365 Copilot without leaving the chat interface\n\n### What is Action.OpenUrlDialog?\n\n`Action.OpenUrlDialog` is a new Adaptive Card action (v1.5+) that opens a URL in a modal dialog within Microsoft 365 Copilot, providing an integrated experience without leaving the chat interface.\n\n**Key Characteristics:**\n- Opens URLs in modal dialogs within Copilot\n- Supports custom dialog sizes (width/height in px or predefined: small, medium, large)\n- Requires URLs to be whitelisted in `validDomains` in manifest.json\n- Works with YouTube embeds, custom HTML pages, and other web content\n\n### Interaction Flow\n\n**Step 1: Ask for tutorials**\n```\nUser: \"Show me programming tutorials\"\n```\n\n**Step 2: Browse learning resources**\nThe agent returns adaptive cards showing:\n- Topic name (Node.js, JavaScript, Git)\n- Difficulty level and duration\n- Description\n- Two action buttons\n\n**Step 3: Watch Video**\nClick \"Watch Video\" button:\n- Opens YouTube embed in a large dialog\n- Shows official Microsoft tutorial videos\n- Supports fullscreen playback\n\n**Step 4: Take Interactive Quiz**\nClick \"Interactive Quiz\" button:\n- Opens custom HTML quiz in dialog (700px height)\n- 3 questions with multiple choice options\n- Instant feedback with explanations\n- Progress bar showing completion\n- Final score and key takeaways\n- Option to retake quiz\n\n\n## Help\n\nWe do not support samples, but this community is always willing to help, and we want to improve these samples. We use GitHub to track issues, which makes it easy for community members to volunteer their time and help resolve issues.\n\nYou can try looking at [issues related to this sample](https://github.com/pnp/copilot-pro-dev-samples/issues?q=label%3A%22sample%3A%20da-adaptive-card-dialog-js%22) to see if anybody else is having the same issues.\n\nIf you encounter any issues using this sample, [create a new issue](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\nFinally, if you have an idea for improvement, [make a suggestion](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n\n## Further reading\n\n- [Action.OpenUrlDialog Documentation](https://learn.microsoft.com/en-us/microsoft-365-copilot/extensibility/adaptive-card-dialog-box)\n- [Build declarative agents for Microsoft 365 Copilot](https://learn.microsoft.com/microsoft-365-copilot/extensibility/overview-declarative-agent)\n- [Adaptive Cards Schema Explorer](https://adaptivecards.io/explorer/)\n- [API Plugins for Microsoft 365 Copilot](https://learn.microsoft.com/microsoft-365-copilot/extensibility/overview-api-plugins)\n\n\n\n---" + }, + { + "folder": "da-adaptive-card-dialog-python", + "title": "Adaptive Card Dialog (Python)", + "description": "A declarative agent demonstrating how to open YouTube videos and interactive HTML quizzes in dialog boxes from Adaptive Cards in Microsoft 365 Copilot", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-adaptive-card-dialog-python", + "updatedAt": "2026-04-20T00:00:00.000Z", + "longDescription": [ + "This sample demonstrates how to open YouTube videos and interactive HTML quizzes in dialog boxes from Adaptive Cards within a Microsoft 365 Copilot declarative agent. Users can discover programming learning resources (Node.js, JavaScript, Git), watch embedded video tutorials, and take interactive quizzes—all from within the Copilot interface. The sample showcases Action.OpenUrlDialog from Adaptive Cards, a Python Azure Functions backend, and API Plugin integration." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Copilot" + }, + { + "key": "LANGUAGE", + "value": "Python" + }, + { + "key": "API-PLUGIN", + "value": "Yes" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://raw.githubusercontent.com/pnp/copilot-pro-dev-samples/refs/heads/main/samples/da-adaptive-card-dialog-python/assets/AdaptiveCardsDialogBox.gif", + "imageAlt": "Adaptive Card Dialog Box for Microsoft 365 Copilot Sample", + "readmeContent": "\n# Adaptive Card Dialog (Python)\n\n## Summary\n\nThis sample demonstrates how to open dialog boxes from Adaptive Cards in a Microsoft 365 Copilot declarative agent. Users can browse programming tutorials for Node.js, JavaScript, and Git, watch official Microsoft video tutorials embedded in dialog boxes, and take interactive quizzes with instant feedback—all within the Copilot interface.\n\nThe sample showcases Action.OpenUrlDialog from Adaptive Cards v1.5, Python Azure Functions backend, and API Plugin integration.\n\n\"Adaptive\n\n\n## Version history\n\nVersion|Date|Author|Comments\n-------|----|----|--------\n1.0|April 20, 2026|[YugalPradhan31](https://github.com/YugalPradhan31)|Initial release\n\n## Prerequisites\n\n* [Microsoft 365 account with Copilot access](https://www.microsoft.com/microsoft-365/enterprise/copilot-for-microsoft-365)\n* [Python](https://www.python.org/downloads/) version 3.10 or later\n* [Azure Functions Core Tools](https://learn.microsoft.com/azure/azure-functions/functions-run-local) v4\n* [Visual Studio Code](https://code.visualstudio.com/)\n* [Microsoft 365 Agents Toolkit for VS Code](https://marketplace.visualstudio.com/items?itemName=TeamsDevApp.ms-teams-vscode-extension)\n* [Dev tunnels CLI](https://learn.microsoft.com/azure/developer/dev-tunnels/get-started) for local development\n\n## Minimal Path to Awesome\n\n* Clone this repository (or download this solution as a .ZIP file then unzip it)\n ```bash\n git clone https://github.com/pnp/copilot-pro-dev-samples.git\n cd copilot-pro-dev-samples/samples/da-adaptive-card-dialog-python\n ```\n* Open the project in Visual Studio Code\n* Select the **Microsoft 365 Agents Toolkit** icon on the left in the VS Code toolbar\n* In the **Account** section, sign in with your Microsoft 365 account if you haven't already\n* Install Python dependencies:\n ```bash\n pip install -r requirements.txt\n ```\n* Create Teams app by selecting **Provision** in the **Lifecycle** section\n* Select **Preview in Copilot (Edge)** or **Preview in Copilot (Chrome)** from the launch configuration dropdown, or use **Debug in Microsoft 365 Agents Playground** for local testing\n* Once the agent is loaded, you can ask questions like:\n - \"Show me programming tutorials\"\n - \"I want to learn JavaScript\"\n - \"Git tutorials for beginners\"\n* The agent will respond with programming tutorials and you can interact with action buttons:\n - **Watch Video** - Opens YouTube embed in a large dialog\n - **Interactive Quiz** - Opens custom HTML quiz with instant feedback\n\n## Features\n\nThis sample illustrates the following concepts for Microsoft 365 Copilot declarative agents:\n\n* **Action.OpenUrlDialog** - Opens URLs in modal dialogs within Microsoft 365 Copilot without leaving the chat interface\n\n### What is Action.OpenUrlDialog?\n\n`Action.OpenUrlDialog` is a new Adaptive Card action (v1.5+) that opens a URL in a modal dialog within Microsoft 365 Copilot, providing an integrated experience without leaving the chat interface.\n\n**Key Characteristics:**\n- Opens URLs in modal dialogs within Copilot\n- Supports custom dialog sizes (width/height in px or predefined: small, medium, large)\n- Requires URLs to be whitelisted in `validDomains` in manifest.json\n- Works with YouTube embeds, custom HTML pages, and other web content\n\n### Interaction Flow\n\n**Step 1: Ask for tutorials**\n```\nUser: \"Show me programming tutorials\"\n```\n\n**Step 2: Browse learning resources**\nThe agent returns adaptive cards showing:\n- Topic name (Node.js, JavaScript, Git)\n- Difficulty level and duration\n- Description\n- Two action buttons\n\n**Step 3: Watch Video**\nClick \"Watch Video\" button:\n- Opens YouTube embed in a large dialog\n- Shows official Microsoft tutorial videos\n- Supports fullscreen playback\n\n**Step 4: Take Interactive Quiz**\nClick \"Interactive Quiz\" button:\n- Opens custom HTML quiz in dialog (800px height)\n- 3 questions with multiple choice options\n- Instant feedback with explanations\n- Progress bar showing completion\n- Final score and key takeaways\n- Option to retake quiz\n\n\n## Help\n\nWe do not support samples, but this community is always willing to help, and we want to improve these samples. We use GitHub to track issues, which makes it easy for community members to volunteer their time and help resolve issues.\n\nYou can try looking at [issues related to this sample](https://github.com/pnp/copilot-pro-dev-samples/issues?q=label%3A%22sample%3A%20da-adaptive-card-dialog-python%22) to see if anybody else is having the same issues.\n\nIf you encounter any issues using this sample, [create a new issue](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\nFinally, if you have an idea for improvement, [make a suggestion](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n\n## Further reading\n\n- [Action.OpenUrlDialog Documentation](https://learn.microsoft.com/en-us/microsoft-365-copilot/extensibility/adaptive-card-dialog-box)\n- [Build declarative agents for Microsoft 365 Copilot](https://learn.microsoft.com/microsoft-365-copilot/extensibility/overview-declarative-agent)\n- [Adaptive Cards Schema Explorer](https://adaptivecards.io/explorer/)\n- [API Plugins for Microsoft 365 Copilot](https://learn.microsoft.com/microsoft-365-copilot/extensibility/overview-api-plugins)\n\n\n\n---" + }, + { + "folder": "da-adaptive-card-inline-edit-csharp", + "title": "Adaptive Card Inline Edit", + "description": "A declarative agent demonstrating inline editing of Adaptive Card responses in Microsoft 365 Copilot", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-adaptive-card-inline-edit-csharp", + "updatedAt": "2026-01-20T00:00:00.000Z", + "longDescription": [ + "This sample demonstrates how to allow inline editing of Adaptive Card responses in a Microsoft 365 Copilot declarative agent. Users can view car repair records, edit fields directly within the card (title, assigned technician), and submit updates—all without leaving the Copilot interface. The sample showcases Action.Execute from Adaptive Cards v1.5, stateful card updates, Azure Functions backend, and API Plugin integration." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Copilot" + }, + { + "key": "LANGUAGE", + "value": "C#" + }, + { + "key": "API-PLUGIN", + "value": "Yes" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://raw.githubusercontent.com/pnp/copilot-pro-dev-samples/refs/heads/main/samples/da-adaptive-card-inline-edit-csharp/assets/AdaptiveCardsInlineEdit.gif", + "imageAlt": "Adaptive Card Inline Edit for Microsoft 365 Copilot Sample", + "readmeContent": "# Adaptive Card Inline Edit\n\n## Summary\n\nThis sample demonstrates how to allow inline editing of Adaptive Card responses in a Microsoft 365 Copilot declarative agent. Users can view car repair records, edit fields directly within the card (title, assigned technician), and submit updates—all without leaving the Copilot interface.\n\nThe sample showcases Action.Execute from Adaptive Cards v1.5, stateful card updates, Azure Functions backend, and API Plugin integration.\n\n\"Adaptive\n\n## Prerequisites\n\n* [Microsoft 365 account with Copilot access](https://www.microsoft.com/microsoft-365/enterprise/copilot-for-microsoft-365)\n* [.NET 10 SDK](https://dotnet.microsoft.com/download/dotnet/10.0)\n* [Azure Functions Core Tools v4](https://learn.microsoft.com/azure/azure-functions/functions-run-tools)\n* [Visual Studio 2022](https://aka.ms/vs) 17.11 or higher\n* [Microsoft 365 Agents Toolkit for Visual Studio](https://aka.ms/install-teams-toolkit-vs)\n\n## Minimal Path to Awesome\n\n* Clone this repository (or download this solution as a .ZIP file then unzip it)\n* Open **AdaptiveCardInlineEdit.slnx** in Visual Studio\n\n### How to add your own API Key\n\n1. Open PowerShell, change the current working directory to this project root, and run:\n ```powershell\n ./M365Agent/GenerateApiKey.ps1\n ```\n2. The above command will output something like \"Generated a new API Key: xxx...\"\n3. Fill in API Key into `M365Agent/env/.env.*.user`:\n ```\n SECRET_API_KEY=\n ```\n\n### Start the app\n\n1. If you haven't added your own API Key, please follow the above steps to add your own API Key.\n2. In the debug dropdown menu, select **Dev Tunnels > Create a Tunnel** (set authentication type to Public) or select an existing public dev tunnel\n3. Right-click the **M365Agent** project in Solution Explorer and select **Microsoft 365 Agents Toolkit > Select Microsoft 365 Account**\n4. Sign in to Microsoft 365 Agents Toolkit with a **Microsoft 365 work or school account**\n5. Press **F5**, or select **Debug > Start Debugging** in Visual Studio to start your app\n6. When Teams launches in the browser, click the **Apps** icon from the Teams client left rail to open the Teams app store and search for **Copilot**\n7. Open the **Copilot** app, select **Plugins**, and from the list of plugins, turn on the toggle for your plugin\n8. Once the agent is loaded, you can ask questions like:\n - \"Show repair records assigned to Issac Fielder\"\n - \"Show me all car repair records\"\n - \"List repairs assigned to Karin Blair\"\n9. The agent will respond with repair records in Adaptive Cards. You can:\n - View repair details (ID, title, assignee, date)\n - Edit the **Title** and **Assigned To** fields directly in the card\n - Click the **Update** button to save changes\n - See a success confirmation with the updated values\n\n> **Note:** Please make sure to switch to New Teams when Teams web client has launched.\n\n## Features\n\nThis sample illustrates the following concepts for Microsoft 365 Copilot declarative agents:\n\n* **Action.Execute** - Enables inline editing and stateful updates of Adaptive Cards within Microsoft 365 Copilot\n* **Input Controls** - Uses Input.Text fields within Adaptive Cards to collect user edits\n* **Dynamic Card Updates** - Returns updated Adaptive Cards based on API responses, creating seamless interactions\n\n### What is Action.Execute?\n\n`Action.Execute` is an Adaptive Card action (v1.5+) that sends structured data payloads to your API and dynamically updates the card based on the response, enabling stateful, interactive experiences within Microsoft 365 Copilot.\n\n**Key Characteristics:**\n- Sends collected input data from card fields to your API endpoint\n- Receives and renders an updated Adaptive Card in response\n- Enables inline editing without leaving the chat interface\n- Supports complex interactions like form submissions, record updates, and multi-step workflows\n- Identified by a `verb` property that maps to your API operation\n\n### Interaction Flow\n\n**Step 1: Ask for repair records**\n```\nUser: \"Show repair records assigned to Issac Fielder\"\n```\n\n**Step 2: View repair records**\nThe agent returns Adaptive Cards showing:\n- Repair ID\n- Editable title field (Input.Text)\n- Editable assignee field (Input.Text)\n- Repair date\n- **Update** action button\n\n**Step 3: Edit fields inline**\nUser can:\n- Click on the Title field and modify the repair description\n- Click on the Assigned To field and change the technician name\n- Make multiple edits before submitting\n\n**Step 4: Submit update**\nClick the \"Update\" button:\n- Action.Execute sends the form data to the `updateRepair` API endpoint\n- The verb `updateRepair` maps to the PATCH `/repairs/{id}` operation\n- Backend updates the repair record in the data store\n\n**Step 5: See confirmation**\nThe card refreshes with:\n- Success message: \"Repair updated successfully\"\n- Updated repair details displayed in the card\n- Same edit fields available for further changes\n- The Update button remains available for additional edits\n\n## Further reading\n\n- [Action.Execute Documentation](https://learn.microsoft.com/microsoft-365-copilot/extensibility/adaptive-card-edits)\n- [Build declarative agents for Microsoft 365 Copilot](https://learn.microsoft.com/microsoft-365-copilot/extensibility/overview-declarative-agent)\n- [Adaptive Cards Schema Explorer](https://adaptivecards.io/explorer/)\n- [API Plugins for Microsoft 365 Copilot](https://learn.microsoft.com/microsoft-365-copilot/extensibility/overview-api-plugins)\n- [Declarative agents for Microsoft 365](https://aka.ms/teams-toolkit-declarative-agent)\n" + }, + { + "folder": "da-adaptive-card-inline-edit-js", + "title": "Adaptive Card Inline Edit", + "description": "A declarative agent demonstrating inline editing of Adaptive Card responses in Microsoft 365 Copilot", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-adaptive-card-inline-edit-js", + "updatedAt": "2026-01-20T00:00:00.000Z", + "longDescription": [ + "This sample demonstrates how to allow inline editing of Adaptive Card responses in a Microsoft 365 Copilot declarative agent. Users can view car repair records, edit fields directly within the card (title, assigned technician), and submit updates—all without leaving the Copilot interface. The sample showcases Action.Execute from Adaptive Cards v1.5, stateful card updates, Azure Functions backend, and API Plugin integration." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Copilot" + }, + { + "key": "LANGUAGE", + "value": "JavaScript" + }, + { + "key": "API-PLUGIN", + "value": "Yes" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://raw.githubusercontent.com/pnp/copilot-pro-dev-samples/refs/heads/main/samples/da-adaptive-card-inline-edit-js/assets/AdaptiveCardsInlineEdit.gif", + "imageAlt": "Adaptive Card Inline Edit for Microsoft 365 Copilot Sample", + "readmeContent": "\n# Adaptive Card Inline Edit\n\n## Summary\n\nThis sample demonstrates how to allow inline editing of Adaptive Card responses in a Microsoft 365 Copilot declarative agent. Users can view car repair records, edit fields directly within the card (title, assigned technician), and submit updates—all without leaving the Copilot interface.\n\nThe sample showcases Action.Execute from Adaptive Cards v1.5, stateful card updates, Azure Functions backend, and API Plugin integration.\n\n\"Adaptive\n\n\n## Version history\n\nVersion|Date|Author|Comments\n-------|----|----|--------\n1.0|January 20, 2026|[Harikrishnan-MSFT](https://github.com/Harikrishnan-MSFT)|Initial release\n\n## Prerequisites\n\n* [Microsoft 365 account with Copilot access](https://www.microsoft.com/microsoft-365/enterprise/copilot-for-microsoft-365)\n* [Node.js](https://nodejs.org) version 20.x or 22.x\n* [Visual Studio Code](https://code.visualstudio.com/)\n* [Microsoft 365 Agents Toolkit for VS Code](https://marketplace.visualstudio.com/items?itemName=TeamsDevApp.ms-teams-vscode-extension)\n* [Dev tunnels CLI](https://learn.microsoft.com/azure/developer/dev-tunnels/get-started) for local development\n\n## Minimal Path to Awesome\n\n* Clone this repository (or download this solution as a .ZIP file then unzip it)\n ```bash\n git clone https://github.com/pnp/copilot-pro-dev-samples.git\n cd copilot-pro-dev-samples/samples/da-adaptive-card-inline-edit-js\n ```\n* Open the project in Visual Studio Code\n* Select the **Microsoft 365 Agents Toolkit** icon on the left in the VS Code toolbar\n* In the **Account** section, sign in with your Microsoft 365 account if you haven't already\n* Create Teams app by selecting **Provision** in the **Lifecycle** section\n* Select **Preview in Copilot (Edge)** or **Preview in Copilot (Chrome)** from the launch configuration dropdown, or use **Debug in Microsoft 365 Agents Playground** for local testing\n* Once the agent is loaded, you can ask questions like:\n - \"Show repair records assigned to Issac Fielder\"\n - \"Show me all car repair records\"\n - \"List repairs assigned to Karin Blair\"\n* The agent will respond with repair records in Adaptive Cards. You can:\n - View repair details (ID, title, assignee, date)\n - Edit the **Title** and **Assigned To** fields directly in the card\n - Click the **Update** button to save changes\n - See a success confirmation with the updated values\n\n### How to add your own API Key\n\n1. Open terminal and run command `npm install` to install all dependency packages\n\n ```bash\n npm install\n ```\n\n2. After `npm install` completed, run command `npm run keygen`\n ```bash\n npm run keygen\n ```\n3. The above command will output something like \"Generated a new API Key: xxx...\"\n4. Fill in API Key into `env/.env.*.user`\n ```\n SECRET_API_KEY=\n ```\n\n## Features\n\nThis sample illustrates the following concepts for Microsoft 365 Copilot declarative agents:\n\n* **Action.Execute** - Enables inline editing and stateful updates of Adaptive Cards within Microsoft 365 Copilot\n* **Input Controls** - Uses Input.Text fields within Adaptive Cards to collect user edits\n* **Dynamic Card Updates** - Returns updated Adaptive Cards based on API responses, creating seamless interactions\n\n### What is Action.Execute?\n\n`Action.Execute` is an Adaptive Card action (v1.5+) that sends structured data payloads to your API and dynamically updates the card based on the response, enabling stateful, interactive experiences within Microsoft 365 Copilot.\n\n**Key Characteristics:**\n- Sends collected input data from card fields to your API endpoint\n- Receives and renders an updated Adaptive Card in response\n- Enables inline editing without leaving the chat interface\n- Supports complex interactions like form submissions, record updates, and multi-step workflows\n- Identified by a `verb` property that maps to your API operation\n\n### Interaction Flow\n\n**Step 1: Ask for repair records**\n```\nUser: \"Show repair records assigned to Issac Fielder\"\n```\n\n**Step 2: View repair records**\nThe agent returns Adaptive Cards showing:\n- Repair ID\n- Editable title field (Input.Text)\n- Editable assignee field (Input.Text)\n- Repair date\n- **Update** action button\n\n**Step 3: Edit fields inline**\nUser can:\n- Click on the Title field and modify the repair description\n- Click on the Assigned To field and change the technician name\n- Make multiple edits before submitting\n\n**Step 4: Submit update**\nClick the \"Update\" button:\n- Action.Execute sends the form data to the `updateRepair` API endpoint\n- The verb `updateRepair` maps to the PATCH `/repairs/{id}` operation\n- Backend updates the repair record in the data store\n\n**Step 5: See confirmation**\nThe card refreshes with:\n- ✅ Success message: \"Repair updated successfully\"\n- Updated repair details displayed in the card\n- Same edit fields available for further changes\n- The Update button remains available for additional edits\n\n\n## Help\n\nWe do not support samples, but this community is always willing to help, and we want to improve these samples. We use GitHub to track issues, which makes it easy for community members to volunteer their time and help resolve issues.\n\nYou can try looking at [issues related to this sample](https://github.com/pnp/copilot-pro-dev-samples/issues?q=label%3A%22sample%3A%20da-adaptive-card-inline-edit-js%22) to see if anybody else is having the same issues.\n\nIf you encounter any issues using this sample, [create a new issue](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\nFinally, if you have an idea for improvement, [make a suggestion](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n\n## Further reading\n\n- [Action.Execute Documentation](https://learn.microsoft.com/microsoft-365-copilot/extensibility/adaptive-card-edits)\n- [Build declarative agents for Microsoft 365 Copilot](https://learn.microsoft.com/microsoft-365-copilot/extensibility/overview-declarative-agent)\n- [Adaptive Cards Schema Explorer](https://adaptivecards.io/explorer/)\n- [API Plugins for Microsoft 365 Copilot](https://learn.microsoft.com/microsoft-365-copilot/extensibility/overview-api-plugins)\n\n![](https://m365-visitor-stats.azurewebsites.net/copilot-pro-dev-samples/samples/da-adaptive-card-inline-edit-js)\n\n---" + }, + { + "folder": "da-adaptive-card-inline-edit-python", + "title": "Adaptive Card Inline Edit", + "description": "A declarative agent demonstrating inline editing of Adaptive Card responses in Microsoft 365 Copilot", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-adaptive-card-inline-edit-python", + "updatedAt": "2026-04-13T00:00:00.000Z", + "longDescription": [ + "This sample demonstrates how to allow inline editing of Adaptive Card responses in a Microsoft 365 Copilot declarative agent. Users can view car repair records, edit fields directly within the card (title, assigned technician), and submit updates—all without leaving the Copilot interface. The sample showcases Action.Execute from Adaptive Cards v1.5, stateful card updates, Python Azure Functions backend, and API Plugin integration." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Copilot" + }, + { + "key": "LANGUAGE", + "value": "Python" + }, + { + "key": "API-PLUGIN", + "value": "Yes" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://raw.githubusercontent.com/pnp/copilot-pro-dev-samples/refs/heads/main/samples/da-adaptive-card-inline-edit-python/assets/AdaptiveCardsInlineEdit.gif", + "imageAlt": "Adaptive Card Inline Edit for Microsoft 365 Copilot Sample", + "readmeContent": "\n# Adaptive Card Inline Edit\n\n## Summary\n\nThis sample demonstrates how to allow inline editing of Adaptive Card responses in a Microsoft 365 Copilot declarative agent. Users can view car repair records, edit fields directly within the card (title, assigned technician), and submit updates—all without leaving the Copilot interface.\n\nThe sample showcases Action.Execute from Adaptive Cards v1.5, stateful card updates, Python Azure Functions backend, and API Plugin integration.\n\n\"Adaptive\n\n\n## Version history\n\nVersion|Date|Author|Comments\n-------|----|----|--------\n1.0|April 13, 2026|[YugalPradhan31](https://github.com/YugalPradhan31)|Initial release\n\n## Prerequisites\n\n* [Microsoft 365 account with Copilot access](https://www.microsoft.com/microsoft-365/enterprise/copilot-for-microsoft-365)\n* [Python](https://www.python.org/downloads/) version 3.10 or later\n* [Azure Functions Core Tools](https://learn.microsoft.com/azure/azure-functions/functions-run-local) v4\n* [Visual Studio Code](https://code.visualstudio.com/)\n* [Microsoft 365 Agents Toolkit for VS Code](https://marketplace.visualstudio.com/items?itemName=TeamsDevApp.ms-teams-vscode-extension)\n* [Dev tunnels CLI](https://learn.microsoft.com/azure/developer/dev-tunnels/get-started) for local development\n\n## Minimal Path to Awesome\n\n* Clone this repository (or download this solution as a .ZIP file then unzip it)\n ```bash\n git clone https://github.com/pnp/copilot-pro-dev-samples.git\n cd copilot-pro-dev-samples/samples/da-adaptive-card-inline-edit-python\n ```\n* Open the project in Visual Studio Code\n* Select the **Microsoft 365 Agents Toolkit** icon on the left in the VS Code toolbar\n* In the **Account** section, sign in with your Microsoft 365 account if you haven't already\n* Create Teams app by selecting **Provision** in the **Lifecycle** section\n* Select **Preview in Copilot (Edge)** or **Preview in Copilot (Chrome)** from the launch configuration dropdown, or use **Debug in Microsoft 365 Agents Playground** for local testing\n* Once the agent is loaded, you can ask questions like:\n - \"Show repair records assigned to Issac Fielder\"\n - \"Show me all car repair records\"\n - \"List repairs assigned to Karin Blair\"\n* The agent will respond with repair records in Adaptive Cards. You can:\n - View repair details (ID, title, assignee, date)\n - Edit the **Title** and **Assigned To** fields directly in the card\n - Click the **Update** button to save changes\n - See a success confirmation with the updated values\n\n### How to add your own API Key\n\n1. Open terminal and run following command to install all dependency packages\n\n ```bash\n pip install -r requirements.txt\n ```\n\n2. After that, run command `python src/key_gen.py`\n ```bash\n python src/key_gen.py\n ```\n3. The above command will output something like \"Generated a new API Key: xxx...\"\n4. Fill in API Key into `env/.env.*.user`\n ```\n SECRET_API_KEY=\n ```\n\n## Features\n\nThis sample illustrates the following concepts for Microsoft 365 Copilot declarative agents:\n\n* **Action.Execute** - Enables inline editing and stateful updates of Adaptive Cards within Microsoft 365 Copilot\n* **Input Controls** - Uses Input.Text fields within Adaptive Cards to collect user edits\n* **Dynamic Card Updates** - Returns updated Adaptive Cards based on API responses, creating seamless interactions\n\n### What is Action.Execute?\n\n`Action.Execute` is an Adaptive Card action (v1.5+) that sends structured data payloads to your API and dynamically updates the card based on the response, enabling stateful, interactive experiences within Microsoft 365 Copilot.\n\n**Key Characteristics:**\n- Sends collected input data from card fields to your API endpoint\n- Receives and renders an updated Adaptive Card in response\n- Enables inline editing without leaving the chat interface\n- Supports complex interactions like form submissions, record updates, and multi-step workflows\n- Identified by a `verb` property that maps to your API operation\n\n### Interaction Flow\n\n**Step 1: Ask for repair records**\n```\nUser: \"Show repair records assigned to Issac Fielder\"\n```\n\n**Step 2: View repair records**\nThe agent returns Adaptive Cards showing:\n- Repair ID\n- Editable title field (Input.Text)\n- Editable assignee field (Input.Text)\n- Repair date\n- **Update** action button\n\n**Step 3: Edit fields inline**\nUser can:\n- Click on the Title field and modify the repair description\n- Click on the Assigned To field and change the technician name\n- Make multiple edits before submitting\n\n**Step 4: Submit update**\nClick the \"Update\" button:\n- Action.Execute sends the form data to the `updateRepair` API endpoint\n- The verb `updateRepair` maps to the PATCH `/repairs/{id}` operation\n- Backend updates the repair record in the data store\n\n**Step 5: See confirmation**\nThe card refreshes with:\n- ✅ Success message: \"Repair updated successfully\"\n- Updated repair details displayed in the card\n- Same edit fields available for further changes\n- The Update button remains available for additional edits\n\n\n## Help\n\nWe do not support samples, but this community is always willing to help, and we want to improve these samples. We use GitHub to track issues, which makes it easy for community members to volunteer their time and help resolve issues.\n\nYou can try looking at [issues related to this sample](https://github.com/pnp/copilot-pro-dev-samples/issues?q=label%3A%22sample%3A%20da-adaptive-card-inline-edit-python%22) to see if anybody else is having the same issues.\n\nIf you encounter any issues using this sample, [create a new issue](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\nFinally, if you have an idea for improvement, [make a suggestion](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n\n## Further reading\n\n- [Action.Execute Documentation](https://learn.microsoft.com/microsoft-365-copilot/extensibility/adaptive-card-edits)\n- [Build declarative agents for Microsoft 365 Copilot](https://learn.microsoft.com/microsoft-365-copilot/extensibility/overview-declarative-agent)\n- [Adaptive Cards Schema Explorer](https://adaptivecards.io/explorer/)\n- [API Plugins for Microsoft 365 Copilot](https://learn.microsoft.com/microsoft-365-copilot/extensibility/overview-api-plugins)\n\n![](https://m365-visitor-stats.azurewebsites.net/copilot-pro-dev-samples/samples/da-adaptive-card-inline-edit-python)\n\n---" + }, + { + "folder": "da-azureopenai", + "title": "Call chat completions from Azure Open AI - No code!", + "description": "This sample demonstrates how to build a declarative agent for Microsoft 365 Copilot that allows you to call Azure Open AI endpoint without any code.", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-azureopenai", + "updatedAt": "2025-05-10T00:00:00.000Z", + "longDescription": [ + "This sample demonstrates how to build a declarative agent for Microsoft 365 Copilot that allows you to call Azure Open AI endpoint without any code. The agent is built using the Microsoft Teams Toolkit." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "No" + }, + { + "key": "LANGUAGE", + "value": "No" + }, + { + "key": "API-PLUGIN", + "value": "Yes" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://github.com/pnp/copilot-pro-dev-samples/raw/main/samples/da-azureopenai/assets/Query_AzureOpenAPI.gif", + "imageAlt": "Call chat completions from Azure Open AI - No code!", + "readmeContent": "# Overview of the basic declarative agent with API plugin template\n\n## Build a basic declarative agent with API plugin\n\nWith the declarative agent, you can build a custom version of Copilot that can be used for specific scenarios, such as for specialized knowledge, implementing specific processes, or simply to save time by reusing a set of AI prompts. For example, a grocery shopping Copilot declarative agent can be used to create a grocery list based on a meal plan that you send to Copilot.\n\nYou can extend declarative agents using plugins to retrieve data and execute tasks on external systems. A declarative agent can utilize multiple plugins at the same time.\n\n![image](https://github.com/user-attachments/assets/9939972e-0449-410c-b237-d9d748cd6628)\n\n\n## Get started with the template\n\n> **Prerequisites**\n>\n> To run this app template in your local dev machine, you will need:\n>\n> - [Node.js](https://nodejs.org/), supported versions: 18, 20, 22\n> - A [Microsoft 365 account for development](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts).\n> - [Teams Toolkit Visual Studio Code Extension](https://aka.ms/teams-toolkit) version 5.0.0 and higher or [Teams Toolkit CLI](https://aka.ms/teamsfx-toolkit-cli)\n> - [Microsoft 365 Copilot license](https://learn.microsoft.com/microsoft-365-copilot/extensibility/prerequisites#prerequisites)\n> - [Azure AI Services]\n\n## Minimal path to awesome\n\n1. Clone this repository (or [download this solution as a .ZIP file](https://pnp.github.io/download-partial/?url=https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-da-azureopenai) then unzip it)\n\n2. Get a copy your Endpoint URL and KEY from the Azure OpenAI resource:\n\n - Go to [Azure portal](https://portal.azure.com/)\n - Find or create your instance under **Azure OpenAI** resource\n - Create a deployment, e.g 'gpt-4o'\n - Under **Overview**, copy the **Azure OpenAI** endpoint value. It should look like `https://.openai.azure.com//`\n - Under **Keys and Endpoint**, copy the **KEY 1** value\n\n3. In the [Teams developer portal](https://dev.teams.microsoft.com/) under **Tools**, create a new **API Key registration** with the following information:\n\n * **API key**: Add a secret with the Azure OpenAI Key you copied in step 2\n * **API key name**: e.g., Azure OpenAI Key Name\n * **Base URL**: The Azure OpenAI Endpoint URL you copied in step 2\n * **Target tenant**: Home tenant\n * **Restrict usage by app**: Any Teams app (when agent is deployed, use the Teams app ID)\n\nSave the information. A new **API key registration ID** will be generated. Copy the key.\n\n4. Rename the `.env.dev.example` file to `.env.dev` and update the following values:\n\nReplace {keyAPIRegistration} with the key copied in previous step\n\n ```bash\n # Built-in environment variables\n TEAMSFX_ENV=dev\n APP_NAME_SUFFIX=dev\n\n # Generated during provision, you can also add your own variables.\n TEAMS_APP_ID=\n TEAMS_APP_TENANT_ID=\n M365_TITLE_ID=\n M365_APP_ID=\n\n # Update own variables.\n APIKEYAUTH_REGISTRATION_ID={keyAPIRegistration}\n MODEL=gpt-4o\n API_VERSION=2025-01-01-preview\n TEMPERATURE=0.7\n MAX_TOKENS=800\n TOP_P=0.95\n FREQUENCY_PENALTY=0\n PRESENCE_PENALTY=0\n ```\n5. Update the instruction.txt as appropriate for your use case.\n6. Update OpenAI Spec Server API URL in `appPackage\\apiSpecificationFile\\openapi.yaml`\n\nTo ensure the OpenAPI specification correctly references your Azure OpenAI resource, update the server URL in the OpenAPI spec. This step is crucial for aligning the API calls with your deployed model and endpoint configuration.\n\nReplace the placeholder server URL with the actual endpoint URL of your Azure OpenAI resource. For example:\n\n```yaml\nservers:\n - url: https://.openai.azure.com\n description: Azure OpenAI service endpoint\n```\n\n7. From Teams Toolkit, sign-in to your Microsoft 365 account.\n8. From Teams Toolkit, provision the solution to create the Teams app.\n9. Go to [https://www.office.com/chat?auth=2](https://www.office.com/chat?auth=2) URL and enable the developer mode by using the `-developer on` prompt.\n10. Use one of the conversation starters to start the agent.\n\n## What's included in the template\n\n| Folder | Contents |\n| ------------ | -------------------------------------------- |\n| `.vscode` | VSCode files for debugging |\n| `appPackage` | Templates for the Teams application manifest, the plugin manifest and the API specification |\n| `env` | Environment files |\n\nThe following files can be customized and demonstrate an example implementation to get you started.\n\n| File | Contents |\n| ------------------------------------ | ------------------------------------------------------------------------------ |\n| `appPackage/declarativeCopilot.json` | Define the behaviour and configurations of the declarative agent. |\n| `appPackage/manifest.json` | Teams application manifest that defines metadata for your declarative agent. |\n\nThe following are Teams Toolkit specific project files. You can [visit a complete guide on Github](https://github.com/OfficeDev/TeamsFx/wiki/Teams-Toolkit-Visual-Studio-Code-v5-Guide#overview) to understand how Teams Toolkit works.\n\n| File | Contents |\n| -------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |\n| `teamsapp.yml` | This is the main Teams Toolkit project file. The project file defines two primary things: Properties and configuration Stage definitions. |\n\n## Addition information and references\n\n- [Declarative agents for Microsoft 365](https://aka.ms/teams-toolkit-declarative-agent)\n- [Extend Microsoft 365 Copilot](https://aka.ms/teamsfx-copilot-plugin)\n- [Message extensions for Microsoft 365 Copilot](https://learn.microsoft.com/microsoft-365-copilot/extensibility/overview-message-extension-bot)\n- [Microsoft Graph Connectors for Microsoft 365 Copilot](https://learn.microsoft.com/microsoft-365-copilot/extensibility/overview-graph-connector)\n- [Microsoft 365 Copilot extensibility samples](https://learn.microsoft.com/microsoft-365-copilot/extensibility/samples)\n\n" + }, + { + "folder": "da-BlogPostHelper", + "title": "Blog Post Helper Declarative Agent for Microsoft 365 Copilot Sample", + "description": "Blog post helper declarative agent to help in the creation process.", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-BlogPostHelper", + "updatedAt": "2025-01-06T00:00:00.000Z", + "longDescription": [ + "The \"Blog Post Helper agent\" Declarative Agent is an open-source AI-driven tool designed to assist people in the creation process of blog posts. In my journey with Microsoft 365 technologies, I write blog posts to share my knowledge. Recently, I explored creating an AI agent with Microsoft 365 Copilot to assist in content creation. As an MVP, I often write late at night, so an AI helper can kickstart my blog posts, generate imagery or check my paragraphs." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Node.js" + }, + { + "key": "LANGUAGE", + "value": "TypeScript" + }, + { + "key": "API-PLUGIN", + "value": "No" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://raw.githubusercontent.com/pnp/copilot-pro-dev-samples/refs/heads/main/samples/da-BlogPostHelper/assets/screenshot.png", + "imageAlt": "Blog Post Helper Declarative Agent for Microsoft 365 Copilot Sample", + "readmeContent": "# Overview of the Blog Post Helper Declarative Agent sample\n\nThis sample helps users that often create blog post to help with elements of the creation process to get posts created quicker using capabilities within Declarative Agents.\n\nCommon features that the agent can help with:\n\n - Suggest an introduction based on a topic\n - Generate blog post header imagery - based on tools of “Microsoft Designer” to generate AI image headers to represent an article in the interest of speed. \n - Review existing articles, or Find content that I would reference quickly.\n\nThis is based off the blog post: [Building a blog post helper agent for Microsoft 365 Copilot | pkbullock.com](https://pkbullock.com/blog/2025/building-a-blog-post-helper-agent-for-microsoft-365-copilot)\n\n![Screenshot of the agent start screen](assets/screenshot.png)\n\n## Version history\n\nVersion|Date|Author|Comments\n-------|----|----|--------\n1.0|January 6th, 2025| Paul Bullock |Initial release\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n---\n\n## Minimal Path to Awesome\n\n_Include consise instructions to set up and run the sample. These are just an example!_\n\n* Clone this repository\n* Open the cloned copy of this folder with Visual Studio Code\n* Ensure that the Teams Toolkit extension is installed and connected to a Microsoft 365 account that has a Microsoft 365 Copilot license and permission to install Microsoft 365 applications\n* Open the Teams Toolkit extension and, under \"Lifecycle\" clik \"Provision\" to deploy the agent to Microsoft 365\n* Use the conversation starters to see the results of agent working on the content.\n\nNote: currently targets authors website: https://pkbullock.com; you can change this by editing the **appPackage/declarativeAgent.json** file.\n\n-----------------------------------------------------------\n\n# Using the Teams Toolkit Declarative Agent template\n\nWith the declarative agent, you can build a custom version of Copilot that can be used for specific scenarios, such as for specialized knowledge, implementing specific processes, or simply to save time by reusing a set of AI prompts. For example, a grocery shopping Copilot declarative agent can be used to create a grocery list based on a meal plan that you send to Copilot.\n\n## Get started with the template\n\n> **Prerequisites**\n>\n> To run this app template in your local dev machine, you will need:\n>\n> - [Node.js](https://nodejs.org/), supported versions: 18, 20\n> - A [Microsoft 365 account for development](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts).\n> - [Teams Toolkit Visual Studio Code Extension](https://aka.ms/teams-toolkit) version 5.0.0 and higher or [Teams Toolkit CLI](https://aka.ms/teamsfx-toolkit-cli)\n> - [Microsoft 365 Copilot license](https://learn.microsoft.com/microsoft-365-copilot/extensibility/prerequisites#prerequisites)\n\n![image](https://github.com/user-attachments/assets/e1c2a3b3-2e59-4e9b-8335-19315e92ba30)\n\n1. First, select the Teams Toolkit icon on the left in the VS Code toolbar.\n2. In the Account section, sign in with your [Microsoft 365 account](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts) if you haven't already.\n3. Create Teams app by clicking `Provision` in \"Lifecycle\" section.\n4. Select `Preview in Copilot (Edge)` or `Preview in Copilot (Chrome)` from the launch configuration dropdown.\n5. Once the Copilot app is loaded in the browser, click on the \"…\" menu and select \"Copilot chats\". You will see your declarative agent on the right rail. Clicking on it will change the experience to showcase the logo and name of your declarative agent.\n6. Ask a question to your declarative agent and it should respond based on the instructions provided.\n\n## What's included in the template\n\n| Folder | Contents |\n| ------------ | ---------------------------------------------------------------------------------------- |\n| `.vscode` | VSCode files for debugging |\n| `appPackage` | Templates for the Teams application manifest, the GPT manifest and the API specification |\n| `env` | Environment files |\n\nThe following files can be customized and demonstrate an example implementation to get you started.\n\n| File | Contents |\n| ---------------------------------- | ---------------------------------------------------------------------------- |\n| `appPackage/declarativeAgent.json` | Define the behaviour and configurations of the declarative agent. |\n| `appPackage/manifest.json` | Teams application manifest that defines metadata for your declarative agent. |\n\nThe following are Teams Toolkit specific project files. You can [visit a complete guide on Github](https://github.com/OfficeDev/TeamsFx/wiki/Teams-Toolkit-Visual-Studio-Code-v5-Guide#overview) to understand how Teams Toolkit works.\n\n| File | Contents |\n| -------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |\n| `teamsapp.yml` | This is the main Teams Toolkit project file. The project file defines two primary things: Properties and configuration Stage definitions. |\n\n## Extend the template\n\n- [Add conversation starters](https://learn.microsoft.com/microsoft-365-copilot/extensibility/build-declarative-agents?tabs=ttk&tutorial-step=3): Conversation starters are hints that are displayed to the user to demonstrate how they can get started using the declarative agent.\n- [Add web content](https://learn.microsoft.com/microsoft-365-copilot/extensibility/build-declarative-agents?tabs=ttk&tutorial-step=4) for the ability to search web information.\n- [Add OneDrive and SharePoint content](https://learn.microsoft.com/microsoft-365-copilot/extensibility/build-declarative-agents?tabs=ttk&tutorial-step=5) as grounding knowledge for the agent.\n- [Add Microsoft Graph connectors content](https://learn.microsoft.com/microsoft-365-copilot/extensibility/build-declarative-agents?tabs=ttk&tutorial-step=6) to ground agent with enterprise knowledge.\n- [Add API plugins](https://learn.microsoft.com/microsoft-365-copilot/extensibility/build-declarative-agents?tabs=ttk&tutorial-step=7) for agent to interact with REST APIs.\n\n## Addition information and references\n\n- [Declarative agents for Microsoft 365](https://aka.ms/teams-toolkit-declarative-agent)\n\n\n" + }, + { + "folder": "da-CanvasStudent", + "title": "Canvas Student", + "description": "Canvas Student is a learning assistant to help you interact with your Canvas LMS. This agent sample enables learners to interact with their courses using Microsoft 365 Copilot or Copilot Chat. Canvas Student empowers students to search through course content, generate ideas for learning, and improve the overall learning experience.", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-CanvasStudent", + "updatedAt": "2025-06-23T00:00:00.000Z", + "longDescription": [ + "Canvas Student is a learning assistant to help you interact with your Canvas LMS. This agent sample enables learners to interact with their courses using Microsoft 365 Copilot or Copilot Chat. Canvas Student empowers students to search through course content, generate ideas for learning, and improve the overall learning experience." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Node.js" + }, + { + "key": "LANGUAGE", + "value": "TypeScript" + }, + { + "key": "API-PLUGIN", + "value": "Yes" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://github.com/pnp/copilot-pro-dev-samples/raw/main/samples/da-CanvasStudent/assets/CanvasStudent1.png", + "imageAlt": "Canvas Student in BizChat and Copilot Chat", + "readmeContent": "# Canvas Student declarative agent with API Plugin\n\n## Summary\n\nThe Canvas Student agent is an AI-powered assistant integrating Microsoft 365 Copilot or Copilot Chat and the Canvas Learning Management System (LMS). It enables learners to combine information in Canvas with unique M365 apps capabilities. Learners can retrieve courses, modules, assignments, pages, announcements, and discussions from Canvas, and leverage features in M365 apps like BizChat, Word, and PowerPoint. Learners can search through course content, generate ideas for learning, and improve the overall learning experience.\n\n![Canvas LM Student](./assets/CanvasStudent1.png)\n\n### Version history\n\n| Version | Date | Comments |\n| --- | --- | --- |\n| 1.0 | June 23, 2025 | Initial release |\n\n## Features\n\n- List enrolled courses\n- View course content and structure, including modules and assignments\n- Find activities of a certain type, including discussions, announcements, and pages\n- Create study plan and quizzes for courses, modules, and assignments\n- Interact with Canvas content in all M365 apps that support agents, including BizChat, Word, and PowerPoint\n- Search Course Content, empowering learners to plan their study more effectively, giving them access to information in Canvas\n- Content Creation, helping in creating course content, including study plans, quizzes, and other resources\n\n### Data access\n\n- This agent can access and retrieve Canvas data about\n - Courses\n - Modules\n - Assignments\n - Announcements\n - Discussions\n - Pages\n- This agent requires user authentication and respects user permissions in Canvas\n\n- This agent can only retrieve (GET) data from Canvas, not update any data in Canvas\n- The agent uses Canvas information as an input to Copilot across M365 apps, for example:\n - Show me the most engaged discussion in Canvas; based on that discussion create a lesson plan in Word\n - Show me this announcement in Canvas, generate slides in PowerPoint to help address those questions in class\n\n### Evaluation\n\n- All response generation features of this agent were tested, measured, and validated internally\n- [How declarative agents are evaluated?](https://learn.microsoft.com/microsoft-365-copilot/extensibility/transparency-faq-declarative-agent#how-were-declarative-agents-evaluated-what-metrics-are-used-to-measure-performance)\n- It's important to keep in mind that the output this agent provides can be inaccurate, incorrect, or out of date\n\n## Prerequisites\n\nThe agent requires a working Canvas environment and access to Copilot Chat:\n\n- API Developer Key in Canvas\n- Microsoft 365 tenant with [custom app upload enabled](https://learn.microsoft.com/microsoftteams/platform/concepts/build-and-test/prepare-your-o365-tenant#enable-custom-teams-apps-and-turn-on-custom-app-uploading)\n- Microsoft 365 A1, A3, or A5 license\n- Agents work in Copilot Chat (both metered/no metered usage) and M365 Copilot, [learn more](https://learn.microsoft.com/microsoft-365-copilot/extensibility/prerequisites#agent-capabilities-for-microsoft-365-users)\n- Microsoft 365 Agents Toolkit extension for Visual Studio Code\n - A [Microsoft 365 account for development](https://learn.microsoft.com/microsoftteams/platform/toolkit/tools-prerequisites#create-a-free-microsoft-365-developer-account)\n - [Microsoft 365 Agents Toolkit Visual Studio Code Extension](https://aka.ms/teams-toolkit) version 5.0.0 and higher or [Microsoft 365 Agents Toolkit CLI](https://learn.microsoft.com/microsoftteams/platform/toolkit/microsoft-365-agents-toolkit-cli)\n - [Node.js](https://nodejs.org/), supported versions: 18, 20 (optional for running in local dev machine)\n- Admin permissions in the Microsoft 365 Admin Center to distribute the agents to \nother users (optional)\n\n## Minimal path to awesome\n\n### 1. Create API Developer Key in Canvas\n\n1. Follow the [steps](https://community.canvaslms.com/t5/Admin-Guide/How-do-I-add-a-developer-API-key-for-an-account/ta-p/259) to create a developer API key for Canvas LMS\n (Note: The key name will show on the user sign in window.)\n1. Enable the **Enforce Scopes** toggle and select the following scopes for the agent to have **GET** access:\n - `url:GET|/api/v1/courses`\n - `url:GET|/api/v1/courses/:course_id/modules`\n - `url:GET|/api/v1/courses/:course_id/modules/:module_id/items`\n - `url:GET|/api/v1/courses/:course_id/smartsearch`\n - `url:GET|/api/v1/users/:id`\n2. In the **Redirect URIs** field, add `https://teams.microsoft.com/api/platform/v1.0/oAuthRedirect`\n\nSaving will generate the **id** and **key** values that will be used for creating the OAuth registration in Microsoft Teams Developer Portal. Microsoft 365 Copilot will use these values to authenticate the agent with Canvas.\n\n### 2. Add Canvas environment to agent\n\n1. Clone this repository (or download this solution as a .ZIP file then unzip it)\n2. Open the **da-CanvasStudent** folder in VS Code\n3. In the **env** folder, open **.env.dev** file. Update the `CANVAS_BASE_URL` environment variable with the URL of your Canvas instance.\n\n### 3. Provision and test the agent\n\nIn VS Code:\n\n1. Select the Microsoft 365 Agents Toolkit icon on the left toolbar\n2. In the Lifecycle section, select **Provision**\n3. If prompted, sign in with your Microsoft 365 account and follow the prompts. Return to VS Code after signing in.\n4. Enter the **id** generated in Step 1 for the **OAuth Client ID**\n5. Enter the **key** generated in Step 1 for the **OAuth Client Secret**\n\n> [!NOTE]\n> The Canvas LMS client ID and client secret are stored locally in **env/.env.dev** and **env/.env.dev.user** files. The client secret is encrypted by Agents Toolkit and is not stored in the source code.\n\n7. Once the provisioning is complete, you will see a message in the output window that the agent has been provisioned successfully.\n8. Launch the agent in a new browser window by pressing F5.\n\nIn Microsoft 365 Copilot:\n\n- Select any conversation starter, or ask about courses, modules, assignments, discussions, or announcements.\n- Send your message to the agent.\n\n> [!TIP]\n> This step only installs the agent for you, move to the next section to distribute it across your institution\n\n## Optional configuration\n\n### 1. Deploy the agent to your organization\n\nThis step is only needed if you want to distribute the agent across your institution.\n\n1. Select the Microsoft 365 Agents Toolkit icon on the left in the VS Code toolbar\n2. In the **Utility** section, click **Zip Teams App Package** to download the file.\n3. Open a browser and naviagte to the [Microsoft 365 Admin Center](https://admin.microsoft.com). Go to **Settings** , select **Integrate apps**, and select **Upload custom apps**.\n4. Define which users or groups will have access to the agent, accept permissions and deploy\n\n> [!TIP]\n> Learn more at [Manage agents for Microsoft 365 Copilot in the Microsoft 365 admin center](https://learn.microsoft.com/microsoft-365/admin/manage/manage-copilot-agents-integrated-apps?view=o365-worldwide)\n\n### 2. Add capabilities and knowledge sources\n\nThis step is only needed if you want to add other capabilities and knowledge sources to your agent.\n- Customize the agent with capabilities and knowledge sources to address your needs, including:\n - Code interpreter\n - Image generator\n - Web search\n - Scoped web search\n - Copilot connectors\n - SharePoint and OneDrive as knowledge\n- Add your capabilities and knowledge sources to the [Capabilities object](https://learn.microsoft.com/microsoft-365-copilot/extensibility/declarative-agent-manifest-1.3#capabilities-object) in the `declarativeAgent.json` file\n- Check the [capabilities and knowledge sources](https://learn.microsoft.com/microsoft-365-copilot/extensibility/add-agent-capabilities) for the latest capabilities\n\n### 3. Setup Microsoft SSO in Canvas\n\nThis step is only needed if you want to enable your users to be automatically signed-in to Canvas with their Microsoft Entra accounts.\n\n- An authentication provider can be added in Canvas through Admin > Authentication\n- [Configuring Microsoft OAuth for Canvas Authentication](https://community.canvaslms.com/t5/Canvas-Integration-Documents/Configuring-Microsoft-OAuth-for-Canvas-Authentication/ta-p/606219)\n- Once a provider has been saved in Canvas, the provider’s authentication login credentials must be added to each Canvas user’s account via either two options:\n - [SIS CSV](https://canvas.instructure.com/doc/api/file.sis_csv.html)\n - [Logins API](https://canvas.instructure.com/doc/api/logins.html)\n\n## Known limitations\n \n- Limited to M365 apps that support declarative agents\n- Limited to English (EN-US)\n- Limited to only retrieve information from Canvas (read-only)\n- Limited to return only 10 items from each endpoint\n- Limited to return only info about the authenticated user, not bringing anything from any other user\n- No capabilities or knowledge sources have been enabled in this sample\n- [OpenAPI limitations for API plugins](https://learn.microsoft.com/microsoft-365-copilot/extensibility/known-issues#some-openapi-features-arent-supported)\n \n## Resources and customization\n\nThe following folders are provided for this agent.\n\n| Folder | Contents |\n| --- | --- |\n| `.vscode` | VSCode files for debugging |\n| `appPackage` | Templates for the app manifest, the plugin manifest and the API specification |\n| `env` | Environment files |\n\nThe following files can be customized and demonstrate an example implementation to get you started.\n\n| File | Contents |\n| --- | --- |\n| `appPackage/instruction.txt` | Instructions that define the behaviour of your agent. The file contents is included in the **declarativeAgent.json** file during provisioning.\n| `appPackage/declarativeAgent.json` | Defines the configuration of the declarative agent |\n| `appPackage/ai-plugin.json` | Defines the configuration and capabilities of the AI plugin used by Microsoft 365 COpilot to issue requests to the Canvas LMS API. |\n| `appPackage/manifest.json` | App manifest that describes how your app integrates into Microsoft 365 |\n\nThe following are Microsoft 365 Agents Toolkit specific project files. You can [visit a complete guide on Github](https://github.com/OfficeDev/TeamsFx/wiki/Teams-Toolkit-Visual-Studio-Code-v5-Guide#overview) to understand how Microsoft 365 Agents Toolkit works.\n\n| File | Contents |\n| --- | --- |\n| `m365agents.yml` | This is the main Microsoft 365 Agents Toolkit project file. It contains the tasks which was executed when the agent is provisioned to Microsoft 365 Copilot. |\n\n## Help\n\nWe do not support samples, but this community is always willing to help, and we want to improve these samples. We use GitHub to track issues, which makes it easy for community members to volunteer their time and help resolve issues.\n\nYou can try looking at [issues related to this sample](https://github.com/pnp/copilot-pro-dev-samples/issues?q=label%3A%22sample%3A%20da-CanvasStudent%22) to see if anybody else is having the same issues.\n\nIf you encounter any issues using this sample, [create a new issue](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\nFinally, if you have an idea for improvement, [make a suggestion](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n\n" + }, + { + "folder": "da-CanvasTeacher", + "title": "Canvas Teacher", + "description": "Canvas Teacher is a teaching assistant to help you interact with your Canvas LMS. This agent sample enables educators to interact with their courses using Microsoft 365 Copilot or Copilot Chat. Canvas Teacher empowers educators to plan their courses more effectively, giving them access to information in their courses, modules, assignments, pages, discussions, and announcements.", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-CanvasTeacher", + "updatedAt": "2025-06-12T00:00:00.000Z", + "longDescription": [ + "This agent sample enables educators to interact with their Canvas LMS courses using Microsoft 365 Copilot or Copilot Chat. Canvas Teacher empowers educators to plan their courses more effectively, giving them access to information in their courses, modules, assignments, pages, discussions, and announcements." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Node.js" + }, + { + "key": "LANGUAGE", + "value": "TypeScript" + }, + { + "key": "API-PLUGIN", + "value": "Yes" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://github.com/pnp/copilot-pro-dev-samples/raw/main/samples/da-CanvasTeacher/assets/CanvasTeacher1.png", + "imageAlt": "Canvas Teacher in BizChat and Copilot Chat", + "readmeContent": "# Canvas Teacher declarative agent with API Plugin\n\n## Summary\n\nThe Canvas Teacher agent is an AI-powered assistant integrating Microsoft 365 Copilot or Copilot Chat and the Canvas Learning Management System (LMS). It enables educators to combine information in Canvas with unique M365 apps capabilities. Educators can retrieve courses, modules, assignments, pages, announcements, and discussions from Canvas, and leverage features in M365 apps like BizChat, Word, and PowerPoint. Educators can search through course content, generate ideas for teaching, and improve the overall teaching experience.\n\n![Canvas LMS Teacher](./assets/CanvasTeacher1.png)\n\n### Version history\n\n| Version | Date | Comments |\n| --- | --- | --- |\n| 1.0 | June 23rd, 2025 | Initial release |\n\n### Features\n\n- List courses educators are teaching\n- View course content and structure, including modules and assignments\n- Find activities of a certain type, including discussions, announcements, and pages\n- Create study plan for courses, modules, and assignments\n- Interact with Canvas content in all M365 apps that support agents, including BizChat, Word, and PowerPoint\n- Search Course Content, empowering educators to plan their courses more effectively, giving them access to information in Canvas\n- Content Creation, helping in creating course content, including study plans, quizzes, and other resources\n\n## Data access\n\n- This agent can access and retrieve Canvas data about\n - Courses\n - Modules\n - Assignments\n - Announcements\n - Discussions\n - Pages\n- This agent requires user authentication and respects user permissions in Canvas\n- This agent can only retrieve (GET) data from Canvas, not update any data in Canvas\n- The agent uses Canvas information as an input to Copilot across M365 apps, for example:\n - Show me the most engaged discussion in Canvas; based on that discussion create a lesson plan in Word\n - Show me this announcement in Canvas, generate slides in PowerPoint to help address those questions in class\n\n## Evaluation\n\n- All response generation features of this agent were tested, measured, and validated internally\n- [How declarative agents are evaluated?](https://learn.microsoft.com/microsoft-365-copilot/extensibility/transparency-faq-declarative-agent#how-were-declarative-agents-evaluated-what-metrics-are-used-to-measure-performance)\n- It's important to keep in mind that the output this agent provides can be inaccurate, incorrect, or out of date\n\n## Prerequisites\n\nThe agent requires a working Canvas environment and access to Copilot Chat:\n\n- API Developer Key in Canvas\n- Microsoft 365 tenant with [custom app upload enabled](https://learn.microsoft.com/microsoftteams/platform/concepts/build-and-test/prepare-your-o365-tenant#enable-custom-teams-apps-and-turn-on-custom-app-uploading)\n- Microsoft 365 A1, A3, or A5 license\n- Agents work in Copilot Chat (both metered/no metered usage) and M365 Copilot, [learn more](https://learn.microsoft.com/microsoft-365-copilot/extensibility/prerequisites#agent-capabilities-for-microsoft-365-users)\n- Microsoft 365 Agents Toolkit extension for Visual Studio Code\n - A [Microsoft 365 account for development](https://learn.microsoft.com/microsoftteams/platform/toolkit/tools-prerequisites#create-a-free-microsoft-365-developer-account)\n - [Microsoft 365 Agents Toolkit Visual Studio Code Extension](https://aka.ms/teams-toolkit) version 5.0.0 and higher or [Microsoft 365 Agents Toolkit CLI](https://learn.microsoft.com/microsoftteams/platform/toolkit/microsoft-365-agents-toolkit-cli)\n - [Node.js](https://nodejs.org/), supported versions: 18, 20 (optional for running in local dev machine)\n- Admin permissions in the Microsoft 365 Admin Center to distribute the agents to \nother users (optional)\n\n## Minimal path to awesome\n\n### 1. Create API Developer Key in Canvas\n\n1. Follow the [steps](https://community.canvaslms.com/t5/Admin-Guide/How-do-I-add-a-developer-API-key-for-an-account/ta-p/259) to create a developer API key for Canvas LMS\n (Note: The key name will show on the user sign in window.)\n1. Enable the **Enforce Scopes** toggle and select the following scopes for the agent to have **GET** access:\n - `url:GET|/api/v1/courses`\n - `url:GET|/api/v1/courses/:course_id/modules`\n - `url:GET|/api/v1/courses/:course_id/modules/:module_id/items`\n - `url:GET|/api/v1/courses/:course_id/smartsearch`\n - `url:GET|/api/v1/users/:id`\n2. In the **Redirect URIs** field, add `https://teams.microsoft.com/api/platform/v1.0/oAuthRedirect`\n\nSaving will generate the **id** and **key** values that will be used for creating the OAuth registration in Microsoft Teams Developer Portal. Microsoft 365 Copilot will use these values to authenticate the agent with Canvas.\n\n### 2. Add Canvas environment to agent\n\n1. Clone this repository (or download this solution as a .ZIP file then unzip it)\n2. Open the **da-CanvasStudent** folder in VS Code\n3. In the **env** folder, open **.env.dev** file. Update the `CANVAS_BASE_URL` environment variable with the URL of your Canvas instance.\n\n### 3. Provision and test the agent\n\nIn VS Code:\n\n1. Select the Microsoft 365 Agents Toolkit icon on the left toolbar\n2. In the Lifecycle section, select **Provision**\n3. If prompted, sign in with your Microsoft 365 account and follow the prompts. Return to VS Code after signing in.\n4. Enter the **id** generated in Step 1 for the **OAuth Client ID**\n5. Enter the **key** generated in Step 1 for the **OAuth Client Secret**\n\n> [!NOTE]\n> The Canvas LMS client ID and client secret are stored locally in **env/.env.dev** and **env/.env.dev.user** files. The client secret is encrypted by Agents Toolkit and is not stored in the source code.\n\n7. Once the provisioning is complete, you will see a message in the output window that the agent has been provisioned successfully.\n8. Launch the agent in a new browser window by pressing F5.\n\nIn Microsoft 365 Copilot:\n\n- Select any conversation starter, or ask about courses, modules, assignments, discussions, or announcements.\n- Send your message to the agent.\n\n> [!TIP]\n> This step only installs the agent for you, move to the next section to distribute it across your institution\n\n## Optional configuration\n\n### 1. Deploy the agent to your organization\n\nThis step is only needed if you want to distribute the agent across your institution.\n\n1. Select the Microsoft 365 Agents Toolkit icon on the left in the VS Code toolbar\n2. In the **Utility** section, click **Zip Teams App Package** to download the file.\n3. Open a browser and naviagte to the [Microsoft 365 Admin Center](https://admin.microsoft.com). Go to **Settings** , select **Integrate apps**, and select **Upload custom apps**.\n4. Define which users or groups will have access to the agent, accept permissions and deploy\n\n> [!TIP]\n> Learn more at [Manage agents for Microsoft 365 Copilot in the Microsoft 365 admin center](https://learn.microsoft.com/microsoft-365/admin/manage/manage-copilot-agents-integrated-apps?view=o365-worldwide)\n\n### 2. Add capabilities and knowledge sources\n\nThis step is only needed if you want to add other capabilities and knowledge sources to your agent.\n- Customize the agent with capabilities and knowledge sources to address your needs, including:\n - Code interpreter\n - Image generator\n - Web search\n - Scoped web search\n - Copilot connectors\n - SharePoint and OneDrive as knowledge\n- Add your capabilities and knowledge sources to the [Capabilities object](https://learn.microsoft.com/microsoft-365-copilot/extensibility/declarative-agent-manifest-1.3#capabilities-object) in the declarativeAgent.json file\n- Check the [capabilities and knowledge sources](https://learn.microsoft.com/microsoft-365-copilot/extensibility/add-agent-capabilities) for the latest capabilities\n\n### 3. Setup Microsoft SSO in Canvas\n\nThis step is only needed if you want to enable your users to be automatically signed-in to Canvas with their Microsoft Entra accounts.\n\n- An authentication provider can be added in Canvas through Admin > Authentication\n- [Configuring Microsoft OAuth for Canvas Authentication](https://community.canvaslms.com/t5/Canvas-Integration-Documents/Configuring-Microsoft-OAuth-for-Canvas-Authentication/ta-p/606219)\n- Once a provider has been saved in Canvas, the provider’s authentication login credentials must be added to each Canvas user’s account via either two options:\n - [SIS CSV](https://canvas.instructure.com/doc/api/file.sis_csv.html)\n - [Logins API](https://canvas.instructure.com/doc/api/logins.html)\n\n## Known limitations\n \n- Limited to M365 apps that support declarative agents\n- Limited to English (EN-US)\n- Limited to only retrieve information from Canvas (read-only)\n- Limited to return only 10 items from each endpoint\n- Limited to return only info about the authenticated user, not bringing anything from any other user\n- No capabilities or knowledge sources have been enabled in this sample\n- [OpenAPI limitations for API plugins](https://learn.microsoft.com/microsoft-365-copilot/extensibility/known-issues#some-openapi-features-arent-supported)\n\n## Resources and customization\n\nThe following folders are provided for this agent.\n\n| Folder | Contents |\n| --- | --- |\n| `.vscode` | VSCode files for debugging |\n| `appPackage` | Templates for the app manifest, the plugin manifest and the API specification |\n| `env` | Environment files |\n\nThe following files can be customized and demonstrate an example implementation to get you started.\n\n| File | Contents |\n| --- | --- |\n| `appPackage/instruction.txt` | Instructions that define the behaviour of your agent. The file contents is included in the **declarativeAgent.json** file during provisioning.\n| `appPackage/declarativeAgent.json` | Defines the configuration of the declarative agent |\n| `appPackage/ai-plugin.json` | Defines the configuration and capabilities of the AI plugin used by Microsoft 365 COpilot to issue requests to the Canvas LMS API. |\n| `appPackage/manifest.json` | App manifest that describes how your app integrates into Microsoft 365 |\n\nThe following are Microsoft 365 Agents Toolkit specific project files. You can [visit a complete guide on Github](https://github.com/OfficeDev/TeamsFx/wiki/Teams-Toolkit-Visual-Studio-Code-v5-Guide#overview) to understand how Microsoft 365 Agents Toolkit works.\n\n\n| File | Contents |\n| --- | --- |\n| `m365agents.yml` | This is the main Microsoft 365 Agents Toolkit project file. It contains the tasks which was executed when the agent is provisioned to Microsoft 365 Copilot. |\n\n## Help\n\nWe do not support samples, but this community is always willing to help, and we want to improve these samples. We use GitHub to track issues, which makes it easy for community members to volunteer their time and help resolve issues.\n\nYou can try looking at [issues related to this sample](https://github.com/pnp/copilot-pro-dev-samples/issues?q=label%3A%22sample%3A%20da-CanvasTeacher%22) to see if anybody else is having the same issues.\n\nIf you encounter any issues using this sample, [create a new issue](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\nFinally, if you have an idea for improvement, [make a suggestion](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n\n" + }, + { + "folder": "da-CareerCoach", + "title": "Career Coach Declarative Agent for Microsoft 365 Copilot Sample", + "description": "First Party Declarative Agent Career Coach shared as a sample", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-CareerCoach", + "updatedAt": "2024-10-04T00:00:00.000Z", + "longDescription": [ + "The \"Career Coach\" Declarative Agent is an open-source AI-driven tool designed to assist professionals in their career development. This agent provides personalized suggestions and actionable plans to help users learn and grow in their careers. By leveraging data such as the user's current role, skills, and career aspirations, the Career Coach offers tailored advice on skill development, learning opportunities, and career transitions. It maintains a professional and supportive tone, ensuring that interactions are contextual and relevant. The agent integrates with OneDrive, SharePoint, and Graph Connectors to enhance its capabilities. Key features include creating detailed career development plans, performing skill gap analyses, recommending learning resources, and offering networking strategies. This open-source project aims to empower individuals to achieve their career goals through structured guidance and support. With the declarative agent, you can build a custom version of Copilot that can be used for specific scenarios, such as for specialized knowledge, implementing specific processes, or simply to save time by reusing a set of AI prompts. For example, a grocery shopping Copilot declarative agent can be used to create a grocery list based on a meal plan that you send to Copilot. To run this app template in your local dev machine, you will need Node.js (supported versions: 16, 18), a Microsoft 365 account for development, Teams Toolkit Visual Studio Code Extension version 5.0.0 and higher or Teams Toolkit CLI, and a Microsoft 365 Copilot license. First, select the Teams Toolkit icon on the left in the VS Code toolbar. In the Account section, sign in with your Microsoft 365 account if you haven't already. Create Teams app by clicking `Provision` in \"Lifecycle\" section. Select `Preview in Copilot (Edge)` or `Preview" + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Node.js" + }, + { + "key": "LANGUAGE", + "value": "TypeScript" + }, + { + "key": "API-PLUGIN", + "value": "No" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://raw.githubusercontent.com/pnp/copilot-pro-dev-samples/refs/heads/main/samples/da-CareerCoach/assets/CareerCoach1.png", + "imageAlt": "Career Coach Declarative Agent for Microsoft 365 Copilot Sample", + "readmeContent": "# Overview of the Career Coach declarative agent sample\n![CareerCoach Start Screen](assets/CareerCoach1.png)\n\nThe \"Career Coach\" Declarative Agent is an open-source AI-driven tool designed to assist professionals in their career development. This agent provides personalized suggestions and actionable plans to help users learn and grow in their careers. By leveraging data such as the user's current role, skills, and career aspirations, the Career Coach offers tailored advice on skill development, learning opportunities, and career transitions. It maintains a professional and supportive tone, ensuring that interactions are contextual and relevant. The agent integrates with OneDrive, SharePoint, and Graph Connectors to enhance its capabilities. Key features include creating detailed career development plans, performing skill gap analyses, recommending learning resources, and offering networking strategies. This open-source project aims to empower individuals to achieve their career goals through structured guidance and support.\n\n\n## Build a basic declarative agent\n\nWith the declarative agent, you can build a custom version of Copilot that can be used for specific scenarios, such as for specialized knowledge, implementing specific processes, or simply to save time by reusing a set of AI prompts. For example, a grocery shopping Copilot declarative agent can be used to create a grocery list based on a meal plan that you send to Copilot.\n\n## Get started with the template\n\n> **Prerequisites**\n>\n> To run this app template in your local dev machine, you will need:\n>\n> - [Node.js](https://nodejs.org/), supported versions: 16, 18\n> - A [Microsoft 365 account for development](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts).\n> - [Teams Toolkit Visual Studio Code Extension](https://aka.ms/teams-toolkit) version 5.0.0 and higher or [Teams Toolkit CLI](https://aka.ms/teamsfx-toolkit-cli)\n> - [Microsoft 365 Copilot license](https://learn.microsoft.com/microsoft-365-copilot/extensibility/prerequisites#prerequisites)\n\n![CareerCoach in Action](assets/CareerCoach2.png)\n\n1. First, select the Teams Toolkit icon on the left in the VS Code toolbar.\n2. In the Account section, sign in with your [Microsoft 365 account](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts) if you haven't already.\n3. Create Teams app by clicking `Provision` in \"Lifecycle\" section.\n4. Select `Preview in Copilot (Edge)` or `Preview in Copilot (Chrome)` from the launch configuration dropdown.\n5. Once the Copilot app is loaded in the browser, click on the \"…\" menu and select \"Copilot chats\". You will see your declarative agent on the right rail. Clicking on it will change the experience to showcase the logo and name of your declarative agent.\n6. Ask a question to your declarative agent and it should respond based on the instructions provided.\n\n## What's included in the template\n\n| Folder | Contents |\n| ------------ | ---------------------------------------------------------------------------------------- |\n| `.vscode` | VSCode files for debugging |\n| `appPackage` | Templates for the Teams application manifest, the GPT manifest and the API specification |\n| `env` | Environment files |\n\nThe following files can be customized and demonstrate an example implementation to get you started.\n\n| File | Contents |\n| ------------------------------------ | ------------------------------------------------------------------------------ |\n| `appPackage/declarativeAgent.json` | Define the behaviour and configurations of the declarative agent. |\n| `appPackage/instruction.txt` | Specific instruction for the declarative agent. In a TXT file for ease of edition automatically scafold by TTK when solution is provisionned. |\n| `appPackage/manifest.json` | Teams application manifest that defines metadata for your declarative agent. |\n\nThe following are Teams Toolkit specific project files. You can [visit a complete guide on Github](https://github.com/OfficeDev/TeamsFx/wiki/Teams-Toolkit-Visual-Studio-Code-v5-Guide#overview) to understand how Teams Toolkit works.\n\n| File | Contents |\n| -------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |\n| `teamsapp.yml` | This is the main Teams Toolkit project file. The project file defines two primary things: Properties and configuration Stage definitions. |\n\n## Addition information and references\n\n- [Declarative agents for Microsoft 365](https://aka.ms/teams-toolkit-declarative-agent)\n" + }, + { + "folder": "da-CLIForM365-helper", + "title": "CLI for M365 Helper", + "description": "This declarative helper helps users discover relevant CLI for Microsoft 365 commands from official documentation", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-CLIForM365-helper", + "updatedAt": "2025-08-06T00:00:00.000Z", + "longDescription": [ + "The CLI for M365 Helper helps users discover relevant CLI for Microsoft 365 commands from the official documentation." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Copilot" + }, + { + "key": "LANGUAGE", + "value": "Json" + }, + { + "key": "API-PLUGIN", + "value": "No" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://github.com/pnp/copilot-pro-dev-samples/raw/main/samples/da-CLIForM365-helper/assets/CLIForM365Helper.png", + "imageAlt": "CLI for M365 Helper", + "readmeContent": "# CLI for Microsoft 365 Command Helper\n\nThis declarative agent helps users find and understand CLI for Microsoft 365 commands. It provides guidance on command syntax, parameters, and usage examples by searching the official CLI for Microsoft 365 documentation. For example, users can ask \"How do I get SharePoint file versions?\" and receive the exact `m365 spo file version list` command with complete syntax and examples.\n\n![CLI For M365 Helper](assets/CLIForM365Helper.png)\n\n## Contributors\n\n* [Saurabh Tripathi](https://github.com/saurabh7019)\n\n## Version history\n\nVersion|Date|Comments\n-------|----|--------\n1.0|August 6, 2025|Initial release\n\n## Prerequisites\n\nTo run this app template in your local dev machine, you will need:\n\n- [Node.js](https://nodejs.org/), supported versions: 18, 20, 22\n- A [Microsoft 365 account for development](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts).\n- [Microsoft 365 Agents Toolkit Visual Studio Code Extension](https://aka.ms/teams-toolkit) version 5.0.0 and higher or [Microsoft 365 Agents Toolkit CLI](https://aka.ms/teamsfx-toolkit-cli)\n- [Microsoft 365 Copilot license](https://learn.microsoft.com/microsoft-365-copilot/extensibility/prerequisites#prerequisites)\n\n## Minimal path to awesome\n\n* Clone this repository (or [download this solution as a .ZIP file](https://pnp.github.io/download-partial/?url=https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-CLIForM365-helper) then unzip it)\n* Open the project with Visual Studio Code\n* Select the **Microsoft 365 Agents Toolkit** icon in the VS Code activity bar\n* In the **Accounts** section, sign in with your [Microsoft 365 account](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts) if you haven't already.\n* Create app by clicking **Provision** in **Lifecycle** section.\n* Open Microsoft 365 Copilot (web, desktop, or mobile)\n* Select the **CLI for M365 Helper** agent from your available agents\n* Ask questions about CLI for Microsoft 365 commands, such as:\n - \"Can you help me understand what CLI for Microsoft 365 is and how to install it?\"\n - \"Could you show me all available spo commands?\"\n - \"Can you help me with a specific CLI for Microsoft 365 command?\" \n\n## Features\n\n- Helps users discover CLI for Microsoft 365 commands for specific tasks across all Microsoft 365 services\n- Searches official CLI for Microsoft 365 documentation to provide accurate syntax and examples\n- Provides interactive guidance with conversation starters and follow-up questions\n\n## Help\n\nWe do not support samples, but this community is always willing to help, and we want to improve these samples. We use GitHub to track issues, which makes it easy for community members to volunteer their time and help resolve issues.\n\nYou can try looking at [issues related to this sample](https://github.com/pnp/copilot-pro-dev-samples/issues?q=label%3A%22sample%3A%20da-CLIForM365-helper%22) to see if anybody else is having the same issues.\n\nIf you encounter any issues using this sample, [create a new issue](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\nFinally, if you have an idea for improvement, [make a suggestion](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n\n" + }, + { + "folder": "da-community-samples-agent", + "title": "Microsoft 365 Community Sample Agent", + "description": "Agent that connects to the Sample Solution Gallery APIs, using MCP to allow users to find samples within an agent.", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-community-samples-agent", + "updatedAt": "2025-12-07T00:00:00.000Z", + "longDescription": [ + "Agent that connects to the Sample Solution Gallery APIs, using MCP to allow users to find samples within an agent." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Declarative Agent" + }, + { + "key": "LANGUAGE", + "value": "JSON" + }, + { + "key": "API-PLUGIN", + "value": "Yes" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://github.com/pnp/copilot-pro-dev-samples/raw/main/samples/da-community-samples-agent/assets/Example.png", + "imageAlt": "Declarative agent doing that connects to the Sample Solution Gallery APIs, using MCP to allow users to find samples within an agent.", + "readmeContent": "# Community Samples Assistant — Introduction\n\nThis assistant helps you find Microsoft 365 community samples and example projects. Where available it uses the \"MCP Community Samples\" server to discover, filter and surface relevant samples (repositories, code snippets, authors, and metadata).\n\n> Note: The MCP Server Tool, search_samples, requires an input object for search which is beyond the ability for the agent to query. This feature is still preview so, this may change.\n\n## Basic instructions\n\n- Ask naturally. The agent will translate your request into MCP queries and return matching samples.\n- Search by keyword, author, tool, feature, or scenario:\n - Examples:\n - \"Find a Copilot sample for Trey\"\n - \"Show me samples by Paul Bullock\"\n - \"Find Outlook add-in samples that call Microsoft Graph\"\n - \"Give me 3 samples demonstrating adaptive cards\"\n- Request details for a sample:\n - \"Show repo link, short description, and main files for [sample name].\"\n - \"How do I run this sample locally? List the setup steps.\"\n- Ask for comparisons or recommendations:\n - \"Compare two samples that implement SSO — pros and cons.\"\n - \"Recommend a starter sample for building a Teams message extension.\"\n\n## Tips & behavior\n\n- The agent will indicate when it queries the MCP server (e.g., \"Fetching samples…\").\n- If no matches are found, try broader keywords or alternate author spellings.\n- For code or setup questions, include the sample name or repo link when possible.\n\n## Privacy & security\n\n- The agent will ask you permission to connect to the MCP Server\n- The agent returns public sample metadata and links; follow the repository license and contributor guidance when reusing code.\n\n![IMage of example of agent](assets/Example.png)\n\n## Get started with the Sample\n\n> **Prerequisites**\n>\n> To run this app template in your local dev machine, you will need:\n>\n> - [Node.js](https://nodejs.org/), supported versions: 18, 20, 22\n> - A [Microsoft 365 account for development](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts).\n> - [Microsoft 365 Agents Toolkit Visual Studio Code Extension](https://aka.ms/teams-toolkit) version 5.0.0 and higher or [Microsoft 365 Agents Toolkit CLI](https://aka.ms/teamsfx-toolkit-cli)\n> - [Microsoft 365 Copilot license](https://learn.microsoft.com/microsoft-365-copilot/extensibility/prerequisites#prerequisites)\n\n1. Open ATK in VS Code\n\n Click the Microsoft 365 Agents Toolkit icon in the Activity Bar. \n\n2. Sign in\n\n Open the Agents Toolkit by click on the toolkit icon in the VS Code sidebar. Under Account, authenticate with your dev M365 account.\n\n3. Scaffold a new DA\n\n In the Agents Toolkit menu, click 'Create new Agent/app', select 'Declarative Agent', choose a folder and name (e.g. my-mcp-agent).\n\n4. Add your MCP Server\n\n In the ATK sidebar click Add Action → Start with an MCP server, then enter your MCP discovery URL (e.g. https://mcp.contoso.com/discover).\n\n5. Start your MCP Server \n\n After the DA project generated, click the \"Start\" button in the mcp.json file to start your MCP server, when prompt, enter the user ID and password for authentication.\n\n6. Fetch and select tools \n\n When prompted, Click ATK:Fetch Action from MCP\" in the mcp.json file choose Pre‑fetch tools (for offline IntelliSense) or Dynamic. ATK will list all available MCP actions—check the ones you want in your agent.\n\n7. Configure Auth\n\n ATK will retrieve the authentication information for your MCP server and store these values are in env/.env.development and a secure reference is injected into appPackage/ai-plugin.json. If the inputted MCP server authentication information is not configure correctly according to the MCP protocol, ATK will prompt errors.\n\n8. Review generated files\n\n - `appPackage/ai-plugin.json` (function definitions, runtime spec + auth) - This file defines the the action or operations that Copilot can interact with.\n - `appPackage/declarativeAgent.json` (agent configuration & sample prompts) - This file is the definition of your declarative agent\n - `appPackage/manifest.json` (Teams/Outlook integration)\n\n9. Provision & debug\n\n Use the Provision button in ATK to create resources. ATK will detect if your MCP server requires OAuth2 or API‐Key. Provide your Client ID/Secret or Key when prompted. Then Start Debugging to Preview agent in Copilot in Edge/Chrome. Your DA will appear under Copilot chats.\n\n10. Test your MCP‑powered agent \n\n Open the Copilot pane, select your agent and invoke any of the MCP tools with natural‑language prompts. \n\n## Project Structure\n\n| Folder | Description |\n| ------------ | ---------------------------------------------------------------------------------------- |\n| `.vscode` | ATK debug & .vscode/mcp.json for MCP server config |\n| `appPackage` | - `appPackage/ai-plugin.json` (function definitions, runtime spec + auth) - This file defines the the action or operations that Copilot can interact with
- `appPackage/declarativeAgent.json` (agent configuration & sample prompts) - This file is the definition of your declarative agent
- `appPackage/manifest.json` (Teams/Outlook integration) |\n| `env` | Local environment files (.env.development, .env.local) |\n| `m365agents.yml` | Defines your DA stages & lifecycle for ATK |\n\n## MCP‑specific tips\n\n- **Discovery URL**: your MCP server’s /discover endpoint must expose JSON‑Schema for every action.\n- **Tool selection**: the run_for_functions array in ai-plugin.json limits which MCP tools your agent can call. \n\n- **Auth flows**: ATK supports both OAuth2.1 and API‑Key; you don’t need to hand‑edit auth blocks. \n\n- **Versioning**: when your MCP server schema changes, simply rerun ATK: Fetch Action from MCP to refresh your plugin file. \n\n- **Error logging**: basic request/response logs appear in the ATK console; errors bubble up in your Copilot chat. \n\n\n## Learn More\n\n- [Build Declarative Agents (official docs)](https://learn.microsoft.com/microsoft-365-copilot/extensibility/build-declarative-agents)\n\n- [Model Context Protocol (MCP)](https://modelcontextprotocol.io/)\n\n- [Agents Toolkit guide on GitHub](https://github.com/OfficeDev/TeamsFx/wiki/Teams-Toolkit-Visual-Studio-Code-v5-Guide#overview)\n\nHappy building! \n\nWith MCP + Declarative Agents, you’ll have a turnkey path from your existing APIs to a fully operational Copilot‑powered experience. \n\n\n" + }, + { + "folder": "da-DocFinder", + "title": "Document Finder Declarative Agent for Microsoft 365 Copilot Sample", + "description": "First Party Declarative Agent Document Finder shared as a sample", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-DocFinder", + "updatedAt": "2024-10-04T00:00:00.000Z", + "longDescription": [ + "The \"Document Finder\" Declarative Agent is an open-source AI-driven tool designed to assist professionals in their document management. This agent provides personalized suggestions and actionable plans to help users find and organize their documents effectively. By leveraging data such as the user's current role, projects, and document types, the Document Finder offers tailored advice on document retrieval, organization, and sharing. It maintains a professional and supportive tone, ensuring that interactions are contextual and relevant. The agent integrates with OneDrive, SharePoint, and Graph Connectors to enhance its capabilities. Key features include creating detailed document organization plans, performing document searches, recommending document templates, and offering collaboration strategies. This open-source project aims to empower individuals to achieve their document management goals through structured guidance and support. With the declarative agent, you can build a custom version of Copilot that can be used for specific scenarios, such as for specialized knowledge, implementing specific processes, or simply to save time by reusing a set of AI prompts. For example, a grocery shopping Copilot declarative agent can be used to create a grocery list based on a meal plan that you send to Copilot. To run this app template in your local dev machine, you will need Node.js (supported versions: 16, 18), a Microsoft 365 account for development, Teams Toolkit Visual Studio Code Extension version 5.0.0 and higher or Teams Toolkit CLI, and a Microsoft 365 Copilot license. First, select the Teams Toolkit icon on the left in the VS Code toolbar. In the Account section, sign in with your Microsoft 365 account if you haven't already. Create Teams app by clicking `Provision` in \"Lifecycle\" section. Select `Preview in Copilot (Edge)` or `Preview" + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Copilot" + }, + { + "key": "LANGUAGE", + "value": "JSON" + }, + { + "key": "API-PLUGIN", + "value": "No" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://raw.githubusercontent.com/pnp/copilot-pro-dev-samples/refs/heads/main/samples/da-docFinder/assets/JeremyDocFinder.png", + "imageAlt": "Copilot agent that finds documents you have worked on", + "readmeContent": "# Overview of the Docfinder declarative agent\nThe docfinder declarative agent demonstrates how you users can easily discover documents in SharePoint and OneDrive based on those created, modified or viewed by them. As a agent builder, it illustrates how you can use instructions to steer Copilot to help the user. Take a look at the [instructions file](appPackage/instruction.txt) to see more.\n\n![DocFinder in use](./assets/JeremyDocFinder.png)\n\n## Minimal path to awesome\n\n> **Prerequisites**\n>\n> To run this app you will need:\n>\n> - [Node.js](https://nodejs.org/), supported versions: 18, 20\n> - A [Microsoft 365 account](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts) with permission to sideload Teams applications.\n> - [Teams Toolkit Visual Studio Code Extension](https://aka.ms/teams-toolkit) version 5.0.0 and higher\n> - [Microsoft 365 Copilot license](https://learn.microsoft.com/microsoft-365-copilot/extensibility/prerequisites#prerequisites)\n\n1. First, select the Teams Toolkit icon on the left in the VS Code toolbar.\n2. In the Account section, sign in with your [Microsoft 365 account](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts) if you haven't already. Ensure that both \"Custom App Upload Enabled\" and \"Copilot Access Enabled\" have green checkmarks\n3. Create and provision the Teams app by clicking `Provision` in \"Lifecycle\" section.\n4. Select the \"Run and Debug\" icon in the left sidebar, and then select `Preview in Copilot (Edge)` or `Preview in Copilot (Chrome)` from the launch configuration dropdown.\n5. Once the Copilot app is loaded in the browser, click on the \"…\" menu and select \"Copilot agents\". You will see your declarative agent on the right rail. Clicking on it will change the experience to showcase the logo and name of the declarative agent.\n6. Ask a question to your declarative agent and it should respond based on the instructions provided.\n\n## Addition information and references\n\n- [Declarative agents for Microsoft 365](https://aka.ms/teams-toolkit-declarative-agent)\n\nPlease check out the author's YouTube short where he explains and demos the solution \n\n[![Jeremy's video](./assets/JeremyDocFinderVideo.png)](https://www.youtube.com/shorts/3eL6FlSYE48)\n\n" + }, + { + "folder": "da-dynamics365-advisor", + "title": "Dynamics 365 Advisor", + "description": "Expert declarative agent for Dynamics 365 CRM, Power Platform, and Copilot solutions guidance", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-dynamics365-advisor", + "updatedAt": "2026-04-28T00:00:00.000Z", + "longDescription": [ + "A declarative agent that serves as an expert advisor for Dynamics 365 CRM and Power Platform solutions. Provides guidance on CRM architecture decisions, entity and table design, security models, Power Automate workflows, plugin development, Copilot Studio chatbot scenarios, and business process automation. Helps teams design scalable Dynamics 365 implementations with proper security role structures, optimized sales pipelines, and customer service automation." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Copilot" + }, + { + "key": "LANGUAGE", + "value": "JSON" + }, + { + "key": "API-PLUGIN", + "value": "No" + }, + { + "key": "AGENT-TYPE", + "value": "Declarative Agent" + } + ], + "imageUrl": "https://raw.githubusercontent.com/pnp/copilot-pro-dev-samples/refs/heads/main/samples/da-dynamics365-advisor/assets/screenshot.png", + "imageAlt": "Dynamics 365 Advisor Agent for Microsoft 365 Copilot", + "readmeContent": "# Dynamics 365 Advisor Agent\n\n## Summary\n\nAn expert declarative agent for Microsoft 365 Copilot that provides guidance on Dynamics 365 CRM, Power Platform, and Copilot solutions. This agent helps users with CRM architecture decisions, entity design, security models, Power Automate workflows, and business process automation.\n\n![Dynamics 365 Advisor in action](assets/screenshot.png)\n\n## Features\n\nThis sample illustrates the following concepts:\n\n* **CRM Architecture Guidance** - Dynamics 365 CRM design and implementation\n* **Entity & Table Design** - Data model design in Dynamics 365\n* **Security Model Design** - Security roles, access levels, and multi-region deployment architecture\n* **Power Automate Integration** - Workflow automation and business process recommendations\n* **Copilot Studio Use Cases** - Customer service chatbot scenarios and implementations\n* **Business Process Optimization** - Sales pipeline and customer service improvements\n* **Plugin & Custom Code** - Custom development guidance and best practices\n\n## Contributors\n\n* [Muhammad Shahzad Shafique](https://github.com/MrShahzadShafique)\n\n## Version history\n\nVersion|Date|Comments\n-------|----|----|\n1.0.0|April 28, 2026|Initial release\n\n## Prerequisites\n\n* Microsoft 365 tenant with Microsoft 365 Copilot\n* [Visual Studio Code](https://code.visualstudio.com/) with the [Microsoft 365 Agents Toolkit](https://marketplace.visualstudio.com/items?itemName=TeamsDevApp.ms-teams-vscode-extension) extension\n* [Node.js v18](https://nodejs.org/en/download/package-manager)\n\n## Minimal path to awesome\n* Open the Microsoft 365 Agents Toolkit extension and sign in to your Microsoft 365 tenant with Microsoft 365 Copilot\n* Select **Debug in Copilot (Edge)** from the launch configuration dropdown\n\n## Help\n\nWe do not support samples, but this community is always willing to help, and we want to improve these samples. We use GitHub to track issues, which makes it easy for community members to volunteer their time and help resolve issues.\n\nYou can try looking at [issues related to this sample](https://github.com/pnp/copilot-pro-dev-samples/issues?q=label%3A%22sample%3A%20da-dynamics365-advisor%22) to see if anybody else is having the same issues.\n\nIf you encounter any issues using this sample, [create a new issue](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\nFinally, if you have an idea for improvement, [make a suggestion](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n\n" + }, + { + "folder": "da-environmentSustainability", + "title": "ESA, The Environment Sustainability Agent using Microsoft 365 Copilot", + "description": "This sample showcases how to build a declarative agent for Microsoft 365 Copilot connected to a SharePoint site as knowledge base, named ESA, the Environment Sustainability Agent. ESA is an intelligent assistant developed to assist organizations in monitoring and optimizing their environmental impact.", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-environmentSustainability", + "updatedAt": "2024-10-22T00:00:00.000Z", + "longDescription": [ + "This sample showcases how to build a declarative agent for Microsoft 365 Copilot connected to a SharePoint site as knowledge base designed to help organizations monitor and optimize their environmental impact. It analyzes data on energy consumption,environment compliance, and carbon emissions, providing actionable insights to reduce inefficiencies and enhance sustainability practices. By guiding companies toward more eco-friendly operations, this AI helps achieve long-term sustainability goals while reducing operational costs." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Node.js" + }, + { + "key": "LANGUAGE", + "value": "TypeScript" + }, + { + "key": "API-PLUGIN", + "value": "No" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + }, + { + "key": "SHAREPOINT", + "value": "Yes" + } + ], + "imageUrl": "https://github.com/pnp/copilot-pro-dev-samples/raw/main/samples/da-environmentSustainability/assets/thumbnail.png", + "imageAlt": "Declarative agent showing energy consumption analysis", + "readmeContent": "# Environment Sustainability Agent (ESA)\n\nThe **ESA - The Environment Sustainability Agent** is an intelligent assistant designed to help organizations monitor and optimize their environmental impact. It analyzes data on energy consumption,environment compliance, and carbon emissions, providing actionable insights to reduce inefficiencies and enhance sustainability practices. By guiding companies toward more eco-friendly operations, this AI helps achieve long-term sustainability goals while reducing operational costs.\n\n## Summary\n\nThis sample illustrates the following concepts:\n\n- Building a declarative agent for Microsoft 365 Copilot with instructions\n- Adding a SharePoint capability to the agent\n\n\n![picture of the app in action](./assets/daSus.gif)\n\n\n## Prerequisites\n\n* Microsoft 365 tenant with Microsoft 365 Copilot\n* [Visual Studio Code](https://code.visualstudio.com/) with the [Teams Toolkit](https://marketplace.visualstudio.com/items?itemName=TeamsDevApp.ms-teams-vscode-extension) extension\n* [Node.js v18](https://nodejs.org/en/download/package-manager)\n\n\n## Contributors\n\n* [Rabia Williams](https://github.com/rabwill)\n\n## Version history\n\nVersion|Date|Comments\n-------|----|----\n1.0|October 22, 2025|Initial release\n1.1|Nov 14, 2025|Added real reports and updated conversation starters\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n---\n\n## Minimal Path to Awesome\n\n* Clone this repository and in your Visual Studio Code, open folder **samples/da-environmentSustainability**\n* Alternatively you can also [download this solution as a .ZIP file](https://pnp.github.io/download-partial/?url=https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-environmentSustainability) then unzip it and go to **samples/da-environmentSustainability** folder from your Visual Studio Code window\n* Open the Teams Toolkit extension and sign in to your Microsoft 365 tenant with Microsoft 365 Copilot\n* Copy the files like `Microsoft 2024 Environmental Sustainability Report`and other PDF files in **docs** folder and upload into a SharePoint site in the same Microsoft 365 tenant which you used to sign to Teams Toolkit\n* Update the environment variable `SP_SITE_URL` in the **.env.dev** file with value of the SharePoint site where the docs were uploaded\n* Under the Teams Toolkit tab in Visual Studio Code, click \"Provision\" to install the application\n\n![Click provision](./assets/provision-app.png)\n\n* Go to Copilot app and on the agent panel choose **da-environmentSustainability**\n* Use the conversation starters to see the magic!\n\n\n## Features\n\n- Declarative agent with SharePoint capability\n\n" + }, + { + "folder": "da-executive-helper", + "title": "Executive Helper - Meeting preparation with executive bios", + "description": "A declarative agent that automates meeting preparation by generating comprehensive executive bios with career insights and rapport-building questions.", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-executive-helper", + "updatedAt": "2026-03-02T00:00:00.000Z", + "longDescription": [ + "A declarative agent that automates meeting preparation by generating comprehensive executive bios with career insights and rapport-building questions. The agent follows a structured 5-phase workflow: adaptive interview, comprehensive research, bio generation, optional summarization, and human-in-the-loop review." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Node.js" + }, + { + "key": "LANGUAGE", + "value": "Declarative Agent" + }, + { + "key": "API-PLUGIN", + "value": "No" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://github.com/pnp/copilot-pro-dev-samples/raw/main/samples/da-executive-helper/assets/ExecutiveHelper1.png", + "imageAlt": "Executive Helper declarative agent generating executive bios", + "readmeContent": "# Executive Helper - Meeting preparation with executive bios\n\n## Summary\n\nExecutive Helper is a declarative agent for Microsoft 365 Copilot that automates meeting preparation by researching public information about meeting participants and generating comprehensive executive bios with career insights and context-specific rapport-building questions.\n\nExecutives spend significant time preparing for meetings by researching participants' backgrounds, roles, and expertise. This agent reduces meeting-prep time by up to 90% through a structured 5-phase workflow: adaptive interview, comprehensive research, bio generation, optional summarization, and human-in-the-loop review.\n\n![Executive Helper conversation starters](assets/ExecutiveHelper1.png)\n\n![Executive Helper in action](assets/ExecutiveHelper2.png)\n\n## Version history\n\nVersion|Date|Comments\n-------|----|--------\n1.0|March 2, 2026|Initial release\n\n## Prerequisites\n\n* [Microsoft 365 Copilot license](https://learn.microsoft.com/microsoft-365-copilot/extensibility/prerequisites#prerequisites)\n* [Node.js](https://nodejs.org/), supported versions: 16, 18\n* A [Microsoft 365 account for development](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts)\n* [Teams Toolkit Visual Studio Code Extension](https://aka.ms/teams-toolkit) version 5.0.0 and higher or [Teams Toolkit CLI](https://aka.ms/teamsfx-toolkit-cli)\n\n## Minimal path to awesome\n\n* Clone this repository (or [download this solution as a .ZIP file](https://pnp.github.io/download-partial/?url=https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-executive-helper) then unzip it)\n* Open the `samples/da-executive-helper` folder in Visual Studio Code\n* Select the Teams Toolkit icon on the left in the VS Code toolbar\n* In the Account section, sign in with your [Microsoft 365 account](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts) if you haven't already\n* Create the Teams app by selecting **Provision** in the \"Lifecycle\" section\n* Select `Preview in Copilot (Edge)` or `Preview in Copilot (Chrome)` from the launch configuration dropdown\n* Once the Copilot app is loaded in the browser, select the \"...\" menu and select **Copilot chats**. You will see the Executive Helper agent on the right rail. Selecting it will change the experience to showcase the agent\n* Ask a question to the agent and it will respond following the structured workflow\n\n## Features\n\nUsing this sample you can extend Microsoft 365 Copilot with an agent that:\n\n* Guides users through a structured interview to understand meeting context (mandatory subject info plus 10 optional context questions)\n* Researches public information about meeting participants using web search with a tiered source hierarchy (authoritative, verified secondary, contextual)\n* Generates comprehensive 11-section executive bios with tone calibration based on meeting category (Strategic, Advisory, Networking, Ceremonial, Informal)\n* Marks uncertain or sensitive facts with verification tags for human review\n* Provides optional 2-page summarized versions and rapport-building questions\n* Supports a human-in-the-loop review process with fact tables and source maps\n\n### Agent workflow\n\nThe agent follows a strict 5-phase workflow:\n\n| Phase | Description |\n|-------|-------------|\n| **Phase 1: Adaptive Interview** | Collects subject info (mandatory) and optional meeting context through Q1-Q11 |\n| **Phase 2: Comprehensive Research** | Searches authoritative sources with multi-source validation |\n| **Phase 3: Bio Generation** | Creates 11-section executive bio with category-based tone calibration |\n| **Phase 4: Summarization** | Optional condensed 2-page version |\n| **Phase 5: HITL Review** | Human reviewer resolves verification tags and approves delivery |\n\n### Agent capabilities\n\n| Capability | Description |\n|------------|-------------|\n| **WebSearch** | Searches public web for executive information from authoritative sources |\n| **GraphConnectors** | Accesses organizational context for enhanced participant research |\n\n### Project structure\n\n| Folder/File | Contents |\n|-------------|----------|\n| `.vscode` | VSCode files for debugging |\n| `appPackage` | Templates for the Teams application manifest and the declarative agent definition |\n| `appPackage/declarativeAgent.json` | Defines the behavior and configurations of the declarative agent |\n| `appPackage/instruction.txt` | Agent instructions defining the 5-phase workflow |\n| `appPackage/manifest.json` | Teams application manifest that defines metadata for the declarative agent |\n| `env` | Environment files |\n| `m365agents.yml` | Main Microsoft 365 Agents Toolkit project file with provision and publish lifecycle definitions |\n\n## Help\n\nWe do not support samples, but this community is always willing to help, and we want to improve these samples. We use GitHub to track issues, which makes it easy for community members to volunteer their time and help resolve issues.\n\nYou can try looking at [issues related to this sample](https://github.com/pnp/copilot-pro-dev-samples/issues?q=label%3A%22sample%3A%20da-executive-helper%22) to see if anybody else is having the same issues.\n\nIf you encounter any issues using this sample, [create a new issue](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\nFinally, if you have an idea for improvement, [make a suggestion](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n![](https://m365-visitor-stats.azurewebsites.net/copilot-pro-dev-samples/samples/da-executive-helper)\n" + }, + { + "folder": "da-foodbank-friend", + "title": "Foodbank Friend", + "description": "A declarative agent that helps users in the UK find local food banks, see what items they need, and schedule volunteer donation visits.", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-foodbank-friend", + "updatedAt": "2026-03-25T00:00:00.000Z", + "longDescription": [ + "Foodbank Friend connects users with local food banks across the UK using the GiveFood API, shows what donation items are currently needed, and coordinates volunteer visits by creating Outlook calendar appointments and tracking commitments in a SharePoint list. The agent demonstrates combining multiple action types: Remote MCP Servers for Microsoft 365 services (Outlook Calendar and SharePoint Lists) alongside a traditional OpenAPI connector for an external API." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Node.js" + }, + { + "key": "LANGUAGE", + "value": "JSON" + }, + { + "key": "AGENT-TYPE", + "value": "Declarative Agent" + }, + { + "key": "API-PLUGIN", + "value": "Yes" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://github.com/pnp/copilot-pro-dev-samples/raw/main/samples/da-foodbank-friend/assets/example.gif", + "imageAlt": "Screenshot of the Foodbank Friend declarative agent in action", + "readmeContent": "# Declarative Agent - Foodbank Friend\n\n![Declarative Agent - Foodbank Friend](./assets/example.gif)\n\n## Summary\n\nThis repository contains a declarative agent that helps users in the UK find local food banks, see what items they need, and schedule volunteer donation visits. The agent connects to the [GiveFood API](https://www.givefood.org.uk/api/) to search for nearby food banks and their current needs, then coordinates the scheduling process by creating Outlook calendar appointments and tracking volunteer commitments in SharePoint. A key point of emphasis on this agent was combining multiple action types - **Remote MCP Servers** for Microsoft 365 services (Outlook Calendar and SharePoint Lists) alongside a traditional **OpenAPI** connector for the external GiveFood API. The agent is built using the Microsoft 365 Agents Toolkit.\n\n![Solution diagram](./assets/solution-diagram.png)\n\n## Contributors\n\n* [Lee Ford](https://github.com/leeford) - M365 Development MVP\n\n## Version history\n\nVersion|Date|Comments\n-------|----|--------\n1.0 | March 25, 2026 | Initial solution\n\n> **Prerequisites**\n>\n> To run this app template from your local dev machine, you will need:\n>\n> * A [Microsoft 365 account for development](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts)\n> * [Microsoft 365 Agents Toolkit Visual Studio Code Extension](https://aka.ms/teams-toolkit)\n> * [Microsoft 365 Copilot license](https://learn.microsoft.com/microsoft-365-copilot/extensibility/prerequisites#prerequisites)\n> * A SharePoint site with a custom list for tracking volunteer commitments (see setup instructions below)\n\n## Minimal path to awesome\n\n1. Clone this repository\n\n2. Register an Entra ID application in Azure:\n\n 1. Go to [Azure portal](https://portal.azure.com/)\n 2. Select **Microsoft Entra ID** > **Manage** > **App registrations** > **New registration**\n 3. Enter a name for the app (e.g., Foodbank Friend)\n 4. Select **Accounts in this organizational directory only**\n 5. Under **Redirect URI**, select **Web** and enter `https://teams.microsoft.com/api/platform/v1.0/oAuthRedirect`\n 6. Select **Register**\n 7. In the app registration, go to **Certificates & secrets** and create a new client secret\n 8. Copy the client secret value\n 9. In the app registration, go to **API permissions** and add the following permissions:\n * **agent365.svc.cloud.microsoft** > **Delegated permissions** > `McpServers.Calendar.All`, `McpServers.SharepointLists.All`\n 10. Select **Grant admin consent for ** to grant the permissions\n\n3. Create a SharePoint list for tracking volunteer commitments:\n\n 1. Go to your SharePoint site\n 2. Create a new list named **Volunteer Commitments** with the following columns:\n * **Title** (Single line of text) - Default column\n * **VolunteerName** (Single line of text)\n * **FoodBankName** (Single line of text)\n * **FoodBankAddress** (Multiple lines of text)\n * **AppointmentDate** (Date and Time)\n * **ItemsCommitted** (Multiple lines of text)\n * **Status** (Choice: Scheduled, Completed, Cancelled)\n * **CreatedDate** (Date and Time)\n 3. Note down the **Site ID** and **List ID** (you can find these in the list settings URL or via Graph Explorer)\n\n4. In the [Teams developer portal](https://dev.teams.microsoft.com/) under **Tools**, create a new **OAuth client registration** with the following information (replace `` with your own tenant ID):\n\n **App settings**\n\n * **Registration name**: Foodbank Friend\n * **Base URL**: `https://agent365.svc.cloud.microsoft`\n * **Restrict usage by org**: My organization only\n * **Restrict usage by app**: Any Teams app (when agent is deployed, use the Teams app ID)\n\n **OAuth settings**\n * **Client ID**: <Entra ID App registration client ID>\n * **Client secret**: <Entra ID App registration client secret>\n * **Authorization endpoint**: `https://login.microsoftonline.com//oauth2/v2.0/authorize`\n * **Token endpoint**: `https://login.microsoftonline.com//oauth2/v2.0/token`\n * **Refresh endpoint**: `https://login.microsoftonline.com//oauth2/v2.0/token`\n * **Scope**: `ea9ffc3e-8a23-4a7d-836d-234d7c7565c1/.default`\n\n Save the information. A new **OAuth client registration key** will be generated. Copy the key.\n\n5. Copy `env/.env.dev.example` to `env/.env.dev` and fill in the following values:\n\n ```bash\n # Generated during provision by Microsoft 365 Agents Toolkit\n TEAMS_APP_ID=\n TEAMS_APP_TENANT_ID=\n\n # SharePoint Configuration\n # Format: hostname,siteCollectionId,siteId (e.g., contoso.sharepoint.com,12345678-...,abcdef...)\n SHAREPOINT_SITE_ID=\n SHAREPOINT_LIST_ID=\n\n # OAuth Plugin Vault Reference ID - from Teams Developer Portal OAuth client registration\n OAUTH_REFERENCE_ID=\n ```\n\n6. From Microsoft 365 Agents Toolkit, sign-in to your Microsoft 365 account.\n7. From Microsoft 365 Agents Toolkit, provision the solution to create the Teams app.\n8. Go to [https://www.office.com/chat?auth=2](https://www.office.com/chat?auth=2) URL and enable the developer mode by using the `-developer on` prompt.\n9. Use one of the conversation starters to start the agent.\n\n## Features\n\nThe following sample demonstrates the following concepts:\n\n* **Find Local Food Banks** - Query the GiveFood UK API to search for food banks near any UK location, displaying distance, address, and current needs\n* **View Donation Needs** - Show detailed information about what items each food bank currently needs and what they have excess of\n* **Schedule Volunteer Visits** - Create Outlook calendar appointments with full details including location, items to bring, and other needed items\n* **Track Commitments** - Store volunteer commitments in a SharePoint list for record-keeping and history\n* **View History** - Query SharePoint to show the user their past and upcoming volunteer commitments\n\n### APIs & Services Used\n\n| Service | Type | Purpose |\n|---------|------|---------|\n| [GiveFood UK API](https://www.givefood.org.uk/api/) | OpenAPI | Search for UK food banks and retrieve current donation needs |\n| Outlook Calendar | Remote MCP Server | Create calendar appointments for volunteer visits |\n| SharePoint Lists | Remote MCP Server | Track and query volunteer commitment records |\n\n## Help\n\nWe do not support samples, but this community is always willing to help, and we want to improve these samples. We use GitHub to track issues, which makes it easy for community members to volunteer their time and help resolve issues.\n\nYou can try looking at [issues related to this sample](https://github.com/pnp/copilot-pro-dev-samples/issues?q=label%3A%22sample%3A%20da-foodbank-friend%22) to see if anybody else is having the same issues.\n\nIf you encounter any issues using this sample, [create a new issue](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\nFinally, if you have an idea for improvement, [make a suggestion](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n![](https://m365-visitor-stats.azurewebsites.net/copilot-pro-dev-samples/samples/da-foodbank-friend)\n" + }, + { + "folder": "da-geolocator-game", + "title": "Geo Locator Game", + "description": "This sample demonstrates how to create a Geo Locator Game declarative agent using Microsoft 365 Copilot.", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-geolocator-game", + "updatedAt": "2025-06-10T00:00:00.000Z", + "longDescription": [ + "This sample demonstrates how to create a Geo Locator Game declarative agent using Microsoft 365 Copilot. The game allows users to guess the location of a place based on clues provided by the agent. The agent provides hints, celebrates correct guesses, and keeps the game engaging with humor and fun facts." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Node.js" + }, + { + "key": "LANGUAGE", + "value": "TypeScript" + }, + { + "key": "API-PLUGIN", + "value": "No" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://github.com/pnp/copilot-pro-dev-samples/raw/main/samples/da-geolocator-game/assets/preview.gif", + "imageAlt": "Demonstration of the Geo Locator Game", + "readmeContent": "# Geo Locator Game declarative agent\n\n## Summary\n\nThis is a Geo Locator Game copilot that plays a game with users by asking a location around the World for users to guess. Geo Locator Game copilot is entertaining, fun and congratulates users when their guesses are correct.\n\n![Geo Locator Game](./assets/preview.gif)\n\n## Contributors\n\n* [Ayca Bas](https://github.com/aycabas)\n* [Garry Trinder](https://github.com/garrytrinder)\n\n## Version history\n\n| Version | Date | Comments |\n|--|--|--|\n| 1.1 | June 10, 2025 | Maintenance release |\n| 1.0 | April 16, 2025 | Initial release |\n\n## Prerequisites\n\n* [Node.js](https://nodejs.org/)\n* A [Microsoft 365 tenant](https://learn.microsoft.com/en-us/microsoftteams/platform/concepts/build-and-test/prepare-your-o365-tenant) prepared for development\n* [Microsoft 365 Agents Toolkit](https://aka.ms/teams-toolkit) Visual Studio Code extension\n\n## Minimal path to awesome\n\n### 1. Provision agent\n\n1. Open the project in Visual Studio Code\n1. On the primary sidebar, select the **Microsoft 365 Agents Toolkit icon**\n1. In the LIFECYCLE section, select **Provision**\n1. If prompted, **sign in** with your [Microsoft 365 account](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts)\n1. Wait for the provisioning to complete\n\n### 2. Test the agent\n\n1. Press **F5** to launch a browser that navigates that opens the declarative agent in Microsoft 365 Copilot. If prompted, sign in with your Microsoft 365 account.\n1. Select the **Getting started** conversation starter.\n1. **Send the message** and wait for the agent to respond.\n\n## Troubleshooting and feature requests\n\nWe do not support samples, but this community is always willing to help, and we want to improve these samples. We use GitHub to track issues, which makes it easy for community members to volunteer their time and help resolve issues.\n\nYou can try looking at [issues related to this sample](https://github.com/pnp/copilot-pro-dev-samples/issues?q=label%3A%22sample%3A%20da-geolocator-game%22) to see if anybody else is having the same issues.\n\nIf you encounter any issues using this sample, [create a new issue](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\nFinally, if you have an idea for improvement, [make a suggestion](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n\n" + }, + { + "folder": "da-HRHelpdesk", + "title": "HR Heldpdesk Declarative Agent", + "description": "HR Helpdesk is a template Declarative Agent designed to help employees troubleshoot their issues using insights from ServiceNow KB, and if not successful create a case in the right Centre of Excellence/table without much burden on the end user.", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-HRHelpdesk", + "updatedAt": "2025-10-14T00:00:00.000Z", + "longDescription": [ + "HR Helpdesk is a template Declarative Agent designed to help employees troubleshoot their issues using insights from ServiceNow KB, and if not successful create a case in the right Centre of Excellence/table without much burden on the end user." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Node.js" + }, + { + "key": "API-PLUGIN", + "value": "Yes" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://github.com/pnp/copilot-pro-dev-samples/raw/main/samples/da-HRHelpdesk/assets/hrhelpdesk.png", + "imageAlt": "HR Helpdesk", + "readmeContent": "## Summary\n\nHR Helpdesk is a template Declarative Agent designed to help employees troubleshoot their issues using insights from ServiceNow KB, and if not successful create a case in the right Centre of Excellence/table without much burden on the end user.\n Goals:\n1.\tHelp employees resolve their HR issues via self serve\n2.\tIf necessary, help them create a ServiceNow case with minimal effort.\n\n## Features\n\nThis sample illustrates the following concepts:\n\n- 🧭 Guide employees through common HR issues with conversational, easy-to-follow resolutions that reduce downtime\n- 💡 Help users self-resolve problems in Accounts, Payroll, Benefits, Tax, Leave, Onboarding, or any other general HR support needed\n- 📝 Create service /incident tickets in the correct Centre of Excellence or ServiceNow table (auto classification) with a clear summary of the issue, and relevant first-level debug information — reducing back-and-forth and enabling faster, more accurate resolution by Support teams.\n\n\n## Contributors\n\n* [Sébastien Levert](https://github.com/sebastienlevert)\n* [Akhil Sai Valluri](https://github.com/akhilsaivalluri)\n* [Suryamanohar Mallela](https://github.com/SuryaMSFT)\n\n## Version history\n\nVersion|Date|Comments\n-------|----|--------\n1.0|July 25, 2025|Initial release\n\n## Prerequisites\n\n* Microsoft 365 tenant with Microsoft 365 Copilot\n* [Visual Studio Code](https://code.visualstudio.com/) with the [Microsoft 365 Agents Toolkit](https://marketplace.visualstudio.com/items?itemName=TeamsDevApp.ms-teams-vscode-extension) extension\n* [Node.js v20](https://nodejs.org/en/download/package-manager)\n* A ServiceNow account with API access\n\n## Example Prompts\n\n1. I didn’t get my salary credit for last month\n \"image\"\n \"image\"\n \"image\"\n\n2. I’m travelling for work. However, the manager information in the Business Travel letter tool is incorrect.\n \"image\"\n \"image\"\n \"image\"\n \"image\"\n\n## Minimal path to awesome\n\n* Clone this repository (or [download this solution as a .ZIP file](https://pnp.github.io/download-partial/?url=https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-ITHelpdesk) then unzip it)\n* Open the Agents Toolkit extension and sign in to your Microsoft 365 tenant with Microsoft 365 Copilot\n* Select **Preview in Copilot (Edge)** from the launch configuration dropdown\n\n## Configuration\n\n### ServiceNow Plugin Configuration \n\nIn your OpenAPI spec [`appPackage/apiSpecificationFile/openapi.yaml`](appPackage/apiSpecificationFile/openapi.yaml):\n\n* Update the server URL to point to your ServiceNow instance\n\"image\"\n\n* Point authorization, token and refresh urls to your ServiceNow instance\n\"image\"\n\n* In your [`ai-plugin.json`](ai-plugin.json) (plugin manifest), go to the `response_semantics` section for each function. You can customize the layout and data bindings to create richer, domain-specific views. Ensure all links point to your ServiceNow instance.\n\"image\"\n\n\n### ServiceNow Authentication Setup\n\n1. Log into your ServiceNow account and go to Application Registry under System OAuth \n \"image\"\n \"image\"\n\n2. Create a new registry. Select option “Create an OAuth API endpoint for external clients”\n \"image\"\n \n3. Add callback URL as https://teams.microsoft.com/api/platform/v1.0/oAuthRedirect. You can leave other settings as defaults or customize it as per your needs. Hit Submit.\n \"image\"\n\n4. After Submit, your app will show in the list. Click on it to get access to Client secret\n \"image\"\n\n5. Copy Client ID and Client Secret. You will require it in step 6.\n \"image\"\n\n6. Setup Microsoft Graph Connector to add ServiceNow knowledge – This will allow agent to provide troubleshooting guidance based on your ServiceNow KB articles. Follow the steps in https://learn.microsoft.com/en-us/microsoftsearch/servicenow-knowledge-connector . After you setup Microsoft Graph Connector to add ServiceNow knowledge, add the connection IDs in the Agent file.\n \"image\"\n \n7. Provision Key & Secret in Copilot: When provisioning the Declarative Agent via the Teams Toolkit, you’ll be prompted to enter the Client ID (Key) and Client Secret. Use the values from the ServiceNow OAuth app you created.\n \"image\"\n\n\n## Help\n\nWe do not support samples, but this community is always willing to help, and we want to improve these samples. We use GitHub to track issues, which makes it easy for community members to volunteer their time and help resolve issues.\n\nYou can try looking at [issues related to this sample](https://github.com/pnp/copilot-pro-dev-samples/issues?q=label%3A%22sample%3A%20da-HRHelpdesk%22) to see if anybody else is having the same issues.\n\nIf you encounter any issues using this sample, [create a new issue](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\nFinally, if you have an idea for improvement, [make a suggestion](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n\n" + }, + { + "folder": "da-IdeaCoach", + "title": "Idea Coach Declarative Agent for Microsoft 365 Copilot Sample", + "description": "First Party Declarative Agent Idea Coach shared as a sample", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-IdeaCoach", + "updatedAt": "2024-10-04T00:00:00.000Z", + "longDescription": [ + "The \"Idea Coach\" is a comprehensive brainstorming agent designed to assist users in generating ideas, planning brainstorming sessions, finding engaging exercises, organizing ideas, providing constructive feedback, and enhancing brainstorming skills, leveraging the capabilities of OneDrive, SharePoint, and Graph Connectors to streamline and optimize the brainstorming process." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Node.js" + }, + { + "key": "LANGUAGE", + "value": "TypeScript" + }, + { + "key": "API-PLUGIN", + "value": "No" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://raw.githubusercontent.com/pnp/copilot-pro-dev-samples/refs/heads/main/samples/da-IdeaCoach/assets/IdeaCoach1.png", + "imageAlt": "Idea Coach Declarative Agent for Microsoft 365 Copilot Sample", + "readmeContent": "# Overview of the Idea Coach declarative agent sample\n![IdeaCoach Start Screen](assets/IdeaCoach1.png)\n\nThe \"Idea Coach\" Declarative Agent is an open-source AI-driven tool designed to facilitate and enhance brainstorming sessions. This agent acts as a personal assistant, helping users to brainstorm topics, plan sessions, find creative exercises, organize ideas, and improve their brainstorming skills. The Idea Coach uses a fun, collaborative tone to inspire creativity and ensure that interactions are engaging and productive.\n\nKey features of the Idea Coach include:\n- **Brainstorm a Topic**: Acts as a session host to help brainstorm about a topic, asking questions one by one to create a multi-turn conversation flow.\n- **Planning a Brainstorming Session**: Customizes the agenda to specific objectives by asking sequential questions to gather the right context. Provides detailed, creative suggestions for topics and activities, and formats the agenda in tabular form.\n- **Helping Find Creative Exercises**: Proposes at least three exercises based on the user's objectives, number of attendees, and duration.\n- **Idea Organization**: Suggests tools and techniques to help prioritize ideas from the brainstorming session without bias.\n- **Feedback and Improvement**: Gathers feedback on the session, identifies pain points, and provides structured solutions for improvement.\n- **Training and Development**: Assesses the user's skills and provides a training plan to help them grow in brainstorming sessions.\n- **Assess My Skills**: Evaluates the user's skills through a series of questions and offers a direct assessment, followed by a training plan if desired.\n\nThe Idea Coach integrates with OneDrive, SharePoint, and Graph Connectors to enhance its capabilities. It ensures that conversations are contextual and relevant, asking additional questions where necessary to clarify and confirm understanding. At the end of each interaction, the agent asks for feedback and encourages the use of the thumbs up and down feature in Copilot.\n\nThis open-source project aims to empower individuals and teams to achieve their brainstorming goals through structured guidance and support. By providing a customizable and extensible framework, the Idea Coach Declarative Agent can be adapted to various professional contexts and user needs, making it a versatile tool for fostering creativity and innovation.\n\n## Get started with the template\n\n> **Prerequisites**\n>\n> To run this app template in your local dev machine, you will need:\n>\n> - [Node.js](https://nodejs.org/), supported versions: 16, 18\n> - A [Microsoft 365 account for development](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts).\n> - [Teams Toolkit Visual Studio Code Extension](https://aka.ms/teams-toolkit) version 5.0.0 and higher or [Teams Toolkit CLI](https://aka.ms/teamsfx-toolkit-cli)\n> - [Microsoft 365 Copilot license](https://learn.microsoft.com/microsoft-365-copilot/extensibility/prerequisites#prerequisites)\n\n![IdeaCoach in Action](assets/IdeaCoach2.png)\n\n\n1. First, select the Teams Toolkit icon on the left in the VS Code toolbar.\n2. In the Account section, sign in with your [Microsoft 365 account](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts) if you haven't already.\n3. Create Teams app by clicking `Provision` in \"Lifecycle\" section.\n4. Select `Preview in Copilot (Edge)` or `Preview in Copilot (Chrome)` from the launch configuration dropdown.\n5. Once the Copilot app is loaded in the browser, click on the \"…\" menu and select \"Copilot chats\". You will see your declarative agent on the right rail. Clicking on it will change the experience to showcase the logo and name of your declarative agent.\n6. Ask a question to your declarative agent and it should respond based on the instructions provided.\n\n## What's included in the template\n\n| Folder | Contents |\n| ------------ | ---------------------------------------------------------------------------------------- |\n| `.vscode` | VSCode files for debugging |\n| `appPackage` | Templates for the Teams application manifest, the GPT manifest and the API specification |\n| `env` | Environment files |\n\nThe following files can be customized and demonstrate an example implementation to get you started.\n\n| File | Contents |\n| ------------------------------------ | ------------------------------------------------------------------------------ |\n| `appPackage/declarativeAgent.json` | Define the behaviour and configurations of the declarative agent. |\n| `appPackage/manifest.json` | Teams application manifest that defines metadata for your declarative agent. |\n\nThe following are Teams Toolkit specific project files. You can [visit a complete guide on Github](https://github.com/OfficeDev/TeamsFx/wiki/Teams-Toolkit-Visual-Studio-Code-v5-Guide#overview) to understand how Teams Toolkit works.\n\n| File | Contents |\n| -------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |\n| `teamsapp.yml` | This is the main Teams Toolkit project file. The project file defines two primary things: Properties and configuration Stage definitions. |\n\n## Addition information and references\n\n- [Declarative agents for Microsoft 365](https://aka.ms/teams-toolkit-declarative-agent)\n" + }, + { + "folder": "da-ITHelpdesk", + "title": "IT Helpdesk Declarative Agent", + "description": "IT Helpdesk Agent is a Declarative Agent designed to assist employees with IT issues through (a) guided, conversational troubleshooting, (b) outage detection, and ticket creation for escalation – powered through ServiceNow offerings (Knowledge, Catalogue and Tickets). ", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-ITHelpdesk", + "updatedAt": "2025-10-14T00:00:00.000Z", + "longDescription": [ + "IT Helpdesk Agent is a Declarative Agent designed to assist employees with IT issues through (a) guided, conversational troubleshooting, (b) outage detection, and ticket creation for escalation – powered through ServiceNow offerings (Knowledge, Catalogue and Tickets)." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Node.js" + }, + { + "key": "API-PLUGIN", + "value": "Yes" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://github.com/pnp/copilot-pro-dev-samples/raw/main/samples/da-ITHelpdesk/assets/ithelpdesk.png", + "imageAlt": "IT Helpdesk", + "readmeContent": "## Summary\n\nIT Helpdesk Agent is a Declarative Agent designed to assist employees with IT issues through (a) guided, conversational troubleshooting, (b) outage detection, and ticket creation for escalation – powered through ServiceNow offerings (Knowledge, Catalogue and Tickets). \n\nGoals: IT helpdesk Agent has been created with two key objectives, \n1.\tReduce overall number of tickets raised by **offering easy-to-follow, self-serve troubleshooting guidance** to employees\n2.\tImprove SLA to ticket resolution by **capturing first-level debug information** up front, reducing back and forth\n\n## Features\n\nThis sample illustrates the following concepts:\n\n- 🧭 Guide employees through common IT issues with conversational, easy-to-follow resolutions that reduce downtime\n- ⚠️ Proactively inform users about service outages, minimizing repeated tickets and unnecessary troubleshooting\n- 💡 Help users self-resolve problems like VPN errors, login failures, password resets, and software installation using relevant resolutions from Service Now\n- 📝 Create service /incident tickets with the correct category and subcategory (auto-classification), a clear summary of the issue, and relevant first-level debug information — reducing back-and-forth and enabling faster, more accurate resolution by IT teams.\n- 🎫 Help users track the status of their support tickets, view recent updates, and stay informed — improving transparency and reducing the need to follow up manually \n\n## Contributors\n\n* [Sébastien Levert](https://github.com/sebastienlevert)\n* [Akhil Sai Valluri](https://github.com/akhilsaivalluri)\n* [Suryamanohar Mallela](https://github.com/SuryaMSFT)\n\n## Version history\n\nVersion|Date|Comments\n-------|----|--------\n1.0|July 25, 2025|Initial release\n\n## Prerequisites\n\n* Microsoft 365 tenant with Microsoft 365 Copilot\n* [Visual Studio Code](https://code.visualstudio.com/) with the [Microsoft 365 Agents Toolkit](https://marketplace.visualstudio.com/items?itemName=TeamsDevApp.ms-teams-vscode-extension) extension\n* [Node.js v20](https://nodejs.org/en/download/package-manager)\n* A ServiceNow account with API access\n\n## Example Prompts\n\n1. Help me connect to VPN\n\"image\"\n\"image\"\n\n2. I can’t access internal portal\n\"image\"\n\n## Minimal path to awesome\n\n* Clone this repository (or [download this solution as a .ZIP file](https://pnp.github.io/download-partial/?url=https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-ITHelpdesk) then unzip it)\n* Open the Agents Toolkit extension and sign in to your Microsoft 365 tenant with Microsoft 365 Copilot\n* Select **Preview in Copilot (Edge)** from the launch configuration dropdown\n\n## Configuration\n\n### ServiceNow Plugin Configuration \n\nIn your OpenAPI spec [`appPackage/apiSpecificationFile/openapi.yaml`](appPackage/apiSpecificationFile/openapi.yaml):\n\n* Update the server URL to point to your ServiceNow instance\n\"image\"\n\n* Point authorization, token and refresh urls to your ServiceNow instance\n\"image\"\n\n* In your [`ai-plugin.json`](ai-plugin.json) (plugin manifest), go to the `response_semantics` section for each function. This sample comes with basic Adaptive Card views for rich representation. You can further customize the layout and data bindings to create richer, domain-specific views. Ensure all links point to your ServiceNow instance.\n\"image\"\n\n\n### ServiceNow Authentication Setup\n\n1. Log into your ServiceNow account and go to Application Registry under System OAuth \n \"image\"\n \"image\"\n\n2. Create a new registry. Select option “Create an OAuth API endpoint for external clients”\n \"image\"\n \n3. Add callback URL as https://teams.microsoft.com/api/platform/v1.0/oAuthRedirect. You can leave other settings as defaults or customize it as per your needs. Hit Submit.\n \"image\"\n\n4. After Submit, your app will show in the list. Click on it to get access to Client secret\n \"image\"\n\n5. Copy Client ID and Client Secret. You will require it in step 6.\n \"image\"\n\n6. Setup Microsoft Graph Connector to add ServiceNow knowledge – This will allow agent to provide troubleshooting guidance based on your ServiceNow KB articles. Follow the steps in https://learn.microsoft.com/en-us/microsoftsearch/servicenow-knowledge-connector . After you setup Microsoft Graph Connector to add ServiceNow knowledge, add the connection IDs in the Agent file.\n \"image\"\n\n7. Add knowledge for incident autoclassification: This step is required if you want Copilot to perform autoclassification of an incident (Category and Subcategory fields) while creating the incident itself by matching issue description with the available choices.\n - Go to Choice Lists under System definition\n \"image\"\n - Click on the filter icon and select Table as the field, and “is” “ incident” as other query parameters to filter out just the choicelists for your incident table. Run the query.\n \"image\"\n - Right click on the table header row and select export option. Select csv format.\n \"image\"\n - Now add this file to your SharePoint folder and copy url of the location. Add the url in your Agent file as knowledge under Capabilities.\n \"image\"\n - Note: All users who you want this Agent to be available should also have access to this file for Copilot to use it during autoclassification.\n \n8. Provision Key & Secret in Copilot: When provisioning the Declarative Agent via the Teams Toolkit, you’ll be prompted to enter the Client ID (Key) and Client Secret. Use the values from the ServiceNow OAuth app you created.\n \"image\"\n\n\n## Help\n\nWe do not support samples, but this community is always willing to help, and we want to improve these samples. We use GitHub to track issues, which makes it easy for community members to volunteer their time and help resolve issues.\n\nYou can try looking at [issues related to this sample](https://github.com/pnp/copilot-pro-dev-samples/issues?q=label%3A%22sample%3A%20da-ITHelpdesk%22) to see if anybody else is having the same issues.\n\nIf you encounter any issues using this sample, [create a new issue](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\nFinally, if you have an idea for improvement, [make a suggestion](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n\n" + }, + { + "folder": "da-LearningCoach", + "title": "Learning Coach Declarative Agent for Microsoft 365 Copilot Sample", + "description": "First Party Declarative Agent Learning Coach shared as a sample", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-LearningCoach", + "updatedAt": "2024-10-04T00:00:00.000Z", + "longDescription": [ + "The \"Learning Coach\" is an open-source Copilot Agent designed to assist users in understanding complex terms or topics by providing explanations in simple terms. It offers three levels of summaries—simple, intermediate, and detailed—allowing users to choose the most suitable explanation for their knowledge gap. The agent can help users learn about specific topics, guide them in learning new languages, practice skills through exercises, prepare for tests, create learning plans, and suggest effective learning methods. It leverages OneDrive, SharePoint, and Graph Connectors to enhance its capabilities and streamline the learning process." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Node.js" + }, + { + "key": "LANGUAGE", + "value": "TypeScript" + }, + { + "key": "API-PLUGIN", + "value": "No" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://raw.githubusercontent.com/pnp/copilot-pro-dev-samples/refs/heads/main/samples/da-LearningCoach/assets/LearningCoach1.png", + "imageAlt": "Learning Coach Declarative Agent for Microsoft 365 Copilot Sample", + "readmeContent": "# Overview of the Learning Coach declarative agent sample\n![Learning Coach Start Screen](assets/LearningCoach1.png)\n\nThe \"Learning Coach\" Declarative Agent is an open-source AI-driven tool designed to assist users in understanding complex terms or topics by breaking them down into simple, intermediate, and detailed summaries. This agent acts as a supportive and knowledgeable coach, dedicated to enhancing users' understanding of complex subjects, practicing existing skills, and defining the right learning process tailored to their goals and needs.\n\nKey features of the Learning Coach include:\n- **Breaking Down Complex Concepts**: Simplifies complex topics into beginner, intermediate, and advanced levels, using analogies, metaphors, and different learning techniques. Provides glossaries and additional resources for further reading.\n- **Skill Practice and Refinement**: Helps users practice and refine their existing skills or knowledge through tailored exercises based on their proficiency level.\n- **Guiding Optimal Learning Processes**: Assists users in articulating their learning goals, assessing their preferred learning styles, and recommending suitable learning techniques and resources.\n- **Creating Structured Learning Plans**: Develops structured study plans for specified topics, allowing users to revise and update the plans as needed.\n- **Test Preparation**: Offers targeted study plans, explains test formats, provides practice questions, identifies knowledge gaps, simulates test-taking experiences, and recommends test-taking strategies.\n- **Guided Language Practice**: Provides interactive language lessons, vocabulary practice, grammar tips, and conversational exercises tailored to the user's level.\n\nThe Learning Coach maintains a professional and supportive tone throughout interactions, ensuring that conversations are contextual and relevant. It integrates with OneDrive, SharePoint, and Graph Connectors to enhance its capabilities. The agent is designed to adapt its content based on the user's needs, interests, and goals, presenting information in a brief, simple, and logical manner to avoid overwhelming the user.\n\nThis open-source project aims to empower individuals to achieve their learning goals through structured guidance and support. By providing a customizable and extensible framework, the Learning Coach Declarative Agent can be adapted to various educational contexts and user needs, making it a versatile tool for personal and professional development.\n\n## Build a basic declarative agent\n\nWith the declarative agent, you can build a custom version of Copilot that can be used for specific scenarios, such as for specialized knowledge, implementing specific processes, or simply to save time by reusing a set of AI prompts. For example, a grocery shopping Copilot declarative agent can be used to create a grocery list based on a meal plan that you send to Copilot.\n\n## Get started with the sample\n\n> **Prerequisites**\n>\n> To run this app sample in your local dev machine, you will need:\n>\n> - [Node.js](https://nodejs.org/), supported versions: 16, 18\n> - A [Microsoft 365 account for development](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts).\n> - [Teams Toolkit Visual Studio Code Extension](https://aka.ms/teams-toolkit) version 5.0.0 and higher or [Teams Toolkit CLI](https://aka.ms/teamsfx-toolkit-cli)\n> - [Microsoft 365 Copilot license](https://learn.microsoft.com/microsoft-365-copilot/extensibility/prerequisites#prerequisites)\n\n![Leaning Coach in action](assets/LearningCoach2.png)\n\n1. First, select the Teams Toolkit icon on the left in the VS Code toolbar.\n2. In the Account section, sign in with your [Microsoft 365 account](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts) if you haven't already.\n3. Create Teams app by clicking `Provision` in \"Lifecycle\" section.\n4. Select `Preview in Copilot (Edge)` or `Preview in Copilot (Chrome)` from the launch configuration dropdown.\n5. Once the Copilot app is loaded in the browser, click on the \"…\" menu and select \"Copilot chats\". You will see your declarative agent on the right rail. Clicking on it will change the experience to showcase the logo and name of your declarative agent.\n6. Ask a question to your declarative agent and it should respond based on the instructions provided.\n\n## What's included in the sample\n\n| Folder | Contents |\n| ------------ | ---------------------------------------------------------------------------------------- |\n| `.vscode` | VSCode files for debugging |\n| `appPackage` | Templates for the Teams application manifest, the GPT manifest and the API specification |\n| `env` | Environment files |\n\nThe following files can be customized and demonstrate an example implementation to get you started.\n\n| File | Contents |\n| ------------------------------------ | ------------------------------------------------------------------------------ |\n| `appPackage/declarativeAgent.json` | Define the behaviour and configurations of the declarative agent. |\n| `appPackage/manifest.json` | Teams application manifest that defines metadata for your declarative agent. |\n\nThe following are Teams Toolkit specific project files. You can [visit a complete guide on Github](https://github.com/OfficeDev/TeamsFx/wiki/Teams-Toolkit-Visual-Studio-Code-v5-Guide#overview) to understand how Teams Toolkit works.\n\n| File | Contents |\n| -------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |\n| `teamsapp.yml` | This is the main Teams Toolkit project file. The project file defines two primary things: Properties and configuration Stage definitions. |\n\n## Addition information and references\n\n- [Declarative agents for Microsoft 365](https://aka.ms/teams-toolkit-declarative-agent)\n" + }, + { + "folder": "da-m365-roadmap-tracker", + "title": "The M365 Roadmap Features Tracker agent shows how users can easily stay up to date with the latest Microsoft 365 roadmap features.", + "description": "The M365 Roadmap Features Tracker agent shows how users can easily stay up to date with the latest Microsoft 365 roadmap features. It integrates a Microsoft Graph Connector to monitor and deliver the latest updates, offering a hands-free solution for staying informed.", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-m365-roadmap-tracker", + "updatedAt": "2025-04-09T00:00:00.000Z", + "longDescription": [ + "The M365 Roadmap Features Tracker agent shows how users can easily stay up to date with the latest Microsoft 365 roadmap features." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Copilot" + }, + { + "key": "LANGUAGE", + "value": "English" + }, + { + "key": "API-PLUGIN", + "value": "No" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "Yes" + } + ], + "imageUrl": "https://raw.githubusercontent.com/pnp/copilot-pro-dev-samples/refs/heads/main/samples/da-m365-roadmap-tracker/assets/Mohammad-da-m365-roadmap-tracker00.png", + "imageAlt": "Copilot agent that finds M365 roadmap features updates", + "readmeContent": "# M365 Roadmap Features Tracker declarative agent\n\n## Summary\n\nThe M365 Roadmap Features Tracker agent shows how users can easily stay up to date with the latest Microsoft 365 roadmap features. It integrates a Microsoft Graph Connector to monitor and deliver the latest updates, offering a hands-free solution for staying informed.\n\nThe agent uses a Microsoft Graph Connector that ingests Microsoft 365 roadmap features. This connector serves as a knowledge base to keep teams informed about updates on Microsoft 365 Roadmap features, facilitating proactive adaptation to changes, new releases, and deployments across Microsoft Teams, SharePoint, Outlook, and more.\n\n## Overview\n\n[![Mohammad's video](./assets/Mohammad-da-m365-roadmap-tracker02.png)](https://youtu.be/3zBANCzFcpM)\n\n## Prerequisites\n\n- [Teams Toolkit Visual Studio Code Extension](https://aka.ms/teams-toolkit) version 5.0.0 and higher or [Teams Toolkit CLI](https://aka.ms/teamsfx-toolkit-cli)\n- [Microsoft 365 Copilot license](https://learn.microsoft.com/microsoft-365-copilot/extensibility/prerequisites#prerequisites)\n- [Microsoft 365 account for development](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts).\n\n\n## Minimal path to awesome\n\n* Clone this repository (or [download this solution as a .ZIP file](https://pnp.github.io/download-partial/?url=https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-qna-graphapi-plugin) then unzip it)\n\n\n* Clone this repository and follow the minimal path to awesome in order to Ingest M365 Roadmap content in Microsoft 365\n- [Ingest M365 Roadmap content in Microsoft 365 using Microsoft Graph connectors using C# and .NET](https://github.com/pnp/graph-connectors-samples/tree/main/samples/dotnet-csharp-m365-roadmap)\n\n* Change the `connection_id` of the capabilities section in the declarativeAgent.json\nIf you are going to use sample of ingesting Microsoft 365 roadmap as is, then the connection id will be `roadmapmicrosoft365`\n\n```\n \"capabilities\": [\n {\n \"name\": \"GraphConnectors\",\n \"connections\": [\n {\n \"connection_id\": \"\"\n }\n ]\n }\n ]\n```\n\nFollow the steps to deploy your agent\n1. First, select the Teams Toolkit icon on the left in the VS Code toolbar.\n2. In the Account section, sign in with your [Microsoft 365 account](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts) if you haven't already.\n3. Create Teams app by clicking `Provision` in \"Lifecycle\" section.\n4. Select `Preview in Copilot (Edge)` or `Preview in Copilot (Chrome)` from the launch configuration dropdown.\n5. Once the Copilot app is loaded in the browser, click on the \"…\" menu and select \"Copilot chats\". You will see your declarative agent on the right rail. Clicking on it will change the experience to showcase the logo and name of your declarative agent.\n6. Ask a question to your declarative agent and it should respond based on the instructions provided.\n\n## Tools and Frameworks\n\n![drop](https://img.shields.io/badge/Teams Toolkit for VS Code-5.12.1-green.svg)\n\n\n## What's included in the template\n\n| Folder | Contents |\n| ------------ | ---------------------------------------------------------------------------------------- |\n| `.vscode` | VSCode files for debugging |\n| `appPackage` | Templates for the Teams application manifest, the GPT manifest and the API specification |\n| `env` | Environment files |\n\nThe following files can be customized and demonstrate an example implementation to get you started.\n\n| File | Contents |\n| ---------------------------------- | ---------------------------------------------------------------------------- |\n| `appPackage/declarativeAgent.json` | Define the behaviour and configurations of the declarative agent. |\n| `appPackage/manifest.json` | Teams application manifest that defines metadata for your declarative agent. |\n\nThe following are Teams Toolkit specific project files. You can [visit a complete guide on Github](https://github.com/OfficeDev/TeamsFx/wiki/Teams-Toolkit-Visual-Studio-Code-v5-Guide#overview) to understand how Teams Toolkit works.\n\n| File | Contents |\n| -------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |\n| `teamsapp.yml` | This is the main Teams Toolkit project file. The project file defines two primary things: Properties and configuration Stage definitions. |\n\n\n## Contributors\n\n* [Mohammad Amer](https://github.com/mohammadamer) - M365 Development MVP\n\n## Version history\n\nVersion|Date|Comments\n-------|----|--------\n1.0|March 10, 2025|Initial solution\n1.0|April 06, 2025|Enhanced the agent instructions\n1.1|April 09, 2025|Enhance agent conversation starters\n\n\n## Addition information and references\n\n- [Declarative agents for Microsoft 365](https://aka.ms/teams-toolkit-declarative-agent)\n\n" + }, + { + "folder": "da-microsoftdocssearchagent", + "title": "Microsoft Learn Search Agent", + "description": "An agent that helps users search and retrieve content from Microsoft Learn. ", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-microsoftdocssearchagent", + "updatedAt": "2025-12-15T00:00:00.000Z", + "longDescription": [ + "An agent that helps users search and retrieve content from Microsoft Learn. " + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Node.js" + }, + { + "key": "LANGUAGE", + "value": "JSON" + }, + { + "key": "API-PLUGIN", + "value": "Yes" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://github.com/pnp/copilot-pro-dev-samples/raw/main/samples/da-microsoftdocssearchagent/assets/preview.png", + "imageAlt": "Declarative agent that helps users search and retrieve content from Microsoft Learn.", + "readmeContent": "# Declarative Agent + MCP in VS Code \n\nThis agent assists users in finding technical information on Microsoft Learn Documentation.\n\nMicrosoft Learn Search Agent - a declarative Microsoft 365 agent that helps users query Microsoft Learn and MCP servers, answer developer questions (SPFx, Microsoft Graph, etc.), I have added CodeInterpreter and GraphicArt capabilities to do creative options performing code/graphics tasks. \n\n## Example\n\n![Preview of the agent](assets/preview.png)\n\n## Version history\n\nVersion|Date|Comments|Author|\n-------|----|--------|------|\n1.0|15th December 2025| Initial release | Paul Bullock |\n\n## Get started\n\n> **Prerequisites**\n>\n> To run this app template in your local dev machine, you will need:\n>\n> - [Node.js](https://nodejs.org/), supported versions: 18, 20, 22\n> - A [Microsoft 365 account for development](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts).\n> - [Microsoft 365 Agents Toolkit Visual Studio Code Extension](https://aka.ms/teams-toolkit) version 5.0.0 and higher or [Microsoft 365 Agents Toolkit CLI](https://aka.ms/teamsfx-toolkit-cli)\n> - [Microsoft 365 Copilot license](https://learn.microsoft.com/microsoft-365-copilot/extensibility/prerequisites#prerequisites)\n\n1. Open ATK in VS Code\n\n Click the Microsoft 365 Agents Toolkit icon in the Activity Bar. \n\n2. Sign in\n\n Open the Agents Toolkit by click on the toolkit icon in the VS Code sidebar. Under Account, authenticate with your dev M365 account.\n\n3. Provision & debug\n\n Use the Provision button in ATK to create resources. ATK will detect if your MCP server requires OAuth2 or API‐Key. Provide your Client ID/Secret or Key when prompted. Then Start Debugging to Preview agent in Copilot in Edge/Chrome. Your DA will appear under Copilot chats.\n\n4. Test your MCP‑powered agent \n\n Open the Copilot pane, select your agent and invoke any of the MCP tools with natural‑language prompts. \n\n\n## Learn More\n\n- [Build Declarative Agents (official docs)](https://learn.microsoft.com/microsoft-365-copilot/extensibility/build-declarative-agents)\n\n- [Model Context Protocol (MCP)](https://modelcontextprotocol.io/)\n\n- [Agents Toolkit guide on GitHub](https://github.com/OfficeDev/TeamsFx/wiki/Teams-Toolkit-Visual-Studio-Code-v5-Guide#overview)\n\n## Help\n\nWe do not support samples, but this community is always willing to help, and we want to improve these samples. We use GitHub to track issues, which makes it easy for community members to volunteer their time and help resolve issues.\n\nYou can try looking at [issues related to this sample](https://github.com/pnp/copilot-pro-dev-samples/issues) to see if anybody else is having the same issues.\n\nIf you encounter any issues using this sample, [create a new issue](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\nFinally, if you have an idea for improvement, [make a suggestion](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n![visitor stats](https://m365-visitor-stats.azurewebsites.net/copilot-pro-dev-samples/samples/da-microsoftdocssearchagent)\n" + }, + { + "folder": "da-MyAdvancedCommsBuddy", + "title": "My Advanced Communication Buddy - Declarative Agent with API Plugin for Microsoft 365 Copilot Sample", + "description": "First Party Declarative Agent Career Coach shared as a sample", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-MyAdvancedCommsBuddy", + "updatedAt": "2025-03-08T00:00:00.000Z", + "longDescription": [ + "The \"My Advanced Communication Buddy agent\" Declarative Agent is an open-source AI-driven tool designed to assist people in the creation of communications. This includes: Using a .Net Web API connected to SharePoint Lists using Delegated Permissions in a Microsoft 365 Declarative Agent with API Plugin with Single Sign On" + ], + "metadata": [ + { + "key": "PLATFORM", + "value": ".Net" + }, + { + "key": "LANGUAGE", + "value": "C#" + }, + { + "key": "API-PLUGIN", + "value": "Yes" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://raw.githubusercontent.com/pnp/copilot-pro-dev-samples/refs/heads/main/samples/da-MyAdvancedCommsBuddy/assets/screenshot.png", + "imageAlt": "Declarative Agent with API Plugin for Microsoft 365 Copilot Sample", + "readmeContent": "# Overview of the My Advanced Communications Buddy Sample\n\nDeclarative agent for the My Advanced Communications Buddy. This agent is designed to assist users in creating Microsoft 365 corporate communications and utilizing APIs to retrieve content for these communications as part of a business process.\n\nThis is a technical demonstrating how meeting a business scenario, can be acheived with a declarative agent supported by an API Plugin for actions the user cna perform. \n\nThis sample, include a declarative agent and the web api source code.\n\nFor advanced detail check out this blog post: [Using a .Net Web API connected to SharePoint Lists using Delegated Permissions in a Microsoft 365 Declarative Agent with API Plugin with Single Sign On | pkbullock.com](https://pkbullock.com/blog/2025/using-dotnet-webapi-using-delegated-permissions-for-microsoft-365-copilot-declarative-agent-api-plugin-with-sso)\n\nBlog Post Summary (Copilot):\n\n*This blog post provides a detailed walkthrough on building a .NET Web API that connects to SharePoint Lists using the PnP Core SDK. The API is integrated into Microsoft 365 Copilot Declarative Agent with API Plugin, utilising delegated permissions and Single Sign-On (SSO). The author explains the business scenario of a Communications Buddy, a Microsoft 365 Copilot designed to help staff create great communications by adding actions to the agent that write data to a SharePoint list.*\n\n\n![Screenshot of the agent start screen](assets/screenshot.png)\n\n\n## Version history\n\nVersion|Date|Author|Comments\n-------|----|----|--------\n1.0|March 8th, 2025| Paul Bullock |Initial release\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n---\n\n## Minimal Path to Awesome\n\n_Include consise instructions to set up and run the sample. These are just an example!_\n\n### Setup the SharePoint Site\n\n- Create a new SharePoint site to host the \"Communication Queue\" list.\n- In PowerShell, run\n\n```powershell\nConnect-PnPOnline https://.sharepoint.com/sites/M365CommunicationSite -Interactive -ClientID \n\nInvoke-PnPSiteTemplate -Path assets/pnp-provisioning-list.xml\n```\n\n### Create an App Registration\n\n- In Entra ID App Registration\n - Create a new App Registration set for single tenant mode, make a note of the client ID\n - Create a secret, make a note of the secret.\n - In API Permissions\n - Set permissions to Microsoft Graph - email, offline_access, openid, profile, Sites.Selected.\n - Remove any other permissions\n - In Expose an API\n - Create an Application ID URI\n - Add a scope \n - Scope name - \"access_as_user\"\n - Admin consent display name - Access the API on behalf of a user\n - Admin consent description - Allows the app to access the web API on behalf of the signed-in user\n - User consent display name - Access the API on your behalf\n - User consent description - Allows this app to access the web API on your behalf\n - Add a client application\n - Add ab3be6b7-f5df-413d-ac2d-abf1e3fd9c0b (it's Microsoft's token store)\n - In Token Configuration\n - Add optional claim - idtyp - Signals whether the token is an app-only token\n - In Authentication\n - Add Web platform and set following redirect URLs\n - https://teams.microsoft.com/api/platform/v1.0/oAuthConsentRedirect\n - https://oauth.pstmn.io/v1/browser-callback (optional for Postman testing)\n - https://localhost:7200 (local developement)\n - Ensure Access and ID Tokens are NOT ticked.\n\nIf you get stuck refer to this article for setup [Microsoft Entra ID SSO authentication - API Plugins | Microsoft Learn](https://learn.microsoft.com/en-us/microsoft-365-copilot/extensibility/api-plugin-authentication?WT.mc_id=M365-MVP-5003816#microsoft-entra-id-sso-authentication)\n\n### Setup the Web API\n\nIn Folder **API**\n\n- Create a resource group\n- In Visual Studio, load the project and make these changes:\n - Rename appsettings.sample.json file to appsettings.json\n - Update the appsettings.json file values\n - AzureAd > Domain - found in your Azure Entra ID home page.\n - AzureAd > TenantId - found in your Azure Entra ID home page.\n - AzureAd > ClientId - the one for the created earlier\n - SharePoint > SiteUrl e.g. https://.sharepoint.com/sites/M365CommunicationSite\n- In Visual Studio, hit publish, create a new profile with these settings\n - Target: Azure\n - Specific Target: Azure App Service (Windows)\n - Click Create New\n - Select Subscription\n - Select Resource GRoup\n - Create a hosting plan\n - Choose one most appropriate for you, there is a cost here, you will be charged.\n - For me, I used P0v3 for the Always On feature.\n - Skip API Management and follow dialog to the end and deploy the app.\n - Ensure you make a note of the newly created API Web Url.\n\n### Register the Teams application in Teams Developer Portal\n\n- Navigate to \"https://dev.teams.microsoft.com/entra-configuration\"\n- Click new client registration\n - Create a name - your choice\n - Use the URL of the newly deployed API in Azure\n - Restrict usage by org - My Organization Only\n - Restrict usage by app - Any Teams App\n - Enter the Client ID - the one used for the Web API.\n- Save\n- On the next screen, take note of \n - Microsoft Entra SSO registration ID\n - Application ID URI\n\n- Navigate to Entra ID App, and find your client ID for the web application\n- Navigate to the manifest \n - Find identifierUris and add a new one using the Application ID URI from the Teams Developer Portal\n- Save the app.\n\nI recommend you use Post Man to validate the connection.\n\n### Setup the Agent\n\n- Clone this repository\n- Open the cloned copy of this folder with Visual Studio Code\n- Ensure that the Teams Toolkit extension is installed\n- Please visit the code tour called \"deployment.json\", the settings used are:\n - From the Teams Developer Portal, use the Microsoft Entra SSO registration ID in .env file\n - Ensure the Server URL, scopes, endpoints match your environment\n- Use Teams Tookkit Provision feature to deploy\n- Use the conversation starters to see the results of agent working on the content.\n\n- Consent any diaglogs that occur and use prompt 'Create a new message called \"Copilot Test\", send to SharePoint' and confirm creation in SharePoint.\n\n-----------------------------------------------------------\n\n\n## Addition information and references\n\n- [Declarative agents for Microsoft 365](https://aka.ms/teams-toolkit-declarative-agent)\n- [Copilot Developer Camp](https://microsoft.github.io/copilot-camp/)\n- [Build API plugins from an existing API for Microsoft 365 Copilot](https://learn.microsoft.com/en-us/microsoft-365-copilot/extensibility/build-api-plugins-existing-api?WT.mc_id=M365-MVP-5003816)\n- [Configure authentication for API plugins in agents](https://learn.microsoft.com/en-us/microsoft-365-copilot/extensibility/api-plugin-authentication?WT.mc_id=M365-MVP-5003816)\n\n" + }, + { + "folder": "da-MyCommsBuddy", + "title": "My Communication Buddy", + "description": "Declarative Agent designed to assist user in creating corporate communications", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-MyCommsBuddy", + "updatedAt": "2025-05-19T00:00:00.000Z", + "longDescription": [ + "The \"My Communication Buddy agent\" Declarative Agent is an open-source AI-driven tool designed to assist people in the creation of communications - contains instructions for guiding the user on corporate style, inclusive communications." + ], + "metadata": [ + { + "key": "API-PLUGIN", + "value": "No" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://raw.githubusercontent.com/pnp/copilot-pro-dev-samples/refs/heads/main/samples/da-MyCommsBuddy/assets/screenshot.png", + "imageAlt": "My Communication Buddy", + "readmeContent": "# Overview of the My Communications Buddy Sample\n\n**Introduction**\nWelcome to the new Microsoft 365 Copilot agent for Wonderful Gardens Ltd! This innovative tool is designed to assist our staff in crafting high-quality communications for our website, social media, and SharePoint. By leveraging the power of Microsoft 365, our Copilot agent ensures that your messages are not only engaging and informative but also aligned with our corporate style guide.\n\n**Summary**\nThe Microsoft 365 Copilot agent is a versatile writing assistant tailored for Wonderful Gardens Ltd. It helps staff create communications that adhere to our corporate style guide, which emphasizes a friendly and engaging tone, informative content, and clear structure. The agent supports various types of communications, including internal and external messages, social media posts, and comprehensive communications plans.\n\n**Key features of the Copilot agent include:**\n\n- **Friendly and Engaging Tone:** Ensures your posts are conversational and accessible, making complex topics easy to understand.\n- **Informative and Helpful Content:** Provides valuable tips, tricks, and insights to help readers in their work.\n- **Clear Structure:** Uses headings, subheadings, short paragraphs, and bullet points to enhance readability.\nPersonal Experiences and Technical Details: Shares relatable experiences and step-by-step instructions to help readers implement suggestions.\n- **Visuals:** Incorporates screenshots, diagrams, and images to complement the text and add visual interest.\n- **Inclusive Language:** Promotes gender-neutral terms, respects cultural diversity, and avoids ableist language to ensure accessibility for all readers.\n\nAdditionally, the Copilot agent offers guidance on setting up communications plans, including countdowns for announcements and post-communication strategies. It also provides instructions for social media, with allowed hashtags like #WonderfulGardensFloweringExcellance, #WonderfulGardensBlooms, and #WonderfulGardensAdvancedAI to amplify our messages.\n\nWith the Microsoft 365 Copilot agent, Wonderful Gardens Ltd staff can confidently create professional and impactful communications that resonate with our audience.\n\n\n## Example Prompts\n\n### In Teams\n\n- Create an announcement about a product launch for a new Drone product the X1000 series. The announcement should follow our corporate style guide and suggest a communications plan. The product details are: The Drone X1000 series is designed to redefine your aerial adventures. Specifications: state-of-the-art 4k camera, 300 minutes of flight time, 3km range, and a top speed of 60km/h. Intelligent flight modes include Follow Me, Waypoints, and Return to Home.\n\n- Please write a call for speakers message from the engineering and marketing teams for the Drone Launch.\n\n- I would like to create a thank you message to the team for their hard work and dedication to the team in the Drone X1000 series launch event. \n\n- Generate an image of a drone launching, using abstract art, no people or faces.\n\n### In Word\n\n- \"So, there's this guy Bob on the board, right? He's been around for like 20 years or something, doing all sorts of stuff with SharePoint. You know, that thing everyone uses for documents and whatnot. Anyway, Bob's been in the game forever, knows his way around it like nobody's business. He's done a bunch of projects, probably some big ones too. People seem to think he's pretty good at what he does, I guess.\" - Using the paragraph, rewrite the statement to be include with our corporate style guide and inclusive guidelines.\n\nInclude some hobbies, he likes art, walking the dog, mountain climbing and volunteering for charity work. Adjust the tone for a executive chairman.\n\n- Generate a welcome image, professional, clear imagery with photographic quality of a crowd welcoming a new person onboard of a new company. \n\n- Generate a welcome image, professional, clear imagery with photographic quality of a crowd welcoming a new person onboard of a new company. Use abstract art, no people or faces.\n\n## Screenshot of Agent\n\n\n\n![Screenshot of the agent start screen](assets/screenshot.png)\n\n\n## Version history\n\nVersion|Date|Author|Comments\n-------|----|----|--------\n1.0|March 8th, 2025| Paul Bullock |Initial release\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n---\n\n## Minimal Path to Awesome\n\n### Setup the Agent\n\n- Clone this repository\n- Open the cloned copy of this folder with Visual Studio Code\n- Ensure that the Teams Toolkit extension is installed\n- Use Teams Tookkit Provision feature to provision\n- Use the conversation starters to see the results of agent working on the content.\n\n## Addition information and references\n\n- [Declarative agents for Microsoft 365](https://aka.ms/teams-toolkit-declarative-agent)\n- [Copilot Developer Camp](https://microsoft.github.io/copilot-camp/)\n\n\n\n\n\n\n\n\n" + }, + { + "folder": "da-PMSpecReviewer", + "title": "PM Spec Reviewer", + "description": "A Microsoft Teams app that helps Product Managers review product specifications using AI assistance.", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-PMSpecReviewer", + "updatedAt": "2025-04-22T00:00:00.000Z", + "longDescription": [ + "An agent that reviews PM specs and nudges users towards simplicity, clarity, brevity. Give it a spec as input and it will review it and provide feedback." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Node.js" + }, + { + "key": "LANGUAGE", + "value": "Json" + }, + { + "key": "API-PLUGIN", + "value": "NO" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://github.com/pnp/copilot-pro-dev-samples/raw/main/templates/pending-image.png", + "imageAlt": "Declarative agent is pending an image, this is a placeholder", + "readmeContent": "# PM Spec Reviewer\n\n## Build a basic declarative agent\n\nA Microsoft Teams app that helps Product Managers review product specifications using AI assistance.\n\n## Contributors\n\n* [Sid Mathur](https://github.com/mathursrus)\n\n## Version history\n\nVersion|Date|Comments\n-------|----|--------\n1.0 | April 22, 2025 | Initial release\n\n\n## Get started with the template\n\n> **Prerequisites**\n>\n> To run this app template in your local dev machine, you will need:\n>\n> - A [Microsoft 365 account for development](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts).\n> - [Teams Toolkit Visual Studio Code Extension](https://aka.ms/teams-toolkit) version 5.0.0 and higher or [Teams Toolkit CLI](https://aka.ms/teamsfx-toolkit-cli)\n> - [Microsoft 365 Copilot license](https://learn.microsoft.com/microsoft-365-copilot/extensibility/prerequisites#prerequisites)\n\n\n1. First, select the Teams Toolkit icon on the left in the VS Code toolbar.\n2. In the Account section, sign in with your [Microsoft 365 account](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts) if you haven't already.\n3. Create Teams app by clicking `Provision` in \"Lifecycle\" section.\n4. Select `Preview in Copilot (Edge)` or `Preview in Copilot (Chrome)` from the launch configuration dropdown.\n5. Once the Copilot app is loaded in the browser, click on the \"…\" menu and select \"Copilot chats\". You will see your declarative agent on the right rail. Clicking on it will change the experience to showcase the logo and name of your declarative agent.\n6. Ask a question to your declarative agent and it should respond based on the instructions provided.\n\n## What's included in the template\n\n| Folder | Contents |\n| ------------ | ---------------------------------------------------------------------------------------- |\n| `.vscode` | VSCode files for debugging |\n| `appPackage` | Templates for the Teams application manifest, the GPT manifest and the API specification |\n| `env` | Environment files |\n\nThe following files can be customized and demonstrate an example implementation to get you started.\n\n| File | Contents |\n| ---------------------------------- | ---------------------------------------------------------------------------- |\n| `appPackage/declarativeAgent.json` | Define the behaviour and configurations of the declarative agent. |\n| `appPackage/manifest.json` | Teams application manifest that defines metadata for your declarative agent. |\n\nThe following are Teams Toolkit specific project files. You can [visit a complete guide on Github](https://github.com/OfficeDev/TeamsFx/wiki/Teams-Toolkit-Visual-Studio-Code-v5-Guide#overview) to understand how Teams Toolkit works.\n\n| File | Contents |\n| -------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |\n| `teamsapp.yml` | This is the main Teams Toolkit project file. The project file defines two primary things: Properties and configuration Stage definitions. |\n\n## Addition information and references\n\n- [Declarative agents for Microsoft 365](https://aka.ms/teams-toolkit-declarative-agent)\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n" + }, + { + "folder": "da-PMSpecWriter", + "title": "PM Spec Writer", + "description": "A Microsoft Teams app that helps Product Managers write and manage product specifications using AI assistance.", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-PMSpecWriter", + "updatedAt": "2025-04-22T00:00:00.000Z", + "longDescription": [ + "A Microsoft Teams app that helps Product Managers write and manage product specifications using AI assistance." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Node.js" + }, + { + "key": "LANGUAGE", + "value": "Json" + }, + { + "key": "API-PLUGIN", + "value": "NO" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://github.com/pnp/copilot-pro-dev-samples/raw/main/templates/pending-image.png", + "imageAlt": "Declarative agent is pending an image, this is a placeholder", + "readmeContent": "# PM Spec Writer\n\nA Microsoft Teams app that helps Product Managers write and manage product specifications using AI assistance.\n\n## Features\n\n- AI-powered assistance for writing product specifications\n- Template-based spec creation\n- Integration with Microsoft Teams\n- Collaborative editing capabilities\n- Version control for specifications\n\n## Contributors\n\n* [Sid Mathur](https://github.com/mathursrus)\n\n## Version history\n\nVersion|Date|Comments\n-------|----|--------\n1.0 | April 22, 2025 | Initial release\n\n## Prerequisites\n\n- [Node.js](https://nodejs.org/) (version 16 or higher)\n- [npm](https://www.npmjs.com/) (usually comes with Node.js)\n- [Microsoft Teams](https://www.microsoft.com/en-us/microsoft-teams/group-chat-software)\n- [Visual Studio Code](https://code.visualstudio.com/) (recommended)\n\n## Minimal path to awesome\n\n1. Clone the repository\n2. Navigate to the `da-PMSpecWriter` directory\n3. Install dependencies:\n ```bash\n npm install\n ```\n4. Configure your environment variables\n5. Start the development server:\n ```bash\n npm start\n ```\n\n## Configuration\n\n1. Create a `.env` file in the `env` directory\n2. Add the following environment variables:\n ```\n BOT_ID=your_bot_id\n BOT_PASSWORD=your_bot_password\n ```\n\n## Development\n\nThis project uses:\n- TypeScript\n- React\n- Microsoft Teams Toolkit\n- Azure Bot Framework\n\n## Contributing\n\nPlease read [CONTRIBUTING.md](../../CONTRIBUTING.md) for details on our code of conduct and the process for submitting pull requests.\n\n## License\n\nThis project is licensed under the MIT License - see the [LICENSE](../../LICENSE) file for details. \n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n" + }, + { + "folder": "da-pnpassistant", + "title": "Declarative Agent - PnP Controls Assistant", + "description": "This declarative agent is designed to assist users in finding more information about the PnP reusable React controls.", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-pnpassistant", + "updatedAt": "2025-05-18T00:00:00.000Z", + "longDescription": [ + "This declarative agent is designed to assist users in finding more information about the PnP reusable React controls. It provides a user-friendly interface for users to ask questions and receive relevant answers based on the information available in the PnP documentation." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Copilot" + }, + { + "key": "LANGUAGE", + "value": "Json" + }, + { + "key": "API-PLUGIN", + "value": "no" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://github.com/pnp/copilot-pro-dev-samples/raw/main/samples/da-pnpassistant/assets/PnP%20Assistant%20-%20suggest%20control.gif", + "imageAlt": "Declarative agent for PnP Controls Assistant", + "readmeContent": "# Declarative Agent - PnP Assistant\n\n## Summary\n\nThis declarative agent is designed to assist users in finding more information about the PnP reusable React controls. It provides a user-friendly interface for users to ask questions and receive relevant answers based on the information available in the PnP documentation.\n\nPnP Assistant helping user to find information about a specific control:\n![PnP Assistant - help with control]()\n\nPnP Assistant helping user to find information about a specific control's properties:\n![PnP Assistant - control properties]()\n\nPnP Assistant helping user to find a control that matches a specific requirement:\n![PnP Assistant - suggest control]()\n\n## Contributors\n\n* [Guido Zambarda](https://github.com/GuidoZam) - M365 Development MVP\n\n## Version history\n\nVersion|Date|Comments\n-------|----|--------\n1.0 | May 18, 2025 | Initial release\n\n> **Prerequisites**\n>\n> To run this app template from your local dev machine, you will need:\n>\n> * A [Microsoft 365 account for development](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts).\n> * [Teams Toolkit Visual Studio Code Extension](https://aka.ms/teams-toolkit) version 5.0.0 and higher or [Teams Toolkit CLI](https://aka.ms/teamsfx-toolkit-cli)\n> * [Microsoft 365 Copilot license](https://learn.microsoft.com/microsoft-365-copilot/extensibility/prerequisites#prerequisites)\n\n## Minimal path to awesome\n\n1. Clone this repository (or [download solution as .ZIP file](https://pnp.github.io/download-partial/?url=https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-pnpassistant))\n\n2. Rename the `.env.dev.example` file to `.env.dev` and update the following values:\n\n ```bash\n # Built-in environment variables\n TEAMSFX_ENV=\" dev\"\n APP_NAME_SUFFIX=\" dev\"\n\n TEAMS_APP_ID=aad90fc0-dbbc-42e2-b9c1-f30b8cc3894d\n TEAMS_APP_TENANT_ID=\n M365_TITLE_ID=\n M365_APP_ID=\n ```\n\n3. From the VSCode Teams Toolkit sign-in to your Microsoft 365 account.\n4. From the VSCode Teams Toolkit provision the solution to create the Teams app.\n5. Go to [https://www.office.com/chat?auth=2](https://www.office.com/chat?auth=2) URL and select the agent.\n6. Use one of the conversation starters to start trying the agent.\n\n## Features\n\nThis sample demonstrates the following concepts:\n\n* Build a declarative agent that uses one or multiple sites as knowledge base.\n* Answer questions about the PnP reusable React controls and PnP reusable property controls.\n\n\n\n## Help\n\nWe do not support samples, but this community is always willing to help, and we want to improve these samples. We use GitHub to track issues, which makes it easy for community members to volunteer their time and help resolve issues.\n\nYou can try looking at [issues related to this sample](https://github.com/pnp/copilot-pro-dev-samples/issues?q=label%3A%22sample%3A%20da-pnpassistant%22) to see if anybody else is having the same issues.\n\nIf you encounter any issues using this sample, [create a new issue](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\nFinally, if you have an idea for improvement, [make a suggestion](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n" + }, + { + "folder": "da-PnPPowerShell-assistant", + "title": "PnP PowerShell Assistant Agent", + "description": "This declarative agent, named PnP PowerShell Assistant helps users creating PnP PowerShell cmdlets", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-PnPPowerShell-assistant", + "updatedAt": "2025-05-30T00:00:00.000Z", + "longDescription": [ + "This declarative agent, named PnP PowerShell Assistant helps users creating PnP PowerShell cmdlets to perform specific actions. The agent is design to provide a PowerShell cmdlet that you can easily copy and paste to your PowerShell console." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Copilot" + }, + { + "key": "LANGUAGE", + "value": "Json" + }, + { + "key": "API-PLUGIN", + "value": "No" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://github.com/pnp/copilot-pro-dev-samples/raw/main/samples/da-PnPPowerShell-assistant/assets/PnPPowerShellAssistant.png", + "imageAlt": "Declarative agent for PnP PowerShell Assistant", + "readmeContent": "# Overview of the PnP PowerShell Assistant Agent\n\nThis declarative agent, named PnP PowerShell Assistant helps users creating PnP PowerShell cmdlets to perform specific actions. The agent is design to provide a PowerShell cmdlet that you can easily copy and paste to your PowerShell console.\n\n![Screenshot of the agent start screen](assets/PnPPowerShellAssistant.png)\n\n## Contributors\n\n* [Aimery Thomas](https://github.com/a1mery)\n\n## Version history\n\nVersion|Date|Comments\n-------|----|--------\n1.0 | May 30, 2025 | Initial release\n\n\n## Get started with the template\n\n> **Prerequisites**\n>\n> To run this app template in your local dev machine, you will need:\n>\n> - [Node.js](https://nodejs.org/), supported versions: 18, 20, 22\n> - A [Microsoft 365 account for development](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts).\n> - [Microsoft 365 Agents Toolkit Visual Studio Code Extension](https://aka.ms/teams-toolkit) version 5.0.0 and higher or [Microsoft 365 Agents Toolkit CLI](https://aka.ms/teamsfx-toolkit-cli)\n> - [Microsoft 365 Copilot license](https://learn.microsoft.com/microsoft-365-copilot/extensibility/prerequisites#prerequisites)\n\n\n## Minimal Path to Awesome\n\n### Setup the Agent\n\n- Clone this repository\n- Open the cloned copy of this folder with Visual Studio Code\n- Ensure that the Microsoft 365 Agents Toolkit extension is installed\n- Use Microsoft 365 Agents Toolkit Provision feature to provision\n- Start asking questions to the agent\n\n## What's included in the template\n\n| Folder | Contents |\n| ------------ | ---------------------------------------------------------------------------------------- |\n| `.vscode` | VSCode files for debugging |\n| `appPackage` | Templates for the application manifest, the GPT manifest and the API specification |\n| `env` | Environment files |\n\nThe following files can be customized and demonstrate an example implementation to get you started.\n\n| File | Contents |\n| ---------------------------------- | ---------------------------------------------------------------------------- |\n| `appPackage/declarativeAgent.json` | Define the behaviour and configurations of the declarative agent. |\n| `appPackage/manifest.json` | application manifest that defines metadata for your declarative agent. |\n\nThe following are Microsoft 365 Agents Toolkit specific project files. You can [visit a complete guide on Github](https://github.com/OfficeDev/TeamsFx/wiki/Teams-Toolkit-Visual-Studio-Code-v5-Guide#overview) to understand how Microsoft 365 Agents Toolkit works.\n\n| File | Contents |\n| -------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |\n| `m365agents.yml` | This is the main Microsoft 365 Agents Toolkit project file. The project file defines two primary things: Properties and configuration Stage definitions. |\n\n## Addition information and references\n\n- [Declarative agents for Microsoft 365](https://aka.ms/teams-toolkit-declarative-agent)\n- [Copilot Developer Camp](https://microsoft.github.io/copilot-camp/)\n\n\n\n" + }, + { + "folder": "da-PnPScriptSamplesAgent", + "title": "PnP Script Samples Agent", + "description": "Agent for Copilot for Microsoft 365, is designed to assist users with PowerShell scripts related to PnP Script Samples.", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-PnPScriptSamplesAgent", + "updatedAt": "2025-08-07T00:00:00.000Z", + "longDescription": [ + "Agent for Copilot for Microsoft 365, is designed to assist users with PowerShell scripts related to PnP Script Samples." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Copilot" + }, + { + "key": "LANGUAGE", + "value": "JSON" + }, + { + "key": "API-PLUGIN", + "value": "No" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://github.com/pnp/copilot-pro-dev-samples/raw/main/samples/da-PnPScriptSamplesAgent/assets/script-samples-preview.png", + "imageAlt": "Declarative agent example on the home page of Copilot with the agent selected", + "readmeContent": "# PnP Script Samples Agent\n\n## Summary\n\nAgent for Copilot for Microsoft 365, is designed to assist users with PowerShell scripts related to PnP Script Samples.\nThis agent reviews existing scripts, analyzes them for potential improvements, and helps build supporting documentation. \n\nBy leveraging the capabilities of Microsoft 365 Copilot, the agent provides insightful suggestions and streamlines the development process, ensuring scripts are optimized and well-documented.\n\n## Contributors\n\n* [Paul Bullock](https://github.com/pkbullock)\n\n## Version history\n\nVersion|Date|Comments\n-------|----|--------\n1.0| August 7th, 2025|Initial release\n\n## Prerequisites\n\n* Microsoft 365 tenant with Microsoft 365 Copilot\n\n## Minimal path to awesome\n\n1. First, select the Microsoft 365 Agents Toolkit icon on the left in the VS Code toolbar.\n2. In the Account section, sign in with your [Microsoft 365 account](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts) if you haven't already.\n3. Create app by clicking `Provision` in \"Lifecycle\" section.\n4. Select `Preview in Copilot (Edge)` or `Preview in Copilot (Chrome)` from the launch configuration dropdown.\n5. Once the Copilot agent is loaded in the browser, click on the \"…\" menu and select \"See all agents\". You will see your declarative agent on the left rail. Clicking on it will change the experience to showcase the logo and name of your declarative agent.\n6. Ask a question to your declarative agent and it should respond based on the instructions provided.\n\n## Features\n\nExtended description of the contents of the sample. What elements does it include? What concepts does illustrate?\n\nUsing this sample you can extend Microsoft 365 Copilot with an agent that:\n\n* How to Contribute\n* Ask questions about the repo\n\n\n# Looking for help\n\nWe do not support samples, but this community is always willing to help, and we want to improve these samples. We use GitHub to track issues, which makes it easy for community members to volunteer their time and help resolve issues.\n\nYou can try looking at [issues related to this sample](https://github.com/pnp/copilot-pro-dev-samples/issues?q=label%3A%22sample%3A%20YOUR-SOLUTION-NAME%22) to see if anybody else is having the same issues.\n\nIf you encounter any issues using this sample, [create a new issue](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\nFinally, if you have an idea for improvement, [make a suggestion](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n![](https://m365-visitor-stats.azurewebsites.net/copilot-pro-dev-samples/samples/da-PnPScriptSamplesAgent)\n" + }, + { + "folder": "da-PositivityAgent", + "title": "Positivity Agent", + "description": "An agent designed to premote positivity, motivation, and confidence-building support to users.", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-PositivityAgent", + "updatedAt": "2025-05-20T00:00:00.000Z", + "longDescription": [ + "An agent designed to provide positivity, motivation, and confidence-building support to users. It offers encouraging and uplifting responses to help users maintain a positive mindset and build their self-esteem." + ], + "metadata": [ + { + "key": "API-PLUGIN", + "value": "No" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://raw.githubusercontent.com/pnp/copilot-pro-dev-samples/refs/heads/main/samples/da-PositivityAgent/assets/screenshot.png", + "imageAlt": "My Communication Buddy", + "readmeContent": "# Overview of the Positivity Agent template\n\nThis agent, named Positivity Agent for Microsoft Copilot. Its purpose is to provide users with positivity, motivation, and confidence-building support. The agent is designed to offer encouraging and uplifting responses to help users maintain a positive mindset and build their self-esteem.\n\n![Screenshot of the agent start screen](assets/screenshot.png)\n\n\n## Version history\n\nVersion|Date|Author|Comments\n-------|----|----|--------\n1.0| May 20th, 2025| Paul Bullock | Initial release\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n---\n\n## Minimal Path to Awesome\n\n### Setup the Agent\n\n- Clone this repository\n- Open the cloned copy of this folder with Visual Studio Code\n- Ensure that the Teams Toolkit extension is installed\n- Use Teams Tookkit Provision feature to provision\n- Use the conversation starters to see the results of agent working on the content.\n\n## Addition information and references\n\n- [Declarative agents for Microsoft 365](https://aka.ms/teams-toolkit-declarative-agent)\n- [Copilot Developer Camp](https://microsoft.github.io/copilot-camp/)\n\n" + }, + { + "folder": "da-PostPilotAgent", + "title": "Agent PostPilot", + "description": "Agent helps write LinkedIn post to announce Prompt of the week", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-PostPilotAgent", + "updatedAt": "2024-11-12T00:00:00.000Z", + "longDescription": [ + "Agent helps write LinkedIn post to announce Prompt of the week" + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Node.js" + }, + { + "key": "LANGUAGE", + "value": "TypeScript" + }, + { + "key": "API-PLUGIN", + "value": "No" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + }, + { + "key": "SHAREPOINT", + "value": "No" + } + ], + "imageUrl": "https://github.com/pnp/copilot-pro-dev-samples/raw/main/samples/da-PostPilotAgent/assets/thumbnail.png", + "imageAlt": "Declarative agent to generate prompt of the week LinkedIn post", + "readmeContent": "# Agent PostPilot\n\nHelps write LinkedIn posts for Copilot prompt of the week. \n\n![image](./assets/demo.gif)\n\n## Get started with the template\n\n> **Prerequisites**\n>\n> To run this app template in your local dev machine, you will need:\n>\n> - [Node.js](https://nodejs.org/), supported versions: 16, 18\n> - A [Microsoft 365 account for development](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts).\n> - [Teams Toolkit Visual Studio Code Extension](https://aka.ms/teams-toolkit) version 5.0.0 and higher or [Teams Toolkit CLI](https://aka.ms/teamsfx-toolkit-cli)\n> - [Microsoft 365 Copilot license](https://learn.microsoft.com/microsoft-365-copilot/extensibility/prerequisites#prerequisites)\n\n\n1. First, select the Teams Toolkit icon on the left in the VS Code toolbar.\n2. In the Account section, sign in with your [Microsoft 365 account](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts) if you haven't already.\n3. Create Teams app by clicking `Provision` in \"Lifecycle\" section.\n4. Select `Preview in Copilot (Edge)` or `Preview in Copilot (Chrome)` from the launch configuration dropdown.\n5. Once the Copilot app is loaded in the browser, click on the \"…\" menu and select \"Copilot chats\". You will see your declarative agent on the right rail. Clicking on it will change the experience to showcase the logo and name of your declarative agent.\n6. Use conversation starters with your LinkedIn post prompt and send the full prompt to your declarative agent for a response based on the given instructions.\n\n\n\n## Contributors\n\n* [Rabia Williams](https://github.com/rabwill)\n\n## Version history\n\nVersion|Date|Comments\n-------|----|----\n1.0|November 14, 2025|Initial release\n\n\n\n## What's included in the template\n\n| Folder | Contents |\n| ------------ | ---------------------------------------------------------------------------------------- |\n| `.vscode` | VSCode files for debugging |\n| `appPackage` | Templates for the Teams application manifest, the GPT manifest and the API specification |\n| `env` | Environment files |\n\nThe following files can be customized and demonstrate an example implementation to get you started.\n\n| File | Contents |\n| ------------------------------------ | ------------------------------------------------------------------------------ |\n| `appPackage/declarativeAgent.json` | Define the behaviour and configurations of the declarative agent. |\n| `appPackage/manifest.json` | Teams application manifest that defines metadata for your declarative agent. |\n\nThe following are Teams Toolkit specific project files. You can [visit a complete guide on Github](https://github.com/OfficeDev/TeamsFx/wiki/Teams-Toolkit-Visual-Studio-Code-v5-Guide#overview) to understand how Teams Toolkit works.\n\n| File | Contents |\n| -------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |\n| `teamsapp.yml` | This is the main Teams Toolkit project file. The project file defines two primary things: Properties and configuration Stage definitions. |\n\n## Addition information and references\n\n- [Declarative agents for Microsoft 365](https://aka.ms/teams-toolkit-declarative-agent)\n\n" + }, + { + "folder": "da-PresentationAgent", + "title": "Presentation Agent for Microsoft 365 Copilot", + "description": "Declarative agent helps users prepare for presentations", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-PresentationAgent", + "updatedAt": "2025-01-28T00:00:00.000Z", + "longDescription": [ + "The \"Presentation\" Declarative Agent is an open-source AI-driven tool designed to assist professionals in preparing for presentations." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Copilot" + }, + { + "key": "LANGUAGE", + "value": "JSON" + }, + { + "key": "API-PLUGIN", + "value": "No" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://raw.githubusercontent.com/pnp/copilot-pro-dev-samples/refs/heads/main/samples/da-PresentationAgent/assets/PresentationAgent02.png", + "imageAlt": "Copilot agent that helps users organize presentation content", + "readmeContent": "# Overview of the Presentation declarative agent\n\nThe Presentation declarative agent demonstrates how Copilot can assist users in creating a presentation based on simple instructions. \nAs a agent builder, it illustrates how you can use instructions to steer Copilot to help the user. Take a look at the [instructions file](appPackage/instruction.txt) to see more.\n\n![The agent in use](./assets/PresentationAgent01.png)\n![The agent in use](./assets/PresentationAgent02.png)\n\n## Minimal path to awesome\n\n> **Prerequisites**\n>\n> To run this app you will need:\n>\n> - [Node.js](https://nodejs.org/), supported versions: 18, 20\n> - A [Microsoft 365 account](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts) with permission to sideload Teams applications.\n> - [Teams Toolkit Visual Studio Code Extension](https://aka.ms/teams-toolkit) version 5.0.0 and higher\n> - [Microsoft 365 Copilot license](https://learn.microsoft.com/microsoft-365-copilot/extensibility/prerequisites#prerequisites)\n\n1. First, select the Teams Toolkit icon on the left in the VS Code toolbar.\n2. In the Account section, sign in with your [Microsoft 365 account](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts) if you haven't already. Ensure that both \"Custom App Upload Enabled\" and \"Copilot Access Enabled\" have green checkmarks\n3. Create and provision the Teams app by clicking `Provision` in \"Lifecycle\" section.\n4. Select the \"Run and Debug\" icon in the left sidebar, and then select `Preview in Copilot (Edge)` or `Preview in Copilot (Chrome)` from the launch configuration dropdown.\n5. Once the Copilot app is loaded in the browser, click on the \"…\" menu and select \"Copilot agents\". You will see your declarative agent on the right rail. Clicking on it will change the experience to showcase the logo and name of the declarative agent.\n6. Ask a question to your declarative agent and it should respond based on the instructions provided.\n\n## Addition information and references\n\n- [Declarative agents for Microsoft 365](https://aka.ms/teams-toolkit-declarative-agent)\n\n" + }, + { + "folder": "da-product-support", + "title": "Product support declararative agent", + "description": "This sample demonstrates how to create a product support agent using Microsoft 365 Copilot.", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-product-support", + "updatedAt": "2025-06-10T00:00:00.000Z", + "longDescription": [ + "This sample demonstrates how to create a product support agent using Microsoft 365 Copilot. The agent can answer questions about products using content stored in Microsoft 365." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Node.js" + }, + { + "key": "LANGUAGE", + "value": "TypeScript" + }, + { + "key": "API-PLUGIN", + "value": "No" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://github.com/pnp/copilot-pro-dev-samples/raw/main/samples/da-product-support/assets/preview.gif", + "imageAlt": "Demonstration of the Product Support agent", + "readmeContent": "# Product support declarative agent\n\n## Summary\n\nThis sample demonstrates how to extend Microsoft 365 Copilot with a declarative agent to help with product support scenarios. The agent is designed to assist customer support employees by answering questions related to a range of products.\n\nIt uses content from the product's documentation stored in Microsoft 365 to provide accurate and relevant answers.\n\n![Product support declarative agent](./assets/preview.gif)\n\n## Contributors\n\n* [Garry Trinder](https://github.com/garrytrinder)\n\n## Version history\n\n| Version | Date | Comments |\n|--|--|--|\n| 1.1 | June 10, 2025 | Maintenance release |\n| 1.0 | April 16, 2025 | Initial release |\n\n## Prerequisites\n\n* [Node.js](https://nodejs.org/)\n* A [Microsoft 365 tenant](https://learn.microsoft.com/en-us/microsoftteams/platform/concepts/build-and-test/prepare-your-o365-tenant) prepared for development\n* [Microsoft 365 Agents Toolkit](https://aka.ms/teams-toolkit) Visual Studio Code extension\n* Microsoft 365 Copilot license\n\n## Minimal path to awesome\n\n### 1. Setup document repository\n\n1. Go to [OneDrive](https://www.microsoft365.com/onedrive)\n1. Go to **My files**\n1. Create a new folder called **Products**\n1. Upload documents from the **docs** folder in this repository to the **Products** folder\n1. Navigate to the **Products** folder\n1. Expand the **Details** tab on the right\n1. Expand the **More details** tab\n1. Copy the Path to the Products folder using the **Copy** button\n\n### 2. Provision agent\n\n1. Open the project in Visual Studio Code\n1. Open **env/.env.dev**\n1. Set the value of the **DOCUMENTS_URL** variable to the path you copied from OneDrive.\n1. On the primary sidebar, select the **Microsoft 365 Agents Toolkit icon**\n1. In the LIFECYCLE section, select **Provision**\n1. If prompted, **sign in** with your [Microsoft 365 account](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts)\n1. Wait for the provisioning to complete\n\n### 3. Test the agent\n\n1. Press **F5** to launch a browser that navigates that opens the declarative agent in Microsoft 365 Copilot. If prompted, sign in with your Microsoft 365 account.\n\nTry the following prompts:\n\n* What can you do?\n* Tell me about Eagle Air?\n* Recommend a product for a farmer.\n* What is the difference between Eagle Air and Contoso Quad? Show your answer in a table.\n\n## Troubleshooting and feature requests\n\nWe do not support samples, but this community is always willing to help, and we want to improve these samples. We use GitHub to track issues, which makes it easy for community members to volunteer their time and help resolve issues.\n\nYou can try looking at [issues related to this sample](https://github.com/pnp/copilot-pro-dev-samples/issues?q=label%3A%22sample%3A%20da-product-support%22) to see if anybody else is having the same issues.\n\nIf you encounter any issues using this sample, [create a new issue](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\nFinally, if you have an idea for improvement, [make a suggestion](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n\n" + }, + { + "folder": "da-PromptCoach", + "title": "Prompt Coach Declarative Agent for Microsoft 365 Copilot Sample", + "description": "First Party Declarative Agent Prompt Coach shared as a sample", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-PromptCoach", + "updatedAt": "2024-10-04T00:00:00.000Z", + "longDescription": [ + "The \"Prompt Coach\" is an open-source declarative Agent designed to assist new Copilot users in creating effective and well-structured prompts. It provides a variety of conversation starters to help users generate prompts, analyze and improve existing prompts, ensure compliance with responsible AI guidelines, and learn the principles of prompt engineering. The agent also offers examples of good prompts and troubleshooting advice for prompts that do not yield the expected output. Leveraging the capabilities of OneDrive, SharePoint, and Graph Connectors, \"Prompt Coach\" aims to streamline the prompt creation process and enhance user proficiency in prompt engineering." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Node.js" + }, + { + "key": "LANGUAGE", + "value": "TypeScript" + }, + { + "key": "API-PLUGIN", + "value": "No" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://raw.githubusercontent.com/pnp/copilot-pro-dev-samples/refs/heads/main/samples/da-PromptCoach/assets/PromptCoach1.png", + "imageAlt": "Prompt Coach Declarative Agent for Microsoft 365 Copilot Sample", + "readmeContent": "# Overview of the Prompt Coach declarative agent sample\n![Prompt Coach Start Screen](assets/PromptCoach1.png)\n\nThe \"Prompt Coach\" Declarative Agent is an open-source AI-driven tool designed to assist new Copilot users in creating effective and well-structured prompts. This agent acts as a supportive and knowledgeable teacher, guiding users through the process of prompt generation, analysis, and improvement. The primary goal of the Prompt Coach is to help users articulate their requests clearly and effectively, ensuring that Copilot can generate the best possible responses.\n\nKey features of the Prompt Coach include:\n- **Prompt Generation**: Helps users create well-structured prompts by asking for essential information such as the goal, context, source, and expectations. Ensures that all necessary details are included before generating the final prompt.\n- **Prompt Analysis**: Evaluates user-provided prompts and offers detailed feedback on how they can be improved. Provides an original prompt, an improved version, and a detailed explanation of the changes made.\n- **Prompt Compliance**: Checks if prompts adhere to Responsible AI guidelines, considering privacy, confidentiality, bias, fairness, and transparency. Provides detailed information on any issues found and suggestions for improvement.\n- **Fixing Prompts**: Assists users in troubleshooting prompts that are not yielding the expected results. Analyzes the prompt and the issues provided, then offers an improved version with more context.\n- **Prompt Examples**: Provides examples of well-structured prompts, highlighting their purpose and explaining why they are effective. Each example includes a goal, context, source, and expectations.\n\nThe Prompt Coach maintains a professional and supportive tone throughout interactions, ensuring that conversations are contextual and relevant. It integrates with OneDrive, SharePoint, and Graph Connectors to enhance its capabilities. The agent is designed to ask clarifying and follow-up questions without overwhelming the user, keeping context across the entire conversation.\n\nThis open-source project aims to empower individuals to create high-quality prompts through structured guidance and support. By providing a customizable and extensible framework, the Prompt Coach Declarative Agent can be adapted to various user needs, making it a versatile tool for improving prompt engineering skills and achieving better results with Copilot.\n\n## Build a basic declarative agent\n\nWith the declarative agent, you can build a custom version of Copilot that can be used for specific scenarios, such as for specialized knowledge, implementing specific processes, or simply to save time by reusing a set of AI prompts. For example, a grocery shopping Copilot declarative agent can be used to create a grocery list based on a meal plan that you send to Copilot.\n\n## Get started with the sample\n\n> **Prerequisites**\n>\n> To run this app sample in your local dev machine, you will need:\n>\n> - [Node.js](https://nodejs.org/), supported versions: 16, 18\n> - A [Microsoft 365 account for development](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts).\n> - [Teams Toolkit Visual Studio Code Extension](https://aka.ms/teams-toolkit) version 5.0.0 and higher or [Teams Toolkit CLI](https://aka.ms/teamsfx-toolkit-cli)\n> - [Microsoft 365 Copilot license](https://learn.microsoft.com/microsoft-365-copilot/extensibility/prerequisites#prerequisites)\n\n![PromptCoach in Action](assets/PromptCoach2.png)\n\n1. First, select the Teams Toolkit icon on the left in the VS Code toolbar.\n2. In the Account section, sign in with your [Microsoft 365 account](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts) if you haven't already.\n3. Create Teams app by clicking `Provision` in \"Lifecycle\" section.\n4. Select `Preview in Copilot (Edge)` or `Preview in Copilot (Chrome)` from the launch configuration dropdown.\n5. Once the Copilot app is loaded in the browser, click on the \"…\" menu and select \"Copilot chats\". You will see your declarative agent on the right rail. Clicking on it will change the experience to showcase the logo and name of your declarative agent.\n6. Ask a question to your declarative agent and it should respond based on the instructions provided.\n\n## What's included in the sample\n\n| Folder | Contents |\n| ------------ | ---------------------------------------------------------------------------------------- |\n| `.vscode` | VSCode files for debugging |\n| `appPackage` | Templates for the Teams application manifest, the GPT manifest and the API specification |\n| `env` | Environment files |\n\nThe following files can be customized and demonstrate an example implementation to get you started.\n\n| File | Contents |\n| ------------------------------------ | ------------------------------------------------------------------------------ |\n| `appPackage/declarativeAgent.json` | Define the behaviour and configurations of the declarative agent. |\n| `appPackage/manifest.json` | Teams application manifest that defines metadata for your declarative agent. |\n\nThe following are Teams Toolkit specific project files. You can [visit a complete guide on Github](https://github.com/OfficeDev/TeamsFx/wiki/Teams-Toolkit-Visual-Studio-Code-v5-Guide#overview) to understand how Teams Toolkit works.\n\n| File | Contents |\n| -------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |\n| `teamsapp.yml` | This is the main Teams Toolkit project file. The project file defines two primary things: Properties and configuration Stage definitions. |\n\n## Addition information and references\n\n- [Declarative agents for Microsoft 365](https://aka.ms/teams-toolkit-declarative-agent)\n\n" + }, + { + "folder": "da-qna-graphapi-plugin", + "title": "Graph QnA agent for Microsoft 365 Copilot", + "description": "Copilot declarative agent makes direct calls to Microsoft Graph", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-qna-graphapi-plugin", + "updatedAt": "2025-01-16T00:00:00.000Z", + "longDescription": [ + "Demonstrates how to use the Microsoft Graph API as a Copilot plugin in a declarative agent " + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "none" + }, + { + "key": "LANGUAGE", + "value": "English" + }, + { + "key": "API-PLUGIN", + "value": "No" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://raw.githubusercontent.com/pnp/copilot-pro-dev-samples/refs/heads/main/samples/da-qna-graphapi-plugin/assets/plugin_response.png", + "imageAlt": "Direct call to Graph QnA by Declarative Agent for Microsoft 365 Copilot Sample", + "readmeContent": "# Use the Microsoft Graph API as a Copilot plugin for a declarative agent\n\n## Summary\n\nThis sample demonstrates how to use the Microsoft Graph API as a Copilot plugin in a declarative agent. The agent only retrieves data from QnAs content defined in Microsoft Search using the `/search/query` endpoint of the Microsoft Graph API so users can ask questions based on it.\n\nThe following blog post describes the complete solution setup: [https://blog.franckcornu.com/post/copilot-graph-api-qna-plugin/](https://blog.franckcornu.com/post/copilot-graph-api-qna-plugin)\n\n![\"Graph API QnA Plugin - Data \"](./assets/mssearch_qnas.png)\n\n![\"Graph API QnA Plugin - Confirm with request\"](./assets/plugin_confirm.png)\n\n![\"Graph API QnA Plugin - Output\"](./assets/plugin_response.png)\n\n## Contributors\n\n* [Franck Cornu](https://github.com/FranckyC)- M365 Development MVP\n## Version history\n\nVersion|Date|Comments\n-------|----|--------\n1.0|January 16, 2025|Initial solution\n\n## Prerequisites\n\n- [Teams Toolkit Visual Studio Code Extension](https://aka.ms/teams-toolkit) version 5.0.0 and higher or [Teams Toolkit CLI](https://aka.ms/teamsfx-toolkit-cli)\n- [Microsoft 365 Copilot license](https://learn.microsoft.com/microsoft-365-copilot/extensibility/prerequisites#prerequisites)\n- A [Microsoft 365 account for development](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts).\n\n## Minimal path to awesome\n\n* Clone this repository (or [download this solution as a .ZIP file](https://pnp.github.io/download-partial/?url=https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-qna-graphapi-plugin) then unzip it)\n* Import QnA samples using the **sample_qnas.csv** file into your Microsoft Search admin center (or use your own):\n\n ![\"QnAs import](./assets/import_qnas.png)\n\n* Open the **mssearchplugin-openapi.yml** file, look for the `securitySchemes` property and replace `tenantid` by your own ID:\n\n ```yaml\n securitySchemes:\n azureaadv2:\n type: oauth2\n flows:\n authorizationCode:\n authorizationUrl: https://login.microsoftonline.com/tenantid/oauth2/v2.0/authorize\n tokenUrl: https://login.microsoftonline.com/tenantid/oauth2/v2.0/token\n scopes: \n QnA.Read.All: Read QnAs from Microsoft Search\n ```\n* Register an Entra ID application in Azure and add the API permissions `QnA.Read.All` (delegated). Add the `https://teams.microsoft.com/api/platform/v1.0/oAuthRedirect` as a redirect URL for web platform in the **Authentication** settings.\n\n2. In the [Teams developer portal](https://dev.teams.microsoft.com/), add a new OAuth client registration and register a new client with the following information (replace `tenantid` by your own value):\n\n **App settings**\n\n - **Registration name**: MicrosoftSearch\n - **Base URL**: `https://graph.microsoft.com/beta` (QnA are only usable through the beta endpoint)\n - **Restrict usage by org**: My organization only\n - **Restrict usage by app**: Any Teams app (when agent is deployed, use the Teams app ID).\n\n **OAuth settings**\n - **Client ID**: <the entra ID application ID>\n - **Client secret**: <the Entra ID application secret>\n - **Authorization endpoint**: https://login.microsoftonline.com/tenantid/oauth2/v2.0/authorize\n - **Token endpoint**: https://login.microsoftonline.com/tenantid/oauth2/v2.0/token\n - **Refresh endpoint**: https://login.microsoftonline.com/tenantid/oauth2/v2.0/refresh\n - **Scope**: QnA.Read.All\n\n Save the information. A new OAuth registration key will be generated.\n\n3. Open the **ai-plugin.json** file and replace the auth property by the following, using the key from the previous step. You can also use the `${{OAUTH2_REGISTRATIONKEY}}` token defined the `.env.dev` file: \n\n ```json\n \"auth\": {\n \"type\": \"OAuthPluginVault\",\n \"reference_id\": \"ZTRhNDM5YjQtM2...\"\n },\n ```\n4. From Teams Toolkit, sign-in to your Microsoft 365 account.\n5. From Teams Toolkit, provision the solution to create the Teams app.\n5. Go to [https://www.office.com/chat?auth=2](https://www.office.com/chat?auth=2) URL and enable the developer mode by using the `-developer on` prompt.\n7. Ask a question like _\"Is Microsoft Search in Bing secure?\"_. You should see the plugin triggered.\n\n## Features\n\nThe following sample demonstrates the following concepts:\n- Use Microsoft Graph API as an API plugin by using specific endpoint and instructions.\n- Query the QnA content from Microsoft Search and use it for Copilot answers.\n\n\n\n## Help\n\nSearch for:\nda-qna-graphapi-plugin\n\nSearch for:\n@FranckyC\n\nWe do not support samples, but this community is always willing to help, and we want to improve these samples. We use GitHub to track issues, which makes it easy for community members to volunteer their time and help resolve issues.\n\nYou can try looking at [issues related to this sample](https://github.com/pnp/copilot-pro-dev-samples/issues?q=label%3A%22sample%3A%20da-qna-graphapi-plugin%22) to see if anybody else is having the same issues.\n\nIf you encounter any issues using this sample, [create a new issue](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\nFinally, if you have an idea for improvement, [make a suggestion](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n\n" + }, + { + "folder": "da-repairs-oauth-js", + "title": "Declarative for Microsoft 365 Copilot with an API plugin connected to an API secured with OAuth", + "description": "This sample demonstrates how to build a declarative agent for Microsoft 365 Copilot that answers questions about repairs. The agent uses an API plugin to connect to an API secured with OAuth. The project contains an Azure Function that serves as the API and uses the built-in Azure App Service authentication and authorization capabilities (also referred to as Easy Auth) to secure access to APIs.", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-repairs-oauth-js", + "updatedAt": "2024-10-11T00:00:00.000Z", + "longDescription": [ + "This sample demonstrates how to build a declarative agent for Microsoft 365 Copilot that answers questions about repairs. The agent uses an API plugin to connect to an API secured with OAuth. The project contains an Azure Function that serves as the API and uses the built-in Azure App Service authentication and authorization capabilities (also referred to as Easy Auth) to secure access to APIs." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Node.js" + }, + { + "key": "LANGUAGE", + "value": "TypeScript" + }, + { + "key": "API-PLUGIN", + "value": "Yes" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://github.com/pnp/copilot-pro-dev-samples/blob/main/samples/da-repairs-oauth-js/assets/screenshot.png?raw=true", + "imageAlt": "Declarative agent answering questions about repairs using the information from an API secured with OAuth", + "readmeContent": "# Declarative for Microsoft 365 Copilot with an API plugin connected to an API secured with OAuth\n\n## Summary\n\nThis sample demonstrates how to build a declarative agent for Microsoft 365 Copilot that answers questions about repairs. The agent uses an API plugin to connect to an API secured with OAuth. The project contains an Azure Function that serves as the API and uses the built-in Azure App Service authentication and authorization capabilities (also referred to as Easy Auth) to secure access to APIs.\n\n![Declarative agent answering questions about repairs using the information from an API secured with OAuth](./assets/screenshot.png)\n\n## Contributors\n\n* [Waldek Mastykarz](https://github.com/waldekmastykarz)\n\n## Version history\n\nVersion|Date|Comments\n-------|----|--------\n1.1|October 11, 2024|Updated OAuth configuration and project setup\n1.0|October 4, 2024|Initial release\n\n## Prerequisites\n\n* Microsoft 365 tenant with Microsoft 365 Copilot\n* [Visual Studio Code](https://code.visualstudio.com/) with the [Teams Toolkit](https://marketplace.visualstudio.com/items?itemName=TeamsDevApp.ms-teams-vscode-extension) extension\n* [Node.js v18](https://nodejs.org/en/download/package-manager)\n* [Azure Functions Core Tools](https://learn.microsoft.com/azure/azure-functions/functions-run-local#install-the-azure-functions-core-tools)\n\n## Minimal path to awesome\n\n* Clone this repository (or [download this solution as a .ZIP file](https://pnp.github.io/download-partial/?url=https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-repairs-oauth-js) then unzip it)\n* Open the Teams Toolkit extension and sign in to your Microsoft 365 tenant with Microsoft 365 Copilot\n* Select **Debug in Copilot (Edge)** from the launch configuration dropdown\n\n## Features\n\nThis sample illustrates the following concepts:\n\n* Building a declarative agent for Microsoft 365 Copilot with an API plugin\n* Connecting an API plugin to an API secured with OAuth\n* Using Azure Functions to build an API secured with Azure App Service authentication and authorization (Easy Auth)\n* Using [dev tunnels](https://learn.microsoft.com/azure/developer/dev-tunnels/overview) to test the API plugin locally\n\n## Help\n\nWe do not support samples, but this community is always willing to help, and we want to improve these samples. We use GitHub to track issues, which makes it easy for community members to volunteer their time and help resolve issues.\n\nYou can try looking at [issues related to this sample](https://github.com/pnp/copilot-pro-dev-samples/issues?q=label%3A%22sample%3A%20da-repairs-oauth-js%22) to see if anybody else is having the same issues.\n\nIf you encounter any issues using this sample, [create a new issue](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\nFinally, if you have an idea for improvement, [make a suggestion](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n\n" + }, + { + "folder": "da-repairs-oauth-python", + "title": "Declarative for Microsoft 365 Copilot with an API plugin connected to an API secured with OAuth (Python)", + "description": "This sample demonstrates how to build a declarative agent for Microsoft 365 Copilot that answers questions about repairs. The agent uses an API plugin to connect to a Python Azure Function API secured with OAuth.", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-repairs-oauth-python", + "updatedAt": "2024-10-11T00:00:00.000Z", + "longDescription": [ + "This sample demonstrates how to build a declarative agent for Microsoft 365 Copilot that answers questions about repairs. The agent uses an API plugin to connect to a Python Azure Function API secured with OAuth. The project contains an Azure Function that serves as the API and uses the built-in Azure App Service authentication and authorization capabilities (also referred to as Easy Auth) to secure access to APIs." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Python" + } + ], + "imageUrl": "https://github.com/pnp/copilot-pro-dev-samples/raw/main/samples/da-repairs-oauth-python/assets/screenshot.png", + "imageAlt": "Preview of the sample", + "readmeContent": "# Declarative agent for Microsoft 365 Copilot with an API plugin connected to a Python API secured with OAuth\n\n## Summary\n\nThis sample demonstrates how to build a declarative agent for Microsoft 365 Copilot that answers questions about repairs. The agent uses an API plugin to connect to a Python Azure Function API secured with OAuth. The project contains an Azure Function that serves as the API and uses the built-in Azure App Service authentication and authorization capabilities (also referred to as Easy Auth) to secure access to APIs.\n\n![Declarative agent answering questions about repairs using the information from an API secured with OAuth](./assets/screenshot.png)\n\n## Contributors\n\n* [AjayJ12-MSFT](https://github.com/AjayJ12-MSFT)\n\n## Version history\n\nVersion|Date|Comments\n-------|----|--------\n1.0|May 11, 2025|Initial release\n\n## Prerequisites\n\n* Microsoft 365 tenant with Microsoft 365 Copilot\n* [Visual Studio Code](https://code.visualstudio.com/) with the [Teams Toolkit](https://marketplace.visualstudio.com/items?itemName=TeamsDevApp.ms-teams-vscode-extension) extension\n* [Python](https://www.python.org/) 3.9 or later\n* [Azure Functions Core Tools](https://learn.microsoft.com/azure/azure-functions/functions-run-local#install-the-azure-functions-core-tools)\n\n## Minimal path to awesome\n\n* Clone this repository (or [download this solution as a .ZIP file](https://pnp.github.io/download-partial/?url=https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-repairs-oauth-python) then unzip it)\n* Open the Teams Toolkit extension and sign in to your Microsoft 365 tenant with Microsoft 365 Copilot\n* Select **Debug in Copilot (Edge)** from the launch configuration dropdown\n\n## Features\n\nThis sample illustrates the following concepts:\n\n* Building a declarative agent for Microsoft 365 Copilot with an API plugin\n* Connecting an API plugin to an API secured with OAuth\n* Using Azure Functions in Python to build an API secured with Azure App Service authentication and authorization (Easy Auth)\n* Using [dev tunnels](https://learn.microsoft.com/azure/developer/dev-tunnels/overview) to test the API plugin locally\n\n## Help\n\nWe do not support samples, but this community is always willing to help, and we want to improve these samples. We use GitHub to track issues, which makes it easy for community members to volunteer their time and help resolve issues.\n\nYou can try looking at [issues related to this sample](https://github.com/pnp/copilot-pro-dev-samples/issues?q=label%3A%22sample%3A%20da-repairs-oauth-python%22) to see if anybody else is having the same issues.\n\nIf you encounter any issues using this sample, [create a new issue](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\nFinally, if you have an idea for improvement, [make a suggestion](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n\n" + }, + { + "folder": "da-repairs-oauth-validated-js", + "title": "Declarative Agent with an API plugin that secured by Entra ID that validates its own tokens", + "description": "This sample demonstrates how to build a declarative agent for Microsoft 365 Copilot that answers questions about repairs. The agent uses an API plugin to connect to an API secured with OAuth. The project contains an Azure Function that validates tokens using an open source library.", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-repairs-oauth-validated-js", + "updatedAt": "2024-10-11T00:00:00.000Z", + "longDescription": [ + "This sample demonstrates how to build a declarative agent for Microsoft 365 Copilot that answers questions about repairs. The agent uses an API plugin to connect to an API secured with OAuth. The project contains an Azure Function that serves as the API and uses an open source library to validate Entra ID tokens to secure access to APIs." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Node.js" + }, + { + "key": "LANGUAGE", + "value": "TypeScript" + }, + { + "key": "API-PLUGIN", + "value": "Yes" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://github.com/pnp/copilot-pro-dev-samples/blob/main/samples/da-repairs-oauth-validated-js/assets/screenshot.gif?raw=true", + "imageAlt": "Declarative agent answering questions about repairs using the information from an API secured with Entra ID", + "readmeContent": "# Declarative Agent with an API plugin connected to an API secured with OAuth with validation\n\n## Summary\n\nThis sample demonstrates how to build a declarative agent for Microsoft 365 Copilot that answers questions about repairs. The agent uses an API plugin to connect to an API that is secured with Entra ID.\n\n![picture of the app in action](./assets/screenshot.gif)\n\nKey aspects of the sample:\n\n - Shows how to configure Teams Toolkit make a declarative agent with an API plugin that is secured with Entra ID with just F5 to run locally.\n\n - Shows how to validate an Entra ID access token in NodeJS (JavaScript/TypeScript) rather than rely on an external service. This differs from the Teams Toolkit scaffolding, which doesn't authenticate users locally but instead relies on use of [Azure App Services authentication (EasyAuth)](https://learn.microsoft.com/azure/app-service/overview-authentication-authorization) for security in Azure only.\n\n Here are some advantages of validating the token in your code instead of using Easy Auth\n\n - Since Easy Auth doesn't work locally, local requests are not authenticated. In addition to a small security opening, this causes the app to have 2 plugin files, including an anonymous one for local debugging. By handling in code, local requests are authenticated and the packaging source files are the same for all environments.\n\n - If the code is deployed outside of Azure app services, and if the included Bicep files aren't used, the code will appear to work but will do no token validation at all, thus wide open to anonymous requests.\n\n - With the Easy Auth scenario, Copilot is sending the access token directly to Azure App Services authentication. If something goes wrong there is no way to inspect the OAuth token, and debugging options are limited. In this sample you can set a breakpoint to inspect the token and walk through the validation to see what went wrong.\n\n - Easy Auth does not check the scope, or check to see if the token is an app token\n\n For these reasons, developers may choose to follow the approach used in this sample. \n \n Microsoft does not currently provide a library for validating OAuth tokens in NodeJS; the [official documentation is here](https://learn.microsoft.com/entra/identity-platform/claims-validation). So this sample uses an open source library ([jwt-validate](https://www.npmjs.com/package/jwt-validate)) by [Waldek Mastykarz](https://github.com/waldekmastykarz), which aims to follow the documented practices. This library is not a Microsoft product, and is subject to an MIT license (i.e. use at your own risk). Many thanks to Waldek for creating the library.\n\n## Prerequisites\n![drop](https://img.shields.io/badge/Teams Toolkit for VS Code-5.10-green.svg)\n\n * Microsoft 365 tenant with Microsoft 365 Copilot\n * [Visual Studio Code](https://code.visualstudio.com/) with [Teams Toolkit](https://marketplace.visualstudio.com/items?itemName=TeamsDevApp.ms-teams-vscode-extension) v5.10 or greater\n * [NodeJS v18](https://nodejs.org/en/download/package-manager)\n * [Azure Functions core tools](https://learn.microsoft.com/azure/azure-functions/functions-run-local#install-the-azure-functions-core-tools)\n\n## Version history\n\nVersion|Date|Author|Comments\n-------|----|----|--------\n1.1|October 11, 2024|Waldek Mastykarz|Updated OAuth configuration and project setup\n1.0|October 9, 2024|Bob German|Initial release\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n---\n\n## Minimal Path to Awesome\n\n* Clone this repository\n* Open the cloned copy of this folder with Visual Studio Code\n* Install required npm packages\n\n```shell\n npm install\n```\n\n* Press F5 to run the application. A browser window should open offering to add your application to Microsoft Teams.\n\n## Features\n\nThis sample illustrates the following concepts:\n\n- Building a declarative agent for Microsoft 365 Copilot with an API plugin\n- Connecting an API plugin to an API secured with OAuth\n- Using Azure Functions to build an API secured with Azure App\n- Service authentication and authorization without Easy Auth\n- Using dev tunnels to test the API plugin locally\n\n" + }, + { + "folder": "da-repairs-oauth-validated-python", + "title": "Declarative Agent with OAuth-secured API Plugin (Python)", + "description": "This sample demonstrates how to build a declarative agent for Microsoft 365 Copilot that answers questions about repairs. The agent uses an API plugin to connect to an API secured with OAuth. The project contains a Python Azure Function that validates Entra ID tokens.", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-repairs-oauth-validated-python", + "updatedAt": "2026-05-07T00:00:00.000Z", + "longDescription": [ + "This sample demonstrates how to build a declarative agent for Microsoft 365 Copilot that answers questions about repairs. The agent uses an API plugin to connect to an API secured with OAuth. The project contains a Python Azure Function that serves as the API and uses PyJWT to validate Entra ID tokens to secure access to APIs." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Copilot" + }, + { + "key": "LANGUAGE", + "value": "Python" + }, + { + "key": "API-PLUGIN", + "value": "Yes" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": null, + "imageAlt": "", + "readmeContent": "# Declarative Agent with an API plugin connected to an OAuth-secured API with validation (Python)\n\n## Summary\n\nThis sample demonstrates how to build a declarative agent for Microsoft 365 Copilot that answers questions about repairs. The agent uses an API plugin to connect to an API that is secured with Entra ID.\n\n![picture of the app in action](./assets/screenshot.gif)\n\nKey aspects of the sample:\n\n- Shows how to configure Microsoft 365 Agents Toolkit to make a declarative agent with an API plugin that is secured with Entra ID with just F5 to run locally.\n\n- Shows how to validate an Entra ID access token in **Python** using [PyJWT](https://pyjwt.readthedocs.io/) rather than rely on an external service. This differs from the Teams Toolkit scaffolding, which doesn't authenticate users locally but instead relies on [Azure App Services authentication (EasyAuth)](https://learn.microsoft.com/azure/app-service/overview-authentication-authorization) for security in Azure only. Note: the included Bicep still enables Easy Auth as defense-in-depth when deployed to Azure, but the primary validation is done in code.\n\nHere are some advantages of validating the token in your code instead of using Easy Auth:\n\n- Since Easy Auth doesn't work locally, local requests are not authenticated. By handling in code, local requests are authenticated and the packaging source files are the same for all environments.\n\n- If the code is deployed outside of Azure App Services, and if the included Bicep files aren't used, the code will appear to work but will do no token validation at all.\n\n- With the Easy Auth scenario, if something goes wrong there is no way to inspect the OAuth token. In this sample you can set a breakpoint to inspect the token and walk through the validation.\n\n- Easy Auth does not check the scope, or check to see if the token is an app token.\n\n## Prerequisites\n\n![drop](https://img.shields.io/badge/Microsoft%20365%20Agents%20Toolkit-5.10-green.svg)\n\n* Microsoft 365 tenant with Microsoft 365 Copilot\n* [Visual Studio Code](https://code.visualstudio.com/) with [Microsoft 365 Agents Toolkit](https://marketplace.visualstudio.com/items?itemName=TeamsDevApp.ms-teams-vscode-extension) v5.10 or greater\n* [Python](https://www.python.org/downloads/) version 3.10 or later\n* [Azure Functions Core Tools](https://learn.microsoft.com/azure/azure-functions/functions-run-local) v4\n\n## Version history\n\nVersion|Date|Author|Comments\n-------|----|----|--------\n1.0|May 7, 2026|[YugalPradhan31](https://github.com/YugalPradhan31)|Initial release (Python port)\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n---\n\n## Minimal Path to Awesome\n\n* Clone this repository\n* Open the cloned copy of this folder with Visual Studio Code\n* Install required Python packages:\n\n ```bash\n pip install -r requirements.txt\n ```\n\n* Press F5 to run the application. A browser window should open offering to add your application to Microsoft Teams.\n\n## Features\n\nThis sample illustrates the following concepts:\n\n- Building a declarative agent for Microsoft 365 Copilot with an API plugin\n- Connecting an API plugin to an API secured with OAuth\n- Using Python Azure Functions to build an API secured with Entra ID\n- Validating Entra ID tokens in code using PyJWT (without Easy Auth)\n- Using dev tunnels to test the API plugin locally\n\n## Further reading\n\n- [Build declarative agents for Microsoft 365 Copilot](https://learn.microsoft.com/microsoft-365-copilot/extensibility/overview-declarative-agent)\n- [API Plugins for Microsoft 365 Copilot](https://learn.microsoft.com/microsoft-365-copilot/extensibility/overview-api-plugins)\n- [PyJWT Documentation](https://pyjwt.readthedocs.io/)\n- [Azure Functions Python developer guide](https://learn.microsoft.com/azure/azure-functions/functions-reference-python)\n\n" + }, + { + "folder": "da-resolvemate-api", + "title": "Resolve Mate ticketing system agent", + "description": "Demonstrates how to build a declarative agent for Microsoft 365 Copilot that allows you to manage customer support tickets efficiently. .", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-resolvemate-api", + "updatedAt": "2025-02-22T00:00:00.000Z", + "longDescription": [ + "This sample demonstrates how to build a declarative agent for Microsoft 365 Copilot that allows you to manage customer support tickets efficiently. The agent uses an API plugin to connect to an anonymous API. The project contains an Azure Function that serves as the API." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": ".NET" + }, + { + "key": "LANGUAGE", + "value": "C#" + }, + { + "key": "API-PLUGIN", + "value": "Yes" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://raw.githubusercontent.com/pnp/copilot-pro-dev-samples/refs/heads/main/samples/da-resolvemate-api/assets/screenshot-ticket-details.png", + "imageAlt": "Support ticket shown by this agent", + "readmeContent": "# Resolve Mate\n\n## Summary\n\nResolve Mate streamlines support by analyzing and retrieving tickets based on various criteria. This sample demonstrates how to build a declarative agent for Microsoft 365 Copilot that allows you to manage customer support tickets efficiently. The agent uses an API plugin to connect to an anonymous API. The project contains an Azure Function that serves as the API.\n\n![Declarative agent showing ticket list](./assets/architecture.png)\n\n![Declarative agent showing ticket list](./assets/screenshot-ticket-prompts.png)\n\n![Declarative agent showing ticket details](./assets/screenshot-ticket-details.png)\n\n## Features\n\nThis sample illustrates the following concepts:\n\n* Building a declarative agent for Microsoft 365 Copilot with an API plugin\n* Connecting an API plugin to an anonymous API\n* Using [ngrok](https://ngrok.com/) to test the API plugin locally\n\n## Functions\n\nThe following functions are available in Resolve Mate:\n\n1. **getTicketById**: Find a ticket by its ID. This feature allows you to retrieve a specific customer support ticket using its unique identifier. For example, you can find a ticket with ID 5.\n2. **getTicketsByStatusAndPriority**: Find tickets by status and priority. This feature allows you to retrieve customer support tickets based on their status and priority. For example, you can find all tickets with status 'Open' and priority 'High'.\n3. **searchTickets**: Search for tickets by subject or description. This feature allows you to search for customer support tickets based on specific keywords in the ticket subject or description. For example, you can find all tickets that mention 'product setup' in the subject or description.\n4. **updateTicket**: Update ticket details. This feature allows you to update the details of a customer support ticket. For example, you can update the status, priority, or resolution of a ticket.\n5. **getResolvedTicketsWithSatisfaction**: Find resolved tickets with satisfaction rating. This feature allows you to retrieve customer support tickets that have been resolved along with the customer satisfaction rating. For example, you can find all resolved tickets with a satisfaction rating of '5'.\n\n## Contributors\n\n* [Ejaz Hussain](https://github.com/ejazhussain)\n* [Linktree Profile](https://linktr.ee/ehussain)\n\n## Version history\n\nVersion|Date|Comments\n-------|----|--------\n1.0|Feb 22, 2025|Initial release\n\n## Prerequisites\n\n* Microsoft 365 tenant with Microsoft 365 Copilot\n* [Visual Studio Code](https://code.visualstudio.com/) with the [Teams Toolkit](https://marketplace.visualstudio.com/items?itemName=TeamsDevApp.ms-teams-vscode-extension) extension\n* [Node.js v18](https://nodejs.org/en/download/package-manager)\n\n* Create the ResolveMate Azure SQL database using the provided SQL script (dbSchema.sql). The schema files are located in the database folder.\n\n* After creating the database, update the database connection string in the `appsettings.json` file located at `/da-resolvemate-api/src/api/O365C.WebAPI.ResolveMate/ResolveMate.API`.\n\n```json\n \"AppSettings\": {\n \"ConnectionString\": \"your Azure SQL database connection string goes here\"\n },\n```\n\n* Up and running the web API under `src/api` folder either to Azure or use Ngrok for public URL for the API.\n\n\n## Minimal path to awesome\n\n1. Clone this repository (or [download this solution as a .ZIP file](https://pnp.github.io/download-partial/?url=https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-resolvemate-api) then unzip it).\n\n2. Get the public URL of the web API either using ngrok or Azure Web App and add that web API URL under `.env.dev` file, something like below:\n ```cmd\n OPENAPI_SERVER_URL=https://49de-195-188-1-107.ngrok-free.app\n ```\n\n3. Provide the URL of the document library. This document library contains documentation related to your API, which can help users understand and utilize the API effectively.\n \n ```cmd\n SHAREPOINT_DOCS_URL=https://yourtenant.sharepoint.com/sites/resolve-mate/Shared%20Documents\n ```\n\n4. Open the Teams Toolkit extension and sign in to your Microsoft 365 tenant with Microsoft 365 Copilot\n\n5. Select **Debug in Copilot (Edge)** from the launch configuration dropdown\n\n## Help\n\nWe do not support samples, but this community is always willing to help, and we want to improve these samples. We use GitHub to track issues, which makes it easy for community members to volunteer their time and help resolve issues.\n\nYou can try looking at [issues related to this sample](https://github.com/pnp/copilot-pro-dev-samples/issues?q=label%3A%22sample%3A%20da-ristorante-api%22) to see if anybody else is having the same issues.\n\nIf you encounter any issues using this sample, [create a new issue](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\nFinally, if you have an idea for improvement, [make a suggestion](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n" + }, + { + "folder": "da-resource-allocation", + "title": "Resource Allocation Assistant", + "description": "Resource Allocation Assistant is a declarative AI Agent that helps managers optimize team workloads and balance resource allocation effectively.", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-resource-allocation", + "updatedAt": "2025-03-05T00:00:00.000Z", + "longDescription": [ + "The \"Resource Allocation\" declarative agent is a sample agent that helps managers optimize team workloads and balance resource allocation effectively. It provides conversation starters to help managers assess team workload, identify workload imbalances, optimize task distribution, manage high-priority tasks, prevent burnout and improve efficiency, and monitor and adjust workload." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Node.js" + }, + { + "key": "LANGUAGE", + "value": "TypeScript" + }, + { + "key": "API-PLUGIN", + "value": "No" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://github.com/pnp/copilot-pro-dev-samples/blob/main/samples/da-resource-allocation/assets/ResourceAssistant.png?raw=true", + "imageAlt": "Resource Allocation Assistant", + "readmeContent": "# Overview of the Resource Assistant agent sample\n![Resource assistant start screen](assets/ResourceAssistant.png)\n\n🚀 Resource Allocation Assistant is a Microsoft Teams Declarative AI Agent designed to help managers and project leads assess workloads, identify resource bottlenecks, and optimize task distribution within their teams. This AI-powered agent provides smart workload insights and recommendations based on user input, ensuring balanced work allocation and preventing burnout.\n\n## 🛠 **Features**\n✅ **Workload Assessment** – Helps managers evaluate ongoing tasks and resource availability. \n✅ **Task Redistribution** – Suggests optimal ways to balance workloads across team members. \n✅ **Bottleneck Detection** – Identifies overworked employees and underutilized resources. \n\n## Get started with the template\n\n> **Prerequisites**\n>\n> To run this app template in your local dev machine, you will need:\n>\n> - [Node.js](https://nodejs.org/), supported versions: 18, 20\n> - A [Microsoft 365 account for development](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts).\n> - [Teams Toolkit Visual Studio Code Extension](https://aka.ms/teams-toolkit) version 5.0.0 and higher or [Teams Toolkit CLI](https://aka.ms/teamsfx-toolkit-cli)\n> - [Microsoft 365 Copilot license](https://learn.microsoft.com/microsoft-365-copilot/extensibility/prerequisites#prerequisites)\n\n![image](https://github.com/user-attachments/assets/e1c2a3b3-2e59-4e9b-8335-19315e92ba30)\n\n1. First, select the Teams Toolkit icon on the left in the VS Code toolbar.\n2. In the Account section, sign in with your [Microsoft 365 account](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts) if you haven't already.\n3. Create Teams app by clicking `Provision` in \"Lifecycle\" section.\n4. Select `Preview in Copilot (Edge)` or `Preview in Copilot (Chrome)` from the launch configuration dropdown.\n5. Once the Copilot app is loaded in the browser, click on the \"…\" menu and select \"Copilot chats\". You will see your declarative agent on the right rail. Clicking on it will change the experience to showcase the logo and name of your declarative agent.\n6. Ask a question to your declarative agent and it should respond based on the instructions provided.\n\n## What's included in the template\n\n| Folder | Contents |\n| ------------ | ---------------------------------------------------------------------------------------- |\n| `.vscode` | VSCode files for debugging |\n| `appPackage` | Templates for the Teams application manifest, the GPT manifest and the API specification |\n| `env` | Environment files |\n\nThe following files can be customized and demonstrate an example implementation to get you started.\n\n| File | Contents |\n| ---------------------------------- | ---------------------------------------------------------------------------- |\n| `appPackage/declarativeAgent.json` | Define the behaviour and configurations of the declarative agent. |\n| `appPackage/manifest.json` | Teams application manifest that defines metadata for your declarative agent. |\n\nThe following are Teams Toolkit specific project files. You can [visit a complete guide on Github](https://github.com/OfficeDev/TeamsFx/wiki/Teams-Toolkit-Visual-Studio-Code-v5-Guide#overview) to understand how Teams Toolkit works.\n\n| File | Contents |\n| -------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |\n| `teamsapp.yml` | This is the main Teams Toolkit project file. The project file defines two primary things: Properties and configuration Stage definitions. |\n\n## Extend the template\n\n- [Add conversation starters](https://learn.microsoft.com/microsoft-365-copilot/extensibility/build-declarative-agents?tabs=ttk&tutorial-step=3): Conversation starters are hints that are displayed to the user to demonstrate how they can get started using the declarative agent.\n- [Add web content](https://learn.microsoft.com/microsoft-365-copilot/extensibility/build-declarative-agents?tabs=ttk&tutorial-step=4) for the ability to search web information.\n- [Add OneDrive and SharePoint content](https://learn.microsoft.com/microsoft-365-copilot/extensibility/build-declarative-agents?tabs=ttk&tutorial-step=5) as grounding knowledge for the agent.\n- [Add Microsoft Graph connectors content](https://learn.microsoft.com/microsoft-365-copilot/extensibility/build-declarative-agents?tabs=ttk&tutorial-step=6) to ground agent with enterprise knowledge.\n- [Add API plugins](https://learn.microsoft.com/microsoft-365-copilot/extensibility/build-declarative-agents?tabs=ttk&tutorial-step=7) for agent to interact with REST APIs.\n\n## Addition information and references\n\n- [Declarative agents for Microsoft 365](https://aka.ms/teams-toolkit-declarative-agent)\n\n\n\n\n\n" + }, + { + "folder": "da-ristorante-api-csharp", + "title": "Browse the menu and place an order at a local Italian restaurant using Microsoft 365 Copilot (C#)", + "description": "This sample demonstrates how to build a declarative agent for Microsoft 365 Copilot that allows you to browse a menu of a local Italian restaurant and place an order. The agent uses an API plugin to connect to an anonymous API built with C# Azure Functions (.NET 10).", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-ristorante-api-csharp", + "updatedAt": "2026-05-05T00:00:00.000Z", + "longDescription": [ + "This sample demonstrates how to build a declarative agent for Microsoft 365 Copilot that allows you to browse a menu of a local Italian restaurant and place an order. The agent uses an API plugin to connect to an anonymous API. The project contains a C# Azure Function (.NET 10) that serves as the API." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": ".NET" + }, + { + "key": "LANGUAGE", + "value": "C#" + }, + { + "key": "API-PLUGIN", + "value": "Yes" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://github.com/pnp/copilot-pro-dev-samples/raw/main/samples/da-ristorante-api-csharp/assets/screenshot-menu.png", + "imageAlt": "Declarative agent showing what's on the menu for lunch", + "readmeContent": "# Browse the menu and place an order at a local Italian restaurant using Microsoft 365 Copilot (C#)\n\n## Summary\n\nThis sample demonstrates how to build a declarative agent for Microsoft 365 Copilot that allows you to browse a menu of a local Italian restaurant and place an order. The agent uses an API plugin to connect to an anonymous API. The project contains a C# Azure Function (.NET 10) that serves as the API.\n\nThis is the C# port of the [da-ristorante-api](https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-ristorante-api) TypeScript sample.\n\n![Declarative agent showing what's on the menu for lunch](assets/screenshot-menu.png)\n![Declarative agent ordering lunch](assets/screenshot-order.png)\n\n## Features\n\nThis sample illustrates the following concepts:\n\n* Building a declarative agent for Microsoft 365 Copilot with an API plugin\n* Connecting an API plugin to an anonymous API\n* Using C# Azure Functions (.NET 10 isolated worker) as the API backend\n* Using [dev tunnels](https://learn.microsoft.com/azure/developer/dev-tunnels/overview) to test the API plugin locally\n\n## Contributors\n\n* [Yugal Pradhan](https://github.com/YugalPradhan31)\n\n## Version history\n\nVersion|Date|Comments\n-------|----|--------\n1.0|May 5, 2026|Initial release\n\n## Prerequisites\n\n* Microsoft 365 tenant with Microsoft 365 Copilot\n* [.NET 10 SDK](https://dotnet.microsoft.com/download/dotnet/10.0)\n* [Azure Functions Core Tools v4](https://learn.microsoft.com/azure/azure-functions/functions-run-local#install-the-azure-functions-core-tools)\n* [Visual Studio 2022](https://aka.ms/vs) 17.11 or higher\n* [Microsoft 365 Agents Toolkit for Visual Studio](https://aka.ms/install-teams-toolkit-vs)\n\n## Minimal Path to Awesome\n\n* Clone this repository (or [download this solution as a .ZIP file](https://pnp.github.io/download-partial/?url=https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-ristorante-api-csharp) then unzip it)\n ```bash\n git clone https://github.com/pnp/copilot-pro-dev-samples.git\n cd copilot-pro-dev-samples/samples/da-ristorante-api-csharp\n ```\n* Open **DaRistoranteApi.slnx** in Visual Studio 2022\n* In the debug dropdown menu, select **Dev Tunnels > Create a Tunnel** (set authentication type to Public) or select an existing public dev tunnel\n* Right-click the **M365Agent** project in Solution Explorer and select **Microsoft 365 Agents Toolkit > Select Microsoft 365 Account**\n* Sign in to Microsoft 365 Agents Toolkit with a **Microsoft 365 work or school account**\n* Press **F5**, or select **Debug > Start Debugging** in Visual Studio to start your app\n* When the browser launches, open the **Copilot** app, select the agent, and start asking questions like:\n - \"What's for lunch today?\"\n - \"What can I order for dinner that is gluten-free?\"\n\n> **Note:** Please make sure to switch to New Teams when Teams web client has launched.\n\n## Help\n\nWe do not support samples, but this community is always willing to help, and we want to improve these samples. We use GitHub to track issues, which makes it easy for community members to volunteer their time and help resolve issues.\n\nYou can try looking at [issues related to this sample](https://github.com/pnp/copilot-pro-dev-samples/issues?q=label%3A%22sample%3A%20da-ristorante-api-csharp%22) to see if anybody else is having the same issues.\n\nIf you encounter any issues using this sample, [create a new issue](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\nFinally, if you have an idea for improvement, [make a suggestion](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n\n" + }, + { + "folder": "da-ristorante-api-devproxy", + "title": "Browse the menu and place an order at a local Italian restaurant using Microsoft 365 Copilot and Dev Proxy", + "description": "This sample demonstrates how to build a declarative agent for Microsoft 365 Copilot that allows you to browse a menu of a local Italian restaurant and place an order. The agent uses an API plugin to connect to an anonymous API. Dev Proxy is used to simulate the API.", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-ristorante-api-devproxy", + "updatedAt": "2026-06-16T00:00:00.000Z", + "longDescription": [ + "This sample demonstrates how to build a declarative agent for Microsoft 365 Copilot that allows you to browse a menu of a local Italian restaurant and place an order. The agent uses an API plugin to connect to an anonymous API. Dev Proxy is used to simulate the API." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Dev Proxy" + }, + { + "key": "LANGUAGE", + "value": "JSON" + }, + { + "key": "API-PLUGIN", + "value": "Yes" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://github.com/pnp/copilot-pro-dev-samples/raw/main/samples/da-ristorante-api-devproxy/assets/screenshot-menu.png", + "imageAlt": "Declarative agent showing what's on the menu for lunch", + "readmeContent": "# Browse the menu and place an order at a local Italian restaurant using Microsoft 365 Copilot and Dev Proxy\n\n## Summary\n\nThis sample demonstrates how to build a declarative agent for Microsoft 365 Copilot that allows you to browse a menu of a local Italian restaurant and place an order. The agent uses an API plugin to connect to an anonymous API. [Dev Proxy](https://learn.microsoft.com/microsoft-cloud/dev/dev-proxy/overview) is used to simulate the API, so you don't need to build or maintain a real backend. This is useful when the API doesn't exist yet, is owned by a third party, or you want to avoid writing code that won't ship.\n\n![Declarative agent showing what's on the menu for lunch](./assets/screenshot-menu.png)\n![Declarative agent ordering lunch](./assets/screenshot-order.png)\n![Visual Studio Code with Dev Proxy running and dev tunnel connected](./assets/screenshot-vscode.png)\n\n## How it works\n\nMicrosoft 365 Copilot runs in the cloud and needs a publicly accessible API endpoint. Dev Proxy simulates the API on your machine, and a dev tunnel exposes it over the internet so Copilot can reach it. No API infrastructure is deployed — the simulated API runs entirely on your local machine.\n\n```mermaid\nsequenceDiagram\n participant Copilot as Microsoft 365 Copilot\n participant Tunnel as Dev Tunnel\n participant Proxy as Dev Proxy\n Copilot->>Tunnel: API request (internet)\n Note over Tunnel: Rewrites host header
to api.ristorante.com\n Tunnel->>Proxy: Forward to localhost:8000\n Proxy->>Tunnel: Simulated response\n Tunnel->>Copilot: Response (internet)\n```\n\n## Features\n\nThis sample illustrates the following concepts:\n\n* Building a declarative agent for Microsoft 365 Copilot with an API plugin\n* Connecting an API plugin to an anonymous API\n* Using [Dev Proxy](https://learn.microsoft.com/microsoft-cloud/dev/dev-proxy/overview) to simulate a non-authenticated CRUD API locally\n* Using [dev tunnels](https://learn.microsoft.com/azure/developer/dev-tunnels/overview) to expose the local API over the internet for use with Microsoft 365 Copilot\n\n## Contributors\n\n* [Garry Trinder](https://github.com/garrytrinder)\n* [Waldek Mastykarz](https://github.com/waldekmastykarz)\n\n## Version history\n\nVersion|Date|Comments\n-------|----|--------\n1.1|June 16, 2026|Updated Dev Proxy schemas to v3.0.1\n1.0|May 14, 2026|Initial release\n\n## Prerequisites\n\n* Microsoft 365 tenant with Microsoft 365 Copilot\n* [Node.js](https://nodejs.org/)\n* [Visual Studio Code](https://code.visualstudio.com/) with the following extensions:\n * [Microsoft 365 Agents Toolkit](https://marketplace.visualstudio.com/items?itemName=TeamsDevApp.ms-teams-vscode-extension)\n * [Dev Proxy Toolkit](https://marketplace.visualstudio.com/items?itemName=garrytrinder.dev-proxy-toolkit)\n * [Dev Tunnels](https://marketplace.visualstudio.com/items?itemName=ms-devtunnels.ms-devtunnels)\n\n## Minimal path to awesome\n\n* Clone this repository (or [download this solution as a .ZIP file](https://pnp.github.io/download-partial/?url=https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-ristorante-api-devproxy) then unzip it)\n* Open the Microsoft 365 Agents Toolkit extension and sign in to your Microsoft 365 tenant with Microsoft 365 Copilot\n* Select **Debug in Copilot (Edge)** from the launch configuration dropdown\n\n## Testing the API\n\nYou can test the API directly using the `api.http` file included in the project root. This requires the [REST Client](https://marketplace.visualstudio.com/items?itemName=humao.rest-client) extension. With the debug session running, open the file and use the **Send Request** links above each request to test the API endpoints through the dev tunnel.\n\n> **Note:** The `api.http` file uses a `.env` symlink in the project root that points to `env/.env.local`. This symlink is created automatically when you start a debug session.\n\n## Help\n\nWe do not support samples, but this community is always willing to help, and we want to improve these samples. We use GitHub to track issues, which makes it easy for community members to volunteer their time and help resolve issues.\n\nYou can try looking at [issues related to this sample](https://github.com/pnp/copilot-pro-dev-samples/issues?q=label%3A%22sample%3A%20da-ristorante-api-devproxy%22) to see if anybody else is having the same issues.\n\nIf you encounter any issues using this sample, [create a new issue](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\nFinally, if you have an idea for improvement, [make a suggestion](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n\n" + }, + { + "folder": "da-ristorante-api-devproxy-apikey", + "title": "Browse the menu and place an order at a local Italian restaurant using Microsoft 365 Copilot, Dev Proxy and API key authentication", + "description": "This sample demonstrates how to build a declarative agent for Microsoft 365 Copilot that allows you to browse a menu of a local Italian restaurant and place an order. The agent uses an API plugin to connect to an API secured with an API key. Dev Proxy is used to simulate the API.", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-ristorante-api-devproxy-apikey", + "updatedAt": "2026-06-16T00:00:00.000Z", + "longDescription": [ + "This sample demonstrates how to build a declarative agent for Microsoft 365 Copilot that allows you to browse a menu of a local Italian restaurant and place an order. The agent uses an API plugin to connect to an API secured with an API key. Dev Proxy is used to simulate the API." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Dev Proxy" + }, + { + "key": "LANGUAGE", + "value": "JSON" + }, + { + "key": "API-PLUGIN", + "value": "Yes" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://github.com/pnp/copilot-pro-dev-samples/raw/main/samples/da-ristorante-api-devproxy-apikey/assets/screenshot-menu.png", + "imageAlt": "Declarative agent showing what's on the menu for lunch", + "readmeContent": "# Browse the menu and place an order at a local Italian restaurant using Microsoft 365 Copilot, Dev Proxy and API key authentication\n\n## Summary\n\nThis sample demonstrates how to build a declarative agent for Microsoft 365 Copilot that allows you to browse a menu of a local Italian restaurant and place an order. The agent uses an API plugin to connect to an API secured with an API key. [Dev Proxy](https://learn.microsoft.com/microsoft-cloud/dev/dev-proxy/overview) is used to simulate the API, so you don't need to build or maintain a real backend. This is useful when the API doesn't exist yet, is owned by a third party, or you want to avoid writing code that won't ship.\n\n![Declarative agent showing what's on the menu for lunch](./assets/screenshot-menu.png)\n![Declarative agent ordering lunch](./assets/screenshot-order.png)\n![Visual Studio Code with Dev Proxy running and dev tunnel connected](./assets/screenshot-vscode.png)\n\n## How it works\n\nMicrosoft 365 Copilot runs in the cloud and needs a publicly accessible API endpoint. Dev Proxy simulates the API on your machine, and a dev tunnel exposes it over the internet so Copilot can reach it. No API infrastructure is deployed — the simulated API runs entirely on your local machine.\n\n```mermaid\nsequenceDiagram\n participant Copilot as Microsoft 365 Copilot\n participant Vault as Teams Vault\n participant Tunnel as Dev Tunnel\n participant Proxy as Dev Proxy\n Copilot->>Vault: Get API key\n Vault->>Copilot: API key\n Copilot->>Tunnel: API request with API key (internet)\n Note over Tunnel: Rewrites host header
to api.ristorante.com\n Tunnel->>Proxy: Forward to localhost:8000\n Note over Proxy: Validates API key\n Proxy->>Tunnel: Simulated response\n Tunnel->>Copilot: Response (internet)\n```\n\n## Features\n\nThis sample illustrates the following concepts:\n\n* Building a declarative agent for Microsoft 365 Copilot with an API plugin\n* Connecting an API plugin to an API secured with an API key\n* Using [Dev Proxy](https://learn.microsoft.com/microsoft-cloud/dev/dev-proxy/overview) to simulate a CRUD API secured with an API key locally\n* Using [dev tunnels](https://learn.microsoft.com/azure/developer/dev-tunnels/overview) to expose the local API over the internet for use with Microsoft 365 Copilot\n\n## Contributors\n\n* [Garry Trinder](https://github.com/garrytrinder)\n* [Waldek Mastykarz](https://github.com/waldekmastykarz)\n\n## Version history\n\nVersion|Date|Comments\n-------|----|--------\n1.1|June 16, 2026|Updated Dev Proxy schemas to v3.0.1\n1.0|May 14, 2026|Initial release\n\n## Prerequisites\n\n* Microsoft 365 tenant with Microsoft 365 Copilot\n* [Dev Proxy](https://learn.microsoft.com/microsoft-cloud/dev/dev-proxy/overview) v3.0.1 or later\n* [Node.js](https://nodejs.org/)\n* [Visual Studio Code](https://code.visualstudio.com/) with the following extensions:\n * [Microsoft 365 Agents Toolkit](https://marketplace.visualstudio.com/items?itemName=TeamsDevApp.ms-teams-vscode-extension)\n * [Dev Proxy Toolkit](https://marketplace.visualstudio.com/items?itemName=garrytrinder.dev-proxy-toolkit)\n * [Dev Tunnels](https://marketplace.visualstudio.com/items?itemName=ms-devtunnels.ms-devtunnels)\n\n## Minimal path to awesome\n\n* Clone this repository (or [download this solution as a .ZIP file](https://pnp.github.io/download-partial/?url=https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-ristorante-api-devproxy-apikey) then unzip it)\n* Open the Microsoft 365 Agents Toolkit extension and sign in to your Microsoft 365 tenant with Microsoft 365 Copilot\n* Select **Debug in Copilot (Edge)** from the launch configuration dropdown\n* When prompted for the API key, enter `devproxyrules`\n\n## Testing the API\n\nYou can test the API directly using the `api.http` file included in the project root. This requires the [REST Client](https://marketplace.visualstudio.com/items?itemName=humao.rest-client) extension. With the debug session running, open the file and use the **Send Request** links above each request to test the API endpoints through the dev tunnel.\n\n> **Note:** The `api.http` file uses a `.env` symlink in the project root that points to `env/.env.local`. This symlink is created automatically when you start a debug session.\n\n## Help\n\nWe do not support samples, but this community is always willing to help, and we want to improve these samples. We use GitHub to track issues, which makes it easy for community members to volunteer their time and help resolve issues.\n\nYou can try looking at [issues related to this sample](https://github.com/pnp/copilot-pro-dev-samples/issues?q=label%3A%22sample%3A%20da-ristorante-api-devproxy-apikey%22) to see if anybody else is having the same issues.\n\nIf you encounter any issues using this sample, [create a new issue](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\nFinally, if you have an idea for improvement, [make a suggestion](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n\n" + }, + { + "folder": "da-ristorante-api-devproxy-entra-sso", + "title": "Browse the menu and place an order at a local Italian restaurant using Microsoft 365 Copilot, Dev Proxy and Entra ID SSO authentication", + "description": "This sample demonstrates how to build a declarative agent for Microsoft 365 Copilot that allows you to browse a menu of a local Italian restaurant and place an order. The agent uses an API plugin to connect to an API secured with Microsoft Entra ID SSO. Dev Proxy is used to simulate the API.", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-ristorante-api-devproxy-entra-sso", + "updatedAt": "2026-06-16T00:00:00.000Z", + "longDescription": [ + "This sample demonstrates how to build a declarative agent for Microsoft 365 Copilot that allows you to browse a menu of a local Italian restaurant and place an order. The agent uses an API plugin to connect to an API secured with Microsoft Entra ID SSO authentication. Dev Proxy is used to simulate the API." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Dev Proxy" + }, + { + "key": "LANGUAGE", + "value": "JSON" + }, + { + "key": "API-PLUGIN", + "value": "Yes" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://github.com/pnp/copilot-pro-dev-samples/raw/main/samples/da-ristorante-api-devproxy-entra-sso/assets/screenshot-menu.png", + "imageAlt": "Declarative agent showing what's on the menu for lunch", + "readmeContent": "# Browse the menu and place an order at a local Italian restaurant using Microsoft 365 Copilot, Dev Proxy and Entra ID SSO authentication\n\n## Summary\n\nThis sample demonstrates how to build a declarative agent for Microsoft 365 Copilot that allows you to browse a menu of a local Italian restaurant and place an order. The agent uses an API plugin to connect to an API secured with Microsoft Entra ID SSO (single sign-on) authentication. [Dev Proxy](https://learn.microsoft.com/microsoft-cloud/dev/dev-proxy/overview) is used to simulate the API, so you don't need to build or maintain a real backend.\n\n![Declarative agent showing what's on the menu for lunch](./assets/screenshot-menu.png)\n![Declarative agent ordering lunch](./assets/screenshot-order.png)\n![Visual Studio Code with Dev Proxy running and dev tunnel connected](./assets/screenshot-vscode.png)\n\n## How it works\n\nMicrosoft 365 Copilot runs in the cloud and needs a publicly accessible API endpoint. Dev Proxy simulates the API on your machine, and a dev tunnel exposes it over the internet so Copilot can reach it. No API infrastructure is deployed — the simulated API runs entirely on your local machine.\n\n### SSO authentication\n\nThis sample uses Microsoft Entra ID SSO authentication. Unlike the OAuth authorization code flow (which prompts users to sign in), SSO authentication allows Microsoft 365 Copilot to seamlessly obtain a token on behalf of the user without any additional sign-in prompts. The token is acquired transparently using the user's existing Microsoft 365 session.\n\nThe SSO registration is done in the Teams Developer Portal, which generates an Application ID URI that the Entra app registration must trust. The enterprise token store client (`ab3be6b7-f5df-413d-ac2d-abf1e3fd9c0b`) is pre-authorized in the Entra app manifest to allow token exchange.\n\nDev Proxy validates the real Entra token on the API side by checking the audience and issuer configured in the CRUD API files.\n\n```mermaid\nsequenceDiagram\n participant Copilot as Microsoft 365 Copilot\n participant Entra as Microsoft Entra (SSO)\n participant Tunnel as Dev Tunnel\n participant Proxy as Dev Proxy\n Copilot->>Entra: Get SSO token (seamless)\n Entra->>Copilot: Access token (no user prompt)\n Copilot->>Tunnel: API request with token (internet)\n Note over Tunnel: Rewrites host header
to api.ristorante.com\n Tunnel->>Proxy: Forward to localhost:8000\n Note over Proxy: Validates Entra token\n Proxy->>Tunnel: Simulated response\n Tunnel->>Copilot: Response (internet)\n```\n\n## Features\n\nThis sample illustrates the following concepts:\n\n* Building a declarative agent for Microsoft 365 Copilot with an API plugin\n* Connecting an API plugin to an API secured with Microsoft Entra ID SSO\n* Registering a Microsoft Entra SSO client in the Teams Developer Portal\n* Pre-authorizing the Microsoft enterprise token store in the Entra app registration\n* Using [Dev Proxy](https://learn.microsoft.com/microsoft-cloud/dev/dev-proxy/overview) to simulate a CRUD API secured with Entra token validation locally\n* Using [dev tunnels](https://learn.microsoft.com/azure/developer/dev-tunnels/overview) to expose the local API over the internet for use with Microsoft 365 Copilot\n\n## Contributors\n\n* [Garry Trinder](https://github.com/garrytrinder)\n* [Waldek Mastykarz](https://github.com/waldekmastykarz)\n\n## Version history\n\nVersion|Date|Comments\n-------|----|--------\n1.0|June 16, 2026|Initial release\n\n## Prerequisites\n\n* Microsoft 365 tenant with Microsoft 365 Copilot\n* [Node.js](https://nodejs.org/)\n* [Visual Studio Code](https://code.visualstudio.com/) with the following extensions:\n * [Microsoft 365 Agents Toolkit](https://marketplace.visualstudio.com/items?itemName=TeamsDevApp.ms-teams-vscode-extension)\n * [Dev Proxy Toolkit](https://marketplace.visualstudio.com/items?itemName=garrytrinder.dev-proxy-toolkit)\n * [Dev Tunnels](https://marketplace.visualstudio.com/items?itemName=ms-devtunnels.ms-devtunnels)\n\n## Minimal path to awesome\n\n* Clone this repository (or [download this solution as a .ZIP file](https://pnp.github.io/download-partial/?url=https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-ristorante-api-devproxy-entra-sso) then unzip it)\n* Open the Microsoft 365 Agents Toolkit extension and sign in to your Microsoft 365 tenant with Microsoft 365 Copilot\n* Select **Debug in Copilot (Edge)** from the launch configuration dropdown\n\nThe provisioning step automatically registers the Entra SSO client in the Teams Developer Portal — no manual portal steps are required.\n\n## Testing the API\n\nYou can test the API directly using the `api.http` file included in the project root. This requires the [REST Client](https://marketplace.visualstudio.com/items?itemName=humao.rest-client) extension. With the debug session running, open the file and use the **Send Request** links above each request to test the API endpoints through the dev tunnel.\n\nTo generate a test token for use with the `api.http` file, run the following command:\n\n```bash\ndevproxy jwt create -n \"Dev Proxy\" -a {ENTRA_APP_CLIENT_ID} -i https://login.microsoftonline.com/{ENTRA_APP_TENANT_ID}/v2.0 -s \"api://{ENTRA_APP_CLIENT_ID}/Dishes.Read\" -s \"api://{ENTRA_APP_CLIENT_ID}/Orders.Write\"\n```\n\nReplace `{ENTRA_APP_CLIENT_ID}` and `{ENTRA_APP_TENANT_ID}` with the values from your `env/.env.local` file. Copy the generated token and paste it as the `@token` value in `api.http`.\n\n> **Note:** The `api.http` file uses a `.env` symlink in the project root that points to `env/.env.local`. This symlink is created automatically when you start a debug session.\n\n## Comparing SSO vs OAuth authentication\n\nThis sample uses **Entra ID SSO**, which differs from the [OAuth sample](../da-ristorante-api-devproxy-oauth/):\n\n| Aspect | SSO (this sample) | OAuth |\n|--------|-------------------|-------|\n| User experience | Seamless — no sign-in prompt | User prompted to sign in |\n| Token acquisition | Transparent via existing M365 session | Authorization code flow |\n| Client secret | Not required | Required |\n| Portal registration | Automated via `oauth/register` with `identityProvider: MicrosoftEntra` | Automated via `oauth/register` |\n\n## Help\n\nWe do not support samples, but this community is always willing to help, and we want to improve these samples. We use GitHub to track issues, which makes it easy for community members to volunteer their time and help resolve issues.\n\nYou can try looking at [issues related to this sample](https://github.com/pnp/copilot-pro-dev-samples/issues?q=label%3A%22sample%3A%20da-ristorante-api-devproxy-entra-sso%22) to see if anybody else is having the same issues.\n\nIf you encounter any issues using this sample, [create a new issue](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\nFinally, if you have an idea for improvement, [make a suggestion](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n![](https://m365-visitor-stats.azurewebsites.net/copilot-pro-dev-samples/samples/da-ristorante-api-devproxy-entra-sso)\n" + }, + { + "folder": "da-ristorante-api-devproxy-oauth", + "title": "Browse the menu and place an order at a local Italian restaurant using Microsoft 365 Copilot, Dev Proxy and OAuth authentication", + "description": "This sample demonstrates how to build a declarative agent for Microsoft 365 Copilot that allows you to browse a menu of a local Italian restaurant and place an order. The agent uses an API plugin to connect to an API secured with OAuth. Dev Proxy is used to simulate the API.", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-ristorante-api-devproxy-oauth", + "updatedAt": "2026-06-16T00:00:00.000Z", + "longDescription": [ + "This sample demonstrates how to build a declarative agent for Microsoft 365 Copilot that allows you to browse a menu of a local Italian restaurant and place an order. The agent uses an API plugin to connect to an API secured with OAuth. Dev Proxy is used to simulate the API." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Dev Proxy" + }, + { + "key": "LANGUAGE", + "value": "JSON" + }, + { + "key": "API-PLUGIN", + "value": "Yes" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://github.com/pnp/copilot-pro-dev-samples/raw/main/samples/da-ristorante-api-devproxy-oauth/assets/screenshot-menu.png", + "imageAlt": "Declarative agent showing what's on the menu for lunch", + "readmeContent": "# Browse the menu and place an order at a local Italian restaurant using Microsoft 365 Copilot, Dev Proxy and OAuth authentication\n\n## Summary\n\nThis sample demonstrates how to build a declarative agent for Microsoft 365 Copilot that allows you to browse a menu of a local Italian restaurant and place an order. The agent uses an API plugin to connect to an API secured with OAuth. [Dev Proxy](https://learn.microsoft.com/microsoft-cloud/dev/dev-proxy/overview) is used to simulate the API, so you don't need to build or maintain a real backend. This is useful when the API doesn't exist yet, is owned by a third party, or you want to avoid writing code that won't ship.\n\n![Declarative agent showing what's on the menu for lunch](./assets/screenshot-menu.png)\n![Declarative agent ordering lunch](./assets/screenshot-order.png)\n![Microsoft 365 Copilot prompting the user to authenticate](./assets/screenshot-auth-challenge.png)\n![Visual Studio Code with Dev Proxy running and dev tunnel connected](./assets/screenshot-vscode.png)\n\n## How it works\n\nMicrosoft 365 Copilot runs in the cloud and needs a publicly accessible API endpoint. Dev Proxy simulates the API on your machine, and a dev tunnel exposes it over the internet so Copilot can reach it. No API infrastructure is deployed — the simulated API runs entirely on your local machine.\n\n### OAuth authentication\n\nThis sample uses OAuth for authentication, with Microsoft Entra as the identity provider. Microsoft 365 Copilot obtains a real OAuth token from Entra and sends it with every API request. Dev Proxy does **not** replace the identity provider — it validates the real token on the API side by checking the audience, issuer, and scopes configured in the CRUD API files. This means the authentication flow between Copilot and the identity provider is identical to what you'd have in production; the only thing Dev Proxy simulates is the API itself.\n\n```mermaid\nsequenceDiagram\n participant Copilot as Microsoft 365 Copilot\n participant Entra as Microsoft Entra\n participant Tunnel as Dev Tunnel\n participant Proxy as Dev Proxy\n Copilot->>Entra: Get OAuth token\n Entra->>Copilot: Access token\n Copilot->>Tunnel: API request with token (internet)\n Note over Tunnel: Rewrites host header
to api.ristorante.com\n Tunnel->>Proxy: Forward to localhost:8000\n Note over Proxy: Validates Entra token\n Proxy->>Tunnel: Simulated response\n Tunnel->>Copilot: Response (internet)\n```\n\n## Features\n\nThis sample illustrates the following concepts:\n\n* Building a declarative agent for Microsoft 365 Copilot with an API plugin\n* Connecting an API plugin to an API secured with OAuth\n* Using [Dev Proxy](https://learn.microsoft.com/microsoft-cloud/dev/dev-proxy/overview) to simulate a CRUD API secured with OAuth authentication locally\n* Using [dev tunnels](https://learn.microsoft.com/azure/developer/dev-tunnels/overview) to expose the local API over the internet for use with Microsoft 365 Copilot\n\n## Contributors\n\n* [Garry Trinder](https://github.com/garrytrinder)\n* [Waldek Mastykarz](https://github.com/waldekmastykarz)\n\n## Version history\n\nVersion|Date|Comments\n-------|----|--------\n1.2|June 16, 2026|Renamed sample from entra to oauth\n1.1|June 16, 2026|Updated Dev Proxy schemas to v3.0.1\n1.0|May 14, 2026|Initial release\n\n## Prerequisites\n\n* Microsoft 365 tenant with Microsoft 365 Copilot\n* [Node.js](https://nodejs.org/)\n* [Visual Studio Code](https://code.visualstudio.com/) with the following extensions:\n * [Microsoft 365 Agents Toolkit](https://marketplace.visualstudio.com/items?itemName=TeamsDevApp.ms-teams-vscode-extension)\n * [Dev Proxy Toolkit](https://marketplace.visualstudio.com/items?itemName=garrytrinder.dev-proxy-toolkit)\n * [Dev Tunnels](https://marketplace.visualstudio.com/items?itemName=ms-devtunnels.ms-devtunnels)\n\n## Minimal path to awesome\n\n* Clone this repository (or [download this solution as a .ZIP file](https://pnp.github.io/download-partial/?url=https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-ristorante-api-devproxy-oauth) then unzip it)\n* Open the Microsoft 365 Agents Toolkit extension and sign in to your Microsoft 365 tenant with Microsoft 365 Copilot\n* Select **Debug in Copilot (Edge)** from the launch configuration dropdown\n* When prompted, sign in with your Microsoft 365 account to authorize the OAuth connection\n\n## Testing the API\n\nYou can test the API directly using the `api.http` file included in the project root. This requires the [REST Client](https://marketplace.visualstudio.com/items?itemName=humao.rest-client) extension. With the debug session running, open the file and use the **Send Request** links above each request to test the API endpoints through the dev tunnel.\n\nTo generate a test token for use with the `api.http` file, run the following command:\n\n```bash\ndevproxy jwt create -n \"Dev Proxy\" -a {ENTRA_APP_CLIENT_ID} -i https://login.microsoftonline.com/{ENTRA_APP_TENANT_ID}/v2.0 -s \"api://{ENTRA_APP_CLIENT_ID}/Dishes.Read\" -s \"api://{ENTRA_APP_CLIENT_ID}/Orders.Write\"\n```\n\nReplace `{ENTRA_APP_CLIENT_ID}` and `{ENTRA_APP_TENANT_ID}` with the values from your `env/.env.local` file. Copy the generated token and paste it as the `@token` value in `api.http`.\n\n> **Note:** The `api.http` file uses a `.env` symlink in the project root that points to `env/.env.local`. This symlink is created automatically when you start a debug session.\n\n## Help\n\nWe do not support samples, but this community is always willing to help, and we want to improve these samples. We use GitHub to track issues, which makes it easy for community members to volunteer their time and help resolve issues.\n\nYou can try looking at [issues related to this sample](https://github.com/pnp/copilot-pro-dev-samples/issues?q=label%3A%22sample%3A%20da-ristorante-api-devproxy-oauth%22) to see if anybody else is having the same issues.\n\nIf you encounter any issues using this sample, [create a new issue](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\nFinally, if you have an idea for improvement, [make a suggestion](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n\n" + }, + { + "folder": "da-ristorante-api-js", + "title": "Browse the menu and place an order at a local Italian restaurant using Microsoft 365 Copilot", + "description": "This sample demonstrates how to build a declarative agent for Microsoft 365 Copilot that allows you to browse a menu of a local Italian restaurant and place an order. The agent uses an API plugin to connect to an anonymous API. The project contains an Azure Function that serves as the API.", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-ristorante-api-js", + "updatedAt": "2024-10-17T00:00:00.000Z", + "longDescription": [ + "This sample demonstrates how to build a declarative agent for Microsoft 365 Copilot that allows you to browse a menu of a local Italian restaurant and place an order. The agent uses an API plugin to connect to an anonymous API. The project contains an Azure Function that serves as the API." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Node.js" + }, + { + "key": "LANGUAGE", + "value": "TypeScript" + }, + { + "key": "API-PLUGIN", + "value": "Yes" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://github.com/pnp/copilot-pro-dev-samples/raw/main/samples/da-ristorante-api-js/assets/screenshot-menu.png", + "imageAlt": "Declarative agent showing what's on the menu for lunch", + "readmeContent": "# Browse the menu and place an order at a local Italian restaurant using Microsoft 365 Copilot\n\n## Summary\n\nThis sample demonstrates how to build a declarative agent for Microsoft 365 Copilot that allows you to browse a menu of a local Italian restaurant and place an order. The agent uses an API plugin to connect to an anonymous API. The project contains an Azure Function that serves as the API.\n\n![Declarative agent showing what's on the menu for lunch](./assets/screenshot-menu.png)\n![Declarative agent ordering lunch](./assets/screenshot-order.png)\n\n## Features\n\nThis sample illustrates the following concepts:\n\n* Building a declarative agent for Microsoft 365 Copilot with an API plugin\n* Connecting an API plugin to an anonymous API\n* Using [dev tunnels](https://learn.microsoft.com/azure/developer/dev-tunnels/overview) to test the API plugin locally\n\n## Contributors\n\n* [Waldek Mastykarz](https://github.com/waldekmastykarz)\n\n## Version history\n\nVersion|Date|Comments\n-------|----|--------\n1.1|October 17, 2024|Fixed image URL in card data file\n1.0|October 15, 2024|Initial release\n\n## Prerequisites\n\n* Microsoft 365 tenant with Microsoft 365 Copilot\n* [Visual Studio Code](https://code.visualstudio.com/) with the [Microsoft 365 Agents Toolkit](https://marketplace.visualstudio.com/items?itemName=TeamsDevApp.ms-teams-vscode-extension) extension\n* [Node.js v18](https://nodejs.org/en/download/package-manager)\n* [Azure Functions Core Tools](https://learn.microsoft.com/azure/azure-functions/functions-run-local#install-the-azure-functions-core-tools)\n\n## Minimal path to awesome\n\n* Clone this repository (or [download this solution as a .ZIP file](https://pnp.github.io/download-partial/?url=https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-ristorante-api-js) then unzip it)\n* Open the Microsoft 365 Agents Toolkit extension and sign in to your Microsoft 365 tenant with Microsoft 365 Copilot\n* Select **Debug in Copilot (Edge)** from the launch configuration dropdown\n\n## Help\n\nWe do not support samples, but this community is always willing to help, and we want to improve these samples. We use GitHub to track issues, which makes it easy for community members to volunteer their time and help resolve issues.\n\nYou can try looking at [issues related to this sample](https://github.com/pnp/copilot-pro-dev-samples/issues?q=label%3A%22sample%3A%20da-ristorante-api-js%22) to see if anybody else is having the same issues.\n\nIf you encounter any issues using this sample, [create a new issue](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\nFinally, if you have an idea for improvement, [make a suggestion](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n\n" + }, + { + "folder": "da-ristorante-api-python", + "title": "Browse the menu and place an order at a local Italian restaurant using Microsoft 365 Copilot (Python)", + "description": "This sample demonstrates how to build a declarative agent for Microsoft 365 Copilot that allows you to browse a menu of a local Italian restaurant and place an order. The agent uses an API plugin to connect to an anonymous API built with Python Azure Functions.", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-ristorante-api-python", + "updatedAt": "2026-05-04T00:00:00.000Z", + "longDescription": [ + "This sample demonstrates how to build a declarative agent for Microsoft 365 Copilot that allows you to browse a menu of a local Italian restaurant and place an order. The agent uses an API plugin to connect to an anonymous API. The project contains a Python Azure Function that serves as the API." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Python" + }, + { + "key": "LANGUAGE", + "value": "Python" + }, + { + "key": "API-PLUGIN", + "value": "Yes" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://github.com/pnp/copilot-pro-dev-samples/raw/main/samples/da-ristorante-api-python/assets/screenshot-menu.png", + "imageAlt": "Declarative agent showing what's on the menu for lunch", + "readmeContent": "# Browse the menu and place an order at a local Italian restaurant using Microsoft 365 Copilot (Python)\n\n## Summary\n\nThis sample demonstrates how to build a declarative agent for Microsoft 365 Copilot that allows you to browse a menu of a local Italian restaurant and place an order. The agent uses an API plugin to connect to an anonymous API. The project contains a Python Azure Function that serves as the API.\n\nThis is the Python port of the [da-ristorante-api](https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-ristorante-api) TypeScript sample.\n\n![Declarative agent showing what's on the menu for lunch](assets/screenshot-menu.png)\n![Declarative agent ordering lunch](assets/screenshot-order.png)\n\n## Features\n\nThis sample illustrates the following concepts:\n\n* Building a declarative agent for Microsoft 365 Copilot with an API plugin\n* Connecting an API plugin to an anonymous API\n* Using Python Azure Functions as the API backend\n* Using [dev tunnels](https://learn.microsoft.com/azure/developer/dev-tunnels/overview) to test the API plugin locally\n\n## Contributors\n\n* [Yugal Pradhan](https://github.com/YugalPradhan31)\n\n## Version history\n\nVersion|Date|Comments\n-------|----|--------\n1.0|April 30, 2026|Initial release (Python port)\n\n## Prerequisites\n\n* Microsoft 365 tenant with Microsoft 365 Copilot\n* [Visual Studio Code](https://code.visualstudio.com/) with the [Microsoft 365 Agents Toolkit](https://marketplace.visualstudio.com/items?itemName=TeamsDevApp.ms-teams-vscode-extension) extension\n* [Python](https://www.python.org/downloads/) version 3.10 or later\n* [Azure Functions Core Tools](https://learn.microsoft.com/azure/azure-functions/functions-run-local#install-the-azure-functions-core-tools) v4\n\n## Minimal path to awesome\n\n* Clone this repository (or [download this solution as a .ZIP file](https://pnp.github.io/download-partial/?url=https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-ristorante-api-python) then unzip it)\n* Open the project in Visual Studio Code\n* Install Python dependencies:\n ```bash\n pip install -r requirements.txt\n ```\n* Open the Microsoft 365 Agents Toolkit extension and sign in to your Microsoft 365 tenant with Microsoft 365 Copilot\n* Select **Debug in Copilot (Edge)** from the launch configuration dropdown\n\n## Help\n\nWe do not support samples, but this community is always willing to help, and we want to improve these samples. We use GitHub to track issues, which makes it easy for community members to volunteer their time and help resolve issues.\n\nYou can try looking at [issues related to this sample](https://github.com/pnp/copilot-pro-dev-samples/issues?q=label%3A%22sample%3A%20da-ristorante-api-python%22) to see if anybody else is having the same issues.\n\nIf you encounter any issues using this sample, [create a new issue](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\nFinally, if you have an idea for improvement, [make a suggestion](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n" + }, + { + "folder": "da-RubberDuck", + "title": "Rubber Duck Debugging Assistant", + "description": "AI-powered debugging companion for rubber duck debugging methodology", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-RubberDuck", + "updatedAt": "2026-04-16T00:00:00.000Z", + "longDescription": [ + "This declarative agent acts as a rubber duck debugging assistant, inspired by the classic programming practice where developers explain their code problems out loud to uncover issues and clarify their thinking. Instead of talking to an actual rubber duck, you can interact with an AI-powered debugging assistant that listens patiently and asks thoughtful questions to guide you toward solutions." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Microsoft 365 Agents Toolkit" + }, + { + "key": "LANGUAGE", + "value": "N/A" + }, + { + "key": "API-PLUGIN", + "value": "No" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://github.com/pnp/copilot-pro-dev-samples/raw/main/samples/da-RubberDuck/assets/da-RubberDuck-screenshot.png", + "imageAlt": "Rubber Duck Debugging Assistant in action", + "readmeContent": "# Rubber Duck Debugging Assistant 🐤\n\n![Rubber Duck](assets/da-RubberDuck-screenshot.png)\n\n## Summary\n\nMeet your new debugging companion! This declarative agent acts as a \"rubber duck\" - inspired by the classic programming practice where developers explain their code problems out loud to uncover issues and clarify their thinking. Instead of talking to an actual rubber duck on your desk, you can now interact with an AI-powered debugging assistant that listens patiently and asks thoughtful questions to guide you toward solutions.\n\n![Rubber Duck in use](assets/da-RubberDuck.gif)\n\n### What is Rubber Duck Debugging?\n\nRubber duck debugging is a method where programmers explain their code line-by-line to an inanimate object (traditionally a rubber duck) to identify bugs and logical errors. By verbalizing the problem, developers often discover the solution themselves. This agent brings that concept to virtual life with intelligent, guided questioning.\n\n### Version history\n\n| Version | Date | Comments |\n| --- | --- | --- |\n| 1.0 | 16/04/2026 | Initial release |\n\n## Prerequisites\n\n* Microsoft 365 tenant with Microsoft 365 Copilot\n* [Node.js](https://nodejs.org/), supported versions: 18, 20, 22\n* A [Microsoft 365 account for development](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts)\n* [VSCode](https://code.visualstudio.com/)\n* [Microsoft 365 Agents Toolkit Visual Studio Code Extension](https://aka.ms/teams-toolkit) version 5.0.0 and higher or [Microsoft 365 Agents Toolkit CLI](https://aka.ms/teamsfx-toolkit-cli)\n* [Microsoft 365 Copilot license](https://learn.microsoft.com/microsoft-365-copilot/extensibility/prerequisites#prerequisites)\n\n## Minimal path to awesome\n\n1. First, select the Teams Toolkit icon on the left in the VS Code toolbar.\n2. In the Account section, sign in with your [Microsoft 365 account](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts) if you haven't already. Ensure that both \"Custom App Upload Enabled\" and \"Copilot Access Enabled\" have green checkmarks\n3. Create and provision the Teams app by clicking `Provision` in \"Lifecycle\" section.\n4. Select the \"Run and Debug\" icon in the left sidebar, and then select `Preview in Copilot (Edge)` or `Preview in Copilot (Chrome)` from the launch configuration dropdown.\n5. Once the Copilot app is loaded in the browser, click on the \"…\" menu and select \"Copilot agents\". You will see your declarative agent on the right rail. Clicking on it will change the experience to showcase the logo and name of the declarative agent.\n6. Ask a question to your declarative agent and it should respond based on the instructions provided.\n\n## Contributors\n\n* [Guido Zambarda](https://github.com/guidozam)\n\n## Features\n\nThis sample illustrates the following concepts:\n\nUsing this sample you can extend Microsoft 365 Copilot with an agent that:\n\n* **Facilitates rubber duck debugging** - Provides a patient virtual companion for explaining code problems\n* **Asks guided questions** - Instead of giving direct answers, asks thoughtful questions to guide you toward solutions\n* **Encourages systematic thinking** - Helps break down complex problems into manageable parts\n* **Creates a judgment-free environment** - Allows developers to think through problems without feeling rushed or judged\n\n## Help\n\nWe do not support samples, but this community is always willing to help, and we want to improve these samples. We use GitHub to track issues, which makes it easy for community members to volunteer their time and help resolve issues.\n\nYou can try looking at [issues related to this sample](https://github.com/pnp/copilot-pro-dev-samples/issues?q=label%3A%22sample%3A%20da-RubberDuck%22) to see if anybody else is having the same issues.\n\nIf you encounter any issues using this sample, [create a new issue](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\nFinally, if you have an idea for improvement, [make a suggestion](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n![](https://m365-visitor-stats.azurewebsites.net/copilot-pro-dev-samples/samples/da-RubberDuck)\n" + }, + { + "folder": "da-SalesGenie", + "title": "Sales Genie Declarative Agent", + "description": "Sales Genie is a Declarative Agent designed to help sales executives get instant, actionable insights from their Salesforce CRM, Microsoft 365, and the web — all via natural language. Whether you're preparing for an upcoming customer meeting, reviewing your opportunity pipeline, or logging call notes into Salesforce, Sales Genie acts as a smart assistant that streamlines your daily sales activities. It showcases complex workflows directly using instructions.", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-SalesGenie", + "updatedAt": "2025-07-09T00:00:00.000Z", + "longDescription": [ + "Sales Genie is a Declarative Agent designed to help sales executives get instant, actionable insights from their Salesforce CRM, Microsoft 365, and the web — all via natural language. Whether you're preparing for an upcoming customer meeting, reviewing your opportunity pipeline, or logging call notes into Salesforce, Sales Genie acts as a smart assistant that streamlines your daily sales activities. It showcases complex workflows directly using instructions." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Node.js" + }, + { + "key": "API-PLUGIN", + "value": "Yes" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://github.com/pnp/copilot-pro-dev-samples/raw/main/samples/da-SalesGenie/assets/sales-genie-video.gif", + "imageAlt": "Sales Genie", + "readmeContent": "# Sales Genie Declarative Agent\n\n## Summary\n\nSales Genie is a Declarative Agent designed to help sales executives get instant, actionable insights from their Salesforce CRM, Microsoft 365, and the web — all via natural language. Whether you're preparing for an upcoming customer meeting, reviewing your opportunity pipeline, or logging call notes into Salesforce, Sales Genie acts as a smart assistant that streamlines your daily sales activities. It showcases complex workflows directly using instructions.\n\n![Sales Genie Video](./assets/sales-genie-video.gif)\n\n## Features\n\nThis sample illustrates the following concepts:\n\n- Provide a 360° view of any customer account, including opportunities, tasks, cases, and past interactions.\n- Help prepare for customer meetings by surfacing key insights from:\n - Salesforce CRM\n - Outlook emails & Teams conversations\n - External news\n - Documents and pitch decks in your OneDrive and SharePoint\n- Log customer meeting notes or call summaries directly into Salesforce.\n- Visualize sales pipeline and task status with charts and tables.\n\n## Contributors\n\n* [Sébastien Levert](https://github.com/sebastienlevert)\n* [Akhil Sai Valluri](https://github.com/akhilsaivalluri)\n\n## Version history\n\nVersion|Date|Comments\n-------|----|--------\n1.0|July 10, 2025|Initial release\n\n## Prerequisites\n\n* Microsoft 365 tenant with Microsoft 365 Copilot\n* [Visual Studio Code](https://code.visualstudio.com/) with the [Microsoft 365 Agents Toolkit](https://marketplace.visualstudio.com/items?itemName=TeamsDevApp.ms-teams-vscode-extension) extension\n* [Node.js v20](https://nodejs.org/en/download/package-manager)\n* A Salesforce account with API access\n\n## Example Prompts\n\n1. Help me prepare for customer meeting\n \n ![Prepare for customer meeting](./assets/prompt-meeting.png)\n2. Show opportunities pipeline for this month\n \n ![Opportunities pipeline](./assets/prompt-opportunities.png)\n3. Log call for a recent customer conversation\n \n ![Log call notes](./assets/prompt-log-call.png)\n4. Show key deals anticipated to close this week\n \n ![Key deals](./assets/prompt-deals.png)\n\n## Minimal path to awesome\n\n* Clone this repository (or [download this solution as a .ZIP file](https://pnp.github.io/download-partial/?url=https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-SalesGenie) then unzip it)\n* Open the Agents Toolkit extension and sign in to your Microsoft 365 tenant with Microsoft 365 Copilot\n* \n* Select **Preview in Copilot (Edge)** from the launch configuration dropdown\n\n## Configuration\n\n### Salesforce Plugin Configuration\n\nIn your OpenAPI spec [`appPackage/apiSpecificationFile/openapi.yaml`](appPackage/apiSpecificationFile/openapi.yaml):\n\n* Update the server URL to point to your Salesforce instance\n \n ![OpenAPI server URL](./assets/config-server.png)\n\n* In your [`ai-plugin.json`](ai-plugin.json) (plugin manifest), go to the `response_semantics` section for each function. This sample comes with basic Adaptive Card views for rich representation. You can further customize the layout and data bindings to create richer, domain-specific views. Ensure all links point to your Salesforce instance.\n \n ![Plugin response semantics](./assets/config-response-semantics.png)\n \n### Salesforce Authentication Setup\n\n1. Log into your Salesforce account and open the Setup page.\n\n ![Salesforce Setup](./assets/config-auth-setup.png)\n\n2. Navigate to Platform Tools > Apps > External Client App Manager.\n\n ![Salesforce External Client App Manager](./assets/config-auth-app.svg)\n\n3. Click New External Client App.\n\n ![Salesforce New External Client App](./assets/config-auth-external.svg)\n\n4. In the app configuration:\n\n - Set Callback URL to: `https://teams.microsoft.com/api/platform/v1.0/oAuthRedirect`\n * Add OAuth Scopes as needed (e.g., full for complete access and Perform request at any time).\n * Only Authorization Code and Client Credentials grant types are supported.\n * More info on supported Auth types in : [Copilot Plugin Auth Guide](https://learn.microsoft.com/en-us/microsoft-365-copilot/extensibility/api-plugin-authentication).\n\n ![Salesforce App Configuration](./assets/config-auth-permissions.png)\n\n5. After app creation, you'll see Policies, Settings, and Package Details tabs.\n * In the Policies tab: Under OAuth Policies, select \"Relax IP Restrictions\".\n \n ![Salesforce App Policies and Settings](./assets/config-auth-relax.svg)\n \n * In the Settings tab: Click Reveal to copy your Consumer Key and Consumer Secret.\n\n ![Salesforce App Keys](./assets/config-auth-key.svg)\n\n6. Provision Key & Secret in Copilot\n\n When provisioning the Declarative Agent via the Teams Toolkit, you’ll be prompted to enter the Client ID (Key) and Client Secret. Use the values from the Salesforce OAuth app you created.\n\n## Help\n\nWe do not support samples, but this community is always willing to help, and we want to improve these samples. We use GitHub to track issues, which makes it easy for community members to volunteer their time and help resolve issues.\n\nYou can try looking at [issues related to this sample](https://github.com/pnp/copilot-pro-dev-samples/issues?q=label%3A%22sample%3A%20da-SalesGenie%22) to see if anybody else is having the same issues.\n\nIf you encounter any issues using this sample, [create a new issue](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\nFinally, if you have an idea for improvement, [make a suggestion](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n" + }, + { + "folder": "da-sharepoint-data-manager", + "title": "Data Manager - Declarative Agent for SharePoint", + "description": "A declarative agent that helps users manage and organize SharePoint and OneDrive content with document search, organization guidance, and access to official Microsoft documentation via MCP.", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-sharepoint-data-manager", + "updatedAt": "2025-05-20T00:00:00.000Z", + "longDescription": [ + "A declarative agent that helps users manage and organize SharePoint and OneDrive content with document search, organization guidance, and access to official Microsoft documentation via MCP. Features include Microsoft Learn search and fetch via Model Context Protocol, GraphicArt diagram generation, and grounded responses using behavior overrides." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Copilot" + }, + { + "key": "LANGUAGE", + "value": "JSON" + }, + { + "key": "API-PLUGIN", + "value": "Yes" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://raw.githubusercontent.com/pnp/copilot-pro-dev-samples/refs/heads/main/samples/da-sharepoint-data-manager/assets/example_response.png", + "imageAlt": "Data Manager agent helping organize SharePoint content", + "readmeContent": "# Data Manager\n\n## Summary\n\nA declarative agent for Microsoft 365 Copilot that helps users manage and organize their SharePoint sites and OneDrive content. The agent leverages OneDrive and SharePoint access, Microsoft Learn MCP integration for official documentation, and GraphicArt for visual diagrams to provide document search, organization guidance, and best practices for content management.\n\n![Data Manager in action](./assets/example_response.png)\n\n## Contributors\n\n* [Kateryna Turuntseva](https://github.com/KatT-AI)\n\n## Version history\n\nVersion|Date|Author|Comments\n-------|----|----|--------\n1.0|May 19, 2025|Kateryna Turuntseva|Initial release\n\n## Prerequisites\n\n* [Microsoft 365 tenant with Microsoft 365 Copilot](https://learn.microsoft.com/microsoft-365-copilot/extensibility/prerequisites#prerequisites)\n* [Node.js](https://nodejs.org/), supported versions: 18, 20, 22\n* [Microsoft 365 Agents Toolkit for VS Code](https://marketplace.visualstudio.com/items?itemName=TeamsDevApp.ms-teams-vscode-extension)\n\n## Minimal path to awesome\n\n* Clone this repository (or [download this solution as a .ZIP file](https://pnp.github.io/download-partial/?url=https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-sharepoint-data-manager) then unzip it)\n* Open the `samples/da-sharepoint-data-manager` folder with Visual Studio Code\n* Select the **Microsoft 365 Agents Toolkit** icon on the left in the VS Code toolbar\n* In the **Account** section, sign in with your [Microsoft 365 account](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts) if you haven't already\n* Create Teams app by selecting **Provision** in the **Lifecycle** section\n* Select **Preview in Copilot (Edge)** or **Preview in Copilot (Chrome)** from the launch configuration dropdown\n* Once the Copilot app is loaded in the browser, select the \"...\" menu and select **Copilot chats**. You will see your Data Manager agent on the right rail. Selecting it will change the experience to showcase the logo and name of your data management agent\n* Ask questions about your SharePoint content, and the agent will help you manage and organize your data\n\n## Features\n\nThis declarative agent illustrates the following concepts:\n\n* **Document Search** - Search across SharePoint sites and libraries, filter by content and metadata, discover relevant documents\n* **File Organization** - Smart folder structure suggestions, metadata tagging and classification advice, content type recommendations\n* **Document Management Guidance** - Best practices for document organization, SharePoint organization strategies, content classification recommendations\n* **Microsoft Learn MCP Integration** - Search and fetch official Microsoft documentation via the Model Context Protocol (MCP) for accurate, up-to-date SharePoint and Microsoft 365 guidance with source citations\n* **Visual Diagrams** - Generate diagrams and visual representations of site structures, folder hierarchies, and information architecture using GraphicArt\n* **Grounded Responses** - Uses `discourage_model_knowledge` behavior override to prioritize user data and official documentation over general model knowledge\n\n## Help\n\nWe do not support samples, but this community is always willing to help, and we want to improve these samples. We use GitHub to track issues, which makes it easy for community members to volunteer their time and help resolve issues.\n\nYou can try looking at [issues related to this sample](https://github.com/pnp/copilot-pro-dev-samples/issues?q=label%3A%22sample%3A%20da-sharepoint-data-manager%22) to see if anybody else is having the same issues.\n\nIf you encounter any issues using this sample, [create a new issue](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\nFinally, if you have an idea for improvement, [make a suggestion](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n![](https://m365-visitor-stats.azurewebsites.net/copilot-pro-dev-samples/samples/da-sharepoint-data-manager)\n" + }, + { + "folder": "da-SnowWizard", + "title": "da-SnowWizard", + "description": "Community sample for Microsoft 365 Copilot developers.", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-SnowWizard", + "updatedAt": null, + "longDescription": [], + "metadata": [], + "imageUrl": null, + "imageAlt": "", + "readmeContent": "# Copilot Snow Wizard\n\n## Summary\n\nThis sample project demonstrates an implementation of an M365 Declarative Copilot that interfaces with ServiceNow to list and create incidents.\n\n| ![CopilotSnowWizard Screenshot 1](assets/2024-10-11_16-29.png) | ![CopilotSnowWizard Screenshot 1](assets/2024-10-11_16-39.png) | ![CopilotSnowWizard Screenshot 1](assets/2024-10-11_16-40.png) |\n|:-------------------------------------------------------------:|:-------------------------------------------------------------:|:-------------------------------------------------------------:|\n\n\n## Contributors\n\n\n* [Cristiano Goncalves](https://github.com/cristianoag)\n* [Luis Demetrio](https://github.com/luishdemetrio)\n\n## Version history\n\nVersion|Date|Comments\n-------|----|--------\n1.0|October 11, 2024|Initial release\n\n## Prerequisites\n\n* Microsoft 365 tenant with Microsoft 365 Copilot\n* Visual Studio COde\n* Teams Toolkit\n* Node.js\n* ServiceNow Developer Instance\n\n## Minimal path to awesome\n\nIn order to run the code, you will need an M365 tenant with Copilot licenses enabled. Additionally, you must enable a policy to sideload custom applications. Without this, you will not be able to run the code. These instructions assume you have admin rights on the tenant. If you do not have admin rights, please work with your administrator to allow the upload of custom applications.\n\n### Enable Teams custom application uploads\n\nBy default, end users can't upload applications directly; an Administrator needs to upload them into the enterprise app catalog. Follow these steps to enable direct uploads via Teams Toolkit:\n\n1. Navigate to the [Microsoft 365 Admin Center](https://admin.microsoft.com/).\n\n2. In the left panel, select **Show all** to expand the navigation menu. Then, select **Teams** to open the Microsoft Teams admin center.\n\n3. In the Teams admin center, expand the **Teams apps** section and select **Setup policies**. You will see a list of App setup policies. Select the **Global (Org-wide default)** policy.\n\n4. Ensure the **Upload custom apps** switch is turned **On**.\n\n5. Scroll down and select the **Save** button to apply your changes.\n\nNext, you need to install the following software on your computer to use the sample code:\n\n1. [Visual Studio Code](https://code.visualstudio.com/download)\n2. [Node.js](https://nodejs.org/en/download/)\n3. [Teams Toolkit](https://marketplace.visualstudio.com/items?itemName=TeamsDevApp.ms-teams-vscode-extension)\n\n### Creating the ServiceNow Personal Developer Instance\n\nTo use the sample code provided, you will need a ServiceNow Personal Developer Instance (PDI). Follow the instructions below to create your instance and familiarize yourself with the basics of ServiceNow:\n\n1. **Sign in to the [ServiceNow Developer Site](https://developer.servicenow.com/dev.do).**\n2. In the header, click the **Request Instance** button.\n3. Select a ServiceNow release for your instance.\n4. Click the **Request** button.\n5. When your instance is ready, a dialog will provide the URL and admin login details. Copy the current password to a safe location for future use.\n6. Click the **Open Instance** button to open your instance in a new browser tab.\n\nTo open your instance later, sign in to the Developer Site, open the Account menu, and click the **Start Building** button.\n\nServiceNow offers free PDIs to registered users who want to develop applications or improve their skills on the ServiceNow platform. New Developer Program members automatically receive a PDI running the latest release, which remains active as long as there is activity on the instance.\n\nIt is strongly recommended to acquire basic knowledge of ServiceNow concepts. This will help you understand how M365 Copilot interfaces with ServiceNow. You can follow a basic learning path at [New to ServiceNow | ServiceNow Developers](https://developer.servicenow.com/dev.do#!/learn/learning-plans/washingtondc/new_to_servicenow/).\n\nFor more detailed instructions and learning resources, visit [ServiceNow Basics Objectives | ServiceNow Developers](https://developer.servicenow.com/dev.do#!/learn/learning-plans/washingtondc/new_to_servicenow/app_store_learnv2_buildmyfirstapp_washingtondc_servicenow_basics_objectives).\n\n### Download the Sample Code from GitHub\n\nIf you are familiar with Git, you can clone this repository and open the `SnowWizard` folder in Visual Studio Code. If not, you can download a ZIP file containing all the content by clicking the green \"Code\" button at the top right corner of the repository page.\n\nIf you download the ZIP file, uncompress it on your PC and use Visual Studio Code to open the `SnowWizard` folder.\n\n### Configuring the Declarative Copilot \n\nOnce you downloaded the code and opened in with Visual Studio Code you will need to create a configuration file and provide some config information in order to make the declarative agent to interface with your ServiceNow development instance.\n\nOn Visual Studio Code, create a file named .env.local.user inside the env folder. \n\n### ServiceNow Configuration\n\nCreate a `.env.local.user` file inside the `env` folder with the following content:\n\n```\nSN_INSTANCE='devxxxxxx'\nSN_USERNAME='user'\nSN_PASSWORD='user_password'\n```\n\n**Note:**\n- The `SN_INSTANCE` value should be the initial part of your ServiceNow development instance URL.\n- This sample code uses user credentials to interface with ServiceNow. Ensure the user has the necessary permissions to list and create incidents in ServiceNow.\n- Store your credentials securely and avoid sharing them publicly.\n\n### Install the Node.js requisites\n\nOpen a Command Prompt and navigate to the SnowWizard folder. Run NPM INSTALL and wait until all the libraries and requirements get installed.\n\n### Run the Declarative Agent\n\nNow on Visual Studio, click on the Teams Toolkit icon on the left rail and sign-in with your M365 tenant credentials. You do that on the Accounts section by providing your M365 tenant credentials.\n\nNow click Preview Your Teams App (F5) and enjoy.\n\n### Sample Prompts\n\n```\nList all ServiceNow incidents\nCreate a table with all ServiceNow open incidents \nCreate a ServiceNow incident with jokes as short and full descriptions\nCreate a ServiceNow incident based on the content of the text below. \n```\n\nPlease note that the code is limiting the return from the ServiceNow interface in just 10 incidents. That can be easily changed by adjusting the limit on the service interface implemented by snow_incidents.ts.\n\n\n## Features\n\nList and creates Service Now incidents\n\n\n\n\n\n## Help\n\n\n\nWe do not support samples, but this community is always willing to help, and we want to improve these samples. We use GitHub to track issues, which makes it easy for community members to volunteer their time and help resolve issues.\n\nYou can try looking at [issues related to this sample](https://github.com/pnp/copilot-pro-dev-samples/issues?q=label%3A%22sample%3A%20YOUR-SOLUTION-NAME%22) to see if anybody else is having the same issues.\n\nIf you encounter any issues using this sample, [create a new issue](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\nFinally, if you have an idea for improvement, [make a suggestion](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n\n" + }, + { + "folder": "da-snowwizard-cs", + "title": "Copilot Snow Wizard (C#)", + "description": "M365 Declarative Copilot that interfaces with ServiceNow to list and create incidents using C# Azure Functions", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-snowwizard-cs", + "updatedAt": "2024-10-11T00:00:00.000Z", + "longDescription": [ + "This project demonstrates a sample implementation of an M365 Declarative Copilot that interfaces with ServiceNow to list and create incidents, built with C# and Azure Functions (.NET 8 isolated worker)." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": ".NET" + }, + { + "key": "LANGUAGE", + "value": "C#" + }, + { + "key": "API-PLUGIN", + "value": "Yes" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://github.com/pnp/copilot-pro-dev-samples/raw/main/samples/da-snowwizard-cs/assets/2024-10-11_16-39.png", + "imageAlt": "Declarative agent listing ServiceNow incidents", + "readmeContent": "" + }, + { + "folder": "da-sp-agents-finder", + "title": "SharePoint Agents Finder declarative agent", + "description": "SharePoint Agents Finder uses the Microsoft Graph API as a Copilot plugin in a declarative agent, leveraging the Microsoft Graph Search API /search/query endpoint to retrieve information about SharePoint Agents and event any file in Microsoft 365.", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-sp-agents-finder", + "updatedAt": "2025-06-30T00:00:00.000Z", + "longDescription": [ + "SharePoint Agents Finder uses the Microsoft Graph API as a Copilot plugin in a declarative agent, leveraging the Microsoft Graph Search API /search/query endpoint to retrieve information about SharePoint Agents and event any file in Microsoft 365. It helps end users or IT Admins get info about SharePoint Agents in SharePoint or find files in Microsoft 365 using Graph API Search! " + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Copilot" + }, + { + "key": "LANGUAGE", + "value": "English" + }, + { + "key": "API-PLUGIN", + "value": "Yes" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://raw.githubusercontent.com/pnp/copilot-pro-dev-samples/refs/heads/main/samples/da-sp-agents-finder/assets/SharePoint-Agents-Finder-demo.png", + "imageAlt": "SharePoint Agents Finder declarative agent", + "readmeContent": "# SharePoint Agents Finder declarative agent\n\n## Summary\n\nSharePoint Agents Finder uses the Microsoft Graph API as a Copilot plugin in a declarative agent, leveraging the Microsoft Graph Search API /search/query endpoint to retrieve information about SharePoint Agents and event any file in Microsoft 365. It helps end users or IT Admins get info about SharePoint Agents in SharePoint or find files in Microsoft 365 using Graph API Search! \n\n## Overview\n\n[![SharePoint Agents Finder declarative agent - demo](./assets/SharePoint-Agents-Finder-demo01.png)](https://youtu.be/s6T6Uw5uC1Q)\n\n## Contributors\n\n* [Mohammad Amer](https://github.com/mohammadamer) - M365 Development MVP\n\n## Version history\n\nVersion|Date|Comments\n-------|----|--------\n1.0|June 30, 2025| Initial solution\n\n## Prerequisites\n\n1. **Entra ID App Registration**:\n - Register an Entra ID application.\n - Assign the Graph API permissions: `Files.Read.All` as delegated permissions.\n - Retrieve the `ClientId`, `ClientSecret`, and `TenantID`.\n - Add the https://teams.microsoft.com/api/platform/v1.0/oAuthRedirect as a redirect URL for web platform in the Authentication settings.\n\n2. **Teams developer portal**:\n - Open [Teams developer portal](https://dev.teams.microsoft.com/)\n - Add a new OAuth client registration \n - Register a new client with the following information \n - Registration name: da-sharepoint-agents-finder\n - Base URL: https://graph.microsoft.com/v1.0\n - Restrict usage by org: My organization only\n - Restrict usage by app: Any Teams app (when agent is deployed, use the Teams app ID).\n\n - OAuth settings\n - Client ID: ``\n - Client secret: ``\n - Authorization endpoint `(replace tenantid by your own value)`: `https://login.microsoftonline.com/tenantid/oauth2/v2.0/authorize`\n - Token endpoint `(replace tenantid by your own value)`: `https://login.microsoftonline.com/tenantid/oauth2/v2.0/token`\n - Refresh endpoint `(replace tenantid by your own value)`: `https://login.microsoftonline.com/tenantid/oauth2/v2.0/refresh`\n - Scope: Files.Read.All\n - Save the information. \n - A new OAuth registration key will be generated. Save it in secure place to be added in `.env.dev`\n\n3. **How to run this sample**:\n> To run this app template in your local dev machine, you will need:\n>\n> To run this app template in your local dev machine, you will need:\n>\n> - [Node.js](https://nodejs.org/), supported versions: 18, 20, 22\n> - A [Microsoft 365 account for development](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts).\n> - [Microsoft 365 Agents Toolkit Visual Studio Code Extension](https://aka.ms/teams-toolkit) version 5.0.0 and higher or [Microsoft 365 Agents Toolkit CLI](https://aka.ms/teamsfx-toolkit-cli)\n> - [Microsoft 365 Copilot license](https://learn.microsoft.com/microsoft-365-copilot/extensibility/prerequisites#prerequisites)\n\n![image](https://github.com/user-attachments/assets/51a221bb-a2c6-4dbf-8009-d2aa20a1638f)\n\n1. First, select the Microsoft 365 Agents Toolkit icon on the left in the VS Code toolbar.\n2. In the Account section, sign in with your [Microsoft 365 account](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts) if you haven't already.\n3. Create app by clicking `Provision` in \"Lifecycle\" section.\n4. Select `Preview in Copilot (Edge)` or `Preview in Copilot (Chrome)` from the launch configuration dropdown.\n5. Once the Copilot agent is loaded in the browser, click on the \"…\" menu and select \"Copilot chats\". You will see your declarative agent on the right rail. Clicking on it will change the experience to showcase the logo and name of your declarative agent.\n6. Ask a question to your declarative agent and it should respond based on the instructions provided.\n\n## What's included in the template\n\n| Folder | Contents |\n| ------------ | ---------------------------------------------------------------------------------------- |\n| `.vscode` | VSCode files for debugging |\n| `appPackage` | Templates for the application manifest, the GPT manifest and the API specification |\n| `env` | Environment files |\n\nThe following files can be customized and demonstrate an example implementation to get you started.\n\n| File | Contents |\n| ---------------------------------- | ---------------------------------------------------------------------------- |\n| `appPackage/declarativeAgent.json` | Define the behaviour and configurations of the declarative agent. |\n| `appPackage/manifest.json` | application manifest that defines metadata for your declarative agent. |\n\nThe following are Microsoft 365 Agents Toolkit specific project files. You can [visit a complete guide on Github](https://github.com/OfficeDev/TeamsFx/wiki/Teams-Toolkit-Visual-Studio-Code-v5-Guide#overview) to understand how Microsoft 365 Agents Toolkit works.\n\n| File | Contents |\n| -------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |\n| `m365agents.yml` | This is the main Microsoft 365 Agents Toolkit project file. The project file defines two primary things: Properties and configuration Stage definitions. |\n\n## Extend the template\n\n- [Add conversation starters](https://learn.microsoft.com/microsoft-365-copilot/extensibility/build-declarative-agents?tabs=ttk&tutorial-step=3): Conversation starters are hints that are displayed to the user to demonstrate how they can get started using the declarative agent.\n- [Add web content](https://learn.microsoft.com/microsoft-365-copilot/extensibility/build-declarative-agents?tabs=ttk&tutorial-step=4) for the ability to search web information.\n- [Add OneDrive and SharePoint content](https://learn.microsoft.com/microsoft-365-copilot/extensibility/build-declarative-agents?tabs=ttk&tutorial-step=5) as grounding knowledge for the agent.\n- [Add Microsoft Copilot connectors content](https://learn.microsoft.com/microsoft-365-copilot/extensibility/build-declarative-agents?tabs=ttk&tutorial-step=6) to ground agent with enterprise knowledge.\n- [Add API plugins](https://learn.microsoft.com/microsoft-365-copilot/extensibility/build-declarative-agents?tabs=ttk&tutorial-step=7) for agent to interact with REST APIs.\n\n## Minimal path to awesome\n1. **Clone the Repository**:\n - Clone this repository to your local machine.\n\n2. **Navigate to Solution Folder**:\n - Ensure you are in the solution folder of the cloned repository.\n\n3. **Update openapi.yml**:\n - Ensure you open this file `appPackage\\apiSpecificationFile\\openapi.yaml` and update the `tenantid` with your tenant Id.\n ```\n securitySchemes:\n azureaadv2:\n type: oauth2\n flows:\n authorizationCode:\n authorizationUrl: https://login.microsoftonline.com/tenantid/oauth2/v2.0/authorize\n tokenUrl: https://login.microsoftonline.com/tenantid/oauth2/v2.0/token`\n ```\n3. **Update .env.dev file**:\n - Ensure you open this file and update this `AZUREAADV2_REGISTRATION_ID` key with OAuth registration key generated in the prerequisites\n \n\n## Key Features\n- **Interactive Chat experience**: The SharePoint Agents Finder declarative agent offers a seamless and interactive chat experience within the Microsoft 365 Copilot chat interface.\n- **Graph API Integration**: Utilizes the Microsoft Graph API as a Copilot plugin in a declarative agent.\n- **Querying Microsoft 365 and SharePoint content**: Querying Microsoft 365 and SharePoint content delivering structured responses in table format with links to files.\n- **SharePoint Agents Finder or SharePoint Agents doc finder**: As long as the agent utilizes the Microsoft Graph API search then it could find not only SharePoint Agents but also any document in Microsoft 365.\n\n## Potential Improvements\n- **Table of Responses**: Table of Responses is a potential improvement that could be improved through the instructions\n- **SharePoint Agent Link**: SharePoint Agent Link should be improved to either direct you to the agent or the link of the agent should appear in the SiteAssets library.\n\n## Addition information and references\n\n- [Declarative agents for Microsoft 365](https://learn.microsoft.com/en-us/microsoft-365-copilot/extensibility/overview-declarative-agent?wt.mc_id=MVP_433449)\n- [Copilot developer Camp](https://aka.ms/copilotdevcamp?wt.mc_id=MVP_433449)\n- [Microsoft 365 Copilot pro-developer samples](https://github.com/pnp/copilot-pro-dev-samples/)\n\n\n" + }, + { + "folder": "da-teacher", + "title": "Declarative Agent The Simple Teacher for Microsoft 365 Copilot Sample", + "description": "The declarative agent The Simple Teacher acts as a friendly, patient, and humorous mentor for students aged 16 to 20, explaining technical concepts in simple, relatable language.", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-teacher", + "updatedAt": "2025-05-15T00:00:00.000Z", + "longDescription": [ + "The declarative agent \"The Simple Teacher\" acts as a friendly, patient, and humorous mentor for students aged 16 to 20, explaining technical concepts in simple, relatable language. The agent always uses real-world analogies—especially from movies, pop culture, or daily life—and follows a clear structure: introducing the topic, providing a hook or analogy, explaining step by step, sharing a story or example, posing a student challenge, and summarizing the main points. The tone is casual and respectful, avoiding jargon unless explained, and never uses dry, academic, or negative language. The goal is to make learning engaging, memorable, and easy to understand." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Copilot" + }, + { + "key": "LANGUAGE", + "value": "JSON" + }, + { + "key": "API-PLUGIN", + "value": "No" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://raw.githubusercontent.com/pnp/copilot-pro-dev-samples/refs/heads/main/samples/da-teacher/assets/da-teacher-starter.png", + "imageAlt": "Copilot agent conversation starters", + "readmeContent": "# Overview of the Declarative Agent The Simple Teacher\n\nThe declarative agent \"The Simple Teacher\" acts as a friendly, patient, and humorous mentor for students aged 16–20, explaining technical concepts in simple, relatable language. The agent always uses real-world analogies—especially from movies, pop culture, or daily life—and follows a clear structure: introducing the topic, providing a hook or analogy, explaining step by step, sharing a story or example, posing a student challenge, and summarizing the main points. The tone is casual and respectful, avoiding jargon unless explained, and never uses dry, academic, or negative language. The goal is to make learning engaging, memorable, and easy to understand.\n\n## Minimal path to awesome\n\n> **Prerequisites**\n>\n> To run this app template in your local dev machine, you will need:\n>\n> - [Node.js](https://nodejs.org/), supported versions: 18, 20, 22\n> - A [Microsoft 365 account for development](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts).\n> - [Teams Toolkit Visual Studio Code Extension](https://aka.ms/teams-toolkit) version 5.0.0 and higher or [Teams Toolkit CLI](https://aka.ms/teamsfx-toolkit-cli)\n> - [Microsoft 365 Copilot license](https://learn.microsoft.com/microsoft-365-copilot/extensibility/prerequisites#prerequisites)\n\n![image](https://github.com/user-attachments/assets/e1c2a3b3-2e59-4e9b-8335-19315e92ba30)\n\n1. First, select the Teams Toolkit icon on the left in the VS Code toolbar.\n2. In the Account section, sign in with your [Microsoft 365 account](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts) if you haven't already.\n3. Create Teams app by clicking `Provision` in \"Lifecycle\" section.\n4. Select `Preview in Copilot (Edge)` or `Preview in Copilot (Chrome)` from the launch configuration dropdown.\n5. Once the Copilot app is loaded in the browser, click on the \"…\" menu and select \"Copilot chats\". You will see your declarative agent on the right rail. Clicking on it will change the experience to showcase the logo and name of your declarative agent.\n6. Ask a question to your declarative agent and it should respond based on the instructions provided.\n\n\n## Addition information and references\n\n- [Declarative agents for Microsoft 365](https://aka.ms/teams-toolkit-declarative-agent)\n\n## Screenshots\n\n![Copilot agent conversation starters](./assets/da-teacher-starter.png)\n*Copilot agent conversation starters*\n\n![Question to Copilot agent and beginning response](./assets/da-teacher-question.png)\n*Question to Copilot agent and beginning response*\n\n![Copilot agent response with reference](./assets/da-teacher-question-ref.png)\n*Copilot agent response with reference*\n\n## Animations\n\n![Copilot agent blockchain question](./assets/da-teacher-blockchain.gif)\n*Copilot agent blockchain question*\n\n![Copilot agent .net SSE question](./assets/da-teacher-sse-net10.gif)\n*Copilot agent .net SSE question*\n\n" + }, + { + "folder": "da-todo-tasks-graphapi-plugin", + "title": "Retrieve and create my ToDo tasks - No code!", + "description": "This sample demonstrates how to retrieve and create my ToDo tasks.", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-todo-tasks-graphapi-plugin", + "updatedAt": "2025-05-18T00:00:00.000Z", + "longDescription": [ + "This sample demonstrates how to build a declarative agent for Microsoft 365 Copilot that allows you to retrieve and create ToDo tasks. The agent is built using the Microsoft Teams Toolkit." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "No" + }, + { + "key": "LANGUAGE", + "value": "No" + }, + { + "key": "API-PLUGIN", + "value": "Yes" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://github.com/pnp/copilot-pro-dev-samples/raw/main/samples/da-todo-tasks-graphapi-plugin/assets/action_createToDoTask.gif", + "imageAlt": "Retrieve tasks from To-Do list", + "readmeContent": "# Use the Microsoft Graph API as a Copilot plugin for a declarative agent to get ToDo tasks\n\n## Summary\n\nThis sample demonstrates how to use the Microsoft Graph API as a Copilot plugin in a declarative agent with some variation from the blog post\n [https://blog.franckcornu.com/post/copilot-graph-api-qna-plugin/](https://blog.franckcornu.com/post/copilot-graph-api-qna-plugin) focusing this time how to list and create my To-Do tasks since the QnA feature has retired since March 2025.\n\nThe following blog post describes the complete solution setup:[Building a Copilot Agent with Teams Toolkit and Microsoft Graph Plugin to list my ToDo Tasks](https://reshmeeauckloo.com/posts/copilot-agent-teamstoolkit-m365Graph-plugin-ToDo/)\n\n### List/Retrieve my To-Do Tasks\n\n![\"Graph API To-Do List Tasks \"](./assets/action_listtasks.gif)\n\n### Create my To-Do Tasks\n\n![\"Graph API To-Do Create Tasks \"](./assets/action_createToDoTask.gif)\n\n## Contributors\n\n* [Reshmee Auckloo](https://github.com/reshmee011) - M365 Development MVP\n\n## Version history\n\nVersion|Date|Comments\n-------|----|--------\n1.0|April 18, 2025|Initial solution\n2.0|May 18, 2025|Added action to create my To-Do task\n\n## Get started with the template\n\n> **Prerequisites**\n>\n> To run this app template in your local dev machine, you will need:\n>\n> - [Node.js](https://nodejs.org/), supported versions: 18, 20, 22\n> - A [Microsoft 365 account for development](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts).\n> - [Teams Toolkit Visual Studio Code Extension](https://aka.ms/teams-toolkit) version 5.0.0 and higher or [Teams Toolkit CLI](https://aka.ms/teamsfx-toolkit-cli)\n> - [Microsoft 365 Copilot license](https://learn.microsoft.com/microsoft-365-copilot/extensibility/prerequisites#prerequisites)\n\n## Minimal path to awesome\n\n* Clone this repository (or [download this solution as a .ZIP file](https://pnp.github.io/download-partial/?url=https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-todo-tasks-graphapi-plugin) then unzip it)\n\n* Register an Entra ID application in Azure and add the API permissions `Tasks.ReadWrite,User.Read,Directory.Read.All` (delegated). Add the `https://teams.microsoft.com/api/platform/v1.0/oAuthRedirect` as a redirect URL for web platform in the **Authentication** settings.\n\n2. In the [Teams developer portal](https://dev.teams.microsoft.com/), add a new OAuth client registration and register a new client with the following information (replace `tenantid` by your own value):\n\n **App settings**\n\n - **Registration name**: ToDo\n - **Base URL**: `https://graph.microsoft.com/beta` (QnA are only usable through the beta endpoint)\n - **Restrict usage by org**: My organization only\n - **Restrict usage by app**: Any Teams app (when agent is deployed, use the Teams app ID).\n\n **OAuth settings**\n - **Client ID**: <the entra ID application ID>\n - **Client secret**: <the Entra ID application secret>\n - **Authorization endpoint**: https://login.microsoftonline.com/tenantid/oauth2/v2.0/authorize\n - **Token endpoint**: https://login.microsoftonline.com/tenantid/oauth2/v2.0/token\n - **Refresh endpoint**: https://login.microsoftonline.com/tenantid/oauth2/v2.0/refresh\n - **Scope**: Tasks.ReadWrite,User.Read,Directory.Read.All\n\n Save the information. A new OAuth registration key will be generated.\n\n3. Open the **ai-plugin.json** file and replace the auth property by the following, using the key from the previous step. You can also use the `${{OAUTH2_REGISTRATIONKEY}}` token defined the `.env.dev` file: \n\n ```json\n \"auth\": {\n \"type\": \"OAuthPluginVault\",\n \"reference_id\": \"ZTRhNDM5YjQtM2...\"\n },\n ```\n\n4. From Teams Toolkit, sign-in to your Microsoft 365 account.\n5. From Teams Toolkit, provision the solution to create the Teams app.\n6. Go to [https://www.office.com/chat?auth=2](https://www.office.com/chat?auth=2) URL and enable the developer mode by using the `-developer on` prompt.\n7. Ask a question like _\"List My Tasks\"_. You should see the plugin triggered.\n\n## Features\n\nThe following sample demonstrates the following concepts:\n- Use Microsoft Graph API as an API plugin by using specific endpoint and instructions.\n- Query the QnA content from Microsoft Search and use it for Copilot answers.\n\n\n\n## Help\n\nWe do not support samples, but this community is always willing to help, and we want to improve these samples. We use GitHub to track issues, which makes it easy for community members to volunteer their time and help resolve issues.\n\nYou can try looking at [issues related to this sample](https://github.com/pnp/copilot-pro-dev-samples/issues?q=label%3A%22sample%3A%20da-qna-graphapi-plugin%22) to see if anybody else is having the same issues.\n\nIf you encounter any issues using this sample, [create a new issue](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\nFinally, if you have an idea for improvement, [make a suggestion](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n\n" + }, + { + "folder": "da-trey-research", + "title": "Trey Research TypeScript", + "description": "This sample demonstrates how to create an agent that interacts with a consulting API to provide information about consultants and projects.", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-trey-research", + "updatedAt": "2025-06-16T00:00:00.000Z", + "longDescription": [ + "This sample demonstrates how to create an agent that interacts with a consulting API to provide information about consultants and projects. The agent can answer questions about consultants and their projects" + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Node.js" + }, + { + "key": "LANGUAGE", + "value": "TypeScript" + }, + { + "key": "API-PLUGIN", + "value": "Yes" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://github.com/pnp/pnp-copilot-pro-dev-samples/raw/main/samples/da-trey-research/assets/preview.gif", + "imageAlt": "Demonstration of Trey Research sample", + "readmeContent": "# Trey Research Copilot Declarative Agent (anonymous version)\n\n## Summary\n\nTrey Research is a fictitious consulting company that supplies talent in the software and pharmaceuticals industries.\n\nThe solution consists of an API plugin that calls a set of Azure functions, which store the consulting data in a Azure Table storage (it uses the Azurite storage emulator when running locally).\n\nA declarative agent is provided to converse with users and to call the API plugin, as well as to reference the correct SharePoint document library.\n\n![Trey Research](./assets/preview.gif)\n\n## Features\n\nThe sample showcases the following features:\n\n1. Declarative agent with branding and instructions, with access to relevant documents and an API\n2. API based plugin works with any platform that supports REST requests\n3. Copilot will construct queries for specific data using GET requests\n4. Copilot updates and adds data using POST requests\n5. Multi-parameter queries to filter results\n6. Show a confirmation card before POSTing data; capture missing parameters\n7. Display rich adaptive cards\n\n## Contributors\n\n* [Bob German](https://github.com/bobgerman)\n* [Garry Trinder](https://github.com/garrytrinder)\n\n## Version history\n\n| Version | Date | Comments |\n|--|--|--|\n| 1.1 | June 11, 2025 | Maintenance release |\n| 1.0 | April 16, 2025 | Initial release |\n\n## Prerequisites\n\n* [Node.js](https://nodejs.org/)\n* A [Microsoft 365 tenant](https://learn.microsoft.com/en-us/microsoftteams/platform/concepts/build-and-test/prepare-your-o365-tenant) prepared for development\n* [Microsoft 365 Agents Toolkit](https://aka.ms/teams-toolkit) Visual Studio Code extension\n* A Microsoft 365 Copilot licence\n\n## Minimal path to awesome\n\n### 1. Setup document repository\n\nFor this sample, we will use OneDrive to store the documents that the agent will reference.\n\n> ![NOTE]\n> You can also use SharePoint document libraries, the URL will be slightly different, but the process is the same.\n\n1. Go to [OneDrive](https://www.microsoft365.com/onedrive)\n1. Go to **My files**\n1. Create a new folder called **Legal**\n1. Upload documents from the **sampleDocs** folder in this repository to the **Legal** folder\n1. Navigate to the **Legal** folder\n1. Expand the **Details** tab on the right\n1. Expand the **More details** tab\n1. Copy the Path to the Products folder using the **Copy** button\n\n### 2. Test the agent\n\n1. In the .env folder, create a new file called **.env.local**.\n2. Add the following line to the **.env.local** file:\n\n ```plaintext\n DOCUMENTS_URL=\n ```\n\n For example, if you copied the path `https://contoso-my.sharepoint.com/personal/user_contoso_com/Documents/Legal`, it should look like this:\n\n ```plaintext\n DOCUMENTS_URL=https://contoso-my.sharepoint.com/personal/user_contoso_com/Documents/Legal\n ```\n\n3. Press **F5** to start a debug session. If prompted, sign in with your [Microsoft 365 account](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts). Wait for the provisioning to complete and the browser to open.\n4. In the browser, if prompted, sign in with your Microsoft 365 account. The browser will open the declarative agent in Microsoft 365 Copilot after signing in.\n\n> ![IMPORTANT]\n> Microsoft 365 Copilot can cache the agent definition, so if you make changes to the agent, you may need to clear the browser cache for changes to be persisted. After the agent is loaded, use Hard Refresh (Ctrl+Shift+R) to ensure the latest version is loaded.\n\nTry the following prompts:\n\n* do we have any consultants with azure certifications?\n* what projects are we doing for relecloud?\n* which consultants are working with woodgrove bank?\n* how many hours has avery delivered this month?\n* please find a consultant with python skills who is available immediately\n* are any consultants available who are AWS certified?\n* does trey research have any architects with javascript skills?\n* what designers are working at woodgrove bank?\n* please charge 10 hours to woodgrove bank\n* please add sanjay to the contoso project\n* find my hours spreadsheet and get the hours for woodgrove, then bill the client\n* make a list of my projects, then write a summary of each based on the statement of work.\n\n## Troubleshooting and feature requests\n\nWe do not support samples, but this community is always willing to help, and we want to improve these samples. We use GitHub to track issues, which makes it easy for community members to volunteer their time and help resolve issues.\n\nYou can try looking at [issues related to this sample](https://github.com/pnp/copilot-pro-dev-samples/issues?q=label%3A%22sample%3A%20da-trey-resarch%22) to see if anybody else is having the same issues.\n\nIf you encounter any issues using this sample, [create a new issue](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\nFinally, if you have an idea for improvement, [make a suggestion](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n\n" + }, + { + "folder": "da-trey-research-auth-csharp", + "title": "Trey Research C# Auth", + "description": "This sample demonstrates how to create an agent that interacts with a protected consulting API built with C# Azure Functions to provide information about consultants and projects.", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-trey-research-auth-csharp", + "updatedAt": "2025-06-16T00:00:00.000Z", + "longDescription": [ + "This sample demonstrates how to create an agent that interacts with a protected consulting API to provide information about consultants and projects. The agent can answer questions about consultants and their projects" + ], + "metadata": [ + { + "key": "PLATFORM", + "value": ".NET" + }, + { + "key": "LANGUAGE", + "value": "C#" + }, + { + "key": "API-PLUGIN", + "value": "Yes" + }, + { + "key": "API-PLUGIN-AUTH", + "value": "OAuth" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://github.com/pnp/copilot-pro-dev-samples/raw/main/samples/da-trey-research-auth-csharp/assets/preview.gif", + "imageAlt": "Demonstration of Trey Research Auth sample", + "readmeContent": "# Trey Research Copilot Declarative Agent - C# (OAuth 2.0)\n\n## Summary\n\nTrey Research is a fictitious consulting company that supplies talent in the software and pharmaceuticals industries.\n\nThe solution consists of an API plugin that calls a set of Azure Functions (.NET isolated worker), which store the consulting data in Azure Table Storage (it uses the Azurite storage emulator when running locally).\n\nA declarative agent is provided to converse with users and to call the API plugin, as well as to reference the correct SharePoint document library.\n\n![Trey Research](./assets/preview.gif)\n\n## Features\n\nThe sample showcases the following features:\n\n1. Declarative agent with branding and instructions, with access to relevant documents and an API\n2. API based plugin works with any platform that supports REST requests\n3. Copilot will construct queries for specific data using GET requests\n4. Copilot updates and adds data using POST requests\n5. Multi-parameter queries to filter results\n6. Show a confirmation card before POSTing data; capture missing parameters\n7. Display rich adaptive cards\n8. Authenticate the user using Entra ID and OAuth 2.0\n9. Token validation in C# using Microsoft.IdentityModel (without Easy Auth)\n\n## Contributors\n\n* [Yugal Pradhan](https://github.com/YugalPradhan31)\n\n## Version history\n\n| Version | Date | Comments |\n|--|--|--|\n| 1.0 | May 18, 2026 | Initial release |\n\n## Prerequisites\n\n![drop](https://img.shields.io/badge/Microsoft%20365%20Agents%20Toolkit-5.10-green.svg)\n\n* [.NET 10 SDK](https://dotnet.microsoft.com/download/dotnet/10.0)\n* [Azure Functions Core Tools](https://learn.microsoft.com/azure/azure-functions/functions-run-local) v4\n* [Node.js](https://nodejs.org/) (for database seeding scripts)\n* A [Microsoft 365 tenant](https://learn.microsoft.com/en-us/microsoftteams/platform/concepts/build-and-test/prepare-your-o365-tenant) prepared for development\n* [Microsoft 365 Agents Toolkit](https://aka.ms/teams-toolkit) Visual Studio Code extension\n* A Microsoft 365 Copilot licence\n\n## Minimal path to awesome\n\n### 1. Setup document repository\n\nFor this sample, we will use OneDrive to store the documents that the agent will reference.\n\n> ![NOTE]\n> You can also use SharePoint document libraries, the URL will be slightly different, but the process is the same.\n\n1. Go to [OneDrive](https://www.microsoft365.com/onedrive)\n1. Go to **My files**\n1. Create a new folder called **Legal**\n1. Upload documents from the **sampleDocs** folder in this repository to the **Legal** folder\n1. Navigate to the **Legal** folder\n1. Expand the **Details** tab on the right\n1. Expand the **More details** tab\n1. Copy the Path to the Products folder using the **Copy** button\n\n### 2. Test the agent\n\n1. In the M365Agent/env folder, create a new file called **.env.local**.\n2. Add the following line to the **.env.local** file:\n\n ```plaintext\n DOCUMENTS_URL=\n ```\n\n For example, if you copied the path `https://contoso-my.sharepoint.com/personal/user_contoso_com/Documents/Legal`, it should look like this:\n\n ```plaintext\n DOCUMENTS_URL=https://contoso-my.sharepoint.com/personal/user_contoso_com/Documents/Legal\n ```\n\n3. Press **F5** to start a debug session. If prompted, sign in with your [Microsoft 365 account](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts). Wait for the provisioning to complete and the browser to open.\n4. In the browser, if prompted, sign in with your Microsoft 365 account. The browser will open the declarative agent in Microsoft 365 Copilot after signing in.\n\n> ![IMPORTANT]\n> Microsoft 365 Copilot can cache the agent definition, so if you make changes to the agent, you may need to clear the browser cache for changes to be persisted. After the agent is loaded, use Hard Refresh (Ctrl+Shift+R) to ensure the latest version is loaded.\n\nTry the following prompts:\n\n* do we have any consultants with azure certifications?\n* what projects are we doing for relecloud?\n* which consultants are working with woodgrove bank?\n* how many hours has avery delivered this month?\n* please find a consultant with python skills who is available immediately\n* are any consultants available who are AWS certified?\n* does trey research have any architects with javascript skills?\n* what designers are working at woodgrove bank?\n* please charge 10 hours to woodgrove bank\n* please add sanjay to the contoso project\n* find my hours spreadsheet and get the hours for woodgrove, then bill the client\n* make a list of my projects, then write a summary of each based on the statement of work.\n\n## Troubleshooting and feature requests\n\nWe do not support samples, but this community is always willing to help, and we want to improve these samples. We use GitHub to track issues, which makes it easy for community members to volunteer their time and help resolve issues.\n\nYou can try looking at [issues related to this sample](https://github.com/pnp/copilot-pro-dev-samples/issues?q=label%3A%22sample%3A%20da-trey-research-auth-csharp%22) to see if anybody else is having the same issues.\n\nIf you encounter any issues using this sample, [create a new issue](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\nFinally, if you have an idea for improvement, [make a suggestion](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n\n" + }, + { + "folder": "da-trey-research-auth-js", + "title": "Trey Research TS Auth", + "description": "This sample demonstrates how to create an agent that interacts with a protected consulting API to provide information about consultants and projects.", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-trey-research-auth-js", + "updatedAt": "2025-06-16T00:00:00.000Z", + "longDescription": [ + "This sample demonstrates how to create an agent that interacts with a protected consulting API to provide information about consultants and projects. The agent can answer questions about consultants and their projects" + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Node.js" + }, + { + "key": "LANGUAGE", + "value": "TypeScript" + }, + { + "key": "API-PLUGIN", + "value": "Yes" + }, + { + "key": "API-PLUGIN-AUTH", + "value": "OAuth" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://github.com/pnp/copilot-pro-dev-samples/raw/main/samples/da-trey-research-auth-js/assets/preview.gif", + "imageAlt": "Demonstration of Trey Research Auth sample", + "readmeContent": "# Trey Research Copilot Declarative Agent (OAuth 2.0)\n\n## Summary\n\nTrey Research is a fictitious consulting company that supplies talent in the software and pharmaceuticals industries.\n\nThe solution consists of an API plugin that calls a set of Azure functions, which store the consulting data in a Azure Table storage (it uses the Azurite storage emulator when running locally).\n\nA declarative agent is provided to converse with users and to call the API plugin, as well as to reference the correct SharePoint document library.\n\n![Trey Research](./assets/preview.gif)\n\n## Features\n\nThe sample showcases the following features:\n\n1. Declarative agent with branding and instructions, with access to relevant documents and an API\n2. API based plugin works with any platform that supports REST requests\n3. Copilot will construct queries for specific data using GET requests\n4. Copilot updates and adds data using POST requests\n5. Multi-parameter queries to filter results\n6. Show a confirmation card before POSTing data; capture missing parameters\n7. Display rich adaptive cards\n8. Authenticate the user using Entra ID and OAuth 2.0\n\n## Contributors\n\n* [Bob German](https://github.com/bobgerman)\n* [Garry Trinder](https://github.com/garrytrinder)\n\n## Version history\n\n| Version | Date | Comments |\n|--|--|--|\n| 1.1 | June 11, 2025 | Maintenance release |\n| 1.0 | April 16, 2025 | Initial release |\n\n## Prerequisites\n\n* [Node.js](https://nodejs.org/)\n* A [Microsoft 365 tenant](https://learn.microsoft.com/en-us/microsoftteams/platform/concepts/build-and-test/prepare-your-o365-tenant) prepared for development\n* [Microsoft 365 Agents Toolkit](https://aka.ms/teams-toolkit) Visual Studio Code extension\n* A Microsoft 365 Copilot licence\n\n## Minimal path to awesome\n\n### 1. Setup document repository\n\nFor this sample, we will use OneDrive to store the documents that the agent will reference.\n\n> ![NOTE]\n> You can also use SharePoint document libraries, the URL will be slightly different, but the process is the same.\n\n1. Go to [OneDrive](https://www.microsoft365.com/onedrive)\n1. Go to **My files**\n1. Create a new folder called **Legal**\n1. Upload documents from the **sampleDocs** folder in this repository to the **Legal** folder\n1. Navigate to the **Legal** folder\n1. Expand the **Details** tab on the right\n1. Expand the **More details** tab\n1. Copy the Path to the Products folder using the **Copy** button\n\n### 2. Test the agent\n\n1. In the .env folder, create a new file called **.env.local**.\n2. Add the following line to the **.env.local** file:\n\n ```plaintext\n DOCUMENTS_URL=\n ```\n\n For example, if you copied the path `https://contoso-my.sharepoint.com/personal/user_contoso_com/Documents/Legal`, it should look like this:\n\n ```plaintext\n DOCUMENTS_URL=https://contoso-my.sharepoint.com/personal/user_contoso_com/Documents/Legal\n ```\n\n3. Press **F5** to start a debug session. If prompted, sign in with your [Microsoft 365 account](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts). Wait for the provisioning to complete and the browser to open.\n4. In the browser, if prompted, sign in with your Microsoft 365 account. The browser will open the declarative agent in Microsoft 365 Copilot after signing in.\n\n> ![IMPORTANT]\n> Microsoft 365 Copilot can cache the agent definition, so if you make changes to the agent, you may need to clear the browser cache for changes to be persisted. After the agent is loaded, use Hard Refresh (Ctrl+Shift+R) to ensure the latest version is loaded.\n\nTry the following prompts:\n\n* do we have any consultants with azure certifications?\n* what projects are we doing for relecloud?\n* which consultants are working with woodgrove bank?\n* how many hours has avery delivered this month?\n* please find a consultant with python skills who is available immediately\n* are any consultants available who are AWS certified?\n* does trey research have any architects with javascript skills?\n* what designers are working at woodgrove bank?\n* please charge 10 hours to woodgrove bank\n* please add sanjay to the contoso project\n* find my hours spreadsheet and get the hours for woodgrove, then bill the client\n* make a list of my projects, then write a summary of each based on the statement of work.\n\n## Troubleshooting and feature requests\n\nWe do not support samples, but this community is always willing to help, and we want to improve these samples. We use GitHub to track issues, which makes it easy for community members to volunteer their time and help resolve issues.\n\nYou can try looking at [issues related to this sample](https://github.com/pnp/copilot-pro-dev-samples/issues?q=label%3A%22sample%3A%20da-trey-research-auth-js%22) to see if anybody else is having the same issues.\n\nIf you encounter any issues using this sample, [create a new issue](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\nFinally, if you have an idea for improvement, [make a suggestion](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n\n" + }, + { + "folder": "da-trey-research-auth-python", + "title": "Trey Research Python Auth", + "description": "This sample demonstrates how to create a Python-based agent that interacts with a protected consulting API to provide information about consultants and projects.", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-trey-research-auth-python", + "updatedAt": "2026-05-15T00:00:00.000Z", + "longDescription": [ + "This sample demonstrates how to create a Python-based agent that interacts with a protected consulting API to provide information about consultants and projects. The agent can answer questions about consultants and their projects" + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Python" + }, + { + "key": "LANGUAGE", + "value": "Python" + }, + { + "key": "API-PLUGIN", + "value": "Yes" + }, + { + "key": "API-PLUGIN-AUTH", + "value": "OAuth" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://github.com/pnp/copilot-pro-dev-samples/raw/main/samples/da-trey-research-auth-python/assets/preview.gif", + "imageAlt": "Demonstration of Trey Research Auth Python sample", + "readmeContent": "# Trey Research Copilot Declarative Agent - Python (OAuth 2.0)\n\n## Summary\n\nTrey Research is a fictitious consulting company that supplies talent in the software and pharmaceuticals industries.\n\nThe solution consists of an API plugin that calls a set of Azure Functions (Python), which store the consulting data in Azure Table Storage (it uses the Azurite storage emulator when running locally).\n\nA declarative agent is provided to converse with users and to call the API plugin, as well as to reference the correct SharePoint document library.\n\n![Trey Research](./assets/preview.gif)\n\n## Features\n\nThe sample showcases the following features:\n\n1. Declarative agent with branding and instructions, with access to relevant documents and an API\n2. API based plugin works with any platform that supports REST requests\n3. Copilot will construct queries for specific data using GET requests\n4. Copilot updates and adds data using POST requests\n5. Multi-parameter queries to filter results\n6. Show a confirmation card before POSTing data; capture missing parameters\n7. Display rich adaptive cards\n8. Authenticate the user using Entra ID and OAuth 2.0\n9. Token validation in Python using [PyJWT](https://pyjwt.readthedocs.io/) (without Easy Auth)\n\n## Contributors\n\n* [Yugal Pradhan](https://github.com/YugalPradhan31)\n\n## Version history\n\n| Version | Date | Comments |\n|--|--|--|\n| 1.0 | May 15, 2026 | Initial release |\n\n## Prerequisites\n\n![drop](https://img.shields.io/badge/Microsoft%20365%20Agents%20Toolkit-5.10-green.svg)\n\n* [Python](https://www.python.org/downloads/) version 3.10 or later\n* [Azure Functions Core Tools](https://learn.microsoft.com/azure/azure-functions/functions-run-local) v4\n* A [Microsoft 365 tenant](https://learn.microsoft.com/en-us/microsoftteams/platform/concepts/build-and-test/prepare-your-o365-tenant) prepared for development\n* [Microsoft 365 Agents Toolkit](https://aka.ms/teams-toolkit) Visual Studio Code extension\n* A Microsoft 365 Copilot licence\n\n## Minimal path to awesome\n\n### 1. Setup document repository\n\nFor this sample, we will use OneDrive to store the documents that the agent will reference.\n\n> ![NOTE]\n> You can also use SharePoint document libraries, the URL will be slightly different, but the process is the same.\n\n1. Go to [OneDrive](https://www.microsoft365.com/onedrive)\n1. Go to **My files**\n1. Create a new folder called **Legal**\n1. Upload documents from the **sampleDocs** folder in this repository to the **Legal** folder\n1. Navigate to the **Legal** folder\n1. Expand the **Details** tab on the right\n1. Expand the **More details** tab\n1. Copy the Path to the **Legal** folder using the **Copy** button\n\n### 2. Test the agent\n\n1. In the .env folder, create a new file called **.env.local**.\n2. Add the following line to the **.env.local** file:\n\n ```plaintext\n DOCUMENTS_URL=\n ```\n\n For example, if you copied the path `https://contoso-my.sharepoint.com/personal/user_contoso_com/Documents/Legal`, it should look like this:\n\n ```plaintext\n DOCUMENTS_URL=https://contoso-my.sharepoint.com/personal/user_contoso_com/Documents/Legal\n ```\n\n3. Install Python dependencies:\n\n ```bash\n pip install -r requirements.txt\n ```\n\n4. Press **F5** to start a debug session. If prompted, sign in with your [Microsoft 365 account](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts). Wait for the provisioning to complete and the browser to open.\n5. In the browser, if prompted, sign in with your Microsoft 365 account. The browser will open the declarative agent in Microsoft 365 Copilot after signing in.\n\n> ![IMPORTANT]\n> Microsoft 365 Copilot can cache the agent definition, so if you make changes to the agent, you may need to clear the browser cache for changes to be persisted. After the agent is loaded, use Hard Refresh (Ctrl+Shift+R) to ensure the latest version is loaded.\n\nTry the following prompts:\n\n* do we have any consultants with azure certifications?\n* what projects are we doing for relecloud?\n* which consultants are working with woodgrove bank?\n* how many hours has avery delivered this month?\n* please find a consultant with python skills who is available immediately\n* are any consultants available who are AWS certified?\n* does trey research have any architects with javascript skills?\n* what designers are working at woodgrove bank?\n* please charge 10 hours to woodgrove bank\n* please add sanjay to the contoso project\n* find my hours spreadsheet and get the hours for woodgrove, then bill the client\n* make a list of my projects, then write a summary of each based on the statement of work.\n\n## Troubleshooting and feature requests\n\nWe do not support samples, but this community is always willing to help, and we want to improve these samples. We use GitHub to track issues, which makes it easy for community members to volunteer their time and help resolve issues.\n\nYou can try looking at [issues related to this sample](https://github.com/pnp/copilot-pro-dev-samples/issues?q=label%3A%22sample%3A%20da-trey-research-auth-python%22) to see if anybody else is having the same issues.\n\nIf you encounter any issues using this sample, [create a new issue](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\nFinally, if you have an idea for improvement, [make a suggestion](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n\n" + }, + { + "folder": "da-trey-research-cs", + "title": "Trey Research C#", + "description": "This sample demonstrates how to create an agent that interacts with a consulting API (C# Azure Functions) to provide information about consultants and projects.", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-trey-research-cs", + "updatedAt": "2026-06-04T00:00:00.000Z", + "longDescription": [ + "This sample demonstrates how to create an agent that interacts with a consulting API built with C# Azure Functions to provide information about consultants and projects. The agent can answer questions about consultants and their projects, charge time, and assign consultants to projects." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": ".NET" + }, + { + "key": "LANGUAGE", + "value": "C#" + }, + { + "key": "API-PLUGIN", + "value": "Yes" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://github.com/pnp/copilot-pro-dev-samples/raw/main/samples/da-trey-research-cs/assets/preview.gif", + "imageAlt": "Demonstration of Trey Research sample", + "readmeContent": "# Trey Research Copilot Declarative Agent (C#)\n\n## Summary\n\nTrey Research is a fictitious consulting company that supplies talent in the software and pharmaceuticals industries.\n\nThe solution consists of an API plugin that calls a set of Azure Functions (C#), which store the consulting data in Azure Table Storage (it uses the Azurite storage emulator when running locally).\n\nA declarative agent is provided to converse with users and to call the API plugin, as well as to reference the correct SharePoint document library.\n\n## Features\n\nThe sample showcases the following features:\n\n1. Declarative agent with branding and instructions, with access to relevant documents and an API\n2. API based plugin works with any platform that supports REST requests\n3. Copilot will construct queries for specific data using GET requests\n4. Copilot updates and adds data using POST requests\n5. Multi-parameter queries to filter results\n6. Show a confirmation card before POSTing data; capture missing parameters\n7. Display rich adaptive cards\n\n## Contributors\n\n* [Bob German](https://github.com/bobgerman)\n* [Garry Trinder](https://github.com/garrytrinder)\n\n## Version history\n\n| Version | Date | Comments |\n|--|--|--|\n| 1.0 | June 4, 2026 | Initial release |\n\n## Prerequisites\n\n* [.NET 8 SDK](https://dotnet.microsoft.com/download/dotnet/8.0)\n* [Azure Functions Core Tools v4](https://learn.microsoft.com/en-us/azure/azure-functions/functions-run-local)\n* A [Microsoft 365 tenant](https://learn.microsoft.com/en-us/microsoftteams/platform/concepts/build-and-test/prepare-your-o365-tenant) prepared for development\n* [Microsoft 365 Agents Toolkit](https://aka.ms/teams-toolkit) Visual Studio Code extension\n* A Microsoft 365 Copilot licence\n\n## Minimal path to awesome\n\n### 1. Setup document repository\n\nFor this sample, we will use OneDrive to store the documents that the agent will reference.\n\n> ![NOTE]\n> You can also use SharePoint document libraries, the URL will be slightly different, but the process is the same.\n\n1. Go to [OneDrive](https://www.microsoft365.com/onedrive)\n1. Go to **My files**\n1. Create a new folder called **Legal**\n1. Upload documents from the **sampleDocs** folder in this repository to the **Legal** folder\n1. Navigate to the **Legal** folder\n1. Expand the **Details** tab on the right\n1. Expand the **More details** tab\n1. Copy the Path to the Products folder using the **Copy** button\n\n### 2. Test the agent\n\n1. In the .env folder, create a new file called **.env.local**.\n2. Add the following line to the **.env.local** file:\n\n ```plaintext\n DOCUMENTS_URL=\n ```\n\n For example, if you copied the path `https://contoso-my.sharepoint.com/personal/user_contoso_com/Documents/Legal`, it should look like this:\n\n ```plaintext\n DOCUMENTS_URL=https://contoso-my.sharepoint.com/personal/user_contoso_com/Documents/Legal\n ```\n\n3. Press **F5** to start a debug session. If prompted, sign in with your [Microsoft 365 account](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts). Wait for the provisioning to complete and the browser to open.\n4. In the browser, if prompted, sign in with your Microsoft 365 account. The browser will open the declarative agent in Microsoft 365 Copilot after signing in.\n\n> ![IMPORTANT]\n> Microsoft 365 Copilot can cache the agent definition, so if you make changes to the agent, you may need to clear the browser cache for changes to be persisted. After the agent is loaded, use Hard Refresh (Ctrl+Shift+R) to ensure the latest version is loaded.\n\nTry the following prompts:\n\n* do we have any consultants with azure certifications?\n* what projects are we doing for relecloud?\n* which consultants are working with woodgrove bank?\n* how many hours has avery delivered this month?\n* please find a consultant with python skills who is available immediately\n* are any consultants available who are AWS certified?\n* does trey research have any architects with javascript skills?\n* what designers are working at woodgrove bank?\n* please charge 10 hours to woodgrove bank\n* please add sanjay to the contoso project\n\n## Troubleshooting and feature requests\n\nWe do not support samples, but this community is always willing to help, and we want to improve these samples. We use GitHub to track issues, which makes it easy for community members to volunteer their time and help resolve issues.\n\nYou can try looking at [issues related to this sample](https://github.com/pnp/copilot-pro-dev-samples/issues?q=label%3A%22sample%3A%20da-trey-resarch-cs%22) to see if anybody else is having the same issues.\n\nIf you encounter any issues using this sample, [create a new issue](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\nFinally, if you have an idea for improvement, [make a suggestion](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n\n" + }, + { + "folder": "da-trey-research-python", + "title": "Trey Research Python", + "description": "This sample demonstrates how to create an agent that interacts with a consulting API (Python Azure Functions) to provide information about consultants and projects.", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-trey-research-python", + "updatedAt": "2026-06-01T00:00:00.000Z", + "longDescription": [ + "This sample demonstrates how to create an agent that interacts with a consulting API built with Python Azure Functions to provide information about consultants and projects. The agent can answer questions about consultants and their projects, charge time, and assign consultants to projects." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Python" + }, + { + "key": "LANGUAGE", + "value": "Python" + }, + { + "key": "API-PLUGIN", + "value": "Yes" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://github.com/pnp/copilot-pro-dev-samples/raw/main/samples/da-trey-research-python/assets/preview.gif", + "imageAlt": "Demonstration of Trey Research sample", + "readmeContent": "# Trey Research Copilot Declarative Agent (Python)\n\n## Summary\n\nTrey Research is a fictitious consulting company that supplies talent in the software and pharmaceuticals industries.\n\nThe solution consists of an API plugin that calls a set of Azure Functions (Python), which store the consulting data in Azure Table Storage (it uses the Azurite storage emulator when running locally).\n\nA declarative agent is provided to converse with users and to call the API plugin.\n\n## Features\n\nThe sample showcases the following features:\n\n1. Declarative agent with branding and instructions, with access to relevant documents and an API\n2. API based plugin works with any platform that supports REST requests\n3. Copilot will construct queries for specific data using GET requests\n4. Copilot updates and adds data using POST requests\n5. Multi-parameter queries to filter results\n6. Show a confirmation card before POSTing data; capture missing parameters\n7. Display rich adaptive cards\n\n## Contributors\n\n* [AjayJ12-MSFT](https://github.com/AjayJ12-MSFT)\n\n## Version history\n\n| Version | Date | Comments |\n|--|--|--|\n| 1.0 | June 2, 2026 | Initial release |\n\n## Prerequisites\n\n* [Python 3.10+](https://www.python.org/downloads/)\n* [Azure Functions Core Tools v4](https://learn.microsoft.com/en-us/azure/azure-functions/functions-run-local)\n* A [Microsoft 365 tenant](https://learn.microsoft.com/en-us/microsoftteams/platform/concepts/build-and-test/prepare-your-o365-tenant) prepared for development\n* [Microsoft 365 Agents Toolkit](https://aka.ms/teams-toolkit) Visual Studio Code extension\n* A Microsoft 365 Copilot licence\n\n## Minimal path to awesome\n\n### 1. Setup document repository\n\nFor this sample, we will use OneDrive to store the documents that the agent will reference.\n\n> ![NOTE]\n> You can also use SharePoint document libraries, the URL will be slightly different, but the process is the same.\n\n1. Go to [OneDrive](https://www.microsoft365.com/onedrive)\n1. Go to **My files**\n1. Create a new folder called **Legal**\n1. Upload documents from the **sampleDocs** folder in this repository to the **Legal** folder\n1. Navigate to the **Legal** folder\n1. Expand the **Details** tab on the right\n1. Expand the **More details** tab\n1. Copy the Path to the Products folder using the **Copy** button\n\n### 2. Test the agent\n\n1. In the .env folder, create a new file called **.env.local**.\n2. Add the following line to the **.env.local** file:\n\n ```plaintext\n DOCUMENTS_URL=\n ```\n\n For example, if you copied the path `https://contoso-my.sharepoint.com/personal/user_contoso_com/Documents/Legal`, it should look like this:\n\n ```plaintext\n DOCUMENTS_URL=https://contoso-my.sharepoint.com/personal/user_contoso_com/Documents/Legal\n ```\n\n3. Press **F5** to start a debug session. If prompted, sign in with your [Microsoft 365 account](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts). Wait for the provisioning to complete and the browser to open.\n4. In the browser, if prompted, sign in with your Microsoft 365 account. The browser will open the declarative agent in Microsoft 365 Copilot after signing in.\n\n> ![IMPORTANT]\n> Microsoft 365 Copilot can cache the agent definition, so if you make changes to the agent, you may need to clear the browser cache for changes to be persisted. After the agent is loaded, use Hard Refresh (Ctrl+Shift+R) to ensure the latest version is loaded.\n\nTry the following prompts:\n\n* do we have any consultants with azure certifications?\n* what projects are we doing for relecloud?\n* which consultants are working with woodgrove bank?\n* how many hours has avery delivered this month?\n* please find a consultant with python skills who is available immediately\n* are any consultants available who are AWS certified?\n* does trey research have any architects with javascript skills?\n* what designers are working at woodgrove bank?\n* please charge 10 hours to woodgrove bank\n* please add sanjay to the contoso project\n\n## Troubleshooting and feature requests\n\nWe do not support samples, but this community is always willing to help, and we want to improve these samples. We use GitHub to track issues, which makes it easy for community members to volunteer their time and help resolve issues.\n\nYou can try looking at [issues related to this sample](https://github.com/pnp/copilot-pro-dev-samples/issues?q=label%3A%22sample%3A%20da-trey-resarch-python%22) to see if anybody else is having the same issues.\n\nIf you encounter any issues using this sample, [create a new issue](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\nFinally, if you have an idea for improvement, [make a suggestion](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n\n" + }, + { + "folder": "da-typespec-appinsights", + "title": "da-typespec-appinsights", + "description": "Community sample for Microsoft 365 Copilot developers.", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-typespec-appinsights", + "updatedAt": null, + "longDescription": [], + "metadata": [], + "imageUrl": null, + "imageAlt": "", + "readmeContent": "# Monitor your Copilot declarative agents using TypeSpec and Application Insights\n\n## Summary\n\nThis sample demonstrates how to integrate Azure Application Insights into existing Copilot \"pro-code\" declarative agents using TypeSpec and API plugins. This generic approach, combined with strategic prompting techniques, enables us to capture meaningful metrics for declarative agents.\n\nThe following blog post describes the complete solution setup: [https://blog.franckcornu.com/post/add-app-insights-procode-copilot-da/](https://blog.franckcornu.com/post/add-app-insights-procode-copilot-da/)\n\n![\"Architecture\"](./assets/copilot_analytics_architecture.png)\n\n![\"Developer debug API plugin\"](./assets/developer_debug.png)\n\n![\"Application Insights Logs\"](./assets/app_insights_logs.png)\n\n## Contributors\n\n* [Franck Cornu](https://github.com/FranckyC)- M365 Development/Copilot extensibility MVP\n## Version history\n\nVersion|Date|Comments\n-------|----|--------\n1.0|August 12, 2025|Initial solution\n\n## Prerequisites\n\n- [Microsoft agents toolkit Visual Studio Code Extension](https://marketplace.visualstudio.com/items?itemName=TeamsDevApp.ms-teams-vscode-extension)\n- [Microsoft 365 Copilot license](https://learn.microsoft.com/microsoft-365-copilot/extensibility/prerequisites#prerequisites)\n- A [Microsoft 365 account for development](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts).\n- Azure environment\n\n## Minimal path to awesome\n\n1. Clone this repository\n2. In Azure, create a new Azure Logic App as mentionned here: [https://blog.franckcornu.com/post/add-app-insights-procode-copilot-da](https://blog.franckcornu.com/post/add-app-insights-procode-copilot-da)\n3. In the `env.dev` file, fill the following values extracted from the Logic App HTTP Trigger URL:\n\n![\"Logic App\"](./assets/workflow_url.png)\n\n```text\nLOGIC_APP_SERVER_URL=https://prod-27..logic.azure.com:443\nLOGIC_APP_INVOKE_PATH=/workflows//triggers//paths/invoke\nLOGIC_APP_TRIGGER_PATH=/triggers//run\n```\n\n4. From Microsoft 365 Agents Toolkit, sign-in to your Microsoft 365 account.\n5. From Microsoft 365 Agents, provision the solution to create the Teams app.\n5. Go to [https://www.office.com/chat?auth=2](https://www.office.com/chat?auth=2) URL and enable the developer mode by using the `-developer on` prompt.\n7. Ask a question like _\"What are my latest documents?\"_. You should see the plugin triggered and data sent to the Logic App/Application Insights.\n\n## Features\n\nThe following sample demonstrates the following concepts:\n- Use Logic App as an API plugin by using specific endpoint and instructions.\n- Pass parameter from the LLM context\n\n\n\n## Help\n\nSearch for:\nda-appinsights-plugin-typespec\n\nSearch for:\n@FranckyC\n\nWe do not support samples, but this community is always willing to help, and we want to improve these samples. We use GitHub to track issues, which makes it easy for community members to volunteer their time and help resolve issues.\n\nYou can try looking at [issues related to this sample](https://github.com/pnp/copilot-pro-dev-samples/issues?q=label%3A%22sample%3A%20da-appinsights-plugin-typespec%22) to see if anybody else is having the same issues.\n\nIf you encounter any issues using this sample, [create a new issue](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\nFinally, if you have an idea for improvement, [make a suggestion](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n\n" + }, + { + "folder": "da-typespec-AzureAISearch_MsGraph-volunteeringapp", + "title": "Finding and apply for volunteer opportunities using Microsoft 365 Copilot with SharePoint List and Azure Ai Search - No code!", + "description": "This sample demonstrates how to build a declarative agent for Microsoft 365 Copilot using TypeSpec that allows you to find and apply for volunteer opportunities using Microsoft 365 Copilot with SharePoint List and Azure Ai Search integration and authentication.", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-typespec-AzureAISearch_MsGraph-volunteeringapp", + "updatedAt": "2025-05-02T00:00:00.000Z", + "longDescription": [ + "This sample demonstrates how to build a declarative agent for Microsoft 365 Copilot that allows you to find and apply for volunteer opportunities using Microsoft 365 Copilot with SharePoint List and Azure Ai Search integration and authentication. The agent will first ask what kind of volunteering you wish to do. Once decided it will submit your application to the selected opportunity. A key point of emphasis on this agent was making use of multiple Microsoft services using different APIs. The agent uses Microsoft Graph API to get the list of tasks assigned to the user and Azure AI Search to get the list of volunteer opportunities. The agent is built using the Microsoft Teams Toolkit." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "No" + }, + { + "key": "LANGUAGE", + "value": "No" + }, + { + "key": "API-PLUGIN", + "value": "Yes" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "Yes" + } + ], + "imageUrl": "https://github.com/pnp/copilot-pro-dev-samples/raw/main/samples/da-volunteeringapp/assets/screenshot-find-volunteering-activities.gif", + "imageAlt": "Find volunteering opportunities", + "readmeContent": "# Declarative Agent with TypeSpec connecting to Azure AI Search and Ms Graph with Volunteering App as an example\n\n![Declarative Agent - Volunteering App](./assets/example.gif)\n\n## Summary\n\nThis declarative agent is replicating existing sample [Declarative Agent - Volunteering App](https://pnp.github.io/download-partial/?url=https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-da-volunteeringapp) showcasing how to use multi API plugins with OAuth 2 and APIKey authentication using TypeSpec to strealine the development process. The sample covers a sample volunteering app that can be used to automate the process of finding and applying for volunteer opportunities. The agent will first ask what kind of volunteering you wish to do. Once decided it will submit your application to the selected opportunity. A key point of emphasis on this agent was making use of multiple Microsoft services using different APIs. The agent uses Microsoft Graph API to get the list of tasks assigned to the user and Azure AI Search to get the list of volunteer opportunities.\n\nView these two blogs for more info how to set up Azure AI Search API plugin and Ms Graph API plugin.\n\n- [Build Microsoft 365 Copilot Agents That Connect to SharePoint with TypeSpec and OAuth](https://reshmeeauckloo.com/posts/declarativeagents-msgraph-typespec-createandlist-sp-items/)\n- [Declarative Agents: Azure OpenAI API Key Auth with TypeSpec](https://reshmeeauckloo.com/posts/declarativeagents-azure-open-ai-apikey-typespec/)\n\n## Contributors\n\n* [Reshmee Auckloo](https://github.com/reshmee011) - M365 Development MVP\n\n## Version history\n\nVersion|Date|Comments\n-------|----|--------\n1.0 | October 01, 2025 | Initial solution\n\n> **Prerequisites**\n>\n> To run this app template in your local dev machine, you will need:\n>\n> - [Node.js](https://nodejs.org/), supported versions: 18, 20, 22\n> - A [Microsoft 365 account for development](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts).\n> - [Microsoft 365 Agents Toolkit Visual Studio Code Extension](https://aka.ms/teams-toolkit) version 5.0.0 and higher or [Microsoft 365 Agents Toolkit CLI](https://aka.ms/teamsfx-toolkit-cli)\n> * [Azure AI Search](https://learn.microsoft.com/azure/search/search-what-is-azure-search) service with indexed data from the assets folder.\n> * A SharePoint site with a list using the **Issue Tracker** template\n\n\n1. First, select the Microsoft 365 Agents Toolkit icon on the left in the VS Code toolbar.\n2. In the Account section, sign in with your [Microsoft 365 account](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts) if you haven't already.\n3. Run `npm install` to install dependencies before working with TypeSpec files.\n4. Update the [`main.tsp`](./main.tsp), [`AISearchActions.tsp`](./aiSearchactions.tsp),[`msGraphactions.tsp`](./msGraphactions.tsp) following the instructions from minimal path to awesome to configure your agent and instructions. These are the TypeSpec files. \n5. Create app by clicking `Provision` in \"Lifecycle\" section.\n6. Select `Preview in Copilot (Edge)` or `Preview in Copilot (Chrome)` from the launch configuration dropdown.\n7. Once the Copilot agent is loaded in the browser, click on the \"…\" menu and select \"Copilot chats\". You will see your declarative agent on the right rail. Clicking on it will change the experience to showcase the logo and name of your declarative agent.\n8. Ask a question to your declarative agent and it should respond based on the instructions provided.\n\n\n![image](./assets/image.png)\n\n## Minimal path to awesome\n\n1. Clone this repository (or [download this solution as a .ZIP file](https://pnp.github.io/download-partial/?url=https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-typespec-AzureAISearch_MsGraph-volunteeringapp) then unzip it)\n\n2. Register an EntraID application in Azure:\n\n 1. Go to [Azure portal](https://portal.azure.com/)\n 2. Select **Microsoft Entra ID** > **Manage** > **App registrations** > **New registration**\n 3. Enter a name for the app (e.g., Volunteering App)\n 4. Select **Accounts in this organizational directory only**\n 5. Under **Redirect URI**, select **Web** and enter `https://teams.microsoft.com/api/platform/v1.0/oAuthRedirect`\n 6. Select **Register**\n 7. In the app registration, go to **Certificates & secrets** and create a new client secret\n 8. Copy the client secret value\n 9. In the app registration, go to **API permissions** and add the following permissions:\n * **Microsoft Graph** > **Delegated permissions** > `Directory.Read.All`, `Sites.ReadWrite.All`, `User.Read`\n 10. Select **Grant admin consent for ** to grant the permissions\n\n3. Get a copy your Endpoint URL from the Azure AI Search service:\n\n 1. Go to [Azure portal](https://portal.azure.com/)\n 2. Find or create your instance under **Azure AI Search**\n 3. Under **Overview**, copy the **URL** value. It should look like `https://.search.windows.net/`\n 4. Under **Keys**, copy the **Primary Key** value\n\n4. In the [Teams developer portal](https://dev.teams.microsoft.com/) under **Tools**, create a new **OAuth client registration** with the following information (replace `tenantid` with your own value):\n\n **App settings**\n\n * **Registration name**: Volunteering App\n * **Base URL**: `https://graph.microsoft.com/v1.0`\n * **Restrict usage by org**: My organization only\n * **Restrict usage by app**: Any Teams app (when agent is deployed, use the Teams app ID)\n\n **OAuth settings**\n * **Client ID**: <Entra ID App registration client ID>\n * **Client secret**: <Entra ID App registration client secret>\n * **Authorization endpoint**: \n * **Token endpoint**: \n * **Refresh endpoint**: \n * **Scope**: `Directory.Read.All`, `Sites.ReadWrite.All`, `User.Read`\n\n Save the information. A new **OAuth client registration key** will be generated. Copy the key.\n\n5. Staying in the [Teams developer portal](https://dev.teams.microsoft.com/) under **Tools**, create a new **API key registration** with the following information:\n\n * **API key**: Add a secret with the Azure AI Primary Key you copied in step 3.4\n * **API key name**: e.g., Azure AI Search Key\n * **Base URL**: The Azure AI Search URL you copied in step 3.3\n * **Target tenant**: Home tenant\n * **Restrict usage by app**: Any Teams app (when agent is deployed, use the Teams app ID)\n\n Save the information. A new **API key registration ID** will be generated. Copy the key.\n\n6. Rename the `.env.dev.example` file to `.env.dev` and update the following values:\n\n ```bash\n # Built-in environment variables\n TEAMSFX_ENV=dev\n APP_NAME_SUFFIX=dev\n\n TEAMS_APP_ID=082eb662-19a0-40a0-801a-4eeeae8ecac3\n TEAMS_APP_TENANT_ID=\n M365_TITLE_ID=\n M365_APP_ID=\n\n TASKITEMSAGENTAUTH_REGISTRATION_ID=\n APIKEYAUTH_REGISTRATION_ID=\n ```\n\n7. Update those within file [`msGraphactions.tsp`](./msGraphactions.tsp) \n\n```\n const SITE_ID = \"contoso.sharepoint.com,000d0ad0-000f-000d-0000-0000a000c0cf0,0b00c000-000a-0f0a-00dc-00000000ebe0\n\";\n const LIST_ID = \"cb000b0f-0af0-00ad-ec00d0ae0\";\n```\n\n\n8. Update the server_URL [`aiSearchactions.tsp`](./msGraphactions.tsp)\n\n```dotnetcli\n const SERVER_URL = \"https://.windows.net\";\n```\n\n9. From Teams Toolkit, sign-in to your Microsoft 365 account.\n\n10. From Teams Toolkit, provision the solution to create the Teams app.\n\n11. Go to [https://www.office.com/chat?auth=2](https://www.office.com/chat?auth=2) URL and enable the developer mode by using the `-developer on` prompt.\n\n12. Use one of the conversation starters to start the agent.\n\n## Features\n\nThe following sample demonstrates the following concepts:\n\n* Query the Microsoft Graph API to get the list of tasks assigned to the user\n* Query Azure AI Search to get the list of volunteer opportunities\n* Register the user to the selected opportunity\n\n## Demo \n\n[![Demo Video](./assets/video-thumbnail.jpg)](https://www.youtube.com/watch?v=h8wPL_ZUmC0 \"Declarative agent for volunteering app\")\n\n\n\n## What's included in the template\n\n| Folder | Contents |\n| ------------ | ---------------------------------------------------------------------------------------- |\n| `.vscode` | VSCode files for debugging |\n| `appPackage` | Templates for the application manifest, the GPT manifest and the API specification |\n| `env` | Environment files |\n\n\nThe following are Microsoft 365 Agents Toolkit specific project files. You can [visit a complete guide on Github](https://github.com/OfficeDev/TeamsFx/wiki/Teams-Toolkit-Visual-Studio-Code-v5-Guide#overview) to understand how Microsoft 365 Agents Toolkit works.\n\n| File | Contents |\n| -------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |\n| `m365agents.yml` | This is the main Microsoft 365 Agents Toolkit project file. The project file defines two primary things: Properties and configuration Stage definitions. |\n\nThe following are TypeSpec template files. You need to customize these files to configure your agent.\n\n| File | Contents |\n| ------------- | ------------------------------------------------------------------------------------------- |\n| `main.tsp` | This is the root file of TSP files. Please manually update this file to add your own agent. |\n| `aiSearchactions.tsp` | This is the actions file containing API endpoints for Azure AI Search to extend your declarative agent. |\n| `msGraphactions.tsp` | This is the actions file containing API endpoints for Ms Graph API to extend your declarative agent. |\n\n## Extend the template\n\n- [Add conversation starters](https://learn.microsoft.com/microsoft-365-copilot/extensibility/build-declarative-agents?tabs=ttk&tutorial-step=3): Conversation starters are hints that are displayed to the user to demonstrate how they can get started using the declarative agent.\n- [Add web content](https://learn.microsoft.com/microsoft-365-copilot/extensibility/build-declarative-agents?tabs=ttk&tutorial-step=4) for the ability to search web information.\n- [Add OneDrive and SharePoint content](https://learn.microsoft.com/microsoft-365-copilot/extensibility/build-declarative-agents?tabs=ttk&tutorial-step=5) as grounding knowledge for the agent.\n- [Add Microsoft Copilot Connectors content](https://learn.microsoft.com/microsoft-365-copilot/extensibility/build-declarative-agents?tabs=ttk&tutorial-step=6) to ground agent with enterprise knowledge.\n\n## Addition information and references\n\n- [Declarative agents for Microsoft 365](https://aka.ms/teams-toolkit-declarative-agent)\n\n## Help\n\nWe do not support samples, but this community is always willing to help, and we want to improve these samples. We use GitHub to track issues, which makes it easy for community members to volunteer their time and help resolve issues.\n\nYou can try looking at [issues related to this sample](https://github.com/pnp/copilot-pro-dev-samples/issues?q=label%3A%22sample%3A%20da-volunteeringapp%22) to see if anybody else is having the same issues.\n\nIf you encounter any issues using this sample, [create a new issue](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\nFinally, if you have an idea for improvement, [make a suggestion](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n\n" + }, + { + "folder": "da-typespec-azureopenai", + "title": "Azure Open AI Agent using TypeSpec for Microsoft 365 Copilot", + "description": "This sample demonstrates how to build a declarative agent for Microsoft 365 Copilot using TypeSpec for Microsoft 365 Copilot that allows to connect to Azure Open AI API as an API plugin to send queries.", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-typespec-azureopenai", + "updatedAt": "2025-09-12T00:00:00.000Z", + "longDescription": [ + "This sample demonstrates how to build a declarative agent for Microsoft 365 Copilot using TypeSpec for Microsoft 365 Copilot that allows you to connect to Azure Open AI API as an API plugin to send queries." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Node.js" + }, + { + "key": "API-PLUGIN", + "value": "Yes" + }, + { + "key": "TYPESPEC", + "value": "Yes" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://github.com/pnp/copilot-pro-dev-samples/raw/main/samples/da-typespec-azureopenai/assets/action_queryOpenAI.gif", + "imageAlt": "Declarative agent that shows latest query results", + "readmeContent": "# Azure Open API Agent using TypeSpec for Microsoft 365 Copilot\n\n## Summary\n\nThe sample is designed to demonstrate how to integrate Azure OpenAI services using TypeSpec. It provides a template for building conversational agents or plugins that leverage Azure OpenAI's capabilities, such as natural language processing and generative AI, within Microsoft Teams or other environments. \n\n## Get started with the template\n\n> **Prerequisites**\n>\n> To run this app template in your local dev machine, you will need:\n>\n> - [Node.js](https://nodejs.org/), supported versions: 18, 20, 22\n> - A [Microsoft 365 account for development](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts).\n> - [Microsoft 365 Agents Toolkit Visual Studio Code Extension](https://aka.ms/teams-toolkit) version 5.0.0 and higher or [Microsoft 365 Agents Toolkit CLI](https://aka.ms/teamsfx-toolkit-cli)\n> - [Microsoft 365 Copilot license](https://learn.microsoft.com/microsoft-365-copilot/extensibility/prerequisites#prerequisites)\n\n\n## Minimal path to awesome\n\n1. Clone this repository or [download this solution as a .ZIP file](https://pnp.github.io/download-partial/?url=https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-typespec-azureopenai) then unzip it.\n\n2. Get a copy your Endpoint URL and KEY from the Azure OpenAI resource:\n\n - Go to [Azure portal](https://portal.azure.com/)\n - Find or create your instance under **Azure OpenAI** resource\n - Create a deployment, e.g 'gpt-4o'\n - Under **Overview**, copy the **Azure OpenAI** endpoint value. It should look like `https://.openai.azure.com//`\n - Under **Keys and Endpoint**, copy the **KEY 1** value\n\n3. In the [Teams developer portal](https://dev.teams.microsoft.com/) under **Tools**, create a new **API Key registration** with the following information:\n\n * **API key**: Add a secret with the Azure OpenAI Key you copied in step 2\n * **API key name**: e.g., Azure OpenAI Key Name\n * **Base URL**: The Azure OpenAI Endpoint URL you copied in step 2\n * **Target tenant**: Home tenant\n * **Restrict usage by app**: Any Teams app (when agent is deployed, use the Teams app ID)\n\nSave the information. A new **API key registration ID** will be generated. Copy the key.\n\n4. Rename the `.env.dev.example` file to `.env.dev` and update the following values:\n\nReplace {keyAPIRegistration} with the key copied in previous step\n\n ```bash\n # Built-in environment variables\n TEAMSFX_ENV=dev\n APP_NAME_SUFFIX=dev\n\n # Generated during provision, you can also add your own variables.\n TEAMS_APP_ID=\n TEAMS_APP_TENANT_ID=\n M365_TITLE_ID=\n M365_APP_ID=\n\n # Update own variables.\n APIKEYAUTH_REGISTRATION_ID={keyAPIRegistration}\n ```\n5. Update the instructions and agent details within the `main.tsp` as appropriate for your use case.\n6. Update SERVER_URL, MODEL and other hard coded parameters in `actions.tsp`\n\n\n7. From Teams Toolkit, sign-in to your Microsoft 365 account.\n8. From Teams Toolkit, provision the solution to create the Teams app.\n9. Go to [https://www.office.com/chat?auth=2](https://www.office.com/chat?auth=2) URL and enable the developer mode by using the `-developer on` prompt.\n10. Use one of the conversation starters to start the agent.\n\n![solution](./assets/action_queryOpenAI.gif)\n\n## What's included in the template\n\n| Folder | Contents |\n| ------------ | ---------------------------------------------------------------------------------------- |\n| `.vscode` | VSCode files for debugging |\n| `appPackage` | Templates for the application manifest, the GPT manifest and the API specification |\n| `env` | Environment files |\n\nThe following files can be customized and demonstrate an example implementation to get you started.\n\n| File | Contents |\n| ---------------------------------- | ---------------------------------------------------------------------------- |\n| `appPackage/manifest.json` | application manifest that defines metadata for your declarative agent. |\n\nThe following are Microsoft 365 Agents Toolkit specific project files. You can [visit a complete guide on Github](https://github.com/OfficeDev/TeamsFx/wiki/Teams-Toolkit-Visual-Studio-Code-v5-Guide#overview) to understand how Microsoft 365 Agents Toolkit works.\n\n| File | Contents |\n| -------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |\n| `m365agents.yml` | This is the main Microsoft 365 Agents Toolkit project file. The project file defines two primary things: Properties and configuration Stage definitions. |\n\nThe following are TypeSpec template files. You need to customize these files to configure your agent.\n\n| File | Contents |\n| ------------- | ------------------------------------------------------------------------------------------- |\n| `main.tsp` | This is the root file of TSP files. Please manually update this file to add your own agent. |\n| `actions.tsp` | This is the actions file containing API endpoints to extend your declarative agent. |\n\n## Extend the template\n\n- [Add conversation starters](https://learn.microsoft.com/microsoft-365-copilot/extensibility/build-declarative-agents?tabs=ttk&tutorial-step=3): Conversation starters are hints that are displayed to the user to demonstrate how they can get started using the declarative agent.\n- [Add web content](https://learn.microsoft.com/microsoft-365-copilot/extensibility/build-declarative-agents?tabs=ttk&tutorial-step=4) for the ability to search web information.\n- [Add OneDrive and SharePoint content](https://learn.microsoft.com/microsoft-365-copilot/extensibility/build-declarative-agents?tabs=ttk&tutorial-step=5) as grounding knowledge for the agent.\n- [Add Microsoft Copilot Connectors content](https://learn.microsoft.com/microsoft-365-copilot/extensibility/build-declarative-agents?tabs=ttk&tutorial-step=6) to ground agent with enterprise knowledge.\n\n## Help\n\nWe do not support samples, but this community is always willing to help, and we want to improve these samples. We use GitHub to track issues, which makes it easy for community members to volunteer their time and help resolve issues.\n\nYou can try looking at [issues related to this sample](https://github.com/pnp/copilot-pro-dev-samples/issues?q=label%3A%22sample%3A%20da-typespec-github%22) to see if anybody else is having the same issues.\n\nIf you encounter any issues using this sample, [create a new issue](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\nFinally, if you have an idea for improvement, [make a suggestion](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\n## Addition information and references\n\n- [Declarative agents for Microsoft 365](https://aka.ms/teams-toolkit-declarative-agent)\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n" + }, + { + "folder": "da-typespec-github", + "title": "GitHub Issues Agent using TypeSpec for Microsoft 365 Copilot", + "description": "This sample demonstrates how to build a declarative agent for Microsoft 365 Copilot using TypeSpec for Microsoft 365 Copilot that allows you ground responses in WebSearch, use CodeInterpreter and use the GitHub API as an API plugin to retrieve issues.", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-typespec-github", + "updatedAt": "2025-05-16T00:00:00.000Z", + "longDescription": [ + "This sample demonstrates how to build a declarative agent for Microsoft 365 Copilot using TypeSpec for Microsoft 365 Copilot that allows you ground responses in WebSearch, use CodeInterpreter and use the GitHub API as an API plugin to retrieve issues." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Node.js" + }, + { + "key": "API-PLUGIN", + "value": "Yes" + }, + { + "key": "TYPESPEC", + "value": "Yes" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://github.com/pnp/copilot-pro-dev-samples/raw/main/samples/da-typespec-github/assets/latest-issues.png", + "imageAlt": "Declarative agent that shows latest issues", + "readmeContent": "# GitHub Issues Agent using TypeSpec for Microsoft 365 Copilot\n\n## Summary\n\nThis sample demonstrates how to build a declarative agent for Microsoft 365 Copilot using TypeSpec for Microsoft 365 Copilot that allows you ground responses in WebSearch, use CodeInterpreter and use the GitHub API as an API plugin to retrieve issues.\n\n![Declarative agent that shows latest issues](./assets/latest-issues.png)\n![Declarative agent that shows issues visualization](./assets/issues-ci.png)\n![Declarative agent that shows web results](./assets/web-search.png)\n\n## Features\n\nThis sample illustrates the following concepts:\n\n* Building a declarative agent for Microsoft 365 Copilot using TypeSpec for Microsoft 365 Copilot\n* Leveraging grounding responses in WebSearch\n* Leveraging CodeInterpreter to visualize data\n* Using the GitHub API to retrieve issues\n\n## Contributors\n\n* [Sébatien Levert](https://github.com/sebastienlevert)\n\n## Version history\n\nVersion|Date|Comments\n-------|----|--------\n1.0|May 16, 2025|Initial release\n\n## Prerequisites\n\n* Microsoft 365 tenant with Microsoft 365 Copilot\n* [Visual Studio Code](https://code.visualstudio.com/) with the [Microsoft 365 Agents Toolkit](https://marketplace.visualstudio.com/items?itemName=TeamsDevApp.ms-teams-vscode-extension) extension\n* [Node.js v20](https://nodejs.org/en/download/package-manager)\n\n## Minimal path to awesome\n\n* Clone this repository (or [download this solution as a .ZIP file](https://pnp.github.io/download-partial/?url=https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-typespec-github) then unzip it)\n* Open the Agents Toolkit extension and sign in to your Microsoft 365 tenant with Microsoft 365 Copilot\n* Select **Preview in Copilot (Edge)** from the launch configuration dropdown\n\n## Help\n\nWe do not support samples, but this community is always willing to help, and we want to improve these samples. We use GitHub to track issues, which makes it easy for community members to volunteer their time and help resolve issues.\n\nYou can try looking at [issues related to this sample](https://github.com/pnp/copilot-pro-dev-samples/issues?q=label%3A%22sample%3A%20da-typespec-github%22) to see if anybody else is having the same issues.\n\nIf you encounter any issues using this sample, [create a new issue](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\nFinally, if you have an idea for improvement, [make a suggestion](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n" + }, + { + "folder": "da-typespec-powerautomate", + "title": "da-typespec-powerautomate", + "description": "Community sample for Microsoft 365 Copilot developers.", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-typespec-powerautomate", + "updatedAt": null, + "longDescription": [], + "metadata": [], + "imageUrl": null, + "imageAlt": "", + "readmeContent": "# Invoking Power Automate Agent using TypeSpec for Microsoft 365 Copilot\n\n## Summary\n\nThis declarative agent triggers a power automate flow as described in the blog post \n[Build a Microsoft 365 Copilot Agent with Power Automate HTTP Trigger Using Agents Toolkit](https://reshmeeauckloo.com/posts/agentstoolkit-invoking-powerautomate/) with OAuth 2 using TypeSpec. \n\n![Declarative agent that triggers a power automate flow](./assets/demo.gif)\n\n## Features\n\nThis sample illustrates the following concepts:\n\n* Building a declarative agent for Microsoft 365 Copilot using TypeSpec for Microsoft 365 Copilot\n* Using the service 'https://service.flow.microsoft.com//.default' to invoke the Power Automate\n* Using an automated approach to create the Entra ID app and the Developer Portal registration\n\n## Contributors\n\n* [Reshmee Auckloo](https://github.com/reshmee011) - M365 Development MVP\n\n## Version history\n\nVersion|Date|Comments\n-------|----|--------\n1.0 | May 05, 2026 | Initial solution\n\n## Prerequisites\n\n* Microsoft 365 tenant with Microsoft 365 Copilot\n* [Visual Studio Code](https://code.visualstudio.com/) with the [Microsoft 365 Agents Toolkit](https://marketplace.visualstudio.com/items?itemName=TeamsDevApp.ms-teams-vscode-extension) extension\n* [Node.js v20](https://nodejs.org/en/download/package-manager)\n\n## Minimal path to awesome\n\n* Clone this repository (or [download this solution as a .ZIP file](https://pnp.github.io/download-partial/?url=https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-typespec-powerautomate) then unzip it)\n* Open the Agents Toolkit extension and sign in to your Microsoft 365 tenant with Microsoft 365 Copilot\n* Select **Preview in Copilot (Edge)** from the launch configuration dropdown\n\n### Step 1: Create Power Automate flow\n\n1. Create a Power Automate flow with a manual trigger. \n![Power Automate Flow](./assets/PowerAutomateFlow.jpg)\n\n2. Set the request Body JSON Schema of the trigger action to:\n\n```Json\n{\n \"type\": \"object\",\n \"properties\": {\n \"body\": {\n \"type\": \"string\"\n },\n \"email\": {\n \"type\": \"string\"\n },\n \"subject\": {\n \"type\": \"string\"\n }\n }\n}\n```\nAdd any actions like \"Send an Email\".\n\n3. Set \"Who can trigger the flow?\" to \"Any user in my tenant\".\n\n4. Copy the HTTP Url of the flow to use in the subsequent steps\n\n### Step 2: Create the App Registration\n\n1. Go to [Azure portal](https://portal.azure.com/)\n2. Select **Microsoft Entra ID** > **Manage** > **App registrations** > **New registration**\n3. Enter a name for the app (e.g., Volunteering App)\n4. Select **Accounts in this organizational directory only**\n5. Under **Redirect URI**, select **Web** and enter `https://teams.microsoft.com/api/platform/v1.0/oAuthRedirect`\n6. Select **Register**\n7. In the app registration, go to **Certificates & secrets** and create a new client secret\n8. Copy the client secret value\n9. In the app registration, go to **API permissions** and add the following permissions:\n * **Power Automate** > **Delegated permissions** > `User`\n10. Select **Grant admin consent for ** to grant the permissions\n![App Registration](./assets/AppRegistration.jpg)\n\n### Step 3: Oauth Client registration in Teams Developer Portal\n\n1. In the Teams Developer Portal, add a new OAuth client registration with the following details:\n\n - **Registration Name:** InvokePAFlow\n - **Base URL:** https://.09.environment.api.powerplatform.com \n - **Restrict Usage by Org:** My organization only \n\n2. **OAuth Settings:**\n - **Client ID:** `` \n - **Client Secret:** `` \n - **Authorization Endpoint:** https://login.microsoftonline.com/tenantid/oauth2/v2.0/authorize \n - **Token Endpoint:** https://login.microsoftonline.com/tenantid/oauth2/v2.0/token \n - **Scope:** https://service.flow.microsoft.com//.default (note the double slash before \"default\") otherwise you will encounter a forbidden error with a single slash.\n\nReplace `tenantid` with your tenant ID, which is a GUID.\n\nCopy the value of the Oauth Client Registration ID.\n![oAuth Client Reg Id](./assets/oauthclientReg.jpg)\n\n### Step 4\n\n1. Open the file `.env.dev` within the `env` folder and update the following variables\n\n- `PAAGENTAUTH_REGISTRATION_ID` is the OAuth client registration ID you copied from step 3.\n Example: `PAAGENTAUTH_REGISTRATION_ID=`\n- `PA_APP_SERVER_URL` is the base URL of the Power Platform environment where your Power Automate flow is hosted.\n Example: `PA_APP_SERVER_URL=https://.api.powerplatform.com`\n- `PA_APP_INVOKE_PATH` is the relative invoke path for the flow trigger, not the full URL.\n Use the path portion from the flow HTTP URL after the base Power Platform URL.\n Example: `PA_APP_INVOKE_PATH=/powerautomate/automations/direct/workflows/.../triggers/manual/paths/invoke`\n\n## Help\n\nWe do not support samples, but this community is always willing to help, and we want to improve these samples. We use GitHub to track issues, which makes it easy for community members to volunteer their time and help resolve issues.\n\nYou can try looking at [issues related to this sample](https://github.com/pnp/copilot-pro-dev-samples/issues?q=label%3A%22sample%3A%20da-typespec-powerautomate%22) to see if anybody else is having the same issues.\n\nIf you encounter any issues using this sample, [create a new issue](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\nFinally, if you have an idea for improvement, [make a suggestion](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n![](https://m365-visitor-stats.azurewebsites.net/SamplesGallery/da-typespec-powerautomate)" + }, + { + "folder": "da-typespec-repairs", + "title": "Manage repairs using Microsoft 365 Copilot", + "description": "This sample demonstrates how to build a declarative agent for Microsoft 365 Copilot using TypeSpec for Microsoft 365 Copilot that allows you to read, create, update and delete items from a Repairs system. The agent uses an API plugin to connect to an anonymous API.", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-typespec-repairs", + "updatedAt": "2025-05-13T00:00:00.000Z", + "longDescription": [ + "This sample demonstrates how to build a declarative agent for Microsoft 365 Copilot using TypeSpec for Microsoft 365 Copilot that allows you to read, create, update and delete items from a Repairs system. The agent uses an API plugin to connect to an anonymous API." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Node.js" + }, + { + "key": "API-PLUGIN", + "value": "Yes" + }, + { + "key": "TYPESPEC", + "value": "Yes" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://github.com/pnp/copilot-pro-dev-samples/raw/main/samples/da-typespec-repairs/assets/repairs-list.png", + "imageAlt": "Declarative agent a list of repairs", + "readmeContent": "# Manage repairs using Microsoft 365 Copilot\n\n## Summary\n\nThis sample demonstrates how to build a declarative agent for Microsoft 365 Copilot using TypeSpec for Microsoft 365 Copilot that allows you to read, create, update and delete items from a Repairs system. The agent uses an API plugin to connect to an anonymous API.\n\n![Declarative agent a list of repairs](./assets/repairs-list.png)\n![Declarative agent creating a repair](./assets/repairs-create.png)\n\n## Features\n\nThis sample illustrates the following concepts:\n\n* Building a declarative agent for Microsoft 365 Copilot with an API plugin using TypeSpec for Microsoft 365 Copilot\n* Connecting an API plugin to an anonymous API\n\n## Contributors\n\n* [Sébatien Levert](https://github.com/sebastienlevert)\n\n## Version history\n\nVersion|Date|Comments\n-------|----|--------\n1.0|May 13, 2025|Initial release\n\n## Prerequisites\n\n* Microsoft 365 tenant with Microsoft 365 Copilot\n* [Visual Studio Code](https://code.visualstudio.com/) with the [Microsoft 365 Agents Toolkit](https://marketplace.visualstudio.com/items?itemName=TeamsDevApp.ms-teams-vscode-extension) extension\n* [Node.js v20](https://nodejs.org/en/download/package-manager)\n\n## Minimal path to awesome\n\n* Clone this repository (or [download this solution as a .ZIP file](https://pnp.github.io/download-partial/?url=https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-typespec-repairs) then unzip it)\n* Open the Agents Toolkit extension and sign in to your Microsoft 365 tenant with Microsoft 365 Copilot\n* Select **Preview in Copilot (Edge)** from the launch configuration dropdown\n\n## Help\n\nWe do not support samples, but this community is always willing to help, and we want to improve these samples. We use GitHub to track issues, which makes it easy for community members to volunteer their time and help resolve issues.\n\nYou can try looking at [issues related to this sample](https://github.com/pnp/copilot-pro-dev-samples/issues?q=label%3A%22sample%3A%20da-typespec-repairs%22) to see if anybody else is having the same issues.\n\nIf you encounter any issues using this sample, [create a new issue](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\nFinally, if you have an idea for improvement, [make a suggestion](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n" + }, + { + "folder": "da-typespec-repairs-apikey", + "title": "Manage repairs using Microsoft 365 Copilot", + "description": "This sample demonstrates how to build a declarative agent for Microsoft 365 Copilot using TypeSpec for Microsoft 365 Copilot that allows you to read, create, update and delete items from a Repairs system. The agent uses an API plugin to connect to an API-key protected API.", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-typespec-repairs-apikey", + "updatedAt": "2025-05-13T00:00:00.000Z", + "longDescription": [ + "This sample demonstrates how to build a declarative agent for Microsoft 365 Copilot using TypeSpec for Microsoft 365 Copilot that allows you to read, create, update and delete items from a Repairs system. The agent uses an API plugin to connect to an API-key protected API." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Node.js" + }, + { + "key": "API-PLUGIN", + "value": "Yes" + }, + { + "key": "TYPESPEC", + "value": "Yes" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://github.com/pnp/copilot-pro-dev-samples/raw/main/samples/da-typespec-repairs-apikey/assets/repairs-list.png", + "imageAlt": "Declarative agent a list of repairs", + "readmeContent": "# Manage repairs using Microsoft 365 Copilot\n\n## Summary\n\nThis sample demonstrates how to build a declarative agent for Microsoft 365 Copilot using TypeSpec for Microsoft 365 Copilot that allows you to read, create, update and delete items from a Repairs system. The agent uses an API plugin to connect to an API-key protected API.\n\n![Declarative agent a list of repairs](./assets/repairs-list.png)\n![Declarative agent creating a repair](./assets/repairs-create.png)\n\n## Features\n\nThis sample illustrates the following concepts:\n\n* Building a declarative agent for Microsoft 365 Copilot with an API plugin using TypeSpec for Microsoft 365 Copilot\n* Connecting an API plugin to an API-key protected API\n\n## Contributors\n\n* [Sébatien Levert](https://github.com/sebastienlevert)\n\n## Version history\n\nVersion|Date|Comments\n-------|----|--------\n1.0|May 13, 2025|Initial release\n\n## Prerequisites\n\n* Microsoft 365 tenant with Microsoft 365 Copilot\n* [Visual Studio Code](https://code.visualstudio.com/) with the [Microsoft 365 Agents Toolkit](https://marketplace.visualstudio.com/items?itemName=TeamsDevApp.ms-teams-vscode-extension) extension\n* [Node.js v20](https://nodejs.org/en/download/package-manager)\n\n## Minimal path to awesome\n\n* Clone this repository (or [download this solution as a .ZIP file](https://pnp.github.io/download-partial/?url=https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-typespec-repairs-apikey) then unzip it)\n* Open the Agents Toolkit extension and sign in to your Microsoft 365 tenant with Microsoft 365 Copilot\n* Select **Preview in Copilot (Edge)** from the launch configuration dropdown\n\n## Help\n\nWe do not support samples, but this community is always willing to help, and we want to improve these samples. We use GitHub to track issues, which makes it easy for community members to volunteer their time and help resolve issues.\n\nYou can try looking at [issues related to this sample](https://github.com/pnp/copilot-pro-dev-samples/issues?q=label%3A%22sample%3A%20da-typespec-repairs-apikey%22) to see if anybody else is having the same issues.\n\nIf you encounter any issues using this sample, [create a new issue](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\nFinally, if you have an idea for improvement, [make a suggestion](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n" + }, + { + "folder": "da-typespec-repairs-oauth", + "title": "Manage repairs using Microsoft 365 Copilot using OAuth 2.0 authentication", + "description": "This sample demonstrates how to build a declarative agent for Microsoft 365 Copilot using TypeSpec for Microsoft 365 Copilot that allows you to read, create, update and delete items from a Repairs system. The agent uses an API plugin to connect to an OAuth protected API. This sample is connecting to an already configured API.", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-typespec-repairs-oauth", + "updatedAt": "2025-05-13T00:00:00.000Z", + "longDescription": [ + "This sample demonstrates how to build a declarative agent for Microsoft 365 Copilot using TypeSpec for Microsoft 365 Copilot that allows you to read, create, update and delete items from a Repairs system. The agent uses an API plugin to connect to an OAuth protected API." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Node.js" + }, + { + "key": "API-PLUGIN", + "value": "Yes" + }, + { + "key": "TYPESPEC", + "value": "Yes" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://github.com/pnp/copilot-pro-dev-samples/raw/main/samples/da-typespec-repairs-oauth/assets/repairs-list.png", + "imageAlt": "Declarative agent a list of repairs", + "readmeContent": "# Manage repairs using Microsoft 365 Copilot using OAuth 2.0 authentication\n\n## Summary\n\nThis sample demonstrates how to build a declarative agent for Microsoft 365 Copilot using TypeSpec for Microsoft 365 Copilot that allows you to read, create, update and delete items from a Repairs system. The agent uses an API plugin to connect to an OAuth protected API. This sample is connecting to an already configured API. \n\n![Declarative agent a list of repairs](./assets/repairs-list.png)\n![Declarative agent creating a repair](./assets/repairs-create.png)\n\n## Features\n\nThis sample illustrates the following concepts:\n\n* Building a declarative agent for Microsoft 365 Copilot with an API plugin using TypeSpec for Microsoft 365 Copilot\n* Connecting an API plugin to an OAuth protected API\n\n## Contributors\n\n* [Sébatien Levert](https://github.com/sebastienlevert)\n\n## Version history\n\nVersion|Date|Comments\n-------|----|--------\n1.0|May 13, 2025|Initial release\n\n## Prerequisites\n\n* Microsoft 365 tenant with Microsoft 365 Copilot\n* [Visual Studio Code](https://code.visualstudio.com/) with the [Microsoft 365 Agents Toolkit](https://marketplace.visualstudio.com/items?itemName=TeamsDevApp.ms-teams-vscode-extension) extension\n* [Node.js v20](https://nodejs.org/en/download/package-manager)\n\n## Minimal path to awesome\n\n* Clone this repository (or [download this solution as a .ZIP file](https://pnp.github.io/download-partial/?url=https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-typespec-repairs-oauth) then unzip it)\n* Open the Agents Toolkit extension and sign in to your Microsoft 365 tenant with Microsoft 365 Copilot\n* Select **Preview in Copilot (Edge)** from the launch configuration dropdown\n\n## Help\n\nWe do not support samples, but this community is always willing to help, and we want to improve these samples. We use GitHub to track issues, which makes it easy for community members to volunteer their time and help resolve issues.\n\nYou can try looking at [issues related to this sample](https://github.com/pnp/copilot-pro-dev-samples/issues?q=label%3A%22sample%3A%20da-typespec-repairs-oauth%22) to see if anybody else is having the same issues.\n\nIf you encounter any issues using this sample, [create a new issue](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\nFinally, if you have an idea for improvement, [make a suggestion](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n" + }, + { + "folder": "da-typespec-tech-support", + "title": "Tech Support agent using TypeSpec for Microsoft 365 Copilot", + "description": "This sample demonstrates how to build a declarative agent for Microsoft 365 Copilot using TypeSpec for Microsoft 365 Copilot that allows you ground responses in WebSearch, SharePoint and Copilot connectors", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-typespec-tech-support", + "updatedAt": "2025-05-16T00:00:00.000Z", + "longDescription": [ + "This sample demonstrates how to build a declarative agent for Microsoft 365 Copilot using TypeSpec for Microsoft 365 Copilot that allows you ground responses in WebSearch, SharePoint and Copilot connectors" + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Node.js" + }, + { + "key": "API-PLUGIN", + "value": "Yes" + }, + { + "key": "TYPESPEC", + "value": "Yes" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://github.com/pnp/copilot-pro-dev-samples/raw/main/samples/da-typespec-tech-support/assets/product-question.png", + "imageAlt": "Declarative agent creating a repair", + "readmeContent": "# Tech Support agent using TypeSpec for Microsoft 365 Copilot\n\n## Summary\n\nThis sample demonstrates how to build a declarative agent for Microsoft 365 Copilot using TypeSpec for Microsoft 365 Copilot that allows you ground responses in WebSearch, SharePoint and Copilot connectors\n\n![Declarative agent that show product answers](./assets/product-question.png)\n\n## Features\n\nThis sample illustrates the following concepts:\n\n* Building a declarative agent for Microsoft 365 Copilot using TypeSpec for Microsoft 365 Copilot\n* Leveraging grounding responses in WebSearch, SharePoint and Copilot connectors\n\n## Contributors\n\n* [Sébatien Levert](https://github.com/sebastienlevert)\n\n## Version history\n\nVersion|Date|Comments\n-------|----|--------\n1.0|May 16, 2025|Initial release\n\n## Prerequisites\n\n* Microsoft 365 tenant with Microsoft 365 Copilot\n* [Visual Studio Code](https://code.visualstudio.com/) with the [Microsoft 365 Agents Toolkit](https://marketplace.visualstudio.com/items?itemName=TeamsDevApp.ms-teams-vscode-extension) extension\n* [Node.js v20](https://nodejs.org/en/download/package-manager)\n\n## Minimal path to awesome\n\n* Clone this repository (or [download this solution as a .ZIP file](https://pnp.github.io/download-partial/?url=https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-typespec-tech-support) then unzip it)\n* Update the `.env.dev` file with URLs to your SharePoint sites and the Copilot connectors\n* Open the Agents Toolkit extension and sign in to your Microsoft 365 tenant with Microsoft 365 Copilot\n* Select **Preview in Copilot (Edge)** from the launch configuration dropdown\n\n## Help\n\nWe do not support samples, but this community is always willing to help, and we want to improve these samples. We use GitHub to track issues, which makes it easy for community members to volunteer their time and help resolve issues.\n\nYou can try looking at [issues related to this sample](https://github.com/pnp/copilot-pro-dev-samples/issues?q=label%3A%22sample%3A%20da-typespec-tech-support%22) to see if anybody else is having the same issues.\n\nIf you encounter any issues using this sample, [create a new issue](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\nFinally, if you have an idea for improvement, [make a suggestion](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n" + }, + { + "folder": "da-typespec-todo", + "title": "Tasks Agent using TypeSpec for Microsoft 365 Copilot that connects to the Microsoft Graph APIs", + "description": "This sample demonstrates how to build a declarative agent for Microsoft 365 Copilot using TypeSpec for Microsoft 365 Copilot that connects to the Tasks endpoints of the Microsoft Graph API through an API plugin.", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-typespec-todo", + "updatedAt": "2025-05-16T00:00:00.000Z", + "longDescription": [ + "This sample demonstrates how to build a declarative agent for Microsoft 365 Copilot using TypeSpec for Microsoft 365 Copilot that connects to the Tasks endpoints of the Microsoft Graph API through an API plugin." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Node.js" + }, + { + "key": "API-PLUGIN", + "value": "Yes" + }, + { + "key": "TYPESPEC", + "value": "Yes" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://github.com/pnp/copilot-pro-dev-samples/raw/main/samples/da-typespec-todo/assets/expired-tasks.png", + "imageAlt": "Declarative agent that shows overdue issues", + "readmeContent": "# Tasks Agent using TypeSpec for Microsoft 365 Copilot that connects to the Microsoft Graph APIs\n\n## Summary\n\nThis sample demonstrates how to build a declarative agent for Microsoft 365 Copilot using TypeSpec for Microsoft 365 Copilot that connects to the Tasks endpoints of the Microsoft Graph API through an API plugin.\n\n![Declarative agent that shows overdue issues](./assets/expired-tasks.png)\n![Declarative agent that shows a new task](./assets/new-task.png)\n\n## Features\n\nThis sample illustrates the following concepts:\n\n* Building a declarative agent for Microsoft 365 Copilot using TypeSpec for Microsoft 365 Copilot\n* Using the Microsoft Graph API to retrieve tasks and create new ones\n* Using an automated approach to create the Entra ID app and the Developer Portal registration\n\n## Contributors\n\n* [Sébatien Levert](https://github.com/sebastienlevert)\n\n## Version history\n\nVersion|Date|Comments\n-------|----|--------\n1.0|May 16, 2025|Initial release\n\n## Prerequisites\n\n* Microsoft 365 tenant with Microsoft 365 Copilot\n* [Visual Studio Code](https://code.visualstudio.com/) with the [Microsoft 365 Agents Toolkit](https://marketplace.visualstudio.com/items?itemName=TeamsDevApp.ms-teams-vscode-extension) extension\n* [Node.js v20](https://nodejs.org/en/download/package-manager)\n\n## Minimal path to awesome\n\n* Clone this repository (or [download this solution as a .ZIP file](https://pnp.github.io/download-partial/?url=https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-typespec-todo) then unzip it)\n* Open the Agents Toolkit extension and sign in to your Microsoft 365 tenant with Microsoft 365 Copilot\n* Select **Preview in Copilot (Edge)** from the launch configuration dropdown\n\n## Help\n\nWe do not support samples, but this community is always willing to help, and we want to improve these samples. We use GitHub to track issues, which makes it easy for community members to volunteer their time and help resolve issues.\n\nYou can try looking at [issues related to this sample](https://github.com/pnp/copilot-pro-dev-samples/issues?q=label%3A%22sample%3A%20da-typespec-todo%22) to see if anybody else is having the same issues.\n\nIf you encounter any issues using this sample, [create a new issue](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\nFinally, if you have an idea for improvement, [make a suggestion](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n" + }, + { + "folder": "da-typespec-trey-research", + "title": "Trey Research TypeSpec", + "description": "This sample demonstrates how to create an agent that interacts with a consulting API to provide information about consultants and projects.", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-typespec-trey-research", + "updatedAt": "2025-06-16T00:00:00.000Z", + "longDescription": [ + "This sample demonstrates how to create an agent that interacts with a consulting API to provide information about consultants and projects. The agent can answer questions about consultants and their projects" + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Node.js" + }, + { + "key": "LANGUAGE", + "value": "TypeSpec" + }, + { + "key": "API-PLUGIN", + "value": "Yes" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://github.com/pnp/pnp-copilot-pro-dev-samples/raw/main/samples/da-typespec-trey-research/assets/demo.gif", + "imageAlt": "Demonstration of Trey Research sample using TypeSpec", + "readmeContent": "# Trey Research Copilot Declarative Agent (TypeSpec version)\n\n## Summary\n\nTrey Research is a fictitious consulting company that supplies talent in the software and pharmaceuticals industries.\n\nThe solution consists of an API plugin that calls a set of Azure functions, which store the consulting data in a Azure Table storage (it uses the Azurite storage emulator when running locally).\nTypeSpec is a language developed by Microsoft for designing and describing API contracts in a structured and type-safe way. For a code-first developer TypeSpec files provide single source of truth that defines how your agent should behave, avoiding confusion when dealing with multiple manifest files like in the case of Declarative Agents.\n\nA declarative agent is provided to converse with users and to call the API plugin, as well as to reference the correct SharePoint document library.\nThis project has only APIs for Consultants GET operations and /me GET and POST operations similar to [Lab E3 in Copilot Dev Camp](https://microsoft.github.io/copilot-camp/pages/extend-m365-copilot/03-add-declarative-agent/) in this initial version. \n\n![demo of the trey research agent in Copilot](./assets/demo.gif)\n\n## Features\n\nThe sample showcases the following features:\n\n1. Declarative agent with branding and instructions, with access to relevant documents and an API defined using TypeSpec files.\n2. API based plugin works with any platform that supports REST requests\n3. Copilot will construct queries for specific data using GET requests\n4. Copilot updates and adds data using POST requests\n5. Multi-parameter queries to filter results\n6. Show a confirmation card before POSTing data; capture missing parameters\n7. Rich adaptive card responses\n\n\n## Contributors\n\n* [Bob German](https://github.com/bobgerman)\n* [Rabia Williams](https://github.com/rabwill)\n\n## Version history\n\n| Version | Date | Comments |\n|--|--|--|\n| 1.0 | Agu 7, 2025 | Initial release |\n\n## Prerequisites\n\n* [Node.js](https://nodejs.org/)\n* A [Microsoft 365 tenant](https://learn.microsoft.com/en-us/microsoftteams/platform/concepts/build-and-test/prepare-your-o365-tenant) prepared for development\n* [Microsoft 365 Agents Toolkit](https://aka.ms/teams-toolkit) Visual Studio Code extension\n* A Microsoft 365 Copilot licence\n\n## Minimal path to awesome\n\n### 2. Test the agent\n\n1. In the .env folder, create a new file called **.env.local**.\n2. Add this `SECRET_STORAGE_ACCOUNT_CONNECTION_STRING=UseDevelopmentStorage=true` into the file.\n3. Press **F5** to start a debug session. If prompted, sign in with your [Microsoft 365 account](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts). Wait for the provisioning to complete and the browser to open.\n4. In the browser, if prompted, sign in with your Microsoft 365 account. The browser will open the declarative agent in Microsoft 365 Copilot after signing in.\n\n> ![IMPORTANT]\n> Microsoft 365 Copilot can cache the agent definition, so if you make changes to the agent, you may need to clear the browser cache for changes to be persisted. After the agent is loaded, use Hard Refresh (Ctrl+Shift+R) to ensure the latest version is loaded.\n\nTry the following prompts:\n\n* do we have any consultants with azure certifications?\n* which consultants are working with woodgrove bank?\n* how many hours has avery delivered this month?\n* please find a consultant with python skills who is available immediately\n* are any consultants available who are AWS certified?\n* does trey research have any architects with javascript skills?\n* what designers are working at woodgrove bank?\n* please charge 10 hours to woodgrove bank\n\n\n## Troubleshooting and feature requests\n\nWe do not support samples, but this community is always willing to help, and we want to improve these samples. We use GitHub to track issues, which makes it easy for community members to volunteer their time and help resolve issues.\n\nYou can try looking at [issues related to this sample](https://github.com/pnp/copilot-pro-dev-samples/issues?q=label%3A%22sample%3A%20da-trey-resarch%22) to see if anybody else is having the same issues.\n\nIf you encounter any issues using this sample, [create a new issue](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\nFinally, if you have an idea for improvement, [make a suggestion](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n\n" + }, + { + "folder": "da-visual-mind-agent", + "title": "Visual Mind agent Visualizer Assistant", + "description": "The Visual Mind agent is a Visualizer Assistant that will help the user with tasks related to creating clear, structured, and engaging visuals using Mermaid.js code.", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-visual-mind-agent", + "updatedAt": "2025-05-09T00:00:00.000Z", + "longDescription": [ + "The Visual Mind agent is a Visualizer Assistant that will help the user with tasks related to creating clear, structured, and engaging visuals using Mermaid.js code." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Copilot" + }, + { + "key": "LANGUAGE", + "value": "English" + }, + { + "key": "API-PLUGIN", + "value": "No" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://raw.githubusercontent.com/pnp/copilot-pro-dev-samples/refs/heads/main/samples/da-visual-mind-agent/assets/Visual-Mind-declarative-agent-demo01.png", + "imageAlt": "Copilot agent that finds M365 roadmap features updates", + "readmeContent": "# Overview of the Declarative Agent template\n\nVisual Mind Declarative Agent is Visual Mind Map Agent and Visualizer Assistant. It will help the user with tasks related to creating clear, structured, and engaging visuals using Mermaid.js code.\n\n## Overview\n\n[![Visual Mind declarative agent - demo](./assets/Visual-Mind-declarative-agent-demo02.png)](https://youtu.be/EPaBumZhRuk)\n\n## Contributors\n\n* [Mohammad Amer](https://github.com/mohammadamer) - M365 Development MVP\n\n## Version history\n\nVersion|Date|Comments\n-------|----|--------\n1.0|May 09, 2025|Initial solution\n\n\n## Get started with the template\n\n> **Prerequisites**\n>\n> To run this app template in your local dev machine, you will need:\n>\n> - [Node.js](https://nodejs.org/), supported versions: 18, 20, 22\n> - A [Microsoft 365 account for development](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts).\n> - [Teams Toolkit Visual Studio Code Extension](https://aka.ms/teams-toolkit) version 5.0.0 and higher or [Teams Toolkit CLI](https://aka.ms/teamsfx-toolkit-cli)\n> - [Microsoft 365 Copilot license](https://learn.microsoft.com/microsoft-365-copilot/extensibility/prerequisites#prerequisites)\n\n![image](https://github.com/user-attachments/assets/e1c2a3b3-2e59-4e9b-8335-19315e92ba30)\n\n1. First, select the Teams Toolkit icon on the left in the VS Code toolbar.\n2. In the Account section, sign in with your [Microsoft 365 account](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts) if you haven't already.\n3. Create Teams app by clicking `Provision` in \"Lifecycle\" section.\n4. Select `Preview in Copilot (Edge)` or `Preview in Copilot (Chrome)` from the launch configuration dropdown.\n5. Once the Copilot app is loaded in the browser, click on the \"…\" menu and select \"Copilot chats\". You will see your declarative agent on the right rail. Clicking on it will change the experience to showcase the logo and name of your declarative agent.\n6. Ask a question to your declarative agent and it should respond based on the instructions provided.\n\n## What's included in the template\n\n| Folder | Contents |\n| ------------ | ---------------------------------------------------------------------------------------- |\n| `.vscode` | VSCode files for debugging |\n| `appPackage` | Templates for the Teams application manifest, the GPT manifest and the API specification |\n| `env` | Environment files |\n\nThe following files can be customized and demonstrate an example implementation to get you started.\n\n| File | Contents |\n| ---------------------------------- | ---------------------------------------------------------------------------- |\n| `appPackage/declarativeAgent.json` | Define the behaviour and configurations of the declarative agent. |\n| `appPackage/manifest.json` | Teams application manifest that defines metadata for your declarative agent. |\n\nThe following are Teams Toolkit specific project files. You can [visit a complete guide on Github](https://github.com/OfficeDev/TeamsFx/wiki/Teams-Toolkit-Visual-Studio-Code-v5-Guide#overview) to understand how Teams Toolkit works.\n\n| File | Contents |\n| -------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |\n| `teamsapp.yml` | This is the main Teams Toolkit project file. The project file defines two primary things: Properties and configuration Stage definitions. |\n\n## Extend the template\n\n- [Add conversation starters](https://learn.microsoft.com/microsoft-365-copilot/extensibility/build-declarative-agents?tabs=ttk&tutorial-step=3): Conversation starters are hints that are displayed to the user to demonstrate how they can get started using the declarative agent.\n- [Add web content](https://learn.microsoft.com/microsoft-365-copilot/extensibility/build-declarative-agents?tabs=ttk&tutorial-step=4) for the ability to search web information.\n- [Add OneDrive and SharePoint content](https://learn.microsoft.com/microsoft-365-copilot/extensibility/build-declarative-agents?tabs=ttk&tutorial-step=5) as grounding knowledge for the agent.\n- [Add Microsoft Graph connectors content](https://learn.microsoft.com/microsoft-365-copilot/extensibility/build-declarative-agents?tabs=ttk&tutorial-step=6) to ground agent with enterprise knowledge.\n- [Add API plugins](https://learn.microsoft.com/microsoft-365-copilot/extensibility/build-declarative-agents?tabs=ttk&tutorial-step=7) for agent to interact with REST APIs.\n\n## Addition information and references\n\n- [Declarative agents for Microsoft 365](https://learn.microsoft.com/en-us/microsoft-365-copilot/extensibility/overview-declarative-agent?wt.mc_id=MVP_433449)\n- [Copilot developer Camp](https://aka.ms/copilotdevcamp?wt.mc_id=MVP_433449)\n- [Microsoft 365 Copilot pro-developer samples](https://github.com/pnp/copilot-pro-dev-samples/)\n\n\n" + }, + { + "folder": "da-volunteeringapp", + "title": "Finding and apply for volunteer opportunities using Microsoft 365 Copilot with SharePoint List and Azure Ai Search - No code!", + "description": "This sample demonstrates how to build a declarative agent for Microsoft 365 Copilot that allows you to find and apply for volunteer opportunities using Microsoft 365 Copilot with SharePoint List and Azure Ai Search integration and authentication.", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-volunteeringapp", + "updatedAt": "2025-05-02T00:00:00.000Z", + "longDescription": [ + "This sample demonstrates how to build a declarative agent for Microsoft 365 Copilot that allows you to find and apply for volunteer opportunities using Microsoft 365 Copilot with SharePoint List and Azure Ai Search integration and authentication. The agent will first ask what kind of volunteering you wish to do. Once decided it will submit your application to the selected opportunity. A key point of emphasis on this agent was making use of multiple Microsoft services using different APIs. The agent uses Microsoft Graph API to get the list of tasks assigned to the user and Azure AI Search to get the list of volunteer opportunities. The agent is built using the Microsoft Teams Toolkit." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "No" + }, + { + "key": "LANGUAGE", + "value": "No" + }, + { + "key": "API-PLUGIN", + "value": "Yes" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "Yes" + } + ], + "imageUrl": "https://github.com/pnp/copilot-pro-dev-samples/raw/main/samples/da-volunteeringapp/assets/screenshot-find-volunteering-activities.gif", + "imageAlt": "Find volunteering opportunities", + "readmeContent": "# Declarative Agent - Volunteering App\n\n![Declarative Agent - Volunteering App](./assets/example.gif)\n\n## Summary\n\nThis repository contains a declarative agent that can be used to automate the process of finding and applying for volunteer opportunities. The agent will first ask what kind of volunteering you wish to do. Once decided it will submit your application to the selected opportunity. A key point of emphasis on this agent was making use of multiple Microsoft services using different APIs. The agent uses Microsoft Graph API to get the list of tasks assigned to the user and Azure AI Search to get the list of volunteer opportunities. The agent is built using the Microsoft Teams Toolkit.\n\n## Contributors\n\n* [Reshmee Auckloo](https://github.com/reshmee011) - M365 Development MVP\n* [Lee Ford](https://github.com/leeford) - M365 Development MVP\n\n## Version history\n\nVersion|Date|Comments\n-------|----|--------\n1.0 | April 29, 2025 | Initial solution\n\n> **Prerequisites**\n>\n> To run this app template from your local dev machine, you will need:\n>\n> * A [Microsoft 365 account for development](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts).\n> * [Teams Toolkit Visual Studio Code Extension](https://aka.ms/teams-toolkit) version 5.0.0 and higher or [Teams Toolkit CLI](https://aka.ms/teamsfx-toolkit-cli)\n> * [Microsoft 365 Copilot license](https://learn.microsoft.com/microsoft-365-copilot/extensibility/prerequisites#prerequisites)\n> * [Azure AI Search](https://learn.microsoft.com/azure/search/search-what-is-azure-search) service with indexed data from the assets folder.\n> * A SharePoint site with a list using the **Issue Tracker** template\n\n## Minimal path to awesome\n\n1. Clone this repository (or [download this solution as a .ZIP file](https://pnp.github.io/download-partial/?url=https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-da-volunteeringapp) then unzip it)\n\n2. Register an EntraID application in Azure:\n\n 1. Go to [Azure portal](https://portal.azure.com/)\n 2. Select **Microsoft Entra ID** > **Manage** > **App registrations** > **New registration**\n 3. Enter a name for the app (e.g., Volunteering App)\n 4. Select **Accounts in this organizational directory only**\n 5. Under **Redirect URI**, select **Web** and enter `https://teams.microsoft.com/api/platform/v1.0/oAuthRedirect`\n 6. Select **Register**\n 7. In the app registration, go to **Certificates & secrets** and create a new client secret\n 8. Copy the client secret value\n 9. In the app registration, go to **API permissions** and add the following permissions:\n * **Microsoft Graph** > **Delegated permissions** > `Directory.Read.All`, `Sites.ReadWrite.All`, `User.Read`, `email`, `offline_access`, `openid`\n 10. Select **Grant admin consent for ** to grant the permissions\n\n3. Get a copy your Endpoint URL from the Azure AI Search service:\n\n 1. Go to [Azure portal](https://portal.azure.com/)\n 2. Find or create your instance under **Azure AI Search**\n 3. Under **Overview**, copy the **URL** value. It should look like `https://.search.windows.net/`\n 4. Under **Keys**, copy the **Primary Key** value\n\n4. In the [Teams developer portal](https://dev.teams.microsoft.com/) under **Tools**, create a new **OAuth client registration** with the following information (replace `tenantid` with your own value):\n\n **App settings**\n\n * **Registration name**: Volunteering App\n * **Base URL**: `https://graph.microsoft.com/v1.0`\n * **Restrict usage by org**: My organization only\n * **Restrict usage by app**: Any Teams app (when agent is deployed, use the Teams app ID)\n\n **OAuth settings**\n * **Client ID**: <Entra ID App registration client ID>\n * **Client secret**: <Entra ID App registration client secret>\n * **Authorization endpoint**: \n * **Token endpoint**: \n * **Refresh endpoint**: \n * **Scope**: `Directory.Read.All`, `Sites.ReadWrite.All`, `User.Read`, `email`, `offline_access`, `openid`\n\n Save the information. A new **OAuth client registration key** will be generated. Copy the key.\n\n5. Staying in the [Teams developer portal](https://dev.teams.microsoft.com/) under **Tools**, create a new **API key registration** with the following information:\n\n * **API key**: Add a secret with the Azure AI Primary Key you copied in step 3.4\n * **API key name**: e.g., Azure AI Search Key\n * **Base URL**: The Azure AI Search URL you copied in step 3.3\n * **Target tenant**: Home tenant\n * **Restrict usage by app**: Any Teams app (when agent is deployed, use the Teams app ID)\n\n Save the information. A new **API key registration ID** will be generated. Copy the key.\n\n6. Rename the `.env.dev.example` file to `.env.dev` and update the following values:\n\n ```bash\n # Built-in environment variables\n TEAMSFX_ENV=dev\n APP_NAME_SUFFIX=dev\n\n TEAMS_APP_ID=082eb662-19a0-40a0-801a-4eeeae8ecac3\n TEAMS_APP_TENANT_ID=\n M365_TITLE_ID=\n M365_APP_ID=\n\n AZUREAADV2_REGISTRATION_ID=\n APIKEYAUTH_REGISTRATION_ID_FOR_AISEARCH=\n\n SITE_ID=\n LIST_ID=\n ```\n\n7. From Teams Toolkit, sign-in to your Microsoft 365 account.\n8. From Teams Toolkit, provision the solution to create the Teams app.\n9. Go to [https://www.office.com/chat?auth=2](https://www.office.com/chat?auth=2) URL and enable the developer mode by using the `-developer on` prompt.\n10. Use one of the conversation starters to start the agent.\n\n## Features\n\nThe following sample demonstrates the following concepts:\n\n* Query the Microsoft Graph API to get the list of tasks assigned to the user\n* Query Azure AI Search to get the list of volunteer opportunities\n* Register the user to the selected opportunity\n\n## Demo \n\n[![Demo Video](./assets/video-thumbnail.jpg)](https://www.youtube.com/watch?v=h8wPL_ZUmC0 \"Declarative agent for volunteering app\")\n\n\n\n## Help\n\nWe do not support samples, but this community is always willing to help, and we want to improve these samples. We use GitHub to track issues, which makes it easy for community members to volunteer their time and help resolve issues.\n\nYou can try looking at [issues related to this sample](https://github.com/pnp/copilot-pro-dev-samples/issues?q=label%3A%22sample%3A%20da-volunteeringapp%22) to see if anybody else is having the same issues.\n\nIf you encounter any issues using this sample, [create a new issue](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\nFinally, if you have an idea for improvement, [make a suggestion](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n\n" + }, + { + "folder": "da-WritingCoach", + "title": "Writing Coach Declarative Agent for Microsoft 365 Copilot Sample", + "description": "First Party Declarative Agent Writing Coach shared as a sample", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-WritingCoach", + "updatedAt": "2024-10-04T00:00:00.000Z", + "longDescription": [ + "The \"Writing Coach\" is an open-source declarative Agent designed to assist users in various aspects of writing. It provides detailed and constructive feedback on pieces of writing, helps change the tone of emails or messages, translates text into different languages, and guides users in writing clear and effective instructions for complex processes. Additionally, the agent supports users in crafting professional blog posts and writing comprehensive whitepapers. Leveraging the capabilities of OneDrive, SharePoint, and Graph Connectors, the \"Writing Coach\" aims to streamline the writing process, enhance writing skills, and ensure high-quality written content." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Node.js" + }, + { + "key": "LANGUAGE", + "value": "TypeScript" + }, + { + "key": "API-PLUGIN", + "value": "No" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://raw.githubusercontent.com/pnp/copilot-pro-dev-samples/refs/heads/main/samples/da-WritingCoach/assets/WritingCoach1.png", + "imageAlt": "Writing Coach Declarative Agent for Microsoft 365 Copilot Sample", + "readmeContent": "# Overview of the basic declarative agent sample\n![Writing Coach Start Screen](assets/WritingCoach1.png)\n\nThe \"Writing Coach\" Declarative Agent is an open-source AI-driven tool designed to assist users in improving their writing skills and completing various writing tasks. This agent acts as a supportive and knowledgeable coach, providing detailed and constructive feedback on different types of writing, helping users change the tone of their messages, translating text, and guiding them through the process of writing instructions, stories, and whitepapers.\n\nKey features of the Writing Coach include:\n- **Coaching on Existing Text**: Focuses on clarity, coherence, grammar, syntax, tone, style, and overall impact. Provides specific improvements or alternatives and tailors feedback based on the type of text (e.g., email, report, story).\n- **Changing the Tone of Messages**: Assists users in changing the tone of emails or messages by asking for the desired tone and specific points to highlight. Provides examples of different tones such as formal, casual, and friendly.\n- **Translating Text**: Translates pieces of text into other languages while considering any cultural nuances that should be taken into account.\n- **Writing Instructions**: Guides users in writing clear and concise instructions for explaining complex processes. Ensures that the instructions are easy to follow and understand.\n- **Story Writing**: Helps users write engaging and impactful stories by asking for details about the story (e.g., customer name, company, key points) and assisting in structuring the story with a clear beginning, middle, and end.\n- **Whitepaper Writing**: Assists users in identifying topics to cover, defining the target audience, and providing guidance on the style (e.g., discussion, proof, pitch new idea). Focuses on enhancing clarity, coherence, and overall impact, and suggests specific improvements or alternatives to make the whitepaper more engaging and effective.\n\nThe Writing Coach maintains a fun, collaborative tone to inspire creativity and ensure that interactions are engaging and productive. It integrates with OneDrive, SharePoint, and Graph Connectors to enhance its capabilities. At the end of each interaction on a specific topic, the agent asks for feedback and encourages the use of the thumbs up and down feature in Copilot.\n\nThis open-source project aims to empower individuals to achieve their writing goals through structured guidance and support. By providing a customizable and extensible framework, the Writing Coach Declarative Agent can be adapted to various professional and personal writing contexts, making it a versatile tool for improving writing skills and completing writing tasks.\n\n\n## Build a basic declarative agent\n\nWith the declarative agent, you can build a custom version of Copilot that can be used for specific scenarios, such as for specialized knowledge, implementing specific processes, or simply to save time by reusing a set of AI prompts. For example, a grocery shopping Copilot declarative agent can be used to create a grocery list based on a meal plan that you send to Copilot.\n\n## Get started with the sample\n\n> **Prerequisites**\n>\n> To run this app sample in your local dev machine, you will need:\n>\n> - [Node.js](https://nodejs.org/), supported versions: 16, 18\n> - A [Microsoft 365 account for development](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts).\n> - [Teams Toolkit Visual Studio Code Extension](https://aka.ms/teams-toolkit) version 5.0.0 and higher or [Teams Toolkit CLI](https://aka.ms/teamsfx-toolkit-cli)\n> - [Microsoft 365 Copilot license](https://learn.microsoft.com/microsoft-365-copilot/extensibility/prerequisites#prerequisites)\n\n![WritingCoach in Action](assets/WritingCoach2.png)\n\n1. First, select the Teams Toolkit icon on the left in the VS Code toolbar.\n2. In the Account section, sign in with your [Microsoft 365 account](https://docs.microsoft.com/microsoftteams/platform/toolkit/accounts) if you haven't already.\n3. Create Teams app by clicking `Provision` in \"Lifecycle\" section.\n4. Select `Preview in Copilot (Edge)` or `Preview in Copilot (Chrome)` from the launch configuration dropdown.\n5. Once the Copilot app is loaded in the browser, click on the \"…\" menu and select \"Copilot chats\". You will see your declarative agent on the right rail. Clicking on it will change the experience to showcase the logo and name of your declarative agent.\n6. Ask a question to your declarative agent and it should respond based on the instructions provided.\n\n## What's included in the sample\n\n| Folder | Contents |\n| ------------ | ---------------------------------------------------------------------------------------- |\n| `.vscode` | VSCode files for debugging |\n| `appPackage` | Templates for the Teams application manifest, the GPT manifest and the API specification |\n| `env` | Environment files |\n\nThe following files can be customized and demonstrate an example implementation to get you started.\n\n| File | Contents |\n| ------------------------------------ | ------------------------------------------------------------------------------ |\n| `appPackage/declarativeAgent.json` | Define the behaviour and configurations of the declarative agent. |\n| `appPackage/manifest.json` | Teams application manifest that defines metadata for your declarative agent. |\n\nThe following are Teams Toolkit specific project files. You can [visit a complete guide on Github](https://github.com/OfficeDev/TeamsFx/wiki/Teams-Toolkit-Visual-Studio-Code-v5-Guide#overview) to understand how Teams Toolkit works.\n\n| File | Contents |\n| -------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |\n| `teamsapp.yml` | This is the main Teams Toolkit project file. The project file defines two primary things: Properties and configuration Stage definitions. |\n\n## Addition information and references\n\n- [Declarative agents for Microsoft 365](https://aka.ms/teams-toolkit-declarative-agent)\n" + }, + { + "folder": "da-XBoxGameMaster", + "title": "Declarative Agent with an API plugin that secured by Entra ID that validates its own tokens", + "description": "This sample demonstrates how to build a declarative agent for Microsoft 365 Copilot that answers questions about repairs. The agent uses an API plugin to connect to an API secured with OAuth. The project contains an Azure Function that validates tokens using an open source library.", + "type": "Declarative Agent", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-XBoxGameMaster", + "updatedAt": "2025-01-09T00:00:00.000Z", + "longDescription": [ + "This sample demonstrates how to build a declarative agent with no tools except what's built into Windows, MacOS, or Linux" + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "None" + }, + { + "key": "LANGUAGE", + "value": "JSON" + }, + { + "key": "API-PLUGIN", + "value": "No" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://raw.githubusercontent.com/pnp/copilot-pro-dev-samples/refs/heads/notools/samples/da-XBoxGameMaster/assets/XBOX%20Game%20Master%201.png", + "imageAlt": "Copilot agent generating a simulated image from an XBOX game", + "readmeContent": "# XBOX Game Master\n\n## Summary\n\nThis sample is a declarative agent that is a master of XBOX games. Using the live XBOX gaming web site, it is able to answer questions, make recommendations, and even create graphics in the style of XBOX games.\n\n![picture of the app recommending games](./assets/XBOX%20Game%20Master%202.png)\n![picture of the app generating a simulated game image](./assets/XBOX%20Game%20Master%201.png)\n\n## Frameworks\n\n![No frameworks](https://img.shields.io/badge/nothing-1.00-green)\n\nThis app requires no tooling and can be developed using utilities that are built into any modern operating system such as a text editor, a web browser, and the ability to create a Zip archive file.\n\n## Prerequisites\n\n* [Office 365 tenant](https://dev.office.com/sharepoint/docs/spfx/set-up-your-development-environment) with permission to upload or install Teams applications\n* [Microsoft 365 Copilot](https://www.microsoft.com/microsoft-365/copilot#plans)\n* Any modern computer using Windows, MacOS, or Linux\n\n## Version history\n\nVersion|Date|Author|Comments\n-------|----|----|--------\n1.0|January 9, 2025|Bob German|Initial release\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n---\n\n## Minimal Path to Awesome\n\n* Clone or download this repository, or just download [this sample](https://pnp.github.io/download-partial/?url=https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/da-XBoxGameMaster)\n* Navigate to the sample's **appPackage** folder on your computer\n* (Optional: View or modify the files in the **appPackage** folder)\n* Create a Zip file containing the contents of the **appPackage** folder at the root\n* In Microsoft Teams click \"Apps\" 1️⃣ , \"Manage yor apps\"2️⃣ , \"Upload an app\" 3️⃣ , and then Upload a custom app 4️⃣ . Upload the zip file and follow the prompts to use your new agent in Copilot.\n\n![Uploading a Teams application](./assets/Upload%20Teams%20app.png)\n\nNOTE: If you want to make a second app, just copy and edit the files however **be sure to generate a new \"id\" value in manifest.json**. This can be any Globally Unique ID (GUID) as long as it's unique; you can generate one using the [online GUID generator](https://guidgenerator.com/)\n\n## Features\n\nThis declarative agent includes:\n\n* Ability to answer questions and make recommendations about XBOX games\n* Grounded in the online XBOX game catalog at https://www.xbox.com\n* Able to generate images based on XBOX games\n* Shows how to use the `WebSearch` and `GraphicArt` capabilities for declarative agents\n\n" + }, + { + "folder": "mcp-cs-customers-secure-server", + "title": "Secure Customers MCP Server with C# and ASP.NET Core", + "description": "This sample demonstrates how to build a secure Model Context Protocol (MCP) server in C# using ASP.NET Core, Microsoft Identity Web authentication, scoped authorization, and customer data tools.", + "type": "MCP", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/mcp-cs-customers-secure-server", + "updatedAt": "2026-05-25T00:00:00.000Z", + "longDescription": [ + "This sample demonstrates how to build and run a secure MCP server using C# and ASP.NET Core. The server is configured with HTTP transport and stateless MCP operations, and exposes customer tools backed by local JSON data.", + "Security is enabled by default and can be toggled via configuration. When enabled, the server validates Microsoft Entra access tokens with Microsoft Identity Web and enforces scope-based authorization for MCP tool access.", + "The sample also includes practical middleware and hosting patterns, such as CORS for browser clients, forwarded headers support for tunnels and proxies, and dynamic MCP resource metadata generation for different host URLs." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "ASP.NET Core" + }, + { + "key": "LANGUAGE", + "value": "C#" + } + ], + "imageUrl": "https://github.com/pnp/copilot-pro-dev-samples/raw/main/samples/mcp-cs-customers-secure-server/assets/mcp-inspector.png", + "imageAlt": "MCP Inspector connected to the secure Customers MCP Server", + "readmeContent": "# Secure Customers MCP Server with C# and ASP.NET Core\n\nThis sample shows how to build and run a secure Model Context Protocol (MCP) server in C# with ASP.NET Core, Microsoft Identity Web, and scope-based authorization.\n\n![MCP Inspector connected to the secure Customers MCP Server](assets/mcp-inspector.png)\n\n## What this sample contains\n\n- A .NET 10 MCP server (`CustomersMCPServer`) hosted as an ASP.NET Core web app.\n- MCP tools for customer CRUD operations backed by `data/customers.json`.\n- Optional security toggle to enable/disable JWT authentication and authorization.\n- Entra ID integration for token validation and scoped MCP access.\n\n## Code overview (`CustomersMCPServer`)\n\n- `Program.cs`\n - Configures MCP transport and tool registration (`.AddMcpServer().WithHttpTransport().WithTools()`).\n - Reads security and MCP settings from configuration.\n - Enables Microsoft Identity Web authentication when `Security:Enabled` is `true`.\n - Applies scope-based authorization policy using configured scopes (for example `Customers.ReadWrite.All`).\n - Configures CORS and forwarded headers for browser clients and reverse-proxy scenarios.\n- `Tools/CustomersTools.cs`\n - Exposes MCP tools:\n - `ListCustomers`\n - `GetCustomerById`\n - `InsertCustomer`\n - `UpdateCustomer`\n - `DeleteCustomer`\n - Includes validation logic and in-memory synchronization.\n - Loads customer data from `data/customers.json`.\n- `appsettings.json.sample`\n - Template for MCP endpoint, security toggle, and Entra ID values.\n- `CustomersMCPServer.csproj`\n - Targets `net10.0` and uses:\n - `ModelContextProtocol.AspNetCore`\n - `Microsoft.Identity.Web`\n - `Microsoft.AspNetCore.Authentication.JwtBearer`\n\n## Quick start\n\n### 1. Create runtime settings from sample\n\nFrom solution root:\n\n```bash\ncp CustomersMCPServer/appsettings.json.sample CustomersMCPServer/appsettings.json\n```\n\n### 2. Edit `appsettings.json`\n\nSet at least:\n\n- `Mcp.ServerUrl` (for local dev use `http://localhost:6200/`)\n- `Mcp.AllowedOrigins` (for local Inspector/browser use `http://localhost:6274`)\n- `Mcp.UniqueUri` (`api://`)\n- `Mcp.ScopesSupported` (for this sample: `Customers.ReadWrite.All`)\n- `AzureAd.TenantId`\n- `AzureAd.ClientId` (client ID of `CustomersMCPServer` app registration)\n\n### 3. Build\n\n```bash\ndotnet build CustomersMCPServer.slnx\n```\n\n### 4. (Optional) Use a custom `PORT` in VS Code for public URL access\n\nIf you plan to expose the MCP server through a public URL (for example via Dev Tunnel, Codespaces, or another proxy), run it on a known custom port so your public endpoint and local listener stay aligned.\n\nBasic steps:\n\n1. Choose a port (example: `6200`).\n2. Configure `PORT` in VS Code for your run/debug profile.\n3. Forward the same port in VS Code and set its visibility to public.\n4. Update `CustomersMCPServer/appsettings.json` so `Mcp.ServerUrl` uses the same local port.\n5. Update `Mcp.AllowedOrigins` to include the origin that will call your MCP endpoint (for public endpoints, use the forwarded/public URL origin).\n\n#### VS Code UI steps: create and publish a port\n\n1. Open **Run and Debug** in VS Code.\n2. Create or edit your launch profile and set `PORT` (see example below).\n3. Start the app once so VS Code detects the listening port.\n4. Open the **Ports** view:\n - **View** > **Terminal** > **Ports** (or use Command Palette and search for `Ports: Focus on Ports View`).\n5. Add/forward the port if it is not already listed:\n - Click **Forward a Port** and enter `6200` (or your chosen value).\n6. Make the forwarded port public:\n - In the **Ports** view, find the forwarded port row.\n - Open the context menu and change **Port Visibility** to **Public**.\n7. Copy the generated public URL from the **Ports** view and use it where needed (for example client/server settings and allowed origins).\n\nExample VS Code `launch.json` snippet:\n\n```json\n{\n \"name\": \"Run CustomersMCPServer\",\n \"type\": \"coreclr\",\n \"request\": \"launch\",\n \"program\": \"${workspaceFolder}/CustomersMCPServer/bin/Debug/net10.0/CustomersMCPServer.dll\",\n \"cwd\": \"${workspaceFolder}/CustomersMCPServer\",\n \"env\": {\n \"PORT\": \"6200\"\n }\n}\n```\n\nExample `appsettings.json` value:\n\n```json\n{\n \"Mcp\": {\n \"ServerUrl\": \"http://localhost:6200/\"\n }\n}\n```\n\nWhen using a public forwarded URL, keep `Mcp.ServerUrl` as your local bind address (localhost), and use the public URL as the caller endpoint and as an allowed origin when applicable.\n\n### 5. Run the MCP server\n\n```bash\nPORT=6200 dotnet run --project CustomersMCPServer/CustomersMCPServer.csproj\n```\n\nDefault local endpoint:\n\n- `http://localhost:6200`\n\n### 6. Start MCP Inspector\n\n```bash\nnpx @modelcontextprotocol/inspector\n```\n\nThen connect Inspector to:\n\n- Server URL: `http://localhost:6200`\n\n## Security toggle (enable/disable)\n\nIn `CustomersMCPServer/appsettings.json`:\n\n```json\n{\n \"Security\": {\n \"Enabled\": true\n }\n}\n```\n\n- `true`: Entra token validation and scope authorization are enforced.\n- `false`: MCP endpoint is open (no authentication/authorization).\n\n## Entra ID app registration\n\nCreate two app registrations in your Entra tenant:\n\n- `CustomersMCPServer` (resource API / MCP server)\n- `CustomersMCPConsumer` (client app that requests tokens)\n\n### A. Register `CustomersMCPServer` (API)\n\n1. Create app registration named `CustomersMCPServer`.\n2. In **Expose an API**:\n - Set Application ID URI (for example `api://`).\n - Add delegated scope: `Customers.ReadWrite.All`.\n3. In **Authentication**, configure redirect URIs only if needed by your flow.\n4. Copy values into `CustomersMCPServer/appsettings.json`:\n - `AzureAd.TenantId`\n - `AzureAd.ClientId`\n - `Mcp.UniqueUri` to match your Application ID URI.\n\n### B. Register `CustomersMCPConsumer` (client)\n\n1. Create app registration named `CustomersMCPConsumer`.\n2. In **API permissions**, add delegated permissions:\n - From `CustomersMCPServer`: `Customers.ReadWrite.All`\n - From Microsoft Graph: `openid`, `email`, `profile`, `User.Read`\n3. Grant admin consent for the tenant.\n\n### C. Tenant admin grant\n\nA tenant admin must grant consent for the requested delegated permissions (especially custom API scopes and Graph permissions) so users can obtain tokens without per-user consent prompts.\n\n## References\n\n- [Create a minimal MCP server using C#](https://learn.microsoft.com/en-us/dotnet/ai/quickstarts/build-mcp-server)\n- [MCP C# SDK](https://modelcontextprotocol.github.io/csharp-sdk)\n- [Microsoft Identity Web for protected web APIs](https://learn.microsoft.com/entra/identity-platform/scenario-protected-web-api-overview)\n" + }, + { + "folder": "mcs-BlogPostHelper", + "title": "Blog Post Helper", + "description": "A Copilot Studio agent that assists in creating and managing blog posts.", + "type": "Copilot Studio", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/mcs-BlogPostHelper", + "updatedAt": "2026-02-14T00:00:00.000Z", + "longDescription": [ + "A Copilot Studio agent that assists in creating and managing blog posts." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Copilot Studio" + }, + { + "key": "LANGUAGE", + "value": "None" + }, + { + "key": "API-PLUGIN", + "value": "No" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://github.com/pnp/copilot-pro-dev-samples/raw/main/samples/mcs-BlogPostHelper/assets/pending-image.png", + "imageAlt": "Copilot Studio agent placeholder image for the moment", + "readmeContent": "\n\n# Blog Post Helper for Copilot Studio\n\n## Summary\n\nThis sample helps users that often create blog post to help with elements of the creation process to get posts created quicker using capabilities within Declarative Agents.\n\nCommon features that the agent can help with:\n\n - Suggest an introduction based on a topic \n - Review existing articles, or Find content that I would reference quickly.\n\n> Note: This agent is built with Copilot Studio, as an equivelant variation of ```da-BlogPostHelper``` sample and and advising example of how to import a Copilot Studio agent\n\n## Contributors\n\n* [Paul Bullock](https://github.com/pkbullock.png)\n\n## Version history\n\nVersion|Date|Comments\n-------|----|--------\n1.0|Feburary 01, 2026|Initial release\n\n## Prerequisites\n\n* Microsoft 365 tenant with Microsoft 365 Copilot\n* Access to Copilot Studio\n\n## Minimal path to awesome\n\n**Import Solution into Copilot Studio**\n\nThis sample uses the Power Platform CLI to import samples, for documenation and installation instructions please visit: [What is Microsoft Power Platform CLI? | Microsoft Learn](https://learn.microsoft.com/en-us/power-platform/developer/cli/introduction) \n\n- Ensure you are authenticated with ```pac auth```\n\n```powershell\n\ncd samples/mcs-BlogPostHelper\n\n# Package up the solution, note the SRC part is important to pack.\npac solution pack --zipfile mcs-BlogPostHelper.zip --folder ./src\n\n# Import into specific environment use -env, or leave blank for defualt environment\npac env list\npac solution import --path ./mcs-BlogPostHelper.zip -env ba171802-488b-ed1b-b121-e778530363a2\n\n```\n\n## Features\n\nExtended description of the contents of the sample. What elements does it include? What concepts does illustrate?\n\nUsing this sample you can extend Microsoft 365 Copilot with an agent that:\n\n* Helps build blog posts\n* This is just a simple agent for testing the Copilot Samples process.\n\n## Help\n\nWe do not support samples, but this community is always willing to help, and we want to improve these samples. We use GitHub to track issues, which makes it easy for community members to volunteer their time and help resolve issues.\n\nYou can try looking at [issues related to this sample](https://github.com/pnp/copilot-pro-dev-samples/issues?q=label%3A%22sample%3A%20mcs-BlogPostHelper%22) to see if anybody else is having the same issues.\n\nIf you encounter any issues using this sample, [create a new issue](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\nFinally, if you have an idea for improvement, [make a suggestion](https://github.com/pnp/copilot-pro-dev-samples/issues/new).\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n![](https://m365-visitor-stats.azurewebsites.net/copilot-pro-dev-samples/mcs-BlogPostHelper)\n" + }, + { + "folder": "mcs-EduCoach", + "title": "EduCoach – Academic Advising Agent", + "description": "A Microsoft Copilot Studio agent that helps university students with course search, prerequisite checks, enrollment, course recommendations, graduation audits, and waitlist notifications.", + "type": "Copilot Studio", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/mcs-EduCoach", + "updatedAt": "2026-06-15T00:00:00.000Z", + "longDescription": [ + "EduCoach is a Copilot Studio agent designed for undergraduate academic advising at a university. It connects to a SharePoint Courses list and a Student Handbook document to answer grounded questions about available courses, prerequisites, credits, and graduation requirements.", + "Students can submit enrollment requests via an adaptive card, receive confirmation emails via Office 365 Outlook, and have their requests tracked in Microsoft Planner. A Power Automate flow monitors the SharePoint Courses list for new items and notifies the agent so it can contact waitlisted students automatically.", + "The agent is published to Microsoft Teams and Microsoft 365 Copilot and uses generative AI orchestration to route requests to the right topic without explicit keyword triggers." + ], + "metadata": [ + { + "key": "PLATFORM", + "value": "Microsoft Copilot Studio" + }, + { + "key": "LANGUAGE", + "value": "N/A" + }, + { + "key": "AGENT-TYPE", + "value": "Copilot Studio Agent" + }, + { + "key": "API-PLUGIN", + "value": "No" + }, + { + "key": "GRAPH-CONNECTOR", + "value": "No" + } + ], + "imageUrl": "https://github.com/pnp/copilot-pro-dev-samples/raw/main/samples/mcs-EduCoach/assets/screenshot.png", + "imageAlt": "EduCoach agent in action inside Microsoft Teams", + "readmeContent": "# EduCoach – Academic Advising Agent\n\n## Summary\n\nEduCoach is a Microsoft Copilot Studio agent that acts as a friendly academic advising assistant for undergraduate students. It helps students navigate their academic journey by answering grounded questions from a SharePoint Courses list and a Student Handbook document.\n\n**Key capabilities:**\n\n| Capability | Description |\n|---|---|\n| Course Search | Find courses by subject, semester, or degree requirement |\n| Prerequisite Check | Verify eligibility before enrolling in a course |\n| Enrollment Request | Submit an enrollment request via adaptive card; confirmation sent by email and tracked in Planner |\n| Course Recommendations | Get personalised suggestions based on major and career interests |\n| Graduation Audit | Check credit progress and remaining degree requirements |\n| Waitlist Notification | Automatic notification when a waitlisted course opens (Power Automate trigger) |\n| Escalation | Hand off to a human advisor for grade appeals, medical withdrawals, or academic petitions |\n\nThe agent is published to **Microsoft Teams** and **Microsoft 365 Copilot** and uses generative AI orchestration to route intents to specialised topics without explicit keyword matching.\n\n![EduCoach in Microsoft Teams](./assets/screenshot.png)\n\n## Demo\n\n[![EduCoach Demo](https://img.youtube.com/vi/0vh3zlRdgyg/hqdefault.jpg)](https://www.youtube.com/watch?v=0vh3zlRdgyg)\n\n> Watch the full walkthrough on YouTube: [EduCoach – Academic Advising Agent Demo](https://www.youtube.com/watch?v=0vh3zlRdgyg)\n\n## Frameworks\n\n![drop](https://img.shields.io/badge/Microsoft Copilot Studio-latest-green.svg)\n![drop](https://img.shields.io/badge/Power Automate-latest-green.svg)\n![drop](https://img.shields.io/badge/SharePoint Online-latest-green.svg)\n![drop](https://img.shields.io/badge/Microsoft Planner-latest-green.svg)\n![drop](https://img.shields.io/badge/Office 365 Outlook-latest-green.svg)\n\n## Prerequisites\n\n* Microsoft 365 tenant with a **Microsoft Copilot Studio** licence\n* **Power Platform** environment with Dataverse enabled\n* Permissions to create connections for:\n * SharePoint Online\n * Microsoft Planner\n * Office 365 Outlook\n * Microsoft Copilot Studio (for the Power Automate trigger)\n* A **SharePoint site** containing:\n * A `Courses` list with columns: `Title` (course code), `title` (course name), `credits`, `prerequisites`, `degree_requirement`, `semester_offered`\n * A `Student Handbook` document (`.md` or `.docx`) in the site's Shared Documents library\n* A **Microsoft Planner** plan with at least one bucket for tracking enrollment requests\n* [Power Platform CLI (`pac`)](https://learn.microsoft.com/power-platform/developer/cli/introduction) – required only if importing via solution\n\n## Contributors\n\nmcs-EduCoach | Lovy Jain ([@lovyjain](https://github.com/lovyjain))\n\n## Version history\n\nVersion | Date | Author | Comments\n--------|------|--------|---------\n1.0 | June 15, 2026 | Lovy Jain | Initial release\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n---\n\n## Minimal Path to Awesome\n\n### 1. Prepare your SharePoint site\n\nSample data files are included in `src/sharepoint-data/` to help you get started quickly:\n\n| File | Purpose |\n|---|---|\n| `sample-course-catalog.csv` | 50 sample courses — import directly into the SharePoint Courses list |\n| `student-handbook.md` | Student handbook document — upload to Shared Documents as-is |\n\n**Steps:**\n\n1. Create (or reuse) a SharePoint site, e.g. `https://YOUR_TENANT.sharepoint.com/sites/YOUR_SITE`.\n2. Create a **Courses** list with the following columns:\n\n | Column internal name | Type | Notes |\n |---|---|---|\n | `Title` | Single line of text | Course code, e.g. `CS101` |\n | `title` | Single line of text | Course name |\n | `credits` | Number | Credit hours |\n | `prerequisites` | Single line of text | Semicolon-separated course codes, or `None` |\n | `degree_requirement` | Single line of text | e.g. `General Education`, `Major Required`, `Major Elective`, `Free Elective` |\n | `semester_offered` | Single line of text | Semicolon-separated semesters, e.g. `Fall;Spring` |\n\n3. Import the sample data from `src/sharepoint-data/sample-course-catalog.csv` into the Courses list. You can use the SharePoint **Import Spreadsheet** app or paste rows manually.\n\n4. Upload `src/sharepoint-data/student-handbook.md` to the site's **Shared Documents** library. The agent uses this file as the grounding document for all policy and graduation questions.\n\n### 2. Prepare Microsoft Planner\n\n1. Create a Planner **plan** inside the Microsoft 365 group of your choice.\n2. Add a **bucket** named `Enrollment Requests` (or any name you prefer).\n3. Note the **Plan ID** and **Bucket ID** from the Planner URL or via the [Microsoft Graph Explorer](https://developer.microsoft.com/graph/graph-explorer).\n\n### 3. Clone the repository\n\n```bash\ngit clone https://github.com/pnp/copilot-pro-dev-samples.git\ncd copilot-pro-dev-samples/samples/mcs-EduCoach/src\n```\n\n### 4. Update placeholder values\n\nBefore importing, replace all placeholder strings in the source files:\n\n| File | Placeholder | Replace with |\n|---|---|---|\n| `EduCoach/knowledge/edu_EduCoach.topic.EduCoach_vyWFXDQOMlURhPjjvZccG.mcs.yml` | `YOUR_TENANT.sharepoint.com/sites/YOUR_SITE` | Your SharePoint site URL |\n| `EduCoach/knowledge/edu_EduCoach.topic.StudentHandbook.mcs.yml` | `YOUR_TENANT.sharepoint.com/sites/YOUR_SITE` | Your SharePoint site URL |\n| `EduCoach/actions/CreatePlannerEnrollmentTask.mcs.yml` | `YOUR_PLANNER_PLAN_ID` | Your Planner plan ID |\n| `EduCoach/actions/CreatePlannerEnrollmentTask.mcs.yml` | `YOUR_PLANNER_BUCKET_ID` | Your Planner bucket ID |\n| `EduCoach/workflows/.../workflow.json` | `YOUR_TENANT.sharepoint.com/sites/YOUR_SITE` | Your SharePoint site URL |\n| `EduCoach/workflows/.../workflow.json` | `YOUR_SHAREPOINT_LIST_ID` | GUID of your Courses list |\n\n> **Tip:** You can find the Courses list GUID in the SharePoint list settings URL: `…/_layouts/15/listedit.aspx?List={GUID}`.\n\n### 5. Import the agent into Copilot Studio\n\n**Option A – Copilot Studio CLI (recommended)**\n\n```bash\npac auth create --environment \npac copilot import --path EduCoach\n```\n\n**Option B – Copilot Studio portal**\n\n1. Open [Copilot Studio](https://copilotstudio.microsoft.com) and select your environment.\n2. Go to **Agents** → **Import** and upload the `EduCoach` folder.\n\n### 6. Configure connections\n\nAfter importing, Copilot Studio will prompt you to assign connections for:\n\n* **SharePoint Online** – connect with an account that has read access to the Courses list and Student Handbook.\n* **Office 365 Outlook** – connect with the account that sends enrollment confirmation emails.\n* **Microsoft Planner** – connect with an account that has write access to the Planner plan.\n* **Microsoft Copilot Studio** – used by the Power Automate trigger workflow.\n\n### 7. Activate the Power Automate trigger\n\n1. In Copilot Studio, open the **EduCoach** agent → **Triggers**.\n2. Enable the **New course added in Courses** trigger.\n3. Open the generated Power Automate flow and confirm the SharePoint site and list are pointing to your Courses list.\n\n### 8. Publish the agent\n\n1. In Copilot Studio, select **Publish** → **Publish**.\n2. Once published, open **Channels** and enable **Microsoft Teams** and/or **Microsoft 365 Copilot**.\n\n### 9. Test the agent\n\nIn Microsoft Teams, start a chat with **EduCoach** and try the built-in conversation starters:\n\n* `What courses can I take next semester for computer science?`\n* `Can I take CS101 if I have not completed MATH100?`\n* `Help me submit an enrollment request for CS101.`\n* `I am not sure what to take next, can you recommend courses?`\n\n---\n\n## Architecture\n\n```\nStudent (Teams / M365 Copilot)\n │\n ▼\n ┌─────────────────────────────────┐\n │ EduCoach (Copilot Studio) │\n │ Generative AI Orchestration │\n │ │\n │ Topics │\n │ ├── CourseSearch │\n │ ├── CheckPrerequisites │\n │ ├── CourseEnrolmentCard │\n │ ├── CourseRecommendation │\n │ ├── GraduationAudit │\n │ ├── WaitlistSpotAvailable │\n │ └── EscalateToHumanAdvisor │\n │ │\n │ Knowledge Sources │\n │ ├── SharePoint Courses list │\n │ └── Student Handbook doc │\n │ │\n │ Actions │\n │ ├── Create Planner Task │\n │ └── Send Outlook Email │\n └────────────┬────────────────────┘\n │ Trigger\n ▼\n ┌─────────────────────────────────┐\n │ Power Automate Flow │\n │ \"New course added in Courses\" │\n │ SharePoint list → Agent prompt │\n └─────────────────────────────────┘\n```\n\n## Features\n\n* **Generative AI orchestration** – no explicit keyword triggers; the agent routes requests using intent understanding.\n* **Grounded responses** – the agent only answers from verified SharePoint sources; it will not hallucinate courses or policies.\n* **Adaptive card enrollment** – students fill out a structured card; data is written to Planner and confirmed by email.\n* **Automatic waitlist notification** – a Power Automate flow fires when a new course is added to the SharePoint list and proactively contacts students who were waiting.\n* **Human escalation** – requests involving grade appeals, medical withdrawals, or academic petitions are routed to a human advisor without asking extra questions.\n* **Multi-topic design** – each capability is an independent topic, making the agent easy to extend or customise.\n\n\n" + }, + { + "folder": "mcs-finance-statement-agent", + "title": "mcs-finance-statement-agent", + "description": "Community sample for Microsoft 365 Copilot developers.", + "type": "Copilot Studio", + "href": "https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/mcs-finance-statement-agent", + "updatedAt": null, + "longDescription": [], + "metadata": [], + "imageUrl": null, + "imageAlt": "", + "readmeContent": "# Finance Statement Agent\n\n## Summary\n\nConversational AI for credit financial statement extraction. An analyst uploads a PDF financial report in Microsoft Teams; a Copilot Studio agent orchestrates an Azure-hosted pipeline that extracts the **Income Statement, Balance Sheet, Cash Flow,** and computed **Ratios** into a downloadable Excel workbook ready for credit spreading.\n\nMulti-language: English, Chinese, Japanese, French (auto-detected, label-reconciled to a canonical schema).\n\n![Architecture](./assets/architecture.png)\n\n**Data flow:** Analyst → Teams → Copilot Studio → Custom Connector → Azure Functions (HTTP 202) → Poll until complete → Excel generated → SAS download link in chat.\n\n## Frameworks\n\n![drop](https://img.shields.io/badge/Microsoft Copilot Studio-latest-green.svg)\n![drop](https://img.shields.io/badge/Azure Functions-Python 3.11-green.svg)\n![drop](https://img.shields.io/badge/Azure OpenAI-GPT‑4.1-green.svg)\n![drop](https://img.shields.io/badge/Power Apps Code App-React + TS-green.svg)\n\n## Prerequisites\n\n* Microsoft 365 tenant with **Copilot Studio** licensed\n* **Power Platform** environment with Dataverse and custom connector permissions\n* **Azure subscription** with rights to create Resource Group, Function App, Content Understanding (or Document Intelligence), Azure OpenAI (with `gpt-4.1` deployment), and Storage Account\n* [Azure CLI](https://learn.microsoft.com/cli/azure/install-azure-cli) 2.50+\n* [Azure Functions Core Tools](https://learn.microsoft.com/azure/azure-functions/functions-run-local) 4.x\n* [Power Platform CLI (`pac`)](https://learn.microsoft.com/power-platform/developer/cli/introduction)\n* Python 3.11+, Node.js 18+\n\n## Contributors\n\nmcs-finance-statement-agent | Shaji Sivaraman ([@sgshaji](https://github.com/sgshaji)), Microsoft\n\n## Version history\n\nVersion | Date | Author | Comments\n--------|------|--------|---------\n1.0 | April 30, 2026 | Shaji Sivaraman | Initial release\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n---\n\n## Minimal Path to Awesome\n\nThe sample is split across three deployables: an **Azure Functions** backend, a **Copilot Studio** agent, and an optional **Power Apps Code App** for human-in-the-loop review.\n\n### 1. Clone and authenticate\n\n```bash\ngit clone https://github.com/pnp/copilot-pro-dev-samples.git\ncd copilot-pro-dev-samples/samples/mcs-finance-statement-agent/src\naz login\naz account set --subscription \"\"\n```\n\n### 2. Provision Azure resources\n\nCreate the resources listed in **Prerequisites**. Grant the Function App's **system-assigned managed identity** these roles at the resource group scope:\n* `Cognitive Services User` — Content Understanding / Document Intelligence\n* `Cognitive Services OpenAI User` — Azure OpenAI\n* `Storage Blob Data Contributor` — Storage Account\n\n### 3. Configure and run the backend\n\n```bash\ncd azure-functions\ncp .env.example .env\n# edit .env with your endpoints (no API keys — Managed Identity handles auth)\npip install -r requirements.txt\nfunc start # http://localhost:7071/api/health\n```\n\n### 4. Deploy the Function\n\n```bash\nfunc azure functionapp publish --python\n```\n\n### 5. Set up the custom connector\n\n1. Power Platform → **Custom connectors → New → Import OpenAPI file** → `docs/custom-connector-swagger.yml`\n2. Update the Host to your Function App\n3. Authentication: **API key** (header `x-functions-key`) — retrieve via:\n ```bash\n az functionapp keys list --name --resource-group \n ```\n4. Create a connection using the new connector\n\n### 6. Push the Copilot Studio agent\n\n```bash\ncd ../copilot-studio-agent\npac copilot push --environment \n```\n\n### 7. (Optional) Deploy the HITL review Code App\n\n```bash\ncd ../code-app\nnpm install && npm run build\npac code push\n```\n\n## Features\n\nThis sample demonstrates an end-to-end agentic pattern for processing long-running document workloads from Copilot Studio:\n\n* **Async extraction with polling** — Power Platform custom connectors have a default 30-second synchronous request timeout. The pipeline returns `HTTP 202 {jobId}` in ~100 ms; the Copilot Studio topic polls `/extract/status/{jobId}` every 30 s until `completed` (`ConditionGroup` + `GotoAction` loop bounded by max-attempts)\n* **Pluggable extraction backend** — Content Understanding (default), Document Intelligence, Textract, or local pdfplumber, selectable via `EXTRACTION_BACKEND`\n* **5-stage pipeline** — analyze → select → extract → enrich → validate. Backends emit a common markdown + HTML-table format so Stages 2–5 are reusable\n* **Multi-language label reconciliation** — Azure OpenAI maps source-language labels to a canonical English schema for English, Chinese, Japanese, and French statements\n* **Managed Identity end-to-end** — no API keys for Azure service-to-service auth. The only secret is the Function key consumed by the Power Platform custom connector\n* **Job state in Blob with 30-min TTL** — bounded storage; SAS URLs returned in chat for the generated Excel\n* **Human-in-the-loop review** — optional Power Apps Code App provides an analyst grid backed by Dataverse for correcting extracted values before downstream credit spreading\n* **Multi-row column-header parsing** — handles statements where Q4 and FY columns share a parent header (e.g., Meta Income Statement)\n* **>5 MB upload handling** — uses Copilot Studio `Question` node bound to `FilePrebuiltEntity` (direct `Activity.Attachments` access fails for files > 5 MB)\n\n### Repository layout (under `src/`)\n\n```\nsrc/\n├── azure-functions/ # Python backend (HTTP 202 async pipeline)\n│ ├── function_app.py # HTTP router\n│ └── extractor/ # 5-stage pipeline + clients (CU, DI, Textract, pdfplumber)\n├── copilot-studio-agent/ # Copilot Studio YAML (agent, topics, actions, workflows)\n├── code-app/ # Power Apps Code App — React HITL review grid (Dataverse)\n└── docs/\n ├── architecture.png # Architecture diagram\n └── custom-connector-swagger.yml # Swagger 2.0 spec for the custom connector\n```\n\n\n" + } +] diff --git a/site/src/components/LatestSamples.astro b/site/src/components/LatestSamples.astro new file mode 100644 index 000000000..0c83f04ce --- /dev/null +++ b/site/src/components/LatestSamples.astro @@ -0,0 +1,42 @@ +--- +import type { SampleEntry } from "../lib/samples"; + +interface Props { + samples: SampleEntry[]; + count: number; +} + +const { samples, count } = Astro.props; +--- + +
+
+
+

Recent Activity

+

Latest Samples

+
+ View Full Catalog +
+ + { + samples.length > 0 ? ( + + ) : ( +
+ No samples are available. +
+ ) + } +
\ No newline at end of file diff --git a/site/src/components/SampleBrowser.astro b/site/src/components/SampleBrowser.astro new file mode 100644 index 000000000..7105d4617 --- /dev/null +++ b/site/src/components/SampleBrowser.astro @@ -0,0 +1,68 @@ +--- +import type { SampleEntry } from "../lib/samples"; + +interface Props { + samples: SampleEntry[]; + byType: Record; +} + +const { samples, byType } = Astro.props; +const sortedTypes = Object.keys(byType).sort((a, b) => a.localeCompare(b)); +--- + +
+
+

Sample Browser

+

+ Filter by type and search by title, folder, or description. +

+ +
+ +
+ + {sortedTypes.map((type) => ( + + ))} +
+
+
+ + +
+ + diff --git a/site/src/layouts/SiteLayout.astro b/site/src/layouts/SiteLayout.astro new file mode 100644 index 000000000..1acbcb8e8 --- /dev/null +++ b/site/src/layouts/SiteLayout.astro @@ -0,0 +1,92 @@ +--- +import "../styles/global.css"; + +interface Props { + title: string; + description?: string; +} + +const { title, description = "Microsoft 365 Copilot community samples browser." } = Astro.props; +const navItems = [ + { + href: "/", + label: "Home", + icon: "M12 3.5l8.5 7.2a1 1 0 01.35.76V20a1 1 0 01-1 1H15a1 1 0 01-1-1v-4h-4v4a1 1 0 01-1 1H4.15a1 1 0 01-1-1v-8.54a1 1 0 01.35-.76L12 3.5z", + }, + { + href: "/samples", + label: "Samples", + icon: "M3.5 6.5A2.5 2.5 0 016 4h12a2.5 2.5 0 012.5 2.5v11A2.5 2.5 0 0118 20H6a2.5 2.5 0 01-2.5-2.5v-11zm4 1a1 1 0 000 2h9a1 1 0 100-2h-9zm0 4a1 1 0 000 2h9a1 1 0 100-2h-9zm0 4a1 1 0 100 2h5a1 1 0 100-2h-5z", + }, + { + href: "/about", + label: "Contributing", + icon: "M7 5a3 3 0 110 6 3 3 0 010-6zm10 1a2.5 2.5 0 110 5 2.5 2.5 0 010-5zM4 14a4 4 0 014-4h0a4 4 0 014 4v2a1 1 0 01-1 1H5a1 1 0 01-1-1v-2zm10 2.2V14a5.9 5.9 0 00-.95-3.2h1.95a4 4 0 014 4v1.4a.6.6 0 01-.6.6H14.6a.6.6 0 01-.6-.6z", + }, +]; +const repoIcon = "M12 .9A11.1 11.1 0 00.9 12a11.1 11.1 0 007.6 10.53c.56.1.76-.24.76-.54v-1.9c-3.08.67-3.73-1.48-3.73-1.48-.5-1.3-1.24-1.65-1.24-1.65-1.02-.7.08-.69.08-.69 1.12.08 1.71 1.16 1.71 1.16 1 .1 1.65-.73 2.02-1.14.1-.74.39-1.24.71-1.53-2.45-.29-5.03-1.25-5.03-5.56 0-1.23.44-2.24 1.16-3.03-.12-.28-.5-1.43.1-2.98 0 0 .95-.31 3.1 1.16a10.7 10.7 0 015.64 0c2.15-1.47 3.1-1.16 3.1-1.16.6 1.55.22 2.7.1 2.98.72.79 1.16 1.8 1.16 3.03 0 4.32-2.59 5.27-5.06 5.55.4.35.76 1.03.76 2.08V22c0 .3.2.64.77.54A11.1 11.1 0 0023.1 12 11.1 11.1 0 0012 .9z"; +const currentPath = Astro.url.pathname === "/" ? "/" : Astro.url.pathname.replace(/\/$/, ""); +const siteTitle = "Copilot Pro Dev Samples"; +const documentTitle = title === siteTitle ? siteTitle : `${title} | ${siteTitle}`; +--- + + + + + + + + + {documentTitle} + + +
+
+ + PnP Copilot Samples + Copilot Pro Dev Samples + + +
+
+ +
+ +
+ +
+
+ This site and samples run under MIT License. These samples are provided as is without warranty of any kind, either express or implied, including any implied warranties of fitness for a particular purpose, merchantability, or non-infringement. +
+
+ + diff --git a/site/src/lib/samples.ts b/site/src/lib/samples.ts new file mode 100644 index 000000000..bc7ccbd63 --- /dev/null +++ b/site/src/lib/samples.ts @@ -0,0 +1,136 @@ +import { readFile } from "node:fs/promises"; +import path from "node:path"; + +export type SampleEntry = { + folder: string; + title: string; + description: string; + type: string; + href: string; + updatedAt: Date | null; + longDescription: string[]; + metadata: Array<{ key: string; value: string }>; + imageUrl: string | null; + imageAlt: string; + readmeContent: string; +}; + +export type SampleStats = { + total: number; + byType: Record; + topTypes: Array<[string, number]>; +}; + +const typeLabels: Record = { + da: "Declarative Agent", + cea: "Custom Engine Agent", + cext: "Copilot Extension", + mcp: "MCP", + mcs: "Copilot Studio", +}; + +const fallbackDescription = "Community sample for Microsoft 365 Copilot developers."; + +function parseDate(value: unknown): Date | null { + if (typeof value !== "string" || value.trim().length === 0) { + return null; + } + + const parsed = new Date(value); + return Number.isNaN(parsed.getTime()) ? null : parsed; +} + +type StoredSampleEntry = Omit & { + updatedAt: string | null; +}; + +function getSamplesDataPath(): string { + return path.resolve(process.cwd(), "public", "samples.json"); +} + +export async function getSamples(): Promise { + const samplesDataPath = getSamplesDataPath(); + + try { + const raw = await readFile(samplesDataPath, "utf8"); + const parsed = JSON.parse(raw); + if (!Array.isArray(parsed)) { + return []; + } + + return parsed.map((item: Partial) => { + const folder = typeof item.folder === "string" ? item.folder : "unknown"; + const typeKey = folder.split("-")[0] || "other"; + + return { + folder, + title: typeof item.title === "string" && item.title.trim().length > 0 ? item.title : folder, + description: + typeof item.description === "string" && item.description.trim().length > 0 ? item.description : fallbackDescription, + type: typeof item.type === "string" && item.type.trim().length > 0 ? item.type : typeLabels[typeKey] || "Other", + href: + typeof item.href === "string" && item.href.trim().length > 0 + ? item.href + : `https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/${folder}`, + updatedAt: parseDate(item.updatedAt), + longDescription: Array.isArray(item.longDescription) + ? item.longDescription.filter((line): line is string => typeof line === "string" && line.trim().length > 0) + : [], + metadata: Array.isArray(item.metadata) + ? item.metadata.filter( + (entry): entry is { key: string; value: string } => + !!entry && typeof entry.key === "string" && typeof entry.value === "string" + ) + : [], + imageUrl: typeof item.imageUrl === "string" && item.imageUrl.trim().length > 0 ? item.imageUrl : null, + imageAlt: typeof item.imageAlt === "string" ? item.imageAlt : "", + readmeContent: typeof item.readmeContent === "string" ? item.readmeContent : "", + }; + }); + } catch { + return []; + } +} + +export function getLatestSamples(samples: SampleEntry[], months: number, now = new Date()): SampleEntry[] { + const safeMonths = Number.isFinite(months) && months > 0 ? months : 1; + const cutoff = new Date(now); + cutoff.setMonth(cutoff.getMonth() - safeMonths); + + return samples + .filter((sample) => sample.updatedAt && sample.updatedAt >= cutoff) + .sort((a, b) => { + const aTime = a.updatedAt?.getTime() ?? 0; + const bTime = b.updatedAt?.getTime() ?? 0; + return bTime - aTime; + }); +} + +export function getRecentSamples(samples: SampleEntry[], count: number): SampleEntry[] { + const safeCount = Number.isFinite(count) && count > 0 ? Math.floor(count) : 1; + + return [...samples] + .sort((a, b) => { + const aTime = a.updatedAt?.getTime() ?? 0; + const bTime = b.updatedAt?.getTime() ?? 0; + return bTime - aTime; + }) + .slice(0, safeCount); +} + +export function getSampleStats(samples: SampleEntry[]): SampleStats { + const byType = samples.reduce>((acc, sample) => { + acc[sample.type] = (acc[sample.type] || 0) + 1; + return acc; + }, {}); + + const topTypes = Object.entries(byType) + .sort((a, b) => b[1] - a[1]) + .slice(0, 3); + + return { + total: samples.length, + byType, + topTypes, + }; +} diff --git a/site/src/pages/about.astro b/site/src/pages/about.astro new file mode 100644 index 000000000..b6cb5c9de --- /dev/null +++ b/site/src/pages/about.astro @@ -0,0 +1,125 @@ +--- +import SiteLayout from "../layouts/SiteLayout.astro"; +import { getSamples, getSampleStats } from "../lib/samples"; + +const samples = await getSamples(); +const { total, byType } = getSampleStats(samples); +const types = Object.entries(byType).sort((a, b) => b[1] - a[1]); + +const contributionCards = [ + { + title: "Start From A Fork", + description: "Fork the repository and create a branch from main for each submission.", + }, + { + title: "One Sample Per PR", + description: "Keep each pull request focused on a single sample. Split unrelated edits into separate PRs.", + }, + { + title: "Follow Folder Prefixes", + description: "Place samples under the samples folder with a valid prefix like da-, cea-, msgext-, or mcs-.", + }, + { + title: "Include Required Assets", + description: "Provide README.md, source code, an assets folder with at least one screenshot, and an appropriate .gitignore.", + }, + { + title: "Use The README Templates", + description: "Use the matching template and include complete setup and usage instructions.", + }, + { + title: "Protect Secrets", + description: "Do not commit tenant-specific or sensitive values. Share .env sample files instead.", + }, + { + title: "Manifest Readiness", + description: "Include manifest files and only include a package when it is installable as-is.", + }, +]; + +const prFlowCards = [ + { + step: "Step 1", + title: "Sign The CLA", + description: "Complete the Contributor License Agreement before final submission.", + }, + { + step: "Step 2", + title: "Sync Your Fork", + description: "Update from upstream main so your branch starts from current project state.", + }, + { + step: "Step 3", + title: "Commit And Push", + description: "Use descriptive commit messages and push your branch to your fork.", + }, + { + step: "Step 4", + title: "Open The Pull Request", + description: "Target main and complete all requested details in the PR template.", + }, +]; +--- + + +
+
+

Contributing

+

Contribute a sample to this repository

+

+ This repository accepts community Microsoft 365 Copilot sample submissions. Follow the contribution guidance to submit + one focused pull request at a time, using the required sample structure and documentation. +

+
+ +
+
+

Total Samples

+

{total}

+
+
+

Type Breakdown

+
+ {types.map(([name, count]) => ( + + {name}: {count} + + ))} +
+
+
+ +
+

Contribution Checklist

+
+ {contributionCards.map((item) => ( +
+
+ +
+

{item.title}

+

{item.description}

+
+ ))} +
+
+ +
+

Pull Request Flow

+
+ {prFlowCards.map((item) => ( +
+

{item.step}

+

{item.title}

+

{item.description}

+
+ ))} +
+

+ This page is based on the repository guidance in CONTRIBUTING.md. Refer to that file for complete, authoritative details. +

+
+
+
diff --git a/site/src/pages/index.astro b/site/src/pages/index.astro new file mode 100644 index 000000000..ddc018391 --- /dev/null +++ b/site/src/pages/index.astro @@ -0,0 +1,49 @@ +--- +import SiteLayout from "../layouts/SiteLayout.astro"; +import LatestSamples from "../components/LatestSamples.astro"; +import { getRecentSamples, getSamples, getSampleStats } from "../lib/samples"; + +const samples = await getSamples(); +const latestSamplesCount = 3; +const latestSamples = getRecentSamples(samples, latestSamplesCount); +const { total, byType } = getSampleStats(samples); +const typeBreakdown = Object.entries(byType).sort((a, b) => b[1] - a[1]); +--- + + +
+
+

Open Source Agent Catalog

+

+ Explore beyond the + hello world. +

+

+ Browse real Microsoft 365 Copilot samples by agent type, scan metadata quickly, and jump directly into source folders. +

+ +
+ +
+

Quick Stats

+
+

Total Samples

+

{total}

+
+
+ {typeBreakdown.map(([name, count]) => ( + + {name}: {count} + + ))} +
+
+
+ +
+ +
+
diff --git a/site/src/pages/samples.astro b/site/src/pages/samples.astro new file mode 100644 index 000000000..d15e38978 --- /dev/null +++ b/site/src/pages/samples.astro @@ -0,0 +1,20 @@ +--- +import SiteLayout from "../layouts/SiteLayout.astro"; +import SampleBrowser from "../components/SampleBrowser.astro"; +import { getSamples, getSampleStats } from "../lib/samples"; + +const samples = await getSamples(); +const { byType, total } = getSampleStats(samples); +--- + + +
+

Catalog

+

Browse {total} community samples

+

+ Search by keyword and narrow by sample type to quickly reach the implementation you need. +

+
+ + +
diff --git a/site/src/pages/samples/[folder].astro b/site/src/pages/samples/[folder].astro new file mode 100644 index 000000000..cf3a6e573 --- /dev/null +++ b/site/src/pages/samples/[folder].astro @@ -0,0 +1,87 @@ +--- +import SiteLayout from "../../layouts/SiteLayout.astro"; +import { marked } from "marked"; +import { getSamples, type SampleEntry } from "../../lib/samples"; + +interface Props { + sample: SampleEntry; +} + +export async function getStaticPaths() { + const samples = await getSamples(); + + return samples.map((sample) => ({ + params: { folder: sample.folder }, + props: { sample }, + })); +} + +const { sample } = Astro.props as Props; +const details = sample.longDescription.length > 0 ? sample.longDescription : [sample.description]; +const imageAlt = sample.imageAlt.trim().length > 0 ? sample.imageAlt : `${sample.title} preview`; +const hasReadme = sample.readmeContent.trim().length > 0; +const readmeHtml = hasReadme ? await marked.parse(sample.readmeContent) : ""; +--- + + +
+ + + Back to samples + + +
+
+

{sample.type}

+

{sample.title}

+

{sample.description}

+
+ + { + sample.imageUrl ? ( +
+ {imageAlt} +
+ ) : ( +
+ No image available for this sample. +
+ ) + } + +
+
+

Details

+
+ {details.map((line) => ( +

{line}

+ ))} +
+
+
+ +
+ + Open source folder + + Folder: {sample.folder} + + Last updated: {sample.updatedAt ? sample.updatedAt.toLocaleDateString("en-US", { year: "numeric", month: "short", day: "numeric" }) : "Unknown"} + +
+ +
+

README

+ { + hasReadme ? ( +
+
+
+ ) : ( +

No README content available for this sample.

+ ) + } +
+
+
+
diff --git a/site/src/scripts/generate-samples-json.mjs b/site/src/scripts/generate-samples-json.mjs new file mode 100644 index 000000000..59ba8e748 --- /dev/null +++ b/site/src/scripts/generate-samples-json.mjs @@ -0,0 +1,117 @@ +import { mkdir, readdir, readFile, writeFile } from "node:fs/promises"; +import path from "node:path"; + +const typeLabels = { + da: "Declarative Agent", + cea: "Custom Engine Agent", + cext: "Copilot Extension", + mcp: "MCP", + mcs: "Copilot Studio", +}; + +const fallbackDescription = "Community sample for Microsoft 365 Copilot developers."; + +function parseDate(value) { + if (typeof value !== "string" || value.trim().length === 0) { + return null; + } + + const parsed = new Date(value); + return Number.isNaN(parsed.getTime()) ? null : parsed.toISOString(); +} + +async function generateSamplesJson() { + const siteRoot = process.cwd(); + const samplesRoot = path.resolve(siteRoot, "..", "samples"); + const outputPath = path.resolve(siteRoot, "public", "samples.json"); + + const entries = await readdir(samplesRoot, { withFileTypes: true }); + const folders = entries + .filter((entry) => entry.isDirectory()) + .map((entry) => entry.name) + .filter((name) => !name.startsWith(".") && name !== "_SAMPLE_templates") + .sort((a, b) => a.localeCompare(b)); + + const samples = await Promise.all( + folders.map(async (folder) => { + const sampleJsonPath = path.join(samplesRoot, folder, "assets", "sample.json"); + const readmePath = path.join(samplesRoot, folder, "README.md"); + const readmeLowerPath = path.join(samplesRoot, folder, "readme.md"); + let title = folder; + let description = fallbackDescription; + let updatedAt = null; + let longDescription = []; + let metadata = []; + let imageUrl = null; + let imageAlt = ""; + let readmeContent = ""; + + try { + const raw = await readFile(sampleJsonPath, "utf8"); + const parsed = JSON.parse(raw); + if (Array.isArray(parsed) && parsed[0]) { + title = parsed[0].title || parsed[0].name || title; + description = parsed[0].shortDescription || description; + updatedAt = parseDate(parsed[0].updateDateTime) || parseDate(parsed[0].creationDateTime); + + if (Array.isArray(parsed[0].longDescription)) { + longDescription = parsed[0].longDescription.filter((line) => typeof line === "string" && line.trim().length > 0); + } + + if (Array.isArray(parsed[0].metadata)) { + metadata = parsed[0].metadata + .filter((item) => item && typeof item.key === "string" && typeof item.value === "string") + .map((item) => ({ key: item.key, value: item.value })); + } + + if (Array.isArray(parsed[0].thumbnails)) { + const imageThumb = parsed[0].thumbnails.find((item) => item && item.type === "image" && typeof item.url === "string"); + if (imageThumb) { + imageUrl = imageThumb.url; + imageAlt = typeof imageThumb.alt === "string" ? imageThumb.alt : ""; + } + } + } + } catch { + // Keep fallback metadata for samples missing or failing to parse sample.json. + } + + try { + readmeContent = await readFile(readmePath, "utf8"); + } catch { + try { + readmeContent = await readFile(readmeLowerPath, "utf8"); + } catch { + // README is optional for rendering details. Keep empty fallback. + } + } + + const typeKey = folder.split("-")[0] || "other"; + const type = typeLabels[typeKey] || "Other"; + + return { + folder, + title, + description, + type, + href: `https://github.com/pnp/copilot-pro-dev-samples/tree/main/samples/${folder}`, + updatedAt, + longDescription, + metadata, + imageUrl, + imageAlt, + readmeContent, + }; + }) + ); + + await mkdir(path.dirname(outputPath), { recursive: true }); + await writeFile(outputPath, JSON.stringify(samples, null, 2) + "\n", "utf8"); + + console.log(`Generated ${samples.length} sample entries at ${outputPath}`); +} + +generateSamplesJson().catch((error) => { + console.error("Failed to generate samples.json", error); + process.exitCode = 1; +}); \ No newline at end of file diff --git a/site/src/scripts/sample-browser.ts b/site/src/scripts/sample-browser.ts new file mode 100644 index 000000000..ac44b53a6 --- /dev/null +++ b/site/src/scripts/sample-browser.ts @@ -0,0 +1,47 @@ +export function initSampleBrowser() { + const search = document.querySelector("#sample-search"); + const pills = Array.from(document.querySelectorAll("#type-pills .pill")); + const cards = Array.from(document.querySelectorAll("#samples-grid .sample-card")); + const empty = document.querySelector("#empty-state"); + + if (!search || pills.length === 0 || cards.length === 0) { + return; + } + + let activeType = "all"; + + const applyFilters = () => { + const query = search.value.trim().toLowerCase(); + let visible = 0; + + for (const card of cards) { + const byType = activeType === "all" || card.dataset.type === activeType; + const haystack = `${card.dataset.title} ${card.dataset.folder} ${card.dataset.description}`; + const byQuery = haystack.includes(query); + const show = byType && byQuery; + + card.classList.toggle("hidden", !show); + if (show) { + visible += 1; + } + } + + if (empty) { + empty.classList.toggle("hidden", visible !== 0); + } + }; + + search.addEventListener("input", applyFilters); + + for (const pill of pills) { + pill.addEventListener("click", () => { + activeType = pill.dataset.type || "all"; + for (const item of pills) { + item.classList.toggle("chip-button-active", item === pill); + } + applyFilters(); + }); + } + + applyFilters(); +} diff --git a/site/src/styles/global.css b/site/src/styles/global.css new file mode 100644 index 000000000..9d7245f1e --- /dev/null +++ b/site/src/styles/global.css @@ -0,0 +1,247 @@ +@import "tailwindcss"; + +@theme { + --color-ink-950: #040b18; + --color-ink-900: #09152a; + --color-panel-900: #0d1a37; + --color-panel-800: #132649; + --color-sky-300: #985dca; + --color-lime-300: #63be61; +} + +@layer base { + :root { + --font-sans: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + --text-primary: #eaf2ff; + --text-muted: #cbd7ee; + --accent-strong: #985dca; + --accent-hover: #b289da; + --accent-border: rgb(152 93 202 / 60%); + --accent-bg-soft: rgb(152 93 202 / 12%); + --accent-text-soft: #ead8f8; + --page-bg: + radial-gradient(circle at 80% -20%, rgb(45 161 227 / 22%), transparent 40%), + radial-gradient(circle at 15% 10%, rgb(169 91 216 / 16%), transparent 42%), + linear-gradient(180deg, #040b18 0%, #09152a 45%, #040b18 100%); + --panel-border: rgb(255 255 255 / 15%); + --panel-bg-from: rgb(19 38 73 / 95%); + --panel-bg-to: rgb(13 26 55 / 95%); + --chip-border: rgb(255 255 255 / 20%); + --chip-text: #cbd5e1; + --chip-hover-border: #985dca; + --chip-active-bg: #985dca; + --chip-active-text: #f8f2fc; + --badge-from: #f2d21d; + --badge-to: #f8b454; + --badge-text: #0f172a; + } + + html { + scroll-behavior: smooth; + } + + body { + margin: 0; + position: relative; + isolation: isolate; + font-family: var(--font-sans); + color: var(--text-primary); + background: #040b18; + min-height: 100vh; + } + + body::before { + content: ""; + position: fixed; + inset: 0; + z-index: -1; + pointer-events: none; + background: + radial-gradient(circle at 80% -20%, rgb(45 161 227 / 22%), transparent 40%), + radial-gradient(circle at 15% 10%, rgb(169 91 216 / 16%), transparent 42%), + linear-gradient(180deg, #040b18 0%, #09152a 45%, #040b18 100%); + } + + h1, + h2, + h3, + h4 { + font-family: var(--font-sans); + letter-spacing: -0.02em; + } + + a { + text-decoration: none; + } +} + +@layer components { + .frost-panel { + @apply rounded-2xl border; + border-color: var(--panel-border); + background: linear-gradient(135deg, var(--panel-bg-from), var(--panel-bg-to)); + } + + .chip-button { + @apply rounded-full border px-3 py-2 text-sm transition hover:-translate-y-0.5; + border-color: var(--chip-border); + color: var(--chip-text); + } + + .chip-button:hover { + border-color: var(--chip-hover-border); + } + + .chip-button-active { + border-color: var(--chip-active-bg); + background-color: var(--chip-active-bg); + color: var(--chip-active-text); + } + + .chip-button-repo { + border-color: rgb(99 190 97 / 70%); + color: #8fe0b3; + } + + .chip-button-repo:hover { + border-color: #f2d21d; + color: #f2d21d; + } + + .theme-eyebrow { + color: var(--accent-strong); + } + + .theme-link { + color: var(--accent-strong); + } + + .theme-link:hover { + color: var(--accent-hover); + } + + .theme-card-hover:hover { + border-color: var(--accent-border); + } + + .theme-accent-pill { + border-color: var(--accent-border); + background-color: var(--accent-bg-soft); + color: var(--accent-text-soft); + } + + .readme-content :where(h1, h2, h3, h4, h5, h6) { + @apply mt-6 mb-3 font-bold text-white; + } + + .readme-content h1 { + @apply text-2xl; + } + + .readme-content h2 { + @apply text-xl; + } + + .readme-content h3 { + @apply text-lg; + } + + .readme-content p { + @apply my-3 text-slate-200; + } + + .readme-content a { + color: var(--accent-strong); + text-decoration: underline; + text-underline-offset: 3px; + } + + .readme-content a:hover { + color: var(--accent-hover); + } + + .readme-content ul, + .readme-content ol { + @apply my-3 pl-6 text-slate-200; + } + + .readme-content ul { + list-style-type: disc; + } + + .readme-content ol { + list-style-type: decimal; + } + + .readme-content li { + @apply my-1; + } + + .readme-content code { + @apply rounded bg-white/10 px-1.5 py-0.5 text-slate-100; + } + + .readme-content pre { + @apply my-4 overflow-x-auto rounded-xl border border-white/10 bg-ink-950/75 p-4 text-slate-100; + } + + .readme-content pre code { + @apply bg-transparent p-0; + } + + .readme-content blockquote { + @apply my-4 border-l-4 border-white/20 pl-4 italic text-slate-300; + } + + .readme-content table { + @apply my-4 w-full border-collapse text-sm; + } + + .readme-content th, + .readme-content td { + @apply border border-white/15 px-3 py-2 text-left; + } + + .readme-content th { + @apply bg-white/5 font-semibold text-white; + } + + .sample-type-pill { + @apply inline-flex h-9 w-52 items-center justify-center overflow-hidden rounded-full px-3 text-center text-xs font-semibold uppercase tracking-wide whitespace-nowrap; + --sample-pill-base: #233f96; + --sample-pill-corner: #1a2f71; + background: radial-gradient(circle at top left, var(--sample-pill-base) 0%, var(--sample-pill-corner) 100%); + border: 1px solid rgb(255 255 255 / 25%); + color: #f8fafc; + } + + .sample-type-pill[data-sample-type="Declarative Agent"] { + --sample-pill-base: #63be61; + --sample-pill-corner: #4a8f49; + color: #f8fafc; + } + + .sample-type-pill[data-sample-type="Copilot Extension"] { + --sample-pill-base: #f36c58; + --sample-pill-corner: #b65142; + color: #fef2f2; + } + + .sample-type-pill[data-sample-type="Custom Engine Agent"] { + --sample-pill-base: #2a4fcf; + --sample-pill-corner: #203b9b; + color: #eff6ff; + } + + .sample-type-pill[data-sample-type="Copilot Studio"] { + --sample-pill-base: #a95bd8; + --sample-pill-corner: #7f44a2; + color: #f5f3ff; + } + + .sample-type-pill[data-sample-type="MCP"] { + --sample-pill-base: #2da1e3; + --sample-pill-corner: #2279aa; + color: #f9fafb; + } +} diff --git a/site/tsconfig.json b/site/tsconfig.json new file mode 100644 index 000000000..8bf91d3bb --- /dev/null +++ b/site/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "astro/tsconfigs/strict", + "include": [".astro/types.d.ts", "**/*"], + "exclude": ["dist"] +}