@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
@@ -1,3 +1,8 @@
1
+ /**
2
+ * S5 架构段重放:异步深度规划的会话形态(mock,零 API key)。
3
+ * 运行(在 ts/ 下):npx tsx scripts/replay-async.ts
4
+ * 验收:复杂行程 → 「一小时后回来看看」→ 回访交付已验证方案 + 选择题,不失望四条 4/4。
5
+ */
1
6
  import { join } from 'node:path';
2
7
  import { createMockLlm } from '../src/mock-llm.js';
3
8
  import { collectDeepPlanning, isComplex, newState, persistAsyncTicket, requestDeepPlanning, runTurn } from '../src/loop.js';
@@ -5,40 +10,37 @@ import { solveUnified } from '../src/unified.js';
5
10
  const llm = createMockLlm(join('..', 'data', 'flights_2026.json'));
6
11
  const state = newState();
7
12
  const history = [];
13
+ // 前三轮与 replay 相同:brief → 工作时间 → 已订酒店
8
14
  const turns = [
9
15
  '7.17周五22:40落地深圳……8.10周一凌晨从深圳起飞周一上班前到迪拜。请给我做机票和酒店的行程规划和推荐。',
10
16
  '我的工作时间是UTC+4的早上10点到下午7点',
11
- '我订了酒店:The Title East Wing Rawai,7.18入住 7.23 退房'
17
+ '我订了酒店:The Title East Wing Rawai,7.18入住 7.23 退房',
12
18
  ];
13
19
  let lastReply = '';
14
- for (const t of turns){
15
- const { reply } = await runTurn(state, t, llm, [
16
- ...history
17
- ], solveUnified);
18
- history.push({
19
- role: 'user',
20
- text: t
21
- }, {
22
- role: 'assistant',
23
- text: reply
24
- });
20
+ for (const t of turns) {
21
+ const { reply } = await runTurn(state, t, llm, [...history], solveUnified);
22
+ history.push({ role: 'user', text: t }, { role: 'assistant', text: reply });
25
23
  lastReply = reply;
26
24
  }
27
- if (!isComplex(state)) throw new Error('复杂度判据未命中,重放脚本与判据不一致');
25
+ // 第 4 轮:复杂度命中 → 切深度规划模式;工单持久化(跨进程存续,S5 编排半段)
26
+ if (!isComplex(state))
27
+ throw new Error('复杂度判据未命中,重放脚本与判据不一致');
28
28
  const { reply: asyncReply, ticket } = await requestDeepPlanning(state);
29
29
  const saved = await persistAsyncTicket(ticket, state);
30
30
  console.log('用户> (约束齐备,行程复杂)\n');
31
31
  console.log(`GoTry> ${asyncReply}\n`);
32
32
  console.log(`(工单已持久化:${saved}——任意后续进程可执行回收)\n`);
33
+ // --request-only:只请求不回收(种一张待回收工单,供调度器/下一进程实证)
33
34
  if (process.argv.includes('--request-only')) {
34
35
  console.log(`(request-only 模式结束;回收命令:npx tsx scripts/async-collect.ts ${ticket.id})`);
35
- } else {
36
+ }
37
+ else {
38
+ // 模拟一小时(mock 期秒级)——真实形态:另一个进程/loopx tick 执行 async-collect
36
39
  console.log('……(一小时后,另一个进程执行回收)……\n');
37
40
  const { reply: deliverable } = await collectDeepPlanning(state, ticket, solveUnified);
38
41
  console.log(`GoTry> ${deliverable}`);
39
- if (!deliverable.includes('4/4')) throw new Error('FAIL: 不失望四条未全过');
42
+ // 不失望四条是交付物的自检契约,未全过即重放失败
43
+ if (!deliverable.includes('4/4'))
44
+ throw new Error('FAIL: 不失望四条未全过');
40
45
  console.log(`\n(真实形态命令:npx tsx scripts/async-collect.ts ${ticket.id})`);
41
46
  }
42
-
43
-
44
- //# sourceURL=/Users/bytedance/work/gotry/ts/scripts/replay-async.ts
@@ -1,38 +1,38 @@
1
+ /**
2
+ * 真实重放(S4 验收入口):有 LLM_API_KEY(或旧别名 DEEPSEEK_API_KEY)走真 LLM,无则明确回退 mock。
3
+ * 运行(在 ts/ 下):npx tsx scripts/replay-real.ts
4
+ * S4 验收:同一开场白,真实对话质量 ≥ mock 重放(Kimi 复盘的验收标准)。
5
+ */
1
6
  import { join } from 'node:path';
2
7
  import { readFileSync } from 'node:fs';
8
+ // 仓根 .env(gitignored):每行 KEY=VALUE,不覆盖已有环境变量
3
9
  try {
4
- for (const line of readFileSync(join('..', '.env'), 'utf-8').split('\n')){
10
+ for (const line of readFileSync(join('..', '.env'), 'utf-8').split('\n')) {
5
11
  const m = line.match(/^([A-Z_]+)=(.*)$/);
6
- if (m && !process.env[m[1]]) process.env[m[1]] = m[2].trim();
12
+ if (m && !process.env[m[1]])
13
+ process.env[m[1]] = m[2].trim();
7
14
  }
8
- } catch {}
15
+ }
16
+ catch { /* .env 可选 */ }
9
17
  import { createMockLlm } from '../src/mock-llm.js';
10
18
  import { createOpenAICompatLlm } from '../src/dsh-llm.js';
11
19
  import { newState, runTurn } from '../src/loop.js';
12
20
  import { solveUnified } from '../src/unified.js';
21
+ import { realtimeSolvePort } from '../src/realtime-pricing.js';
13
22
  const useReal = Boolean(process.env['LLM_API_KEY'] ?? process.env['DEEPSEEK_API_KEY']);
14
23
  const llm = useReal ? createOpenAICompatLlm(join('..', 'data', 'flights_2026.json')) : createMockLlm(join('..', 'data', 'flights_2026.json'));
24
+ // 实时票价接缝(默认关):GOTRY_REALTIME_PRICING=1 时 dated 段经 FlyAI 实时价覆写,证据并进 skeleton_notes
25
+ const solvePort = realtimeSolvePort(solveUnified);
15
26
  console.log(useReal ? `=== 真 LLM 模式(${process.env['LLM_MODEL'] ?? 'MiniMax-M2'})===` : '=== 无 LLM_API_KEY,回退 mock(ADR-8)===\n');
16
27
  const state = newState();
17
28
  const history = [];
18
29
  const turns = [
19
30
  '7.17周五22:40落地深圳,7.18早上去香港办银行开户&保险签约;争取7.18当天飞泰国普吉岛……8.10周一凌晨从深圳起飞,周一上班前到迪拜。请给我做机票和酒店的行程规划和推荐。',
20
31
  '我的工作时间是UTC+4的早上10点到下午7点',
21
- '我订了酒店:The Title East Wing Rawai,7.18入住 7.23 退房'
32
+ '我订了酒店:The Title East Wing Rawai,7.18入住 7.23 退房',
22
33
  ];
23
- for (const t of turns){
24
- const { reply } = await runTurn(state, t, llm, [
25
- ...history
26
- ], solveUnified);
27
- history.push({
28
- role: 'user',
29
- text: t
30
- }, {
31
- role: 'assistant',
32
- text: reply
33
- });
34
+ for (const t of turns) {
35
+ const { reply } = await runTurn(state, t, llm, [...history], solvePort);
36
+ history.push({ role: 'user', text: t }, { role: 'assistant', text: reply });
34
37
  console.log(`\n用户> ${t.slice(0, 46)}…\nGoTry> ${reply}`);
35
38
  }
36
-
37
-
38
- //# sourceURL=/Users/bytedance/work/gotry/ts/scripts/replay-real.ts
@@ -1,3 +1,9 @@
1
+ /**
2
+ * S2 重放:真实对话的用户侧(压缩版)喂给循环,mock-LLM 扮演智能侧。
3
+ * 运行(在 ts/ 下):npx tsx scripts/replay.ts
4
+ * 验收:① 日历一次断言零反复 ② 系统先问工作窗口与已订资源(Kimi 第 6 轮才问)
5
+ * ③ 用户提供后 profile 填充,访谈收敛
6
+ */
1
7
  import { createMockLlm } from '../src/mock-llm.js';
2
8
  import { interviewNext, newState, runTurn } from '../src/loop.js';
3
9
  import { solveUnified } from '../src/unified.js';
@@ -7,110 +13,74 @@ let state = newState();
7
13
  const userTurns = [
8
14
  '7.17周五22:40落地深圳,7.18早上去香港办银行开户&保险签约;争取7.18当天飞泰国普吉岛……8.10周一凌晨从深圳起飞,周一上班前到迪拜。请给我做机票和酒店的行程规划和推荐。',
9
15
  '我的工作时间是UTC+4的早上10点到下午7点,晚上不一定有时间(至少得带电脑保持在线)',
10
- '我订了酒店:The Title East Wing Rawai,7.18入住 7.23 退房'
16
+ '我订了酒店:The Title East Wing Rawai,7.18入住 7.23 退房',
11
17
  ];
12
18
  const history = [];
13
- for (const turn of userTurns){
14
- const { reply } = await runTurn(state, turn, llm, [
15
- ...history
16
- ], (spec)=>{
17
- spec.skeletonHub = true;
18
- return solveUnified(spec);
19
- });
20
- history.push({
21
- role: 'user',
22
- text: turn
23
- }, {
24
- role: 'assistant',
25
- text: reply
26
- });
19
+ for (const turn of userTurns) {
20
+ const { reply } = await runTurn(state, turn, llm, [...history], ((spec) => { spec.skeletonHub = true; return solveUnified(spec); }));
21
+ history.push({ role: 'user', text: turn }, { role: 'assistant', text: reply });
27
22
  console.log(`\n用户> ${turn.slice(0, 50)}…`);
28
23
  console.log(`GoTry> ${reply}`);
29
24
  }
30
25
  console.log('\n===== 终态校验 =====');
31
26
  console.log('日历断言数:', Object.keys(state.calendar.assertedWeekdays).length, '| 2026-07-17 =', state.calendar.assertedWeekdays['2026-07-17']);
32
- console.log('workWindow:', state.profile.workWindow ? `${state.profile.workWindow.startMin / 60}:00-${state.profile.workWindow.endMin / 60}:00 UTC+${state.profile.workWindow.homeTzOffsetMin / 60}(证据:${state.profile.workWindow.evidence.slice(0, 24)}…)` : '缺失');
33
- console.log('bookedResources:', state.profile.bookedResources?.map((b)=>b.ref).join('; ') ?? '缺失');
27
+ const replayWorkWindow = state.profile.workWindow;
28
+ console.log('workWindow:', replayWorkWindow?.vacation === true
29
+ ? '休假(无工作窗口)'
30
+ : replayWorkWindow
31
+ ? `${replayWorkWindow.startMin / 60}:00-${replayWorkWindow.endMin / 60}:00 ${replayWorkWindow.homeTzOffsetMin === undefined ? 'IANA home zone' : `UTC+${replayWorkWindow.homeTzOffsetMin / 60}`}(证据:${replayWorkWindow.evidence.slice(0, 24)}…)`
32
+ : '缺失');
33
+ console.log('bookedResources:', state.profile.bookedResources?.map(b => b.ref).join('; ') ?? '缺失');
34
34
  const { missing } = interviewNext(state);
35
35
  console.log('剩余待问:', missing.length === 0 ? '无(除预算档未答,见下)' : missing.join(','));
36
+ // 终态断言——进 CI 的硬门槛:日历零反复、首轮问出工作窗口与已订资源、访谈收敛到只剩预算档
36
37
  const weekday = state.calendar.assertedWeekdays['2026-07-17'];
37
- if (weekday !== 'fri') throw new Error(`FAIL: 2026-07-17 应为 fri,实为 ${weekday}`);
38
- if (!state.profile.workWindow?.evidence) throw new Error('FAIL: workWindow 缺失或无证据');
39
- if (!state.profile.bookedResources?.length) throw new Error('FAIL: bookedResources 缺失');
40
- if (!(missing.length === 1 && missing[0] === 'budgetTier')) throw new Error(`FAIL: 剩余待问应为 [budgetTier],实为 [${missing.join(',')}]`);
38
+ if (weekday !== 'fri')
39
+ throw new Error(`FAIL: 2026-07-17 应为 fri,实为 ${weekday}`);
40
+ if (!state.profile.workWindow?.evidence)
41
+ throw new Error('FAIL: workWindow 缺失或无证据');
42
+ if (!state.profile.bookedResources?.length)
43
+ throw new Error('FAIL: bookedResources 缺失');
44
+ if (!(missing.length === 1 && missing[0] === 'budgetTier'))
45
+ throw new Error(`FAIL: 剩余待问应为 [budgetTier],实为 [${missing.join(',')}]`);
41
46
  console.log('REPLAY ASSERTS OK');
47
+ // ---- D-10 切片 C:spec↔槽位日期一致性闸 ------------------------------------------
48
+ // 两个面:① 单日期段 + 冲突槽位 → 闸拦下求解并追问,不猜、不静默采信;
49
+ // ② 多段行程(pack 全 spec)→ 槽位 v1 无逐段真值,闸必须旁路(2026-08-28 巡检
50
+ // 修正的回归:金标准六段行程曾被全段误判分歧,求解被永久拦截)。
42
51
  {
43
- const conflictScript = [
44
- {
52
+ const conflictScript = [{
45
53
  when: '重新算一下',
46
54
  extraction: {
47
55
  schema_version: 'travel_slot_extraction.v1',
48
56
  language: 'zh',
49
- domains: [
50
- 'requisition'
51
- ],
52
- slots: {
53
- requisition: {
54
- mode: 'create',
55
- destination: '普吉岛',
56
- start_date: '2026-12-25',
57
- trip_type: 'round_trip'
58
- }
59
- },
60
- missing_slots: []
61
- }
62
- }
63
- ];
64
- const solvePort = (spec)=>{
65
- spec.skeletonHub = true;
66
- return solveUnified(spec);
67
- };
57
+ domains: ['requisition'],
58
+ slots: { requisition: { mode: 'create', destination: '普吉岛', start_date: '2026-12-25', trip_type: 'round_trip' } },
59
+ missing_slots: [],
60
+ },
61
+ }];
62
+ const solvePort = ((spec) => { spec.skeletonHub = true; return solveUnified(spec); });
63
+ // ① 单日期段:分歧 → 拦截 + 追问 + 不求解
68
64
  const base = createMockLlm(join('..', 'data', 'flights_2026.json'), conflictScript);
69
65
  const singleSpecLlm = {
70
66
  ...base,
71
- extractSpec: async ()=>({
72
- segments: [
73
- {
74
- id: 's1',
75
- role: 'choice',
76
- date: '2026-07-01',
77
- options: [
78
- {
79
- id: 'o1',
80
- label: 'o1',
81
- move: {
82
- hub: 'SZX',
83
- services: [
84
- {
85
- id: 'f1',
86
- depMin: 600,
87
- arrMin: 700
88
- }
89
- ],
90
- bufferMin: 60,
91
- originTransferMin: 30,
92
- destTransferMin: 30
93
- }
94
- }
95
- ]
96
- }
97
- ]
98
- })
67
+ extractSpec: async () => ({
68
+ segments: [{ id: 's1', role: 'choice', date: '2026-07-01', options: [{ id: 'o1', label: 'o1', move: { hub: 'SZX', services: [{ id: 'f1', depMin: 600, arrMin: 700 }], bufferMin: 60, originTransferMin: 30, destTransferMin: 30 } }] }],
69
+ }),
99
70
  };
100
71
  const state1 = structuredClone(state);
101
72
  const solveBefore = state1.solve;
102
- const r1 = await runTurn(state1, '12月25日出发,重新算一下', singleSpecLlm, [
103
- ...history
104
- ], solvePort);
105
- if (!r1.reply.includes('日期分歧')) throw new Error(`FAIL: 单日期段分歧应被闸拦下,实际:${r1.reply.slice(0, 160)}`);
106
- if (r1.state.solve !== solveBefore) throw new Error('FAIL: 分歧时不应求解(spec 日期未确认)');
73
+ const r1 = await runTurn(state1, '12月25日出发,重新算一下', singleSpecLlm, [...history], solvePort);
74
+ if (!r1.reply.includes('日期分歧'))
75
+ throw new Error(`FAIL: 单日期段分歧应被闸拦下,实际:${r1.reply.slice(0, 160)}`);
76
+ if (r1.state.solve !== solveBefore)
77
+ throw new Error('FAIL: 分歧时不应求解(spec 日期未确认)');
78
+ // ② 多段行程:闸旁路 → 正常求解(无日期分歧文案)
107
79
  const state2 = structuredClone(state);
108
- const r2 = await runTurn(state2, '重新算一下', base, [
109
- ...history
110
- ], solvePort);
111
- if (r2.reply.includes('日期分歧')) throw new Error(`FAIL: 多段行程应旁路日期闸(无逐段真值不判),实际:${r2.reply.slice(0, 160)}`);
112
- if (!r2.state.solve) throw new Error('FAIL: 多段旁路后应正常求解');
80
+ const r2 = await runTurn(state2, '重新算一下', base, [...history], solvePort);
81
+ if (r2.reply.includes('日期分歧'))
82
+ throw new Error(`FAIL: 多段行程应旁路日期闸(无逐段真值不判),实际:${r2.reply.slice(0, 160)}`);
83
+ if (!r2.state.solve)
84
+ throw new Error('FAIL: 多段旁路后应正常求解');
113
85
  console.log('SPEC-SLOT DATE GATE OK(单日期段分歧拦截 + 多段旁路不误伤)');
114
86
  }
115
-
116
- //# sourceURL=/Users/bytedance/work/gotry/ts/scripts/replay.ts
@@ -1,31 +1,31 @@
1
+ /**
2
+ * CDP attach 诊断(RFC §2.2 路线 A=primary,founder「不能匿名实例」定案):
3
+ * 前置=日常 Chrome 开 chrome://inspect/#remote-debugging 开关(Chrome 144+)。
4
+ * 输出:attach 状态 + ctrip/meituan cookie 名单(登录票据校准)+ 登录态判定。只读,不导航。
5
+ * 注:Chrome 147 调试服务与 playwright 不兼容(握手后悬挂,实测),传输层一律 puppeteer-core(实测 2256 cookies)。
6
+ */
1
7
  import { openSession } from '../capabilities/session/transport.js';
2
- const t = await openSession({
3
- mode: 'cdp'
4
- });
8
+ import { LOGIN_COOKIE_NAMES } from '../capabilities/session/adapters/ctrip-flight.js';
9
+ const t = await openSession({ mode: 'cdp' });
5
10
  if (!t.ok) {
6
11
  console.log('ATTACH 失败:', t.summary);
7
12
  process.exit(1);
8
13
  }
9
14
  try {
10
- const all = await t.context.cookies();
15
+ const all = await t.browser.cookies();
11
16
  const byDom = {};
12
- for (const c of all){
17
+ for (const c of all) {
13
18
  const d = c.domain.replace(/^\./, '');
14
- if (/ctrip\.com$|meituan\.com$/.test(d)) (byDom[d] ??= []).push(c.name);
19
+ if (/ctrip\.com$|meituan\.com$/.test(d))
20
+ (byDom[d] ??= []).push(c.name);
15
21
  }
16
- console.log('ATTACH ok,共', all.length, '条 cookie');
17
- for (const [d, names] of Object.entries(byDom))console.log(d, '=>', names.sort().join(','));
18
- const ctripNames = new Set(Object.entries(byDom).filter(([d])=>d.includes('ctrip')).flatMap(([, n])=>n));
19
- const known = [
20
- 'cticket',
21
- 'uid',
22
- 'uname',
23
- 'passport'
24
- ].filter((k)=>ctripNames.has(k));
25
- console.log(known.length > 0 ? `携程登录态:在(${known.join(',')})` : '携程登录态:未检出(名单待以上输出校准)');
26
- } finally{
22
+ console.log('ATTACH ok,共', all.length, '条 cookie;相关域:');
23
+ for (const [d, names] of Object.entries(byDom))
24
+ console.log(' ', d, '=>', names.sort().join(','));
25
+ const ctripNames = new Set(Object.entries(byDom).filter(([d]) => d.includes('ctrip')).flatMap(([, n]) => n));
26
+ const known = LOGIN_COOKIE_NAMES.filter((k) => ctripNames.has(k));
27
+ console.log(known.length > 0 ? `携程登录态:在(${known.join(',')})` : '携程登录态:未检出——在你日常 Chrome 里正常登录携程即可(无需专门窗口)');
28
+ }
29
+ finally {
27
30
  await t.close();
28
31
  }
29
-
30
-
31
- //# sourceURL=/Users/bytedance/work/gotry/ts/scripts/session-attach-diagnose.ts
@@ -1,65 +1,62 @@
1
+ /**
2
+ * P0 PoC(RFC docs/rfc/user-session-data-rfc.md §4 P0-③):
3
+ * 专用测试 profile 打开携程机票 URL 参数搜索页,嗅探站内搜索 XHR 并打印 JSON。
4
+ * 只读:无 click/fill/submit;不进 CI;不动共享状态(profile 在 /tmp)。
5
+ * 运行:npx tsx scripts/session-attach-poc.ts [from-to] [YYYY-MM-DD]
6
+ */
1
7
  import { chromium } from "playwright-core";
2
- const route = process.argv[2] ?? "sha-ljg";
8
+ const route = process.argv[2] ?? "sha-ljg"; // 上海→丽江(IATA 三字码小写)
3
9
  const date = process.argv[3] ?? "2026-10-01";
4
10
  const url = `https://flights.ctrip.com/online/list/oneway-${route}?depdate=${date}`;
5
- const PROFILE = "/tmp/gotry-session-poc-profile";
11
+ const PROFILE = "/tmp/gotry-session-poc-profile"; // 专用测试 profile,绝不动日常浏览器
6
12
  async function main() {
7
13
  const ctx = await chromium.launchPersistentContext(PROFILE, {
8
- channel: "chrome",
9
- headless: false,
10
- viewport: {
11
- width: 1440,
12
- height: 900
13
- },
14
- args: [
15
- "--disable-blink-features=AutomationControlled"
16
- ]
14
+ channel: "chrome", // 用本机已装 Chrome,不下载浏览器
15
+ headless: false, // 可见窗口:人能看到 agent 在干什么(心智红线)
16
+ viewport: { width: 1440, height: 900 },
17
+ args: ["--disable-blink-features=AutomationControlled"],
17
18
  });
18
- const page = ctx.pages()[0] ?? await ctx.newPage();
19
+ const page = ctx.pages()[0] ?? (await ctx.newPage());
19
20
  const hits = [];
20
- const cap = (s)=>s.replace(/\s+/g, " ").slice(0, 600);
21
- ctx.on("response", async (res)=>{
21
+ const cap = (s) => s.replace(/\s+/g, " ").slice(0, 600);
22
+ ctx.on("response", async (res) => {
22
23
  const u = res.url();
23
24
  const ct = res.headers()["content-type"] ?? "";
24
- if (!ct.includes("json") || u.length > 400) return;
25
- if (!/search|list|flight|itinerary|poll/i.test(u)) return;
25
+ if (!ct.includes("json") || u.length > 400)
26
+ return;
27
+ // 只关心搜索/班期相关接口,过滤埋点与配置
28
+ if (!/search|list|flight|itinerary|poll/i.test(u))
29
+ return;
26
30
  try {
27
31
  const body = await res.text();
28
- if (body.length < 200) return;
29
- hits.push({
30
- url: u,
31
- bytes: body.length
32
- });
32
+ if (body.length < 200)
33
+ return; // 空壳响应不记
34
+ hits.push({ url: u, bytes: body.length });
33
35
  if (hits.length <= 3) {
34
36
  console.log(`\n[HIT ${hits.length}] ${res.status()} ${cap(u)}\n body(${body.length}B): ${cap(body)}`);
35
37
  }
36
- } catch {}
38
+ }
39
+ catch {
40
+ /* 响应体不可读(流式/竞态)则跳过 */
41
+ }
37
42
  });
38
43
  console.log(`goto ${url}`);
39
- await page.goto(url, {
40
- waitUntil: "domcontentloaded",
41
- timeout: 30_000
42
- });
43
- await page.waitForTimeout(15_000);
44
- const title = await page.title().catch(()=>"");
44
+ await page.goto(url, { waitUntil: "domcontentloaded", timeout: 30_000 });
45
+ await page.waitForTimeout(15_000); // 等首屏搜索接口回包
46
+ const title = await page.title().catch(() => "");
45
47
  console.log(`\ntitle: ${cap(title)}`);
46
- const html = await page.content().catch(()=>"");
48
+ const html = await page.content().catch(() => "");
47
49
  const challenged = /验证|滑块|captcha|verify/i.test(title + html.slice(0, 5000));
48
50
  console.log(`challenge-detected: ${challenged}`);
49
- console.log(`\nsummary: ${hits.length} 条搜索类 JSON XHR;总命中 ${hits.reduce((a, b)=>a + b.bytes, 0)}B`);
51
+ console.log(`\nsummary: ${hits.length} 条搜索类 JSON XHR;总命中 ${hits.reduce((a, b) => a + b.bytes, 0)}B`);
50
52
  console.log("按体积 top5(P1 适配器要嗅探的接口面):");
51
- for (const h of [
52
- ...hits
53
- ].sort((a, b)=>b.bytes - a.bytes).slice(0, 5)){
53
+ for (const h of [...hits].sort((a, b) => b.bytes - a.bytes).slice(0, 5)) {
54
54
  console.log(` ${h.bytes}B ${cap(h.url)}`);
55
55
  }
56
56
  console.log(challenged ? "结论:触发风控——按红线不重试不绕过,如实记录" : "结论:嗅探链路成立(只读,零交互)");
57
57
  await ctx.close();
58
58
  }
59
- main().catch((e)=>{
59
+ main().catch((e) => {
60
60
  console.error("PoC 失败:", e instanceof Error ? e.message : e);
61
61
  process.exit(1);
62
62
  });
63
-
64
-
65
- //# sourceURL=/Users/bytedance/work/gotry/ts/scripts/session-attach-poc.ts
@@ -0,0 +1,180 @@
1
+ /**
2
+ * #21 首切片的确定性验收:字段级 fixture scorer、双源合同与 waiting gate。
3
+ *
4
+ * 只构造脱敏内存 fixture;不访问网络、Chrome、登录态或共享产品状态。
5
+ */
6
+ import assert from 'node:assert/strict';
7
+ import { evaluateDoubleSource, scoreSessionFixture, } from '../capabilities/session/benchmark.js';
8
+ import { parseFlyaiItemList } from '../capabilities/flyai.js';
9
+ import { classifyTransportFailure } from '../capabilities/session-search.js';
10
+ let passed = 0;
11
+ function check(label, assertion) {
12
+ assertion();
13
+ passed += 1;
14
+ console.log(` ok - ${label}`);
15
+ }
16
+ const sessionFixture = {
17
+ query_id: 'sf-01',
18
+ route_segments: [{
19
+ from: '上海虹桥',
20
+ to: '丽江三义',
21
+ departure_at: '2026-10-01T07:35:00+08:00',
22
+ arrival_at: '2026-10-01T10:55:00+08:00',
23
+ transport_number: 'HO5577',
24
+ }],
25
+ journey_type: 'direct',
26
+ currency: 'CNY',
27
+ price: 1611,
28
+ source: 'ctrip-flight',
29
+ fetched_at: '2026-08-28T16:00:00Z',
30
+ verdict: 'hit',
31
+ latency_ms: 4200,
32
+ read_guard_blocked: 0,
33
+ };
34
+ const officialFixture = {
35
+ ...structuredClone(sessionFixture),
36
+ price: 230,
37
+ source: 'flyai',
38
+ fetched_at: '2026-08-28T15:59:00Z',
39
+ };
40
+ console.log('SESSION DOUBLE-SOURCE CONTRACT');
41
+ check('完整单段 fixture 为 13/13', () => {
42
+ const score = scoreSessionFixture(sessionFixture, structuredClone(sessionFixture));
43
+ assert.equal(score.pass, true);
44
+ assert.equal(score.accuracy, 1);
45
+ assert.equal(score.total, 13);
46
+ });
47
+ check('缺失 required 字段与错误价格都进入准确率分母', () => {
48
+ const actual = structuredClone(sessionFixture);
49
+ actual.currency = '';
50
+ actual.price = 999;
51
+ const score = scoreSessionFixture(sessionFixture, actual);
52
+ assert.equal(score.pass, false);
53
+ assert.deepEqual(score.missing, ['currency']);
54
+ assert.deepEqual(score.incorrect, ['price']);
55
+ assert.equal(score.accuracy, 11 / 13);
56
+ });
57
+ check('字段类型不一致不能靠字符串化蒙混过关', () => {
58
+ const actual = { ...structuredClone(sessionFixture), price: '1611' };
59
+ const score = scoreSessionFixture(sessionFixture, actual);
60
+ assert.equal(score.accuracy, 12 / 13);
61
+ assert.deepEqual(score.incorrect, ['price']);
62
+ });
63
+ check('非法 golden fixture 自身 fail-closed', () => {
64
+ const expected = { ...structuredClone(sessionFixture), price: 0 };
65
+ const score = scoreSessionFixture(expected, structuredClone(expected));
66
+ assert.equal(score.pass, false);
67
+ assert.deepEqual(score.fixture_errors, ['price']);
68
+ });
69
+ check('中转 fixture 逐段计分', () => {
70
+ const transfer = {
71
+ ...structuredClone(sessionFixture),
72
+ query_id: 'sf-02',
73
+ journey_type: 'transfer',
74
+ route_segments: [
75
+ structuredClone(sessionFixture.route_segments[0]),
76
+ {
77
+ from: '丽江三义',
78
+ to: '西双版纳嘎洒',
79
+ departure_at: '2026-10-02T08:20:00+08:00',
80
+ arrival_at: '2026-10-02T09:35:00+08:00',
81
+ transport_number: '8L9608',
82
+ },
83
+ ],
84
+ };
85
+ const score = scoreSessionFixture(transfer, structuredClone(transfer));
86
+ assert.equal(score.pass, true);
87
+ assert.equal(score.total, 18);
88
+ });
89
+ check('同路线班次可比,价格差只记录不判错', () => {
90
+ const result = evaluateDoubleSource({ official: officialFixture, session: sessionFixture });
91
+ assert.equal(result.state, 'comparable');
92
+ assert.deepEqual(result.mismatches, []);
93
+ assert.equal(result.price_delta, 1381);
94
+ assert.equal(result.quota_disposition, 'evidence_ready');
95
+ });
96
+ check('时刻不一致投影 divergent', () => {
97
+ const session = structuredClone(sessionFixture);
98
+ session.route_segments[0].arrival_at = '2026-10-01T11:15:00+08:00';
99
+ const result = evaluateDoubleSource({ official: officialFixture, session });
100
+ assert.equal(result.state, 'divergent');
101
+ assert.deepEqual(result.mismatches, ['route_segments[0].arrival_at']);
102
+ });
103
+ check('等价时区时刻保持 comparable', () => {
104
+ const session = structuredClone(sessionFixture);
105
+ session.route_segments[0].departure_at = '2026-09-30T23:35:00Z';
106
+ session.route_segments[0].arrival_at = '2026-10-01T02:55:00Z';
107
+ const result = evaluateDoubleSource({ official: officialFixture, session });
108
+ assert.equal(result.state, 'comparable');
109
+ });
110
+ check('needs-attach 为 waiting-user no-spend', () => {
111
+ const session = { ...structuredClone(sessionFixture), verdict: 'needs-attach' };
112
+ const result = evaluateDoubleSource({ official: officialFixture, session });
113
+ assert.equal(result.state, 'waiting_attach');
114
+ assert.equal(result.retry_allowed, false);
115
+ assert.equal(result.quota_disposition, 'no_spend_waiting_user');
116
+ });
117
+ check('CDP 缺席与握手失败稳定投影 needs-attach', () => {
118
+ assert.equal(classifyTransportFailure('日常 Chrome 未开调试端口', true), 'needs-attach');
119
+ assert.equal(classifyTransportFailure('cdp attach 失败:socket closed', true), 'needs-attach');
120
+ assert.equal(classifyTransportFailure('chrome launch failed', false), 'error');
121
+ });
122
+ check('needs-login 为 waiting-user no-spend', () => {
123
+ const session = { ...structuredClone(sessionFixture), verdict: 'needs-login' };
124
+ const result = evaluateDoubleSource({ official: officialFixture, session });
125
+ assert.equal(result.state, 'waiting_login');
126
+ assert.equal(result.retry_allowed, false);
127
+ assert.equal(result.quota_disposition, 'no_spend_waiting_user');
128
+ });
129
+ check('缺失 session 证据不擅自投影用户 gate', () => {
130
+ const result = evaluateDoubleSource({ official: officialFixture });
131
+ assert.equal(result.state, 'source_unavailable');
132
+ assert.equal(result.quota_disposition, 'no_spend_stop');
133
+ });
134
+ check('challenge 立即停止', () => {
135
+ const session = { ...structuredClone(sessionFixture), verdict: 'challenged' };
136
+ const result = evaluateDoubleSource({ official: officialFixture, session });
137
+ assert.equal(result.state, 'challenge_stop');
138
+ assert.equal(result.quota_disposition, 'no_spend_stop');
139
+ });
140
+ check('challenge 与 ReadGuard 优先于 waiting-user', () => {
141
+ const challengedOfficial = { ...structuredClone(officialFixture), verdict: 'challenged' };
142
+ const waitingSession = { ...structuredClone(sessionFixture), verdict: 'needs-attach' };
143
+ assert.equal(evaluateDoubleSource({ official: challengedOfficial, session: waitingSession }).state, 'challenge_stop');
144
+ waitingSession.read_guard_blocked = 1;
145
+ assert.equal(evaluateDoubleSource({ official: officialFixture, session: waitingSession }).state, 'guard_violation');
146
+ });
147
+ check('ReadGuard 非零 fail-closed', () => {
148
+ const session = { ...structuredClone(sessionFixture), read_guard_blocked: 1 };
149
+ const result = evaluateDoubleSource({ official: officialFixture, session });
150
+ assert.equal(result.state, 'guard_violation');
151
+ assert.equal(result.quota_disposition, 'no_spend_stop');
152
+ });
153
+ check('缺 required 合同字段时 fail-closed', () => {
154
+ const session = { ...structuredClone(sessionFixture), currency: '' };
155
+ const result = evaluateDoubleSource({ official: officialFixture, session });
156
+ assert.equal(result.state, 'invalid_contract');
157
+ assert.deepEqual(result.missing, ['session.currency']);
158
+ assert.equal(result.quota_disposition, 'no_spend_stop');
159
+ });
160
+ check('FlyAI stdout 前后噪声不污染完整业务 JSON', () => {
161
+ const payload = {
162
+ data: {
163
+ itemList: [{
164
+ journeys: [],
165
+ systemMessage: '提示含花括号 {limited} 与引号 "quoted" 仍属于 JSON 字符串',
166
+ }],
167
+ },
168
+ };
169
+ const noisy = `npm notice {not-json}\n${JSON.stringify(payload)}\npostflight log {done}`;
170
+ assert.deepEqual(parseFlyaiItemList(noisy), payload.data.itemList);
171
+ });
172
+ check('FlyAI stdout 可跳过前置诊断 JSON', () => {
173
+ const payload = { data: { itemList: [{ ticketPrice: '230.00' }] } };
174
+ assert.deepEqual(parseFlyaiItemList(`{"level":"info","message":"warmup"}\n${JSON.stringify(payload)}\n`), payload.data.itemList);
175
+ });
176
+ check('FlyAI 无完整 itemList 对象时保持 fail-closed', () => {
177
+ assert.throws(() => parseFlyaiItemList('{"data":{"itemList":['), /incomplete FlyAI JSON object/);
178
+ assert.throws(() => parseFlyaiItemList('{"message":"SentinelBlockException"}'), /no complete FlyAI itemList JSON object/);
179
+ });
180
+ console.log(`SESSION DOUBLE-SOURCE CONTRACT: ${passed} pass`);