From f6ab30ec82f98ca78087e329a39b55a57acbfa8f Mon Sep 17 00:00:00 2001 From: Antonio Regadas Date: Wed, 21 Jan 2026 15:59:35 +0000 Subject: [PATCH 1/4] feat: introduces the new folder for the ai controllers --- .github/CODEOWNERS | 3 + README.md | 2 + packages/ai-controllers/CHANGELOG.md | 10 +++ packages/ai-controllers/LICENSE | 20 ++++++ packages/ai-controllers/README.md | 15 +++++ packages/ai-controllers/jest.config.js | 26 ++++++++ packages/ai-controllers/package.json | 68 +++++++++++++++++++++ packages/ai-controllers/src/index.test.ts | 9 +++ packages/ai-controllers/src/index.ts | 9 +++ packages/ai-controllers/tsconfig.build.json | 10 +++ packages/ai-controllers/tsconfig.json | 8 +++ packages/ai-controllers/typedoc.json | 7 +++ teams.json | 1 + tsconfig.build.json | 3 + tsconfig.json | 3 + yarn.lock | 16 +++++ 16 files changed, 210 insertions(+) create mode 100644 packages/ai-controllers/CHANGELOG.md create mode 100644 packages/ai-controllers/LICENSE create mode 100644 packages/ai-controllers/README.md create mode 100644 packages/ai-controllers/jest.config.js create mode 100644 packages/ai-controllers/package.json create mode 100644 packages/ai-controllers/src/index.test.ts create mode 100644 packages/ai-controllers/src/index.ts create mode 100644 packages/ai-controllers/tsconfig.build.json create mode 100644 packages/ai-controllers/tsconfig.json create mode 100644 packages/ai-controllers/typedoc.json diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 6910a0f8952..3a6f2ee5b9d 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -40,6 +40,9 @@ ## Earn Team /packages/earn-controller @MetaMask/earn +## Social AI Team +/packages/ai-controllers @MetaMask/social-ai + ## Ramp Team /packages/ramps-controller @MetaMask/ramp diff --git a/README.md b/README.md index 7d25e92c139..74b53e892c4 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,7 @@ Each package in this repository has its own README where you can find installati - [`@metamask/account-tree-controller`](packages/account-tree-controller) - [`@metamask/accounts-controller`](packages/accounts-controller) - [`@metamask/address-book-controller`](packages/address-book-controller) +- [`@metamask/ai-controllers`](packages/ai-controllers) - [`@metamask/analytics-controller`](packages/analytics-controller) - [`@metamask/announcement-controller`](packages/announcement-controller) - [`@metamask/app-metadata-controller`](packages/app-metadata-controller) @@ -100,6 +101,7 @@ linkStyle default opacity:0.5 account_tree_controller(["@metamask/account-tree-controller"]); accounts_controller(["@metamask/accounts-controller"]); address_book_controller(["@metamask/address-book-controller"]); + ai_controllers(["@metamask/ai-controllers"]); analytics_controller(["@metamask/analytics-controller"]); announcement_controller(["@metamask/announcement-controller"]); app_metadata_controller(["@metamask/app-metadata-controller"]); diff --git a/packages/ai-controllers/CHANGELOG.md b/packages/ai-controllers/CHANGELOG.md new file mode 100644 index 00000000000..b518709c7b8 --- /dev/null +++ b/packages/ai-controllers/CHANGELOG.md @@ -0,0 +1,10 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [Unreleased] + +[Unreleased]: https://github.com/MetaMask/core/ diff --git a/packages/ai-controllers/LICENSE b/packages/ai-controllers/LICENSE new file mode 100644 index 00000000000..c8a0ff6be3a --- /dev/null +++ b/packages/ai-controllers/LICENSE @@ -0,0 +1,20 @@ +MIT License + +Copyright (c) 2026 MetaMask + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE diff --git a/packages/ai-controllers/README.md b/packages/ai-controllers/README.md new file mode 100644 index 00000000000..741cc8d3c08 --- /dev/null +++ b/packages/ai-controllers/README.md @@ -0,0 +1,15 @@ +# `@metamask/ai-controllers` + +A collection of AI-related controllers. + +## Installation + +`yarn add @metamask/ai-controllers` + +or + +`npm install @metamask/ai-controllers` + +## Contributing + +This package is part of a monorepo. Instructions for contributing can be found in the [monorepo README](https://github.com/MetaMask/core#readme). diff --git a/packages/ai-controllers/jest.config.js b/packages/ai-controllers/jest.config.js new file mode 100644 index 00000000000..ca084133399 --- /dev/null +++ b/packages/ai-controllers/jest.config.js @@ -0,0 +1,26 @@ +/* + * For a detailed explanation regarding each configuration property and type check, visit: + * https://jestjs.io/docs/configuration + */ + +const merge = require('deepmerge'); +const path = require('path'); + +const baseConfig = require('../../jest.config.packages'); + +const displayName = path.basename(__dirname); + +module.exports = merge(baseConfig, { + // The display name when running multiple projects + displayName, + + // An object that configures minimum threshold enforcement for coverage results + coverageThreshold: { + global: { + branches: 100, + functions: 100, + lines: 100, + statements: 100, + }, + }, +}); diff --git a/packages/ai-controllers/package.json b/packages/ai-controllers/package.json new file mode 100644 index 00000000000..f2f7f05de31 --- /dev/null +++ b/packages/ai-controllers/package.json @@ -0,0 +1,68 @@ +{ + "name": "@metamask/ai-controllers", + "version": "0.0.0", + "description": "A collection of AI-related controllers.", + "keywords": [ + "MetaMask", + "Ethereum" + ], + "homepage": "https://github.com/MetaMask/core/tree/main/packages/ai-controllers#readme", + "bugs": { + "url": "https://github.com/MetaMask/core/issues" + }, + "repository": { + "type": "git", + "url": "https://github.com/MetaMask/core.git" + }, + "license": "MIT", + "sideEffects": false, + "exports": { + ".": { + "import": { + "types": "./dist/index.d.mts", + "default": "./dist/index.mjs" + }, + "require": { + "types": "./dist/index.d.cts", + "default": "./dist/index.cjs" + } + }, + "./package.json": "./package.json" + }, + "main": "./dist/index.cjs", + "types": "./dist/index.d.cts", + "files": [ + "dist/" + ], + "scripts": { + "build": "ts-bridge --project tsconfig.build.json --verbose --clean --no-references", + "build:all": "ts-bridge --project tsconfig.build.json --verbose --clean", + "build:docs": "typedoc", + "changelog:update": "../../scripts/update-changelog.sh @metamask/ai-controllers", + "changelog:validate": "../../scripts/validate-changelog.sh @metamask/ai-controllers", + "publish:preview": "yarn npm publish --tag preview", + "since-latest-release": "../../scripts/since-latest-release.sh", + "test": "NODE_OPTIONS=--experimental-vm-modules jest --reporters=jest-silent-reporter", + "test:clean": "NODE_OPTIONS=--experimental-vm-modules jest --clearCache", + "test:verbose": "NODE_OPTIONS=--experimental-vm-modules jest --verbose", + "test:watch": "NODE_OPTIONS=--experimental-vm-modules jest --watch" + }, + "devDependencies": { + "@metamask/auto-changelog": "^3.4.4", + "@ts-bridge/cli": "^0.6.4", + "@types/jest": "^27.4.1", + "deepmerge": "^4.2.2", + "jest": "^27.5.1", + "ts-jest": "^27.1.4", + "typedoc": "^0.24.8", + "typedoc-plugin-missing-exports": "^2.0.0", + "typescript": "~5.3.3" + }, + "engines": { + "node": "^18.18 || >=20" + }, + "publishConfig": { + "access": "public", + "registry": "https://registry.npmjs.org/" + } +} diff --git a/packages/ai-controllers/src/index.test.ts b/packages/ai-controllers/src/index.test.ts new file mode 100644 index 00000000000..bc062d3694a --- /dev/null +++ b/packages/ai-controllers/src/index.test.ts @@ -0,0 +1,9 @@ +import greeter from '.'; + +describe('Test', () => { + it('greets', () => { + const name = 'Huey'; + const result = greeter(name); + expect(result).toBe('Hello, Huey!'); + }); +}); diff --git a/packages/ai-controllers/src/index.ts b/packages/ai-controllers/src/index.ts new file mode 100644 index 00000000000..6972c117292 --- /dev/null +++ b/packages/ai-controllers/src/index.ts @@ -0,0 +1,9 @@ +/** + * Example function that returns a greeting for the given name. + * + * @param name - The name to greet. + * @returns The greeting. + */ +export default function greeter(name: string): string { + return `Hello, ${name}!`; +} diff --git a/packages/ai-controllers/tsconfig.build.json b/packages/ai-controllers/tsconfig.build.json new file mode 100644 index 00000000000..02a0eea03fe --- /dev/null +++ b/packages/ai-controllers/tsconfig.build.json @@ -0,0 +1,10 @@ +{ + "extends": "../../tsconfig.packages.build.json", + "compilerOptions": { + "baseUrl": "./", + "outDir": "./dist", + "rootDir": "./src" + }, + "references": [], + "include": ["../../types", "./src"] +} diff --git a/packages/ai-controllers/tsconfig.json b/packages/ai-controllers/tsconfig.json new file mode 100644 index 00000000000..025ba2ef7f4 --- /dev/null +++ b/packages/ai-controllers/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../../tsconfig.packages.json", + "compilerOptions": { + "baseUrl": "./" + }, + "references": [], + "include": ["../../types", "./src"] +} diff --git a/packages/ai-controllers/typedoc.json b/packages/ai-controllers/typedoc.json new file mode 100644 index 00000000000..c9da015dbf8 --- /dev/null +++ b/packages/ai-controllers/typedoc.json @@ -0,0 +1,7 @@ +{ + "entryPoints": ["./src/index.ts"], + "excludePrivate": true, + "hideGenerator": true, + "out": "docs", + "tsconfig": "./tsconfig.build.json" +} diff --git a/teams.json b/teams.json index c3010cd8223..aa75b048c99 100644 --- a/teams.json +++ b/teams.json @@ -1,5 +1,6 @@ { "metamask/accounts-controller": "team-accounts-framework", + "metamask/ai-controllers": "team-social-ai", "metamask/multichain-transactions-controller": "team-confirmations", "metamask/multichain-account-service": "team-accounts-framework", "metamask/account-tree-controller": "team-accounts-framework", diff --git a/tsconfig.build.json b/tsconfig.build.json index 184a3a378fc..3949c41a8b7 100644 --- a/tsconfig.build.json +++ b/tsconfig.build.json @@ -16,6 +16,9 @@ { "path": "./packages/address-book-controller/tsconfig.build.json" }, + { + "path": "./packages/ai-controllers/tsconfig.build.json" + }, { "path": "./packages/analytics-controller/tsconfig.build.json" }, diff --git a/tsconfig.json b/tsconfig.json index 934cd9a381b..77e194f6213 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -17,6 +17,9 @@ { "path": "./packages/address-book-controller" }, + { + "path": "./packages/ai-controllers" + }, { "path": "./packages/analytics-controller" }, diff --git a/yarn.lock b/yarn.lock index 40a76951d28..08db4635383 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2538,6 +2538,22 @@ __metadata: languageName: unknown linkType: soft +"@metamask/ai-controllers@workspace:packages/ai-controllers": + version: 0.0.0-use.local + resolution: "@metamask/ai-controllers@workspace:packages/ai-controllers" + dependencies: + "@metamask/auto-changelog": "npm:^3.4.4" + "@ts-bridge/cli": "npm:^0.6.4" + "@types/jest": "npm:^27.4.1" + deepmerge: "npm:^4.2.2" + jest: "npm:^27.5.1" + ts-jest: "npm:^27.1.4" + typedoc: "npm:^0.24.8" + typedoc-plugin-missing-exports: "npm:^2.0.0" + typescript: "npm:~5.3.3" + languageName: unknown + linkType: soft + "@metamask/analytics-controller@workspace:packages/analytics-controller": version: 0.0.0-use.local resolution: "@metamask/analytics-controller@workspace:packages/analytics-controller" From c15c7b1b004dafbc00f5c5933adff14c00fa3ae8 Mon Sep 17 00:00:00 2001 From: Antonio Regadas Date: Wed, 21 Jan 2026 16:06:06 +0000 Subject: [PATCH 2/4] feat: clean up --- packages/ai-controllers/src/index.test.ts | 9 --------- packages/ai-controllers/src/index.ts | 10 +--------- 2 files changed, 1 insertion(+), 18 deletions(-) delete mode 100644 packages/ai-controllers/src/index.test.ts diff --git a/packages/ai-controllers/src/index.test.ts b/packages/ai-controllers/src/index.test.ts deleted file mode 100644 index bc062d3694a..00000000000 --- a/packages/ai-controllers/src/index.test.ts +++ /dev/null @@ -1,9 +0,0 @@ -import greeter from '.'; - -describe('Test', () => { - it('greets', () => { - const name = 'Huey'; - const result = greeter(name); - expect(result).toBe('Hello, Huey!'); - }); -}); diff --git a/packages/ai-controllers/src/index.ts b/packages/ai-controllers/src/index.ts index 6972c117292..6cf5e30e2b2 100644 --- a/packages/ai-controllers/src/index.ts +++ b/packages/ai-controllers/src/index.ts @@ -1,9 +1 @@ -/** - * Example function that returns a greeting for the given name. - * - * @param name - The name to greet. - * @returns The greeting. - */ -export default function greeter(name: string): string { - return `Hello, ${name}!`; -} +// To add the first exports here \ No newline at end of file From 0dd299de6af6409e711f5d3db2b90b171b1ee616 Mon Sep 17 00:00:00 2001 From: Antonio Regadas Date: Wed, 21 Jan 2026 16:20:01 +0000 Subject: [PATCH 3/4] feat: lint fix --- packages/ai-controllers/CHANGELOG.md | 4 ++++ packages/ai-controllers/src/index.test.ts | 9 +++++++++ packages/ai-controllers/src/index.ts | 10 +++++++++- 3 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 packages/ai-controllers/src/index.test.ts diff --git a/packages/ai-controllers/CHANGELOG.md b/packages/ai-controllers/CHANGELOG.md index b518709c7b8..9cedbc4dfe9 100644 --- a/packages/ai-controllers/CHANGELOG.md +++ b/packages/ai-controllers/CHANGELOG.md @@ -7,4 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Added + +- Initial release ([#7693](https://github.com/MetaMask/core/pull/7693)) + [Unreleased]: https://github.com/MetaMask/core/ diff --git a/packages/ai-controllers/src/index.test.ts b/packages/ai-controllers/src/index.test.ts new file mode 100644 index 00000000000..bc062d3694a --- /dev/null +++ b/packages/ai-controllers/src/index.test.ts @@ -0,0 +1,9 @@ +import greeter from '.'; + +describe('Test', () => { + it('greets', () => { + const name = 'Huey'; + const result = greeter(name); + expect(result).toBe('Hello, Huey!'); + }); +}); diff --git a/packages/ai-controllers/src/index.ts b/packages/ai-controllers/src/index.ts index 6cf5e30e2b2..6972c117292 100644 --- a/packages/ai-controllers/src/index.ts +++ b/packages/ai-controllers/src/index.ts @@ -1 +1,9 @@ -// To add the first exports here \ No newline at end of file +/** + * Example function that returns a greeting for the given name. + * + * @param name - The name to greet. + * @returns The greeting. + */ +export default function greeter(name: string): string { + return `Hello, ${name}!`; +} From cea2574e4dc9f8c1169f495cb2148a0774436031 Mon Sep 17 00:00:00 2001 From: Antonio Regadas Date: Wed, 21 Jan 2026 16:28:53 +0000 Subject: [PATCH 4/4] feat: lint fix --- .github/CODEOWNERS | 2 ++ packages/ai-controllers/package.json | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 3a6f2ee5b9d..936db94d4e2 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -202,3 +202,5 @@ /packages/core-backend/CHANGELOG.md @MetaMask/core-platform @MetaMask/metamask-assets /packages/claims-controller/package.json @MetaMask/web3auth @MetaMask/core-platform /packages/claims-controller/CHANGELOG.md @MetaMask/web3auth @MetaMask/core-platform +/packages/ai-controllers/package.json @MetaMask/social-ai @MetaMask/core-platform +/packages/ai-controllers/CHANGELOG.md @MetaMask/social-ai @MetaMask/core-platform \ No newline at end of file diff --git a/packages/ai-controllers/package.json b/packages/ai-controllers/package.json index f2f7f05de31..702e28b0cef 100644 --- a/packages/ai-controllers/package.json +++ b/packages/ai-controllers/package.json @@ -1,7 +1,7 @@ { "name": "@metamask/ai-controllers", "version": "0.0.0", - "description": "A collection of AI-related controllers.", + "description": "A collection of AI-related controllers", "keywords": [ "MetaMask", "Ethereum"