# Changelog

本文件记录 aws-runtime-bridge 各版本的发布说明，随 npm 包一并分发（package.json
files 白名单），供调度中心「查看本次更新内容」弹窗按 `## v<version>` 精确切片
展示。发布新版本时须在仓库中先写好 `## v<version>` 段（prepack-guard 校验缺段
即阻断发布）；Bridge 自更新成功后的运行时追加仅作为包内缺段时的兜底。

## v1.9.153

_发布日期：2026-09-12_

- 工具集懒加载（Lazy Tool Expansion）全链路接入：受管控的大工具集（pencil / draw 各 15 个、
  启动项 9 个、招聘、浏览器 / 桌面桥接等）由「开启即全量暴露」升级为三态能力开关——
  disabled（禁用）/ collapsed（收纳：工具不出现在工具列表，需先 expand_tools 展开）/ expanded（展开：工具全量直接可见），
  降低初始上下文占用。
  - aws-mcp-server：`t_agent_ability_switch` 新增 `ability_state` 列（update.sql v1.30.0 迁移，存量行按
    `enabled` 归一：1→expanded / 0→disabled，既有 agent 行为不变），`AgentAbilitySwitch` 实体 / Mapper /
    Service 三态读写，`enabled` 布尔列写入时同步回填保持旧读取兼容。缺省口径（DB 无行）：
    browser / desktop / agentSys.launchItem / agentSys.hire 默认 collapsed（已授权但收纳），其余默认 disabled（显式授权）。
  - aws-client-agent-mcp：新增常驻元工具 `expand_tools` / `call_tool`（不属于任何受控组，收纳组始终有展开与调度入口）。
    ListTools 按三态过滤；展开不再把工具注入 runtime exposedTools、不再推送 tools/list_changed（ListTools
    载荷字节级稳定，LLM provider 前缀缓存全程命中），改为授予 call_tool 调度授权并把工具定义
    （name/description/inputSchema）随 expand 结果下发，agent 当轮即可 call_tool 调用；执行期纵深防御：
    disabled 拒绝、collapsed 未展开拒绝（同时兜住原生工具名直调的旁路）。配置为 expanded 的组不可在会话中
    收起（由用户决定）、重复展开按幂等 already-expanded 返回。browser / desktop 桥接能力经 HTTP 回传
    bridge 新端点 `/runtime/sessions/:agentId/capability-tools[/call]`（X-Runtime-Token 鉴权），call 超时
    55s < runtime mcpToolTimeoutMs 60s。
  - acode runtime：系统提示词注入能力清单（新增 capability-prompt.ts）——agent 知道哪些能力已展开 /
    已收纳 / 未开启，「我没有绘图工具」类请求会主动提示用户去能力配置开启；启动期 env 兜底改为携带三态值
    （AWS_LAUNCH_CONFIG_TOOLS / AWS_HIRE_TOOLS / AWS_DRAW_TOOLS 等），消除首次 listTools 早于 token 就绪时
    env 兜底把收纳组全量暴露的窗口。
  - aws-dashboard：能力配置弹窗新增三态选择器（新组件 FeatureStatePicker.vue），capability-features.ts
    升级为三态模型（agentSys 主开关禁用时子能力级联禁用，跨层与 Java / bridge 口径一致）。
- Provider 请求失败不再默认无限重试：requestRetryCount 缺省由无限改为 0（持续 4xx 等不可恢复错误不再空转），
  错误信息从响应载荷提取 code + message 直接抛出，不再被静默重试吞掉；需恢复内部重试时在 config 显式配置
  requestRetryCount（有限值或 -1 无限）。
- 消息中心「完整请求体」JSON 树视图：新增 JsonTreeNode.vue（层级树形展示、逐层懒展开）与 jsonRepair.ts
  （截断 JSON 修复兜底，修复后可解析即以树形呈现），60KB 截断请求体支持全文搜索——输入防抖 200ms、
  命中计数、回车逐个定位、自动展开命中祖先链并高亮，未解析为 JSON 时回退原始文本。
- 图片预览缩放：新增 useImageZoom.ts（滚轮 / 双指缩放、拖拽平移、双击还原、缩放工具栏），接入 ChatPanel
  全屏图片预览与 MessageInput 附件预览。
- draw 卡片预览自愈：新增 drawCardPreview.ts 幽灵渲染管线——服务端从未渲染的 draw 消息卡片以发送者
  （owner）身份补渲染生成预览，渲染成功事件即时补拉；pencil / draw 卡片渲染图 30s 定时补拉自愈
  （消息离开列表即停止），有图即终态。
- 杂项：.gitignore 补充审查 / 调试期临时产物（tsc / TAP 输出、一次性统计脚本、本地 AI 助手工作区）；
  修复 draw.ts 头注释在编辑中被截断损坏的问题。

## v1.9.152

_发布日期：2026-09-10_

- 绘图（draw.io）能力全链路接入：新增「绘图 (draw)」能力开关（默认关闭，显式授权语义，同 desktop/hire/pencil），
  Agent 可创建 / 编辑 / 导出 / 分享 draw.io 绘图文档，Dashboard 以独立面板内嵌官方 draw.io 编辑器。
  - aws-mcp-server：新增 `t_draw_doc`（doc_id 唯一，`doc_xml` 为完整 `<mxfile>` 权威内容）、
    `t_draw_doc_member`（协作权限 read|write）、`t_draw_doc_change`（事务型 Outbox 变更日志，与内容写入同事务
    落行，每 doc 保留最近 200 版；变更通知只作唤醒信号，丢失/离线时经 `draw_get_changes(sinceVersion)` 追赶）；
    `DrawDocController` 暴露 `/api/draw/*`（docs / doc / doc ops / doc render / counts / doc members）；
    `DrawDocMapper` 以 `doc_id + version` 乐观锁 CAS 写回，消除 check-then-act 竞态窗口。
  - aws-runtime-bridge：新增 `DRAW_FEATURE_KEY` 能力标识与 `AWS_DRAW_TOOLS` 启动期 env 兜底；
    `aws-client-agent-mcp` 注册 `draw_*` 工具组（create/list/open/close/get_diagram/get_changes/create_cells/
    update_cells/delete_cells/delete_document/rename_document/share_document/revoke_share/export_document），
    ListTools 按开关注实时过滤，服务端 `/mcp/call` 另有权威校验；`draw_export_document` 只回传
    savedTo/sizeKb 等元信息，docXml 不回流 agent 上下文。
  - aws-dashboard：新增 `DrawPanel.vue`（iframe 加载自托管 draw.io，经 embed postMessage 协议 load/autosave/export）；
    会话列表新增绘图徽标（仅 Agent 有绘图文档时显示，附数量角标）；文档列表改为工具事件驱动刷新
    （`drawRevision` 信号 + 防抖），取代每 2.5s 高频轮询 `/api/draw/docs`，仅在 WS 断线/未覆盖时低频兜底；
    面板宽度与收缩优先级纳入 `draw`；移动端新增绘图覆盖层。
  - 自托管编辑器资源置于 `aws-dashboard/public/draw/`（官方 draw.war 解包，v31.4.4，含 README 说明升级与授权注意），
    并加入 Service Worker `globIgnores` 排除预缓存（app.min.js 9MB+、integrate.min.js 22MB+ 体积超预缓存上限，
    仅打开绘图面板时按需加载）。
- 消息卡片：`send_group` / `send_private` 支持附带 `card`（`{type:pencil|draw,docId,title?,description?}`）
  文档引用卡片，`send_group`/`send_private` 工具描述同步说明。读取模型为「凭 docId 可读」——任何 Agent 拿到 docId
  即可用 `pencil_get_tree` / `draw_get_diagram` 读取，无需被邀请；写操作仍按 owner / 协作成员权限校验。
  为此 `PencilDocService` 的读取路径（readDoc / getTree / getRender / getChanges）去掉「非 owner/成员即拒绝」
  的拦截，`resolvePermission` 返回 null 时读取归一为 read；新增 `validateCardDoc` 供卡片发送前确认文档存在。
  卡片只读引用不写入 `*_doc_member`，因此不改变协作者列表、shared 标记与文档列表徽标。
  `t_direct_message` / `t_group_message` 新增 `card` 列（LONGTEXT，防富内容截断），
  `GroupMessageService` / `DirectMessageService` 增加带卡片的 8 参重载（原 7 参签名保留并委托，向后兼容），
  卡片 JSON 落库前校验合法性（非法 JSON / 非对象直接拒绝，解析失败按无卡片降级渲染历史消息）。
  Dashboard 侧 `ChatPanel.vue` 新增消息卡片渲染（仿小程序卡片：有渲染图显示预览、否则占位封面，
  带类型徽标与标题，点击直接打开对应绘图 / 画布面板）。
- 消息内容扩容 + 载荷剥离：`t_direct_message` / `t_group_message` / `t_meeting_message` 的 `content`
  由 TEXT(64KB) 扩为 LONGTEXT——富格式内嵌图片 base64（压缩后数百 KB ~ 数 MB）在 MySQL 非严格模式下会被
  静默截断到 64KB，Agent 经 `poll_message` 只拿到残缺 JSON、`JSON.parse` 失败，表现为 agent 看不到图
  （`[image omitted]`）。配套在 acode runtime 的 poll 结果中剥离 directMessages/groupMessages 内嵌的
  图片与附件 base64，仅保留可读文本摘要，避免 base64 以纯文本污染后续上下文。
  Dashboard 发送侧新增 `buildRichAttachmentContent`——图片附件以内嵌 base64 随消息下发（Agent 直接以
  多模态 data URL 读取，无需 fetch 图片 URL / 落盘再读），非图片附件仍为 URL 描述（语义等价 `[文件: ...]`），
  这正是 content 必须扩容到 LONGTEXT 的直接原因。
  新增 `ACODE_IMAGE_DIAG=1` 开启的图片注入诊断日志（默认关闭，异步追加且吞掉 I/O 异常）。
- 发布前修复：群消息仅卡片（无正文）时 Java 侧校验误拒绝，已与 mcp-server 侧「content/attachments/card
  至少其一非空」对齐；`draw_export_document` 工具 schema 与实现统一（仅 xml/drawio，svg/png 等渲染
  待阶段 2 管线，描述不再误导）；`DrawPanel` 的 postMessage 接收仅接受同源自托管编辑器消息。
- 原子写健壮性：`atomicWriteFile` 改用 `renameFileWithRetry`——Windows 下 `fs.rename` 可能因目标被瞬时占用
  （杀毒扫描 / 并发句柄）抛 EPERM/EBUSY/EACCES，按 40ms 递增退避重试 3 次，降低实际运行与测试并发下的假失败。
- 面板最大化（脱离为弹框）：新增 `PanelDetachButton.vue`，终端 / 时间线 / 工作区 / 上下文 / 待办 / 后台任务 /
  子 Agent / 浏览器 / 画布等侧窗面板可一键脱离为弹框最大化，再点恢复回侧窗；脱离态保留强调色提示，
  标签栏场景支持右对齐 sticky 固定，移动端隐藏（已是全屏覆盖层）。
- 桌面工具 origin 判定明确化：`injectRememberedOrigin` 以 `originSet()`（非 null 且非 undefined）替代
  `!= null` 判断，语义等价并消除隐式类型收窄告警。
- 轮询降频：在线成员列表的断连兜底轮询由 5s 放宽到 30s（`ONLINE_CHANGE` WS 事件已支持增量更新，
  断连时仅需兜底同步，无需高频拉取）；绘图文档列表同样由固定间隔轮询改为工具事件驱动。
- 测试：vitest 单测超时由 30s 放宽到 90s——本机并行跑完整套件（103 个文件、真实 git/子进程）时 CPU 争用
  可把单个用例拖慢数倍，避免负载型假失败掩盖真实回归；补齐 `draw_*` 工具、git 路由与 acode runtime 用例。

## v1.9.151

_发布日期：2026-09-07_

- 工作区 LSP（TypeScript/JavaScript 语言服务）全链路接入：Dashboard 文件编辑器可对实例工作区的
  TS/TSX/JS/JSX 文件提供语义级定义跳转与引用查找，不再依赖字符串搜索。
  - runtime-bridge：新增 `typescript-language-server` 与 `typescript` 运行时依赖；`src/services/lsp-stdio-bridge.ts`
    封装 LSP stdio 帧编解码（Content-Length 增量解析、畸形流防护）与子进程桥（自动解析 tls 入口、注入
    TSSERVER_PATH 保证 tsserver 可启动）；`src/routes/lsp.ts` 暴露 `/ws/lsp` WebSocket——单 workspace 单进程
    复用、60s 空闲回收、复用进程再次收到 initialize 时重建进程（避免 tsserver 沿用旧文档状态陷入
    "No Project"、跳转恒空）。
  - aws-mcp-server：`WorkspaceLspProxyService` 在 HTTP 侧校验 workspace 归属后签发 5 分钟一次性令牌
    （TTL 放宽覆盖慢建连、消费即失效防重放）；`WorkspaceLspWebSocketHandler` 把浏览器 `/ws/workspace-lsp/{token}`
    双向转发到 bridge `/ws/lsp`，隧道模式经 BridgeTunnelService 虚拟流、直连模式带 X-Runtime-Token 握手头；
    `FileBrowserProxyService.resolveWorkspaceLspBridge` 解析 bridge 目标（保留隧道实例前缀）与鉴权令牌。
  - aws-dashboard：`workspaceLsp.ts` 封装 CodeMirror LSP 会话——同一 bridge+workspace 仅建立一条 WS 与
    一次 initialize，切换文件仅替换 per-file 句柄（didOpen/didClose），避免重复 initialize 导致跳转失效；
    补充库未内置的 textDocument/references 与 definition 请求、自定义 transport 占位。`WorkspacePanel.vue`
    接入 LSP 扩展、Ctrl+点击/快捷键跳转定义与引用查找；对 Windows 盘符修正 file:// 三层斜杠与 URI 归一比较。
- 确认弹窗交互调整：确认按钮移至取消按钮左侧并作为默认焦点，Enter 键即触发确认，Tab 焦点循环顺序与
  视觉排布一致（确认左、取消右）。
- 工作区面板媒体预览：图片 / SVG / 视频预览改为经下载接口生成 object URL 展示，支持 B 站式画面缩放
  （Ctrl+滚轮 / 缩放按钮）与按住空格+拖动平移放大后画面，双击复位；预览状态栏同步显示媒体尺寸与状态。

## v1.9.150

_发布日期：2026-09-07_

- 长文引用（LTR）全链路化：私信超长文本粘贴不再全文进消息，改为引用上传——MCP 与 bridge
  新增 `/api/ltr/upload`，把大文本片段落盘到目标机器 `<系统临时目录>/aw-temp/LTR/YYYYMMDD/{uuid}.txt`
  （单篇 ≤512KB，按天归档、写入时顺带清理超 7 天的目录），消息只传 `[bridgeName:绝对路径]` 引用，
  agent 用 read_file 读取全文，避免超长文本撑爆消息表（MySQL TEXT 65535 字节）与 LLM 上下文。
  前端配套：粘贴转胶囊 token（发送时统一上传 + 进度提示、hover 预览全文、未上传时随草稿保留并在
  切换会话后恢复）；LTR 图标与 capsule 颜色跟随主题。
- 后台命令僵尸状态根治（L1–L4）：读路径对账（面板每次刷新先翻"磁盘 running 但本进程内存不命中"
  的孤儿为 killed(runtime_crashed) 并原子回写）；状态写入事务化（per-agent 串行写链消除并发
  heartbeat/finalize 的丢失更新）；生命周期补齐（exit+close 双监听，exit 后 2s 宽限强制 finalize，
  孙进程持续持有管道不再留下永远 running 的状态；进程退出时落盘 killed(process_exit)）；running
  任务心跳节流落盘（5s 或输出增量 64KB 触发）+ 启动时全量扫描所有 agent 目录孤儿。
  面板改为只展示"真后台/运行中"命令，前台同步执行、从未转后台的命令不再占用面板。
- open-pencil CLI 多路径探测：pencil_export_document 依次探测 `AWS_OPEN_PENCIL_HOME` →
  `<工作区>/open-pencil` → 仓库相对路径 → 逐级向上回溯，未命中时错误信息列出全部探测路径；
  README 补充生产部署前置（工作区锚点或环境变量二选一，须用仓库构建版 CLI 以支持 GraphSnapshot）。
- create_meeting 有效性预检：角色占坑席位无可认领实例（如该角色唯一实例就是创建人）、或创建人把
  自己重复加入受邀成员时直接返回错误，不再进入无谓的等待。
- 群消息撤回语义修正：发送者本人游标越过已撤回消息仍可撤回；他人游标越过则拒绝撤回（撤回不再
  被"阅读过即作废"误伤）。两项修复均补齐单测。
- 输入框编辑体验：自建 undo/redo 栈（浏览器原生撤销对 contenteditable + 手动 DOM 不可靠），
  mention / command / LTR 原子 token 可整体撤销；@mention 输入确认后自动把自由文本原地转换为
  mention 高亮 token（`--cp-mention-highlight-*` 亮暗主题双套）；「调用式回复」更名为「强调回复」。
- 文件下载回源文件名：下载/预览响应 Content-Disposition 改用上传时的原始文件名（URL name 参数），
  并清洗控制字符、引号、分号与路径分隔符，避免 header 畸形与路径穿越。
- 消息中心：项目在线成员列表去重（同一 agent 绑定多实例时不再重复头像）。
- 健壮性：后台命令状态持久化失败仅告警不再崩进程；LTR 上传上游失败统一 502 且不回传内部错误细节。

## v1.9.149

_发布日期：2026-09-06_

- 项目头像支持裁剪：PNG / JPG / WebP / GIF 位图在选文件或点击现有图标后进入方形裁剪
  （拖动调整位置、滚轮或滑块缩放），以 512×512 输出确认保存；SVG / ICO 等无法用
  canvas 裁剪的格式仍直接按原文上传；favicon 预览复用已下载文件，点击直接进入裁剪，
  避免二次网络下载。
- Pencil 嵌入式画布跟随 Dashboard 明暗主题：iframe URL 携带 theme 参数，主题切换时
  经 pencil:theme 消息同步画布配色，不再固定白底。
- 修复浅色主题下消息中心 agent 上下文用量 / 待办 / 子代理按钮的选中态样式：选中项
  不再被浅色覆盖规则盖成深色文字（`:not(--active)` 限定浅色覆盖范围，避开高特异性
  覆盖选中态）。
- 「限制操作」入口从输入框左侧常驻盾牌图标移回「+」菜单（撤销 v1.9.148 的常驻盾牌，
  并移除权限档位拉取与盾牌着色逻辑，简化输入框布局）。
- 版本升级 1.9.148 → 1.9.149：Bridge 本包无运行时代码改动，随前端 Pencil / 消息中心
  更新一并发布。

## v1.9.148

_发布日期：2026-09-06_

- Pencil 导出 savePath 不再限制在工作区内：绝对路径（如 D:\exports\hero.svg 或
  用户 Downloads）直接使用，相对路径仍基于工作区根解析——导出交付物可落盘到
  任意位置。
- Pencil 渲染缓存升级为原始分辨率（最长边 ≤8192 内不缩放，此前 1280），agent
  pencil_export_image 与人工导出拿到原图；导出等待超时 8s→15s；升级规格后对旧
  低分辨率缓存自动补渲一次。
- Pencil 画板编辑锁：有写权限时默认锁定只读，点击解锁才可编辑；编辑中画布被
  agent 工具/协作端推进版本时自动回锁并加载最新快照，防止基于旧版编辑整份覆盖
  他人写入（脏写）；写权限被收回时强制回锁。
- 输入框新增终端式 ↑/↓ 发送历史回溯（按会话隔离，Esc 退出并恢复进入前的草稿）；
  「限制操作」入口从「+」菜单移到输入框左侧盾牌常驻图标，存在授权/禁止档位时
  显示绿色。
- 修复：侧板拖拽经过 iframe（画布/终端）宽度冻结且无法结束的问题（拖拽期间禁用
  容器内 iframe 鼠标事件，窗口失焦自动结束拖拽）；全局设置菜单横向滚动两端留白
  被吞掉的问题；项目头像弹窗标题显示项目名而非 projectId。
- 更新健壮性：包内 CHANGELOG 缺目标版本段时继续尝试 ~/.aws-bridge 下运行时追加
  的候选文件；更新成功后的发布说明追加改为 await 在重启前完成，版本号优先取 npm
  刚落盘的 package.json。
- 发布护栏：prepack-guard 校验 CHANGELOG.md 必须含当前版本段（缺段阻断发布），
  verify-pack-contents 将 CHANGELOG.md 列为必需 payload。

## v1.9.147

_发布日期：2026-09-06_

- Pencil 设计画布全栈接入：t_pencil_doc 权威存储（迁移 v1.26.0~v1.26.3）与协作者
  权限、MCP pencil_* 工具（AWS_PENCIL_TOOLS 兜底可见性过滤）。
- 桌面自动化增强：nuphus-mcp 0.1.12 的 desktop_window_activate 先还原再激活，修复
  托盘/最小化窗口无法激活的问题；新增 som.rs 与 UIA 安全增强。
- acode 新增 runtime-environment；后台命令/文件/图片工具优化，AcodeSdkAdapter 与
  浏览器池稳定性改进。
- 修复：CHANGELOG.md 自本版本起随包分发。此前发布说明依赖"执行更新的旧进程"运行
  时追加，旧版 Bridge（≤1.9.145 无此代码）执行更新会导致新版本弹窗无发布说明可
  展示，只能回退安装过程日志。

## v1.9.146

- 新增「本次更新内容」展示：将更新弹窗从安装过程日志（updates.log）切换为版本
  发布说明（CHANGELOG.md），让用户看到本次版本相对变更的要点，而非 npm 安装
  过程噪声。
- 更新成功重启后，由 Bridge 自动在 CHANGELOG.md 顶部追加当前版本段。
- 当目标版本未找到发布说明时，弹窗自动回退展示 updates.log（安装过程日志）并
  给出提示。

<!-- append-new-version-above -->
