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? +
+ image +
+ + + +**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? +
+ image +
+ + + +**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 ? +
+ image +
+ + + +**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 なのか? +
+ image +
+ + + +**[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 @@
- docmd default theme — light and dark mode preview + docmd default theme — light and dark mode preview

@@ -158,7 +158,7 @@ docker run -p 3000:3000 ghcr.io/docmd-io/docmd:0.9.0 ## Why docmd?
- image + image
+ +**Смотрите полное [Сравнение с 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? +
+ image +
+ + + +**查看与 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? +
+ image +
+ + + +**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 ? `
${lang.toLowerCase()}
` : ''; + 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 = `
${lang.toLowerCase()}
`; + 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(`
${code.trim()}
`); 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: