From c13a82db126c449338817f8e289470e39aade957 Mon Sep 17 00:00:00 2001 From: Steven Ickman Date: Wed, 23 Jul 2025 17:17:41 -0700 Subject: [PATCH] created a plugin for the agents sdk --- package-lock.json | 210 +++++++++++++++++++-- packages/agentssdk/CHANGELOG.md | 273 ++++++++++++++++++++++++++++ packages/agentssdk/README.md | 38 ++++ packages/agentssdk/eslint.config.js | 1 + packages/agentssdk/jest.config.js | 1 + packages/agentssdk/package.json | 58 ++++++ packages/agentssdk/src/index.ts | 1 + packages/agentssdk/src/plugin.ts | 123 +++++++++++++ packages/agentssdk/tsconfig.json | 9 + packages/agentssdk/tsup.config.js | 1 + packages/agentssdk/turbo.json | 16 ++ 11 files changed, 717 insertions(+), 14 deletions(-) create mode 100644 packages/agentssdk/CHANGELOG.md create mode 100644 packages/agentssdk/README.md create mode 100644 packages/agentssdk/eslint.config.js create mode 100644 packages/agentssdk/jest.config.js create mode 100644 packages/agentssdk/package.json create mode 100644 packages/agentssdk/src/index.ts create mode 100644 packages/agentssdk/src/plugin.ts create mode 100644 packages/agentssdk/tsconfig.json create mode 100644 packages/agentssdk/tsup.config.js create mode 100644 packages/agentssdk/turbo.json diff --git a/package-lock.json b/package-lock.json index ea5e1b7d4..084c2d97c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -320,9 +320,9 @@ } }, "node_modules/@azure/core-auth": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.9.0.tgz", - "integrity": "sha512-FPwHpZywuyasDSLMqJ6fhbOK3TqUdviZNF8OqRGA4W5Ewib2lEEZ+pBsYcBa88B2NGO/SEnYPGhyBqNlE8ilSw==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.10.0.tgz", + "integrity": "sha512-88Djs5vBvGbHQHf5ZZcaoNHo6Y8BKZkt3cw2iuJIQzLEgH4Ox6Tm4hjFhbqOxyYsgIG/eJbFEHpxRIfEEWv5Ow==", "license": "MIT", "dependencies": { "@azure/abort-controller": "^2.0.0", @@ -330,7 +330,7 @@ "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, "node_modules/@azure/core-client": { @@ -3985,6 +3985,29 @@ "url": "https://github.com/sponsors/nzakas" } }, + "node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", + "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/brace-expansion": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", + "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@isaacs/balanced-match": "^4.0.1" + }, + "engines": { + "node": "20 || >=22" + } + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -4625,6 +4648,74 @@ "node": ">=4.2.0" } }, + "node_modules/@microsoft/agents-activity": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@microsoft/agents-activity/-/agents-activity-1.0.0.tgz", + "integrity": "sha512-AQm5NWQ5wWcH0dfvWqTdpAjLX6Fckk2d8mXkG1O8KZCFM67kG0os9G2ONurBZjGFITaIryNfNl6quxnixU6SAQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "debug": "^4.3.7", + "uuid": "^11.1.0", + "zod": "3.25.75" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@microsoft/agents-hosting": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@microsoft/agents-hosting/-/agents-hosting-1.0.0.tgz", + "integrity": "sha512-7vL9H/jpy8ujJOk7KKSrRC4HKiA0m+GoWoTT9PRHNwmDfIPGU7yAaDLON7NrBOLYZwTDrKg6isMrd6OYigqeSg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@azure/core-auth": "^1.10.0", + "@azure/msal-node": "^3.6.0", + "@microsoft/agents-activity": "1.0.0", + "axios": "^1.10.0", + "jsonwebtoken": "^9.0.2", + "jwks-rsa": "^3.2.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@microsoft/agents-hosting/node_modules/@azure/msal-common": { + "version": "15.9.0", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-15.9.0.tgz", + "integrity": "sha512-lbz/D+C9ixUG3hiZzBLjU79a0+5ZXCorjel3mwXluisKNH0/rOS/ajm8yi4yI9RP5Uc70CAcs9Ipd0051Oh/kA==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@microsoft/agents-hosting/node_modules/@azure/msal-node": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-3.6.4.tgz", + "integrity": "sha512-jMeut9UQugcmq7aPWWlJKhJIse4DQ594zc/JaP6BIxg55XaX3aM/jcPuIQ4ryHnI4QSf03wUspy/uqAvjWKbOg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@azure/msal-common": "15.9.0", + "jsonwebtoken": "^9.0.0", + "uuid": "^8.3.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@microsoft/agents-hosting/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", + "peer": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/@microsoft/teams-js": { "version": "2.36.0", "resolved": "https://registry.npmjs.org/@microsoft/teams-js/-/teams-js-2.36.0.tgz", @@ -4640,6 +4731,10 @@ "resolved": "external/a2a", "link": true }, + "node_modules/@microsoft/teams.agentssdk": { + "resolved": "packages/agentssdk", + "link": true + }, "node_modules/@microsoft/teams.ai": { "resolved": "packages/ai", "link": true @@ -8314,13 +8409,13 @@ } }, "node_modules/axios": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.9.0.tgz", - "integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.11.0.tgz", + "integrity": "sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", + "form-data": "^4.0.4", "proxy-from-env": "^1.1.0" } }, @@ -12088,14 +12183,15 @@ } }, "node_modules/form-data": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", - "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", "mime-types": "^2.1.12" }, "engines": { @@ -21787,9 +21883,9 @@ } }, "node_modules/zod": { - "version": "3.24.3", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.3.tgz", - "integrity": "sha512-HhY1oqzWCQWuUqvBFnsyrtZRhyPeR7SUGv+C4+MsisMuVfSPx8HpwWqH8tRahSlt6M3PiFAcoeFhZAqIXTxoSg==", + "version": "3.25.75", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.75.tgz", + "integrity": "sha512-OhpzAmVzabPOL6C3A3gpAifqr9MqihV/Msx3gor2b2kviCgcb+HM9SEOpMWwwNp9MRunWnhtAKUoo0AHhjyPPg==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" @@ -21856,6 +21952,92 @@ "url": "https://github.com/sponsors/wooorm" } }, + "packages/agentssdk": { + "name": "@microsoft/teams.agentssdk", + "version": "2.0.0-preview.7", + "license": "MIT", + "devDependencies": { + "@microsoft/teams.config": "2.0.0-preview.7", + "@types/jest": "^29.5.12", + "@types/node": "^22.0.2", + "jest": "^29.7.0", + "rimraf": "^6.0.1", + "ts-jest": "^29.2.5", + "tsup": "^8.4.0", + "typescript": "^5.4.5" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@microsoft/agents-activity": "1.0.0", + "@microsoft/agents-hosting": "1.0.0", + "@microsoft/teams.api": "2.0.0-preview.7", + "@microsoft/teams.apps": "2.0.0-preview.7", + "@microsoft/teams.common": "2.0.0-preview.7", + "@microsoft/teams.graph": "2.0.0-preview.7" + } + }, + "packages/agentssdk/node_modules/glob": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.3.tgz", + "integrity": "sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.3.1", + "jackspeak": "^4.1.1", + "minimatch": "^10.0.3", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/agentssdk/node_modules/minimatch": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", + "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", + "dev": true, + "license": "ISC", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/agentssdk/node_modules/rimraf": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.0.1.tgz", + "integrity": "sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^11.0.0", + "package-json-from-dist": "^1.0.0" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "packages/ai": { "name": "@microsoft/teams.ai", "version": "2.0.0-preview.8", diff --git a/packages/agentssdk/CHANGELOG.md b/packages/agentssdk/CHANGELOG.md new file mode 100644 index 000000000..899de7203 --- /dev/null +++ b/packages/agentssdk/CHANGELOG.md @@ -0,0 +1,273 @@ +# @microsoft/teams.botbuilder + +## 2.0.0-preview.7 + +### Patch Changes + +- - Add streamable http support to MCPClient + - Adds a way to "send" messages from a tab-app to the associated conversation +- Updated dependencies + - @microsoft/teams.api@2.0.0-preview.7 + - @microsoft/teams.apps@2.0.0-preview.7 + - @microsoft/teams.common@2.0.0-preview.7 + - @microsoft/teams.graph@2.0.0-preview.7 + +## 2.0.0-preview.6 + +### Patch Changes + +- Disable automatic function calling, and show structured output +- Updated dependencies + - @microsoft/teams.api@2.0.0-preview.6 + - @microsoft/teams.apps@2.0.0-preview.6 + - @microsoft/teams.common@2.0.0-preview.6 + - @microsoft/teams.graph@2.0.0-preview.6 + +## 2.0.0-preview.5 + +### Patch Changes + +- streaming bug fix +- Updated dependencies + - @microsoft/teams.apps@2.0.0-preview.5 + - @microsoft/teams.api@2.0.0-preview.5 + - @microsoft/teams.common@2.0.0-preview.5 + - @microsoft/teams.graph@2.0.0-preview.5 + +## 2.0.0-preview.4 + +### Patch Changes + +- Integrate Adaptive Cards designer with DevTools, some bug fixes, naming updates +- Updated dependencies + - @microsoft/teams.api@2.0.0-preview.4 + - @microsoft/teams.apps@2.0.0-preview.4 + - @microsoft/teams.common@2.0.0-preview.4 + - @microsoft/teams.graph@2.0.0-preview.4 + +## 2.0.0-preview.3 + +### Patch Changes + +- add csharp support to CLI officially, add a2a support via new package, devtools updates +- Updated dependencies + - @microsoft/teams.api@2.0.0-preview.3 + - @microsoft/teams.apps@2.0.0-preview.3 + - @microsoft/teams.common@2.0.0-preview.3 + - @microsoft/teams.graph@2.0.0-preview.3 + +## 2.0.0-preview.2 + +### Patch Changes + +- Add MCP client template +- Updated dependencies + - @microsoft/teams.api@2.0.0-preview.2 + - @microsoft/teams.apps@2.0.0-preview.2 + - @microsoft/teams.common@2.0.0-preview.2 + - @microsoft/teams.graph@2.0.0-preview.2 + +## 2.0.0-preview.1 + +### Patch Changes + +- fix cli template versions +- Updated dependencies + - @microsoft/teams.api@2.0.0-preview.1 + - @microsoft/teams.apps@2.0.0-preview.1 + - @microsoft/teams.common@2.0.0-preview.1 + - @microsoft/teams.graph@2.0.0-preview.1 + +## 2.0.0-preview.0 + +### Major Changes + +- v2 preview release + +### Patch Changes + +- Updated dependencies + - @microsoft/teams.common@2.0.0-preview.0 + - @microsoft/teams.graph@2.0.0-preview.0 + - @microsoft/teams.apps@2.0.0-preview.0 + - @microsoft/teams.api@2.0.0-preview.0 + +## 0.2.14 + +### Patch Changes + +- fix cli bug and add mcp client customizations like headers and logging + +## 0.2.13 + +### Patch Changes + +- bugfixes, devtools updates, mcp client updates + +## 0.2.12 + +### Patch Changes + +- app startup fetch token bugfix + +## 0.2.11 + +### Patch Changes + +- dev plugin bug fix + +## 0.2.10 + +### Patch Changes + +- fix docs links and fix a couple minor issues + +## 0.2.9 + +### Patch Changes + +- config fetch response fix + +## 0.2.8 + +### Patch Changes + +- fix docs links + +## 0.2.7 + +### Patch Changes + +- package rename + +## 0.2.6 + +### Patch Changes + +- fix cli for lower node versions + +## 0.2.5 + +### Patch Changes + +- add mcp client, ai plugins, devtools improvements + +## 0.2.4 + +### Patch Changes + +- fix reflect-metadata dependency + +## 0.2.3 + +### Patch Changes + +- devtools fixes, plugins refactor, ai package fixes, new cli ttk configuration + +## 0.2.2 + +### Patch Changes + +- add mcp package and update ai package with use method + +## 0.2.1 + +### Patch Changes + +- change @azure/openai from peer dependency to regular + +## 0.2.0 + +### Minor Changes + +- refactor ai package interface, devtools updates + +## 0.1.3 + +### Patch Changes + +- add template logic to cli for more accurate templates/configs + +## 0.1.2 + +### Patch Changes + +- fix bug in `next` routing method + +## 0.1.1 + +### Patch Changes + +- adaptive cards action invoke response fix, tests for cards + +## 0.1.0 + +### Minor Changes + +- devtools fixes, breaking type changes due to rename/refactor + +## 0.0.6 + +### Patch Changes + +- fix middleware bug in removeMentionsText +- Updated dependencies + - @microsoft/teams.apps@0.0.6 + - @microsoft/teams.api@0.0.6 + - @microsoft/teams.common@0.0.6 + - @microsoft/teams.graph@0.0.6 + +## 0.0.5 + +### Patch Changes + +- add removeMentionsText util and middleware, update docs +- Updated dependencies + - @microsoft/teams.api@0.0.5 + - @microsoft/teams.apps@0.0.5 + - @microsoft/teams.common@0.0.5 + - @microsoft/teams.graph@0.0.5 + +## 0.0.4 + +### Patch Changes + +- fix auth credential error +- Updated dependencies + - @microsoft/teams.api@0.0.4 + - @microsoft/teams.apps@0.0.4 + - @microsoft/teams.common@0.0.4 + - @microsoft/teams.graph@0.0.4 + +## 0.0.3 + +### Patch Changes + +- add support for more types of bot authentication, devtools fixes +- Updated dependencies + - @microsoft/teams.api@0.0.3 + - @microsoft/teams.apps@0.0.3 + - @microsoft/teams.common@0.0.3 + - @microsoft/teams.graph@0.0.3 + +## 0.0.2 + +### Patch Changes + +- fix cli binary name +- Updated dependencies + - @microsoft/teams.api@0.0.2 + - @microsoft/teams.apps@0.0.2 + - @microsoft/teams.common@0.0.2 + - @microsoft/teams.graph@0.0.2 + +## 0.0.1 + +### Patch Changes + +- port to new repository +- Updated dependencies + - @microsoft/teams.api@0.0.1 + - @microsoft/teams.apps@0.0.1 + - @microsoft/teams.common@0.0.1 + - @microsoft/teams.graph@0.0.1 diff --git a/packages/agentssdk/README.md b/packages/agentssdk/README.md new file mode 100644 index 000000000..9a802f789 --- /dev/null +++ b/packages/agentssdk/README.md @@ -0,0 +1,38 @@ +# Teams: Agents SDK + +

+ + + + + + + + + + + + + + + +

+ +A package used to make the `@microsoft/teams.apps` package compatible with agents built using +`Agents SDK`. + + + + + +## Install + +```bash +$: npm install @microsoft/teams.agentssdk +``` + +## Dependencies + +- [`uuid`](https://www.npmjs.com/package/uuid) +- [`@microsoft/agents-activity`](https://www.npmjs.com/package/@microsoft/agents-activity) +- [`@microsoft/agents-hosting`](https://www.npmjs.com/package/@microsoft/agents-hosting) diff --git a/packages/agentssdk/eslint.config.js b/packages/agentssdk/eslint.config.js new file mode 100644 index 000000000..52f4934dc --- /dev/null +++ b/packages/agentssdk/eslint.config.js @@ -0,0 +1 @@ +module.exports = require('@microsoft/teams.config/eslint.config'); diff --git a/packages/agentssdk/jest.config.js b/packages/agentssdk/jest.config.js new file mode 100644 index 000000000..0decac4af --- /dev/null +++ b/packages/agentssdk/jest.config.js @@ -0,0 +1 @@ +module.exports = require('@microsoft/teams.config/jest.config'); diff --git a/packages/agentssdk/package.json b/packages/agentssdk/package.json new file mode 100644 index 000000000..d65666afe --- /dev/null +++ b/packages/agentssdk/package.json @@ -0,0 +1,58 @@ +{ + "name": "@microsoft/teams.agentssdk", + "version": "2.0.0-preview.7", + "license": "MIT", + "main": "./dist/index.js", + "module": "./dist/index.mjs", + "types": "./dist/index.d.ts", + "homepage": "https://github.com/microsoft/teams.ts", + "bugs": "https://github.com/microsoft/teams.ts/issues", + "files": [ + "dist", + "README.md" + ], + "engines": { + "node": ">=20" + }, + "repository": { + "type": "git", + "url": "https://github.com/microsoft/teams.ts.git", + "directory": "packages/botbuilder" + }, + "keywords": [ + "microsoft", + "teams", + "msteams", + "copilot", + "ai", + "adaptive-cards", + "apps", + "bots", + "botbuilder" + ], + "scripts": { + "clean": "npx rimraf ./dist", + "lint": "npx eslint", + "lint:fix": "npx eslint --fix", + "build": "npx tsc", + "test": "npx jest" + }, + "peerDependencies": { + "@microsoft/teams.api": "2.0.0-preview.7", + "@microsoft/teams.apps": "2.0.0-preview.7", + "@microsoft/teams.common": "2.0.0-preview.7", + "@microsoft/teams.graph": "2.0.0-preview.7", + "@microsoft/agents-activity": "1.0.0", + "@microsoft/agents-hosting": "1.0.0" + }, + "devDependencies": { + "@microsoft/teams.config": "2.0.0-preview.7", + "@types/jest": "^29.5.12", + "@types/node": "^22.0.2", + "jest": "^29.7.0", + "rimraf": "^6.0.1", + "ts-jest": "^29.2.5", + "tsup": "^8.4.0", + "typescript": "^5.4.5" + } +} diff --git a/packages/agentssdk/src/index.ts b/packages/agentssdk/src/index.ts new file mode 100644 index 000000000..1110b6451 --- /dev/null +++ b/packages/agentssdk/src/index.ts @@ -0,0 +1 @@ +export * from './plugin'; diff --git a/packages/agentssdk/src/plugin.ts b/packages/agentssdk/src/plugin.ts new file mode 100644 index 000000000..6a6bca926 --- /dev/null +++ b/packages/agentssdk/src/plugin.ts @@ -0,0 +1,123 @@ +import express from 'express'; + +import { + AgentApplication, + AuthConfiguration, + CloudAdapter, + loadAuthConfigFromEnv, + TurnState, +} from '@microsoft/agents-hosting'; + + +import { $Activity, Activity, Credentials, IToken, JsonWebToken } from '@microsoft/teams.api'; +import { + Dependency, + Event, + HttpPlugin, + IActivityEvent, + IErrorEvent, + ISender, + Logger, + Plugin, + manifest, +} from '@microsoft/teams.apps'; +import { ILogger } from '@microsoft/teams.common'; +import * as $http from '@microsoft/teams.common/http'; + +import pkg from '../package.json'; + +export type AgentSDKPluginOptions = { + readonly adapter?: CloudAdapter; + readonly application?: AgentApplication; +}; + +@Plugin({ + name: 'http', + version: pkg.version, +}) +export class AgentsSDKPlugin extends HttpPlugin implements ISender { + @Logger() + declare readonly logger: ILogger; + + @Dependency() + declare readonly client: $http.Client; + + @Dependency() + declare readonly manifest: Partial; + + @Dependency({ optional: true }) + declare readonly botToken?: () => IToken; + + @Dependency({ optional: true }) + declare readonly graphToken?: () => IToken; + + @Dependency({ optional: true }) + readonly credentials?: Credentials; + + @Event('error') + declare readonly $onError: (event: IErrorEvent) => void; + + @Event('activity') + declare readonly $onActivity: (event: IActivityEvent) => void; + + protected adapter?: CloudAdapter; + protected application?: AgentApplication; + + constructor(options?: AgentSDKPluginOptions) { + super(); + this.adapter = options?.adapter; + this.application = options?.application; + } + + onInit() { + if (!this.adapter) { + const authConfig: AuthConfiguration = loadAuthConfigFromEnv(); + this.adapter = new CloudAdapter(authConfig); + } + } + + protected async onRequest( + req: express.Request, + res: express.Response, + next: express.NextFunction + ) { + if (!this.adapter) { + throw new Error('plugin not registered'); + } + + try { + const authorization = req.headers.authorization?.replace('Bearer ', ''); + + if (!authorization) { + res.status(401).send('unauthorized'); + return; + } + + await this.adapter.process(req, res, async (context) => { + if (!context.activity.id) return; + + if (this.application) { + await this.application.run(context); + } + + if (res.headersSent) { + return next(); + } + + this.pending[context.activity.id] = res; + const activity = JSON.parse(context.activity.toJsonString()); + this.$onActivity({ + sender: this, + token: new JsonWebToken(authorization), + activity: new $Activity(activity as any) as Activity, + }); + }); + } catch (err) { + this.logger.error(err); + + if (!res.headersSent) { + res.status(500).send('internal server error'); + } + } + } +} diff --git a/packages/agentssdk/tsconfig.json b/packages/agentssdk/tsconfig.json new file mode 100644 index 000000000..4f18f1a44 --- /dev/null +++ b/packages/agentssdk/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "@microsoft/teams.config/tsconfig.node.json", + "compilerOptions": { + "outDir": "dist", + "rootDir": "src" + }, + "include": ["src/**/*.ts"], + "exclude": ["src/**/*.spec.ts"] +} diff --git a/packages/agentssdk/tsup.config.js b/packages/agentssdk/tsup.config.js new file mode 100644 index 000000000..5534c0330 --- /dev/null +++ b/packages/agentssdk/tsup.config.js @@ -0,0 +1 @@ +module.exports = require('@microsoft/teams.config/tsup.config'); diff --git a/packages/agentssdk/turbo.json b/packages/agentssdk/turbo.json new file mode 100644 index 000000000..8d9c44588 --- /dev/null +++ b/packages/agentssdk/turbo.json @@ -0,0 +1,16 @@ +{ + "extends": ["//"], + "tasks": { + "build": { + "inputs": ["$TURBO_DEFAULT$", ".env*"], + "outputs": [".next/**", "!.next/cache/**"], + "cache": false, + "dependsOn": [ + "@microsoft/teams.api#build", + "@microsoft/teams.apps#build", + "@microsoft/teams.common#build", + "@microsoft/teams.graph#build" + ] + } + } +}