diff --git a/README.de.md b/README.de.md
index ef604f16..f2c2b8ff 100644
--- a/README.de.md
+++ b/README.de.md
@@ -156,6 +156,11 @@ docker run -p 3000:3000 ghcr.io/docmd-io/docmd:0.9.0
## Warum docmd?
+
+
+
+
+
+
+**Vollständiger [Vergleich mit Docusaurus, Mintlify und weiteren →](https://docs.docmd.io/de/comparison/)**
## Features
diff --git a/README.es.md b/README.es.md
index 6eec2bea..7265d90d 100644
--- a/README.es.md
+++ b/README.es.md
@@ -157,6 +157,11 @@ docker run -p 3000:3000 ghcr.io/docmd-io/docmd:0.9.0
## ¿Por qué docmd?
+
+
+
+
+
+
+**Vea la [Comparativa completa con Docusaurus, Mintlify y otros →](https://docs.docmd.io/es/comparison/)**
## Características
diff --git a/README.fr.md b/README.fr.md
index 36cf6138..36b37e81 100644
--- a/README.fr.md
+++ b/README.fr.md
@@ -157,6 +157,11 @@ docker run -p 3000:3000 ghcr.io/docmd-io/docmd:0.9.0
## Pourquoi docmd ?
+
+
+
+
+
+
+**Voir la [Comparaison complète avec Docusaurus, Mintlify et autres →](https://docs.docmd.io/comparison/)**
## Fonctionnalités
diff --git a/README.ja.md b/README.ja.md
index 41bad3e4..027cb139 100644
--- a/README.ja.md
+++ b/README.ja.md
@@ -149,6 +149,11 @@ docker run -p 3000:3000 ghcr.io/docmd-io/docmd:0.9.0
## なぜ docmd なのか?
+
+
+
+
+
+
+**[Docusaurus、Mintlify などとの完全な比較を見る →](https://docs.docmd.io/comparison/)**
## 主な特徴
diff --git a/README.md b/README.md
index 1850e092..64da6b83 100644
--- a/README.md
+++ b/README.md
@@ -37,7 +37,7 @@
-
+
@@ -158,7 +158,7 @@ docker run -p 3000:3000 ghcr.io/docmd-io/docmd:0.9.0
## Why docmd?
-
+
+
+**Смотрите полное [Сравнение с Docusaurus, Mintlify и другими →](https://docs.docmd.io/comparison/)**
## Особенности
diff --git a/README.zh.md b/README.zh.md
index da728520..44364f25 100644
--- a/README.zh.md
+++ b/README.zh.md
@@ -149,6 +149,11 @@ docker run -p 3000:3000 ghcr.io/docmd-io/docmd:0.9.0
## 为什么选择 docmd?
+
+
+
+
+
+
+**查看与 Docusaurus、Mintlify 等的 [完整对比 →](https://docs.docmd.io/zh/comparison/)**
## 核心特性
diff --git a/assets/docmd-comparison.webp b/assets/docmd-comparison.webp
new file mode 100644
index 00000000..5d7e4e18
Binary files /dev/null and b/assets/docmd-comparison.webp differ
diff --git a/assets/docmd-cover-old.webp b/assets/docmd-cover-old.webp
new file mode 100644
index 00000000..47f01ab0
Binary files /dev/null and b/assets/docmd-cover-old.webp differ
diff --git a/assets/docmd-cover.webp b/assets/docmd-cover.webp
index 47f01ab0..14806de6 100644
Binary files a/assets/docmd-cover.webp and b/assets/docmd-cover.webp differ
diff --git a/package.json b/package.json
index ca05e9b1..fdc9d1e1 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "@docmd/monorepo",
- "version": "0.9.1",
+ "version": "0.9.2",
"private": true,
"description": "The minimalist, zero-config documentation generator monorepo.",
"scripts": {
@@ -39,7 +39,7 @@
"eslint": "^10.8.1",
"globals": "^17.9.0",
"typescript": "^6.0.3",
- "typescript-eslint": "^8.66.0"
+ "typescript-eslint": "^8.67.0"
},
"engines": {
"node": ">=20.0.0"
diff --git a/packages/api/package.json b/packages/api/package.json
index cfa6e687..554ec555 100644
--- a/packages/api/package.json
+++ b/packages/api/package.json
@@ -1,6 +1,6 @@
{
"name": "@docmd/api",
- "version": "0.9.1",
+ "version": "0.9.2",
"description": "Plugin API surface for docmd.",
"type": "module",
"main": "dist/index.js",
diff --git a/packages/api/registry/plugins.generated.json b/packages/api/registry/plugins.generated.json
index 2333319f..26c527d1 100644
--- a/packages/api/registry/plugins.generated.json
+++ b/packages/api/registry/plugins.generated.json
@@ -1,6 +1,6 @@
{
"$meta": {
- "generatedAt": "2026-08-10T14:40:02.534Z",
+ "generatedAt": "2026-08-11T09:51:31.180Z",
"generator": "scripts/build-plugin-registry.mjs",
"packageCount": 16
},
diff --git a/packages/core/README.md b/packages/core/README.md
index 116cd8c7..553236e1 100644
--- a/packages/core/README.md
+++ b/packages/core/README.md
@@ -151,6 +151,11 @@ docker run -p 3000:3000 ghcr.io/docmd-io/docmd:0.9.0
## Why docmd?
+
+
+
+
+
+
+**See Complete [Comparison with Docusaurus, Mintlify and others →](https://docs.docmd.io/comparison/)**
## Features
diff --git a/packages/core/package.json b/packages/core/package.json
index 9e967a34..a6187696 100644
--- a/packages/core/package.json
+++ b/packages/core/package.json
@@ -1,6 +1,6 @@
{
"name": "@docmd/core",
- "version": "0.9.1",
+ "version": "0.9.2",
"description": "Build production-ready documentation from Markdown in seconds. No React, no bloat, just content.",
"type": "module",
"browser": false,
diff --git a/packages/deployer/package.json b/packages/deployer/package.json
index 4b0705e4..3a4e719e 100644
--- a/packages/deployer/package.json
+++ b/packages/deployer/package.json
@@ -1,6 +1,6 @@
{
"name": "@docmd/deployer",
- "version": "0.9.1",
+ "version": "0.9.2",
"description": "Deployment configuration generator for docmd - Docker, Nginx, Caddy, GitHub Pages, Vercel, and Netlify.",
"type": "module",
"main": "dist/index.js",
diff --git a/packages/engines/js/package.json b/packages/engines/js/package.json
index 816f0c30..19b56c67 100644
--- a/packages/engines/js/package.json
+++ b/packages/engines/js/package.json
@@ -1,6 +1,6 @@
{
"name": "@docmd/engine-js",
- "version": "0.9.1",
+ "version": "0.9.2",
"description": "Default JavaScript engine for docmd using Node.js native APIs.",
"type": "module",
"main": "dist/index.js",
diff --git a/packages/engines/js/src/index.ts b/packages/engines/js/src/index.ts
index 25a72bce..3525a895 100644
--- a/packages/engines/js/src/index.ts
+++ b/packages/engines/js/src/index.ts
@@ -275,7 +275,7 @@ const handlers: Record = {
export function createJsEngine(): Engine {
return {
name: 'js',
- version: '0.9.1',
+ version: '0.9.2',
supports(taskType: string): boolean {
return taskType in handlers;
diff --git a/packages/engines/rust-binaries/bin/docmd-engine-darwin-arm64.node b/packages/engines/rust-binaries/bin/docmd-engine-darwin-arm64.node
index 2ce9f5c4..99949ba6 100755
Binary files a/packages/engines/rust-binaries/bin/docmd-engine-darwin-arm64.node and b/packages/engines/rust-binaries/bin/docmd-engine-darwin-arm64.node differ
diff --git a/packages/engines/rust-binaries/native/Cargo.lock b/packages/engines/rust-binaries/native/Cargo.lock
index 84ea5fb7..20abbf84 100644
--- a/packages/engines/rust-binaries/native/Cargo.lock
+++ b/packages/engines/rust-binaries/native/Cargo.lock
@@ -50,7 +50,7 @@ dependencies = [
[[package]]
name = "docmd-engine"
-version = "0.9.1"
+version = "0.9.2"
dependencies = [
"napi",
"napi-build",
diff --git a/packages/engines/rust-binaries/native/Cargo.toml b/packages/engines/rust-binaries/native/Cargo.toml
index 8bbd3a23..c490626c 100644
--- a/packages/engines/rust-binaries/native/Cargo.toml
+++ b/packages/engines/rust-binaries/native/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "docmd-engine"
-version = "0.9.1"
+version = "0.9.2"
edition = "2021"
description = "Native Node.js addon for the docmd Rust engine"
license = "MIT"
diff --git a/packages/engines/rust-binaries/package.json b/packages/engines/rust-binaries/package.json
index cbbf36d5..7c19e762 100644
--- a/packages/engines/rust-binaries/package.json
+++ b/packages/engines/rust-binaries/package.json
@@ -1,6 +1,6 @@
{
"name": "@docmd/engine-rust-binaries",
- "version": "0.9.1",
+ "version": "0.9.2",
"description": "Pre-built Rust binaries for the docmd engine. All platforms bundled.",
"scripts": {
"build": "node build.js"
diff --git a/packages/engines/rust/package.json b/packages/engines/rust/package.json
index e92d5595..0d5b63dd 100644
--- a/packages/engines/rust/package.json
+++ b/packages/engines/rust/package.json
@@ -1,6 +1,6 @@
{
"name": "@docmd/engine-rust",
- "version": "0.9.1",
+ "version": "0.9.2",
"description": "Rust-accelerated engine for docmd. The postinstall script downloads a pre-built platform binary from npm CDN (unpkg/jsdelivr). No code is executed beyond copying the .node file. Source: https://github.com/docmd-io/docmd",
"type": "module",
"main": "dist/index.js",
diff --git a/packages/engines/rust/src/index.ts b/packages/engines/rust/src/index.ts
index d845785a..e3282926 100644
--- a/packages/engines/rust/src/index.ts
+++ b/packages/engines/rust/src/index.ts
@@ -129,7 +129,7 @@ export function createRustEngine(): Engine {
return {
name: 'rust',
- version: '0.9.1',
+ version: '0.9.2',
supports(taskType: string): boolean {
return [
diff --git a/packages/legacy/doc.md/package.json b/packages/legacy/doc.md/package.json
index d3670ec7..5e030850 100644
--- a/packages/legacy/doc.md/package.json
+++ b/packages/legacy/doc.md/package.json
@@ -1,6 +1,6 @@
{
"name": "doc.md",
- "version": "0.9.1",
+ "version": "0.9.2",
"description": "Discontinued from 0.8.x, use @docmd/core instead.",
"bin": {
"docmd": "bin/docmd.js"
diff --git a/packages/legacy/mgks/package.json b/packages/legacy/mgks/package.json
index 3ede888c..22192052 100644
--- a/packages/legacy/mgks/package.json
+++ b/packages/legacy/mgks/package.json
@@ -1,6 +1,6 @@
{
"name": "@mgks/docmd",
- "version": "0.9.1",
+ "version": "0.9.2",
"description": "Discontinued from 0.8.x, use @docmd/core instead.",
"bin": {
"docmd": "bin/docmd.js"
diff --git a/packages/live/package.json b/packages/live/package.json
index 42293c52..59a98093 100644
--- a/packages/live/package.json
+++ b/packages/live/package.json
@@ -1,6 +1,6 @@
{
"name": "@docmd/live",
- "version": "0.9.1",
+ "version": "0.9.2",
"description": "Browser-based editor engine for docmd.",
"type": "module",
"main": "dist/index.js",
diff --git a/packages/parser/package.json b/packages/parser/package.json
index 11572d8c..9d536e1e 100644
--- a/packages/parser/package.json
+++ b/packages/parser/package.json
@@ -1,6 +1,6 @@
{
"name": "@docmd/parser",
- "version": "0.9.1",
+ "version": "0.9.2",
"description": "Pure Markdown parsing engine for docmd.",
"type": "module",
"main": "dist/index.js",
diff --git a/packages/plugins/ai/package.json b/packages/plugins/ai/package.json
index 2a5f9763..991b488a 100644
--- a/packages/plugins/ai/package.json
+++ b/packages/plugins/ai/package.json
@@ -1,6 +1,6 @@
{
"name": "@docmd/plugin-ai",
- "version": "0.9.1",
+ "version": "0.9.2",
"description": "Interactive AI chat with documentation plugin for docmd, powered by docmd-assistant with multi-provider runtime.",
"type": "module",
"main": "dist/index.js",
@@ -31,7 +31,7 @@
"node": ">=20.0.0"
},
"dependencies": {
- "docmd-assistant": "^0.1.9"
+ "docmd-assistant": "^0.1.11"
},
"devDependencies": {
"@docmd/api": "workspace:*",
diff --git a/packages/plugins/ai/src/client/ai.css b/packages/plugins/ai/src/client/ai.css
index dfe8ab11..28388170 100644
--- a/packages/plugins/ai/src/client/ai.css
+++ b/packages/plugins/ai/src/client/ai.css
@@ -356,14 +356,43 @@ body.dark #docmd-ai-plugin-root {
border-radius: 0 6px 6px 0;
}
-.docmd-ai-chat-bubble pre {
+.docmd-ai-code-wrap {
+ margin: 10px 0;
+ border-radius: 8px;
background: #1e293b !important;
- color: #f8fafc !important;
border: 1px solid rgba(255, 255, 255, 0.1);
- border-radius: 8px;
+ overflow: hidden;
+}
+
+.docmd-ai-code-header {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 4px 12px;
+ background: rgba(0, 0, 0, 0.25);
+ border-bottom: 1px solid rgba(255, 255, 255, 0.08);
+}
+
+.docmd-ai-code-lang {
+ font-size: 11px;
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
+ color: var(--ai-text-muted, #94a3b8);
+ text-transform: lowercase;
+ font-weight: 600;
+ letter-spacing: 0.03em;
+}
+
+.docmd-ai-chat-bubble pre {
+ background: transparent !important;
+ color: #f8fafc !important;
+ border: none !important;
+ border-radius: 0 !important;
padding: 10px 12px;
- margin: 8px 0;
+ margin: 0 !important;
overflow-x: auto;
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
+ font-size: 12.5px;
+ line-height: 1.5;
}
.docmd-ai-chat-bubble code {
@@ -376,8 +405,9 @@ body.dark #docmd-ai-plugin-root {
.docmd-ai-chat-bubble pre code {
background: transparent !important;
- padding: 0;
+ padding: 0 !important;
color: #f8fafc !important;
+ border-radius: 0 !important;
}
.docmd-ai-chat-bubble hr {
@@ -557,4 +587,43 @@ body.dark #docmd-ai-plugin-root {
.docmd-ai-chat-bubble tr:hover td {
background: rgba(125, 125, 125, 0.05);
+}
+
+/* --- Live Streaming Status Badges (Thinking, Searching, Inspecting) --- */
+.docmd-ai-status-badge {
+ display: inline-flex;
+ align-items: center;
+ gap: 8px;
+ padding: 5px 12px;
+ border-radius: 9999px;
+ background: var(--ai-input-bg);
+ border: 1px solid var(--ai-border);
+ color: var(--ai-text-muted);
+ font-size: 12px;
+ font-weight: 500;
+ margin-bottom: 6px;
+ animation: docmdAiPulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
+}
+
+.docmd-ai-status-badge svg {
+ color: var(--ai-primary);
+ flex-shrink: 0;
+}
+
+.docmd-ai-spin {
+ animation: docmdAiSpin 1.2s linear infinite;
+}
+
+@keyframes docmdAiSpin {
+ from { transform: rotate(0deg); }
+ to { transform: rotate(360deg); }
+}
+
+@keyframes docmdAiPulse {
+ 0%, 100% { opacity: 1; }
+ 50% { opacity: 0.65; }
+}
+
+.docmd-ai-content {
+ word-break: break-word;
}
\ No newline at end of file
diff --git a/packages/plugins/ai/src/client/index.ts b/packages/plugins/ai/src/client/index.ts
index f48493bd..6bc68cbc 100644
--- a/packages/plugins/ai/src/client/index.ts
+++ b/packages/plugins/ai/src/client/index.ts
@@ -43,7 +43,11 @@ export class DocmdAIAssistantUI {
this.engine.registerTool({
name: 'search_documentation',
description: `Search documentation pages across all projects in this workspace using full-text keyword matching ${isSemanticUsable ? 'and semantic vector search' : '(keyword search active; semantic search disabled)'}. Always supply concise, targeted search terms for highest accuracy.`,
- execute: async ({ query, project }: { query: string; project?: string }) => {
+ execute: async (rawArgs: any) => {
+ const query = typeof rawArgs === 'string'
+ ? rawArgs
+ : (rawArgs?.query || rawArgs?.q || rawArgs?.search_query || rawArgs?.text || rawArgs?.input || '');
+ const project = typeof rawArgs === 'object' ? rawArgs?.project : undefined;
return await this.searchAllWorkspaceIndexes(query, project);
}
});
@@ -423,8 +427,15 @@ CRITICAL CONSTRAINTS & BEHAVIORAL RULES:
};
}
- private async searchAllWorkspaceIndexes(query: string, projectFilter?: string): Promise {
+ private async searchAllWorkspaceIndexes(rawQuery: any, projectFilter?: string): Promise {
const hits: Array<{ project: string; title: string; url: string; snippet: string; searchType: 'keyword' | 'semantic' }> = [];
+ const query = typeof rawQuery === 'string'
+ ? rawQuery
+ : (rawQuery?.query || rawQuery?.q || rawQuery?.search_query || rawQuery?.text || rawQuery?.input || '');
+ const cleanQuery = (query || '').trim();
+ if (!cleanQuery) return [];
+
+ const cleanQueryLower = cleanQuery.toLowerCase();
const cfg = (window as any).__docmd_ai_config || {};
const getSiteBaseUrl = (): string => {
const cfg = (window as any).__docmd_ai_config || {};
@@ -458,7 +469,7 @@ CRITICAL CONSTRAINTS & BEHAVIORAL RULES:
}
}
}
- const isExplicitOlderVerRequest = olderVerTokens.some(tok => query.toLowerCase().includes(tok));
+ const isExplicitOlderVerRequest = olderVerTokens.some(tok => cleanQueryLower.includes(tok));
const i18nObj = cfg.i18n || {};
const allLocales: Array<{ id: string }> = Array.isArray(i18nObj.locales) ? i18nObj.locales : [];
@@ -469,7 +480,7 @@ CRITICAL CONSTRAINTS & BEHAVIORAL RULES:
if (foundLoc) activeLocaleId = foundLoc.id;
}
const nonActiveLocaleIds = allLocales.filter(l => l.id !== activeLocaleId).map(l => l.id.toLowerCase());
- const isExplicitLocaleRequest = nonActiveLocaleIds.some(locId => query.toLowerCase().includes(locId));
+ const isExplicitLocaleRequest = nonActiveLocaleIds.some(locId => cleanQueryLower.includes(locId));
const isPathExcluded = (rawId: string): boolean => {
const norm = String(rawId || '').replace(/^\//, '').toLowerCase();
@@ -490,8 +501,8 @@ CRITICAL CONSTRAINTS & BEHAVIORAL RULES:
return false;
};
- const queryTokens = query.toLowerCase().replace(/[\-_.]/g, ' ').split(/\s+/).filter(t => t.length > 0);
- const versionMatches = query.match(/\d+[\.\-_]\d+[\.\-_]\d+/g);
+ const queryTokens = cleanQueryLower.replace(/[\-_.]/g, ' ').split(/\s+/).filter((t: string) => t.length > 0);
+ const versionMatches = cleanQuery.match(/\d+[\.\-_]\d+[\.\-_]\d+/g);
// 1. Local Active Search Index (via window.docmdSearch)
try {
@@ -672,37 +683,107 @@ CRITICAL CONSTRAINTS & BEHAVIORAL RULES:
}
}
+ private getStatusSvgIcon(iconName?: string): string {
+ switch (iconName) {
+ case 'search':
+ return ` `;
+ case 'folder-tree':
+ return ` `;
+ case 'cog':
+ return ` `;
+ case 'brain':
+ case 'sparkles':
+ default:
+ return ` `;
+ }
+ }
+
private async submitQuery(text: string): Promise {
if (this.isPending) return;
this.setPendingState(true);
this.appendMsg('user', text, true);
- const typing = this.appendMsg('assistant', 'Working...', false);
+
+ const msgs = document.getElementById('docmd-ai-messages');
+ const bubble = document.createElement('div');
+ bubble.className = 'docmd-ai-chat-bubble assistant';
+
+ const statusWrap = document.createElement('div');
+ statusWrap.className = 'docmd-ai-status-badge';
+ statusWrap.innerHTML = `${this.getStatusSvgIcon('brain')} Thinking... `;
+ bubble.appendChild(statusWrap);
+
+ const contentDiv = document.createElement('div');
+ contentDiv.className = 'docmd-ai-content';
+ bubble.appendChild(contentDiv);
+
+ if (msgs) {
+ msgs.appendChild(bubble);
+ msgs.scrollTop = msgs.scrollHeight;
+ }
+
+ let accumulatedText = '';
try {
const docContext = await this.fetchLocalSearchContext(text);
const queryWithContext = docContext ? `${text}${docContext}` : text;
- const res = await this.engine.sendMessage(queryWithContext);
+ let res: any;
+ if (typeof (this.engine as any).sendMessageStream === 'function') {
+ res = await this.engine.sendMessageStream(queryWithContext, {
+ onStatus: (status: any) => {
+ if (statusWrap && status) {
+ statusWrap.style.display = 'inline-flex';
+ statusWrap.innerHTML = `${this.getStatusSvgIcon(status.icon)} ${this.escapeHtml(status.text || 'Thinking...')} `;
+ if (msgs) msgs.scrollTop = msgs.scrollHeight;
+ }
+ },
+ onChunk: (delta: string) => {
+ accumulatedText = delta;
+ if (statusWrap) {
+ statusWrap.style.display = 'none';
+ }
+ contentDiv.innerHTML = this.formatMarkdown(accumulatedText);
+ if (msgs) msgs.scrollTop = msgs.scrollHeight;
+ }
+ });
+ } else {
+ res = await this.engine.sendMessage(queryWithContext);
+ }
if (res && res.unconfigured) {
- typing.remove();
+ bubble.remove();
this.renderUnconfiguredNotice(res.unconfiguredData || res);
return;
}
- typing.innerHTML = this.formatMarkdown(res.message || 'No response generated.');
+ if (statusWrap) {
+ statusWrap.style.display = 'none';
+ }
+ contentDiv.innerHTML = this.formatMarkdown(res.message || accumulatedText || 'No response generated.');
} catch (err: any) {
- typing.remove();
- this.renderUnconfiguredNotice({
- title: 'Domain Not Authorized',
- message: err.message || 'Origin is not authorized for the selected docmd Cloud project.',
- features: [
- '**Free AI relay** — bring your own API key for OpenAI, Anthropic, Gemini, DeepSeek, or Ollama.',
- '**Query analytics** — see what your visitors are asking in real time.',
- '**Setup takes under a minute** — just add your `projectId` to `docmd.config.json`.'
- ]
- });
+ const errMsg = err?.message || String(err || '');
+ const isAuthOrConfigError = errMsg.includes('Domain Not Authorized') ||
+ errMsg.includes('Origin is not authorized') ||
+ errMsg.includes('403') ||
+ errMsg.includes('401') ||
+ err?.unconfigured;
+
+ if (isAuthOrConfigError) {
+ bubble.remove();
+ this.renderUnconfiguredNotice({
+ title: 'Domain Not Authorized',
+ message: errMsg || 'Origin is not authorized for the selected docmd Cloud project.',
+ features: [
+ '**Free AI relay** — bring your own API key for OpenAI, Anthropic, Gemini, DeepSeek, or Ollama.',
+ '**Query analytics** — see what your visitors are asking in real time.',
+ '**Setup takes under a minute** — just add your `projectId` to `docmd.config.json`.'
+ ]
+ });
+ } else {
+ if (statusWrap) statusWrap.style.display = 'none';
+ contentDiv.innerHTML = `Sorry, I encountered an issue processing your request: ${this.escapeHtml(errMsg)} `;
+ }
} finally {
this.setPendingState(false);
}
@@ -742,19 +823,24 @@ CRITICAL CONSTRAINTS & BEHAVIORAL RULES:
private formatMarkdown(raw: string): string {
if (!raw) return '';
+ // Universal LLM tag and internal marker stripping
let cleaned = raw
- .replace(/[\s\S]*?<\/mm:think>/gi, '')
- .replace(/[\s\S]*?<\/think>/gi, '')
- .replace(/<\/?(?:mm:)?think>/gi, '')
- .replace(/\]<\]minimax\[>\[[\s\S]*?(?:<\/request>|$)/gi, '')
- .replace(/\]<\]minimax\[>\[/gi, '')
- .replace(/[\s\S]*?<\/request>/gi, '')
- .replace(/]*>[\s\S]*?<\/tool>/gi, '')
- .replace(/[\s\S]*?<\/tool_call>/gi, '')
+ .replace(/<(?:[a-zA-Z0-9_\-]+:)?(think|thought|reasoning|reflection|plan)\b[^>]*>[\s\S]*?<\/(?:[a-zA-Z0-9_\-]+:)?\1>/gi, '')
+ .replace(/```(?:thought|thinking|reasoning|reflection)\s*\n[\s\S]*?```/gi, '')
+ .replace(/\[(?:thought|thinking|reasoning):\s*[\s\S]*?\]/gi, '')
+ .replace(/\]<\][a-zA-Z0-9_\-]+\[>\[[\s\S]*?(?:<\/(?:request|tool_call|action)>|\]<\][a-zA-Z0-9_\-]+\[>\[|$)/gi, '')
+ .replace(/\]<\][a-zA-Z0-9_\-]+\[>\[/gi, '')
+ .replace(/<\/?(?:[a-zA-Z0-9_\-]+:)?(?:think|thought|reasoning|reflection|plan)\b[^>]*>/gi, '')
+ .replace(/<(?:[a-zA-Z0-9_\-]+:)?(tool_call|function_call|tool|action|request)\b[^>]*>[\s\S]*?<\/(?:[a-zA-Z0-9_\-]+:)?\1>/gi, '')
+ .replace(/```(?:tool_call|function_call|tool|action|json:tool)\s*\n[\s\S]*?```/gi, '')
+ .replace(/\{\s*"(?:name|tool|action|function)"\s*:\s*"[^"]+"\s*,\s*"(?:parameters|arguments|args|input)"\s*:\s*\{[\s\S]*?\}\s*\}/g, '')
+ .replace(/<\/?(?:[a-zA-Z0-9_\-]+:)?(?:tool_call|function_call|tool|action|request)\b[^>]*>/gi, '')
.trim();
+
if (!cleaned) cleaned = raw;
let text = this.escapeHtml(cleaned);
+
const cfg = (window as any).__docmd_ai_config || {};
const getSiteBaseUrl = (): string => {
const cfg = (window as any).__docmd_ai_config || {};
@@ -792,10 +878,23 @@ CRITICAL CONSTRAINTS & BEHAVIORAL RULES:
// Code blocks with syntax highlighting
const codeBlocks: string[] = [];
- text = text.replace(/```(\w+)?\n([\s\S]*?)```/g, (_match, lang, code) => {
- const languageStr = lang ? `${lang} ` : '';
+ text = text.replace(/```(\w+)?[ \t]*\r?\n([\s\S]*?)```/g, (_match, lang, code) => {
+ const languageStr = lang ? `` : '';
+ const placeholder = `__CODE_BLOCK_${codeBlocks.length}__`;
+ codeBlocks.push(`${languageStr}
${code.trim()} `);
+ return placeholder;
+ });
+ // Fallback: code blocks where lang runs into code on same line (no newline after lang)
+ text = text.replace(/```(\w+)([ \t]+[^\n][\s\S]*?)```/g, (_match, lang, code) => {
+ const languageStr = ``;
+ const placeholder = `__CODE_BLOCK_${codeBlocks.length}__`;
+ codeBlocks.push(`${languageStr}
${code.trim()} `);
+ return placeholder;
+ });
+ // Catch-all: bare ``` blocks with no language
+ text = text.replace(/```\r?\n?([\s\S]*?)```/g, (_match, code) => {
const placeholder = `__CODE_BLOCK_${codeBlocks.length}__`;
- codeBlocks.push(`${languageStr}${code.trim()} `);
+ codeBlocks.push(``);
return placeholder;
});
@@ -881,7 +980,7 @@ CRITICAL CONSTRAINTS & BEHAVIORAL RULES:
const html = blocks.map(block => {
const trimmed = block.trim();
if (!trimmed) return '';
- if (/^<(?:h3|h4|h5|ul|ol|pre|blockquote|div|table|hr)/i.test(trimmed)) {
+ if (/^<(?:h3|h4|h5|ul|ol|pre|blockquote|div|table|hr)|__CODE_BLOCK_/i.test(trimmed)) {
return trimmed.replace(/\n/g, ' ');
}
return `${trimmed.replace(/\n/g, ' ')}
`;
diff --git a/packages/plugins/ai/src/client/styles.css b/packages/plugins/ai/src/client/styles.css
index 4679aae9..8b65b019 100644
--- a/packages/plugins/ai/src/client/styles.css
+++ b/packages/plugins/ai/src/client/styles.css
@@ -526,3 +526,43 @@ body.dark :root {
height: 16px;
fill: currentColor;
}
+
+/* --- Live Streaming Status Badges (Thinking, Searching, Inspecting) --- */
+.docmd-ai-status-badge {
+ display: inline-flex;
+ align-items: center;
+ gap: 8px;
+ padding: 5px 12px;
+ border-radius: 9999px;
+ background: rgba(148, 163, 184, 0.12);
+ border: 1px solid var(--docmd-ai-border);
+ color: var(--docmd-ai-muted);
+ font-size: 12px;
+ font-weight: 500;
+ margin-bottom: 6px;
+ animation: docmdAiPulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
+}
+
+.docmd-ai-status-badge svg {
+ color: var(--docmd-ai-primary);
+ flex-shrink: 0;
+}
+
+.docmd-ai-spin {
+ animation: docmdAiSpin 1.2s linear infinite;
+}
+
+@keyframes docmdAiSpin {
+ from { transform: rotate(0deg); }
+ to { transform: rotate(360deg); }
+}
+
+@keyframes docmdAiPulse {
+ 0%, 100% { opacity: 1; }
+ 50% { opacity: 0.65; }
+}
+
+.docmd-ai-content {
+ word-break: break-word;
+}
+
diff --git a/packages/plugins/ai/src/index.ts b/packages/plugins/ai/src/index.ts
index 4271c097..74bfbec5 100644
--- a/packages/plugins/ai/src/index.ts
+++ b/packages/plugins/ai/src/index.ts
@@ -22,7 +22,7 @@ import { DocmdAssistantEngine } from 'docmd-assistant';
export const plugin: PluginDescriptor = {
name: 'ai',
- version: '0.9.1',
+ version: '0.9.2',
capabilities: ['init', 'body', 'assets', 'actions', 'translations', 'post-build']
};
@@ -168,7 +168,7 @@ async function searchDocumentationRAG(
try {
const indexRaw = await fs.readFile(searchIndexFile, 'utf8');
const parsedIndex = JSON.parse(indexRaw);
- const queryTerms = query.toLowerCase().split(/\s+/).filter(t => t.length > 1);
+ const queryTerms = query.toLowerCase().split(/\s+/).filter((t: string) => t.length > 1);
let docEntries: Array<{ id: string; title?: string; text?: string; headings?: string }> = [];
if (Array.isArray(parsedIndex)) {
@@ -218,7 +218,7 @@ async function searchDocumentationRAG(
const srcDir = path.join(projectRoot, 'docs');
if (!nativeFs.existsSync(srcDir)) return results;
- const queryTerms = query.toLowerCase().split(/\s+/).filter(t => t.length > 2);
+ const queryTerms = query.toLowerCase().split(/\s+/).filter((t: string) => t.length > 2);
async function walk(dir: string) {
const entries = await fs.readdir(dir, { withFileTypes: true });
@@ -258,7 +258,7 @@ async function searchDocumentationRAG(
function checkRateLimit(clientId: string, maxRequests: number = 10, windowMs: number = 60000): boolean {
const now = Date.now();
let timestamps = rateLimitStore.get(clientId) || [];
- timestamps = timestamps.filter(t => now - t < windowMs);
+ timestamps = timestamps.filter((t: number) => now - t < windowMs);
if (timestamps.length >= maxRequests) {
return false;
diff --git a/packages/plugins/analytics/package.json b/packages/plugins/analytics/package.json
index 340032a1..e63241f2 100644
--- a/packages/plugins/analytics/package.json
+++ b/packages/plugins/analytics/package.json
@@ -1,6 +1,6 @@
{
"name": "@docmd/plugin-analytics",
- "version": "0.9.1",
+ "version": "0.9.2",
"description": "Analytics injection plugin for docmd.",
"type": "module",
"main": "dist/index.js",
diff --git a/packages/plugins/analytics/src/index.ts b/packages/plugins/analytics/src/index.ts
index 433dc441..cbdeb828 100644
--- a/packages/plugins/analytics/src/index.ts
+++ b/packages/plugins/analytics/src/index.ts
@@ -21,7 +21,7 @@ import { scriptLiteral } from '@docmd/utils';
export const plugin: PluginDescriptor = {
name: 'analytics',
- version: '0.9.1',
+ version: '0.9.2',
capabilities: ['head', 'body']
};
diff --git a/packages/plugins/git/package.json b/packages/plugins/git/package.json
index 6bcb487e..4c907844 100644
--- a/packages/plugins/git/package.json
+++ b/packages/plugins/git/package.json
@@ -1,6 +1,6 @@
{
"name": "@docmd/plugin-git",
- "version": "0.9.1",
+ "version": "0.9.2",
"description": "Git integration plugin for docmd.",
"type": "module",
"main": "dist/index.js",
diff --git a/packages/plugins/git/src/index.ts b/packages/plugins/git/src/index.ts
index 5cc7deef..4e640ee1 100644
--- a/packages/plugins/git/src/index.ts
+++ b/packages/plugins/git/src/index.ts
@@ -290,7 +290,7 @@ async function getGitFileInfo(filePath: string, maxCommits: number = 6): Promise
export const plugin: PluginDescriptor = {
name: 'git',
- version: '0.9.1',
+ version: '0.9.2',
capabilities: ['build', 'body', 'assets', 'translations', 'init', 'post-build']
};
diff --git a/packages/plugins/installer/package.json b/packages/plugins/installer/package.json
index 081704dc..09e33fe7 100644
--- a/packages/plugins/installer/package.json
+++ b/packages/plugins/installer/package.json
@@ -1,6 +1,6 @@
{
"name": "@docmd/plugin-installer",
- "version": "0.9.1",
+ "version": "0.9.2",
"description": "Installer utility to add and remove plugins for docmd.",
"type": "module",
"main": "dist/index.js",
diff --git a/packages/plugins/llms/package.json b/packages/plugins/llms/package.json
index 820a0444..012bb41f 100644
--- a/packages/plugins/llms/package.json
+++ b/packages/plugins/llms/package.json
@@ -1,6 +1,6 @@
{
"name": "@docmd/plugin-llms",
- "version": "0.9.1",
+ "version": "0.9.2",
"description": "Generate llms.txt context files for AI agents from your docmd site.",
"type": "module",
"main": "dist/index.js",
diff --git a/packages/plugins/llms/src/index.ts b/packages/plugins/llms/src/index.ts
index 273ef835..86d3f58c 100644
--- a/packages/plugins/llms/src/index.ts
+++ b/packages/plugins/llms/src/index.ts
@@ -19,7 +19,7 @@ import { outputPathToPathname, sanitizeUrl } from '@docmd/api';
export const plugin: PluginDescriptor = {
name: 'llms',
- version: '0.9.1',
+ version: '0.9.2',
capabilities: ['post-build']
};
diff --git a/packages/plugins/math/package.json b/packages/plugins/math/package.json
index 70567692..3046ed14 100644
--- a/packages/plugins/math/package.json
+++ b/packages/plugins/math/package.json
@@ -1,6 +1,6 @@
{
"name": "@docmd/plugin-math",
- "version": "0.9.1",
+ "version": "0.9.2",
"description": "Mathematics (KaTeX/LaTeX) plugin for docmd.",
"type": "module",
"main": "dist/index.js",
diff --git a/packages/plugins/math/src/index.ts b/packages/plugins/math/src/index.ts
index 5b3d817c..6246c35e 100644
--- a/packages/plugins/math/src/index.ts
+++ b/packages/plugins/math/src/index.ts
@@ -18,7 +18,7 @@ import type { PluginDescriptor } from '@docmd/api';
export const plugin: PluginDescriptor = {
name: 'math',
- version: '0.9.1',
+ version: '0.9.2',
capabilities: ['markdown', 'assets']
};
diff --git a/packages/plugins/mermaid/package.json b/packages/plugins/mermaid/package.json
index c5367456..6217f278 100644
--- a/packages/plugins/mermaid/package.json
+++ b/packages/plugins/mermaid/package.json
@@ -1,6 +1,6 @@
{
"name": "@docmd/plugin-mermaid",
- "version": "0.9.1",
+ "version": "0.9.2",
"description": "Mermaid diagram support plugin for docmd.",
"type": "module",
"main": "dist/index.js",
diff --git a/packages/plugins/mermaid/src/index.ts b/packages/plugins/mermaid/src/index.ts
index 3e0e4cb3..aef9b38d 100644
--- a/packages/plugins/mermaid/src/index.ts
+++ b/packages/plugins/mermaid/src/index.ts
@@ -22,7 +22,7 @@ const __dirname = path.dirname(__filename);
export const plugin: PluginDescriptor = {
name: 'mermaid',
- version: '0.9.1',
+ version: '0.9.2',
capabilities: ['markdown', 'assets']
};
diff --git a/packages/plugins/okf/package.json b/packages/plugins/okf/package.json
index d5449422..83e387cd 100644
--- a/packages/plugins/okf/package.json
+++ b/packages/plugins/okf/package.json
@@ -1,6 +1,6 @@
{
"name": "@docmd/plugin-okf",
- "version": "0.9.1",
+ "version": "0.9.2",
"description": "Generate an Open Knowledge Format (OKF) bundle from your docmd site for AI agent consumption.",
"type": "module",
"main": "dist/index.js",
diff --git a/packages/plugins/okf/src/index.ts b/packages/plugins/okf/src/index.ts
index 6fdda4b3..ad8d0262 100644
--- a/packages/plugins/okf/src/index.ts
+++ b/packages/plugins/okf/src/index.ts
@@ -45,7 +45,7 @@ import { GRAPH_CSS, GRAPH_JS, graphHtml } from './graph-assets.js';
export const plugin: PluginDescriptor = {
name: 'okf',
- version: '0.9.1',
+ version: '0.9.2',
capabilities: ['post-build']
};
@@ -221,7 +221,7 @@ export async function onPostBuild({ config, pages, outputDir, log }: any) {
for (const c of concepts) byType[c.type] = (byType[c.type] || 0) + 1;
const manifest = {
- okf_version: '0.9.1',
+ okf_version: '0.9.2',
bundle: {
name: bundleName, title: config.title || bundleName, description: config.description || '',
url: config.url || '', generated_by: '@docmd/plugin-okf', generated_at: new Date().toISOString(),
diff --git a/packages/plugins/openapi/package.json b/packages/plugins/openapi/package.json
index b4c87ada..8503fb77 100644
--- a/packages/plugins/openapi/package.json
+++ b/packages/plugins/openapi/package.json
@@ -1,6 +1,6 @@
{
"name": "@docmd/plugin-openapi",
- "version": "0.9.1",
+ "version": "0.9.2",
"description": "OpenAPI documentation generator plugin for docmd.",
"type": "module",
"main": "dist/index.js",
diff --git a/packages/plugins/openapi/src/index.ts b/packages/plugins/openapi/src/index.ts
index 77d5138e..b8f56033 100644
--- a/packages/plugins/openapi/src/index.ts
+++ b/packages/plugins/openapi/src/index.ts
@@ -24,7 +24,7 @@ const __dirname = path.dirname(fileURLToPath(import.meta.url));
export const plugin: PluginDescriptor = {
name: 'openapi',
- version: '0.9.1',
+ version: '0.9.2',
capabilities: ['markdown', 'assets']
};
diff --git a/packages/plugins/pwa/package.json b/packages/plugins/pwa/package.json
index 51891bc6..07133a34 100644
--- a/packages/plugins/pwa/package.json
+++ b/packages/plugins/pwa/package.json
@@ -1,6 +1,6 @@
{
"name": "@docmd/plugin-pwa",
- "version": "0.9.1",
+ "version": "0.9.2",
"description": "Progressive Web App (PWA) plugin for docmd.",
"type": "module",
"main": "dist/index.js",
diff --git a/packages/plugins/pwa/src/index.ts b/packages/plugins/pwa/src/index.ts
index 956974d8..a76dba0b 100644
--- a/packages/plugins/pwa/src/index.ts
+++ b/packages/plugins/pwa/src/index.ts
@@ -19,7 +19,7 @@ import { attrEsc } from '@docmd/utils';
export const plugin: PluginDescriptor = {
name: 'pwa',
- version: '0.9.1',
+ version: '0.9.2',
capabilities: ['post-build', 'head', 'body']
};
diff --git a/packages/plugins/search/package.json b/packages/plugins/search/package.json
index a923b6ab..c622272d 100644
--- a/packages/plugins/search/package.json
+++ b/packages/plugins/search/package.json
@@ -1,6 +1,6 @@
{
"name": "@docmd/plugin-search",
- "version": "0.9.1",
+ "version": "0.9.2",
"description": "Offline full-text search for docmd.",
"type": "module",
"main": "dist/index.js",
diff --git a/packages/plugins/search/src/index.ts b/packages/plugins/search/src/index.ts
index e4030591..0dce5476 100644
--- a/packages/plugins/search/src/index.ts
+++ b/packages/plugins/search/src/index.ts
@@ -33,7 +33,7 @@ const require = createRequire(import.meta.url);
export const plugin: PluginDescriptor = {
name: 'search',
- version: '0.9.1',
+ version: '0.9.2',
// `init` lets onConfigResolved run at config-parse time — that's where we
// compute the single `searchConfig` object. The build pipeline reads
// it from `config._searchConfig` everywhere else, so there's exactly
diff --git a/packages/plugins/seo/package.json b/packages/plugins/seo/package.json
index 6fc662ba..9ba8baab 100644
--- a/packages/plugins/seo/package.json
+++ b/packages/plugins/seo/package.json
@@ -1,6 +1,6 @@
{
"name": "@docmd/plugin-seo",
- "version": "0.9.1",
+ "version": "0.9.2",
"description": "SEO meta tag generator for docmd.",
"type": "module",
"main": "dist/index.js",
diff --git a/packages/plugins/seo/src/index.ts b/packages/plugins/seo/src/index.ts
index 731bedee..e55ea027 100644
--- a/packages/plugins/seo/src/index.ts
+++ b/packages/plugins/seo/src/index.ts
@@ -21,7 +21,7 @@ import { attrEsc } from '@docmd/utils';
export const plugin: PluginDescriptor = {
name: 'seo',
- version: '0.9.1',
+ version: '0.9.2',
capabilities: ['head', 'post-build']
};
diff --git a/packages/plugins/sitemap/package.json b/packages/plugins/sitemap/package.json
index ce1b1606..396fdb8e 100644
--- a/packages/plugins/sitemap/package.json
+++ b/packages/plugins/sitemap/package.json
@@ -1,6 +1,6 @@
{
"name": "@docmd/plugin-sitemap",
- "version": "0.9.1",
+ "version": "0.9.2",
"description": "Sitemap generator plugin for docmd.",
"type": "module",
"main": "dist/index.js",
diff --git a/packages/plugins/sitemap/src/index.ts b/packages/plugins/sitemap/src/index.ts
index cc7ace68..71890e28 100644
--- a/packages/plugins/sitemap/src/index.ts
+++ b/packages/plugins/sitemap/src/index.ts
@@ -19,7 +19,7 @@ import { outputPathToPathname, sanitizeUrl } from '@docmd/api';
export const plugin: PluginDescriptor = {
name: 'sitemap',
- version: '0.9.1',
+ version: '0.9.2',
capabilities: ['post-build']
};
diff --git a/packages/plugins/threads/package.json b/packages/plugins/threads/package.json
index cce5112c..d8d73ea5 100644
--- a/packages/plugins/threads/package.json
+++ b/packages/plugins/threads/package.json
@@ -1,6 +1,6 @@
{
"name": "@docmd/plugin-threads",
- "version": "0.9.1",
+ "version": "0.9.2",
"type": "module",
"description": "Inline discussion threads for docmd.",
"main": "dist/index.js",
diff --git a/packages/plugins/threads/src/index.ts b/packages/plugins/threads/src/index.ts
index beea43d6..c94e9997 100644
--- a/packages/plugins/threads/src/index.ts
+++ b/packages/plugins/threads/src/index.ts
@@ -9,7 +9,7 @@ import type { PluginDescriptor } from '@docmd/api';
export const plugin: PluginDescriptor = {
name: 'threads',
- version: '0.9.1',
+ version: '0.9.2',
capabilities: ['markdown', 'body', 'assets', 'actions', 'translations']
};
diff --git a/packages/templates/summer/package.json b/packages/templates/summer/package.json
index 3a17cb94..773fb910 100644
--- a/packages/templates/summer/package.json
+++ b/packages/templates/summer/package.json
@@ -1,6 +1,6 @@
{
"name": "@docmd/template-summer",
- "version": "0.9.1",
+ "version": "0.9.2",
"description": "Summer template for docmd. A bright, hopeful, summer-feel layout with a top search bar and halo accents.",
"type": "module",
"main": "dist/index.js",
diff --git a/packages/templates/summer/src/index.ts b/packages/templates/summer/src/index.ts
index 0f1469b5..be93ce24 100644
--- a/packages/templates/summer/src/index.ts
+++ b/packages/templates/summer/src/index.ts
@@ -42,7 +42,7 @@ const pathOf = (relPath: string): string => fileURLToPath(urlOf(relPath));
export const plugin: PluginDescriptor = {
name: 'template-summer',
- version: '0.9.1',
+ version: '0.9.2',
capabilities: ['template'],
};
diff --git a/packages/themes/package.json b/packages/themes/package.json
index d3569770..326a8ec0 100644
--- a/packages/themes/package.json
+++ b/packages/themes/package.json
@@ -1,6 +1,6 @@
{
"name": "@docmd/themes",
- "version": "0.9.1",
+ "version": "0.9.2",
"description": "Official themes for docmd.",
"type": "module",
"main": "dist/index.js",
diff --git a/packages/tui/package.json b/packages/tui/package.json
index cdba2f57..dea65b53 100644
--- a/packages/tui/package.json
+++ b/packages/tui/package.json
@@ -1,6 +1,6 @@
{
"name": "@docmd/tui",
- "version": "0.9.1",
+ "version": "0.9.2",
"description": "Terminal User Interface (TUI) design system for docmd.",
"type": "module",
"main": "dist/index.js",
diff --git a/packages/ui/package.json b/packages/ui/package.json
index 77aa7119..0327e556 100644
--- a/packages/ui/package.json
+++ b/packages/ui/package.json
@@ -1,6 +1,6 @@
{
"name": "@docmd/ui",
- "version": "0.9.1",
+ "version": "0.9.2",
"description": "Base UI templates and assets for docmd.",
"type": "module",
"main": "dist/index.js",
diff --git a/packages/utils/package.json b/packages/utils/package.json
index a53c2c04..aafee9a6 100644
--- a/packages/utils/package.json
+++ b/packages/utils/package.json
@@ -1,6 +1,6 @@
{
"name": "@docmd/utils",
- "version": "0.9.1",
+ "version": "0.9.2",
"description": "Zero-dependency shared utilities for docmd core.",
"type": "module",
"main": "dist/index.js",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 7249d8ee..c8243b90 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -39,8 +39,8 @@ importers:
specifier: ^6.0.3
version: 6.0.3
typescript-eslint:
- specifier: ^8.66.0
- version: 8.66.0(eslint@10.8.1)(typescript@6.0.3)
+ specifier: ^8.67.0
+ version: 8.67.0(eslint@10.8.1)(typescript@6.0.3)
packages/api:
dependencies:
@@ -259,8 +259,8 @@ importers:
packages/plugins/ai:
dependencies:
docmd-assistant:
- specifier: ^0.1.9
- version: 0.1.9
+ specifier: ^0.1.11
+ version: 0.1.11
devDependencies:
'@docmd/api':
specifier: workspace:*
@@ -1002,63 +1002,63 @@ packages:
'@types/trusted-types@2.0.7':
resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==}
- '@typescript-eslint/eslint-plugin@8.66.0':
- resolution: {integrity: sha512-p088eaGrzYz1s+7cov0aMOCkNGTJlVxF4jgubf28c8L0Cv9Rloj8YBHnv4hXLq6IIEE1AsjNWavO+k+8kP2Y0A==}
+ '@typescript-eslint/eslint-plugin@8.67.0':
+ resolution: {integrity: sha512-Un7Heoyj65NREbKAyIrFxeM143NZpExWmy1Nep4DLeQOeLlTeumPjoNKnBrU5D5moWXbPJgRa5Uwcdu0faVNGQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
- '@typescript-eslint/parser': ^8.66.0
+ '@typescript-eslint/parser': ^8.67.0
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
typescript: '>=4.8.4 <6.1.0'
- '@typescript-eslint/parser@8.66.0':
- resolution: {integrity: sha512-X6ypGChaWYk6PBtUg2BwuTZEFFcHJAtGTVJ9/lCTOufhZ4i9fNolQNnktq+kkMCwMj7V8Svsq7+TxSDslmhE0g==}
+ '@typescript-eslint/parser@8.67.0':
+ resolution: {integrity: sha512-fUBfTuuEulWqX6V8+O3PtScV01tzYYRUDTAirHFKoRAt7nOzoGiPt0M/bB47wWNy0coOOcgEwAMUtBpykMxl6w==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
typescript: '>=4.8.4 <6.1.0'
- '@typescript-eslint/project-service@8.66.0':
- resolution: {integrity: sha512-7MthGPTt4BP69lSryqpqq8HQqxuzynssckL/jyDyk3+TNMQ3y2jFWkptCrktWvBrP+EH787Nl5N5Qpw7WZg+5g==}
+ '@typescript-eslint/project-service@8.67.0':
+ resolution: {integrity: sha512-cvE8c7ulYeXN9fYuszhCeCsbzyVEXuhrRCybnBre7TUmqb5nRmBfQAwCj0O3WJFDeyAZt4VYv51vMCC9LHSdYw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <6.1.0'
- '@typescript-eslint/scope-manager@8.66.0':
- resolution: {integrity: sha512-8TGcH25j9zqJ/IULB/ppyhRvxA8QYfFEZ7nfbg6/BN9spDgb8fPWQXlE5l8TWBL50EtUx007uZ1o9VOwrq2/9g==}
+ '@typescript-eslint/scope-manager@8.67.0':
+ resolution: {integrity: sha512-EgvsleTwS4E+WzzSvem8fAUubLwatMNF1B5hHSLQxcvs7q2dtRhGyujHwLJSYlG41niJ7GP24Aha2+0mb1b2kg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@typescript-eslint/tsconfig-utils@8.66.0':
- resolution: {integrity: sha512-9D5gLYZG4rOjcoag8MQ/fWI8WqA9wcPDyOGyWtWFhvM1lHRbliqUSPIY5J3zqCU1tvSwzXxnnjhQhz5Ne7mJ4g==}
+ '@typescript-eslint/tsconfig-utils@8.67.0':
+ resolution: {integrity: sha512-vV+LUSv5njUWsknE71fqKTlXUva+R76SaeORd6Zojcunk/6DvKFXONU3BrAs2H49mbygUXt6gbYunzwqNwlhdg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <6.1.0'
- '@typescript-eslint/type-utils@8.66.0':
- resolution: {integrity: sha512-LG2dWfjZQQp0ADtAu/EWJVayefGL2UEZ3CDeI44D9v3rXB/WYUqE/jpO28KrEKul5AySrmI+Zh1v6v+xW2U9+g==}
+ '@typescript-eslint/type-utils@8.67.0':
+ resolution: {integrity: sha512-aVWDXbRmdXO9siTfX4ditQI1T9+zVcNazT48EJCD0v40/9RIFoUgZ05CmGEq9H2gixRpjUn/iplwvlcvutJW/Q==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
typescript: '>=4.8.4 <6.1.0'
- '@typescript-eslint/types@8.66.0':
- resolution: {integrity: sha512-H6gcYaSDOyvL3AD/jHUtUFo2jqGgn/F6nuyuZSu0QTesxL+cP4dQoIMrODRofuJC09g64+WgZ6tE19Y1N2YIFQ==}
+ '@typescript-eslint/types@8.67.0':
+ resolution: {integrity: sha512-sBtgslww8nsMYUjhdPBiSyUqSzT8uR6g93A2QXnQC8+cGdjz0CyaOdqHDRJb1AtORbZCNUJBBeFA/tNR2uQmww==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@typescript-eslint/typescript-estree@8.66.0':
- resolution: {integrity: sha512-8/x4INiiQb10jGgXYD7116/zQ+OL84ZIFn0za68wwFHCanT/VLbBEroWht8RV8fn0/ZCAoazHLQgwUC0UQcDfg==}
+ '@typescript-eslint/typescript-estree@8.67.0':
+ resolution: {integrity: sha512-EKQBCE9yNlRJYm7jdTW5AhDacDUmSwQb0FAJAmK2EKYrNXIsa2vxcSZx6PvJ/dEdI6lS+Y9W+EXckLj0iPFGcw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <6.1.0'
- '@typescript-eslint/utils@8.66.0':
- resolution: {integrity: sha512-jasearZPolBw5NJNYGMwxzHMF83niVWmMU1VdHzG1CyfI2VS7f7nZltnKtHcg20hW+7Uo5GfK4MeDPoU3qI8EA==}
+ '@typescript-eslint/utils@8.67.0':
+ resolution: {integrity: sha512-U9D1FdwEWBwok3hxxSdhclMb0twvt9QnjIQ0VfQ1AiX2epnpSgv2ubVDsayOFyY8K6FX+AQ7E0FKWVG3iKsj1A==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
typescript: '>=4.8.4 <6.1.0'
- '@typescript-eslint/visitor-keys@8.66.0':
- resolution: {integrity: sha512-dkKR8q+lKciskj1Y3vthHktl+3cMLWGyVUP23bRiPZ5O9BRT++4EqDDV+TVeIKBL1VXVEqrJlz8MYbcnvJcAlg==}
+ '@typescript-eslint/visitor-keys@8.67.0':
+ resolution: {integrity: sha512-fkv8dHRDqfGtTHuJeebdrQ7cX6Ad4WAS00rgHh9UGvMycF1mjBfsxry1XsLIFhWZ6Judlh6UdzK+TYlbpCXgnA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
acorn-jsx@5.3.2:
@@ -1159,8 +1159,8 @@ packages:
resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==}
engines: {node: '>=8'}
- docmd-assistant@0.1.9:
- resolution: {integrity: sha512-/lpJPKwBa1Wshz5l13n5XgL9FhdmfhB2PiNs46T8kwFwADjfqZrG0k6FFcfM84d8YOMzL4oa85MTQSaAfyUxBg==}
+ docmd-assistant@0.1.11:
+ resolution: {integrity: sha512-PKIPzda79SSlKTmbl0Z9BGZCDTqQNSGVKpil20g88xhNzd/WkBlG3IvFu96n0bm/usm52o2Jn3cN2PT/RC34SQ==}
engines: {node: '>=20.0.0'}
docmd-search@0.1.3:
@@ -1587,8 +1587,8 @@ packages:
resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
engines: {node: '>=10'}
- typescript-eslint@8.66.0:
- resolution: {integrity: sha512-QlEbBPz/RuJ1XUHj29nm3t0F/O/cSlEnntozqPOYHnnTGAXFamnMBu5i9Vn6vhUPHGAjR+Vl+5J8vPN/BMUrJw==}
+ typescript-eslint@8.67.0:
+ resolution: {integrity: sha512-S2udFs8tCKEKffuJ4TB1idGUZiXdCPGi3IPBGWXarbLQ5UPXORV8QEVzJ4gCRduURMb5EkpNCdjbk0eDIuI8Yg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
@@ -2019,14 +2019,14 @@ snapshots:
'@types/trusted-types@2.0.7': {}
- '@typescript-eslint/eslint-plugin@8.66.0(@typescript-eslint/parser@8.66.0(eslint@10.8.1)(typescript@6.0.3))(eslint@10.8.1)(typescript@6.0.3)':
+ '@typescript-eslint/eslint-plugin@8.67.0(@typescript-eslint/parser@8.67.0(eslint@10.8.1)(typescript@6.0.3))(eslint@10.8.1)(typescript@6.0.3)':
dependencies:
'@eslint-community/regexpp': 4.12.2
- '@typescript-eslint/parser': 8.66.0(eslint@10.8.1)(typescript@6.0.3)
- '@typescript-eslint/scope-manager': 8.66.0
- '@typescript-eslint/type-utils': 8.66.0(eslint@10.8.1)(typescript@6.0.3)
- '@typescript-eslint/utils': 8.66.0(eslint@10.8.1)(typescript@6.0.3)
- '@typescript-eslint/visitor-keys': 8.66.0
+ '@typescript-eslint/parser': 8.67.0(eslint@10.8.1)(typescript@6.0.3)
+ '@typescript-eslint/scope-manager': 8.67.0
+ '@typescript-eslint/type-utils': 8.67.0(eslint@10.8.1)(typescript@6.0.3)
+ '@typescript-eslint/utils': 8.67.0(eslint@10.8.1)(typescript@6.0.3)
+ '@typescript-eslint/visitor-keys': 8.67.0
eslint: 10.8.1
ignore: 7.0.6
natural-compare: 1.4.0
@@ -2035,41 +2035,41 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/parser@8.66.0(eslint@10.8.1)(typescript@6.0.3)':
+ '@typescript-eslint/parser@8.67.0(eslint@10.8.1)(typescript@6.0.3)':
dependencies:
- '@typescript-eslint/scope-manager': 8.66.0
- '@typescript-eslint/types': 8.66.0
- '@typescript-eslint/typescript-estree': 8.66.0(typescript@6.0.3)
- '@typescript-eslint/visitor-keys': 8.66.0
+ '@typescript-eslint/scope-manager': 8.67.0
+ '@typescript-eslint/types': 8.67.0
+ '@typescript-eslint/typescript-estree': 8.67.0(typescript@6.0.3)
+ '@typescript-eslint/visitor-keys': 8.67.0
debug: 4.4.3
eslint: 10.8.1
typescript: 6.0.3
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/project-service@8.66.0(typescript@6.0.3)':
+ '@typescript-eslint/project-service@8.67.0(typescript@6.0.3)':
dependencies:
- '@typescript-eslint/tsconfig-utils': 8.66.0(typescript@6.0.3)
- '@typescript-eslint/types': 8.66.0
+ '@typescript-eslint/tsconfig-utils': 8.67.0(typescript@6.0.3)
+ '@typescript-eslint/types': 8.67.0
debug: 4.4.3
typescript: 6.0.3
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/scope-manager@8.66.0':
+ '@typescript-eslint/scope-manager@8.67.0':
dependencies:
- '@typescript-eslint/types': 8.66.0
- '@typescript-eslint/visitor-keys': 8.66.0
+ '@typescript-eslint/types': 8.67.0
+ '@typescript-eslint/visitor-keys': 8.67.0
- '@typescript-eslint/tsconfig-utils@8.66.0(typescript@6.0.3)':
+ '@typescript-eslint/tsconfig-utils@8.67.0(typescript@6.0.3)':
dependencies:
typescript: 6.0.3
- '@typescript-eslint/type-utils@8.66.0(eslint@10.8.1)(typescript@6.0.3)':
+ '@typescript-eslint/type-utils@8.67.0(eslint@10.8.1)(typescript@6.0.3)':
dependencies:
- '@typescript-eslint/types': 8.66.0
- '@typescript-eslint/typescript-estree': 8.66.0(typescript@6.0.3)
- '@typescript-eslint/utils': 8.66.0(eslint@10.8.1)(typescript@6.0.3)
+ '@typescript-eslint/types': 8.67.0
+ '@typescript-eslint/typescript-estree': 8.67.0(typescript@6.0.3)
+ '@typescript-eslint/utils': 8.67.0(eslint@10.8.1)(typescript@6.0.3)
debug: 4.4.3
eslint: 10.8.1
ts-api-utils: 2.5.0(typescript@6.0.3)
@@ -2077,14 +2077,14 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/types@8.66.0': {}
+ '@typescript-eslint/types@8.67.0': {}
- '@typescript-eslint/typescript-estree@8.66.0(typescript@6.0.3)':
+ '@typescript-eslint/typescript-estree@8.67.0(typescript@6.0.3)':
dependencies:
- '@typescript-eslint/project-service': 8.66.0(typescript@6.0.3)
- '@typescript-eslint/tsconfig-utils': 8.66.0(typescript@6.0.3)
- '@typescript-eslint/types': 8.66.0
- '@typescript-eslint/visitor-keys': 8.66.0
+ '@typescript-eslint/project-service': 8.67.0(typescript@6.0.3)
+ '@typescript-eslint/tsconfig-utils': 8.67.0(typescript@6.0.3)
+ '@typescript-eslint/types': 8.67.0
+ '@typescript-eslint/visitor-keys': 8.67.0
debug: 4.4.3
minimatch: 10.2.6
semver: 7.8.5
@@ -2094,20 +2094,20 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/utils@8.66.0(eslint@10.8.1)(typescript@6.0.3)':
+ '@typescript-eslint/utils@8.67.0(eslint@10.8.1)(typescript@6.0.3)':
dependencies:
'@eslint-community/eslint-utils': 4.10.1(eslint@10.8.1)
- '@typescript-eslint/scope-manager': 8.66.0
- '@typescript-eslint/types': 8.66.0
- '@typescript-eslint/typescript-estree': 8.66.0(typescript@6.0.3)
+ '@typescript-eslint/scope-manager': 8.67.0
+ '@typescript-eslint/types': 8.67.0
+ '@typescript-eslint/typescript-estree': 8.67.0(typescript@6.0.3)
eslint: 10.8.1
typescript: 6.0.3
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/visitor-keys@8.66.0':
+ '@typescript-eslint/visitor-keys@8.67.0':
dependencies:
- '@typescript-eslint/types': 8.66.0
+ '@typescript-eslint/types': 8.67.0
eslint-visitor-keys: 5.0.1
acorn-jsx@5.3.2(acorn@8.18.0):
@@ -2199,7 +2199,7 @@ snapshots:
detect-libc@2.1.2:
optional: true
- docmd-assistant@0.1.9:
+ docmd-assistant@0.1.11:
dependencies:
aiplug: 0.1.2
@@ -2699,12 +2699,12 @@ snapshots:
type-fest@0.20.2:
optional: true
- typescript-eslint@8.66.0(eslint@10.8.1)(typescript@6.0.3):
+ typescript-eslint@8.67.0(eslint@10.8.1)(typescript@6.0.3):
dependencies:
- '@typescript-eslint/eslint-plugin': 8.66.0(@typescript-eslint/parser@8.66.0(eslint@10.8.1)(typescript@6.0.3))(eslint@10.8.1)(typescript@6.0.3)
- '@typescript-eslint/parser': 8.66.0(eslint@10.8.1)(typescript@6.0.3)
- '@typescript-eslint/typescript-estree': 8.66.0(typescript@6.0.3)
- '@typescript-eslint/utils': 8.66.0(eslint@10.8.1)(typescript@6.0.3)
+ '@typescript-eslint/eslint-plugin': 8.67.0(@typescript-eslint/parser@8.67.0(eslint@10.8.1)(typescript@6.0.3))(eslint@10.8.1)(typescript@6.0.3)
+ '@typescript-eslint/parser': 8.67.0(eslint@10.8.1)(typescript@6.0.3)
+ '@typescript-eslint/typescript-estree': 8.67.0(typescript@6.0.3)
+ '@typescript-eslint/utils': 8.67.0(eslint@10.8.1)(typescript@6.0.3)
eslint: 10.8.1
typescript: 6.0.3
transitivePeerDependencies: