@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,168 @@
1
+ /** Production composition entry for GoTry's BFF-only Booking Copilot server. */
2
+ import { mkdirSync } from 'node:fs';
3
+ import { isAbsolute, resolve } from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { ensureLedger } from '../state-ledger.js';
6
+ import { buildDshPlannerEnvironment, createDshEmbeddedBookingPlanner, } from './dsh-planner.js';
7
+ import { BookingCopilotTaskRuntime } from './runtime.js';
8
+ import { BOOKING_COPILOT_INGRESS_MODES } from './contracts.js';
9
+ import { startBookingCopilotServer, } from './server.js';
10
+ const DEFAULT_DEPENDENCIES = {
11
+ ensureLedger,
12
+ runtimeFactory: (ledger) => new BookingCopilotTaskRuntime(ledger),
13
+ createPlanner: createDshEmbeddedBookingPlanner,
14
+ startServer: startBookingCopilotServer,
15
+ };
16
+ function parsePort(raw) {
17
+ if (raw === undefined || raw === '')
18
+ return 3_082;
19
+ const value = Number(raw);
20
+ if (!Number.isSafeInteger(value) || value < 0 || value > 65_535)
21
+ throw new Error('booking_copilot_invalid_port');
22
+ return value;
23
+ }
24
+ /** Operator-tunable planner deadline; the bounds mirror the planner's own validation. */
25
+ function parsePlannerTurnTimeout(raw) {
26
+ if (raw === undefined || raw.trim() === '')
27
+ return undefined;
28
+ const value = Number(raw);
29
+ if (!Number.isSafeInteger(value) || value < 1 || value > 120_000) {
30
+ throw new Error('booking_copilot_planner_timeout_invalid');
31
+ }
32
+ return value;
33
+ }
34
+ export function resolveBookingCopilotStartupConfig(env = process.env) {
35
+ const apiKey = env.GOTRY_BOOKING_COPILOT_API_KEY ?? '';
36
+ if (!apiKey)
37
+ throw new Error('booking_copilot_api_key_required');
38
+ const stateRoot = env.GOTRY_BOOKING_COPILOT_STATE_ROOT ?? '';
39
+ if (!stateRoot)
40
+ throw new Error('booking_copilot_state_root_required');
41
+ if (!isAbsolute(stateRoot))
42
+ throw new Error('booking_copilot_state_root_must_be_absolute');
43
+ const artifactId = env.GOTRY_BOOKING_COPILOT_ARTIFACT_ID || undefined;
44
+ if (artifactId !== undefined && !/^[0-9a-f]{40}$/.test(artifactId)) {
45
+ throw new Error('booking_copilot_artifact_id_invalid');
46
+ }
47
+ const rawIngressMode = env.GOTRY_BOOKING_COPILOT_INGRESS_MODE;
48
+ const ingressMode = rawIngressMode === undefined || rawIngressMode === '' ? 'bff-bound-turn-only' : rawIngressMode;
49
+ if (!BOOKING_COPILOT_INGRESS_MODES.includes(ingressMode)) {
50
+ throw new Error('booking_copilot_ingress_mode_invalid');
51
+ }
52
+ return {
53
+ apiKey,
54
+ stateRoot,
55
+ host: env.GOTRY_BOOKING_COPILOT_HOST || '127.0.0.1',
56
+ port: parsePort(env.GOTRY_BOOKING_COPILOT_PORT),
57
+ artifactId,
58
+ plannerTurnTimeoutMs: parsePlannerTurnTimeout(env.GOTRY_BOOKING_COPILOT_PLANNER_TIMEOUT_MS),
59
+ ingressMode: ingressMode,
60
+ };
61
+ }
62
+ async function closeAll(server, planner, ledger) {
63
+ const failures = [];
64
+ for (const close of [
65
+ server ? () => server.close() : undefined,
66
+ planner ? () => planner.close() : undefined,
67
+ ledger ? () => Promise.resolve(ledger.close()) : undefined,
68
+ ]) {
69
+ if (!close)
70
+ continue;
71
+ try {
72
+ await close();
73
+ }
74
+ catch (error) {
75
+ failures.push(error);
76
+ }
77
+ }
78
+ if (failures.length === 1)
79
+ throw failures[0];
80
+ if (failures.length > 1)
81
+ throw new AggregateError(failures, 'booking_copilot_shutdown_failed');
82
+ }
83
+ /**
84
+ * Boot one process-scoped dsh core and task-scoped sessions behind the typed
85
+ * HTTP/SSE server. Only the HTTP layer receives the BFF deployment key.
86
+ */
87
+ export async function startBookingCopilotFromEnvironment(env = process.env, dependencies = DEFAULT_DEPENDENCIES) {
88
+ const config = resolveBookingCopilotStartupConfig(env);
89
+ const activeDependencies = dependencies;
90
+ const hasIngressBinding = Boolean(activeDependencies.ingressBinding);
91
+ const hasPrincipal = Boolean(activeDependencies.principal);
92
+ if (hasIngressBinding !== hasPrincipal)
93
+ throw new Error('booking_copilot_ingress_binding_pair_required');
94
+ const ingressPair = hasIngressBinding && hasPrincipal;
95
+ if (ingressPair && env.GOTRY_BOOKING_COPILOT_INGRESS_MODE !== undefined && config.ingressMode === 'bff-bound-turn-only') {
96
+ throw new Error('booking_copilot_ingress_mode_conflict');
97
+ }
98
+ if (!ingressPair && config.ingressMode === 'bff-ingress-binding')
99
+ throw new Error('booking_copilot_ingress_binding_required');
100
+ if (ingressPair && (typeof activeDependencies.ingressBinding?.bind !== 'function'
101
+ || typeof activeDependencies.principal?.subject !== 'string' || activeDependencies.principal.subject.length === 0 || activeDependencies.principal.subject.length > 256
102
+ || typeof activeDependencies.principal?.scope !== 'string' || activeDependencies.principal.scope.length === 0 || activeDependencies.principal.scope.length > 256)) {
103
+ throw new Error('booking_copilot_ingress_binding_invalid');
104
+ }
105
+ const activeIngressMode = ingressPair ? 'bff-ingress-binding' : 'bff-bound-turn-only';
106
+ mkdirSync(config.stateRoot, { recursive: true });
107
+ let ledger;
108
+ let planner;
109
+ let server;
110
+ try {
111
+ ledger = dependencies.ensureLedger(config.stateRoot);
112
+ const plannerOptions = {
113
+ stateRoot: config.stateRoot,
114
+ env: buildDshPlannerEnvironment(env),
115
+ ...(config.plannerTurnTimeoutMs === undefined ? {} : { turnTimeoutMs: config.plannerTurnTimeoutMs }),
116
+ };
117
+ const runtime = activeDependencies.runtimeFactory(ledger);
118
+ planner = await activeDependencies.createPlanner(plannerOptions);
119
+ server = await activeDependencies.startServer({
120
+ apiKey: config.apiKey, runtime, plannerFactory: planner.plannerFactory,
121
+ ...(ingressPair ? { ingressBinding: activeDependencies.ingressBinding, principal: activeDependencies.principal } : {}),
122
+ ingressMode: activeIngressMode,
123
+ host: config.host, port: config.port, artifactId: config.artifactId,
124
+ });
125
+ }
126
+ catch (error) {
127
+ try {
128
+ await closeAll(server, planner, ledger);
129
+ }
130
+ catch (cleanupError) {
131
+ throw new AggregateError([error, cleanupError], 'booking_copilot_startup_and_cleanup_failed');
132
+ }
133
+ throw error;
134
+ }
135
+ let closed = false;
136
+ return {
137
+ port: server.port,
138
+ async close() {
139
+ if (closed)
140
+ return;
141
+ closed = true;
142
+ await closeAll(server, planner, ledger);
143
+ },
144
+ };
145
+ }
146
+ async function runCli() {
147
+ const handle = await startBookingCopilotFromEnvironment();
148
+ process.stderr.write(`[gotry-booking-copilot] listening on http://127.0.0.1:${handle.port}/a2a/booking-copilot/turn\n`);
149
+ let stopping = false;
150
+ const stop = () => {
151
+ if (stopping)
152
+ return;
153
+ stopping = true;
154
+ void handle.close().then(() => process.exit(0), (error) => {
155
+ process.stderr.write(`[gotry-booking-copilot] shutdown failed: ${error instanceof Error ? error.message : String(error)}\n`);
156
+ process.exit(1);
157
+ });
158
+ };
159
+ process.once('SIGINT', stop);
160
+ process.once('SIGTERM', stop);
161
+ }
162
+ const invokedPath = process.argv[1] ? resolve(process.argv[1]) : '';
163
+ if (invokedPath === fileURLToPath(import.meta.url)) {
164
+ runCli().catch((error) => {
165
+ process.stderr.write(`[gotry-booking-copilot] startup failed: ${error instanceof Error ? error.message : String(error)}\n`);
166
+ process.exit(1);
167
+ });
168
+ }
@@ -0,0 +1,261 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { Ajv2020 } from 'ajv/dist/2020.js';
3
+ import { BOOKING_READ_ACTION_KINDS, BOOKING_BLOCKER_CODES, BOOKING_GAP_CODES } from './contracts.js';
4
+ const schema = JSON.parse(readFileSync(new URL('../../../schemas/booking.surface.schema.json', import.meta.url), 'utf8'));
5
+ const intentSchema = JSON.parse(readFileSync(new URL('../../../schemas/booking.intent.schema.json', import.meta.url), 'utf8'));
6
+ /** Canonical schema bytes (single source of truth) for prompt/tool derivations elsewhere. */
7
+ export const bookingSurfaceSchema = schema;
8
+ const ajv = new Ajv2020({ allErrors: true, strict: true });
9
+ ajv.addSchema(schema);
10
+ const validate = ajv.compile(schema);
11
+ const validateActionCanonical = ajv.compile({ $ref: `${schema.$id}#/$defs/Action` });
12
+ const validateBlockerCanonical = ajv.compile({ $ref: `${schema.$id}#/$defs/Blocker` });
13
+ const validateApprovalCanonical = ajv.compile({ $ref: `${schema.$id}#/$defs/Approval` });
14
+ const validateEventCanonical = ajv.compile({ $ref: `${schema.$id}#/$defs/Event` });
15
+ const validateIntentCanonical = ajv.compile(intentSchema);
16
+ const kinds = new Set(BOOKING_READ_ACTION_KINDS);
17
+ const codes = new Set(BOOKING_BLOCKER_CODES);
18
+ const gapCodes = new Set(BOOKING_GAP_CODES);
19
+ const safeOpaque = (value) => typeof value === 'string' && /^[A-Za-z0-9][A-Za-z0-9:._-]*$/.test(value);
20
+ const safeRequestKey = (value) => typeof value === 'string' && /^[A-Za-z0-9][A-Za-z0-9:._-]{7,127}$/.test(value) && !secret.test(value);
21
+ const secret = /(?:Bearer\s+\S|\bsk-(?!ill(?:s)?\b)[A-Za-z0-9_-]{12,}|\beyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+)/i;
22
+ // `.example` is reserved for documentation, so these identifiers cannot be a
23
+ // real mailbox. Do not allowlist lookalikes on routable domains.
24
+ const technicalEmail = /^(?:schema|version)@[a-z0-9-]+\.example$/i;
25
+ const currencyAmount = /\b(?:[A-Z]{3}\s*\d+(?:\.\d+)?|\d+(?:\.\d+)?\s*[A-Z]{3})\b/;
26
+ const rfc3339DateTime = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.(\d{1,9}))?(Z|([+-])(\d{2}):(\d{2}))$/;
27
+ export function isBookingDateTime(value) {
28
+ if (typeof value !== 'string')
29
+ return false;
30
+ const match = rfc3339DateTime.exec(value);
31
+ if (!match)
32
+ return false;
33
+ const [, yearText, monthText, dayText, hourText, minuteText, secondText] = match;
34
+ const year = Number(yearText);
35
+ const month = Number(monthText);
36
+ const day = Number(dayText);
37
+ const hour = Number(hourText);
38
+ const minute = Number(minuteText);
39
+ const second = Number(secondText);
40
+ const offsetHour = match[9] === undefined ? 0 : Number(match[9]);
41
+ const offsetMinute = match[10] === undefined ? 0 : Number(match[10]);
42
+ if (month < 1 || month > 12 || hour > 23 || minute > 59 || second > 59 || offsetHour > 23 || offsetMinute > 59)
43
+ return false;
44
+ const daysInMonth = new Date(Date.UTC(year, month, 0)).getUTCDate();
45
+ if (day < 1 || day > daysInMonth)
46
+ return false;
47
+ return !Number.isNaN(Date.parse(value));
48
+ }
49
+ function normalizedWords(value) {
50
+ return value.normalize('NFKC').replace(/[^\p{L}\p{N}.]+/gu, ' ').trim();
51
+ }
52
+ function hasSupplierCost(value) {
53
+ const normalized = normalizedWords(value);
54
+ const lower = normalized.toLowerCase();
55
+ return (/\b(?:supplier|vendor|internal)\b/.test(lower) &&
56
+ /\b(?:cost|rate|price)\b/.test(lower) &&
57
+ currencyAmount.test(normalized.toUpperCase()));
58
+ }
59
+ function hasInternationalPhone(value) {
60
+ const normalized = value.normalize('NFKC');
61
+ for (const plusIndex of normalized.split('').flatMap((char, index) => char === '+' ? [index] : [])) {
62
+ let digits = '';
63
+ for (const char of normalized.slice(plusIndex + 1, plusIndex + 48)) {
64
+ if (/\d/u.test(char))
65
+ digits += char;
66
+ else if (/\p{L}|@/u.test(char))
67
+ break;
68
+ if (digits.length > 15)
69
+ break;
70
+ }
71
+ if (/^[1-9]\d{7,14}$/.test(digits))
72
+ return true;
73
+ }
74
+ return false;
75
+ }
76
+ function hasPaymentCard(value) {
77
+ const normalized = value.normalize('NFKC');
78
+ const candidates = normalized.match(/(?:\d[ -]?){12,18}\d/g) ?? [];
79
+ const explicitlyLabeled = /\b(?:card|payment|visa|mastercard)\b/i.test(normalized);
80
+ return candidates.some((candidate) => (explicitlyLabeled || /[ -]/.test(candidate)) && luhn(candidate));
81
+ }
82
+ function hasSensitiveText(value, opts = {}) {
83
+ const normalized = value.normalize('NFKC');
84
+ if (normalized.includes('@') && !technicalEmail.test(normalized.trim()))
85
+ return true;
86
+ return secret.test(normalized) || hasInternationalPhone(normalized) || hasSupplierCost(normalized) || (!opts.allowOpaqueNumericId && hasPaymentCard(normalized));
87
+ }
88
+ function luhn(value) { const digits = value.replaceAll(/\D/g, ''); if (digits.length < 13 || digits.length > 19)
89
+ return false; let sum = 0; for (let i = digits.length - 1, parity = 0; i >= 0; i--, parity++) {
90
+ let n = Number(digits[i]);
91
+ if (parity % 2 === 1) {
92
+ n *= 2;
93
+ if (n > 9)
94
+ n -= 9;
95
+ }
96
+ sum += n;
97
+ } return sum % 10 === 0; }
98
+ const opaqueFieldNames = new Set([
99
+ 'eventId', 'taskId', 'contextRef', 'actionId', 'hotelRef', 'offerRef', 'offerVersionRef', 'checkedOfferVersionRef', 'currentOfferVersionRef', 'verifiedOfferRef',
100
+ 'orderRef', 'searchSessionRef', 'handoffRef', 'questionId', 'blockerId', 'approvalId',
101
+ 'sourceActionId', 'targetActionId', 'sourceTurnId', 'turnId', 'requestKey', 'taskHandle',
102
+ 'nonce', 'deliveryNonce', 'optionDigest', 'sourceReceiptDigest', 'valueDigest',
103
+ ]);
104
+ function isOpaqueFieldPath(path) {
105
+ const clean = path.replace(/\[\]$/g, '');
106
+ const field = clean.split('.').at(-1);
107
+ return field ? opaqueFieldNames.has(field) || field.endsWith('Ref') || field.endsWith('Refs') : false;
108
+ }
109
+ const scan = (v, path = '$') => typeof v === 'string'
110
+ ? hasSensitiveText(v, { allowOpaqueNumericId: isOpaqueFieldPath(path) })
111
+ : Array.isArray(v)
112
+ ? v.some((child) => scan(child, `${path}[]`))
113
+ : !!v && typeof v === 'object'
114
+ ? Object.entries(v).some(([k, x]) => /cost|price/i.test(k) ? /supplier|internal|wholesale/i.test(String(x)) : scan(x, `${path}.${k}`))
115
+ : false;
116
+ export function isSafeBookingRequestKey(value) { return safeRequestKey(value); }
117
+ function errors(v) { return (v.errors ?? []).map(e => `${e.instancePath || '$'}: ${e.message ?? e.keyword}`); }
118
+ function workspaceErrors(workspace, path) {
119
+ const e = [];
120
+ if (!workspace || typeof workspace !== 'object' || Array.isArray(workspace))
121
+ return e;
122
+ const loadedOffers = Array.isArray(workspace.loadedOffers) ? workspace.loadedOffers : [];
123
+ const offerRefs = loadedOffers.map((offer) => offer?.offerRef).filter((ref) => typeof ref === 'string');
124
+ const offerVersionRefs = loadedOffers.map((offer) => offer?.offerVersionRef).filter((ref) => typeof ref === 'string');
125
+ if (new Set(offerRefs).size !== offerRefs.length)
126
+ e.push(`${path}.loadedOffers: duplicate offerRef`);
127
+ if (new Set(offerVersionRefs).size !== offerVersionRefs.length)
128
+ e.push(`${path}.loadedOffers: duplicate offerVersionRef`);
129
+ const shortlisted = Array.isArray(workspace.shortlistedOfferRefs) ? workspace.shortlistedOfferRefs : [];
130
+ if (shortlisted.some((ref) => typeof ref !== 'string' || !loadedOffers.some((offer) => offer?.offerRef === ref))) {
131
+ e.push(`${path}.shortlistedOfferRefs: every ref must be a loaded offer`);
132
+ }
133
+ if (workspace.selectedOfferRef !== undefined && !loadedOffers.some((offer) => offer?.offerRef === workspace.selectedOfferRef)) {
134
+ e.push(`${path}.selectedOfferRef: loaded offer required`);
135
+ }
136
+ const verified = workspace.verifiedOffer;
137
+ if (verified !== undefined) {
138
+ if (!loadedOffers.some((offer) => offer?.offerRef === verified.offerRef && offer?.offerVersionRef === verified.offerVersionRef))
139
+ e.push(`${path}.verifiedOffer: loaded offer version required`);
140
+ if (!safeOpaque(verified.verifiedOfferRef) || !isBookingDateTime(verified.expiresAt))
141
+ e.push(`${path}.verifiedOffer: safe ref and parseable expiry required`);
142
+ }
143
+ return e;
144
+ }
145
+ function cross(value) {
146
+ const e = [];
147
+ if (scan(value))
148
+ e.push('$: unsafe PII/payment/supplier-cost/credential text');
149
+ if (!value || typeof value !== 'object' || Array.isArray(value))
150
+ return e;
151
+ const x = value;
152
+ const semantic = x.kind === 'action.receipt.continuation' ? x.receipt : x;
153
+ if (x.workspace && x.kind !== 'user.turn.ingress')
154
+ e.push(...workspaceErrors(x.workspace, '$.workspace'));
155
+ if (x.schemaVersion === 'booking.surface' && Array.isArray(x.loadedOffers))
156
+ e.push(...workspaceErrors(x, '$'));
157
+ if (x.kind === 'user.turn.ingress') {
158
+ if (!safeRequestKey(x.requestKey))
159
+ e.push('$.requestKey: safe opaque request key required');
160
+ const workspace = x.workspace;
161
+ e.push(...workspaceErrors(workspace, '$.workspace'));
162
+ const visibleHotels = Array.isArray(workspace?.visibleHotels) ? workspace.visibleHotels : [];
163
+ const loadedOffers = Array.isArray(workspace?.loadedOffers) ? workspace.loadedOffers : [];
164
+ if (workspace?.focusedHotelRef !== undefined && !visibleHotels.some((hotel) => hotel?.hotelRef === workspace.focusedHotelRef))
165
+ e.push('$.workspace.focusedHotelRef: visible hotel required');
166
+ const selectedOffer = workspace?.selectedOfferRef === undefined ? undefined : loadedOffers.find((offer) => offer?.offerRef === workspace.selectedOfferRef);
167
+ if (workspace?.selectedOfferRef !== undefined && !selectedOffer)
168
+ e.push('$.workspace.selectedOfferRef: loaded offer required');
169
+ if (selectedOffer && !visibleHotels.some((hotel) => hotel?.hotelRef === selectedOffer.hotelRef))
170
+ e.push('$.workspace.selectedOfferRef: offer hotel must be visible');
171
+ }
172
+ if (semantic !== x && semantic?.resultContract?.hardCriteriaMet === true && semantic.resultContract.blockers?.length)
173
+ e.push('$.receipt.resultContract: hardCriteriaMet cannot coexist with blockers');
174
+ if (kinds.has(x.kind)) {
175
+ const allowed = {
176
+ 'search.patch': ['patch'], 'search.run': [], 'results.view.patch': ['patch'],
177
+ 'hotel.focus': ['hotelRef'], 'hotel.select': ['hotelRef'],
178
+ 'offers.query': ['hotelRefs', 'criteria'], 'offers.view.patch': ['hotelRef', 'criteria'],
179
+ 'offers.compare': ['offerRefs', 'requestedCount'], 'offer.select': ['offerRef', 'offerVersionRef'],
180
+ 'offer.check': ['offerRef', 'offerVersionRef'], 'checkout.prepare': ['offerRef', 'offerVersionRef', 'verifiedOfferRef'], 'order.observe': ['orderRef'],
181
+ };
182
+ const input = x.input;
183
+ if (!input || typeof input !== 'object' || Array.isArray(input) || Object.keys(input).some(k => !allowed[x.kind].includes(k)))
184
+ e.push('$.input: closed kind-specific input required');
185
+ }
186
+ if (x.kind === 'action.receipt' && x.resultContract?.hardCriteriaMet === true && x.resultContract.blockers?.length)
187
+ e.push('$.resultContract: hardCriteriaMet cannot coexist with blockers');
188
+ if (x.kind === 'user.turn' && Array.isArray(x.request?.approval))
189
+ e.push('$.request.approval: at most one approval');
190
+ if (x.kind === 'action.receipt' || x.kind === 'action.receipt.continuation') {
191
+ const r = x.kind === 'action.receipt.continuation' ? x.receipt : x;
192
+ if (r?.resultContract?.gapCodes?.some((code) => !gapCodes.has(String(code))))
193
+ e.push('$.resultContract.gapCodes: unregistered gap code');
194
+ const observation = r?.observation;
195
+ if (observation?.kind === 'offer.availability') {
196
+ if (r.status === 'applied' && (observation.available !== true || !observation.verifiedOfferRef || observation.currentOfferVersionRef !== observation.checkedOfferVersionRef || observation.changedFactRefs?.length || observation.gapCodes?.length))
197
+ e.push('$.observation: applied availability requires unchanged checked/current version, verified ref, and no gaps');
198
+ if (r.status === 'applied' && (r.resultContract?.outcome !== 'complete' || r.resultContract?.hardCriteriaMet !== true || r.resultContract?.gapCodes?.length || r.resultContract?.blockers?.length))
199
+ e.push('$.resultContract: applied availability requires complete hard-criteria result without gaps or blockers');
200
+ if (r.status === 'changed' && (observation.available !== true || !observation.currentOfferVersionRef || observation.currentOfferVersionRef === observation.checkedOfferVersionRef || !observation.changedFactRefs?.length || observation.verifiedOfferRef))
201
+ e.push('$.observation: changed availability requires available replacement current version without verified ref');
202
+ if ((r.status === 'unavailable' || r.status === 'no_match') && (observation.available !== false || observation.currentOfferVersionRef || observation.verifiedOfferRef))
203
+ e.push('$.observation: negative availability must not expose current or verified version');
204
+ if (r.status !== 'applied' && observation.verifiedOfferRef)
205
+ e.push('$.observation: only applied availability may expose verified ref');
206
+ }
207
+ }
208
+ const blocker = x.blocker ?? x.question?.blocker;
209
+ if (blocker && !/^(searchDraft|results|offers|checkout)(\.[A-Za-z][A-Za-z0-9_]*){0,3}$/.test(blocker.criterionPath ?? ''))
210
+ e.push('$.blocker.criterionPath: closed criterion path required');
211
+ if (blocker?.evidence?.factRefs && new Set(blocker.evidence.factRefs).size !== blocker.evidence.factRefs.length)
212
+ e.push('$.blocker.evidence.factRefs: unique refs required');
213
+ if (x.kind === 'question' && blocker && Array.isArray(x.question?.approvalOptions)) {
214
+ for (const [i, option] of x.question.approvalOptions.entries()) {
215
+ const result = validateApprovalAgainstBlocker(option?.approval, blocker);
216
+ if (!result.ok)
217
+ e.push(...result.errors.map(error => `$.question.approvalOptions[${i}].${error.slice(2)}`));
218
+ if (option?.approval?.taskId !== x.taskId)
219
+ e.push(`$.question.approvalOptions[${i}].approval.taskId: must match event`);
220
+ if (option?.approval?.contextRef !== x.contextRef)
221
+ e.push(`$.question.approvalOptions[${i}].approval.contextRef: must match event`);
222
+ }
223
+ }
224
+ if (kinds.has(String(x.kind)) && x.relaxationApprovalRef) {
225
+ const ref = x.relaxationApprovalRef;
226
+ if (ref.contextRef !== x.contextRef)
227
+ e.push('$.relaxationApprovalRef.contextRef: must match action');
228
+ if (ref.sourceRevision !== x.expectedRevision)
229
+ e.push('$.relaxationApprovalRef.sourceRevision: must equal action revision');
230
+ if (ref.targetActionKind !== x.kind)
231
+ e.push('$.relaxationApprovalRef.targetActionKind: must match action kind');
232
+ if (ref.targetActionId !== x.actionId)
233
+ e.push('$.relaxationApprovalRef.targetActionId: must match action id');
234
+ // Expiry and one-time consumption are runtime concerns; validation checks only structure/binding.
235
+ if (!safeOpaque(ref.nonce) || !isBookingDateTime(ref.expiresAt))
236
+ e.push('$.relaxationApprovalRef: invalid expiry or nonce');
237
+ }
238
+ if (x.kind === 'question' && (!Array.isArray(x.question?.approvalOptions) || x.question.approvalOptions.length < 1 || x.question.approvalOptions.length > 2))
239
+ e.push('$.question.approvalOptions: one or two options required');
240
+ return e;
241
+ }
242
+ export function validateBookingSurface(value) { const ok = validate(value); const e = ok ? [] : errors(validate); e.push(...cross(value)); return e.length ? { ok: false, errors: e } : { ok: true }; }
243
+ function fromCanonical(fn, value) { const ok = fn(value); const e = ok ? [] : errors(fn); e.push(...cross(value)); return e.length ? { ok: false, errors: e } : { ok: true }; }
244
+ export function validateBookingReadAction(value) { return fromCanonical(validateActionCanonical, value); }
245
+ export function validateCriterionBlocker(value) { return fromCanonical(validateBlockerCanonical, value); }
246
+ export function validateRelaxationApproval(value) { return fromCanonical(validateApprovalCanonical, value); }
247
+ export function validateBookingSurfaceEvent(value) { return fromCanonical(validateEventCanonical, value); }
248
+ export function validateBookingIntentProjection(value) { return fromCanonical(validateIntentCanonical, value); }
249
+ export function validateApprovalAgainstBlocker(approval, blocker) {
250
+ const a = approval;
251
+ const b = blocker;
252
+ const blockerResult = validateCriterionBlocker(b);
253
+ if (!blockerResult.ok)
254
+ return blockerResult;
255
+ const approvalResult = validateRelaxationApproval(a);
256
+ if (!approvalResult.ok)
257
+ return approvalResult;
258
+ const fields = ['blockerId', 'sourceActionId', 'sourceReceiptDigest', 'scope', 'code', 'criterionPath', 'valueDigest'];
259
+ const mismatches = fields.filter(field => a[field] !== b?.[field]);
260
+ return mismatches.length ? { ok: false, errors: mismatches.map(field => `$.${field}: approval does not match blocker`) } : { ok: true };
261
+ }
@@ -1,34 +1,41 @@
1
+ /**
2
+ * GoTry 桥接工具集(纯 Node 版,无 Python 依赖):
3
+ * - ensureStateDir: 状态目录创建
4
+ * - recordLatency: 延迟日志追加
5
+ * - readJson / writeJson: JSON 文件安全读写
6
+ *
7
+ * 历史:曾有 callFeasibilityEngine 用 spawn(.venv/bin/python) 起 Python CLI,
8
+ * 作为 TS 求解的回退路径。D-7 切轨后 unified solveChoiceSegment 是唯一求解入口,
9
+ * Python oracle 路径于 v0.0.1-rc.2 移除——npm 一键分发不再需要 Python 运行时依赖。
10
+ */
1
11
  import { appendFile, mkdir, readFile, writeFile } from 'node:fs/promises';
2
12
  import { join } from 'node:path';
13
+ /** 状态目录:动机画像 / wish pool 的落盘位置(红线 6:用户数据可见、可编辑、可删除) */
3
14
  export async function ensureStateDir(root) {
4
15
  const dir = join(root, 'gotry-state');
5
- await mkdir(dir, {
6
- recursive: true
7
- });
16
+ await mkdir(dir, { recursive: true });
8
17
  return dir;
9
18
  }
19
+ /** JSON 安全读取:文件不存在返回 fallback,解析失败抛错 */
10
20
  export async function readJson(path, fallback) {
11
21
  try {
12
22
  const text = await readFile(path, 'utf-8');
13
23
  return JSON.parse(text);
14
- } catch (e) {
15
- if (e.code === 'ENOENT') return fallback;
24
+ }
25
+ catch (e) {
26
+ if (e.code === 'ENOENT')
27
+ return fallback;
16
28
  throw e;
17
29
  }
18
30
  }
31
+ /** JSON 原子写入 */
19
32
  export async function writeJson(path, value) {
20
33
  const tmp = `${path}.tmp`;
21
34
  await writeFile(tmp, JSON.stringify(value, null, 2), 'utf-8');
22
35
  const { rename } = await import('node:fs/promises');
23
36
  await rename(tmp, path);
24
37
  }
38
+ /** 桥接延迟日志(追加式;T5 成本工程的度量数据源之一) */
25
39
  export async function recordLatency(logPath, latencyMs, kind) {
26
- await appendFile(logPath, JSON.stringify({
27
- ts: new Date().toISOString(),
28
- kind,
29
- latencyMs
30
- }) + '\n');
40
+ await appendFile(logPath, JSON.stringify({ ts: new Date().toISOString(), kind, latencyMs }) + '\n');
31
41
  }
32
-
33
-
34
- //# sourceURL=/Users/bytedance/work/gotry/ts/src/bridge.ts