peepface 0.0.0-stage → 0.1.0

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/states.json ADDED
@@ -0,0 +1,274 @@
1
+ {
2
+ "$comment": "peepface 状态词汇表 v0.1 — 规定 agent 状态在视觉上必须有什么差别,不规定用什么技术实现。",
3
+ "version": "0.1",
4
+ "principle": "每个状态必须有「和谁不像」的明确答案。分不清的状态等于没有状态。",
5
+ "layers": {
6
+ "lifecycle": {
7
+ "$comment": "系统状态:程序自己知道,可自动判定。决定形体、眼形、眼位、节奏。",
8
+ "states": {
9
+ "idle": {
10
+ "means": "没事干,但醒着",
11
+ "visual": {
12
+ "shape": "正圆",
13
+ "eyes": "竖胶囊 11.5×24,倾 -13°",
14
+ "motion": "注视缓慢漂移 ±8°,呼吸 0.8%",
15
+ "blink": "2.6–6 秒一次"
16
+ },
17
+ "trigger": [
18
+ "5 秒内没有任何文本变化"
19
+ ],
20
+ "differs_from": {
21
+ "listening": "listening 的眼位是前倾的,idle 是中性的",
22
+ "sleeping": "idle 有眨眼和漂移,sleeping 眼皮压住不动"
23
+ },
24
+ "must_not": "完全静止。一丝呼吸和漂移是「活着」和「冻住」的分界线。"
25
+ },
26
+ "listening": {
27
+ "means": "用户正在输入,我在等",
28
+ "visual": {
29
+ "shape": "正圆",
30
+ "eyes": "同 idle,但眼位整体前倾(gaze bias 下移 30%)",
31
+ "motion": "呼吸略快",
32
+ "blink": "2.4–5 秒一次"
33
+ },
34
+ "trigger": [
35
+ "3 秒内有过键盘输入",
36
+ "且输入框有内容"
37
+ ],
38
+ "differs_from": {
39
+ "idle": "眼位前倾 + 呼吸略快。差别很小,但必须存在。"
40
+ },
41
+ "must_not": "和 idle 完全一致。用户打完字抬头看,应该能感到「它在等我」。"
42
+ },
43
+ "thinking": {
44
+ "means": "收到请求了,还没开始输出",
45
+ "visual": {
46
+ "shape": "不规则 blob(3/5 阶谐波)",
47
+ "eyes": "11.5×21,倾 -28°(像在琢磨)",
48
+ "motion": "眼上飘,呼吸 1.4%",
49
+ "decor": "轨道环出现"
50
+ },
51
+ "trigger": [
52
+ "按回车后 2 秒内且无输出"
53
+ ],
54
+ "differs_from": {
55
+ "working": "thinking 有形变 + 轨道环,working 是圆的正经的",
56
+ "idle": "形状不同,不需要看眼睛也能分辨"
57
+ },
58
+ "must_not": "和 streaming 混用。thinking 是「还没开始」,流式输出是「已经在说」。"
59
+ },
60
+ "searching": {
61
+ "means": "在翻找(检索、读文件、扫目录)",
62
+ "visual": {
63
+ "shape": "正圆",
64
+ "eyes": "横缝 17×6",
65
+ "motion": "眼左右扫视 3.6 Hz,像在检索",
66
+ "blink": "3–6 秒一次"
67
+ },
68
+ "trigger": [
69
+ "工具调用且属检索类"
70
+ ],
71
+ "differs_from": {
72
+ "working": "working 的眼不动,searching 的眼在扫",
73
+ "thinking": "thinking 眼向上飘且有形变"
74
+ },
75
+ "must_not": "和 working 共用。检索是「在外面找」,干活是「在里面做」。"
76
+ },
77
+ "streaming": {
78
+ "means": "正在往外吐字",
79
+ "visual": {
80
+ "shape": "正圆",
81
+ "eyes": "竖胶囊(同 idle)",
82
+ "motion": "呼吸 1.2%",
83
+ "blink": "3–6 秒一次"
84
+ },
85
+ "trigger": [
86
+ "文本增长率 > 55 字符/秒"
87
+ ],
88
+ "differs_from": {
89
+ "working": "视觉接近,靠速率区分。若实现资源有限,可与 working 合并。"
90
+ },
91
+ "must_not": "无。这个状态的边界本来就模糊。"
92
+ },
93
+ "working": {
94
+ "means": "在做事,用户不需要介入",
95
+ "visual": {
96
+ "shape": "正圆",
97
+ "eyes": "横椭圆 19×8.5(眯成一条缝)",
98
+ "motion": "呼吸 2%(比 idle 明显)",
99
+ "blink": "3–7 秒一次"
100
+ },
101
+ "trigger": [
102
+ "1.4 秒内文本变过且增长率 > 2",
103
+ "或有在途请求"
104
+ ],
105
+ "differs_from": {
106
+ "blocked": "不歪、不变形、不冒符号。working 是「正常推进」。",
107
+ "thinking": "形状是圆,不是 blob"
108
+ },
109
+ "must_not": "加任何「卡住」的视觉信号。那会让人以为出问题了。"
110
+ },
111
+ "waiting": {
112
+ "means": "在等你决定(审批、确认、选择)",
113
+ "visual": {
114
+ "shape": "blob(轻微)",
115
+ "eyes": "竖胶囊,眼位侧看 55%",
116
+ "motion": "呼吸 0.6%(很稳)",
117
+ "decor": "半透明轨道环"
118
+ },
119
+ "trigger": [
120
+ "有未决的审批或提问"
121
+ ],
122
+ "differs_from": {
123
+ "idle": "侧看 + 轻微形变。idle 是正视的。",
124
+ "thinking": "没有上飘,环只有一半透明度"
125
+ },
126
+ "must_not": "和 idle 一样。等着你的时候最需要被看见。"
127
+ },
128
+ "blocked": {
129
+ "means": "过不去,需要人拉一把",
130
+ "visual": {
131
+ "shape": "竖向拉长(0.9×1.12)",
132
+ "eyes": "10.5×19,倾 +30°(歪着)",
133
+ "motion": "呼吸 0.5%(几乎停)",
134
+ "decor": "符号(! / 汗滴 / 泛红)"
135
+ },
136
+ "trigger": [
137
+ "权限被拒",
138
+ "依赖缺失",
139
+ "明确的阻塞错误"
140
+ ],
141
+ "differs_from": {
142
+ "failed": "blocked 是「还站得住」,failed 是「倒了」。failed 呼吸更慢、眼更散。",
143
+ "working": "形状和眼形完全不同"
144
+ },
145
+ "must_not": "和 working 用同一个形体。这是最需要一眼分清的一对。"
146
+ },
147
+ "finished": {
148
+ "means": "干完了",
149
+ "visual": {
150
+ "shape": "横向撑开(1.14×0.88)",
151
+ "eyes": "弯月笑眼 16×7,倾 -18°",
152
+ "motion": "呼吸 0.6%",
153
+ "duration": "1.8 秒后自动回 idle"
154
+ },
155
+ "trigger": [
156
+ "忙过之后,文本静止 1.4 秒"
157
+ ],
158
+ "differs_from": {
159
+ "idle": "形状更宽、眼睛是弯的。一眼可辨。"
160
+ },
161
+ "must_not": "停留超过 2 秒。超过就变成「常态」,失去信号价值。"
162
+ },
163
+ "failed": {
164
+ "means": "出错了,血本无归",
165
+ "visual": {
166
+ "shape": "正圆(不是拉长——拉长是 blocked 的)",
167
+ "eyes": "下垂眼 11×16,倾 -44°,眼位向下",
168
+ "motion": "呼吸 0.4%(比 blocked 更慢)"
169
+ },
170
+ "trigger": [
171
+ "请求失败",
172
+ "尾部文本出现 失败/错误/Error"
173
+ ],
174
+ "differs_from": {
175
+ "blocked": "blocked 是竖长脸 + 歪眼(还站得住);failed 是圆脸 + 下垂眼(塌了)。形状不同,不看眼睛也能分。"
176
+ },
177
+ "must_not": "和 blocked 完全相同。如果实现里两者一样,就把它们合并成一个状态,不要假装有两个。"
178
+ },
179
+ "sleeping": {
180
+ "means": "很久没人用了",
181
+ "visual": {
182
+ "shape": "正圆",
183
+ "eyes": "横线 20×3.2(闭成一条线)",
184
+ "motion": "呼吸 0.4%(极慢)",
185
+ "blink": "不眨,眼皮一直压着"
186
+ },
187
+ "trigger": [
188
+ "5 分钟没有任何文本变化"
189
+ ],
190
+ "differs_from": {
191
+ "idle": "眼皮是闭的,没有眨眼",
192
+ "working": "眼睛形状完全不同"
193
+ },
194
+ "must_not": "在 5 分钟内出现。这是「我已经睡了」,不是「我累了」。"
195
+ },
196
+ "waking": {
197
+ "means": "被叫醒了",
198
+ "visual": {
199
+ "shape": "正圆",
200
+ "eyes": "大眼 13×29(猛地睁开)",
201
+ "motion": "呼吸 1.6%",
202
+ "duration": "2 秒后回到被吵醒时的状态"
203
+ },
204
+ "trigger": [
205
+ "从 sleeping 恢复,且有活动"
206
+ ],
207
+ "differs_from": {
208
+ "idle": "眼睛明显更大",
209
+ "surprised 反应": "视觉接近,但 waking 是状态机的一环,不是反应"
210
+ },
211
+ "must_not": "停留超过 2 秒。醒了就是醒了。"
212
+ }
213
+ }
214
+ },
215
+ "reaction": {
216
+ "$comment": "情绪反应:需要理解内容才能触发。不进状态机,由事件调用。可覆盖在任意 lifecycle 上。",
217
+ "states": {
218
+ "happy": "弯月眼,身体变宽 —— 用户夸了它 / 任务顺利",
219
+ "excited": "身体快速抖动 + 轨道加速",
220
+ "laughing": "身体高频抖动,闭眼",
221
+ "proud": "身体微微上浮,眼睛半闭",
222
+ "curious": "两眼不对称(一大一小),歪头",
223
+ "playful": "身体左右摇摆",
224
+ "shy": "眼位躲开,轻微缩小",
225
+ "surprised": "眼睛猛地放大",
226
+ "suspicious": "眯眼 + 眼位偏移",
227
+ "angry": "眼形变锐,身体拉高",
228
+ "confused": "斜线眼",
229
+ "sad": "眼向下垂",
230
+ "drowsy": "眼皮半垂",
231
+ "bored": "眼睛看向一边,呼吸变慢",
232
+ "scared": "眼睛放大 + 身体缩小",
233
+ "celebrate": "整圈旋转 + 彩带",
234
+ "approving": "轻轻点头"
235
+ },
236
+ "note": "这 17 个在原版里各自绑定了一组 clip,但视觉上大多是「同一套形体 + 不同表情」。实现时优先级远低于 lifecycle。"
237
+ },
238
+ "morph": {
239
+ "$comment": "装饰动画:无语义,挂在状态上开关。",
240
+ "states": {
241
+ "orbit": "环绕细环,缓慢旋转",
242
+ "radar": "放射状扫描线",
243
+ "progress": "环形进度",
244
+ "spawning": "粒子聚拢",
245
+ "alerting": "感叹号弹出"
246
+ }
247
+ }
248
+ },
249
+ "aliases": {
250
+ "$comment": "业务状态名 → 视觉状态。这一层让使用者保留自己的词汇。",
251
+ "reading": "working",
252
+ "coding": "working",
253
+ "running": "working",
254
+ "computing": "working",
255
+ "controlling": "working",
256
+ "retrieving": "searching",
257
+ "browsing": "searching",
258
+ "awaiting_approval": "waiting",
259
+ "awaiting_user": "waiting",
260
+ "done": "finished",
261
+ "error": "failed",
262
+ "permission_denied": "blocked"
263
+ },
264
+ "timing": {
265
+ "blink_close_ratio": 0.42,
266
+ "blink_min": 260,
267
+ "finished_hold": 1800,
268
+ "thinking_max": 2500,
269
+ "idle_after_quiet": 1400,
270
+ "sleep_after": 300000,
271
+ "wake_hold": 2000,
272
+ "state_hysteresis": 600
273
+ }
274
+ }