@dsh-enhanced/lark-channel 0.1.67 → 0.1.70
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/README.md +5 -5
- package/docs/operations.md +4 -1
- package/docs/rsi-setup.md +4 -6
- package/lib/adapter.d.ts +9 -0
- package/lib/adapter.d.ts.map +1 -1
- package/lib/adapter.js +29 -1
- package/lib/adapter.js.map +1 -1
- package/lib/rsi-bootstrap-manifest.d.ts +5 -5
- package/lib/rsi-bootstrap-manifest.d.ts.map +1 -1
- package/lib/rsi-bootstrap-manifest.js +35 -39
- package/lib/rsi-bootstrap-manifest.js.map +1 -1
- package/lib/rsi-build.d.ts +48 -38
- package/lib/rsi-build.d.ts.map +1 -1
- package/lib/rsi-build.js +68 -386
- package/lib/rsi-build.js.map +1 -1
- package/lib/rsi-install-inputs.js +2 -2
- package/lib/rsi-install-inputs.js.map +1 -1
- package/lib/rsi-install.d.ts +50 -3
- package/lib/rsi-install.d.ts.map +1 -1
- package/lib/rsi-install.js +244 -36
- package/lib/rsi-install.js.map +1 -1
- package/lib/rsi-local-cohort.d.ts.map +1 -1
- package/lib/rsi-local-cohort.js +32 -3
- package/lib/rsi-local-cohort.js.map +1 -1
- package/lib/rsi-local-update-build.d.ts +7 -7
- package/lib/rsi-local-update-build.d.ts.map +1 -1
- package/lib/rsi-local-update-build.js +8 -9
- package/lib/rsi-local-update-build.js.map +1 -1
- package/lib/rsi-local-update.d.ts +0 -3
- package/lib/rsi-local-update.d.ts.map +1 -1
- package/lib/rsi-local-update.js +1 -2
- package/lib/rsi-local-update.js.map +1 -1
- package/lib/rsi-native-install.d.ts +2 -2
- package/lib/rsi-native-install.d.ts.map +1 -1
- package/lib/rsi-native-install.js +3 -9
- package/lib/rsi-native-install.js.map +1 -1
- package/lib/rsi-native-profile.d.ts +2 -4
- package/lib/rsi-native-profile.d.ts.map +1 -1
- package/lib/rsi-native-profile.js +8 -18
- package/lib/rsi-native-profile.js.map +1 -1
- package/lib/rsi-plugin-creation.d.ts +1 -2
- package/lib/rsi-plugin-creation.d.ts.map +1 -1
- package/lib/rsi-plugin-creation.js +4 -12
- package/lib/rsi-plugin-creation.js.map +1 -1
- package/lib/rsi-release-build.d.ts +8 -6
- package/lib/rsi-release-build.d.ts.map +1 -1
- package/lib/rsi-release-build.js +13 -69
- package/lib/rsi-release-build.js.map +1 -1
- package/lib/rsi-scanner-retirement-stage.d.ts.map +1 -1
- package/lib/rsi-scanner-retirement-stage.js +3 -5
- package/lib/rsi-scanner-retirement-stage.js.map +1 -1
- package/lib/rsi-scanner-retirement-transition.d.ts.map +1 -1
- package/lib/rsi-scanner-retirement-transition.js +22 -12
- package/lib/rsi-scanner-retirement-transition.js.map +1 -1
- package/lib/rsi-setup.d.ts +2 -1
- package/lib/rsi-setup.d.ts.map +1 -1
- package/lib/rsi-setup.js +30 -53
- package/lib/rsi-setup.js.map +1 -1
- package/lib/sdk.d.ts +9 -1
- package/lib/sdk.d.ts.map +1 -1
- package/lib/sdk.js +57 -0
- package/lib/sdk.js.map +1 -1
- package/lib/types.d.ts +14 -0
- package/lib/types.d.ts.map +1 -1
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/package.json +24 -21
- package/lib/rsi-creation-build.d.ts +0 -51
- package/lib/rsi-creation-build.d.ts.map +0 -1
- package/lib/rsi-creation-build.js +0 -415
- package/lib/rsi-creation-build.js.map +0 -1
- package/lib/rsi-local-resources.d.ts +0 -37
- package/lib/rsi-local-resources.d.ts.map +0 -1
- package/lib/rsi-local-resources.js +0 -189
- package/lib/rsi-local-resources.js.map +0 -1
package/README.md
CHANGED
|
@@ -25,7 +25,7 @@ revision 投递一条内容无关的状态更新;两种路径的重试、fence
|
|
|
25
25
|
- [日常使用自迭代的双 Host 配置](docs/rsi-setup.md)
|
|
26
26
|
- [进度展示、安全与权限边界](docs/progress-security.md)
|
|
27
27
|
|
|
28
|
-
Linux `supervised` 新安装在模型、TraeX、飞书配置与 doctor 后自动取得当前 owner、生成有限授权与 manifest,并部署目标和独立协调器两个 systemd Host。新 owner 安装接通有界新工具创建、任务派生独立验收与动态采用;旧安装重试保留原授权,不自动增加创建通道。未就绪会以非零状态停止安装完成提示;重试不续期授权。全新 `--install-owner` 可显式传入 `--enable-ordinary-use-learning`:从 Delivery `agentProvider`/`agentModel` 或显式 `--intake-provider`/`--intake-model` 生成单规则、ceiling 为 `digest` 的只观察 intake evaluator,打开 WorkItems `intakeLedger.evaluation.enabled`,并在 learning、review、adoption 三份记忆授权上一致开启 `workItemExperiences`;重试保留原 opt-in
|
|
28
|
+
Linux `supervised` 新安装在模型、TraeX、飞书配置与 doctor 后自动取得当前 owner、生成有限授权与 manifest,并部署目标和独立协调器两个 systemd Host。新 owner 安装接通有界新工具创建、任务派生独立验收与动态采用;旧安装重试保留原授权,不自动增加创建通道。未就绪会以非零状态停止安装完成提示;重试不续期授权。全新 `--install-owner` 可显式传入 `--enable-ordinary-use-learning`:从 Delivery `agentProvider`/`agentModel` 或显式 `--intake-provider`/`--intake-model` 生成单规则、ceiling 为 `digest` 的只观察 intake evaluator,打开 WorkItems `intakeLedger.evaluation.enabled`,并在 learning、review、adoption 三份记忆授权上一致开启 `workItemExperiences`;重试保留原 opt-in,拒绝扩展已有安装。全新 `--install-owner` 亦可显式传 `--skip-memory-learning`(仅 Linux supervised;与 `--enable-ordinary-use-learning` 互斥):不生成普通使用/记忆学习授权,也不写 learner、personal-memory 或 verifier 的学习配置,重试保持该决定且不会把 skip 变成 authorize。macOS 原生 owner 部署必须 authorize(原生记忆学习链是必填),跳过会被拒绝。非 LLM 的 agentProvider(如 `traex-agent`)不能用于该 evaluator,需另给 LLM route。当前尚未完成真实普通任务驱动的修复、采用和观察验收,见上述配置指南。
|
|
29
29
|
|
|
30
30
|
Linux 成对升级会在候选 Host 首次启动前,核验旧 manifest 的冻结 owner 来源及 Delivery 撤权记录,并通过原 Policy/Automations 服务停用对应的四类旧扫描。维护只写已停服的私有 Home 副本,使用固定操作标识和原预算账户,保留任务历史与 unknown;来源读取与维护子进程都有有限期限。升级事务保存原配置、身份、数据库及完整迁移证据;切换后不能自动退回会复活旧扫描的状态,成功清理将证据整体保留在事务同级的 `.completed-<事务 ID>` 目录。此路径只处理旧扫描退出,不签发新 owner 授权,也不把旧授权转给其他身份。安装器依赖可信的已安装代码及完整依赖集合;来源摘要不是对任意 JavaScript 依赖的安全证明。
|
|
31
31
|
|
|
@@ -167,12 +167,12 @@ dsh-lark-setup --profile web --refresh-agent-policy --allow-agent-tools
|
|
|
167
167
|
- 记忆、Wiki 和行为学习提案使用 Card 2.0 审批按钮,签名绑定会话、提案版本与有效期;回调操作人另按 owner 授权校验。行为学习卡会把 scope、情境、guidance、版本、证据和回滚原因逐字段以纯文本展示;提案内容不会作为 Markdown 或卡片组件解释。点击后卡片只确认 Policy 决策已写入持久账本,明确不把“批准”误报成“变更已生效”。投递失败且已经过期的提案需要重新提交,升级不会自动批准或补发旧卡。
|
|
168
168
|
- 消息通道运行时网络仅访问所选飞书/Lark OpenAPI、token 与 WebSocket endpoint;图片读取使用固定消息资源端点,不接受消息或模型提供的 URL,并关闭重定向。
|
|
169
169
|
- 安装阶段的 `dsh-rsi-setup --prepare-source` 执行 Git,在 `$DSH_HOME/rsi-sources/<profile>` 写入私有源码与 bare 发布仓库;npm 来源访问固定官方 GitHub 仓库的精确版本 tag,本地来源只复制已提交内容。支持常用代理与 CA 环境变量,不执行安装脚本;此命令不使用飞书凭据或浏览器,详见 [RSI 配置](docs/rsi-setup.md)。
|
|
170
|
-
- `dsh-rsi-setup --prepare-local-update` 在 Home 外准备本地上游与现有修复分支合并后的源码和 tarball。Linux
|
|
170
|
+
- `dsh-rsi-setup --prepare-local-update` 在 Home 外准备本地上游与现有修复分支合并后的源码和 tarball。Linux 准备摘要固定的原生运行时(schema 3)及离线 bubblewrap 构建,全程不接触 Docker;已移除 `--docker-path` 与旧镜像构建器,历史 Docker 收据仅只读解码用于迁移,两类收据互斥不续跑。它可联网下载固定 Node/pnpm 与冻结依赖,但候选 build/pack 不带网络、凭据或原 Home;不会停服或激活更新,原生候选的停机激活迁移随原生安装事务交付。pre-owner 安装可使用 checkout 维护事务,已有 owner 的完整迁移仍未交付,详见 [RSI 配置](docs/rsi-setup.md)。
|
|
171
171
|
- checkout 的 `local-service-upgrade` 在停服前以无 registry 凭据的私有配置准备旧图和最终候选图,重新校验候选锁与策略,并在空 node_modules 的临时 Home 中实际断网调用原生 DSH 安装。首次服务操作前重核外部候选、原 Home 与缓存;停服后的正式副本继续核对同一依赖图、包清单和配置,失败保留证据。pre-owner 的 Docker→native 和 native→native 可迁移基础 runtime、release 资源及 cohort;正式阶段绑定实际目录身份,恢复拒绝复制产生的新 inode。事务会写入独立缓存及 Home 副本、切换 systemd 服务;它不启用 owner scheduler 或扩大授权,完整活服务升级仍未验收。用法与恢复见[安装器指南](../../scripts/install/README.md#checkout-内的-pre-owner-冻结源码维护)。
|
|
172
172
|
- macOS 安装使用系统 Perl 的内核 `flock` 串行化同一用户、同名 profile 的 LaunchAgent 操作,使用 `plutil`/`launchctl` 核对服务归属并管理当前用户服务;运行检查核对状态与 PID。同名目标属于另一 DSH_HOME 时拒绝修改,替换失败时尝试恢复旧定义与注册状态。原生学习另串行化 Home 配置,写入私有计划、有限授权、恢复日志和 HMAC observer 密钥。新安装从冻结源码清单和锁文件准备私有 Node、pnpm 及依赖,候选构建和行为检查使用本机 Seatbelt;Host 也是原生 Node。支持范围与失败恢复见[原生 macOS 学习](docs/rsi-setup.md#原生-macos-学习)。
|
|
173
173
|
- Linux 安装的 `--prepare-build` 还自动准备私有授权运行时和本地发布资源,也可单独执行 `--prepare-authorities`:从同版本已安装 Control Plane 复制官方程序及模块、固定独立 Node,运行副本做版本/模块检查,并生成 14 个独立 Ed25519 身份和本地 registry/catalog。共享契约从 Control Plane 声明的依赖解析,接受包内依赖边、同一 pnpm 虚拟包目录内的相邻依赖边,以及安装器生成的受管 profile 内经 profile 清单、pnpm 工作区、安装元数据和两份锁文件共同核验的 hoisted 直接依赖边;普通扁平项目或任意祖先目录的同名包不能替代它。核验材料在复制前后保持一致,目录和密钥仅当前用户可读写;重复执行核验固定内容并保留发布/状态进展。此步骤需要文件写入与子进程权限,不需要网络、浏览器或飞书凭据,不执行 npm lifecycle,不签发 owner grant 或启动 Host。
|
|
174
|
-
- Linux 的 `dsh-rsi-setup --prepare-build`
|
|
175
|
-
- Linux 新 `--install-owner` 使用原生完整仓库边界:基础运行时导出发布工具链,repository schema 4 固定双 UID、系统工具快照与 cgroup v1,独立行为运行时支持工具创建、修订、配对回归及有限采用。准备阶段使用固定归档和冻结依赖;候选不读取 owner 凭据、浏览器、验收答案或网络。首次授权前创建五个空 runner 账本,在独立 seal 文件中固定目录/数据库身份,并把引用纳入原授权摘要;读取、安装重试和直接重启都不能补造丢失账本。旧 Docker
|
|
174
|
+
- Linux 的 `dsh-rsi-setup --prepare-build` 准备摘要固定的原生运行时:从 nodejs.org 与 npm registry 下载官方 Node v22.23.2、pnpm 11.7.0,经 bubblewrap 私有命名空间与无凭据环境先 `pnpm fetch` 再离线 `--frozen-lockfile --ignore-scripts` 安装,保存 schema 3 sourceBuild(运行时全树摘要)与 schema 2 `releaseBuild`(工具链/store/cache 三树副本加 `runtimeDigest`),全程不调用 Docker CLI、daemon、socket 或镜像。环境前置(Linux x64/arm64、bwrap/unshare/mount 等)缺失时经 `--optional-build` 报告 `buildUnavailable`/`releaseBuildUnavailable` 并保留源码与已验证运行时;完整性错误始终致命。旧 Docker 镜像构建路径已下线,`--docker-path` 不再是 CLI 选项;历史 Docker 收据只用于只读迁移解码,不能被续跑。随后候选检查使用离线完整仓库 sandbox;安装期间不会读取主机 Docker registry 凭据或启动候选 Host。Mac 则准备受摘要固定的私有 Node、pnpm 与冻结清单依赖,并在候选期用 Seatbelt 离线执行。当前 runtime 支持与资源上限见 [RSI 配置](docs/rsi-setup.md)。
|
|
175
|
+
- Linux 新 `--install-owner` 使用原生完整仓库边界:基础运行时导出发布工具链,repository schema 4 固定双 UID、系统工具快照与 cgroup v1,独立行为运行时支持工具创建、修订、配对回归及有限采用。准备阶段使用固定归档和冻结依赖;候选不读取 owner 凭据、浏览器、验收答案或网络。首次授权前创建五个空 runner 账本,在独立 seal 文件中固定目录/数据库身份,并把引用纳入原授权摘要;读取、安装重试和直接重启都不能补造丢失账本。旧 Docker 安装不再可续跑:安装器会 fail-closed 拒绝,需显式迁移,且不重建资源、不续期或新增创建/修订授权。
|
|
176
176
|
- `requestTimeoutMs`(默认 30 秒)为常规 OpenAPI 请求设置硬 deadline,`imageDownloadTimeoutMs` 独立限制图片下载。SDK 会把可下传的 AbortSignal 交给底层 HTTP;若调用已经被服务端接收后超时,最终消息保留 Delivery 的 `unknown_after_send` 语义,绝不自动重发或假称未发送。
|
|
177
177
|
- App Secret 不写 Delivery 数据库、工具参数、health、route、日志或异常;Linux protected-file 没有额外静态加密,同 UID、root 和可读备份仍能取得内容。
|
|
178
178
|
- Delivery SQLite 保存标准化文本、路由 id 和最多 10 个受限附件描述符;不保存 raw 事件、token 或下载 URL。图片字节只交给 AttachmentStore。
|
|
@@ -184,7 +184,7 @@ dsh-lark-setup --profile web --refresh-agent-policy --allow-agent-tools
|
|
|
184
184
|
|
|
185
185
|
## 当前限制
|
|
186
186
|
|
|
187
|
-
- Linux 原生准备已接入 `--prepare-build`、本地更新候选构建和全新 `--install-owner` 配置事务。已有 Docker owner 的程序升级已接入空业务历史检查与停服采用授权 CAS:停服前、资源迁移前及 finalizer 重查,签名 overlay 绑定迁移计划、证明和文件身份,两个启动前验收点显式复核空表;后续正常就绪检查允许新的业务记录。配置启用但库缺失、非空 review/采用历史、sidecar、native→native 或授权不匹配会拒绝;不删库、不刷新额度和期限。完整临时 Home 升级、双服务就绪及回滚仍待实机验收,现有生产 Home 尚未迁移。旧 Docker
|
|
187
|
+
- Linux 原生准备已接入 `--prepare-build`、本地更新候选构建和全新 `--install-owner` 配置事务。已有 Docker owner 的程序升级已接入空业务历史检查与停服采用授权 CAS:停服前、资源迁移前及 finalizer 重查,签名 overlay 绑定迁移计划、证明和文件身份,两个启动前验收点显式复核空表;后续正常就绪检查允许新的业务记录。配置启用但库缺失、非空 review/采用历史、sidecar、native→native 或授权不匹配会拒绝;不删库、不刷新额度和期限。完整临时 Home 升级、双服务就绪及回滚仍待实机验收,现有生产 Home 尚未迁移。旧 Docker 安装不能以重复安装续跑;迁移须显式进行,且不会借此扩大授权。实施边界见[原生运行时](../../docs/dockerless-runtime.md)。
|
|
188
188
|
|
|
189
189
|
- v0.1 支持文本、受限图片描述符、文本/Markdown-card 出站、durable proposal、owner-DM 一次性工具审批、模型/权限卡片、reaction 和原生进度;模型不能提交任意 card JSON,也不能直接控制 reaction 或进度载荷。
|
|
190
190
|
- 只有图片资源具备受限下载能力,且依赖 AttachmentStore 与模型图片能力;文件、音频、视频和 sticker 只进入 metadata quarantine。没有病毒扫描、附件上传或消息编辑。
|
package/docs/operations.md
CHANGED
|
@@ -85,7 +85,10 @@ adapter 只接受同一入站消息的严格 message ID/image key,并固定请
|
|
|
85
85
|
- Agent 回答本身是 Markdown;若以 plain 发送会暴露表格分隔符、`**` 等语法。Delivery 只在 adapter 声明 `markdown` 能力时请求该格式,否则降级为 plain,避免 coordinator 以 `unsupported-format` 丢弃整条消息。
|
|
86
86
|
- Markdown 回答卡片不添加 header,避免与飞书气泡已有的机器人名称/头像重复;标题使用带字号的 Markdown 组件,顶级 GFM 表格使用原生 Table,其余正文保持 Markdown。单卡最多使用 5 个原生表格、每表最多 50 列;超限表格转为可读列表。只有飞书明确拒绝卡片格式时才按原始正文精确降级为 plain text,不会把成功卡片重复发送。
|
|
87
87
|
- 权限或格式错误是确定未发送;限流和未连接可以安全重试;网络超时或未知 SDK 错误进入 `unknown_after_send`,不会盲目重发。
|
|
88
|
-
- 飞书目前没有为该发送 UUID 提供可靠查询/对账接口,因此 adapter 声明 `reconcileUnknownSend: false
|
|
88
|
+
- 飞书目前没有为该发送 UUID 提供可靠查询/对账接口,因此 adapter 声明 `reconcileUnknownSend: false`;也没有 delivered 事实,adapter 不伪造 delivered。
|
|
89
|
+
- **E3a 范围**:假传输下的 read 回执与 deliveryState 状态机;真实飞书事件订阅/WS 联调、群聊 read_users、Web notice ack(E3a-W)、adopted 事实来源均属后续切片,不在本范围。
|
|
90
|
+
- E3a read 回执:adapter 声明 `receipts: ['read']`、`readReceipts: 'best-effort'`,从官方单聊事件 `im.message.message_read_v1` 转发 read receipt(channel/account/provider message id/read_time)。事件只覆盖“用户阅读机器人发送的单聊消息”;群聊没有该事件,若需要群 read 只能另行调用 `GET /im/v1/messages/:message_id/read_users`(7 天窗口、1000 次/分钟、只返回已读用户,不返回未读/送达),不属于首版。
|
|
91
|
+
- 前置权限:机器人能力、事件订阅“消息与群组 → 消息已读”、`im:message` 或 `im:message:readonly`。长连接断线无 replay cursor,read 事件可能丢失,因此声明 best-effort;Evaluation 不会据此把“没收到 read”判定为 missed,仍保持旧 `expired-unhandled`。
|
|
89
92
|
|
|
90
93
|
官方长连接会自动重连,但没有可持久 replay cursor 或历史补拉接口。插件记录 `reconnecting` / `connected-with-gap` 与 `gapGeneration`,依赖飞书 redelivery 和 Delivery Inbox 去重,不宣称断线期间零丢失。将来若出现官方 cursor/backfill contract,应先加入崩溃和重放测试再启用。
|
|
91
94
|
|
package/docs/rsi-setup.md
CHANGED
|
@@ -10,7 +10,7 @@ Linux `supervised` 新安装在最终模型、TraeX、Lark 配置和 doctor 完
|
|
|
10
10
|
|
|
11
11
|
macOS x64 / Apple Silicon 的 `supervised` 使用一个原生 Node Host,由当前登录用户的 launchd 管理。普通任务与认证反馈驱动持久记忆学习,以及 owner 命名空间内的新工具创建、独立行为验证和 Cordis 动态采用。候选构建和行为执行使用私有本机 Node 与 Seatbelt,独立 runner 保留有限额度及 unknown 结果;Host、聊天、模型与学习调度也运行在 macOS。此路径没有既有插件源码替换、发布和双 Host 交接授权;已有 Linux 源码修复轨保持原合同。
|
|
12
12
|
|
|
13
|
-
使用已安装的独立 npm DSH CLI,并确保它是 `PATH` 中选中的 `dsh`。先确认 `/usr/bin/git --version` 可运行(Apple Command Line Tools)。安装器只复制冻结来源提交中的根清单、工作区包清单与锁文件,以固定摘要验证官方 Node 24.22.0 和 pnpm 11.7.0,使用私有无凭据环境执行 `--frozen-lockfile --ignore-scripts`
|
|
13
|
+
使用已安装的独立 npm DSH CLI,并确保它是 `PATH` 中选中的 `dsh`。先确认 `/usr/bin/git --version` 可运行(Apple Command Line Tools)。安装器只复制冻结来源提交中的根清单、工作区包清单与锁文件,以固定摘要验证官方 Node 24.22.0 和 pnpm 11.7.0,使用私有无凭据环境执行 `--frozen-lockfile --ignore-scripts` 安装。此准备阶段可联网下载锁定依赖;候选构建和行为执行离线运行。私有运行时的节点、依赖树、来源提交与锁文件由回执固定,复跑核对全部内容,缺失或漂移时停止而不重建已授权的资产。安装器已移除 `--docker-path`;无需 Docker Desktop 或 Docker socket。
|
|
14
14
|
|
|
15
15
|
本地安装器的默认 `auto` 场景也会选择 supervised;已安装相同源码版本及所需包后,可重试:
|
|
16
16
|
|
|
@@ -60,7 +60,7 @@ Linux 全新 `--install-owner` 默认走原生完整能力:从基础 schema 3
|
|
|
60
60
|
|
|
61
61
|
首次授权前在 `state` 中初始化五个空 runner SQLite 账本,把目录/数据库的 dev、inode、固定 schema 与 seal 摘要绑定到各自配置。seal 文件在 `state/native-runner-states` 中,与 runner 目录分离。已有 manifest 的重试只读取原始引用;账本或目录缺失/替换、seal 缺失或内容漂移均拒绝,不清零额度、不重派 unknown。未使用的修订 runner 也必须保留其预初始化账本。主配置缺失时,首次安装模式还要求所有子账本无任何授权、controller、任务或审计历史,也无未结算 WAL;已使用的封存账本不能被当作新安装重新授权。该约束只保护显式带 `stateSeal` 的新配置;无 seal 的历史 generic runner 不能因此宣称已迁移。
|
|
62
62
|
|
|
63
|
-
Linux 新安装默认准备原生离线构建运行时(sourceBuild schema 3,`backend: linux-native`),不调用 Docker CLI、daemon、socket,也不拉取镜像:按固定摘要从 nodejs.org 与 npm registry 下载官方 Node v22.23.2 和 pnpm 11.7.0,经私有 user/mount/PID/network 命名空间(bubblewrap)与无凭据环境先 `pnpm fetch --frozen-lockfile --ignore-scripts` 预取,再以 `--offline` 完成安装,随后的候选与发布构建全部离线运行。前置为 Linux x64/arm64、`/usr/bin/{git,curl,tar,bwrap,unshare,mount,bash,python3}` 可用,以及 bwrap 全命名空间隔离和有界 tmpfs 挂载探测通过;不满足这些环境前置时,安装器保留源码并报告 `buildUnavailable`,普通 Agent 安装继续,但不声称源码修复构建已经可用。清单不完整、回执或内容漂移、网络失败等完整性错误始终致命,不由 `--optional-build` 掩盖;macOS
|
|
63
|
+
Linux 新安装默认准备原生离线构建运行时(sourceBuild schema 3,`backend: linux-native`),不调用 Docker CLI、daemon、socket,也不拉取镜像:按固定摘要从 nodejs.org 与 npm registry 下载官方 Node v22.23.2 和 pnpm 11.7.0,经私有 user/mount/PID/network 命名空间(bubblewrap)与无凭据环境先 `pnpm fetch --frozen-lockfile --ignore-scripts` 预取,再以 `--offline` 完成安装,随后的候选与发布构建全部离线运行。前置为 Linux x64/arm64、`/usr/bin/{git,curl,tar,bwrap,unshare,mount,bash,python3}` 可用,以及 bwrap 全命名空间隔离和有界 tmpfs 挂载探测通过;不满足这些环境前置时,安装器保留源码并报告 `buildUnavailable`,普通 Agent 安装继续,但不声称源码修复构建已经可用。清单不完整、回执或内容漂移、网络失败等完整性错误始终致命,不由 `--optional-build` 掩盖;macOS 原生准备失败同样停止安装,已有资源不一致也会停止安装。旧 Docker 镜像构建路径已下线;历史 Docker 回执仅只读解码用于迁移,不能与原生回执互续。
|
|
64
64
|
|
|
65
65
|
支持的环境可单独运行严格构建准备:
|
|
66
66
|
|
|
@@ -71,7 +71,7 @@ Linux 新安装默认准备原生离线构建运行时(sourceBuild schema 3,
|
|
|
71
71
|
|
|
72
72
|
`--prepare-build` 输出的是基础 schema 3 原生准备回执,不是 owner 执行授权。正式 `--install-owner` 另取 repository schema 4,并在 owner/原期限固定后编译 Control Plane 的 Linux sourceBuild,绑定完整运行时、双 UID、系统快照、资源限额与账本 seal。基础运行时仍用于导出 schema 2 `releaseBuild`:固定工具链、离线 store/cache 与 `runtimeDigest`,供既有发布 adapter 使用。创建、修订、回归及采用共享同族行为观察器与 cgroup,但使用独立账本和用途分离的签名授权。
|
|
73
73
|
|
|
74
|
-
Linux 原生自动配置使用完整仓库检查的 30 分钟、16 GiB 内存、8 CPU、1024 PID、8 GiB 工作区及 4 GiB 临时目录上限;两类目录各限 100 万 inode。宿主必须具备相应的委派和资源。原生边界见[运行时说明](../../../docs/dockerless-runtime.md)
|
|
74
|
+
Linux 原生自动配置使用完整仓库检查的 30 分钟、16 GiB 内存、8 CPU、1024 PID、8 GiB 工作区及 4 GiB 临时目录上限;两类目录各限 100 万 inode。宿主必须具备相应的委派和资源。原生边界见[运行时说明](../../../docs/dockerless-runtime.md);历史 Docker 授权保留原 4 GiB 工作区、2 GiB 临时目录与其嵌套 sandbox 配置(该配置及 Docker 构建入口已随 Docker 后端移除);该后端已不可新建或续跑,仅供迁移时只读解码。macOS 原生构建按固定 60 秒单次、1 MiB 输出、1000 次及 24 小时累计运行限额授予,独立行为 runner 保留各自原有额度。准备资源只完成安装前置步骤;`--install-owner` 会核对已安装 Host、owner 和最终配置后再应用。
|
|
75
75
|
|
|
76
76
|
目标先完成 [Lark 配对](setup.md)与 [supervised 安装](../../../scripts/install/README.md),已有唯一 active owner DM。无需先激活固定 Recovery runbook;缺失的 owner route 在成对配置事务内生成,既有唯一精确路由(包括 `supervised-growth-owner`)沿用原 ID 和 minimum generation。路由冲突或重复会拒绝,不覆盖其他授权。新安装自动补齐目标依赖;旧安装若缺依赖,为目标补装同一构建的 Growth Driver、Goals、Skills、Verifier、Memory Learning 与 Control Plane。Memory 由 Personal Assistant 内嵌提供,不再添加独立 Memory bundle。开发版应使用本地构建的包;仅有相同版本号不能证明含有这些新增 API。
|
|
77
77
|
|
|
@@ -151,15 +151,13 @@ macOS 本地 cohort 安装沿用冻结制品与安装文件校验,持同一个
|
|
|
151
151
|
|
|
152
152
|
```sh
|
|
153
153
|
dsh-rsi-setup --prepare-local-update --profile web --dsh-home "$HOME/.dsh"
|
|
154
|
-
# 迁移并存期需要旧镜像收据时,可显式指定绝对路径:
|
|
155
|
-
# --docker-path /usr/bin/docker
|
|
156
154
|
```
|
|
157
155
|
|
|
158
156
|
尚未安装 RSI owner 权限的旧冻结 profile 若缺少 Memory Learning,可在已审核并构建的 checkout 中显式追加 `--add-memory-learning`。它只允许这一根包扩展,生成独立 schema 2 候选;准备前后检查真实 pre-owner 权限与签名历史。后续 checkout 维护事务核验精确新增的默认 disabled、无 config 行及全部原配置,仍不启用 scheduler 或学习。原 schema 1 更新保持原 roots;已有 owner/coordinator 不支持这条扩展。具体命令与恢复边界见[安装器指南](../../../scripts/install/README.md#checkout-内的-pre-owner-冻结源码维护)。
|
|
159
157
|
|
|
160
158
|
它从既有冻结收据读取源码路径,固定上游已提交 HEAD 和当前修复分支;两条修复 ref 必须已对齐。可直接快进时复用提交,分叉时在私有新仓库合并;冲突会停止准备并保留原始分支。上游的精确包版本可以不同于已安装版本,未提交修改不进入候选。源码、tarball 及准备收据保存在 Home 同级的私有 `.dsh-rsi-local-updates-<home-hash>/` 内;相同原始制品、上游和修复提交会复用已核验的准备结果,变化则使用另一目录。准备期间上游、原始收据或已安装包变化时不返回成功。
|
|
161
159
|
|
|
162
|
-
Linux 更新构建默认准备摘要固定的原生运行时(schema 3,backend `linux-native`):从 nodejs.org 与 npm registry 下载官方 Node v22.23.2、pnpm 11.7.0,在受控无凭据环境中先 `pnpm fetch --frozen-lockfile --ignore-scripts` 再离线安装(依赖准备不执行仓库代码;候选执行另受 bubblewrap 隔离),并把运行时全树摘要写入候选 `rsi-linux-runtimes/<profile>/bootstrap.json`;随后导出同摘要工具链/store/cache 三树到 `rsi-release-builds`,输出 schema 2 release 收据(`runtimeDigest` 而非 image ID)。候选的 build/pack 脚本在现有 release adapter 的离线 bubblewrap 环境内运行,只挂载构建副本、输出及只读工具链/依赖,不提供原 Home、原 Git 仓库、凭据或环境变量。全程不调用 Docker CLI、daemon、socket 或镜像;前置(Linux x64/arm64、bwrap/unshare/mount
|
|
160
|
+
Linux 更新构建默认准备摘要固定的原生运行时(schema 3,backend `linux-native`):从 nodejs.org 与 npm registry 下载官方 Node v22.23.2、pnpm 11.7.0,在受控无凭据环境中先 `pnpm fetch --frozen-lockfile --ignore-scripts` 再离线安装(依赖准备不执行仓库代码;候选执行另受 bubblewrap 隔离),并把运行时全树摘要写入候选 `rsi-linux-runtimes/<profile>/bootstrap.json`;随后导出同摘要工具链/store/cache 三树到 `rsi-release-builds`,输出 schema 2 release 收据(`runtimeDigest` 而非 image ID)。候选的 build/pack 脚本在现有 release adapter 的离线 bubblewrap 环境内运行,只挂载构建副本、输出及只读工具链/依赖,不提供原 Home、原 Git 仓库、凭据或环境变量。全程不调用 Docker CLI、daemon、socket 或镜像;前置(Linux x64/arm64、bwrap/unshare/mount 等)缺失时准备失败,运行时完整性错误始终致命。旧 Docker 镜像构建器已下线;两类后端收据目录(`rsi-linux-runtimes` 与 `rsi-builds`)互斥,历史 Docker 收据只读解码用于迁移且不能续跑,同一候选同时存在两类收据判为不可重放漂移。输出 `mode: prepared` 只表示源码和制品已准备,尚未迁移签名源码历史、构建/授权配置或切换服务;当前普通 upgrade 仍拒绝冻结本地安装。尚无 owner/coordinator 的安装可显式使用[本地 checkout 维护事务](../../../scripts/install/README.md#checkout-内的-pre-owner-冻结源码维护);已配置 owner 的冻结安装尚不支持完整升级。上述 pre-owner checkout 事务支持 Docker→native 和 native→native 的基础 runtime/release/cohort 迁移,保留原身份和 `host:null` 源码历史;混合后端、原生降级回 Docker 及 owner 专用资源会拒绝。已有 owner 的迁移使用独立授权与验收路径。激活须由停机事务重新核对当前状态,不能把准备收据当作激活授权。
|
|
163
161
|
|
|
164
162
|
安装事务可通过只读候选检查重新验证源提交、原安装、tarball、固定构建运行时和导出的工具链;它不会执行 Docker 或候选脚本,也不会补建丢失的资源。这里的构建资源检查证明本地记录和文件仍匹配,不证明旧 Docker 镜像当前可运行,也不重新下载或修复原生运行时。源码维护 helper 在独立 Home 副本中导入新提交、更新受管 refs,并保留最初 bootstrap、Git 对象及 `baseline.initialCommit`;既有 Host 密钥签名的 `maintenance.json` 使后续源码读取和候选准备解析到新版本。Control Plane schema 28 将该维护记录与旧 release 收据一起校验,拒绝未结源码任务、断链、旧 tip 或不匹配的 Host 身份。它是完整升级事务的内部接口,尚未开放为直接替换运行中 Agent 的命令;协议边界见[兼容性说明](../../../docs/compatibility.md#本地源码维护历史control-plane-schema-28)。
|
|
165
163
|
|
package/lib/adapter.d.ts
CHANGED
|
@@ -116,6 +116,7 @@ export declare class LarkDeliveryAdapter implements DeliveryAdapter {
|
|
|
116
116
|
private readonly toolApprovalTombstones;
|
|
117
117
|
private readonly toolApprovalUpdates;
|
|
118
118
|
private closing;
|
|
119
|
+
private deliveryContext;
|
|
119
120
|
private presentationGeneration;
|
|
120
121
|
private readonly modelSelectionUpdates;
|
|
121
122
|
private state;
|
|
@@ -128,6 +129,14 @@ export declare class LarkDeliveryAdapter implements DeliveryAdapter {
|
|
|
128
129
|
* and the transient normalized text the digest covers). Optional on older
|
|
129
130
|
* Delivery cores and never allowed to affect acceptance.
|
|
130
131
|
*/
|
|
132
|
+
/**
|
|
133
|
+
* Best-effort read acknowledgement for bot-authored DM messages.
|
|
134
|
+
*
|
|
135
|
+
* Delivery owns the monotonic receipt state; an unknown provider id (for
|
|
136
|
+
* example a message the bot sent before this process) is expected and must
|
|
137
|
+
* not escape the WebSocket handler. Duplicate ids in one event are collapsed.
|
|
138
|
+
*/
|
|
139
|
+
private forwardReadReceipt;
|
|
131
140
|
private observeIntake;
|
|
132
141
|
health(): LarkChannelHealth;
|
|
133
142
|
private leaveConnected;
|
package/lib/adapter.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,iBAAiB,EACjB,6BAA6B,EAC7B,eAAe,EACf,sBAAsB,EACtB,sBAAsB,EACtB,oBAAoB,EACpB,2BAA2B,EAC3B,2BAA2B,EAC3B,2BAA2B,EAC3B,2BAA2B,EAE3B,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,oBAAoB,EACpB,6BAA6B,EAC7B,4BAA4B,EAC5B,cAAc,EACd,qBAAqB,EACtB,MAAM,kCAAkC,CAAA;AAuCzC,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"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"}
|
package/lib/adapter.js
CHANGED
|
@@ -316,6 +316,7 @@ export class LarkDeliveryAdapter {
|
|
|
316
316
|
toolApprovalTombstones = new Map();
|
|
317
317
|
toolApprovalUpdates = new Set();
|
|
318
318
|
closing = false;
|
|
319
|
+
deliveryContext;
|
|
319
320
|
presentationGeneration = 0;
|
|
320
321
|
modelSelectionUpdates = new Map();
|
|
321
322
|
state = 'disconnected';
|
|
@@ -329,7 +330,10 @@ export class LarkDeliveryAdapter {
|
|
|
329
330
|
&& options.settlePermissionSelection !== undefined;
|
|
330
331
|
this.capabilities = Object.freeze({
|
|
331
332
|
reconcileUnknownSend: false,
|
|
332
|
-
receipts: [],
|
|
333
|
+
receipts: ['read'],
|
|
334
|
+
// Feishu only reports DM reads; reconnect gaps are not replayable, so
|
|
335
|
+
// absence of a read event must never be treated as authoritative.
|
|
336
|
+
readReceipts: 'best-effort',
|
|
333
337
|
formats: permissionPickerAvailable
|
|
334
338
|
? ['plain', 'markdown', 'approval', 'model-picker', 'permission-picker']
|
|
335
339
|
: ['plain', 'markdown', 'approval', 'model-picker'],
|
|
@@ -354,6 +358,7 @@ export class LarkDeliveryAdapter {
|
|
|
354
358
|
this.progressPresenter = new LarkProgressPresenter(transport, options.showProgress ?? true, options.progressDetails ?? 'direct', error => this.recordPresentationFailure(error), options.showBackgroundProgress ?? false);
|
|
355
359
|
}
|
|
356
360
|
async start(context) {
|
|
361
|
+
this.deliveryContext = context;
|
|
357
362
|
this.closing = false;
|
|
358
363
|
this.presentationGeneration += 1;
|
|
359
364
|
this.state = 'connecting';
|
|
@@ -406,6 +411,7 @@ export class LarkDeliveryAdapter {
|
|
|
406
411
|
}
|
|
407
412
|
},
|
|
408
413
|
cardAction: async (action) => this.handleCardAction(action),
|
|
414
|
+
readReceipt: receipt => this.forwardReadReceipt(receipt),
|
|
409
415
|
reconnecting: () => {
|
|
410
416
|
this.cancelPendingToolApprovals('unavailable');
|
|
411
417
|
this.gapGeneration += 1;
|
|
@@ -433,6 +439,8 @@ export class LarkDeliveryAdapter {
|
|
|
433
439
|
recoveryTimer.unref?.();
|
|
434
440
|
}
|
|
435
441
|
catch (error) {
|
|
442
|
+
if (this.deliveryContext === context)
|
|
443
|
+
this.deliveryContext = undefined;
|
|
436
444
|
this.progressPresenter.stop();
|
|
437
445
|
unsubscribe();
|
|
438
446
|
this.state = 'disconnected';
|
|
@@ -455,6 +463,8 @@ export class LarkDeliveryAdapter {
|
|
|
455
463
|
this.cancelPendingUserQuestions();
|
|
456
464
|
this.clearUserQuestionAnswerEvents();
|
|
457
465
|
this.cancelModelSelectionUpdates();
|
|
466
|
+
if (this.deliveryContext === context)
|
|
467
|
+
this.deliveryContext = undefined;
|
|
458
468
|
this.closing = true;
|
|
459
469
|
await this.drainToolApprovalUpdates();
|
|
460
470
|
await this.transport.disconnect();
|
|
@@ -478,6 +488,24 @@ export class LarkDeliveryAdapter {
|
|
|
478
488
|
* and the transient normalized text the digest covers). Optional on older
|
|
479
489
|
* Delivery cores and never allowed to affect acceptance.
|
|
480
490
|
*/
|
|
491
|
+
/**
|
|
492
|
+
* Best-effort read acknowledgement for bot-authored DM messages.
|
|
493
|
+
*
|
|
494
|
+
* Delivery owns the monotonic receipt state; an unknown provider id (for
|
|
495
|
+
* example a message the bot sent before this process) is expected and must
|
|
496
|
+
* not escape the WebSocket handler. Duplicate ids in one event are collapsed.
|
|
497
|
+
*/
|
|
498
|
+
forwardReadReceipt(receipt) {
|
|
499
|
+
const context = this.deliveryContext;
|
|
500
|
+
if (context === undefined)
|
|
501
|
+
return;
|
|
502
|
+
for (const messageId of new Set(receipt.messageIds)) {
|
|
503
|
+
void context.receipt({ channel: 'lark', account: this.account, providerMessageId: messageId,
|
|
504
|
+
status: 'read', occurredAt: receipt.readAt }).catch(() => {
|
|
505
|
+
// Receipt mismatch/conflict is a Delivery-side no-op for this adapter.
|
|
506
|
+
});
|
|
507
|
+
}
|
|
508
|
+
}
|
|
481
509
|
observeIntake(context, message, addressed, text) {
|
|
482
510
|
if (typeof context.observe !== 'function')
|
|
483
511
|
return;
|