@danceiny/gotry 0.0.1-rc.8 → 0.2.0-rc.27

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 (506) hide show
  1. package/README.md +172 -217
  2. package/README.zh-CN.md +222 -0
  3. package/bin/gotry-backend.js +53 -0
  4. package/bin/gotry-booking-copilot.js +53 -0
  5. package/bin/gotry-bootstrap.js +1744 -0
  6. package/bin/gotry-inner.js +733 -83
  7. package/bin/gotry-process-liveness.d.ts +27 -0
  8. package/bin/gotry-process-liveness.js +97 -0
  9. package/bin/gotry-runtime-resolution.d.ts +27 -0
  10. package/bin/gotry-runtime-resolution.js +49 -0
  11. package/bin/gotry.js +1 -1
  12. package/client/client.js +203 -0
  13. package/cordis.gotry-patch.yml +80 -49
  14. package/data/airline-airports.json +39 -0
  15. package/data/stations-12306-verify.json +524 -0
  16. package/dist/capabilities/agent-reach-deep.js +45 -122
  17. package/dist/capabilities/agent-reach.js +101 -146
  18. package/dist/capabilities/anything.js +135 -94
  19. package/dist/capabilities/artifacts.js +370 -0
  20. package/dist/capabilities/channel-health.js +131 -0
  21. package/dist/capabilities/channel-registry.js +256 -0
  22. package/dist/capabilities/doctor.js +546 -0
  23. package/dist/capabilities/effect.js +394 -0
  24. package/dist/capabilities/external-event.js +149 -0
  25. package/dist/capabilities/fact-log.js +55 -0
  26. package/dist/capabilities/flyai-config.js +337 -0
  27. package/dist/capabilities/flyai.js +968 -0
  28. package/dist/capabilities/fx-contract.js +293 -0
  29. package/dist/capabilities/geo-atlas.js +246 -0
  30. package/dist/capabilities/ground-transfer.js +509 -0
  31. package/dist/capabilities/hbcli.js +260 -123
  32. package/dist/capabilities/hotelbyte-transaction.js +194 -0
  33. package/dist/capabilities/incident-log.js +131 -61
  34. package/dist/capabilities/itinerary-artifact.js +190 -0
  35. package/dist/capabilities/itinerary-deck-artifact.js +194 -0
  36. package/dist/capabilities/itinerary-deck-export.js +339 -0
  37. package/dist/capabilities/lavish-local.js +924 -0
  38. package/dist/capabilities/model-override.js +38 -0
  39. package/dist/capabilities/opensky.js +54 -43
  40. package/dist/capabilities/resilience.js +191 -0
  41. package/dist/capabilities/session/action-cache.js +126 -0
  42. package/dist/capabilities/session/adapters/ctrip-flight.js +141 -0
  43. package/dist/capabilities/session/adapters/ctrip-hotel.js +222 -0
  44. package/dist/capabilities/session/adapters/dida-portal.js +274 -0
  45. package/dist/capabilities/session/adapters/meituan-local.js +54 -0
  46. package/dist/capabilities/session/adapters/rail-12306.js +342 -0
  47. package/dist/capabilities/session/benchmark.js +189 -0
  48. package/dist/capabilities/session/bridge-ledger.js +224 -0
  49. package/dist/capabilities/session/extension-bridge.js +636 -0
  50. package/dist/capabilities/session/extension-channel.js +109 -0
  51. package/dist/capabilities/session/extension-distribution.js +230 -0
  52. package/dist/capabilities/session/extract.js +50 -0
  53. package/dist/capabilities/session/golden-score.js +114 -0
  54. package/dist/capabilities/session/health-watch.js +215 -0
  55. package/dist/capabilities/session/read-guard.js +107 -0
  56. package/dist/capabilities/session/static-flight-golden.js +150 -0
  57. package/dist/capabilities/session/transport.js +109 -0
  58. package/dist/capabilities/session/wizard.js +117 -0
  59. package/dist/capabilities/session-consent.js +178 -0
  60. package/dist/capabilities/session-login.js +170 -0
  61. package/dist/capabilities/session-search.js +686 -0
  62. package/dist/capabilities/spawn-bounded.js +203 -0
  63. package/dist/capabilities/sponsor-plugin.js +341 -0
  64. package/dist/capabilities/visa-policy.js +140 -0
  65. package/dist/capabilities/weather.js +243 -138
  66. package/dist/data/session-golden-20.json +25 -0
  67. package/dist/data/sf-golden-manifest.json +103 -0
  68. package/dist/data/sf-static-routes.json +91 -0
  69. package/dist/scripts/action-cache-tests.js +72 -0
  70. package/dist/scripts/agent-planning-turn-deadline-e2e.js +242 -0
  71. package/dist/scripts/agent-planning-turn-deadline-tests.js +185 -0
  72. package/dist/scripts/agent-reach-deep-tests.js +30 -40
  73. package/dist/scripts/agent-reach-error-tests.js +354 -0
  74. package/dist/scripts/agent-reach-tests.js +26 -18
  75. package/dist/scripts/agent-reach-wrapper-tests.js +50 -50
  76. package/dist/scripts/anything-tests.js +116 -60
  77. package/dist/scripts/artifact-client-contract-tests.js +220 -0
  78. package/dist/scripts/artifacts-capability-tests.js +727 -0
  79. package/dist/scripts/async-collect.js +68 -10
  80. package/dist/scripts/benchmark-environment-bridge-e2e.js +741 -0
  81. package/dist/scripts/benchmark-environment-bridge-tests.js +1452 -0
  82. package/dist/scripts/booking-copilot-availability-ledger-binding-tests.js +126 -0
  83. package/dist/scripts/booking-copilot-availability-policy-tests.js +265 -0
  84. package/dist/scripts/booking-copilot-bin-proof-tests.js +66 -0
  85. package/dist/scripts/booking-copilot-cleanup-proof-helper.js +76 -0
  86. package/dist/scripts/booking-copilot-crossrepo-fixture-server.js +144 -0
  87. package/dist/scripts/booking-copilot-dsh-core-proof-tests.js +424 -0
  88. package/dist/scripts/booking-copilot-dsh-planner-proof-tests.js +2839 -0
  89. package/dist/scripts/booking-copilot-dsh-plugin-proof-tests.js +309 -0
  90. package/dist/scripts/booking-copilot-dsh-readiness-proof.js +238 -0
  91. package/dist/scripts/booking-copilot-dsh-warmer-proof.js +123 -0
  92. package/dist/scripts/booking-copilot-event-sequence-concurrency-proof-tests.js +156 -0
  93. package/dist/scripts/booking-copilot-gap-code-contract-proof-tests.js +70 -0
  94. package/dist/scripts/booking-copilot-intent-proof-tests.js +422 -0
  95. package/dist/scripts/booking-copilot-operation-ledger-concurrency-proof-tests.js +184 -0
  96. package/dist/scripts/booking-copilot-planner-live-probe.js +95 -0
  97. package/dist/scripts/booking-copilot-proof-runtime.js +42 -0
  98. package/dist/scripts/booking-copilot-receipt-ledger-concurrency-proof-tests.js +210 -0
  99. package/dist/scripts/booking-copilot-runtime-proof-tests.js +2349 -0
  100. package/dist/scripts/booking-copilot-server-proof-tests.js +784 -0
  101. package/dist/scripts/booking-copilot-startup-proof-tests.js +94 -0
  102. package/dist/scripts/booking-executor-tests.js +80 -0
  103. package/dist/scripts/booking-recovery-chain-tests.js +182 -0
  104. package/dist/scripts/booking-saga-tests.js +125 -0
  105. package/dist/scripts/booking-surface-contract-proof-tests.js +212 -0
  106. package/dist/scripts/bootstrap-tests.js +1479 -0
  107. package/dist/scripts/bridge-events-tests.js +239 -0
  108. package/dist/scripts/bridge-ledger-tests.js +428 -0
  109. package/dist/scripts/build-changelog.js +238 -0
  110. package/dist/scripts/build-metrics-report.js +331 -0
  111. package/dist/scripts/changelog-tests.js +118 -0
  112. package/dist/scripts/channel-probe-tests.js +103 -0
  113. package/dist/scripts/channel-probe.js +169 -0
  114. package/dist/scripts/channel-registry-tests.js +208 -0
  115. package/dist/scripts/companion-tests.js +67 -0
  116. package/dist/scripts/dida-cookie-probe.js +87 -0
  117. package/dist/scripts/dida-runner-stop-tests.js +311 -0
  118. package/dist/scripts/dida-sw-probe.js +114 -0
  119. package/dist/scripts/diff-test.js +17 -12
  120. package/dist/scripts/doctor-tests.js +564 -0
  121. package/dist/scripts/dsh-artifact-e2e.js +279 -0
  122. package/dist/scripts/dsh-artifact-web-e2e.js +675 -0
  123. package/dist/scripts/dsh-http-proxy-sse-proof.js +90 -0
  124. package/dist/scripts/dsh-runtime-closure-tests.js +182 -0
  125. package/dist/scripts/dsh-runtime-closure.js +162 -0
  126. package/dist/scripts/dsh-session-v3-migration-proof.js +109 -0
  127. package/dist/scripts/dsh-subprocess-local-proof.js +150 -0
  128. package/dist/scripts/dsh-target-closure-proof.js +178 -0
  129. package/dist/scripts/effect-tests.js +539 -0
  130. package/dist/scripts/engine-run.js +1 -3
  131. package/dist/scripts/engine-tests.js +16 -10
  132. package/dist/scripts/evaluation-cadence-tests.js +174 -0
  133. package/dist/scripts/evaluation-contract-tests.js +268 -0
  134. package/dist/scripts/extension-distribution-cli.js +39 -0
  135. package/dist/scripts/extension-distribution-tests.js +443 -0
  136. package/dist/scripts/extension-tests.js +988 -0
  137. package/dist/scripts/external-event-tests.js +350 -0
  138. package/dist/scripts/fact-gate-tests.js +869 -0
  139. package/dist/scripts/fixtures/extension-bridge-unref-child.mjs +21 -0
  140. package/dist/scripts/flight-hotel-anchor-363-registered-e2e.js +169 -0
  141. package/dist/scripts/flight-malformed-tests.js +159 -0
  142. package/dist/scripts/flyai-setup-tests.js +228 -0
  143. package/dist/scripts/flyai-setup-tool-tests.js +54 -0
  144. package/dist/scripts/flyai-tests.js +692 -0
  145. package/dist/scripts/flyai-tool-registration-contract-tests.js +91 -0
  146. package/dist/scripts/fx-contract-tests.js +201 -0
  147. package/dist/scripts/g5-guard-tests.js +131 -0
  148. package/dist/scripts/g5-guard.js +189 -0
  149. package/dist/scripts/gen-lunar-anchors.js +106 -0
  150. package/dist/scripts/geo-atlas-tests.js +283 -0
  151. package/dist/scripts/gotry-backend-kernel-tests.js +206 -0
  152. package/dist/scripts/gotry-try-demo-tests.js +79 -0
  153. package/dist/scripts/gotry-try-demo.js +49 -0
  154. package/dist/scripts/ground-transfer-tests.js +956 -0
  155. package/dist/scripts/hbcli-e2e-tests.js +159 -0
  156. package/dist/scripts/hbcli-live-optin-tests.js +96 -0
  157. package/dist/scripts/hbcli-release-contract-tests.js +122 -0
  158. package/dist/scripts/hbcli-tests.js +121 -69
  159. package/dist/scripts/health-watch-cli.js +73 -0
  160. package/dist/scripts/hotel-date-gate-tests.js +496 -0
  161. package/dist/scripts/hotelbyte-reconcile-tests.js +141 -0
  162. package/dist/scripts/hotelbyte-spawn-e2e-tests.js +373 -0
  163. package/dist/scripts/i18n-tests.js +41 -0
  164. package/dist/scripts/incident-tests.js +281 -87
  165. package/dist/scripts/issue-194-job-id-guard-tests.js +106 -0
  166. package/dist/scripts/issue-233-cancel-refund-commission-tests.js +392 -0
  167. package/dist/scripts/issue-271-liveness-tests.js +569 -0
  168. package/dist/scripts/issue-289-model-retry-real-tests.js +296 -0
  169. package/dist/scripts/issue-289-model-retry-tests.js +441 -0
  170. package/dist/scripts/issue-289-web-retry-e2e.js +630 -0
  171. package/dist/scripts/issue-338-home-city-e2e.js +577 -0
  172. package/dist/scripts/issue343-real-entry-e2e.js +160 -0
  173. package/dist/scripts/issue436-persisted-routing-e2e.js +247 -0
  174. package/dist/scripts/itinerary-artifact-tests.js +368 -0
  175. package/dist/scripts/itinerary-deck-artifact-tests.js +416 -0
  176. package/dist/scripts/itinerary-deck-export-tests.js +552 -0
  177. package/dist/scripts/itinerary-deck-tests.js +435 -0
  178. package/dist/scripts/itinerary-html-tests.js +426 -0
  179. package/dist/scripts/journey-tests.js +22 -27
  180. package/dist/scripts/kernel-manifest-evidence.js +109 -0
  181. package/dist/scripts/kernel-manifest-gate.js +126 -0
  182. package/dist/scripts/kernel-manifest-tests.js +212 -0
  183. package/dist/scripts/kernel-manifest-trace-entry.js +7 -0
  184. package/dist/scripts/kernel-manifest-trace-hook.mjs +28 -0
  185. package/dist/scripts/kernel-manifest.js +369 -0
  186. package/dist/scripts/lavish-local-tests.js +1226 -0
  187. package/dist/scripts/lavish-product-tools-tests.js +537 -0
  188. package/dist/scripts/ledger-repair-apply-tests.js +316 -0
  189. package/dist/scripts/ledger-repair-plan-tests.js +375 -0
  190. package/dist/scripts/ledger-tests.js +480 -0
  191. package/dist/scripts/ledger-workflow-crash.js +32 -0
  192. package/dist/scripts/managed-dsh-cleanup-diagnostic-proof.js +184 -0
  193. package/dist/scripts/managed-dsh-close-failure-proof.js +172 -0
  194. package/dist/scripts/managed-dsh-run-port-proof.js +153 -0
  195. package/dist/scripts/managed-dsh-terminal-proof.js +252 -0
  196. package/dist/scripts/map-tools-vendor-package-proof.js +365 -0
  197. package/dist/scripts/memory-capture-tests.js +242 -61
  198. package/dist/scripts/memory-decay-tests.js +49 -0
  199. package/dist/scripts/memory-lifecycle-tests.js +657 -0
  200. package/dist/scripts/memory-lifecycle.js +196 -0
  201. package/dist/scripts/memory-metrics.js +29 -31
  202. package/dist/scripts/memory-value-report.js +631 -0
  203. package/dist/scripts/memory-value-tests.js +328 -0
  204. package/dist/scripts/metrics-report-tests.js +151 -0
  205. package/dist/scripts/model-override-e2e.js +137 -0
  206. package/dist/scripts/nightly-evidence-tests.js +161 -0
  207. package/dist/scripts/nightly-evidence.js +286 -0
  208. package/dist/scripts/nudge-digest.js +43 -42
  209. package/dist/scripts/observability-tests.js +381 -0
  210. package/dist/scripts/onboarding-tests.js +161 -0
  211. package/dist/scripts/opensky-check.js +18 -13
  212. package/dist/scripts/opensky-tests.js +28 -28
  213. package/dist/scripts/persona-surface-guard-tests.js +49 -0
  214. package/dist/scripts/pnpm-dsh-closure-proof.js +17 -0
  215. package/dist/scripts/policy-anchor-359-registered-e2e.js +214 -0
  216. package/dist/scripts/price-drift-tests.js +340 -0
  217. package/dist/scripts/price-drift-watch.js +447 -0
  218. package/dist/scripts/probe-poi-tests.js +53 -45
  219. package/dist/scripts/product-metrics.js +483 -0
  220. package/dist/scripts/publish-preverify.js +110 -0
  221. package/dist/scripts/realtime-pricing-tests.js +76 -0
  222. package/dist/scripts/recall-tests.js +513 -0
  223. package/dist/scripts/replay-async.js +20 -18
  224. package/dist/scripts/replay-real.js +18 -18
  225. package/dist/scripts/replay.js +52 -82
  226. package/dist/scripts/session-attach-diagnose.js +31 -0
  227. package/dist/scripts/session-attach-poc.js +62 -0
  228. package/dist/scripts/session-benchmark.js +180 -0
  229. package/dist/scripts/session-dida-live-e2e.js +199 -0
  230. package/dist/scripts/session-extract-tests.js +60 -0
  231. package/dist/scripts/session-link-tests.js +478 -0
  232. package/dist/scripts/session-login.js +29 -0
  233. package/dist/scripts/session-tests.js +862 -0
  234. package/dist/scripts/session-zones-tests.js +358 -0
  235. package/dist/scripts/sf-live-benchmark.js +367 -0
  236. package/dist/scripts/sf-live-challenge-stop-tests.js +453 -0
  237. package/dist/scripts/sf-live-cli-tests.js +92 -0
  238. package/dist/scripts/sf-live-options.js +46 -0
  239. package/dist/scripts/sf-manifest-tests.js +30 -0
  240. package/dist/scripts/sf-manifest.js +33 -0
  241. package/dist/scripts/sf-soft-score-tests.js +67 -0
  242. package/dist/scripts/sf-summary-tests.js +324 -0
  243. package/dist/scripts/sf-summary.js +525 -0
  244. package/dist/scripts/share-tests.js +432 -0
  245. package/dist/scripts/skeleton-check.js +16 -14
  246. package/dist/scripts/skeleton-integration-test.js +28 -11
  247. package/dist/scripts/skills-contract-tests.js +51 -46
  248. package/dist/scripts/smoke-session-gate-tests.js +21 -0
  249. package/dist/scripts/smoke.js +703 -219
  250. package/dist/scripts/spawn-bounded-abort-tests.js +241 -0
  251. package/dist/scripts/sponsor-reuse-tests.js +262 -0
  252. package/dist/scripts/state-cli-tests.js +261 -0
  253. package/dist/scripts/state-cli.js +585 -0
  254. package/dist/scripts/state-repair-cli.js +66 -0
  255. package/dist/scripts/state-repair-tests.js +140 -0
  256. package/dist/scripts/static-golden-tests.js +165 -0
  257. package/dist/scripts/time-eval-tests.js +210 -192
  258. package/dist/scripts/travel-timeline-tests.js +59 -0
  259. package/dist/scripts/turn-handoff-collect-tests.js +169 -0
  260. package/dist/scripts/turn-handoff-collect.js +161 -0
  261. package/dist/scripts/turn-policy-tests.js +55 -0
  262. package/dist/scripts/typed-contract-canary.js +176 -0
  263. package/dist/scripts/tz-resolver-sanity.js +50 -0
  264. package/dist/scripts/tz-resolver-tests.js +584 -0
  265. package/dist/scripts/unified-tests.js +23 -19
  266. package/dist/scripts/visa-policy-tests.js +62 -0
  267. package/dist/scripts/weather-tests.js +276 -41
  268. package/dist/scripts/wish-channel-gate-tests.js +54 -0
  269. package/dist/scripts/write-gate-tests.js +522 -0
  270. package/dist/scripts/z3-lifecycle-fault-tests.js +188 -0
  271. package/dist/scripts/z3-lifecycle-tests.js +170 -0
  272. package/dist/scripts/z3-race-repeat-tests.js +39 -0
  273. package/dist/scripts/z3-race-tests.js +41 -0
  274. package/dist/src/artifact-gate.js +829 -0
  275. package/dist/src/backend/kernel.js +91 -0
  276. package/dist/src/backend/modules/booking-copilot.js +92 -0
  277. package/dist/src/backend/modules/booking-executor.js +124 -0
  278. package/dist/src/backend/modules/session-search.js +551 -0
  279. package/dist/src/benchmark-agent-conformance.js +578 -0
  280. package/dist/src/benchmark-environment-bridge.js +515 -0
  281. package/dist/src/benchmark-headless-child-diagnostics.js +166 -0
  282. package/dist/src/benchmark-tool-isolation.js +151 -0
  283. package/dist/src/bookable-facts.js +533 -0
  284. package/dist/src/booking-saga.js +97 -0
  285. package/dist/src/booking-surface/availability-policy.js +697 -0
  286. package/dist/src/booking-surface/booking-intent.js +43 -0
  287. package/dist/src/booking-surface/cancel-refund-commission.js +379 -0
  288. package/dist/src/booking-surface/canonical-schema.js +116 -0
  289. package/dist/src/booking-surface/contracts.js +75 -0
  290. package/dist/src/booking-surface/dsh-planner.js +1854 -0
  291. package/dist/src/booking-surface/dsh-plugin.js +378 -0
  292. package/dist/src/booking-surface/dsh-worker.js +98 -0
  293. package/dist/src/booking-surface/error-codes.js +231 -0
  294. package/dist/src/booking-surface/index.js +9 -0
  295. package/dist/src/booking-surface/managed-dsh-cleanup-diagnostic.js +97 -0
  296. package/dist/src/booking-surface/managed-dsh-run-port.js +244 -0
  297. package/dist/src/booking-surface/profile.js +24 -0
  298. package/dist/src/booking-surface/recovery-chain.js +367 -0
  299. package/dist/src/booking-surface/runtime.js +1968 -0
  300. package/dist/src/booking-surface/server.js +674 -0
  301. package/dist/src/booking-surface/startup.js +168 -0
  302. package/dist/src/booking-surface/validation.js +261 -0
  303. package/dist/src/bridge.js +20 -13
  304. package/dist/src/companions.js +86 -0
  305. package/dist/src/contracts.js +21 -43
  306. package/dist/src/dsh-llm.js +97 -111
  307. package/dist/src/engine.js +276 -193
  308. package/dist/src/evaluation-cadence.js +97 -0
  309. package/dist/src/evaluation-contracts.js +283 -0
  310. package/dist/src/flight-pack-adapter.js +54 -0
  311. package/dist/src/flight-pack-contract.js +2 -0
  312. package/dist/src/flyai-setup-tool.js +70 -0
  313. package/dist/src/gotry-backend.js +125 -0
  314. package/dist/src/hotel-date-gate.js +118 -0
  315. package/dist/src/i18n.js +88 -0
  316. package/dist/src/index.js +2305 -731
  317. package/dist/src/itinerary-deck.js +139 -0
  318. package/dist/src/itinerary-doc-shared.js +661 -0
  319. package/dist/src/itinerary-html.js +131 -0
  320. package/dist/src/journey.js +155 -108
  321. package/dist/src/lavish-tools.js +400 -0
  322. package/dist/src/ledger-repair-apply.js +538 -0
  323. package/dist/src/ledger-repair-plan.js +463 -0
  324. package/dist/src/loop.js +358 -162
  325. package/dist/src/memory-capture.js +180 -32
  326. package/dist/src/memory-decay.js +47 -0
  327. package/dist/src/memory-lifecycle.js +1310 -0
  328. package/dist/src/memory-utility.js +27 -40
  329. package/dist/src/mock-llm.js +36 -61
  330. package/dist/src/model.js +81 -36
  331. package/dist/src/realtime-pricing.js +103 -0
  332. package/dist/src/recall/card.js +74 -0
  333. package/dist/src/recall/evaluator.js +140 -0
  334. package/dist/src/recall/integration.js +17 -0
  335. package/dist/src/recall/tick.js +166 -0
  336. package/dist/src/session-link/plan-it-action.js +48 -0
  337. package/dist/src/session-link/session-link.js +248 -0
  338. package/dist/src/session-zones.js +507 -0
  339. package/dist/src/share/adapters.js +51 -0
  340. package/dist/src/share/share-consent.js +76 -0
  341. package/dist/src/share/share-deck.js +58 -0
  342. package/dist/src/share/share-token.js +146 -0
  343. package/dist/src/slot-spec.js +84 -106
  344. package/dist/src/state-ledger.js +767 -0
  345. package/dist/src/state-repair.js +299 -0
  346. package/dist/src/subagent-job-id-guard.js +58 -0
  347. package/dist/src/time-anchor.js +231 -33
  348. package/dist/src/tool-packet.js +20 -8
  349. package/dist/src/travel-slots.js +58 -35
  350. package/dist/src/travel-timeline.js +59 -0
  351. package/dist/src/turn-deadline.js +287 -0
  352. package/dist/src/turn-policy.js +118 -0
  353. package/dist/src/tz-resolver.js +143 -0
  354. package/dist/src/unified.js +538 -360
  355. package/dist/src/wish-pool.js +42 -12
  356. package/dist/src/write-gate.js +495 -0
  357. package/dist/src/z3-shared.js +284 -0
  358. package/extension/README.md +21 -0
  359. package/extension/README.zh-CN.md +21 -0
  360. package/extension/background.js +463 -0
  361. package/extension/content-bridge.js +270 -0
  362. package/extension/content-main.js +111 -0
  363. package/extension/manifest.json +60 -0
  364. package/package.json +407 -14
  365. package/schemas/booking.intent.schema.json +193 -0
  366. package/schemas/booking.surface.schema.json +2622 -0
  367. package/ts/capabilities/agent-reach-deep.ts +114 -0
  368. package/ts/capabilities/agent-reach.ts +198 -0
  369. package/ts/capabilities/anything.ts +255 -0
  370. package/ts/capabilities/artifacts.ts +428 -0
  371. package/ts/capabilities/fact-log.ts +54 -0
  372. package/ts/capabilities/flyai-config.ts +388 -0
  373. package/ts/capabilities/flyai.ts +1274 -0
  374. package/ts/capabilities/hbcli.ts +253 -71
  375. package/ts/capabilities/incident-log.ts +88 -59
  376. package/ts/capabilities/itinerary-artifact.ts +214 -0
  377. package/ts/capabilities/itinerary-deck-artifact.ts +218 -0
  378. package/ts/capabilities/itinerary-deck-export.ts +378 -0
  379. package/ts/capabilities/opensky.ts +121 -0
  380. package/ts/capabilities/session/action-cache.ts +148 -0
  381. package/ts/capabilities/session/adapters/ctrip-flight.ts +181 -0
  382. package/ts/capabilities/session/adapters/ctrip-hotel.ts +238 -0
  383. package/ts/capabilities/session/adapters/dida-portal.ts +338 -0
  384. package/ts/capabilities/session/adapters/meituan-local.ts +70 -0
  385. package/ts/capabilities/session/adapters/rail-12306.ts +392 -0
  386. package/ts/capabilities/session/benchmark.ts +276 -0
  387. package/ts/capabilities/session/bridge-ledger.ts +333 -0
  388. package/ts/capabilities/session/extension-bridge.ts +794 -0
  389. package/ts/capabilities/session/extension-channel.ts +144 -0
  390. package/ts/capabilities/session/extension-distribution.ts +266 -0
  391. package/ts/capabilities/session/extract.ts +54 -0
  392. package/ts/capabilities/session/golden-score.ts +139 -0
  393. package/ts/capabilities/session/health-watch.ts +264 -0
  394. package/ts/capabilities/session/read-guard.ts +141 -0
  395. package/ts/capabilities/session/static-flight-golden.ts +209 -0
  396. package/ts/capabilities/session/transport.ts +146 -0
  397. package/ts/capabilities/session/wizard.ts +140 -0
  398. package/ts/capabilities/session-consent.ts +211 -0
  399. package/ts/capabilities/session-login.ts +208 -0
  400. package/ts/capabilities/session-search.ts +893 -0
  401. package/ts/capabilities/weather.ts +330 -0
  402. package/ts/dsh-runtime/vendor/README.md +68 -0
  403. package/ts/dsh-runtime/vendor/dsh-map-tools/LICENSE +21 -0
  404. package/ts/dsh-runtime/vendor/dsh-map-tools/README.en.md +405 -0
  405. package/ts/dsh-runtime/vendor/dsh-map-tools/README.md +404 -0
  406. package/ts/dsh-runtime/vendor/dsh-map-tools/client/client.js +1584 -0
  407. package/ts/dsh-runtime/vendor/dsh-map-tools/cordis.patch.yml +5 -0
  408. package/ts/dsh-runtime/vendor/dsh-map-tools/icon.svg +5 -0
  409. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/clients/amap.js +595 -0
  410. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/clients/nominatim.js +63 -0
  411. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/clients/osrm.js +58 -0
  412. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/clients/photon.js +55 -0
  413. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/config-file.js +87 -0
  414. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/config-route.js +131 -0
  415. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/config.js +16 -0
  416. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/geo.js +232 -0
  417. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/index.js +120 -0
  418. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/settings-ns.js +40 -0
  419. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/staticmap-route.js +115 -0
  420. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/tools/geocode.js +127 -0
  421. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/tools/poi.js +84 -0
  422. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/tools/routes.js +267 -0
  423. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/clients/amap.d.ts +90 -0
  424. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/clients/nominatim.d.ts +17 -0
  425. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/clients/osrm.d.ts +15 -0
  426. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/clients/photon.d.ts +22 -0
  427. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/config-file.d.ts +33 -0
  428. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/config-route.d.ts +23 -0
  429. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/config.d.ts +23 -0
  430. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/geo.d.ts +61 -0
  431. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/index.d.ts +18 -0
  432. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/settings-ns.d.ts +14 -0
  433. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/staticmap-route.d.ts +31 -0
  434. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/tools/geocode.d.ts +11 -0
  435. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/tools/poi.d.ts +9 -0
  436. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/tools/routes.d.ts +75 -0
  437. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/types.d.ts +68 -0
  438. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types.js +16 -0
  439. package/ts/dsh-runtime/vendor/dsh-map-tools/package.json +97 -0
  440. package/ts/package.json +296 -3
  441. package/ts/scripts/async-collect.ts +91 -0
  442. package/ts/scripts/map-tools-vendor-package-proof.ts +404 -0
  443. package/ts/scripts/skeleton-check.ts +1 -1
  444. package/ts/scripts/skeleton-integration-test.ts +23 -1
  445. package/ts/scripts/state-cli.ts +568 -0
  446. package/ts/scripts/turn-handoff-collect.ts +178 -0
  447. package/ts/src/artifact-gate.ts +991 -0
  448. package/ts/src/benchmark-agent-conformance.ts +619 -0
  449. package/ts/src/benchmark-environment-bridge.ts +538 -0
  450. package/ts/src/benchmark-headless-child-diagnostics.ts +184 -0
  451. package/ts/src/benchmark-tool-isolation.ts +166 -0
  452. package/ts/src/bookable-facts.ts +837 -0
  453. package/ts/src/booking-saga.ts +133 -0
  454. package/ts/src/booking-surface/availability-policy.ts +522 -0
  455. package/ts/src/booking-surface/booking-intent.ts +86 -0
  456. package/ts/src/booking-surface/cancel-refund-commission.ts +488 -0
  457. package/ts/src/booking-surface/canonical-schema.js +116 -0
  458. package/ts/src/booking-surface/contracts.ts +475 -0
  459. package/ts/src/booking-surface/dsh-planner.ts +1949 -0
  460. package/ts/src/booking-surface/dsh-plugin.js +378 -0
  461. package/ts/src/booking-surface/dsh-worker.ts +110 -0
  462. package/ts/src/booking-surface/error-codes.ts +241 -0
  463. package/ts/src/booking-surface/index.ts +9 -0
  464. package/ts/src/booking-surface/managed-dsh-cleanup-diagnostic.ts +151 -0
  465. package/ts/src/booking-surface/managed-dsh-run-port.ts +273 -0
  466. package/ts/src/booking-surface/profile.ts +42 -0
  467. package/ts/src/booking-surface/recovery-chain.ts +409 -0
  468. package/ts/src/booking-surface/runtime.ts +1793 -0
  469. package/ts/src/booking-surface/server.ts +733 -0
  470. package/ts/src/booking-surface/startup.ts +201 -0
  471. package/ts/src/booking-surface/validation.ts +217 -0
  472. package/ts/src/companions.ts +113 -0
  473. package/ts/src/contracts.ts +13 -3
  474. package/ts/src/dsh-llm.ts +44 -11
  475. package/ts/src/flyai-setup-tool.ts +77 -0
  476. package/ts/src/index.ts +2107 -224
  477. package/ts/src/itinerary-deck.ts +189 -0
  478. package/ts/src/itinerary-doc-shared.ts +741 -0
  479. package/ts/src/itinerary-html.ts +171 -0
  480. package/ts/src/loop.ts +278 -40
  481. package/ts/src/memory-capture.ts +283 -0
  482. package/ts/src/memory-decay.ts +55 -0
  483. package/ts/src/memory-utility.ts +70 -0
  484. package/ts/src/mock-llm.ts +4 -8
  485. package/ts/src/model.ts +88 -2
  486. package/ts/src/recall/card.ts +106 -0
  487. package/ts/src/recall/evaluator.ts +170 -0
  488. package/ts/src/recall/integration.ts +35 -0
  489. package/ts/src/recall/tick.ts +213 -0
  490. package/ts/src/session-link/plan-it-action.ts +78 -0
  491. package/ts/src/session-link/session-link.ts +275 -0
  492. package/ts/src/share/adapters.ts +93 -0
  493. package/ts/src/share/share-consent.ts +105 -0
  494. package/ts/src/share/share-deck.ts +85 -0
  495. package/ts/src/share/share-token.ts +166 -0
  496. package/ts/src/slot-spec.ts +172 -0
  497. package/ts/src/state-ledger.ts +912 -0
  498. package/ts/src/subagent-job-id-guard.ts +72 -0
  499. package/ts/src/time-anchor.ts +338 -0
  500. package/ts/src/tool-packet.ts +32 -0
  501. package/ts/src/travel-slots.ts +219 -0
  502. package/ts/src/travel-timeline.ts +83 -0
  503. package/ts/src/turn-deadline.ts +366 -0
  504. package/ts/src/turn-policy.ts +154 -0
  505. package/ts/src/unified.ts +360 -89
  506. package/ts/src/wish-pool.ts +79 -0
@@ -0,0 +1,330 @@
1
+ /**
2
+ * Open-Meteo 天气能力层(免费无 key):预报 + 历史气候回退。
3
+ *
4
+ * 产品定位:替代 LLM 的「雨季常识」——季节性建议、窗口内降雨概率、
5
+ * 体感温度范围,全部走真实数据并带证据标注 [实时API:open-meteo@ts]。
6
+ *
7
+ * 契约(与 hbcli.ts 同构,能力层不变量):
8
+ * - 永不抛错:网络失败/超时/解析失败一律降级返回,不穿透到调用方;
9
+ * - 证据链标注:成功带 [实时API:open-meteo@ts],失败带 [实时API:open-meteo@error@ts];
10
+ * - 免费源无配额概念,但仍记录 latency(供 L5 成本工程度量)。
11
+ *
12
+ * 端点(全部免费,无 key):
13
+ * 预报: https://api.open-meteo.com/v1/forecast (≤16 天)
14
+ * 历史气候: https://archive-api.open-meteo.com/v1/archive (1940→,做季节性)
15
+ * 地理编码: https://geocoding-api.open-meteo.com/v1/search (地名→坐标)
16
+ */
17
+
18
+ export interface WeatherPoint {
19
+ latitude: number
20
+ longitude: number
21
+ }
22
+
23
+ export interface WeatherDaily {
24
+ date: string
25
+ tempMaxC: number
26
+ tempMinC: number
27
+ precipProbMaxPct: number | null
28
+ weatherCode: number
29
+ }
30
+
31
+ export interface WeatherResult {
32
+ ok: boolean
33
+ via: 'open-meteo' | 'open-meteo-error'
34
+ evidence: string
35
+ latencyMs: number
36
+ timezone?: string
37
+ daily?: WeatherDaily[]
38
+ error?: string
39
+ }
40
+
41
+ const FORECAST_BASE = 'https://api.open-meteo.com/v1/forecast'
42
+ const ARCHIVE_BASE = 'https://archive-api.open-meteo.com/v1/archive'
43
+ const GEOCODE_BASE = 'https://geocoding-api.open-meteo.com/v1/search'
44
+
45
+ /** WMO weather code → 中文描述(节选最常用的码) */
46
+ const WMO_ZH: Record<number, string> = {
47
+ 0: '晴', 1: '大致晴', 2: '多云', 3: '阴',
48
+ 45: '雾', 48: '冻雾',
49
+ 51: '毛毛雨', 53: '毛毛雨', 55: '密集毛毛雨',
50
+ 61: '小雨', 63: '中雨', 65: '大雨',
51
+ 66: '冻雨', 67: '强冻雨',
52
+ 71: '小雪', 73: '中雪', 75: '大雪', 77: '雪粒',
53
+ 80: '阵雨', 81: '强阵雨', 82: '暴雨',
54
+ 85: '阵雪', 86: '强阵雪',
55
+ 95: '雷暴', 96: '雷暴伴小冰雹', 99: '雷暴伴大冰雹',
56
+ }
57
+
58
+ export function wmoLabel(code: number): string {
59
+ return WMO_ZH[code] ?? `天气码${code}`
60
+ }
61
+
62
+ type FetchImpl = typeof fetch
63
+ const monotonicNow = (): number => performance.now()
64
+ const MIN_TIMER_MS = 1
65
+ const TIMEOUT_ERROR = 'timeoutMs must be a finite positive integer'
66
+ const BUDGET_EXHAUSTED_ERROR = 'total timeout budget exhausted'
67
+ const REQUEST_ERROR = 'request failed'
68
+ const normalizeTimeout = (value: number): number | null => Number.isInteger(value) && value > 0 ? value : null
69
+
70
+ /** Rejection values are untrusted: only a real string message is safe to expose. */
71
+ const normalizeError = (value: unknown): string => {
72
+ try {
73
+ if (value instanceof Error && typeof value.message === 'string' && value.message.length > 0) {
74
+ return value.message.slice(0, 200)
75
+ }
76
+ if (typeof value === 'string' && value.length > 0) return value.slice(0, 200)
77
+ } catch {
78
+ return REQUEST_ERROR
79
+ }
80
+ return REQUEST_ERROR
81
+ }
82
+
83
+ async function fetchJson(url: string, timeoutMs: number, headers: Record<string, string> = {}, fetchImpl: FetchImpl = globalThis.fetch): Promise<{ ok: boolean; data?: unknown; error?: string; timedOut?: boolean }> {
84
+ if (!Number.isFinite(timeoutMs) || timeoutMs < MIN_TIMER_MS) return { ok: false, error: BUDGET_EXHAUSTED_ERROR }
85
+ const ctrl = new AbortController()
86
+ const timerDelay = Math.floor(timeoutMs)
87
+ if (timerDelay < MIN_TIMER_MS) return { ok: false, error: BUDGET_EXHAUSTED_ERROR }
88
+ let timer: ReturnType<typeof setTimeout> | undefined
89
+ let timedOut = false
90
+ const timeout = new Promise<never>((_, reject) => {
91
+ timer = setTimeout(() => {
92
+ timedOut = true
93
+ ctrl.abort()
94
+ reject(new Error(`timeout after ${timeoutMs}ms`))
95
+ }, timerDelay)
96
+ })
97
+ const operation = (async () => {
98
+ const res = await fetchImpl(url, { signal: ctrl.signal, headers: { Accept: 'application/json', ...headers } })
99
+ if (!res.ok) return { ok: false, error: `HTTP ${res.status}` }
100
+ return { ok: true, data: await res.json() }
101
+ })()
102
+ try {
103
+ return await Promise.race([operation, timeout])
104
+ } catch (e) {
105
+ return { ok: false, error: normalizeError(e), ...(timedOut ? { timedOut: true } : {}) }
106
+ } finally {
107
+ if (timer !== undefined) clearTimeout(timer)
108
+ void operation.catch(() => undefined)
109
+ }
110
+ }
111
+
112
+ const NOMINATIM_BASE = 'https://nominatim.openstreetmap.org/search'
113
+
114
+ /** 行政级/人口重镇 feature_code(open-meteo 命名惯例):PPLC=首都 PPLA*=首府 PPLB=城镇 PPLX=区片 */
115
+ const MAJOR_FEATURE = /^(PPLC|PPLA|PPLB|PPLX)/
116
+ const isRecord = (value: unknown): value is Record<string, unknown> => value !== null && typeof value === 'object' && !Array.isArray(value)
117
+
118
+ interface GeoHitInternal {
119
+ name: string
120
+ latitude: number
121
+ longitude: number
122
+ country?: string
123
+ admin1?: string
124
+ /** 排序用:open-meteo 有 population;同名小地(村/镇)缺失时按 -1 处理 */
125
+ population: number
126
+ featureCode: string
127
+ }
128
+
129
+ function stripHits(hits: GeoHitInternal[]): Array<{ name: string; latitude: number; longitude: number; country?: string; admin1?: string }> {
130
+ return hits.map(({ name, latitude, longitude, country, admin1 }) =>
131
+ ({ ...(country ? { country } : {}), ...(admin1 ? { admin1 } : {}), name, latitude, longitude }))
132
+ }
133
+
134
+ /** 地名 → 坐标(双源,供 dsh 工具把「大理」转成经纬度):
135
+ * 1. Open-Meteo(主源):命中按人口/行政级降序——「大理」会同时命中云南州府与四川同名乡,不能盲信次序;
136
+ * 2. Nominatim(兜底):open-meteo 的中文名覆盖有洞(实测(issue #24)「普吉岛」0 结果、
137
+ * 裸词「普吉」错配西藏林芝同名村),弱命中/零结果时走 Nominatim 拿正确目标,
138
+ * 兜底仍空则回退 open-meteo 弱结果(不比此前更差)。 */
139
+ export async function geocodePlace(
140
+ name: string,
141
+ opts: { timeoutMs?: number; count?: number; fetchImpl?: FetchImpl } = {},
142
+ ): Promise<{ ok: boolean; evidence: string; via?: 'open-meteo' | 'nominatim'; results: Array<{ name: string; latitude: number; longitude: number; country?: string; admin1?: string }>; error?: string }> {
143
+ const ts = new Date().toISOString()
144
+ const count = opts.count ?? 5
145
+ const query = name.trim()
146
+ const timeoutMs = normalizeTimeout(opts.timeoutMs ?? 15_000)
147
+ if (timeoutMs === null) return { ok: false, evidence: `[实时API:open-meteo-geo@error@${ts}]`, results: [], error: TIMEOUT_ERROR }
148
+ const omUrl = `${GEOCODE_BASE}?name=${encodeURIComponent(query)}&count=${count}&language=zh&format=json`
149
+ // timeoutMs is a budget for the complete primary→fallback chain, not per request.
150
+ const deadline = monotonicNow() + timeoutMs
151
+ const remaining = (): number | null => {
152
+ const value = deadline - monotonicNow()
153
+ return Number.isFinite(value) && value >= MIN_TIMER_MS ? value : null
154
+ }
155
+ const primaryRemaining = remaining()
156
+ const r = primaryRemaining === null
157
+ ? { ok: false, error: BUDGET_EXHAUSTED_ERROR }
158
+ : await fetchJson(omUrl, primaryRemaining, {}, opts.fetchImpl)
159
+ const primaryPayload = r.ok && isRecord(r.data) && Array.isArray(r.data['results']) ? r.data['results'] : null
160
+ const omResults: GeoHitInternal[] = primaryPayload
161
+ ? primaryPayload.map((item) => {
162
+ if (!isRecord(item)) return null
163
+ const it = item as Record<string, unknown>
164
+ return {
165
+ name: String(it['name'] ?? ''),
166
+ latitude: Number(it['latitude']),
167
+ longitude: Number(it['longitude']),
168
+ country: it['country'] ? String(it['country']) : undefined,
169
+ admin1: it['admin1'] ? String(it['admin1']) : undefined,
170
+ population: Number(it['population'] ?? 0) || 0,
171
+ featureCode: String(it['feature_code'] ?? ''),
172
+ }
173
+ }).filter((h) => !!h && !!h.name && Number.isFinite(h.latitude) && Number.isFinite(h.longitude)) as GeoHitInternal[]
174
+ : []
175
+ omResults.sort((a, b) => (b.population - a.population) || (Number(MAJOR_FEATURE.test(b.featureCode)) - Number(MAJOR_FEATURE.test(a.featureCode))))
176
+ const top = omResults[0]
177
+ // 强命中:有人口规模或主要行政级,直接采信(「深圳市」「曼谷」路径不变)
178
+ if (top && (top.population > 0 || MAJOR_FEATURE.test(top.featureCode))) {
179
+ return { ok: true, evidence: `[实时API:open-meteo-geo@${ts}]`, via: 'open-meteo', results: stripHits(omResults) }
180
+ }
181
+ // 弱命中/零结果/主源请求失败:Nominatim 兜底(免费无 key;中文 accept-language)
182
+ const nomTs = new Date().toISOString()
183
+ const nomUrl = `${NOMINATIM_BASE}?q=${encodeURIComponent(query)}&format=jsonv2&limit=${count}&accept-language=zh&addressdetails=1`
184
+ const fallbackRemaining = primaryRemaining === null || r.timedOut ? null : remaining()
185
+ const nom = fallbackRemaining === null
186
+ ? { ok: false, error: BUDGET_EXHAUSTED_ERROR }
187
+ : await fetchJson(nomUrl, fallbackRemaining, { 'User-Agent': 'gotry-travel-agent/0.1 (+https://github.com/Danceiny/gotry)' }, opts.fetchImpl)
188
+ const nomResults: Array<{ name: string; latitude: number; longitude: number; country?: string; admin1?: string }> = []
189
+ if (nom.ok && Array.isArray(nom.data)) {
190
+ const parsedNom = nom.data.map((item) => {
191
+ if (!isRecord(item)) return null
192
+ const it = item as Record<string, unknown>
193
+ const addr = isRecord(it['address']) ? it['address'] : {}
194
+ const country = typeof addr['country'] === 'string' ? addr['country'] : undefined
195
+ const admin1 = [addr['province'], addr['state'], addr['county']].find(v => typeof v === 'string') as string | undefined
196
+ return { name: String(it['name'] ?? ''), latitude: Number(it['lat']), longitude: Number(it['lon']), ...(country ? { country } : {}), ...(admin1 ? { admin1 } : {}) }
197
+ }).filter((h) => !!h && !!h.name && Number.isFinite(h.latitude) && Number.isFinite(h.longitude)) as Array<{ name: string; latitude: number; longitude: number; country?: string; admin1?: string }>
198
+ nomResults.push(...parsedNom)
199
+ }
200
+ if (nomResults.length) {
201
+ const omNote = r.ok
202
+ ? `open-meteo ${omResults.length} 条弱命中(无人口/行政级,不足采信)`
203
+ : `open-meteo 失败:${r.error ?? 'HTTP error'}`
204
+ return { ok: true, evidence: `[实时API:nominatim@${nomTs}](兜底层: ${omNote})`, via: 'nominatim', results: nomResults }
205
+ }
206
+ // 双源皆空/兜底失败:open-meteo 有弱结果仍返回(同构「降级不阻塞」契约),否则维持失败终态
207
+ if (omResults.length) {
208
+ return { ok: true, evidence: `[实时API:open-meteo-geo@${ts}]`, via: 'open-meteo', results: stripHits(omResults) }
209
+ }
210
+ return {
211
+ ok: false,
212
+ evidence: `[实时API:open-meteo-geo@error@${ts}];[实时API:nominatim@error@${nomTs}]`,
213
+ results: [],
214
+ error: r.ok ? `双源无结果:${nom.error ?? 'nominatim empty'}` : (r.error),
215
+ }
216
+ }
217
+
218
+ /** 未来天气预报(≤16 天) */
219
+ export async function getForecast(
220
+ point: WeatherPoint,
221
+ opts: { days?: number; timeoutMs?: number; fetchImpl?: FetchImpl } = {},
222
+ ): Promise<WeatherResult> {
223
+ const started = monotonicNow()
224
+ const ts = new Date().toISOString()
225
+ const requestedDays = opts.days ?? 7
226
+ const days = Number.isInteger(requestedDays) && requestedDays > 0 ? Math.min(requestedDays, 16) : 0
227
+ const timeoutMs = normalizeTimeout(opts.timeoutMs ?? 15_000)
228
+ if (days < 1 || timeoutMs === null) return { ok: false, via: 'open-meteo-error', evidence: `[实时API:open-meteo@error@${ts}]`, latencyMs: monotonicNow() - started, error: days < 1 ? 'days must be valid positive values' : TIMEOUT_ERROR }
229
+ const url = `${FORECAST_BASE}?latitude=${point.latitude}&longitude=${point.longitude}`
230
+ + `&daily=temperature_2m_max,temperature_2m_min,precipitation_probability_max,weathercode`
231
+ + `&forecast_days=${days}&timezone=auto`
232
+ const r = await fetchJson(url, timeoutMs, {}, opts.fetchImpl)
233
+ const latencyMs = monotonicNow() - started
234
+ if (!r.ok) {
235
+ return { ok: false, via: 'open-meteo-error', evidence: `[实时API:open-meteo@error@${ts}]`, latencyMs, error: r.error }
236
+ }
237
+ const payload = isRecord(r.data) ? r.data : null
238
+ const daily = isRecord(payload?.['daily']) ? payload['daily'] as { time?: unknown[]; temperature_2m_max?: unknown[]; temperature_2m_min?: unknown[]; precipitation_probability_max?: unknown[]; weathercode?: unknown[] } : null
239
+ if (!daily || !Array.isArray(daily.time) || !Array.isArray(daily.temperature_2m_max)
240
+ || !Array.isArray(daily.temperature_2m_min) || !Array.isArray(daily.weathercode)
241
+ || daily.time.length !== days || daily.temperature_2m_max.length !== days
242
+ || daily.temperature_2m_min.length !== days || daily.weathercode.length !== days
243
+ || daily.time.some(v => typeof v !== 'string')
244
+ || daily.temperature_2m_max.some(v => typeof v !== 'number' || !Number.isFinite(v))
245
+ || daily.temperature_2m_min.some(v => typeof v !== 'number' || !Number.isFinite(v))
246
+ || daily.weathercode.some(v => typeof v !== 'number' || !Number.isFinite(v))
247
+ || (daily.precipitation_probability_max !== undefined && daily.precipitation_probability_max !== null
248
+ && !Array.isArray(daily.precipitation_probability_max))
249
+ || (Array.isArray(daily.precipitation_probability_max)
250
+ && (daily.precipitation_probability_max.length !== days
251
+ || daily.precipitation_probability_max.some(v => v !== null && (typeof v !== 'number' || !Number.isFinite(v)))))) {
252
+ return { ok: false, via: 'open-meteo-error', evidence: `[实时API:open-meteo@error@${ts}]`, latencyMs, error: 'empty daily payload' }
253
+ }
254
+ const times = daily.time as string[]
255
+ const maxes = daily.temperature_2m_max as number[]
256
+ const mins = daily.temperature_2m_min as number[]
257
+ const codes = daily.weathercode as number[]
258
+ const precip = Array.isArray(daily.precipitation_probability_max)
259
+ ? daily.precipitation_probability_max as Array<number | null>
260
+ : undefined
261
+ const rows: WeatherDaily[] = times.map((date, i) => ({
262
+ date, tempMaxC: maxes[i]!, tempMinC: mins[i]!, precipProbMaxPct: precip?.[i] ?? null, weatherCode: codes[i]!,
263
+ }))
264
+ return {
265
+ ok: true, via: 'open-meteo',
266
+ evidence: `[实时API:open-meteo@${ts}]`,
267
+ latencyMs,
268
+ timezone: typeof payload?.['timezone'] === 'string' ? payload['timezone'] : undefined,
269
+ daily: rows,
270
+ }
271
+ }
272
+
273
+ /** 历史气候(季节性推荐底座:去年同期日均温/降雨概率) */
274
+ export async function getClimate(
275
+ point: WeatherPoint,
276
+ month: number,
277
+ opts: { year?: number; timeoutMs?: number; fetchImpl?: FetchImpl } = {},
278
+ ): Promise<WeatherResult> {
279
+ const started = monotonicNow()
280
+ const ts = new Date().toISOString()
281
+ const timeoutMs = normalizeTimeout(opts.timeoutMs ?? 15_000)
282
+ if (timeoutMs === null) return { ok: false, via: 'open-meteo-error', evidence: `[实时API:open-meteo-climate@error@${ts}]`, latencyMs: monotonicNow() - started, error: TIMEOUT_ERROR }
283
+ // 默认取去年同月做气候基线
284
+ const year = opts.year ?? (new Date().getUTCFullYear() - 1)
285
+ if (!Number.isInteger(month) || month < 1 || month > 12 || !Number.isInteger(year) || year < 1940 || year > new Date().getUTCFullYear()) {
286
+ return { ok: false, via: 'open-meteo-error', evidence: `[实时API:open-meteo-climate@error@${ts}]`, latencyMs: monotonicNow() - started, error: 'month/year must be valid historical calendar values' }
287
+ }
288
+ const lastDay = new Date(Date.UTC(year, month, 0)).getUTCDate()
289
+ const expectedDates = Array.from({ length: lastDay }, (_, i) => `${year}-${String(month).padStart(2, '0')}-${String(i + 1).padStart(2, '0')}`)
290
+ const start = `${year}-${String(month).padStart(2, '0')}-01`
291
+ const end = `${year}-${String(month).padStart(2, '0')}-${String(lastDay).padStart(2, '0')}`
292
+ const url = `${ARCHIVE_BASE}?latitude=${point.latitude}&longitude=${point.longitude}`
293
+ + `&start_date=${start}&end_date=${end}`
294
+ + `&daily=temperature_2m_max,temperature_2m_min,precipitation_sum,weathercode&timezone=auto`
295
+ const r = await fetchJson(url, timeoutMs, {}, opts.fetchImpl)
296
+ const latencyMs = monotonicNow() - started
297
+ if (!r.ok) {
298
+ return { ok: false, via: 'open-meteo-error', evidence: `[实时API:open-meteo-climate@error@${ts}]`, latencyMs, error: r.error }
299
+ }
300
+ const payload = isRecord(r.data) ? r.data : null
301
+ const daily = isRecord(payload?.['daily']) ? payload['daily'] as { time?: unknown[]; temperature_2m_max?: unknown[]; temperature_2m_min?: unknown[]; weathercode?: unknown[] } : null
302
+ if (!daily || !Array.isArray(daily.time) || !Array.isArray(daily.temperature_2m_max)
303
+ || !Array.isArray(daily.temperature_2m_min) || !Array.isArray(daily.weathercode)
304
+ || daily.time.length !== lastDay
305
+ || daily.time.length !== daily.temperature_2m_max.length
306
+ || daily.time.length !== daily.temperature_2m_min.length
307
+ || daily.time.length !== daily.weathercode.length
308
+ || daily.time.some(v => typeof v !== 'string')
309
+ || daily.time.some((v, i) => v !== expectedDates[i])
310
+ || daily.temperature_2m_max.some(v => typeof v !== 'number' || !Number.isFinite(v))
311
+ || daily.temperature_2m_min.some(v => typeof v !== 'number' || !Number.isFinite(v))
312
+ || daily.weathercode.some(v => typeof v !== 'number' || !Number.isFinite(v))) {
313
+ return { ok: false, via: 'open-meteo-error', evidence: `[实时API:open-meteo-climate@error@${ts}]`, latencyMs, error: 'empty daily payload' }
314
+ }
315
+ const times = daily.time as string[]
316
+ const maxes = daily.temperature_2m_max as number[]
317
+ const mins = daily.temperature_2m_min as number[]
318
+ const codes = daily.weathercode as number[]
319
+ const rows: WeatherDaily[] = times.map((date, i) => ({
320
+ date, tempMaxC: maxes[i]!, tempMinC: mins[i]!, precipProbMaxPct: null, // archive 端点没有概率,用降水量另行估算
321
+ weatherCode: codes[i]!,
322
+ }))
323
+ return {
324
+ ok: true, via: 'open-meteo',
325
+ evidence: `[实时API:open-meteo-climate@${ts}]`,
326
+ latencyMs,
327
+ timezone: typeof payload?.['timezone'] === 'string' ? payload['timezone'] : undefined,
328
+ daily: rows,
329
+ }
330
+ }
@@ -0,0 +1,68 @@
1
+ # vendored dsh runtime(`vendor/`)
2
+
3
+ 本目录是 [DeepSeek Harness(dsh CLI)](https://github.com/deepseek-ai/DeepSeek-Harness)
4
+ dsh 发布家族的全量 vendored 成员,pnpm workspace 方式参与安装
5
+ (`ts/dsh-runtime/pnpm-workspace.yaml` 声明 `vendor/*`,`linkWorkspacePackages: true`)。
6
+
7
+ ## 当前版本
8
+
9
+ - 上游:`dsh-v0.1.2-alpha.1`(tag;alpha 面向 monorepo 内部,尚未发布到
10
+ npm 公共 registry——npm latest 仍为 `0.1.1-rc.2`,等上游 publish 后本目录
11
+ 可整体换回 npm 依赖形态)。
12
+ - 源 commit:`cd5ef814`(/tmp 构建树为浅克隆同源;发布 tag 见上游 releases)。
13
+ - License:MIT © DeepSeek(upstream LICENSE);本仓 MIT 使用。
14
+
15
+ ## 为什么 vendored(而不是 npm 依赖)
16
+
17
+ - 上游只挂 GitHub 预发布 tag;依赖闭包(dsh 家族 ~187 个内部包 + cordis/
18
+ schemastery 等 vendor 家族)里 **dsh 家族全部 0.1.2-alpha.1 均不在公共
19
+ npm**,外部环境不可安装。
20
+ - `ts/dsh-runtime` 只影响 repo 工作副本与 `./gotry`;npm 公共分发面
21
+ (root `package.json`)仍钉 rc.2,不受影响;CI 不安装本目录。
22
+ - workspace 成员 + `linkWorkspacePackages: true` 让成员间
23
+ `^0.1.2-alpha.1` 的 range 直接命中本地版本,干净克隆只依赖本仓文件 +
24
+ 公共 registry(第三方),不依赖内部镜像。
25
+
26
+ ## 非 dsh 家族成员:`vendor/dsh-map-tools`
27
+
28
+ `dsh-map-tools`(dshmarket 第三方宿主插件,地图/路线/POI,零 key 走
29
+ OSM/OSRM)与 dsh 家族不同源,进本目录的原因是 **npm 依赖形态被上游
30
+ peerDependencies 否决**:历史上游要求 `dsh-settings`/`dsh-tools`
31
+ `>=0.1.2-rc.1`,而 gotry 历史锁定的运行时家族是 `0.1.2-alpha.3`
32
+ (semver 上 alpha < rc)——npm/npx 严格 peer 解析直接 ERESOLVE
33
+ (optionalDependencies 也不豁免),硬依赖会弄坏 `npx @danceiny/gotry`
34
+ 主安装路径。当前锁定 `0.2.0-rc.2` 家族(issue #600):上游 `>=0.1.2-rc.1`
35
+ 开区间直接满足,npm 解析与 0.2.0 起的运行时 peer 兼容闸均通过;但继续
36
+ 保持 vendored 形态(避免在 npm 依赖面引入额外硬依赖而弄坏
37
+ `npx @danceiny/gotry` 主安装路径),vendored 副本为上游 `0.7.3`
38
+ 原样内容 + settings-ns.js 适配(SettingsForms 页策略,旧线型兼容)+ 双语 README 来源通知。vendor 副本随 tarball 分发
39
+ (root `package.json` `files[]` 含本目录),`bin/gotry-inner.js`
40
+ 解析链 vendor 优先;
41
+ 升级 = 从 npm 拉 `dsh-map-tools@<new>` 覆盖本目录(保留来源与
42
+ license:MIT,上游 package.json 里无 devDependencies 需清理;
43
+ 0.5.1→0.7.3 实操:`npm pack dsh-map-tools@0.7.3` 解包覆盖 +
44
+ 双语 README 追加 vendored 通知 + 更新 map-tools-vendor-package-proof
45
+ 的 version/fileCount/aggregateSha256)。
46
+
47
+ ## 升级/复现流程(dsh 家族,下个版本照抄)
48
+
49
+ 1. `git clone --depth 1 --branch <tag> https://github.com/deepseek-ai/DeepSeek-Harness.git /tmp/dsh-<tag>`
50
+ 2. `cd /tmp/dsh-<tag> && pnpm install && pnpm build:official`
51
+ 3. `pnpm release:pack --family dsh --out dist/dsh`(产出 241 个 tarball)
52
+ 4. 解包 tarball(`package/` 前缀剥掉)平铺进 `vendor/<kebab-name>/`
53
+ 5. manifest 归一处:**删除各成员的 `devDependencies`**(上游 devDeps 引用
54
+ 未进发布家族的 experimental 私有包,npm 安装形态本就不装 devDeps;
55
+ 唯 `@deepseek-ai/dsh-subprocess-local` 的 `postinstall` 保
56
+ 留——恢复 node-pty spawn-helper 可执行位,终局面依赖);
57
+ `scripts` 里 dev 期 `bundle/watch/build` 一并丢弃。
58
+ 6. 更新 `package.json` 的 4 个直接依赖版本 + `pnpm install` 重新生成 lockfile
59
+ 7. 验证:`./gotry help` 报版本;`cd ts && npx tsc --noEmit && npx tsx scripts/smoke.ts`;
60
+ 全量 `bash scripts/run-all-tests.sh` 全绿后才可提交。
61
+
62
+ ## 纪律
63
+
64
+ - 本目录内容必须与上游 tag 的 tarball 逐字节一致(`devDependencies`/
65
+ dev 期 `scripts` 除外);不得手改 vendor 内代码——补丁面一律走 gotry 侧
66
+ (`cordis.gotry-patch.yml` / `bin/gotry-inner.js`)。
67
+ - `gotry-state/`、`node_modules/` 已 gitignore;`vendor/` 与三份 manifest
68
+ (package.json / pnpm-lock.yaml / pnpm-workspace.yaml / .npmrc)入 git。
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 HorusJiang
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.