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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (507) 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 +1744 -0
  6. package/bin/gotry-inner.js +733 -83
  7. package/bin/gotry-process-liveness.d.ts +27 -0
  8. package/bin/gotry-process-liveness.js +97 -0
  9. package/bin/gotry-runtime-resolution.d.ts +27 -0
  10. package/bin/gotry-runtime-resolution.js +49 -0
  11. package/bin/gotry.js +1 -1
  12. package/client/client.js +203 -0
  13. package/cordis.gotry-patch.yml +80 -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 +135 -94
  19. package/dist/capabilities/artifacts.js +370 -0
  20. package/dist/capabilities/channel-health.js +131 -0
  21. package/dist/capabilities/channel-registry.js +256 -0
  22. package/dist/capabilities/doctor.js +546 -0
  23. package/dist/capabilities/effect.js +394 -0
  24. package/dist/capabilities/external-event.js +149 -0
  25. package/dist/capabilities/fact-log.js +55 -0
  26. package/dist/capabilities/flyai-config.js +337 -0
  27. package/dist/capabilities/flyai.js +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 +509 -0
  31. package/dist/capabilities/hbcli.js +260 -123
  32. package/dist/capabilities/hotelbyte-transaction.js +194 -0
  33. package/dist/capabilities/incident-log.js +131 -61
  34. package/dist/capabilities/itinerary-artifact.js +190 -0
  35. package/dist/capabilities/itinerary-deck-artifact.js +194 -0
  36. package/dist/capabilities/itinerary-deck-export.js +339 -0
  37. package/dist/capabilities/lavish-local.js +924 -0
  38. package/dist/capabilities/model-override.js +38 -0
  39. package/dist/capabilities/opensky.js +54 -43
  40. package/dist/capabilities/resilience.js +191 -0
  41. package/dist/capabilities/session/action-cache.js +50 -44
  42. package/dist/capabilities/session/adapters/ctrip-flight.js +120 -62
  43. package/dist/capabilities/session/adapters/ctrip-hotel.js +222 -0
  44. package/dist/capabilities/session/adapters/dida-portal.js +274 -0
  45. package/dist/capabilities/session/adapters/meituan-local.js +35 -54
  46. package/dist/capabilities/session/adapters/rail-12306.js +342 -0
  47. package/dist/capabilities/session/benchmark.js +189 -0
  48. package/dist/capabilities/session/bridge-ledger.js +224 -0
  49. package/dist/capabilities/session/extension-bridge.js +636 -0
  50. package/dist/capabilities/session/extension-channel.js +109 -0
  51. package/dist/capabilities/session/extension-distribution.js +230 -0
  52. package/dist/capabilities/session/extract.js +31 -21
  53. package/dist/capabilities/session/golden-score.js +114 -0
  54. package/dist/capabilities/session/health-watch.js +215 -0
  55. package/dist/capabilities/session/read-guard.js +75 -24
  56. package/dist/capabilities/session/static-flight-golden.js +150 -0
  57. package/dist/capabilities/session/transport.js +97 -83
  58. package/dist/capabilities/session/wizard.js +117 -0
  59. package/dist/capabilities/session-consent.js +178 -0
  60. package/dist/capabilities/session-login.js +170 -0
  61. package/dist/capabilities/session-search.js +635 -44
  62. package/dist/capabilities/spawn-bounded.js +203 -0
  63. package/dist/capabilities/sponsor-plugin.js +341 -0
  64. package/dist/capabilities/visa-policy.js +140 -0
  65. package/dist/capabilities/weather.js +243 -138
  66. package/dist/data/session-golden-20.json +25 -0
  67. package/dist/data/sf-golden-manifest.json +103 -0
  68. package/dist/data/sf-static-routes.json +91 -0
  69. package/dist/scripts/action-cache-tests.js +24 -59
  70. package/dist/scripts/agent-planning-turn-deadline-e2e.js +242 -0
  71. package/dist/scripts/agent-planning-turn-deadline-tests.js +185 -0
  72. package/dist/scripts/agent-reach-deep-tests.js +30 -40
  73. package/dist/scripts/agent-reach-error-tests.js +354 -0
  74. package/dist/scripts/agent-reach-tests.js +26 -18
  75. package/dist/scripts/agent-reach-wrapper-tests.js +50 -50
  76. package/dist/scripts/anything-tests.js +116 -60
  77. package/dist/scripts/artifact-client-contract-tests.js +220 -0
  78. package/dist/scripts/artifacts-capability-tests.js +727 -0
  79. package/dist/scripts/async-collect.js +50 -11
  80. package/dist/scripts/benchmark-environment-bridge-e2e.js +741 -0
  81. package/dist/scripts/benchmark-environment-bridge-tests.js +1452 -0
  82. package/dist/scripts/booking-copilot-availability-ledger-binding-tests.js +126 -0
  83. package/dist/scripts/booking-copilot-availability-policy-tests.js +265 -0
  84. package/dist/scripts/booking-copilot-bin-proof-tests.js +66 -0
  85. package/dist/scripts/booking-copilot-cleanup-proof-helper.js +76 -0
  86. package/dist/scripts/booking-copilot-crossrepo-fixture-server.js +144 -0
  87. package/dist/scripts/booking-copilot-dsh-core-proof-tests.js +424 -0
  88. package/dist/scripts/booking-copilot-dsh-planner-proof-tests.js +2839 -0
  89. package/dist/scripts/booking-copilot-dsh-plugin-proof-tests.js +309 -0
  90. package/dist/scripts/booking-copilot-dsh-readiness-proof.js +238 -0
  91. package/dist/scripts/booking-copilot-dsh-warmer-proof.js +123 -0
  92. package/dist/scripts/booking-copilot-event-sequence-concurrency-proof-tests.js +156 -0
  93. package/dist/scripts/booking-copilot-gap-code-contract-proof-tests.js +70 -0
  94. package/dist/scripts/booking-copilot-intent-proof-tests.js +422 -0
  95. package/dist/scripts/booking-copilot-operation-ledger-concurrency-proof-tests.js +184 -0
  96. package/dist/scripts/booking-copilot-planner-live-probe.js +95 -0
  97. package/dist/scripts/booking-copilot-proof-runtime.js +42 -0
  98. package/dist/scripts/booking-copilot-receipt-ledger-concurrency-proof-tests.js +210 -0
  99. package/dist/scripts/booking-copilot-runtime-proof-tests.js +2349 -0
  100. package/dist/scripts/booking-copilot-server-proof-tests.js +784 -0
  101. package/dist/scripts/booking-copilot-startup-proof-tests.js +94 -0
  102. package/dist/scripts/booking-executor-tests.js +80 -0
  103. package/dist/scripts/booking-recovery-chain-tests.js +182 -0
  104. package/dist/scripts/booking-saga-tests.js +125 -0
  105. package/dist/scripts/booking-surface-contract-proof-tests.js +212 -0
  106. package/dist/scripts/bootstrap-tests.js +1479 -0
  107. package/dist/scripts/bridge-events-tests.js +239 -0
  108. package/dist/scripts/bridge-ledger-tests.js +428 -0
  109. package/dist/scripts/build-changelog.js +238 -0
  110. package/dist/scripts/build-metrics-report.js +331 -0
  111. package/dist/scripts/changelog-tests.js +118 -0
  112. package/dist/scripts/channel-probe-tests.js +103 -0
  113. package/dist/scripts/channel-probe.js +169 -0
  114. package/dist/scripts/channel-registry-tests.js +208 -0
  115. package/dist/scripts/companion-tests.js +25 -70
  116. package/dist/scripts/dida-cookie-probe.js +87 -0
  117. package/dist/scripts/dida-runner-stop-tests.js +311 -0
  118. package/dist/scripts/dida-sw-probe.js +114 -0
  119. package/dist/scripts/diff-test.js +17 -12
  120. package/dist/scripts/doctor-tests.js +564 -0
  121. package/dist/scripts/dsh-artifact-e2e.js +279 -0
  122. package/dist/scripts/dsh-artifact-web-e2e.js +675 -0
  123. package/dist/scripts/dsh-http-proxy-sse-proof.js +90 -0
  124. package/dist/scripts/dsh-runtime-closure-tests.js +182 -0
  125. package/dist/scripts/dsh-runtime-closure.js +162 -0
  126. package/dist/scripts/dsh-session-v3-migration-proof.js +109 -0
  127. package/dist/scripts/dsh-subprocess-local-proof.js +150 -0
  128. package/dist/scripts/dsh-target-closure-proof.js +178 -0
  129. package/dist/scripts/effect-tests.js +539 -0
  130. package/dist/scripts/engine-run.js +1 -3
  131. package/dist/scripts/engine-tests.js +16 -10
  132. package/dist/scripts/evaluation-cadence-tests.js +174 -0
  133. package/dist/scripts/evaluation-contract-tests.js +268 -0
  134. package/dist/scripts/extension-distribution-cli.js +39 -0
  135. package/dist/scripts/extension-distribution-tests.js +443 -0
  136. package/dist/scripts/extension-tests.js +988 -0
  137. package/dist/scripts/external-event-tests.js +350 -0
  138. package/dist/scripts/fact-gate-tests.js +869 -0
  139. package/dist/scripts/fixtures/extension-bridge-unref-child.mjs +21 -0
  140. package/dist/scripts/flight-hotel-anchor-363-registered-e2e.js +169 -0
  141. package/dist/scripts/flight-malformed-tests.js +159 -0
  142. package/dist/scripts/flyai-setup-tests.js +228 -0
  143. package/dist/scripts/flyai-setup-tool-tests.js +54 -0
  144. package/dist/scripts/flyai-tests.js +692 -0
  145. package/dist/scripts/flyai-tool-registration-contract-tests.js +91 -0
  146. package/dist/scripts/fx-contract-tests.js +201 -0
  147. package/dist/scripts/g5-guard-tests.js +131 -0
  148. package/dist/scripts/g5-guard.js +189 -0
  149. package/dist/scripts/gen-lunar-anchors.js +106 -0
  150. package/dist/scripts/geo-atlas-tests.js +283 -0
  151. package/dist/scripts/gotry-backend-kernel-tests.js +206 -0
  152. package/dist/scripts/gotry-try-demo-tests.js +79 -0
  153. package/dist/scripts/gotry-try-demo.js +49 -0
  154. package/dist/scripts/ground-transfer-tests.js +956 -0
  155. package/dist/scripts/hbcli-e2e-tests.js +159 -0
  156. package/dist/scripts/hbcli-live-optin-tests.js +96 -0
  157. package/dist/scripts/hbcli-release-contract-tests.js +122 -0
  158. package/dist/scripts/hbcli-tests.js +121 -69
  159. package/dist/scripts/health-watch-cli.js +73 -0
  160. package/dist/scripts/hotel-date-gate-tests.js +496 -0
  161. package/dist/scripts/hotelbyte-reconcile-tests.js +141 -0
  162. package/dist/scripts/hotelbyte-spawn-e2e-tests.js +373 -0
  163. package/dist/scripts/i18n-tests.js +41 -0
  164. package/dist/scripts/incident-tests.js +281 -87
  165. package/dist/scripts/issue-194-job-id-guard-tests.js +106 -0
  166. package/dist/scripts/issue-233-cancel-refund-commission-tests.js +392 -0
  167. package/dist/scripts/issue-271-liveness-tests.js +569 -0
  168. package/dist/scripts/issue-289-model-retry-real-tests.js +296 -0
  169. package/dist/scripts/issue-289-model-retry-tests.js +441 -0
  170. package/dist/scripts/issue-289-web-retry-e2e.js +630 -0
  171. package/dist/scripts/issue-338-home-city-e2e.js +577 -0
  172. package/dist/scripts/issue343-real-entry-e2e.js +160 -0
  173. package/dist/scripts/issue436-persisted-routing-e2e.js +247 -0
  174. package/dist/scripts/itinerary-artifact-tests.js +368 -0
  175. package/dist/scripts/itinerary-deck-artifact-tests.js +416 -0
  176. package/dist/scripts/itinerary-deck-export-tests.js +552 -0
  177. package/dist/scripts/itinerary-deck-tests.js +435 -0
  178. package/dist/scripts/itinerary-html-tests.js +426 -0
  179. package/dist/scripts/journey-tests.js +22 -27
  180. package/dist/scripts/kernel-manifest-evidence.js +109 -0
  181. package/dist/scripts/kernel-manifest-gate.js +126 -0
  182. package/dist/scripts/kernel-manifest-tests.js +212 -0
  183. package/dist/scripts/kernel-manifest-trace-entry.js +7 -0
  184. package/dist/scripts/kernel-manifest-trace-hook.mjs +28 -0
  185. package/dist/scripts/kernel-manifest.js +369 -0
  186. package/dist/scripts/lavish-local-tests.js +1226 -0
  187. package/dist/scripts/lavish-product-tools-tests.js +537 -0
  188. package/dist/scripts/ledger-repair-apply-tests.js +316 -0
  189. package/dist/scripts/ledger-repair-plan-tests.js +375 -0
  190. package/dist/scripts/ledger-tests.js +382 -246
  191. package/dist/scripts/ledger-workflow-crash.js +10 -20
  192. package/dist/scripts/managed-dsh-cleanup-diagnostic-proof.js +184 -0
  193. package/dist/scripts/managed-dsh-close-failure-proof.js +172 -0
  194. package/dist/scripts/managed-dsh-run-port-proof.js +153 -0
  195. package/dist/scripts/managed-dsh-terminal-proof.js +252 -0
  196. package/dist/scripts/map-tools-vendor-package-proof.js +365 -0
  197. package/dist/scripts/memory-capture-tests.js +242 -61
  198. package/dist/scripts/memory-decay-tests.js +18 -52
  199. package/dist/scripts/memory-lifecycle-tests.js +657 -0
  200. package/dist/scripts/memory-lifecycle.js +196 -0
  201. package/dist/scripts/memory-metrics.js +24 -12
  202. package/dist/scripts/memory-value-report.js +631 -0
  203. package/dist/scripts/memory-value-tests.js +328 -0
  204. package/dist/scripts/metrics-report-tests.js +151 -0
  205. package/dist/scripts/model-override-e2e.js +137 -0
  206. package/dist/scripts/nightly-evidence-tests.js +161 -0
  207. package/dist/scripts/nightly-evidence.js +286 -0
  208. package/dist/scripts/nudge-digest.js +39 -28
  209. package/dist/scripts/observability-tests.js +381 -0
  210. package/dist/scripts/onboarding-tests.js +161 -0
  211. package/dist/scripts/opensky-check.js +18 -13
  212. package/dist/scripts/opensky-tests.js +28 -28
  213. package/dist/scripts/persona-surface-guard-tests.js +49 -0
  214. package/dist/scripts/pnpm-dsh-closure-proof.js +17 -0
  215. package/dist/scripts/policy-anchor-359-registered-e2e.js +214 -0
  216. package/dist/scripts/price-drift-tests.js +340 -0
  217. package/dist/scripts/price-drift-watch.js +447 -0
  218. package/dist/scripts/probe-poi-tests.js +53 -45
  219. package/dist/scripts/product-metrics.js +483 -0
  220. package/dist/scripts/publish-preverify.js +110 -0
  221. package/dist/scripts/realtime-pricing-tests.js +76 -0
  222. package/dist/scripts/recall-tests.js +513 -0
  223. package/dist/scripts/replay-async.js +20 -18
  224. package/dist/scripts/replay-real.js +18 -18
  225. package/dist/scripts/replay.js +52 -82
  226. package/dist/scripts/session-attach-diagnose.js +20 -20
  227. package/dist/scripts/session-attach-poc.js +34 -37
  228. package/dist/scripts/session-benchmark.js +180 -0
  229. package/dist/scripts/session-dida-live-e2e.js +199 -0
  230. package/dist/scripts/session-extract-tests.js +14 -35
  231. package/dist/scripts/session-link-tests.js +478 -0
  232. package/dist/scripts/session-login.js +27 -46
  233. package/dist/scripts/session-tests.js +796 -96
  234. package/dist/scripts/session-zones-tests.js +358 -0
  235. package/dist/scripts/sf-live-benchmark.js +367 -0
  236. package/dist/scripts/sf-live-challenge-stop-tests.js +453 -0
  237. package/dist/scripts/sf-live-cli-tests.js +92 -0
  238. package/dist/scripts/sf-live-options.js +46 -0
  239. package/dist/scripts/sf-manifest-tests.js +30 -0
  240. package/dist/scripts/sf-manifest.js +33 -0
  241. package/dist/scripts/sf-soft-score-tests.js +67 -0
  242. package/dist/scripts/sf-summary-tests.js +324 -0
  243. package/dist/scripts/sf-summary.js +525 -0
  244. package/dist/scripts/share-tests.js +432 -0
  245. package/dist/scripts/skeleton-check.js +16 -14
  246. package/dist/scripts/skeleton-integration-test.js +28 -11
  247. package/dist/scripts/skills-contract-tests.js +51 -46
  248. package/dist/scripts/smoke-session-gate-tests.js +21 -0
  249. package/dist/scripts/smoke.js +690 -246
  250. package/dist/scripts/spawn-bounded-abort-tests.js +241 -0
  251. package/dist/scripts/sponsor-reuse-tests.js +262 -0
  252. package/dist/scripts/state-cli-tests.js +226 -101
  253. package/dist/scripts/state-cli.js +550 -199
  254. package/dist/scripts/state-repair-cli.js +66 -0
  255. package/dist/scripts/state-repair-tests.js +140 -0
  256. package/dist/scripts/static-golden-tests.js +165 -0
  257. package/dist/scripts/time-eval-tests.js +210 -192
  258. package/dist/scripts/travel-timeline-tests.js +29 -93
  259. package/dist/scripts/turn-handoff-collect-tests.js +169 -0
  260. package/dist/scripts/turn-handoff-collect.js +161 -0
  261. package/dist/scripts/turn-policy-tests.js +55 -0
  262. package/dist/scripts/typed-contract-canary.js +176 -0
  263. package/dist/scripts/tz-resolver-sanity.js +50 -0
  264. package/dist/scripts/tz-resolver-tests.js +584 -0
  265. package/dist/scripts/unified-tests.js +23 -19
  266. package/dist/scripts/visa-policy-tests.js +62 -0
  267. package/dist/scripts/weather-tests.js +276 -41
  268. package/dist/scripts/wish-channel-gate-tests.js +54 -0
  269. package/dist/scripts/write-gate-tests.js +522 -0
  270. package/dist/scripts/z3-lifecycle-fault-tests.js +188 -0
  271. package/dist/scripts/z3-lifecycle-tests.js +170 -0
  272. package/dist/scripts/z3-race-repeat-tests.js +39 -0
  273. package/dist/scripts/z3-race-tests.js +41 -0
  274. package/dist/src/artifact-gate.js +829 -0
  275. package/dist/src/backend/kernel.js +91 -0
  276. package/dist/src/backend/modules/booking-copilot.js +92 -0
  277. package/dist/src/backend/modules/booking-executor.js +124 -0
  278. package/dist/src/backend/modules/session-search.js +551 -0
  279. package/dist/src/benchmark-agent-conformance.js +578 -0
  280. package/dist/src/benchmark-environment-bridge.js +515 -0
  281. package/dist/src/benchmark-headless-child-diagnostics.js +166 -0
  282. package/dist/src/benchmark-tool-isolation.js +151 -0
  283. package/dist/src/bookable-facts.js +533 -0
  284. package/dist/src/booking-saga.js +97 -0
  285. package/dist/src/booking-surface/availability-policy.js +697 -0
  286. package/dist/src/booking-surface/booking-intent.js +43 -0
  287. package/dist/src/booking-surface/cancel-refund-commission.js +379 -0
  288. package/dist/src/booking-surface/canonical-schema.js +116 -0
  289. package/dist/src/booking-surface/contracts.js +75 -0
  290. package/dist/src/booking-surface/dsh-planner.js +1854 -0
  291. package/dist/src/booking-surface/dsh-plugin.js +378 -0
  292. package/dist/src/booking-surface/dsh-worker.js +98 -0
  293. package/dist/src/booking-surface/error-codes.js +231 -0
  294. package/dist/src/booking-surface/index.js +9 -0
  295. package/dist/src/booking-surface/managed-dsh-cleanup-diagnostic.js +97 -0
  296. package/dist/src/booking-surface/managed-dsh-run-port.js +244 -0
  297. package/dist/src/booking-surface/profile.js +24 -0
  298. package/dist/src/booking-surface/recovery-chain.js +367 -0
  299. package/dist/src/booking-surface/runtime.js +1968 -0
  300. package/dist/src/booking-surface/server.js +674 -0
  301. package/dist/src/booking-surface/startup.js +168 -0
  302. package/dist/src/booking-surface/validation.js +261 -0
  303. package/dist/src/bridge.js +20 -13
  304. package/dist/src/companions.js +48 -74
  305. package/dist/src/contracts.js +21 -43
  306. package/dist/src/dsh-llm.js +97 -111
  307. package/dist/src/engine.js +276 -193
  308. package/dist/src/evaluation-cadence.js +97 -0
  309. package/dist/src/evaluation-contracts.js +283 -0
  310. package/dist/src/flight-pack-adapter.js +54 -0
  311. package/dist/src/flight-pack-contract.js +2 -0
  312. package/dist/src/flyai-setup-tool.js +70 -0
  313. package/dist/src/gotry-backend.js +125 -0
  314. package/dist/src/hotel-date-gate.js +118 -0
  315. package/dist/src/i18n.js +88 -0
  316. package/dist/src/index.js +2227 -882
  317. package/dist/src/itinerary-deck.js +139 -0
  318. package/dist/src/itinerary-doc-shared.js +661 -0
  319. package/dist/src/itinerary-html.js +131 -0
  320. package/dist/src/journey.js +155 -108
  321. package/dist/src/lavish-tools.js +400 -0
  322. package/dist/src/ledger-repair-apply.js +538 -0
  323. package/dist/src/ledger-repair-plan.js +463 -0
  324. package/dist/src/loop.js +319 -160
  325. package/dist/src/memory-capture.js +180 -32
  326. package/dist/src/memory-decay.js +30 -14
  327. package/dist/src/memory-lifecycle.js +1310 -0
  328. package/dist/src/memory-utility.js +27 -40
  329. package/dist/src/mock-llm.js +36 -61
  330. package/dist/src/model.js +81 -36
  331. package/dist/src/realtime-pricing.js +103 -0
  332. package/dist/src/recall/card.js +74 -0
  333. package/dist/src/recall/evaluator.js +140 -0
  334. package/dist/src/recall/integration.js +17 -0
  335. package/dist/src/recall/tick.js +166 -0
  336. package/dist/src/session-link/plan-it-action.js +48 -0
  337. package/dist/src/session-link/session-link.js +248 -0
  338. package/dist/src/session-zones.js +507 -0
  339. package/dist/src/share/adapters.js +51 -0
  340. package/dist/src/share/share-consent.js +76 -0
  341. package/dist/src/share/share-deck.js +58 -0
  342. package/dist/src/share/share-token.js +146 -0
  343. package/dist/src/slot-spec.js +84 -106
  344. package/dist/src/state-ledger.js +435 -516
  345. package/dist/src/state-repair.js +299 -0
  346. package/dist/src/subagent-job-id-guard.js +58 -0
  347. package/dist/src/time-anchor.js +231 -33
  348. package/dist/src/tool-packet.js +20 -8
  349. package/dist/src/travel-slots.js +58 -35
  350. package/dist/src/travel-timeline.js +44 -63
  351. package/dist/src/turn-deadline.js +287 -0
  352. package/dist/src/turn-policy.js +118 -0
  353. package/dist/src/tz-resolver.js +143 -0
  354. package/dist/src/unified.js +535 -359
  355. package/dist/src/wish-pool.js +42 -12
  356. package/dist/src/write-gate.js +495 -0
  357. package/dist/src/z3-shared.js +284 -0
  358. package/extension/README.md +21 -0
  359. package/extension/README.zh-CN.md +21 -0
  360. package/extension/background.js +463 -0
  361. package/extension/content-bridge.js +270 -0
  362. package/extension/content-main.js +111 -0
  363. package/extension/manifest.json +60 -0
  364. package/package.json +407 -14
  365. package/schemas/booking.intent.schema.json +193 -0
  366. package/schemas/booking.surface.schema.json +2622 -0
  367. package/ts/capabilities/agent-reach-deep.ts +114 -0
  368. package/ts/capabilities/agent-reach.ts +198 -0
  369. package/ts/capabilities/anything.ts +255 -0
  370. package/ts/capabilities/artifacts.ts +428 -0
  371. package/ts/capabilities/fact-log.ts +54 -0
  372. package/ts/capabilities/flyai-config.ts +388 -0
  373. package/ts/capabilities/flyai.ts +1274 -0
  374. package/ts/capabilities/hbcli.ts +253 -71
  375. package/ts/capabilities/incident-log.ts +88 -59
  376. package/ts/capabilities/itinerary-artifact.ts +214 -0
  377. package/ts/capabilities/itinerary-deck-artifact.ts +218 -0
  378. package/ts/capabilities/itinerary-deck-export.ts +378 -0
  379. package/ts/capabilities/opensky.ts +121 -0
  380. package/ts/capabilities/session/action-cache.ts +148 -0
  381. package/ts/capabilities/session/adapters/ctrip-flight.ts +181 -0
  382. package/ts/capabilities/session/adapters/ctrip-hotel.ts +238 -0
  383. package/ts/capabilities/session/adapters/dida-portal.ts +338 -0
  384. package/ts/capabilities/session/adapters/meituan-local.ts +70 -0
  385. package/ts/capabilities/session/adapters/rail-12306.ts +392 -0
  386. package/ts/capabilities/session/benchmark.ts +276 -0
  387. package/ts/capabilities/session/bridge-ledger.ts +333 -0
  388. package/ts/capabilities/session/extension-bridge.ts +794 -0
  389. package/ts/capabilities/session/extension-channel.ts +144 -0
  390. package/ts/capabilities/session/extension-distribution.ts +266 -0
  391. package/ts/capabilities/session/extract.ts +54 -0
  392. package/ts/capabilities/session/golden-score.ts +139 -0
  393. package/ts/capabilities/session/health-watch.ts +264 -0
  394. package/ts/capabilities/session/read-guard.ts +141 -0
  395. package/ts/capabilities/session/static-flight-golden.ts +209 -0
  396. package/ts/capabilities/session/transport.ts +146 -0
  397. package/ts/capabilities/session/wizard.ts +140 -0
  398. package/ts/capabilities/session-consent.ts +211 -0
  399. package/ts/capabilities/session-login.ts +208 -0
  400. package/ts/capabilities/session-search.ts +893 -0
  401. package/ts/capabilities/weather.ts +330 -0
  402. package/ts/dsh-runtime/vendor/README.md +68 -0
  403. package/ts/dsh-runtime/vendor/dsh-map-tools/LICENSE +21 -0
  404. package/ts/dsh-runtime/vendor/dsh-map-tools/README.en.md +405 -0
  405. package/ts/dsh-runtime/vendor/dsh-map-tools/README.md +404 -0
  406. package/ts/dsh-runtime/vendor/dsh-map-tools/client/client.js +1584 -0
  407. package/ts/dsh-runtime/vendor/dsh-map-tools/cordis.patch.yml +5 -0
  408. package/ts/dsh-runtime/vendor/dsh-map-tools/icon.svg +5 -0
  409. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/clients/amap.js +595 -0
  410. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/clients/nominatim.js +63 -0
  411. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/clients/osrm.js +58 -0
  412. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/clients/photon.js +55 -0
  413. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/config-file.js +87 -0
  414. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/config-route.js +131 -0
  415. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/config.js +16 -0
  416. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/geo.js +232 -0
  417. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/index.js +120 -0
  418. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/settings-ns.js +40 -0
  419. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/staticmap-route.js +115 -0
  420. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/tools/geocode.js +127 -0
  421. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/tools/poi.js +84 -0
  422. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/tools/routes.js +267 -0
  423. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/clients/amap.d.ts +90 -0
  424. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/clients/nominatim.d.ts +17 -0
  425. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/clients/osrm.d.ts +15 -0
  426. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/clients/photon.d.ts +22 -0
  427. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/config-file.d.ts +33 -0
  428. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/config-route.d.ts +23 -0
  429. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/config.d.ts +23 -0
  430. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/geo.d.ts +61 -0
  431. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/index.d.ts +18 -0
  432. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/settings-ns.d.ts +14 -0
  433. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/staticmap-route.d.ts +31 -0
  434. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/tools/geocode.d.ts +11 -0
  435. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/tools/poi.d.ts +9 -0
  436. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/tools/routes.d.ts +75 -0
  437. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/types.d.ts +68 -0
  438. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types.js +16 -0
  439. package/ts/dsh-runtime/vendor/dsh-map-tools/package.json +97 -0
  440. package/ts/package.json +293 -3
  441. package/ts/scripts/async-collect.ts +91 -0
  442. package/ts/scripts/map-tools-vendor-package-proof.ts +404 -0
  443. package/ts/scripts/skeleton-check.ts +1 -1
  444. package/ts/scripts/skeleton-integration-test.ts +23 -1
  445. package/ts/scripts/state-cli.ts +568 -0
  446. package/ts/scripts/turn-handoff-collect.ts +178 -0
  447. package/ts/src/artifact-gate.ts +991 -0
  448. package/ts/src/benchmark-agent-conformance.ts +619 -0
  449. package/ts/src/benchmark-environment-bridge.ts +538 -0
  450. package/ts/src/benchmark-headless-child-diagnostics.ts +184 -0
  451. package/ts/src/benchmark-tool-isolation.ts +166 -0
  452. package/ts/src/bookable-facts.ts +837 -0
  453. package/ts/src/booking-saga.ts +133 -0
  454. package/ts/src/booking-surface/availability-policy.ts +522 -0
  455. package/ts/src/booking-surface/booking-intent.ts +86 -0
  456. package/ts/src/booking-surface/cancel-refund-commission.ts +488 -0
  457. package/ts/src/booking-surface/canonical-schema.js +116 -0
  458. package/ts/src/booking-surface/contracts.ts +475 -0
  459. package/ts/src/booking-surface/dsh-planner.ts +1949 -0
  460. package/ts/src/booking-surface/dsh-plugin.js +378 -0
  461. package/ts/src/booking-surface/dsh-worker.ts +110 -0
  462. package/ts/src/booking-surface/error-codes.ts +241 -0
  463. package/ts/src/booking-surface/index.ts +9 -0
  464. package/ts/src/booking-surface/managed-dsh-cleanup-diagnostic.ts +151 -0
  465. package/ts/src/booking-surface/managed-dsh-run-port.ts +273 -0
  466. package/ts/src/booking-surface/profile.ts +42 -0
  467. package/ts/src/booking-surface/recovery-chain.ts +409 -0
  468. package/ts/src/booking-surface/runtime.ts +1793 -0
  469. package/ts/src/booking-surface/server.ts +733 -0
  470. package/ts/src/booking-surface/startup.ts +201 -0
  471. package/ts/src/booking-surface/validation.ts +217 -0
  472. package/ts/src/companions.ts +113 -0
  473. package/ts/src/contracts.ts +13 -3
  474. package/ts/src/dsh-llm.ts +44 -11
  475. package/ts/src/flyai-setup-tool.ts +77 -0
  476. package/ts/src/index.ts +1948 -198
  477. package/ts/src/itinerary-deck.ts +189 -0
  478. package/ts/src/itinerary-doc-shared.ts +741 -0
  479. package/ts/src/itinerary-html.ts +171 -0
  480. package/ts/src/loop.ts +223 -25
  481. package/ts/src/memory-capture.ts +283 -0
  482. package/ts/src/memory-decay.ts +55 -0
  483. package/ts/src/memory-utility.ts +70 -0
  484. package/ts/src/mock-llm.ts +4 -8
  485. package/ts/src/model.ts +88 -2
  486. package/ts/src/recall/card.ts +106 -0
  487. package/ts/src/recall/evaluator.ts +170 -0
  488. package/ts/src/recall/integration.ts +35 -0
  489. package/ts/src/recall/tick.ts +213 -0
  490. package/ts/src/session-link/plan-it-action.ts +78 -0
  491. package/ts/src/session-link/session-link.ts +275 -0
  492. package/ts/src/share/adapters.ts +93 -0
  493. package/ts/src/share/share-consent.ts +105 -0
  494. package/ts/src/share/share-deck.ts +85 -0
  495. package/ts/src/share/share-token.ts +166 -0
  496. package/ts/src/slot-spec.ts +172 -0
  497. package/ts/src/state-ledger.ts +912 -0
  498. package/ts/src/subagent-job-id-guard.ts +72 -0
  499. package/ts/src/time-anchor.ts +338 -0
  500. package/ts/src/tool-packet.ts +32 -0
  501. package/ts/src/travel-slots.ts +219 -0
  502. package/ts/src/travel-timeline.ts +83 -0
  503. package/ts/src/turn-deadline.ts +366 -0
  504. package/ts/src/turn-policy.ts +154 -0
  505. package/ts/src/unified.ts +354 -88
  506. package/ts/src/wish-pool.ts +79 -0
  507. package/dist/scripts/session-attach-wait.js +0 -41
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Runtime projection of the canonical booking.surface JSON Schema.
3
+ *
4
+ * dsh tools need self-contained JSON Schemas, while the canonical document is
5
+ * organized with local $refs. This helper derives each action branch directly
6
+ * from those canonical bytes and recursively inlines local references. No
7
+ * model-facing action schema is maintained by hand.
8
+ */
9
+
10
+ import { readFileSync } from 'node:fs'
11
+
12
+ const schemaUrl = new URL('../../../schemas/booking.surface.schema.json', import.meta.url)
13
+ export const canonicalBookingSurfaceSchema = JSON.parse(readFileSync(schemaUrl, 'utf8'))
14
+ const intentSchemaUrl = new URL('../../../schemas/booking.intent.schema.json', import.meta.url)
15
+ export const canonicalBookingIntentSchema = JSON.parse(readFileSync(intentSchemaUrl, 'utf8'))
16
+
17
+ function clone(value) {
18
+ return JSON.parse(JSON.stringify(value))
19
+ }
20
+
21
+ function definitionFromRef(ref, schema) {
22
+ const prefix = '#/$defs/'
23
+ if (typeof ref !== 'string' || !ref.startsWith(prefix)) {
24
+ throw new Error(`booking_schema_external_ref_forbidden:${String(ref)}`)
25
+ }
26
+ const name = ref.slice(prefix.length)
27
+ const definition = schema.$defs?.[name]
28
+ if (!definition) throw new Error(`booking_schema_missing_definition:${name}`)
29
+ return definition
30
+ }
31
+
32
+ function inlineLocalRefs(value, schema, stack = []) {
33
+ if (Array.isArray(value)) return value.map((item) => inlineLocalRefs(item, schema, stack))
34
+ if (typeof value !== 'object' || value === null) return value
35
+ if (typeof value.$ref === 'string') {
36
+ if (stack.includes(value.$ref)) throw new Error(`booking_schema_recursive_ref:${value.$ref}`)
37
+ const { $ref, ...siblings } = value
38
+ return {
39
+ ...inlineLocalRefs(definitionFromRef($ref, schema), schema, [...stack, $ref]),
40
+ ...inlineLocalRefs(siblings, schema, stack),
41
+ }
42
+ }
43
+ return Object.fromEntries(Object.entries(value).map(([key, item]) => [key, inlineLocalRefs(item, schema, stack)]))
44
+ }
45
+
46
+ function canonicalActionSchemaForKind(kind, schema, definitionName) {
47
+ const action = schema.$defs?.[definitionName]
48
+ if (!action) throw new Error('booking_schema_action_union_missing')
49
+ if (Array.isArray(action.allOf)) {
50
+ const branch = action.allOf.find((candidate) => candidate?.if?.properties?.kind?.const === kind)
51
+ const input = branch?.then?.properties?.input
52
+ if (!input) throw new Error(`booking_schema_action_kind_missing:${kind}`)
53
+ return clone(inlineLocalRefs({
54
+ type: action.type,
55
+ required: action.required,
56
+ properties: { ...action.properties, kind: { type: 'string', const: kind }, input },
57
+ additionalProperties: action.additionalProperties,
58
+ }, schema))
59
+ }
60
+ if (!Array.isArray(action.oneOf)) throw new Error('booking_schema_action_union_missing')
61
+ const branch = action.oneOf.find((candidate) => candidate?.allOf?.some((part) => part?.properties?.kind?.const === kind))
62
+ const base = schema.$defs?.ActionBase
63
+ const input = branch?.allOf?.find((part) => part?.properties?.input)?.properties?.input
64
+ if (!base || !input) throw new Error(`booking_schema_action_kind_missing:${kind}`)
65
+ return clone(inlineLocalRefs({
66
+ ...base,
67
+ properties: { ...base.properties, kind: { type: 'string', const: kind }, input },
68
+ }, schema))
69
+ }
70
+
71
+ export function canonicalBookingActionSchemaForKind(kind) {
72
+ return canonicalActionSchemaForKind(kind, canonicalBookingSurfaceSchema, 'Action')
73
+ }
74
+
75
+ const DSH_JSON_SCHEMA_KEYS = new Set([
76
+ 'type', 'oneOf', 'properties', 'required', 'additionalProperties', 'items',
77
+ 'enum', 'const', 'description', 'title', 'default', 'examples',
78
+ ])
79
+
80
+ function projectDshSchema(value) {
81
+ if (Array.isArray(value)) return value.map(projectDshSchema)
82
+ if (typeof value !== 'object' || value === null) return value
83
+ return Object.fromEntries(Object.entries(value)
84
+ .filter(([key]) => DSH_JSON_SCHEMA_KEYS.has(key))
85
+ .map(([key, item]) => {
86
+ if (key === 'properties') {
87
+ return [key, Object.fromEntries(Object.entries(item).map(([name, property]) => [name, projectDshSchema(property)]))]
88
+ }
89
+ return [key, projectDshSchema(item)]
90
+ }))
91
+ }
92
+
93
+ /**
94
+ * dsh-tools intentionally supports a smaller enforced JSON-Schema vocabulary.
95
+ * Keep the canonical shape/type/enum/closure guarantees at the model seam;
96
+ * the full canonical AJV validator remains the runtime authority for numeric,
97
+ * pattern, size and uniqueness constraints before an operation can be issued.
98
+ */
99
+ export function dshBookingActionSchemaForKind(kind) {
100
+ return projectDshSchema(canonicalBookingActionSchemaForKind(kind))
101
+ }
102
+
103
+ /** Self-contained intent schema with its sole public-contract ref inlined. */
104
+ export function canonicalBookingIntentProjectionSchema() {
105
+ const intent = clone(canonicalBookingIntentSchema)
106
+ intent.properties.offerCriteria = clone(inlineLocalRefs(
107
+ canonicalBookingSurfaceSchema.$defs.OfferCriteria,
108
+ canonicalBookingSurfaceSchema,
109
+ ))
110
+ return intent
111
+ }
112
+
113
+ /** Provider-advertised subset; execute-time validation uses the full form. */
114
+ export function dshBookingIntentProjectionSchema() {
115
+ return projectDshSchema(canonicalBookingIntentProjectionSchema())
116
+ }
@@ -0,0 +1,475 @@
1
+ /**
2
+ * Canonical TypeScript contract for HotelByte's embedded Booking Copilot.
3
+ *
4
+ * Executable facts cross this boundary only as discriminated data. Human text
5
+ * is limited to a user turn or an explanation and is never parsed as an action.
6
+ */
7
+
8
+ /** Compatibility line. Additive compatible changes retain this value; breaking changes must bump it. */
9
+ export const BOOKING_SURFACE_SCHEMA_VERSION = 'booking.surface' as const
10
+ /** Diagnostic SHA-256 of the exact local schema artifact; it detects drift but is not a compatibility gate. */
11
+ export const BOOKING_SURFACE_SCHEMA_SHA256 = 'a6b4ded86998a25a3345a0813d46cf7c43c9c91c14c5a6cac053af75f8064847' as const
12
+ export const BOOKING_SURFACE_VERSION_HEADER = 'x-booking-surface-version' as const
13
+ export const BOOKING_SURFACE_SCHEMA_SHA256_HEADER = 'x-booking-surface-schema-sha256' as const
14
+
15
+ /**
16
+ * Additive capabilities are sender-gated instead of creating a new contract
17
+ * line. A sender may use one only after every currently routable peer has
18
+ * advertised it; an omitted feature list therefore means no optional feature.
19
+ */
20
+ export const BOOKING_SURFACE_FEATURES = ['trusted-order-observation-v1'] as const
21
+ export type BookingSurfaceFeature = (typeof BOOKING_SURFACE_FEATURES)[number]
22
+ export const BOOKING_SURFACE_FEATURES_HEADER = 'x-booking-surface-features' as const
23
+
24
+ export interface BookingSurfaceFeatureAdvertisement {
25
+ /** Untrusted probe data. Unknown values are ignored; a missing/malformed list contributes no features. */
26
+ features?: unknown
27
+ [key: string]: unknown
28
+ }
29
+
30
+ function advertisedBookingSurfaceFeatures(advertisement: BookingSurfaceFeatureAdvertisement): Set<BookingSurfaceFeature> {
31
+ if (!Array.isArray(advertisement.features)) return new Set()
32
+ return new Set(advertisement.features.filter((feature): feature is BookingSurfaceFeature =>
33
+ typeof feature === 'string' && (BOOKING_SURFACE_FEATURES as readonly string[]).includes(feature)))
34
+ }
35
+
36
+ /**
37
+ * Computes the safe fleet intersection. Callers must supply one fresh
38
+ * advertisement for every routable release identity; an empty or mixed set
39
+ * disables optional fields instead of guessing from the schema hash.
40
+ */
41
+ export function bookingSurfaceFleetFeatures(advertisements: readonly BookingSurfaceFeatureAdvertisement[]): BookingSurfaceFeature[] {
42
+ if (advertisements.length === 0) return []
43
+ const advertised = advertisements.map(advertisedBookingSurfaceFeatures)
44
+ return BOOKING_SURFACE_FEATURES.filter((feature) => advertised.every((features) => features.has(feature)))
45
+ }
46
+
47
+ export const BOOKING_SURFACES = [
48
+ 'tenant',
49
+ 'customer_portal',
50
+ 'storefront',
51
+ 'payment_link',
52
+ ] as const
53
+ export type BookingSurface = (typeof BOOKING_SURFACES)[number]
54
+
55
+ /**
56
+ * Process composition modes are deliberately separate from the payload
57
+ * schema. The default accepts turns already bound by HotelByte's BFF; the
58
+ * second mode is reserved for an in-process BFF binding seam.
59
+ */
60
+ export const BOOKING_COPILOT_INGRESS_MODES = ['bff-bound-turn-only', 'bff-ingress-binding'] as const
61
+ export type BookingCopilotIngressMode = typeof BOOKING_COPILOT_INGRESS_MODES[number]
62
+ export const BOOKING_COPILOT_ACCEPTED_TURN_KINDS = ['user.turn', 'action.receipt.continuation'] as const
63
+ export const BOOKING_COPILOT_INGRESS_TURN_KIND = 'user.turn.ingress' as const
64
+ /** Hard task-level operation budget. The counter is persisted in the ledger. */
65
+ export const BOOKING_COPILOT_MAX_OPERATIONS = 20 as const
66
+
67
+ export const BOOKING_READ_ACTION_KINDS = ['search.patch','search.run','results.view.patch','hotel.focus','hotel.select','offers.query','offers.view.patch','offers.compare','offer.select','offer.check','checkout.prepare','order.observe'] as const
68
+ export type BookingReadActionKind = typeof BOOKING_READ_ACTION_KINDS[number]
69
+ /** Full read journey shared by tenant and customer-portal workspaces. */
70
+ export const BOOKING_FULL_JOURNEY_ACTION_KINDS = ['search.patch', 'search.run', 'results.view.patch', 'hotel.focus', 'offers.query', 'offers.view.patch', 'offers.compare', 'offer.select', 'offer.check', 'checkout.prepare', 'order.observe'] as const satisfies readonly BookingReadActionKind[]
71
+ /** Product-owned least-privilege action matrix. BFF bindings may narrow these lists, never expand them. */
72
+ export const BOOKING_SURFACE_ALLOWED_ACTIONS: Record<BookingSurface, readonly BookingReadActionKind[]> = {
73
+ tenant: BOOKING_FULL_JOURNEY_ACTION_KINDS,
74
+ customer_portal: BOOKING_FULL_JOURNEY_ACTION_KINDS,
75
+ storefront: ['search.patch', 'search.run', 'results.view.patch', 'hotel.focus'],
76
+ payment_link: ['search.patch', 'search.run', 'results.view.patch', 'hotel.focus', 'hotel.select'],
77
+ }
78
+ /** Stable product-matrix observation for UAT and server readiness proofs. */
79
+ export function bookingSurfaceAllowedActions(surface: BookingSurface): BookingReadActionKind[] {
80
+ return [...BOOKING_SURFACE_ALLOWED_ACTIONS[surface]]
81
+ }
82
+
83
+ /** BFF-facing allowlist after optional, fleet-safe feature negotiation. */
84
+ export function bookingSurfaceNegotiatedActions(surface: BookingSurface, advertisements: readonly BookingSurfaceFeatureAdvertisement[]): BookingReadActionKind[] {
85
+ return bookingSurfaceActionsForFeatures(surface, bookingSurfaceFleetFeatures(advertisements))
86
+ }
87
+
88
+ /** Applies an already-computed fleet intersection supplied by the trusted BFF. */
89
+ export function bookingSurfaceActionsForFeatures(surface: BookingSurface, features: readonly BookingSurfaceFeature[]): BookingReadActionKind[] {
90
+ return bookingSurfaceAllowedActions(surface).filter((action) =>
91
+ action !== 'order.observe' || features.includes('trusted-order-observation-v1'))
92
+ }
93
+
94
+ export type BookingRequestKey = string
95
+ /** Runtime-owned idempotency key; this is not a browser request key. */
96
+ export type BookingInternalDecisionKey = string
97
+
98
+ export const BOOKING_BLOCKER_CODES = ['no_hotels_matched','hotel_not_visible','hotel_rates_failed','criterion_must_not_met','offer_target_not_reached','offer_unavailable'] as const
99
+ export type BookingBlockerCode = typeof BOOKING_BLOCKER_CODES[number]
100
+ export const BOOKING_GAP_CODES = ['byos_mapped_risk','check_avail_failed','check_avail_unverified','component_executor_unavailable','hotel_not_visible','hotel_rates_failed','offer_facts_changed','offer_not_loaded','offer_unavailable','order_not_found','order_outcome_not_observed','order_state_unknown','order_status_unavailable','requested_offers_not_loaded','search_failed','search_form_invalid','search_session_expired','search_terminal_timeout','stale_revision','surface_adapter_failed','undo_token_not_found','unhandled','unsupported','verified_offer_required','workspace_changed_during_action','criterion_must_not_met','no_hotels_matched','offer_target_not_reached'] as const
101
+ export type BookingGapCode = typeof BOOKING_GAP_CODES[number]
102
+ export type BookingBlockerScope = 'search' | 'offer' | 'availability' | 'checkout'
103
+
104
+ export type CriterionStrength = 'must' | 'prefer'
105
+ export interface Criterion<T> {
106
+ strength: CriterionStrength
107
+ value: T
108
+ }
109
+
110
+ export interface Money {
111
+ /** Decimal string supplied by the authoritative page object; never recomputed by GoTry. */
112
+ amount: string
113
+ currency: string
114
+ sourceFactRef: string
115
+ }
116
+
117
+ export interface OccupancyRoom {
118
+ adults: number
119
+ childAges: number[]
120
+ }
121
+
122
+ export interface SearchCriteriaPatch {
123
+ destination?: {
124
+ query?: string
125
+ placeRef?: string
126
+ }
127
+ hotel?: Criterion<{
128
+ name?: string
129
+ hotelRef?: string
130
+ }>
131
+ stay?: {
132
+ checkIn?: string
133
+ checkOut?: string
134
+ }
135
+ occupancy?: {
136
+ rooms: OccupancyRoom[]
137
+ }
138
+ budget?: Criterion<{
139
+ min?: Money
140
+ max?: Money
141
+ }>
142
+ starRating?: Criterion<{
143
+ min?: number
144
+ max?: number
145
+ }>
146
+ guestRating?: Criterion<{
147
+ min: number
148
+ }>
149
+ facilities?: Criterion<{
150
+ allOf: string[]
151
+ }>
152
+ distance?: Criterion<{
153
+ anchorLabel?: string
154
+ anchorRef?: string
155
+ maxKm: number
156
+ }>
157
+ }
158
+
159
+ export type ResultSort =
160
+ | 'recommended'
161
+ | 'price_asc'
162
+ | 'price_desc'
163
+ | 'rating_desc'
164
+ | 'distance_asc'
165
+
166
+ export interface ResultsViewPatch {
167
+ starRating?: { min?: number; max?: number } | null
168
+ guestRatingMin?: number | null
169
+ facilitiesAllOf?: string[] | null
170
+ distance?: { anchorRef: string; maxKm: number } | null
171
+ price?: { min?: Money; max?: Money } | null
172
+ sort?: ResultSort
173
+ }
174
+
175
+ export interface OfferCriteria {
176
+ roomType?: Criterion<string[]>
177
+ bedType?: Criterion<string[]>
178
+ meals?: Criterion<string[]>
179
+ freeCancellation?: Criterion<boolean>
180
+ freeCancellationUntil?: Criterion<string>
181
+ totalPriceMax?: Criterion<Money>
182
+ roomsAvailableMin?: Criterion<number>
183
+ payAtProperty?: Criterion<boolean>
184
+ mobileRate?: Criterion<boolean>
185
+ targetCount?: number
186
+ sort?: 'best_match' | 'total_price_asc' | 'cancellation_latest'
187
+ }
188
+
189
+ export type EvidenceLevel = 'listed' | 'rate_loaded' | 'checked'
190
+
191
+ export interface SearchDraftSnapshot {
192
+ destination?: { query?: string; placeRef?: string }
193
+ stay?: { checkIn?: string; checkOut?: string }
194
+ occupancy?: { rooms: OccupancyRoom[] }
195
+ criteria?: SearchCriteriaPatch
196
+ }
197
+
198
+ export interface ResultViewSnapshot {
199
+ status: 'idle' | 'loading' | 'ready' | 'partial' | 'failed'
200
+ filters?: ResultsViewPatch
201
+ sort?: ResultSort
202
+ resultCount?: number
203
+ searchSessionRef?: string
204
+ }
205
+
206
+ export interface VisibleHotelFact {
207
+ hotelRef: string
208
+ name: string
209
+ starRating?: number
210
+ guestRating?: number
211
+ distanceKm?: number
212
+ facilityCodes?: string[]
213
+ factRefs: string[]
214
+ }
215
+
216
+ export interface LoadedOfferFact {
217
+ offerRef: string
218
+ offerVersionRef: string
219
+ hotelRef: string
220
+ evidenceLevel: EvidenceLevel
221
+ factRefs: string[]
222
+ }
223
+
224
+ export interface VerifiedOfferCapability {
225
+ offerRef: string
226
+ offerVersionRef: string
227
+ verifiedOfferRef: string
228
+ expiresAt: string
229
+ }
230
+
231
+ /** BFF-authoritative order reference exposed only to the internal workspace. */
232
+ export interface ObservableOrderFact {
233
+ orderRef: string
234
+ factRefs: string[]
235
+ }
236
+
237
+ export interface CriterionBlocker {
238
+ blockerId: string
239
+ sourceActionId: string
240
+ sourceReceiptDigest: string
241
+ scope: BookingBlockerScope
242
+ code: BookingBlockerCode
243
+ criterionPath: string
244
+ strength: 'must'
245
+ valueDigest: string
246
+ valueLabel?: string
247
+ evidence: { factRefs: string[]; gapCodes: BookingGapCode[]; requested?: number; actual?: number }
248
+ }
249
+
250
+ export interface RelaxationApproval {
251
+ taskId: string
252
+ contextRef: string
253
+ sourceTurnId: string
254
+ presentationRequestKey: string
255
+ optionDigest: string
256
+ approvalId: string
257
+ deliveryNonce: string
258
+ blockerId: string
259
+ sourceActionId: string
260
+ sourceReceiptDigest: string
261
+ scope: BookingBlockerScope
262
+ code: BookingBlockerCode
263
+ criterionPath: string
264
+ valueDigest: string
265
+ from: 'must'
266
+ to: 'prefer' | 'drop'
267
+ approved: true
268
+ }
269
+
270
+ export interface RelaxationApprovalRef {
271
+ approvalId: string
272
+ blockerId: string
273
+ contextRef: string
274
+ sourceTurnId: string
275
+ presentationRequestKey: string
276
+ sourceActionId: string
277
+ targetActionId: string
278
+ sourceRevision: number
279
+ targetActionKind: BookingReadActionKind
280
+ to: 'prefer' | 'drop'
281
+ expiresAt: string
282
+ nonce: string
283
+ sourceReceiptDigest: string
284
+ scope: BookingBlockerScope
285
+ code: BookingBlockerCode
286
+ criterionPath: string
287
+ valueDigest: string
288
+ }
289
+
290
+ interface BookingReadActionBase<K extends BookingReadActionKind, I> {
291
+ schemaVersion: typeof BOOKING_SURFACE_SCHEMA_VERSION
292
+ kind: K
293
+ actionId: string
294
+ contextRef: string
295
+ expectedRevision: number
296
+ reason: string
297
+ factRefs: string[]
298
+ input: I
299
+ relaxationApprovalRef?: RelaxationApprovalRef
300
+ }
301
+
302
+ export type SearchPatchAction = BookingReadActionBase<'search.patch', { patch: SearchCriteriaPatch }>
303
+ export type SearchRunAction = BookingReadActionBase<'search.run', Record<string, never>>
304
+ export type ResultsViewPatchAction = BookingReadActionBase<'results.view.patch', { patch: ResultsViewPatch }>
305
+ export type HotelFocusAction = BookingReadActionBase<'hotel.focus', { hotelRef: string }>
306
+ export type HotelSelectAction = BookingReadActionBase<'hotel.select', { hotelRef: string }>
307
+ export type OffersQueryAction = BookingReadActionBase<'offers.query', { hotelRefs: string[]; criteria: OfferCriteria }>
308
+ export type OffersViewPatchAction = BookingReadActionBase<'offers.view.patch', { hotelRef: string; criteria: OfferCriteria }>
309
+ export type OffersCompareAction = BookingReadActionBase<'offers.compare', { offerRefs: string[]; requestedCount: number }>
310
+ export type OfferSelectAction = BookingReadActionBase<'offer.select', { offerRef: string; offerVersionRef: string }>
311
+ export type OfferCheckAction = BookingReadActionBase<'offer.check', { offerRef: string; offerVersionRef: string }>
312
+ export type CheckoutPrepareAction = BookingReadActionBase<'checkout.prepare', { offerRef: string; offerVersionRef: string; verifiedOfferRef: string }>
313
+ export type OrderObserveAction = BookingReadActionBase<'order.observe', { orderRef: string }>
314
+
315
+ export type BookingReadAction =
316
+ | SearchPatchAction
317
+ | SearchRunAction
318
+ | ResultsViewPatchAction
319
+ | HotelFocusAction
320
+ | HotelSelectAction
321
+ | OffersQueryAction
322
+ | OffersViewPatchAction
323
+ | OffersCompareAction
324
+ | OfferSelectAction
325
+ | OfferCheckAction
326
+ | CheckoutPrepareAction
327
+ | OrderObserveAction
328
+
329
+ export interface BookingWorkspaceSnapshot {
330
+ schemaVersion: typeof BOOKING_SURFACE_SCHEMA_VERSION
331
+ contextRef: string
332
+ surface: BookingSurface
333
+ revision: number
334
+ locale: string
335
+ currency: string
336
+ searchDraft: SearchDraftSnapshot
337
+ results: ResultViewSnapshot
338
+ visibleHotels: VisibleHotelFact[]
339
+ loadedOffers: LoadedOfferFact[]
340
+ focusedHotelRef?: string
341
+ shortlistedOfferRefs: string[]
342
+ selectedOfferRef?: string
343
+ verifiedOffer?: VerifiedOfferCapability
344
+ /** Never accepted from browser IngressWorkspace; injected by trusted BFF binding. */
345
+ observableOrders?: ObservableOrderFact[]
346
+ capabilities: { surface: BookingSurface; allowedActions: BookingReadActionKind[] }
347
+ }
348
+
349
+ export type BookingWorkspaceIngressSnapshot = Pick<
350
+ BookingWorkspaceSnapshot,
351
+ 'schemaVersion' | 'revision' | 'locale' | 'currency' | 'searchDraft' | 'results' | 'visibleHotels' | 'loadedOffers' | 'focusedHotelRef' | 'shortlistedOfferRefs' | 'selectedOfferRef'
352
+ >
353
+
354
+ export type ActionObservation =
355
+ | { kind: 'search.state'; searchSessionRef?: string; resultCount?: number; gapCodes?: BookingGapCode[] }
356
+ | { kind: 'results.state'; matchedHotelRefs: string[]; visibleCount: number; gapCodes?: BookingGapCode[] }
357
+ | { kind: 'hotel.focus'; hotelRef: string }
358
+ | { kind: 'hotel.selection'; hotelRef: string }
359
+ | { kind: 'offers.state'; hotelRefs: string[]; offerRefs: string[]; loadedHotelCount: number; gapCodes?: BookingGapCode[] }
360
+ | { kind: 'offer.selection'; offerRef: string; offerVersionRef: string }
361
+ | { kind: 'offer.availability'; offerRef: string; checkedOfferVersionRef: string; currentOfferVersionRef?: string; verifiedOfferRef?: string; available: boolean; changedFactRefs: string[]; gapCodes?: BookingGapCode[] }
362
+ | { kind: 'checkout.handoff'; offerRef: string; offerVersionRef: string; verifiedOfferRef: string; handoffRef: string }
363
+ | { kind: 'order.state'; orderRef: string; state: 'pending' | 'verified' | 'failed' | 'unknown'; gapCodes?: BookingGapCode[] }
364
+ | { kind: 'gap'; code: BookingGapCode; factRefs: string[] }
365
+
366
+ export interface ResultContract {
367
+ outcome: 'complete' | 'partial' | 'empty'
368
+ requestedCount?: number
369
+ actualCount?: number
370
+ hardCriteriaMet: boolean
371
+ factRefs: string[]
372
+ gapCodes: BookingGapCode[]
373
+ blockers: CriterionBlocker[]
374
+ relaxationsApplied: RelaxationApproval[]
375
+ }
376
+
377
+ export interface ActionReceipt {
378
+ schemaVersion: typeof BOOKING_SURFACE_SCHEMA_VERSION
379
+ kind: 'action.receipt'
380
+ actionId: string
381
+ contextRef: string
382
+ status: 'applied' | 'needs_input' | 'partial' | 'no_match' | 'unavailable' | 'changed' | 'stale' | 'unsupported' | 'failed'
383
+ revision: number
384
+ observation: ActionObservation
385
+ resultContract: ResultContract
386
+ undoToken?: string
387
+ }
388
+
389
+ export interface UserTurn {
390
+ schemaVersion: typeof BOOKING_SURFACE_SCHEMA_VERSION
391
+ kind: 'user.turn'
392
+ taskId: string
393
+ turnId: string
394
+ workspace: BookingWorkspaceSnapshot
395
+ request: { text: string; approval?: RelaxationApproval }
396
+ }
397
+
398
+ /** Browser-to-BFF ingress. Identity is deliberately absent from this shape. */
399
+ export interface IngressTurn {
400
+ schemaVersion: typeof BOOKING_SURFACE_SCHEMA_VERSION
401
+ kind: 'user.turn.ingress'
402
+ requestKey: BookingRequestKey
403
+ taskHandle?: string
404
+ surfaceHint: BookingSurface
405
+ workspace: BookingWorkspaceIngressSnapshot
406
+ request: { text: string; approval?: RelaxationApproval }
407
+ }
408
+
409
+ export interface ReceiptContinuation {
410
+ schemaVersion: typeof BOOKING_SURFACE_SCHEMA_VERSION
411
+ kind: 'action.receipt.continuation'
412
+ taskId: string
413
+ workspace: BookingWorkspaceSnapshot
414
+ receipt: ActionReceipt
415
+ }
416
+
417
+ export type BookingCopilotTurn = UserTurn | IngressTurn | ReceiptContinuation
418
+
419
+ /** Typed BFF seam: implementations authenticate ingress and return only
420
+ * server-issued identity. The HTTP adapter constructs the internal UserTurn. */
421
+ export interface BookingIngressIdentityBinding {
422
+ taskId: string
423
+ turnId: string
424
+ contextRef: string
425
+ /** Authoritative BFF surface; never copied from the browser hint. */
426
+ surface: BookingSurface
427
+ /** BFF-authorized closed action subset for this surface. */
428
+ allowedActions: BookingReadActionKind[]
429
+ /** Optional trusted order projection; never supplied by browser ingress. */
430
+ observableOrders?: ObservableOrderFact[]
431
+ }
432
+
433
+ export interface BookingIngressPrincipal {
434
+ subject: string
435
+ scope: string
436
+ }
437
+
438
+ export interface BookingIngressBinding {
439
+ bind(input: IngressTurn, principal: BookingIngressPrincipal): BookingIngressIdentityBinding | Promise<BookingIngressIdentityBinding>
440
+ }
441
+
442
+ export interface BookingQuestionEvent {
443
+ schemaVersion: typeof BOOKING_SURFACE_SCHEMA_VERSION
444
+ eventId: string
445
+ taskId: string
446
+ contextRef: string
447
+ sequence: number
448
+ emittedAt: string
449
+ kind: 'question'
450
+ question: {
451
+ questionId: string
452
+ prompt: string
453
+ missingFields: string[]
454
+ type: 'relaxation_approval_required'
455
+ blocker: CriterionBlocker
456
+ approvalOptions: Array<{ approval: RelaxationApproval }>
457
+ }
458
+ }
459
+
460
+ export interface BookingEventBase {
461
+ schemaVersion: typeof BOOKING_SURFACE_SCHEMA_VERSION
462
+ eventId: string
463
+ taskId: string
464
+ contextRef: string
465
+ sequence: number
466
+ emittedAt: string
467
+ }
468
+
469
+ export type BookingSurfaceEvent =
470
+ | (BookingEventBase & { kind: 'status'; status: 'submitted' | 'working' | 'waiting_receipt' | 'input_required' })
471
+ | BookingQuestionEvent
472
+ | (BookingEventBase & { kind: 'operation'; action: BookingReadAction })
473
+ | (BookingEventBase & { kind: 'explanation'; explanation: { text: string; factRefs: string[] } })
474
+ | (BookingEventBase & { kind: 'terminal'; terminal: { status: 'completed' | 'stopped'; summary: string; factRefs: string[] } })
475
+ | (BookingEventBase & { kind: 'error'; error: { code: string; message: string; retryable: boolean } })