@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,125 @@
1
+ /**
2
+ * gotry-backend 统一入口(founder 口径:「我只允许一个 gotry 包装出来的服务」)。
3
+ *
4
+ * 一个进程、一个 HTTP 服务面;能力 = 模块(booking-copilot、session-search,后续
5
+ * a2a 协议端口亦归此服务),模块自带鉴权/探活,内核只做路由分发。hotel-be 是
6
+ * 外层 BFF,只认本服务。
7
+ *
8
+ * 端口:GOTRY_BACKEND_PORT > GOTRY_BOOKING_COPILOT_PORT > 3082(向后兼容:
9
+ * 默认与既有 booking-copilot 部署同端口,路由合同不变,hotel-be BFF 零改动)。
10
+ *
11
+ * 环境变量:
12
+ * booking-copilot 模块:GOTRY_BOOKING_COPILOT_API_KEY/STATE_ROOT/INGRESS_MODE/
13
+ * ARTIFACT_ID + DEEPSEEK/LLM keys(dsh planner,同独立部署)
14
+ * session-search 模块:GOTRY_BACKEND_SESSION_API_KEY(缺 = 该模块 fail-closed 503)、
15
+ * GOTRY_SESSION_TRANSPORT=cdp、CHROME_USER_DATA_DIR、GOTRY_SESSION_AUDIT_PATH、
16
+ * GOTRY_BACKEND_STATE_ROOT(桥作业账本根,缺省 '.';账本文件 <stateRoot>/gotry-state/bridge.db)
17
+ *
18
+ * 运行:node bin/gotry-backend.js(编译产物)或 tsx ts/src/gotry-backend.ts(源码形态)。
19
+ */
20
+ import { startBookingCopilotModule } from './backend/modules/booking-copilot.js';
21
+ import { startBookingExecutorModule } from './backend/modules/booking-executor.js';
22
+ import { startSessionSearchModule } from './backend/modules/session-search.js';
23
+ import { resolve } from 'node:path';
24
+ import { fileURLToPath } from 'node:url';
25
+ import { closeBackend, createBackendServer } from './backend/kernel.js';
26
+ /**
27
+ * #511:服务运行时启动阶段标记。四类启动标记(CORE_BOOT_STAGE/CORE_BOOT_FAILURE/
28
+ * HARNESS_BOOT_TIMEOUT/PLANNER_BOOT_TIMEOUT)此前只存在于构建期 proof 脚本输出,
29
+ * 服务进程从不打印——「复发即定位」在运行时面不成立。行形状与 proof 脚本同族
30
+ * (`标记 + JSON`),字段封闭(phase/module/port/elapsedMs),不含密钥/凭证。
31
+ */
32
+ export function formatBackendBootStage(phase, detail) {
33
+ return `CORE_BOOT_STAGE ${JSON.stringify({ phase, ...detail })}`;
34
+ }
35
+ /** 启动失败行:数组形状与 booking-surface-package-proof 的 CORE_BOOT_FAILURE 对齐;error 只留有界摘要 */
36
+ export function formatBackendBootFailure(error) {
37
+ const message = error instanceof Error ? error.message : String(error);
38
+ return `CORE_BOOT_FAILURE ${JSON.stringify([{ phase: 'startup', error: message.slice(0, 200) }])}`;
39
+ }
40
+ export function resolveGotryBackendPort(env) {
41
+ const raw = env.GOTRY_BACKEND_PORT ?? env.GOTRY_BOOKING_COPILOT_PORT;
42
+ if (raw === undefined)
43
+ return 3082;
44
+ if (!/^(?:0|[1-9][0-9]{0,4})$/.test(raw))
45
+ throw new Error('gotry_backend_invalid_port');
46
+ const port = Number(raw);
47
+ if (!Number.isSafeInteger(port) || port < 0 || port > 65_535)
48
+ throw new Error('gotry_backend_invalid_port');
49
+ return port;
50
+ }
51
+ export async function startGotryBackendFromEnvironment(env = process.env, log = (line) => { process.stderr.write(`${line}\n`); }) {
52
+ const bootStartedAt = Date.now();
53
+ const bootStage = (phase, detail) => {
54
+ try {
55
+ log(formatBackendBootStage(phase, { elapsedMs: Date.now() - bootStartedAt, ...detail }));
56
+ }
57
+ catch { /* 启动阶段行不反噬启动本身 */ }
58
+ };
59
+ // 失败标记也必须由本函数发:编译产物 bin/gotry-backend.js 包装层直接调用这里,
60
+ // 源码形态 runCli 的 catch 在 bin 形态不可达(#511 的失败面要在服务运行时可见)
61
+ const bootFailure = (error) => {
62
+ try {
63
+ log(formatBackendBootFailure(error));
64
+ }
65
+ catch { /* 同上 */ }
66
+ };
67
+ const modules = [];
68
+ try {
69
+ modules.push(await startBookingCopilotModule(env));
70
+ bootStage('module_mounted', { module: 'booking-copilot' });
71
+ modules.push(startSessionSearchModule({
72
+ apiKey: () => env.GOTRY_BACKEND_SESSION_API_KEY ?? '',
73
+ auditPath: env.GOTRY_SESSION_AUDIT_PATH,
74
+ // 批次 A「桥作业账本化」:挂载路径桥队列/在飞/节律/客户端注册落 SQLite
75
+ // (<stateRoot>/gotry-state/bridge.db),重启经 recoverOnBoot 收敛,不丢在飞作业。
76
+ stateRoot: env.GOTRY_BACKEND_STATE_ROOT ?? '.',
77
+ }));
78
+ bootStage('module_mounted', { module: 'session-search' });
79
+ modules.push(startBookingExecutorModule({
80
+ apiKey: () => env.GOTRY_BACKEND_BOOKING_API_KEY ?? '',
81
+ evidenceDir: () => env.GOTRY_BACKEND_EVIDENCE_DIR ?? '/var/lib/gotry-backend/booking-evidence',
82
+ }));
83
+ bootStage('module_mounted', { module: 'booking-executor' });
84
+ const handle = await createBackendServer({
85
+ modules,
86
+ host: env.GOTRY_BACKEND_HOST ?? '127.0.0.1',
87
+ port: resolveGotryBackendPort(env),
88
+ });
89
+ bootStage('listening', { port: handle.port, modules: handle.moduleNames.join(',') });
90
+ return {
91
+ port: handle.port,
92
+ moduleNames: handle.moduleNames,
93
+ close: () => closeBackend(handle, modules),
94
+ };
95
+ }
96
+ catch (error) {
97
+ bootFailure(error);
98
+ throw error;
99
+ }
100
+ }
101
+ async function runCli() {
102
+ const handle = await startGotryBackendFromEnvironment();
103
+ process.stderr.write(`[gotry-backend] listening on http://127.0.0.1:${handle.port}; modules=${handle.moduleNames.join(',')}\n`);
104
+ let stopping = false;
105
+ const stop = () => {
106
+ if (stopping)
107
+ return;
108
+ stopping = true;
109
+ void handle.close().then(() => process.exit(0), (error) => {
110
+ process.stderr.write(`[gotry-backend] shutdown failed: ${error instanceof Error ? error.message : String(error)}\n`);
111
+ process.exit(1);
112
+ });
113
+ };
114
+ process.once('SIGINT', stop);
115
+ process.once('SIGTERM', stop);
116
+ }
117
+ const invokedPath = process.argv[1] ? resolve(process.argv[1]) : '';
118
+ if (invokedPath === fileURLToPath(import.meta.url)) {
119
+ runCli().catch((error) => {
120
+ // CORE_BOOT_FAILURE 标记已在 startGotryBackendFromEnvironment 的失败路径落过
121
+ // (#511);这里补源码 CLI 形态的可读行
122
+ process.stderr.write(`[gotry-backend] startup failed: ${error instanceof Error ? error.message : String(error)}\n`);
123
+ process.exit(1);
124
+ });
125
+ }
@@ -0,0 +1,118 @@
1
+ /**
2
+ * 酒店日期校验闸(issue #283):`gotry_hotel_search` 在派发供应商 CLI 前必须先确认
3
+ * 「完整、有效且退房晚于入住」。缺/空/单侧/类型错/不可解析/倒序/同日/不存在的日历
4
+ * 日期(如 2026-02-30、2026-13-01),任一命中即返回可行动的 input_required,
5
+ * 绝不发供应商命令。有效自然语言日期复用既有 `buildTimeAnchor` /
6
+ * `resolveSlotDate`(已含严格 ISO 校验),不动时间锚点/slot-spec/其它工具。
7
+ *
8
+ * 失败原因(顺序决策,一次问清):
9
+ * missing(字段未传)> blank(空字符串)> type(非字符串)> unresolved(词表外/不存在的日历)> 倒序/同日
10
+ * - 同侧 缺失 + 另一侧 空串 → 两端均报缺,两轮往返压成一次
11
+ * - 五字段契约:reason(最小语义根因)/missing(需补齐的字段)/raw(用户原话)/message(可行动指引)/evidence(落账标签)
12
+ */
13
+ import { buildTimeAnchor, isRealIsoDate } from './time-anchor.js';
14
+ import { resolveSlotDate } from './slot-spec.js';
15
+ /**
16
+ * 闸主入口。返回 success 表示闸通过,绝对日期可直接进入供应商查询;
17
+ * 返回 failure 表示闸失败,工具层应原样回传 input_required,不调 interpretEffect、
18
+ * 不写延迟日志。
19
+ */
20
+ export function evaluateHotelStayDates(rawCheckIn, rawCheckOut, opts = {}) {
21
+ const anchor = buildTimeAnchor(opts.now ?? new Date());
22
+ const checkInStr = typeof rawCheckIn === 'string' ? rawCheckIn.trim() : '';
23
+ const checkOutStr = typeof rawCheckOut === 'string' ? rawCheckOut.trim() : '';
24
+ const raw = {
25
+ checkIn: typeof rawCheckIn === 'string' ? rawCheckIn : undefined,
26
+ checkOut: typeof rawCheckOut === 'string' ? rawCheckOut : undefined,
27
+ };
28
+ const checkInProvided = rawCheckIn !== undefined;
29
+ const checkOutProvided = rawCheckOut !== undefined;
30
+ const checkInIsString = typeof rawCheckIn === 'string';
31
+ const checkOutIsString = typeof rawCheckOut === 'string';
32
+ const checkInBlank = checkInIsString && checkInStr === '';
33
+ const checkOutBlank = checkOutIsString && checkOutStr === '';
34
+ const checkInTypeError = checkInProvided && !checkInIsString;
35
+ const checkOutTypeError = checkOutProvided && !checkOutIsString;
36
+ // 两端均缺失或一侧缺失+另一侧空串 → 一次报齐缺的两侧(避免两轮往返)
37
+ const bothNeedQuery = !checkInProvided && (!checkOutProvided || checkOutBlank)
38
+ || !checkOutProvided && (!checkInProvided || checkInBlank);
39
+ // 两端均空字符串(都已传但都是空串) → 同样报齐
40
+ if (bothNeedQuery || (checkInBlank && checkOutBlank)) {
41
+ const reason = !checkInProvided || checkInBlank ? 'check_in_blank' : 'check_out_blank';
42
+ return fail(reason, ['checkIn', 'checkOut'], '请告诉 gotry 入住日和退房日(具体日期,例如 2026-09-18);完整、有效且退房晚于入住才能查询酒店,缺一不查', `[hotel-date-gate@input_required:${reason}:both]`, raw);
43
+ }
44
+ // 单侧缺失(另一侧已正常传入) → 报缺的一侧
45
+ if (!checkInProvided) {
46
+ return fail('check_in_missing', ['checkIn'], '请告诉 gotry 入住日(具体日期,例如 2026-09-18);退房日已收到,但缺入住日无法判定窗口', '[hotel-date-gate@input_required:check_in_missing]', raw);
47
+ }
48
+ if (!checkOutProvided) {
49
+ return fail('check_out_missing', ['checkOut'], '请告诉 gotry 退房日(具体日期,例如 2026-09-20);入住日已收到,但缺退房日无法判定窗口', '[hotel-date-gate@input_required:check_out_missing]', raw);
50
+ }
51
+ // 类型错误(字段已传但不是字符串) → 按 blank 同形 + 标注类型,提示用户形态
52
+ if (checkInTypeError) {
53
+ return fail('check_in_blank', ['checkIn'], '入住日格式不对(应为日期字符串,例如 2026-09-18)——请向用户确认具体日期', '[hotel-date-gate@input_required:check_in_blank:type]', raw);
54
+ }
55
+ if (checkOutTypeError) {
56
+ return fail('check_out_blank', ['checkOut'], '退房日格式不对(应为日期字符串,例如 2026-09-20)——请向用户确认具体日期', '[hotel-date-gate@input_required:check_out_blank:type]', raw);
57
+ }
58
+ // 单侧空字符串(另一侧已正常传入)
59
+ if (checkInBlank) {
60
+ return fail('check_in_blank', ['checkIn'], '请告诉 gotry 入住日(具体日期,例如 2026-09-18);不要留空,不要猜日期', '[hotel-date-gate@input_required:check_in_blank]', raw);
61
+ }
62
+ if (checkOutBlank) {
63
+ return fail('check_out_blank', ['checkOut'], '请告诉 gotry 退房日(具体日期,例如 2026-09-20);不要留空,不要猜日期', '[hotel-date-gate@input_required:check_out_blank]', raw);
64
+ }
65
+ // 解析:复用 slot-spec 词表;词表外/不存在的日历日 → unresolved
66
+ const inRes = resolveSlotDate(checkInStr, anchor);
67
+ const outRes = resolveSlotDate(checkOutStr, anchor);
68
+ // 终消费层严格校验(issue #283 红线):resolveSlotDate 的 +N 算术(addDaysYmd) 可能
69
+ // 溢出产生 Invalid Date("NaN-NaN-NaN"),或 JS 自动进位跨千年("10000-01-01")。
70
+ // 词表外/不存在的日历日/算术溢出 一律归 unresolved,不发供应商命令。
71
+ if (inRes.kind === 'unresolved' || !isStrictIsoYmd(inRes.date)) {
72
+ return fail('check_in_unresolved', ['checkIn'], `入住日「${inRes.raw}」不是合法的具体日期——请给完整日期(例如 2026-09-18);不接受「近期」「明天之前」这类模糊表达,也不接受 2026-02-30 这类不存在的日历日`, '[hotel-date-gate@input_required:check_in_unresolved]', raw);
73
+ }
74
+ if (outRes.kind === 'unresolved' || !isStrictIsoYmd(outRes.date)) {
75
+ return fail('check_out_unresolved', ['checkOut'], `退房日「${outRes.raw}」不是合法的具体日期——请给完整日期(例如 2026-09-20);不接受「近期」「下周末」这类模糊表达,也不接受 2026-13-01 这类不存在的日历日`, '[hotel-date-gate@input_required:check_out_unresolved]', raw);
76
+ }
77
+ // 退房必须晚于入住;同日视为 0 晚
78
+ if (outRes.date <= inRes.date) {
79
+ const sameDay = outRes.date === inRes.date;
80
+ return fail('check_out_not_after_check_in', ['checkOut'], sameDay
81
+ ? `退房日(${outRes.date})与入住日(${inRes.date})相同,0 晚没有意义——请告诉 gotry 退房日应该晚于入住日`
82
+ : `退房日(${outRes.date})早于入住日(${inRes.date}),顺序反了——请告诉 gotry 正确的退房日(应该晚于入住)`, sameDay
83
+ ? '[hotel-date-gate@input_required:check_out_not_after_check_in:same_day]'
84
+ : '[hotel-date-gate@input_required:check_out_not_after_check_in:reversed]', raw);
85
+ }
86
+ // 通过:绝对日期已就位;slot 解析过程产生的原话 → 绝对日期 注记回显
87
+ const notes = [];
88
+ if (inRes.raw !== inRes.date)
89
+ notes.push(`slot-resolved: ${inRes.raw} → ${inRes.date}`);
90
+ if (outRes.raw !== outRes.date)
91
+ notes.push(`slot-resolved: ${outRes.raw} → ${outRes.date}`);
92
+ return { ok: true, checkIn: inRes.date, checkOut: outRes.date, notes };
93
+ }
94
+ function fail(reason, missing, message, evidence, raw) {
95
+ return { ok: false, verdict: 'input_required', reason, missing, raw, message, evidence };
96
+ }
97
+ /**
98
+ * 闸终消费层严格校验(issue #283 红线第二层,parseAbsoluteDate 词表口径之外):
99
+ * 1. 必须是字符串且匹配 `YYYY-MM-DD`(4-2-2 数字,前导零),拒 null/NaN/越界格式
100
+ * (addDaysYmd 溢出产生 "NaN-NaN-NaN",JS 自动进位跨千年产生 "10000-01-01")。
101
+ * 2. 年份 1-9999;复用 `isRealIsoDate` 拒不存在的日历日(2026-02-30 / 2025-02-29 等)。
102
+ * 仅供 evaluateHotelStayDates 在 resolveSlotDate 返回后使用;其它层不要复用此 helper。
103
+ */
104
+ function isStrictIsoYmd(s) {
105
+ if (typeof s !== 'string')
106
+ return false;
107
+ const m = s.match(/^(\d{4})-(\d{2})-(\d{2})$/);
108
+ if (!m)
109
+ return false;
110
+ const y = Number(m[1]);
111
+ const mo = Number(m[2]);
112
+ const d = Number(m[3]);
113
+ if (!Number.isFinite(y) || !Number.isFinite(mo) || !Number.isFinite(d))
114
+ return false;
115
+ if (y < 1 || y > 9999)
116
+ return false;
117
+ return isRealIsoDate(y, mo, d);
118
+ }
@@ -0,0 +1,88 @@
1
+ /**
2
+ * i18n 消息目录(README Known limitation「zh-CN 体验」的工程清偿件):
3
+ * GoTry 自有「确定性输出面」= 求解 answer_md(候选/航班链两渲染)+ 放宽建议文案
4
+ * + 排除理由。LLM 人格面(对话语言)由模型跟随用户语言,不在此层。
5
+ *
6
+ * 契约:
7
+ * - 默认 `zh-CN`,模板与历次金标准逐字节一致(engine/unified 金标准套件即回归闸);
8
+ * - `GOTRY_LOCALE=en`(或 setLocale)切英文;键缺失回退 zh 再回退键名——en 目录不齐不算错;
9
+ * - 插值 `{var}`;数字/时刻在调用点格式化,catalog 只管词序与措辞。
10
+ */
11
+ const ZH = {
12
+ 'md.header': '> 憧憬:{note}',
13
+ 'md.constraints': '> 已识别约束:窗口 {days} 天 | 预算 ¥{budget} | 动机(休整改写需求 {hours}h 有效休整)',
14
+ 'md.infeasible': '**{name}:现在不行**——冲突约束:{core}。',
15
+ 'md.relax_one': '- 放宽 {relax}:约 ¥{money}',
16
+ 'md.wish_pool': '- 已放入「下一次出发」清单:需要 {days} 天{budgetNote}{season}',
17
+ 'md.wish_budget': '、约 ¥{cny}',
18
+ 'md.wish_season': ',{months} 月最佳',
19
+ 'md.feasible_engine': '**{name}:可行**({id} {dep} 出发,{mode} 接驳,{arrive} 到住处,起床 {wake},到达精力 {energy}%,门到门 {d2d},有效休整 {hours}h,共 ¥{money})',
20
+ 'md.feasible_unified': '**{name}:可行**({svc} 出发,{mode} 接驳,起床 {wake},到达精力 {energy}%,门到门 {d2d},有效休整 {hours}h,共 ¥{money})',
21
+ 'md.recommend': '**建议:{best}**(意象匹配 {match}%)。',
22
+ 'md.alt': '备选:{name}(¥{money},匹配 {match}%)。',
23
+ 'md.decide_two': '**待你决定的两个问题**:',
24
+ 'md.q_choice': '1. {a} 还是 {b}?(前者更贴意象,后者更省)',
25
+ 'md.q_single': '1. 就去 {name} 吗?',
26
+ 'md.q_none': '1. 所有候选都不可行——考虑放宽哪条约束?',
27
+ 'md.q_wish': '2. 把 {name} 留给「下一次出发」({days} 天起),这次先去可行的?',
28
+ 'md.q_depart': '2. 出发班次选 {id}({dep})还是更晚的?',
29
+ 'sg.duration': '把行程延长到 {days} 天({name} 值得这个窗口)',
30
+ 'sg.budget': '预算提高到 ¥{cost}(原 ¥{budget})',
31
+ 'sg.wake_floor': '接受 {wake} 起床——破坏生物钟,与你的休整动机冲突,不推荐',
32
+ 'sg.energy_floor': '接受到达精力 {pct}%(低于你要求的 {min}%)',
33
+ 'sg.usable_hours': '接受有效休整 {hours}h(低于动机所需的 {need}h)',
34
+ 'sg.arrival': '接受 {time} 才到住处',
35
+ 'sg.plan': '可行方案:{id} {dep} 出发、{mode} 接驳,¥{money},{wake} 起床,{arrive} 到住处,到达精力 {percent}%',
36
+ 'sg.wish_reason_engine': '动机谱系 {weights} 下,{days} 天窗口装不下这个目的地',
37
+ 'sg.wish_reason_window': '{days} 天窗口装不下(目的需 {minDays} 天)',
38
+ 'un.workwindow_reason': '周{wd} {dep} 起飞落在工作窗口(当地 {start}-{end})内',
39
+ 'un.workwindow_unresolvable_reason': 'home zone 投影失败:{reason}',
40
+ 'un.redflag_redeye': '{leg} 落地精力仅 {pct}%(红眼后直奔事务,当日不宜安排重要会议)',
41
+ };
42
+ const EN = {
43
+ 'md.header': '> Aspiration: {note}',
44
+ 'md.constraints': '> Constraints captured: {days}-day window | budget ¥{budget} | motivation (needs {hours}h of usable rest)',
45
+ 'md.infeasible': '**{name}: not yet** — conflicting constraints: {core}.',
46
+ 'md.relax_one': '- Relax {relax}: about ¥{money}',
47
+ 'md.wish_pool': '- Added to the "next departure" list: needs {days} days{budgetNote}{season}',
48
+ 'md.wish_budget': ', about ¥{cny}',
49
+ 'md.wish_season': ', best in months {months}',
50
+ 'md.feasible_engine': '**{name}: feasible** ({id} departs {dep}, {mode} transfer, at your stay by {arrive}, wake {wake}, arrival energy {energy}%, door-to-door {d2d}, {hours}h of real rest, total ¥{money})',
51
+ 'md.feasible_unified': '**{name}: feasible** ({svc} departs, {mode} transfer, wake {wake}, arrival energy {energy}%, door-to-door {d2d}, {hours}h of real rest, total ¥{money})',
52
+ 'md.recommend': '**Suggestion: {best}** (imagery match {match}%).',
53
+ 'md.alt': 'Alternative: {name} (¥{money}, match {match}%).',
54
+ 'md.decide_two': '**Two decisions for you**:',
55
+ 'md.q_choice': '1. {a} or {b}? (former fits the vision, latter saves more)',
56
+ 'md.q_single': '1. Go with {name}?',
57
+ 'md.q_none': '1. All candidates are infeasible — which constraint to relax?',
58
+ 'md.q_wish': '2. Keep {name} for the "next departure" ({days}+ days) and go feasible this time?',
59
+ 'md.q_depart': '2. Departure: {id} ({dep}) or later?',
60
+ 'sg.duration': 'Extend the trip to {days} days ({name} deserves this window)',
61
+ 'sg.budget': 'Raise budget to ¥{cost} (was ¥{budget})',
62
+ 'sg.wake_floor': 'Accept a {wake} wake-up — wrecks your body clock, conflicts with your rest motivation, not recommended',
63
+ 'sg.energy_floor': 'Accept arrival energy {pct}% (below your required {min}%)',
64
+ 'sg.usable_hours': 'Accept {hours}h of usable rest (below the {need}h your motivation needs)',
65
+ 'sg.arrival': 'Accept reaching your stay only at {time}',
66
+ 'sg.plan': 'Feasible plan: {id} departs {dep}, {mode} transfer, ¥{money}, wake {wake}, at your stay {arrive}, arrival energy {percent}%',
67
+ 'sg.wish_reason_engine': 'under motivation weights {weights}, a {days}-day window cannot fit this destination',
68
+ 'sg.wish_reason_window': '{days}-day window cannot fit (the purpose needs {minDays} days)',
69
+ 'un.workwindow_reason': 'Departs {dep} on weekday {wd}, inside your work window (local {start}-{end})',
70
+ 'un.workwindow_unresolvable_reason': 'home zone projection failed: {reason}',
71
+ 'un.redflag_redeye': '{leg} lands with only {pct}% energy (red-eye then straight to business — no big meetings that day)',
72
+ };
73
+ let locale = process.env['GOTRY_LOCALE'] === 'en' ? 'en' : 'zh-CN';
74
+ export function getLocale() {
75
+ return locale;
76
+ }
77
+ export function setLocale(l) {
78
+ locale = l;
79
+ }
80
+ /** 词条渲染:en 缺键回退 zh,再回退键名;插值 {var},缺变量原样保留 `{var}`。 */
81
+ export function t(key, vars = {}) {
82
+ const tpl = (locale === 'en' ? EN[key] : undefined) ?? ZH[key] ?? String(key);
83
+ return tpl.replace(/\{(\w+)\}/g, (_, k) => (k in vars ? String(vars[k]) : `{${k}}`));
84
+ }
85
+ /** en 目录完备性检查:缺键即列出(测试闸用,运行时回退而非抛错) */
86
+ export function enCoverage() {
87
+ return Object.keys(ZH).filter(k => EN[k] === undefined);
88
+ }