Conversation
deliver() 新增可选 onRawRead 钩子:SSE transport 每次 reader.read() 后回调原始字节信息(含被解析层跳过的 ': ' keepalive 注释行),供排查「连接静默期里有没有字节真到达」。默认不传则行为完全不变,SSE 解析逻辑未动,非破坏。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
deliver() 新增可选 compressRequest:body 超阈值(默认16KB)且运行时有 CompressionStream 时, gzip 压缩请求体再发, 带自定义头 X-Amsg-Request-Encoding: gzip(非标准 Content-Encoding, 避开 CDN/代理双重解压), 由接收端 gunzip。不传=关=行为不变, 不可用则优雅回退明文。治大 body 在慢上行链路上传超时丢消息, 上下文全量不变。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…nsistency
- amsg-instant README: fix SW dedup example to gate on `messageKind !== 'tool_request'` (was the removed `data.type !== 'tool-request'`, which skipped the dedup it demonstrates)
- amsg-sw: remove 5 stray `console.error("RESTORE ERROR")` debug logs; drop unreachable listMultipartPending/listMultipartDone/listStoreRecords
- amsg-client: read the SSE content-type header once instead of twice
- amsg-server: name the 1500ms inter-push delay `SLEEP_BETWEEN_MESSAGES_MS` (matches amsg-instant)
- changelogs: unify amsg-shared H1 with the other packages; fold amsg-instant's misplaced "Unreleased" CONTINUE_NOT_AVAILABLE fix into its 0.8.0-next.0 entry
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… to caret - add @changesets/cli + .changeset/ config (independent versioning, public access, examples ignored) - relax the @rei-standard/amsg-shared dependency in client/instant/server/sw from exact 0.2.0 to ^0.2.0 - release.yml: switch from per-package tag triggers to push-to-main + changesets/action (Version Packages PR → publish), preserving the Node pin, OIDC trusted publishing, and npm provenance - root package.json: drop publish:workspaces, add version/release scripts - remove bump.mjs (stale hardcoded version snapshot) and scripts/publish-workspaces.mjs (superseded by changeset publish) - README/standards: describe the caret range + Changesets flow; drop the per-release version column; add RELEASING.md Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
active-messaging-api: - apiUrl 规范化按实现改正(实现会幂等补全 /v1、/chat/completions,原文写成「不补全」) - 新增 §6.5 schedule-message 的 instant 同步发送、§6.6 投递裁决契约 - §9 错误码补全实际存在的顶层码、新增 §9.1 处理阶段嵌套码;INTERNAL_SERVER_ERROR 更正为 INTERNAL_ERROR - 对齐实现版本号刷新到当前一轮 service-worker-specification: - 版本 v2.1.0 → v2.3.1,§15 补 v2.3.0 / v2.3.1 变更日志 - 修 §4.1 失效锚点;注明手写模板通知默认值与 SDK createNotificationFromPayload 不同 server/README:apiUrl 段同 active-messaging-api 改正 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
changeset version 只改 package.json 与 CHANGELOG,不动 package-lock.json。 本仓库提交锁文件且 CI 用 npm ci 严格校验,导致合并 Version Packages PR 后下一次 npm ci 会因锁文件里的 workspace 版本号过时而失败、阻断发布。 release workflow 的 version 步骤改跑 npm run version (changeset version && npm install --package-lock-only),抬版后一并刷新锁文件 由 changesets/action 提交进同一个 PR。RELEASING.md 补充该步骤说明。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
带 X-Amsg-Request-Encoding: gzip 头的请求先 gunzip 再解析,未带该头按原样读取
(行为不变);CORS 预检白名单加入该头,否则跨域 preflight 会拦掉压缩请求。
这样 @rei-standard/amsg-client 的 deliver({ compressRequest }) 能直接发到
amsg-instant 的 /instant、/continue,无需自建后端解压。
测试:gzip 回环走通、声明 gzip 但实为明文返回 400、CORS 头含该字段。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…t bug 把 server / instant 各自重复的实现上提到 @rei-standard/amsg-shared,三个包共用一份: - avatarUrl 校验(validateAvatarUrl + isValidUrl + 2048 上限) - VAPID subject 规范化(normalizeVapidSubject) - reasoning 私有思考过滤(readReasoningContent / stripReasoningTags / <think> 正则) 顺带修正与对齐: - server 的 VAPID subject 此前只认 mailto:,会把 https: subject 拼成 mailto:https://...;改用 shared 实现后,https: subject 原样保留(RFC 8292 允许)。 - client 的 avatarUrl 本地预检改用 shared 校验,非法(非 data:)URL 现在也会本地 console.warn + 置空,与 server / instant 对齐。 - 清理引用已删旋钮的 JSDoc(shared ReasoningPush 的 reasoningSplitPattern、 server 的 splitMessageIntoSentences / validateSplitPattern lockstep 说明)。 测试:shared helpers.test.mjs(含 VAPID https: 守卫、<think> 剥离隐私守卫)、 client avatar-url.test.mjs(非法 URL 置空的行为变化锁定)。 changesets:shared minor、client minor、server patch。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- README / 规范 / changeset 过一遍自然中文,去掉机械排比、显性语篇标记等 AI 痕迹 - 砍掉自造词「三轴 / 推送契约 / 正交」(中英文同步),保留标准词「判别联合 / discriminated union」「优雅降级」与 contract 含义的「契约」 - §6.3 标题随之更名,同步修正 service-worker-specification 里的锚点链接 - 根 README 去掉读者用不到的内部版本区间说明;VERCEL 文档环境变量「可选」去重 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
There was a problem hiding this comment.
Code Review
This pull request introduces Changesets for versioning and release management, refactors shared validation and utility functions (such as validateAvatarUrl, normalizeVapidSubject, and reasoning tag helpers) into @rei-standard/amsg-shared for cross-package alignment, and adds support for optional request body gzip compression (compressRequest) and raw SSE stream telemetry (onRawRead) in the client. A critical bug was identified in the instant handler where calling .toLowerCase() on a potentially missing X-Amsg-Request-Encoding header will throw a TypeError and crash all uncompressed requests.
Important
The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.
把
dev上累积的 amsg 改动合到main。pending changesets 会让 Release workflow 开「Version Packages」PR 完成发版。主要变更
amsg-sharedvalidateAvatarUrl/normalizeVapidSubject/ reasoning 过滤三组共享纯函数,server / instant / client 复用同一份规则amsg-serverhttps:形式(RFC 8292)amsg-instantX-Amsg-Request-Encoding: gzip)amsg-clientavatarUrl本地预检改用 shared 统一校验,与 server / instant 对齐client 的
compressRequestbody gzip、onRawRead遥测 hook 等也在本批 commit 里。文档润色
提示
base
main目前比 dev 多 3 个 commit(PR #8 等),合并时走 merge commit。🤖 Generated with Claude Code