@dsh-enhanced/lark-channel 0.1.3 → 0.1.4
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 +69 -279
- package/bin/dsh-lark-setup.js +2 -2
- package/cordis.patch.yml +1 -0
- package/docs/operations.md +118 -0
- package/docs/progress-security.md +123 -0
- package/docs/setup.md +281 -0
- package/docs/supervised-growth.md +56 -0
- package/lib/adapter.d.ts +10 -18
- package/lib/adapter.d.ts.map +1 -1
- package/lib/adapter.js +152 -15
- package/lib/adapter.js.map +1 -1
- package/lib/config.d.ts +1 -0
- package/lib/config.d.ts.map +1 -1
- package/lib/config.js +2 -0
- package/lib/config.js.map +1 -1
- package/lib/index.d.ts +2 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/progress.d.ts +3 -1
- package/lib/progress.d.ts.map +1 -1
- package/lib/progress.js +107 -20
- package/lib/progress.js.map +1 -1
- package/lib/sdk.d.ts +9 -0
- package/lib/sdk.d.ts.map +1 -1
- package/lib/sdk.js +103 -0
- package/lib/sdk.js.map +1 -1
- package/lib/service.d.ts.map +1 -1
- package/lib/service.js +2 -0
- package/lib/service.js.map +1 -1
- package/lib/setup-profile.d.ts +1 -1
- package/lib/setup-profile.d.ts.map +1 -1
- package/lib/setup-profile.js +8 -4
- package/lib/setup-profile.js.map +1 -1
- package/lib/setup.d.ts +78 -1
- package/lib/setup.d.ts.map +1 -1
- package/lib/setup.js +963 -86
- package/lib/setup.js.map +1 -1
- package/lib/systemd.d.ts +25 -4
- package/lib/systemd.d.ts.map +1 -1
- package/lib/systemd.js +168 -19
- package/lib/systemd.js.map +1 -1
- package/lib/types.d.ts +18 -0
- package/lib/types.d.ts.map +1 -1
- package/lib/types.js.map +1 -1
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/lib/windows-task.d.ts +3 -0
- package/lib/windows-task.d.ts.map +1 -1
- package/lib/windows-task.js +27 -1
- package/lib/windows-task.js.map +1 -1
- package/package.json +6 -5
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
# 进度展示、安全与权限边界
|
|
2
|
+
|
|
3
|
+
## 默认进度策略
|
|
4
|
+
|
|
5
|
+
进度是展示层,不是 Delivery 的可靠性真源。`assistant-delivery` 先把 session fact 转成有界、可展示的强类型 update,Lark adapter 再按会话受众决定是否发送细节。
|
|
6
|
+
|
|
7
|
+
```yaml
|
|
8
|
+
config:
|
|
9
|
+
showProgress: true
|
|
10
|
+
progressDetails: direct
|
|
11
|
+
statusReactions: true
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
| 配置 | 私聊 | 群聊 |
|
|
15
|
+
| --- | --- | --- |
|
|
16
|
+
| `showProgress: false` | 不创建原生进度 | 不创建原生进度 |
|
|
17
|
+
| `showProgress: true`, `progressDetails: off` | 阶段、步骤、工具名、成功/失败、待办、终态 | 同左 |
|
|
18
|
+
| `showProgress: true`, `progressDetails: direct`(默认) | 上述状态,以及限长、常见凭据已脱敏的工具参数与结果 | 仍仅显示状态,不发送参数或结果 |
|
|
19
|
+
|
|
20
|
+
`progressDetails` 只接受 `off` 或 `direct`,不存在允许群聊详情的模式。群聊即使由 owner 直接 @ 机器人,也始终是 status-only。
|
|
21
|
+
|
|
22
|
+
`assistant/chunk` 的流式 `reasoning-delta` 与 `assistant/message` 的已组装 reasoning 块都不会越过 Delivery 的进度边界;DSH 将它们定义为 thinking content,不保证是可公开摘要。provider 原始错误消息、系统提示和完整工具对象同样不会进入进度。`step/start` 会产生中性的阶段文案,避免面板为空。
|
|
23
|
+
|
|
24
|
+
## 工具参数和结果 preview
|
|
25
|
+
|
|
26
|
+
私聊详情来自 Delivery 生成的 presentation-only preview,不是 durable Delivery state:
|
|
27
|
+
|
|
28
|
+
- 工具参数优先解析为 JSON,并递归处理敏感 key;最大输入 32,768 字符、最大深度 16、最多 500 个节点,每层数组/对象最多保留 100 项;
|
|
29
|
+
- 单个参数或结果 preview 最多 1,500 个 Unicode 字符;超限内容明确标记 truncated;
|
|
30
|
+
- 常见敏感 key 包括 API/access key、authorization/bearer、cookie、credential、password/passwd、private key、secret、session/token 等,并识别 snake_case、kebab-case、camelCase 与常见前缀;
|
|
31
|
+
- 合法 JSON 结果会先递归脱敏;普通文本中未加引号的敏感赋值因没有可靠终止符,会保守遮蔽到当前逻辑行末;
|
|
32
|
+
- 文本还会处理 PEM private key、URL userinfo、Basic/Bearer authorization、GitHub/OpenAI/xAI 风格 token 和 JWT 形态;
|
|
33
|
+
- 图片结果显示为 `[图片]`,嵌套工具结果有深度限制;
|
|
34
|
+
- 空参数按 `{}` 展示;无法解析或原始输入超过上限时只显示 `invalidJson` / `truncated` JSON 状态,不回显不可信 raw text。
|
|
35
|
+
|
|
36
|
+
这是一层常见凭据防泄漏措施,不是通用秘密扫描器。业务数据、未识别的 token 格式或敏感自然语言仍可能出现在经 Delivery 授权的私聊;默认向导只授权 owner。若不希望任何参数/结果离开 Host,应设置 `progressDetails: off`。群聊不依赖脱敏结果,adapter 直接丢弃参数与结果 preview。
|
|
37
|
+
|
|
38
|
+
## 飞书 `message_cot` 映射
|
|
39
|
+
|
|
40
|
+
原生进度使用 `/open-apis/im/v1/message_cot`。该接口不在固定版 Node SDK 的高层 API 中,因此 transport 直接调用 OpenAPI,并把它视为可降级能力。
|
|
41
|
+
|
|
42
|
+
HTTP 外层使用 `cot_id`、`message_id`、`event_type` 等 snake_case 字段;`events[].content` 则是独立的 AG-UI JSON,必须使用 `messageId`、`delta`、`threadId`、`runId`、`toolCallId` 等 camelCase 字段。若把外层 snake_case 混入 content,飞书会把 JSON 原样显示为正文,而不是渲染 COT 气泡。
|
|
43
|
+
|
|
44
|
+
强类型 update 映射如下:
|
|
45
|
+
|
|
46
|
+
- started:`RUN_STARTED` 加“正在分析请求并制定执行步骤…”;
|
|
47
|
+
- step:独立文本 message id,追加中性阶段说明;
|
|
48
|
+
- tool-started:工具名和开始/结束事件;只在允许详情的授权私聊附加 `TOOL_CALL_ARGS`;
|
|
49
|
+
- tool-finished:私聊详情显示有界结果和短错误码;其他情况只显示“已完成”或“执行失败”,错误码固定为 `TOOL_FAILED`;
|
|
50
|
+
- todos:最多 20 项,每项最多 240 字符,显示 pending / in-progress / completed 状态;
|
|
51
|
+
- completed / failed:明确终态。失败会在正文写“任务未完成”并仅附短错误码,再发送 `RUN_ERROR`。
|
|
52
|
+
|
|
53
|
+
同一运行的步骤与待办各自使用独立 `messageId`,避免新内容覆盖旧气泡。单个编码事件限制为 4,096 字符;JSON 转义后仍超限时会继续缩短可见文本,并保留 tool/result identity 与 truncated 标记。
|
|
54
|
+
|
|
55
|
+
provider 可能在生成任何正文前失败。只发送 `RUN_ERROR` 会让飞书面板停在首行、看似卡住,因此失败路径额外追加“任务未完成”;仅在 `progressDetails: direct` 的授权私聊透传短错误码,不发送可能含 prompt 或上游载荷的原始错误消息。群聊和 `off` 模式只显示通用失败状态。
|
|
56
|
+
|
|
57
|
+
创建或更新 `message_cot` 失败只写入 channel health,不重跑任务,不改变 Outbox settlement,也不阻断最终回复。租户或应用类型不支持该接口时会自然退化为 reaction 与最终答复;查看 `assistant_health.larkChannel.lastErrorCode` 和 Host 错误日志定位展示问题。
|
|
58
|
+
|
|
59
|
+
## Reaction 状态
|
|
60
|
+
|
|
61
|
+
只有合法、非重复且已经 `queued` 的入站会异步添加大小写敏感的 `Get`。最终答复成功回复原消息后才异步添加 `DONE`。未授权、死信、重放、发送失败、无最终回复、任务失败或取消不会添加相应状态。
|
|
62
|
+
|
|
63
|
+
reaction 与 `message_cot` 都是 best-effort。其失败只降低 channel health,不影响 Delivery 已持久化的 Inbox/Outbox,也不会触发任务重跑。首版保留 `Get`,不会为了替换表情申请 reaction 读取权限。
|
|
64
|
+
|
|
65
|
+
## Agent Policy 与权限档位
|
|
66
|
+
|
|
67
|
+
`--allow-agent-tools` 是高权限显式开关。它为本地 Web/direct `foreground` 写入跨 preset/workspace 的通用 capability allow,并为 Delivery 当前/兼容的精确 canonical owner principal + preset + 绝对 workspace + `external` initiator 写入通用 capability 与工具规则。默认不附带工具 deny,因此这些身份可达部署已挂载的动态 skill/插件工具,也可进入 `memory.search`、`wiki.read`、`automation.propose` 等插件内部二次 Policy 检查。`background` initiator 不在这两类规则中。
|
|
68
|
+
|
|
69
|
+
action/resource 使用通配而非静态枚举,是因为模型工具和插件动作都由实际挂载动态注册;静态列表会在新能力加入时立刻过期,表现为 Agent 已看到工具却被 `default-deny`,或进入插件后被二次门拒绝。
|
|
70
|
+
|
|
71
|
+
这些规则决定 Policy 层可达性,不会安装或挂载插件。模型工具仍经过 sandbox、approval reviewer 和 `assistant-policy` 的 `tools/pre-execute`;插件内部动作仍经过身份、参数、预算和业务硬门。显式 deny、紧急停止与这些硬门不会被通配 allow 绕过。ask/auto 中,文件写入、网络访问和危险命令仍可能要求审批。
|
|
72
|
+
|
|
73
|
+
owner 可用 `/permissions` 查看档位,用 `/permission ask`、`/permission auto` 或 `/permission full confirm` 切换:
|
|
74
|
+
|
|
75
|
+
- `ask`:需要审阅的调用向 owner 私聊发一次性审批卡;
|
|
76
|
+
- `auto`:低风险自动允许,敏感、reviewer 失败或原生 sandbox escalation 发审批卡;
|
|
77
|
+
- `full`:`danger-full-access + never + none`,关闭逐次审批并放开 sandbox,但显式 deny、紧急停止、身份与预算硬门仍生效。
|
|
78
|
+
|
|
79
|
+
若需收紧具体工具,应配置显式 deny 或更窄 allow;deny 优先于通配 allow。Delivery 外部主体的 `subject.id` 与 workspace 始终精确;只有本地 foreground 为支持 Web/direct 切换而使用 `*`,并由 `initiator: foreground` 隔离。
|
|
80
|
+
|
|
81
|
+
Bash/Pwsh 本身可启动子进程并访问 sandbox 允许的内容。选择 full 后,应把飞书 owner 和应用可用范围保持最小,并按需配置 deny、紧急停止和预算。
|
|
82
|
+
|
|
83
|
+
`skill` 是标准 DSH base 中 `tool-skill` row 注册的模型工具,用于发现和加载 `ctx.skills`(包括 `skill-filesystem` 提供的本机 `SKILL.md`)。通用 capability/工具规则已经覆盖它,无需单独授权;技能加载不会额外提权,内部命令仍走相同 sandbox、approval 与 Policy 管线。
|
|
84
|
+
|
|
85
|
+
## Policy 拒绝诊断
|
|
86
|
+
|
|
87
|
+
外部会话报告工具被拒时,检查 `~/.dsh/assistant-policy/policy.sqlite` 的 `audit_events`:
|
|
88
|
+
|
|
89
|
+
- `reason_code: default-deny`:没有规则匹配该会话,通常是 principal、preset 或 workspace 与 Delivery binding 不一致;运行 `dsh-lark-setup --profile web --refresh-agent-policy --allow-agent-tools` 对齐;
|
|
90
|
+
- `reason_code: rule-deny`:命中显式 deny。
|
|
91
|
+
|
|
92
|
+
两者都不是审批拦截。审批由 `tools/pre-execute` reviewer 发起,不写 `audit_events` denied 记录。
|
|
93
|
+
|
|
94
|
+
Policy tool guard 与插件内部 `authorizeAgent()` 都携带 Delivery binding 的 canonical principal。setup 创建的 external reply/capability/tool 规则只匹配当前 account 的精确 owner;其他 connector、Lark account 或 principal 即使使用相同 preset/workspace,也不会继承授权。owner 在群内 @ 机器人时仍沿用同一 principal,因此这不是“仅 owner 私聊才能调用工具”的限制;只有审批卡和参数/结果详情限于 owner DM。
|
|
95
|
+
|
|
96
|
+
## 审批卡的边界
|
|
97
|
+
|
|
98
|
+
durable proposal 卡和 open-turn 工具审批卡是两个独立协议。具体签名、settlement 与崩溃恢复语义见[操作文档](operations.md#durable-proposal-与-open-turn-工具审批)。共同原则是:
|
|
99
|
+
|
|
100
|
+
- capability 与原 route、chat、owner、binding/operation 和 expiry 绑定;
|
|
101
|
+
- 篡改、重放、错人、跨 chat/message 和普通过期点击失败关闭;
|
|
102
|
+
- exact tool arguments 只出现在 active owner 的无 thread 私聊,并明确标为不可信审阅文本;
|
|
103
|
+
- 群聊、话题和伪装的 DM target 不显示审批详情;
|
|
104
|
+
- 模型不能直接决定、伪造或发送审批卡,也不能绕过 Delivery/Policy settlement。
|
|
105
|
+
|
|
106
|
+
## Authority 与数据边界
|
|
107
|
+
|
|
108
|
+
- **网络:**只访问所选 `domain` 的飞书/Lark OpenAPI、token 服务和 WebSocket endpoint。图片读取使用固定消息资源相对端点,不接受模型、消息正文或 provider payload 提供的 URL,并关闭重定向;本包没有通用 HTTP 工具。
|
|
109
|
+
- **凭据:**优先通过 `credentials-keychain` handle 获取;兼容模式只读取 `appSecretEnv` 指定的一项。值不写数据库、不进入 tool、health、route、日志或异常文本。Linux protected-file 没有额外静态加密,同 UID、root 和可读备份能取得内容;runtime 会复核父目录/文件 owner、类型、链接数、`0700`/`0600` 与大小。`appId` 不是 Secret。
|
|
110
|
+
- **文件系统:**runtime 除 credential provider 读取受保护 Secret 外没有业务文件读写。setup wizard 原子更新所选 profile patch,通过 Delivery 本地控制面写入精确 owner,以版本化独占路径创建 Linux protected-file,并以 `0600` 写用户级 LaunchAgent/systemd 配置,在 `$DSH_HOME/logs` 创建 Host 日志。SDK 依赖 `protobufjs` 的 postinstall 只打印版本建议;仓库显式设置 `allowBuilds: false`,运行不需要安装脚本。
|
|
111
|
+
- **子进程:**runtime 只使用 credential provider 的固定、无 shell 命令。setup 在 macOS 调用 `/usr/bin/security` 与 launchd;Linux 按需调用 `/usr/bin/secret-tool`、`/usr/bin/systemd-ask-password`、`loginctl`、`systemctl --user`;Windows 调用固定 PowerShell DPAPI 命令与 Task Scheduler。Secret 只经 stdin 或 setup-owned protected-file 传递,不作为 argv。所有平台调用 `dsh --dump-config` 校验;常驻配置只含解析后程序路径和最小环境,不复制 ambient token/password。
|
|
112
|
+
- **浏览器:**setup 输出飞书官方短期设备授权链接与二维码,不自动操控浏览器。用户在官方页面选择或创建应用并确认权限增量。
|
|
113
|
+
- **消息数据:**Delivery SQLite 保存标准化文本、provider message id、chat/user/thread id 和最多 10 个受限附件描述符。raw event、token 与下载 URL 不保存;provider file key 只是隔离账本中的不可信引用,不进入模型正文。授权 worker 下载图片字节后只交 AttachmentStore;本插件不把二进制写入 Delivery session 或 prompt。
|
|
114
|
+
- **进度数据:**状态与文字均限长。私聊详情是限长且常见凭据脱敏的 preview;群聊不发送参数/结果;任何会话都不发送 reasoning/thinking 内容或 provider 原始错误详情。
|
|
115
|
+
- **群消息:**默认必须直接提及机器人;`@all` 不等于提及机器人。最终授权始终由 Delivery/Policy 决定。
|
|
116
|
+
|
|
117
|
+
## 当前边界
|
|
118
|
+
|
|
119
|
+
- v0.1 自动处理文本和图片描述符入站、文本/Markdown-card 出站、durable proposal、owner-DM one-shot tool approval、model/permission picker、`Get`/`DONE` 与脱敏原生进度。模型不能提交任意 card JSON,也不能直接控制 reaction 或进度载荷。
|
|
120
|
+
- 只有图片资源具备受限下载能力,而且只有 Delivery 图片桥、AttachmentStore 与目标模型图片能力全部存在时启用。文件、音频、视频和 sticker 仍只进入 durable metadata quarantine;本插件不做病毒扫描或附件出站上传。
|
|
121
|
+
- 消息编辑和上传尚未实现;未来也必须先创建 Delivery 持久 operation,不能让模型直接调用 SDK。
|
|
122
|
+
- 单应用长连接是集群竞争消费,不提供广播或多节点 exactly-once。当前 suite 的可靠性目标是由 supervisor 管理的单机进程。
|
|
123
|
+
- setup wizard 正式支持 macOS 与 Linux,Windows 为 best-effort;需要交互式终端和一次 owner 私聊,不接受 `--app-secret` 参数。一键模式在扫码确认后通过官方流程选择或创建应用;企业管理员审批等租户控制面仍由飞书强制执行。
|
package/docs/setup.md
ADDED
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
# 安装、凭据与常驻服务
|
|
2
|
+
|
|
3
|
+
本页记录 `@dsh-enhanced/lark-channel` 的完整接入流程。首次部署推荐使用 setup wizard;只有已在飞书控制台完成应用配置时,才使用手工凭据路径。
|
|
4
|
+
|
|
5
|
+
## 安装
|
|
6
|
+
|
|
7
|
+
先安装并配置 `@dsh-enhanced/assistant-policy` 与 `@dsh-enhanced/assistant-delivery`,再安装本包:
|
|
8
|
+
|
|
9
|
+
```sh
|
|
10
|
+
dsh plugin --profile web add @dsh-enhanced/lark-channel
|
|
11
|
+
dsh --profile web --dump-config
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
插件默认 `enabled: false`,因此安装不会立即读取凭据或联网。
|
|
15
|
+
|
|
16
|
+
## 推荐:setup wizard
|
|
17
|
+
|
|
18
|
+
安装完成后,让向导配置 Keychain、owner 身份、最小 Policy、Web profile 和用户级常驻服务:
|
|
19
|
+
|
|
20
|
+
```sh
|
|
21
|
+
~/.dsh/profiles/web/node_modules/.bin/dsh-lark-setup \
|
|
22
|
+
--profile web \
|
|
23
|
+
--create-app \
|
|
24
|
+
--allow-agent-tools
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
源码工作区可运行:
|
|
28
|
+
|
|
29
|
+
```sh
|
|
30
|
+
cd /path/to/dsh-enhanced
|
|
31
|
+
pnpm --filter @dsh-enhanced/lark-channel build
|
|
32
|
+
pnpm --filter @dsh-enhanced/lark-channel run onboard --profile web --create-app --allow-agent-tools
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
向导依次完成:
|
|
36
|
+
|
|
37
|
+
1. 调用飞书官方 Node SDK 的 `registerApp`,显示十分钟有效的确认链接和终端二维码;
|
|
38
|
+
2. 在飞书中选择已有应用或创建新应用,并确认权限增量;
|
|
39
|
+
3. 把返回的 App Secret 写入 macOS Keychain、Linux Secret Service、无桌面 Linux 的版本化 `0600` protected-file,或当前 Windows 用户的 DPAPI 加密文件;Secret 不经过命令行参数、不写 profile、也不打印;
|
|
40
|
+
4. 使用真实凭据建立一次临时长连接;
|
|
41
|
+
5. 显示一次性 `DSH-CONNECT-...` 短语,并等待你私聊机器人原样发送;
|
|
42
|
+
6. 从单聊取得应用作用域内准确的 `open_id`,只把该身份配置为 owner;
|
|
43
|
+
7. 更新 `web/cordis.patch.yml`,启用 channel 并添加精确 ingress/reply/credential 规则;传入 `--allow-agent-tools` 时,还会创建本地 foreground 与精确 Delivery 主体的 capability/工具规则;随后运行 `dsh --profile web --dump-config` 自检;
|
|
44
|
+
8. 安装并启动该 profile 的用户级常驻服务:macOS 使用 launchd,Linux 使用 systemd,Windows 使用 best-effort Task Scheduler;命令均为 `dsh --profile web --no-open`。
|
|
45
|
+
|
|
46
|
+
飞书授权只建立应用凭据和 owner 绑定。插件仍运行在 DSH Host 内;安装到 `web` profile 时,向导默认让该 profile 在后台常驻,不需要保持浏览器打开,也不需要另行运行 `dsh web`。
|
|
47
|
+
|
|
48
|
+
### 官方一键授权的范围
|
|
49
|
+
|
|
50
|
+
一键模式使用 OAuth 2.0 Device Authorization Grant。只传 `--create-app` 时,确认页同时提供“选择已有应用”和“创建新应用”;同时传 `--app-id` 时,只更新该已有应用。两种方式都会先显示权限、事件与回调增量,确认后才生效。
|
|
51
|
+
|
|
52
|
+
向导不传 `createOnly`,并使用 `addons.preset: false`,不会采用官方默认智能体模板中与本 channel 无关的文档、Wiki、群管理和批量消息权限。确认页只申请:
|
|
53
|
+
|
|
54
|
+
- `application:bot.basic_info:read`:连接时取得机器人身份;
|
|
55
|
+
- `im:message.p2p_msg:readonly`、`im:message.group_at_msg:readonly`:接收私聊和群内 @ 消息;
|
|
56
|
+
- `im:message.reactions:write_only`:添加 `Get` / `DONE`;
|
|
57
|
+
- `im:message:send_as_bot`:发送和回复消息;
|
|
58
|
+
- `im:resource`:按消息 ID 与该消息中的 image key 调用[消息资源接口](https://open.feishu.cn/document/server-docs/im-v1/message-resource/get)下载用户图片;
|
|
59
|
+
- `im.message.receive_v1`:消息事件;
|
|
60
|
+
- `card.action.trigger`:审批卡片、模型级联选择和最终确认按钮。
|
|
61
|
+
|
|
62
|
+
事件与回调由官方流程预置为 WebSocket 长连接,不需要公网 callback URL。实现依据见飞书的[一键创建智能体应用](https://open.larkoffice.com/document/mcp_open_tools/integrating-agents-with-feishu/overview)和 Node SDK 的 [`registerApp` 文档](https://github.com/larksuite/node-sdk/blob/main/README.zh.md#%E4%B8%80%E9%94%AE%E5%88%9B%E5%BB%BA%E5%BA%94%E7%94%A8)。
|
|
63
|
+
|
|
64
|
+
### 复用已有应用
|
|
65
|
+
|
|
66
|
+
```sh
|
|
67
|
+
# 通过官方授权页增量补齐指定应用的权限、事件和回调(推荐)
|
|
68
|
+
~/.dsh/profiles/web/node_modules/.bin/dsh-lark-setup \
|
|
69
|
+
--profile web \
|
|
70
|
+
--create-app \
|
|
71
|
+
--app-id cli_0123456789abcdef
|
|
72
|
+
|
|
73
|
+
# 只安全录入已有凭据,不修改飞书控制台
|
|
74
|
+
~/.dsh/profiles/web/node_modules/.bin/dsh-lark-setup \
|
|
75
|
+
--profile web \
|
|
76
|
+
--app-id cli_0123456789abcdef
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
单独使用 `--app-id` 时,向导通过当前系统的安全输入读取 App Secret,适合已经自行配置控制台的应用。省略 `--create-app` 和 `--app-id` 时,向导会询问 App ID;直接回车进入一键选择/创建。
|
|
80
|
+
|
|
81
|
+
重复执行会更新同一 account 的受管配置,不会重复添加规则或 handle。Agent 能力策略是显式三态:
|
|
82
|
+
|
|
83
|
+
- 不传参数:保留现状;
|
|
84
|
+
- `--allow-agent-tools`:写入本地 foreground 与精确 Delivery 主体的通用 capability 可达性规则,并保留外部主体工具级 allow/deny;
|
|
85
|
+
- `--disable-agent-tools`:删除向导为该 account 管理的这些规则。
|
|
86
|
+
|
|
87
|
+
普通重跑不会意外授权或撤权。profile 校验失败时会在进程内恢复原内容,不保留备份文件。
|
|
88
|
+
|
|
89
|
+
## 只刷新 Agent Policy
|
|
90
|
+
|
|
91
|
+
更新 capability 规则不需要重走 onboarding;未启用飞书的 Web/direct-only profile 也可刷新本地 foreground:
|
|
92
|
+
|
|
93
|
+
```sh
|
|
94
|
+
# 写入/刷新本地 foreground;若飞书已启用,同时刷新精确 Delivery 规则
|
|
95
|
+
~/.dsh/profiles/web/node_modules/.bin/dsh-lark-setup \
|
|
96
|
+
--profile web \
|
|
97
|
+
--refresh-agent-policy \
|
|
98
|
+
--allow-agent-tools
|
|
99
|
+
|
|
100
|
+
# 删除 setup 托管的 foreground;若飞书已启用,同时删除该 account 的 Agent 规则
|
|
101
|
+
~/.dsh/profiles/web/node_modules/.bin/dsh-lark-setup \
|
|
102
|
+
--profile web \
|
|
103
|
+
--refresh-agent-policy \
|
|
104
|
+
--disable-agent-tools
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
`--refresh-agent-policy` 必须与 allow/disable 之一搭配;除 `--profile` 外只可选 `--account`。本地 foreground 规则独立于 Lark row,总能在已安装的 personal-assistant profile 中刷新;只有 profile 已启用 Lark 时才重建精确 Delivery 规则,显式 account 也必须完全相同。
|
|
108
|
+
|
|
109
|
+
该模式不读取 App Secret、不发起设备授权,不修改 App、credential handle、owner、conversation binding 或其他 channel 配置,也不安装或重启常驻服务。它原子写入 profile 后立刻运行 `dsh --dump-config`;失败时原子恢复原 patch。
|
|
110
|
+
|
|
111
|
+
## 手工配置插件
|
|
112
|
+
|
|
113
|
+
不使用向导时,可在 profile patch 中填写真实值:
|
|
114
|
+
|
|
115
|
+
```yaml
|
|
116
|
+
config:
|
|
117
|
+
enabled: true
|
|
118
|
+
account: personal-bot
|
|
119
|
+
tenant: personal
|
|
120
|
+
appId: cli_0123456789abcdef
|
|
121
|
+
credentialHandle: lark-app-secret
|
|
122
|
+
credentialPurpose: connect
|
|
123
|
+
credentialLeaseMs: 86400000
|
|
124
|
+
domain: feishu
|
|
125
|
+
requireMentionInGroups: true
|
|
126
|
+
showProgress: true
|
|
127
|
+
progressDetails: direct
|
|
128
|
+
statusReactions: true
|
|
129
|
+
imageDownloadTimeoutMs: 30000
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
credential handle 由 `@dsh-enhanced/credentials-keychain` 提供,并应只允许 consumer `dsh-enhanced-lark-channel`、purpose `connect`。兼容部署可不激活 keychain service,改为只设置 `appSecretEnv`,再通过进程环境或操作系统 service manager 注入:
|
|
133
|
+
|
|
134
|
+
```sh
|
|
135
|
+
LARK_APP_SECRET='...' dsh --profile web
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
`credentialHandle` 与 `appSecretEnv` 只能选择一个;配置不接受 `appSecret` 等明文字段。handle 模式会让 adapter 的完整连接生命周期处于 credential lease callback 内。自然 TTL 到期时会先清理旧连接,再申请新 lease 并重连;运维撤销或插件卸载会清理连接并停止续租,不能把 revoke 当成 expiry 自动恢复。
|
|
139
|
+
|
|
140
|
+
若以 `appSecretEnv: LARK_APP_SECRET` 配合 `--install-service`,生成的 user unit 不会继承登录 shell 的变量,也不会替你保存 Secret。应使用自有 supervisor,或为目标 profile 创建仅当前用户可读的 systemd drop-in:
|
|
141
|
+
|
|
142
|
+
```sh
|
|
143
|
+
install -d -m 700 ~/.config/dsh ~/.config/systemd/user/dsh-profile-web.service.d
|
|
144
|
+
# 用编辑器创建 ~/.config/dsh/lark-web.env,内容为 LARK_APP_SECRET=...,权限设为 0600。
|
|
145
|
+
chmod 600 ~/.config/dsh/lark-web.env
|
|
146
|
+
|
|
147
|
+
# 用编辑器创建 ~/.config/systemd/user/dsh-profile-web.service.d/secret.conf:
|
|
148
|
+
# [Service]
|
|
149
|
+
# EnvironmentFile=%h/.config/dsh/lark-web.env
|
|
150
|
+
systemctl --user daemon-reload
|
|
151
|
+
systemctl --user restart dsh-profile-web.service
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
不要把 Secret 放入 profile 或 shell history。
|
|
155
|
+
|
|
156
|
+
## 常驻服务
|
|
157
|
+
|
|
158
|
+
已完成飞书配置,只需安装或重启服务时运行:
|
|
159
|
+
|
|
160
|
+
```sh
|
|
161
|
+
~/.dsh/profiles/web/node_modules/.bin/dsh-lark-setup \
|
|
162
|
+
--profile web \
|
|
163
|
+
--install-service
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
若自行管理进程,在首次向导中加入 `--no-service`,然后用 supervisor 运行 `dsh --profile web --no-open`。不要同时启动前台与系统服务的两个相同 profile,否则 Web 端口和飞书长连接会竞争。
|
|
167
|
+
|
|
168
|
+
### macOS
|
|
169
|
+
|
|
170
|
+
向导创建 `~/Library/LaunchAgents/ai.deepseek.dsh.profile.web.plist`,登录后自动启动并在异常退出后拉起。配置只包含 `DSH_HOME` 与不含相对目录的 `PATH`,不会复制当前 shell 的 token、password 或其他环境变量。
|
|
171
|
+
|
|
172
|
+
```sh
|
|
173
|
+
launchctl print gui/$(id -u)/ai.deepseek.dsh.profile.web
|
|
174
|
+
tail -f ~/.dsh/logs/web-host.error.log
|
|
175
|
+
|
|
176
|
+
# 停止并卸载;再次执行 --install-service 可恢复
|
|
177
|
+
launchctl bootout gui/$(id -u)/ai.deepseek.dsh.profile.web
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
### Linux
|
|
181
|
+
|
|
182
|
+
向导创建私有的 `~/.config/systemd/user/dsh-profile-web.service`,只配置 DSH 所需路径及 Secret Service 可能需要的用户 D-Bus/XDG 定位。OAuth 前会检查 systemd user manager,并尝试为当前用户启用 linger,以便 SSH 注销后继续运行。若系统需要管理员授权,向导会在修改飞书应用前停止,并显示唯一需要执行的命令:
|
|
183
|
+
|
|
184
|
+
```sh
|
|
185
|
+
sudo loginctl enable-linger "$(id -u)"
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
日常运维:
|
|
189
|
+
|
|
190
|
+
```sh
|
|
191
|
+
systemctl --user status dsh-profile-web.service
|
|
192
|
+
journalctl --user -u dsh-profile-web.service -f
|
|
193
|
+
systemctl --user restart dsh-profile-web.service
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
纯 SSH 和无桌面 Linux 支持一键向导;内建服务仍要求 systemd/logind user manager 并允许 linger。不具备这些组件的容器应使用 `--no-service`,交给 Docker、s6、runit 等外部 supervisor。当前安装器要求可调用的 `systemctl` / `loginctl`;不符合这一约束的 Nix、Guix 或精简容器也应使用外部 supervisor。
|
|
197
|
+
|
|
198
|
+
### Windows
|
|
199
|
+
|
|
200
|
+
Windows 会把 DPAPI 加密的 PSCredential 保存到 `$DSH_HOME/credentials-keychain`,并创建当前用户的 `DSH profile web` 登录任务。不会保存明文,但 Windows/Node/npm/Git Bash 组合差异较大,因此只提供 best-effort 支持:
|
|
201
|
+
|
|
202
|
+
```powershell
|
|
203
|
+
schtasks.exe /Query /TN "DSH profile web"
|
|
204
|
+
schtasks.exe /End /TN "DSH profile web"
|
|
205
|
+
schtasks.exe /Run /TN "DSH profile web"
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
## Linux 凭据后端
|
|
209
|
+
|
|
210
|
+
默认 `auto`:若当前登录会话有可写且已解锁的 Secret Service,就使用系统钥匙环;纯 SSH、服务器、容器或 Secret Service 不可用时,自动改用 `$DSH_HOME/credentials-keychain/lark-<profile>-<account>-<32hex>.secret` 版本化私有文件。
|
|
211
|
+
|
|
212
|
+
向导在飞书 OAuth 之前确认 `credentials-keychain` 支持所选 provider,并对实际 backend 执行随机 canary 的写入、读回和删除;这样不会在应用授权后才发现版本混装或无法保存凭据。安装器会同时安装匹配的两个插件版本。
|
|
213
|
+
|
|
214
|
+
protected-file 的父目录必须为当前 UID 所有、权限 `0700`;文件必须为当前 UID 所有的 regular file、单硬链接、权限 `0600`。创建使用独占、拒绝跟随链接的版本化路径,写入和删除后同步父目录。Secret 不进入 profile、argv、环境变量或日志,Host 重启后由 `credentials-keychain` 读取同一路径。
|
|
215
|
+
|
|
216
|
+
protected-file 没有额外静态加密:同一 UID、root 和能读取该文件的备份系统仍可取得 App Secret。可显式选择:
|
|
217
|
+
|
|
218
|
+
```sh
|
|
219
|
+
# Secret Service 不可用时直接失败
|
|
220
|
+
dsh-lark-setup --profile web --linux-credential-provider secret-service
|
|
221
|
+
|
|
222
|
+
# 即使桌面钥匙环可用也使用 0600 私有文件
|
|
223
|
+
dsh-lark-setup --profile web --linux-credential-provider protected-file
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
手工输入已有 App Secret 时优先使用 `/usr/bin/systemd-ask-password`;若不存在但 stdin/stdout 是真实 TTY,则使用无回显 raw-terminal 后备,并在 Enter、Ctrl-C、SIGINT、SIGHUP 或 SIGTERM 后恢复终端模式。`--no-service` 只跳过 systemd 服务,凭据仍按上述 `auto` 规则选择。
|
|
227
|
+
|
|
228
|
+
### Secret Service 排障与事务恢复
|
|
229
|
+
|
|
230
|
+
若旧版在授权后留下 `setup failed and staged credential cleanup also failed`,不要删除 `$DSH_HOME/profiles/<profile>/cordis.patch.yml.lark-setup.journal.json`。新版确认 versioned locator 从未被 profile 激活后,会把清理义务原子转入 `cordis.patch.yml.lark-credential-cleanup.json`,清除阻塞事务并改用 protected-file 完成初始化;以后每次进入向导都会 best-effort 重试 Secret Service 清理。不要手工删除或编辑 cleanup record。
|
|
231
|
+
|
|
232
|
+
若看到 `profile and owner were committed, but previous credential cleanup is pending`,新 profile、owner 和凭据已经生效,不能回滚。向导保留同一 journal,以便修复 Secret Service 后优先重试删除旧凭据;不要删除 journal,也不要立即开始另一轮凭据旋转。
|
|
233
|
+
|
|
234
|
+
Ubuntu/Debian 图形桌面可用将运行 DSH 的普通登录用户打开终端;不要用 `sudo` 运行向导:
|
|
235
|
+
|
|
236
|
+
```sh
|
|
237
|
+
sudo apt update
|
|
238
|
+
sudo apt install --yes libsecret-tools gnome-keyring dbus-user-session
|
|
239
|
+
# 完整注销并重新登录后,在新的图形终端做无凭据检查
|
|
240
|
+
test -x /usr/bin/secret-tool
|
|
241
|
+
test -n "${DBUS_SESSION_BUS_ADDRESS:-}" || test -S "${XDG_RUNTIME_DIR:-}/bus"
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
OAuth 前的 canary 不读取、写入或显示 App Secret。出现钥匙环解锁对话框时先解锁;没有桌面 provider 时默认自动选择 protected-file,无需安装 GNOME Keyring。随后用原来的 profile/account/tenant/agent-tools 参数重跑;已创建应用可复用:
|
|
245
|
+
|
|
246
|
+
```sh
|
|
247
|
+
~/.dsh/profiles/web/node_modules/.bin/dsh-lark-setup \
|
|
248
|
+
--profile web --create-app --app-id cli_0123456789abcdef
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
`secret-tool` 与 GNOME Keyring 只在强制 `secret-service` 或希望使用桌面钥匙环时需要。
|
|
252
|
+
|
|
253
|
+
## 手工配置飞书应用
|
|
254
|
+
|
|
255
|
+
这一流程只适用于手工输入 `--app-id` 的路径;官方一键路径会预置机器人、最小权限、消息事件和卡片回调。选择已有应用时只增量添加配置,不删除现有权限。
|
|
256
|
+
|
|
257
|
+
1. 在[飞书开放平台](https://open.feishu.cn/app)创建“企业自建应用”,复制 `App ID` 与 `App Secret`;
|
|
258
|
+
2. 在“添加应用能力”中开启“机器人”;
|
|
259
|
+
3. 在“权限管理”中开通接收/发送单聊和群聊消息、`im:message.reactions:write_only` 和图片所需 `im:resource`;控制台若为接收事件提示额外权限,也按最小范围开通;
|
|
260
|
+
4. 在“事件与回调/事件订阅”选择长连接,添加 [`im.message.receive_v1`](https://open.feishu.cn/document/server-docs/im-v1/message/events/receive);使用审批卡或 `/model` 时,还需把回调订阅方式设为长连接并添加 `card.action.trigger`;
|
|
261
|
+
5. 创建并发布应用版本,把可用范围至少包含自己。未发布或不在范围内时,客户端可能搜索不到机器人或不投递事件。
|
|
262
|
+
|
|
263
|
+
企业策略需要管理员审批时,仍由管理员在飞书侧完成。运行时不需要公网 callback URL;Node SDK 的[长连接说明](https://github.com/larksuite/node-sdk/blob/main/README.zh.md#%E4%BD%BF%E7%94%A8%E9%95%BF%E9%93%BE%E6%A8%A1%E5%BC%8F%E5%A4%84%E7%90%86%E4%BA%8B%E4%BB%B6)也说明本地环境只需能访问公网。
|
|
264
|
+
|
|
265
|
+
如果应用是在 reaction、图片桥或模型卡片回调加入前绑定的,应重跑一键向导,确认新增权限和 `card.action.trigger`,然后发布新版本或完成管理员审批。指定 App ID 只增量更新,不创建第二个应用:
|
|
266
|
+
|
|
267
|
+
```sh
|
|
268
|
+
# macOS:先暂停旧长连接,避免 owner 确认消息被常驻实例竞争消费
|
|
269
|
+
launchctl bootout gui/$(id -u)/ai.deepseek.dsh.profile.web
|
|
270
|
+
|
|
271
|
+
~/.dsh/profiles/web/node_modules/.bin/dsh-lark-setup \
|
|
272
|
+
--profile web \
|
|
273
|
+
--create-app \
|
|
274
|
+
--app-id cli_0123456789abcdef
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
向导结束会重新安装并拉起服务。若在官方确认或 owner 私聊阶段取消,可运行 `dsh-lark-setup --profile web --install-service` 恢复原服务。
|
|
278
|
+
|
|
279
|
+
长连接至少需要消息事件、发送/回复消息权限和机器人身份读取。若群聊无需 `@机器人` 即触发,必须同时将 `requireMentionInGroups` 设为 `false` 并在飞书侧申请更宽的群消息权限。
|
|
280
|
+
|
|
281
|
+
`account` 与 `tenant` 是 DSH 内部稳定路由名,不是 Secret。个人单应用通常保持 `account: primary`、`tenant: personal`;真实飞书身份由向导发现的应用作用域 `open_id` 决定。陌生外部身份仍由 `assistant-delivery` fail closed;不能把“飞书能收到事件”视为已经授权。
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# 受监督成长激活器
|
|
2
|
+
|
|
3
|
+
`dsh-supervised-growth-setup --profile web` 只能在完成 Lark onboarding 后使用。它只读取 Delivery/Automations 的本地 SQLite 控制面,不解析或执行任何模型输入;首先等待一条与 profile 中 account、tenant、默认 workspace 和 preset 完全一致的 active owner 私聊 binding。没有匹配时会要求 owner 再发一条普通私聊并进行有界轮询;超时、存在多个匹配或 route 不一致时均不修改 profile。
|
|
4
|
+
|
|
5
|
+
```sh
|
|
6
|
+
~/.dsh/profiles/web/node_modules/.bin/dsh-supervised-growth-setup --profile web
|
|
7
|
+
|
|
8
|
+
# 仅当确认已有活动任务可以在 scheduler 开启后继续运行时使用
|
|
9
|
+
~/.dsh/profiles/web/node_modules/.bin/dsh-supervised-growth-setup \
|
|
10
|
+
--profile web \
|
|
11
|
+
--ack-existing-automations
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## 激活前检查
|
|
15
|
+
|
|
16
|
+
激活器会检查已有 automation。任何 active job(包括旧 `assistant-heartbeat` job)默认都会阻止启用:scheduler 开启后会加载全部 durable row,不能按 owner 名称推测旧 heartbeat 是否安全。
|
|
17
|
+
|
|
18
|
+
只有在确认所有现存任务都可在 scheduler 启用后继续运行时,才传入 `--ack-existing-automations`。这个确认不会恢复、创建或改写 job 定义,但现有 active job 之后可被 scheduler 领取。
|
|
19
|
+
|
|
20
|
+
激活器基于 `dsh --dump-config` 的有效组合树生成完整受管 overlay,不假设 raw patch 已含 meta-bundle 配置;Delivery 与 Automations 的数据库路径也从有效树取得。原子写入后,它会再次 dump 并验证:
|
|
21
|
+
|
|
22
|
+
- scheduler 配置;
|
|
23
|
+
- TraeX cwd 与 route;
|
|
24
|
+
- `automation-runs` budget;
|
|
25
|
+
- heartbeat;
|
|
26
|
+
- 每条 setup 托管的 Policy rule。
|
|
27
|
+
|
|
28
|
+
如果 home/profile 的高优先级 layer 覆盖任何受管值,写入会立即恢复。激活器在写入前和重启前都会重读同一 owner binding 的完整 route、status 与 version;version 变化、撤销或多个 binding 均 fail closed。
|
|
29
|
+
|
|
30
|
+
## Provider 与常驻健康门
|
|
31
|
+
|
|
32
|
+
重启 Host 前,激活器调用 TraeX provider 唯一的 installer-only readiness probe:固定的只读 ACP catalog handshake 检查可执行文件、登录状态和至少一个可用模型,但不会发送模型 prompt。
|
|
33
|
+
|
|
34
|
+
普通 `listModels` / `resolveModel` 不使用这项静态 cwd 例外;真实模型执行仍要求 live loop session 的 canonical cwd 与配置 workspace 完全一致。重启后还必须通过 resident running health gate,否则恢复旧 profile 和旧服务。
|
|
35
|
+
|
|
36
|
+
Windows Task Scheduler 没有该实现所需的可验证健康信号,因此 supervised growth 在 Windows 拒绝激活,不会把 best-effort 启动伪装成常驻成功。
|
|
37
|
+
|
|
38
|
+
## 生成的受控任务
|
|
39
|
+
|
|
40
|
+
受管 overlay 只允许精确 workspace/preset 的后台 heartbeat:
|
|
41
|
+
|
|
42
|
+
- 08:00–22:00 每 120 分钟执行一次,恰好每天 7 次;
|
|
43
|
+
- 每轮先调用 `evolution_review`,之后最多调用一次 `evolution_propose`;
|
|
44
|
+
- 每轮最多 2 次工具调用和 512 个输出 token;
|
|
45
|
+
- Policy budget 使用 `automation-runs`,每天最多 7 次、每次固定计 1;512 是输出上限,不是不具备可验证性的总 token 预算;
|
|
46
|
+
- pending Evolution proposal 的审批卡只允许固定 Evolution 后台主体投递到这个 exact owner binding;owner approval 仍是唯一 apply 门;
|
|
47
|
+
- scratch 禁止 decide/apply、修改代码、凭据、Policy 或已有 automation;没有候选时必须精确输出 `HEARTBEAT_OK`;
|
|
48
|
+
- overlay 不授予 shell、文件系统、网络或凭据权限。
|
|
49
|
+
|
|
50
|
+
## 升级与 legacy binding
|
|
51
|
+
|
|
52
|
+
升级前已有的 conversation binding 会继续固定旧 preset/workspace;旧安装常见 preset 为 `primary`。新 binding 使用 Delivery 当前默认身份。
|
|
53
|
+
|
|
54
|
+
执行 `dsh-lark-setup --profile web --refresh-agent-policy --allow-agent-tools` 时,setup 会按完整 preset + workspace 保留精确 legacy 规则,并把主规则更新到当前默认身份。refresh 会清除所有历史 account id 的 setup-managed external reply/capability/tool 规则,只为当前 account 的 canonical owner principal 重建。
|
|
55
|
+
|
|
56
|
+
Delivery 外部规则的 principal、preset 和 workspace 始终精确;capability 的 action/resource 使用 `*`,以覆盖该身份已挂载的动态工具和插件内部 Policy 动作。外部工具规则仍以工具 id `*` 配合可选显式 deny。本地 `foreground` 规则则有意对 preset/workspace 使用 `*`,支持 Web/direct 中的用户切换。
|
package/lib/adapter.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { AdapterSendResult, AdapterInboundImageReadResult, DeliveryAdapter, DeliveryAdapterContext, DeliveryProgressIntent, DeliveryToolApprovalOutcome, DeliveryToolApprovalRequest, ModelPickerIntent, ModelPickerState, ModelRouteRef, OutboundIntent, InboundImageReadInput } from '@dsh-enhanced/assistant-delivery';
|
|
1
|
+
import type { AdapterSendResult, AdapterInboundImageReadResult, DeliveryAdapter, DeliveryAdapterContext, DeliveryProgressIntent, DeliveryToolApprovalOutcome, DeliveryToolApprovalRequest, ModelPickerIntent, ModelPickerState, ModelRouteRef, ModelSelectionResult, ModelSelectionSettlementInput, ModelSelectionTerminalResult, OutboundIntent, InboundImageReadInput } from '@dsh-enhanced/assistant-delivery';
|
|
2
2
|
import { type LarkChannelHealth, type LarkInboundConfig, type LarkTransport } from './types.js';
|
|
3
3
|
export interface LarkApprovalSettlementInput {
|
|
4
4
|
operationId: string;
|
|
@@ -20,27 +20,13 @@ export interface LarkApprovalSettlementInput {
|
|
|
20
20
|
export interface LarkAdapterOptions {
|
|
21
21
|
now?: () => number;
|
|
22
22
|
showProgress?: boolean;
|
|
23
|
+
progressDetails?: 'off' | 'direct';
|
|
23
24
|
statusReactions?: boolean;
|
|
24
25
|
approvalSecret?: string;
|
|
25
26
|
settleApproval?(input: LarkApprovalSettlementInput): unknown | Promise<unknown>;
|
|
26
27
|
recoverApprovalSettlement?(input: LarkApprovalSettlementInput): unknown | undefined | Promise<unknown | undefined>;
|
|
27
|
-
settleModelSelection?(input:
|
|
28
|
-
|
|
29
|
-
callbackEventId: string;
|
|
30
|
-
callbackChatId: string;
|
|
31
|
-
bindingId: string;
|
|
32
|
-
principal: {
|
|
33
|
-
channel: string;
|
|
34
|
-
account: string;
|
|
35
|
-
tenant: string;
|
|
36
|
-
user: string;
|
|
37
|
-
};
|
|
38
|
-
provider: string;
|
|
39
|
-
modelProvider: string;
|
|
40
|
-
model: string;
|
|
41
|
-
reasoningEffort?: string;
|
|
42
|
-
expectedRevision: number;
|
|
43
|
-
}): unknown | Promise<unknown>;
|
|
28
|
+
settleModelSelection?(input: ModelSelectionSettlementInput): ModelSelectionResult | Promise<ModelSelectionResult>;
|
|
29
|
+
awaitModelSelection?(input: ModelSelectionSettlementInput, signal: AbortSignal): ModelSelectionTerminalResult | undefined | Promise<ModelSelectionTerminalResult | undefined>;
|
|
44
30
|
settlePermissionSelection?(input: {
|
|
45
31
|
operationId: string;
|
|
46
32
|
callbackEventId: string;
|
|
@@ -64,6 +50,7 @@ export interface LarkAdapterOptions {
|
|
|
64
50
|
loadModelPicker?(input: {
|
|
65
51
|
operationId: string;
|
|
66
52
|
callbackChatId: string;
|
|
53
|
+
cardMessageId: string;
|
|
67
54
|
bindingId: string;
|
|
68
55
|
principal: {
|
|
69
56
|
channel: string;
|
|
@@ -75,6 +62,7 @@ export interface LarkAdapterOptions {
|
|
|
75
62
|
advanceModelPicker?(input: {
|
|
76
63
|
operationId: string;
|
|
77
64
|
callbackChatId: string;
|
|
65
|
+
cardMessageId: string;
|
|
78
66
|
bindingId: string;
|
|
79
67
|
principal: {
|
|
80
68
|
channel: string;
|
|
@@ -103,6 +91,7 @@ export declare class LarkDeliveryAdapter implements DeliveryAdapter {
|
|
|
103
91
|
private readonly settleApproval;
|
|
104
92
|
private readonly recoverApprovalSettlement;
|
|
105
93
|
private readonly settleModelSelection;
|
|
94
|
+
private readonly awaitModelSelection;
|
|
106
95
|
private readonly settlePermissionSelection;
|
|
107
96
|
private readonly loadModelPicker;
|
|
108
97
|
private readonly advanceModelPicker;
|
|
@@ -110,6 +99,7 @@ export declare class LarkDeliveryAdapter implements DeliveryAdapter {
|
|
|
110
99
|
private readonly progressPresenter;
|
|
111
100
|
private readonly pendingToolApprovals;
|
|
112
101
|
private readonly toolApprovalTombstones;
|
|
102
|
+
private readonly modelSelectionUpdates;
|
|
113
103
|
private state;
|
|
114
104
|
private gapGeneration;
|
|
115
105
|
private lastErrorCode;
|
|
@@ -127,6 +117,8 @@ export declare class LarkDeliveryAdapter implements DeliveryAdapter {
|
|
|
127
117
|
private cancelPendingToolApprovals;
|
|
128
118
|
private addReaction;
|
|
129
119
|
private recordPresentationFailure;
|
|
120
|
+
private cancelModelSelectionUpdates;
|
|
121
|
+
private startModelSelectionFinalUpdate;
|
|
130
122
|
private handleCardAction;
|
|
131
123
|
private handlePermissionPickerAction;
|
|
132
124
|
private handleToolApprovalAction;
|
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,2BAA2B,EAC3B,2BAA2B,EAC3B,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,qBAAqB,EACtB,MAAM,kCAAkC,CAAA;AAgCzC,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EAEtB,KAAK,aAAa,EACnB,MAAM,YAAY,CAAA;AAEnB,MAAM,WAAW,2BAA2B;IAC1C,WAAW,EAAE,MAAM,CAAA;IACnB,eAAe,EAAE,MAAM,CAAA;IACvB,cAAc,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;IAC7E,UAAU,EAAE,MAAM,CAAA;IAClB,eAAe,EAAE,MAAM,CAAA;IACvB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,UAAU,GAAG,UAAU,CAAA;IACjC,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,kBAAkB;IACjC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;IAClB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,cAAc,CAAC,CAAC,KAAK,EAAE,2BAA2B,GAAG,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAC/E,yBAAyB,CAAC,CAAC,KAAK,EAAE,2BAA2B,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAAA;IAClH,oBAAoB,CAAC,CAAC,KAAK,EAAE
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"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"}
|