@fgbg/mdocs 0.8.9 → 0.8.10

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.
Files changed (106) hide show
  1. package/agent-skills/changelog/SKILL.md +286 -0
  2. package/agent-skills/core-concepts-all-files/SKILL.md +53 -0
  3. package/agent-skills/core-concepts-domain/SKILL.md +106 -0
  4. package/agent-skills/core-concepts-invitation/SKILL.md +61 -0
  5. package/agent-skills/core-concepts-no-account/SKILL.md +85 -0
  6. package/agent-skills/deployment-config/SKILL.md +47 -0
  7. package/agent-skills/deployment-requirements/SKILL.md +50 -0
  8. package/agent-skills/deployment-reverse-proxy/SKILL.md +71 -0
  9. package/agent-skills/faq/SKILL.md +48 -0
  10. package/agent-skills/getting-started-first-kb/SKILL.md +40 -0
  11. package/agent-skills/getting-started-installation/SKILL.md +119 -0
  12. package/agent-skills/index/SKILL.md +47 -0
  13. package/agent-skills/index.json +184 -0
  14. package/agent-skills/usage-bookmarks/SKILL.md +93 -0
  15. package/agent-skills/usage-cli-token/SKILL.md +128 -0
  16. package/agent-skills/usage-comments/SKILL.md +149 -0
  17. package/agent-skills/usage-domain-members/SKILL.md +104 -0
  18. package/agent-skills/usage-drafts/SKILL.md +111 -0
  19. package/agent-skills/usage-flowchart/SKILL.md +88 -0
  20. package/agent-skills/usage-markdown/SKILL.md +105 -0
  21. package/agent-skills/usage-merge-conflicts/SKILL.md +42 -0
  22. package/agent-skills/usage-my-documents/SKILL.md +106 -0
  23. package/agent-skills/usage-onboarding-ai/SKILL.md +49 -0
  24. package/agent-skills/usage-recovery-code/SKILL.md +72 -0
  25. package/agent-skills/usage-search/SKILL.md +34 -0
  26. package/agent-skills/usage-settings/SKILL.md +118 -0
  27. package/agent-skills/why-mdocs/SKILL.md +13 -0
  28. package/dist/server/agent/Agent/run.js +222 -0
  29. package/dist/server/agent/Agent/run.js.map +1 -0
  30. package/dist/server/agent/Agent/session-manager.js +147 -0
  31. package/dist/server/agent/Agent/session-manager.js.map +1 -0
  32. package/dist/server/agent/Agent/system-prompt.js +13 -0
  33. package/dist/server/agent/Agent/system-prompt.js.map +1 -0
  34. package/dist/server/agent/Agent/tools.js +37 -0
  35. package/dist/server/agent/Agent/tools.js.map +1 -0
  36. package/dist/server/agent/Config/config.js +113 -0
  37. package/dist/server/agent/Config/config.js.map +1 -0
  38. package/dist/server/agent/Skill/skill-loader.js +46 -0
  39. package/dist/server/agent/Skill/skill-loader.js.map +1 -0
  40. package/dist/server/app.js +2 -0
  41. package/dist/server/app.js.map +1 -1
  42. package/dist/server/db/repositories/agent-model-config.repo.js +17 -0
  43. package/dist/server/db/repositories/agent-model-config.repo.js.map +1 -0
  44. package/dist/server/db/schema.js +10 -0
  45. package/dist/server/db/schema.js.map +1 -1
  46. package/dist/server/routes/agent.routes.js +135 -0
  47. package/dist/server/routes/agent.routes.js.map +1 -0
  48. package/dist/web/assets/{MergeView-CTeS5Pgb.js → MergeView-Da6W6Mwd.js} +1 -1
  49. package/dist/web/assets/{_baseUniq-BEyyLo4a.js → _baseUniq-DIXaUG3P.js} +1 -1
  50. package/dist/web/assets/{arc-DRyJIB49.js → arc-BdrqKgEt.js} +1 -1
  51. package/dist/web/assets/{architectureDiagram-Q4EWVU46-C6FcFqys.js → architectureDiagram-Q4EWVU46-C7DbabmE.js} +1 -1
  52. package/dist/web/assets/{blockDiagram-DXYQGD6D-C5DamiPe.js → blockDiagram-DXYQGD6D-xpzHPtBf.js} +1 -1
  53. package/dist/web/assets/{c4Diagram-AHTNJAMY-BQf9874A.js → c4Diagram-AHTNJAMY-C55XB-0p.js} +1 -1
  54. package/dist/web/assets/channel-R2F1bwis.js +1 -0
  55. package/dist/web/assets/{chunk-4BX2VUAB-CvLXGWM9.js → chunk-4BX2VUAB-Cw9cGcvA.js} +1 -1
  56. package/dist/web/assets/{chunk-4TB4RGXK-C2B5cSFk.js → chunk-4TB4RGXK-Bb7TaNsp.js} +1 -1
  57. package/dist/web/assets/{chunk-55IACEB6-C-va7Y5a.js → chunk-55IACEB6-ClfU0bTR.js} +1 -1
  58. package/dist/web/assets/{chunk-EDXVE4YY-NG3zjl2t.js → chunk-EDXVE4YY-DEYQg7so.js} +1 -1
  59. package/dist/web/assets/{chunk-FMBD7UC4-A2P0ciLw.js → chunk-FMBD7UC4-l0uxylnu.js} +1 -1
  60. package/dist/web/assets/{chunk-OYMX7WX6-Cto0U3kG.js → chunk-OYMX7WX6-CTuAfYj2.js} +1 -1
  61. package/dist/web/assets/{chunk-QZHKN3VN-DNdWRP-4.js → chunk-QZHKN3VN-Cd5BdpCj.js} +1 -1
  62. package/dist/web/assets/{chunk-YZCP3GAM-B7BWetQd.js → chunk-YZCP3GAM-C4AFz6HK.js} +1 -1
  63. package/dist/web/assets/classDiagram-6PBFFD2Q-D8Aoi_kK.js +1 -0
  64. package/dist/web/assets/classDiagram-v2-HSJHXN6E-D8Aoi_kK.js +1 -0
  65. package/dist/web/assets/clone-D3UTWyOI.js +1 -0
  66. package/dist/web/assets/{cose-bilkent-S5V4N54A-DAp6XOTI.js → cose-bilkent-S5V4N54A-DPbGSIxQ.js} +1 -1
  67. package/dist/web/assets/{dagre-KV5264BT-bXw64vAF.js → dagre-KV5264BT-BAqCvioS.js} +1 -1
  68. package/dist/web/assets/{diagram-5BDNPKRD-BZyIxgPb.js → diagram-5BDNPKRD-BVhjoylL.js} +1 -1
  69. package/dist/web/assets/{diagram-G4DWMVQ6-B7DIbmE6.js → diagram-G4DWMVQ6-BgdBEUo2.js} +1 -1
  70. package/dist/web/assets/{diagram-MMDJMWI5-CYIS8pup.js → diagram-MMDJMWI5-v3XiVR4L.js} +1 -1
  71. package/dist/web/assets/{diagram-TYMM5635-iVE2rLmi.js → diagram-TYMM5635-Bnlc4JL7.js} +1 -1
  72. package/dist/web/assets/{erDiagram-SMLLAGMA-TYkyJdZq.js → erDiagram-SMLLAGMA-DZNfy5XO.js} +1 -1
  73. package/dist/web/assets/{flowDiagram-DWJPFMVM-DCq4RRIH.js → flowDiagram-DWJPFMVM-CyNHaoXD.js} +1 -1
  74. package/dist/web/assets/{ganttDiagram-T4ZO3ILL-BwOIx_Vs.js → ganttDiagram-T4ZO3ILL-D9XKVK6L.js} +1 -1
  75. package/dist/web/assets/{gitGraphDiagram-UUTBAWPF-CS9cfxUA.js → gitGraphDiagram-UUTBAWPF-BsoJR5By.js} +1 -1
  76. package/dist/web/assets/{graph-K8x8ab-D.js → graph-C6hZEMMA.js} +1 -1
  77. package/dist/web/assets/{index-DRsX6c0H.js → index-BiYwrQhS.js} +1220 -1186
  78. package/dist/web/assets/index-C4tGH1XB.css +1 -0
  79. package/dist/web/assets/{infoDiagram-42DDH7IO-DFs9J8cW.js → infoDiagram-42DDH7IO-EsbSvvwg.js} +1 -1
  80. package/dist/web/assets/{ishikawaDiagram-UXIWVN3A-ChYUj0ld.js → ishikawaDiagram-UXIWVN3A-opc9PUAq.js} +1 -1
  81. package/dist/web/assets/{journeyDiagram-VCZTEJTY-CysvVjkr.js → journeyDiagram-VCZTEJTY-CGoqXdQp.js} +1 -1
  82. package/dist/web/assets/{kanban-definition-6JOO6SKY-DlGvCOou.js → kanban-definition-6JOO6SKY-BsMSOTEO.js} +1 -1
  83. package/dist/web/assets/{layout-DDk1jHzS.js → layout-dka4PN3u.js} +1 -1
  84. package/dist/web/assets/{linear-CCo9IeHT.js → linear-C7358dWt.js} +1 -1
  85. package/dist/web/assets/{min-BTxfBtS6.js → min-CkhEOvqb.js} +1 -1
  86. package/dist/web/assets/{mindmap-definition-QFDTVHPH-D2Y8ZrN3.js → mindmap-definition-QFDTVHPH-Cw5Uw5sO.js} +1 -1
  87. package/dist/web/assets/{pieDiagram-DEJITSTG-DuaVu740.js → pieDiagram-DEJITSTG-D_2NhEs9.js} +1 -1
  88. package/dist/web/assets/{quadrantDiagram-34T5L4WZ-D9P6tcbK.js → quadrantDiagram-34T5L4WZ-CCoI5QqP.js} +1 -1
  89. package/dist/web/assets/{requirementDiagram-MS252O5E-B8v3RtvO.js → requirementDiagram-MS252O5E-DlRuHrpI.js} +1 -1
  90. package/dist/web/assets/{sankeyDiagram-XADWPNL6-CJIIvTEv.js → sankeyDiagram-XADWPNL6-CqeHUQiU.js} +1 -1
  91. package/dist/web/assets/{sequenceDiagram-FGHM5R23-WgQSy-Eh.js → sequenceDiagram-FGHM5R23-bAgSxA1M.js} +1 -1
  92. package/dist/web/assets/{stateDiagram-FHFEXIEX-Bg9XaNxo.js → stateDiagram-FHFEXIEX-BY710eMg.js} +1 -1
  93. package/dist/web/assets/stateDiagram-v2-QKLJ7IA2-BQw6J9EK.js +1 -0
  94. package/dist/web/assets/{timeline-definition-GMOUNBTQ-2h7ZeLc6.js → timeline-definition-GMOUNBTQ-Dm1cJJzA.js} +1 -1
  95. package/dist/web/assets/{vennDiagram-DHZGUBPP-Ab3_6Oe9.js → vennDiagram-DHZGUBPP-x15pVuxW.js} +1 -1
  96. package/dist/web/assets/{wardley-RL74JXVD-DVPCK5Ky.js → wardley-RL74JXVD-Baa2vTyp.js} +1 -1
  97. package/dist/web/assets/{wardleyDiagram-NUSXRM2D-rM9jo8v5.js → wardleyDiagram-NUSXRM2D-DD4pCNVv.js} +1 -1
  98. package/dist/web/assets/{xychartDiagram-5P7HB3ND-BnxoasRp.js → xychartDiagram-5P7HB3ND-Cj82t7kB.js} +1 -1
  99. package/dist/web/index.html +2 -2
  100. package/package.json +7 -1
  101. package/dist/web/assets/channel-CiCXcXC3.js +0 -1
  102. package/dist/web/assets/classDiagram-6PBFFD2Q-DLatDrXa.js +0 -1
  103. package/dist/web/assets/classDiagram-v2-HSJHXN6E-DLatDrXa.js +0 -1
  104. package/dist/web/assets/clone-CSlMEjIx.js +0 -1
  105. package/dist/web/assets/index-BUN3YDVd.css +0 -1
  106. package/dist/web/assets/stateDiagram-v2-QKLJ7IA2-BZf_Cq1t.js +0 -1
@@ -0,0 +1,42 @@
1
+ ---
2
+ id: usage-merge-conflicts
3
+ name: "版本冲突与合并"
4
+ description: "当发布时服务端 head 已前进(例如他端编辑、或本机自动发布后又改稿),`PUT` 可能返回 **409 版本冲突**。mdocs 会引导你进入 **合并** 界面,而不是直接覆盖远端。"
5
+ keywords: []
6
+ source: usage/merge-conflicts.md
7
+ ---
8
+
9
+ # 版本冲突与合并
10
+
11
+ 当发布时服务端 head 已前进(例如他端编辑、或本机自动发布后又改稿),`PUT` 可能返回 **409 版本冲突**。mdocs 会引导你进入 **合并** 界面,而不是直接覆盖远端。
12
+
13
+ ## 三栏分别是什么
14
+
15
+ | 位置 | 含义 |
16
+ |------|------|
17
+ | **左(本地)** | 发生冲突时,你本地草稿的正文快照(冻结,不是已提交的 commit 节点) |
18
+ | **右(远端)** | 打开合并时,服务器上当前这篇的正文 |
19
+ | **中(结果)** | 基于共同祖先做的行级对比;每个差异块需点选「采用本地 / 远端 / 保留双方」等,全部处理完才能发布 |
20
+
21
+ 共同祖先正文由服务端根据提交图计算(`merge-context` API),用于判断「相对祖先,哪边改了什么」。
22
+
23
+ ## 与草稿、发布的关系
24
+
25
+ - 平时编辑:正文在 **IndexedDB 草稿**;元信息(权限、路径等)在内存中的 **activeDocMeta**(来自 GET)。
26
+ - **发布成功**(手动或自动):删除本地草稿 → 再拉取服务器最新内容 → 编辑器与 meta 对齐,避免「自己跟自己冲突」的误报。
27
+ - **有未发布草稿时**:不会用后台轮询去提示「落后」,以免和本地副本语义打架;以本地草稿为准,通过 **发布 / 合并** 与服务器对齐。
28
+
29
+ ## 自动发布与冲突
30
+
31
+ 开启「自动同步至云端」后:
32
+
33
+ - 每 **10 秒** 扫描一次本地草稿;
34
+ - 某篇草稿 **超过 30 秒** 没有新的自动保存,才会尝试自动发布。
35
+
36
+ 若自动发布已成功而本地仍显示冲突,多为旧版本行为;请升级到最新版并重新发布一次。
37
+
38
+ ## 相关阅读
39
+
40
+ - [草稿与同步](./drafts.md)
41
+ - [设置](./settings.md) — 开启自动同步、管理未发布草稿
42
+
@@ -0,0 +1,106 @@
1
+ ---
2
+ id: usage-my-documents
3
+ name: "我的文章"
4
+ description: "「我的文章」功能聚合展示你创建的所有文档,集中管理跨域内容,并提供快捷的文档操作入口。"
5
+ keywords: []
6
+ source: usage/my-documents.md
7
+ ---
8
+
9
+ # 我的文章
10
+
11
+ ## 功能概述
12
+
13
+ 「我的文章」功能聚合展示你创建的所有文档,集中管理跨域内容,并提供快捷的文档操作入口。
14
+
15
+ ## 查看我的文章
16
+
17
+ ### 入口:设置页面
18
+
19
+ 1. 点击左侧边栏顶部的 **⚙ 设置** 按钮
20
+ 2. 在左侧导航中点击 **我的文章**
21
+
22
+ 列表以表格形式展示:
23
+
24
+ | 列名 | 说明 |
25
+ |-----|------|
26
+ | 标题 | 文档显示名称,点击可直接打开文档 |
27
+ | 域 | 文档所在的域 |
28
+ | 更新时间 | 文档最后编辑日期 |
29
+ | 创建时间 | 文档创建日期 |
30
+ | 邀请成员 | 快捷管理文档邀请(仅自己创建的文档可见) |
31
+ | 打开 | 快速跳转打开文档 |
32
+
33
+ ### 搜索筛选
34
+
35
+ 在列表顶部搜索框输入关键词,可按以下维度筛选:
36
+
37
+ - 文档标题/文件名
38
+ - 域名
39
+
40
+ 搜索支持中英文,无需区分大小写。
41
+
42
+ ---
43
+
44
+ ## 文档邀请管理
45
+
46
+ ### 邀请成员
47
+
48
+ 在「我的文章」列表中,点击任意文档右侧的 **邀请成员** 按钮:
49
+
50
+ 1. 在弹出的访客选择器中,左侧勾选要邀请的成员
51
+ 2. 在右侧已选列表中,为每个成员设置权限:
52
+ - **只读**:只能查看文档内容,不能编辑
53
+ - **可编辑**:可以查看和编辑文档内容
54
+ 3. 点击右下角 **确认** 完成邀请
55
+
56
+ ### 修改或移除邀请
57
+
58
+ 再次点击同一文档的「邀请成员」按钮:
59
+
60
+ - **修改权限**:在右侧已选列表中重新选择权限
61
+ - **移除邀请**:点击成员右侧的 ✕ 按钮取消勾选,确认后即移除邀请
62
+
63
+ ### 权限生效范围
64
+
65
+ 文档邀请是**文档级别**的权限叠加:
66
+
67
+ - 即使访客不是域成员,只要被邀请即可访问该文档
68
+ - 邀请权限独立于域权限,两者同时满足时取较高权限
69
+ - 文档所有者始终拥有完全权限,不受邀请机制影响
70
+
71
+ ---
72
+
73
+ ## 使用场景
74
+
75
+ ### 场景 1:快速找到自己创建的文档
76
+
77
+ 当你在多个域中都有创建的文档时,不需要逐个域切换查找。直接打开「我的文章」即可看到所有内容。
78
+
79
+ ### 场景 2:批量管理文档邀请
80
+
81
+ 需要给多篇文档配置相同的访客名单时,可以在「我的文章」中逐篇操作,无需逐个打开文档。
82
+
83
+ ### 场景 3:追溯文档历史
84
+
85
+ 通过「创建时间」和「更新时间」两列,可以快速了解自己的编辑历史和最近活跃的文档。
86
+
87
+ ---
88
+
89
+ ## 常见问题
90
+
91
+ ### 为什么有些文档不显示「邀请成员」按钮?
92
+
93
+ 只有**你作为创建者**的文档才会显示该按钮。被你邀请编辑的文档、你有域权限编辑的文档等都不显示此按钮。
94
+
95
+ ### 被邀请的成员能看到这篇文档在哪里吗?
96
+
97
+ 可以。被邀请者的「我的收藏」和「最近文档」中会出现这篇文档,他们也可以通过搜索找到。
98
+
99
+ ### 如何查看谁被邀请了?
100
+
101
+ 点击「邀请成员」按钮,右侧已选列表即为当前被邀请的成员及其权限。
102
+
103
+ ### 邀请后可以取消吗?
104
+
105
+ 可以。再次打开邀请弹窗,点击成员右侧的 ✕ 取消勾选,确认后该成员即失去对该文档的访问权限。
106
+
@@ -0,0 +1,49 @@
1
+ ---
2
+ id: usage-onboarding-ai
3
+ name: "上手助手(AI)"
4
+ description: "mdocs 内置了一个**产品上手向导**,只解答「怎么用 mdocs」(域、草稿、发布、权限等),**不会**帮你写正文或改文档。"
5
+ keywords: []
6
+ source: usage/onboarding-ai.md
7
+ ---
8
+
9
+ # 上手助手(AI)
10
+
11
+ mdocs 内置了一个**产品上手向导**,只解答「怎么用 mdocs」(域、草稿、发布、权限等),**不会**帮你写正文或改文档。
12
+
13
+ ## 入口
14
+
15
+ 页面左下角有浮动入口(DeepSeek 图标)。点击打开聊天浮层,主工作区仍保持打开。
16
+
17
+ ## 开始使用前:配置模型
18
+
19
+ 1. 打开 **设置 → AI**
20
+ 2. 选择模型:`deepseek-v4-flash` 或 `deepseek-v4-pro`
21
+ 3. 填写你的 DeepSeek API Key 并保存
22
+
23
+ 未配置 Key 时,入口可用但无法发送消息,浮层会提示去设置页配置。
24
+
25
+ 每人一份配置,仅本人可用;Key 在服务端按访客隔离存储,不会出现在别的访客界面上。
26
+
27
+ ## 怎么问
28
+
29
+ 可以直接问,例如:
30
+
31
+ - 如何发布文档?
32
+ - 草稿是什么?
33
+ - 如何创建域?
34
+ - 权限怎么设置?
35
+
36
+ 助手会按需阅读 [mdocs 用户手册](https://xuhuafeifei.github.io/mdocs-site/) 相关章节再回答,并在回复里展示「已阅读 N 个页面」与手册链接。答完后通常会附带一两个可继续追问的示例。
37
+
38
+ ## 会话
39
+
40
+ - 同一访客的对话会保存在数据目录 `tenant/<访客ID>/agent/session/` 下,刷新或重开浮层仍可续聊。
41
+ - 浮层里的「新会话 / 历史」完整切换能力后续开放;当前主要是**自动续上最近一次会话**。
42
+
43
+ ## 明确不会做
44
+
45
+ - 代写、润色、按选区改文档
46
+ - 替你点击发布或改权限(只会告诉你怎么操作)
47
+
48
+ 若你要求写作,助手会拒绝并引导你在编辑器里自行操作。
49
+
@@ -0,0 +1,72 @@
1
+ ---
2
+ id: usage-recovery-code
3
+ name: "恢复码与身份找回"
4
+ description: "恢复码是一串由字母和数字组成的特殊代码,格式如:"
5
+ keywords: []
6
+ source: usage/recovery-code.md
7
+ ---
8
+
9
+ # 恢复码与身份找回
10
+
11
+ ## 什么是恢复码
12
+
13
+ 恢复码是一串由字母和数字组成的特殊代码,格式如:
14
+
15
+ ```
16
+ ABCD-EFGH-IJKL-MNOP
17
+ ```
18
+
19
+ 注册访客后系统会生成专属恢复码,**请务必立即保存**。当你在其他设备上需要访问账户,或者当前 Token 丢失无法登录时,可以使用恢复码重新获取身份令牌。
20
+
21
+ > **⚠️ 恢复码仅展示一次。** 注册成功后会弹出窗口显示恢复码,关闭后无法再次查看。如果忘记保存,可以在设置页生成新的恢复码(旧码会立即失效)。
22
+
23
+ ## 获取恢复码
24
+
25
+ ### 注册后自动获取
26
+
27
+ 输入昵称完成注册后,页面会弹出一个窗口,展示你的专属恢复码。点击**复制恢复码**按钮保存到剪贴板,然后妥善保管。
28
+
29
+ ### 设置页重新生成
30
+
31
+ 如果你在注册时没有保存恢复码,或者恢复码已使用,可以在设置页重新生成:
32
+
33
+ 1. 点击左侧边栏底部的访客名称,进入**设置页**
34
+ 2. 在「通用」标签页中找到「恢复码」区域
35
+ 3. 点击**生成恢复码**按钮
36
+ 4. 系统会生成新的恢复码并展示在页面上
37
+ 5. **立即复制保存**,关闭后不再可见
38
+
39
+ > 重新生成恢复码会使旧的恢复码立即失效。
40
+
41
+ ## 使用恢复码找回身份
42
+
43
+ 当你无法使用原有 Token 登录时(如清除了浏览器 Cookie):
44
+
45
+ 1. 在浏览器中打开 mdocs 站点,如果没有有效 Cookie,会自动进入**注册页**
46
+ 2. 在注册表单下方,点击 **已有恢复码?点击找回** 链接
47
+ 3. 在弹出的输入框中输入你保存的恢复码
48
+ 4. 点击 **找回身份**
49
+ 5. 系统验证通过后会自动登录,并下发新的身份 Cookie
50
+
51
+ 恢复码是**一次性**使用的,验证成功后该恢复码即失效。你可以在设置页生成新的恢复码。
52
+
53
+ ## 常见问题
54
+
55
+ ### 为什么恢复码只展示一次?
56
+
57
+ 恢复码是明文显示的唯一凭证。系统只存储其 SHA-256 哈希值,不存储原文。所以系统本身无法再展示该码,只能验证你输入的是否正确。
58
+
59
+ ### 恢复码丢失了怎么办?
60
+
61
+ - 如果你还能正常登录,请立即进入设置页生成新的恢复码并保存
62
+ - 如果你已无法登录,请联系管理员执行访客合并脚本(`visitor migrate`)
63
+
64
+ ### 恢复码和 Token 有什么区别?
65
+
66
+ | | Token | 恢复码 |
67
+ |--|-------|--------|
68
+ | 用途 | 日常 API 请求鉴权 | 找回身份 |
69
+ | 存储 | HttpOnly Cookie(浏览器自动管理) | 用户自行保存 |
70
+ | 更换 | 可通过恢复码重新获取 | 可在设置页重新生成 |
71
+ | 有效期 | 无限期(直到被覆盖) | 一次性,使用后失效 |
72
+
@@ -0,0 +1,34 @@
1
+ ---
2
+ id: usage-search
3
+ name: "全文搜索"
4
+ description: "mdocs 内置了基于 FTS5(SQLite 全文索引引擎)的搜索功能,支持中文分词。"
5
+ keywords: []
6
+ source: usage/search.md
7
+ ---
8
+
9
+ # 全文搜索
10
+
11
+ mdocs 内置了基于 FTS5(SQLite 全文索引引擎)的搜索功能,支持中文分词。
12
+
13
+ ## 搜索入口
14
+
15
+ 在编辑器顶部的搜索栏输入关键词,系统会在当前域的所有文档中检索。
16
+
17
+ ## 搜索能力
18
+
19
+ - **全文检索**:搜索文档正文内容,不只是标题
20
+ - **中文分词**:使用 jieba 分词,自动切分中文句子,提高匹配精度
21
+ - **相关性排序**:按 BM25 算法排序,匹配度最高的结果排在最前
22
+ - **权限过滤**:自动过滤当前访客无权阅读的文档
23
+ - **片段高亮**:搜索结果展示匹配片段,快速定位关键内容
24
+
25
+ ## 限制搜索范围
26
+
27
+ 支持通过 `--domain` 参数限定在特定域内搜索(仅 CLI 客户端支持),Web 端默认在当前域内搜索。
28
+
29
+ ## 索引更新
30
+
31
+ - 文档创建或更新后自动触发索引重建(异步)
32
+ - 每 60 秒扫描一次待索引的文档
33
+ - 索引更新不影响文档的正常访问
34
+
@@ -0,0 +1,118 @@
1
+ ---
2
+ id: usage-settings
3
+ name: "设置页面"
4
+ description: "设置页面是 mdocs 的集中配置中心,提供访客身份、域管理、内容管理等各种系统级功能。"
5
+ keywords: []
6
+ source: usage/settings.md
7
+ ---
8
+
9
+ # 设置页面
10
+
11
+ ## 功能概述
12
+
13
+ 设置页面是 mdocs 的集中配置中心,提供访客身份、域管理、内容管理等各种系统级功能。
14
+
15
+ ## 入口
16
+
17
+ 点击左侧边栏**顶部的 ⚙ 设置按钮**(在域名选择下拉左侧),进入设置页面。
18
+
19
+ ---
20
+
21
+ ## 左侧导航概览
22
+
23
+ 设置页面左侧分为以下功能模块:
24
+
25
+ | 导航项 | 功能 |
26
+ |-------|------|
27
+ | [通用](#通用设置) | 语言切换、自动编辑、CLI Token、恢复码 |
28
+ | [AI](./onboarding-ai.md) | 上手助手用的 DeepSeek 模型与 API Key |
29
+ | [我的收藏](./bookmarks.md) | 收藏的文档列表,支持搜索、取消收藏 |
30
+ | [我的文章](./my-documents.md) | 自己创建的所有文档,支持邀请成员 |
31
+ | [域管理](../usage/domain-members.md#域管理) | 创建、重命名、删除域,配置域权限与成员 |
32
+ | 成员模板 | 保存常用访客名单,供受限域批量邀请复用 |
33
+ | [保存与发布](./drafts.md) | 自动同步开关、未发布草稿列表 |
34
+
35
+ ---
36
+
37
+ ## 通用设置
38
+
39
+ ### 语言切换
40
+
41
+ 支持中英文双语界面:
42
+
43
+ - **中文**:完整本地化的操作提示与说明
44
+ - **English**:英文界面适配国际团队
45
+
46
+ 点击「中」/「EN」按钮即时切换,无需刷新页面。
47
+
48
+ ### 自动编辑开关
49
+
50
+ 开启后,打开文档时自动进入编辑模式;关闭时默认以只读模式打开,需要手动点击编辑按钮。
51
+
52
+ 适合不同的使用习惯:
53
+ - **写作为主**:建议开启,减少一次点击
54
+ - **阅读为主**:建议关闭,避免误触编辑
55
+
56
+ ### CLI Token
57
+
58
+ 用于命令行工具和自动化脚本的身份凭证。详情请参考 [CLI Token](./cli-token.md)。
59
+
60
+ ### 恢复码
61
+
62
+ 用于访客身份恢复。详情请参考 [恢复码](./recovery-code.md)。
63
+
64
+ ### AI(上手助手)
65
+
66
+ 在设置页 **AI** Tab 配置个人 DeepSeek 模型与 API Key,供左下角上手助手调用。详情请参考 [上手助手(AI)](./onboarding-ai.md)。
67
+
68
+ ---
69
+
70
+ ## 保存与发布
71
+
72
+ ### 自动同步开关
73
+
74
+ 开启后,编辑停止 30 秒后自动将草稿同步到服务器。建议保持开启以获得最佳协作体验。
75
+
76
+ 详情请参考 [草稿与同步](./drafts.md)。
77
+
78
+ ### 未发布草稿
79
+
80
+ 显示当前所有存在本地草稿但尚未发布到服务器的文档。点击可直接进入对应文档继续编辑或发布。
81
+
82
+ ---
83
+
84
+ ## 通用操作
85
+
86
+ ### 返回文档
87
+
88
+ 设置页面的任何位置,都可以通过以下方式回到文档视图:
89
+
90
+ 1. 点击左侧导航底部的 **返回文档** 按钮
91
+ 2. 点击浏览器后退按钮
92
+
93
+ ---
94
+
95
+ ## 常见问题
96
+
97
+ ### 设置会保存在哪里?
98
+
99
+ 大部分设置(如语言、自动编辑、自动同步)保存在浏览器 localStorage,只对当前浏览器生效。
100
+
101
+ 以下数据保存在服务器,与访客身份绑定:
102
+ - 收藏列表
103
+ - 域与成员配置
104
+ - 成员模板
105
+ - CLI Token
106
+ - 恢复码
107
+
108
+ ### 为什么设置页面看不到某些功能?
109
+
110
+ 部分功能有前置条件:
111
+ - **域管理**:需要是域的创建者才能看到重命名、删除等操作
112
+ - **成员模板**:至少创建过一个模板后才有内容
113
+ - **邀请成员**:只有自己创建的文档才显示该按钮
114
+
115
+ ### 设置页面支持键盘操作吗?
116
+
117
+ 设置页面的输入框和按钮均支持 Tab 切换和 Enter 确认。表格列标题支持点击排序。
118
+
@@ -0,0 +1,13 @@
1
+ ---
2
+ id: why-mdocs
3
+ name: "why-mdocs"
4
+ description: "import { WhyMdocsPage } from '../../src/components/WhyMdocsPage';"
5
+ keywords: []
6
+ source: why-mdocs.mdx
7
+ ---
8
+
9
+
10
+ import { WhyMdocsPage } from '../../src/components/WhyMdocsPage';
11
+
12
+ <WhyMdocsPage />
13
+
@@ -0,0 +1,222 @@
1
+ import { Agent } from "@earendil-works/pi-agent-core";
2
+ import { createModels, createProvider, } from "@earendil-works/pi-ai";
3
+ import { openAICompletionsApi } from "@earendil-works/pi-ai/api/openai-completions.lazy";
4
+ import { getVisitorAgentConfig, } from "../Config/config.js";
5
+ import { getSkillLoader } from "../Skill/skill-loader.js";
6
+ import { buildSystemPrompt } from "./system-prompt.js";
7
+ import { createSkillTools } from "./tools.js";
8
+ import { AgentSessionManager, } from "./session-manager.js";
9
+ export function getAgentStatus(visitorId) {
10
+ const cfg = getVisitorAgentConfig(visitorId);
11
+ const skills = getSkillLoader();
12
+ const hasKey = Boolean(cfg?.apiKey);
13
+ return {
14
+ enabled: hasKey && skills.isReady(),
15
+ skillsReady: skills.isReady(),
16
+ model: hasKey ? cfg.modelId : null,
17
+ configId: hasKey ? cfg.id : null,
18
+ reason: !hasKey
19
+ ? "missing_api_key"
20
+ : !skills.isReady()
21
+ ? "skills_missing"
22
+ : undefined,
23
+ };
24
+ }
25
+ /**
26
+ * 上手 Agent 主流程:config → session hydrate → agent → subscribe → prompt。
27
+ * 流式进度经 onEvent 上抛,路由不感知 Pi / skill 细节。
28
+ */
29
+ export async function runOnboardingChat(params) {
30
+ const { visitorId, message, onEvent, signal } = params;
31
+ const cfg = getVisitorAgentConfig(visitorId);
32
+ if (!cfg?.apiKey)
33
+ throw new Error("missing_api_key");
34
+ const skills = getSkillLoader();
35
+ if (!skills.isReady())
36
+ throw new Error("skills_missing");
37
+ const { models, model } = createDeepSeekModel(cfg);
38
+ const tools = createSkillTools(skills);
39
+ const systemPrompt = buildSystemPrompt();
40
+ const sessionManager = new AgentSessionManager(visitorId);
41
+ const { sessionId, messages: history } = await sessionManager.loadLastOpenedMessages();
42
+ const agent = new Agent({
43
+ initialState: {
44
+ systemPrompt,
45
+ model,
46
+ tools,
47
+ messages: toPiMessages(history, model),
48
+ },
49
+ streamFn: models.streamSimple.bind(models),
50
+ });
51
+ const track = { emittedError: false };
52
+ const unsub = agent.subscribe(bindAgentEvents({
53
+ sessionId,
54
+ sessionManager,
55
+ onEvent,
56
+ track,
57
+ }));
58
+ const onAbort = () => agent.abort();
59
+ signal?.addEventListener("abort", onAbort);
60
+ try {
61
+ await agent.prompt(message);
62
+ const leftover = agent.state.errorMessage;
63
+ // prompt 在模型鉴权失败时仍可能 resolve,再兜底一次
64
+ if (leftover && !track.emittedError) {
65
+ onEvent({ type: "error", message: leftover });
66
+ }
67
+ onEvent({ type: "done" });
68
+ }
69
+ catch (err) {
70
+ if (signal?.aborted)
71
+ return;
72
+ const msg = err instanceof Error ? err.message : String(err);
73
+ onEvent({ type: "error", message: msg });
74
+ throw err;
75
+ }
76
+ finally {
77
+ signal?.removeEventListener("abort", onAbort);
78
+ unsub();
79
+ }
80
+ }
81
+ // —— helpers(主流程外)——
82
+ const EMPTY_USAGE = {
83
+ input: 0,
84
+ output: 0,
85
+ cacheRead: 0,
86
+ cacheWrite: 0,
87
+ totalTokens: 0,
88
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
89
+ };
90
+ /** jsonl 历史 → Pi Agent.messages(请求内内存副本) */
91
+ function toPiMessages(history, model) {
92
+ const ts = Date.now();
93
+ return history.map((m) => {
94
+ if (m.role === "user") {
95
+ return { role: "user", content: m.content, timestamp: ts };
96
+ }
97
+ return {
98
+ role: "assistant",
99
+ content: [{ type: "text", text: m.content }],
100
+ api: model.api,
101
+ provider: model.provider,
102
+ model: model.id,
103
+ usage: EMPTY_USAGE,
104
+ stopReason: "stop",
105
+ timestamp: ts,
106
+ };
107
+ });
108
+ }
109
+ function extractUserContent(userMsg) {
110
+ const c = userMsg.content;
111
+ if (typeof c === "string")
112
+ return c;
113
+ if (Array.isArray(c)) {
114
+ return c
115
+ .filter((x) => x?.type === "text")
116
+ .map((x) => x.text)
117
+ .join("");
118
+ }
119
+ return "";
120
+ }
121
+ function extractAssistantVisibleText(assistantMsg) {
122
+ const content = assistantMsg.content;
123
+ if (!Array.isArray(content))
124
+ return "";
125
+ return content
126
+ .filter((x) => x?.type === "text")
127
+ .map((x) => x.text)
128
+ .join("");
129
+ }
130
+ /** SSE + session 落盘:只写 user / 最终 assistant 文本,忽略 thinking / tool */
131
+ function bindAgentEvents(opts) {
132
+ const { sessionId, sessionManager, onEvent, track } = opts;
133
+ const sourcesById = new Map();
134
+ let appendedUser = false;
135
+ let appendedAssistant = false;
136
+ return async (event) => {
137
+ if (event.type === "message_update" &&
138
+ event.assistantMessageEvent.type === "text_delta") {
139
+ onEvent({ type: "text_delta", text: event.assistantMessageEvent.delta });
140
+ return;
141
+ }
142
+ if (event.type === "message_end") {
143
+ if (event.message.role === "user") {
144
+ if (!appendedUser) {
145
+ appendedUser = true;
146
+ const content = extractUserContent(event.message);
147
+ if (content)
148
+ await sessionManager.appendUser(sessionId, content);
149
+ }
150
+ return;
151
+ }
152
+ if (event.message.role === "assistant") {
153
+ const msg = event.message;
154
+ if ((msg.stopReason === "error" || msg.stopReason === "aborted") &&
155
+ msg.errorMessage) {
156
+ track.emittedError = true;
157
+ onEvent({ type: "error", message: msg.errorMessage });
158
+ return;
159
+ }
160
+ // toolUse = 准备调工具,不是最终可见回答
161
+ if (!appendedAssistant &&
162
+ (msg.stopReason === "stop" || msg.stopReason === "length")) {
163
+ appendedAssistant = true;
164
+ const visibleText = extractAssistantVisibleText(event.message);
165
+ if (visibleText) {
166
+ await sessionManager.appendAssistant(sessionId, visibleText);
167
+ }
168
+ }
169
+ return;
170
+ }
171
+ }
172
+ if (event.type === "tool_execution_end" &&
173
+ event.toolName === "mdocs_manual_content" &&
174
+ !event.isError) {
175
+ const source = event.result?.details?.source;
176
+ if (source?.url && !sourcesById.has(source.id)) {
177
+ sourcesById.set(source.id, source);
178
+ onEvent({ type: "sources", items: [...sourcesById.values()] });
179
+ }
180
+ }
181
+ };
182
+ }
183
+ function createDeepSeekModel(cfg) {
184
+ const model = {
185
+ id: cfg.modelId,
186
+ name: cfg.modelId,
187
+ api: "openai-completions",
188
+ provider: "deepseek",
189
+ baseUrl: cfg.endpoint,
190
+ reasoning: false,
191
+ input: ["text"],
192
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
193
+ contextWindow: 128000,
194
+ maxTokens: 8192,
195
+ compat: {
196
+ supportsDeveloperRole: false,
197
+ supportsReasoningEffort: false,
198
+ },
199
+ };
200
+ const apiKey = cfg.apiKey;
201
+ const models = createModels();
202
+ models.setProvider(createProvider({
203
+ id: "deepseek",
204
+ name: "DeepSeek",
205
+ baseUrl: cfg.endpoint,
206
+ auth: {
207
+ apiKey: {
208
+ name: "DeepSeek API key",
209
+ async resolve() {
210
+ return { auth: { apiKey }, source: "visitor_config" };
211
+ },
212
+ },
213
+ },
214
+ models: [model],
215
+ api: openAICompletionsApi(),
216
+ }));
217
+ const resolved = models.getModel("deepseek", cfg.modelId);
218
+ if (!resolved)
219
+ throw new Error("model_not_found");
220
+ return { models, model: resolved };
221
+ }
222
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../../src/server/agent/Agent/run.ts"],"names":[],"mappings":"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"}