@danceiny/gotry 0.0.1-rc.18 → 0.0.1-rc.20

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 (176) hide show
  1. package/README.md +42 -16
  2. package/README.zh-CN.md +37 -15
  3. package/bin/gotry-bootstrap.js +309 -30
  4. package/bin/gotry-inner.js +74 -23
  5. package/bin/gotry-runtime-resolution.d.ts +1 -1
  6. package/bin/gotry-runtime-resolution.js +7 -8
  7. package/cordis.gotry-patch.yml +22 -8
  8. package/data/stations-12306-verify.json +524 -0
  9. package/dist/capabilities/agent-reach.js +4 -4
  10. package/dist/capabilities/anything.js +62 -29
  11. package/dist/capabilities/channel-health.js +103 -0
  12. package/dist/capabilities/channel-registry.js +213 -0
  13. package/dist/capabilities/doctor.js +307 -0
  14. package/dist/capabilities/effect.js +178 -5
  15. package/dist/capabilities/flyai.js +13 -0
  16. package/dist/capabilities/hbcli.js +28 -2
  17. package/dist/capabilities/session/adapters/ctrip-hotel.js +207 -0
  18. package/dist/capabilities/session/adapters/rail-12306.js +285 -0
  19. package/dist/capabilities/session/extension-bridge.js +14 -1
  20. package/dist/capabilities/session/extension-channel.js +4 -2
  21. package/dist/capabilities/session/extension-distribution.js +1 -1
  22. package/dist/capabilities/session-search.js +311 -0
  23. package/dist/capabilities/visa-policy.js +126 -0
  24. package/dist/scripts/agent-planning-turn-deadline-e2e.js +305 -0
  25. package/dist/scripts/agent-planning-turn-deadline-tests.js +281 -0
  26. package/dist/scripts/anything-tests.js +70 -21
  27. package/dist/scripts/benchmark-environment-bridge-e2e.js +139 -37
  28. package/dist/scripts/benchmark-environment-bridge-tests.js +1099 -306
  29. package/dist/scripts/booking-copilot-availability-ledger-binding-tests.js +26 -26
  30. package/dist/scripts/{booking-copilot-availability-policy-v2-tests.js → booking-copilot-availability-policy-tests.js} +115 -115
  31. package/dist/scripts/booking-copilot-crossrepo-fixture-server.js +41 -1
  32. package/dist/scripts/booking-copilot-dsh-core-proof-tests.js +75 -120
  33. package/dist/scripts/booking-copilot-dsh-planner-proof-tests.js +370 -61
  34. package/dist/scripts/booking-copilot-dsh-plugin-proof-tests.js +2 -2
  35. package/dist/scripts/booking-copilot-event-sequence-concurrency-proof-tests.js +7 -3
  36. package/dist/scripts/booking-copilot-gap-code-contract-proof-tests.js +15 -9
  37. package/dist/scripts/booking-copilot-operation-ledger-concurrency-proof-tests.js +19 -11
  38. package/dist/scripts/booking-copilot-receipt-ledger-concurrency-proof-tests.js +16 -52
  39. package/dist/scripts/booking-copilot-runtime-proof-tests.js +3953 -155
  40. package/dist/scripts/booking-copilot-server-proof-tests.js +58 -23
  41. package/dist/scripts/booking-copilot-startup-proof-tests.js +10 -119
  42. package/dist/scripts/booking-surface-contract-proof-tests.js +1154 -326
  43. package/dist/scripts/bootstrap-tests.js +113 -2
  44. package/dist/scripts/build-metrics-report.js +339 -0
  45. package/dist/scripts/channel-probe-tests.js +148 -0
  46. package/dist/scripts/channel-probe.js +252 -0
  47. package/dist/scripts/channel-registry-tests.js +262 -0
  48. package/dist/scripts/doctor-tests.js +175 -0
  49. package/dist/scripts/effect-tests.js +274 -1
  50. package/dist/scripts/extension-tests.js +129 -11
  51. package/dist/scripts/fact-gate-tests.js +91 -2
  52. package/dist/scripts/flyai-tests.js +17 -1
  53. package/dist/scripts/hbcli-e2e-tests.js +1 -3
  54. package/dist/scripts/hbcli-tests.js +38 -1
  55. package/dist/scripts/metrics-report-tests.js +288 -0
  56. package/dist/scripts/persona-surface-guard-tests.js +19 -0
  57. package/dist/scripts/session-tests.js +401 -1
  58. package/dist/scripts/smoke.js +100 -83
  59. package/dist/scripts/turn-handoff-collect-tests.js +216 -0
  60. package/dist/scripts/turn-handoff-collect.js +189 -0
  61. package/dist/scripts/turn-policy-tests.js +56 -0
  62. package/dist/scripts/typed-contract-canary.js +261 -0
  63. package/dist/scripts/visa-policy-tests.js +75 -0
  64. package/dist/scripts/wish-channel-gate-tests.js +111 -0
  65. package/dist/src/artifact-gate.js +91 -3
  66. package/dist/src/benchmark-agent-conformance.js +39 -16
  67. package/dist/src/benchmark-environment-bridge.js +316 -52
  68. package/dist/src/bookable-facts.js +62 -3
  69. package/dist/src/booking-surface/{availability-policy-v2.js → availability-policy.js} +89 -89
  70. package/dist/src/booking-surface/canonical-schema.js +8 -22
  71. package/dist/src/booking-surface/contracts.js +70 -19
  72. package/dist/src/booking-surface/dsh-planner.js +310 -177
  73. package/dist/src/booking-surface/dsh-plugin.js +3 -3
  74. package/dist/src/booking-surface/index.js +1 -5
  75. package/dist/src/booking-surface/profile.js +1 -1
  76. package/dist/src/booking-surface/runtime.js +1682 -247
  77. package/dist/src/booking-surface/server.js +371 -185
  78. package/dist/src/booking-surface/startup.js +17 -27
  79. package/dist/src/booking-surface/validation.js +270 -760
  80. package/dist/src/index.js +739 -150
  81. package/dist/src/turn-deadline.js +292 -0
  82. package/dist/src/turn-policy.js +146 -0
  83. package/dist/src/wish-pool.js +5 -0
  84. package/extension/background.js +23 -4
  85. package/extension/content-main.js +47 -9
  86. package/extension/manifest.json +27 -9
  87. package/package.json +7 -26
  88. package/schemas/booking.surface.schema.json +2593 -0
  89. package/ts/capabilities/agent-reach.ts +4 -4
  90. package/ts/capabilities/anything.ts +89 -38
  91. package/ts/capabilities/flyai.ts +21 -3
  92. package/ts/capabilities/hbcli.ts +53 -4
  93. package/ts/capabilities/session/action-cache.ts +1 -1
  94. package/ts/capabilities/session/adapters/ctrip-hotel.ts +238 -0
  95. package/ts/capabilities/session/adapters/rail-12306.ts +293 -0
  96. package/ts/capabilities/session/extension-bridge.ts +32 -2
  97. package/ts/capabilities/session/extension-channel.ts +9 -8
  98. package/ts/capabilities/session/extension-distribution.ts +3 -1
  99. package/ts/capabilities/session/health-watch.ts +1 -1
  100. package/ts/capabilities/session/read-guard.ts +1 -1
  101. package/ts/capabilities/session/wizard.ts +1 -1
  102. package/ts/capabilities/session-search.ts +323 -1
  103. package/ts/dsh-runtime/vendor/README.md +60 -0
  104. package/ts/dsh-runtime/vendor/dsh-map-tools/LICENSE +21 -0
  105. package/ts/dsh-runtime/vendor/dsh-map-tools/README.en.md +200 -0
  106. package/ts/dsh-runtime/vendor/dsh-map-tools/README.md +202 -0
  107. package/ts/dsh-runtime/vendor/dsh-map-tools/client/client.js +216 -0
  108. package/ts/dsh-runtime/vendor/dsh-map-tools/cordis.patch.yml +5 -0
  109. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/clients/amap.js +371 -0
  110. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/clients/nominatim.js +63 -0
  111. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/clients/osrm.js +56 -0
  112. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/clients/photon.js +55 -0
  113. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/config-file.js +87 -0
  114. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/config-route.js +126 -0
  115. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/config.js +16 -0
  116. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/index.js +109 -0
  117. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/settings-ns.js +27 -0
  118. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/tools/geocode.js +127 -0
  119. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/tools/poi.js +84 -0
  120. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/tools/routes.js +170 -0
  121. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/clients/amap.d.ts +53 -0
  122. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/clients/nominatim.d.ts +17 -0
  123. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/clients/osrm.d.ts +15 -0
  124. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/clients/photon.d.ts +22 -0
  125. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/config-file.d.ts +33 -0
  126. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/config-route.d.ts +20 -0
  127. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/config.d.ts +23 -0
  128. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/index.d.ts +18 -0
  129. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/settings-ns.d.ts +14 -0
  130. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/tools/geocode.d.ts +11 -0
  131. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/tools/poi.d.ts +9 -0
  132. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/tools/routes.d.ts +16 -0
  133. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/types.d.ts +55 -0
  134. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types.js +16 -0
  135. package/ts/dsh-runtime/vendor/dsh-map-tools/package.json +91 -0
  136. package/ts/package.json +9 -0
  137. package/ts/scripts/turn-handoff-collect.ts +178 -0
  138. package/ts/src/artifact-gate.ts +82 -2
  139. package/ts/src/benchmark-agent-conformance.ts +54 -15
  140. package/ts/src/benchmark-environment-bridge.ts +234 -46
  141. package/ts/src/bookable-facts.ts +109 -5
  142. package/ts/src/booking-saga.ts +1 -1
  143. package/ts/src/booking-surface/{availability-policy-v2.ts → availability-policy.ts} +124 -125
  144. package/ts/src/booking-surface/canonical-schema.js +8 -22
  145. package/ts/src/booking-surface/contracts.ts +278 -239
  146. package/ts/src/booking-surface/dsh-planner.ts +333 -194
  147. package/ts/src/booking-surface/dsh-plugin.js +3 -3
  148. package/ts/src/booking-surface/index.ts +1 -5
  149. package/ts/src/booking-surface/profile.ts +11 -11
  150. package/ts/src/booking-surface/runtime.ts +1351 -351
  151. package/ts/src/booking-surface/server.ts +282 -175
  152. package/ts/src/booking-surface/startup.ts +36 -48
  153. package/ts/src/booking-surface/validation.ts +194 -442
  154. package/ts/src/contracts.ts +1 -1
  155. package/ts/src/index.ts +492 -172
  156. package/ts/src/loop.ts +1 -1
  157. package/ts/src/state-ledger.ts +1 -1
  158. package/ts/src/turn-deadline.ts +365 -0
  159. package/ts/src/turn-policy.ts +154 -0
  160. package/ts/src/wish-pool.ts +17 -4
  161. package/dist/scripts/agent-planning-budget-e2e.js +0 -227
  162. package/dist/scripts/agent-planning-budget-tests.js +0 -173
  163. package/dist/scripts/booking-copilot-v2-runtime-proof-tests.js +0 -3935
  164. package/dist/scripts/booking-surface-v2-contract-proof-tests.js +0 -1174
  165. package/dist/src/booking-surface/contracts-v2.js +0 -89
  166. package/dist/src/booking-surface/runtime-v2.js +0 -1771
  167. package/dist/src/booking-surface/server-v2.js +0 -334
  168. package/dist/src/booking-surface/validation-v2.js +0 -319
  169. package/dist/src/tool-budget.js +0 -136
  170. package/schemas/booking.surface.v1.schema.json +0 -927
  171. package/schemas/booking.surface.v2.schema.json +0 -61
  172. package/ts/src/booking-surface/contracts-v2.ts +0 -118
  173. package/ts/src/booking-surface/runtime-v2.ts +0 -1466
  174. package/ts/src/booking-surface/server-v2.ts +0 -247
  175. package/ts/src/booking-surface/validation-v2.ts +0 -205
  176. package/ts/src/tool-budget.ts +0 -165
@@ -34,6 +34,9 @@
34
34
  {{motivation_brief}}
35
35
  行为契约:
36
36
  (1)动机先行:首轮必问工作窗口(几点到几点/什么时区)与已订资源(航班/酒店);
37
+ 行程涉及同行人(见面/汇合/结伴)时,同行人是第二条到达链,同样必问——从哪出发/是否
38
+ 已订/有无自己的时间窗;问明即落同行人档案(gotry_companion_save),到达账与预算按各自
39
+ 的链分开算;
37
40
  (2)日历一次断言:日期换算以锚点卡为准并记住,冲突让用户裁决,永不重算;
38
41
  (3)翻译不造数:班次/价格只来自工具(gotry_feasibility_check/gotry_skeleton_check/gotry_hotel_search);
39
42
  (4)判定归引擎:可行性/全成本由工具计算,你只解释;
@@ -70,6 +73,10 @@
70
73
  工具链,绝不因关键词(差旅/年假/IRW)路由进宿主其他 skill(如 cis-cli);
71
74
  只有用户明确要查公司系统(假期余额/出差订单/报销审批)时才调对应 skill;
72
75
  交界场景(用年假去旅行)分两步——余额查询归公司 skill,去哪/怎么去归 gotry。
76
+ 表层规则:gotry 的全部能力一律是【工具调用】(gotry_ 前缀,直接作为 tool
77
+ 发起),不是宿主 skill——绝不把 gotry_* 名字传给 skill 加载器(skill 面只装
78
+ 宿主技能;skill 调用返回 invalid/unknown 即说明用错了面,改回 tool call,
79
+ 不得换名重试 skill)。
73
80
  (17)判定前背景调查:给可行性结论前,先对每个候选目的地取气候背景
74
81
  (gotry_weather_check 的 climate 模式);季节性/天气论断必须带
75
82
  [实时API:open-meteo@ts] 证据,没查过就不写天气相关理由。
@@ -78,11 +85,11 @@
78
85
  evidence=用户原话),不等确认;班次/房型/落脚点等开放性选择不外问
79
86
  用户——基于已知动机与约束给出最有说服力的方案并说明理由,用户否决
80
87
  才改。校准类疑问永不阻塞推进。
81
- (19)OTA 检索(平铺工具,无预设路由优先级):实时机票/火车用
82
- gotry_flyai_search(kind=flight|train),实时酒店报价也用它
83
- (kind=hotel;未鉴权价格多为打码如 ¥7xx,如实以区间呈现并请用户到
84
- jumpUrl 酒店页核实真实价)。账号会话面 gotry_session_search(用户本人
85
- 登录态,现携程机票):**首次调用**经运行时审批卡向用户请求授权,本会话
88
+ (19)OTA 检索(工具平铺,路由查卡):机/火/酒检索通道与当前顺位看
89
+ {{channel_routing_card}}——不背优先级;某次检索 verdict≠hit 时,按该结果内
90
+ routing 字段改道下一通道,同一通道本会话不盲试第二次。
91
+ 账号会话面 gotry_session_search(用户本人
92
+ 登录态,现携程机票/酒店 + 12306 火车(公开查询面),kind=flight|hotel|train):**首次调用**经运行时审批卡向用户请求授权,本会话
86
93
  内记住、不再重复弹卡;用户拒绝即本会话吊销——不再请求也不再执行,改走
87
94
  其他工具推进;无审批通道(headless)不执行。返回 needs-login→调
88
95
  gotry_session_login 产品工具(先自动检测票据——已登录则直接确认零弹窗;未登录才
@@ -102,6 +109,13 @@
102
109
  **交付任何含可下单事实的行程产物(markdown 文件或长方案)前,必须调
103
110
  gotry_fact_gate**;闸 blocked 时逐条修正为可回溯事实或降级措辞,
104
111
  不得宣称「已验证方案」。
105
- (21)工具循环收敛:第 16 次工具调用收到 TOOL_BUDGET_SOFT 提示后立即整理并给出最终答复;
106
- 每个对话轮次最多允许 18 次真实工具派发,第 19 次起收到结构化 TOOL_BUDGET_EXHAUSTED
107
- 拒绝结果且不得再调用工具。达到闸值后只能基于已有结果输出最终答复,不得重试或改调其他工具。
112
+ (21)工具循环收敛(wall-clock,ADR-24 v2):工具按需取用,没有「次数预算」,
113
+ 也**永远不要**向用户宣称「工具预算已耗尽」——每轮唯一的边界是运行时时间闸,
114
+ 只认三种信号:收到 TURN_DEADLINE_SOFT = 时间过半,立即停止发起新工具,开始
115
+ 整理已有结果;收到 TURN_DEADLINE_EXHAUSTED = 本轮时间到,只能基于已有结果
116
+ 输出最终答复,不得重试或改调其他工具,更不得用记忆/常识填充工具没查到的
117
+ 实时事实(如实说明哪部分未能核实);收到 TURN_DEADLINE_HANDOFF = 深规划
118
+ 转入后台,按提示告知用户预计时间与回访方式(附工单号),本轮给简短确认。
119
+ (22)到达账必达:红眼/凌晨起飞、或落地当天有硬安排(上班/办事)的航段,解释方案时必须
120
+ 显式给出到达账——当地到达时刻(含日期偏移)、时差、到达精力与落地后可用时长,并主动给
121
+ 前一晚落脚建议;时刻表正确不等于行程可行。
@@ -0,0 +1,524 @@
1
+ {
2
+ "schema": "gotry_stations_12306_verify_v1",
3
+ "source": "https://kyfw.12306.cn/otn/resources/js/framework/station_name.js",
4
+ "source_note": "12306 官方全量站表(3384 站);代表站规则=城市同名站,无同名站取城市组首站",
5
+ "calibrated_at": "2026-09-03",
6
+ "cities": {
7
+ "三亚": {
8
+ "telecode": "SEQ",
9
+ "representative_station": "三亚"
10
+ },
11
+ "上海": {
12
+ "telecode": "SHH",
13
+ "representative_station": "上海"
14
+ },
15
+ "上饶": {
16
+ "telecode": "SRG",
17
+ "representative_station": "上饶"
18
+ },
19
+ "东莞": {
20
+ "telecode": "RTQ",
21
+ "representative_station": "东莞"
22
+ },
23
+ "中卫": {
24
+ "telecode": "ZWJ",
25
+ "representative_station": "中卫"
26
+ },
27
+ "中山": {
28
+ "telecode": "ZSQ",
29
+ "representative_station": "中山"
30
+ },
31
+ "丽江": {
32
+ "telecode": "LHM",
33
+ "representative_station": "丽江"
34
+ },
35
+ "乌鲁木齐": {
36
+ "telecode": "WAR",
37
+ "representative_station": "乌鲁木齐"
38
+ },
39
+ "乐山": {
40
+ "telecode": "IVW",
41
+ "representative_station": "乐山"
42
+ },
43
+ "九江": {
44
+ "telecode": "JJG",
45
+ "representative_station": "九江"
46
+ },
47
+ "伊宁": {
48
+ "telecode": "YMR",
49
+ "representative_station": "伊宁"
50
+ },
51
+ "佛山": {
52
+ "telecode": "FSQ",
53
+ "representative_station": "佛山"
54
+ },
55
+ "保山": {
56
+ "telecode": "BAM",
57
+ "representative_station": "保山"
58
+ },
59
+ "六盘水": {
60
+ "telecode": "UMW",
61
+ "representative_station": "六盘水"
62
+ },
63
+ "兰州": {
64
+ "telecode": "LZJ",
65
+ "representative_station": "兰州"
66
+ },
67
+ "包头": {
68
+ "telecode": "BTC",
69
+ "representative_station": "包头"
70
+ },
71
+ "北京": {
72
+ "telecode": "BJP",
73
+ "representative_station": "北京"
74
+ },
75
+ "北海": {
76
+ "telecode": "BHZ",
77
+ "representative_station": "北海"
78
+ },
79
+ "十堰": {
80
+ "telecode": "SNN",
81
+ "representative_station": "十堰"
82
+ },
83
+ "南京": {
84
+ "telecode": "NJH",
85
+ "representative_station": "南京"
86
+ },
87
+ "南充": {
88
+ "telecode": "NCW",
89
+ "representative_station": "南充"
90
+ },
91
+ "南宁": {
92
+ "telecode": "NNZ",
93
+ "representative_station": "南宁"
94
+ },
95
+ "南昌": {
96
+ "telecode": "NCG",
97
+ "representative_station": "南昌"
98
+ },
99
+ "南通": {
100
+ "telecode": "NUH",
101
+ "representative_station": "南通"
102
+ },
103
+ "南阳": {
104
+ "telecode": "NFF",
105
+ "representative_station": "南阳"
106
+ },
107
+ "厦门": {
108
+ "telecode": "XMS",
109
+ "representative_station": "厦门"
110
+ },
111
+ "台州": {
112
+ "telecode": "TEU",
113
+ "representative_station": "台州"
114
+ },
115
+ "合肥": {
116
+ "telecode": "HFH",
117
+ "representative_station": "合肥"
118
+ },
119
+ "吉林": {
120
+ "telecode": "JLL",
121
+ "representative_station": "吉林"
122
+ },
123
+ "吐鲁番": {
124
+ "telecode": "TFR",
125
+ "representative_station": "吐鲁番"
126
+ },
127
+ "呼和浩特": {
128
+ "telecode": "HHC",
129
+ "representative_station": "呼和浩特"
130
+ },
131
+ "咸阳": {
132
+ "telecode": "XYY",
133
+ "representative_station": "咸阳"
134
+ },
135
+ "哈密": {
136
+ "telecode": "HMR",
137
+ "representative_station": "哈密"
138
+ },
139
+ "哈尔滨": {
140
+ "telecode": "HBB",
141
+ "representative_station": "哈尔滨"
142
+ },
143
+ "喀什": {
144
+ "telecode": "KSR",
145
+ "representative_station": "喀什"
146
+ },
147
+ "嘉兴": {
148
+ "telecode": "JXH",
149
+ "representative_station": "嘉兴"
150
+ },
151
+ "嘉峪关": {
152
+ "telecode": "JGJ",
153
+ "representative_station": "嘉峪关"
154
+ },
155
+ "大同": {
156
+ "telecode": "DTV",
157
+ "representative_station": "大同"
158
+ },
159
+ "大庆": {
160
+ "telecode": "DZX",
161
+ "representative_station": "大庆"
162
+ },
163
+ "大理": {
164
+ "telecode": "DKM",
165
+ "representative_station": "大理"
166
+ },
167
+ "大连": {
168
+ "telecode": "DLT",
169
+ "representative_station": "大连"
170
+ },
171
+ "天水": {
172
+ "telecode": "TSJ",
173
+ "representative_station": "天水"
174
+ },
175
+ "天津": {
176
+ "telecode": "TJP",
177
+ "representative_station": "天津"
178
+ },
179
+ "太原": {
180
+ "telecode": "TYV",
181
+ "representative_station": "太原"
182
+ },
183
+ "宁波": {
184
+ "telecode": "NGH",
185
+ "representative_station": "宁波"
186
+ },
187
+ "安顺": {
188
+ "telecode": "ASW",
189
+ "representative_station": "安顺"
190
+ },
191
+ "宜宾": {
192
+ "telecode": "YKE",
193
+ "representative_station": "宜宾"
194
+ },
195
+ "宜昌": {
196
+ "telecode": "YCN",
197
+ "representative_station": "宜昌"
198
+ },
199
+ "宝鸡": {
200
+ "telecode": "BJY",
201
+ "representative_station": "宝鸡"
202
+ },
203
+ "岳阳": {
204
+ "telecode": "YYQ",
205
+ "representative_station": "岳阳"
206
+ },
207
+ "常州": {
208
+ "telecode": "CZH",
209
+ "representative_station": "常州"
210
+ },
211
+ "常德": {
212
+ "telecode": "VGQ",
213
+ "representative_station": "常德"
214
+ },
215
+ "广州": {
216
+ "telecode": "GZQ",
217
+ "representative_station": "广州"
218
+ },
219
+ "库尔勒": {
220
+ "telecode": "KLR",
221
+ "representative_station": "库尔勒"
222
+ },
223
+ "延安": {
224
+ "telecode": "YWY",
225
+ "representative_station": "延安"
226
+ },
227
+ "开封": {
228
+ "telecode": "KFF",
229
+ "representative_station": "开封"
230
+ },
231
+ "张掖": {
232
+ "telecode": "ZYJ",
233
+ "representative_station": "张掖"
234
+ },
235
+ "徐州": {
236
+ "telecode": "XCH",
237
+ "representative_station": "徐州"
238
+ },
239
+ "德阳": {
240
+ "telecode": "DYW",
241
+ "representative_station": "德阳"
242
+ },
243
+ "惠州": {
244
+ "telecode": "HCQ",
245
+ "representative_station": "惠州"
246
+ },
247
+ "成都": {
248
+ "telecode": "CDW",
249
+ "representative_station": "成都"
250
+ },
251
+ "扬州": {
252
+ "telecode": "YLH",
253
+ "representative_station": "扬州"
254
+ },
255
+ "承德": {
256
+ "telecode": "CDP",
257
+ "representative_station": "承德"
258
+ },
259
+ "抚顺": {
260
+ "telecode": "FET",
261
+ "representative_station": "抚顺"
262
+ },
263
+ "拉萨": {
264
+ "telecode": "LSO",
265
+ "representative_station": "拉萨"
266
+ },
267
+ "揭阳": {
268
+ "telecode": "JYA",
269
+ "representative_station": "揭阳"
270
+ },
271
+ "新乡": {
272
+ "telecode": "XXF",
273
+ "representative_station": "新乡"
274
+ },
275
+ "无锡": {
276
+ "telecode": "WGH",
277
+ "representative_station": "无锡"
278
+ },
279
+ "日喀则": {
280
+ "telecode": "RKO",
281
+ "representative_station": "日喀则"
282
+ },
283
+ "昆明": {
284
+ "telecode": "KMM",
285
+ "representative_station": "昆明"
286
+ },
287
+ "普洱": {
288
+ "telecode": "PEM",
289
+ "representative_station": "普洱"
290
+ },
291
+ "景德镇": {
292
+ "telecode": "JCG",
293
+ "representative_station": "景德镇"
294
+ },
295
+ "曲靖": {
296
+ "telecode": "QJM",
297
+ "representative_station": "曲靖"
298
+ },
299
+ "杭州": {
300
+ "telecode": "HZH",
301
+ "representative_station": "杭州"
302
+ },
303
+ "林芝": {
304
+ "telecode": "LZO",
305
+ "representative_station": "林芝"
306
+ },
307
+ "柳州": {
308
+ "telecode": "LZZ",
309
+ "representative_station": "柳州"
310
+ },
311
+ "株洲": {
312
+ "telecode": "ZZQ",
313
+ "representative_station": "株洲"
314
+ },
315
+ "格尔木": {
316
+ "telecode": "GRO",
317
+ "representative_station": "格尔木"
318
+ },
319
+ "桂林": {
320
+ "telecode": "GLZ",
321
+ "representative_station": "桂林"
322
+ },
323
+ "梧州": {
324
+ "telecode": "WZZ",
325
+ "representative_station": "梧州"
326
+ },
327
+ "武汉": {
328
+ "telecode": "WHN",
329
+ "representative_station": "武汉"
330
+ },
331
+ "汉中": {
332
+ "telecode": "HOY",
333
+ "representative_station": "汉中"
334
+ },
335
+ "汕头": {
336
+ "telecode": "OTQ",
337
+ "representative_station": "汕头"
338
+ },
339
+ "沈阳": {
340
+ "telecode": "SYT",
341
+ "representative_station": "沈阳"
342
+ },
343
+ "泉州": {
344
+ "telecode": "QYS",
345
+ "representative_station": "泉州"
346
+ },
347
+ "泸州": {
348
+ "telecode": "LUE",
349
+ "representative_station": "泸州"
350
+ },
351
+ "洛阳": {
352
+ "telecode": "LYF",
353
+ "representative_station": "洛阳"
354
+ },
355
+ "济南": {
356
+ "telecode": "JNK",
357
+ "representative_station": "济南"
358
+ },
359
+ "深圳": {
360
+ "telecode": "SZQ",
361
+ "representative_station": "深圳"
362
+ },
363
+ "温州": {
364
+ "telecode": "RZH",
365
+ "representative_station": "温州"
366
+ },
367
+ "湛江": {
368
+ "telecode": "ZJZ",
369
+ "representative_station": "湛江"
370
+ },
371
+ "漳州": {
372
+ "telecode": "ZUS",
373
+ "representative_station": "漳州"
374
+ },
375
+ "潮州": {
376
+ "telecode": "CKQ",
377
+ "representative_station": "潮州"
378
+ },
379
+ "牡丹江": {
380
+ "telecode": "MDB",
381
+ "representative_station": "牡丹江"
382
+ },
383
+ "珠海": {
384
+ "telecode": "ZHQ",
385
+ "representative_station": "珠海"
386
+ },
387
+ "盐城": {
388
+ "telecode": "AFH",
389
+ "representative_station": "盐城"
390
+ },
391
+ "石家庄": {
392
+ "telecode": "SJP",
393
+ "representative_station": "石家庄"
394
+ },
395
+ "福州": {
396
+ "telecode": "FZS",
397
+ "representative_station": "福州"
398
+ },
399
+ "秦皇岛": {
400
+ "telecode": "QTP",
401
+ "representative_station": "秦皇岛"
402
+ },
403
+ "绍兴": {
404
+ "telecode": "SOH",
405
+ "representative_station": "绍兴"
406
+ },
407
+ "绵阳": {
408
+ "telecode": "MYW",
409
+ "representative_station": "绵阳"
410
+ },
411
+ "芜湖": {
412
+ "telecode": "WHH",
413
+ "representative_station": "芜湖"
414
+ },
415
+ "苏州": {
416
+ "telecode": "SZH",
417
+ "representative_station": "苏州"
418
+ },
419
+ "茂名": {
420
+ "telecode": "MDQ",
421
+ "representative_station": "茂名"
422
+ },
423
+ "莆田": {
424
+ "telecode": "PTS",
425
+ "representative_station": "莆田"
426
+ },
427
+ "衡阳": {
428
+ "telecode": "HYQ",
429
+ "representative_station": "衡阳"
430
+ },
431
+ "襄阳": {
432
+ "telecode": "XFN",
433
+ "representative_station": "襄阳"
434
+ },
435
+ "西宁": {
436
+ "telecode": "XNO",
437
+ "representative_station": "西宁"
438
+ },
439
+ "西安": {
440
+ "telecode": "XAY",
441
+ "representative_station": "西安"
442
+ },
443
+ "西昌": {
444
+ "telecode": "ECW",
445
+ "representative_station": "西昌"
446
+ },
447
+ "贵阳": {
448
+ "telecode": "GIW",
449
+ "representative_station": "贵阳"
450
+ },
451
+ "赣州": {
452
+ "telecode": "GZG",
453
+ "representative_station": "赣州"
454
+ },
455
+ "达州": {
456
+ "telecode": "RXW",
457
+ "representative_station": "达州"
458
+ },
459
+ "遵义": {
460
+ "telecode": "ZYE",
461
+ "representative_station": "遵义"
462
+ },
463
+ "郑州": {
464
+ "telecode": "ZZF",
465
+ "representative_station": "郑州"
466
+ },
467
+ "重庆": {
468
+ "telecode": "CUW",
469
+ "representative_station": "重庆"
470
+ },
471
+ "金华": {
472
+ "telecode": "JBH",
473
+ "representative_station": "金华"
474
+ },
475
+ "银川": {
476
+ "telecode": "YIJ",
477
+ "representative_station": "银川"
478
+ },
479
+ "镇江": {
480
+ "telecode": "ZJH",
481
+ "representative_station": "镇江"
482
+ },
483
+ "长春": {
484
+ "telecode": "CCT",
485
+ "representative_station": "长春"
486
+ },
487
+ "长沙": {
488
+ "telecode": "CSQ",
489
+ "representative_station": "长沙"
490
+ },
491
+ "阜阳": {
492
+ "telecode": "FYH",
493
+ "representative_station": "阜阳"
494
+ },
495
+ "青岛": {
496
+ "telecode": "QDK",
497
+ "representative_station": "青岛"
498
+ },
499
+ "鞍山": {
500
+ "telecode": "AST",
501
+ "representative_station": "鞍山"
502
+ },
503
+ "韶关": {
504
+ "telecode": "SNQ",
505
+ "representative_station": "韶关"
506
+ },
507
+ "香格里拉": {
508
+ "telecode": "EUM",
509
+ "representative_station": "香格里拉"
510
+ },
511
+ "香港": {
512
+ "telecode": "XJA",
513
+ "representative_station": "香港西九龙"
514
+ },
515
+ "齐齐哈尔": {
516
+ "telecode": "QHX",
517
+ "representative_station": "齐齐哈尔"
518
+ },
519
+ "龙岩": {
520
+ "telecode": "LYS",
521
+ "representative_station": "龙岩"
522
+ }
523
+ }
524
+ }
@@ -63,7 +63,7 @@ export async function reach(q) {
63
63
  verdict: 'not-installed',
64
64
  evidence: evidence('not-installed'),
65
65
  latencyMs: 0,
66
- setup: 'gotry .venv 缺 python — 见 docs/tokens.md(agent-reach 安装)'
66
+ setup: 'gotry .venv 缺 python——可选依赖未装配。补装:终端跑 npx gotry doctor --fix,或让用户看体检报告 npx gotry doctor'
67
67
  };
68
68
  }
69
69
  const args = Array.isArray(q.args) ? q.args : q.args ? q.args.split(/\s+/).filter(Boolean) : [];
@@ -85,7 +85,7 @@ export async function reach(q) {
85
85
  verdict: 'not-installed',
86
86
  evidence: evidence('not-installed'),
87
87
  latencyMs,
88
- setup: '.venv/bin/python 不可执行(装 agent-reach: 见 docs/tokens.md)'
88
+ setup: '.venv/bin/python 不可执行——补装:终端跑 npx gotry doctor --fix'
89
89
  };
90
90
  }
91
91
  if (parsed.ok === true) {
@@ -105,7 +105,7 @@ export async function reach(q) {
105
105
  verdict: 'not-installed',
106
106
  evidence: evidence('not-installed'),
107
107
  latencyMs,
108
- setup: '.venv 缺 agent-reach(pip install agent-reach,见 docs/tokens.md)'
108
+ setup: '.venv 缺 agent-reach 包——补装:终端跑 npx gotry doctor --fix'
109
109
  };
110
110
  }
111
111
  if (r.code === 2) {
@@ -184,7 +184,7 @@ export async function reachStatus(timeoutMs = 90_000) {
184
184
  via: 'not-installed',
185
185
  evidence: `[agent-reach:doctor@not-installed@${ts()}]`,
186
186
  latencyMs: 0,
187
- output: 'pip install agent-reach 于 .venv(见 docs/tokens.md)'
187
+ output: 'Agent Reach 未装配(.venv 缺失)——可选依赖,补装:终端跑 npx gotry doctor --fix;或让助手调 gotry_doctor 看整体体检报告'
188
188
  };
189
189
  }
190
190
  const r = await run(bin, [