docus 5.9.0 → 5.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/app/app.config.ts +12 -0
- package/app/components/app/AppHeader.vue +3 -6
- package/app/components/app/AppHeaderBody.vue +6 -2
- package/app/components/app/AppHeaderBottom.vue +6 -2
- package/app/components/app/AppHeaderLeft.vue +16 -0
- package/app/components/docs/DocsAsideLeftBody.vue +6 -1
- package/app/components/docs/DocsAsideMobileBar.vue +11 -1
- package/app/components/docs/DocsAsideRight.vue +6 -1
- package/app/composables/useUIConfig.ts +30 -0
- package/i18n/locales/ar.json +27 -0
- package/i18n/locales/be.json +27 -0
- package/i18n/locales/bg.json +27 -0
- package/i18n/locales/bn.json +27 -0
- package/i18n/locales/ca.json +27 -0
- package/i18n/locales/ckb.json +32 -1
- package/i18n/locales/cs.json +27 -0
- package/i18n/locales/da.json +27 -0
- package/i18n/locales/de.json +27 -0
- package/i18n/locales/el.json +27 -0
- package/i18n/locales/es.json +27 -0
- package/i18n/locales/et.json +27 -0
- package/i18n/locales/fi.json +27 -0
- package/i18n/locales/he.json +27 -0
- package/i18n/locales/hi.json +27 -0
- package/i18n/locales/hy.json +27 -0
- package/i18n/locales/id.json +27 -0
- package/i18n/locales/it.json +27 -0
- package/i18n/locales/ja.json +27 -0
- package/i18n/locales/kk.json +27 -0
- package/i18n/locales/km.json +27 -0
- package/i18n/locales/ko.json +27 -0
- package/i18n/locales/ky.json +27 -0
- package/i18n/locales/lb.json +27 -0
- package/i18n/locales/ms.json +27 -0
- package/i18n/locales/nb.json +27 -0
- package/i18n/locales/nl.json +27 -0
- package/i18n/locales/pl.json +27 -0
- package/i18n/locales/pt-BR.json +27 -0
- package/i18n/locales/ro.json +27 -0
- package/i18n/locales/ru.json +27 -0
- package/i18n/locales/si.json +27 -0
- package/i18n/locales/sl.json +27 -0
- package/i18n/locales/sv.json +27 -0
- package/i18n/locales/tr.json +27 -0
- package/i18n/locales/uk.json +27 -0
- package/i18n/locales/ur.json +27 -0
- package/i18n/locales/vi.json +27 -0
- package/i18n/locales/zh-CN.json +27 -0
- package/index.d.ts +33 -0
- package/modules/assistant/README.md +7 -5
- package/modules/assistant/index.ts +19 -11
- package/modules/css.ts +12 -0
- package/modules/skills/index.ts +25 -13
- package/package.json +2 -1
package/i18n/locales/si.json
CHANGED
|
@@ -32,5 +32,32 @@
|
|
|
32
32
|
"wordmarkDownloaded": "වචන ලකුණ බාගත කරන ලදී",
|
|
33
33
|
"copyLogoFailed": "ලාංඡනය පිටපත් කිරීමට අසමත් විය",
|
|
34
34
|
"copyWordmarkFailed": "වචන ලකුණ පිටපත් කිරීමට අසමත් විය"
|
|
35
|
+
},
|
|
36
|
+
"assistant": {
|
|
37
|
+
"title": "AI අහන්න",
|
|
38
|
+
"placeholder": "ප්රශ්නයක් අහන්න...",
|
|
39
|
+
"tooltip": "AI ගෙන් ප්රශ්නයක් අසන්න",
|
|
40
|
+
"tryAsking": "ප්රශ්නයක් ඇසීමට උත්සාහ කරන්න",
|
|
41
|
+
"askAnything": "ඕන දෙයක් අහන්න...",
|
|
42
|
+
"clearChat": "කතාබස් පැහැදිලි කරන්න",
|
|
43
|
+
"close": "වසන්න",
|
|
44
|
+
"expand": "පුළුල් කරන්න",
|
|
45
|
+
"collapse": "හකුළන්න",
|
|
46
|
+
"thinking": "සිතමින්...",
|
|
47
|
+
"askMeAnything": "ඕන දෙයක් අහන්න",
|
|
48
|
+
"askMeAnythingDescription": "ලේඛන සැරිසැරීමට, සංකල්ප තේරුම් ගැනීමට සහ පිළිතුරු සෙවීමට උදවු ලබා ගන්න.",
|
|
49
|
+
"faq": "නිතර අසන පැන",
|
|
50
|
+
"chatCleared": "නැවුම් කිරීමේදී කතාබස් හිස් වේ",
|
|
51
|
+
"lineBreak": "රේඛා බිඳීම",
|
|
52
|
+
"explainWithAi": "AI සමඟ පැහැදිලි කරන්න",
|
|
53
|
+
"toolListPages": "ලැයිස්තුගත ලේඛන පිටු",
|
|
54
|
+
"toolReadPage": "කියවන්න",
|
|
55
|
+
"loading": {
|
|
56
|
+
"searching": "ලේඛන සෙවීම",
|
|
57
|
+
"reading": "ලේඛන හරහා කියවීම",
|
|
58
|
+
"analyzing": "අන්තර්ගතය විශ්ලේෂණය කිරීම",
|
|
59
|
+
"finding": "හොඳම පිළිතුර සොයා ගැනීම",
|
|
60
|
+
"finished": "භාවිතා කරන ලද මූලාශ්ර"
|
|
61
|
+
}
|
|
35
62
|
}
|
|
36
63
|
}
|
package/i18n/locales/sl.json
CHANGED
|
@@ -32,5 +32,32 @@
|
|
|
32
32
|
"wordmarkDownloaded": "Besedna znamka prenesena",
|
|
33
33
|
"copyLogoFailed": "Kopiranje logotipa ni uspelo",
|
|
34
34
|
"copyWordmarkFailed": "Kopiranje besedne znamke ni uspelo"
|
|
35
|
+
},
|
|
36
|
+
"assistant": {
|
|
37
|
+
"title": "Vprašajte AI",
|
|
38
|
+
"placeholder": "Postavite vprašanje...",
|
|
39
|
+
"tooltip": "Zastavite vprašanje AI",
|
|
40
|
+
"tryAsking": "Poskusite postaviti vprašanje",
|
|
41
|
+
"askAnything": "Vprašajte karkoli...",
|
|
42
|
+
"clearChat": "Počisti klepet",
|
|
43
|
+
"close": "Zapri",
|
|
44
|
+
"expand": "Razširi",
|
|
45
|
+
"collapse": "Strni",
|
|
46
|
+
"thinking": "Razmišljanje...",
|
|
47
|
+
"askMeAnything": "Vprašaj karkoli",
|
|
48
|
+
"askMeAnythingDescription": "Poiščite pomoč pri krmarjenju po dokumentaciji, razumevanju konceptov in iskanju odgovorov.",
|
|
49
|
+
"faq": "Pogosta vprašanja",
|
|
50
|
+
"chatCleared": "Klepet se ob osvežitvi izbriše",
|
|
51
|
+
"lineBreak": "Prelom vrstice",
|
|
52
|
+
"explainWithAi": "Razloži z AI",
|
|
53
|
+
"toolListPages": "Navedene strani dokumentacije",
|
|
54
|
+
"toolReadPage": "Preberi",
|
|
55
|
+
"loading": {
|
|
56
|
+
"searching": "Iskanje po dokumentaciji",
|
|
57
|
+
"reading": "Prebiranje dokumentov",
|
|
58
|
+
"analyzing": "Analiza vsebine",
|
|
59
|
+
"finding": "Iskanje najboljšega odgovora",
|
|
60
|
+
"finished": "Uporabljeni viri"
|
|
61
|
+
}
|
|
35
62
|
}
|
|
36
63
|
}
|
package/i18n/locales/sv.json
CHANGED
|
@@ -32,5 +32,32 @@
|
|
|
32
32
|
"wordmarkDownloaded": "Ordmärke nedladdat",
|
|
33
33
|
"copyLogoFailed": "Kunde inte kopiera logotyp",
|
|
34
34
|
"copyWordmarkFailed": "Kunde inte kopiera ordmärke"
|
|
35
|
+
},
|
|
36
|
+
"assistant": {
|
|
37
|
+
"title": "Fråga AI",
|
|
38
|
+
"placeholder": "Ställ en fråga...",
|
|
39
|
+
"tooltip": "Ställ en fråga till AI",
|
|
40
|
+
"tryAsking": "Försök att ställa en fråga",
|
|
41
|
+
"askAnything": "Fråga vad som helst...",
|
|
42
|
+
"clearChat": "Rensa chatten",
|
|
43
|
+
"close": "Stäng",
|
|
44
|
+
"expand": "Expandera",
|
|
45
|
+
"collapse": "Kollapsa",
|
|
46
|
+
"thinking": "Funderar...",
|
|
47
|
+
"askMeAnything": "Fråga vad som helst",
|
|
48
|
+
"askMeAnythingDescription": "Få hjälp med att navigera i dokumentationen, förstå begrepp och hitta svar.",
|
|
49
|
+
"faq": "FAQ",
|
|
50
|
+
"chatCleared": "Chatten rensas vid uppdatering",
|
|
51
|
+
"lineBreak": "Radbrytning",
|
|
52
|
+
"explainWithAi": "Förklara med AI",
|
|
53
|
+
"toolListPages": "Listade dokumentationssidor",
|
|
54
|
+
"toolReadPage": "Läs",
|
|
55
|
+
"loading": {
|
|
56
|
+
"searching": "Söker i dokumentationen",
|
|
57
|
+
"reading": "Läser igenom dokumenten",
|
|
58
|
+
"analyzing": "Analysera innehållet",
|
|
59
|
+
"finding": "Att hitta det bästa svaret",
|
|
60
|
+
"finished": "Använda källor"
|
|
61
|
+
}
|
|
35
62
|
}
|
|
36
63
|
}
|
package/i18n/locales/tr.json
CHANGED
|
@@ -32,5 +32,32 @@
|
|
|
32
32
|
"wordmarkDownloaded": "Wordmark indirildi",
|
|
33
33
|
"copyLogoFailed": "Logo kopyalanamadı",
|
|
34
34
|
"copyWordmarkFailed": "Wordmark kopyalanamadı"
|
|
35
|
+
},
|
|
36
|
+
"assistant": {
|
|
37
|
+
"title": "Yapay zekaya sor",
|
|
38
|
+
"placeholder": "Bir soru sorun...",
|
|
39
|
+
"tooltip": "Yapay zekaya bir soru sorun",
|
|
40
|
+
"tryAsking": "Bir soru sormayı deneyin",
|
|
41
|
+
"askAnything": "Her şeyi sor...",
|
|
42
|
+
"clearChat": "Sohbeti temizle",
|
|
43
|
+
"close": "Kapat",
|
|
44
|
+
"expand": "Genişlet",
|
|
45
|
+
"collapse": "Daralt",
|
|
46
|
+
"thinking": "Düşünüyorum...",
|
|
47
|
+
"askMeAnything": "Her şeyi sor",
|
|
48
|
+
"askMeAnythingDescription": "Belgelerde gezinme, kavramları anlama ve yanıt bulma konusunda yardım alın.",
|
|
49
|
+
"faq": "SSS",
|
|
50
|
+
"chatCleared": "Sohbet yenilendiğinde temizlenir",
|
|
51
|
+
"lineBreak": "Satır sonu",
|
|
52
|
+
"explainWithAi": "Yapay zeka ile açıklayın",
|
|
53
|
+
"toolListPages": "Listelenen dokümantasyon sayfaları",
|
|
54
|
+
"toolReadPage": "Oku",
|
|
55
|
+
"loading": {
|
|
56
|
+
"searching": "Dokümantasyonda arama",
|
|
57
|
+
"reading": "Dokümanlar okunuyor",
|
|
58
|
+
"analyzing": "İçerik analiz ediliyor",
|
|
59
|
+
"finding": "En iyi yanıt bulunuyor",
|
|
60
|
+
"finished": "Kullanılan kaynaklar"
|
|
61
|
+
}
|
|
35
62
|
}
|
|
36
63
|
}
|
package/i18n/locales/uk.json
CHANGED
|
@@ -32,5 +32,32 @@
|
|
|
32
32
|
"wordmarkDownloaded": "Словесний знак завантажено",
|
|
33
33
|
"copyLogoFailed": "Не вдалося скопіювати логотип",
|
|
34
34
|
"copyWordmarkFailed": "Не вдалося скопіювати словесний знак"
|
|
35
|
+
},
|
|
36
|
+
"assistant": {
|
|
37
|
+
"title": "Запитайте ШІ",
|
|
38
|
+
"placeholder": "Задайте питання...",
|
|
39
|
+
"tooltip": "Задайте питання ШІ",
|
|
40
|
+
"tryAsking": "Спробуйте задати питання",
|
|
41
|
+
"askAnything": "Запитайте будь-що...",
|
|
42
|
+
"clearChat": "Очистити чат",
|
|
43
|
+
"close": "Закрити",
|
|
44
|
+
"expand": "Розгорнути",
|
|
45
|
+
"collapse": "Згорнути",
|
|
46
|
+
"thinking": "Думаючи...",
|
|
47
|
+
"askMeAnything": "Запитайте будь-що",
|
|
48
|
+
"askMeAnythingDescription": "Отримайте допомогу в навігації документацією, розумінні понять і пошуку відповідей.",
|
|
49
|
+
"faq": "Поширені запитання",
|
|
50
|
+
"chatCleared": "Чат очищається під час оновлення",
|
|
51
|
+
"lineBreak": "Розрив рядка",
|
|
52
|
+
"explainWithAi": "Поясніть за допомогою ШІ",
|
|
53
|
+
"toolListPages": "Перелічені сторінки документації",
|
|
54
|
+
"toolReadPage": "Читати",
|
|
55
|
+
"loading": {
|
|
56
|
+
"searching": "Пошук документації",
|
|
57
|
+
"reading": "Читання документів",
|
|
58
|
+
"analyzing": "Аналіз змісту",
|
|
59
|
+
"finding": "Пошук найкращої відповіді",
|
|
60
|
+
"finished": "Використані джерела"
|
|
61
|
+
}
|
|
35
62
|
}
|
|
36
63
|
}
|
package/i18n/locales/ur.json
CHANGED
|
@@ -32,5 +32,32 @@
|
|
|
32
32
|
"wordmarkDownloaded": "ورڈ مارک ڈاؤن لوڈ ہو گیا",
|
|
33
33
|
"copyLogoFailed": "لوگو کاپی نہیں ہو سکا",
|
|
34
34
|
"copyWordmarkFailed": "ورڈ مارک کاپی نہیں ہو سکا"
|
|
35
|
+
},
|
|
36
|
+
"assistant": {
|
|
37
|
+
"title": "AI سے پوچھیں۔",
|
|
38
|
+
"placeholder": "ایک سوال پوچھیں...",
|
|
39
|
+
"tooltip": "AI سے ایک سوال پوچھیں۔",
|
|
40
|
+
"tryAsking": "ایک سوال پوچھنے کی کوشش کریں۔",
|
|
41
|
+
"askAnything": "کچھ بھی پوچھو...",
|
|
42
|
+
"clearChat": "چیٹ صاف کریں۔",
|
|
43
|
+
"close": "بند",
|
|
44
|
+
"expand": "پھیلائیں۔",
|
|
45
|
+
"collapse": "سمٹنا",
|
|
46
|
+
"thinking": "سوچ رہا ہے...",
|
|
47
|
+
"askMeAnything": "کچھ بھی پوچھو",
|
|
48
|
+
"askMeAnythingDescription": "دستاویزات کو نیویگیٹ کرنے، تصورات کو سمجھنے اور جوابات تلاش کرنے میں مدد حاصل کریں۔",
|
|
49
|
+
"faq": "اکثر پوچھے گئے سوالات",
|
|
50
|
+
"chatCleared": "ریفریش پر چیٹ صاف ہو جاتی ہے۔",
|
|
51
|
+
"lineBreak": "لائن بریک",
|
|
52
|
+
"explainWithAi": "AI کے ساتھ وضاحت کریں۔",
|
|
53
|
+
"toolListPages": "درج دستاویزات کے صفحات",
|
|
54
|
+
"toolReadPage": "پڑھیں",
|
|
55
|
+
"loading": {
|
|
56
|
+
"searching": "دستاویزات کی تلاش",
|
|
57
|
+
"reading": "دستاویزات کے ذریعے پڑھنا",
|
|
58
|
+
"analyzing": "مواد کا تجزیہ",
|
|
59
|
+
"finding": "بہترین جواب تلاش کرنا",
|
|
60
|
+
"finished": "ذرائع استعمال کیے گئے۔"
|
|
61
|
+
}
|
|
35
62
|
}
|
|
36
63
|
}
|
package/i18n/locales/vi.json
CHANGED
|
@@ -32,5 +32,32 @@
|
|
|
32
32
|
"wordmarkDownloaded": "Đã tải wordmark",
|
|
33
33
|
"copyLogoFailed": "Không thể sao chép logo",
|
|
34
34
|
"copyWordmarkFailed": "Không thể sao chép wordmark"
|
|
35
|
+
},
|
|
36
|
+
"assistant": {
|
|
37
|
+
"title": "Hỏi AI",
|
|
38
|
+
"placeholder": "Đặt một câu hỏi...",
|
|
39
|
+
"tooltip": "Đặt câu hỏi cho AI",
|
|
40
|
+
"tryAsking": "Hãy thử đặt một câu hỏi",
|
|
41
|
+
"askAnything": "Hỏi bất cứ điều gì...",
|
|
42
|
+
"clearChat": "Xóa cuộc trò chuyện",
|
|
43
|
+
"close": "Đóng",
|
|
44
|
+
"expand": "Mở rộng",
|
|
45
|
+
"collapse": "Thu gọn",
|
|
46
|
+
"thinking": "Đang suy nghĩ...",
|
|
47
|
+
"askMeAnything": "Hỏi bất cứ điều gì",
|
|
48
|
+
"askMeAnythingDescription": "Nhận trợ giúp điều hướng tài liệu, hiểu các khái niệm và tìm câu trả lời.",
|
|
49
|
+
"faq": "Câu hỏi thường gặp",
|
|
50
|
+
"chatCleared": "Trò chuyện sẽ bị xóa khi làm mới",
|
|
51
|
+
"lineBreak": "Ngắt dòng",
|
|
52
|
+
"explainWithAi": "Giải thích bằng AI",
|
|
53
|
+
"toolListPages": "Các trang tài liệu được liệt kê",
|
|
54
|
+
"toolReadPage": "Đọc",
|
|
55
|
+
"loading": {
|
|
56
|
+
"searching": "Tìm kiếm tài liệu",
|
|
57
|
+
"reading": "Đọc qua tài liệu",
|
|
58
|
+
"analyzing": "Phân tích nội dung",
|
|
59
|
+
"finding": "Tìm câu trả lời tốt nhất",
|
|
60
|
+
"finished": "Nguồn được sử dụng"
|
|
61
|
+
}
|
|
35
62
|
}
|
|
36
63
|
}
|
package/i18n/locales/zh-CN.json
CHANGED
|
@@ -32,5 +32,32 @@
|
|
|
32
32
|
"wordmarkDownloaded": "文字标识已下载",
|
|
33
33
|
"copyLogoFailed": "复制图标失败",
|
|
34
34
|
"copyWordmarkFailed": "复制文字标识失败"
|
|
35
|
+
},
|
|
36
|
+
"assistant": {
|
|
37
|
+
"title": "询问人工智能",
|
|
38
|
+
"placeholder": "问一个问题...",
|
|
39
|
+
"tooltip": "问人工智能一个问题",
|
|
40
|
+
"tryAsking": "尝试提问",
|
|
41
|
+
"askAnything": "想问什么都可以...",
|
|
42
|
+
"clearChat": "清除聊天内容",
|
|
43
|
+
"close": "关闭",
|
|
44
|
+
"expand": "展开",
|
|
45
|
+
"collapse": "崩溃",
|
|
46
|
+
"thinking": "想着……",
|
|
47
|
+
"askMeAnything": "询问任何事情",
|
|
48
|
+
"askMeAnythingDescription": "获取浏览文档、理解概念和寻找答案的帮助。",
|
|
49
|
+
"faq": "常见问题解答",
|
|
50
|
+
"chatCleared": "刷新时聊天会被清除",
|
|
51
|
+
"lineBreak": "换行符",
|
|
52
|
+
"explainWithAi": "用AI解释",
|
|
53
|
+
"toolListPages": "列出的文档页面",
|
|
54
|
+
"toolReadPage": "阅读",
|
|
55
|
+
"loading": {
|
|
56
|
+
"searching": "搜索文档",
|
|
57
|
+
"reading": "通读文档",
|
|
58
|
+
"analyzing": "分析内容",
|
|
59
|
+
"finding": "寻找最佳答案",
|
|
60
|
+
"finished": "使用的来源"
|
|
61
|
+
}
|
|
35
62
|
}
|
|
36
63
|
}
|
package/index.d.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { AssistantModuleOptions } from './modules/assistant'
|
|
2
|
+
import type { SkillsModuleOptions } from './modules/skills'
|
|
3
|
+
|
|
4
|
+
export interface DocusNuxtConfig {
|
|
5
|
+
assistant?: AssistantModuleOptions
|
|
6
|
+
skills?: SkillsModuleOptions
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
declare module '@nuxt/schema' {
|
|
10
|
+
interface NuxtConfig {
|
|
11
|
+
docus?: DocusNuxtConfig
|
|
12
|
+
/** @deprecated Use `docus.assistant` instead */
|
|
13
|
+
assistant?: AssistantModuleOptions
|
|
14
|
+
}
|
|
15
|
+
interface NuxtOptions {
|
|
16
|
+
docus?: DocusNuxtConfig
|
|
17
|
+
/** @deprecated Use `docus.assistant` instead */
|
|
18
|
+
assistant?: AssistantModuleOptions
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
declare module 'nuxt/schema' {
|
|
23
|
+
interface NuxtConfig {
|
|
24
|
+
docus?: DocusNuxtConfig
|
|
25
|
+
/** @deprecated Use `docus.assistant` instead */
|
|
26
|
+
assistant?: AssistantModuleOptions
|
|
27
|
+
}
|
|
28
|
+
interface NuxtOptions {
|
|
29
|
+
docus?: DocusNuxtConfig
|
|
30
|
+
/** @deprecated Use `docus.assistant` instead */
|
|
31
|
+
assistant?: AssistantModuleOptions
|
|
32
|
+
}
|
|
33
|
+
}
|
|
@@ -27,11 +27,13 @@ pnpm add @ai-sdk/mcp @ai-sdk/vue @ai-sdk/gateway ai motion-v shiki shiki-stream
|
|
|
27
27
|
export default defineNuxtConfig({
|
|
28
28
|
modules: ['./modules/assistant'],
|
|
29
29
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
30
|
+
docus: {
|
|
31
|
+
assistant: {
|
|
32
|
+
apiPath: '/__docus__/assistant',
|
|
33
|
+
mcpServer: '/mcp',
|
|
34
|
+
model: 'google/gemini-3-flash',
|
|
35
|
+
},
|
|
36
|
+
},
|
|
35
37
|
})
|
|
36
38
|
```
|
|
37
39
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { addComponent, addImports, addServerHandler, createResolver, defineNuxtModule, logger } from '@nuxt/kit'
|
|
2
|
+
import { defu } from 'defu'
|
|
2
3
|
|
|
3
4
|
export interface AssistantModuleOptions {
|
|
4
5
|
/**
|
|
@@ -22,17 +23,24 @@ export interface AssistantModuleOptions {
|
|
|
22
23
|
|
|
23
24
|
const log = logger.withTag('Docus')
|
|
24
25
|
|
|
26
|
+
const defaults: Required<AssistantModuleOptions> = {
|
|
27
|
+
apiPath: '/__docus__/assistant',
|
|
28
|
+
mcpServer: '/mcp',
|
|
29
|
+
model: 'google/gemini-3-flash',
|
|
30
|
+
}
|
|
31
|
+
|
|
25
32
|
export default defineNuxtModule<AssistantModuleOptions>({
|
|
26
33
|
meta: {
|
|
27
34
|
name: 'assistant',
|
|
28
|
-
configKey: 'assistant',
|
|
29
|
-
},
|
|
30
|
-
defaults: {
|
|
31
|
-
apiPath: '/__docus__/assistant',
|
|
32
|
-
mcpServer: '/mcp',
|
|
33
|
-
model: 'google/gemini-3-flash',
|
|
34
35
|
},
|
|
35
|
-
setup(
|
|
36
|
+
setup(_options, nuxt) {
|
|
37
|
+
const legacyOptions = nuxt.options.assistant
|
|
38
|
+
if (legacyOptions && Object.keys(legacyOptions).length > 0) {
|
|
39
|
+
log.warn('`assistant` top-level config is deprecated. Move it under `docus.assistant` in nuxt.config.ts')
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const options = defu(nuxt.options.docus?.assistant, legacyOptions, defaults) as Required<AssistantModuleOptions>
|
|
43
|
+
|
|
36
44
|
const hasAiGatewayAuth = !!(
|
|
37
45
|
process.env.AI_GATEWAY_API_KEY || process.env.VERCEL_OIDC_TOKEN
|
|
38
46
|
)
|
|
@@ -41,7 +49,7 @@ export default defineNuxtModule<AssistantModuleOptions>({
|
|
|
41
49
|
|
|
42
50
|
nuxt.options.runtimeConfig.public.assistant = {
|
|
43
51
|
enabled: hasAiGatewayAuth,
|
|
44
|
-
apiPath: options.apiPath
|
|
52
|
+
apiPath: options.apiPath,
|
|
45
53
|
}
|
|
46
54
|
|
|
47
55
|
addImports([
|
|
@@ -74,11 +82,11 @@ export default defineNuxtModule<AssistantModuleOptions>({
|
|
|
74
82
|
}
|
|
75
83
|
|
|
76
84
|
nuxt.options.runtimeConfig.assistant = {
|
|
77
|
-
mcpServer: options.mcpServer
|
|
78
|
-
model: options.model
|
|
85
|
+
mcpServer: options.mcpServer,
|
|
86
|
+
model: options.model,
|
|
79
87
|
}
|
|
80
88
|
|
|
81
|
-
const routePath = options.apiPath
|
|
89
|
+
const routePath = options.apiPath.replace(/^\//, '')
|
|
82
90
|
addServerHandler({
|
|
83
91
|
route: `/${routePath}`,
|
|
84
92
|
handler: resolve('./runtime/server/api/search'),
|
package/modules/css.ts
CHANGED
|
@@ -32,5 +32,17 @@ export default defineNuxtModule({
|
|
|
32
32
|
if (Array.isArray(nuxt.options.css)) {
|
|
33
33
|
nuxt.options.css.unshift(cssTemplate.dst)
|
|
34
34
|
}
|
|
35
|
+
|
|
36
|
+
// Noisy Vite warnings
|
|
37
|
+
const sourcemapWarnIgnore = ['@tailwindcss/vite:generate:build', 'nuxt:module-preload-polyfill']
|
|
38
|
+
nuxt.hook('vite:extendConfig', (config) => {
|
|
39
|
+
const logger = config.customLogger
|
|
40
|
+
if (!logger) return
|
|
41
|
+
const originalWarn = logger.warn.bind(logger)
|
|
42
|
+
logger.warn = (msg, options) => {
|
|
43
|
+
if (sourcemapWarnIgnore.some(p => msg.includes(p))) return
|
|
44
|
+
originalWarn(msg, options)
|
|
45
|
+
}
|
|
46
|
+
})
|
|
35
47
|
},
|
|
36
48
|
})
|
package/modules/skills/index.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
import { addServerHandler, createResolver, defineNuxtModule, logger } from '@nuxt/kit'
|
|
1
|
+
import { addPrerenderRoutes, addServerHandler, createResolver, defineNuxtModule, logger } from '@nuxt/kit'
|
|
2
|
+
import { defu } from 'defu'
|
|
2
3
|
import { existsSync } from 'node:fs'
|
|
3
4
|
import { readdir, readFile } from 'node:fs/promises'
|
|
4
5
|
import { join } from 'node:path'
|
|
6
|
+
import type { NitroConfig } from 'nitropack'
|
|
5
7
|
import { parse as parseYaml } from 'yaml'
|
|
6
8
|
|
|
7
9
|
interface SkillEntry {
|
|
@@ -10,17 +12,27 @@ interface SkillEntry {
|
|
|
10
12
|
files: string[]
|
|
11
13
|
}
|
|
12
14
|
|
|
15
|
+
export interface SkillsModuleOptions {
|
|
16
|
+
dir?: string
|
|
17
|
+
}
|
|
18
|
+
|
|
13
19
|
const SKILL_NAME_REGEX = /^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/
|
|
14
20
|
const MAX_NAME_LENGTH = 64
|
|
15
21
|
|
|
16
22
|
const log = logger.withTag('Docus')
|
|
17
23
|
|
|
18
|
-
|
|
24
|
+
const defaults: Required<SkillsModuleOptions> = {
|
|
25
|
+
dir: 'skills',
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export default defineNuxtModule<SkillsModuleOptions>({
|
|
19
29
|
meta: {
|
|
20
30
|
name: 'skills',
|
|
21
31
|
},
|
|
22
|
-
async setup(
|
|
23
|
-
const
|
|
32
|
+
async setup(_inlineOptions, nuxt) {
|
|
33
|
+
const options = defu(nuxt.options.docus?.skills, defaults) as Required<SkillsModuleOptions>
|
|
34
|
+
|
|
35
|
+
const skillsDir = join(nuxt.options.rootDir, options.dir)
|
|
24
36
|
if (!existsSync(skillsDir)) return
|
|
25
37
|
|
|
26
38
|
const catalog = await scanSkills(skillsDir)
|
|
@@ -32,19 +44,19 @@ export default defineNuxtModule({
|
|
|
32
44
|
|
|
33
45
|
const { resolve } = createResolver(import.meta.url)
|
|
34
46
|
|
|
35
|
-
nuxt.hook('nitro:config', (nitroConfig) =>
|
|
47
|
+
const onNitroConfig = nuxt.hook as (name: 'nitro:config', cb: (nitroConfig: NitroConfig) => void) => void
|
|
48
|
+
onNitroConfig('nitro:config', (nitroConfig) => {
|
|
36
49
|
nitroConfig.serverAssets ||= []
|
|
37
50
|
nitroConfig.serverAssets.push({ baseName: 'skills', dir: skillsDir })
|
|
51
|
+
})
|
|
38
52
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
for (const file of skill.files) {
|
|
44
|
-
nitroConfig.prerender.routes.push(`/.well-known/skills/${skill.name}/${file}`)
|
|
45
|
-
}
|
|
53
|
+
const prerenderRoutes = ['/.well-known/skills/index.json']
|
|
54
|
+
for (const skill of catalog) {
|
|
55
|
+
for (const file of skill.files) {
|
|
56
|
+
prerenderRoutes.push(`/.well-known/skills/${skill.name}/${file}`)
|
|
46
57
|
}
|
|
47
|
-
}
|
|
58
|
+
}
|
|
59
|
+
addPrerenderRoutes(prerenderRoutes)
|
|
48
60
|
|
|
49
61
|
addServerHandler({
|
|
50
62
|
route: '/.well-known/skills/index.json',
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "docus",
|
|
3
3
|
"description": "Nuxt layer for Docus documentation theme",
|
|
4
|
-
"version": "5.
|
|
4
|
+
"version": "5.10.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./nuxt.config.ts",
|
|
7
7
|
"repository": {
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
"app",
|
|
15
15
|
"i18n",
|
|
16
16
|
"content.config.ts",
|
|
17
|
+
"index.d.ts",
|
|
17
18
|
"modules",
|
|
18
19
|
"nuxt.config.ts",
|
|
19
20
|
"nuxt.schema.ts",
|