@danceiny/gotry 0.0.1-rc.9 → 0.2.0-rc.28

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 (533) hide show
  1. package/README.md +172 -219
  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 +1788 -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 -56
  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 +161 -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 +553 -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 +947 -110
  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 +676 -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/provider-detail-sanitize.js +64 -0
  41. package/dist/capabilities/resilience.js +191 -0
  42. package/dist/capabilities/route-provider-conformance.js +341 -0
  43. package/dist/capabilities/session/action-cache.js +50 -44
  44. package/dist/capabilities/session/adapters/ctrip-flight.js +120 -62
  45. package/dist/capabilities/session/adapters/ctrip-hotel.js +222 -0
  46. package/dist/capabilities/session/adapters/dida-portal.js +274 -0
  47. package/dist/capabilities/session/adapters/meituan-local.js +35 -54
  48. package/dist/capabilities/session/adapters/rail-12306.js +342 -0
  49. package/dist/capabilities/session/benchmark.js +189 -0
  50. package/dist/capabilities/session/bridge-ledger.js +224 -0
  51. package/dist/capabilities/session/extension-bridge.js +636 -0
  52. package/dist/capabilities/session/extension-channel.js +109 -0
  53. package/dist/capabilities/session/extension-distribution.js +230 -0
  54. package/dist/capabilities/session/extract.js +31 -21
  55. package/dist/capabilities/session/golden-score.js +114 -0
  56. package/dist/capabilities/session/health-watch.js +215 -0
  57. package/dist/capabilities/session/read-guard.js +75 -24
  58. package/dist/capabilities/session/static-flight-golden.js +150 -0
  59. package/dist/capabilities/session/transport.js +97 -83
  60. package/dist/capabilities/session/wizard.js +117 -0
  61. package/dist/capabilities/session-consent.js +178 -0
  62. package/dist/capabilities/session-login.js +170 -0
  63. package/dist/capabilities/session-search.js +635 -44
  64. package/dist/capabilities/spawn-bounded.js +203 -0
  65. package/dist/capabilities/sponsor-plugin.js +341 -0
  66. package/dist/capabilities/visa-policy.js +140 -0
  67. package/dist/capabilities/weather.js +243 -138
  68. package/dist/data/session-golden-20.json +25 -0
  69. package/dist/data/sf-golden-manifest.json +103 -0
  70. package/dist/data/sf-static-routes.json +91 -0
  71. package/dist/scripts/action-cache-tests.js +24 -59
  72. package/dist/scripts/agent-planning-turn-deadline-e2e.js +242 -0
  73. package/dist/scripts/agent-planning-turn-deadline-tests.js +185 -0
  74. package/dist/scripts/agent-reach-deep-tests.js +30 -40
  75. package/dist/scripts/agent-reach-error-tests.js +354 -0
  76. package/dist/scripts/agent-reach-tests.js +26 -18
  77. package/dist/scripts/agent-reach-wrapper-tests.js +50 -50
  78. package/dist/scripts/anything-path-measure-tests.js +133 -0
  79. package/dist/scripts/anything-path-measure.js +150 -0
  80. package/dist/scripts/anything-tests.js +250 -60
  81. package/dist/scripts/artifact-client-contract-tests.js +220 -0
  82. package/dist/scripts/artifacts-capability-tests.js +727 -0
  83. package/dist/scripts/async-collect.js +50 -11
  84. package/dist/scripts/benchmark-environment-bridge-e2e.js +741 -0
  85. package/dist/scripts/benchmark-environment-bridge-tests.js +1452 -0
  86. package/dist/scripts/booking-copilot-availability-ledger-binding-tests.js +126 -0
  87. package/dist/scripts/booking-copilot-availability-policy-tests.js +265 -0
  88. package/dist/scripts/booking-copilot-bin-proof-tests.js +66 -0
  89. package/dist/scripts/booking-copilot-cleanup-proof-helper.js +76 -0
  90. package/dist/scripts/booking-copilot-crossrepo-fixture-server.js +144 -0
  91. package/dist/scripts/booking-copilot-dsh-core-proof-tests.js +424 -0
  92. package/dist/scripts/booking-copilot-dsh-planner-proof-tests.js +2839 -0
  93. package/dist/scripts/booking-copilot-dsh-plugin-proof-tests.js +309 -0
  94. package/dist/scripts/booking-copilot-dsh-readiness-proof.js +238 -0
  95. package/dist/scripts/booking-copilot-dsh-warmer-proof.js +126 -0
  96. package/dist/scripts/booking-copilot-event-sequence-concurrency-proof-tests.js +156 -0
  97. package/dist/scripts/booking-copilot-gap-code-contract-proof-tests.js +70 -0
  98. package/dist/scripts/booking-copilot-intent-proof-tests.js +422 -0
  99. package/dist/scripts/booking-copilot-operation-ledger-concurrency-proof-tests.js +184 -0
  100. package/dist/scripts/booking-copilot-planner-live-probe.js +95 -0
  101. package/dist/scripts/booking-copilot-proof-runtime.js +42 -0
  102. package/dist/scripts/booking-copilot-receipt-ledger-concurrency-proof-tests.js +210 -0
  103. package/dist/scripts/booking-copilot-runtime-proof-tests.js +2349 -0
  104. package/dist/scripts/booking-copilot-server-proof-tests.js +784 -0
  105. package/dist/scripts/booking-copilot-startup-proof-tests.js +94 -0
  106. package/dist/scripts/booking-executor-tests.js +80 -0
  107. package/dist/scripts/booking-recovery-chain-tests.js +182 -0
  108. package/dist/scripts/booking-saga-tests.js +125 -0
  109. package/dist/scripts/booking-surface-contract-proof-tests.js +212 -0
  110. package/dist/scripts/bootstrap-tests.js +1549 -0
  111. package/dist/scripts/bridge-events-tests.js +239 -0
  112. package/dist/scripts/bridge-ledger-tests.js +428 -0
  113. package/dist/scripts/build-changelog.js +238 -0
  114. package/dist/scripts/build-metrics-report.js +331 -0
  115. package/dist/scripts/changelog-tests.js +118 -0
  116. package/dist/scripts/channel-probe-tests.js +103 -0
  117. package/dist/scripts/channel-probe.js +169 -0
  118. package/dist/scripts/channel-registry-tests.js +208 -0
  119. package/dist/scripts/city-scenario-tier-tests.js +234 -0
  120. package/dist/scripts/companion-tests.js +25 -70
  121. package/dist/scripts/dida-cookie-probe.js +87 -0
  122. package/dist/scripts/dida-runner-stop-tests.js +311 -0
  123. package/dist/scripts/dida-sw-probe.js +114 -0
  124. package/dist/scripts/diff-test.js +17 -12
  125. package/dist/scripts/doctor-tests.js +600 -0
  126. package/dist/scripts/drill-multiuser-ledger-tests.js +1076 -0
  127. package/dist/scripts/drill-sdk-descendant-cleanup-tests.js +606 -0
  128. package/dist/scripts/drill-w2a-sensor-tests.js +788 -0
  129. package/dist/scripts/dsh-artifact-e2e.js +279 -0
  130. package/dist/scripts/dsh-artifact-web-e2e.js +675 -0
  131. package/dist/scripts/dsh-http-proxy-sse-proof.js +90 -0
  132. package/dist/scripts/dsh-llm-tests.js +437 -0
  133. package/dist/scripts/dsh-runtime-closure-tests.js +182 -0
  134. package/dist/scripts/dsh-runtime-closure.js +162 -0
  135. package/dist/scripts/dsh-session-v3-migration-proof.js +109 -0
  136. package/dist/scripts/dsh-subprocess-local-proof.js +150 -0
  137. package/dist/scripts/dsh-target-closure-proof.js +178 -0
  138. package/dist/scripts/effect-tests.js +539 -0
  139. package/dist/scripts/engine-run.js +1 -3
  140. package/dist/scripts/engine-tests.js +16 -10
  141. package/dist/scripts/evaluation-cadence-tests.js +174 -0
  142. package/dist/scripts/evaluation-contract-tests.js +268 -0
  143. package/dist/scripts/extension-distribution-cli.js +39 -0
  144. package/dist/scripts/extension-distribution-tests.js +443 -0
  145. package/dist/scripts/extension-tests.js +988 -0
  146. package/dist/scripts/external-event-tests.js +350 -0
  147. package/dist/scripts/fact-gate-tests.js +869 -0
  148. package/dist/scripts/fixtures/extension-bridge-unref-child.mjs +21 -0
  149. package/dist/scripts/flight-hotel-anchor-363-registered-e2e.js +169 -0
  150. package/dist/scripts/flight-malformed-tests.js +159 -0
  151. package/dist/scripts/flyai-setup-tests.js +228 -0
  152. package/dist/scripts/flyai-setup-tool-tests.js +54 -0
  153. package/dist/scripts/flyai-tests.js +692 -0
  154. package/dist/scripts/flyai-tool-registration-contract-tests.js +91 -0
  155. package/dist/scripts/fx-contract-tests.js +201 -0
  156. package/dist/scripts/g5-guard-tests.js +150 -0
  157. package/dist/scripts/g5-guard.js +193 -0
  158. package/dist/scripts/gen-lunar-anchors.js +106 -0
  159. package/dist/scripts/geo-atlas-tests.js +283 -0
  160. package/dist/scripts/gotry-backend-kernel-tests.js +206 -0
  161. package/dist/scripts/gotry-try-demo-tests.js +79 -0
  162. package/dist/scripts/gotry-try-demo.js +49 -0
  163. package/dist/scripts/ground-transfer-tests.js +956 -0
  164. package/dist/scripts/hbcli-e2e-tests.js +159 -0
  165. package/dist/scripts/hbcli-live-optin-tests.js +96 -0
  166. package/dist/scripts/hbcli-release-contract-tests.js +122 -0
  167. package/dist/scripts/hbcli-tests.js +121 -69
  168. package/dist/scripts/health-watch-cli.js +73 -0
  169. package/dist/scripts/hotel-date-gate-tests.js +496 -0
  170. package/dist/scripts/hotelbyte-reconcile-tests.js +141 -0
  171. package/dist/scripts/hotelbyte-spawn-e2e-tests.js +373 -0
  172. package/dist/scripts/i18n-tests.js +41 -0
  173. package/dist/scripts/incident-tests.js +281 -87
  174. package/dist/scripts/issue-194-job-id-guard-tests.js +106 -0
  175. package/dist/scripts/issue-233-cancel-refund-commission-tests.js +392 -0
  176. package/dist/scripts/issue-271-liveness-tests.js +569 -0
  177. package/dist/scripts/issue-289-model-retry-real-tests.js +296 -0
  178. package/dist/scripts/issue-289-model-retry-tests.js +441 -0
  179. package/dist/scripts/issue-289-web-retry-e2e.js +630 -0
  180. package/dist/scripts/issue-338-home-city-e2e.js +577 -0
  181. package/dist/scripts/issue343-real-entry-e2e.js +160 -0
  182. package/dist/scripts/issue436-persisted-routing-e2e.js +247 -0
  183. package/dist/scripts/itinerary-artifact-tests.js +368 -0
  184. package/dist/scripts/itinerary-deck-artifact-tests.js +416 -0
  185. package/dist/scripts/itinerary-deck-export-tests.js +552 -0
  186. package/dist/scripts/itinerary-deck-tests.js +435 -0
  187. package/dist/scripts/itinerary-html-tests.js +426 -0
  188. package/dist/scripts/journey-tests.js +22 -27
  189. package/dist/scripts/kernel-manifest-evidence.js +109 -0
  190. package/dist/scripts/kernel-manifest-gate.js +126 -0
  191. package/dist/scripts/kernel-manifest-tests.js +212 -0
  192. package/dist/scripts/kernel-manifest-trace-entry.js +7 -0
  193. package/dist/scripts/kernel-manifest-trace-hook.mjs +28 -0
  194. package/dist/scripts/kernel-manifest.js +369 -0
  195. package/dist/scripts/lavish-local-tests.js +1226 -0
  196. package/dist/scripts/lavish-product-tools-tests.js +537 -0
  197. package/dist/scripts/ledger-repair-apply-tests.js +316 -0
  198. package/dist/scripts/ledger-repair-plan-tests.js +375 -0
  199. package/dist/scripts/ledger-tests.js +382 -246
  200. package/dist/scripts/ledger-workflow-crash.js +10 -20
  201. package/dist/scripts/m3-cohort-tests.js +714 -0
  202. package/dist/scripts/m3-cohort.js +310 -0
  203. package/dist/scripts/managed-dsh-cleanup-diagnostic-proof.js +184 -0
  204. package/dist/scripts/managed-dsh-close-failure-proof.js +172 -0
  205. package/dist/scripts/managed-dsh-run-port-proof.js +153 -0
  206. package/dist/scripts/managed-dsh-terminal-proof.js +252 -0
  207. package/dist/scripts/map-tools-vendor-package-proof.js +365 -0
  208. package/dist/scripts/memory-capture-tests.js +242 -61
  209. package/dist/scripts/memory-decay-tests.js +18 -52
  210. package/dist/scripts/memory-lifecycle-tests.js +657 -0
  211. package/dist/scripts/memory-lifecycle.js +196 -0
  212. package/dist/scripts/memory-metrics.js +24 -12
  213. package/dist/scripts/memory-value-report.js +631 -0
  214. package/dist/scripts/memory-value-tests.js +328 -0
  215. package/dist/scripts/metrics-report-tests.js +151 -0
  216. package/dist/scripts/model-override-e2e.js +137 -0
  217. package/dist/scripts/nightly-evidence-tests.js +203 -0
  218. package/dist/scripts/nightly-evidence.js +303 -0
  219. package/dist/scripts/nudge-digest.js +39 -28
  220. package/dist/scripts/observability-tests.js +381 -0
  221. package/dist/scripts/onboarding-tests.js +161 -0
  222. package/dist/scripts/opensky-check.js +18 -13
  223. package/dist/scripts/opensky-tests.js +28 -28
  224. package/dist/scripts/outcome-projection-tests.js +427 -0
  225. package/dist/scripts/persona-sim-tests.js +603 -0
  226. package/dist/scripts/persona-sim.js +1081 -0
  227. package/dist/scripts/persona-surface-guard-tests.js +49 -0
  228. package/dist/scripts/pnpm-dsh-closure-proof.js +17 -0
  229. package/dist/scripts/policy-anchor-359-registered-e2e.js +214 -0
  230. package/dist/scripts/price-drift-tests.js +340 -0
  231. package/dist/scripts/price-drift-watch.js +447 -0
  232. package/dist/scripts/probe-poi-tests.js +53 -45
  233. package/dist/scripts/product-metrics.js +483 -0
  234. package/dist/scripts/publish-preverify.js +110 -0
  235. package/dist/scripts/realtime-pricing-tests.js +76 -0
  236. package/dist/scripts/recall-tests.js +513 -0
  237. package/dist/scripts/replay-async.js +22 -18
  238. package/dist/scripts/replay-real.js +18 -18
  239. package/dist/scripts/replay.js +54 -82
  240. package/dist/scripts/route-provider-conformance-tests.js +391 -0
  241. package/dist/scripts/session-attach-diagnose.js +20 -20
  242. package/dist/scripts/session-attach-poc.js +34 -37
  243. package/dist/scripts/session-benchmark.js +180 -0
  244. package/dist/scripts/session-dida-live-e2e.js +199 -0
  245. package/dist/scripts/session-extract-tests.js +14 -35
  246. package/dist/scripts/session-link-tests.js +478 -0
  247. package/dist/scripts/session-login.js +27 -46
  248. package/dist/scripts/session-tests.js +796 -96
  249. package/dist/scripts/session-zone-crash.js +49 -0
  250. package/dist/scripts/session-zone-ledger-tests.js +432 -0
  251. package/dist/scripts/session-zone-observation-tests.js +492 -0
  252. package/dist/scripts/session-zone-observe.js +135 -0
  253. package/dist/scripts/session-zone-wiring-tests.js +566 -0
  254. package/dist/scripts/session-zones-tests.js +374 -0
  255. package/dist/scripts/sf-live-benchmark.js +367 -0
  256. package/dist/scripts/sf-live-challenge-stop-tests.js +453 -0
  257. package/dist/scripts/sf-live-cli-tests.js +92 -0
  258. package/dist/scripts/sf-live-options.js +46 -0
  259. package/dist/scripts/sf-manifest-tests.js +30 -0
  260. package/dist/scripts/sf-manifest.js +33 -0
  261. package/dist/scripts/sf-soft-score-tests.js +67 -0
  262. package/dist/scripts/sf-summary-tests.js +324 -0
  263. package/dist/scripts/sf-summary.js +525 -0
  264. package/dist/scripts/share-tests.js +432 -0
  265. package/dist/scripts/skeleton-check.js +16 -14
  266. package/dist/scripts/skeleton-integration-test.js +28 -11
  267. package/dist/scripts/skills-contract-tests.js +51 -46
  268. package/dist/scripts/smoke-session-gate-tests.js +21 -0
  269. package/dist/scripts/smoke.js +690 -246
  270. package/dist/scripts/spawn-bounded-abort-tests.js +244 -0
  271. package/dist/scripts/sponsor-reuse-tests.js +262 -0
  272. package/dist/scripts/state-cli-tests.js +226 -101
  273. package/dist/scripts/state-cli.js +565 -198
  274. package/dist/scripts/state-repair-cli.js +66 -0
  275. package/dist/scripts/state-repair-tests.js +140 -0
  276. package/dist/scripts/static-golden-tests.js +165 -0
  277. package/dist/scripts/time-eval-tests.js +212 -192
  278. package/dist/scripts/travel-timeline-tests.js +29 -93
  279. package/dist/scripts/turn-handoff-collect-tests.js +169 -0
  280. package/dist/scripts/turn-handoff-collect.js +161 -0
  281. package/dist/scripts/turn-policy-tests.js +55 -0
  282. package/dist/scripts/typed-contract-canary.js +176 -0
  283. package/dist/scripts/tz-resolver-sanity.js +50 -0
  284. package/dist/scripts/tz-resolver-tests.js +584 -0
  285. package/dist/scripts/unified-tests.js +60 -20
  286. package/dist/scripts/visa-policy-tests.js +62 -0
  287. package/dist/scripts/weather-tests.js +276 -41
  288. package/dist/scripts/wish-channel-gate-tests.js +54 -0
  289. package/dist/scripts/write-gate-tests.js +522 -0
  290. package/dist/scripts/z3-lifecycle-fault-tests.js +188 -0
  291. package/dist/scripts/z3-lifecycle-tests.js +170 -0
  292. package/dist/scripts/z3-race-repeat-tests.js +39 -0
  293. package/dist/scripts/z3-race-tests.js +46 -0
  294. package/dist/src/artifact-gate.js +829 -0
  295. package/dist/src/backend/kernel.js +91 -0
  296. package/dist/src/backend/modules/booking-copilot.js +92 -0
  297. package/dist/src/backend/modules/booking-executor.js +124 -0
  298. package/dist/src/backend/modules/session-search.js +551 -0
  299. package/dist/src/benchmark-agent-conformance.js +578 -0
  300. package/dist/src/benchmark-environment-bridge.js +515 -0
  301. package/dist/src/benchmark-headless-child-diagnostics.js +166 -0
  302. package/dist/src/benchmark-tool-isolation.js +151 -0
  303. package/dist/src/bookable-facts.js +533 -0
  304. package/dist/src/booking-saga.js +97 -0
  305. package/dist/src/booking-surface/availability-policy.js +697 -0
  306. package/dist/src/booking-surface/booking-intent.js +43 -0
  307. package/dist/src/booking-surface/cancel-refund-commission.js +379 -0
  308. package/dist/src/booking-surface/canonical-schema.js +116 -0
  309. package/dist/src/booking-surface/contracts.js +75 -0
  310. package/dist/src/booking-surface/dsh-planner.js +1854 -0
  311. package/dist/src/booking-surface/dsh-plugin.js +378 -0
  312. package/dist/src/booking-surface/dsh-worker.js +98 -0
  313. package/dist/src/booking-surface/error-codes.js +231 -0
  314. package/dist/src/booking-surface/index.js +9 -0
  315. package/dist/src/booking-surface/managed-dsh-cleanup-diagnostic.js +97 -0
  316. package/dist/src/booking-surface/managed-dsh-run-port.js +244 -0
  317. package/dist/src/booking-surface/profile.js +24 -0
  318. package/dist/src/booking-surface/recovery-chain.js +367 -0
  319. package/dist/src/booking-surface/runtime.js +1968 -0
  320. package/dist/src/booking-surface/server.js +674 -0
  321. package/dist/src/booking-surface/startup.js +168 -0
  322. package/dist/src/booking-surface/validation.js +261 -0
  323. package/dist/src/bridge.js +20 -13
  324. package/dist/src/city-scenario-tier.js +378 -0
  325. package/dist/src/companions.js +48 -74
  326. package/dist/src/contracts.js +21 -43
  327. package/dist/src/dsh-llm.js +171 -115
  328. package/dist/src/engine.js +276 -193
  329. package/dist/src/evaluation-cadence.js +97 -0
  330. package/dist/src/evaluation-contracts.js +283 -0
  331. package/dist/src/flight-pack-adapter.js +54 -0
  332. package/dist/src/flight-pack-contract.js +2 -0
  333. package/dist/src/flyai-setup-tool.js +70 -0
  334. package/dist/src/gotry-backend.js +125 -0
  335. package/dist/src/hotel-date-gate.js +118 -0
  336. package/dist/src/i18n.js +88 -0
  337. package/dist/src/index.js +2385 -881
  338. package/dist/src/itinerary-deck.js +139 -0
  339. package/dist/src/itinerary-doc-shared.js +661 -0
  340. package/dist/src/itinerary-html.js +131 -0
  341. package/dist/src/journey.js +155 -108
  342. package/dist/src/lavish-tools.js +400 -0
  343. package/dist/src/ledger-repair-apply.js +538 -0
  344. package/dist/src/ledger-repair-plan.js +463 -0
  345. package/dist/src/loop.js +331 -161
  346. package/dist/src/m3-cohort.js +1577 -0
  347. package/dist/src/memory-capture.js +180 -32
  348. package/dist/src/memory-decay.js +30 -14
  349. package/dist/src/memory-lifecycle.js +1310 -0
  350. package/dist/src/memory-utility.js +27 -40
  351. package/dist/src/mock-llm.js +36 -61
  352. package/dist/src/model.js +81 -36
  353. package/dist/src/outcome-projection.js +746 -0
  354. package/dist/src/realtime-pricing.js +103 -0
  355. package/dist/src/recall/card.js +74 -0
  356. package/dist/src/recall/evaluator.js +140 -0
  357. package/dist/src/recall/integration.js +17 -0
  358. package/dist/src/recall/tick.js +166 -0
  359. package/dist/src/session-link/plan-it-action.js +48 -0
  360. package/dist/src/session-link/session-link.js +248 -0
  361. package/dist/src/session-zone-ledger.js +312 -0
  362. package/dist/src/session-zone-observation.js +354 -0
  363. package/dist/src/session-zone-wiring.js +658 -0
  364. package/dist/src/session-zones.js +510 -0
  365. package/dist/src/share/adapters.js +51 -0
  366. package/dist/src/share/share-consent.js +76 -0
  367. package/dist/src/share/share-deck.js +58 -0
  368. package/dist/src/share/share-token.js +146 -0
  369. package/dist/src/slot-spec.js +84 -106
  370. package/dist/src/state-ledger.js +696 -524
  371. package/dist/src/state-repair.js +299 -0
  372. package/dist/src/subagent-job-id-guard.js +58 -0
  373. package/dist/src/time-anchor.js +231 -33
  374. package/dist/src/tool-packet.js +20 -8
  375. package/dist/src/travel-slots.js +58 -35
  376. package/dist/src/travel-timeline.js +44 -63
  377. package/dist/src/turn-deadline.js +287 -0
  378. package/dist/src/turn-policy.js +118 -0
  379. package/dist/src/tz-resolver.js +143 -0
  380. package/dist/src/unified.js +600 -360
  381. package/dist/src/wish-pool.js +42 -12
  382. package/dist/src/write-gate.js +495 -0
  383. package/dist/src/z3-shared.js +284 -0
  384. package/extension/README.md +21 -0
  385. package/extension/README.zh-CN.md +21 -0
  386. package/extension/background.js +463 -0
  387. package/extension/content-bridge.js +270 -0
  388. package/extension/content-main.js +111 -0
  389. package/extension/manifest.json +60 -0
  390. package/package.json +407 -14
  391. package/schemas/booking.intent.schema.json +193 -0
  392. package/schemas/booking.surface.schema.json +2622 -0
  393. package/ts/capabilities/agent-reach-deep.ts +114 -0
  394. package/ts/capabilities/agent-reach.ts +198 -0
  395. package/ts/capabilities/anything.ts +282 -0
  396. package/ts/capabilities/artifacts.ts +428 -0
  397. package/ts/capabilities/fact-log.ts +54 -0
  398. package/ts/capabilities/flyai-config.ts +388 -0
  399. package/ts/capabilities/flyai.ts +1274 -0
  400. package/ts/capabilities/hbcli.ts +253 -71
  401. package/ts/capabilities/incident-log.ts +88 -59
  402. package/ts/capabilities/itinerary-artifact.ts +214 -0
  403. package/ts/capabilities/itinerary-deck-artifact.ts +218 -0
  404. package/ts/capabilities/itinerary-deck-export.ts +378 -0
  405. package/ts/capabilities/opensky.ts +121 -0
  406. package/ts/capabilities/session/action-cache.ts +148 -0
  407. package/ts/capabilities/session/adapters/ctrip-flight.ts +181 -0
  408. package/ts/capabilities/session/adapters/ctrip-hotel.ts +238 -0
  409. package/ts/capabilities/session/adapters/dida-portal.ts +338 -0
  410. package/ts/capabilities/session/adapters/meituan-local.ts +70 -0
  411. package/ts/capabilities/session/adapters/rail-12306.ts +392 -0
  412. package/ts/capabilities/session/benchmark.ts +276 -0
  413. package/ts/capabilities/session/bridge-ledger.ts +333 -0
  414. package/ts/capabilities/session/extension-bridge.ts +794 -0
  415. package/ts/capabilities/session/extension-channel.ts +144 -0
  416. package/ts/capabilities/session/extension-distribution.ts +266 -0
  417. package/ts/capabilities/session/extract.ts +54 -0
  418. package/ts/capabilities/session/golden-score.ts +139 -0
  419. package/ts/capabilities/session/health-watch.ts +264 -0
  420. package/ts/capabilities/session/read-guard.ts +141 -0
  421. package/ts/capabilities/session/static-flight-golden.ts +209 -0
  422. package/ts/capabilities/session/transport.ts +146 -0
  423. package/ts/capabilities/session/wizard.ts +140 -0
  424. package/ts/capabilities/session-consent.ts +211 -0
  425. package/ts/capabilities/session-login.ts +208 -0
  426. package/ts/capabilities/session-search.ts +893 -0
  427. package/ts/capabilities/weather.ts +330 -0
  428. package/ts/dsh-runtime/vendor/README.md +68 -0
  429. package/ts/dsh-runtime/vendor/dsh-map-tools/LICENSE +21 -0
  430. package/ts/dsh-runtime/vendor/dsh-map-tools/README.en.md +405 -0
  431. package/ts/dsh-runtime/vendor/dsh-map-tools/README.md +404 -0
  432. package/ts/dsh-runtime/vendor/dsh-map-tools/client/client.js +1584 -0
  433. package/ts/dsh-runtime/vendor/dsh-map-tools/cordis.patch.yml +5 -0
  434. package/ts/dsh-runtime/vendor/dsh-map-tools/icon.svg +5 -0
  435. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/clients/amap.js +595 -0
  436. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/clients/nominatim.js +63 -0
  437. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/clients/osrm.js +58 -0
  438. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/clients/photon.js +55 -0
  439. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/config-file.js +87 -0
  440. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/config-route.js +131 -0
  441. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/config.js +16 -0
  442. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/geo.js +232 -0
  443. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/index.js +120 -0
  444. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/settings-ns.js +40 -0
  445. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/staticmap-route.js +115 -0
  446. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/tools/geocode.js +127 -0
  447. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/tools/poi.js +84 -0
  448. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/tools/routes.js +267 -0
  449. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/clients/amap.d.ts +90 -0
  450. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/clients/nominatim.d.ts +17 -0
  451. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/clients/osrm.d.ts +15 -0
  452. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/clients/photon.d.ts +22 -0
  453. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/config-file.d.ts +33 -0
  454. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/config-route.d.ts +23 -0
  455. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/config.d.ts +23 -0
  456. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/geo.d.ts +61 -0
  457. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/index.d.ts +18 -0
  458. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/settings-ns.d.ts +14 -0
  459. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/staticmap-route.d.ts +31 -0
  460. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/tools/geocode.d.ts +11 -0
  461. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/tools/poi.d.ts +9 -0
  462. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/tools/routes.d.ts +75 -0
  463. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/types.d.ts +68 -0
  464. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types.js +16 -0
  465. package/ts/dsh-runtime/vendor/dsh-map-tools/package.json +97 -0
  466. package/ts/package.json +293 -3
  467. package/ts/scripts/async-collect.ts +91 -0
  468. package/ts/scripts/map-tools-vendor-package-proof.ts +404 -0
  469. package/ts/scripts/skeleton-check.ts +1 -1
  470. package/ts/scripts/skeleton-integration-test.ts +23 -1
  471. package/ts/scripts/state-cli.ts +586 -0
  472. package/ts/scripts/turn-handoff-collect.ts +178 -0
  473. package/ts/src/artifact-gate.ts +991 -0
  474. package/ts/src/benchmark-agent-conformance.ts +619 -0
  475. package/ts/src/benchmark-environment-bridge.ts +538 -0
  476. package/ts/src/benchmark-headless-child-diagnostics.ts +184 -0
  477. package/ts/src/benchmark-tool-isolation.ts +166 -0
  478. package/ts/src/bookable-facts.ts +837 -0
  479. package/ts/src/booking-saga.ts +133 -0
  480. package/ts/src/booking-surface/availability-policy.ts +522 -0
  481. package/ts/src/booking-surface/booking-intent.ts +86 -0
  482. package/ts/src/booking-surface/cancel-refund-commission.ts +488 -0
  483. package/ts/src/booking-surface/canonical-schema.js +116 -0
  484. package/ts/src/booking-surface/contracts.ts +475 -0
  485. package/ts/src/booking-surface/dsh-planner.ts +1949 -0
  486. package/ts/src/booking-surface/dsh-plugin.js +378 -0
  487. package/ts/src/booking-surface/dsh-worker.ts +110 -0
  488. package/ts/src/booking-surface/error-codes.ts +241 -0
  489. package/ts/src/booking-surface/index.ts +9 -0
  490. package/ts/src/booking-surface/managed-dsh-cleanup-diagnostic.ts +151 -0
  491. package/ts/src/booking-surface/managed-dsh-run-port.ts +273 -0
  492. package/ts/src/booking-surface/profile.ts +42 -0
  493. package/ts/src/booking-surface/recovery-chain.ts +409 -0
  494. package/ts/src/booking-surface/runtime.ts +1793 -0
  495. package/ts/src/booking-surface/server.ts +733 -0
  496. package/ts/src/booking-surface/startup.ts +201 -0
  497. package/ts/src/booking-surface/validation.ts +217 -0
  498. package/ts/src/companions.ts +113 -0
  499. package/ts/src/contracts.ts +17 -3
  500. package/ts/src/dsh-llm.ts +152 -17
  501. package/ts/src/flyai-setup-tool.ts +77 -0
  502. package/ts/src/index.ts +2123 -200
  503. package/ts/src/itinerary-deck.ts +189 -0
  504. package/ts/src/itinerary-doc-shared.ts +741 -0
  505. package/ts/src/itinerary-html.ts +171 -0
  506. package/ts/src/loop.ts +234 -26
  507. package/ts/src/memory-capture.ts +283 -0
  508. package/ts/src/memory-decay.ts +55 -0
  509. package/ts/src/memory-utility.ts +70 -0
  510. package/ts/src/mock-llm.ts +4 -8
  511. package/ts/src/model.ts +88 -2
  512. package/ts/src/recall/card.ts +106 -0
  513. package/ts/src/recall/evaluator.ts +170 -0
  514. package/ts/src/recall/integration.ts +35 -0
  515. package/ts/src/recall/tick.ts +213 -0
  516. package/ts/src/session-link/plan-it-action.ts +78 -0
  517. package/ts/src/session-link/session-link.ts +275 -0
  518. package/ts/src/share/adapters.ts +93 -0
  519. package/ts/src/share/share-consent.ts +105 -0
  520. package/ts/src/share/share-deck.ts +85 -0
  521. package/ts/src/share/share-token.ts +166 -0
  522. package/ts/src/slot-spec.ts +172 -0
  523. package/ts/src/state-ledger.ts +1166 -0
  524. package/ts/src/subagent-job-id-guard.ts +72 -0
  525. package/ts/src/time-anchor.ts +338 -0
  526. package/ts/src/tool-packet.ts +32 -0
  527. package/ts/src/travel-slots.ts +219 -0
  528. package/ts/src/travel-timeline.ts +83 -0
  529. package/ts/src/turn-deadline.ts +366 -0
  530. package/ts/src/turn-policy.ts +154 -0
  531. package/ts/src/unified.ts +444 -105
  532. package/ts/src/wish-pool.ts +79 -0
  533. package/dist/scripts/session-attach-wait.js +0 -41
@@ -0,0 +1,338 @@
1
+ /**
2
+ * Dida 供应商门户站点适配器(2026-09-09 实装;hotel-be portal integration 迁移线:
3
+ * 员工子账号免知凭据访问供应商 portal——登录经 hotel-be portal 自动填充跳板在
4
+ * dida 官网由人完成,gotry 只在用户本人 Chrome 登录态里被动嗅探检索回包)。
5
+ *
6
+ * - entry:https://portal.dida.com/hotel/find(SPA,页内交互触发检索;深链参数
7
+ * 形态未知——D-13 同款边界,首个真会话后校准)
8
+ * - networkHints:portal-webapi.dida.com 实时价/价格监控 XHR(接口名取自
9
+ * hotel-be supplier/integration/dida/portal 已捕获端点,2026-07 抓包校准);
10
+ * URL hint 未命中时由 content-main 的形状嗅探兜底(响应 JSON 含报价签名即
11
+ * 转发),对接口改名免疫
12
+ * - 解析:SearchRealTime 信封(Envelope{Data.HotelPriceList[].RoomTypeList[]
13
+ * .RatePlanList[]})逐报价展平;SearchMonitor 响应形状未捕获前不猜测——
14
+ * 只按 URL 命中转发、解析留给首个真会话校准(D-13)
15
+ *
16
+ * 只读:适配器不含任何提交/预订语义;预订面(PriceConfirm 等)URL 属 hotel-be
17
+ * 适配器边界,gotry 侧不存在对应原语;登录语义红线同全局:gotry 永不读取/存储/
18
+ * 回传 cookie 值,只读票据 cookie 名(CN_M_DidaTravel)存在性。
19
+ */
20
+
21
+ /** 票据 cookie 名(hotel-be portal 会话同款 HttpOnly cookie;只读名字,永不读值) */
22
+ export const DIDA_LOGIN_COOKIE_NAMES = ['CN_M_DidaTravel']
23
+
24
+ /** page 域(content_scripts 注入面与 background 白名单的对账源) */
25
+ export const DIDA_SITE_HOST = 'portal.dida.com'
26
+ /** cookie 域(chrome.cookies 过滤器与登录票据检查;did a 站点 cookie 挂 .dida.com 域 cookie) */
27
+ export const DIDA_SITE_DOMAIN = 'dida.com'
28
+
29
+ /** 默认检索入口(酒店 find 页;SPA 加载后由页面自身代码发起价格检索) */
30
+ export const DIDA_ENTRY_URL = 'https://portal.dida.com/hotel/find'
31
+
32
+ export interface DidaEntry {
33
+ ok: boolean
34
+ url?: string
35
+ }
36
+
37
+ export interface DidaEntryQuery {
38
+ /** 显式覆盖入口 URL(深链参数校准后使用;必须落在 portal.dida.com 域内) */
39
+ entryUrl?: string
40
+ }
41
+
42
+ /** entry 构造(v1:固定 find 页 + 显式覆盖守白名单域;URL 直开即零 DOM 交互) */
43
+ export function buildDidaEntryUrl(q: DidaEntryQuery = {}): DidaEntry {
44
+ const url = (q.entryUrl ?? '').trim() || DIDA_ENTRY_URL
45
+ if (!/^https:\/\/portal\.dida\.com\//.test(url)) return { ok: false }
46
+ return { ok: true, url }
47
+ }
48
+
49
+ /** networkHints:portal-webapi.dida.com 实时价/价格监控 XHR(2026-07 抓包口径;
50
+ * 首个真会话后按现行接口校准——D-13 同款边界) */
51
+ export const DIDA_NETWORK_HINTS = [
52
+ /portal-webapi\.dida\.com\/HotelPriceAPI\/SearchRealTime/i,
53
+ /portal-webapi\.dida\.com\/HotelPriceAPI\/SearchMonitor/i,
54
+ // 2026-09-21 实测:/hotel/list(按城市+日期的搜索结果页)的价格面是 SearchCache,
55
+ // Data.HotelPriceList[] = 每家酒店 + 该查询下的总价(房间级明细不在此面)。
56
+ /portal-webapi\.dida\.com\/HotelPriceAPI\/SearchCache/i,
57
+ // 2026-09-10 UAT 实测校准:find 页加载态自发的是推荐流(非 SearchRealTime——
58
+ // 那是用户点「预订」后的实时价接口)。推荐酒店 + 推荐价格两个接口成对出现。
59
+ /portal-webapi\.dida\.com\/HotelRecommendAPI\/SearchHomepageRecommendHotels/i,
60
+ /portal-webapi\.dida\.com\/HotelRecommendAPI\/SearchHomepageRecommendPrices/i,
61
+ /portal-webapi\.dida\.com\/PopularDestinationAPI\/SearchHotels/i,
62
+ /portal-webapi\.dida\.com\/PopularDestinationAPI\/SearchHotelPrices/i,
63
+ ]
64
+
65
+ /** 形状嗅探签名:URL hint 未命中时的兜底(实时价信封报价签名,对接口改名免疫);
66
+ * 大小上限由调用方先把关 */
67
+ export function looksLikeDidaRatesBody(body: string): boolean {
68
+ if (!body || body.length > 2_000_000) return false
69
+ return /"HotelPriceList"|"RatePlanList"/.test(body)
70
+ }
71
+
72
+ /**
73
+ * SearchCache(列表页价格面,2026-09-21 实测) → 报价列表。
74
+ *
75
+ * 形态:Data.HotelPriceList[].{Hotel:{HotelID,Name,Name_EN,StarRating,Address,CityName},
76
+ * TotalPrice, Currency, RatePlanPriceList(列表页为空)}——**每家酒店只给该查询下的总价**,
77
+ * 房间级明细要详情面(SearchRealTime)。用于「按城市+日期」比价,正好是比价需要的最小信息。
78
+ *
79
+ * nights > 1 时按晚均摊出 price(nights 由调用方按查询给出;缺省视为 1 晚)。
80
+ */
81
+ export function parseDidaSearchCache(
82
+ body: string,
83
+ opts: { maxItems?: number; nights?: number } = {},
84
+ ): SessionDidaRateOption[] {
85
+ let raw: unknown
86
+ try {
87
+ raw = JSON.parse(body)
88
+ } catch {
89
+ return []
90
+ }
91
+ const list = (raw as { Data?: { HotelPriceList?: unknown } })?.Data?.HotelPriceList
92
+ if (!Array.isArray(list)) return []
93
+ const maxItems = opts.maxItems ?? 60
94
+ const nights = Math.max(1, Math.floor(opts.nights ?? 1))
95
+ const out: SessionDidaRateOption[] = []
96
+ for (const item of list) {
97
+ if (out.length >= maxItems || item == null || typeof item !== 'object') continue
98
+ const row = item as Record<string, unknown>
99
+ const hotel = (row.Hotel != null && typeof row.Hotel === 'object' ? row.Hotel : {}) as Record<string, unknown>
100
+ const hotelId = hotel.HotelID != null ? String(hotel.HotelID) : ''
101
+ if (!hotelId) continue
102
+ const total = typeof row.TotalPrice === 'number' ? row.TotalPrice : 0
103
+ const nameCn = typeof hotel.Name === 'string' ? hotel.Name.trim() : ''
104
+ const nameEn = typeof hotel.Name_EN === 'string' ? hotel.Name_EN.trim() : ''
105
+ const perNight = total > 0 && nights > 1 ? Math.round(total / nights) : total
106
+ const num = (v: unknown): number | undefined => (typeof v === 'number' && Number.isFinite(v) ? v : undefined)
107
+ const str = (v: unknown): string | undefined => {
108
+ const t = typeof v === 'string' ? v.trim() : ''
109
+ return t || undefined
110
+ }
111
+ const images = Array.isArray(hotel.HotelImageList) ? (hotel.HotelImageList as Array<Record<string, unknown>>) : []
112
+ const firstImage = images.map((i) => str(i?.ImageUrl)).find((u): u is string => Boolean(u))
113
+ out.push({
114
+ hotelId,
115
+ hotelName: nameCn || nameEn || undefined,
116
+ price: perNight,
117
+ ...(total > 0 ? { totalPrice: total } : {}),
118
+ ...(typeof row.Currency === 'string' ? { currency: row.Currency } : {}),
119
+ ...(nameEn && nameEn !== nameCn ? { hotelNameEn: nameEn } : {}),
120
+ ...(num(hotel.StarRating) !== undefined ? { starRating: num(hotel.StarRating) } : {}),
121
+ ...(str(hotel.AddressFull) || str(hotel.Address) ? { address: str(hotel.AddressFull) ?? str(hotel.Address) } : {}),
122
+ ...(str(hotel.CityName) ? { cityName: str(hotel.CityName) } : {}),
123
+ ...(str(hotel.CountryCode) ? { countryCode: str(hotel.CountryCode) } : {}),
124
+ ...(str(hotel.ChainName) ? { chainName: str(hotel.ChainName) } : {}),
125
+ ...(num(hotel.Latitude) !== undefined ? { latitude: num(hotel.Latitude) } : {}),
126
+ ...(num(hotel.Longitude) !== undefined ? { longitude: num(hotel.Longitude) } : {}),
127
+ ...(firstImage ? { imageUrl: firstImage } : {}),
128
+ })
129
+ }
130
+ return out
131
+ }
132
+
133
+ // ── 现行加载态接口(2026-09-10 校准):推荐酒店 + 推荐价格 ──────────────────
134
+
135
+ export interface DidaRecommendHotel {
136
+ hotelId: string
137
+ name: string
138
+ nameEN?: string
139
+ }
140
+
141
+ /** 解析推荐酒店列表(Data.Hotels[]:HotelID/Name/Name_CN/Name_EN;Current 页加载态无价) */
142
+ export function parseDidaRecommendHotels(body: string, opts: { maxItems?: number } = {}): DidaRecommendHotel[] {
143
+ let raw: unknown
144
+ try { raw = JSON.parse(body) } catch { return [] }
145
+ const hotels = (raw as { Data?: { Hotels?: unknown } })?.Data?.Hotels
146
+ if (!Array.isArray(hotels)) return []
147
+ const out: DidaRecommendHotel[] = []
148
+ for (const item of hotels.slice(0, opts.maxItems ?? 60)) {
149
+ if (item == null || typeof item !== 'object') continue
150
+ const h = item as Record<string, unknown>
151
+ const hotelId = h.HotelID != null ? String(h.HotelID) : ''
152
+ const name = typeof h.Name_CN === 'string' && h.Name_CN.trim() ? h.Name_CN : (typeof h.Name === 'string' ? h.Name : '')
153
+ if (!hotelId || !name) continue
154
+ out.push({ hotelId, name, nameEN: typeof h.Name_EN === 'string' ? h.Name_EN : undefined })
155
+ }
156
+ return out
157
+ }
158
+
159
+ export interface DidaPriceEntry {
160
+ hotelId: string
161
+ price: number
162
+ originalPrice?: number
163
+ currency?: string
164
+ /** 单晚起始价对应日期(YYYY-MM-DD) */
165
+ priceDate?: string
166
+ checkInDate?: string
167
+ checkOutDate?: string
168
+ }
169
+
170
+ // (parser types continue below)
171
+
172
+ /** 解析价格列表:兼容 Recommend Prices(HotelId/Date)与 PopularDestination(HotelID/CheckInDate)两种键形 */
173
+ export function parseDidaPrices(body: string): DidaPriceEntry[] {
174
+ let raw: unknown
175
+ try { raw = JSON.parse(body) } catch { return [] }
176
+ const prices = (raw as { Data?: { Prices?: unknown } })?.Data?.Prices
177
+ if (!Array.isArray(prices)) return []
178
+ const out: DidaPriceEntry[] = []
179
+ for (const item of prices) {
180
+ if (item == null || typeof item !== 'object') continue
181
+ const p = item as Record<string, unknown>
182
+ const hotelId = p.HotelId != null ? String(p.HotelId) : (p.HotelID != null ? String(p.HotelID) : '')
183
+ const price = typeof p.Price === 'number' ? p.Price : NaN
184
+ if (!hotelId || !Number.isFinite(price) || price <= 0) continue
185
+ const dateOf = (v: unknown): string | undefined => (typeof v === 'string' && v.length >= 10 ? v.slice(0, 10) : undefined)
186
+ out.push({
187
+ hotelId,
188
+ price,
189
+ originalPrice: typeof p.OriginalPrice === 'number' ? p.OriginalPrice : undefined,
190
+ currency: typeof p.Currency === 'string' ? p.Currency : undefined,
191
+ priceDate: dateOf(p.Date),
192
+ checkInDate: dateOf(p.CheckInDate),
193
+ checkOutDate: dateOf(p.CheckOutDate),
194
+ })
195
+ }
196
+ return out
197
+ }
198
+
199
+ /** 单条报价(一房一价一计划;语义判定在工具层,本层只归形状——页面 JSON 是不可信输入) */
200
+ export interface SessionDidaRateOption {
201
+ hotelId?: string
202
+ hotelName?: string
203
+ roomTypeId?: string
204
+ roomName?: string
205
+ /** 英文房型名(门户 DidaRoomTypeName_EN;缺失时不编造) */
206
+ roomNameEn?: string
207
+ ratePlanId?: string
208
+ /** 单价(数值不可得时为 0) */
209
+ price: number
210
+ /** 总价(含税费口径以 dida 页面为准) */
211
+ totalPrice?: number
212
+ currency?: string
213
+ mealType?: string
214
+ breakfastType?: string
215
+ bedType?: string
216
+ paymentType?: string
217
+ /** 库存/可订间数(0=未给) */
218
+ inventory?: number
219
+ /** 检索续期令牌(dida 报价引用号;服务端预订链凭此续操作) */
220
+ referenceNo?: string
221
+ /** 酒店详情落地页(由人完成预订;gotry 不碰) */
222
+ jumpUrl?: string
223
+ /** 推荐价对应日期(YYYY-MM-DD;推荐流单晚起始价) */
224
+ priceDate?: string
225
+ // ── 卡片展示字段(2026-09-21 hotel-fe#3731:参考 hotelList 卡片完整展示) ──
226
+ /** 英文名(门户 Name_EN;多语言展示按 UI 语言二选一) */
227
+ hotelNameEn?: string
228
+ /** 星级(门户 StarRating) */
229
+ starRating?: number
230
+ /** 地址(优先 AddressFull) */
231
+ address?: string
232
+ /** 城市名(门户 CityName) */
233
+ cityName?: string
234
+ /** 国家二字码(门户 CountryCode) */
235
+ countryCode?: string
236
+ /** 连锁品牌(门户 ChainName) */
237
+ chainName?: string
238
+ latitude?: number
239
+ longitude?: number
240
+ /** 首图(门户 image-cdn 绝对地址;可直接渲染) */
241
+ imageUrl?: string
242
+ }
243
+
244
+ interface RateCandidate {
245
+ hotelId?: string
246
+ hotelName?: string
247
+ roomTypeId?: string
248
+ roomName?: string
249
+ roomNameEn?: string
250
+ plan: Record<string, unknown>
251
+ }
252
+
253
+ /** 从 RoomTypePrice 展平一条报价候选(RatePlanList 元素为 dida 已知形态);
254
+ * 酒店字段取 HotelPriceItem.Hotel 嵌套(HotelStatic),容忍旧式扁平形态 */
255
+ function rateCandidate(hotel: Record<string, unknown>, room: Record<string, unknown>, plan: Record<string, unknown>): RateCandidate | null {
256
+ if (plan == null || typeof plan !== 'object') return null
257
+ const ratePlanId = plan.RatePlanID
258
+ const price = plan.Price
259
+ const totalPrice = plan.TotalPrice
260
+ if (typeof ratePlanId !== 'string' || !ratePlanId.trim()) return null
261
+ if (typeof price !== 'number' && typeof totalPrice !== 'number') return null
262
+ const hotelStatic = (hotel.Hotel != null && typeof hotel.Hotel === 'object' ? hotel.Hotel : hotel) as Record<string, unknown>
263
+ const hotelId = hotelStatic.HotelID
264
+ const roomTypeId = room.DidaRoomTypeID
265
+ return {
266
+ hotelId: hotelId != null ? String(hotelId) : undefined,
267
+ hotelName: typeof hotelStatic.Name === 'string' ? hotelStatic.Name : undefined,
268
+ roomTypeId: roomTypeId != null ? String(roomTypeId) : undefined,
269
+ roomName: typeof room.DidaRoomTypeName_CN === 'string' && room.DidaRoomTypeName_CN.trim()
270
+ ? room.DidaRoomTypeName_CN
271
+ : (typeof room.DidaRoomTypeName_EN === 'string' ? room.DidaRoomTypeName_EN : undefined),
272
+ roomNameEn: typeof room.DidaRoomTypeName_EN === 'string' && room.DidaRoomTypeName_EN.trim()
273
+ ? room.DidaRoomTypeName_EN
274
+ : undefined,
275
+ plan,
276
+ }
277
+ }
278
+
279
+ /** 走形:SearchRealTime 信封 → 展平报价列表(纯函数,fixture 测试锚点);
280
+ * malformed 一律返空,不抛错——页面/接口 JSON 是不可信输入(RFC §3.5) */
281
+ export function parseDidaRates(body: string, opts: { maxItems?: number } = {}): SessionDidaRateOption[] {
282
+ let raw: unknown
283
+ try {
284
+ raw = JSON.parse(body)
285
+ } catch {
286
+ return []
287
+ }
288
+ const maxItems = opts.maxItems ?? 40
289
+ const out: SessionDidaRateOption[] = []
290
+ // 定位 HotelPriceList:信封顶层 Data 下;无信封时容忍裸数组形态
291
+ let hotelList: unknown
292
+ if (raw != null && typeof raw === 'object' && !Array.isArray(raw)) {
293
+ const data = (raw as Record<string, unknown>).Data
294
+ if (data != null && typeof data === 'object') hotelList = (data as Record<string, unknown>).HotelPriceList
295
+ } else if (Array.isArray(raw)) {
296
+ hotelList = raw
297
+ }
298
+ if (!Array.isArray(hotelList)) return out
299
+ for (const item of hotelList) {
300
+ if (out.length >= maxItems || item == null || typeof item !== 'object') continue
301
+ const hotel = item as Record<string, unknown>
302
+ // RoomTypeList 与 RoomList 是合并关系(hotel-be converter 两表都吃),不是二选一
303
+ const rooms = [
304
+ ...(Array.isArray(hotel.RoomTypeList) ? hotel.RoomTypeList : []),
305
+ ...(Array.isArray(hotel.RoomList) ? hotel.RoomList : []),
306
+ ]
307
+ for (const room of rooms) {
308
+ if (out.length >= maxItems || room == null || typeof room !== 'object') continue
309
+ const plans = (room as Record<string, unknown>).RatePlanList
310
+ if (!Array.isArray(plans)) continue
311
+ for (const plan of plans) {
312
+ if (out.length >= maxItems) return out
313
+ const cand = rateCandidate(hotel, room as Record<string, unknown>, plan as Record<string, unknown>)
314
+ if (!cand) continue
315
+ const p = cand.plan
316
+ out.push({
317
+ hotelId: cand.hotelId,
318
+ hotelName: cand.hotelName,
319
+ roomTypeId: cand.roomTypeId,
320
+ roomName: cand.roomName,
321
+ roomNameEn: cand.roomNameEn,
322
+ ratePlanId: typeof p.RatePlanID === 'string' ? p.RatePlanID : undefined,
323
+ price: typeof p.Price === 'number' ? p.Price : 0,
324
+ totalPrice: typeof p.TotalPrice === 'number' ? p.TotalPrice : undefined,
325
+ currency: typeof p.Currency === 'string' ? p.Currency : undefined,
326
+ mealType: typeof p.MealType === 'string' ? p.MealType : undefined,
327
+ breakfastType: typeof p.BreakfastType === 'string' ? p.BreakfastType : undefined,
328
+ bedType: typeof p.BedType === 'string' ? p.BedType : undefined,
329
+ paymentType: typeof p.PaymentType === 'string' ? p.PaymentType : undefined,
330
+ inventory: typeof p.Inventory === 'number' ? p.Inventory : (typeof p.RoomCount === 'number' ? p.RoomCount : undefined),
331
+ referenceNo: typeof p.ReferenceNo === 'string' ? p.ReferenceNo : undefined,
332
+ jumpUrl: cand.hotelId ? `https://portal.dida.com/hotel/find` : undefined,
333
+ })
334
+ }
335
+ }
336
+ }
337
+ return out
338
+ }
@@ -0,0 +1,70 @@
1
+ /**
2
+ * 美团本地适配器骨架(民宿/门票——官方通道盲区,RFC §3.1)。
3
+ *
4
+ * 实测边界(2026-08-28 tick):匿名实例 hotel.meituan.com 直接 403——三站中最强反爬,
5
+ * **登录态是硬前置**(founder 纠偏「不能匿名实例」在美团侧是 403 级事实,非策略偏好)。
6
+ * 本骨架:entry 城市拼音表 + 登录票据名单 + networkHint 占位;live 接口形状待用户登录态
7
+ * (profile 内用户自登美团)后由心跳轮实测回填——在此之前 parse 返回空、verdict=miss。
8
+ */
9
+
10
+ /** 城市拼音表(美团 URL 路径段;与 ctrip-flight 城市码表同界:词表外 unresolved 不猜) */
11
+ const CITY_SLUGS: Record<string, string> = {
12
+ 上海: 'shanghai', 北京: 'beijing', 广州: 'guangzhou', 深圳: 'shenzhen', 成都: 'chengdu',
13
+ 昆明: 'kunming', 大理: 'dali', 丽江: 'lijiang', 西安: 'xian', 杭州: 'hangzhou',
14
+ 三亚: 'sanya', 厦门: 'xiamen', 重庆: 'chongqing', 青岛: 'qingdao', 长沙: 'changsha',
15
+ 武汉: 'wuhan', 南京: 'nanjing', 郑州: 'zhengzhou', 贵阳: 'guiyang', 桂林: 'guilin',
16
+ }
17
+
18
+ export const SITE_DOMAIN = 'meituan.com'
19
+ /** 登录票据 cookie 名单(公开常识:lt=login ticket/u=uid/token;登录后校准,同 ctrip 侧做法) */
20
+ export const LOGIN_COOKIE_NAMES = ['lt', 'u', 'token', 'n']
21
+
22
+ export type MeituanVertical = 'hotel' | 'minsu'
23
+
24
+ export interface MeituanEntry {
25
+ ok: boolean
26
+ url?: string
27
+ unresolved?: string[]
28
+ }
29
+
30
+ export function buildMeituanEntry(city: string, vertical: MeituanVertical, keyword?: string): MeituanEntry {
31
+ const slug = CITY_SLUGS[city]
32
+ if (!slug) return { ok: false, unresolved: [city] }
33
+ const base = vertical === 'hotel' ? `https://hotel.meituan.com/${slug}/` : `https://minsu.meituan.com/${slug}/`
34
+ return { ok: true, url: keyword ? base + `?q=${encodeURIComponent(keyword)}` : base }
35
+ }
36
+
37
+ /** networkHint 占位:登录态实测后回填真实搜索接口 pattern(当前为空=嗅探层不命中,a11y 兜底接管) */
38
+ export const NETWORK_HINTS: RegExp[] = []
39
+
40
+ export interface MeituanListingOption {
41
+ name: string
42
+ price: number
43
+ /** 元数据行(位置/评分/房型,来自 a11y 条目) */
44
+ meta?: string
45
+ }
46
+
47
+ /** XHR JSON 解析占位:接口形状实测回填前恒返空(调用方走 a11y 兜底) */
48
+ export function parseMeituanSearch(_body: string): MeituanListingOption[] {
49
+ void _body
50
+ return []
51
+ }
52
+
53
+ /**
54
+ * a11y 兜底:从快照条目抽「名称+价格」候选(纯函数;供 extract.ts 条目流消费)。
55
+ * 形状规则:名称=非空 heading/listitem/link;价格=条目名内 ¥\d+(宽松元级);不做语义猜测。
56
+ */
57
+ export function extractListings(entries: Array<{ role: string; name: string }>, opts: { max?: number } = {}): MeituanListingOption[] {
58
+ const out: MeituanListingOption[] = []
59
+ const roles = new Set(['heading', 'listitem', 'link', 'article'])
60
+ for (const e of entries) {
61
+ if (out.length >= (opts.max ?? 30)) break
62
+ if (!roles.has(e.role) || !e.name) continue
63
+ const pm = /¥\s*(\d+)/.exec(e.name)
64
+ if (!pm) continue
65
+ const name = e.name.replace(/¥\s*\d+.*$/, '').trim().slice(0, 80)
66
+ if (!name) continue
67
+ out.push({ name, price: Number(pm[1]) })
68
+ }
69
+ return out
70
+ }