@fgbg/mdocs 0.8.19 → 0.8.21

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 (97) hide show
  1. package/README.md +7 -1
  2. package/agent-skills/changelog/SKILL.md +13 -1
  3. package/agent-skills/getting-started-installation/SKILL.md +12 -2
  4. package/agent-skills/index.json +1 -1
  5. package/agent-skills/usage-onboarding-ai/SKILL.md +11 -0
  6. package/agent-skills/usage-settings/SKILL.md +15 -1
  7. package/bin/mdocs.js +1 -1
  8. package/dist/server/agent/Agent/choice-pending.js +10 -1
  9. package/dist/server/agent/Agent/choice-pending.js.map +1 -1
  10. package/dist/server/agent/Agent/context-usage.js +6 -5
  11. package/dist/server/agent/Agent/context-usage.js.map +1 -1
  12. package/dist/server/agent/Agent/hydrate-messages.js +137 -0
  13. package/dist/server/agent/Agent/hydrate-messages.js.map +1 -0
  14. package/dist/server/agent/Agent/run-pi-agent.js +115 -0
  15. package/dist/server/agent/Agent/run-pi-agent.js.map +1 -0
  16. package/dist/server/agent/Agent/run.js +49 -323
  17. package/dist/server/agent/Agent/run.js.map +1 -1
  18. package/dist/server/agent/Agent/session-manager.js +38 -3
  19. package/dist/server/agent/Agent/session-manager.js.map +1 -1
  20. package/dist/server/agent/Agent/skill-form-pending.js +77 -0
  21. package/dist/server/agent/Agent/skill-form-pending.js.map +1 -0
  22. package/dist/server/agent/Agent/stream-events.js +2 -0
  23. package/dist/server/agent/Agent/stream-events.js.map +1 -0
  24. package/dist/server/agent/Agent/system-prompt.js +8 -4
  25. package/dist/server/agent/Agent/system-prompt.js.map +1 -1
  26. package/dist/server/agent/Agent/tool-deps.js +7 -0
  27. package/dist/server/agent/Agent/tool-deps.js.map +1 -0
  28. package/dist/server/agent/Agent/tool-ui-effects.js +170 -0
  29. package/dist/server/agent/Agent/tool-ui-effects.js.map +1 -0
  30. package/dist/server/agent/Agent/tools-choice.js +44 -50
  31. package/dist/server/agent/Agent/tools-choice.js.map +1 -1
  32. package/dist/server/agent/Agent/tools-coding.get-working.test.js +10 -8
  33. package/dist/server/agent/Agent/tools-coding.get-working.test.js.map +1 -1
  34. package/dist/server/agent/Agent/tools-coding.js +51 -58
  35. package/dist/server/agent/Agent/tools-coding.js.map +1 -1
  36. package/dist/server/agent/Agent/tools-documents.get-document.test.js +2 -4
  37. package/dist/server/agent/Agent/tools-documents.get-document.test.js.map +1 -1
  38. package/dist/server/agent/Agent/tools-documents.js +192 -187
  39. package/dist/server/agent/Agent/tools-documents.js.map +1 -1
  40. package/dist/server/agent/Agent/tools-domains.js +155 -156
  41. package/dist/server/agent/Agent/tools-domains.js.map +1 -1
  42. package/dist/server/agent/Agent/tools-overwrite.js +93 -101
  43. package/dist/server/agent/Agent/tools-overwrite.js.map +1 -1
  44. package/dist/server/agent/Agent/tools-registry.js +26 -0
  45. package/dist/server/agent/Agent/tools-registry.js.map +1 -0
  46. package/dist/server/agent/Agent/tools-registry.test.js +67 -0
  47. package/dist/server/agent/Agent/tools-registry.test.js.map +1 -0
  48. package/dist/server/agent/Agent/tools-template.js +45 -0
  49. package/dist/server/agent/Agent/tools-template.js.map +1 -0
  50. package/dist/server/agent/Agent/tools-user-skills.js +176 -0
  51. package/dist/server/agent/Agent/tools-user-skills.js.map +1 -0
  52. package/dist/server/agent/Agent/tools-visitors.js +15 -22
  53. package/dist/server/agent/Agent/tools-visitors.js.map +1 -1
  54. package/dist/server/agent/Agent/tools.js +40 -33
  55. package/dist/server/agent/Agent/tools.js.map +1 -1
  56. package/dist/server/agent/Agent/user-skills.js +214 -0
  57. package/dist/server/agent/Agent/user-skills.js.map +1 -0
  58. package/dist/server/agent/Agent/user-skills.test.js +53 -0
  59. package/dist/server/agent/Agent/user-skills.test.js.map +1 -0
  60. package/dist/server/cli/main.js +10 -0
  61. package/dist/server/cli/main.js.map +1 -1
  62. package/dist/server/cli/self-update.js +158 -0
  63. package/dist/server/cli/self-update.js.map +1 -0
  64. package/dist/server/cli/self-update.test.js +17 -0
  65. package/dist/server/cli/self-update.test.js.map +1 -0
  66. package/dist/server/db/repositories/agent-user-skill.repo.js +78 -0
  67. package/dist/server/db/repositories/agent-user-skill.repo.js.map +1 -0
  68. package/dist/server/db/schema.js +11 -0
  69. package/dist/server/db/schema.js.map +1 -1
  70. package/dist/server/routes/agent.routes.js +198 -5
  71. package/dist/server/routes/agent.routes.js.map +1 -1
  72. package/dist/web/assets/AgentChatPanel-D95hI02c.js +1 -0
  73. package/dist/web/assets/AgentSkillFormCard-BtJ0QjLG.js +6 -0
  74. package/dist/web/assets/AiWriteWorkbench-Qam8cfY6.js +6 -0
  75. package/dist/web/assets/{DiagramEditor-BTRe45TX-DzJEhM4C.js → DiagramEditor-BTRe45TX-Did98cnP.js} +1 -1
  76. package/dist/web/assets/{DocumentEditor-NPbbAape.js → DocumentEditor-DtSzkl6A.js} +1 -1
  77. package/dist/web/assets/{MergeView-BnWbq08U.js → MergeView-DgFQHD5_.js} +1 -1
  78. package/dist/web/assets/{PlaygroundPage-BSGipUkC.js → PlaygroundPage-Dg57Xxpl.js} +1 -1
  79. package/dist/web/assets/SettingsPage-CkYpe5v7.js +1 -0
  80. package/dist/web/assets/{Toolbar-DjPuWk5G.js → Toolbar-0Y2wmGwe.js} +1 -1
  81. package/dist/web/assets/{VisitorPickerModal-BUS-cOq0.js → VisitorPickerModal-COxtOvc4.js} +1 -1
  82. package/dist/web/assets/{copy-hWOco_4c.js → copy-nOl0d3Th.js} +1 -1
  83. package/dist/web/assets/{diagram-gfUK8OHx.js → diagram-BJFhx-27.js} +332 -332
  84. package/dist/web/assets/{index-C46BU1-j.js → index-B-XJ-ScV.js} +22 -22
  85. package/dist/web/assets/index-CGvsjO9f.css +1 -0
  86. package/dist/web/assets/{meta2dEngine-BD2XbzaV-D7hJ1H1g.js → meta2dEngine-BD2XbzaV-e28q005B.js} +1 -1
  87. package/dist/web/assets/{motion-C4pN8CfU.js → motion-D-I76zAi.js} +1 -1
  88. package/dist/web/assets/{plus-CnKbiP8x.js → plus-DvBbg6jL.js} +1 -1
  89. package/dist/web/assets/{react-B7vrA7AR.js → react-BsVOIHR8.js} +3 -3
  90. package/dist/web/assets/{ui-DxdLi_28.js → ui-C3xtW1w8.js} +3 -3
  91. package/dist/web/index.html +4 -4
  92. package/package.json +1 -1
  93. package/dist/web/assets/AgentChatPanel-CLKeiDeR.js +0 -1
  94. package/dist/web/assets/AiWriteWorkbench-Ecp214S5.js +0 -6
  95. package/dist/web/assets/SettingsPage-OklrFCx7.js +0 -1
  96. package/dist/web/assets/history-AMIEbyMc.js +0 -6
  97. package/dist/web/assets/index-BksNm27A.css +0 -1
package/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  面向个人开发者与小团队:产品内 **智能助手 + 帮写**,外部 **CLI / Skills** 接入 Cursor / Claude;SQLite + 本地文件,**无账户**即可协作。
6
6
 
7
- [文档站点](https://xuhuafeifei.github.io/mdocs-site/) · [GitHub](https://github.com/xuhuafeifei/mdocs) · [npm `@fgbg/mdocs`](https://www.npmjs.com/package/@fgbg/mdocs) · 当前版本 **0.8.19**
7
+ [文档站点](https://xuhuafeifei.github.io/mdocs-site/) · [GitHub](https://github.com/xuhuafeifei/mdocs) · [npm `@fgbg/mdocs`](https://www.npmjs.com/package/@fgbg/mdocs) · 当前版本 **0.8.21**
8
8
 
9
9
  <p align="center">
10
10
  <img src="image/site主页.png" alt="mdocs 文档站点首页" width="860" />
@@ -104,6 +104,12 @@ pnpm typecheck
104
104
  pnpm mdocs visitor list # 管理 CLI(开发用 tsx 入口)
105
105
  ```
106
106
 
107
+ 全局安装后原地升级(淘宝 npmmirror,保留 `node_modules`,依赖走 `--prefer-offline`):
108
+
109
+ ```bash
110
+ mdocs update
111
+ ```
112
+
107
113
  仓库布局:
108
114
 
109
115
  ```
@@ -1,13 +1,25 @@
1
1
  ---
2
2
  id: changelog
3
3
  name: "更新日志"
4
- description: "- **Meta2d 按需加载**:文档没有流程图时不下载 `@meta2d`;有图 / 插入图 / 打开编辑时再加载 - **流程图属性「Text」输入**:防抖写回画布,不再每敲一字全量重绘(依赖 `@fgbg/lobe-editor@1.0.0-fork.19`) - **构建**:Vite 将 `@meta2d` / `canvas2svg` 单独拆成 `meta2d` chunk"
4
+ description: "- **思考流可见**:智能助手与帮写均展示 DeepSeek thinking(可折叠「思考中」),长时间等待不再像掉线 - **帮写编辑**:接收中与默认均可直接改「我的稿」;有提案时点「查看 diff」进入只读审阅 - **取消等待**:选择卡 / Skill 表单支持取消;有倒计时卡时关闭助手会确认是否强制退出"
5
5
  keywords: []
6
6
  source: changelog.md
7
7
  ---
8
8
 
9
9
  # 更新日志
10
10
 
11
+ ## v0.8.21
12
+
13
+ - **思考流可见**:智能助手与帮写均展示 DeepSeek thinking(可折叠「思考中」),长时间等待不再像掉线
14
+ - **帮写编辑**:接收中与默认均可直接改「我的稿」;有提案时点「查看 diff」进入只读审阅
15
+ - **取消等待**:选择卡 / Skill 表单支持取消;有倒计时卡时关闭助手会确认是否强制退出
16
+
17
+ ## v0.8.20
18
+
19
+ - **私人 Agent Skills**:设置 → AI 可 CRUD 私人提示词宏(名称对本账号唯一,仅英文数字下划线);智能助手 / 帮写可按名称引用,落盘只存引用,请求时再展开进上下文
20
+ - **助手可管理 Skill**:`list_user_skills` / `create_user_skill` / `update_user_skill` / `delete_user_skill`;新建与修改弹出带倒计时的表单卡
21
+ - **`mdocs update`**:全局安装后从淘宝 npmmirror 原地升级,保留已有 `node_modules`,依赖走 `--prefer-offline`(已缓存的不再重复下载)
22
+
11
23
  ## v0.8.19
12
24
 
13
25
  - **Meta2d 按需加载**:文档没有流程图时不下载 `@meta2d`;有图 / 插入图 / 打开编辑时再加载
@@ -188,13 +188,23 @@ npm install typebox@1.1.38 --no-audit --no-fund
188
188
 
189
189
  ## 升级
190
190
 
191
- 通过 npm 安装的版本,直接重新安装即可升级:
191
+ ### 推荐:`mdocs update`(原地升级)
192
+
193
+ 已全局安装时,直接:
194
+
195
+ ```bash
196
+ mdocs update
197
+ ```
198
+
199
+ 该命令写死从淘宝镜像 [`https://registry.npmmirror.com`](https://registry.npmmirror.com) 拉取最新 `@fgbg/mdocs`,**保留现有 `node_modules`**,再用 `npm install --prefer-offline` 只补差量依赖(本地缓存里已有的包不会再下一遍)。升级后重启服务即可。
200
+
201
+ ### 备选:重新全局安装
192
202
 
193
203
  ```bash
194
204
  npm install -g @fgbg/mdocs@latest --registry=https://registry.npmjs.org/
195
205
  ```
196
206
 
197
- 小服务器升级时建议仍按上面「清半残目录 + 限制并发」步骤执行,升级后重启服务即可。
207
+ 小服务器若遇半残目录或 OOM,仍按上面「清半残目录 + 限制并发」步骤执行。
198
208
 
199
209
  ## 下一步
200
210
 
@@ -2,7 +2,7 @@
2
2
  {
3
3
  "id": "changelog",
4
4
  "name": "更新日志",
5
- "description": "- **Meta2d 按需加载**:文档没有流程图时不下载 `@meta2d`;有图 / 插入图 / 打开编辑时再加载 - **流程图属性「Text」输入**:防抖写回画布,不再每敲一字全量重绘(依赖 `@fgbg/lobe-editor@1.0.0-fork.19`) - **构建**:Vite 将 `@meta2d` / `canvas2svg` 单独拆成 `meta2d` chunk",
5
+ "description": "- **思考流可见**:智能助手与帮写均展示 DeepSeek thinking(可折叠「思考中」),长时间等待不再像掉线 - **帮写编辑**:接收中与默认均可直接改「我的稿」;有提案时点「查看 diff」进入只读审阅 - **取消等待**:选择卡 / Skill 表单支持取消;有倒计时卡时关闭助手会确认是否强制退出",
6
6
  "keywords": [],
7
7
  "source": "changelog.md"
8
8
  },
@@ -128,6 +128,17 @@ mdocs 内置 **两种 AI 能力模式**,共用设置页里的 DeepSeek 配置
128
128
 
129
129
  每人一份配置,仅本人可用;Key 在服务端按访客隔离存储,不会出现在别的访客界面上。配置页可查看配置名称、模型、脱敏后的 Key 与配置 ID;需要改时可点 **编辑**。
130
130
 
131
+ ### 私人 Agent Skills
132
+
133
+ 同一页下方可管理 **Agent Skills**(私人提示词宏):
134
+
135
+ - 名称对本账号唯一,仅英文、数字、下划线
136
+ - 简介可选;正文为 Agent 应遵守的步骤与约束
137
+ - 在智能助手 / 帮写输入区点 **Skill** 多选引用;本轮发送成功后选中标签会清空
138
+ - 也可让助手用工具新建 / 修改(表单卡 + 倒计时)、罗列或按名删除
139
+
140
+ 落盘与会话历史只保存 skill **名称引用**,不会把正文全文写进聊天记录;请求时再按名称展开进模型上下文。
141
+
131
142
  ## 怎么问(智能助手)
132
143
 
133
144
  可以直接问,例如:
@@ -76,11 +76,25 @@ Token / Cookie 丢失时的自助找回;引入登录密码后已边缘化。
76
76
  | 我的收藏 | [收藏功能](./bookmarks.md) |
77
77
  | 我的文章 | [我的文章](./my-documents.md) |
78
78
  | 域管理 / 域成员模板 | [受限域成员与名单模板](./domain-members.md) |
79
- | AI | [智能助手(AI)](./onboarding-ai.md) |
79
+ | AI | [智能助手(AI)](./onboarding-ai.md)(含 DeepSeek 配置与私人 Agent Skills) |
80
80
  | 保存与发布 | [草稿与同步](./drafts.md) |
81
81
 
82
82
  ---
83
83
 
84
+ ## AI 设置里的 Agent Skills
85
+
86
+ 在 **设置 → AI**,DeepSeek 配置下方有 **Agent Skills**:
87
+
88
+ - 新建 / 编辑 / 删除**私人**提示词宏(仅本人可见)
89
+ - **名称**对本账号唯一,仅允许英文、数字、下划线(如 `weekly_report`)
90
+ - 在智能助手或帮写输入区点 **Skill**,按名称勾选后随本轮消息引用
91
+
92
+ 也可在对话里让助手调用管理工具(列出、新建、修改、删除);新建与修改会弹出带倒计时的表单卡。
93
+
94
+ 详情见 [智能助手(AI)](./onboarding-ai.md#私人-agent-skills)。
95
+
96
+ ---
97
+
84
98
  ## 常见问题
85
99
 
86
100
  ### 设置会保存在哪里?
package/bin/mdocs.js CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  // mdocs CLI entry — starts the server by default.
4
- // Subcommands: mdocs visitor list, mdocs visitor migrate
4
+ // Subcommands: mdocs update | mdocs visitor list | mdocs visitor migrate
5
5
 
6
6
  import("../dist/server/cli/main.js");
@@ -46,7 +46,7 @@ export function resolveUserChoice(visitorId, requestId, choice) {
46
46
  entry.resolve(result);
47
47
  return result;
48
48
  }
49
- /** 前端倒计时结束或用户放弃时解冻为 timeout */
49
+ /** 前端倒计时结束解冻为 timeout */
50
50
  export function expireUserChoice(visitorId, requestId) {
51
51
  const entry = pending.get(requestId);
52
52
  if (!entry)
@@ -55,6 +55,15 @@ export function expireUserChoice(visitorId, requestId) {
55
55
  throw new Error("choice_forbidden");
56
56
  entry.resolve({ status: "timeout" });
57
57
  }
58
+ /** 用户主动取消选择卡 */
59
+ export function cancelUserChoice(visitorId, requestId) {
60
+ const entry = pending.get(requestId);
61
+ if (!entry)
62
+ throw new Error("choice_not_found");
63
+ if (entry.visitorId !== visitorId)
64
+ throw new Error("choice_forbidden");
65
+ entry.resolve({ status: "cancelled" });
66
+ }
58
67
  /** chat 断开时清掉该访客未完成的 choice */
59
68
  export function cancelVisitorChoices(visitorId) {
60
69
  for (const [id, entry] of pending) {
@@ -1 +1 @@
1
- {"version":3,"file":"choice-pending.js","sourceRoot":"","sources":["../../../../src/server/agent/Agent/choice-pending.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAazC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAwB,CAAC;AAEhD,uBAAuB;AACvB,MAAM,CAAC,MAAM,yBAAyB,GAAG,OAAO,CAAC;AAEjD,sCAAsC;AACtC,MAAM,UAAU,iBAAiB,CAAC,MAIjC;IACC,MAAM,SAAS,GAAG,UAAU,EAAE,CAAC;IAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CACxB,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,IAAI,yBAAyB,EAAE,KAAK,CAAC,EAC9D,OAAO,CACR,CAAC;IAEF,MAAM,OAAO,GAAG,IAAI,OAAO,CAAmB,CAAC,OAAO,EAAE,EAAE;QACxD,MAAM,MAAM,GAAG,CAAC,MAAwB,EAAE,EAAE;YAC1C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACnC,IAAI,CAAC,GAAG;gBAAE,OAAO;YACjB,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACxB,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC1B,OAAO,CAAC,MAAM,CAAC,CAAC;QAClB,CAAC,CAAC;QAEF,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;QACzE,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE;YACrB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,OAAO,EAAE,MAAM;YACf,KAAK;SACN,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;QACtD,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClB,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBAC1B,OAAO,EAAE,CAAC;gBACV,OAAO;YACT,CAAC;YACD,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACnE,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;AAChC,CAAC;AAED,mCAAmC;AACnC,MAAM,UAAU,iBAAiB,CAC/B,SAAiB,EACjB,SAAiB,EACjB,MAAc;IAEd,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACrC,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;IAChD,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACvE,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IAC3B,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAqB,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IACtE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACtB,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,+BAA+B;AAC/B,MAAM,UAAU,gBAAgB,CAAC,SAAiB,EAAE,SAAiB;IACnE,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACrC,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;IAChD,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACvE,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;AACvC,CAAC;AAED,+BAA+B;AAC/B,MAAM,UAAU,oBAAoB,CAAC,SAAiB;IACpD,KAAK,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;QAClC,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YAClC,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;YACvC,8BAA8B;YAC9B,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;gBACpB,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAC1B,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"choice-pending.js","sourceRoot":"","sources":["../../../../src/server/agent/Agent/choice-pending.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,7 @@
1
1
  import { getVisitorAgentConfig, DEFAULT_AGENT_CONTEXT_WINDOW } from "../Config/config.js";
2
2
  import { getSkillLoader } from "../Skill/skill-loader.js";
3
3
  import { buildSystemPrompt } from "./system-prompt.js";
4
- import { createSkillTools } from "./tools.js";
5
- import { createAccountTools } from "./tools-account.js";
4
+ import { createToolsForMode } from "./tools-registry.js";
6
5
  import { AgentSessionManager } from "./session-manager.js";
7
6
  /** 粗估 token:CJK 约 1 字 1 token,其余约 4 字符 1 token */
8
7
  export function estimateTokens(text) {
@@ -25,9 +24,11 @@ export function estimateTokens(text) {
25
24
  }
26
25
  function estimateToolsTokens(visitorId) {
27
26
  const skills = getSkillLoader();
28
- const tools = skills.isReady()
29
- ? [...createSkillTools(skills), ...createAccountTools(visitorId)]
30
- : createAccountTools(visitorId);
27
+ const tools = createToolsForMode("normal", {
28
+ visitorId,
29
+ onEvent: () => { },
30
+ skills: skills.isReady() ? skills : null,
31
+ });
31
32
  let total = 0;
32
33
  for (const t of tools) {
33
34
  total += estimateTokens(t.name);
@@ -1 +1 @@
1
- {"version":3,"file":"context-usage.js","sourceRoot":"","sources":["../../../../src/server/agent/Agent/context-usage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"context-usage.js","sourceRoot":"","sources":["../../../../src/server/agent/Agent/context-usage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,137 @@
1
+ /**
2
+ * 用户 skill 用时展开:历史 / 本轮 → Pi messages。
3
+ * - 合成 load_user_skill toolCall + toolResult(仿 Claude)
4
+ * - 单次请求内同 skillId 全文只展开一次;越新越先标定展开点
5
+ * - 用户原文不在此追加(本轮走 prompt);历史 user 原文照常写入
6
+ */
7
+ import { randomUUID } from "node:crypto";
8
+ import { skillRefsOfMessage } from "./session-manager.js";
9
+ import { formatSkillExpandBlock, resolveSkillExpandBlocks, } from "./user-skills.js";
10
+ export const LOAD_USER_SKILL_TOOL = "load_user_skill";
11
+ const EMPTY_USAGE = {
12
+ input: 0,
13
+ output: 0,
14
+ cacheRead: 0,
15
+ cacheWrite: 0,
16
+ totalTokens: 0,
17
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
18
+ };
19
+ /** 从新到旧:每个 skill 引用(name,或旧 id)→ 最新出现的 user 轮下标 */
20
+ export function markSkillExpandPoints(history) {
21
+ const expandAt = new Map();
22
+ for (let i = history.length - 1; i >= 0; i--) {
23
+ const m = history[i];
24
+ if (m?.role !== "user")
25
+ continue;
26
+ const refs = skillRefsOfMessage(m);
27
+ if (!refs.length)
28
+ continue;
29
+ for (const ref of refs) {
30
+ if (!expandAt.has(ref))
31
+ expandAt.set(ref, i);
32
+ }
33
+ }
34
+ return expandAt;
35
+ }
36
+ function buildSyntheticSkillPair(model, block, timestamp) {
37
+ const toolCallId = `uskill-${randomUUID()}`;
38
+ const assistant = {
39
+ role: "assistant",
40
+ content: [
41
+ {
42
+ type: "toolCall",
43
+ id: toolCallId,
44
+ name: LOAD_USER_SKILL_TOOL,
45
+ arguments: { id: block.id, name: block.name },
46
+ },
47
+ ],
48
+ api: model.api,
49
+ provider: model.provider,
50
+ model: model.id,
51
+ usage: EMPTY_USAGE,
52
+ stopReason: "toolUse",
53
+ timestamp,
54
+ };
55
+ const result = {
56
+ role: "toolResult",
57
+ toolCallId,
58
+ toolName: LOAD_USER_SKILL_TOOL,
59
+ content: [
60
+ {
61
+ type: "text",
62
+ text: `[user skill loaded]\n${block.content}`,
63
+ },
64
+ ],
65
+ isError: false,
66
+ timestamp,
67
+ };
68
+ return [assistant, result];
69
+ }
70
+ /**
71
+ * 仅产出本轮应预置的假 tool 对(不含用户原文)。
72
+ * `alreadyExpanded`:历史 hydrate 已展开过的 id,本轮跳过。
73
+ */
74
+ export function expandCurrentTurnSkillPairs(visitorId, skillNames, model, alreadyExpanded, timestamp = Date.now()) {
75
+ const refs = (skillNames ?? []).filter((id) => id && !alreadyExpanded.has(id));
76
+ if (refs.length === 0)
77
+ return [];
78
+ const blocks = resolveSkillExpandBlocks(visitorId, refs);
79
+ const out = [];
80
+ for (const b of blocks) {
81
+ const [a, r] = buildSyntheticSkillPair(model, b, timestamp);
82
+ out.push(a, r);
83
+ }
84
+ return out;
85
+ }
86
+ /**
87
+ * 历史 → Pi messages。
88
+ * `expandAt` 若传入(含本轮下标),按该表标定;否则仅就 history 从新到旧标定。
89
+ */
90
+ export function hydrateSessionMessagesToPi(visitorId, history, model, expandAt = markSkillExpandPoints(history)) {
91
+ const ts = Date.now();
92
+ const expandedSkillIds = new Set();
93
+ const out = [];
94
+ for (let i = 0; i < history.length; i++) {
95
+ const m = history[i];
96
+ if (m.role === "assistant") {
97
+ out.push({
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
+ continue;
108
+ }
109
+ const refsThisTurn = skillRefsOfMessage(m).filter((ref) => expandAt.get(ref) === i && !expandedSkillIds.has(ref));
110
+ if (refsThisTurn.length > 0) {
111
+ const blocks = resolveSkillExpandBlocks(visitorId, refsThisTurn);
112
+ for (const b of blocks) {
113
+ const [a, r] = buildSyntheticSkillPair(model, b, ts);
114
+ out.push(a, r);
115
+ expandedSkillIds.add(b.name);
116
+ expandedSkillIds.add(b.id);
117
+ for (const ref of refsThisTurn) {
118
+ if (ref === b.name || ref === b.id)
119
+ expandedSkillIds.add(ref);
120
+ }
121
+ }
122
+ }
123
+ out.push({ role: "user", content: m.content, timestamp: ts });
124
+ }
125
+ return { messages: out, expandedSkillIds };
126
+ }
127
+ /** @deprecated 测试兼容:无 skill 时退化为单条 user */
128
+ export function expandUserMessageForPi(_visitorId, content, skillNames, timestamp) {
129
+ if (!skillNames?.length) {
130
+ return [{ role: "user", content, timestamp }];
131
+ }
132
+ // 有 skill 时旧 API 不再内联正文;调用方应改用 expandCurrentTurnSkillPairs
133
+ return [{ role: "user", content, timestamp }];
134
+ }
135
+ // re-export for tests
136
+ export { formatSkillExpandBlock };
137
+ //# sourceMappingURL=hydrate-messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hydrate-messages.js","sourceRoot":"","sources":["../../../../src/server/agent/Agent/hydrate-messages.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,115 @@
1
+ import { createToolUiEffectsHandler } from "./tool-ui-effects.js";
2
+ import { cancelVisitorChoices } from "./choice-pending.js";
3
+ import { cancelVisitorSkillForms } from "./skill-form-pending.js";
4
+ export async function runPiAgent(params) {
5
+ const { agent, message, skillNames, visitorId, sessionId, sessionManager, onEvent, signal, } = params;
6
+ const track = { emittedError: false, lastUsageInput: 0 };
7
+ const unsub = agent.subscribe(bindAgentEvents({ sessionId, sessionManager, skillNames, onEvent, track }));
8
+ const onAbort = () => {
9
+ cancelVisitorChoices(visitorId);
10
+ cancelVisitorSkillForms(visitorId);
11
+ agent.abort();
12
+ };
13
+ signal?.addEventListener("abort", onAbort);
14
+ try {
15
+ await agent.prompt(message);
16
+ const leftover = agent.state.errorMessage;
17
+ // prompt 在模型鉴权失败时仍可能 resolve,再兜底一次
18
+ if (leftover && !track.emittedError) {
19
+ onEvent({ type: "error", message: leftover });
20
+ track.emittedError = true;
21
+ }
22
+ return track;
23
+ }
24
+ catch (err) {
25
+ if (signal?.aborted)
26
+ return track;
27
+ const msg = err instanceof Error ? err.message : String(err);
28
+ onEvent({ type: "error", message: msg });
29
+ throw err;
30
+ }
31
+ finally {
32
+ signal?.removeEventListener("abort", onAbort);
33
+ cancelVisitorChoices(visitorId);
34
+ cancelVisitorSkillForms(visitorId);
35
+ unsub();
36
+ }
37
+ }
38
+ function extractUserContent(userMsg) {
39
+ const c = userMsg.content;
40
+ if (typeof c === "string")
41
+ return c;
42
+ if (Array.isArray(c)) {
43
+ return c
44
+ .filter((x) => x?.type === "text")
45
+ .map((x) => x.text)
46
+ .join("");
47
+ }
48
+ return "";
49
+ }
50
+ function extractAssistantVisibleText(assistantMsg) {
51
+ const content = assistantMsg.content;
52
+ if (!Array.isArray(content))
53
+ return "";
54
+ return content
55
+ .filter((x) => x?.type === "text")
56
+ .map((x) => x.text)
57
+ .join("");
58
+ }
59
+ /** SSE + session 落盘;tool→SSE 见 tool-ui-effects */
60
+ function bindAgentEvents(opts) {
61
+ const { sessionId, sessionManager, skillNames, onEvent, track } = opts;
62
+ const onToolUi = createToolUiEffectsHandler(onEvent);
63
+ let appendedUser = false;
64
+ let appendedAssistant = false;
65
+ return async (event) => {
66
+ if (event.type === "message_update") {
67
+ const ame = event.assistantMessageEvent;
68
+ if (ame.type === "text_delta") {
69
+ onEvent({ type: "text_delta", text: ame.delta });
70
+ return;
71
+ }
72
+ if (ame.type === "thinking_delta") {
73
+ onEvent({ type: "thinking_delta", text: ame.delta });
74
+ return;
75
+ }
76
+ }
77
+ if (event.type === "message_end") {
78
+ if (event.message.role === "user") {
79
+ if (!appendedUser) {
80
+ appendedUser = true;
81
+ const content = extractUserContent(event.message);
82
+ if (content)
83
+ await sessionManager.appendUser(sessionId, content, skillNames);
84
+ }
85
+ return;
86
+ }
87
+ if (event.message.role === "assistant") {
88
+ const msg = event.message;
89
+ if (typeof msg.usage?.input === "number" && msg.usage.input > 0) {
90
+ track.lastUsageInput = Math.max(track.lastUsageInput, msg.usage.input);
91
+ }
92
+ if ((msg.stopReason === "error" || msg.stopReason === "aborted") &&
93
+ msg.errorMessage) {
94
+ track.emittedError = true;
95
+ onEvent({ type: "error", message: msg.errorMessage });
96
+ return;
97
+ }
98
+ // toolUse = 准备调工具,不是最终可见回答
99
+ if (!appendedAssistant &&
100
+ (msg.stopReason === "stop" || msg.stopReason === "length")) {
101
+ appendedAssistant = true;
102
+ const visibleText = extractAssistantVisibleText(event.message);
103
+ if (visibleText) {
104
+ await sessionManager.appendAssistant(sessionId, visibleText);
105
+ }
106
+ }
107
+ return;
108
+ }
109
+ }
110
+ if (event.type === "tool_execution_end") {
111
+ onToolUi(event);
112
+ }
113
+ };
114
+ }
115
+ //# sourceMappingURL=run-pi-agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-pi-agent.js","sourceRoot":"","sources":["../../../../src/server/agent/Agent/run-pi-agent.ts"],"names":[],"mappings":"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"}