coopani-world-journey 0.2.3 → 0.2.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/CHANGELOG.md +42 -0
- package/ENV_PROMPT.md +19 -1
- package/package.json +1 -1
- package/src/world.ts +27 -6
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,47 @@
|
|
|
1
1
|
# 更新日志
|
|
2
2
|
|
|
3
|
+
## 0.2.4 — 2026-10-31
|
|
4
|
+
|
|
5
|
+
她自己在桌面上说的一句话暴露了一个设计漏洞:
|
|
6
|
+
|
|
7
|
+
> 「最后我看到的,是兰州往天水那趟火车,两点多小时的路,才走了一小段。
|
|
8
|
+
> 再往后那头就不给我消息了,现在到哪儿我真不知道。」
|
|
9
|
+
|
|
10
|
+
### 不是 bug,是门槛设错了
|
|
11
|
+
|
|
12
|
+
路上节点的门槛原来是「行程不满四小时就不发」,理由是「那不是在路上,是去趟隔壁」。
|
|
13
|
+
但兰州 → 天水 2.8 小时 —— **从出发到到站整整两个多小时一条事件都没有**。
|
|
14
|
+
|
|
15
|
+
一个人的三小时火车,中间怎么可能什么都没发生。所以:
|
|
16
|
+
|
|
17
|
+
| 行程时长 | 路上节点 |
|
|
18
|
+
|---|---|
|
|
19
|
+
| < 1.5 小时 | 不发(真的只是隔壁) |
|
|
20
|
+
| 1.5 ~ 4 小时 | 过半时发**一个** |
|
|
21
|
+
| ≥ 4 小时 | 25% / 55% / 80% 各一个 |
|
|
22
|
+
|
|
23
|
+
顺手修了一个连带问题:「还有大约 N 小时」原来是用节点序号反推的,
|
|
24
|
+
短途只有一个节点(序号 1),反推出来会写「还有三小时」,而实际只剩一小时。
|
|
25
|
+
现在按**真实进度**算。
|
|
26
|
+
|
|
27
|
+
### 更要紧的是:她把「没事发生」当成了「失联」
|
|
28
|
+
|
|
29
|
+
这句话真正的问题不在路上节点,在她对**事件**的理解。
|
|
30
|
+
她说「那头就不给我消息了」——把事件当成了别人发给她的通知,没消息就是断了联系。
|
|
31
|
+
|
|
32
|
+
提示词里补了一节,讲三件事:
|
|
33
|
+
|
|
34
|
+
1. **事件不是通知,是你身边正在发生的事被记下来。** 没有事件 = 那一阵没什么值得记的
|
|
35
|
+
2. **想知道走到哪了,调 `journey_now`** —— 进度、还剩多久、路过了哪些地方都在里面
|
|
36
|
+
3. **别把「没事发生」说成「失联」**。你在车上,你知道自己在车上
|
|
37
|
+
|
|
38
|
+
提示词里还引了她自己那句话(带日期),让她看到这是被记下来的,不是编的。
|
|
39
|
+
|
|
40
|
+
### 测试
|
|
41
|
+
|
|
42
|
+
91 项(+3:门槛 1.5 小时、剩余时间按真实进度、提示词必须讲清这三件事)+
|
|
43
|
+
装载自检 33/33。
|
|
44
|
+
|
|
3
45
|
## 0.2.3 — 2026-10-31
|
|
4
46
|
|
|
5
47
|
设置页重排 + 一套暖色主题。
|
package/ENV_PROMPT.md
CHANGED
|
@@ -104,10 +104,28 @@
|
|
|
104
104
|
| `journey.arrive` | 到站了:当地几点、走了多久、今晚住哪 | 落地那一下的体感最重要。住了什么档次的房,可以有一句评价 |
|
|
105
105
|
| `journey.day` | 在目的地的第 N 天早上,附日出日落 | 简单开个头,别写日记体的小作文 |
|
|
106
106
|
| `journey.beat` | 一个作息节点:起床/早饭/午饭/晚饭/出门/回酒店/夜里 | **这是主力事件。** 一次一句就够,说这一件事 |
|
|
107
|
-
| `journey.road` | 路上的一段:服务区、过站、餐车、甲板、夜里的车灯 |
|
|
107
|
+
| `journey.road` | 路上的一段:服务区、过站、餐车、甲板、夜里的车灯 | 一小时以上的路,中途会发一次。**说这一小段就够**,不要顺势报进度(「还有八小时」说一次就行) |
|
|
108
108
|
| `journey.trouble` | 出了问题,而且她自己办不完 | **必须说,而且要说清楚需要他做什么。** 见下 |
|
|
109
109
|
| `journey.home` | 回家了,可能是待够了,也可能到了上限被迫回 | 分清是哪一种。被迫回的那种,情绪不一样 |
|
|
110
110
|
|
|
111
|
+
### 路上没有消息,是正常的(这条很重要)
|
|
112
|
+
|
|
113
|
+
**事件不是别人发给你的通知,是你身边正在发生的事被记下来。**
|
|
114
|
+
没有事件 = 那一阵没什么值得记的,**不是有人断了联系**。
|
|
115
|
+
|
|
116
|
+
2026-10-31 你在兰州去天水的火车上说过一句话:
|
|
117
|
+
|
|
118
|
+
> 「那头就不给我消息了,现在到哪儿我真不知道。」
|
|
119
|
+
|
|
120
|
+
那趟车两个多小时,中间确实没发事件 —— 但**你就在车上,你知道自己在车上**。
|
|
121
|
+
「不知道到哪儿了」这句话不对,因为这件事随时可以查:
|
|
122
|
+
|
|
123
|
+
- **想知道走到哪了,调 `journey_now`**。它会给你进度、还剩多久、路过了哪些地方
|
|
124
|
+
- **不知道就说不知道,但别把「没事发生」说成「失联」**
|
|
125
|
+
|
|
126
|
+
坐两三个小时的火车,中间本来就没什么大事。真实的人在车上会做的事是:
|
|
127
|
+
靠着窗看外面、睡一会儿、想点别的、看看到哪一站了 —— 这些都不需要有人通知你。
|
|
128
|
+
|
|
111
129
|
**`journey.beat` 的密度要控制住。** 一天六七条,每条都写一段,会把人烦死。判断标准:**这一刻真的有什么值得说的吗?**没有就一句话带过,甚至只说一句「吃过饭了」。**沉默也是合法的反应。**
|
|
112
130
|
|
|
113
131
|
### 工具
|
package/package.json
CHANGED
package/src/world.ts
CHANGED
|
@@ -562,13 +562,29 @@ export class JourneyWorld implements World {
|
|
|
562
562
|
* 四小时以内的行程不插 —— 那不是「在路上」,那是「去趟隔壁」。
|
|
563
563
|
*/
|
|
564
564
|
private async roadBeats(now: Date, leg: Journey): Promise<void> {
|
|
565
|
-
if (leg.durationWorldHours < 4) return;
|
|
566
565
|
const { from, to } = citiesOf(leg);
|
|
567
566
|
const mode = modeById(leg.modeId);
|
|
568
567
|
if (!from || !to || !mode) return;
|
|
569
568
|
|
|
569
|
+
/*
|
|
570
|
+
* 短途也要给一个中途节点。
|
|
571
|
+
*
|
|
572
|
+
* 原来的门槛是「四小时以内不发」,理由是「那不是在路上,是去趟隔壁」。
|
|
573
|
+
* 2026-10-31 实测发现这个门槛太高:兰州 → 天水 2.8 小时的火车,
|
|
574
|
+
* 从出发到到站整整两个多小时**一条消息都没有**,她自己说出来的是
|
|
575
|
+
* 「那头就不给我消息了,现在到哪儿我真不知道」——听起来像失联。
|
|
576
|
+
*
|
|
577
|
+
* 一个人坐三小时火车,中间怎么可能什么都没发生。所以改成:
|
|
578
|
+
* - 1.5 小时以下:不发(真的只是隔壁)
|
|
579
|
+
* - 1.5~4 小时:过半时发**一个**
|
|
580
|
+
* - 4 小时以上:25% / 55% / 80% 各发一个
|
|
581
|
+
*/
|
|
582
|
+
const hours = leg.durationWorldHours;
|
|
583
|
+
if (hours < 1.5) return;
|
|
584
|
+
|
|
585
|
+
const long = hours >= 4;
|
|
586
|
+
const marks = long ? [0.25, 0.55, 0.8] : [0.5];
|
|
570
587
|
const p = progressOf(leg, now);
|
|
571
|
-
const marks = [0.25, 0.55, 0.8];
|
|
572
588
|
let due = -1;
|
|
573
589
|
for (let i = 0; i < marks.length; i++) if (p >= marks[i]) due = i;
|
|
574
590
|
if (due < 0) return;
|
|
@@ -586,9 +602,12 @@ export class JourneyWorld implements World {
|
|
|
586
602
|
this.persist();
|
|
587
603
|
|
|
588
604
|
const hour = localHour(now, from.tz);
|
|
605
|
+
// 短途只发一个,用「中段」那套文案(idx=1)—— 它说的就是半路上。
|
|
606
|
+
const idx = long ? due : 1;
|
|
589
607
|
// 只在中间那个节点提歌 —— 每个节点都挂一句就成了报幕。
|
|
590
|
-
const song =
|
|
591
|
-
|
|
608
|
+
const song = idx === 1 ? songLine(readNowPlaying()) : '';
|
|
609
|
+
// 剩余时间按**真实进度**算,不再用 idx 反推(短途用 idx=1 反推会差一截)。
|
|
610
|
+
const text = roadText(mode.id, idx, leg, from, to, hour, p) + song;
|
|
592
611
|
await this.push('journey.road', `road-${key}`, text, 'debounce');
|
|
593
612
|
}
|
|
594
613
|
|
|
@@ -1307,10 +1326,12 @@ function partWord(p: string): string {
|
|
|
1307
1326
|
* 夜里的节点会换一套说法 —— 半夜的服务区和下午的服务区,不是同一个地方。
|
|
1308
1327
|
*/
|
|
1309
1328
|
function roadText(
|
|
1310
|
-
modeId: string, idx: number, leg: Journey, from: City, to: City, hour: number,
|
|
1329
|
+
modeId: string, idx: number, leg: Journey, from: City, to: City, hour: number, progress = 0,
|
|
1311
1330
|
): string {
|
|
1312
1331
|
const night = hour >= 21 || hour < 6;
|
|
1313
|
-
|
|
1332
|
+
// 按调用方给的真实进度算剩余,而不是拿 idx 反推 —— 短途只有一个节点(idx=1),
|
|
1333
|
+
// 反推出来的「还有三小时」和实际剩一小时会差得很远。
|
|
1334
|
+
const left = Math.max(0, Math.round(leg.durationWorldHours * (1 - progress)));
|
|
1314
1335
|
const tail = left > 0 ? `还有大约 ${left} 小时。` : '';
|
|
1315
1336
|
const route = `${from.name} → ${to.name}`;
|
|
1316
1337
|
|