aws-runtime-bridge 1.9.153 → 1.9.162

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 (78) hide show
  1. package/CHANGELOG.md +462 -0
  2. package/dist/adapter/AcodeSdkAdapter.d.ts +29 -6
  3. package/dist/adapter/AcodeSdkAdapter.js +6 -5
  4. package/dist/adapter/prompts.d.ts +1 -1
  5. package/dist/adapter/prompts.js +1 -1
  6. package/dist/adapter/types.d.ts +0 -16
  7. package/dist/routes/acode-todos.js +1 -1
  8. package/dist/routes/ltr.js +1 -1
  9. package/dist/routes/sessions.d.ts +18 -74
  10. package/dist/routes/sessions.js +1 -1
  11. package/dist/routes/terminal.d.ts +8 -0
  12. package/dist/routes/terminal.js +24 -24
  13. package/dist/services/instance-features.d.ts +16 -2
  14. package/dist/services/instance-features.js +1 -1
  15. package/dist/services/workspace-files.js +1 -1
  16. package/dist/services/workspace-watch.js +1 -1
  17. package/package/acode/dist/ask-user-question-tool.js +1 -1
  18. package/package/acode/dist/await-complete-tool.js +1 -1
  19. package/package/acode/dist/background-command-manager.js +1 -1
  20. package/package/acode/dist/background-command-tools.js +1 -1
  21. package/package/acode/dist/built-in-file-tools.d.ts +18 -2
  22. package/package/acode/dist/built-in-file-tools.js +2 -2
  23. package/package/acode/dist/built-in-symbols-tool.js +1 -1
  24. package/package/acode/dist/context-overflow.d.ts +19 -0
  25. package/package/acode/dist/context-overflow.js +2 -0
  26. package/package/acode/dist/grammars/grammars/tree-sitter-lua.wasm +0 -0
  27. package/package/acode/dist/index.d.ts +3 -1
  28. package/package/acode/dist/index.js +1 -1
  29. package/package/acode/dist/parsers/ast-cache.d.ts +12 -1
  30. package/package/acode/dist/parsers/ast-cache.js +1 -1
  31. package/package/acode/dist/parsers/language-queries.js +1 -1
  32. package/package/acode/dist/parsers/symbol-extractor.js +2 -2
  33. package/package/acode/dist/parsers/tree-sitter-loader.d.ts +1 -1
  34. package/package/acode/dist/parsers/tree-sitter-loader.js +1 -1
  35. package/package/acode/dist/plugin-types.d.ts +5 -0
  36. package/package/acode/dist/plugin-types.js +1 -0
  37. package/package/acode/dist/read-file-state.d.ts +48 -0
  38. package/package/acode/dist/read-file-state.js +2 -0
  39. package/package/acode/dist/runtime.d.ts +63 -9
  40. package/package/acode/dist/runtime.js +30 -27
  41. package/package/acode/dist/skill-tool.js +3 -3
  42. package/package/acode/dist/sub-agent-manager.js +1 -1
  43. package/package/acode/dist/sub-agent-tools.js +5 -5
  44. package/package/acode/dist/todo-tool.js +3 -3
  45. package/package/acode/dist/tool-concurrency/index.d.ts +5 -0
  46. package/package/acode/dist/tool-concurrency/index.js +2 -0
  47. package/package/acode/dist/tool-concurrency/observability.d.ts +46 -0
  48. package/package/acode/dist/tool-concurrency/observability.js +3 -0
  49. package/package/acode/dist/tool-concurrency/resource-lock.d.ts +25 -0
  50. package/package/acode/dist/tool-concurrency/resource-lock.js +2 -0
  51. package/package/acode/dist/tool-concurrency/scheduler.d.ts +30 -0
  52. package/package/acode/dist/tool-concurrency/scheduler.js +2 -0
  53. package/package/acode/dist/tool-concurrency/types.d.ts +80 -0
  54. package/package/acode/dist/tool-concurrency/types.js +2 -0
  55. package/package/acode/dist/tool-group-manager.d.ts +116 -0
  56. package/package/acode/dist/tool-group-manager.js +14 -0
  57. package/package/acode/dist/types.d.ts +12 -2
  58. package/package/acode/package.json +2 -2
  59. package/package/aws-client-agent-mcp/dist/agent-client.d.ts +3 -27
  60. package/package/aws-client-agent-mcp/dist/agent-client.js +1 -1
  61. package/package/aws-client-agent-mcp/dist/mcp-server.d.ts +46 -8
  62. package/package/aws-client-agent-mcp/dist/mcp-server.js +30 -30
  63. package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts +29 -3
  64. package/package/aws-client-agent-mcp/dist/mcp-tools.js +146 -21
  65. package/package/aws-client-agent-mcp/dist/office/office-equation.d.ts +5 -0
  66. package/package/aws-client-agent-mcp/dist/office/office-equation.js +2 -0
  67. package/package/aws-client-agent-mcp/dist/office/office-image.d.ts +12 -0
  68. package/package/aws-client-agent-mcp/dist/office/office-image.js +2 -0
  69. package/package/aws-client-agent-mcp/dist/office/office-workspace.d.ts +25 -0
  70. package/package/aws-client-agent-mcp/dist/office/office-workspace.js +2 -0
  71. package/package/aws-client-agent-mcp/dist/tool-groups.js +2 -2
  72. package/package/aws-client-agent-mcp/dist/types.d.ts +6 -2
  73. package/package/aws-client-agent-mcp/package.json +2 -1
  74. package/package.json +1 -1
  75. package/package/acode/dist/capability-prompt.d.ts +0 -16
  76. package/package/acode/dist/capability-prompt.js +0 -3
  77. package/package/acode/dist/plugin-tools.d.ts +0 -14
  78. package/package/acode/dist/plugin-tools.js +0 -9
package/CHANGELOG.md CHANGED
@@ -5,6 +5,468 @@ files 白名单),供调度中心「查看本次更新内容」弹窗按 `##
5
5
  展示。发布新版本时须在仓库中先写好 `## v<version>` 段(prepack-guard 校验缺段
6
6
  即阻断发布);Bridge 自更新成功后的运行时追加仅作为包内缺段时的兜底。
7
7
 
8
+ ## v1.9.162
9
+
10
+ _发布日期:2026-09-24_
11
+
12
+ ### 工具懒加载:browser / desktop 收纳态展开链路打通(关键修复)
13
+
14
+ v1.9.153 起 browser / desktop 改为**收纳态不注入会话工具列表**(缓存稳定化的
15
+ 前提:LLM 请求的 tools 前缀字节级不变,provider 前缀缓存全程命中),工具定义改由
16
+ `expand_tools` 结果下发、执行经 `call_tool` 回传。但回传链路在重构中被删除且未补回,
17
+ 导致收纳态(默认档)下:
18
+
19
+ - `expand_tools({group:"browser"})` 从本地 `exposedTools` 取 manifests → 收纳态下
20
+ 必然为空(工具按设计就没注入),agent 拿到 0 个工具定义;
21
+ - `call_tool({name:"browser_navigate"})` 找不到工具名 → 直接报「未知工具」;
22
+ - bridge 侧 `POST /sessions/:agentId/capability-tools[/call]` 端点恢复后**没有任何调用方**
23
+ (原 MCP Server 中继 `setBridgeCapabilityTools` / `handleExpandTools` 已随重构移除)。
24
+
25
+ 本次以**同进程中继**补齐(不改 tools/list 载荷,缓存稳定性不回退):
26
+
27
+ - ACode 新增 `CapabilityToolRelay` 契约(`tool-group-manager.ts`)+ 运行时配置
28
+ `capabilityToolRelay`(`types.ts`),`expand_tools` / `call_tool` 的桥接组分支经其
29
+ 回传;本地组(pencil / draw / office / launch / hire / task / meeting / debug /
30
+ fileHistory)路径完全不变。
31
+ - 展开:先中继(`setBuiltInCapabilityTools(expand)` 刷新定义缓存并授予调度授权、
32
+ 返回 manifests),成功后才置本地展开态 —— 中继失败可重试,不留半展开态;
33
+ - `group="all"`:桥接组经中继拉 manifests,`disabled` 静默跳过、单组失败不阻断其余组
34
+ (该组 `call_tool` 会被拒并提示重新 expand,自愈);收起时桥接授权全部回收;
35
+ - 调度:`findTool` 落空且工具名归 bridge 托管时,按 `call_tool` 三道闸同口径的
36
+ 本地预检(`disabled` 拒绝 / 未展开引导 expand)后执行 `callBuiltInCapabilityTool`。
37
+ - `AcodeSdkAdapter` 会话启动时注入中继(同进程直连,无 HTTP、无 token 依赖;
38
+ HTTP 端点 `capability-tools[/call]` 保留供外部/兼容调用)。无 `agentId` 时不注入,
39
+ 退化为本地查找(与启动注入的缺省兜底一致)。
40
+
41
+ 配套测试:acode `tool-group-manager.test.ts` 新增「capabilityToolRelay」12 项(展开
42
+ manifests 来自中继、幂等、失败不留状态且可重试、disabled 不触中继、group=all 混合
43
+ 本地+桥接+disabled、收起回收、调度透传参数/未展开拒绝/disabled 拒绝/错误透传/
44
+ 非桥接未知工具不触中继);bridge `AcodeSdkAdapter.test.ts` 新增端到端用例
45
+ (启动注入中继 → `expand` 下发 manifests 且不注入 exposedTools → `call` 执行 →
46
+ `collapse` 后调度被拒)。bridge 套件 1473 通过 + 4 跳过、acode 743 通过。
47
+
48
+ ### 工具组:ACode 短 key ↔ 能力 featureKey 错位修复
49
+
50
+ `collaboration.*`(流程任务 / 会议 / 调试日志 / 文件变更历史)与 `agentSys.launchItem` /
51
+ `agentSys.hire` 的工具组短 key(`task` / `meeting` / `debug` / `fileHistory` / `launch` /
52
+ `hire`)与完整 featureKey 不一致,ACode 侧把「收纳」误判为「禁用」(实测确认):
53
+ 系统提示词把已授权能力显示为未开启、`expand_tools` 直接拒绝。本次新增
54
+ `GROUP_KEY_TO_FEATURE` 映射与 `resolveGroupFeatureKey()`(`instance-features.ts`),
55
+ `capabilityState` 回调先归一再取三态;同时补齐父门禁级联
56
+ (`collaboration` / `agentSys` 主开关 `disabled` 时其子能力一律 `disabled`),
57
+ 与前端清除子键、Java 门禁传播同口径。
58
+
59
+ 工具组归属推断同时加固(`tool-group-manager.ts`):不再只认 `key_` 前缀,注册的
60
+ 精确 `toolNames` 先于前缀命中,`listToolManifests` 忽略 MCP 的 `serverName__` 命名空间
61
+ 取裸名匹配 —— `my_task` / `create_meeting` / `query_debug_logs` /
62
+ `query_file_changes_history` 等非前缀命名的 MCP 工具组据此正确归组与下发定义。
63
+
64
+ ### 协作能力分组:默认收纳 + 父门禁级联
65
+
66
+ `instance-features.ts` 新增 `collaboration` 主开关与 `collaboration.task` /
67
+ `collaboration.meeting` / `collaboration.debug` / `collaboration.fileHistory` 四个子能力
68
+ (默认收纳),ACode 侧注册同名工具组;四个分组在收纳态下不进 LLM 工具列表,经
69
+ `expand_tools` 展开后由 `call_tool` 调度。
70
+
71
+ ### 工具并发执行(资源驱动调度)
72
+
73
+ 新增 `tool-concurrency/` 子系统(`types` / `resource-lock` / `scheduler` /
74
+ `observability`),ACode 一条 LLM 响应返回多个 `tool_calls` 时按**资源冲突关系**
75
+ 并发而非按工具类型分组,并新增运行时配置 `toolConcurrency`
76
+ (`enabled` 默认 true、`maxReadOnly` 默认 8、`maxBash` 默认 0=不限):
77
+
78
+ - 资源键层级(`file:` / 目录前缀 / `bash:` 等)与祖先-后代判定;区间重叠即冲突;
79
+ - 同资源读写按读写锁串行,写-写互斥;未声明并发策略的工具(如 bridge 注入的
80
+ `browser_` / `desktop_`)默认独占串行 —— 关闭 `enabled` 即退化为旧的串行行为;
81
+ - `ToolTraceRecorder` 记录每个工具的 waiting_resource / running / completed 时序并聚合
82
+ 批次度量(墙钟、并行度、等锁总时长、竞争次数、加速比),`ConcurrencyLimiter` 提供
83
+ 只读 / Bash 并发上限;
84
+ - 文件工具声明资源键(`buildFileResourceKey` / `fileResourceClaim`),读 `read`、
85
+ 写 `write`。
86
+
87
+ ### 文件写入 stale guard(陈旧写入拒绝)
88
+
89
+ 新增 `read-file-state.ts`:`read_file` 记录 mtime / size / 内容快照,`edit_file` /
90
+ `write_file` 落盘前比对,文件在上次读取后被外部修改(且内容与快照不匹配)时拒绝写入
91
+ 并提示模型重读,避免并发会话/外部编辑器改动被静默覆盖。运行时开关
92
+ `enableStaleFileGuard`(缺省启用,`false` 关闭比对;状态仅存内存,`stop()` 清空)。
93
+
94
+ ### 工具权限:新增 `fileModificationOutside` 档位
95
+
96
+ 「限制操作」新增工作区外文件修改权限(`fileModificationOutside`),
97
+ `resolveAgentToolPermissions` 全 allow 兜底值同步补齐,热推路径显式下发默认值以
98
+ 清除历史限制。
99
+
100
+ ### 会话启动令牌吊销与运行时钟强化
101
+
102
+ - `RuntimeGlobalSettingsService` 启动时吊销历史运行令牌,避免重启后旧令牌继续可用。
103
+ - `terminal.ts` 抽出 `isIdleStatusChangeRetryable()`:`waiting_input` 纯状态切换
104
+ (`turn_complete` 仅带 usage、不带 `actionType`)也纳入 idle 串行重试队列,
105
+ 修复该类状态切换漏到零重试路径的问题;原 `!params.actionInfo` 空判改为
106
+ `!params.actionInfo?.actionType`。
107
+
108
+ ### LTR 临时文件读取端点
109
+
110
+ `POST /api/ltr/read`:按绝对路径返回 LTR 临时文本内容,安全校验拒绝 `LTR_ROOT`
111
+ 目录树之外的路径(防路径穿越),文件不存在 404、非文件 400、上限 512KB。
112
+
113
+ ### Agent Todo 重置与 acode-todos 路由
114
+
115
+ `AgentTodoService` / `routes/acode-todos.ts` 支持重置(清空)会话待办列表,
116
+ 配套 `acode-todos.test.ts` 覆盖重置语义。
117
+
118
+ ### 空闲监听指令(poll_message)措辞收敛
119
+
120
+ `MESSAGE_POLLING_IDLE_PROMPT` 改为显式前置条件:「此指令仅在当前没有未完成任务时生效;
121
+ 若仍在处理任务请忽略本指令并继续执行」,仅在确认无进行中/未完成任务时才调用
122
+ `poll_message`,降低任务中途被空闲轮询打断的概率(三个 adapter 的单测改为从
123
+ `prompts.ts` 导入常量,避免文案与断言再次脱节)。
124
+
125
+ ### 依赖与其它
126
+
127
+ - `aws-client-agent-mcp` 新增 `temml`(Office 公式渲染)依赖,新增
128
+ `office_format` / `office_apply_profile` / `office_generate_from_template` 三个
129
+ Office 工具及 `office-equation.ts` 公式模块(含测试)。
130
+ - `AcodeSdkAdapter` 恢复 `POST /sessions/:agentId/capability-tools[/call]` 路由,
131
+ `resolveAdapter(providerId)` 按会话 providerId 解析适配器;sessions 测试 29 项通过。
132
+ - 版本号 1.9.157 – 1.9.162 为连续未发布开发周期(npm 上仍为 1.9.153),
133
+ 本次一并发布。
134
+
135
+ ## v1.9.161
136
+
137
+ _发布日期:2026-09-18_
138
+
139
+ ### Office 题注位置与回执提示修复(依据 v4 回归报告 N7/N8)
140
+
141
+ **N7:`captioned_table` 题注位置对齐中文论文规范**
142
+
143
+ 中文论文(学位论文)规范要求「图题在下、表题在上」,本项目脚本产物同样如此;
144
+ 此前 `captioned_table` 一律把题注插在表格**下方**,用工具链重做论文逐页比对时会显现差异。
145
+ 现按元素类型区分默认位置:
146
+
147
+ - `captioned_image`:题注默认在图片**下方**(行为不变)
148
+ - `captioned_table`:题注默认在表格**上方**
149
+ - 新增 `props.captionPosition`(`above`/`below`,兼容 `top`/`before`/`bottom`/`after`)显式覆盖
150
+
151
+ 实现:新增 `insertParagraphBeforeElement`(表题在上的插入路径);章内序号统计按位置
152
+ (章标题之后、插入点之前)计算,因此「表题在上」不改变编号连续性。
153
+
154
+ **N8:`office_edit` 回执未透传服务端 warnings**
155
+
156
+ 服务端(Java)已在 `chapterHeadingStyle=false` 等场景返回 `warnings`,但 bridge 层
157
+ `officeEdit` 组装回执时丢弃了该字段,使用者无法感知「F9 后编号不会按章重启」的风险。
158
+ 现原样透传 `warnings`(服务端未返回时不产生空数组噪音)。
159
+
160
+ 配套回归测试:`OfficeDocxPrecisionTest` 新增 4 个用例(表题默认在上、图题默认在下、
161
+ captionPosition 显式覆盖、表题在上时序号连续);bridge `mcp-server.test.ts` 新增 2 个
162
+ 用例(warnings 透传、无 warnings 时不含该键)。office 测试总数 179 全通过;
163
+ Word COM F9 实测题注编号稳定(表1-1/表1-2/表2-1、图1-1/图1-2/图2-1)。
164
+
165
+ ### ACode 模型请求失败重试不再重置上下文
166
+
167
+ 模型请求超时/网关 5xx/看门狗中止后的重试此前会重新走主动压缩预检:一旦累计或估算
168
+ 用量越过阈值,与上下文大小无关的失败重试也会裁剪+摘要化历史,表现为「重试后上下文
169
+ 被重置」。本次修复:
170
+
171
+ - **恢复式重试(resume,与失败请求逐字节一致)**:非溢出的普通失败(5xx/超时/看门狗)
172
+ 后,适配器以 `resume: true` 恢复同一轮——不重发 prompt 钩子、不重复 push 用户消息、
173
+ **不回滚轮内进展**(工具结果/部分输出原地保留),基于与失败请求同一份 conversation
174
+ 重建请求:重试请求与上次失败的请求逐字节一致,重试之前的状态不丢失。原先的失败轮
175
+ 锚点回滚(`rollbackFailedTurn`)会把会话截回 turn 开始前、丢弃轮内已成功的迭代,已移除。
176
+ - **轮级跳过压缩**:重试 submit 携带 `skipProactiveCompaction`(resume 隐含),覆盖整轮
177
+ 全部 LLM 迭代,并同时约束 800KB 请求体字节上限截断(`truncateConversationIfNeeded`),
178
+ 旧版 `markSkipNextCompaction()` 单次标记兼容保留;仅 provider 显式溢出信号(错误字段/
179
+ `finish_reason`)触发响应式压缩重建,413 溢出仍正常兜底——上下文改写只属于溢出响应。
180
+ - **结构化溢出判定**:新增 `context-overflow.ts`(cause 链下钻 + 字段级标记 + 精选消息
181
+ 片段),`length`/`max_tokens` 被输出长度标记独占短路,绝不因输出上限触发压缩。
182
+ - **4xx 确定性错误短路重试**:invalid_request 类错误直接 `retry_aborted`(「请求无效」),
183
+ 5xx/超时仍按指数退避+抖动重投。
184
+
185
+ 配套回归测试:acode `runtime.test.ts` 新增/强化 5 个用例(resume 重试请求体逐字节一致
186
+ 且不重复 push、中途失败保留轮内工具结果后 resume 与失败迭代逐字节一致、整轮跳过主动
187
+ 压缩、legacy 单次标记、重试轮跳过 800KB 字节截断而普通轮照常截断);bridge
188
+ `AcodeSdkAdapter.test.ts` 断言重试提交携带 `resume + skipProactiveCompaction`,并含
189
+ 4xx 短路与重试计数语义用例(套件 82/82 通过)。
190
+
191
+ ## v1.9.160
192
+
193
+ _发布日期:2026-09-18_
194
+
195
+ ### Office 题注编号与格式检查修复(依据 v3 回归报告 N1-N6)
196
+
197
+ **N1(高):SEQ 域 `\s` 值写成了章号,F9 后含小节的章出现重复编号**
198
+
199
+ `\s N` 的 N 是**标题级别**(1-9),不是章号。原实现写 `SEQ figure \s <章号>`,导致:
200
+ 含 H2 小节的章在每次小节标题处错误重启(实测 Word F9 后 图2-1 重复出现),
201
+ 第十章还会写出超范围值 `\s 10`。现固定为 `SEQ figure \s 1`(按 1 级标题重启),
202
+ 章号只体现于静态前缀;章内序号改为按「本章范围内、插入点之前」的实际域数量统计
203
+ (`countSeqFieldsBefore`),与 `\s` 值彻底解耦。
204
+
205
+ **N2(中):题注按章重启依赖章标题具备「标题 1」样式,此前不校验也不提示**
206
+
207
+ Word 的 `\s 1` 按**样式名为内置「标题 1」**的段落重启(COM 实测:仅补直接格式
208
+ `outlineLvl` 或自定义名样式均无效)。而论文类模板常把章标题写成直排格式(无样式),
209
+ 此时 F9 后编号会跨章累计。修复:
210
+
211
+ - `captioned_*` 在 `chapterTracker=auto` 时自动为识别出的章标题补「标题 1」样式
212
+ (新增 `DocxStyleOps`:找样式 → 套用并逐项还原差异 → 若仍不等价则回退到工具自建的
213
+ **最少格式「标题 1」样式**,保证可见外观零变化)
214
+ - 新增 `props.chapterHeadingStyle=false` 可关闭自动补样式(回执带 `warnings` 说明风险)
215
+ - `office_edit` 回执新增 `warnings` 字段
216
+
217
+ **N3(低):`props.heading` 传数字不生效(静默)**
218
+
219
+ 数字 `1`、字符串 `"1"`、`"Heading1"`、`"标题 1"` 现均可用;非法值(`"abc"`、越界 `4`)
220
+ 改为**显式报错**,不再静默不加样式。
221
+
222
+ **N5:check 空段落噪音**
223
+
224
+ `office_format` 默认跳过无文本段落(空段落/纯图片段落)的正文类检查与修正,
225
+ summary 增加 `skippedBlankParagraphs`;`rules.blankParagraphPolicy="report"` 可恢复旧行为。
226
+ 实测重生成论文违规数 421 → 199(其中 222 条为纯空段落噪音)。
227
+
228
+ **N6:preset 与模板实测口径统一**
229
+
230
+ - profile 聚合修正「非空众数」偏差:此前 114 段中仅 1 段 `bold=true` 也会输出 `bold=true`
231
+ (回灌 apply_profile 会把全文错误加粗);现按全量多数票取值,未显式设置的属性不输出
232
+ - 新增 `OfficeFormatPresets.merge(base, overrides)` 与 `office_format` 的 `mergePreset=true`:
233
+ 以 preset 为基线、实测 profile 逐键覆盖(page/rules[role].props/roles),
234
+ 解决「preset 期望黑体 vs 模板实测宋体」的系统性差异导致的验收比对失真
235
+ - 合并时归一「首行缩进/悬挂缩进」互斥(OOXML 中两者共存只有悬挂生效,会造成
236
+ check 期望与实际永不收敛);写入端同步加固
237
+
238
+ **实测验收**:模板实测 profile + preset 合并后,对重生成论文 check→fix→check
239
+ 收敛 219 → 0;对既有论文 179 → 0(此前因缩进互斥存在 12 条不可收敛残留)。
240
+
241
+ 配套回归测试:`OfficeDocxPrecisionTest` 新增 11 个用例(SEQ 恒定值、同章序号解耦、
242
+ 章标题样式自动补/外观保持/可关闭、heading 数字与非法值、空段落跳过与 report 策略、
243
+ preset 合并与缩进互斥收敛、profile null 噪声);office 测试总数 175 全通过。
244
+
245
+ ### office 卡片:指定文件强校验 + 预览链接服务端权威化
246
+
247
+ **背景**:office 卡片的 `card.previewUrl` 此前由 agent 自报、bridge 与 Java 两端均无校验
248
+ (纯透传),前端直接塞进无 sandbox 的 iframe——agent 可拼造任意地址(含站外页面)。
249
+ 同时卡片引用的文件是否真实存在没有任何服务端校验。
250
+
251
+ **新契约**:office 卡片只能用 `filePath`(工作区路径)或 `docId`(云文档 id)之一指定
252
+ 文件,二者必居其一、不可同时传;`previewUrl` 从入参契约中移除,由服务端生成。
253
+
254
+ - **bridge(发送前校验,失败即工具调用失败、消息不发送)**:`buildOfficeCardPayload`
255
+ 重写——filePath 经 `packOfficeFile` 统一校验(存在/普通文件/docx-xlsx-pptx/≤16MB)后
256
+ 上传,载荷换成 `{type,name,kind,fileUrl,sizeKb,title,filePath,workspacePath}`;
257
+ docId 路径本机零上传,载荷只带 `{type,docId,title?,description?}`;
258
+ 两者同传 / 都缺 / 只传 fileUrl 均抛错。入参即使携带 `previewUrl` 也被丢弃。
259
+ - **服务端(落库前权威校验)**:`McpToolHandler.toCardJson` 的 office 分支改为委托
260
+ `OfficeToolHandlers.normalizeOfficeCard`——校验 filePath/docId 二选一;filePath 路径
261
+ 按 `fileUrl` 反解存储名并 `loadFile` 确认文件真实存在;docId 路径经
262
+ `OfficeCloudDocService.findDoc` 校验云文档有效(不存在则工具调用失败、消息不落库)
263
+ 并回填 name/kind/fileUrl/sizeKb。
264
+ - **预览由服务端生成**:取权威文件字节 → `OfficeDocService.buildPreviewHtml` →
265
+ `FileStorageService.storeFile("...-preview.html", ...)` → 服务端 `previewUrl` 写入卡片。
266
+ 文件字节无法解析(损坏/伪装扩展名)时发送失败,杜绝「卡片指向不存在的文件」。
267
+ - **工具描述**:`send_group`/`send_private` 的 `card` schema 删除 `previewUrl` 属性,
268
+ `docId`/`filePath` 描述改写为「二选一」口径;`office_preview` 描述改为「返回地址供自检/
269
+ 留档,卡片预览由服务端生成」。
270
+ - **dashboard**:新增 `utils/officeCardUrl.ts` 信任边界(`fileUrl` 只放行本站
271
+ `/api/files/` 地址,`previewUrl` 额外要求 `.html`;伪协议/携带凭据/站外链接一律拦截),
272
+ `ChatPanel.vue` 的预览按钮、点击、下载统一走该校验;预览 iframe 加
273
+ `sandbox="allow-same-origin"` 与 `referrerpolicy="no-referrer"`;卡片带 `docId` 时
274
+ 「面板打开」直接按 docId 打开 Office 面板(跳过工作区路径匹配)。
275
+
276
+ 配套回归测试:bridge `mcp-server.test.ts` 新增 office 卡片 9 个用例(上传路径/预览地址
277
+ 丢弃/文件不存在/非 Office 扩展名/docId 零上传/二选一冲突/两者都缺/只传 fileUrl/DM 路径),
278
+ `mcp-tools.test.ts` 新增 schema 契约 2 个用例;dashboard `officeCardUrl.test.ts` 7 个用例。
279
+
280
+ ## v1.9.159
281
+
282
+ _发布日期:2026-09-17_
283
+
284
+ ### Office 回归修复(依据 v1/v2 回归报告)
285
+
286
+ **严重:lineSpacing 提取值错误(会导致排版全毁)**
287
+
288
+ `office_view(mode=profile)` 提取的 `body_text.lineSpacing` 为 `0.075` 而实际应为 `1.5`——
289
+ `DocxStyleResolver` 已把 twips 转为磅值,profile 聚合时又按 twips 除以 240(等效多除 20)。
290
+ 现改为 `pt / 12` 得到倍数,与规则引擎 `normalizeLineSpacing` 对齐;提取值回灌
291
+ `office_apply_profile` 后行距正确(360 twips = 1.5 倍)。
292
+
293
+ **chapterTracker 跨章失效**
294
+
295
+ `captioned_image` / `captioned_table` 在第二章后仍生成「图1-1」。修复:
296
+
297
+ - 按 `before`/`after`/`index` 解析真实插入落点(而非扫描全篇)
298
+ - 章号判定同时支持 Heading1 样式、大纲级别 0、「第X章」中文数字(`chineseNumeralToInt`)
299
+ - 章内序号按 `SEQ ... \s N` 分组计数,跨章正确重启
300
+
301
+ **SEQ 域缓存值与静态前缀叠加(显示「图1-1 前台首页1」)**
302
+
303
+ 题注以 `{seq}` 为界拆分为「静态前缀 run + SEQ 域 + 静态后缀 run」,域缓存值即章内序号,
304
+ Word/WPS 打开即为正确编号,F9 刷新后保持一致。
305
+
306
+ **heading1 角色漏识别**
307
+
308
+ `OfficeRoleDetector` 新增大纲级别判据与中文样式名支持(`headingLevelOfStyle`:`Heading 1` /
309
+ `标题 1`),章标题正则放宽空格并补充裸数字章标题兜底。
310
+
311
+ 配套新增 10 个回归测试;office 测试总数 161 全通过。
312
+
313
+ ## v1.9.158
314
+
315
+ _发布日期:2026-09-17_
316
+
317
+ ### Office 模板对齐类文档生成增强(F1-F6)
318
+
319
+ 将「参考模板 → 逐项对齐样式 → 一键出稿」的论文类任务能力沉淀为 office 工具链通用能力,
320
+ 仍基于 Apache POI 纯格式层(无 COM、无外部进程)。新增 2 个工具 + 2 个 office_view 模式,
321
+ 扩展 office_edit 两种带题注元素与表格列声明。
322
+
323
+ **新工具**
324
+
325
+ - `office_apply_profile`:按样式 Profile 对匹配角色段落规整字体/字号/行距/缩进/对齐 +
326
+ 页面设置 + 标题编号;值稳定(重复应用不回退、不翻倍)。
327
+ - `office_generate_from_template`:`{{var}}` 全文跨 run 替换 + 内容清单注入
328
+ (heading/paragraph/image/table/pageBreak)+ 可选 profile 应用;`outputFile` 指定时保留模板。
329
+
330
+ **office_view 新 mode**
331
+
332
+ - `profile`:从模板 docx 提取按角色聚合的样式 Profile(page/roles/rules/numbering),
333
+ 作为 apply_profile 的输入;role 附 `matchSource`/`sampleText`/`paragraphCount` 审计元数据。
334
+ - `selfcheck`:按分页符拆页,逐页 `textDigest` + 标题层级跳跃/图片溢出/宽表 warning,
335
+ 并复用规则引擎补充格式违规检查。
336
+
337
+ **office_edit 扩展**
338
+
339
+ - `add type=captioned_image / captioned_table`:一条命令插入图片/表格 + 居中题注段
340
+ (SEQ 域,Word F9 可刷新);`caption`/`captionText` 双字段兼容;`chapterTracker=auto` 自动判章。
341
+ - `add type=table` 新增 `columns: [{widthPt, align}]` 列宽(pt→dxa)与列对齐声明。
342
+
343
+ **回归修复**
344
+
345
+ - 修复 `office_create` 漏传 `template` 参数(bridge 侧)。
346
+ - 修复 `captioned_*` 题注未写入(参数名不一致 + 题注段与内容段共用锚点)。
347
+ - 修复 `office_generate_from_template` 的 `outputFile` 不生效(模板被就地污染)。
348
+ - profile 角色识别增强:TOC/附录等辅助样式不再污染正文/标题统计。
349
+
350
+ 详见 `docs/Office文件操作能力实施方案.md` §12。
351
+
352
+ ## v1.9.157
353
+
354
+ _发布日期:2026-09-16_
355
+
356
+ ### Office 精准操作能力大版本:Word 内核 / Excel / PPT / 公式 / 规则引擎
357
+
358
+ 对标参考开源实现(WordFormat、学术 skills 等)完成 Office 三件套从「能创建」到
359
+ 「精准操作」的升级:run 级定位、批注修订、公式目录页码、版式占位符、格式规则
360
+ 检查与一键修正。全部基于 Apache POI 5.2.5 纯格式层实现,无 COM/无外部进程。
361
+
362
+ **Word 精准编辑内核(docx)**
363
+
364
+ - 路径寻址扩展:`/body/p[N]/run[M]`(run 级)、`/body/table[T]/row[R]/cell[C]`(单元格)、
365
+ `/body/sectPr`(页面)、`/body/header|footer`(页眉页脚)
366
+ - 新增 `DocxStyleResolver`:docDefaults → basedOn 链 → 直接格式的**有效格式解析**
367
+ (含主题字体兑现),支撑 `view styles` 与规则引擎「改得准、查不误报」
368
+ - 新能力:`op=replace`(跨 run 保格式查找替换)、批注(写/读/删,五件套部件)、
369
+ 修订(tracked 编辑 + accept/reject)、目录 TOC 域 + updateFields、PAGE/NUMPAGES/SEQ 域、
370
+ 页码页脚、书签 + 外链/内链超链接、**引用上标 [n] + 锚点内链**、OMML 公式(行内/块级/编号公式三列表)、
371
+ **自定义标题编号**(第%1章模板 + 清除手动编号)、三线表(threeLine 预设)、
372
+ 段落字符单位缩进(firstLineChars)、中英文字体三槽(fontEa/fontAscii/fontHAnsi)
373
+ - `office_create` 支持 `template: cn-thesis`(A4+2.5cm、宋体/黑体样式体系、标题编号、页码)
374
+ - `office_view` 新 mode:`styles`(有效格式)、`comments`、`revisions`、`search`(query 定位)
375
+ - `office_validate` 增加 OOXML 结构检查:批注范围配对、w:del/w:ins 规范、xml:space
376
+
377
+ **Excel 增强(xlsx)**
378
+
379
+ - `add chart`(bar/column/line/pie/doughnut/area,XDDF 原生图表)、单元格批注、
380
+ 数据验证(list/whole/decimal/date/textLength/custom)、条件格式(cellIs/containsText/colorScale)、
381
+ 带位移插入/删除行(不覆盖相邻数据)、按范围拆分合并、富文本单元格(runs 数组)、
382
+ 定义名称、页面设置(方向/缩放/打印区域)、自动筛选、行列隐藏
383
+
384
+ **PowerPoint 增强(pptx)**
385
+
386
+ - 演讲者备注(`set /slide[N]/notes`,view notes 读取)、**版式感知创建**(add slide + layout/layoutIndex,
387
+ view layouts 清单)、占位符直接赋值(`/slide[N]/placeholder[type|idx]`,保留模板样式)、
388
+ 全 deck 查找替换(可限定单页)、表格单元格写入(`/shape[M]/cell[R][C]`)、
389
+ 形状旋转/z-order(up/down/top/bottom)/超链接、**幻灯片克隆**(op=clone:复制文本/图片/备注/版式,
390
+ 源页隔离,插入位置可控)
391
+
392
+ **公式链路(bridge)**
393
+
394
+ - 新建 `src/office/office-equation.ts`:`props.latex` → temml(MIT)LaTeX→MathML →
395
+ 自研 MathML→OMML 转换(覆盖分数/根式/上下标/极限/求和积分/矩阵/括号分组),
396
+ 失败时给出可读错误;`office_edit` 自动预处理 latex → omml 上行 Java 注入
397
+
398
+ **格式规则引擎(差异化能力)**
399
+
400
+ - 新工具 `office_format`:`{file, action: check|fix, preset|rulesFile|rules, annotate?, outputFile?}`
401
+ - 角色识别(三层):Word 样式 → 正则启发式(第X章/图题/摘要/参考文献等)→ 显式匹配器
402
+ - 检查:逐角色比对期望格式 → 违规清单(path/role/property/actual/expected/fixable/severity)+ 摘要;
403
+ `annotate:true` 把违规写成 Word 批注生成标注版(不覆盖原件)
404
+ - 修正:确定性项自动改(字体三槽/字号/加粗/对齐/行距/缩进/编号/手动编号清除),判断类只报告
405
+ - 预置:`cn-thesis`(学位论文)、`cn-report`(公文);rulesFile 支持工作区 YAML/JSON
406
+ - 收敛性验证:fix 后复查零违规(加权优先级 + 半磅字号 + 悬挂缩进语义)
407
+
408
+ **预览增强(docx HTML 预览)**
409
+
410
+ - 批注标记(含正文悬浮)、修订 ins/del 着色、公式文本化、TOC 占位、
411
+ 域友好占位(〔页码〕)、超链接渲染为可点击 a[href]、上下标
412
+
413
+ **测试**
414
+
415
+ - Java:新增 `OfficeDocxPrecisionTest`(25 用例)、`OfficePptxAdvancedTest`(11 用例)、
416
+ `OfficeFormatEngineTest`(9 用例)等,全量 1442 用例通过
417
+ - bridge:新增 `office-equation.test.ts`(17 用例)+ mcp-tools 描述契约测试;
418
+ `tsc` 与本套件通过
419
+ - 前端:`officeTimeline` 支持 office_format 事件刷新,测试补齐
420
+
421
+ ## v1.9.156
422
+
423
+ _发布日期:2026-09-13_
424
+
425
+ ### Office 三件套能力升级:图片、排版、形状
426
+
427
+ 按照 genoffice 对标,大幅增强 Office 文件引擎和工具描述,agent 现在可以生成含图片、列表、格式化表格的工作级文档。
428
+
429
+ **Java POI 引擎**(OfficeDocService.java)
430
+
431
+ - **图片基础设施**:严格 Base64 校验 + 魔数嗅探(PNG/JPEG/GIF/BMP/TIFF,WebP 等明确拒绝)+ ImageIO 像素尺寸读取 + 等比缩放辅助
432
+ - **docx 新增**:`add image`(source 支持工作区路径 / http URL / data URL → bridge 侧解析,Java 无状态接收 imageBase64)、`add pageBreak`、列表(`list: "bullet"|"number"` + `level: 0-2` 惰性初始化 XWPFNumbering)、`set /body header/footer`、段落 `pageBreakBefore`
433
+ - **xlsx 新增**:单元格 `numberFormat`(`0.00%`、`¥#,##0`、`yyyy-mm-dd` 等)、`border`+`borderColor`(thin/medium/thick/dashed/dotted/double)、`wrapText`、`valign`(top/center/bottom)、工作表 `colWidth`(px)、`rowHeight`(pt)、`freeze`(行/列)、`add merge`(range 字符串)、`add image`(anchorCell + 图片字节 → XSSFDrawing)
434
+ - **pptx 新增**:`add image`(fit=contain/cover/stretch,cover 写 srcRect 裁剪)、`add shape`(rect/roundRect/ellipse/triangle/diamond/chevron 等 + fillColor/lineColor/lineWidth + 垂直居中文字)、`add table`(均分列宽行高 + header 加粗)、`set /slide[N] background`(十六进制背景色)、`remove /slide[N]/shape[M]`(含图片/形状)、列表(`list: "bullet"|"number"` + bullet 三级字符差异)
435
+ - **view 升级**:stats 增加 `images` 计数、图片段落/形状标注 `(图片)`
436
+ - **preview 预览**:三格式含图片标注
437
+
438
+ **bridge 侧**(aws-client-agent-mcp)
439
+
440
+ - 新建 `src/office/office-image.ts`:`officeResolveImageSource(source)` 支持三种图片来源(data:image URL / http(s) URL / 工作区路径),含魔数校验和严格格式约束;`prepareOfficeImageCommands(commands)` 预处理 office_edit 命令中的 props.source → imageBase64
441
+ - `mcp-server.ts`:`officeEdit` 新增调用 `prepareOfficeImageCommands`,使图片 URL/路径自动解析为 base64 上行 Java 引擎
442
+ - `mcp-tools.ts`:`OFFICE_EDIT_TOOL` 描述重写为三格式完整能力清单 + 图片通用规则 + 使用要点;props schema 补充所有新增字段
443
+ - 测试 `office-image.test.ts`:11 测试全通过
444
+
445
+ ## v1.9.155
446
+
447
+ _发布日期:2026-09-13_
448
+
449
+ - Office 文件能力面板化(与 pencil / draw 画布面板同款体验):Agent 可在 Dashboard
450
+ 面板中实时查看自己创建/编辑的 Word / Excel / PowerPoint 文档。
451
+ - aws-client-agent-mcp:office 工具组新增 3 个面板工具——`office_open_document`
452
+ (校验工作区文件存在并返回 file/kind/sizeKb/workspacePath,驱动前端打开面板)、
453
+ `office_close_document`(收起面板)、`office_list_open`(列出本会话已打开的文件);
454
+ `office_create` / `office_edit` 返回值补充 `kind` 字段,供前端时间线提取器维护
455
+ 文件列表(Agent 行徽标计数);工具描述同步引导「打开面板即可实时看到编辑效果,无需截图」。
456
+ - aws-mcp-server:`OfficeToolHandlers` 注册同款 3 个 handler(open 校验扩展名并归一
457
+ kind;close/list 为轻量信封),`TOOL_NAMES` 扩为 8 个——office 能力门禁
458
+ (`checkAbilityGate`)自动覆盖新工具;新增 `OfficeToolHandlersTest`(8 用例)。
459
+ - aws-dashboard:新增 `OfficePanel.vue`(docx 用 docx-preview、xlsx 用
460
+ @vue-office/excel、pptx 用 pptx-preview 本地渲染,注册 workspace watch 后经
461
+ FILE_CHANGED 事件自动刷新,头部按类型显示 Word/Excel/PPT 彩色徽标);
462
+ `useAgentTimeline` 新增 `extractOfficeDocInfo`(解析逻辑抽为可单测的
463
+ `officeTimeline.ts`,覆盖 call_tool 懒加载包裹形态);index.vue 完成桌面/移动端
464
+ 面板挂载、可拖拽宽度注册(office: 720/480/1200)与 Agent 行 Office 徽标按钮;
465
+ ChatPanel office 卡片新增「面板打开」入口(卡片载荷携带 filePath/workspacePath,
466
+ 同工作区时可直接在面板中打开原文件)。
467
+ - 修复 `writeOfficeFileAtomic` 对非法 Base64 静默解码的存量问题(Node
468
+ `Buffer.from(x,"base64")` 宽容语义),改为严格字符集 + 长度校验后再解码。
469
+
8
470
  ## v1.9.153
9
471
 
10
472
  _发布日期:2026-09-12_
@@ -12,7 +12,10 @@ type ACodeEvent = {
12
12
  type ACodeRuntimeInstance = {
13
13
  on(eventName: "event", listener: (event: ACodeEvent) => void): void;
14
14
  start(): Promise<void>;
15
- submit(message: string): Promise<void>;
15
+ submit(message: string, options?: {
16
+ skipProactiveCompaction?: boolean;
17
+ resume?: boolean;
18
+ }): Promise<void>;
16
19
  abort(): Promise<void>;
17
20
  resetContext?(): Promise<void>;
18
21
  stop(): Promise<void>;
@@ -31,6 +34,8 @@ type ACodeRuntimeInstance = {
31
34
 
32
35
  setToolPermissionPolicy?(policy: unknown): void;
33
36
 
37
+ markSkipNextCompaction?(): void;
38
+
34
39
  submitToolPermissionDecision?(requestId: string, allowed: boolean): boolean;
35
40
 
36
41
  addPluginCommands?(commands: unknown[]): void;
@@ -72,6 +77,22 @@ type ACodeRuntimeConstructor = new (config: {
72
77
  subAgentSuiteToolProvider?: (patterns: string[]) => Promise<unknown[]>;
73
78
 
74
79
  capabilityState?: (featureKey: string) => FeatureState;
80
+
81
+ capabilityToolRelay?: {
82
+ handlesGroup(group: string): boolean;
83
+ handlesTool(toolName: string): boolean;
84
+ expand(group: string): Promise<Array<{
85
+ name: string;
86
+ description?: string;
87
+ inputSchema?: unknown;
88
+ }>>;
89
+ collapse(group: string): Promise<void>;
90
+ call(toolName: string, args: Record<string, unknown>): Promise<{
91
+ ok: boolean;
92
+ result?: unknown;
93
+ error?: string;
94
+ }>;
95
+ };
75
96
  }) => ACodeRuntimeInstance;
76
97
  export declare function toAcodeEsmImportSpecifier(modulePath: string): string;
77
98
 
@@ -83,7 +104,7 @@ export declare class AcodeSdkAdapter extends EventEmitter implements BaseProvide
83
104
 
84
105
  private expandedBuiltInCapabilities;
85
106
 
86
- private dispatchableCapabilityTools;
107
+ private builtInCapabilityToolCache;
87
108
 
88
109
  private listenerWakeHooks;
89
110
  private runtimeConstructor?;
@@ -123,6 +144,12 @@ export declare class AcodeSdkAdapter extends EventEmitter implements BaseProvide
123
144
 
124
145
  private syncMcpToolsForAgent;
125
146
 
147
+ private shouldInjectCapabilityTools;
148
+
149
+ private resolveCapabilityToolPrefix;
150
+
151
+ private loadCapabilityToolsForSession;
152
+
126
153
  setBuiltInCapabilityTools(agentId: string, capability: string, action: "expand" | "collapse"): Promise<{
127
154
  sessions: number;
128
155
  tools: number;
@@ -139,10 +166,6 @@ export declare class AcodeSdkAdapter extends EventEmitter implements BaseProvide
139
166
  error?: string;
140
167
  }>;
141
168
 
142
- private pruneDispatchableCapabilityTools;
143
-
144
- private shouldInjectCapabilityTools;
145
-
146
169
  getPendingQuestion(sessionId: string): {
147
170
  toolCallId: string;
148
171
  questions: unknown[];