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.
Files changed (172) hide show
  1. package/AGENTS.md +110 -0
  2. package/DASHBOARD.md +160 -0
  3. package/PRODUCT.md +113 -0
  4. package/README.md +403 -0
  5. package/ally.sh +171 -0
  6. package/bridge/src/approval-rules.ts +360 -0
  7. package/bridge/src/channel-delivery.ts +207 -0
  8. package/bridge/src/channel-types.ts +22 -0
  9. package/bridge/src/channels/fake/adapter.ts +31 -0
  10. package/bridge/src/channels/feishu/adapter.ts +411 -0
  11. package/bridge/src/channels/feishu/approvals.ts +6 -0
  12. package/bridge/src/channels/feishu/formatter.ts +276 -0
  13. package/bridge/src/channels/feishu/normalize.ts +368 -0
  14. package/bridge/src/codex-config.ts +52 -0
  15. package/bridge/src/config.ts +240 -0
  16. package/bridge/src/fake-runtime-client.ts +505 -0
  17. package/bridge/src/handoff-service.ts +494 -0
  18. package/bridge/src/logger.ts +194 -0
  19. package/bridge/src/memory-digest.ts +186 -0
  20. package/bridge/src/receiver-approval-autonomy.ts +158 -0
  21. package/bridge/src/receiver-control-core.ts +140 -0
  22. package/bridge/src/receiver-control-work-session.ts +218 -0
  23. package/bridge/src/receiver-control.ts +83 -0
  24. package/bridge/src/receiver-delivery.ts +136 -0
  25. package/bridge/src/receiver-helpers.ts +96 -0
  26. package/bridge/src/receiver-human-gate.ts +333 -0
  27. package/bridge/src/receiver-inbound-preflight.ts +162 -0
  28. package/bridge/src/receiver-recovery.ts +236 -0
  29. package/bridge/src/receiver-runtime-callbacks.ts +367 -0
  30. package/bridge/src/receiver-runtime-policy.ts +132 -0
  31. package/bridge/src/receiver-runtime-state.ts +124 -0
  32. package/bridge/src/receiver-support-actions.ts +189 -0
  33. package/bridge/src/receiver-thread-start.ts +57 -0
  34. package/bridge/src/receiver-turn-coordination.ts +94 -0
  35. package/bridge/src/receiver-turn-execution.ts +257 -0
  36. package/bridge/src/receiver-turn-failure.ts +143 -0
  37. package/bridge/src/receiver-turn-result.ts +185 -0
  38. package/bridge/src/receiver-turn-steer.ts +70 -0
  39. package/bridge/src/receiver-work-session.ts +76 -0
  40. package/bridge/src/receiver.ts +329 -0
  41. package/bridge/src/router.ts +62 -0
  42. package/bridge/src/runtime-client-agent-messages.ts +150 -0
  43. package/bridge/src/runtime-client-message-dispatch.ts +176 -0
  44. package/bridge/src/runtime-client-protocol.ts +411 -0
  45. package/bridge/src/runtime-client-request-ops.ts +56 -0
  46. package/bridge/src/runtime-client-run-turn.ts +158 -0
  47. package/bridge/src/runtime-client-thread-ops.ts +270 -0
  48. package/bridge/src/runtime-client-transport.ts +309 -0
  49. package/bridge/src/runtime-client-turn-poll.ts +224 -0
  50. package/bridge/src/runtime-client-turn-read.ts +185 -0
  51. package/bridge/src/runtime-client-turn-state.ts +105 -0
  52. package/bridge/src/runtime-client.ts +344 -0
  53. package/bridge/src/runtime-user-input.ts +403 -0
  54. package/bridge/src/scheduler.ts +239 -0
  55. package/bridge/src/server-handoff-command.ts +364 -0
  56. package/bridge/src/server-main.ts +80 -0
  57. package/bridge/src/server-routine-command.ts +60 -0
  58. package/bridge/src/server-routine-execution.ts +222 -0
  59. package/bridge/src/server-runtime-app-support.ts +107 -0
  60. package/bridge/src/server-runtime-app.ts +238 -0
  61. package/bridge/src/server-thread-sync-command.ts +63 -0
  62. package/bridge/src/server.ts +17 -0
  63. package/bridge/src/session-store-delivery.ts +220 -0
  64. package/bridge/src/session-store-human-gate.ts +380 -0
  65. package/bridge/src/session-store-inbound-acceptance.ts +66 -0
  66. package/bridge/src/session-store-meta.ts +134 -0
  67. package/bridge/src/session-store-turn-ledger.ts +272 -0
  68. package/bridge/src/session-store.ts +380 -0
  69. package/bridge/src/system-notify.ts +220 -0
  70. package/bridge/src/thread-sync.ts +200 -0
  71. package/bridge/src/translator.ts +494 -0
  72. package/bridge/src/types.ts +289 -0
  73. package/bridge/src/utils.ts +104 -0
  74. package/bridge/src/work-session-store.ts +471 -0
  75. package/docs/.gitkeep +0 -0
  76. package/docs/architecture/codex-feishu-bridge-proposal.md +2742 -0
  77. package/docs/completed/FEATURE-feishu-markdown-and-reply-support.md +327 -0
  78. package/docs/completed/README.md +21 -0
  79. package/docs/completed/SPEC-approval-autonomy-and-safe-defaults.md +205 -0
  80. package/docs/completed/SPEC-approval-batch-and-strict-reply-shortcuts.md +153 -0
  81. package/docs/completed/SPEC-conversation-noise-reduction-and-busy-input-gate.md +538 -0
  82. package/docs/completed/SPEC-engineering-sop-skillization.md +190 -0
  83. package/docs/completed/SPEC-faithful-bridge-core-thinning-v2.md +376 -0
  84. package/docs/completed/SPEC-faithful-bridge-core-thinning.md +1071 -0
  85. package/docs/completed/SPEC-group-chat-sender-identity.md +301 -0
  86. package/docs/completed/SPEC-middleware-exception-visibility.md +227 -0
  87. package/docs/completed/SPEC-nightly-memory-digest-visibility.md +121 -0
  88. package/docs/completed/SPEC-project-group-chat-human-centered-conversation-mapping.md +326 -0
  89. package/docs/completed/SPEC-remove-cli-persona-bootstrap.md +201 -0
  90. package/docs/developer-workflow.md +49 -0
  91. package/docs/implementation/SPEC-codex-same-machine-session-handoff-implementation.md +239 -0
  92. package/docs/implementation/test-coverage-map.md +363 -0
  93. package/docs/implementation/work-ally-implementation-guide.md +790 -0
  94. package/docs/issues/README.md +10 -0
  95. package/docs/issues/pending/ANALYSIS-ally-premature-recovery-notice-and-task-state-semantics-2026-03-18.md +295 -0
  96. package/docs/issues/resolved/ANALYSIS-approval-waiting-visible-but-approval-artifact-missing-2026-03-16.md +466 -0
  97. package/docs/issues/resolved/ANALYSIS-blocking-state-visible-without-user-actionable-artifact-2026-03-16.md +261 -0
  98. package/docs/issues/resolved/ANALYSIS-codex-app-server-transport-disconnect-semantics-2026-03-14.md +606 -0
  99. package/docs/issues/resolved/ANALYSIS-premature-terminalization-on-fresh-thread-poll-and-object-error-leak-2026-03-16.md +348 -0
  100. package/docs/issues/resolved/ANALYSIS-runtime-turn-delivery-and-recovery-2026-03-14.md +603 -0
  101. package/docs/issues/resolved/ANALYSIS-self-test-gap-approval-waiting-visible-but-approval-artifact-missing-2026-03-16.md +166 -0
  102. package/docs/issues/resolved/ANALYSIS-self-test-gap-blocking-state-visible-without-user-actionable-artifact-2026-03-16.md +186 -0
  103. package/docs/issues/resolved/ANALYSIS-self-test-gap-premature-terminalization-on-fresh-thread-poll-and-object-error-leak-2026-03-16.md +166 -0
  104. package/docs/issues/resolved/REPORT-ally-runtime-turn-delivery-3b42fb8-2026-03-15.md +373 -0
  105. package/docs/manual-acceptance.md +127 -0
  106. package/docs/ops-runbook.md +44 -0
  107. package/docs/planning/FEATURE-memory-system.md +748 -0
  108. package/docs/planning/SPEC-active-turn-steer-and-context-compaction-visibility.md +269 -0
  109. package/docs/planning/SPEC-approval-rules-inheritance-and-local-validation-lane.md +450 -0
  110. package/docs/planning/SPEC-assistant-persona-bootstrap.md +199 -0
  111. package/docs/planning/SPEC-assistant-rename.md +610 -0
  112. package/docs/planning/SPEC-bridge-app-server-protocol-alignment.md +667 -0
  113. package/docs/planning/SPEC-claude-runtime-host-for-work-ally.md +434 -0
  114. package/docs/planning/SPEC-cli-feishu-codex-session-unification.md +236 -0
  115. package/docs/planning/SPEC-codex-same-machine-session-handoff.md +873 -0
  116. package/docs/planning/SPEC-feishu-reaction-shortcuts.md +282 -0
  117. package/docs/planning/SPEC-local-stable-release-boundary.md +166 -0
  118. package/docs/planning/SPEC-managed-thread-entry-and-surface-mobility.md +862 -0
  119. package/docs/planning/SPEC-minimal-bridge-semantics-and-user-visible-surface.md +362 -0
  120. package/docs/planning/SPEC-npm-alpha-distribution-and-install-first-release.md +222 -0
  121. package/docs/planning/SPEC-remove-websocket-runtime-transport.md +364 -0
  122. package/docs/planning/SPEC-runtime-abstraction-phase-1.md +424 -0
  123. package/docs/planning/SPEC-runtime-connection-and-turn-recovery-semantics.md +274 -0
  124. package/docs/planning/SPEC-session-presence-and-state-visibility.md +397 -0
  125. package/docs/planning/SPEC-skill-first-capability-packaging.md +338 -0
  126. package/docs/planning/SPEC-stable-archive-contract.md +456 -0
  127. package/docs/planning/SPEC-supervised-start-boundary.md +127 -0
  128. package/docs/planning/SPEC-user-barrier-reduction-and-activation.md +832 -0
  129. package/docs/planning/ally-next.md +1278 -0
  130. package/docs/planning/assistant-workbench-spec.md +725 -0
  131. package/docs/planning/product-workbench.md +283 -0
  132. package/docs/product-onboarding.md +227 -0
  133. package/docs/product-spec-standard.md +528 -0
  134. package/docs/troubleshooting.md +45 -0
  135. package/docs/user-quickstart.md +46 -0
  136. package/internal/dispatch.sh +95 -0
  137. package/internal/lib/common.sh +1450 -0
  138. package/internal/modules/assistant/manage.sh +1312 -0
  139. package/internal/modules/bootstrap/setup.sh +144 -0
  140. package/internal/modules/config/init-env.sh +10 -0
  141. package/internal/modules/global/manage.sh +154 -0
  142. package/internal/modules/handoff/manage.sh +54 -0
  143. package/internal/modules/mcp/manage.sh +83 -0
  144. package/internal/modules/ops/logs.sh +76 -0
  145. package/internal/modules/routines/manage.sh +55 -0
  146. package/internal/modules/runtime/assistant-autosave.sh +26 -0
  147. package/internal/modules/runtime/restart.sh +6 -0
  148. package/internal/modules/runtime/start.sh +283 -0
  149. package/internal/modules/runtime/status.sh +194 -0
  150. package/internal/modules/runtime/stop.sh +55 -0
  151. package/internal/modules/runtime/supervisor.sh +216 -0
  152. package/internal/modules/runtime/update.sh +26 -0
  153. package/package.json +41 -0
  154. package/runtime/config/.gitkeep +0 -0
  155. package/runtime/host/.gitkeep +0 -0
  156. package/runtime/host/healthcheck-codex-app-server.ts +22 -0
  157. package/runtime/host/ping-pong-codex-app-server.ts +66 -0
  158. package/runtime/host/probe-codex-app-server.ts +115 -0
  159. package/skills/archive-reader/SKILL.md +9 -0
  160. package/skills/feishu-production-debug/SKILL.md +37 -0
  161. package/skills/feishu-production-debug/references/feishu-debug-order.md +49 -0
  162. package/skills/feishu-production-debug/references/platform-permission-baseline.md +23 -0
  163. package/skills/issue-to-spec-triage/SKILL.md +44 -0
  164. package/skills/issue-to-spec-triage/references/triage-rules.md +66 -0
  165. package/skills/memory-digest/SKILL.md +9 -0
  166. package/skills/post-implementation-closure/SKILL.md +39 -0
  167. package/skills/post-implementation-closure/references/closure-checklist.md +45 -0
  168. package/skills/post-implementation-closure/references/doc-drift-map.md +49 -0
  169. package/skills/product-spec/SKILL.md +244 -0
  170. package/templates/env.example +5 -0
  171. package/templates/routines/nightly-memory-digest.yaml +10 -0
  172. package/templates/workspace/AGENTS.md +26 -0
@@ -0,0 +1,397 @@
1
+ # Session Presence And State Visibility
2
+
3
+ 更新时间:2026-03-15
4
+ 状态:Partially shipped / baseline updated 2026-03-18
5
+
6
+ > 注:这份 spec 建立了“对话内可见性”的基础思路,但自 2026-03-18 起,bridge 前台边界已进一步收紧。后续实现与产品口径以 `docs/planning/SPEC-minimal-bridge-semantics-and-user-visible-surface.md` 为准:默认只转发事实,不解释内部 recovery / stale cleanup / artifact pending 等实现层状态。
7
+
8
+ ## 1. 背景
9
+
10
+ 当前 `work-ally` 已经有一部分“工作中”反馈能力:
11
+
12
+ - 入站后有轻量 ack reaction
13
+ - 长耗时 turn 期间,bridge 会发送 `progress_update`
14
+ - 等审批、等补充信息、runtime 不可用时,也有不同文案
15
+
16
+ 但在真实 Feishu 对话里,用户仍然会频繁遇到一个核心问题:
17
+
18
+ > **我不知道 assistant 现在到底还在干活,还是已经停下来了,还是其实在等我。**
19
+
20
+ 这说明当前产品缺的不是单一文案,而是一套稳定的**会话状态可见性**能力。
21
+
22
+ ## 2. 问题定义
23
+
24
+ 当前缺口主要有三类。
25
+
26
+ ### 2.1 已收到后的任务状态语义仍需克制表达
27
+
28
+ 现在 ack reaction 只能说明“系统看到了消息”,但如果再补一条通用“开始处理”文案,又会引入新的噪音。因此关键不再是简单加一句收到文案,而是让用户只在真正重要的状态切换时得到提示:
29
+
30
+ - 是否真正进入处理
31
+ - 是否已经启动 turn
32
+ - 是否只是消息到了桥接层
33
+ - 当前是否已经进入“等待我操作”或“恢复未确认”
34
+
35
+ 对 IM 用户来说,这个差别很重要。
36
+
37
+ ### 2.2 长时间无消息时,用户无法判断是忙、卡、还是结束
38
+
39
+ 虽然系统有 heartbeat 机制,但当前默认心跳周期较长,而且它主要覆盖“turn 正在运行”的阶段。
40
+
41
+ 因此用户会遇到歧义:
42
+
43
+ - assistant 仍在处理
44
+ - runtime / bridge 出现异常
45
+ - 当前轮其实已经结束,只是系统没明确宣布状态
46
+
47
+ ### 2.3 “等待用户动作”没有被提升为明确状态
48
+
49
+ 当系统处于以下状态时:
50
+
51
+ - 等审批
52
+ - 等补充信息
53
+ - 等用户继续推进
54
+
55
+ 当前虽然有局部消息,但没有形成稳定、统一、显式的“现在轮到你了”状态模型。
56
+
57
+ ## 3. 目标
58
+
59
+ 建立一套面向 Feishu 对话的最小 presence / state visibility 能力,让用户随时知道:
60
+
61
+ 1. assistant 是否已开始处理
62
+ 2. assistant 当前是在工作、卡住、还是等我
63
+ 3. 一轮任务是否已经结束并回到空闲状态
64
+
65
+ ## 4. 非目标
66
+
67
+ 本 feature 不做:
68
+
69
+ - 实时细粒度 token 流可视化
70
+ - 复杂 dashboard 或独立控制台
71
+ - 完整 workflow engine 状态机
72
+ - 替代 `/status` 的重型管理面板
73
+
74
+ 这是一条 **对话内可见性** feature,不是运维看板 feature。
75
+
76
+ ## 5. 产品定义
77
+
78
+ ### 5.1 要暴露给用户的最小状态集合
79
+
80
+ V1 只保留下面五类状态:
81
+
82
+ 1. reaction ack(轻量收到)
83
+ 2. `正在处理`
84
+ 3. `等待你操作`
85
+ 4. `处理异常 / 正在恢复`
86
+ 5. `本轮已结束 / 当前空闲`
87
+
88
+ ### 5.2 用户侧的核心问题
89
+
90
+ 用户在任何时刻都应能回答下面这两个问题:
91
+
92
+ 1. **现在是谁在动?**
93
+ - assistant 在动
94
+ - 轮到我动
95
+ 2. **这一轮结束了吗?**
96
+ - 还没结束
97
+ - 已结束
98
+
99
+ ## 6. 建议状态模型
100
+
101
+ ### 6.1 Received
102
+
103
+ 含义:消息已被 bridge 接住,并且准备进入处理。
104
+
105
+ 建议表现:
106
+
107
+ - 保留 reaction ack
108
+ - 正常路径不再额外补一条“已收到,开始处理”文本状态;只有进入真实 runtime 进度、等待用户或异常恢复时再显式出声
109
+
110
+ 原因:reaction 已足够表达“bridge 已接住消息”;继续补通用收到文案会把正常对话刷成状态流。
111
+
112
+ ### 6.2 Running
113
+
114
+ 含义:当前 turn 正在执行。
115
+
116
+ 建议表现:
117
+
118
+ - 首条 running 文案尽早发送,不等太久
119
+ - 后续 heartbeat 继续存在,但间隔应更贴近 IM 体验
120
+ - runtime 有中间 commentary 时,优先发真实进度;无真实进度时再发通用 heartbeat
121
+
122
+ ### 6.3 WaitingUser
123
+
124
+ 含义:assistant 当前没有继续推进所需条件,正在等用户动作。
125
+
126
+ 包括:
127
+
128
+ - approval pending
129
+ - user input pending
130
+ - 其他明确需要用户继续的中间状态
131
+
132
+ 建议表现:
133
+
134
+ - 不只发审批卡或提问文案
135
+ - 还要显式告诉用户:**当前已暂停,等待你回复/审批后继续**
136
+
137
+ ### 6.4 Recovering / Blocked
138
+
139
+ 含义:系统异常、runtime 不可用、连接抖动,当前无法正常推进。
140
+
141
+ 建议表现:
142
+
143
+ - 明确说是系统问题,不要继续假装“正在思考中”
144
+ - 明确当前是否在自动恢复
145
+ - 如果本轮无法恢复,明确提示用户重发上一条消息
146
+
147
+ ### 6.5 Idle / Completed
148
+
149
+ 含义:上一轮已经结束,当前没有活跃任务。
150
+
151
+ 建议表现:
152
+
153
+ - 最终回复成功发出后,用户应默认理解为本轮结束
154
+ - 对某些没有 final reply 的中间分支,也应有显式“当前空闲”回落信号
155
+
156
+ 这里的重点不是一定要额外发一条“已结束”,而是要避免让用户长期处于“不知道现在是不是结束了”的状态。
157
+
158
+ ## 7. 核心产品判断
159
+
160
+ ### 7.1 不能只做 heartbeat
161
+
162
+ heartbeat 只能解决“长时间处理中没声音”的问题。
163
+
164
+ 它解决不了:
165
+
166
+ - 是否已经真正开始处理
167
+ - 是否已切到等待用户
168
+ - 是否本轮已经结束
169
+
170
+ 所以本 feature 本质上是 **状态切换通知**,不是单纯“更频繁的工作中文案”。
171
+
172
+ ### 7.2 不能把判断责任丢给用户
173
+
174
+ 用户不应该通过下面这些线索自行猜测:
175
+
176
+ - 有没有 reaction
177
+ - 有没有过了很久
178
+ - 有没有最终回复
179
+ - 有没有看起来像卡住
180
+
181
+ 中间层必须主动把状态语义讲清楚。
182
+
183
+ ### 7.3 `/status` 是诊断入口,不是常规 presence 替代品
184
+
185
+ `/status` 仍然有价值,但它更像诊断工具。
186
+
187
+ 常规 IM 交互里,用户不应每次都靠 `/status` 才知道当前到底发生了什么。
188
+
189
+ ## 8. 建议实现切片
190
+
191
+ ### Phase 1:补齐状态切换文案
192
+
193
+ 先不引入新协议,优先基于现有 outbound 类型补齐文案与发送时机:
194
+
195
+ - 收到后快速补一条 `status_reply`:已收到,开始处理
196
+ - heartbeat 首次触发更早
197
+ - 审批 / user input 出现时,补显式“等待你操作”状态
198
+ - runtime 故障时,切换成恢复/阻塞状态,而不是继续假装运行中
199
+
200
+ ## 8.1 V1 明确范围
201
+
202
+ 本次实现只做 Feishu / 当前 channel 通用对话链路里的最小闭环,不额外扩协议。
203
+
204
+ V1 必做:
205
+
206
+ 1. 收到用户消息后,先保留 reaction ack,不再默认补“已收到,开始处理”文本状态
207
+ 2. 只有存在真实 runtime 中间进度时,才发送对应的工作中消息
208
+ 3. 出现审批或补充信息时,额外补一条“等待你操作”状态
209
+ 4. runtime 故障 / 恢复中时,保持现有故障提示,但不再继续发送误导性的“正在思考中”
210
+ 5. 保持最终回复仍然是本轮结束的主要信号,不额外引入多余“已结束”噪音
211
+ 6. 如果本轮已经结束,但没有可见正文可发,必须补一条明确的“本轮已结束 / 当前没有更多动作”系统状态,避免用户误以为 assistant 仍在后台继续工作
212
+
213
+ V1 不做:
214
+
215
+ - 新的持久化状态字段
216
+ - 新的 channel 协议类型
217
+ - 独立面板、会话列表或状态总览 UI
218
+ - “空闲”状态的额外独立通知
219
+
220
+ ## 8.2 直接派工实现点
221
+
222
+ 建议工程按下面顺序做。
223
+
224
+ ### A. 文案层
225
+
226
+ 文件:`bridge/src/translator.ts`
227
+
228
+ 新增或整理三类明确文案:
229
+
230
+ 1. `waiting_user` 文案
231
+ - 审批场景:`当前已暂停,等待你审批后继续。`
232
+ - 补充信息场景:`当前已暂停,等待你回复后继续。`
233
+ 3. 继续保留现有 heartbeat / recovery 文案,但避免语义重叠
234
+
235
+ 要求:
236
+
237
+ - 文案短
238
+ - 明确说清“现在谁在动”
239
+ - 不引入工程内部术语
240
+
241
+ ### B. Receiver 发送时机
242
+
243
+ 文件:`bridge/src/receiver.ts`
244
+
245
+ 需要补三个发送点:
246
+
247
+ 1. **收到消息并准备 runTurn 前**
248
+ - 发送一条 `status_reply`
249
+ - 文案为 `已收到,开始处理`
250
+ - 这条消息应在 reaction ack 之后、真正进入 turn 之前发出
251
+
252
+ 2. **首次 running 心跳前移**
253
+ - 不要求立刻狂发 heartbeat
254
+ - 但要确保用户在短时间内能看到“正在处理”的文本状态
255
+ - 若 runtime 很快给出真实 progress,则以真实 progress 为准;若没有,则 fallback 到通用 heartbeat
256
+
257
+ 3. **进入等待用户状态时**
258
+ - `onApproval` 里,在审批卡之外,补一条 `status_reply`
259
+ - `onUserInput` 里,在问题文案之外,补一条 `status_reply`
260
+ - 文案明确说明:当前已暂停,等待你操作后继续
261
+ 4. **完成但无正文时**
262
+ - 若 turn 已 `completed`,但最终可见 reply 为空,不要静默结束
263
+ - 改发一条带系统前缀的 `status_reply`
264
+ - 文案明确说明:本轮已结束,当前没有更多动作;如需继续,请直接发下一条消息
265
+
266
+ 额外要求:
267
+
268
+ - 如果当前已经进入 waiting_user,不应继续发送“正在思考中,请稍候…”类 heartbeat
269
+ - runtime unavailable 分支保持现有逻辑,不再伪装成 running
270
+
271
+ ### C. 心跳策略
272
+
273
+ 文件:`bridge/src/receiver.ts`、必要时 `bridge/src/config.ts`
274
+
275
+ V1 不一定要改默认配置值,但至少要满足:
276
+
277
+ - 在测试与真实体验上,首次可见 running 状态明显早于当前用户体感
278
+ - 不让用户长期只有 reaction 而没有文本状态
279
+
280
+ 如果工程上更稳妥,可以这样做:
281
+
282
+ - 保留现有 `progressHeartbeatSeconds` 作为常规周期
283
+ - 但新增一次性的“首条运行提示”快速发送逻辑
284
+
285
+ 这样改动更小,也更符合 V1。
286
+
287
+ ### D. 测试补齐
288
+
289
+ 优先补 integration tests,文件建议放在:
290
+
291
+ - `tests/integration/session/*.test.mjs`
292
+
293
+ 至少补这几类:
294
+
295
+ 1. `received` 文案测试
296
+ - 用户消息进入后,除了 ack reaction,还能看到 `status_reply: 已收到,开始处理`
297
+
298
+ 2. running 可见性测试
299
+ - 慢任务开始后,用户能在短时间内收到明确 running 文案或真实 progress
300
+
301
+ 3. waiting approval 测试
302
+ - 出现审批时,除了审批卡,还会收到“等待你审批后继续”的状态提示
303
+
304
+ 4. waiting user input 测试
305
+ - 出现补充信息请求时,除了问题文案,还会收到“等待你回复后继续”的状态提示
306
+
307
+ 5. waiting 状态下不再伪装 running
308
+ - 进入 waiting_user 之后,不再继续发通用 thinking heartbeat
309
+
310
+ 6. runtime unavailable 测试
311
+ - 继续验证故障时不会发误导性的 running heartbeat
312
+
313
+ ### E. 文档回写
314
+
315
+ 至少同步更新:
316
+
317
+ - `docs/user-quickstart.md`
318
+ - `docs/troubleshooting.md`
319
+ - 如有必要,`docs/manual-acceptance.md`
320
+
321
+ 要让用户侧文档能回答:
322
+
323
+ - 为什么我会看到“已收到,开始处理”
324
+ - 为什么系统会提示“等待你操作”
325
+ - 哪些情况下说明 assistant 还在工作,哪些情况下说明已经轮到我
326
+
327
+ ### Phase 2:统一 presence 事件模型
328
+
329
+ 如果 Phase 1 验证有效,再考虑抽出统一的 presence 状态事件,例如:
330
+
331
+ - `received`
332
+ - `running`
333
+ - `waiting_user`
334
+ - `recovering`
335
+ - `idle`
336
+
337
+ 这样后续 CLI、日志、面板都可以复用一套状态语义。
338
+
339
+ ## 9. 验收标准
340
+
341
+ 满足以下条件时,本 feature 才算成立:
342
+
343
+ 1. 用户发出消息后,能明确知道系统已开始处理,而不只是看到 reaction
344
+ 2. 长耗时处理中,用户能持续知道当前仍在运行
345
+ 3. 等审批或等补充信息时,用户能明确知道当前轮到自己动作
346
+ 4. runtime 或连接异常时,系统不再继续伪装成“正常思考中”
347
+ 5. 一轮任务结束后,用户不会长时间处于“到底结束没”的模糊状态
348
+
349
+ 补充成工程可验收口径:
350
+
351
+ - 用户发消息后,channel 中出现 `status_reply`,文本明确表达“已收到,开始处理”
352
+ - slow turn 下,channel 中出现至少一条 running 可见性消息
353
+ - approval / user input 场景下,channel 中出现一条 waiting_user 状态消息
354
+ - waiting_user 建立后,不会继续发送通用 thinking heartbeat
355
+ - runtime unavailable 场景下,继续发送故障/恢复提示,而不是 running heartbeat
356
+
357
+ ## 10. 与现有主线的关系
358
+
359
+ 这条 feature 应视为 `会话 mobility / 状态可见性` 主线的一部分。
360
+
361
+ 它优先于真正的面板建设,因为:
362
+
363
+ - 面板只是状态放大器
364
+ - 状态模型才是底层产品能力
365
+
366
+ 没有稳定的状态语义,做更重的工作台只会放大模糊感。
367
+
368
+ ## 11. 可直接转交工程师的任务说明
369
+
370
+ ### 任务标题
371
+
372
+ 补齐 Feishu 对话内的 session presence / state visibility,解决“用户无法判断 assistant 是在工作、在等我还是已经停下”的体验缺口。
373
+
374
+ ### 任务目标
375
+
376
+ 在不引入新协议、不做重面板的前提下,让用户在对话中明确看到:
377
+
378
+ - 已收到,开始处理
379
+ - 正在处理
380
+ - 等待你操作
381
+ - 异常/恢复中
382
+
383
+ ### 主要改动文件
384
+
385
+ - `bridge/src/translator.ts`
386
+ - `bridge/src/receiver.ts`
387
+ - `tests/integration/session/*.test.mjs`
388
+ - 可能涉及 `docs/user-quickstart.md` / `docs/troubleshooting.md` / `docs/manual-acceptance.md`
389
+
390
+ ### Definition of Done
391
+
392
+ 1. 收到消息后,除了 reaction ack,还能看到明确的开始处理状态
393
+ 2. 长耗时任务不会让用户长期无感知
394
+ 3. 审批/补充信息时,用户能明确知道当前轮到自己操作
395
+ 4. 等用户期间不再继续伪装成 assistant 正在思考
396
+ 5. 故障/恢复提示保持明确
397
+ 6. 对应 integration tests 补齐并通过