work-ally 0.2.0-alpha.1
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/AGENTS.md +110 -0
- package/DASHBOARD.md +160 -0
- package/PRODUCT.md +113 -0
- package/README.md +403 -0
- package/ally.sh +171 -0
- package/bridge/src/approval-rules.ts +360 -0
- package/bridge/src/channel-delivery.ts +207 -0
- package/bridge/src/channel-types.ts +22 -0
- package/bridge/src/channels/fake/adapter.ts +31 -0
- package/bridge/src/channels/feishu/adapter.ts +411 -0
- package/bridge/src/channels/feishu/approvals.ts +6 -0
- package/bridge/src/channels/feishu/formatter.ts +276 -0
- package/bridge/src/channels/feishu/normalize.ts +368 -0
- package/bridge/src/codex-config.ts +52 -0
- package/bridge/src/config.ts +240 -0
- package/bridge/src/fake-runtime-client.ts +505 -0
- package/bridge/src/handoff-service.ts +494 -0
- package/bridge/src/logger.ts +194 -0
- package/bridge/src/memory-digest.ts +186 -0
- package/bridge/src/receiver-approval-autonomy.ts +158 -0
- package/bridge/src/receiver-control-core.ts +140 -0
- package/bridge/src/receiver-control-work-session.ts +218 -0
- package/bridge/src/receiver-control.ts +83 -0
- package/bridge/src/receiver-delivery.ts +136 -0
- package/bridge/src/receiver-helpers.ts +96 -0
- package/bridge/src/receiver-human-gate.ts +333 -0
- package/bridge/src/receiver-inbound-preflight.ts +162 -0
- package/bridge/src/receiver-recovery.ts +236 -0
- package/bridge/src/receiver-runtime-callbacks.ts +367 -0
- package/bridge/src/receiver-runtime-policy.ts +132 -0
- package/bridge/src/receiver-runtime-state.ts +124 -0
- package/bridge/src/receiver-support-actions.ts +189 -0
- package/bridge/src/receiver-thread-start.ts +57 -0
- package/bridge/src/receiver-turn-coordination.ts +94 -0
- package/bridge/src/receiver-turn-execution.ts +257 -0
- package/bridge/src/receiver-turn-failure.ts +143 -0
- package/bridge/src/receiver-turn-result.ts +185 -0
- package/bridge/src/receiver-turn-steer.ts +70 -0
- package/bridge/src/receiver-work-session.ts +76 -0
- package/bridge/src/receiver.ts +329 -0
- package/bridge/src/router.ts +62 -0
- package/bridge/src/runtime-client-agent-messages.ts +150 -0
- package/bridge/src/runtime-client-message-dispatch.ts +176 -0
- package/bridge/src/runtime-client-protocol.ts +411 -0
- package/bridge/src/runtime-client-request-ops.ts +56 -0
- package/bridge/src/runtime-client-run-turn.ts +158 -0
- package/bridge/src/runtime-client-thread-ops.ts +270 -0
- package/bridge/src/runtime-client-transport.ts +309 -0
- package/bridge/src/runtime-client-turn-poll.ts +224 -0
- package/bridge/src/runtime-client-turn-read.ts +185 -0
- package/bridge/src/runtime-client-turn-state.ts +105 -0
- package/bridge/src/runtime-client.ts +344 -0
- package/bridge/src/runtime-user-input.ts +403 -0
- package/bridge/src/scheduler.ts +239 -0
- package/bridge/src/server-handoff-command.ts +364 -0
- package/bridge/src/server-main.ts +80 -0
- package/bridge/src/server-routine-command.ts +60 -0
- package/bridge/src/server-routine-execution.ts +222 -0
- package/bridge/src/server-runtime-app-support.ts +107 -0
- package/bridge/src/server-runtime-app.ts +238 -0
- package/bridge/src/server-thread-sync-command.ts +63 -0
- package/bridge/src/server.ts +17 -0
- package/bridge/src/session-store-delivery.ts +220 -0
- package/bridge/src/session-store-human-gate.ts +380 -0
- package/bridge/src/session-store-inbound-acceptance.ts +66 -0
- package/bridge/src/session-store-meta.ts +134 -0
- package/bridge/src/session-store-turn-ledger.ts +272 -0
- package/bridge/src/session-store.ts +380 -0
- package/bridge/src/system-notify.ts +220 -0
- package/bridge/src/thread-sync.ts +200 -0
- package/bridge/src/translator.ts +494 -0
- package/bridge/src/types.ts +289 -0
- package/bridge/src/utils.ts +104 -0
- package/bridge/src/work-session-store.ts +471 -0
- package/docs/.gitkeep +0 -0
- package/docs/architecture/codex-feishu-bridge-proposal.md +2742 -0
- package/docs/completed/FEATURE-feishu-markdown-and-reply-support.md +327 -0
- package/docs/completed/README.md +21 -0
- package/docs/completed/SPEC-approval-autonomy-and-safe-defaults.md +205 -0
- package/docs/completed/SPEC-approval-batch-and-strict-reply-shortcuts.md +153 -0
- package/docs/completed/SPEC-conversation-noise-reduction-and-busy-input-gate.md +538 -0
- package/docs/completed/SPEC-engineering-sop-skillization.md +190 -0
- package/docs/completed/SPEC-faithful-bridge-core-thinning-v2.md +376 -0
- package/docs/completed/SPEC-faithful-bridge-core-thinning.md +1071 -0
- package/docs/completed/SPEC-group-chat-sender-identity.md +301 -0
- package/docs/completed/SPEC-middleware-exception-visibility.md +227 -0
- package/docs/completed/SPEC-nightly-memory-digest-visibility.md +121 -0
- package/docs/completed/SPEC-project-group-chat-human-centered-conversation-mapping.md +326 -0
- package/docs/completed/SPEC-remove-cli-persona-bootstrap.md +201 -0
- package/docs/developer-workflow.md +49 -0
- package/docs/implementation/SPEC-codex-same-machine-session-handoff-implementation.md +239 -0
- package/docs/implementation/test-coverage-map.md +363 -0
- package/docs/implementation/work-ally-implementation-guide.md +790 -0
- package/docs/issues/README.md +10 -0
- package/docs/issues/pending/ANALYSIS-ally-premature-recovery-notice-and-task-state-semantics-2026-03-18.md +295 -0
- package/docs/issues/resolved/ANALYSIS-approval-waiting-visible-but-approval-artifact-missing-2026-03-16.md +466 -0
- package/docs/issues/resolved/ANALYSIS-blocking-state-visible-without-user-actionable-artifact-2026-03-16.md +261 -0
- package/docs/issues/resolved/ANALYSIS-codex-app-server-transport-disconnect-semantics-2026-03-14.md +606 -0
- package/docs/issues/resolved/ANALYSIS-premature-terminalization-on-fresh-thread-poll-and-object-error-leak-2026-03-16.md +348 -0
- package/docs/issues/resolved/ANALYSIS-runtime-turn-delivery-and-recovery-2026-03-14.md +603 -0
- package/docs/issues/resolved/ANALYSIS-self-test-gap-approval-waiting-visible-but-approval-artifact-missing-2026-03-16.md +166 -0
- package/docs/issues/resolved/ANALYSIS-self-test-gap-blocking-state-visible-without-user-actionable-artifact-2026-03-16.md +186 -0
- package/docs/issues/resolved/ANALYSIS-self-test-gap-premature-terminalization-on-fresh-thread-poll-and-object-error-leak-2026-03-16.md +166 -0
- package/docs/issues/resolved/REPORT-ally-runtime-turn-delivery-3b42fb8-2026-03-15.md +373 -0
- package/docs/manual-acceptance.md +127 -0
- package/docs/ops-runbook.md +44 -0
- package/docs/planning/FEATURE-memory-system.md +748 -0
- package/docs/planning/SPEC-active-turn-steer-and-context-compaction-visibility.md +269 -0
- package/docs/planning/SPEC-approval-rules-inheritance-and-local-validation-lane.md +450 -0
- package/docs/planning/SPEC-assistant-persona-bootstrap.md +199 -0
- package/docs/planning/SPEC-assistant-rename.md +610 -0
- package/docs/planning/SPEC-bridge-app-server-protocol-alignment.md +667 -0
- package/docs/planning/SPEC-claude-runtime-host-for-work-ally.md +434 -0
- package/docs/planning/SPEC-cli-feishu-codex-session-unification.md +236 -0
- package/docs/planning/SPEC-codex-same-machine-session-handoff.md +873 -0
- package/docs/planning/SPEC-feishu-reaction-shortcuts.md +282 -0
- package/docs/planning/SPEC-local-stable-release-boundary.md +166 -0
- package/docs/planning/SPEC-managed-thread-entry-and-surface-mobility.md +862 -0
- package/docs/planning/SPEC-minimal-bridge-semantics-and-user-visible-surface.md +362 -0
- package/docs/planning/SPEC-npm-alpha-distribution-and-install-first-release.md +222 -0
- package/docs/planning/SPEC-remove-websocket-runtime-transport.md +364 -0
- package/docs/planning/SPEC-runtime-abstraction-phase-1.md +424 -0
- package/docs/planning/SPEC-runtime-connection-and-turn-recovery-semantics.md +274 -0
- package/docs/planning/SPEC-session-presence-and-state-visibility.md +397 -0
- package/docs/planning/SPEC-skill-first-capability-packaging.md +338 -0
- package/docs/planning/SPEC-stable-archive-contract.md +456 -0
- package/docs/planning/SPEC-supervised-start-boundary.md +127 -0
- package/docs/planning/SPEC-user-barrier-reduction-and-activation.md +832 -0
- package/docs/planning/ally-next.md +1278 -0
- package/docs/planning/assistant-workbench-spec.md +725 -0
- package/docs/planning/product-workbench.md +283 -0
- package/docs/product-onboarding.md +227 -0
- package/docs/product-spec-standard.md +528 -0
- package/docs/troubleshooting.md +45 -0
- package/docs/user-quickstart.md +46 -0
- package/internal/dispatch.sh +95 -0
- package/internal/lib/common.sh +1450 -0
- package/internal/modules/assistant/manage.sh +1312 -0
- package/internal/modules/bootstrap/setup.sh +144 -0
- package/internal/modules/config/init-env.sh +10 -0
- package/internal/modules/global/manage.sh +154 -0
- package/internal/modules/handoff/manage.sh +54 -0
- package/internal/modules/mcp/manage.sh +83 -0
- package/internal/modules/ops/logs.sh +76 -0
- package/internal/modules/routines/manage.sh +55 -0
- package/internal/modules/runtime/assistant-autosave.sh +26 -0
- package/internal/modules/runtime/restart.sh +6 -0
- package/internal/modules/runtime/start.sh +283 -0
- package/internal/modules/runtime/status.sh +194 -0
- package/internal/modules/runtime/stop.sh +55 -0
- package/internal/modules/runtime/supervisor.sh +216 -0
- package/internal/modules/runtime/update.sh +26 -0
- package/package.json +41 -0
- package/runtime/config/.gitkeep +0 -0
- package/runtime/host/.gitkeep +0 -0
- package/runtime/host/healthcheck-codex-app-server.ts +22 -0
- package/runtime/host/ping-pong-codex-app-server.ts +66 -0
- package/runtime/host/probe-codex-app-server.ts +115 -0
- package/skills/archive-reader/SKILL.md +9 -0
- package/skills/feishu-production-debug/SKILL.md +37 -0
- package/skills/feishu-production-debug/references/feishu-debug-order.md +49 -0
- package/skills/feishu-production-debug/references/platform-permission-baseline.md +23 -0
- package/skills/issue-to-spec-triage/SKILL.md +44 -0
- package/skills/issue-to-spec-triage/references/triage-rules.md +66 -0
- package/skills/memory-digest/SKILL.md +9 -0
- package/skills/post-implementation-closure/SKILL.md +39 -0
- package/skills/post-implementation-closure/references/closure-checklist.md +45 -0
- package/skills/post-implementation-closure/references/doc-drift-map.md +49 -0
- package/skills/product-spec/SKILL.md +244 -0
- package/templates/env.example +5 -0
- package/templates/routines/nightly-memory-digest.yaml +10 -0
- package/templates/workspace/AGENTS.md +26 -0
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
# SPEC: Project Group Chat With Platform-Scoped Mention Routing
|
|
2
|
+
|
|
3
|
+
更新时间:2026-03-19
|
|
4
|
+
状态:Completed
|
|
5
|
+
Owner:Ally
|
|
6
|
+
相关文档:
|
|
7
|
+
- `README.md`
|
|
8
|
+
- `PRODUCT.md`
|
|
9
|
+
- `DASHBOARD.md`
|
|
10
|
+
- `docs/user-quickstart.md`
|
|
11
|
+
- `docs/completed/SPEC-group-chat-sender-identity.md`
|
|
12
|
+
|
|
13
|
+
## 1. Summary
|
|
14
|
+
|
|
15
|
+
项目群聊 V1 收敛为一个极简模型:
|
|
16
|
+
|
|
17
|
+
> 一个助理对应一个独立飞书机器人身份;在群里,只有用户显式 `@` 这个机器人时,才会触发这位助理处理消息。
|
|
18
|
+
|
|
19
|
+
这次不做 `focus`、`/switch`、reply 自动续聊、群级共享 thread、助理间协作,也不增加新的中间层兜底配置。
|
|
20
|
+
|
|
21
|
+
对同一位助理来说:
|
|
22
|
+
|
|
23
|
+
- 私聊消息进入它自己的私聊 thread
|
|
24
|
+
- 群里 `@` 它的消息进入它在该群里的群聊 thread
|
|
25
|
+
- 两者属于同一助理,但必须是两个独立 thread
|
|
26
|
+
|
|
27
|
+
这次实现的关键不是新增一套群聊系统,而是把群聊能力收紧成一个完全依赖飞书平台正确配置的最小模型。
|
|
28
|
+
|
|
29
|
+
## 2. 背景
|
|
30
|
+
|
|
31
|
+
当前 `work-ally` 的稳定主线是 Feishu 私聊主闭环。群聊侧虽然已有一层最小显式触发逻辑,但口径仍不够收敛:
|
|
32
|
+
|
|
33
|
+
- 当前群聊门控还接受“文本像是 `@...` 开头”或“reply bot 消息”这类宽松条件
|
|
34
|
+
- 当前讨论里一度出现了 `focus`、`switch`、本地自检、prompt 清洗等扩张方向
|
|
35
|
+
- 这些方向如果继续进入产品,会让中间层从桥梁逐渐变成群聊状态机
|
|
36
|
+
|
|
37
|
+
与此同时,已经确定的产品边界很清楚:
|
|
38
|
+
|
|
39
|
+
1. 一个助理必须对应一个独立机器人身份
|
|
40
|
+
2. 项目群只是前台入口,不是共享脑
|
|
41
|
+
3. 群里只能通过显式 `@` 召唤某一个助理
|
|
42
|
+
4. 私聊入口和群聊入口都属于同一个助理,但必须落到不同 thread
|
|
43
|
+
5. 中间层要坚持 KISS,不为了兜底越界配置而增加长期维护负担
|
|
44
|
+
|
|
45
|
+
因此,这次要做的不是“把所有异常情况都兜住”,而是把正式支持范围定义清楚,并让实现严格贴着这条边界走。
|
|
46
|
+
|
|
47
|
+
## 3. 问题定义
|
|
48
|
+
|
|
49
|
+
### 3.1 项目视图需要收敛,但不能引入共享会话
|
|
50
|
+
|
|
51
|
+
用户希望把多个助理放进同一个项目群,减少多个私聊窗口的切换成本。
|
|
52
|
+
|
|
53
|
+
但这不等于要把群本身做成共享 thread。当前真实架构里,每个助理本来就是独立进程、独立 desk、独立 runtime。
|
|
54
|
+
|
|
55
|
+
### 3.2 群聊触发规则必须和平台权限一致
|
|
56
|
+
|
|
57
|
+
在飞书平台正确配置下:
|
|
58
|
+
|
|
59
|
+
- 单聊消息会直接推给对应机器人
|
|
60
|
+
- 群聊里只有 `@机器人` 的消息才会推给对应机器人
|
|
61
|
+
- 如果额外开了“获取群组中所有消息”,才会破坏这个边界
|
|
62
|
+
|
|
63
|
+
所以产品模型必须基于这条事实,而不是假设所有群消息都会先进入中间层再过滤。
|
|
64
|
+
|
|
65
|
+
### 3.3 中间层不能为了少数越界场景变厚
|
|
66
|
+
|
|
67
|
+
如果为了防“用户把平台权限配错”而继续引入:
|
|
68
|
+
|
|
69
|
+
- 当前机器人自身份配置
|
|
70
|
+
- 群聊 mentions 自检
|
|
71
|
+
- prompt 输入清洗
|
|
72
|
+
- 更多本地兼容分支
|
|
73
|
+
|
|
74
|
+
那么中间层的复杂度会明显上升,但这些能力都不是主链路必需品。
|
|
75
|
+
|
|
76
|
+
这不符合当前产品的 KISS 原则。
|
|
77
|
+
|
|
78
|
+
### 3.4 当前群聊门控仍包含与正式合同冲突的旧路径
|
|
79
|
+
|
|
80
|
+
当前代码仍接受下面几类群消息:
|
|
81
|
+
|
|
82
|
+
- 看起来像 `@...` 开头的文本
|
|
83
|
+
- 控制命令
|
|
84
|
+
- reply bot 消息
|
|
85
|
+
|
|
86
|
+
而最新产品定义已经收敛为:
|
|
87
|
+
|
|
88
|
+
- V1 只支持飞书平台已正确过滤后的“显式 `@当前机器人` 群消息”
|
|
89
|
+
- reply 但未再次 `@`,不支持
|
|
90
|
+
- 如果用户开启了“获取群组中所有消息”,则超出当前支持范围
|
|
91
|
+
|
|
92
|
+
## 4. 目标 / 非目标
|
|
93
|
+
|
|
94
|
+
### 4.1 目标
|
|
95
|
+
|
|
96
|
+
1. 让多个助理可共存于同一个项目群
|
|
97
|
+
2. 保持人类中心化:群里每次只点名一个助理
|
|
98
|
+
3. 保持架构诚实:一个助理仍然是一个独立进程和独立机器人身份
|
|
99
|
+
4. 让同一助理的私聊入口与群聊入口都能正确路由到各自 thread
|
|
100
|
+
5. 用最小改动把群聊 V1 收成稳定能力
|
|
101
|
+
|
|
102
|
+
### 4.2 非目标
|
|
103
|
+
|
|
104
|
+
1. 不做群级共享 thread
|
|
105
|
+
2. 不做 `focus`、`/switch`、默认 assistant 切换
|
|
106
|
+
3. 不做 reply 自动续聊
|
|
107
|
+
4. 不做普通群消息自动触发
|
|
108
|
+
5. 不做助理间协作、互聊、派工或 handoff
|
|
109
|
+
6. 不做额外自身份配置项,例如 `FEISHU_BOT_OPEN_ID`
|
|
110
|
+
7. 不做基于机器人名字的路由或校验
|
|
111
|
+
8. 不做针对 `@当前助理` 的 prompt 文本截断或清洗
|
|
112
|
+
|
|
113
|
+
## 5. 产品定义与用户路径
|
|
114
|
+
|
|
115
|
+
### 5.1 一句话定义
|
|
116
|
+
|
|
117
|
+
`项目群聊` 是多个助理共享的前台入口;用户只有在群里显式 `@` 某个助理对应的机器人时,才算在和这位助理继续该群里的独立 thread。
|
|
118
|
+
|
|
119
|
+
### 5.2 核心产品定义
|
|
120
|
+
|
|
121
|
+
1. 一个助理对应一个独立机器人身份
|
|
122
|
+
2. 一个机器人只代表一个助理,不允许多个助理共用同一个机器人
|
|
123
|
+
3. 同一助理可同时拥有多个并行 thread
|
|
124
|
+
4. thread 隔离单位收敛为:`assistant + channel + conversation_id`
|
|
125
|
+
5. 私聊和群聊都是同一助理的入口,但绝不共享同一条 thread
|
|
126
|
+
|
|
127
|
+
### 5.3 路径 A:私聊助理
|
|
128
|
+
|
|
129
|
+
例子:
|
|
130
|
+
|
|
131
|
+
```text
|
|
132
|
+
请帮我整理这个需求
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
结果:
|
|
136
|
+
|
|
137
|
+
- 这条消息直接进入该助理的私聊 thread
|
|
138
|
+
- 该 thread 仅对应这条单聊会话
|
|
139
|
+
|
|
140
|
+
### 5.4 路径 B:在项目群里显式 `@` 助理
|
|
141
|
+
|
|
142
|
+
例子:
|
|
143
|
+
|
|
144
|
+
```text
|
|
145
|
+
@Ally 帮我把这个需求整理成 spec
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
结果:
|
|
149
|
+
|
|
150
|
+
- 这条消息进入 `Ally` 在该 `group_id` 下的群聊 thread
|
|
151
|
+
- 同一助理的私聊 thread 不受影响
|
|
152
|
+
- 其他助理不会处理这条消息
|
|
153
|
+
|
|
154
|
+
### 5.5 路径 C:群里普通消息
|
|
155
|
+
|
|
156
|
+
例子:
|
|
157
|
+
|
|
158
|
+
```text
|
|
159
|
+
这个事情下周再说
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
结果:
|
|
163
|
+
|
|
164
|
+
- 在正式支持边界内,这类消息不会被推送给助理
|
|
165
|
+
- 若用户错误开启“获取群组中所有消息”,则该行为超出当前支持范围
|
|
166
|
+
|
|
167
|
+
### 5.6 路径 D:reply 助理消息但未再次 `@`
|
|
168
|
+
|
|
169
|
+
例子:
|
|
170
|
+
|
|
171
|
+
- 用户回复助理上一条消息,正文是“第二点展开”
|
|
172
|
+
|
|
173
|
+
结果:
|
|
174
|
+
|
|
175
|
+
- V1 不支持这条路径
|
|
176
|
+
- 用户需要重新显式 `@` 该助理
|
|
177
|
+
|
|
178
|
+
## 6. 机制设计
|
|
179
|
+
|
|
180
|
+
### 6.1 平台前提
|
|
181
|
+
|
|
182
|
+
飞书平台配置必须满足:
|
|
183
|
+
|
|
184
|
+
- 订阅事件:`im.message.receive_v1`
|
|
185
|
+
- 开启权限:`读取用户发给机器人的单聊消息`
|
|
186
|
+
- 开启权限:`接收群聊中@机器人消息事件`
|
|
187
|
+
- 不开启权限:`获取群组中所有消息(敏感权限)`
|
|
188
|
+
|
|
189
|
+
在这套前提下,中间层原则上只会收到:
|
|
190
|
+
|
|
191
|
+
- 发给当前机器人的单聊消息
|
|
192
|
+
- 群里明确 `@` 当前机器人的消息
|
|
193
|
+
|
|
194
|
+
### 6.2 中间层职责
|
|
195
|
+
|
|
196
|
+
中间层这次只承担一件核心工作:
|
|
197
|
+
|
|
198
|
+
- 把同一助理的不同会话入口正确路由到不同 thread
|
|
199
|
+
|
|
200
|
+
不额外承担:
|
|
201
|
+
|
|
202
|
+
- 平台越界配置兜底
|
|
203
|
+
- 当前机器人自身份识别
|
|
204
|
+
- prompt 文本清洗
|
|
205
|
+
- 第二套路由状态管理
|
|
206
|
+
|
|
207
|
+
### 6.3 会话与 thread 路由模型
|
|
208
|
+
|
|
209
|
+
对单个助理来说:
|
|
210
|
+
|
|
211
|
+
- 私聊:`(channel=feishu, dm_conversation_id) -> thread`
|
|
212
|
+
- 群聊:`(channel=feishu, group_conversation_id) -> thread`
|
|
213
|
+
|
|
214
|
+
当前实现已经有按 `ConversationRef` 建立 / 续用 session 与 thread 的基础能力;本次不新增新的 thread 对象,也不新增跨助理共享状态。
|
|
215
|
+
|
|
216
|
+
### 6.4 群聊输入边界
|
|
217
|
+
|
|
218
|
+
V1 对群聊输入的正式合同是:
|
|
219
|
+
|
|
220
|
+
- 中间层信任飞书平台的事件过滤边界
|
|
221
|
+
- 平台推过来的群聊消息,视为已经满足“显式 `@当前机器人`”前提
|
|
222
|
+
- 不再额外引入 `bot_open_id` 或机器人名字来做本地校验
|
|
223
|
+
|
|
224
|
+
如果用户主动开启“获取群组中所有消息”,则:
|
|
225
|
+
|
|
226
|
+
- 该行为超出当前功能支持范围
|
|
227
|
+
- 产品不承诺群聊路由仍然保持正确
|
|
228
|
+
|
|
229
|
+
### 6.5 `@当前助理` 文本是否截断
|
|
230
|
+
|
|
231
|
+
V1 不做这件事。
|
|
232
|
+
|
|
233
|
+
原因:
|
|
234
|
+
|
|
235
|
+
- 这是轻微噪音,不是主链路问题
|
|
236
|
+
- 为了清洗这点文本再引入输入改写逻辑,不符合 KISS
|
|
237
|
+
- 当前更应优先保持桥梁简单,而不是过度优化 prompt 纯度
|
|
238
|
+
|
|
239
|
+
## 7. 实现范围
|
|
240
|
+
|
|
241
|
+
### 7.1 需要修改的模块
|
|
242
|
+
|
|
243
|
+
#### A. `bridge/src/channels/feishu/adapter.ts`
|
|
244
|
+
|
|
245
|
+
收紧群聊准入逻辑:
|
|
246
|
+
|
|
247
|
+
- 去掉“reply bot 消息即可通过”的逻辑
|
|
248
|
+
- 不再把这类本地启发式路径当成正式支持能力
|
|
249
|
+
- 群聊行为收口为:信任飞书平台已做的 `@机器人` 过滤
|
|
250
|
+
|
|
251
|
+
#### B. `tests/unit/channel/feishu-adapter-inbound.test.mjs`
|
|
252
|
+
|
|
253
|
+
测试口径改为:
|
|
254
|
+
|
|
255
|
+
1. 单聊消息可通过
|
|
256
|
+
2. 已被平台过滤后进入 adapter 的群聊消息可通过
|
|
257
|
+
3. group reply bot 但未再次 `@` 不再视为受支持路径
|
|
258
|
+
|
|
259
|
+
#### C. 文档
|
|
260
|
+
|
|
261
|
+
实现完成后,按需同步:
|
|
262
|
+
|
|
263
|
+
- `README.md`
|
|
264
|
+
- `docs/user-quickstart.md`
|
|
265
|
+
- `DASHBOARD.md`
|
|
266
|
+
- `docs/user-quickstart.md`
|
|
267
|
+
|
|
268
|
+
重点写清:
|
|
269
|
+
|
|
270
|
+
- 一个助理对应一个独立机器人身份
|
|
271
|
+
- 群聊依赖飞书平台权限正确配置
|
|
272
|
+
- 不支持“获取群组中所有消息”权限下的群聊行为
|
|
273
|
+
|
|
274
|
+
### 7.2 不需要新增的东西
|
|
275
|
+
|
|
276
|
+
本次明确不新增:
|
|
277
|
+
|
|
278
|
+
- `FEISHU_BOT_OPEN_ID`
|
|
279
|
+
- mentions 结构化自检逻辑
|
|
280
|
+
- prompt 清洗逻辑
|
|
281
|
+
- `focus` 状态
|
|
282
|
+
- 群级路由表
|
|
283
|
+
- 助理共享状态存储
|
|
284
|
+
- 群级 thread 对象
|
|
285
|
+
- 基于名字的别名匹配
|
|
286
|
+
|
|
287
|
+
## 8. 验收标准
|
|
288
|
+
|
|
289
|
+
1. 一个助理必须绑定一个独立机器人身份。
|
|
290
|
+
2. 同一助理可同时拥有私聊 thread 与群聊 thread,两者互不共享上下文。
|
|
291
|
+
3. 单聊消息会进入该助理自己的私聊 thread。
|
|
292
|
+
4. 群聊功能建立在飞书平台正确权限配置之上,不额外依赖中间层自身份配置。
|
|
293
|
+
5. group reply bot 但未再次 `@`,V1 不再作为受支持路径。
|
|
294
|
+
6. 代码中不再把 reply bot 当作正式群聊准入依据。
|
|
295
|
+
7. 代码中不新增 `FEISHU_BOT_OPEN_ID` 等自身份配置项。
|
|
296
|
+
8. 代码中不新增 prompt 文本截断或清洗逻辑。
|
|
297
|
+
9. 现有 session / thread 模型继续沿用,不引入新的共享状态对象。
|
|
298
|
+
10. 文档中明确写出:若开启“获取群组中所有消息”,则超出当前支持范围。
|
|
299
|
+
|
|
300
|
+
## 9. 风险 / 假设 / 待决问题
|
|
301
|
+
|
|
302
|
+
### 9.1 风险
|
|
303
|
+
|
|
304
|
+
1. 如果用户把飞书权限配错,群聊行为可能超出当前产品合同;这次不在中间层兜底。
|
|
305
|
+
2. 强制每次群里都重新 `@` 会牺牲一点顺滑感,但这是当前阶段主动接受的取舍。
|
|
306
|
+
3. 群消息文本里可能带有 `@当前助理` 字样,但 V1 接受这点轻微 prompt 噪音。
|
|
307
|
+
|
|
308
|
+
### 9.2 当前假设
|
|
309
|
+
|
|
310
|
+
1. 用户接受群里每次显式 `@` 助理。
|
|
311
|
+
2. 用户接受“平台配置正确”是当前功能成立的前提。
|
|
312
|
+
3. 当前阶段优先级是简单、稳定、低歧义,而不是更像自然群聊。
|
|
313
|
+
4. 一个助理对应一个机器人身份,这条约束未来也会继续成立。
|
|
314
|
+
|
|
315
|
+
### 9.3 待决问题
|
|
316
|
+
|
|
317
|
+
1. README / user-facing quickstart 是否要单独增加“群聊配置前提”小节。
|
|
318
|
+
2. 后续若要支持 reply 自动续聊,应作为 V2 新 spec 单独讨论,不在本次实现中提前埋口子。
|
|
319
|
+
|
|
320
|
+
## 10. 当前结论
|
|
321
|
+
|
|
322
|
+
项目群能力的正式方向已经收敛为:
|
|
323
|
+
|
|
324
|
+
> 一个助理对应一个独立机器人;私聊与群聊 `@` 都是在找同一位助理,但它们必须进入各自独立的 thread。
|
|
325
|
+
|
|
326
|
+
这次实现不引入新对象,不引入共享状态,也不为了少数越界场景给中间层额外加厚;它只把飞书群聊入口收紧到一个稳定、诚实、可维护的最小模型。
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
# Remove CLI Persona Bootstrap
|
|
2
|
+
|
|
3
|
+
更新时间:2026-03-21
|
|
4
|
+
状态:Implemented
|
|
5
|
+
Owner:Ally
|
|
6
|
+
相关文档:
|
|
7
|
+
- `docs/planning/SPEC-assistant-persona-bootstrap.md`
|
|
8
|
+
- `docs/user-quickstart.md`
|
|
9
|
+
- `internal/modules/assistant/manage.sh`
|
|
10
|
+
|
|
11
|
+
## 1. Summary
|
|
12
|
+
|
|
13
|
+
当前决定撤回 `work-ally` 的 CLI 人设引导能力:删除 `--persona` / `--persona-file`,不再让中间层在 `ally setup` 或 `assistant add|ensure` 时替用户写入 `SOUL.md`。未来的人设编辑只保留两条正式路径:桌面端直接编辑,或由偏程序员的用户手动编辑 desk 里的 `SOUL.md`。
|
|
14
|
+
|
|
15
|
+
这次不是只删一个命令行参数,而是把围绕 persona 注入产生的整片产品面一起收回:参数解析、`SOUL.md` marker、persona 写回逻辑、对应测试、对应用户文档,都要一起删掉。
|
|
16
|
+
|
|
17
|
+
一个硬边界必须写死:**已经存在的 assistant desk 不做迁移、不做批量改写、不静默触碰任何已有 `SOUL.md`。** 这次只优化中间层自己的内核与新建路径,不回写已经发出去给用户使用的办公桌资产。
|
|
18
|
+
|
|
19
|
+
## 2. 背景
|
|
20
|
+
|
|
21
|
+
之前为了降低 assistant 初次创建门槛,项目引入了 persona bootstrap:
|
|
22
|
+
|
|
23
|
+
- `ally setup <name> --persona ...`
|
|
24
|
+
- `ally setup <name> --persona-file ...`
|
|
25
|
+
- `ally assistant add|ensure ...` 的同类参数
|
|
26
|
+
|
|
27
|
+
对应实现不仅增加了参数入口,还在 `internal/modules/assistant/manage.sh` 里增加了一整套 persona 解析、marker 注入、局部覆盖写回逻辑,并同步扩散到 shell 测试、Quick Start、README、troubleshooting、manual acceptance。
|
|
28
|
+
|
|
29
|
+
但产品方向现在已经变化:
|
|
30
|
+
|
|
31
|
+
1. 桌面端已经具备直接编辑 `SOUL / NOW / MEMORY / MISTAKES` 的能力。
|
|
32
|
+
2. 如果用户仍然走 CLI,通常说明他更偏程序员,可以直接编辑事实文件。
|
|
33
|
+
3. 中间层当前的主目标是继续做薄,而不是为了“看起来方便”保留低价值包装层。
|
|
34
|
+
|
|
35
|
+
因此,persona bootstrap 这条路径已经从“降低门槛”变成了“增加一层多余产品面”。
|
|
36
|
+
|
|
37
|
+
## 3. 问题定义
|
|
38
|
+
|
|
39
|
+
当前 persona bootstrap 继续存在,会带来 4 个问题:
|
|
40
|
+
|
|
41
|
+
### 3.1 产品面比实际价值更厚
|
|
42
|
+
|
|
43
|
+
这条能力并不是一个轻量参数,而是一整片产品合同:命令语义、文件注入、覆盖逻辑、错误处理、测试与文档都要维护。
|
|
44
|
+
|
|
45
|
+
### 3.2 它让中间层替用户管理本应由资产层表达的内容
|
|
46
|
+
|
|
47
|
+
人格本质上属于 assistant 的长期资产,应该落在 `SOUL.md`。当前中间层多做了一层“代填人格”,反而模糊了用户入口与资产入口的边界。
|
|
48
|
+
|
|
49
|
+
### 3.3 它和当前主入口方向不一致
|
|
50
|
+
|
|
51
|
+
既然桌面端已是普通用户默认入口,CLI 再保留一套 persona 引导,只会形成重复交互面。
|
|
52
|
+
|
|
53
|
+
### 3.4 已有用户资产不能被静默重写
|
|
54
|
+
|
|
55
|
+
一旦保留 `assistant ensure --persona` 这种路径,中间层就继续拥有修改已存在 `SOUL.md` 某个区域的权力。这和当前产品边界冲突,也不利于保护已发出去的 assistant desk 资产。
|
|
56
|
+
|
|
57
|
+
## 4. 目标 / 非目标
|
|
58
|
+
|
|
59
|
+
### 4.1 目标
|
|
60
|
+
|
|
61
|
+
1. 删除 CLI persona 引导能力:`--persona`、`--persona-file` 不再是正式产品面。
|
|
62
|
+
2. 删除 persona 注入相关实现代码,而不是只隐藏入口。
|
|
63
|
+
3. 让新建 assistant 的默认 `SOUL.md` 回到简单、可手改的模板,不再依赖 marker 注入机制。
|
|
64
|
+
4. 明确保证:不迁移、不修改任何已有 assistant 的 `SOUL.md`。
|
|
65
|
+
5. 同步清理测试和当前态文档,避免产品说明继续漂移。
|
|
66
|
+
|
|
67
|
+
### 4.2 非目标
|
|
68
|
+
|
|
69
|
+
1. 不迁移历史 assistant desk。
|
|
70
|
+
2. 不批量清洗旧 `SOUL.md` 中既有的“用户补充设定”区块或 marker。
|
|
71
|
+
3. 不新增新的 CLI 替代入口,例如 `ally persona set`。
|
|
72
|
+
4. 不改变桌面端直接编辑 `SOUL.md` 的能力。
|
|
73
|
+
5. 不修改 assistant 现有记忆系统的其他文件职责。
|
|
74
|
+
|
|
75
|
+
## 5. 产品定义与用户路径
|
|
76
|
+
|
|
77
|
+
### 5.1 新的正式口径
|
|
78
|
+
|
|
79
|
+
从这次变更之后,人设编辑只保留两条正式路径:
|
|
80
|
+
|
|
81
|
+
- 桌面端直接编辑 `SOUL.md`
|
|
82
|
+
- 用户自己手动编辑 assistant desk 中的 `SOUL.md`
|
|
83
|
+
|
|
84
|
+
CLI 只负责创建与绑定 assistant,不再负责“顺手帮用户写一段人格”。
|
|
85
|
+
|
|
86
|
+
### 5.2 用户路径
|
|
87
|
+
|
|
88
|
+
#### 路径 A:普通用户
|
|
89
|
+
|
|
90
|
+
1. 通过桌面端创建 assistant
|
|
91
|
+
2. 需要调整人格时,在桌面端直接编辑 `SOUL.md`
|
|
92
|
+
|
|
93
|
+
#### 路径 B:CLI / 程序员用户
|
|
94
|
+
|
|
95
|
+
1. 执行 `ally setup <name> --workspace <path>`
|
|
96
|
+
2. 如需补充人格,直接打开 desk 内的 `SOUL.md` 编辑
|
|
97
|
+
|
|
98
|
+
#### 路径 C:已有 assistant
|
|
99
|
+
|
|
100
|
+
- 现有 assistant 继续照常工作
|
|
101
|
+
- 中间层不会因为本次升级去碰他们已有的 `SOUL.md`
|
|
102
|
+
- 用户若未来要改人设,仍应自己在桌面端或文件里改
|
|
103
|
+
|
|
104
|
+
## 6. 机制设计
|
|
105
|
+
|
|
106
|
+
### 6.1 命令面收口
|
|
107
|
+
|
|
108
|
+
以下参数从正式产品面移除:
|
|
109
|
+
|
|
110
|
+
- `ally setup <name> --persona ...`
|
|
111
|
+
- `ally setup <name> --persona-file ...`
|
|
112
|
+
- `ally assistant add <name> --persona ...`
|
|
113
|
+
- `ally assistant add <name> --persona-file ...`
|
|
114
|
+
- `ally assistant ensure <name> --persona ...`
|
|
115
|
+
- `ally assistant ensure <name> --persona-file ...`
|
|
116
|
+
|
|
117
|
+
命令帮助、错误提示、文档示例都必须一起删除。
|
|
118
|
+
|
|
119
|
+
### 6.2 `SOUL.md` 模板收口
|
|
120
|
+
|
|
121
|
+
新的默认模板可以继续保留“用户补充设定”这一节,但它必须退回成普通静态 Markdown,而不是产品层可编程写回区域。
|
|
122
|
+
|
|
123
|
+
也就是说:
|
|
124
|
+
|
|
125
|
+
- 新模板里不再依赖 special marker
|
|
126
|
+
- 中间层不再解析或覆盖该区域
|
|
127
|
+
- 用户后续编辑完全交还给桌面端或手工文件编辑
|
|
128
|
+
|
|
129
|
+
### 6.3 代码删除范围
|
|
130
|
+
|
|
131
|
+
这次必须一起删除:
|
|
132
|
+
|
|
133
|
+
1. persona 参数解析
|
|
134
|
+
2. persona 文本归一化
|
|
135
|
+
3. persona file 读取与互斥校验
|
|
136
|
+
4. `SOUL.md` persona marker 常量
|
|
137
|
+
5. persona block render / writeback / partial overwrite 逻辑
|
|
138
|
+
6. 只为了 persona 注入而存在的测试样例与文档口径
|
|
139
|
+
|
|
140
|
+
判断标准不是“入口没了”,而是“围绕 persona bootstrap 产生的中间层职责真的没了”。
|
|
141
|
+
|
|
142
|
+
### 6.4 既有资产保护边界
|
|
143
|
+
|
|
144
|
+
这是本 spec 最重要的机制约束:
|
|
145
|
+
|
|
146
|
+
- 产品升级过程中,不扫 assistant desk,不迁移 `SOUL.md`
|
|
147
|
+
- `ally assistant ensure` 不得因为 persona 能力下线而去重写已有 `SOUL.md`
|
|
148
|
+
- 已存在 desk 中残留的 marker 或旧“用户补充设定”内容,视为用户现有资产的一部分,保持原样
|
|
149
|
+
|
|
150
|
+
如果某个已有 assistant 的 `SOUL.md` 未来仍保留旧格式,那是允许的。中间层只需要确保以后不再继续依赖或改写它。
|
|
151
|
+
|
|
152
|
+
### 6.5 测试与文档收口
|
|
153
|
+
|
|
154
|
+
需要同步更新:
|
|
155
|
+
|
|
156
|
+
- shell 测试:删除 persona 相关正向与报错路径
|
|
157
|
+
- `README.md`
|
|
158
|
+
- `docs/user-quickstart.md`
|
|
159
|
+
- `docs/troubleshooting.md`
|
|
160
|
+
- `docs/manual-acceptance.md`
|
|
161
|
+
- 如有必要,更新 `PRODUCT.md` / `DASHBOARD.md`
|
|
162
|
+
|
|
163
|
+
另外,旧的规划文档 `docs/planning/SPEC-assistant-persona-bootstrap.md` 不应继续保留成“Ready for implementation”的当前口径;应明确标注已被本 spec 取代。
|
|
164
|
+
|
|
165
|
+
## 7. 验收标准
|
|
166
|
+
|
|
167
|
+
1. CLI 帮助与参数解析中已不存在 `--persona` / `--persona-file`。
|
|
168
|
+
2. 新建 assistant 时,`ally setup` 仍能正常创建 desk、配置与默认 `SOUL.md`。
|
|
169
|
+
3. `ally assistant add` / `ally assistant ensure` 不再接受 persona 参数。
|
|
170
|
+
4. `internal/modules/assistant/manage.sh` 中 persona 注入相关逻辑已删除,而不是仅闲置。
|
|
171
|
+
5. persona 相关 shell 测试已删除或改写为新的默认模板断言。
|
|
172
|
+
6. Quick Start / README / troubleshooting / manual acceptance 不再教用户使用 persona 参数。
|
|
173
|
+
7. 现有 assistant desk 不会因升级或 `assistant ensure` 被静默改写 `SOUL.md`。
|
|
174
|
+
8. 桌面端现有的 `SOUL.md` 直接编辑能力不受影响。
|
|
175
|
+
|
|
176
|
+
## 8. 风险 / 假设 / 待决问题
|
|
177
|
+
|
|
178
|
+
### 8.1 风险
|
|
179
|
+
|
|
180
|
+
- 如果代码只删参数、不删写回逻辑,会留下死代码与未来误判点。
|
|
181
|
+
- 如果默认模板改得过猛,可能影响新 assistant 的初始可读性。
|
|
182
|
+
- 如果文档不一起改,用户会继续按旧说明使用,造成体验断裂。
|
|
183
|
+
|
|
184
|
+
### 8.2 假设
|
|
185
|
+
|
|
186
|
+
- 桌面端会继续作为普通用户的默认人设编辑入口。
|
|
187
|
+
- CLI 用户可以接受直接手动编辑 `SOUL.md`。
|
|
188
|
+
|
|
189
|
+
### 8.3 待决问题
|
|
190
|
+
|
|
191
|
+
1. 默认 `SOUL.md` 是否继续保留“用户补充设定”这一节,还是进一步收成更中性的静态说明?
|
|
192
|
+
- 当前建议:保留,但只作为静态段落,不再做可编程注入。
|
|
193
|
+
|
|
194
|
+
## 9. 实施建议
|
|
195
|
+
|
|
196
|
+
建议按一个小步完成:
|
|
197
|
+
|
|
198
|
+
1. 先删命令参数与写回逻辑
|
|
199
|
+
2. 再简化模板
|
|
200
|
+
3. 再删测试与同步文档
|
|
201
|
+
4. 最后回归 `tests/shell/assistant.sh` 与相关 desk bootstrap 路径
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# 开发协作准则
|
|
2
|
+
|
|
3
|
+
## 开发入口
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
cd work-ally
|
|
7
|
+
export npm_config_cache=$PWD/.npm-cache
|
|
8
|
+
npm install
|
|
9
|
+
npm test
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## 开发态与 install-first
|
|
13
|
+
|
|
14
|
+
默认用户入口来自 npm 安装版本。
|
|
15
|
+
|
|
16
|
+
开发建议:
|
|
17
|
+
|
|
18
|
+
1. 在源码仓库开发、补测试
|
|
19
|
+
2. 用 `WORK_ALLY_SOURCE_DIR=<repo>` 做源码联调
|
|
20
|
+
3. 准备发布时执行:
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
npm run release:alpha
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
4. 在目标机器验证安装形态:
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
npm i -g work-ally@alpha
|
|
30
|
+
ally status --assistant <name>
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## 验证入口
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
npm test
|
|
37
|
+
npm run runtime:health
|
|
38
|
+
npm run runtime:probe -- 'Reply with exactly: OK'
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## 文档同步要求
|
|
42
|
+
|
|
43
|
+
行为变化后,同步更新:
|
|
44
|
+
|
|
45
|
+
- `README.md`
|
|
46
|
+
- `docs/user-quickstart.md`
|
|
47
|
+
- `docs/manual-acceptance.md`
|
|
48
|
+
- `docs/ops-runbook.md`
|
|
49
|
+
- `docs/troubleshooting.md`
|