Files
MailUI4Agents/plugins/dsh-mail-bridge/lib/bounded.d.ts
JianFeeeee 79c4171c9d feat: L0 线协议冻结 + 附件链路修复 + 人/Agent 区分
L0 核心:
- 严格解码 Decode(DisallowUnknownFields) 全覆盖 29 个 DecodeBody 调用点
- DecodeLenient 心跳专用:容忍新字段但回报 unknown_fields
- 400 消息列出本端点接受的全部字段(jsonFieldNames 反射 tag)
- 日历 status 校验(create 补字段 + update 拦非法值)
- 新增 strictdecode_test.go 10 例 + blob/list_test.go 6 例

A-4 附件挂载回滚:checkAttachable 在 CreateMail 前校验,失败按
解挂→释放 relay→删邮件→退预算回滚,幽灵邮件这条路堵住了

A-5 反向 GC:blob.Store.List() 枚举磁盘(跳 .upload-*),
SweepUnreferencedBlobs 按 attachments + calendar_attachments 反查,
48h 年龄下限兜上传窗口。已接进每小时 sweep 循环

C 人/Agent 区分:四个读路径 + threadCols 补 from_human / to_human
(EXISTS users 判定),models.Mail 加 ToHuman。前端判据从
workspace 启发式改成显式布尔,mailCounterpart/sessionCounterpart
从 session_workspace 取 path(修 dsh@dsh 拼接 bug)

契约文档:SSE new_mail 补 4 字段(in_reply_to/from_human/
permission_mode/permission_enforcement),B-5 加 B-5.6
(Agent→Agent 不转发),B-3.4 MUST 改条件式,心跳补 mode_enforcement
+ unknown_fields,demo 死链修复 + from_human 检查
验收清单加 Agent→Agent 负向对照项
2026-09-06 15:18:06 +08:00

53 lines
1.7 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 类型声明 —— 实现在 bounded.js三平台共用逐字节相同
*
* DSH 插件是 TypeScriptimport 一个纯 JS 模块需要这份声明才能过 tsc。
* 声明与实现分开维护有分叉风险,所以这里只描述**插件真正调用的**那些成员,
* 少写一个方法会在编译期被抓到,而多写一个不存在的方法不会 —— 后者靠
* bounded.test.mjs 里那些逐方法的断言兜住。
*/
/** 已投递邮件 id 的记忆上限。 */
export const MAX_TRACKED_MAILS: number;
/** 会话级映射的条目上限。 */
export const MAX_TRACKED_SESSIONS: number;
/** 有界 Map超过上限时丢弃最久未访问的条目。 */
export class BoundedMap<K, V> {
constructor(limit: number);
readonly limit: number;
readonly size: number;
/** 累计淘汰条数,观测用。 */
evicted: number;
has(key: K): boolean;
/** 取值并刷新活跃度。 */
get(key: K): V | undefined;
/** 取值但不刷新活跃度。 */
peek(key: K): V | undefined;
set(key: K, value: V): this;
delete(key: K): boolean;
clear(): void;
keys(): IterableIterator<K>;
values(): IterableIterator<V>;
entries(): IterableIterator<[K, V]>;
[Symbol.iterator](): IterableIterator<[K, V]>;
}
/** 有界 Set超过上限时丢弃最久未访问的成员。 */
export class BoundedSet<T> {
constructor(limit: number);
readonly limit: number;
readonly size: number;
evicted: number;
/** 判断存在并刷新活跃度。 */
has(value: T): boolean;
/** 判断存在但不刷新活跃度。 */
peek(value: T): boolean;
add(value: T): this;
delete(value: T): boolean;
clear(): void;
values(): IterableIterator<T>;
[Symbol.iterator](): IterableIterator<T>;
}