@agentunion/fastaun 0.5.36 → 0.5.37

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.
package/CHANGELOG.md CHANGED
@@ -6,11 +6,19 @@
6
6
 
7
7
  ---
8
8
 
9
- ## 0.5.36 — 未发布
9
+ ## 0.5.37 — 未发布
10
10
 
11
- 对照 `0.5.35` 仓库基线 `80cf7cf49` 整理当前源码增量;四端实现、配套服务依赖及验证范围见 [parity 0.5.36](../python/CHANGES_FOR_PARITY.md#v0536)。
11
+ 对照 `0.5.35` 仓库基线 `80cf7cf49`,合并原 `0.5.36` 未发布草稿与后续 Node SDK 增量;四端实现、配套服务依赖及验证范围见 [parity 0.5.37](../python/CHANGES_FOR_PARITY.md#v0537)。
12
12
 
13
- ### EventService 消息大小
13
+ ### 派生密钥缓存与重连削峰
14
+
15
+ - 固定加密参数下按 seed 在进程内复用 PBKDF2 主密钥,向存储实例返回独立 Buffer;身份存储、Token 存储及 seed 迁移复用派生入口,不改变既有加密格式。
16
+ - 保留指数退避,等待时间改为全幅抖动;同一运行上下文、同 issuer 最多两个恢复在途,启动间隔随机为 250–500 毫秒,普通重连与 UDP 恢复共用限制。
17
+ - 重连优先复用网关发现缓存,按失败轮次或迁移需求刷新,移除额外 `/health` 探测;成功连接后的例行恢复首批延迟 30–60 秒、任务间隔 1–5 秒,凭据扫描也延迟启动,旧连接剩余任务可取消。
18
+
19
+ ### EventService 注册与消息大小
20
+
21
+ - Bus 服务注册改为连接会话绑定,校验 `session_bound: true`,移除定时续租和按旧 TTL 到期关闭的逻辑;离线停止承接,ready 后重新注册,旧连接的迟到注册结果不会恢复服务。PubSub 发布者/订阅者业务租约保持原逻辑,需配套支持会话绑定注册的 Message 服务。
14
22
 
15
23
  - 移除发布、Bus 受理和订阅接收的独立 64 KiB 限制,事件沿用普通 RPC/`message.send` 的完整 WebSocket 报文上限 `1_000_000` 字节;JSON、控制信封和 E2EE 开销计入该上限,事件正文可用空间相应减少。
16
24
  - 收发令牌桶的字节突发额度提高至 `1_000_000`,按实际序列化字节数扣费;持续速率、队列数量/总字节、TTL、去重和背压约束继续生效。旧 `max_event_bytes`/`event_bytes` 不再用于单事件大小判断。
@@ -18,18 +26,24 @@
18
26
  ### Ownership 共识缓存与证书验签
19
27
 
20
28
  - `checkOwnershipConsensus` 和 `AIDStore.resolve` 的 Ownership 查询复用已达共识的本地持久快照,保存共识时的 agent.md 正文及 `owner_md_sha256`,新 Client/重启后可恢复。
21
- - 观察 agent.md ETag、Owner 文件摘要和观察代次,变化后重新校验;非共识、缺失或本地材料不一致时继续联网。持久化失败或异步查询期间观察变化的结果不进入可复用缓存。
29
+ - 观察 agent.md ETag、Owner 文件摘要和观察代次,变化后重新校验;兼容参数 `force` 不再强制击穿有效成功缓存,非共识、缺失或本地材料不一致时继续联网。持久化失败或异步查询期间观察变化的结果不进入可复用缓存。
22
30
  - 历史 Ownership 文件的主签、附签接受有效的 `active_signing`/`verify_only` 证书,继续核验 AID、指纹、有效期、信任链和撤销状态;新签 owner.md/agent.md(含群/组织及清理路径)仍须使用 `active_signing`。
23
31
 
24
- ### 消息交付与 UDP 待机
32
+ ### 消息交付与 ACK
25
33
 
26
34
  - 群 inline 消息可在同一 namespace 内保留多条待确认记录;累计 ACK 仅完成已提交项,减少因前一条待 ACK 而退回 Pull 的情况。
27
- - 已确认水位可消解同代际内尚未发送的冗余后台 ACK;P2P 在线提交覆盖自动补拉目标时减少重复 Pull,并保留补发 ACK 责任。
35
+ - 后台尾 ACK 优先复用已排队的自然 forward Pull;已确认水位可消解同代际内尚未发送的冗余后台 ACK,保留其他游标和新连接的确认责任。P2P 在线提交覆盖自动补拉目标时减少重复 Pull,并保留补发 ACK 责任。
36
+ - 群 Pull 实际发送前读取最新已提交 ACK;持久 forward 补拉不再无条件先探测 volatile,改为按提示独立恢复;分类控制流空页无游标变化时不再重复 ACK 或保存状态。
37
+
38
+ ### UDP 待机
39
+
28
40
  - UDP 租约按服务端期限与当前心跳周期的 2.5 倍取较短值,先应用心跳回复的新周期再续租;移除固定对账重连及连续三次超时唤醒条件,由租约/ticket 期限和业务唤醒恢复 WebSocket。
41
+ - 后台尾 ACK 等待重试时保持 WebSocket;旧 UDP socket 的迟到错误不会唤醒新一轮待机。
29
42
 
30
43
  ### 版本与验证
31
44
 
32
- - 包配置、锁文件、运行时及相关测试引用统一为 `0.5.36`;本轮 Ownership 回归 460 项、实体发布专项 3 项及类型检查通过。版本一致性与 Browser 加密 conformance 等沿用前阶段记录;未运行功能全量或线上 E2E。
45
+ - 包配置、锁文件、运行时及相关测试引用统一为 `0.5.37`。2026-11-15 版本升级阶段,跨 SDK 版本一致性测试 1 项及 Node 类型检查通过。
46
+ - 前阶段 Ownership 460 项和实体发布专项 3 项的通过记录见 parity,不作为本次整理重新执行的结果;未完成 Node 功能全量或线上 E2E,尚未发布或部署。
33
47
  - 配套服务继续按单实例范围记录;原生 MailClient 的整体端到端验收状态沿用 0.5.35 边界。
34
48
 
35
49
  ## 0.5.35 — 2026-11-12
@@ -6,11 +6,19 @@
6
6
 
7
7
  ---
8
8
 
9
- ## 0.5.36 — 未发布
9
+ ## 0.5.37 — 未发布
10
10
 
11
- 对照 `0.5.35` 仓库基线 `80cf7cf49` 整理当前源码增量;四端实现、配套服务依赖及验证范围见 [parity 0.5.36](../python/CHANGES_FOR_PARITY.md#v0536)。
11
+ 对照 `0.5.35` 仓库基线 `80cf7cf49`,合并原 `0.5.36` 未发布草稿与后续 Node SDK 增量;四端实现、配套服务依赖及验证范围见 [parity 0.5.37](../python/CHANGES_FOR_PARITY.md#v0537)。
12
12
 
13
- ### EventService 消息大小
13
+ ### 派生密钥缓存与重连削峰
14
+
15
+ - 固定加密参数下按 seed 在进程内复用 PBKDF2 主密钥,向存储实例返回独立 Buffer;身份存储、Token 存储及 seed 迁移复用派生入口,不改变既有加密格式。
16
+ - 保留指数退避,等待时间改为全幅抖动;同一运行上下文、同 issuer 最多两个恢复在途,启动间隔随机为 250–500 毫秒,普通重连与 UDP 恢复共用限制。
17
+ - 重连优先复用网关发现缓存,按失败轮次或迁移需求刷新,移除额外 `/health` 探测;成功连接后的例行恢复首批延迟 30–60 秒、任务间隔 1–5 秒,凭据扫描也延迟启动,旧连接剩余任务可取消。
18
+
19
+ ### EventService 注册与消息大小
20
+
21
+ - Bus 服务注册改为连接会话绑定,校验 `session_bound: true`,移除定时续租和按旧 TTL 到期关闭的逻辑;离线停止承接,ready 后重新注册,旧连接的迟到注册结果不会恢复服务。PubSub 发布者/订阅者业务租约保持原逻辑,需配套支持会话绑定注册的 Message 服务。
14
22
 
15
23
  - 移除发布、Bus 受理和订阅接收的独立 64 KiB 限制,事件沿用普通 RPC/`message.send` 的完整 WebSocket 报文上限 `1_000_000` 字节;JSON、控制信封和 E2EE 开销计入该上限,事件正文可用空间相应减少。
16
24
  - 收发令牌桶的字节突发额度提高至 `1_000_000`,按实际序列化字节数扣费;持续速率、队列数量/总字节、TTL、去重和背压约束继续生效。旧 `max_event_bytes`/`event_bytes` 不再用于单事件大小判断。
@@ -18,18 +26,24 @@
18
26
  ### Ownership 共识缓存与证书验签
19
27
 
20
28
  - `checkOwnershipConsensus` 和 `AIDStore.resolve` 的 Ownership 查询复用已达共识的本地持久快照,保存共识时的 agent.md 正文及 `owner_md_sha256`,新 Client/重启后可恢复。
21
- - 观察 agent.md ETag、Owner 文件摘要和观察代次,变化后重新校验;非共识、缺失或本地材料不一致时继续联网。持久化失败或异步查询期间观察变化的结果不进入可复用缓存。
29
+ - 观察 agent.md ETag、Owner 文件摘要和观察代次,变化后重新校验;兼容参数 `force` 不再强制击穿有效成功缓存,非共识、缺失或本地材料不一致时继续联网。持久化失败或异步查询期间观察变化的结果不进入可复用缓存。
22
30
  - 历史 Ownership 文件的主签、附签接受有效的 `active_signing`/`verify_only` 证书,继续核验 AID、指纹、有效期、信任链和撤销状态;新签 owner.md/agent.md(含群/组织及清理路径)仍须使用 `active_signing`。
23
31
 
24
- ### 消息交付与 UDP 待机
32
+ ### 消息交付与 ACK
25
33
 
26
34
  - 群 inline 消息可在同一 namespace 内保留多条待确认记录;累计 ACK 仅完成已提交项,减少因前一条待 ACK 而退回 Pull 的情况。
27
- - 已确认水位可消解同代际内尚未发送的冗余后台 ACK;P2P 在线提交覆盖自动补拉目标时减少重复 Pull,并保留补发 ACK 责任。
35
+ - 后台尾 ACK 优先复用已排队的自然 forward Pull;已确认水位可消解同代际内尚未发送的冗余后台 ACK,保留其他游标和新连接的确认责任。P2P 在线提交覆盖自动补拉目标时减少重复 Pull,并保留补发 ACK 责任。
36
+ - 群 Pull 实际发送前读取最新已提交 ACK;持久 forward 补拉不再无条件先探测 volatile,改为按提示独立恢复;分类控制流空页无游标变化时不再重复 ACK 或保存状态。
37
+
38
+ ### UDP 待机
39
+
28
40
  - UDP 租约按服务端期限与当前心跳周期的 2.5 倍取较短值,先应用心跳回复的新周期再续租;移除固定对账重连及连续三次超时唤醒条件,由租约/ticket 期限和业务唤醒恢复 WebSocket。
41
+ - 后台尾 ACK 等待重试时保持 WebSocket;旧 UDP socket 的迟到错误不会唤醒新一轮待机。
29
42
 
30
43
  ### 版本与验证
31
44
 
32
- - 包配置、锁文件、运行时及相关测试引用统一为 `0.5.36`;本轮 Ownership 回归 460 项、实体发布专项 3 项及类型检查通过。版本一致性与 Browser 加密 conformance 等沿用前阶段记录;未运行功能全量或线上 E2E。
45
+ - 包配置、锁文件、运行时及相关测试引用统一为 `0.5.37`。2026-11-15 版本升级阶段,跨 SDK 版本一致性测试 1 项及 Node 类型检查通过。
46
+ - 前阶段 Ownership 460 项和实体发布专项 3 项的通过记录见 parity,不作为本次整理重新执行的结果;未完成 Node 功能全量或线上 E2E,尚未发布或部署。
33
47
  - 配套服务继续按单实例范围记录;原生 MailClient 的整体端到端验收状态沿用 0.5.35 边界。
34
48
 
35
49
  ## 0.5.35 — 2026-11-12
@@ -89,9 +89,9 @@ NS 自身的结果缓存是另一层:最长 5 秒,并受证书材料期限
89
89
 
90
90
  ### 5.1 开启条件与空订阅
91
91
 
92
- 原生 UDP 仍仅由 Python、Node 和 Go 提供,Browser 保持 WebSocket。Gateway 默认关闭该能力;主连接须同时协商到严格布尔值 `negotiated_capabilities.udp_standby_v1=true` 和 `udp_standby.enabled=true`,并满足 human 身份、空闲和连接形态等准入条件。
92
+ 原生 UDP 仍仅由 Python、Node 和 Go 提供,Browser 保持 WebSocket。Gateway 启动与 Control 缺省允许待机,实际仍须有可用 listener 和公告地址;主连接须同时协商到严格布尔值 `negotiated_capabilities.udp_standby_v1=true` 和 `udp_standby.enabled=true`,并满足空闲、无在途任务和主长连接等准入条件;已知 human 保持 WS。
93
93
 
94
- Gateway 修复后,协议级事件订阅字段缺失或为空时,按**所有可唤醒事件**处理,prepare 会归一化并返回具体 `event_subscriptions` 快照。应用不必为了绕过空订阅引起的 `unsupported_subscription` 人为缩窄默认集合;已有支持 UDP 的 SDK 也可受益于这一服务端修复。
94
+ Gateway 对已协商 UDP 的主 long 连接在认证时将订阅字段缺失、`null`、`[]` 或全空白集合归一为**全部 12 个可唤醒事件**,从首次 WS 事件路由生效;prepare 返回具体 `event_subscriptions` 快照。应用不必为绕过空订阅的 `unsupported_subscription` 人为缩窄集合;未协商 UDP 的会话保留原订阅语义。
95
95
 
96
96
  这里是 Gateway 通知订阅,和 `EventService.subscribe` 的 Bus 订阅不同。显式订阅中仍含不支持待机恢复的事件时,Gateway 仍会返回 `unsupported_subscription`;空订阅规则不绕过能力声明、queue/stream 等连接约束或忙碌检查。恢复连接时沿用 prepare 返回的通知快照。
97
97
 
@@ -130,9 +130,9 @@ TS/JS 的 `requireActiveSigning`、Python 的 `require_active_signing` 和 Go
130
130
 
131
131
  ### 7.1 准入与通知集合
132
132
 
133
- 保持双能力严格协商、主长连接、human 身份、空闲时长及忙碌检查。Python/Go 本版补强待处理 Pull、peer 目录和恢复工作检查,并在 prepare/commit 前重检,避免异步准备期间新增工作仍进入待机。
133
+ 保持双能力严格协商、主长连接、空闲时长及忙碌检查;已知 human 保持 WS。待处理 Pull、peer 目录、恢复工作和后台尾 ACK 均须排空,并在 prepare/commit 前重检,避免异步准备期间新增工作仍进入待机。
134
134
 
135
- Gateway 对缺失或空通知订阅归一化为所有可唤醒事件,prepare 返回实际 `event_subscriptions`,恢复认证时写回 `auth.connect.options.event_subscriptions`。显式包含不可恢复事件仍拒绝;不要把 Bus 的 EventService 订阅送入这套协议,也不要跳过客户端能力声明。
135
+ Gateway 在已协商 UDP 的主 long 连接认证时,对缺失、`null`、`[]` 或全空白通知订阅归一化为全部可唤醒事件,prepare 返回实际 `event_subscriptions`。恢复认证及首次唤醒失败后的当前普通重连均写回该快照,主动关闭、身份切换和成功连接后清理。显式包含不可恢复事件仍拒绝;不要混用 Bus 的 EventService 订阅或跳过能力声明。
136
136
 
137
137
  ### 7.2 匹配回复后先改周期,再改期限
138
138
 
@@ -1140,13 +1140,13 @@ await client.call("stream.close", {"stream_id": stream["stream_id"]})
1140
1140
 
1141
1141
  ## AID 空闲 UDP 待机(测试能力)
1142
1142
 
1143
- Python、TypeScript/Node.js 与 Go SDK 支持独立 AID 实例的 UDP 待机,浏览器 JS 与本期暂不移植 UDP 的 Rust SDK 保持 WebSocket。具有待机控制器的主长连接通过 `auth.connect.capabilities.udp_standby_v1=true` 声明能力;Gateway 默认关闭,响应 `capabilities.udp_standby_v1` 表达当前实际可用性,只有 `negotiated_capabilities.udp_standby_v1` 与 `udp_standby.enabled` 均严格为布尔 `true` 才启用,缺失、`false` 或字符串 `"true"` 保持 WS;短连接和辅助连接不声明。客户端初次上线仍建立 WS 并正常认证、检查和补拉,通过双向空闲与在途任务门禁后才释放 WS。Node 使用内置 `node:dgram`,无需新增运行依赖。原定 Ubuntu Docker 单域 11 场景已分轮通过,新增动态心跳与 human 准入仍待增量实机验证,容量未验。
1143
+ Python、TypeScript/Node.js 与 Go SDK 支持独立 AID 实例的 UDP 待机,浏览器 JS 与本期暂不移植 UDP 的 Rust SDK 保持 WebSocket。具有待机控制器的主长连接通过 `auth.connect.capabilities.udp_standby_v1=true` 声明能力;Gateway 启动与 Control 缺省允许待机,实际仍须有可用 listener 和公告地址。只有 `negotiated_capabilities.udp_standby_v1` 与 `udp_standby.enabled` 均严格为布尔 `true` 才启用,缺失、`false` 或字符串 `"true"` 保持 WS;短连接和辅助连接不声明。客户端初次上线仍正常认证、检查和补拉,无在途 RPC、交付、补拉与后台尾 ACK 后才允许释放 WS;`background_sync=false` 保持 WS。Node 使用内置 `node:dgram`,无需新增运行依赖。历史实机结果与当前版本验证边界见实施计划,容量未验。
1144
1144
 
1145
1145
  准备阶段通过 `AIDStore.resolve(...)` 的 `agent_md.frontmatter.type` 识别自身 AgentMD 类型;已知 `human` 保持 WS,未知沿用原准入,不以注册意图替代本次 AgentMD 结果。UDP 心跳不查询 AgentMD。
1146
1146
 
1147
- `HEARTBEAT_ACK` 正文固定为 `lease_remaining_ms:uint32 + pending_generation:uint64 + reason_mask:uint32 + heartbeat_interval_ms:uint32`,共 20 字节,其他报文结构不变。Gateway 每次收到有效 HEARTBEAT 都返回当前周期 T 并按 4T 续租,SDK 按 T 的 ±20% 抖动安排下一次心跳;动态配置更新不追溯缩短已发租约。SDK 连续 3 次响应超时后恢复 WS;默认 T=25 秒、单次等待 5 秒,服务端正常窗口 100 秒,授权、票据或目录期限可更早到达。正常切换不产生应用离线回调,任一有效 WS/UDP 在线即保持应用在线;未新增切换完成回调或公开字段。
1147
+ `HEARTBEAT_ACK` 正文固定为 `lease_remaining_ms:uint32 + pending_generation:uint64 + reason_mask:uint32 + heartbeat_interval_ms:uint32`,共 20 字节。默认业务空闲 300 秒、恢复后最短活动期 60 秒;T=25 秒、单次 ACK 等待 5 秒,心跳按 T±20% 抖动。有效租约最多 2.5T(默认 62.5 秒),并受票据、授权和目录期限限制;未续租到期恢复 WS,没有连续三次超时门槛。普通 ACK 只续租,不按固定 15 分钟对账唤醒;兼容字段 `reconcile_interval_ms` 不驱动周期恢复。票据默认最长 1800 秒,普通心跳不无限延期。正常切换不产生应用离线回调,任一有效 WS/UDP 在线即保持应用在线;未新增切换回调或公开字段。
1148
1148
 
1149
- 应用仅在确定不依赖瞬时通知时,显式选择可恢复事件;以下示例改变服务端事件过滤,不适用于需要全事件的应用:
1149
+ 协商 UDP 的主 long 连接在认证时将通知订阅缺失、`null`、`[]` 或全空白集合归一为全部 12 个可唤醒事件,从首次 WS 事件路由生效。应用需要缩小过滤时,可用既有接口选择子集:
1150
1150
 
1151
1151
  ```python
1152
1152
  await client.connect()
@@ -1155,11 +1155,11 @@ await client.call("event.subscribe", {
1155
1155
  })
1156
1156
  ```
1157
1157
 
1158
- TypeScript 使用 `client.call()`,Go 使用 `client.Call(ctx, ...)` 调用同一 RPC。`event.subscribe` / `event.unsubscribe` 的 `subscribed` 返回完整过滤集合;默认全事件、queue、流式和非白名单事件会话继续保持 WS,SDK 不自动缩窄已有订阅。TypeScript/Node 可通过 `connect({udp_standby: false})` 禁止本次连接声明该能力;不要将该选项直接套用到其他 SDK。
1158
+ TypeScript 使用 `client.call()`,Go 使用 `client.Call(ctx, ...)` 调用同一 RPC。`event.subscribe` / `event.unsubscribe` 的 `subscribed` 返回完整过滤集合;显式含非白名单事件、queue、流式或服务注册的会话保持 WS。需要默认全事件 WS 语义的 Node 应用可用 `connect({udp_standby: false})` 禁止本次连接声明该能力;该选项不直接适用于其他 SDK。未协商 UDP 的连接保留原订阅语义。
1159
1159
 
1160
1160
  进入待机后,`call`、消息发送、认证刷新等真实网络需求会立即恢复 WS,多个并发调用共享恢复过程,各自保留原 deadline 与取消语义;缓存命中的本地读取不唤醒。服务端消息提示也通过恢复 WS 后的原 Pull/ACK 流程处理。WAKE_ACK 不代表业务消费,UDP 不发送正文、不延长消息 TTL、不重放已经发出的写请求。
1161
1161
 
1162
- 为支持连续待机,SDK 使用 `gateway.standby.prepare` 返回的 `event_subscriptions` 权威快照,在恢复 `auth.connect.options.event_subscriptions` 中提交;Gateway 从新会话首次事件路由起应用该过滤。未传字段仍为原全事件语义,显式 `[]` 为无事件。应用不需要每次唤醒后手工重新订阅,也不应自行重放待机票据或认证签名。
1162
+ SDK 使用 `gateway.standby.prepare` 返回的 `event_subscriptions` 权威快照,在恢复 `auth.connect.options.event_subscriptions` 中提交;首次唤醒失败后的当前普通重连仍保留快照,成功连接、主动关闭或身份切换后清理。空集合按全部可唤醒事件处理。应用无需每次唤醒后重新订阅,不应重放待机票据或认证签名。
1163
1163
 
1164
- `disconnect()` / `close()` 停止本实例的待机与自动恢复,不影响同主机其他 AID。UDP 验证失败、连续无应答、租约/票据到期或 Gateway 故障时回 WS 并遵守冷却与原重连限制;UDP 不能唤醒已退出的进程。协议、事件白名单、错误原因和部署方式见 [Gateway 连接模式 §3.10](../../../docs/AUN文档/AUN协议/03-Gateway-连接模式.md#310-aid-空闲-udp-待机测试能力),状态机与验收边界见 [详细设计](../../../docs/AUN文档/AID空闲UDP待机详细设计.md)。
1164
+ `disconnect()` / `close()` 停止本实例的待机与自动恢复。UDP 验证失败保留原 WS;已待机的 socket 故障、有效租约或票据到期时恢复 WS,故障冷却默认 300 秒;旧 socket 回调不得影响新代际。prepare 阶段 WS/UDP 可短暂并存,恢复通常先关 UDP 再建 WS;同 AID 不同设备/slot 可分别保持 WS 与 UDP。普通 ACK 不唤醒,WAKE、带 pending/reason 的 ACK、本地 RPC、续期需求及网络故障可唤醒。UDP 不能唤醒已退出的进程。协议与部署见 [Gateway 连接模式 §3.10](../../../docs/AUN文档/AUN协议/03-Gateway-连接模式.md#310-aid-空闲-udp-待机测试能力),序列图与状态图见 [详细设计](../../../docs/AUN文档/AID空闲UDP待机详细设计.md)。
1165
1165
 
package/dist/agent-md.js CHANGED
@@ -1495,6 +1495,7 @@ export class AgentMdManager {
1495
1495
  verified_agent_md: { etag: responseEtag, content_hash: localEtag, verification, signature, cert_pem: peer.certPem },
1496
1496
  last_error: '',
1497
1497
  }, observation);
1498
+ this.observeOwnershipMeta(target, headerValue(response.headers, 'X-AUN-Owner-MD-SHA256'));
1498
1499
  const owner = this._ownerAid();
1499
1500
  let inSync = null;
1500
1501
  if (target.toLowerCase() === owner.toLowerCase()) {