@jun133/athlete 0.0.5 → 0.0.6

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 (91) hide show
  1. package/README.md +151 -98
  2. package/dist/cli.js +24213 -20514
  3. package/dist/cli.js.map +1 -1
  4. package/package.json +3 -1
  5. package/scripts/postinstall-playwright.mjs +10 -10
  6. package/spec/README.md +49 -41
  7. package/spec//346/212/200/346/234/257/345/256/236/347/216/260/README.md +29 -0
  8. package/spec//346/212/200/346/234/257/345/256/236/347/216/260//344/270/273/345/276/252/347/216/257/344/270/216/350/260/203/345/272/246.md +60 -0
  9. package/spec//346/212/200/346/234/257/345/256/236/347/216/260//344/273/223/345/272/223/347/272/246/346/235/237//345/274/200/345/217/221/350/247/204/345/210/231.md +14 -0
  10. package/spec//346/212/200/346/234/257/345/256/236/347/216/260//344/273/223/345/272/223/347/272/246/346/235/237//346/234/254/345/234/260/345/221/275/344/273/244/344/270/216/346/265/201/347/250/213.md +20 -0
  11. package/spec//346/212/200/346/234/257/345/256/236/347/216/260//344/273/223/345/272/223/347/272/246/346/235/237//346/265/213/350/257/225/347/255/226/347/225/245.md +48 -0
  12. package/spec//346/212/200/346/234/257/345/256/236/347/216/260//344/273/243/347/240/201/345/234/260/345/233/276//347/233/256/345/275/225/345/210/260/344/273/243/347/240/201/346/230/240/345/260/204.md +51 -0
  13. package/spec//346/212/200/346/234/257/345/256/236/347/216/260//345/205/263/351/224/256/346/250/241/345/235/227/Telegram/347/247/201/350/201/212.md +31 -0
  14. package/spec//346/212/200/346/234/257/345/256/236/347/216/260//345/205/263/351/224/256/346/250/241/345/235/227//344/272/244/344/272/222/347/273/210/347/253/257.md +26 -0
  15. package/spec//346/212/200/346/234/257/345/256/236/347/216/260//345/205/263/351/224/256/346/250/241/345/235/227//345/221/275/344/273/244/350/241/214/344/272/247/345/223/201/351/235/242.md +27 -0
  16. package/spec//346/212/200/346/234/257/345/256/236/347/216/260//345/205/263/351/224/256/346/250/241/345/235/227//345/244/232/346/231/272/350/203/275/344/275/223/350/260/203/345/272/246.md +79 -0
  17. package/spec//346/212/200/346/234/257/345/256/236/347/216/260//345/205/263/351/224/256/346/250/241/345/235/227//345/256/277/344/270/273/350/277/220/350/241/214/350/276/271/347/225/214.md +74 -0
  18. package/spec//346/212/200/346/234/257/345/256/236/347/216/260//345/205/263/351/224/256/346/250/241/345/235/227//345/267/245/344/275/234/345/214/272/344/270/216/345/271/266/350/241/214/351/232/224/347/246/273.md +55 -0
  19. package/spec//346/212/200/346/234/257/345/256/236/347/216/260//345/205/263/351/224/256/346/250/241/345/235/227//345/276/256/344/277/241/347/247/201/350/201/212.md +33 -0
  20. package/spec//346/212/200/346/234/257/345/256/236/347/216/260//345/205/263/351/224/256/346/250/241/345/235/227//346/211/251/345/261/225/346/234/272/345/210/266.md +179 -0
  21. package/spec//346/212/200/346/234/257/345/256/236/347/216/260//345/205/263/351/224/256/346/250/241/345/235/227//346/216/247/345/210/266/351/235/242/350/264/246/346/234/254.md +32 -0
  22. package/spec//346/212/200/346/234/257/345/256/236/347/216/260//345/205/263/351/224/256/346/250/241/345/235/227//351/205/215/347/275/256/347/263/273/347/273/237.md +31 -0
  23. package/spec//346/212/200/346/234/257/345/256/236/347/216/260//346/200/273/344/275/223/346/236/266/346/236/204.md +115 -0
  24. package/spec//346/212/200/346/234/257/345/256/236/347/216/260//347/212/266/346/200/201/344/270/216/347/234/237/347/233/270/346/272/220.md +129 -0
  25. package/spec//347/224/250/346/210/267/345/256/241/351/230/205/README.md +27 -0
  26. package/spec//347/224/250/346/210/267/345/256/241/351/230/205//344/272/247/345/223/201/345/256/232/344/275/215.md +78 -0
  27. package/spec/{principles/P06- → /347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/06-}/344/270/212/344/270/213/346/226/207/350/246/201/350/203/275/345/216/213/347/274/251.md +5 -5
  28. package/spec/{principles/P08- → /347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/08-}/346/205/242/346/223/215/344/275/234/346/224/276/345/220/216/345/217/260.md +1 -1
  29. package/spec/{principles/P13-session → /347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/13-session}/346/230/257/344/273/273/345/212/241/347/216/260/345/234/272.md +5 -5
  30. package/spec/{principles/P15-provider → /347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/15-provider}/345/277/205/351/241/273/345/217/257/346/233/277/346/215/242.md +12 -12
  31. package/spec//347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/17-/346/211/251/345/261/225/351/235/240/344/272/213/344/273/266/347/224/237/351/225/277.md +71 -0
  32. package/spec/{principles/P18- → /347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/18-}/344/270/273/345/276/252/347/216/257/345/222/214/346/226/207/344/273/266/351/203/275/344/270/215/350/203/275/351/225/277/350/203/226.md +37 -37
  33. package/spec/{principles/P20- → /347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/20-}/345/244/226/351/203/250/344/272/213/345/256/236/345/277/205/351/241/273/347/273/221/345/256/232/350/257/201/346/215/256.md +48 -48
  34. package/spec/{principles/P21- → /347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/21-}/346/262/241/351/252/214/350/277/207/345/260/261/344/270/215/350/203/275/346/224/266/345/217/243.md +46 -46
  35. package/spec/{principles/P22- → /347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/22-}/351/230/266/346/256/265/346/216/250/350/277/233/345/277/205/351/241/273/346/234/211/346/234/272/345/231/250/347/212/266/346/200/201.md +40 -40
  36. package/spec/{principles/P23- → /347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/23-}/346/226/207/346/234/254/351/223/276/350/267/257/345/277/205/351/241/273/347/250/263/345/256/232/345/217/257/350/257/273.md +38 -38
  37. package/spec/{principles/P24- → /347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/24-}/351/224/231/350/257/257/345/205/274/345/256/271/344/270/215/350/203/275/351/253/230/344/272/216/346/255/243/347/241/256/346/200/247.md +38 -37
  38. package/spec//347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/25-/346/226/260/351/241/271/347/233/256/344/270/215/344/270/272/346/227/247/346/256/213/344/275/231/344/277/235/346/264/273.md +66 -0
  39. package/spec//347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/README.md +37 -0
  40. package/spec//347/224/250/346/210/267/345/256/241/351/230/205//347/263/273/347/273/237/345/205/250/346/231/257.md +57 -0
  41. package/spec//347/224/250/346/210/267/345/256/241/351/230/205//351/241/271/347/233/256/350/214/203/345/233/264.md +59 -0
  42. package/spec/adr/ADR-0001-/345/215/225/346/250/241/345/274/217/345/205/250/346/235/203/351/231/220.md +0 -16
  43. package/spec/adr/ADR-0002-/345/215/225agent/350/265/267/346/255/245/345/271/266/351/242/204/347/225/231/345/244/232agent/350/276/271/347/225/214.md +0 -19
  44. package/spec/adr/ADR-0003-openai-compatible/344/274/230/345/205/210.md +0 -16
  45. package/spec/architecture//346/200/273/344/275/223/346/236/266/346/236/204.md +0 -115
  46. package/spec/architecture//347/212/266/346/200/201/344/270/216/347/234/237/347/233/270/346/272/220.md +0 -120
  47. package/spec/architecture//350/277/220/350/241/214/346/227/266/345/276/252/347/216/257.md +0 -139
  48. package/spec/implementation/README.md +0 -17
  49. package/spec/implementation//346/250/241/345/235/227/347/272/247/345/274/200/345/217/221/344/273/273/345/212/241/345/215/225.md +0 -55
  50. package/spec/implementation//347/233/256/345/275/225/347/273/223/346/236/204/345/210/260/344/273/243/347/240/201/346/226/207/344/273/266/346/230/240/345/260/204/350/241/250.md +0 -176
  51. package/spec/interfaces/InteractionShell.md +0 -93
  52. package/spec/interfaces/ProviderAdapter.md +0 -23
  53. package/spec/interfaces/README.md +0 -17
  54. package/spec/interfaces/RuntimeLoop.md +0 -28
  55. package/spec/interfaces/SessionStore.md +0 -22
  56. package/spec/interfaces/ToolRegistry.md +0 -21
  57. package/spec/modules/config-system.md +0 -77
  58. package/spec/modules/interactive-terminal.md +0 -139
  59. package/spec/modules/lightweight-context-runtime.md +0 -80
  60. package/spec/modules/provider-adapter.md +0 -45
  61. package/spec/modules/runtime-metrics.md +0 -162
  62. package/spec/modules/runtime-rules.md +0 -65
  63. package/spec/modules/session-resume-compact.md +0 -55
  64. package/spec/modules/task-state.md +0 -41
  65. package/spec/modules/telegram-private-chat.md +0 -291
  66. package/spec/modules/tool-registry.md +0 -137
  67. package/spec/modules/weixin-private-chat.md +0 -291
  68. package/spec/modules/workspace-isolation.md +0 -24
  69. package/spec/modules//346/211/251/345/261/225/346/234/272/345/210/266.md +0 -141
  70. package/spec/overview/v0/350/214/203/345/233/264.md +0 -55
  71. package/spec/overview//344/272/247/345/223/201/345/256/232/344/271/211.md +0 -61
  72. package/spec/principles/P17-/346/211/251/345/261/225/351/235/240/344/272/213/344/273/266/347/224/237/351/225/277.md +0 -32
  73. package/spec/principles/README.md +0 -47
  74. package/spec/repo//345/274/200/345/217/221/350/247/204/345/210/231.md +0 -39
  75. package/spec/repo//346/234/254/345/234/260/345/221/275/344/273/244/344/270/216/346/265/201/347/250/213.md +0 -32
  76. package/spec/testing/fail-first-/347/254/254/344/270/200/346/211/271/346/265/213/350/257/225/345/210/227/350/241/250.md +0 -11
  77. package/spec/testing/fixtures-/350/247/204/350/214/203.md +0 -20
  78. package/spec/testing//346/265/213/350/257/225/347/255/226/347/225/245.md +0 -108
  79. /package/spec/{principles/P01- → /347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/01-}/344/270/200/344/270/252/345/276/252/347/216/257/344/270/200/344/270/252/346/231/272/350/203/275/344/275/223.md" +0 -0
  80. /package/spec/{principles/P02- → /347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/02-}/345/212/240/344/270/200/344/270/252/345/267/245/345/205/267/345/217/252/345/212/240/344/270/200/344/270/252/345/244/204/347/220/206/345/231/250.md" +0 -0
  81. /package/spec/{principles/P03- → /347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/03-}/345/205/210/350/256/241/345/210/222/345/206/215/345/212/250/346/211/213.md" +0 -0
  82. /package/spec/{principles/P04- → /347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/04-}/345/244/247/344/273/273/345/212/241/346/213/206/347/273/231/345/255/220/346/231/272/350/203/275/344/275/223.md" +0 -0
  83. /package/spec/{principles/P05- → /347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/05-}/347/237/245/350/257/206/346/214/211/351/234/200/345/212/240/350/275/275.md" +0 -0
  84. /package/spec/{principles/P07- → /347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/07-}/344/273/273/345/212/241/345/233/276/350/246/201/350/220/275/347/233/230.md" +0 -0
  85. /package/spec/{principles/P09- → /347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/09-}/344/273/273/345/212/241/345/244/252/345/244/247/345/260/261/345/210/206/347/273/231/351/230/237/345/217/213.md" +0 -0
  86. /package/spec/{principles/P10- → /347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/10-}/351/230/237/345/217/213/344/271/213/351/227/264/350/246/201/346/234/211/347/273/237/344/270/200/345/215/217/350/256/256.md" +0 -0
  87. /package/spec/{principles/P11- → /347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/11-}/351/230/237/345/217/213/350/207/252/345/267/261/350/256/244/351/242/206/344/273/273/345/212/241.md" +0 -0
  88. /package/spec/{principles/P12- → /347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/12-}/345/267/245/344/275/234/345/214/272/345/222/214/344/273/273/345/212/241/350/246/201/351/232/224/347/246/273.md" +0 -0
  89. /package/spec/{principles/P14- → /347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/14-}/346/211/247/350/241/214/347/272/246/346/235/237/344/270/215/346/230/257/345/256/211/345/205/250/347/255/226/347/225/245.md" +0 -0
  90. /package/spec/{principles/P16- → /347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/16-}/351/205/215/347/275/256/345/217/252/350/203/275/346/234/211/344/270/200/344/270/252/345/205/245/345/217/243.md" +0 -0
  91. /package/spec/{principles/P19- → /347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/19-}/345/205/210/345/206/231/345/244/261/350/264/245/346/265/213/350/257/225/345/206/215/345/206/231/345/256/236/347/216/260.md" +0 -0
@@ -1,45 +0,0 @@
1
- # provider adapter
2
-
3
- ## 作用
4
-
5
- provider adapter 负责把 Athlete 的请求发送到具体模型服务,并把 provider-specific 能力差异收敛成稳定的 capability profile。
6
-
7
- ## 当前策略
8
-
9
- - 优先 OpenAI-compatible
10
- - provider-specific fallback、reasoning 能力、request body 差异、recovery model 选择都下沉到 provider 层
11
- - 运行时对网络错误、超时、上下文过长仍有恢复策略,但主循环只消费 provider capability,不再写死某家模型名
12
-
13
- ## 规则
14
-
15
- 1. provider 能换,主循环不跟着重写。
16
- 2. provider 问题先在 adapter 层处理,不外溢到任务语义层。
17
- 3. 模型 fallback 属于运行时策略,不属于业务模块。
18
- 4. kernel 可以知道“当前 request model 是什么”,但不应该知道“某个具体 provider 为什么要这样切”。
19
- 5. reasoning request body、tool 兼容 fallback、failure streak recovery model 都属于 provider capability。
20
-
21
- ## 当前实现落点
22
-
23
- - `src/agent/provider.ts`
24
- - `resolveProviderCapabilities()`
25
- - `buildProviderRequestBody()`
26
- - `selectProviderRequestModel()`
27
- - `src/agent/api.ts`
28
- - 只消费 provider capability,不再直接判断 `deepseek-reasoner -> deepseek-chat`
29
- - `src/agent/retryPolicy.ts`
30
- - 通过 provider 层选择 recovery request model
31
- - `src/agent/session/messages.ts`
32
- - reasoning content 是否参与请求,也通过 provider capability 决定
33
- - `src/config/store.ts`
34
- - 统一解析 `provider / baseUrl / model`
35
-
36
- ## 当前状态说明
37
-
38
- - 代码默认配置与模板示例仍以 DeepSeek 系列为起点
39
- - 项目本地 `.athlete/.env` 可以把有效 provider / base URL / model 覆盖到其他 OpenAI-compatible 服务
40
- - 但 DeepSeek-specific 行为已经不在 kernel 主干里硬编码
41
- - adapter 层允许出现具体 provider 名词;主循环和业务规则层不允许依赖这些名字
42
-
43
- ## 下一阶段要求
44
-
45
- 总指挥层、closeout、workflow guard、acceptance gate 都不依赖某一家 provider 特性。
@@ -1,162 +0,0 @@
1
- # runtime metrics
2
-
3
- ## 作用
4
-
5
- 这一层开始,Athlete 的 session 会持久化结构化 `runtimeStats`,
6
- 作为正式运行态仪表盘的真相源。
7
-
8
- prompt layer metrics / context diagnostics 不属于这里的持久化真相源;它们只是在 request 构建阶段即时派生,用于诊断 prompt 体积、分层占比、hotspot 与压缩触发原因。
9
-
10
- 它回答的是:
11
-
12
- - 这次 session 一共发了多少次 provider request
13
- - 模型等待总耗时是多少
14
- - tool 一共调用了多少次、各自累计耗时多少
15
- - yield / continuation / recovery / compression 各发生了多少次
16
- - 有多少 tool result 被 externalize,以及累计字节数是多少
17
- - provider usage 是 available、partial 还是 unavailable
18
-
19
- ## 真相源位置
20
-
21
- - `SessionRecord.runtimeStats`
22
- - 仍然持久化在既有 session JSON 文件里
23
- - 不新建平行 JSON 真相源
24
-
25
- ## 当前结构
26
-
27
- `runtimeStats` 当前包含:
28
-
29
- - `version`
30
- - `model.requestCount`
31
- - `model.waitDurationMsTotal`
32
- - `model.usage.requestsWithUsage`
33
- - `model.usage.requestsWithoutUsage`
34
- - `model.usage.inputTokensTotal`
35
- - `model.usage.outputTokensTotal`
36
- - `model.usage.totalTokensTotal`
37
- - `model.usage.reasoningTokensTotal`
38
- - `tools.callCount`
39
- - `tools.durationMsTotal`
40
- - `tools.byName`
41
- - `events.continuationCount`
42
- - `events.yieldCount`
43
- - `events.recoveryCount`
44
- - `events.compressionCount`
45
- - `externalizedToolResults.count`
46
- - `externalizedToolResults.byteLengthTotal`
47
- - `updatedAt`
48
-
49
- ## 来源
50
-
51
- ### model request
52
-
53
- - 来源:`src/agent/api.ts`
54
- - 统计粒度:真实 provider request attempt
55
- - 包括 streaming、non-streaming fallback、retry、retry fallback
56
-
57
- ### tool execution
58
-
59
- - 来源:`src/agent/runTurn.ts`
60
- - 统计粒度:真实 runtime tool execution
61
- - `tools.byName` 记录每个 tool 的调用次数、累计耗时、成功次数、失败次数
62
-
63
- ### yield / continuation / recovery
64
-
65
- - 来源:`src/agent/turn/persistence.ts`
66
- - continuation 包括:
67
- - managed continuation 的内部续跑输入
68
- - 用户显式 `continue` / `resume` 这类恢复输入
69
-
70
- ### compression
71
-
72
- - 来源:`src/agent/runTurn.ts`
73
- - 当 `buildRequestContext(...)` 返回 `compressed = true` 时记一次
74
-
75
- ### externalized tool results
76
-
77
- - 来源:`src/agent/runTurn.ts` + `src/agent/toolResults/storage.ts`
78
- - 只在 tool result 实际被 externalize 时累计
79
-
80
- ## 用户入口
81
-
82
- 当前最小仪表盘入口:
83
-
84
- - `/runtime`
85
- - `/stats`
86
- - `/仪表盘`
87
-
88
- 这些命令读取既有 session 真相源,并在命令执行当下即时派生 prompt diagnostics。
89
- 它们可以解释 runtime,但不会把这些诊断结果反写成新的 session 真相。
90
-
91
- ## 当前 summary 最少包含
92
-
93
- - model request 次数
94
- - model wait 总耗时
95
- - tool call 次数
96
- - tool 总耗时
97
- - yields / continuations / recoveries / compressions
98
- - externalized result count / bytes
99
- - top tools
100
- - slowest step
101
- - usage availability
102
- - session health
103
- - durable truth 区块:
104
- - `runtimeStats.updatedAt`
105
- - `checkpoint.flow.phase`
106
- - `checkpoint.flow.lastTransition`
107
- - `verificationState.status`
108
- - derived diagnostics 区块:
109
- - why continue / why recovery / why compression
110
- - why slow
111
- - flaky tool hotspot
112
- - prompt layer / hotspot / slimming 诊断
113
-
114
- ## durable truth vs derived diagnostics
115
-
116
- ### durable truth
117
-
118
- - `SessionRecord.runtimeStats`
119
- - `SessionRecord.checkpoint`
120
- - `SessionRecord.verificationState`
121
-
122
- ### derived diagnostics
123
-
124
- - runtime summary 文本
125
- - why slow / why continue / why recovery / why compression 的诊断结论
126
- - prompt layer chars / block counts / hotspots
127
- - request-time context diagnostics(如 initial / final estimated chars)
128
-
129
- derived diagnostics 必须来自既有真相源和当前 request 构建结果,
130
- 不能反过来变成新的持久化 truth。
131
-
132
- ## usage 规则
133
-
134
- - 只有 provider 明确返回 usage 时才记录 usage
135
- - 如果 provider 没返回 usage,summary 必须显示 `unavailable` 或 `partial`
136
- - 不根据字符数、消息数、模型名去估算 token
137
-
138
- ## 健康状态
139
-
140
- 当前 summary 会给出:
141
-
142
- - `healthy`
143
- - `warning`
144
- - `recovering`
145
-
146
- 它来自 checkpoint phase、verification state、recovery 事件等正式状态的推导视图,
147
- 不是另一份单独持久化的状态。
148
-
149
- ## 真实验证
150
-
151
- 当前真实 API 验证入口:
152
-
153
- - `npm run verify:runtime-observability-api`
154
-
155
- 它至少要确认:
156
-
157
- - `runtimeStats` 已写进 session
158
- - reload session 后 `runtimeStats` 仍然存在
159
- - 真实 model request 被统计
160
- - 真实 tool call 被统计
161
- - 用户可读的 runtime summary 路径可用
162
- - lightweight context 与 checkpoint runtime 没被打坏
@@ -1,65 +0,0 @@
1
- # runtime rules
2
-
3
- ## 作用
4
-
5
- 运行时规则是 Athlete 的机器约束层。
6
-
7
- ## 当前包含
8
-
9
- - 计划先行
10
- - inbox 注入
11
- - verification 状态机
12
- - finalize / closeout gating
13
- - continuation / compression
14
- - tool error recovery
15
- - runtime transition 模型
16
-
17
- ## 不该放进来的东西
18
-
19
- - 具体任务拆分算法
20
- - 具体 skill 内容
21
- - 某个单一工具的内部实现
22
-
23
- ## 当前与收口直接相关的规则
24
-
25
- - 变更型动作默认要求先 `todo_write`
26
- - 文件改动和 mutating shell 会把 session 推进到 verification required
27
- - 轻量交付物允许用定向 `read_file` / auto-readback 完成轻量验证
28
- - acceptance / verification 统一消费机器 signal,而不是分散反推某个工具名
29
- - continuation 后仍然读取持久化的 `pendingPaths`,不会因为 slice 切换就忘记“还有哪些输出待验”
30
- - 当收口条件已满足时,task board closeout 工具会被隐藏,避免 `task_list` / `task_get` / `task_update` 无意义循环
31
- - 当 todo 已全部完成时,runtime 不再继续鼓励补写 `todo_write`
32
- - continue / recover / yield / pause / finalize 必须带结构化 reason code,而不是只靠零散字符串
33
- - 最近一次关键 runtime 决策持久化到既有 checkpoint 真相源,不新增平行 JSON
34
- - one-shot CLI 收尾输出必须带稳定 machine closeout contract,而不是只打印 session id
35
- - 交互式 `quit` 如果发现运行中的后台进程,必须先进入 kill-or-continue 二次确认
36
-
37
- ## 当前 signal 规则
38
-
39
- acceptance / verification 当前统一识别的结果类型至少包括:
40
-
41
- - `http_endpoint_verified`
42
- - `web_page_verified`
43
- - `document_read_completed`
44
- - `structured_artifact_valid`
45
-
46
- 换 browser 实现、换 document 引擎、换 provider 时,不应重写 acceptance gate 主体,只能换 adapter 或 signal 生产方式。
47
-
48
- ## 当前代码落点
49
-
50
- - `src/agent/acceptance/signals.ts`
51
- - acceptance signal 归一化
52
- - `src/agent/acceptance/evaluate.ts`
53
- - 只消费 signal、file checks、command checks
54
- - `src/agent/verification/state.ts`
55
- - verification 真相源
56
- - `src/agent/verification/signals.ts`
57
- - lightweight verification / auto-readback
58
- - `src/cli/support.ts`
59
- - one-shot closeout report
60
- - `src/cli.ts`
61
- - CLI 终态输出
62
-
63
- ## 下一阶段要求
64
-
65
- 总指挥层可以提出“下一步做什么”,但运行时规则仍决定“现在允不允许这样做”。
@@ -1,55 +0,0 @@
1
- # session / resume / compact
2
-
3
- ## 作用
4
-
5
- 这一层负责保护 Athlete 的“长任务可继续”能力。
6
-
7
- ## 当前能力
8
-
9
- - session 持久化
10
- - resume 继续最近任务现场
11
- - request context 压缩
12
- - continuation 自动续跑
13
- - todo / taskState / verificationState 跨 slice 持续生效
14
-
15
- ## 当前边界
16
-
17
- Athlete 当前的记忆重点是:
18
-
19
- - 当前项目
20
- - 当前任务
21
- - 当前 turn 相关状态
22
- - 当前待验证输出 `pendingPaths`
23
- - 最近一次 verification 结果
24
-
25
- 它不是跨项目的人格记忆。
26
-
27
- ## 当前实现约束
28
-
29
- - continuation 会复用已有 session,而不是重新发明 todo / verification 状态。
30
- - compact 只压缩请求上下文,不抹掉任务板、todo、verification 这些真相源。
31
- - 收口判断可以依赖持久化的 `verificationState.pendingPaths`,不能只看当前 slice 的临时 `changedPaths`。
32
- - `checkpoint.flow.lastTransition` 会随 session 持久化,保留最近一次关键 runtime 决策的结构化原因。
33
-
34
- ## Resume / Reset Contract
35
-
36
- - `resume` 的语义是继续现有任务现场。
37
- - `quit` 会先检查当前项目仍在运行的后台进程。
38
- - 如果没有运行中的后台进程,`quit` 只是退出当前聊天窗口,不主动清空项目运行时状态。
39
- - 如果有运行中的后台进程,`quit` 必须先进入二次确认:
40
- - 确认退出:kill 全部后台进程,再退出
41
- - 取消退出:继续留在当前会话
42
- - 显式 `reset` 会清空当前项目 `.athlete/` 下的运行时状态,并删除当前项目相关的持久化 session。
43
- - 一旦 `reset` 成功,`resume` 不应恢复已经 reset 掉的运行时。
44
- - 如果 objective 明确变化,checkpoint 进度必须重置,避免旧任务进度污染新任务。
45
- - externalized tool-result references 和 verification pending paths 仍然是优先的可恢复锚点,但 reset 会主动销毁这一层锚点。
46
- - runtime transition reason code 也属于 checkpoint 真相源的一部分,resume / continuation 读取它,而不是再造平行恢复提示。
47
-
48
- ## 下一阶段要求
49
-
50
- 未来可以增加更强的恢复能力,但必须遵守:
51
-
52
- 1. 项目事实优先于抽象记忆。
53
- 2. 记忆是辅助,不是第二真相源。
54
- 3. 不能破坏现有 continuation / compact / resume 的稳定边界。
55
- 4. destructive reset 必须保持显式、可理解、不可与普通 quit 混淆。
@@ -1,41 +0,0 @@
1
- # task state
2
-
3
- ## 作用
4
-
5
- 任务状态是 Athlete 控制面的核心。
6
-
7
- ## 当前字段重点
8
-
9
- - `status`
10
- - `blockedBy`
11
- - `blocks`
12
- - `assignee`
13
- - `owner`
14
- - `checklist`
15
- - `worktree`
16
-
17
- ## 当前规则
18
-
19
- 1. `assignee` 表示应该谁做。
20
- 2. `owner` 表示现在谁正在做。
21
- 3. 被阻塞任务不能启动。
22
- 4. 已完成任务不能随意重开。
23
- 5. `status / blockedBy / assignee / owner / worktree` 不是孤立看的,lead orchestrator 会联合 `TeamStore`、`BackgroundJobStore`、`WorktreeStore` 派生任务 lifecycle。
24
- 6. 同一个任务的 machine lifecycle 至少要能区分:
25
- - `blocked`
26
- - `ready`
27
- - `active`
28
- - `completed`
29
- 7. `ready` 还要继续区分是谁能接:
30
- - lead
31
- - 指定 teammate
32
- - nobody(缺失或冲突时 fail-closed)
33
- 8. 如果 task 仍绑定失效 worktree、指向缺失 background job、或保留了不存在 teammate 的 handoff,系统必须阻断继续派工。
34
-
35
- ## 下一阶段演进方向
36
-
37
- 任务系统后续如要继续长:
38
-
39
- - 优先先扩现有 task truth
40
- - 不新造平行 orchestration plane
41
- - 继续让 lifecycle / ownership / handoff 由机器从既有真相源派生
@@ -1,291 +0,0 @@
1
- # Telegram 私聊接入
2
-
3
- ## 范围
4
-
5
- - 只支持 Telegram 私聊
6
- - 不支持群聊、超级群、频道
7
- - 不做 Webhook 平台化,不做按钮系统,不做多平台网关
8
- - 只做 Telegram 通道层能力增强,不重写 Athlete 核心 runtime
9
-
10
- ## 宪法对齐
11
-
12
- 这块实现必须遵守 `spec/principles/` 里的几条核心原则:
13
-
14
- - `P01 一个循环一个智能体`
15
- Telegram 只是把私聊消息接到现有 lead turn,不重写 agent loop
16
- - `P02 加一个工具只加一个处理器`
17
- Telegram 文件回传能力通过独立工具处理器接入,不把平台分支塞进核心循环
18
- - `P16 配置只能有一个入口`
19
- Telegram 配置统一走 `src/config/store.ts` 和 `.athlete/.env`
20
- - `P17 扩展靠事件生长`
21
- Telegram 通道通过边界模块、turn display、tool registry、store 扩展,不靠在主循环里硬塞平台细节
22
- - `P18 主循环和文件都不能长胖`
23
- Telegram 服务编排、turn 执行、附件处理、日志和命令语义要按职责拆模块,避免一个大文件继续膨胀
24
-
25
- ## 模块边界
26
-
27
- Telegram 相关实现集中在 `src/telegram/`:
28
-
29
- - `types.ts`
30
- Telegram update/message 的规范化类型
31
- - `config.ts`
32
- Telegram 配置默认值、归一化、运行时目录解析
33
- - `botApiClient.ts`
34
- Telegram Bot API HTTP 客户端
35
- - `polling.ts`
36
- long polling 和 offset 提交
37
- - `offsetStore.ts`
38
- update offset 持久化
39
- - `sessionMapStore.ts`
40
- Telegram peer 到 Athlete session 的绑定
41
- - `attachmentStore.ts`
42
- Telegram 入站附件元数据持久化
43
- - `deliveryQueue.ts`
44
- 文本/文件投递队列、重试、恢复
45
- - `messageChunking.ts`
46
- 长文本分片
47
- - `localCommands.ts`
48
- Telegram 端命令语义适配
49
- - `turnDisplay.ts`
50
- Telegram 过程输出适配
51
- - `turnRunner.ts`
52
- 单个 Telegram turn 的运行编排
53
- - `service.ts`
54
- Telegram 服务总控、拉取、分发、stop、恢复
55
- - `logger.ts`
56
- 终端高层日志
57
- - `sendFileTool.ts`
58
- Telegram 文件回传工具
59
- - `processLock.ts`
60
- Telegram 服务单实例锁
61
- - `proxy.ts`
62
- Telegram 代理环境接线
63
-
64
- CLI 只负责注册命令和注入依赖,仍然放在:
65
-
66
- - `src/telegram/cli.ts`
67
- - `src/cli.ts`
68
-
69
- ## 启动方式
70
-
71
- 命令:
72
-
73
- ```powershell
74
- athlete telegram serve
75
- ```
76
-
77
- 行为:
78
-
79
- 1. 读取统一配置入口 `src/config/store.ts`
80
- 2. 解析 Telegram runtime 配置
81
- 3. 获取 Telegram 单实例锁
82
- 4. 启动 long polling
83
- 5. 把私聊消息接入现有 Athlete session / turn 体系
84
- 6. 把文本和文件回复先落盘到 delivery queue,再尝试发送
85
-
86
- 默认交互模式不会被劫持;只有显式执行 `athlete telegram serve` 才会启动 Telegram 服务。
87
-
88
- ## 配置
89
-
90
- Telegram 配置统一并入 `AppConfig.telegram` / `RuntimeConfig.telegram`。
91
-
92
- 推荐通过 `.athlete/.env` 配置:
93
-
94
- ```text
95
- ATHLETE_TELEGRAM_TOKEN=replace-with-your-bot-token
96
- ATHLETE_TELEGRAM_ALLOWED_USER_IDS=123456789
97
- ATHLETE_TELEGRAM_API_BASE_URL=https://api.telegram.org
98
- ATHLETE_TELEGRAM_PROXY_URL=http://127.0.0.1:7897
99
- ATHLETE_TELEGRAM_POLLING_TIMEOUT_SECONDS=50
100
- ATHLETE_TELEGRAM_POLLING_LIMIT=100
101
- ATHLETE_TELEGRAM_POLLING_RETRY_BACKOFF_MS=1000
102
- ATHLETE_TELEGRAM_MESSAGE_CHUNK_CHARS=3500
103
- ATHLETE_TELEGRAM_TYPING_INTERVAL_MS=4000
104
- ATHLETE_TELEGRAM_DELIVERY_MAX_RETRIES=6
105
- ATHLETE_TELEGRAM_DELIVERY_BASE_DELAY_MS=1000
106
- ATHLETE_TELEGRAM_DELIVERY_MAX_DELAY_MS=30000
107
- ```
108
-
109
- 说明:
110
-
111
- - `ATHLETE_TELEGRAM_ALLOWED_USER_IDS` 必须显式配置;空白名单等于任何人都不能控制 bot
112
- - `ATHLETE_TELEGRAM_PROXY_URL` 是 Telegram 专用代理入口,例如 Clash Verge 的 `mixed-port`
113
- - Telegram 配置仍然只走同一套配置入口,不另起平行配置系统
114
-
115
- ## 什么是本地代理入口
116
-
117
- 当用户使用 Clash Verge、Clash Meta、mihomo 这类代理工具时,常见情况是:
118
-
119
- - Telegram 域名会被 fake-ip 机制映射成 `198.18.x.x`
120
- - 应用程序自己不能直接拿这个 fake-ip 去直连
121
- - 应用程序应该把请求交给本地代理软件去转发
122
-
123
- 这里的“本地代理入口”就是:
124
-
125
- - 代理软件跑在用户自己的电脑上
126
- - 它会打开一个本地地址
127
- - 例如 `http://127.0.0.1:7897`
128
-
129
- 对于 Telegram 服务来说,真正稳定要配置的是这个本地入口,而不是 Telegram 最后被解析成的 fake-ip。
130
-
131
- ## 单实例语义
132
-
133
- Telegram 服务必须是单实例:
134
-
135
- - 同一个项目状态目录下,只允许一个 `telegram serve`
136
- - 如果已经有一个存活实例,第二个实例直接拒绝启动
137
- - 如果只剩下陈旧 `service.pid`,新实例会识别为 stale lock 并自动覆盖
138
-
139
- 这样可以避免:
140
-
141
- - 同一条消息被两个实例重复消费
142
- - 同一条最终回复被重复发送
143
- - 用户关掉一个窗口后,误以为服务还神秘存活
144
-
145
- ## 会话与恢复
146
-
147
- Telegram 状态目录位于:
148
-
149
- ```text
150
- <project-state-root>/.athlete/telegram/
151
- ```
152
-
153
- 持久化内容包括:
154
-
155
- - `offset.json`
156
- 下一个待消费的 Telegram update offset
157
- - `session-map.json`
158
- `telegram:private:<chatId>` 到 Athlete session 的映射
159
- - `attachments.json`
160
- 入站文件元数据和本地落盘路径
161
- - `delivery.json`
162
- 待发送文本/文件、重试次数和下次重试时间
163
- - `service.pid`
164
- Telegram 单实例锁文件
165
-
166
- 恢复语义:
167
-
168
- 1. 重启后先读 `offset.json`,从上次提交之后继续拉取
169
- 2. `session-map.json` 恢复同一 Telegram 私聊到同一个 Athlete session
170
- 3. `delivery.json` 在启动和轮询前后都会扫描并补发
171
- 4. `attachments.json` 让“刚发的文件”这类语义可继续工作
172
- 5. `service.pid` 如果是失效旧 pid,会被新实例覆盖
173
-
174
- ## 文件能力
175
-
176
- ### 入站文件
177
-
178
- - 用户可以在 Telegram 私聊直接发文件
179
- - Bot API 会下载文件到项目状态目录下的 Telegram 文件目录
180
- - 附件元数据会持久化
181
- - 当前 turn 会拿到这份文件的本地路径和上下文说明
182
- - 用户可以继续说“分析我刚发的文件”
183
-
184
- ### 出站文件
185
-
186
- - 用户可以要求 Athlete 查找本地文件并发回 Telegram
187
- - 用户可以要求 Athlete 生成文件并发回 Telegram
188
- - 回复形式必须是真实 Telegram document
189
- - 不允许只发本地路径或文本链接糊弄
190
-
191
- ### 恢复与边界
192
-
193
- - 文本和文件都先进入 delivery queue,再尝试发送
194
- - 失败后按指数退避重试
195
- - 服务重启后继续恢复待发送文本和文件
196
- - 文件大小要做边界校验
197
-
198
- ## `/stop`
199
-
200
- Telegram 端只保留一个停止命令:
201
-
202
- ```text
203
- /stop
204
- ```
205
-
206
- 语义:
207
-
208
- - 只停止“当前这个 Telegram 用户当前正在执行的任务”
209
- - bot 服务继续在线
210
- - 不停止整个 Telegram 服务
211
- - 不影响其他白名单用户
212
- - 停止后当前用户还能继续发下一条任务
213
-
214
- ## Telegram 端命令语义
215
-
216
- Telegram 端命令语义与本地 CLI 有明确边界:
217
-
218
- - `/session`、`/config`、`/runtime` 等查看类命令继续复用现有本地命令层
219
- - `/multi` 明确拒绝,并提示直接发送完整消息
220
- - `quit` / `reset` 不再作为 Telegram 主命令暴露
221
- - Telegram 端收到 `quit` / `reset` 时,只做提示,不执行本地终端语义
222
-
223
- ## 过程输出
224
-
225
- Telegram 过程输出要更接近终端工作感知,但遵守“可见段按事件逐条镜像”的单一语义,不能刷底层噪音。
226
-
227
- ### Telegram 聊天框里的可见消息
228
-
229
- 过程消息按实际事件顺序发送,不做机械固定轮换,也不做最终汇总:
230
-
231
- - `onToolCall` 不直接发聊天消息,避免把工具名刷进聊天框
232
- - 非 `todo_write` 的 tool result 只发送一条可见 preview,并截断到 150 个字符
233
- - `todo_write` 对应的可见 preview 一次,就发一条 todo preview 消息
234
- - `onAssistantDelta` 只作为阶段内缓冲信号,不直接发聊天消息
235
- - `onAssistantText` 表示拿到了完整 assistant 文本时,发一条 assistant 消息
236
- - `onAssistantDone` 带文本且当前 assistant 阶段尚未发出时,发一条最终 assistant 消息
237
- - 不合并多段 assistant
238
- - 不把 tool / todo / assistant 混成一条
239
-
240
- 不发送的内容:
241
-
242
- - 工具输出正文
243
- - 大段文件原文
244
- - 底层噪音日志
245
- - reasoning
246
- - `onStatus` 一类非可见噪音
247
-
248
- 格式约束:
249
-
250
- - 不额外加抬头
251
- - 过程消息保持聊天式、顺序式输出,更接近终端高层过程感知
252
-
253
- ### 终端日志
254
-
255
- 终端持续输出高层过程日志,包括:
256
-
257
- - 收到哪个 Telegram 用户的消息
258
- - 当前进入哪个 session
259
- - 当前在哪个阶段
260
- - 当前调用了哪个工具
261
- - 当前是否停止、失败、成功
262
- - 当前是否发送了文本或文件
263
-
264
- 显式信号与可靠性约束:
265
-
266
- - Weixin / Telegram 共享同一层可见事件判定与 durable turn display
267
- - durable outbound 只按事件顺序发送,不按文本去重
268
- - 如果要防重复,只能基于 event id / delivery state,不能基于文本内容
269
- - `runOnce` 必须等当前 turn 的可见输出 durable 完成后再 commit 输入
270
- - `serve` 主循环通过显式 pending-commit 队列继续轮询和处理 `/stop`,不靠时序猜测
271
- - 可见消息 durable enqueue 失败不能 silent swallow,必须继续上抛
272
-
273
- ## 串行与隔离
274
-
275
- - 同一 Telegram peer 使用 `PerPeerCommandQueue` 串行执行
276
- - 不同 peer 之间允许并发
277
- - `/stop` 与 per-peer 串行队列兼容
278
- - 同一个 peer 的 turn 不能并发破坏同一个 session
279
-
280
- ## 安全与约束
281
-
282
- - 只接受 `allowedUserIds` 白名单内的私聊用户
283
- - 非白名单用户不会进入 Athlete turn
284
- - 群聊/频道消息不会进入私聊 session
285
- - Telegram 端仍然遵守 Athlete 当前 runtime 的 `mode`、`allowedRoots` 和执行约束
286
-
287
- ## 维护约束
288
-
289
- - Telegram 平台细节不能下沉到 `src/agent/`、`src/tools/`、`src/ui/`
290
- - 只允许薄接线进入核心 runtime
291
- - 新增能力优先继续生长在 `src/telegram/`