diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index cbaa7729539..c31e7639a95 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -14,6 +14,16 @@ jobs:
with:
node-version: 20
cache: "npm"
+ - name: Check for .md files and suggest renaming
+ run: |
+ echo "Checking for .md files in source/_integrations..."
+ MD_FILES=$(find source/_integrations -type f -name "*.md")
+ if [ -n "$MD_FILES" ]; then
+ echo "Found the following .md files:"
+ echo "$MD_FILES"
+ echo "⚠️ Please rename these files from .md to .markdown"
+ exit 1
+ fi
- name: Install dependencies
run: npm install
env:
diff --git a/Gemfile b/Gemfile
index 8d1af9974ff..a07a7ad241b 100644
--- a/Gemfile
+++ b/Gemfile
@@ -3,16 +3,16 @@ source 'https://rubygems.org'
ruby '> 2.5.0'
group :development do
- gem 'rake', '13.2.1'
+ gem 'rake', '13.3.0'
gem 'jekyll', '4.4.1'
gem 'compass', '1.0.3'
gem 'sass-globbing', '1.1.5'
gem 'stringex', '2.8.6'
# > 2.1.0 causes slowdowns https://github.com/sass/sassc-ruby/issues/189
gem 'sassc', '2.1.0'
- gem 'sass-embedded', '1.89.0'
- gem 'rubocop', '1.75.7'
- gem 'ruby-lsp', '0.23.23'
+ gem 'sass-embedded', '1.89.2'
+ gem 'rubocop', '1.76.1'
+ gem 'ruby-lsp', '0.24.1'
gem 'rackup', '2.2.1'
end
diff --git a/Gemfile.lock b/Gemfile.lock
index 3e2faf63535..d95e4f906eb 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -4,8 +4,8 @@ GEM
addressable (2.8.7)
public_suffix (>= 2.0.2, < 7.0)
ast (2.4.3)
- base64 (0.2.0)
- bigdecimal (3.1.9)
+ base64 (0.3.0)
+ bigdecimal (3.2.2)
chunky_png (1.4.0)
colorator (1.1.0)
commonmarker (0.23.11)
@@ -22,7 +22,7 @@ GEM
compass-import-once (1.0.5)
sass (>= 3.2, < 3.5)
concurrent-ruby (1.3.5)
- csv (3.3.4)
+ csv (3.3.5)
em-websocket (0.5.3)
eventmachine (>= 0.12.9)
http_parser.rb (~> 0)
@@ -30,10 +30,10 @@ GEM
ffi (1.17.2-arm64-darwin)
ffi (1.17.2-x86_64-linux-gnu)
forwardable-extended (2.6.0)
- google-protobuf (4.31.0-arm64-darwin)
+ google-protobuf (4.31.1-arm64-darwin)
bigdecimal
rake (>= 13)
- google-protobuf (4.31.0-x86_64-linux-gnu)
+ google-protobuf (4.31.1-x86_64-linux-gnu)
bigdecimal
rake (>= 13)
http_parser.rb (0.8.0)
@@ -99,7 +99,7 @@ GEM
prism (1.4.0)
public_suffix (6.0.2)
racc (1.8.1)
- rack (3.1.15)
+ rack (3.1.16)
rack-protection (4.1.1)
base64 (>= 0.1.0)
logger (>= 1.6.0)
@@ -110,7 +110,7 @@ GEM
rackup (2.2.1)
rack (>= 3)
rainbow (3.1.1)
- rake (13.2.1)
+ rake (13.3.0)
rb-fsevent (0.11.2)
rb-inotify (0.11.1)
ffi (~> 1.0)
@@ -119,7 +119,7 @@ GEM
regexp_parser (2.10.0)
rexml (3.4.1)
rouge (4.5.2)
- rubocop (1.75.7)
+ rubocop (1.76.1)
json (~> 2.3)
language_server-protocol (~> 3.17.0.2)
lint_roller (~> 1.1.0)
@@ -127,13 +127,13 @@ GEM
parser (>= 3.3.0.2)
rainbow (>= 2.2.2, < 4.0)
regexp_parser (>= 2.9.3, < 3.0)
- rubocop-ast (>= 1.44.0, < 2.0)
+ rubocop-ast (>= 1.45.0, < 2.0)
ruby-progressbar (~> 1.7)
unicode-display_width (>= 2.4.0, < 4.0)
- rubocop-ast (1.44.1)
+ rubocop-ast (1.45.1)
parser (>= 3.3.7.2)
prism (~> 1.4)
- ruby-lsp (0.23.23)
+ ruby-lsp (0.24.1)
language_server-protocol (~> 3.17.0)
prism (>= 1.2, < 2.0)
rbs (>= 3, < 5)
@@ -142,9 +142,9 @@ GEM
ruby2_keywords (0.0.5)
safe_yaml (1.0.5)
sass (3.4.25)
- sass-embedded (1.89.0-arm64-darwin)
+ sass-embedded (1.89.2-arm64-darwin)
google-protobuf (~> 4.31)
- sass-embedded (1.89.0-x86_64-linux-gnu)
+ sass-embedded (1.89.2-x86_64-linux-gnu)
google-protobuf (~> 4.31)
sass-globbing (1.1.5)
sass (>= 3.1)
@@ -159,7 +159,7 @@ GEM
rack-protection (= 4.1.1)
rack-session (>= 2.0.0, < 3)
tilt (~> 2.0)
- sorbet-runtime (0.5.12130)
+ sorbet-runtime (0.5.12167)
stringex (2.8.6)
terminal-table (3.0.2)
unicode-display_width (>= 1.1.1, < 3)
@@ -184,10 +184,10 @@ DEPENDENCIES
jekyll-toc (= 0.19.0)
nokogiri (= 1.18.8)
rackup (= 2.2.1)
- rake (= 13.2.1)
- rubocop (= 1.75.7)
- ruby-lsp (= 0.23.23)
- sass-embedded (= 1.89.0)
+ rake (= 13.3.0)
+ rubocop (= 1.76.1)
+ ruby-lsp (= 0.24.1)
+ sass-embedded (= 1.89.2)
sass-globbing (= 1.1.5)
sassc (= 2.1.0)
sinatra (= 4.1.1)
diff --git a/package-lock.json b/package-lock.json
index a0af2537106..5f7f596d87f 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -20,7 +20,7 @@
"remark-lint-prohibited-strings": "^4.0.0",
"remark-lint-unordered-list-marker-style": "^4.0.1",
"remark-stringify": "^11.0.0",
- "textlint": "^14.7.2",
+ "textlint": "^14.8.0",
"textlint-filter-rule-comments": "^1.2.2",
"textlint-rule-common-misspellings": "^1.0.1",
"textlint-rule-terminology": "^5.0.13"
@@ -306,6 +306,29 @@
"buffer": "^6.0.3"
}
},
+ "node_modules/@modelcontextprotocol/sdk": {
+ "version": "1.12.1",
+ "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.12.1.tgz",
+ "integrity": "sha512-KG1CZhZfWg+u8pxeM/mByJDScJSrjjxLc8fwQqbsS8xCjBmQfMNEBTotYdNanKekepnfRI85GtgQlctLFpcYPw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ajv": "^6.12.6",
+ "content-type": "^1.0.5",
+ "cors": "^2.8.5",
+ "cross-spawn": "^7.0.5",
+ "eventsource": "^3.0.2",
+ "express": "^5.0.1",
+ "express-rate-limit": "^7.5.0",
+ "pkce-challenge": "^5.0.0",
+ "raw-body": "^3.0.0",
+ "zod": "^3.23.8",
+ "zod-to-json-schema": "^3.24.1"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
"node_modules/@npmcli/config": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/@npmcli/config/-/config-6.3.0.tgz",
@@ -427,75 +450,75 @@
"dev": true
},
"node_modules/@textlint/ast-tester": {
- "version": "14.7.2",
- "resolved": "https://registry.npmjs.org/@textlint/ast-tester/-/ast-tester-14.7.2.tgz",
- "integrity": "sha512-nlS1xJkIgyBinOx9zlMTU7e+06G8k6Xg8QBBeB+8oiY2UD4XKNHv0A3kOtW30DKtHcw1onZku00gI2ep1er77w==",
+ "version": "14.8.0",
+ "resolved": "https://registry.npmjs.org/@textlint/ast-tester/-/ast-tester-14.8.0.tgz",
+ "integrity": "sha512-nRsgHmY+O7OhCYwGyWze+8mhnTYfCPFYTvuF3mCE5nQrfO9y2anvdjj2Yf6FU7OZI7qxp/R7MWYkiIQb/WEfHQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@textlint/ast-node-types": "^14.7.2",
- "debug": "^4.4.0"
+ "@textlint/ast-node-types": "^14.8.0",
+ "debug": "^4.4.1"
}
},
"node_modules/@textlint/ast-tester/node_modules/@textlint/ast-node-types": {
- "version": "14.7.2",
- "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-14.7.2.tgz",
- "integrity": "sha512-3rZc9vD8y/DlcFe3Y/cyKRRVgBH4ElEUzVFYdRVDwoMSwV/cIyZgYzVG6ZuOItQt+cHSREuijuucZ4VqZynbtg==",
+ "version": "14.8.0",
+ "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-14.8.0.tgz",
+ "integrity": "sha512-CARGqRSX+DhHdSYssa6+Yb0KAk5cGPDOgKbJo/H8djJAmw7qNzo/oYbuYZlO/fqmUbZjZcvI/6QgCxa/78Nxew==",
"dev": true,
"license": "MIT"
},
"node_modules/@textlint/ast-traverse": {
- "version": "14.7.2",
- "resolved": "https://registry.npmjs.org/@textlint/ast-traverse/-/ast-traverse-14.7.2.tgz",
- "integrity": "sha512-H2pH4NhxBO4nHf9bpEn1v5MZ3E1fKFyrGP3uminXWSqnz+ZEX3fVGYde8EyTdLXpwntUjBg67HBVM4EyTKuhTg==",
+ "version": "14.8.0",
+ "resolved": "https://registry.npmjs.org/@textlint/ast-traverse/-/ast-traverse-14.8.0.tgz",
+ "integrity": "sha512-/u1SiIVnRFm1D/pglLtaP0QJND7UAo8axrUfaikFJZ67ciiguu17/yB0VBMbx9iZn5bmeUHH1NicgCnuirvvJg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@textlint/ast-node-types": "^14.7.2"
+ "@textlint/ast-node-types": "^14.8.0"
}
},
"node_modules/@textlint/ast-traverse/node_modules/@textlint/ast-node-types": {
- "version": "14.7.2",
- "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-14.7.2.tgz",
- "integrity": "sha512-3rZc9vD8y/DlcFe3Y/cyKRRVgBH4ElEUzVFYdRVDwoMSwV/cIyZgYzVG6ZuOItQt+cHSREuijuucZ4VqZynbtg==",
+ "version": "14.8.0",
+ "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-14.8.0.tgz",
+ "integrity": "sha512-CARGqRSX+DhHdSYssa6+Yb0KAk5cGPDOgKbJo/H8djJAmw7qNzo/oYbuYZlO/fqmUbZjZcvI/6QgCxa/78Nxew==",
"dev": true,
"license": "MIT"
},
"node_modules/@textlint/config-loader": {
- "version": "14.7.2",
- "resolved": "https://registry.npmjs.org/@textlint/config-loader/-/config-loader-14.7.2.tgz",
- "integrity": "sha512-06Fqpe36ur7I+SZTtqZbJbsIbbu8uilJuiQG5t+7NIRPNo/d0TrioaMN2Ru/Yr+hq4eSJu+roZ20FNWHMEJb1Q==",
+ "version": "14.8.0",
+ "resolved": "https://registry.npmjs.org/@textlint/config-loader/-/config-loader-14.8.0.tgz",
+ "integrity": "sha512-WYg2WhyFCcCmEN1HOOpe420CMg9o7HzbELVGWvNrgNqqmQDxusUX88z1IG2xJ1bIGpgZTbm9SneUBnoRTzPCJg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@textlint/kernel": "^14.7.2",
- "@textlint/module-interop": "^14.7.2",
- "@textlint/resolver": "^14.7.2",
- "@textlint/types": "^14.7.2",
- "@textlint/utils": "^14.7.2",
- "debug": "^4.4.0",
+ "@textlint/kernel": "^14.8.0",
+ "@textlint/module-interop": "^14.8.0",
+ "@textlint/resolver": "^14.8.0",
+ "@textlint/types": "^14.8.0",
+ "@textlint/utils": "^14.8.0",
+ "debug": "^4.4.1",
"rc-config-loader": "^4.1.3"
}
},
"node_modules/@textlint/feature-flag": {
- "version": "14.7.2",
- "resolved": "https://registry.npmjs.org/@textlint/feature-flag/-/feature-flag-14.7.2.tgz",
- "integrity": "sha512-zfNbBZVrwgDJ4xTWe2FyL/vLvbfw1kTdPRStkFp1tu7I0ypsfwaMh41XZX8rbRqQ5x4p06rLexuOLig9HySyZg==",
+ "version": "14.8.0",
+ "resolved": "https://registry.npmjs.org/@textlint/feature-flag/-/feature-flag-14.8.0.tgz",
+ "integrity": "sha512-cmqPYs1EUYC/5YE8pd70ODrtHCeumR5kamK+CuNj2tS2lDPJ55XJt2I+UnX0SqyRATdl7Yp7OizLfZ5xrtAlUQ==",
"dev": true,
"license": "MIT"
},
"node_modules/@textlint/fixer-formatter": {
- "version": "14.7.2",
- "resolved": "https://registry.npmjs.org/@textlint/fixer-formatter/-/fixer-formatter-14.7.2.tgz",
- "integrity": "sha512-KISSckKJD1JAHLy57D+EWRscp/GV7XM/nzPxRARpooIJyGlFNvg/VDkGDzU2ZitH63IduI5qdBxKzvbgk4OgdQ==",
+ "version": "14.8.0",
+ "resolved": "https://registry.npmjs.org/@textlint/fixer-formatter/-/fixer-formatter-14.8.0.tgz",
+ "integrity": "sha512-eDpH/GQrod3Jg4HNkXw4SclSWLX85snUhzhMo1wmYgI8inRaIzfd1sURRy6edEabd6y1kLImyFmYOx9U96ILQA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@textlint/module-interop": "^14.7.2",
- "@textlint/resolver": "^14.7.2",
- "@textlint/types": "^14.7.2",
+ "@textlint/module-interop": "^14.8.0",
+ "@textlint/resolver": "^14.8.0",
+ "@textlint/types": "^14.8.0",
"chalk": "^4.1.2",
- "debug": "^4.4.0",
+ "debug": "^4.4.1",
"diff": "^5.2.0",
"string-width": "^4.2.3",
"strip-ansi": "^6.0.1",
@@ -503,45 +526,45 @@
}
},
"node_modules/@textlint/kernel": {
- "version": "14.7.2",
- "resolved": "https://registry.npmjs.org/@textlint/kernel/-/kernel-14.7.2.tgz",
- "integrity": "sha512-sb2npadp7rsnrVvwv4Ia13/HcwZtVZnY04cJYnDOS6R4TthnYRyP55WF7ftB8GX1bw7FIY/NPvJN/UuWTKQ8XA==",
+ "version": "14.8.0",
+ "resolved": "https://registry.npmjs.org/@textlint/kernel/-/kernel-14.8.0.tgz",
+ "integrity": "sha512-AUy2qK7Z1pWBwtHjb3kdCwKjPo6M5SuS+e/Homvn77oUKXJVtJi4+HpDvVxTRZjW37LtYxIr/CyNhhNN8HAu4Q==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@textlint/ast-node-types": "^14.7.2",
- "@textlint/ast-tester": "^14.7.2",
- "@textlint/ast-traverse": "^14.7.2",
- "@textlint/feature-flag": "^14.7.2",
- "@textlint/source-code-fixer": "^14.7.2",
- "@textlint/types": "^14.7.2",
- "@textlint/utils": "^14.7.2",
- "debug": "^4.4.0",
+ "@textlint/ast-node-types": "^14.8.0",
+ "@textlint/ast-tester": "^14.8.0",
+ "@textlint/ast-traverse": "^14.8.0",
+ "@textlint/feature-flag": "^14.8.0",
+ "@textlint/source-code-fixer": "^14.8.0",
+ "@textlint/types": "^14.8.0",
+ "@textlint/utils": "^14.8.0",
+ "debug": "^4.4.1",
"fast-equals": "^4.0.3",
"structured-source": "^4.0.0"
}
},
"node_modules/@textlint/kernel/node_modules/@textlint/ast-node-types": {
- "version": "14.7.2",
- "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-14.7.2.tgz",
- "integrity": "sha512-3rZc9vD8y/DlcFe3Y/cyKRRVgBH4ElEUzVFYdRVDwoMSwV/cIyZgYzVG6ZuOItQt+cHSREuijuucZ4VqZynbtg==",
+ "version": "14.8.0",
+ "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-14.8.0.tgz",
+ "integrity": "sha512-CARGqRSX+DhHdSYssa6+Yb0KAk5cGPDOgKbJo/H8djJAmw7qNzo/oYbuYZlO/fqmUbZjZcvI/6QgCxa/78Nxew==",
"dev": true,
"license": "MIT"
},
"node_modules/@textlint/linter-formatter": {
- "version": "14.7.2",
- "resolved": "https://registry.npmjs.org/@textlint/linter-formatter/-/linter-formatter-14.7.2.tgz",
- "integrity": "sha512-QZOqft5uK+o/UN8UcEF3cHgfbG1r3+OWqlJojyjGNkEBbBNPSyDfYlVxDjHqnOAwm7jBaeqVGlwvw/7PUFmsmw==",
+ "version": "14.8.0",
+ "resolved": "https://registry.npmjs.org/@textlint/linter-formatter/-/linter-formatter-14.8.0.tgz",
+ "integrity": "sha512-xedTBR/rlVNS9Np5moxhWGwVWEY8Eg+MxkasZblEZgiGbuMhCiVNrSuvx8T6E/UFvFunQYc9oNIMylzAXtnx7A==",
"dev": true,
"license": "MIT",
"dependencies": {
"@azu/format-text": "^1.0.2",
"@azu/style-format": "^1.0.1",
- "@textlint/module-interop": "^14.7.2",
- "@textlint/resolver": "^14.7.2",
- "@textlint/types": "^14.7.2",
+ "@textlint/module-interop": "^14.8.0",
+ "@textlint/resolver": "^14.8.0",
+ "@textlint/types": "^14.8.0",
"chalk": "^4.1.2",
- "debug": "^4.4.0",
+ "debug": "^4.4.1",
"js-yaml": "^3.14.1",
"lodash": "^4.17.21",
"pluralize": "^2.0.0",
@@ -552,14 +575,14 @@
}
},
"node_modules/@textlint/markdown-to-ast": {
- "version": "14.7.2",
- "resolved": "https://registry.npmjs.org/@textlint/markdown-to-ast/-/markdown-to-ast-14.7.2.tgz",
- "integrity": "sha512-gfOQaBFoFVTj/9rzhEjnJonWZwWjM1RLmaO4J7GHIOFBAo/qr/EJRO3QijQWaAJFoH8xd/3cpUCEzpRwhwkeoA==",
+ "version": "14.8.0",
+ "resolved": "https://registry.npmjs.org/@textlint/markdown-to-ast/-/markdown-to-ast-14.8.0.tgz",
+ "integrity": "sha512-KxvogGH8BPfR4eP5TNlRiR7KcPWzFjk1k8TX0WBnqWTzQeYbDYulYslVyiq06qc1NkTHvpK34zbS8UWZyzIQKA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@textlint/ast-node-types": "^14.7.2",
- "debug": "^4.4.0",
+ "@textlint/ast-node-types": "^14.8.0",
+ "debug": "^4.4.1",
"mdast-util-gfm-autolink-literal": "^0.1.3",
"neotraverse": "^0.6.15",
"remark-footnotes": "^3.0.0",
@@ -570,9 +593,9 @@
}
},
"node_modules/@textlint/markdown-to-ast/node_modules/@textlint/ast-node-types": {
- "version": "14.7.2",
- "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-14.7.2.tgz",
- "integrity": "sha512-3rZc9vD8y/DlcFe3Y/cyKRRVgBH4ElEUzVFYdRVDwoMSwV/cIyZgYzVG6ZuOItQt+cHSREuijuucZ4VqZynbtg==",
+ "version": "14.8.0",
+ "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-14.8.0.tgz",
+ "integrity": "sha512-CARGqRSX+DhHdSYssa6+Yb0KAk5cGPDOgKbJo/H8djJAmw7qNzo/oYbuYZlO/fqmUbZjZcvI/6QgCxa/78Nxew==",
"dev": true,
"license": "MIT"
},
@@ -819,88 +842,88 @@
}
},
"node_modules/@textlint/module-interop": {
- "version": "14.7.2",
- "resolved": "https://registry.npmjs.org/@textlint/module-interop/-/module-interop-14.7.2.tgz",
- "integrity": "sha512-rDQhFERa2+xMqhyrPFvAL9d5Tb4RpQGKQExwrezvtCTREh6Zsp/nKxtK0r6o0P9xn1+zq2sZHW9NZjpe7av3xw==",
+ "version": "14.8.0",
+ "resolved": "https://registry.npmjs.org/@textlint/module-interop/-/module-interop-14.8.0.tgz",
+ "integrity": "sha512-SGeojZIpjP58RrnUAIjKO5xokloHfXJWcc3dh/QP9pDHRCI97yPJhyEXzOD3FiY9zFG2KNIYwUTyrIGnnBm9xQ==",
"dev": true,
"license": "MIT"
},
"node_modules/@textlint/resolver": {
- "version": "14.7.2",
- "resolved": "https://registry.npmjs.org/@textlint/resolver/-/resolver-14.7.2.tgz",
- "integrity": "sha512-FCZa9XJx5KihK/4gxXLhS/KfOnBD6vD5UxAMtgrvbifn+JFrW9Kh17uZLCcuJDDJJCnZOHq8jdT7AU+rpmJZ+w==",
+ "version": "14.8.0",
+ "resolved": "https://registry.npmjs.org/@textlint/resolver/-/resolver-14.8.0.tgz",
+ "integrity": "sha512-FUrXlwbfLxSUvgjOG/OgDV56m0IBBswcOEoex8cXAE1677ejAAWrI9WqzuBItX5g+srh5is3Vth4D6H8iuyLAg==",
"dev": true,
"license": "MIT"
},
"node_modules/@textlint/source-code-fixer": {
- "version": "14.7.2",
- "resolved": "https://registry.npmjs.org/@textlint/source-code-fixer/-/source-code-fixer-14.7.2.tgz",
- "integrity": "sha512-1aWxLIzUIYq9pnrHx7NT7huNbdMONBGORrxYNFC6yIAlSjPo4j44yZabaOMTxjGTPMOvFTUVl2gXTUYqygBGOA==",
+ "version": "14.8.0",
+ "resolved": "https://registry.npmjs.org/@textlint/source-code-fixer/-/source-code-fixer-14.8.0.tgz",
+ "integrity": "sha512-/BtG3IRpmUG3A0Pr2wra2uY0d4sjmESeJlYn++ZlP8eYNYM9jotWsdb9K+fa1jMX4OzozKv1nOewhSfo/AD6Cw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@textlint/types": "^14.7.2",
- "debug": "^4.4.0"
+ "@textlint/types": "^14.8.0",
+ "debug": "^4.4.1"
}
},
"node_modules/@textlint/text-to-ast": {
- "version": "14.7.2",
- "resolved": "https://registry.npmjs.org/@textlint/text-to-ast/-/text-to-ast-14.7.2.tgz",
- "integrity": "sha512-8+4WvYnaDR0F7gDszhs9iCQp5kbbEQ9itbvQHcFDhHi4XCDksWdrQz6XJ+Kw/zbLUEz9QtvoXZ1VjZRiwgtTIg==",
+ "version": "14.8.0",
+ "resolved": "https://registry.npmjs.org/@textlint/text-to-ast/-/text-to-ast-14.8.0.tgz",
+ "integrity": "sha512-/U8k2Y6azqeKJnEJej2b8dylqKZw4tSqsOlfeI82qslDEjjdtseuzbLz7Z0X/VgWmbnqxrt1y/ZsLaThhOntuQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@textlint/ast-node-types": "^14.7.2"
+ "@textlint/ast-node-types": "^14.8.0"
}
},
"node_modules/@textlint/text-to-ast/node_modules/@textlint/ast-node-types": {
- "version": "14.7.2",
- "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-14.7.2.tgz",
- "integrity": "sha512-3rZc9vD8y/DlcFe3Y/cyKRRVgBH4ElEUzVFYdRVDwoMSwV/cIyZgYzVG6ZuOItQt+cHSREuijuucZ4VqZynbtg==",
+ "version": "14.8.0",
+ "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-14.8.0.tgz",
+ "integrity": "sha512-CARGqRSX+DhHdSYssa6+Yb0KAk5cGPDOgKbJo/H8djJAmw7qNzo/oYbuYZlO/fqmUbZjZcvI/6QgCxa/78Nxew==",
"dev": true,
"license": "MIT"
},
"node_modules/@textlint/textlint-plugin-markdown": {
- "version": "14.7.2",
- "resolved": "https://registry.npmjs.org/@textlint/textlint-plugin-markdown/-/textlint-plugin-markdown-14.7.2.tgz",
- "integrity": "sha512-s6CR68bK9Y/+c0jvM+9oDT5LgvgRbP2A8IzPwuGVhqwFQBJmrSdG4KvBN4ycsq+h3EACTCeyv9bN9no0td9vgw==",
+ "version": "14.8.0",
+ "resolved": "https://registry.npmjs.org/@textlint/textlint-plugin-markdown/-/textlint-plugin-markdown-14.8.0.tgz",
+ "integrity": "sha512-BDjcoBfv+Vxg83/GrTg9XK4wKIuZb7x85gLmRqlsy48Lj5l++AIk5qe/iL1hI38PDr8IfY8JRYvfMpyn+KGuNA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@textlint/markdown-to-ast": "^14.7.2"
+ "@textlint/markdown-to-ast": "^14.8.0"
}
},
"node_modules/@textlint/textlint-plugin-text": {
- "version": "14.7.2",
- "resolved": "https://registry.npmjs.org/@textlint/textlint-plugin-text/-/textlint-plugin-text-14.7.2.tgz",
- "integrity": "sha512-ZtO/i4cZ+y9j7KqsP8P3cbj/XpUDMyedkV+fQP8DkJb238vJ/EUrW8wBwvIq0BmGe7DKIgIl3WeFp8AKxNw7aw==",
+ "version": "14.8.0",
+ "resolved": "https://registry.npmjs.org/@textlint/textlint-plugin-text/-/textlint-plugin-text-14.8.0.tgz",
+ "integrity": "sha512-fg2382TsRL7FiWxatvr3VNyjIQqMTRIqFkuPjBSb8HjC5xabi5s2ZU8Z0O58SBN9YWpihcTP+N84W5l5iU784g==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@textlint/text-to-ast": "^14.7.2"
+ "@textlint/text-to-ast": "^14.8.0"
}
},
"node_modules/@textlint/types": {
- "version": "14.7.2",
- "resolved": "https://registry.npmjs.org/@textlint/types/-/types-14.7.2.tgz",
- "integrity": "sha512-VpsmtJf9+7cnIxmKtAVVGVzI6f2k09kBZnzjdTAO8JZ+HTmV46jeoVrotpSfQbWDpuQk2UFPfrsZL/LNf/99ew==",
+ "version": "14.8.0",
+ "resolved": "https://registry.npmjs.org/@textlint/types/-/types-14.8.0.tgz",
+ "integrity": "sha512-Lsq2gxh2pmCKV6KN4fL70DMNNGuZlPuDQ0RHLU59/wgUs5krzrpHWCRYHK4M4J45U1PfZzQnWvLIfFETlR9GPA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@textlint/ast-node-types": "^14.7.2"
+ "@textlint/ast-node-types": "^14.8.0"
}
},
"node_modules/@textlint/types/node_modules/@textlint/ast-node-types": {
- "version": "14.7.2",
- "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-14.7.2.tgz",
- "integrity": "sha512-3rZc9vD8y/DlcFe3Y/cyKRRVgBH4ElEUzVFYdRVDwoMSwV/cIyZgYzVG6ZuOItQt+cHSREuijuucZ4VqZynbtg==",
+ "version": "14.8.0",
+ "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-14.8.0.tgz",
+ "integrity": "sha512-CARGqRSX+DhHdSYssa6+Yb0KAk5cGPDOgKbJo/H8djJAmw7qNzo/oYbuYZlO/fqmUbZjZcvI/6QgCxa/78Nxew==",
"dev": true,
"license": "MIT"
},
"node_modules/@textlint/utils": {
- "version": "14.7.2",
- "resolved": "https://registry.npmjs.org/@textlint/utils/-/utils-14.7.2.tgz",
- "integrity": "sha512-NMLtiALWVYtl/zqRB0GIw3CJLNSV5bq8u35v1qaJOLrWhBVxOkbWISItHhQGndCalHTt8uYkntHXYKpk0oSPtQ==",
+ "version": "14.8.0",
+ "resolved": "https://registry.npmjs.org/@textlint/utils/-/utils-14.8.0.tgz",
+ "integrity": "sha512-ZYZuyPl7EW1Tio/jfjf92MFgPwrQ6nklir5uCJAwrdl9Me/9rL7l3n8HlFHc8Z7dPNeqUbDuOLgoS+74coZplA==",
"dev": true,
"license": "MIT"
},
@@ -1007,17 +1030,31 @@
"node": "^14.17.0 || ^16.13.0 || >=18.0.0"
}
},
- "node_modules/ajv": {
- "version": "8.17.1",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
- "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
+ "node_modules/accepts": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz",
+ "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==",
"dev": true,
"license": "MIT",
"dependencies": {
- "fast-deep-equal": "^3.1.3",
- "fast-uri": "^3.0.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2"
+ "mime-types": "^3.0.0",
+ "negotiator": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
},
"funding": {
"type": "github",
@@ -1126,6 +1163,27 @@
"node": ">=8"
}
},
+ "node_modules/body-parser": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz",
+ "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "^3.1.2",
+ "content-type": "^1.0.5",
+ "debug": "^4.4.0",
+ "http-errors": "^2.0.0",
+ "iconv-lite": "^0.6.3",
+ "on-finished": "^2.4.1",
+ "qs": "^6.14.0",
+ "raw-body": "^3.0.0",
+ "type-is": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
"node_modules/boundary": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/boundary/-/boundary-2.0.0.tgz",
@@ -1174,6 +1232,16 @@
"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
"dev": true
},
+ "node_modules/bytes": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
"node_modules/cacheable": {
"version": "1.8.7",
"resolved": "https://registry.npmjs.org/cacheable/-/cacheable-1.8.7.tgz",
@@ -1184,6 +1252,37 @@
"keyv": "^5.2.3"
}
},
+ "node_modules/call-bind-apply-helpers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/call-bound": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
+ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "get-intrinsic": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/ccount": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz",
@@ -1358,11 +1457,69 @@
"typedarray": "^0.0.6"
}
},
- "node_modules/cross-spawn": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
- "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "node_modules/content-disposition": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz",
+ "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==",
"dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "5.2.1"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/content-type": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/cookie": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
+ "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/cookie-signature": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz",
+ "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.6.0"
+ }
+ },
+ "node_modules/cors": {
+ "version": "2.8.5",
+ "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
+ "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "object-assign": "^4",
+ "vary": "^1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
"path-key": "^3.1.0",
"shebang-command": "^2.0.0",
@@ -1382,10 +1539,11 @@
}
},
"node_modules/debug": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
- "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz",
+ "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"ms": "^2.1.3"
},
@@ -1417,6 +1575,16 @@
"integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
"dev": true
},
+ "node_modules/depd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
"node_modules/dequal": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
@@ -1449,18 +1617,50 @@
"node": ">=0.3.1"
}
},
+ "node_modules/dunder-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/eastasianwidth": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
"integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
"dev": true
},
+ "node_modules/ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
"dev": true
},
+ "node_modules/encodeurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
+ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
"node_modules/error-ex": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
@@ -1470,6 +1670,46 @@
"is-arrayish": "^0.2.1"
}
},
+ "node_modules/es-define-property": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-object-atoms": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/escape-string-regexp": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
@@ -1497,6 +1737,98 @@
"node": ">=4"
}
},
+ "node_modules/etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/eventsource": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz",
+ "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "eventsource-parser": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/eventsource-parser": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.2.tgz",
+ "integrity": "sha512-6RxOBZ/cYgd8usLwsEl+EC09Au/9BcmCKYF2/xbml6DNczf7nv0MQb+7BA2F+li6//I+28VNlQR37XfQtcAJuA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/express": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz",
+ "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "accepts": "^2.0.0",
+ "body-parser": "^2.2.0",
+ "content-disposition": "^1.0.0",
+ "content-type": "^1.0.5",
+ "cookie": "^0.7.1",
+ "cookie-signature": "^1.2.1",
+ "debug": "^4.4.0",
+ "encodeurl": "^2.0.0",
+ "escape-html": "^1.0.3",
+ "etag": "^1.8.1",
+ "finalhandler": "^2.1.0",
+ "fresh": "^2.0.0",
+ "http-errors": "^2.0.0",
+ "merge-descriptors": "^2.0.0",
+ "mime-types": "^3.0.0",
+ "on-finished": "^2.4.1",
+ "once": "^1.4.0",
+ "parseurl": "^1.3.3",
+ "proxy-addr": "^2.0.7",
+ "qs": "^6.14.0",
+ "range-parser": "^1.2.1",
+ "router": "^2.2.0",
+ "send": "^1.1.0",
+ "serve-static": "^2.2.0",
+ "statuses": "^2.0.1",
+ "type-is": "^2.0.1",
+ "vary": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/express-rate-limit": {
+ "version": "7.5.0",
+ "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.0.tgz",
+ "integrity": "sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/express-rate-limit"
+ },
+ "peerDependencies": {
+ "express": "^4.11 || 5 || ^5.0.0-beta.1"
+ }
+ },
"node_modules/extend": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
@@ -1517,6 +1849,13 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/fast-levenshtein": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
@@ -1574,6 +1913,24 @@
"node": ">=8"
}
},
+ "node_modules/finalhandler": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz",
+ "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.4.0",
+ "encodeurl": "^2.0.0",
+ "escape-html": "^1.0.3",
+ "on-finished": "^2.4.1",
+ "parseurl": "^1.3.3",
+ "statuses": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
"node_modules/find-up": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
@@ -1628,6 +1985,26 @@
"node": ">=0.4.x"
}
},
+ "node_modules/forwarded": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/fresh": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz",
+ "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
"node_modules/fsevents": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
@@ -1643,10 +2020,53 @@
}
},
"node_modules/function-bind": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
- "dev": true
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "function-bind": "^1.1.2",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
},
"node_modules/glob-parent": {
"version": "5.1.2",
@@ -1660,6 +2080,19 @@
"node": ">= 6"
}
},
+ "node_modules/gopd": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/graceful-fs": {
"version": "4.2.11",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
@@ -1688,6 +2121,32 @@
"node": ">=8"
}
},
+ "node_modules/has-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/hookified": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/hookified/-/hookified-1.6.0.tgz",
@@ -1700,6 +2159,46 @@
"integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
"dev": true
},
+ "node_modules/http-errors": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
+ "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "depd": "2.0.0",
+ "inherits": "2.0.4",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "toidentifier": "1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/http-errors/node_modules/statuses": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/ieee754": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
@@ -1754,6 +2253,16 @@
"node": "^14.17.0 || ^16.13.0 || >=18.0.0"
}
},
+ "node_modules/ipaddr.js": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
"node_modules/is-alphabetical": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz",
@@ -1895,6 +2404,13 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/is-promise": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz",
+ "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/is-utf8": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
@@ -1961,9 +2477,9 @@
}
},
"node_modules/json-schema-traverse": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
"dev": true,
"license": "MIT"
},
@@ -2124,6 +2640,16 @@
"url": "https://github.com/sponsors/wooorm"
}
},
+ "node_modules/math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/md5": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz",
@@ -3051,6 +3577,29 @@
"@types/unist": "*"
}
},
+ "node_modules/media-typer": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz",
+ "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/merge-descriptors": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz",
+ "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/micromark": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz",
@@ -3735,6 +4284,29 @@
}
]
},
+ "node_modules/mime-db": {
+ "version": "1.54.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
+ "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz",
+ "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "^1.54.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
"node_modules/minimist": {
"version": "1.2.8",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
@@ -3777,6 +4349,16 @@
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
"dev": true
},
+ "node_modules/negotiator": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz",
+ "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
"node_modules/neotraverse": {
"version": "0.6.18",
"resolved": "https://registry.npmjs.org/neotraverse/-/neotraverse-0.6.18.tgz",
@@ -3832,6 +4414,52 @@
"node": "^14.17.0 || ^16.13.0 || >=18.0.0"
}
},
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-inspect": {
+ "version": "1.13.4",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/on-finished": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ee-first": "1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
"node_modules/optionator": {
"version": "0.9.3",
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz",
@@ -3930,6 +4558,16 @@
"node": ">=0.10.0"
}
},
+ "node_modules/parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
"node_modules/path-exists": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
@@ -3982,6 +4620,16 @@
"integrity": "sha512-tmciSlVyHnX0LC86+zSr+0LURw9rDPw8ilhXcmTpVUOnI6OsKdCzXQs5fTG10Bjz26IBdnKL3XIaP+QvGsk5YQ==",
"dev": true
},
+ "node_modules/path-to-regexp": {
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz",
+ "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=16"
+ }
+ },
"node_modules/path-type": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
@@ -4038,6 +4686,16 @@
"node": ">=0.10.0"
}
},
+ "node_modules/pkce-challenge": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.0.tgz",
+ "integrity": "sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=16.20.0"
+ }
+ },
"node_modules/pluralize": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/pluralize/-/pluralize-2.0.0.tgz",
@@ -4063,6 +4721,46 @@
"node": "^14.17.0 || ^16.13.0 || >=18.0.0"
}
},
+ "node_modules/proxy-addr": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
+ "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "forwarded": "0.2.0",
+ "ipaddr.js": "1.9.1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/qs": {
+ "version": "6.14.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz",
+ "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "side-channel": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/quotation": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/quotation/-/quotation-2.0.3.tgz",
@@ -4073,6 +4771,32 @@
"url": "https://github.com/sponsors/wooorm"
}
},
+ "node_modules/range-parser": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/raw-body": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz",
+ "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "3.1.2",
+ "http-errors": "2.0.0",
+ "iconv-lite": "0.6.3",
+ "unpipe": "1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
"node_modules/rc-config-loader": {
"version": "4.1.3",
"resolved": "https://registry.npmjs.org/rc-config-loader/-/rc-config-loader-4.1.3.tgz",
@@ -5800,6 +6524,23 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/router": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz",
+ "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.4.0",
+ "depd": "^2.0.0",
+ "is-promise": "^4.0.0",
+ "parseurl": "^1.3.3",
+ "path-to-regexp": "^8.0.0"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
"node_modules/safe-buffer": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
@@ -5820,6 +6561,13 @@
}
]
},
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/semver": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
@@ -5829,6 +6577,52 @@
"semver": "bin/semver"
}
},
+ "node_modules/send": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz",
+ "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.3.5",
+ "encodeurl": "^2.0.0",
+ "escape-html": "^1.0.3",
+ "etag": "^1.8.1",
+ "fresh": "^2.0.0",
+ "http-errors": "^2.0.0",
+ "mime-types": "^3.0.1",
+ "ms": "^2.1.3",
+ "on-finished": "^2.4.1",
+ "range-parser": "^1.2.1",
+ "statuses": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/serve-static": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz",
+ "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "encodeurl": "^2.0.0",
+ "escape-html": "^1.0.3",
+ "parseurl": "^1.3.3",
+ "send": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/setprototypeof": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
+ "dev": true,
+ "license": "ISC"
+ },
"node_modules/shebang-command": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
@@ -5850,6 +6644,82 @@
"node": ">=8"
}
},
+ "node_modules/side-channel": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
+ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3",
+ "side-channel-list": "^1.0.0",
+ "side-channel-map": "^1.0.1",
+ "side-channel-weakmap": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-list": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
+ "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-map": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-weakmap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3",
+ "side-channel-map": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/signal-exit": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
@@ -5929,6 +6799,16 @@
"dev": true,
"license": "BSD-3-Clause"
},
+ "node_modules/statuses": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
+ "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
"node_modules/string_decoder": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
@@ -6091,6 +6971,30 @@
"node": ">=10.0.0"
}
},
+ "node_modules/table/node_modules/ajv": {
+ "version": "8.17.1",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
+ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/table/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/text-table": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
@@ -6098,26 +7002,27 @@
"dev": true
},
"node_modules/textlint": {
- "version": "14.7.2",
- "resolved": "https://registry.npmjs.org/textlint/-/textlint-14.7.2.tgz",
- "integrity": "sha512-SRff/IHVonktwTMm0momjMZeh0WTPWbQR0S0NXHoU7MUwLM9e4VJeQvkq7V0d37GiM1WfXJSkbaTVidOhOE+0Q==",
+ "version": "14.8.0",
+ "resolved": "https://registry.npmjs.org/textlint/-/textlint-14.8.0.tgz",
+ "integrity": "sha512-1+Y78J7b509CagmxxhceRRF99KXNuUBjstMIGc2pp/CkjY/vdr6s1AObWMiiWF7asm3UFmgfqMxl+tNIlvuT5Q==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@textlint/ast-node-types": "^14.7.2",
- "@textlint/ast-traverse": "^14.7.2",
- "@textlint/config-loader": "^14.7.2",
- "@textlint/feature-flag": "^14.7.2",
- "@textlint/fixer-formatter": "^14.7.2",
- "@textlint/kernel": "^14.7.2",
- "@textlint/linter-formatter": "^14.7.2",
- "@textlint/module-interop": "^14.7.2",
- "@textlint/resolver": "^14.7.2",
- "@textlint/textlint-plugin-markdown": "^14.7.2",
- "@textlint/textlint-plugin-text": "^14.7.2",
- "@textlint/types": "^14.7.2",
- "@textlint/utils": "^14.7.2",
- "debug": "^4.4.0",
+ "@modelcontextprotocol/sdk": "^1.12.1",
+ "@textlint/ast-node-types": "^14.8.0",
+ "@textlint/ast-traverse": "^14.8.0",
+ "@textlint/config-loader": "^14.8.0",
+ "@textlint/feature-flag": "^14.8.0",
+ "@textlint/fixer-formatter": "^14.8.0",
+ "@textlint/kernel": "^14.8.0",
+ "@textlint/linter-formatter": "^14.8.0",
+ "@textlint/module-interop": "^14.8.0",
+ "@textlint/resolver": "^14.8.0",
+ "@textlint/textlint-plugin-markdown": "^14.8.0",
+ "@textlint/textlint-plugin-text": "^14.8.0",
+ "@textlint/types": "^14.8.0",
+ "@textlint/utils": "^14.8.0",
+ "debug": "^4.4.1",
"file-entry-cache": "^10.0.5",
"glob": "^10.4.5",
"md5": "^2.3.0",
@@ -6128,7 +7033,8 @@
"read-pkg": "^1.1.0",
"read-pkg-up": "^3.0.0",
"structured-source": "^4.0.0",
- "unique-concat": "^0.2.2"
+ "unique-concat": "^0.2.2",
+ "zod": "^3.25.56"
},
"bin": {
"textlint": "bin/textlint.js"
@@ -6240,9 +7146,9 @@
}
},
"node_modules/textlint/node_modules/@textlint/ast-node-types": {
- "version": "14.7.2",
- "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-14.7.2.tgz",
- "integrity": "sha512-3rZc9vD8y/DlcFe3Y/cyKRRVgBH4ElEUzVFYdRVDwoMSwV/cIyZgYzVG6ZuOItQt+cHSREuijuucZ4VqZynbtg==",
+ "version": "14.8.0",
+ "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-14.8.0.tgz",
+ "integrity": "sha512-CARGqRSX+DhHdSYssa6+Yb0KAk5cGPDOgKbJo/H8djJAmw7qNzo/oYbuYZlO/fqmUbZjZcvI/6QgCxa/78Nxew==",
"dev": true,
"license": "MIT"
},
@@ -6317,6 +7223,16 @@
"node": ">=8.0"
}
},
+ "node_modules/toidentifier": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
"node_modules/trough": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz",
@@ -6351,6 +7267,21 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/type-is": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz",
+ "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "content-type": "^1.0.5",
+ "media-typer": "^1.1.0",
+ "mime-types": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
"node_modules/typedarray": {
"version": "0.0.6",
"resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
@@ -6867,6 +7798,26 @@
"url": "https://opencollective.com/unified"
}
},
+ "node_modules/unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
"node_modules/util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
@@ -6883,6 +7834,16 @@
"spdx-expression-parse": "^3.0.0"
}
},
+ "node_modules/vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
"node_modules/vfile": {
"version": "5.3.7",
"resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz",
@@ -7370,6 +8331,13 @@
"url": "https://github.com/chalk/strip-ansi?sponsor=1"
}
},
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "dev": true,
+ "license": "ISC"
+ },
"node_modules/yallist": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
@@ -7385,6 +8353,26 @@
"node": ">= 14"
}
},
+ "node_modules/zod": {
+ "version": "3.25.57",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.57.tgz",
+ "integrity": "sha512-6tgzLuwVST5oLUxXTmBqoinKMd3JeesgbgseXeFasKKj8Q1FCZrHnbqJOyiEvr4cVAlbug+CgIsmJ8cl/pU5FA==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
+ },
+ "node_modules/zod-to-json-schema": {
+ "version": "3.24.5",
+ "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.5.tgz",
+ "integrity": "sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==",
+ "dev": true,
+ "license": "ISC",
+ "peerDependencies": {
+ "zod": "^3.24.1"
+ }
+ },
"node_modules/zwitch": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz",
diff --git a/package.json b/package.json
index ea593d5a90e..f50cfc51812 100644
--- a/package.json
+++ b/package.json
@@ -15,7 +15,7 @@
"remark-lint-prohibited-strings": "^4.0.0",
"remark-lint-unordered-list-marker-style": "^4.0.1",
"remark-stringify": "^11.0.0",
- "textlint": "^14.7.2",
+ "textlint": "^14.8.0",
"textlint-filter-rule-comments": "^1.2.2",
"textlint-rule-common-misspellings": "^1.0.1",
"textlint-rule-terminology": "^5.0.13"
diff --git a/source/_docs/authentication/providers.markdown b/source/_docs/authentication/providers.markdown
index a2bf1ede505..b50e46d9f6a 100644
--- a/source/_docs/authentication/providers.markdown
+++ b/source/_docs/authentication/providers.markdown
@@ -161,7 +161,7 @@ Assuming you have only the owner created though onboarding process, no other use
The command line auth provider executes a configurable shell command to perform user authentication. Two environment variables, `username` and `password`, are passed to the command. Access is granted when the command exits successfully (with exit code 0).
-This provider can be used to integrate Home Assistant with arbitrary external authentication services, from plaintext databases over LDAP to RADIUS. A compatible script for LDAP authentication is [this one](https://github.com/bob1de/ldap-auth-sh), for instance. Please note, this will only work when using the Home Assistant Core installation type.
+This provider can be used to integrate Home Assistant with arbitrary external authentication services, from plaintext databases over LDAP to RADIUS.
Here is a configuration example:
diff --git a/source/_docs/blueprint/schema.markdown b/source/_docs/blueprint/schema.markdown
index 02b44b173cb..602caef5a82 100644
--- a/source/_docs/blueprint/schema.markdown
+++ b/source/_docs/blueprint/schema.markdown
@@ -16,16 +16,18 @@ related:
## The blueprint schema
+Blueprint schemas currently supports three types of schema depending on its domain: [`automation`](/docs/automation/yaml/); `script`; and [`template`](/integrations/template/#using-blueprints).
+
The configuration schema of a blueprint consists of 2 parts:
-1. The blueprint's high-level metadata: name, description, the input required from the user.
-2. The schema of the thing the blueprint describes.
+1. The blueprint's high-level metadata: name, domain and, optionally, any input required from the user.
+2. The schema for the blueprint domain it describes.
The first part is referred to as the *blueprint schema*. It contains the
blueprint's metadata.
-The only requirement for a blueprint is a name. In its most basic form,
-a blueprint would look like:
+Minimum required metadata for a blueprint is its name and domain. In its most basic form,
+a blueprint looks like:
```yaml
blueprint:
@@ -35,10 +37,9 @@ blueprint:
Although this is a valid blueprint, it is not very useful.
-The second part depends on the use case of the blueprint. For example, if you create a blueprint for an automation, the full
+The second part depends on its domain, the type of blueprint. For example, when creating a blueprint for an automation, the full
schema for an [automation](/docs/automation/yaml/) applies.
-You can add a description of the blueprint's use case and user inputs.
This is the full blueprint schema:
@@ -50,13 +51,13 @@ name:
description:
description: >
The description of the blueprint. While optional, this field is highly
- recommended. Describe what the blueprint does and describe the inputs the blueprint provide. The description can
+ recommended. Describe what the blueprint does and describe the inputs the blueprint requires. The description can
include [Markdown](https://commonmark.org/help/).
type: string
required: false
domain:
description: >
- The domain in which this blueprint is used. Currently, only
+ The domain in which this blueprint is used. Currently, only three types,
[`automation`](/docs/automation/yaml/), `script` and [`template`](/integrations/template/#using-blueprints) are supported.
type: string
required: true
@@ -66,7 +67,7 @@ author:
required: false
homeassistant:
description: >
- Home Assistant requirements to be able to use the blueprint successfully.
+ Home Assistant version required for the blueprint to work successfully.
type: map
required: false
keys:
@@ -90,10 +91,9 @@ input:
### Blueprint inputs
-As described above, a blueprint can accept one (or multiple)
-inputs from the blueprint user.
+A blueprint can accept one or multiple inputs from the user, but does not require any input.
-These inputs can be of any type (string, boolean, list, dictionary). They can have
+These inputs can be of any type (string, boolean, list, map). They can have
a default value and also provide a [selector](/docs/blueprint/selectors/) that
ensures a matching input field in the user interface.
@@ -126,9 +126,9 @@ A blueprint input has the following configuration:
{% endconfiguration %}
Each input field can be referred to, outside of the blueprint metadata, using
-the `!input` custom YAML tag.
+the `!input` custom YAML tag before its name.
-The following example shows a minimal blueprint with a single input:
+The following example shows a minimal *blueprint schema* with a single input:
```yaml
blueprint:
@@ -161,7 +161,7 @@ A section is differentiated from an input by the presence of an additional `inpu
Input sections are a new feature in version 2024.6.0. Set the `min_version` for the blueprint to at least this version if using input sections. Otherwise, the blueprint will generate errors on older versions. See [this section](/docs/blueprint/schema/#min_version) for more details.
{% endcaution %}
-The full configuration for a section is below:
+The full configuration for an input section is below:
{% configuration %}
@@ -194,7 +194,7 @@ input:
-The following example shows a blueprint with some inputs in a section:
+The following example shows a *blueprint schema* with some inputs in a section:
```yaml
blueprint:
@@ -232,7 +232,8 @@ variables:
The [built-in blueprints][blueprint-built-in]
are great examples to get a bit of a feeling of how blueprints work.
-Here is the built-in motion light automation blueprint:
+Here is the built-in motion light automation blueprint.
+Note the *blueprint schema* under the blueprint key is followed by its domain schema. In this example, an automation schema.
```yaml
blueprint:
diff --git a/source/_docs/configuration/templating.markdown b/source/_docs/configuration/templating.markdown
index cc6f0f60ccd..dfbc473f02f 100644
--- a/source/_docs/configuration/templating.markdown
+++ b/source/_docs/configuration/templating.markdown
@@ -52,8 +52,8 @@ There are a few very important rules to remember when adding templates to YAML:
1. You **must** surround single-line templates with double quotes (`"`) or single quotes (`'`).
2. It is advised that you prepare for undefined variables by using `if ... is not none` or the [`default` filter](https://jinja.palletsprojects.com/en/latest/templates/#jinja-filters.default), or both.
-3. It is advised that when comparing numbers, you convert the number(s) to a [`float`](https://jinja.palletsprojects.com/en/latest/templates/#float) or an [`int`](https://jinja.palletsprojects.com/en/latest/templates/#int) by using the respective [filter](https://jinja.palletsprojects.com/en/latest/templates/#list-of-builtin-filters).
-4. While the [`float`](https://jinja.palletsprojects.com/en/latest/templates/#float) and [`int`](https://jinja.palletsprojects.com/en/latest/templates/#int) filters do allow a default fallback value if the conversion is unsuccessful, they do not provide the ability to catch undefined variables.
+3. It is advised that when comparing numbers, you convert the number(s) to a [`float`](https://jinja.palletsprojects.com/en/latest/templates/#jinja-filters.float) or an [`int`](https://jinja.palletsprojects.com/en/latest/templates/#jinja-filters.int) by using the respective [filter](https://jinja.palletsprojects.com/en/latest/templates/#list-of-builtin-filters).
+4. While the [`float`](https://jinja.palletsprojects.com/en/latest/templates/#jinja-filters.float) and [`int`](https://jinja.palletsprojects.com/en/latest/templates/#jinja-filters.int) filters do allow a default fallback value if the conversion is unsuccessful, they do not provide the ability to catch undefined variables.
Remembering these simple rules will help save you from many headaches and endless hours of frustration when using automation templates.
diff --git a/source/_includes/asides/component_navigation.html b/source/_includes/asides/component_navigation.html
index 0f2198ebdcb..33995c96ee0 100644
--- a/source/_includes/asides/component_navigation.html
+++ b/source/_includes/asides/component_navigation.html
@@ -69,13 +69,11 @@
{%- endif -%}
{% if page.works_with %}
- {%- for type in page.works_with -%}
-
- {%- endfor -%}
+
{%- endif -%}
{% if page.ha_domain %}
diff --git a/source/_includes/common-tasks/update.md b/source/_includes/common-tasks/update.md
index 19c6f7cc2dc..bacdb23648f 100644
--- a/source/_includes/common-tasks/update.md
+++ b/source/_includes/common-tasks/update.md
@@ -1,9 +1,12 @@
-Best practice for updating Home Assistant Core:
+#### Prerequisites
1. [Back up your installation](/common-tasks/general/#backups) and store the backup and the [backup emergency kit](/more-info/backup-emergency-kit/) somewhere safe.
- This ensures that you can [restore your installation from backup](/common-tasks/general/#restoring-a-backup) if needed.
2. Check the release notes for backward-incompatible changes on [Home Assistant release notes](/blog/categories/core/). Be sure to check all release notes between the version you are running and the one you are upgrading to. Use the search function in your browser (`CTRL + f` / `CMD + f`) and search for **Backward-incompatible changes**.
-3. To update Home Assistant Core, choose one of the following options.
+
+#### To update Home Assistant Core
+
+To update Home Assistant Core, choose one of the following options.
{% if page.installation == "os" %}
@@ -20,6 +23,10 @@ Best practice for updating Home Assistant Core:
- Go to {% my updates title="**System** > **Updates**" %}.
- Select the update notification.
- Select the cogwheel {% icon "mdi:cog-outline" %}, then set **Visible** to active.
+ 4. Open the notification for the component you want to update.
+ 5. If you want to backup the system first (recommended), enable the backup toggle.
+ 6. Select **Update**.
+ 7. After the update completed, check if there are any repair issues and check the logs to see if there are any issues with your configuration that need to be addressed.
- title: Using the CLI
content: |
@@ -57,6 +64,7 @@ Best practice for updating Home Assistant Core:
{% endtabbed_block %}
+After the update, check if there are any repair issues and check the logs to see if there are any issues with your configuration that need to be addressed.
+
{% endif %}
-4. Check if there are any repair issues and check the logs to see if there are any issues with your configuration that need to be addressed.
diff --git a/source/_includes/custom/news.html b/source/_includes/custom/news.html
index 5610e459f6f..1afa2c24901 100644
--- a/source/_includes/custom/news.html
+++ b/source/_includes/custom/news.html
@@ -1,13 +1,6 @@
-
-
-
-
{% assign releases_post_limit = 2 %}
{% assign blog_post_limit = 4 %}
@@ -37,33 +30,40 @@
-
-
-
{% icon "mdi:newspaper-variant-multiple" %} Recent Blog Posts
-
-
- {% assign current = 0 %}
-
- {% for post in site.posts %}
- {% if post.categories contains "Release-Notes" %}
- {% else %}
- {% assign current = current | plus: 1 %}
-
- {% if current > blog_post_limit %}
- {% break %}
- {% endif %}
-
- {% assign post_date = post.date | date: "%Y-%m-%d" %}
- {% assign post_date_formatted = post_date | date: "%B %d, %Y" %}
- {% assign post.date_formatted = post_date_formatted %}
- -
- {{ post.title }}
- {{ post.date_formatted }}
-
+
+
+
{% icon "mdi:newspaper-variant-multiple" %} Recent Blog Posts
+
+
+ {% assign current = 0 %}
+
+ {% for post in site.posts %}
+ {% if post.categories contains "Release-Notes" %}
+ {% else %}
+ {% assign current = current | plus: 1 %}
+
+ {% if current > blog_post_limit %}
+ {% break %}
{% endif %}
- {% endfor %}
-
-
+
+ {% assign post_date = post.date | date: "%Y-%m-%d" %}
+ {% assign post_date_formatted = post_date | date: "%B %d, %Y" %}
+ {% assign post.date_formatted = post_date_formatted %}
+ -
+ {{ post.title }}
+ {{ post.date_formatted }}
+
+ {% endif %}
+ {% endfor %}
+
+
+
+
+
+
+ The CO2 level is too high at {{ states('sensor.airgradient_carbon_dioxide') }} ppm.
+ Please consider ventilating the room.
+```
+
+{% endraw %}
+
+## Known limitations
+
+The AirGradient integration currently has the following limitations:
+- The update entity is not able to install updates automatically. You will need to reboot the device manually after installing the update.
+
+## Troubleshooting
+
+If you're experiencing issues with your AirGradient integration, try these general troubleshooting steps:
+
+1. Make sure your AirGradient is powered on and properly connected to your home network.
+2. If the integration shows as unavailable, try restarting both your AirGradient and Home Assistant.
+
## Removing the integration
This integration follows standard integration removal, no extra steps are required.
diff --git a/source/_integrations/eafm.md b/source/_integrations/eafm.markdown
similarity index 97%
rename from source/_integrations/eafm.md
rename to source/_integrations/eafm.markdown
index 9e308858fb1..6e9e99e0d32 100644
--- a/source/_integrations/eafm.md
+++ b/source/_integrations/eafm.markdown
@@ -1,27 +1,27 @@
----
-title: UK Environment Agency Flood Monitoring
-description: Monitor nearby water levels and be prepared for flooding with the UK Environment Agency API integration.
-ha_category:
- - Sensor
-ha_release: 0.115
-ha_iot_class: Cloud Polling
-ha_config_flow: true
-ha_codeowners:
- - '@Jc2k'
----
-
-The `eafm` integration offers integration with the [UK Environment Agency Flood Monitoring](https://environment.data.gov.uk/flood-monitoring/doc/reference) API to provide sensors for nearby water levels. Combined with Home Assistant notifications, you could give yourself a warning if a nearby river was likely to flood your local cycle path or the only road out of your village.
-
-{% important %}
-
-The UK Environment Agency Flood Monitoring only provides data for England - Northern Ireland, Scotland and Wales have their own flood agencies.
-
-{% endimportant %}
-
-## Configuration
-
-Home Assistant offers the flood monitoring integration through **Settings** -> **Devices & services** -> **Environment Agency Flood Gauges**.
-
-You will be prompted to select a monitoring station. You can find the name of nearby monitoring stations on the Flood information service [website](https://check-for-flooding.service.gov.uk/river-and-sea-levels).
-
-Sensors for that monitoring station should then appear in your Home Assistant instance.
+---
+title: UK Environment Agency Flood Monitoring
+description: Monitor nearby water levels and be prepared for flooding with the UK Environment Agency API integration.
+ha_category:
+ - Sensor
+ha_release: 0.115
+ha_iot_class: Cloud Polling
+ha_config_flow: true
+ha_codeowners:
+ - '@Jc2k'
+---
+
+The `eafm` integration offers integration with the [UK Environment Agency Flood Monitoring](https://environment.data.gov.uk/flood-monitoring/doc/reference) API to provide sensors for nearby water levels. Combined with Home Assistant notifications, you could give yourself a warning if a nearby river was likely to flood your local cycle path or the only road out of your village.
+
+{% important %}
+
+The UK Environment Agency Flood Monitoring only provides data for England - Northern Ireland, Scotland and Wales have their own flood agencies.
+
+{% endimportant %}
+
+## Configuration
+
+Home Assistant offers the flood monitoring integration through **Settings** -> **Devices & services** -> **Environment Agency Flood Gauges**.
+
+You will be prompted to select a monitoring station. You can find the name of nearby monitoring stations on the Flood information service [website](https://check-for-flooding.service.gov.uk/river-and-sea-levels).
+
+Sensors for that monitoring station should then appear in your Home Assistant instance.
diff --git a/source/_integrations/esphome.markdown b/source/_integrations/esphome.markdown
index 112f5f03c5b..c0228670388 100644
--- a/source/_integrations/esphome.markdown
+++ b/source/_integrations/esphome.markdown
@@ -49,11 +49,12 @@ ha_quality_scale: platinum
## Overview
-This integration allows [ESPHome](https://esphome.io) devices to connect directly to Home Assistant with the [native ESPHome API](https://esphome.io/components/api.html).
+The **ESPHome** {% term integration %} allows [ESPHome](https://esphome.io) devices to connect directly to Home Assistant with the [native ESPHome API](https://esphome.io/components/api.html).
ESPHome is a firmware generator and configuration system that enables the transformation of microcontrollers into fully customizable smart home devices. Using a simple YAML configuration file, ESPHome allows users to define hardware components like sensors, actuators, and peripherals. These configurations are then compiled into custom firmware that can be flashed onto the target device.
-### Key Features
+### Key features
+
- **YAML Configuration**: Specify hardware components, sensors, actuators, and integrations using a clean and straightforward YAML syntax.
- **Custom Firmware Generation**: ESPHome compiles the provided configuration into a highly optimized, device-specific firmware image that is ready to be flashed onto microcontrollers.
- **Seamless Integration**: After flashing, ESPHome devices can integrate seamlessly with Home Assistant using the ESPHome native API. This documentation page focuses on the [native API](https://esphome.io/components/api.html), which allows devices to communicate directly with Home Assistant for real-time automation and monitoring. For other integrations, such as MQTT or HTTP, please refer to the relevant sections of the [ESPHome documentation](https://esphome.io/).
@@ -95,12 +96,6 @@ password:
For more information, see the [ESPHome Native API Component documentation](https://esphome.io/components/api.html).
-## Removing the integration
-
-This integration follows the standard integration removal process; no extra steps are required.
-
-{% include integrations/remove_device_service.md %}
-
{% include integrations/option_flow.md %}
These options are disabled by default and not required—only set them if specifically needed.
@@ -114,25 +109,26 @@ Subscribe to logs from the device:
## Supported devices
-The ESPHome integration works with devices that run ESPHome firmware and expose their functionality through the [native ESPHome API](https://esphome.io/components/api.html). This API is designed for tight, efficient integration with Home Assistant, enabling ESPHome devices to push updates directly to Home Assistant in **near real time**.
+The ESPHome {% term integration %} works with devices that run ESPHome firmware and expose their functionality through the [native ESPHome API](https://esphome.io/components/api.html). This API is designed for tight, efficient integration with Home Assistant, enabling ESPHome devices to push updates directly to Home Assistant in **near real time**.
## Updating data
Rather than polling for sensor values or device states, Home Assistant maintains a persistent connection to each ESPHome device using the native API. This allows state changes—such as a temperature sensor update, a button press, or a binary sensor trigger—to be sent immediately as they happen, reducing latency and improving responsiveness in automations.
-### Additional Technical Details
+### Additional technical details
+
- **Efficient Communication Protocol**: ESPHome uses a lightweight, bi-directional protocol over TCP, optimized for microcontrollers. This protocol is implemented in [aioesphomeapi](https://github.com/esphome/aioesphomeapi), the async Python library used by Home Assistant to handle real-time communication with ESPHome devices. It enables low-latency updates and near instant command execution.
- **Automatic Reconnection**: Home Assistant maintains a persistent connection to each ESPHome device and will automatically attempt to reconnect if the connection is lost. This includes support for "sleepy" or battery-powered devices that periodically wake from deep sleep. When such a device comes online, Home Assistant quickly re-establishes the connection—especially when **mDNS** (Multicast DNS) is available—allowing the device to be discovered and connected without requiring static IPs or manual configuration.
This real-time behavior enables fast, reactive automations and a smooth user experience compared to traditional polling-based integrations.
-## Supported Functionality
+## Supported functionality
### Entities
The available entities depend on the components defined in the ESPHome YAML configuration for each device. These entities are exposed through the [Native API Component](https://esphome.io/components/api.html).
-### Firing Events on the Home Assistant Event Bus
+### Firing events on the Home Assistant event bus
When using the native API with Home Assistant, you can trigger events on the Home Assistant event bus directly from ESPHome. For more details, see the [homeassistant.event Action](https://esphome.io/components/api.html#homeassistant-event-action).
@@ -140,15 +136,15 @@ When using the native API with Home Assistant, you can trigger events on the Hom
Each device can define Home Assistant Actions based on its ESPHome YAML configuration. For more information, refer to the [Actions](https://esphome.io/components/api.html#actions) section in the [Native API Component](https://esphome.io/components/api.html) documentation.
-### Retrieving Data from Home Assistant
+### Retrieving data from Home Assistant
ESPHome can retrieve the state of Home Assistant entities using the [Native API](https://esphome.io/components/api.html) with [User-Defined Actions](https://esphome.io/components/api.html#user-defined-actions).
-### Home Assistant Actions
+### Home Assistant actions
ESPHome devices can call any [Home Assistant Action](https://esphome.io/components/api.html#homeassistant-service-action). This feature is not enabled by default for newly added devices but can be enabled through the options flow on a per-device basis.
-### Tag Scanning Support
+### Tag scanning support
The [Native API Component](https://esphome.io/components/api.html) also supports sending tag scan events to Home Assistant. See the [homeassistant.tag_scanned Action](https://esphome.io/components/api.html#homeassistant-tag-scanned-action) for more information.
@@ -184,18 +180,20 @@ The entity will be named `livingroomdesk Temperature` and will default to having
## Troubleshooting
-### Viewing Live Logs
+### Viewing live logs
To troubleshoot your ESPHome devices, you can easily view live logs, whether you're using the [**ESPHome Device Builder Add-on**](https://my.home-assistant.io/redirect/supervisor_addon/?addon=5c53de3b_esphome&repository_url=https%3A%2F%2Fgithub.com%2Fesphome%2Fhome-assistant-addon) or the **ESPHome CLI**. The logs contain detailed information such as Wi-Fi connection status, errors, and debug messages, which can help you identify and resolve issues with your device.
#### Using the [**ESPHome Device Builder Add-on**](https://my.home-assistant.io/redirect/supervisor_addon/?addon=5c53de3b_esphome&repository_url=https%3A%2F%2Fgithub.com%2Fesphome%2Fhome-assistant-addon)
+
1. In the [**ESPHome Device Builder Add-on**](https://my.home-assistant.io/redirect/supervisor_addon/?addon=5c53de3b_esphome&repository_url=https%3A%2F%2Fgithub.com%2Fesphome%2Fhome-assistant-addon) add-on, find the device you're working with.
2. Click the **LOGS** button to open the log view.
#### Using the **ESPHome CLI**
+
If you're using the **ESPHome CLI**, follow the instructions for the [logs Command](https://esphome.io/guides/cli.html#logs-command) to access the logs.
-### Obtaining Logs from the Device
+### Obtaining logs from the device
If you want the device to send logs without requiring you to be actively monitoring, follow these steps:
@@ -216,7 +214,7 @@ If you want the device to send logs without requiring you to be actively monitor
This integration supports reconfiguration, allowing you to make changes—such as updating the IP address—even after a device has already been set up.
-### Name Conflict Resolution
+### Name conflict resolution
If Home Assistant detects multiple devices with the same [**name**](https://esphome.io/components/esphome.html#configuration-variables), it will automatically initiate **Name Conflict Resolution**. This process is designed to help you seamlessly replace a failed or retired device with new hardware, while preserving your existing configuration if desired.
@@ -232,7 +230,7 @@ If you’re using the same YAML file on the new device, choose **Migrate**. If i
---
-### Requirements for Name Conflict Resolution
+### Requirements for name conflict resolution
To trigger Name Conflict Resolution, all of the following must be true:
@@ -242,7 +240,7 @@ To trigger Name Conflict Resolution, all of the following must be true:
---
-### How to Trigger Name Conflict Resolution
+### How to trigger name conflict resolution
You can trigger Name Conflict Resolution in several ways:
@@ -251,8 +249,14 @@ You can trigger Name Conflict Resolution in several ways:
- Configuring a **newly discovered device** that uses the same name.
- **Manually adding** a device with the same name via the integration setup.
-## Known Limitations
+## Known limitations
Each ESPHome device must have a **unique name**. This name is important for mDNS announcements, ensuring that the device can be properly discovered, quickly reconnected when it comes online or wakes from deep sleep (for devices that support deep sleep), and correctly linked to the [**ESPHome Device Builder Add-on**](https://my.home-assistant.io/redirect/supervisor_addon/?addon=5c53de3b_esphome&repository_url=https%3A%2F%2Fgithub.com%2Fesphome%2Fhome-assistant-addon). It's also crucial for **DHCP discovery** if mDNS is not available.
Using duplicate names can lead to connection issues, failed discovery, and unexpected behavior with both the integration and the add-on.
+
+## Removing the integration
+
+This integration follows the standard integration removal process; no extra steps are required.
+
+{% include integrations/remove_device_service.md %}
\ No newline at end of file
diff --git a/source/_integrations/eve.markdown b/source/_integrations/eve.markdown
index c3fb407b6af..316ae138f84 100644
--- a/source/_integrations/eve.markdown
+++ b/source/_integrations/eve.markdown
@@ -13,6 +13,8 @@ ha_platforms:
- sensor
ha_iot_standard: matter
ha_brand: true
+works_with:
+ - matter
---
[Eve](https://www.evehome.com/) is a member of the Works with Home Assistant partner program for their Matter products. Eve is committed to making sure their products are up-to-date and ready to use in Home Assistant.
diff --git a/source/_integrations/govee_ble.markdown b/source/_integrations/govee_ble.markdown
index cbb0babb24c..8e76801b033 100644
--- a/source/_integrations/govee_ble.markdown
+++ b/source/_integrations/govee_ble.markdown
@@ -32,7 +32,7 @@ The Govee BLE integration will automatically discover devices once the [Bluetoot
- H5071 Hygrometer Thermometer
- H5072 Hygrometer Thermometer
- H5074 Hygrometer Thermometer (Active scans required)
-- [H5075 Bluetooth Hygrometer Thermometer](https://us.govee.com/collections/thermo-hydrometer/products/govee-bluetooth-hygrometer-thermometer-h5075)
+- [H5075 Bluetooth Hygrometer Thermometer](https://us.govee.com/collections/thermo-hydrometer/products/govee-bluetooth-hygrometer-thermometer-h5075) (Active scans required)
- [H5100 Hygrometer Thermometer](https://us.govee.com/collections/thermo-hydrometer/products/govee-h5100-mini-hygrometer-thermometer-sensors)
- H5101 Hygrometer Thermometer
- H5102 Hygrometer Thermometer
@@ -49,6 +49,7 @@ The Govee BLE integration will automatically discover devices once the [Bluetoot
- H5125 2 Button Switch
- H5126 6 Button Switch
- H5127 Presence Sensor
+- [H5129 Hygrometer Thermometer](https://us.govee.com/products/wi-fi-temperature-humidity-sensor) (Active scans required)
- H5130 Pressure Sensor
- [H5177/5178 Bluetooth Thermo-Hygrometer](https://us.govee.com/collections/thermo-hydrometer/products/bluetooth-thermo-hygrometer)
- H5174 Hygrometer Thermometer
diff --git a/source/_integrations/home_connect.markdown b/source/_integrations/home_connect.markdown
index 7c1514036ca..828ea01b0fe 100644
--- a/source/_integrations/home_connect.markdown
+++ b/source/_integrations/home_connect.markdown
@@ -725,7 +725,7 @@ Both entities can use these options, but the availability of these will depend o
### Sensor
-{% details "List of binary sensors" %}
+{% details "List of sensors" %}
- **Finish time**:
- **Description**: Represents the time when the program will end.
diff --git a/source/_integrations/ipp.md b/source/_integrations/ipp.markdown
similarity index 97%
rename from source/_integrations/ipp.md
rename to source/_integrations/ipp.markdown
index 6f0cb9a41c3..a341df7efd8 100644
--- a/source/_integrations/ipp.md
+++ b/source/_integrations/ipp.markdown
@@ -1,18 +1,18 @@
----
-title: Internet Printing Protocol (IPP)
-description: Instructions on how to integrate printers that support the Internet Printing Protocol (IPP) into Home Assistant.
-ha_category:
- - System monitor
-ha_release: 0.108
-ha_iot_class: Local Polling
-ha_config_flow: true
-ha_codeowners:
- - '@ctalkington'
-ha_domain: ipp
----
-
-The `Internet Printing Protocol (IPP)` integration allows you to read current data from your networked printer that supports the [Internet Printing Protocol](https://www.pwg.org/ipp/everywhere.html).
-
-It provides information about the printer's state and remaining ink levels.
-
-{% include integrations/config_flow.md %}
+---
+title: Internet Printing Protocol (IPP)
+description: Instructions on how to integrate printers that support the Internet Printing Protocol (IPP) into Home Assistant.
+ha_category:
+ - System monitor
+ha_release: 0.108
+ha_iot_class: Local Polling
+ha_config_flow: true
+ha_codeowners:
+ - '@ctalkington'
+ha_domain: ipp
+---
+
+The `Internet Printing Protocol (IPP)` integration allows you to read current data from your networked printer that supports the [Internet Printing Protocol](https://www.pwg.org/ipp/everywhere.html).
+
+It provides information about the printer's state and remaining ink levels.
+
+{% include integrations/config_flow.md %}
diff --git a/source/_integrations/knx.markdown b/source/_integrations/knx.markdown
index 3842ebfbfaf..386b2e5f3e2 100644
--- a/source/_integrations/knx.markdown
+++ b/source/_integrations/knx.markdown
@@ -555,7 +555,7 @@ address:
required: true
type: [string, list]
remove:
- description: If `True` the group address will be removed.
+ description: If `true` the group address will be removed.
required: false
type: boolean
default: false
@@ -571,7 +571,7 @@ The `knx.exposure_register` action can be used to register (or unregister) expos
{% configuration %}
remove:
- description: In addition to the configuration variables of [expose](#exposing-entity-states-entity-attributes-or-time-to-knx-bus) `remove` set to `True` can be used to remove exposures. Only `address` is required for removal.
+ description: In addition to the configuration variables of [expose](#exposing-entity-states-entity-attributes-or-time-to-knx-bus) `remove` set to `true` can be used to remove exposures. Only `address` is required for removal.
required: false
type: boolean
default: false
@@ -1279,7 +1279,7 @@ state_address:
required: false
type: [string, list]
respond_to_read:
- description: Respond to GroupValueRead telegrams received to the configured `address`.
+ description: If `true`, the entity will respond to GroupValueRead telegrams received on the configured `address` by sending a GroupValueResponse to the same `address`. This is typically used when Home Assistant acts as the state provider for the KNX bus. In such cases, only `address` is configured, and `state_address` is not set. Read-requests to passive or state addresses don't trigger responses.
required: false
type: boolean
default: false
@@ -1346,7 +1346,7 @@ state_address:
required: false
type: [string, list]
respond_to_read:
- description: Respond to GroupValueRead telegrams received to the configured `address`.
+ description: If `true`, the entity will respond to GroupValueRead telegrams received on the configured `address` by sending a GroupValueResponse to the same `address`. This is typically used when Home Assistant acts as the state provider for the KNX bus. In such cases, only `address` is configured, and `state_address` is not set. Read-requests to passive or state addresses don't trigger responses.
required: false
type: boolean
default: false
@@ -1750,7 +1750,7 @@ type:
required: true
type: [string, integer]
respond_to_read:
- description: Respond to GroupValueRead telegrams received to the configured `address`.
+ description: If `true`, the entity will respond to GroupValueRead telegrams received on the configured `address` by sending a GroupValueResponse to the same `address`. This is typically used when Home Assistant acts as the state provider for the KNX bus. In such cases, only `address` is configured, and `state_address` is not set. Read-requests to passive or state addresses don't trigger responses.
required: false
type: boolean
default: false
@@ -1883,7 +1883,7 @@ options:
required: true
type: integer
respond_to_read:
- description: Respond to GroupValueRead telegrams received to the configured `address`.
+ description: If `true`, the entity will respond to GroupValueRead telegrams received on the configured `address` by sending a GroupValueResponse to the same `address`. This is typically used when Home Assistant acts as the state provider for the KNX bus. In such cases, only `address` is configured, and `state_address` is not set. Read-requests to passive or state addresses don't trigger responses.
required: false
type: boolean
default: false
@@ -2219,7 +2219,7 @@ invert:
type: boolean
default: false
respond_to_read:
- description: Respond to GroupValueRead telegrams received to the configured `address`.
+ description: If `true`, the entity will respond to GroupValueRead telegrams received on the configured `address` by sending a GroupValueResponse to the same `address`. This is typically used when Home Assistant acts as the state provider for the KNX bus. In such cases, only `address` is configured, and `state_address` is not set. Read-requests to passive or state addresses don't trigger responses.
required: false
type: boolean
default: false
@@ -2282,7 +2282,7 @@ type:
type: [string, integer]
default: latin_1
respond_to_read:
- description: Respond to GroupValueRead telegrams received to the configured `address`.
+ description: If `true`, the entity will respond to GroupValueRead telegrams received on the configured `address` by sending a GroupValueResponse to the same `address`. This is typically used when Home Assistant acts as the state provider for the KNX bus. In such cases, only `address` is configured, and `state_address` is not set. Read-requests to passive or state addresses don't trigger responses.
required: false
type: boolean
default: false
@@ -2335,7 +2335,7 @@ state_address:
required: false
type: [string, list]
respond_to_read:
- description: Respond to GroupValueRead telegrams received to the configured `address`.
+ description: If `true`, the entity will respond to GroupValueRead telegrams received on the configured `address` by sending a GroupValueResponse to the same `address`. This is typically used when Home Assistant acts as the state provider for the KNX bus. In such cases, only `address` is configured, and `state_address` is not set. Read-requests to passive or state addresses don't trigger responses.
required: false
type: boolean
default: false
diff --git a/source/_integrations/linkplay.md b/source/_integrations/linkplay.markdown
similarity index 97%
rename from source/_integrations/linkplay.md
rename to source/_integrations/linkplay.markdown
index 122541b531f..59ec73e140b 100644
--- a/source/_integrations/linkplay.md
+++ b/source/_integrations/linkplay.markdown
@@ -1,54 +1,54 @@
----
-title: LinkPlay
-description: Connect and control your LinkPlay media players using the LinkPlay integration
-ha_category:
- - Media player
-ha_domain: linkplay
-ha_zeroconf: true
-ha_integration_type: integration
-ha_release: 2024.8
-ha_codeowners:
- - '@Velleman'
-ha_config_flow: true
-ha_platforms:
- - media_player
- - button
-ha_iot_class: Local Polling
----
-
-The LinkPlay {% term integrations %} for Home Assistant allows you to control various media players based on the LinkPlay protocol. The integration supports auto-discovery on your local network through [Zeroconf](/integrations/zeroconf).
-
-{% include integrations/config_flow.md %}
-
-## Features
-
-### Media Player
-
-The media player entity offers robust controls and playback features from the media player integration and provides additionally:
-
-- **Preset playback**: Play LinkPlay presets configured on the device using the action `linkplay.play_preset`.
-- **Multiroom**: Combine multiple LinkPlay devices in a multiroom. Use the actions `media_player.join` and `media_player.unjoin`.
-
-### Buttons
-
-The button entities provide some additional LinkPlay features available on the device:
-
-- **Time Sync**: Synchronize the device's internal clock with the current time in Home Assistant.
-- **Restart Device**: Reboot the device, allowing for convenient troubleshooting and maintenance.
-
-## Actions
-
-The LinkPlay integration makes various custom actions available in addition to the [standard media player actions](/integrations/media_player/#actions).
-
-### Action `linkplay.play_preset`
-
-Play a preset on a LinkPlay media player.
-
-{% note %}
-Companion apps, such as 4stream, allow to save music presets (for example, Spotify playlists). This action can be used to start playing these presets.
-{% endnote %}
-
-| Data attribute | Optional | Description |
-| ---------------------- | -------- | ----------- |
-| `entity_id` | no | The speakers to target. To target all LinkPlay devices, use `all`.
-| `preset_number` | no | The number of the preset to play.
+---
+title: LinkPlay
+description: Connect and control your LinkPlay media players using the LinkPlay integration
+ha_category:
+ - Media player
+ha_domain: linkplay
+ha_zeroconf: true
+ha_integration_type: integration
+ha_release: 2024.8
+ha_codeowners:
+ - '@Velleman'
+ha_config_flow: true
+ha_platforms:
+ - media_player
+ - button
+ha_iot_class: Local Polling
+---
+
+The LinkPlay {% term integrations %} for Home Assistant allows you to control various media players based on the LinkPlay protocol. The integration supports auto-discovery on your local network through [Zeroconf](/integrations/zeroconf).
+
+{% include integrations/config_flow.md %}
+
+## Features
+
+### Media Player
+
+The media player entity offers robust controls and playback features from the media player integration and provides additionally:
+
+- **Preset playback**: Play LinkPlay presets configured on the device using the action `linkplay.play_preset`.
+- **Multiroom**: Combine multiple LinkPlay devices in a multiroom. Use the actions `media_player.join` and `media_player.unjoin`.
+
+### Buttons
+
+The button entities provide some additional LinkPlay features available on the device:
+
+- **Time Sync**: Synchronize the device's internal clock with the current time in Home Assistant.
+- **Restart Device**: Reboot the device, allowing for convenient troubleshooting and maintenance.
+
+## Actions
+
+The LinkPlay integration makes various custom actions available in addition to the [standard media player actions](/integrations/media_player/#actions).
+
+### Action `linkplay.play_preset`
+
+Play a preset on a LinkPlay media player.
+
+{% note %}
+Companion apps, such as 4stream, allow to save music presets (for example, Spotify playlists). This action can be used to start playing these presets.
+{% endnote %}
+
+| Data attribute | Optional | Description |
+| ---------------------- | -------- | ----------- |
+| `entity_id` | no | The speakers to target. To target all LinkPlay devices, use `all`.
+| `preset_number` | no | The number of the preset to play.
diff --git a/source/_integrations/locative.md b/source/_integrations/locative.markdown
similarity index 98%
rename from source/_integrations/locative.md
rename to source/_integrations/locative.markdown
index 3f28d27707d..fbbd1ad0b6d 100644
--- a/source/_integrations/locative.md
+++ b/source/_integrations/locative.markdown
@@ -1,23 +1,23 @@
----
-title: "Locative"
-description: "Instructions on how to use Locative to track devices in Home Assistant."
-ha_category:
- - Presence detection
-ha_release: 0.86
-ha_iot_class: Cloud Push
-ha_domain: locative
----
-
-This platform allows you to detect presence using [Locative](https://www.locative.app/). Locative is an open source app for [iOS](https://apps.apple.com/us/app/locative/id725198453?ign-mpt=uo%3D4) that allows users to set up a `GET` or `POST` request when a geofence is entered or exited. This can be configured with Home Assistant to update your location.
-
-Install on your smartphone:
-
-- [iOS](https://apps.apple.com/us/app/locative/id725198453?ign-mpt=uo%3D4)
-
-To configure Locative, you must set it up via the integrations panel in the configuration screen. You must set up the app to send a POST request to your Home Assistant instance at the webhook URL provided by the integration during setup. When you enter or exit a geofence, Locative will send the appropriate request to that URL, updating Home Assistant. You are not able to specify a device name in Locative. Instead, you will need to look in your `dev-state` menu for a new device that Locative will have created on its first `GET`. If you had been or are using Owntracks as well, you will need to update the device name used in the Owntracks setup with the name that Locative generated.
-
-
-
-
-
-When you enter a geofence, your location name in Home Assistant will be set to the name of the geofence in Locative. When you exit a geofence, your location name in Home Assistant will be set to "not home".
+---
+title: "Locative"
+description: "Instructions on how to use Locative to track devices in Home Assistant."
+ha_category:
+ - Presence detection
+ha_release: 0.86
+ha_iot_class: Cloud Push
+ha_domain: locative
+---
+
+This platform allows you to detect presence using [Locative](https://www.locative.app/). Locative is an open source app for [iOS](https://apps.apple.com/us/app/locative/id725198453?ign-mpt=uo%3D4) that allows users to set up a `GET` or `POST` request when a geofence is entered or exited. This can be configured with Home Assistant to update your location.
+
+Install on your smartphone:
+
+- [iOS](https://apps.apple.com/us/app/locative/id725198453?ign-mpt=uo%3D4)
+
+To configure Locative, you must set it up via the integrations panel in the configuration screen. You must set up the app to send a POST request to your Home Assistant instance at the webhook URL provided by the integration during setup. When you enter or exit a geofence, Locative will send the appropriate request to that URL, updating Home Assistant. You are not able to specify a device name in Locative. Instead, you will need to look in your `dev-state` menu for a new device that Locative will have created on its first `GET`. If you had been or are using Owntracks as well, you will need to update the device name used in the Owntracks setup with the name that Locative generated.
+
+
+
+
+
+When you enter a geofence, your location name in Home Assistant will be set to the name of the geofence in Locative. When you exit a geofence, your location name in Home Assistant will be set to "not home".
diff --git a/source/_integrations/matter.markdown b/source/_integrations/matter.markdown
index 3ed9312ef91..dc99f0c7fe8 100644
--- a/source/_integrations/matter.markdown
+++ b/source/_integrations/matter.markdown
@@ -386,7 +386,7 @@ NOTE for Android users: You need to follow the instructions at the bottom of the
### General recommendations
-- Using Thread-based Matter devices in Home Assistant requires Home Assistant OS version 10 and above. Not using Home Assistant OS is at your own risk. We do provide some [documentation](https://github.com/home-assistant-libs/python-matter-server/blob/main/README.md) on how to run the Matter Server as a Docker container. The documentation includes a description of the host and networking requirements.
+- Using Thread-based Matter devices in Home Assistant requires Home Assistant OS version 10 and above. Home Assistant OS with the Matter Server add-on is the supported path for using Matter with Home Assistant. Running Matter Server as a standalone Docker container is unsupported, but we provide [documentation](https://github.com/home-assistant-libs/python-matter-server/blob/main/README.md) including a description of the host and networking requirements.
- To use {% term Thread %} devices you will need a {% term Thread %} network with at least one Thread border router in your network nearby the {% term Thread %} device(s). Apple users, for example, need the Apple TV 4K or the HomePod Mini, while Google users need a Nest Hub (2nd Gen). Use the Thread integration in Home Assistant to diagnose your {% term Thread %} network(s).
diff --git a/source/_integrations/met_eireann.markdown b/source/_integrations/met_eireann.markdown
index 29c317692d7..623f27c7d17 100644
--- a/source/_integrations/met_eireann.markdown
+++ b/source/_integrations/met_eireann.markdown
@@ -17,14 +17,14 @@ ha_integration_type: integration
The Met Éireann integration uses the [Met Éireann](https://met.ie) (The Irish Meteorological Service) Public Weather Forecast API to provide current and forecasted weather data for a given location. This integration is in no way affiliated with or endorsed by Met Éireann.
{% note %}
-The Met Éireann API will only provide data for Ireland, the UK and a small part of northern France. For specific coverage, please see the Notes on API document available [here](https://data.gov.ie/dataset/met-eireann-weather-forecast-api/resource/027da6d5-d819-48d1-9b16-331dba169bd1).
+The Met Éireann API will only provide data for Ireland, the UK and a small part of northern France. For specific coverage, please see the Notes on API document available [here](https://data.gov.ie/dataset/met-eireann-forecast-api/resource/027da6d5-d819-48d1-9b16-331dba169bd1).
{% endnote %}
{% include integrations/config_flow.md %}
## Data license
-The data provided by Met Éireann is licensed under the Met Éireann Open Data Custom License (similar to a Creative Commons CC BY 4.0 license). A license summary and the full license are available [here](https://data.gov.ie/dataset/met-eireann-weather-forecast-api/resource/027da6d5-d819-48d1-9b16-331dba169bd1). In short, if you distribute, broadcast or make Met Éireann data available on the public internet you must give credit to Met Éireann and display their weather warnings.
+The data provided by Met Éireann is licensed under the Met Éireann Open Data Custom License (similar to a Creative Commons CC BY 4.0 license). A license summary and the full license are available [here](https://data.gov.ie/dataset/met-eireann-forecast-api/resource/027da6d5-d819-48d1-9b16-331dba169bd1). In short, if you distribute, broadcast or make Met Éireann data available on the public internet you must give credit to Met Éireann and display their weather warnings.
## Data changes
diff --git a/source/_integrations/motionmount.md b/source/_integrations/motionmount.markdown
similarity index 97%
rename from source/_integrations/motionmount.md
rename to source/_integrations/motionmount.markdown
index 0ce8902df51..1478f0dff77 100644
--- a/source/_integrations/motionmount.md
+++ b/source/_integrations/motionmount.markdown
@@ -1,115 +1,115 @@
----
-title: Vogel's MotionMount
-description: Instructions on how to integrate Vogel's MotionMount into Home Assistant.
-ha_category:
- - Number
- - Select
- - Binary sensor
- - Sensor
-ha_release: 2024.1
-ha_iot_class: Local Push
-ha_config_flow: true
-ha_platforms:
- - number
- - select
- - binary_sensor
- - sensor
-ha_codeowners:
- - '@RJPoelstra'
-ha_domain: motionmount
-ha_zeroconf: true
----
-
-The `motionmount` {% term integration %} allows you to control the position of your [TVM 7675 Pro](https://www.vogels.com/p/tvm-7675-pro-motorized-tv-wall-mount-black) SIGNATURE MotionMount from Vogel's.
-
-This integration uses the Ethernet (IP) connection of your MotionMount. It's not possible to connect using the RS-232 connection.
-
-It provides information about the current position of the mount and allows setting a new position.
-
-A use case would be to position the TV based on whether anyone is actively watching. The MotionMount provides an HDMI connection to monitor whether the TV is turned on and in response move it to a preset position or the last known position. However, if you also use the TV for background music, you probably don't want the MotionMount to extend. By using a presence sensor to check whether anyone is actually in front of the TV, you can ensure the MotionMount only extends when the TV is actively being watched.
-
-{% include integrations/config_flow.md %}
-
-{% configuration_basic %}
-Host:
- description: Hostname or IP address of the device, for example:`192.168.1.2`.
-Port:
- description: The TCP port of the device. Defaults to 23. Only change this when you're absolutely certain that it shouldn't be 23.
-PIN:
- description: The user level pincode, if configured on the device.
-{% endconfiguration_basic %}
-
-## Removing the integration
-
-This integration follows standard integration removal. No extra steps are required.
-
-{% include integrations/remove_device_service.md %}
-
-## Data updates
-
-The MotionMount pushes new data to the integration.
-The only exception is the presets. Changes to the presets are {% term polling polled %}, by default every 60 seconds.
-
-## Known limitations
-
-The integration does not provide the ability to configure the MotionMount.
-All settings, including configuring presets, should be done via the MotionMount app.
-
-Only IP connections are supported. Connection via RS-232 or Bluetooth Low Energy is not supported.
-
-## Supported devices
-
-The following devices are supported:
-
-- TVM 7675 Pro (SIGNATURE MotionMount with Pro extension)
-
-## Unsupported devices
-
-The following devices are *not* supported:
-
-- TVM 7675 (SIGNATURE MotionMount without Pro extension)
-- TVM 7355 (NEXT MotionMount)
-
-## Supported functionality
-
-### Entities
-
-#### Sensors
-
-- **Moving**
- - **Description**: Indicates whether the MotionMount is moving.
-
-- **Error Status**
- - **Description**: The error status of the MotionMount.
- - None: There is no error.
- - Motor: There is a problem communicating with the motor.
- - HDMI CEC: There is a problem communicating with the TV. Check the HDMI cable.
- - Obstruction: The MotionMount detected an obstacle and stopped moving.
- - TV Width Constraint: The MotionMount detected that the TV moved too close to the wall and stopped moving.
- - Internal: There is an internal error. Refer to the MotionMount app for support.
-
-#### Numbers
-
-- **Extension**
- - **Description**: The current extension of the MotionMount from the wall.
-
-- **Turn**
- - **Description**: The current rotation of the MotionMount.
-
-#### Selects
-
-- **Presets**
- - **Description**: If the MotionMount is at a preset location, this shows the corresponding preset.
- Any preset can be selected to move the MotionMount to this preset position.
-
-## Troubleshooting
-
-### Can't connect to device
-
-1. Make sure the device is powered on.
-2. Make sure the device is connected to the same network as Home Assistant.
-3. Make sure the IP address of the MotionMount is configured correctly.
- - In case of doubt, perform a network reset by holding the reset button for approx. 5 seconds.
- - **Result**: The LED will start to blink slowly. This indicates that the network configuration is being reset to use DHCP.
- - **Important**: Don't hold the reset button for too long (approx. 10 s). Holding the button for 10 s or longer starts a factory reset. A factory reset is indicated by the LED blinking fast.
-
+---
+title: Vogel's MotionMount
+description: Instructions on how to integrate Vogel's MotionMount into Home Assistant.
+ha_category:
+ - Number
+ - Select
+ - Binary sensor
+ - Sensor
+ha_release: 2024.1
+ha_iot_class: Local Push
+ha_config_flow: true
+ha_platforms:
+ - number
+ - select
+ - binary_sensor
+ - sensor
+ha_codeowners:
+ - '@RJPoelstra'
+ha_domain: motionmount
+ha_zeroconf: true
+---
+
+The `motionmount` {% term integration %} allows you to control the position of your [TVM 7675 Pro](https://www.vogels.com/p/tvm-7675-pro-motorized-tv-wall-mount-black) SIGNATURE MotionMount from Vogel's.
+
+This integration uses the Ethernet (IP) connection of your MotionMount. It's not possible to connect using the RS-232 connection.
+
+It provides information about the current position of the mount and allows setting a new position.
+
+A use case would be to position the TV based on whether anyone is actively watching. The MotionMount provides an HDMI connection to monitor whether the TV is turned on and in response move it to a preset position or the last known position. However, if you also use the TV for background music, you probably don't want the MotionMount to extend. By using a presence sensor to check whether anyone is actually in front of the TV, you can ensure the MotionMount only extends when the TV is actively being watched.
+
+{% include integrations/config_flow.md %}
+
+{% configuration_basic %}
+Host:
+ description: Hostname or IP address of the device, for example:`192.168.1.2`.
+Port:
+ description: The TCP port of the device. Defaults to 23. Only change this when you're absolutely certain that it shouldn't be 23.
+PIN:
+ description: The user level pincode, if configured on the device.
+{% endconfiguration_basic %}
+
+## Removing the integration
+
+This integration follows standard integration removal. No extra steps are required.
+
+{% include integrations/remove_device_service.md %}
+
+## Data updates
+
+The MotionMount pushes new data to the integration.
+The only exception is the presets. Changes to the presets are {% term polling polled %}, by default every 60 seconds.
+
+## Known limitations
+
+The integration does not provide the ability to configure the MotionMount.
+All settings, including configuring presets, should be done via the MotionMount app.
+
+Only IP connections are supported. Connection via RS-232 or Bluetooth Low Energy is not supported.
+
+## Supported devices
+
+The following devices are supported:
+
+- TVM 7675 Pro (SIGNATURE MotionMount with Pro extension)
+
+## Unsupported devices
+
+The following devices are *not* supported:
+
+- TVM 7675 (SIGNATURE MotionMount without Pro extension)
+- TVM 7355 (NEXT MotionMount)
+
+## Supported functionality
+
+### Entities
+
+#### Sensors
+
+- **Moving**
+ - **Description**: Indicates whether the MotionMount is moving.
+
+- **Error Status**
+ - **Description**: The error status of the MotionMount.
+ - None: There is no error.
+ - Motor: There is a problem communicating with the motor.
+ - HDMI CEC: There is a problem communicating with the TV. Check the HDMI cable.
+ - Obstruction: The MotionMount detected an obstacle and stopped moving.
+ - TV Width Constraint: The MotionMount detected that the TV moved too close to the wall and stopped moving.
+ - Internal: There is an internal error. Refer to the MotionMount app for support.
+
+#### Numbers
+
+- **Extension**
+ - **Description**: The current extension of the MotionMount from the wall.
+
+- **Turn**
+ - **Description**: The current rotation of the MotionMount.
+
+#### Selects
+
+- **Presets**
+ - **Description**: If the MotionMount is at a preset location, this shows the corresponding preset.
+ Any preset can be selected to move the MotionMount to this preset position.
+
+## Troubleshooting
+
+### Can't connect to device
+
+1. Make sure the device is powered on.
+2. Make sure the device is connected to the same network as Home Assistant.
+3. Make sure the IP address of the MotionMount is configured correctly.
+ - In case of doubt, perform a network reset by holding the reset button for approx. 5 seconds.
+ - **Result**: The LED will start to blink slowly. This indicates that the network configuration is being reset to use DHCP.
+ - **Important**: Don't hold the reset button for too long (approx. 10 s). Holding the button for 10 s or longer starts a factory reset. A factory reset is indicated by the LED blinking fast.
+
diff --git a/source/_integrations/mqtt.markdown b/source/_integrations/mqtt.markdown
index 53c07829ee2..965021e3dc8 100644
--- a/source/_integrations/mqtt.markdown
+++ b/source/_integrations/mqtt.markdown
@@ -1082,7 +1082,7 @@ payload_not_available:
required: false
type: string
default: offline
-{% endconfiguration %}
+{% endconfiguration %}
{% enddetails %}
@@ -1225,7 +1225,7 @@ Setting up a light, switch etc. is similar but requires a `command_topic` as men
- Configuration topic: `homeassistant/switch/irrigation/config`
- State topic: `homeassistant/switch/irrigation/state`
- Command topic: `homeassistant/switch/irrigation/set`
-- Payload:
+- Payload:
```json
{
@@ -1371,7 +1371,7 @@ The following software has built-in support for MQTT discovery:
- [Tasmota](https://github.com/arendst/Tasmota) (starting with 5.11.1e, development halted)
- [TeddyCloud](https://github.com/toniebox-reverse-engineering/teddycloud)
- [Teleinfo MQTT](https://fmartinou.github.io/teleinfo2mqtt) (starting with 3.0.0)
-- [Tydom2MQTT](https://fmartinou.github.io/tydom2mqtt/)
+- [Tydom2MQTT](https://tydom2mqtt.github.io/tydom2mqtt/)
- [What's up Docker?](https://fmartinou.github.io/whats-up-docker/) (starting with 3.5.0)
- [WyzeSense2MQTT](https://github.com/raetha/wyzesense2mqtt)
- [Xiaomi DaFang Hacks](https://github.com/EliasKotlyar/Xiaomi-Dafang-Hacks)
@@ -1433,7 +1433,7 @@ Note that MQTT device payloads often contain information for updating multiple e
### The last reported state attribute
-Because MQTT state updates are often repeated frequently, even when no actual changes exist, it is up to the MQTT subscriber to determine whether a status update was received. If the latest update is missed, it might take some time before the next one arrives. If a retained payload exists at the broker, that value will be replayed first, but it will be an update of a previous last state.
+Because MQTT state updates are often repeated frequently, even when no actual changes exist, it is up to the MQTT subscriber to determine whether a status update was received. If the latest update is missed, it might take some time before the next one arrives. If a retained payload exists at the broker, that value will be replayed first, but it will be an update of a previous last state.
MQTT devices often continuously generate numerous state updates. MQTT does not update `last_reported` to avoid impacting system stability unless `force_update` is set. Alternatively, an MQTT sensor can be created to measure the last update.
diff --git a/source/_integrations/nextcloud.markdown b/source/_integrations/nextcloud.markdown
index f2c8edad40b..9be8ffc562b 100644
--- a/source/_integrations/nextcloud.markdown
+++ b/source/_integrations/nextcloud.markdown
@@ -35,3 +35,100 @@ This integration has the following Nextcloud Server prerequisites:
- (Recommended) A Nextcloud App password should be generated for use in Home Assistant (__*Nextcloud*__ > __*Settings*__ > __*Personal*__ > __*Security*__ > __*Devices & sessions*__ > __*Create new app password*__)
{% include integrations/config_flow.md %}
+
+## Sensors
+
+For each entry, the integration will create the following {% term sensors %}:
+
+| Sensor | Enabled by default |
+| ------ | ------------------ |
+| Amount of active users last 5 minutes | ✅ |
+| Amount of active users last day | ✅ |
+| Amount of active users last hour | ✅ |
+| Amount of files | ✅ |
+| Amount of group shares | ✅ |
+| Amount of link shares | ✅ |
+| Amount of local storages | ✅ |
+| Amount of mail shares | ✅ |
+| Amount of other storages | ✅ |
+| Amount of passwordless link shares | ✅ |
+| Amount of room shares | ✅ |
+| Amount of shares | ✅ |
+| Amount of shares received | ✅ |
+| Amount of shares sent | ✅ |
+| Amount of storages | ✅ |
+| Amount of storages at home | ✅ |
+| Amount of user | ✅ |
+| Amount of user shares | ✅ |
+| Apps installed | ✅ |
+| Avatars enabled | ✅ |
+| CPU load last 1 minute | ✅ |
+| CPU load last 15 minutes | ✅ |
+| CPU load last 5 minutes | ✅ |
+| Cache TTL | ❌ |
+| Cache expunges | ❌ |
+| Cache memory | ❌ |
+| Cache memory size | ✅ |
+| Cache number of entries | ❌ |
+| Cache number of hits | ❌ |
+| Cache number of inserts | ❌ |
+| Cache number of misses | ❌ |
+| Cache number of slots | ❌ |
+| Cache start time | ❌ |
+| Database size | ✅ |
+| Database type | ✅ |
+| Database version | ✅ |
+| Debug enabled | ✅ |
+| Filelocking enabled | ✅ |
+| Free memory | ✅ |
+| Free space | ✅ |
+| Free swap memory | ✅ |
+| Interned buffer size | ❌ |
+| Interned free memory | ❌ |
+| Interned number of strings | ❌ |
+| Interned used memory | ❌ |
+| JIT active | ❌ |
+| JIT buffer free | ❌ |
+| JIT buffer size | ❌ |
+| JIT enabled | ❌ |
+| JIT kind | ❌ |
+| JIT opt flags | ❌ |
+| JIT opt level | ❌ |
+| Opcache blacklist miss ratio | ❌ |
+| Opcache blacklist misses | ❌ |
+| Opcache cached keys | ❌ |
+| Opcache cached scripts | ❌ |
+| Opcache current wasted percentage | ❌ |
+| Opcache free memory | ❌ |
+| Opcache hash restarts | ❌ |
+| Opcache hit rate | ❌ |
+| Opcache hits | ❌ |
+| Opcache last restart time | ❌ |
+| Opcache manual restarts | ❌ |
+| Opcache max cached keys | ❌ |
+| Opcache misses | ❌ |
+| Opcache out of memory restarts | ❌ |
+| Opcache start time | ❌ |
+| Opcache used memory | ❌ |
+| Opcache wasted memory | ❌ |
+| PHP max execution time | ✅ |
+| PHP memory limit | ✅ |
+| PHP upload maximum filesize | ✅ |
+| PHP version | ✅ |
+| Previews enabled | ✅ |
+| SMA available memory | ❌ |
+| SMA number of segments | ❌ |
+| SMA segment size | ❌ |
+| System memcache distributed | ❌ |
+| System memcache local | ❌ |
+| System memcache locking | ❌ |
+| System theme | ✅ |
+| System version | ✅ |
+| Total memory | ✅ |
+| Total swap memory | ✅ |
+| Updates available | ✅ |
+| Webserver | ✅ |
+
+## Update entity
+
+An {% term update %} entity will be created for each entry.
diff --git a/source/_integrations/russound_rio.markdown b/source/_integrations/russound_rio.markdown
index dfe280966f8..7db8867b7dd 100644
--- a/source/_integrations/russound_rio.markdown
+++ b/source/_integrations/russound_rio.markdown
@@ -27,6 +27,7 @@ This integration allows you to connect the following controllers:
- Russound MBX-PRE
- Russound MBX-AMP
+- Russound ACA-E5
- Russound MCA-C3
- Russound MCA-C5
- Russound MCA-66
diff --git a/source/_integrations/russound_rnet.markdown b/source/_integrations/russound_rnet.markdown
index 1030d639a95..4f7828622d0 100644
--- a/source/_integrations/russound_rnet.markdown
+++ b/source/_integrations/russound_rnet.markdown
@@ -27,7 +27,6 @@ Connecting to the Russound device is only possible by TCP, you can make use of a
This integration allows you to connect the following controllers:
-- Russound ACA-E5
- Russound CAS44
- Russound CAA66
- Russound CAM6.6
diff --git a/source/_integrations/scrape.markdown b/source/_integrations/scrape.markdown
index 3d19471847e..fd53b078ccb 100644
--- a/source/_integrations/scrape.markdown
+++ b/source/_integrations/scrape.markdown
@@ -54,6 +54,10 @@ payload:
description: The payload to send with a POST request. Depends on the service, but usually formed as JSON.
required: false
type: string
+payload_template:
+ description: The payload to send with a POST request with template support.
+ required: false
+ type: template
verify_ssl:
description: Verify the SSL certificate of the endpoint.
required: false
diff --git a/source/_integrations/spotify.markdown b/source/_integrations/spotify.markdown
index 8ec0fdb380a..179837fbc73 100644
--- a/source/_integrations/spotify.markdown
+++ b/source/_integrations/spotify.markdown
@@ -29,7 +29,7 @@ library from Home Assistant.
- Spotify compatible playback [source](#selecting-output-source) device
- A Spotify Developer application. Instructions for that are in
the next step.
-
+
### Create a Spotify application
For Home Assistant to communicate with Spotify, we need to create
@@ -45,17 +45,17 @@ to allow you to log in with your Spotify account.
3. Select the [**Create app**](https://developer.spotify.com/dashboard/create) button in the top right.
- 
-
+ 
+
4. Enter a name and description; feel free to use any name and description you like.
- Set the _"Redirect URI"_ to the following:
-
- `https://my.home-assistant.io/redirect/oauth`
+ - Set the _"Redirect URI"_ to the following:
- Please copy and paste the exact URL above. You **do not** have to change it.
+ `https://my.home-assistant.io/redirect/oauth`
- 
+ - Please copy and paste the exact URL above. You **do not** have to change it.
+
+ 
5. Select Web API.
@@ -65,22 +65,22 @@ to allow you to log in with your Spotify account.
7. Spotify will now show the new application you have just created. Select
the **Settings** button in the top right to configure it.
- 
+ 
8. Before we can start configuring Home Assistant, we need to grab the application
credentials Home Assistant needs.
- Select on the **View client secret** button to reveal the client secret.
+ - Select on the **View client secret** button to reveal the client secret.
- 
+ 
9. The _"Client ID"_ and _"Client secret"_ are the two pieces of information
that Home Assistant needs to communicate with Spotify and is what we
call: Application credentials.
- 
+ 
- You will need the _"Client ID"_ and _"Client secret"_ during the Spotify
+ - You will need the _"Client ID"_ and _"Client secret"_ during the Spotify
integration setup process in Home Assistant.
You can now continue with the next chapter to configure the Spotify integration
@@ -103,7 +103,7 @@ Internal examples: `http://192.168.0.2:8123/auth/external/callback`, `http://hom
## Data updates
-The integration polls at least every 30 seconds.
+The integration {% term polling polls %} at least every 30 seconds.
If the track that is playing ends in less than 30 seconds, the integration will poll again after the track has ended to update the state again.
## Using multiple Spotify accounts
diff --git a/source/_integrations/sql.markdown b/source/_integrations/sql.markdown
index dc7daae9421..f2f8e0b7a2a 100644
--- a/source/_integrations/sql.markdown
+++ b/source/_integrations/sql.markdown
@@ -120,6 +120,17 @@ sql:
type: template
{% endconfiguration %}
+## Data updates
+
+By default, the integration executes the SQL query to update the sensor every 30 seconds.
+If you wish to update at a different interval, you can disable the automatic refresh in the integration’s system options (**Enable polling for updates**) and create your own automation with your desired frequency.
+
+For more detailed steps on how to define a custom interval, follow the procedure below.
+
+### Defining a custom polling interval
+
+{% include common-tasks/define_custom_polling.md %}
+
## Information
See [supported engines](/integrations/recorder/#custom-database-engines) for which you can connect with this integration.
diff --git a/source/_integrations/template.markdown b/source/_integrations/template.markdown
index 220b3a11700..60ce3bd9775 100644
--- a/source/_integrations/template.markdown
+++ b/source/_integrations/template.markdown
@@ -352,7 +352,7 @@ cover:
type: map
keys:
state:
- description: Defines a template to get the state of the cover. Valid output values from the template are `open`, `opening`, `closing` and `closed` which are directly mapped to the corresponding states. In addition, `true` is valid as a synonym to `open` and `false` as a synonym to `closed`. If [both a `value_template` and a `position_template`](#combining-value_template-and-position_template) are specified, only `opening` and `closing` are set from the `value_template`. If the template produces a `None` value the state will be set to `unknown`.
+ description: Defines a template to get the state of the cover. Valid output values from the template are `open`, `opening`, `closing` and `closed` which are directly mapped to the corresponding states. In addition, `true` is valid as a synonym to `open` and `false` as a synonym to `closed`. If [both a `state` and a `position` template](/integrations/cover.template/#combining-value_template-and-position_template) are specified, only `opening` and `closing` are set from the `state` template. If the template produces a `None` value the state will be set to `unknown`.
required: false
type: template
position:
diff --git a/source/_integrations/tts.markdown b/source/_integrations/tts.markdown
index dbf10248b44..06aff3f940d 100644
--- a/source/_integrations/tts.markdown
+++ b/source/_integrations/tts.markdown
@@ -46,7 +46,7 @@ Screenshot showing the state of a text-to-speech entity in the developer tools.
Modern platforms will create entities under the `tts` domain, where each entity represents one text-to-speech service provider. These entities may be used as targets for the `tts.speak` action.
-the `tts.speak` action supports `language` and on some platforms also `options` for settings, e.g., _voice, motion, speed, etc_. The text that should be spoken is set with `message`, and the media player that should output the sound is selected with `media_player_entity_id`.
+The `tts.speak` action supports `message`, `language`, `cache`, `media_player_entity_id` and `options` options. The text that should be spoken is set with `message`, and the media player that should output the sound is selected with `media_player_entity_id`. The language can be set with `language`, using the format required by the target entity platform (refer to specific platform documentation). See [cache section](#cache) for information on `cache` option. Additional settings can be specified with the `options` option, which include preferred audio settings (see [preferred audio settings](#preferred-audio-settings) section for more info) and further settings of the target entity platform, e.g., _voice, motion, speed, etc._ (refer to specific platform documentation for any supported settings).
```yaml
action: tts.speak
@@ -59,7 +59,7 @@ data:
### Action say (legacy)
-The `say` action supports `language` and on some platforms also `options` for settings, e.g., _voice, motion, speed, etc_. The text that should be spoken is set with `message`. Since release 0.92, action name can be defined in configuration `service_name` option.
+The `say` action supports `message`, `language`, `cache` and `options` options. The text that should be spoken is set with `message`. The language can be set with `language`, using the format required by the platform (refer to specific platform documentation). See [cache section](#cache) for information on `cache` option. Additional settings can be specified with the `options` option, which include preferred audio settings (see [preferred audio settings](#preferred-audio-settings) section for more info) and further settings of the target platform, e.g., _voice, motion, speed, etc._ (refer to specific platform documentation for any supported settings). Since release 0.92, action name can be defined in configuration `service_name` option.
Say to all `media_player` entities:
@@ -105,13 +105,40 @@ data:
## Cache
-The integration cache can be controlled with the `cache` option in the action to `speak` or `say`. A long time cache will be located on the file system. The in-memory cache for fast responses to media players will be auto-cleaned after a short period.
+The integration cache can be controlled with the `cache` option in the action to `speak` or `say`, setting it to `True` to enable it (default), or `False` to disable it. A long time cache will be located on the file system. The in-memory cache for fast responses to media players will be auto-cleaned after a short period.
+
+## Preferred audio settings
+
+Each TTS platform produces audio samples in different formats, not always compatible with every media player. TTS integration building block supports a way to configure preferred target audio format through `options` option of `speak` or `say` actions.
+
+TTS integration building block uses [FFmpeg integration](/integrations/ffmpeg) to perform audio transcoding when target entity platform does not support one or all the specified preferred audio format settings (refer to specific platform documentation for any supported setting with related supported values).
+
+Available preferred audio settings, all optional, are:
+
+- `preferred_format`: Set the audio format. When not supported by the target entity platform, the value is a file extension like `wav`, `mp3`, `ogg`, etc., among ones supported by FFmpeg tool for output files.
+- `preferred_sample_rate`: Set the sample rate. When not supported by the target entity platform, the value is in Hz as a number, among ones supported by the `-ar` parameter of FFmpeg tool.
+- `preferred_sample_channels`: Set the number of audio channels. When not supported by the target entity platform, the value is a number among ones supported by the `-ac` parameter of FFmpeg tool.
+- `preferred_sample_bytes`: Set the audio bit sampling. When not supported by the target entity platform, can only be set to `2` to use 16-bit audio sampling (any other value is ignored).
+
+Example to produce an MP3 audio at 22050Hz:
+
+```yaml
+action: tts.speak
+target:
+ entity_id: tts.example
+data:
+ media_player_entity_id: media_player.kitchen
+ message: "May the force be with you."
+ options:
+ preferred_format: mp3
+ preferred_sample_rate: 22050
+```
## REST API
### POST `/api/tts_get_url`
-Returns a URL to the generated TTS file. The `engine_id` or `platform` parameter together with `message` are required.
+Returns a URL to the generated TTS file. The `engine_id` (which is the entity id) or `platform` parameter together with `message` are required. Additional parameters `cache`, `language` and `options` are supported, as JSON attributes, as described for `speak` action.
```json
{
@@ -166,3 +193,9 @@ These requirements present the following problems, all of which create problems
- If you are using SSL (e.g., `https://yourhost.example.org/...`) then you _must_ use the hostname in the certificate (e.g., `external_url: https://yourhost.example.org`). You cannot use an IP address since the certificate won't be valid for the IP address, and the cast device will refuse the connection.
The recommended way to overcome these obstacles is to not manually configure a local Home Assistant URL.
+
+### Partial, corrupted or no audio
+
+Some media players could reproduce only partial, corrupted or no audio at all when the audio format is not fully supported. In such cases it is required to experiment with different combinations of audio formats, channels, sample rates and bits using [preferred audio settings](#preferred-audio-settings) options.
+
+For example, some Google Cast devices skip initial audio part when the audio is sampled at 22050Hz, and to fix the problem it is required to set the `preferred_sample_rate` setting in the `options` option to `44100`.
diff --git a/source/_integrations/zwave_js.markdown b/source/_integrations/zwave_js.markdown
index 803f6f0c602..1d694775bdd 100644
--- a/source/_integrations/zwave_js.markdown
+++ b/source/_integrations/zwave_js.markdown
@@ -82,7 +82,7 @@ For more Z-Wave term definitions, refer to the [terminology section](#z-wave-ter
To run a Z-Wave network, you need the following elements:
- A [supported Z-Wave controller](/docs/z-wave/controllers/#supported-z-wave-usb-sticks--hardware-modules). First-time user? For recommendations on what to buy, go [here](#which-z-wave-controller-should-i-buy).
-- A running Z-Wave JS server.
+- A running [Z-Wave JS server](#setting-up-a-z-wave-js-server).
- An installed Z-Wave integration in Home Assistant.
### Setting up a Z-Wave JS server
@@ -155,6 +155,8 @@ While your Z-Wave mesh is permanently stored on your dongle, the additional meta
### Removing a device from the Z-Wave network
+Do this before using the device with another controller, or when you don't use the device anymore. It removes the device from the Z-Wave network stored on the controller. It also removes the device and all its entities from Home Assistant. You can not join a device to a new network if it is still paired with a controller.
+
1. In Home Assistant, go to {% my integrations title="**Settings** > **Devices & services**" %}.
2. Select the **Z-Wave** integration. Then, select **Configure**.
3. Select **Remove device**, then **Start exclusion**.
@@ -162,6 +164,23 @@ While your Z-Wave mesh is permanently stored on your dongle, the additional meta
4. Put the device you want to remove in exclusion mode. Refer to its manual how this is done.
5. The UI should confirm that the device was removed and the device and entities will be removed from Home Assistant.
+## Migrating a Z-Wave network to a new controller
+
+Do this if you have an existing Z-Wave network and want to use a new controller. This will reset your current controller (remove all network information from it) and remove the controller from Home Assistant. The Z-Wave integration with all its entities will stay in Home Assistant. The new controller is added to Home Assistant and paired with the existing network.
+
+To migrate a Z-Wave network to a new controller, follow these steps:
+
+1. In Home Assistant, go to {% my integrations title="**Settings** > **Devices & services**" %}.
+2. Select the **Z-Wave** integration. Then, select **Configure**.
+3. Under **Backup and restore**, select **Migrate controller**.
+4. Select **Migrate to a new controller**.
+ - To confirm device reset, select **Submit**.
+ - **Info**: This will initiate a backup of the network information and factory reset the controller. All the stored network information will be removed.
+5. When the **Unplug your controller** dialog shows up, unplug your old controller.
+ - Connect the new controller.
+ - Confirm that you connected the new controller by selecting **Submit**.
+6. Follow the steps on screen.
+
## Special Z-Wave entities
The Z-Wave integration provides several special entities, some of which are available for every Z-Wave device, and some of which are conditional based on the device.
@@ -1062,3 +1081,25 @@ No further action is required and the SmartStart product will be added automatic
### Terminology mapping table
For some of the concepts, the terminology used in Home Assistant does not correspond to the terminology used in Z-Wave documentation. Refer to the [terminology mapping table](#z-wave-terminology-and-home-assistant) for a list of term equivalents.
+
+## Removing Z-Wave JS from Home Assistant
+
+This removes all paired Z-Wave devices and their entities, the Z-Wave JS add-on, and the Z-Wave integration from Home Assistant.
+
+### To remove Z-Wave JS from Home Assistant
+
+1. [Remove the device from your Z-Wave network](/integrations/zwave_js/#removing-a-device-from-the-z-wave-network).
+ - Do this for each device that is joined to your network so that it is no longer paired to the controller.
+ - You cannot add a device to a new controller while it is still paired with an old one.
+ - Alternatively, you can factory reset each device. Refer to the device manual to see how this is done.
+ - This usually involves finding the device in your household and pressing a button.
+2. Remove the Z-Wave integration.
+ - Go to {% my integrations title="**Settings** > **Devices & services**" %} and select the integration card.
+ - Next to the integration entry, select the three-dot {% icon "mdi:dots-vertical" %} menu.
+ - Select **Delete**.
+3. If it hasn't been deleted automatically, remove the Z-Wave JS add-on.
+ - Go to {% my supervisor_addon addon="core_zwave_js" title="**Settings** > **Add-ons** > **Z-Wave JS**" %}.
+ - Select **Uninstall**.
+ - Decide whether to also delete the data related to the add-on or whether to keep it.
+4. Done. Z-Wave JS is now completely removed from your Home Assistant server.
+ - You can now use your Z-Wave devices and controller on a new server.
diff --git a/source/common-tasks/general.markdown b/source/common-tasks/general.markdown
index aa6bd725dbb..13a39e928d6 100644
--- a/source/common-tasks/general.markdown
+++ b/source/common-tasks/general.markdown
@@ -13,11 +13,11 @@ This section provides tasks that do not depend on a specific Home Assistant inst
If you want to define a specific interval at which your device is being polled for data, you can disable the default polling interval and create your own polling automation.
-## What is data polling?
+### What is data polling?
Data polling is the process of querying a device or service at regular intervals to check for updates or retrieve data. By defining a custom polling interval, you can control how frequently your system checks for new data, which can help optimize performance and reduce unnecessary network traffic.
-## Why use an automation instead of changing the integration's polling configuration?
+### Why use an automation instead of changing the integration's polling configuration?
Creating an automation for polling gives you more flexibility on when to poll:
diff --git a/source/common-tasks/os.markdown b/source/common-tasks/os.markdown
index 833a4e851ae..e49b4b6a7be 100644
--- a/source/common-tasks/os.markdown
+++ b/source/common-tasks/os.markdown
@@ -31,7 +31,9 @@ If you have the {% term "Home Assistant Operating System" %} installed, you rece
- {% term "Home Assistant Operating System" %}
- {% term "Home Assistant Supervisor" %}
- {% term "Home Assistant Core" %}
-- Add-ons, if you have any installed
+- {% term "Add-ons" %}, if you have any installed
+
+Each of these components needs to be updated separately.
### Updating the Home Assistant Operating System
@@ -39,8 +41,9 @@ Updates of the {% term "Home Assistant Operating System" %} are independent of o
#### Prerequisites
-- [Backup](/common-tasks/general/#backups) your installation.
- - Make sure the backup is downloaded and stored outside of the system.
+- [Backup your installation](/common-tasks/general/#backups).
+ - Make sure the backup is stored on a [backup location](/common-tasks/general/#defining-backup-locations) outside of the device where Home Assistant is installed.
+ - For example, if Home Assistant is installed on [Home Assistant Green](https://www.home-assistant.io/green), make sure it is stored on [Home Assistant Cloud](/common-tasks/general/#about-the-backup-storage-on-home-assistant-cloud) or another location.
- So that you can [restore from that backup](/common-tasks/general/#restoring-a-backup) in case there is an issue with the system.
#### To update the Home Assistant Operating System
@@ -52,9 +55,16 @@ Updates of the {% term "Home Assistant Operating System" %} are independent of o
1. Open the **Settings** panel.
2. On the top you will be presented with an update notification.
-
- _If you do not see that notification, in the top right, select the three dots menu and select **Check for updates**"._
-
+ - **Troubleshooting**: If you do not see that notification:
+ - In the top right corner, select the three dots {% icon "mdi:dots-vertical" %} menu and select **Check for updates**.
+ - Go to {% my updates title="**System** > **Updates**" %}.
+ - Select the update notification.
+ - Select the cogwheel {% icon "mdi:cog-outline" %}, then set **Visible** to active.
+ 3. Open the notification for the component you want to update.
+ 4. If you want to update the system first (recommended), enable the backup toggle.
+ 5. Select **Update**.
+ 6. Check if there are any repair issues and check the logs to see if there are any issues with your configuration that need to be addressed.
+
- title: Using the CLI
content: |
@@ -66,6 +76,8 @@ Updates of the {% term "Home Assistant Operating System" %} are independent of o
{% endtabbed_block %}
+{% details "Advanced: changing the boot slot used during the update" %}
+
#### About boot slots used during the update
The {% term "Home Assistant Operating System" %} uses two boot slots. On first installation, boot slot A is used. After that, on each Operating System update, the other boot slot is updated and reboot is triggered. On that reboot, the system boots from the other boot slot (A ➝ B ➝ A,...). When booting fails, the system automatically uses the previous boot slot, so that it boots from the last working operating system.
@@ -89,6 +101,8 @@ You can manually define that the previous boot slot is used. This can be useful
Alternatively, if the Operating Systems runs on a platform that uses the GRUB bootloader, a boot menu is presented early in the boot. The alternative boot slot can be selected here, marking it active for future boots if the following boot attempt is successful.
+{% enddetails %}
+
### Updating Home Assistant Core
{% include common-tasks/update.md %}
diff --git a/source/green/index.html b/source/green/index.html
index 794deaf24c8..542d3575c21 100644
--- a/source/green/index.html
+++ b/source/green/index.html
@@ -485,8 +485,7 @@ dark_header: true
- Home Assistant Green is the easiest way to run Home Assistant for the
- low price of $99. Try out Home Assistant for your smart home or share
+ Home Assistant Green is the easiest way to run Home Assistant. Try out Home Assistant for your smart home or share
the love with family and friends.
diff --git a/source/images/assist/esp32-atom_silence_detection_01.png b/source/images/assist/esp32-atom_silence_detection_01.png
index 1821369c6f8..bcccc6a1fd5 100644
Binary files a/source/images/assist/esp32-atom_silence_detection_01.png and b/source/images/assist/esp32-atom_silence_detection_01.png differ
diff --git a/source/images/frontpage/community-day-2025.webp b/source/images/frontpage/community-day-2025.webp
deleted file mode 100644
index 9b70ed29e4e..00000000000
Binary files a/source/images/frontpage/community-day-2025.webp and /dev/null differ
diff --git a/source/images/frontpage/community-meetup.webp b/source/images/frontpage/community-meetup.webp
new file mode 100644
index 00000000000..dd4d039c31c
Binary files /dev/null and b/source/images/frontpage/community-meetup.webp differ
diff --git a/source/installation/troubleshooting.markdown b/source/installation/troubleshooting.markdown
index d857dd4c224..e480fd0c72e 100644
--- a/source/installation/troubleshooting.markdown
+++ b/source/installation/troubleshooting.markdown
@@ -72,7 +72,7 @@ You are in the onboarding procedure, but the process seems stuck at the step **P
### Resolution
-1. Select the pulsing blue dot to view the log files.
+1. Select **Show details** to view the log files.
- The log files might provide more information on the current status.
2. Make sure your network has internet access.
- During first startup, time will be synchronized. Ensure NTP is allowed in your network.
diff --git a/source/more-info/unsupported/lxc.markdown b/source/more-info/unsupported/lxc.markdown
index 4e2c24ea615..e5385dbc0f6 100644
--- a/source/more-info/unsupported/lxc.markdown
+++ b/source/more-info/unsupported/lxc.markdown
@@ -12,4 +12,4 @@ with the Supervisor is not supported.
## The solution
You need to reinstall the host operating system that runs the Supervisor,
-for instructions on how to prosed with that [have a look here](/more-info/unsupported/os).
+for instructions on how to proceed with that [have a look here](/more-info/unsupported/os).
diff --git a/source/voice-pe/index.html b/source/voice-pe/index.html
index d16b2fd2f7f..8f8e9ebd249 100644
--- a/source/voice-pe/index.html
+++ b/source/voice-pe/index.html
@@ -208,7 +208,7 @@ frontpage_image: /images/frontpage/voice-pe-frontpage.jpg
Preview the future of voice for just
-
$59*
+
$69 / €59 *
@@ -217,7 +217,7 @@ frontpage_image: /images/frontpage/voice-pe-frontpage.jpg
alt="Front view of the Voice Preview Edition showing the speaker holes">
Buy now
-
* Recommended MSRP. Pricing subject to individual retailers.
+
* Recommended MSRP. Prices differ between regions due to varying local market costs and conditions, and subject to individual retailers.
diff --git a/source/voice-pe/styles.css b/source/voice-pe/styles.css
index 4f7e836a838..f591f1e456a 100644
--- a/source/voice-pe/styles.css
+++ b/source/voice-pe/styles.css
@@ -174,14 +174,19 @@ article.page h3 {
--subtitle-medium-mobile: 24;
--price: 170;
- --price-mobile: 120;
-
+ --price-mobile: 60;
+
--wrapper-radius: 0px;
-
+
isolation: isolate;
position: relative;
}
+@media only screen and (min-width: 875px) {
+ :root{
+ --price-mobile: 120;
+ }
+}
@media only screen and (min-width: 2180px) {
.vpe-main {
--wrapper-radius: 40px;
@@ -2881,7 +2886,7 @@ section#hero .bg-gradient {
background-clip: text;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
- margin-bottom: -20px;
+ margin-bottom: -10px;
display: flex;
margin-top: 8px;
}
@@ -4894,6 +4899,11 @@ section#hero .bg-gradient {
}
}
+@media (min-width: 940px) {
+ .vpe-main #pricing .fs-price {
+ margin-bottom: -10px;
+ }
+}
@media (min-width: 940px) {
.vpe-main {
--columns: 11;
@@ -5190,7 +5200,7 @@ section#hero .bg-gradient {
}
.vpe-main #pricing .fs-price {
- margin-bottom: -26px;
+ margin-bottom: -20px;
margin-top: 20px;
}
diff --git a/source/voice_control/index.markdown b/source/voice_control/index.markdown
index cbdc67b036f..92fd1d894f3 100644
--- a/source/voice_control/index.markdown
+++ b/source/voice_control/index.markdown
@@ -30,7 +30,7 @@ As for the rest of Home Assistant core functionalities, Assist can be personaliz
-## Getting Started
+## Getting started
When you configure voice assistant hardware made for Home Assistant, it will use a wizard to help you configure your system and get started to use voice.
@@ -41,7 +41,7 @@ In case your hardware does not support our wizard, do not worry. Here are two de
- [I plan to process my voice locally](/voice_control/voice_remote_local_assistant/)
- [I plan to use Home Assistant Cloud](/voice_control/voice_remote_cloud_assistant/) (recommended as it is the simplest)
-## Expand and Experiment
+## Expand and experiment
Once your setup is up and running and you follow the [best practices](/voice_control/best_practices), check all the possibilities we found for [Expanding your Assist setup](/voice_control/expanding_assist), and further experiment with different setups like [wake words](/voice_control/about_wake_word/). Do you want to talk to Super Mario? Or another figure? If you want Assist to respond in a fun way, you can create an assistant with an [AI personality](/voice_control/assist_create_open_ai_personality/).
diff --git a/source/voice_control/thirteen-usd-voice-remote.markdown b/source/voice_control/thirteen-usd-voice-remote.markdown
index 6bb74278405..079419eeed9 100644
--- a/source/voice_control/thirteen-usd-voice-remote.markdown
+++ b/source/voice_control/thirteen-usd-voice-remote.markdown
@@ -70,18 +70,15 @@ Before you can use this device with Home Assistant, you need to install a bit of

-6. To add the newly discovered device, select the ATOM Echo from the list.
- - Add your ATOM Echo to a room and select **Finish**.
-7. You should now see the **ESPHome** integration.
- 
-8. Select the **ESPHome** integration. Under **Devices**, you should see the **M5Stack Atom Echo** listed.
- 
- - Your ATOM Echo is connected to Home Assistant over Wi-Fi. You can now move it to any place in your home with a USB power supply.
-9. Congratulations! You can now voice control Home Assistant. Now give some commands.
+6. This starts the a wizard to customize the your voice assistant.
+ - Follow the wizard steps to define the wake word and choose the voice.
+ - When you are finished, select **Done**.
+7. Your ATOM Echo is connected to Home Assistant over Wi-Fi. You can now move it to any place in your home with a USB power supply.
+8. Congratulations! You can now voice control Home Assistant. Now give some commands.
## Controlling Home Assistant over the ATOM Echo
-1. Say your wake word. For this tutorial, use "OK, Nabu".
+1. Say the wake word you configured. For example, use "OK, Nabu".
- Wait for the LED to start blinking in blue.
2. Say a [supported voice command](/voice_control/builtin_sentences/). For example, *Turn off the light in the kitchen*.
- While you are speaking, the blue LED keeps pulsing.
@@ -93,8 +90,8 @@ Before you can use this device with Home Assistant, you need to install a bit of
3. Your command is not supported? Add your own commands using [a sentence trigger](/voice_control/custom_sentences/).
4. You find ATOM Echo takes too long to start processing your command?
- Adjust the silence detection settings.
- - Go to {% my integrations title="**Settings** > **Devices & Services**" %} and select the **ESPHome** integration.
- - Under **M5Stack ATOM Echo**, select **1 device**. Under **Configuration**, change the **Finish speaking detection**.
+ - Go to {% my integrations title="**Settings** > **Devices & services**" %} and select the **ESPHome** integration.
+ - Under **M5Stack ATOM Echo**, select **1 device**. Under **Configuration**, change the **Finished speaking detection**.
- This setting defines how much silence is needed for Assist to find you're done speaking and it can start processing your command.

@@ -104,3 +101,21 @@ Before you can use this device with Home Assistant, you need to install a bit of
Are things not working as expected?
- Checkout the [general troubleshooting section for Assist](/voice_control/troubleshooting/).
+
+## Removing the Wi-Fi credentials from the ATOM Echo
+
+If you no longer use the device or want to pass it on to someone else, you can remove the Wi-Fi credentials that are stored on the device.
+
+1. Make sure this page is opened in a Chromium-based browser on a desktop. It does not work on a tablet or phone.
+ - Select the **Connect** button below. If your browser does not support web serial, you will see a warning instead of a button.
+
+
+
+
+2. To connect the ATOM Echo to your computer, follow these steps:
+ - In the pop-up window, view the available ports.
+ - Plug the USB-C cable into the ATOM Echo and connect it to your computer.
+ - In the pop-up window, there should now appear a new entry. Select this USB serial port and select **Connect**.
+3. In the dialog, select **Erase user data**.
+ - **Result**: Your Wi-Fi credentials are deleted from the device.
+ - The firmware stays on the device.