@fgbg/mdocs 0.8.9 → 0.8.12

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 (107) hide show
  1. package/agent-skills/changelog/SKILL.md +298 -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 +84 -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 +52 -0
  13. package/agent-skills/index.json +191 -0
  14. package/agent-skills/usage-agent-dev-loop/SKILL.md +179 -0
  15. package/agent-skills/usage-bookmarks/SKILL.md +97 -0
  16. package/agent-skills/usage-cli-token/SKILL.md +132 -0
  17. package/agent-skills/usage-comments/SKILL.md +149 -0
  18. package/agent-skills/usage-domain-members/SKILL.md +102 -0
  19. package/agent-skills/usage-drafts/SKILL.md +123 -0
  20. package/agent-skills/usage-flowchart/SKILL.md +108 -0
  21. package/agent-skills/usage-markdown/SKILL.md +130 -0
  22. package/agent-skills/usage-merge-conflicts/SKILL.md +42 -0
  23. package/agent-skills/usage-my-documents/SKILL.md +108 -0
  24. package/agent-skills/usage-onboarding-ai/SKILL.md +65 -0
  25. package/agent-skills/usage-recovery-code/SKILL.md +87 -0
  26. package/agent-skills/usage-search/SKILL.md +34 -0
  27. package/agent-skills/usage-settings/SKILL.md +95 -0
  28. package/agent-skills/why-mdocs/SKILL.md +13 -0
  29. package/dist/server/agent/Agent/run.js +222 -0
  30. package/dist/server/agent/Agent/run.js.map +1 -0
  31. package/dist/server/agent/Agent/session-manager.js +147 -0
  32. package/dist/server/agent/Agent/session-manager.js.map +1 -0
  33. package/dist/server/agent/Agent/system-prompt.js +13 -0
  34. package/dist/server/agent/Agent/system-prompt.js.map +1 -0
  35. package/dist/server/agent/Agent/tools.js +37 -0
  36. package/dist/server/agent/Agent/tools.js.map +1 -0
  37. package/dist/server/agent/Config/config.js +113 -0
  38. package/dist/server/agent/Config/config.js.map +1 -0
  39. package/dist/server/agent/Skill/skill-loader.js +46 -0
  40. package/dist/server/agent/Skill/skill-loader.js.map +1 -0
  41. package/dist/server/app.js +2 -0
  42. package/dist/server/app.js.map +1 -1
  43. package/dist/server/db/repositories/agent-model-config.repo.js +17 -0
  44. package/dist/server/db/repositories/agent-model-config.repo.js.map +1 -0
  45. package/dist/server/db/schema.js +10 -0
  46. package/dist/server/db/schema.js.map +1 -1
  47. package/dist/server/routes/agent.routes.js +135 -0
  48. package/dist/server/routes/agent.routes.js.map +1 -0
  49. package/dist/web/assets/{MergeView-CTeS5Pgb.js → MergeView-Da6W6Mwd.js} +1 -1
  50. package/dist/web/assets/{_baseUniq-BEyyLo4a.js → _baseUniq-DIXaUG3P.js} +1 -1
  51. package/dist/web/assets/{arc-DRyJIB49.js → arc-BdrqKgEt.js} +1 -1
  52. package/dist/web/assets/{architectureDiagram-Q4EWVU46-C6FcFqys.js → architectureDiagram-Q4EWVU46-C7DbabmE.js} +1 -1
  53. package/dist/web/assets/{blockDiagram-DXYQGD6D-C5DamiPe.js → blockDiagram-DXYQGD6D-xpzHPtBf.js} +1 -1
  54. package/dist/web/assets/{c4Diagram-AHTNJAMY-BQf9874A.js → c4Diagram-AHTNJAMY-C55XB-0p.js} +1 -1
  55. package/dist/web/assets/channel-R2F1bwis.js +1 -0
  56. package/dist/web/assets/{chunk-4BX2VUAB-CvLXGWM9.js → chunk-4BX2VUAB-Cw9cGcvA.js} +1 -1
  57. package/dist/web/assets/{chunk-4TB4RGXK-C2B5cSFk.js → chunk-4TB4RGXK-Bb7TaNsp.js} +1 -1
  58. package/dist/web/assets/{chunk-55IACEB6-C-va7Y5a.js → chunk-55IACEB6-ClfU0bTR.js} +1 -1
  59. package/dist/web/assets/{chunk-EDXVE4YY-NG3zjl2t.js → chunk-EDXVE4YY-DEYQg7so.js} +1 -1
  60. package/dist/web/assets/{chunk-FMBD7UC4-A2P0ciLw.js → chunk-FMBD7UC4-l0uxylnu.js} +1 -1
  61. package/dist/web/assets/{chunk-OYMX7WX6-Cto0U3kG.js → chunk-OYMX7WX6-CTuAfYj2.js} +1 -1
  62. package/dist/web/assets/{chunk-QZHKN3VN-DNdWRP-4.js → chunk-QZHKN3VN-Cd5BdpCj.js} +1 -1
  63. package/dist/web/assets/{chunk-YZCP3GAM-B7BWetQd.js → chunk-YZCP3GAM-C4AFz6HK.js} +1 -1
  64. package/dist/web/assets/classDiagram-6PBFFD2Q-D8Aoi_kK.js +1 -0
  65. package/dist/web/assets/classDiagram-v2-HSJHXN6E-D8Aoi_kK.js +1 -0
  66. package/dist/web/assets/clone-D3UTWyOI.js +1 -0
  67. package/dist/web/assets/{cose-bilkent-S5V4N54A-DAp6XOTI.js → cose-bilkent-S5V4N54A-DPbGSIxQ.js} +1 -1
  68. package/dist/web/assets/{dagre-KV5264BT-bXw64vAF.js → dagre-KV5264BT-BAqCvioS.js} +1 -1
  69. package/dist/web/assets/{diagram-5BDNPKRD-BZyIxgPb.js → diagram-5BDNPKRD-BVhjoylL.js} +1 -1
  70. package/dist/web/assets/{diagram-G4DWMVQ6-B7DIbmE6.js → diagram-G4DWMVQ6-BgdBEUo2.js} +1 -1
  71. package/dist/web/assets/{diagram-MMDJMWI5-CYIS8pup.js → diagram-MMDJMWI5-v3XiVR4L.js} +1 -1
  72. package/dist/web/assets/{diagram-TYMM5635-iVE2rLmi.js → diagram-TYMM5635-Bnlc4JL7.js} +1 -1
  73. package/dist/web/assets/{erDiagram-SMLLAGMA-TYkyJdZq.js → erDiagram-SMLLAGMA-DZNfy5XO.js} +1 -1
  74. package/dist/web/assets/{flowDiagram-DWJPFMVM-DCq4RRIH.js → flowDiagram-DWJPFMVM-CyNHaoXD.js} +1 -1
  75. package/dist/web/assets/{ganttDiagram-T4ZO3ILL-BwOIx_Vs.js → ganttDiagram-T4ZO3ILL-D9XKVK6L.js} +1 -1
  76. package/dist/web/assets/{gitGraphDiagram-UUTBAWPF-CS9cfxUA.js → gitGraphDiagram-UUTBAWPF-BsoJR5By.js} +1 -1
  77. package/dist/web/assets/{graph-K8x8ab-D.js → graph-C6hZEMMA.js} +1 -1
  78. package/dist/web/assets/{index-DRsX6c0H.js → index-BiYwrQhS.js} +1220 -1186
  79. package/dist/web/assets/index-C4tGH1XB.css +1 -0
  80. package/dist/web/assets/{infoDiagram-42DDH7IO-DFs9J8cW.js → infoDiagram-42DDH7IO-EsbSvvwg.js} +1 -1
  81. package/dist/web/assets/{ishikawaDiagram-UXIWVN3A-ChYUj0ld.js → ishikawaDiagram-UXIWVN3A-opc9PUAq.js} +1 -1
  82. package/dist/web/assets/{journeyDiagram-VCZTEJTY-CysvVjkr.js → journeyDiagram-VCZTEJTY-CGoqXdQp.js} +1 -1
  83. package/dist/web/assets/{kanban-definition-6JOO6SKY-DlGvCOou.js → kanban-definition-6JOO6SKY-BsMSOTEO.js} +1 -1
  84. package/dist/web/assets/{layout-DDk1jHzS.js → layout-dka4PN3u.js} +1 -1
  85. package/dist/web/assets/{linear-CCo9IeHT.js → linear-C7358dWt.js} +1 -1
  86. package/dist/web/assets/{min-BTxfBtS6.js → min-CkhEOvqb.js} +1 -1
  87. package/dist/web/assets/{mindmap-definition-QFDTVHPH-D2Y8ZrN3.js → mindmap-definition-QFDTVHPH-Cw5Uw5sO.js} +1 -1
  88. package/dist/web/assets/{pieDiagram-DEJITSTG-DuaVu740.js → pieDiagram-DEJITSTG-D_2NhEs9.js} +1 -1
  89. package/dist/web/assets/{quadrantDiagram-34T5L4WZ-D9P6tcbK.js → quadrantDiagram-34T5L4WZ-CCoI5QqP.js} +1 -1
  90. package/dist/web/assets/{requirementDiagram-MS252O5E-B8v3RtvO.js → requirementDiagram-MS252O5E-DlRuHrpI.js} +1 -1
  91. package/dist/web/assets/{sankeyDiagram-XADWPNL6-CJIIvTEv.js → sankeyDiagram-XADWPNL6-CqeHUQiU.js} +1 -1
  92. package/dist/web/assets/{sequenceDiagram-FGHM5R23-WgQSy-Eh.js → sequenceDiagram-FGHM5R23-bAgSxA1M.js} +1 -1
  93. package/dist/web/assets/{stateDiagram-FHFEXIEX-Bg9XaNxo.js → stateDiagram-FHFEXIEX-BY710eMg.js} +1 -1
  94. package/dist/web/assets/stateDiagram-v2-QKLJ7IA2-BQw6J9EK.js +1 -0
  95. package/dist/web/assets/{timeline-definition-GMOUNBTQ-2h7ZeLc6.js → timeline-definition-GMOUNBTQ-Dm1cJJzA.js} +1 -1
  96. package/dist/web/assets/{vennDiagram-DHZGUBPP-Ab3_6Oe9.js → vennDiagram-DHZGUBPP-x15pVuxW.js} +1 -1
  97. package/dist/web/assets/{wardley-RL74JXVD-DVPCK5Ky.js → wardley-RL74JXVD-Baa2vTyp.js} +1 -1
  98. package/dist/web/assets/{wardleyDiagram-NUSXRM2D-rM9jo8v5.js → wardleyDiagram-NUSXRM2D-DD4pCNVv.js} +1 -1
  99. package/dist/web/assets/{xychartDiagram-5P7HB3ND-BnxoasRp.js → xychartDiagram-5P7HB3ND-Cj82t7kB.js} +1 -1
  100. package/dist/web/index.html +2 -2
  101. package/package.json +7 -1
  102. package/dist/web/assets/channel-CiCXcXC3.js +0 -1
  103. package/dist/web/assets/classDiagram-6PBFFD2Q-DLatDrXa.js +0 -1
  104. package/dist/web/assets/classDiagram-v2-HSJHXN6E-DLatDrXa.js +0 -1
  105. package/dist/web/assets/clone-CSlMEjIx.js +0 -1
  106. package/dist/web/assets/index-BUN3YDVd.css +0 -1
  107. package/dist/web/assets/stateDiagram-v2-QKLJ7IA2-BZf_Cq1t.js +0 -1
@@ -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,95 @@
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
+ ![设置入口:点击侧栏底部访客信息](./settings/setting-rukou.png)
20
+
21
+ 侧栏底部另有 **返回文档**,可随时回到编辑主界面。
22
+
23
+ ---
24
+
25
+ ## 左侧导航概览
26
+
27
+ 顺序与界面一致:
28
+
29
+ | 导航项 | 功能 |
30
+ |-------|------|
31
+ | [通用](#通用设置) | 语言、自动编辑、CLI Token、恢复码(兼容)、登录密码 |
32
+ | [我的收藏](./bookmarks.md) | 收藏列表、搜索、取消收藏 |
33
+ | [我的文章](./my-documents.md) | 自己创建的文档、邀请成员、打开 |
34
+ | [域管理](./domain-members.md) | 创建 / 筛选 / 重命名 / 改类型 / 删除域;受限域成员 |
35
+ | [域成员模板](./domain-members.md) | 可复用的访客名单 |
36
+ | [AI](./onboarding-ai.md) | 上手助手的 DeepSeek 配置 |
37
+ | [保存与发布](./drafts.md) | 本地快照、自动同步、未发布草稿 |
38
+
39
+ ---
40
+
41
+ ## 通用设置
42
+
43
+ ![通用设置界面](./settings/general.png)
44
+
45
+ ### 语言
46
+
47
+ 「中」/「EN」即时切换界面语言,无需刷新。
48
+
49
+ ### 自动编辑
50
+
51
+ 开启后,打开文档时自动进入编辑模式;关闭则默认只读,需手动点编辑。
52
+
53
+ - **写作为主**:建议开启
54
+ - **阅读为主**:建议关闭
55
+
56
+ ### CLI Token
57
+
58
+ 给命令行与外部 Agent 用的身份令牌,继承你的权限。可查看活跃 Token、重置。详情见 [CLI Token](./cli-token.md)。
59
+
60
+ ### 恢复码(兼容)
61
+
62
+ Token / Cookie 丢失时的自助找回;引入登录密码后已边缘化。详情见 [恢复码与身份找回](./recovery-code.md)。
63
+
64
+ ### 登录密码(推荐跨端)
65
+
66
+ 设置至少 4 位密码后,可在其他浏览器或设备用「用户名 + 密码」登录同一访客。
67
+
68
+ ---
69
+
70
+ ## 其他模块一览
71
+
72
+ 各页详情见对应文档;此处仅对照设置内截图入口。
73
+
74
+ | 模块 | 文档 |
75
+ |------|------|
76
+ | 我的收藏 | [收藏功能](./bookmarks.md) |
77
+ | 我的文章 | [我的文章](./my-documents.md) |
78
+ | 域管理 / 域成员模板 | [受限域成员与名单模板](./domain-members.md) |
79
+ | AI | [上手助手(AI)](./onboarding-ai.md) |
80
+ | 保存与发布 | [草稿与同步](./drafts.md) |
81
+
82
+ ---
83
+
84
+ ## 常见问题
85
+
86
+ ### 设置会保存在哪里?
87
+
88
+ 语言、自动编辑、自动同步等偏好多在浏览器本地;与身份绑定的数据(收藏、域与成员、模板、CLI Token、密码哈希、恢复码哈希、AI 配置)在服务端。
89
+
90
+ ### 为什么看不到某些操作?
91
+
92
+ - **域管理**:重命名 / 删除等通常仅域创建者可见
93
+ - **受限域「成员」**:仅受限域且你是创建者时才有
94
+ - **邀请成员**:仅自己创建的文档显示
95
+
@@ -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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"}
@@ -0,0 +1,147 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { randomUUID } from "node:crypto";
4
+ import { getConfig } from "../../config/index.js";
5
+ function safeString(v) {
6
+ if (typeof v !== "string")
7
+ return null;
8
+ const t = v.trim();
9
+ return t ? t : null;
10
+ }
11
+ function nowIso() {
12
+ return new Date().toISOString();
13
+ }
14
+ export class AgentSessionManager {
15
+ visitorId;
16
+ tenantDir;
17
+ sessionDir;
18
+ metaPath;
19
+ cachedSessionId = null;
20
+ constructor(visitorId) {
21
+ this.visitorId = visitorId;
22
+ const { dataDir } = getConfig();
23
+ // tenant 仅用于访客私有运行时数据(知识库仍走 files/)
24
+ this.tenantDir = path.join(dataDir, "tenant", visitorId);
25
+ this.sessionDir = path.join(this.tenantDir, "agent", "session");
26
+ this.metaPath = path.join(this.sessionDir, "session.json");
27
+ }
28
+ jsonlPath(sessionId) {
29
+ return path.join(this.sessionDir, `${sessionId}.jsonl`);
30
+ }
31
+ async ensureSessionDir() {
32
+ await fs.promises.mkdir(this.sessionDir, { recursive: true });
33
+ }
34
+ async readMeta() {
35
+ try {
36
+ const txt = await fs.promises.readFile(this.metaPath, "utf8");
37
+ const parsed = JSON.parse(txt);
38
+ const lastOpenedSessionId = safeString(parsed?.lastOpenedSessionId);
39
+ if (!lastOpenedSessionId)
40
+ return null;
41
+ return {
42
+ lastOpenedSessionId,
43
+ sessions: Array.isArray(parsed?.sessions) ? parsed.sessions : undefined,
44
+ };
45
+ }
46
+ catch (err) {
47
+ if (err && typeof err === "object" && "code" in err && err.code === "ENOENT")
48
+ return null;
49
+ return null;
50
+ }
51
+ }
52
+ async writeMeta(meta) {
53
+ const txt = JSON.stringify(meta, null, 2);
54
+ await fs.promises.writeFile(this.metaPath, txt, "utf8");
55
+ }
56
+ ensureSessionEntry(meta, sessionId) {
57
+ if (!meta.sessions)
58
+ meta.sessions = [];
59
+ const exists = meta.sessions.some((s) => s.id === sessionId);
60
+ if (!exists)
61
+ meta.sessions.push({ id: sessionId, updatedAt: nowIso() });
62
+ meta.sessions = meta.sessions
63
+ .filter((s) => safeString(s?.id) === s.id)
64
+ .map((s) => (s.id === sessionId ? { ...s, updatedAt: s.updatedAt ?? nowIso() } : s));
65
+ }
66
+ async ensureLastOpened() {
67
+ await this.ensureSessionDir();
68
+ if (this.cachedSessionId)
69
+ return this.cachedSessionId;
70
+ const meta = await this.readMeta();
71
+ if (!meta) {
72
+ const sessionId = randomUUID();
73
+ const created = {
74
+ lastOpenedSessionId: sessionId,
75
+ sessions: [{ id: sessionId, updatedAt: nowIso() }],
76
+ };
77
+ await this.writeMeta(created);
78
+ this.cachedSessionId = sessionId;
79
+ return sessionId;
80
+ }
81
+ const sessionId = meta.lastOpenedSessionId;
82
+ this.ensureSessionEntry(meta, sessionId);
83
+ // 维护 sessions.updatedAt(首次读也做一次轻更新)
84
+ const updatedAt = nowIso();
85
+ meta.sessions = meta.sessions?.map((s) => (s.id === sessionId ? { ...s, updatedAt } : s));
86
+ meta.lastOpenedSessionId = sessionId;
87
+ await this.writeMeta(meta);
88
+ this.cachedSessionId = sessionId;
89
+ return sessionId;
90
+ }
91
+ async loadLastOpenedMessages() {
92
+ const sessionId = await this.ensureLastOpened();
93
+ const jsonlPath = this.jsonlPath(sessionId);
94
+ try {
95
+ const txt = await fs.promises.readFile(jsonlPath, "utf8");
96
+ const lines = txt.split("\n").map((l) => l.trim()).filter(Boolean);
97
+ const messages = [];
98
+ for (const line of lines) {
99
+ try {
100
+ const row = JSON.parse(line);
101
+ const role = row.role === "user" ? "user" : row.role === "assistant" ? "assistant" : null;
102
+ const content = typeof row.content === "string" ? row.content : null;
103
+ if (!role || content === null)
104
+ continue;
105
+ messages.push({ role, content });
106
+ }
107
+ catch {
108
+ /* ignore invalid line */
109
+ }
110
+ }
111
+ return { sessionId, messages };
112
+ }
113
+ catch (err) {
114
+ if (err && typeof err === "object" && "code" in err && err.code === "ENOENT") {
115
+ return { sessionId, messages: [] };
116
+ }
117
+ return { sessionId, messages: [] };
118
+ }
119
+ }
120
+ async touchLastOpened(sessionId) {
121
+ const meta = await this.readMeta();
122
+ if (!meta) {
123
+ await this.writeMeta({
124
+ lastOpenedSessionId: sessionId,
125
+ sessions: [{ id: sessionId, updatedAt: nowIso() }],
126
+ });
127
+ return;
128
+ }
129
+ meta.lastOpenedSessionId = sessionId;
130
+ this.ensureSessionEntry(meta, sessionId);
131
+ meta.sessions = meta.sessions?.map((s) => (s.id === sessionId ? { ...s, updatedAt: nowIso() } : s));
132
+ await this.writeMeta(meta);
133
+ }
134
+ async appendUser(sessionId, content) {
135
+ await fs.promises.appendFile(this.jsonlPath(sessionId), JSON.stringify({ role: "user", content, ts: nowIso() }) + "\n", "utf8");
136
+ await this.touchLastOpened(sessionId);
137
+ }
138
+ async appendAssistant(sessionId, content) {
139
+ await fs.promises.appendFile(this.jsonlPath(sessionId), JSON.stringify({ role: "assistant", content, ts: nowIso() }) + "\n", "utf8");
140
+ await this.touchLastOpened(sessionId);
141
+ }
142
+ }
143
+ export async function getAgentSessionForApi(visitorId) {
144
+ const manager = new AgentSessionManager(visitorId);
145
+ return manager.loadLastOpenedMessages();
146
+ }
147
+ //# sourceMappingURL=session-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../../../../src/server/agent/Agent/session-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ const RULES = `你是 mdocs 的上手向导,只帮助用户理解如何使用 mdocs(域、草稿、发布、Slash、权限等)。
2
+
3
+ 规则:
4
+ 1. 禁止代写、润色、改写用户文档,也不要给出可直接粘贴进正文的长文草稿。
5
+ 2. 需要产品知识时:先调用「查询 mdocs 手册大纲」了解有哪些主题,再调用「查询 mdocs 手册正文」按 id 阅读相关章节后回答。
6
+ 3. 若用户要求写作或改文档,明确拒绝,并提示他们在编辑器中自行操作。
7
+ 4. 回答简洁、面向操作步骤。
8
+ 5. 每轮回答正文结束后,另起一段追加一句引导(只追加一次,不要反复追问):先问「您还有什么想了解的吗?」,再给 1~2 个与本轮话题相关、可继续深挖的具体问题示例(例如「比如:受限域怎么加成员?」「比如:文档档位和邀请有什么区别?」)。示例要短、可直接当作下一句提问;与当前无关的主题不要乱推。`;
9
+ /** 组装 system prompt:角色规则 + tool 使用说明(手册目录由 tool 按需返回) */
10
+ export function buildSystemPrompt() {
11
+ return RULES;
12
+ }
13
+ //# sourceMappingURL=system-prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system-prompt.js","sourceRoot":"","sources":["../../../../src/server/agent/Agent/system-prompt.ts"],"names":[],"mappings":"AAAA,MAAM,KAAK,GAAG;;;;;;;qJAOuI,CAAC;AAEtJ,yDAAyD;AACzD,MAAM,UAAU,iBAAiB;IAC/B,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,37 @@
1
+ import { Type } from "@earendil-works/pi-ai";
2
+ export function createSkillTools(skills) {
3
+ return [
4
+ {
5
+ name: "mdocs_manual_outline",
6
+ label: "查询 mdocs 手册大纲",
7
+ description: "列出 mdocs 用户手册各章节元数据(id / name / description),用于选择要阅读的章节",
8
+ parameters: Type.Object({}),
9
+ execute: async () => ({
10
+ content: [{ type: "text", text: JSON.stringify(skills.list(), null, 2) }],
11
+ details: {},
12
+ }),
13
+ },
14
+ {
15
+ name: "mdocs_manual_content",
16
+ label: "查询 mdocs 手册正文",
17
+ description: "按 id 读取 mdocs 用户手册某一章节的完整正文",
18
+ parameters: Type.Object({
19
+ id: Type.String({ description: "章节 id,来自「查询 mdocs 手册大纲」" }),
20
+ }),
21
+ execute: async (_id, params) => {
22
+ const id = params.id;
23
+ const body = skills.read(id);
24
+ if (!body)
25
+ throw new Error(`手册章节不存在: ${id},请先调用「查询 mdocs 手册大纲」`);
26
+ const source = body.url
27
+ ? { id: body.id, name: body.name, url: body.url }
28
+ : null;
29
+ return {
30
+ content: [{ type: "text", text: body.content }],
31
+ details: { id: body.id, source },
32
+ };
33
+ },
34
+ },
35
+ ];
36
+ }
37
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../../src/server/agent/Agent/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAU7C,MAAM,UAAU,gBAAgB,CAAC,MAAmB;IAClD,OAAO;QACL;YACE,IAAI,EAAE,sBAAsB;YAC5B,KAAK,EAAE,eAAe;YACtB,WAAW,EACT,yDAAyD;YAC3D,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;gBACpB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;gBACzE,OAAO,EAAE,EAAE;aACZ,CAAC;SACH;QACD;YACE,IAAI,EAAE,sBAAsB;YAC5B,KAAK,EAAE,eAAe;YACtB,WAAW,EAAE,6BAA6B;YAC1C,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC;gBACtB,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,yBAAyB,EAAE,CAAC;aAC5D,CAAC;YACF,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE;gBAC7B,MAAM,EAAE,GAAI,MAAyB,CAAC,EAAE,CAAC;gBACzC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAC7B,IAAI,CAAC,IAAI;oBAAE,MAAM,IAAI,KAAK,CAAC,YAAY,EAAE,sBAAsB,CAAC,CAAC;gBACjE,MAAM,MAAM,GAA2B,IAAI,CAAC,GAAG;oBAC7C,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE;oBACjD,CAAC,CAAC,IAAI,CAAC;gBACT,OAAO;oBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;oBAC/C,OAAO,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE;iBACjC,CAAC;YACJ,CAAC;SACF;KACF,CAAC;AACJ,CAAC"}