@jun133/athlete 0.0.5 → 0.0.7

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 +24415 -20574
  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,137 +0,0 @@
1
- # tool registry
2
-
3
- ## 作用
4
-
5
- Tool registry 负责向模型公开动作集合,并统一管理本地工具与 MCP 动态工具。
6
-
7
- ## 当前组成
8
-
9
- - 本地内建工具
10
- - mode 过滤后的工具集
11
- - MCP 动态收集到的工具
12
- - 统一治理后的 `entries / blocked` 结果
13
-
14
- ## 当前规则
15
-
16
- 1. 新工具先注册,再暴露给模型。
17
- 2. tool handler 只做动作,不做控制面真相发明。
18
- 3. skill 不是工具替代品;skill 提供 workflow,tool 提供动作。
19
- 4. MCP 工具也必须经过统一 registry,不走旁路。
20
- 5. 工具暴露顺序、workflow fallback、change / verification signal 约束都由机器治理 metadata 决定,而不是靠 prompt 复述。
21
- 6. metadata 缺失或不兼容时默认 fail-closed:
22
- - 内建 / 本地 includeTools 直接报错
23
- - MCP 工具进入 `blocked`,不暴露给模型
24
-
25
- ## 工具层职责
26
-
27
- `src/tools/` 当前负责:
28
-
29
- - 参数解析
30
- - 权限和状态校验
31
- - 调用下层 store / worker / utils
32
- - 把结果序列化返回给模型
33
-
34
- 不负责:
35
-
36
- - provider 请求
37
- - session 存储
38
- - 发明新的持久化真相
39
-
40
- ## 当前分组
41
-
42
- - `src/tools/files/`
43
- - `src/tools/documents/`
44
- - `src/tools/tasks/`
45
- - `src/tools/team/`
46
- - `src/tools/worktrees/`
47
- - `src/tools/background/`
48
- - `src/tools/shell/`
49
- - `src/tools/skills/`
50
-
51
- 共享层仍在 `src/tools/` 根目录:
52
-
53
- - `registry.ts`
54
- - `runtimeRegistry.ts`
55
- - `governance.ts`
56
- - `routing.ts`
57
- - `shared.ts`
58
- - `types.ts`
59
- - `changeTracking.ts`
60
-
61
- ## Playwright MCP 当前事实
62
-
63
- 当前 Playwright adapter 通过 runtime registry 暴露一组 `mcp_playwright_browser_*` 工具;这是 adapter surface,不是上层 machine rule。
64
-
65
- 当前 adapter 层常见名字包括:
66
-
67
- - `mcp_playwright_browser_navigate`
68
- - `mcp_playwright_browser_snapshot`
69
- - `mcp_playwright_browser_click`
70
- - `mcp_playwright_browser_type`
71
- - `mcp_playwright_browser_take_screenshot`
72
- - 以及其他 `mcp_playwright_browser_*`
73
-
74
- 当前优先级策略:
75
-
76
- - runtime registry 先用治理 metadata 做 fail-closed 过滤,再按机器排序暴露工具
77
- - 浏览器工具会通过治理 metadata 稳定排到本地文件工具和 shell 工具前面
78
- - request 级 tool priority 会消费同一套 metadata,在 web research / browser automation 场景继续把浏览器 capability 工具前置
79
- - `run_shell` 与本地文件 detour 在 browser workflow 下只作为 fallback
80
-
81
- ## 当前治理模型
82
-
83
- 当前 registry 暴露给机器的不只是 tool schema,还包括:
84
-
85
- - `entries`: 每个已暴露工具的统一 governance metadata
86
- - `blocked`: 因 metadata 缺失、MCP 缺少可信只读提示、或治理不兼容而被 fail-closed 的工具
87
-
88
- 当前 governance metadata 至少回答:
89
-
90
- - 是否只读 / 会不会修改状态
91
- - 是否高风险 / destructive
92
- - 是否要求 change signal / verification signal
93
- - 是否属于 browser capability
94
- - browser step 是 `navigate / snapshot / take_screenshot / click / type / other`
95
- - 是否属于 document-reading capability
96
- - document kind 是 `doc / image / pdf / ppt / spreadsheet`
97
- - 是否在特定 workflow 下只能 fallback
98
- - 是否并发安全
99
-
100
- ## 当前上层约束
101
-
102
- 上层 machine rule 当前必须遵守:
103
-
104
- 1. workflow guard 只认 browser capability / browser step,不认具体 Playwright 工具名。
105
- 2. tool priority 只认治理 metadata,不认具体 Playwright 工具名。
106
- 3. document routing hint 只认 `document.read` / `spreadsheet.read` capability,不把 `mineru_*` 名字继续上推。
107
- 4. acceptance / phase / verification 只认统一 signal,不认 adapter 工具名。
108
-
109
- ## 当前代码落点
110
-
111
- - `src/tools/governance.ts`
112
- - browser capability、browser step、document kind、fail-closed metadata
113
- - `src/tools/order.ts`
114
- - 暴露排序
115
- - `src/agent/toolPriority.ts`
116
- - request 级 tool priority,消费统一 metadata
117
- - `src/skills/workflowGuards.ts`
118
- - 只输出 `suggestedCapability`
119
- - `src/tools/routing.ts`
120
- - `document.read` / `spreadsheet.read` capability hint
121
- - `src/mcp/toolAdapter.ts`
122
- - adapter 层把 MCP 工具接入 registry,保留 origin 信息
123
-
124
- ## 对齐说明
125
-
126
- - adapter 层仍可以保留 `mcp_playwright_browser_*`、`mineru_*` 这类生态名词
127
- - 但 registry 暴露给上层的真相必须是 capability metadata,而不是生态字符串
128
-
129
- ## 当前约束
130
-
131
- 如果某个动作:
132
-
133
- - 需要明确输入输出
134
- - 不适合塞进 prompt
135
- - 不该让模型自己拼 shell
136
-
137
- 就应该做成工具,而不是继续加提示词。
@@ -1,291 +0,0 @@
1
- # Weixin 私聊接入
2
-
3
- ## 范围
4
-
5
- - 只支持 Weixin 私聊
6
- - 不支持群聊、频道式广播、多平台网关
7
- - 不做 `weixin-acp` / `codex-acp` / 外部子进程 agent 桥接
8
- - 只做 Weixin 通道层能力扩展,不重写 Athlete 核心 runtime
9
-
10
- ## 宪法对齐
11
-
12
- 这块实现必须遵守 `spec/principles/` 里的核心原则:
13
-
14
- - `P01 一个循环一个智能体`
15
- Weixin 只是把私聊消息接到现有 lead turn,不重写 agent loop
16
- - `P16 配置只能有一个入口`
17
- Weixin 配置统一走 `src/config/store.ts` 和 `.athlete/.env`
18
- - `P17 扩展靠事件生长`
19
- Weixin 通道通过边界模块、turn display、store、delivery queue 生长,不把平台细节塞进核心 runtime
20
- - `P18 主循环和文件都不能长胖`
21
- Weixin 服务编排、turn 执行、附件处理、日志、命令语义、CLI 按职责拆模块
22
- - `P19 先写失败测试再写实现`
23
- Weixin 配置、store、delivery、service、CLI、文档入口都有 fail-first 测试保护
24
-
25
- ## 模块边界
26
-
27
- Weixin 相关实现集中在 `src/weixin/`:
28
-
29
- - `types.ts`
30
- OpeniLink message shape 的 Athlete 规范化类型
31
- - `config.ts`
32
- Weixin 配置默认值、归一化、运行时状态目录解析
33
- - `client.ts`
34
- OpeniLink SDK 的 Athlete-native 包装层
35
- - `polling.ts`
36
- long polling 和 `sync_buf` 提交
37
- - `syncBufStore.ts`
38
- Weixin 拉取游标持久化
39
- - `credentialsStore.ts`
40
- 登录态持久化
41
- - `sessionMapStore.ts`
42
- Weixin peer 到 Athlete session 的绑定
43
- - `attachmentStore.ts`
44
- 入站附件元数据持久化
45
- - `contextTokenStore.ts`
46
- 每个 peer 最新 `context_token` 的持久化、刷新、失效标记
47
- - `deliveryQueue.ts`
48
- 文本 / 图片 / 视频 / 文件投递队列、重试、恢复、`context_token` fail-closed
49
- - `messageClassifier.ts`
50
- private-only 路由和消息类型判定
51
- - `inboundFiles.ts`
52
- 入站媒体下载、落盘、turn input 构造
53
- - `localCommands.ts`
54
- Weixin 端命令语义适配
55
- - `outputPort.ts`
56
- Weixin 文本输出适配
57
- - `turnDisplay.ts`
58
- Weixin 过程输出适配
59
- - `turnRunner.ts`
60
- 单个 Weixin turn 的运行编排
61
- - `service.ts`
62
- Weixin 服务总控、拉取、分发、stop、恢复
63
- - `logger.ts`
64
- 终端高层日志
65
- - `processLock.ts`
66
- Weixin 服务单实例锁
67
- - `cli.ts`
68
- `login / serve / logout` 正式命令入口
69
- - `sendFileTool.ts`
70
- Weixin 出站媒体工具桥
71
-
72
- CLI 注入仍然放在:
73
-
74
- - `src/weixin/cli.ts`
75
- - `src/cli.ts`
76
-
77
- ## 启动方式
78
-
79
- 命令:
80
-
81
- ```powershell
82
- athlete weixin login
83
- athlete weixin serve
84
- athlete weixin logout
85
- ```
86
-
87
- 行为:
88
-
89
- 1. `login` 通过 OpeniLink QR 登录并保存登录态
90
- 2. `serve` 读取统一配置入口和项目状态目录
91
- 3. 获取 Weixin 单实例锁
92
- 4. 启动 long polling
93
- 5. 把私聊消息接入现有 Athlete session / turn 体系
94
- 6. 把文本和媒体回复先落到 delivery queue,再尝试发送
95
- 7. `logout` 清理登录态、`sync_buf` 和 token 相关发送状态
96
-
97
- 默认交互模式不会被劫持;只有显式执行 `athlete weixin ...` 才会启动 Weixin 通道。
98
-
99
- ## 配置
100
-
101
- Weixin 配置统一并入 `AppConfig.weixin` / `RuntimeConfig.weixin`。
102
-
103
- 推荐通过 `.athlete/.env` 配置:
104
-
105
- ```text
106
- ATHLETE_WEIXIN_ALLOWED_USER_IDS=wxid_alice,wxid_bob
107
- ATHLETE_WEIXIN_BASE_URL=https://ilinkai.weixin.qq.com
108
- ATHLETE_WEIXIN_CDN_BASE_URL=https://novac2c.cdn.weixin.qq.com/c2c
109
- ATHLETE_WEIXIN_POLLING_TIMEOUT_MS=30000
110
- ATHLETE_WEIXIN_POLLING_RETRY_BACKOFF_MS=1000
111
- ATHLETE_WEIXIN_MESSAGE_CHUNK_CHARS=3500
112
- ATHLETE_WEIXIN_TYPING_INTERVAL_MS=4000
113
- ATHLETE_WEIXIN_QR_TIMEOUT_MS=480000
114
- ATHLETE_WEIXIN_DELIVERY_MAX_RETRIES=6
115
- ATHLETE_WEIXIN_DELIVERY_BASE_DELAY_MS=1000
116
- ATHLETE_WEIXIN_DELIVERY_MAX_DELAY_MS=30000
117
- ATHLETE_WEIXIN_ROUTE_TAG=
118
- ```
119
-
120
- 说明:
121
-
122
- - `ATHLETE_WEIXIN_ALLOWED_USER_IDS` 必须显式配置;空白名单等于任何人都不能控制
123
- - Weixin 配置仍然只走同一套配置入口,不另起平行配置系统
124
- - 登录态不放进配置文件,而是放在项目状态目录下的 `credentials.json`
125
-
126
- ## 单实例语义
127
-
128
- Weixin 服务必须是单实例:
129
-
130
- - 同一个项目状态目录下,只允许一个 `weixin serve`
131
- - 如果已经有一个存活实例,第二个实例直接拒绝启动
132
- - 如果只剩下陈旧 `service.pid`,新实例会识别为 stale lock 并自动覆盖
133
-
134
- 这样可以避免:
135
-
136
- - 同一条消息被两个实例重复消费
137
- - 同一条回复被重复发送
138
- - 用户误以为服务已经退出但实际上还有旧实例在线
139
-
140
- ## 状态与恢复
141
-
142
- Weixin 状态目录位于:
143
-
144
- ```text
145
- <project-state-root>/.athlete/weixin/
146
- ```
147
-
148
- 持久化内容包括:
149
-
150
- - `credentials.json`
151
- 扫码登录态
152
- - `sync-buf.json`
153
- 下一个拉取游标
154
- - `session-map.json`
155
- `weixin:private:<userId>` 到 Athlete session 的映射
156
- - `attachments.json`
157
- 入站图片 / 视频 / 文件 / 语音元数据和本地落盘路径
158
- - `context-token.json`
159
- 每个 peer 最新可用的 `context_token`
160
- - `delivery.json`
161
- 待发送文本 / 图片 / 视频 / 文件、重试次数、阻塞原因
162
- - `service.pid`
163
- Weixin 单实例锁
164
-
165
- 恢复语义:
166
-
167
- 1. 重启后先恢复 `sync_buf`
168
- 2. `session-map.json` 恢复同一 Weixin 私聊到同一个 Athlete session
169
- 3. `delivery.json` 在启动和轮询前后都会扫描并补发
170
- 4. `attachments.json` 让“刚发的文件 / 图片 / 语音”这类语义可继续工作
171
- 5. `context-token.json` 决定哪些待发送项现在可投递,哪些必须继续保留
172
-
173
- ## `context_token` 限制
174
-
175
- `context_token` 是 Weixin 通道的硬边界。
176
-
177
- Athlete 当前正式语义:
178
-
179
- - 每次入站消息都会捕获并更新当前 peer 可用的 `context_token`
180
- - 所有出站文本 / 图片 / 视频 / 文件都必须使用当前 token
181
- - delivery queue 会显式区分:
182
- - `missing_context_token`
183
- - `context_token_invalid`
184
- - 如果服务重启后队列里还有待发送项,但 token 缺失或失效:
185
- - 不丢消息
186
- - 不误报成功
187
- - 不 silent failure
188
- - 待发送项会保留
189
- - 只有等这个 peer 下次再发新消息、token 刷新后,队列才会再次尝试投递
190
-
191
- 这是 Weixin 和 Telegram 最关键的运行差异之一,README 和测试都必须同时体现。
192
-
193
- ## 文件能力
194
-
195
- ### 入站媒体
196
-
197
- - 支持图片、视频、文件、语音入站
198
- - OpeniLink 下载后的本地文件会进入当前 turn input 和附件上下文
199
- - 语音通过 OpeniLink 提供的下载 / 解码入口落成本地 WAV
200
- - 附件元数据会写入 `attachments.json`
201
-
202
- ### 出站媒体
203
-
204
- - 支持文本、图片、视频、文件出站
205
- - 工具桥会根据文件类型做真实路由
206
- - 不支持“只回复一个本地路径”这种伪文件发送
207
- - 不支持语音回发;该能力因为上游没有稳定发送接口而 fail-closed 拒绝
208
-
209
- ## `/stop`
210
-
211
- Weixin 端只保留一个停止命令:
212
-
213
- ```text
214
- /stop
215
- ```
216
-
217
- 语义:
218
-
219
- - 只停止“当前这个 Weixin 用户当前正在执行的任务”
220
- - 服务继续在线
221
- - 不影响其他白名单用户
222
- - 当前任务停止后,这个用户还能继续发下一条任务
223
-
224
- ## 命令语义
225
-
226
- Weixin 端命令语义与本地 CLI 有明确边界:
227
-
228
- - `/session`、`/config`、`/runtime` 等查看类命令继续复用现有本地命令层
229
- - `/multi` 明确拒绝,并提示直接发送完整消息
230
- - `quit` / `reset` / `/reset` 只做提示,不执行本地终端语义
231
-
232
- ## 过程输出
233
-
234
- Weixin 过程输出保持聊天式,但优先保证“最终结果稳定可见”,不刷底层噪音。
235
-
236
- 聊天框里的可见消息:
237
-
238
- - `todo_write` 对应的可见 preview 一次,就发一条 todo preview 消息
239
- - `onAssistantDelta` 只作为阶段内缓冲信号,不直接发聊天消息
240
- - `onAssistantText` 表示拿到了完整 assistant 文本时,发一条 assistant 消息
241
- - `onAssistantDone` 带文本且当前 assistant 阶段尚未发出时,发一条最终 assistant 消息
242
- - 不合并多段 assistant
243
- - Weixin 不再发送 tool call 聊天消息,避免挤占最终回复的可见额度
244
- - 短回复走普通文本;长回复超过阈值时直接写成 `.txt` 文件并作为文件发送
245
- - 不把 todo / assistant 混成一条
246
-
247
- 不发送:
248
-
249
- - tool call
250
- - 工具输出正文
251
- - 大段文件原文
252
- - 底层噪音日志
253
- - reasoning
254
- - `onStatus` 一类非可见噪音
255
-
256
- 终端日志持续输出高层事件:
257
-
258
- - 收到哪个 Weixin 用户的消息
259
- - 当前进入哪个 session
260
- - 当前阶段、工具、成功 / 失败 / 停止
261
- - 当前是否发送了文本或媒体
262
-
263
- 显式信号与可靠性约束:
264
-
265
- - Weixin / Telegram 共享同一层可见事件判定与 durable turn display
266
- - durable outbound 只按事件顺序发送,不按文本去重
267
- - 如果要防重复,只能基于 event id / delivery state,不能基于文本内容
268
- - `runOnce` 必须等当前 turn 的可见输出 durable 完成后再 commit 输入
269
- - `serve` 主循环通过显式 pending-commit 队列继续轮询和处理 `/stop`,不靠时序猜测
270
- - 可见消息 durable enqueue 失败不能 silent swallow,必须继续上抛
271
-
272
- ## 串行与隔离
273
-
274
- - 同一 Weixin peer 使用 per-peer queue 串行执行
275
- - 不同 peer 之间允许并发
276
- - `/stop` 与 per-peer 串行队列兼容
277
- - 同一个 peer 的 turn 不能并发破坏同一个 session
278
-
279
- ## 安全与约束
280
-
281
- - 只接受 `allowedUserIds` 白名单内的私聊用户
282
- - 非白名单用户不会进入 Athlete turn
283
- - 群聊消息不会进入 session
284
- - Weixin 端仍然遵守 Athlete 当前 runtime 的 `mode`、`allowedRoots` 和执行约束
285
-
286
- ## 非目标 / fail-closed 边界
287
-
288
- - 不做 `weixin-acp` / `codex-acp` 子进程桥接
289
- - 不做群聊路由投机实现
290
- - 不伪造语音回发能力
291
- - 不在 `src/agent/`、`src/tools/`、`src/ui/` 里散落平台特有分支
@@ -1,24 +0,0 @@
1
- # workspace / isolation
2
-
3
- ## 作用
4
-
5
- 工作区隔离负责避免并行任务互相污染。
6
-
7
- ## 当前能力
8
-
9
- - allowed roots
10
- - task 与 worktree 绑定
11
- - worktree 创建、保留、删除
12
-
13
- ## 规则
14
-
15
- 1. 共享根目录适合读和轻量改动。
16
- 2. 并行改动优先进入独立 worktree。
17
- 3. task 是逻辑隔离,worktree 是目录隔离,两者不能混为一谈。
18
-
19
- ## 下一阶段要求
20
-
21
- 总指挥层需要会判断:
22
-
23
- - 什么时候共享目录就够了
24
- - 什么时候必须派到独立 worktree
@@ -1,141 +0,0 @@
1
- # 扩展机制
2
-
3
- ## 当前扩展口
4
-
5
- Athlete 当前有 3 个标准扩展口:
6
-
7
- 1. tools:负责动作
8
- 2. skills:负责按需 workflow 与知识
9
- 3. MCP:负责接外部能力源
10
-
11
- ## skill 当前状态
12
-
13
- skills 已经是标准化 V1,而不是散装 prompt 片段。
14
-
15
- 当前主要实现:
16
-
17
- - `src/skills/types.ts`
18
- - `src/skills/schema.ts`
19
- - `src/skills/discovery.ts`
20
- - `src/skills/matching.ts`
21
- - `src/skills/loading.ts`
22
- - `src/skills/state.ts`
23
- - `src/skills/workflowGuards.ts`
24
- - `src/skills/prompt.ts`
25
-
26
- ## 当前 workflow skill
27
-
28
- 当前仓库已落地的关键 workflow skill:
29
-
30
- - `test-guardrails`
31
- - `spec-alignment`
32
- - `mineru-pdf-reading`
33
- - `mineru-image-reading`
34
- - `mineru-doc-reading`
35
- - `mineru-ppt-reading`
36
- - `web-research`
37
- - `browser-automation`
38
-
39
- MinerU 文档 workflow 现在按类别拆成独立工具:
40
-
41
- - `mineru_pdf_read`
42
- - `mineru_image_read`
43
- - `mineru_doc_read`
44
- - `mineru_ppt_read`
45
-
46
- ## web-research / browser-automation 的边界
47
-
48
- 这两个 skill 现在已经是真实 workflow,而不是占位文档。
49
-
50
- 职责边界:
51
-
52
- - `web-research`
53
- - 何时先搜
54
- - 何时打开网页
55
- - 何时提取信息
56
- - 何时总结
57
- - 何时落文档
58
- - `browser-automation`
59
- - 何时导航
60
- - 何时 snapshot
61
- - 何时 click / type
62
- - 何时 screenshot
63
- - 何时做网页交互
64
-
65
- 不负责:
66
-
67
- - 实现浏览器 transport
68
- - 取代 MCP / tool
69
-
70
- ## 联网能力分层
71
-
72
- 当前分层是:
73
-
74
- 1. MCP / tools
75
- - 提供真实浏览器能力
76
- - 当前优先是官方 `@playwright/mcp`
77
- 2. workflow skill
78
- - 提供使用策略
79
- - 当前是 `web-research` 与 `browser-automation`
80
-
81
- 设计原则:
82
-
83
- - 联网能力先做成 `tool` 或 `MCP`
84
- - `skill` 只做 workflow
85
- - 不把底层联网继续堆进 `systemPrompt`
86
-
87
- ## 当前 capability 边界
88
-
89
- 当前扩展层已经明确区分:
90
-
91
- 1. adapter / tool surface
92
- - 可以保留 `@playwright/mcp`、`mineru_*` 这类生态名词
93
- 2. runtime governance / workflow / acceptance
94
- - 只认 capability / signal
95
- - 不认具体生态字符串
96
-
97
- 当前上层抽象:
98
-
99
- - browser capability
100
- - `browser.navigate`
101
- - `browser.snapshot`
102
- - `browser.take_screenshot`
103
- - `browser.click`
104
- - `browser.type`
105
- - document capability
106
- - `document.read`
107
- - `spreadsheet.read`
108
- - acceptance signals
109
- - `http_endpoint_verified`
110
- - `web_page_verified`
111
- - `document_read_completed`
112
- - `structured_artifact_valid`
113
-
114
- ## 当前接线点
115
-
116
- 当前 skill / MCP / runtime 的接线点:
117
-
118
- - `src/context/projectContext.ts`
119
- - `src/tools/skills/loadSkillTool.ts`
120
- - `src/agent/systemPrompt.ts`
121
- - `src/skills/prompt.ts`
122
- - `src/agent/runTurn.ts`
123
- - `src/tools/governance.ts`
124
- - `src/tools/runtimeRegistry.ts`
125
- - `src/tools/routing.ts`
126
- - `src/mcp/registryIntegration.ts`
127
- - `src/mcp/toolAdapter.ts`
128
- - `src/agent/acceptance/signals.ts`
129
-
130
- ## 当前约束
131
-
132
- 当前扩展仍必须满足:
133
-
134
- - 不破坏 continuation / compact / recovery
135
- - 不让主循环继续长胖
136
- - 不新造平行技能体系
137
- - 不让 MCP 绕开统一 registry
138
- - skill prompt 只输出本轮决策相关的 runtime hint(loaded / selected / missing required),不回退成 catalog dump
139
- - MCP 工具进入 runtime registry 前必须先经过治理 metadata 归一化;安全信息不够时默认 fail-closed
140
- - browser-first / document routing / workflow fallback 由机器治理逻辑优先决定,prompt 只保留原则级说明
141
- - adapter 名词允许存在于工具实现、技能名、README、配置与测试中,但不允许继续进入上层 machine rule
@@ -1,55 +0,0 @@
1
- # v0 范围
2
-
3
- ## 当前已在范围内
4
-
5
- ### 运行时
6
-
7
- - 单 turn 主循环
8
- - 自动 continuation
9
- - 上下文压缩
10
- - verification 状态机
11
-
12
- ### 工具与执行
13
-
14
- - 文件读写与补丁修改
15
- - shell 执行
16
- - docx / spreadsheet 基础能力
17
- - background job
18
-
19
- ### 控制面
20
-
21
- - 任务板持久化
22
- - machine-enforced orchestration lifecycle
23
- - teammate 名册与 inbox
24
- - 协议请求与审批状态
25
- - worktree 绑定与隔离
26
-
27
- ### 扩展
28
-
29
- - 项目指令发现
30
- - skill catalog 发现与按需加载
31
- - MCP 工具接入
32
-
33
- ## 当前不在范围内
34
-
35
- - 图形化编排平台
36
- - 跨项目长期人格记忆
37
- - 全自动自治 swarm
38
- - 复杂经济系统、积分系统、市场化调度
39
- - 大而全行业平台能力
40
-
41
- ## 下一阶段新增范围
42
-
43
- 1. 主 Agent 的总指挥层
44
- 2. 更清晰的任务拆分与派工规则
45
- 3. skills 的标准声明与加载协议
46
- 4. reviewer / verifier / planner 这类专门角色的演进边界
47
-
48
- ## 范围控制规则
49
-
50
- 如果一个新需求同时满足下面两条,应该延后:
51
-
52
- - 会削弱当前“耐跑底盘”
53
- - 不能明显增强“总指挥层”或 “skills 扩展口”
54
-
55
- 当前阶段优先做“更会组织”,不是“看起来更全能”。
@@ -1,61 +0,0 @@
1
- # 产品定义
2
-
3
- ## Athlete 是什么
4
-
5
- Athlete 是一个终端优先的 AI harness。
6
-
7
- 它不是“在命令行里聊天”,而是一套让模型持续做任务的运行系统:
8
-
9
- - 能调用工具
10
- - 能持久化任务状态
11
- - 能续跑长任务
12
- - 能把慢操作放后台
13
- - 能按需调用子智能体或队友
14
-
15
- ## 当前核心定位
16
-
17
- 当前 Athlete 的核心定位是:
18
-
19
- **一个耐跑、可续跑、面向复杂任务的终端智能体框架。**
20
-
21
- 它现在最强的价值不是“最会聊天”,而是:
22
-
23
- - 不容易中途断掉
24
- - 出错后会继续排查
25
- - 长任务能自动续跑
26
- - 多步任务有状态落盘
27
- - 任务派工和恢复不靠 prompt 记忆
28
-
29
- ## 下一阶段定位
30
-
31
- 下一阶段 Athlete 的定位是:
32
-
33
- **一个以耐跑主 Agent 为核心、能够统筹任务与技能扩展的总指挥型智能体平台。**
34
-
35
- 关键词:
36
-
37
- - 主 Agent 很强
38
- - 复杂任务时会拆分与调度
39
- - skills 是标准扩展口
40
- - 多 Agent 是按需能力,不是默认军团
41
- - 控制面知道任务为什么 ready / blocked / active / completed
42
-
43
- ## 目标用户
44
-
45
- ### 当前主要用户
46
-
47
- - 会在终端里工作的开发者
48
- - 想研究 agent harness 架构的维护者
49
-
50
- ### 未来扩展用户
51
-
52
- - 需要多步自动化的人
53
- - 需要文档、表格、资料整理等复杂任务的人
54
- - 想给 agent 增加行业技能的人
55
-
56
- ## 非目标
57
-
58
- - 不做拖拽式工作流平台
59
- - 不做纯聊天机器人
60
- - 不追求“默认一堆 agent 同时乱跑”
61
- - 不把长期人格记忆作为当前阶段的核心卖点