Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
6e4621d
Merge pull request #15533 from OfficeDev/dev
wh-alice Mar 18, 2026
0734b39
fix(vsc): skill path
tecton Mar 18, 2026
4977160
Merge pull request #15542 from OfficeDev/nintan/fix-skill-path
wh-alice Mar 19, 2026
23f09f5
fix: compatible to the new API of MCP Gateway
Alive-Fish Mar 19, 2026
09904fa
Merge pull request #15553 from OfficeDev/zhiyou/fix-mcp-getway
wh-alice Mar 20, 2026
f462c6b
Merge branch 'release/6.7' into zhiyou/resolve-conflict-v2
Alive-Fish Apr 8, 2026
cb830c1
Merge remote-tracking branch 'origin' into zhiyou/resolve-conflict-v2
Alive-Fish Apr 8, 2026
efc634d
Merge pull request #15664 from OfficeDev/zhiyou/resolve-conflict-v2
wh-alice Apr 8, 2026
ff95d09
build(release): publish detail
wh-alice Apr 8, 2026
ca0d3f7
fix: mac os playground can not be started
qinzhouxu Apr 8, 2026
a177e5e
fix: tab template for 2.0.7 SDK
Alive-Fish Apr 8, 2026
557fa5b
Merge pull request #15669 from OfficeDev/qinzhouxu/mac-cp
wh-alice Apr 8, 2026
2b6f2a4
Merge pull request #15670 from OfficeDev/zhiyou/fix-tab
wh-alice Apr 9, 2026
ff3fafe
fix: python teams agent can not start
qinzhouxu Apr 9, 2026
d58be13
fix: message extension template for 2.0.7 SDK
Alive-Fish Apr 9, 2026
9962749
Merge pull request #15683 from OfficeDev/zhiyou/fix-message-extension
wh-alice Apr 9, 2026
49fb5e3
Merge pull request #15682 from OfficeDev/qinzhouxu/python-cp
wh-alice Apr 9, 2026
256567e
build(release): publish detail
wh-alice Apr 9, 2026
6c0a59a
build: modify code for generate release bits
qinzhouxu Apr 10, 2026
11924e7
Merge pull request #15687 from OfficeDev/qinzhouxu/release
wh-alice Apr 10, 2026
9ad4d31
fix: replace missing core.* NLS keys with template.* equivalents
qfai Apr 13, 2026
e601f21
build: update vsc version to 6.8
Alive-Fish Apr 13, 2026
0bd51e1
fix: replace variable accounName for cli login (#15694)
hellyzh Apr 13, 2026
39ae81b
fix: add action ui on vsc
Alive-Fish Apr 13, 2026
2342788
Merge remote-tracking branch 'origin/zhiyou/fix-vsc-ui' into fix/miss…
qfai Apr 13, 2026
63500ea
style: format files with prettier
qfai Apr 13, 2026
df8cdda
Merge pull request #15697 from OfficeDev/helly/clilogin
wh-alice Apr 13, 2026
ed4c878
Merge pull request #15696 from OfficeDev/zhiyou/update-version
wh-alice Apr 14, 2026
30e65b7
Merge pull request #15695 from OfficeDev/fix/missing-nls-keys
wh-alice Apr 14, 2026
ae9d376
build: bump template version to 6.8
Alive-Fish Apr 14, 2026
01676d3
Merge pull request #15702 from OfficeDev/zhiyou/bump-template-version
wh-alice Apr 14, 2026
ccf16fa
build(release): publish detail
wh-alice Apr 14, 2026
17233d5
feat: update App Manifest version to v1.26 in all templates and packages
qfai Apr 15, 2026
36554ca
Merge pull request #15711 from OfficeDev/cherry-pick/manifest-v126-to…
wh-alice Apr 15, 2026
fd171a4
build(release): publish detail
wh-alice Apr 15, 2026
fd76920
Update changelog for version 6.8.0 release
summzhan Apr 17, 2026
a3cd95a
Update packages/vscode-extension/CHANGELOG.md
summzhan Apr 17, 2026
719a452
Update packages/vscode-extension/CHANGELOG.md
summzhan Apr 17, 2026
f3330e8
Update packages/vscode-extension/CHANGELOG.md
summzhan Apr 17, 2026
1f041bb
Fix heading levels, remove unsupported VS Code UI note, and update au…
Copilot Apr 17, 2026
1fb1e5c
Merge pull request #15719 from OfficeDev/summzhan-6.8-changelog
wh-alice Apr 17, 2026
97a8fa4
build(release): publish detail
wh-alice Apr 17, 2026
0fa0fd2
fix: broker auth is not available after packed (#15778)
HuihuiWu-Microsoft Apr 23, 2026
a7ef984
Merge pull request #15788 from HuihuiWu-Microsoft/fix-broker-pack
wh-alice Apr 24, 2026
9a40d8d
Revert "fix: broker auth is not available after packed (#15778)"
QueenFi703 Apr 24, 2026
b15e2c2
Update webpack.config.js
QueenFi703 Apr 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion packages/api/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@microsoft/teamsfx-api",
"version": "0.23.12",
"version": "0.23.13",
"description": "teamsfx framework api",
"main": "build/index.js",
"types": "build/index.d.ts",
Expand Down
2 changes: 1 addition & 1 deletion packages/cli/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@microsoft/m365agentstoolkit-cli",
"version": "1.1.6",
"version": "1.1.7",
"author": "Microsoft Corporation",
"description": "Microsoft 365 Agents Toolkit CLI",
"license": "MIT",
Expand Down
6 changes: 5 additions & 1 deletion packages/cli/src/commonlib/codeFlowLogin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -303,7 +303,11 @@ export class CodeFlowLogin {
const loopbackTemplatePath = path.join(__dirname, "codeFlowResult", "index.html");
let loopbackTemplate = undefined;
if (fs.pathExistsSync(loopbackTemplatePath)) {
loopbackTemplate = await fs.readFile(loopbackTemplatePath, "utf-8");
const displayName = this.accountName == "azure" ? "Azure" : "M365";
loopbackTemplate = (await fs.readFile(loopbackTemplatePath, "utf-8")).replace(
/\${accountName}/g,
displayName
);
}
const interactiveRequest = {
scopes: scopes,
Expand Down
81 changes: 81 additions & 0 deletions packages/cli/tests/unit/commonlib/codeFlowLogin.tests.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.

import "mocha";
import sinon from "sinon";
import { expect } from "../utils";
import { CodeFlowLogin } from "../../../src/commonlib/codeFlowLogin";
import CliTelemetry from "../../../src/telemetry/cliTelemetry";

describe("CodeFlowLogin.loginWithBroker", function () {
const sandbox = sinon.createSandbox();

// A minimal JWT-like token: header.payload.signature
// payload = base64({"oid":"fake-oid","upn":"test@test.com"})
const fakeAccessToken =
"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9." +
Buffer.from(JSON.stringify({ oid: "fake-oid", upn: "test@test.com" })).toString("base64") +
".fake-signature";

const fakeResponse = {
account: {
homeAccountId: "fake-id",
environment: "login.microsoftonline.com",
tenantId: "fake-tenant",
username: "test@test.com",
localAccountId: "fake-local-id",
},
accessToken: fakeAccessToken,
};

const config = {
auth: {
clientId: "fake-client-id",
authority: "https://login.microsoftonline.com/common",
},
};

afterEach(() => {
sandbox.restore();
});

function setupLogin(accountName: string) {
sandbox.stub(CliTelemetry, "sendTelemetryEvent");

const codeFlowLogin = new CodeFlowLogin([], config, 0, accountName);
let capturedRequest: any;
sandbox.stub(codeFlowLogin.pca, "acquireTokenInteractive").callsFake(async (request: any) => {
capturedRequest = request;
return fakeResponse as any;
});
sandbox.stub(codeFlowLogin as any, "mutex").value({
runExclusive: async (fn: any) => fn(),
});

return { codeFlowLogin, getCapturedRequest: () => capturedRequest };
}

it("should replace accountName placeholder with M365 in loopback template for m365 account", async () => {
const { codeFlowLogin, getCapturedRequest } = setupLogin("appStudio");

await codeFlowLogin.loginWithBroker(["scope1"]);
const req = getCapturedRequest();

expect(req.successTemplate).to.include("M365 - Sign In");
expect(req.successTemplate).to.not.include("$" + "{accountName}");
expect(req.errorTemplate).to.include("M365 - Sign In");
expect(req.errorTemplate).to.not.include("$" + "{accountName}");
});

it("should replace accountName placeholder with Azure in loopback template for azure account", async () => {
const { codeFlowLogin, getCapturedRequest } = setupLogin("azure");

await codeFlowLogin.loginWithBroker(["scope1"]);
const req = getCapturedRequest();

expect(req.successTemplate).to.include("Azure - Sign In");
expect(req.successTemplate).to.not.include("$" + "{accountName}");
expect(req.errorTemplate).to.include("Azure - Sign In");
expect(req.errorTemplate).to.not.include("$" + "{accountName}");
});
});
153 changes: 117 additions & 36 deletions packages/cli/webpack.config.js
Original file line number Diff line number Diff line change
@@ -1,108 +1,189 @@
//@ts-check

"use strict";

const path = require("path");
const webpack = require("webpack");
const HtmlWebPackPlugin = require("html-webpack-plugin");
const CopyPlugin = require("copy-webpack-plugin");
const terserWebpackPlugin = require("terser-webpack-plugin");
const fs = require("fs");

/**
* 🌊 Dredge Surface Builder (inline, self-contained)
*/
function buildDredgeSurface(rootDir) {
const dredgeDir = path.resolve(rootDir, "src/dredge");

if (!fs.existsSync(dredgeDir)) {
return { map: {}, manifest: [] };
}

const files = fs
.readdirSync(dredgeDir)
.filter((f) => f.endsWith(".ts") || f.endsWith(".js"));

const map = {};
const manifest = [];

/**@type {import('webpack').Configuration}*/
for (const file of files) {
const name = path.basename(file, path.extname(file));
const importPath = `./dredge/${name}`;

map[name] = importPath;
manifest.push({ name, path: importPath });
}

return { map, manifest };
}

const { map: dredgeMap, manifest: dredgeManifest } =
buildDredgeSurface(__dirname);

/**
* 📦 Webpack Config
* @type {import('webpack').Configuration}
*/
const config = {
target: "node", // vscode extensions run in a Node.js-context 📖 -> https://webpack.js.org/configuration/node/
mode: "none", // this leaves the source code as close as possible to the original (when packaging we set this to 'production')
target: "node",

mode:
process.env.NODE_ENV === "production"
? "production"
: "development",

externalsPresets: { node: true },

node: {
__dirname: false,
},

entry: {
index: "./src/index.ts", // the entry point of this extension, 📖 -> https://webpack.js.org/configuration/entry-context/
index: "./src/index.ts",
},

output: {
filename: "[name].js",
// the bundle is stored in the 'dist' folder (check package.json), 📖 -> https://webpack.js.org/configuration/output/
path: path.resolve(__dirname, "lib"),
libraryTarget: "commonjs2",
clean: true,
},
devtool: "source-map",

devtool:
process.env.NODE_ENV === "production"
? "hidden-source-map"
: "eval-cheap-module-source-map",

externals: {
keytar: "commonjs keytar",
},

resolve: {
// support reading TypeScript and JavaScript files, 📖 -> https://github.com/TypeStrong/ts-loader
extensions: [".tsx", ".ts", ".js"],
symlinks: false,
},

module: {
rules: [
{
test: /(?<!\.d)\.tsx?$/,
test: /\.tsx?$/,
exclude: /node_modules/,
use: [
{
loader: "ts-loader",
},
],
loader: "esbuild-loader",
options: {
loader: "ts",
target: "es2020",
},
},
{
test: /\.s[ac]ss$/i,
exclude: /node_modules/,
use: ["style-loader", "css-loader", "sass-loader"],
},
{
test: /\.(jpg|png|svg|gif)$/,
use: {
loader: "url-loader",
},
test: /\.(png|jpg|gif|svg)$/i,
type: "asset",
},
{
test: /node_modules[\\|/](yaml-language-server|vscode-languageserver|vscode-json-languageservice|prettier)/,
test: /node_modules[\\/](yaml-language-server|vscode-languageserver|vscode-json-languageservice|prettier)/,
use: "umd-compat-loader",
},
],
},

plugins: [
new HtmlWebPackPlugin({
template: "./src/commonlib/codeFlowResult/index.html",
filename: "codeFlowResult/index.html",
scriptLoading: "defer",
}),

new CopyPlugin({
patterns: [
{
from: "../fx-core/resource/",
to: "../resource/",
from: path.resolve(__dirname, "../fx-core/resource/"),
to: path.resolve(__dirname, "../resource/"),
noErrorOnMissing: true,
},
{
from: "../fx-core/templates/",
to: "../templates/",
from: path.resolve(__dirname, "../fx-core/templates/"),
to: path.resolve(__dirname, "../templates/"),
noErrorOnMissing: true,
},
],
}),

// 🌊 DREDGE AUTO SURFACE (core injection)
new webpack.DefinePlugin({
"process.env.AGENT_RUNTIME": JSON.stringify("dredge"),
"process.env.DREDGE_SURFACE": JSON.stringify(dredgeMap),
}),

// 🌊 Optional manifest emit (CI / tooling visibility)
new (class {
apply(compiler) {
compiler.hooks.emit.tap("DredgeManifestPlugin", (compilation) => {
const content = JSON.stringify(dredgeManifest, null, 2);

compilation.assets["dredge.manifest.json"] = {
source: () => content,
size: () => content.length,
};
});
}
})(),

new webpack.ContextReplacementPlugin(/express[\/\\]lib/, false, /$^/),
new webpack.ContextReplacementPlugin(
/applicationinsights[\/\\]out[\/\\]AutoCollection/,
/ms-rest[\/\\]lib/,
false,
/$^/
),
new webpack.ContextReplacementPlugin(
/applicationinsights[\/\\]out[\/\\](AutoCollection|Library)/,
false,
/$^/
),
new webpack.ContextReplacementPlugin(/applicationinsights[\/\\]out[\/\\]Library/, false, /$^/),
new webpack.ContextReplacementPlugin(/ms-rest[\/\\]lib/, false, /$^/),

new webpack.IgnorePlugin({ resourceRegExp: /@opentelemetry\/tracing/ }),
new webpack.IgnorePlugin({ resourceRegExp: /applicationinsights-native-metrics/ }),
new webpack.IgnorePlugin({ resourceRegExp: /original-fs/ }),
// ignore node-gyp/bin/node-gyp.js since it's not used in runtime

new webpack.NormalModuleReplacementPlugin(
/node-gyp[\/\\]bin[\/\\]node-gyp.js/,
"@npmcli/node-gyp"
),
],

optimization: {
minimizer: [
new terserWebpackPlugin({
terserOptions: {
mangle: false,
keep_fnames: true,
},
}),
],
minimize: process.env.NODE_ENV === "production",
splitChunks: false,
runtimeChunk: false,
moduleIds: "deterministic",
},

infrastructureLogging: {
level: "error",
},

stats: "minimal",
};

module.exports = config;
2 changes: 1 addition & 1 deletion packages/eslint-plugin-teamsfx/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@microsoft/eslint-plugin-teamsfx",
"version": "0.0.10",
"version": "0.0.11",
"description": "eslint for teamsfx",
"keywords": [
"eslint",
Expand Down
4 changes: 2 additions & 2 deletions packages/fx-core/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@microsoft/teamsfx-core",
"version": "3.0.11",
"version": "3.0.12",
"main": "build/index.js",
"types": "build/index.d.ts",
"license": "MIT",
Expand Down Expand Up @@ -108,10 +108,10 @@
"@feathersjs/hooks": "^0.6.5",
"@microsoft/dev-tunnels-contracts": "1.1.9",
"@microsoft/dev-tunnels-management": "1.1.9",
"@modelcontextprotocol/sdk": "^1.27.1",
"@microsoft/kiota": "1.29.0",
"@microsoft/m365-spec-parser": "workspace:^",
"@microsoft/teamsfx-api": "workspace:*",
"@modelcontextprotocol/sdk": "^1.27.1",
"adm-zip": "^0.5.10",
"ajv": "^8.18.0",
"axios": "^1.8.3",
Expand Down
4 changes: 4 additions & 0 deletions packages/fx-core/resource/package.nls.json
Original file line number Diff line number Diff line change
Expand Up @@ -247,6 +247,7 @@
"error.generator.FetchSampleInfoError": "Unable to fetch sample info",
"error.generator.DownloadSampleApiLimitError": "Unable to download sample due to rate limitation. Try again in an hour after rate limit reset or you can manually clone the repo from %s.",
"error.generator.DownloadSampleNetworkError": "Unable to download sample due to network error. Check your network connection and try again or you can manually clone the repo from %s",
"error.generator.UnknownPolicy": "Unknown auth policy: %s",
"error.copilotPlugin.apiSpecNotUsedInPlugin": "\"%s\" is not used in the plugin.",
"error.apime.noExtraAPICanBeAdded": "Unable to add API because only GET and POST methods are supported, with a maximum of 5 required parameters and no authentication. Also, methods defined in the manifest are not listed.",
"error.copilot.noExtraAPICanBeAdded": "Unable to add API because no authentication is supported. Also, methods defined in the current OpenAPI description document are not listed.",
Expand Down Expand Up @@ -320,6 +321,7 @@
"core.copilotPlugin.scaffold.summary.warning.generate.ac.failed": "Failed to create the adaptive card for API '%s': %s. Mitigation: Not required but you can manually add it to the adaptiveCards folder.",
"core.createCapabilityQuestion.titleNew": "Capabilities",
"core.createProjectQuestion.option.description.preview": "Preview",
"core.createProjectQuestion.option.description.previewOnWindow": "Preview on Windows",
"core.createProjectQuestion.option.description.worksInOutlook": "Works in Teams and Outlook",
"core.createProjectQuestion.option.description.worksInOutlookM365": "Works in Teams, Outlook, and the Microsoft 365 application",
"core.createProjectQuestion.projectType.bot.detail": "Create instant, engaging chat experiences that automate tasks seamlessly",
Expand Down Expand Up @@ -367,6 +369,7 @@
"core.createProjectQuestion.capability.knowledgeEmbeddedKnowledge.detail": "Embed files directly as grounding information.",
"core.createProjectQuestion.oneDriveSharePointItem.title": "OneDrive or SharePoint Content",
"core.createProjectQuestion.oneDriveSharePointItem.placeholder": "Enter a URL to OneDrive or SharePoint",
"core.createProjectQuestion.oneDriveSharePointItem.confirm": "Confirm your selection",
"core.createProjectQuestion.log.fail.validateOneDriveSharePointItem": "Failed to validate OneDrive/SharePoint URL: %s",
"core.createProjectQuestion.log.fail.invalidOneDriveSharePointURL": "The OneDrive/SharePoint URL is invalid.",
"core.createProjectQuestion.llmService.title": "Service for Large Language Model (LLM)",
Expand Down Expand Up @@ -1055,6 +1058,7 @@
"core.addKnowledgeQuestion.searchType.oneDriveSharepoint": "Search all content within your organization",
"core.addKnowledgeQuestion.searchType.url": "Search by URL",
"driver.typeSpec.compile.start": "Executing action %s",
"driver.typeSpec.compile.description": "Compile TypeSpec project",
"driver.typespec.error.noSpecError": "No OpenApi spec found. Please make sure your TypeSpec files are valid and try again.",
"driver.typespec.error.multipleActionError": "More than one action found in declarativeAgent.json. Please make sure your TypeSpec files are valid and try again.",
"driver.typeSpec.progressBar": "Compiling and generating files...",
Expand Down
Loading