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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (507) hide show
  1. package/README.md +172 -219
  2. package/README.zh-CN.md +222 -0
  3. package/bin/gotry-backend.js +53 -0
  4. package/bin/gotry-booking-copilot.js +53 -0
  5. package/bin/gotry-bootstrap.js +1744 -0
  6. package/bin/gotry-inner.js +733 -83
  7. package/bin/gotry-process-liveness.d.ts +27 -0
  8. package/bin/gotry-process-liveness.js +97 -0
  9. package/bin/gotry-runtime-resolution.d.ts +27 -0
  10. package/bin/gotry-runtime-resolution.js +49 -0
  11. package/bin/gotry.js +1 -1
  12. package/client/client.js +203 -0
  13. package/cordis.gotry-patch.yml +80 -56
  14. package/data/airline-airports.json +39 -0
  15. package/data/stations-12306-verify.json +524 -0
  16. package/dist/capabilities/agent-reach-deep.js +45 -122
  17. package/dist/capabilities/agent-reach.js +101 -146
  18. package/dist/capabilities/anything.js +135 -94
  19. package/dist/capabilities/artifacts.js +370 -0
  20. package/dist/capabilities/channel-health.js +131 -0
  21. package/dist/capabilities/channel-registry.js +256 -0
  22. package/dist/capabilities/doctor.js +546 -0
  23. package/dist/capabilities/effect.js +394 -0
  24. package/dist/capabilities/external-event.js +149 -0
  25. package/dist/capabilities/fact-log.js +55 -0
  26. package/dist/capabilities/flyai-config.js +337 -0
  27. package/dist/capabilities/flyai.js +947 -110
  28. package/dist/capabilities/fx-contract.js +293 -0
  29. package/dist/capabilities/geo-atlas.js +246 -0
  30. package/dist/capabilities/ground-transfer.js +509 -0
  31. package/dist/capabilities/hbcli.js +260 -123
  32. package/dist/capabilities/hotelbyte-transaction.js +194 -0
  33. package/dist/capabilities/incident-log.js +131 -61
  34. package/dist/capabilities/itinerary-artifact.js +190 -0
  35. package/dist/capabilities/itinerary-deck-artifact.js +194 -0
  36. package/dist/capabilities/itinerary-deck-export.js +339 -0
  37. package/dist/capabilities/lavish-local.js +924 -0
  38. package/dist/capabilities/model-override.js +38 -0
  39. package/dist/capabilities/opensky.js +54 -43
  40. package/dist/capabilities/resilience.js +191 -0
  41. package/dist/capabilities/session/action-cache.js +50 -44
  42. package/dist/capabilities/session/adapters/ctrip-flight.js +120 -62
  43. package/dist/capabilities/session/adapters/ctrip-hotel.js +222 -0
  44. package/dist/capabilities/session/adapters/dida-portal.js +274 -0
  45. package/dist/capabilities/session/adapters/meituan-local.js +35 -54
  46. package/dist/capabilities/session/adapters/rail-12306.js +342 -0
  47. package/dist/capabilities/session/benchmark.js +189 -0
  48. package/dist/capabilities/session/bridge-ledger.js +224 -0
  49. package/dist/capabilities/session/extension-bridge.js +636 -0
  50. package/dist/capabilities/session/extension-channel.js +109 -0
  51. package/dist/capabilities/session/extension-distribution.js +230 -0
  52. package/dist/capabilities/session/extract.js +31 -21
  53. package/dist/capabilities/session/golden-score.js +114 -0
  54. package/dist/capabilities/session/health-watch.js +215 -0
  55. package/dist/capabilities/session/read-guard.js +75 -24
  56. package/dist/capabilities/session/static-flight-golden.js +150 -0
  57. package/dist/capabilities/session/transport.js +97 -83
  58. package/dist/capabilities/session/wizard.js +117 -0
  59. package/dist/capabilities/session-consent.js +178 -0
  60. package/dist/capabilities/session-login.js +170 -0
  61. package/dist/capabilities/session-search.js +635 -44
  62. package/dist/capabilities/spawn-bounded.js +203 -0
  63. package/dist/capabilities/sponsor-plugin.js +341 -0
  64. package/dist/capabilities/visa-policy.js +140 -0
  65. package/dist/capabilities/weather.js +243 -138
  66. package/dist/data/session-golden-20.json +25 -0
  67. package/dist/data/sf-golden-manifest.json +103 -0
  68. package/dist/data/sf-static-routes.json +91 -0
  69. package/dist/scripts/action-cache-tests.js +24 -59
  70. package/dist/scripts/agent-planning-turn-deadline-e2e.js +242 -0
  71. package/dist/scripts/agent-planning-turn-deadline-tests.js +185 -0
  72. package/dist/scripts/agent-reach-deep-tests.js +30 -40
  73. package/dist/scripts/agent-reach-error-tests.js +354 -0
  74. package/dist/scripts/agent-reach-tests.js +26 -18
  75. package/dist/scripts/agent-reach-wrapper-tests.js +50 -50
  76. package/dist/scripts/anything-tests.js +116 -60
  77. package/dist/scripts/artifact-client-contract-tests.js +220 -0
  78. package/dist/scripts/artifacts-capability-tests.js +727 -0
  79. package/dist/scripts/async-collect.js +50 -11
  80. package/dist/scripts/benchmark-environment-bridge-e2e.js +741 -0
  81. package/dist/scripts/benchmark-environment-bridge-tests.js +1452 -0
  82. package/dist/scripts/booking-copilot-availability-ledger-binding-tests.js +126 -0
  83. package/dist/scripts/booking-copilot-availability-policy-tests.js +265 -0
  84. package/dist/scripts/booking-copilot-bin-proof-tests.js +66 -0
  85. package/dist/scripts/booking-copilot-cleanup-proof-helper.js +76 -0
  86. package/dist/scripts/booking-copilot-crossrepo-fixture-server.js +144 -0
  87. package/dist/scripts/booking-copilot-dsh-core-proof-tests.js +424 -0
  88. package/dist/scripts/booking-copilot-dsh-planner-proof-tests.js +2839 -0
  89. package/dist/scripts/booking-copilot-dsh-plugin-proof-tests.js +309 -0
  90. package/dist/scripts/booking-copilot-dsh-readiness-proof.js +238 -0
  91. package/dist/scripts/booking-copilot-dsh-warmer-proof.js +123 -0
  92. package/dist/scripts/booking-copilot-event-sequence-concurrency-proof-tests.js +156 -0
  93. package/dist/scripts/booking-copilot-gap-code-contract-proof-tests.js +70 -0
  94. package/dist/scripts/booking-copilot-intent-proof-tests.js +422 -0
  95. package/dist/scripts/booking-copilot-operation-ledger-concurrency-proof-tests.js +184 -0
  96. package/dist/scripts/booking-copilot-planner-live-probe.js +95 -0
  97. package/dist/scripts/booking-copilot-proof-runtime.js +42 -0
  98. package/dist/scripts/booking-copilot-receipt-ledger-concurrency-proof-tests.js +210 -0
  99. package/dist/scripts/booking-copilot-runtime-proof-tests.js +2349 -0
  100. package/dist/scripts/booking-copilot-server-proof-tests.js +784 -0
  101. package/dist/scripts/booking-copilot-startup-proof-tests.js +94 -0
  102. package/dist/scripts/booking-executor-tests.js +80 -0
  103. package/dist/scripts/booking-recovery-chain-tests.js +182 -0
  104. package/dist/scripts/booking-saga-tests.js +125 -0
  105. package/dist/scripts/booking-surface-contract-proof-tests.js +212 -0
  106. package/dist/scripts/bootstrap-tests.js +1479 -0
  107. package/dist/scripts/bridge-events-tests.js +239 -0
  108. package/dist/scripts/bridge-ledger-tests.js +428 -0
  109. package/dist/scripts/build-changelog.js +238 -0
  110. package/dist/scripts/build-metrics-report.js +331 -0
  111. package/dist/scripts/changelog-tests.js +118 -0
  112. package/dist/scripts/channel-probe-tests.js +103 -0
  113. package/dist/scripts/channel-probe.js +169 -0
  114. package/dist/scripts/channel-registry-tests.js +208 -0
  115. package/dist/scripts/companion-tests.js +25 -70
  116. package/dist/scripts/dida-cookie-probe.js +87 -0
  117. package/dist/scripts/dida-runner-stop-tests.js +311 -0
  118. package/dist/scripts/dida-sw-probe.js +114 -0
  119. package/dist/scripts/diff-test.js +17 -12
  120. package/dist/scripts/doctor-tests.js +564 -0
  121. package/dist/scripts/dsh-artifact-e2e.js +279 -0
  122. package/dist/scripts/dsh-artifact-web-e2e.js +675 -0
  123. package/dist/scripts/dsh-http-proxy-sse-proof.js +90 -0
  124. package/dist/scripts/dsh-runtime-closure-tests.js +182 -0
  125. package/dist/scripts/dsh-runtime-closure.js +162 -0
  126. package/dist/scripts/dsh-session-v3-migration-proof.js +109 -0
  127. package/dist/scripts/dsh-subprocess-local-proof.js +150 -0
  128. package/dist/scripts/dsh-target-closure-proof.js +178 -0
  129. package/dist/scripts/effect-tests.js +539 -0
  130. package/dist/scripts/engine-run.js +1 -3
  131. package/dist/scripts/engine-tests.js +16 -10
  132. package/dist/scripts/evaluation-cadence-tests.js +174 -0
  133. package/dist/scripts/evaluation-contract-tests.js +268 -0
  134. package/dist/scripts/extension-distribution-cli.js +39 -0
  135. package/dist/scripts/extension-distribution-tests.js +443 -0
  136. package/dist/scripts/extension-tests.js +988 -0
  137. package/dist/scripts/external-event-tests.js +350 -0
  138. package/dist/scripts/fact-gate-tests.js +869 -0
  139. package/dist/scripts/fixtures/extension-bridge-unref-child.mjs +21 -0
  140. package/dist/scripts/flight-hotel-anchor-363-registered-e2e.js +169 -0
  141. package/dist/scripts/flight-malformed-tests.js +159 -0
  142. package/dist/scripts/flyai-setup-tests.js +228 -0
  143. package/dist/scripts/flyai-setup-tool-tests.js +54 -0
  144. package/dist/scripts/flyai-tests.js +692 -0
  145. package/dist/scripts/flyai-tool-registration-contract-tests.js +91 -0
  146. package/dist/scripts/fx-contract-tests.js +201 -0
  147. package/dist/scripts/g5-guard-tests.js +131 -0
  148. package/dist/scripts/g5-guard.js +189 -0
  149. package/dist/scripts/gen-lunar-anchors.js +106 -0
  150. package/dist/scripts/geo-atlas-tests.js +283 -0
  151. package/dist/scripts/gotry-backend-kernel-tests.js +206 -0
  152. package/dist/scripts/gotry-try-demo-tests.js +79 -0
  153. package/dist/scripts/gotry-try-demo.js +49 -0
  154. package/dist/scripts/ground-transfer-tests.js +956 -0
  155. package/dist/scripts/hbcli-e2e-tests.js +159 -0
  156. package/dist/scripts/hbcli-live-optin-tests.js +96 -0
  157. package/dist/scripts/hbcli-release-contract-tests.js +122 -0
  158. package/dist/scripts/hbcli-tests.js +121 -69
  159. package/dist/scripts/health-watch-cli.js +73 -0
  160. package/dist/scripts/hotel-date-gate-tests.js +496 -0
  161. package/dist/scripts/hotelbyte-reconcile-tests.js +141 -0
  162. package/dist/scripts/hotelbyte-spawn-e2e-tests.js +373 -0
  163. package/dist/scripts/i18n-tests.js +41 -0
  164. package/dist/scripts/incident-tests.js +281 -87
  165. package/dist/scripts/issue-194-job-id-guard-tests.js +106 -0
  166. package/dist/scripts/issue-233-cancel-refund-commission-tests.js +392 -0
  167. package/dist/scripts/issue-271-liveness-tests.js +569 -0
  168. package/dist/scripts/issue-289-model-retry-real-tests.js +296 -0
  169. package/dist/scripts/issue-289-model-retry-tests.js +441 -0
  170. package/dist/scripts/issue-289-web-retry-e2e.js +630 -0
  171. package/dist/scripts/issue-338-home-city-e2e.js +577 -0
  172. package/dist/scripts/issue343-real-entry-e2e.js +160 -0
  173. package/dist/scripts/issue436-persisted-routing-e2e.js +247 -0
  174. package/dist/scripts/itinerary-artifact-tests.js +368 -0
  175. package/dist/scripts/itinerary-deck-artifact-tests.js +416 -0
  176. package/dist/scripts/itinerary-deck-export-tests.js +552 -0
  177. package/dist/scripts/itinerary-deck-tests.js +435 -0
  178. package/dist/scripts/itinerary-html-tests.js +426 -0
  179. package/dist/scripts/journey-tests.js +22 -27
  180. package/dist/scripts/kernel-manifest-evidence.js +109 -0
  181. package/dist/scripts/kernel-manifest-gate.js +126 -0
  182. package/dist/scripts/kernel-manifest-tests.js +212 -0
  183. package/dist/scripts/kernel-manifest-trace-entry.js +7 -0
  184. package/dist/scripts/kernel-manifest-trace-hook.mjs +28 -0
  185. package/dist/scripts/kernel-manifest.js +369 -0
  186. package/dist/scripts/lavish-local-tests.js +1226 -0
  187. package/dist/scripts/lavish-product-tools-tests.js +537 -0
  188. package/dist/scripts/ledger-repair-apply-tests.js +316 -0
  189. package/dist/scripts/ledger-repair-plan-tests.js +375 -0
  190. package/dist/scripts/ledger-tests.js +382 -246
  191. package/dist/scripts/ledger-workflow-crash.js +10 -20
  192. package/dist/scripts/managed-dsh-cleanup-diagnostic-proof.js +184 -0
  193. package/dist/scripts/managed-dsh-close-failure-proof.js +172 -0
  194. package/dist/scripts/managed-dsh-run-port-proof.js +153 -0
  195. package/dist/scripts/managed-dsh-terminal-proof.js +252 -0
  196. package/dist/scripts/map-tools-vendor-package-proof.js +365 -0
  197. package/dist/scripts/memory-capture-tests.js +242 -61
  198. package/dist/scripts/memory-decay-tests.js +18 -52
  199. package/dist/scripts/memory-lifecycle-tests.js +657 -0
  200. package/dist/scripts/memory-lifecycle.js +196 -0
  201. package/dist/scripts/memory-metrics.js +24 -12
  202. package/dist/scripts/memory-value-report.js +631 -0
  203. package/dist/scripts/memory-value-tests.js +328 -0
  204. package/dist/scripts/metrics-report-tests.js +151 -0
  205. package/dist/scripts/model-override-e2e.js +137 -0
  206. package/dist/scripts/nightly-evidence-tests.js +161 -0
  207. package/dist/scripts/nightly-evidence.js +286 -0
  208. package/dist/scripts/nudge-digest.js +39 -28
  209. package/dist/scripts/observability-tests.js +381 -0
  210. package/dist/scripts/onboarding-tests.js +161 -0
  211. package/dist/scripts/opensky-check.js +18 -13
  212. package/dist/scripts/opensky-tests.js +28 -28
  213. package/dist/scripts/persona-surface-guard-tests.js +49 -0
  214. package/dist/scripts/pnpm-dsh-closure-proof.js +17 -0
  215. package/dist/scripts/policy-anchor-359-registered-e2e.js +214 -0
  216. package/dist/scripts/price-drift-tests.js +340 -0
  217. package/dist/scripts/price-drift-watch.js +447 -0
  218. package/dist/scripts/probe-poi-tests.js +53 -45
  219. package/dist/scripts/product-metrics.js +483 -0
  220. package/dist/scripts/publish-preverify.js +110 -0
  221. package/dist/scripts/realtime-pricing-tests.js +76 -0
  222. package/dist/scripts/recall-tests.js +513 -0
  223. package/dist/scripts/replay-async.js +20 -18
  224. package/dist/scripts/replay-real.js +18 -18
  225. package/dist/scripts/replay.js +52 -82
  226. package/dist/scripts/session-attach-diagnose.js +20 -20
  227. package/dist/scripts/session-attach-poc.js +34 -37
  228. package/dist/scripts/session-benchmark.js +180 -0
  229. package/dist/scripts/session-dida-live-e2e.js +199 -0
  230. package/dist/scripts/session-extract-tests.js +14 -35
  231. package/dist/scripts/session-link-tests.js +478 -0
  232. package/dist/scripts/session-login.js +27 -46
  233. package/dist/scripts/session-tests.js +796 -96
  234. package/dist/scripts/session-zones-tests.js +358 -0
  235. package/dist/scripts/sf-live-benchmark.js +367 -0
  236. package/dist/scripts/sf-live-challenge-stop-tests.js +453 -0
  237. package/dist/scripts/sf-live-cli-tests.js +92 -0
  238. package/dist/scripts/sf-live-options.js +46 -0
  239. package/dist/scripts/sf-manifest-tests.js +30 -0
  240. package/dist/scripts/sf-manifest.js +33 -0
  241. package/dist/scripts/sf-soft-score-tests.js +67 -0
  242. package/dist/scripts/sf-summary-tests.js +324 -0
  243. package/dist/scripts/sf-summary.js +525 -0
  244. package/dist/scripts/share-tests.js +432 -0
  245. package/dist/scripts/skeleton-check.js +16 -14
  246. package/dist/scripts/skeleton-integration-test.js +28 -11
  247. package/dist/scripts/skills-contract-tests.js +51 -46
  248. package/dist/scripts/smoke-session-gate-tests.js +21 -0
  249. package/dist/scripts/smoke.js +690 -246
  250. package/dist/scripts/spawn-bounded-abort-tests.js +241 -0
  251. package/dist/scripts/sponsor-reuse-tests.js +262 -0
  252. package/dist/scripts/state-cli-tests.js +226 -101
  253. package/dist/scripts/state-cli.js +550 -199
  254. package/dist/scripts/state-repair-cli.js +66 -0
  255. package/dist/scripts/state-repair-tests.js +140 -0
  256. package/dist/scripts/static-golden-tests.js +165 -0
  257. package/dist/scripts/time-eval-tests.js +210 -192
  258. package/dist/scripts/travel-timeline-tests.js +29 -93
  259. package/dist/scripts/turn-handoff-collect-tests.js +169 -0
  260. package/dist/scripts/turn-handoff-collect.js +161 -0
  261. package/dist/scripts/turn-policy-tests.js +55 -0
  262. package/dist/scripts/typed-contract-canary.js +176 -0
  263. package/dist/scripts/tz-resolver-sanity.js +50 -0
  264. package/dist/scripts/tz-resolver-tests.js +584 -0
  265. package/dist/scripts/unified-tests.js +23 -19
  266. package/dist/scripts/visa-policy-tests.js +62 -0
  267. package/dist/scripts/weather-tests.js +276 -41
  268. package/dist/scripts/wish-channel-gate-tests.js +54 -0
  269. package/dist/scripts/write-gate-tests.js +522 -0
  270. package/dist/scripts/z3-lifecycle-fault-tests.js +188 -0
  271. package/dist/scripts/z3-lifecycle-tests.js +170 -0
  272. package/dist/scripts/z3-race-repeat-tests.js +39 -0
  273. package/dist/scripts/z3-race-tests.js +41 -0
  274. package/dist/src/artifact-gate.js +829 -0
  275. package/dist/src/backend/kernel.js +91 -0
  276. package/dist/src/backend/modules/booking-copilot.js +92 -0
  277. package/dist/src/backend/modules/booking-executor.js +124 -0
  278. package/dist/src/backend/modules/session-search.js +551 -0
  279. package/dist/src/benchmark-agent-conformance.js +578 -0
  280. package/dist/src/benchmark-environment-bridge.js +515 -0
  281. package/dist/src/benchmark-headless-child-diagnostics.js +166 -0
  282. package/dist/src/benchmark-tool-isolation.js +151 -0
  283. package/dist/src/bookable-facts.js +533 -0
  284. package/dist/src/booking-saga.js +97 -0
  285. package/dist/src/booking-surface/availability-policy.js +697 -0
  286. package/dist/src/booking-surface/booking-intent.js +43 -0
  287. package/dist/src/booking-surface/cancel-refund-commission.js +379 -0
  288. package/dist/src/booking-surface/canonical-schema.js +116 -0
  289. package/dist/src/booking-surface/contracts.js +75 -0
  290. package/dist/src/booking-surface/dsh-planner.js +1854 -0
  291. package/dist/src/booking-surface/dsh-plugin.js +378 -0
  292. package/dist/src/booking-surface/dsh-worker.js +98 -0
  293. package/dist/src/booking-surface/error-codes.js +231 -0
  294. package/dist/src/booking-surface/index.js +9 -0
  295. package/dist/src/booking-surface/managed-dsh-cleanup-diagnostic.js +97 -0
  296. package/dist/src/booking-surface/managed-dsh-run-port.js +244 -0
  297. package/dist/src/booking-surface/profile.js +24 -0
  298. package/dist/src/booking-surface/recovery-chain.js +367 -0
  299. package/dist/src/booking-surface/runtime.js +1968 -0
  300. package/dist/src/booking-surface/server.js +674 -0
  301. package/dist/src/booking-surface/startup.js +168 -0
  302. package/dist/src/booking-surface/validation.js +261 -0
  303. package/dist/src/bridge.js +20 -13
  304. package/dist/src/companions.js +48 -74
  305. package/dist/src/contracts.js +21 -43
  306. package/dist/src/dsh-llm.js +97 -111
  307. package/dist/src/engine.js +276 -193
  308. package/dist/src/evaluation-cadence.js +97 -0
  309. package/dist/src/evaluation-contracts.js +283 -0
  310. package/dist/src/flight-pack-adapter.js +54 -0
  311. package/dist/src/flight-pack-contract.js +2 -0
  312. package/dist/src/flyai-setup-tool.js +70 -0
  313. package/dist/src/gotry-backend.js +125 -0
  314. package/dist/src/hotel-date-gate.js +118 -0
  315. package/dist/src/i18n.js +88 -0
  316. package/dist/src/index.js +2227 -882
  317. package/dist/src/itinerary-deck.js +139 -0
  318. package/dist/src/itinerary-doc-shared.js +661 -0
  319. package/dist/src/itinerary-html.js +131 -0
  320. package/dist/src/journey.js +155 -108
  321. package/dist/src/lavish-tools.js +400 -0
  322. package/dist/src/ledger-repair-apply.js +538 -0
  323. package/dist/src/ledger-repair-plan.js +463 -0
  324. package/dist/src/loop.js +319 -160
  325. package/dist/src/memory-capture.js +180 -32
  326. package/dist/src/memory-decay.js +30 -14
  327. package/dist/src/memory-lifecycle.js +1310 -0
  328. package/dist/src/memory-utility.js +27 -40
  329. package/dist/src/mock-llm.js +36 -61
  330. package/dist/src/model.js +81 -36
  331. package/dist/src/realtime-pricing.js +103 -0
  332. package/dist/src/recall/card.js +74 -0
  333. package/dist/src/recall/evaluator.js +140 -0
  334. package/dist/src/recall/integration.js +17 -0
  335. package/dist/src/recall/tick.js +166 -0
  336. package/dist/src/session-link/plan-it-action.js +48 -0
  337. package/dist/src/session-link/session-link.js +248 -0
  338. package/dist/src/session-zones.js +507 -0
  339. package/dist/src/share/adapters.js +51 -0
  340. package/dist/src/share/share-consent.js +76 -0
  341. package/dist/src/share/share-deck.js +58 -0
  342. package/dist/src/share/share-token.js +146 -0
  343. package/dist/src/slot-spec.js +84 -106
  344. package/dist/src/state-ledger.js +435 -516
  345. package/dist/src/state-repair.js +299 -0
  346. package/dist/src/subagent-job-id-guard.js +58 -0
  347. package/dist/src/time-anchor.js +231 -33
  348. package/dist/src/tool-packet.js +20 -8
  349. package/dist/src/travel-slots.js +58 -35
  350. package/dist/src/travel-timeline.js +44 -63
  351. package/dist/src/turn-deadline.js +287 -0
  352. package/dist/src/turn-policy.js +118 -0
  353. package/dist/src/tz-resolver.js +143 -0
  354. package/dist/src/unified.js +535 -359
  355. package/dist/src/wish-pool.js +42 -12
  356. package/dist/src/write-gate.js +495 -0
  357. package/dist/src/z3-shared.js +284 -0
  358. package/extension/README.md +21 -0
  359. package/extension/README.zh-CN.md +21 -0
  360. package/extension/background.js +463 -0
  361. package/extension/content-bridge.js +270 -0
  362. package/extension/content-main.js +111 -0
  363. package/extension/manifest.json +60 -0
  364. package/package.json +407 -14
  365. package/schemas/booking.intent.schema.json +193 -0
  366. package/schemas/booking.surface.schema.json +2622 -0
  367. package/ts/capabilities/agent-reach-deep.ts +114 -0
  368. package/ts/capabilities/agent-reach.ts +198 -0
  369. package/ts/capabilities/anything.ts +255 -0
  370. package/ts/capabilities/artifacts.ts +428 -0
  371. package/ts/capabilities/fact-log.ts +54 -0
  372. package/ts/capabilities/flyai-config.ts +388 -0
  373. package/ts/capabilities/flyai.ts +1274 -0
  374. package/ts/capabilities/hbcli.ts +253 -71
  375. package/ts/capabilities/incident-log.ts +88 -59
  376. package/ts/capabilities/itinerary-artifact.ts +214 -0
  377. package/ts/capabilities/itinerary-deck-artifact.ts +218 -0
  378. package/ts/capabilities/itinerary-deck-export.ts +378 -0
  379. package/ts/capabilities/opensky.ts +121 -0
  380. package/ts/capabilities/session/action-cache.ts +148 -0
  381. package/ts/capabilities/session/adapters/ctrip-flight.ts +181 -0
  382. package/ts/capabilities/session/adapters/ctrip-hotel.ts +238 -0
  383. package/ts/capabilities/session/adapters/dida-portal.ts +338 -0
  384. package/ts/capabilities/session/adapters/meituan-local.ts +70 -0
  385. package/ts/capabilities/session/adapters/rail-12306.ts +392 -0
  386. package/ts/capabilities/session/benchmark.ts +276 -0
  387. package/ts/capabilities/session/bridge-ledger.ts +333 -0
  388. package/ts/capabilities/session/extension-bridge.ts +794 -0
  389. package/ts/capabilities/session/extension-channel.ts +144 -0
  390. package/ts/capabilities/session/extension-distribution.ts +266 -0
  391. package/ts/capabilities/session/extract.ts +54 -0
  392. package/ts/capabilities/session/golden-score.ts +139 -0
  393. package/ts/capabilities/session/health-watch.ts +264 -0
  394. package/ts/capabilities/session/read-guard.ts +141 -0
  395. package/ts/capabilities/session/static-flight-golden.ts +209 -0
  396. package/ts/capabilities/session/transport.ts +146 -0
  397. package/ts/capabilities/session/wizard.ts +140 -0
  398. package/ts/capabilities/session-consent.ts +211 -0
  399. package/ts/capabilities/session-login.ts +208 -0
  400. package/ts/capabilities/session-search.ts +893 -0
  401. package/ts/capabilities/weather.ts +330 -0
  402. package/ts/dsh-runtime/vendor/README.md +68 -0
  403. package/ts/dsh-runtime/vendor/dsh-map-tools/LICENSE +21 -0
  404. package/ts/dsh-runtime/vendor/dsh-map-tools/README.en.md +405 -0
  405. package/ts/dsh-runtime/vendor/dsh-map-tools/README.md +404 -0
  406. package/ts/dsh-runtime/vendor/dsh-map-tools/client/client.js +1584 -0
  407. package/ts/dsh-runtime/vendor/dsh-map-tools/cordis.patch.yml +5 -0
  408. package/ts/dsh-runtime/vendor/dsh-map-tools/icon.svg +5 -0
  409. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/clients/amap.js +595 -0
  410. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/clients/nominatim.js +63 -0
  411. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/clients/osrm.js +58 -0
  412. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/clients/photon.js +55 -0
  413. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/config-file.js +87 -0
  414. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/config-route.js +131 -0
  415. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/config.js +16 -0
  416. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/geo.js +232 -0
  417. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/index.js +120 -0
  418. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/settings-ns.js +40 -0
  419. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/staticmap-route.js +115 -0
  420. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/tools/geocode.js +127 -0
  421. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/tools/poi.js +84 -0
  422. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/tools/routes.js +267 -0
  423. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/clients/amap.d.ts +90 -0
  424. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/clients/nominatim.d.ts +17 -0
  425. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/clients/osrm.d.ts +15 -0
  426. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/clients/photon.d.ts +22 -0
  427. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/config-file.d.ts +33 -0
  428. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/config-route.d.ts +23 -0
  429. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/config.d.ts +23 -0
  430. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/geo.d.ts +61 -0
  431. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/index.d.ts +18 -0
  432. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/settings-ns.d.ts +14 -0
  433. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/staticmap-route.d.ts +31 -0
  434. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/tools/geocode.d.ts +11 -0
  435. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/tools/poi.d.ts +9 -0
  436. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/tools/routes.d.ts +75 -0
  437. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/types.d.ts +68 -0
  438. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types.js +16 -0
  439. package/ts/dsh-runtime/vendor/dsh-map-tools/package.json +97 -0
  440. package/ts/package.json +293 -3
  441. package/ts/scripts/async-collect.ts +91 -0
  442. package/ts/scripts/map-tools-vendor-package-proof.ts +404 -0
  443. package/ts/scripts/skeleton-check.ts +1 -1
  444. package/ts/scripts/skeleton-integration-test.ts +23 -1
  445. package/ts/scripts/state-cli.ts +568 -0
  446. package/ts/scripts/turn-handoff-collect.ts +178 -0
  447. package/ts/src/artifact-gate.ts +991 -0
  448. package/ts/src/benchmark-agent-conformance.ts +619 -0
  449. package/ts/src/benchmark-environment-bridge.ts +538 -0
  450. package/ts/src/benchmark-headless-child-diagnostics.ts +184 -0
  451. package/ts/src/benchmark-tool-isolation.ts +166 -0
  452. package/ts/src/bookable-facts.ts +837 -0
  453. package/ts/src/booking-saga.ts +133 -0
  454. package/ts/src/booking-surface/availability-policy.ts +522 -0
  455. package/ts/src/booking-surface/booking-intent.ts +86 -0
  456. package/ts/src/booking-surface/cancel-refund-commission.ts +488 -0
  457. package/ts/src/booking-surface/canonical-schema.js +116 -0
  458. package/ts/src/booking-surface/contracts.ts +475 -0
  459. package/ts/src/booking-surface/dsh-planner.ts +1949 -0
  460. package/ts/src/booking-surface/dsh-plugin.js +378 -0
  461. package/ts/src/booking-surface/dsh-worker.ts +110 -0
  462. package/ts/src/booking-surface/error-codes.ts +241 -0
  463. package/ts/src/booking-surface/index.ts +9 -0
  464. package/ts/src/booking-surface/managed-dsh-cleanup-diagnostic.ts +151 -0
  465. package/ts/src/booking-surface/managed-dsh-run-port.ts +273 -0
  466. package/ts/src/booking-surface/profile.ts +42 -0
  467. package/ts/src/booking-surface/recovery-chain.ts +409 -0
  468. package/ts/src/booking-surface/runtime.ts +1793 -0
  469. package/ts/src/booking-surface/server.ts +733 -0
  470. package/ts/src/booking-surface/startup.ts +201 -0
  471. package/ts/src/booking-surface/validation.ts +217 -0
  472. package/ts/src/companions.ts +113 -0
  473. package/ts/src/contracts.ts +13 -3
  474. package/ts/src/dsh-llm.ts +44 -11
  475. package/ts/src/flyai-setup-tool.ts +77 -0
  476. package/ts/src/index.ts +1948 -198
  477. package/ts/src/itinerary-deck.ts +189 -0
  478. package/ts/src/itinerary-doc-shared.ts +741 -0
  479. package/ts/src/itinerary-html.ts +171 -0
  480. package/ts/src/loop.ts +223 -25
  481. package/ts/src/memory-capture.ts +283 -0
  482. package/ts/src/memory-decay.ts +55 -0
  483. package/ts/src/memory-utility.ts +70 -0
  484. package/ts/src/mock-llm.ts +4 -8
  485. package/ts/src/model.ts +88 -2
  486. package/ts/src/recall/card.ts +106 -0
  487. package/ts/src/recall/evaluator.ts +170 -0
  488. package/ts/src/recall/integration.ts +35 -0
  489. package/ts/src/recall/tick.ts +213 -0
  490. package/ts/src/session-link/plan-it-action.ts +78 -0
  491. package/ts/src/session-link/session-link.ts +275 -0
  492. package/ts/src/share/adapters.ts +93 -0
  493. package/ts/src/share/share-consent.ts +105 -0
  494. package/ts/src/share/share-deck.ts +85 -0
  495. package/ts/src/share/share-token.ts +166 -0
  496. package/ts/src/slot-spec.ts +172 -0
  497. package/ts/src/state-ledger.ts +912 -0
  498. package/ts/src/subagent-job-id-guard.ts +72 -0
  499. package/ts/src/time-anchor.ts +338 -0
  500. package/ts/src/tool-packet.ts +32 -0
  501. package/ts/src/travel-slots.ts +219 -0
  502. package/ts/src/travel-timeline.ts +83 -0
  503. package/ts/src/turn-deadline.ts +366 -0
  504. package/ts/src/turn-policy.ts +154 -0
  505. package/ts/src/unified.ts +354 -88
  506. package/ts/src/wish-pool.ts +79 -0
  507. package/dist/scripts/session-attach-wait.js +0 -41
@@ -0,0 +1,66 @@
1
+ /**
2
+ * state-ledger 数据修复 CLI(issue #254 控制面)。owner-local 工具。
3
+ *
4
+ * 子命令:
5
+ * inventory <stateRoot> 只读 inventory(JSON 报告,零写入)
6
+ * plan <stateRoot> <mapping.json> 只读迁移计划(变更/冲突/错误)
7
+ * execute <stateRoot> <mapping.json> 受限执行(自动 backup+journal;幂等)
8
+ * rollback <stateRoot> <backupDir> 从校验过的 backup 恢复
9
+ *
10
+ * 纪律:默认拒绝把 `ts/dsh-runtime`(founder 真实产品数据)作为操作对象——
11
+ * 真实数据的 execute 是单独的 owner gate,必须显式传 --i-understand-founder-data。
12
+ * 输出恒为单个 JSON 对象;inventory/plan 天然 dry-run(只读连接)。
13
+ */
14
+ import { readFileSync } from 'node:fs';
15
+ import { resolve } from 'node:path';
16
+ import { executeRepair, inventoryRepair, planRepair, rollbackRepair } from '../src/state-repair.js';
17
+ function fail(msg) {
18
+ console.log(JSON.stringify({ ok: false, error: msg }));
19
+ process.exit(1);
20
+ }
21
+ const [, , cmd, stateRootArg, mappingPath] = process.argv;
22
+ const executeFlag = process.argv.includes('--execute');
23
+ const founderDataFlag = process.argv.includes('--i-understand-founder-data');
24
+ if (!cmd || !stateRootArg)
25
+ fail('usage: state-repair-cli.ts <inventory|plan|execute|rollback> <stateRoot> [mapping.json] [--execute] [--i-understand-founder-data]');
26
+ const stateRoot = resolve(stateRootArg);
27
+ // founder 真实产品数据守卫:路径含 dsh-runtime 即视为 owner 数据
28
+ if (stateRoot.includes('dsh-runtime') && !founderDataFlag) {
29
+ fail('refusing to operate on founder runtime state without --i-understand-founder-data (real repair is a separate owner gate)');
30
+ }
31
+ try {
32
+ if (cmd === 'inventory') {
33
+ if (executeFlag)
34
+ fail('inventory is read-only; --execute is not applicable');
35
+ console.log(JSON.stringify({ ok: true, inventory: inventoryRepair(stateRoot) }));
36
+ }
37
+ else if (cmd === 'plan') {
38
+ if (!mappingPath)
39
+ fail('plan requires mapping.json');
40
+ if (executeFlag)
41
+ fail('plan is read-only; --execute is not applicable');
42
+ const mapping = JSON.parse(readFileSync(resolve(mappingPath), 'utf8'));
43
+ console.log(JSON.stringify({ ok: true, plan: planRepair(stateRoot, mapping) }));
44
+ }
45
+ else if (cmd === 'execute') {
46
+ if (!mappingPath)
47
+ fail('execute requires mapping.json');
48
+ if (!executeFlag)
49
+ fail('execute is a gated action: pass --execute after reviewing the plan (real-data repair is a separate owner gate)');
50
+ const mapping = JSON.parse(readFileSync(resolve(mappingPath), 'utf8'));
51
+ console.log(JSON.stringify({ ok: true, result: executeRepair(stateRoot, mapping) }));
52
+ }
53
+ else if (cmd === 'rollback') {
54
+ if (!mappingPath)
55
+ fail('rollback requires backupDir');
56
+ if (executeFlag)
57
+ fail('rollback is a direct restore; --execute is not applicable');
58
+ console.log(JSON.stringify({ ok: true, result: rollbackRepair(stateRoot, resolve(mappingPath)) }));
59
+ }
60
+ else {
61
+ fail(`unknown command: ${cmd}`);
62
+ }
63
+ }
64
+ catch (e) {
65
+ fail(e instanceof Error ? e.message : String(e));
66
+ }
@@ -0,0 +1,140 @@
1
+ /**
2
+ * state-ledger 数据修复控制面测试(issue #254;run-all 新节)。
3
+ * 全部在隔离 stateRoot fixture 上验证:
4
+ * 1. inventory 零写入(库哈希不变)+ 候选/无标记行分类正确;
5
+ * 2. plan:缺映射/非 local 现状/非法目标租户逐项报错;跨 tenant 同 idem_key 冲突显式暴露;
6
+ * 3. execute:--execute 缺省拒绝 CLI;from 守卫逐行 UPDATE;幂等重跑 skipped;
7
+ * 4. rollback:从 backup 恢复且校验和验证;损毁 backup 拒绝恢复;
8
+ * 5. 中途失败恢复:journal 已应用行在重跑时跳过,失败行后续补齐;
9
+ * 6. founder 数据守卫:dsh-runtime 路径拒绝无标志操作。
10
+ * 运行(在 ts/ 下):npx tsx scripts/state-repair-tests.ts
11
+ */
12
+ import Database from 'better-sqlite3';
13
+ import assert from 'node:assert/strict';
14
+ import { existsSync, mkdtempSync, readFileSync, rmSync } from 'node:fs';
15
+ import { tmpdir } from 'node:os';
16
+ import { join } from 'node:path';
17
+ import { spawnSync } from 'node:child_process';
18
+ import { createHash } from 'node:crypto';
19
+ import { ensureLedger } from '../src/state-ledger.js';
20
+ import { executeRepair, inventoryRepair, planRepair, rollbackRepair } from '../src/state-repair.js';
21
+ let pass = 0;
22
+ function ok(msg) { pass += 1; console.log(` ok - ${msg}`); }
23
+ function cli(args) {
24
+ const r = spawnSync('npx', ['tsx', 'scripts/state-repair-cli.ts', ...args], { encoding: 'utf-8', cwd: join(process.cwd()) });
25
+ const start = r.stdout.indexOf('{');
26
+ return { json: JSON.parse(r.stdout.slice(start >= 0 ? start : 0)), stdout: r.stdout };
27
+ }
28
+ function dbHash(root) {
29
+ return createHash('sha256').update(readFileSync(join(root, 'gotry-state', 'gotry-state.db'))).digest('hex');
30
+ }
31
+ function seed(root) {
32
+ const ledger = ensureLedger(root, 'local');
33
+ ledger.close();
34
+ const db = new Database(join(root, 'gotry-state', 'gotry-state.db'));
35
+ db.exec(`INSERT INTO events (tenant_id, ts, actor, kind, subject_id, payload, idem_key) VALUES
36
+ ('local', '2026-09-01T00:00:00Z', 'runtime', 'wish_pool_add', 'w-1', '{"name":"本地愿望","tenant_id":"local"}', 'local-1'),
37
+ ('local', '2026-09-01T00:00:01Z', 'tenant:acme', 'wish_pool_add', 'w-2', '{"name":"误记愿望","tenant_id":"acme"}', 'local-2'),
38
+ ('local', '2026-09-01T00:00:02Z', 'runtime', 'motivation_save', '', '{"brief":"普通本地画像"}', 'local-3'),
39
+ ('acme', '2026-09-01T00:00:03Z', 'runtime', 'wish_pool_add', 'w-2', '{"name":"acme 同 idem 愿望"}', 'local-2')`);
40
+ db.close();
41
+ }
42
+ // ---- 1. inventory 零写入 + 分类 ----
43
+ {
44
+ const root = mkdtempSync(join(tmpdir(), 'gotry-repair-'));
45
+ seed(root);
46
+ const before = dbHash(root);
47
+ const inv = inventoryRepair(root);
48
+ assert.equal(inv.integrity, 'ok', 'inventory integrity_check ok');
49
+ assert.equal(inv.localRowCounts.events, 3, 'inventory counts local events');
50
+ assert.equal(inv.candidates.length, 1, 'inventory flags exactly the explicit-marker row');
51
+ assert.equal(inv.candidates[0].key.seq, 2, 'candidate is the tenant:acme event');
52
+ assert.ok(inv.candidates[0].evidence.length >= 1, 'candidate carries explicit evidence');
53
+ assert.equal(dbHash(root), before, 'inventory is zero-write (db hash unchanged)');
54
+ console.log(' #1 inventory zero-write + classification OK');
55
+ }
56
+ // ---- 2. plan 校验与冲突暴露 ----
57
+ {
58
+ const root = mkdtempSync(join(tmpdir(), 'gotry-repair-plan-'));
59
+ seed(root);
60
+ const bad = { events: [{ seq: 2, to: 'local' }, { seq: 2, to: 'bad tenant!' }] };
61
+ const plan = planRepair(root, bad);
62
+ assert.ok(plan.errors.length >= 2, 'plan reports invalid target tenants (local / illegal chars)');
63
+ const missing = { events: [{ seq: 999, to: 'acme' }, { seq: 1, to: 'acme' }] };
64
+ const planMissing = planRepair(root, missing);
65
+ assert.ok(planMissing.errors.some(e => e.includes('seq=999: not found')), 'plan reports not-found seq');
66
+ assert.equal(planMissing.changes.length, 1, 'plan still lists the existing mapped row');
67
+ const good = { events: [{ seq: 2, to: 'acme' }] };
68
+ const plan2 = planRepair(root, good);
69
+ assert.equal(plan2.errors.length, 0, 'valid mapping plans clean');
70
+ assert.equal(plan2.changes.length, 1, 'one planned change');
71
+ assert.equal(plan2.collisions.length, 1, 'cross-tenant same idem_key collision exposed in plan');
72
+ assert.ok(plan2.collisions[0].reason.includes('idem_key'), 'collision reason names the unique constraint');
73
+ console.log(' #2 plan validation + collision OK');
74
+ }
75
+ // ---- 3/4/5. execute(--execute 闸/from 守卫/幂等)+ rollback + 中途失败恢复 ----
76
+ {
77
+ const root = mkdtempSync(join(tmpdir(), 'gotry-repair-exec-'));
78
+ seed(root);
79
+ // CLI 缺 --execute 必须拒绝
80
+ const refused = cli(['execute', root, '/nonexistent.json']);
81
+ assert.equal(refused.json.ok, false, 'CLI execute without --execute is refused');
82
+ assert.ok(refused.stdout.includes('gated action'), 'refusal names the gate');
83
+ // founder 数据守卫
84
+ const founderRefused = cli(['inventory', '/Users/bytedance/work/gotry/ts/dsh-runtime']);
85
+ assert.equal(founderRefused.json.ok, false, 'founder runtime state refused without explicit flag');
86
+ const mapping = { events: [{ seq: 2, to: 'globex' }] };
87
+ const result = executeRepair(root, mapping);
88
+ assert.equal(result.applied.length, 1, 'execute applies exactly the mapped row');
89
+ assert.ok(result.backupSha256, 'backup taken with SHA-256');
90
+ assert.ok(existsSync(result.journalPath), 'journal written');
91
+ assert.equal(result.integrity, 'ok', 'post-repair integrity ok');
92
+ const db = new Database(join(root, 'gotry-state', 'gotry-state.db'));
93
+ const moved = db.prepare("SELECT tenant_id FROM events WHERE seq = 2").get();
94
+ assert.equal(moved.tenant_id, 'globex', 'row moved to target tenant');
95
+ const unchanged = db.prepare("SELECT tenant_id FROM events WHERE seq = 3").get();
96
+ assert.equal(unchanged.tenant_id, 'local', 'unmapped row untouched');
97
+ db.close();
98
+ // 幂等重跑
99
+ const again = executeRepair(root, mapping);
100
+ assert.equal(again.applied.length, 0, 're-run applies nothing (idempotent via journal)');
101
+ assert.equal(again.skipped, 1, 're-run skips the journalized row');
102
+ // 重定向 + 扩展:journal 化行改靶(acme 冲突故用 zenith),新行补齐
103
+ const mapping2 = { events: [{ seq: 2, to: 'zenith' }, { seq: 3, to: 'globex' }] };
104
+ const third = executeRepair(root, mapping2);
105
+ assert.equal(third.applied.length, 2, 'retarget + extend apply together');
106
+ const db3 = new Database(join(root, 'gotry-state', 'gotry-state.db'));
107
+ const seq2 = db3.prepare("SELECT tenant_id FROM events WHERE seq = 2").get();
108
+ const seq3 = db3.prepare("SELECT tenant_id FROM events WHERE seq = 3").get();
109
+ assert.equal(seq2.tenant_id, 'zenith', 'retargeted row lands at zenith');
110
+ assert.equal(seq3.tenant_id, 'globex', 'new row lands at globex');
111
+ db3.close();
112
+ // rollback:校验和验证 + 恢复 + 损毁拒绝
113
+ const rolled = rollbackRepair(root, result.backupDir);
114
+ assert.ok(rolled.verified, 'rollback verifies backup checksum');
115
+ const db2 = new Database(join(root, 'gotry-state', 'gotry-state.db'));
116
+ const restored = db2.prepare("SELECT tenant_id FROM events WHERE seq = 2").get();
117
+ assert.equal(restored.tenant_id, 'local', 'rollback restores original tenant');
118
+ db2.close();
119
+ const tampered = mkdtempSync(join(tmpdir(), 'gotry-repair-bad-'));
120
+ const { writeFileSync, copyFileSync } = await import('node:fs');
121
+ copyFileSync(join(result.backupDir, 'gotry-state.db'), join(tampered, 'gotry-state.db'));
122
+ writeFileSync(join(tampered, 'backup-sha256.txt'), 'deadbeef');
123
+ assert.throws(() => rollbackRepair(root, tampered), /checksum mismatch/, 'tampered backup refused');
124
+ rmSync(tampered, { recursive: true, force: true });
125
+ console.log(' #3-5 execute/idempotency/rollback OK');
126
+ }
127
+ // ---- 6. CLI plan/execute JSON 面(真 mapping 文件) ----
128
+ {
129
+ const root = mkdtempSync(join(tmpdir(), 'gotry-repair-cli-'));
130
+ seed(root);
131
+ const { writeFileSync } = await import('node:fs');
132
+ const mapPath = join(root, 'mapping.json');
133
+ writeFileSync(mapPath, JSON.stringify({ events: [{ seq: 2, to: 'acme' }] }));
134
+ const planned = cli(['plan', root, mapPath]);
135
+ assert.equal(planned.json.ok, true, 'CLI plan returns ok JSON');
136
+ assert.equal(planned.json.plan.changes.length, 1, 'CLI plan lists the mapped change');
137
+ assert.equal(planned.json.plan.collisions.length, 1, 'CLI plan surfaces the collision');
138
+ console.log(' #6 CLI JSON surface OK');
139
+ }
140
+ console.log('STATE REPAIR TESTS: OK (inventory/plan/execute/idempotency/rollback/CLI founder-guard)');
@@ -0,0 +1,165 @@
1
+ import assert from 'node:assert/strict';
2
+ import { mkdtempSync, rmSync, writeFileSync } from 'node:fs';
3
+ import { tmpdir } from 'node:os';
4
+ import { join } from 'node:path';
5
+ const modulePath = '../capabilities/session/static-flight-golden.js';
6
+ const provider = await import(modulePath).catch(() => ({}));
7
+ assert.equal(typeof provider.parseGoldenSource, 'function', '缺少 parseGoldenSource 时 CLI 会把未知 vendor 静默当成 manual');
8
+ const parseGoldenSource = provider.parseGoldenSource;
9
+ assert.equal(parseGoldenSource(['--golden=static']), 'static');
10
+ assert.equal(parseGoldenSource([]), 'manual');
11
+ assert.throws(() => parseGoldenSource(['--golden=ctrip-open']), /不支持的 golden vendor: ctrip-open/, '未知 vendor 必须 fail-closed,不能静默回退 manual');
12
+ assert.equal(typeof provider.loadStaticFlightSnapshot, 'function', 'static vendor 必须从有 provenance 的版本化快照加载,不能复用 manual 并改标签');
13
+ const snapshot = provider.loadStaticFlightSnapshot();
14
+ assert.equal(snapshot.schema_version, 'sf-static-routes.v1');
15
+ assert.deepEqual(snapshot.source, {
16
+ name: 'OpenFlights routes.dat',
17
+ url: 'https://raw.githubusercontent.com/jpatokal/openflights/4b969f8e91eb800c45f0e0e2355a0fbb93de27e4/data/routes.dat',
18
+ revision: '4b969f8e91eb800c45f0e0e2355a0fbb93de27e4',
19
+ license: 'ODbL-1.0',
20
+ retrieved_at: '2026-08-30',
21
+ limitations: ['route/carrier coverage only', 'no schedule', 'no price', 'no availability'],
22
+ });
23
+ assert.deepEqual(snapshot.routes.map((route) => route.query_id), ['sf-01', 'sf-02', 'sf-03', 'sf-04', 'sf-05', 'sf-06', 'sf-07', 'sf-08'], '静态快照必须逐条覆盖本批 8 query,不能靠全量 manual fallback 蒙混');
24
+ for (const route of snapshot.routes) {
25
+ assert.ok(route.legs.length >= 1, `${route.query_id} 必须至少有一个静态 OD leg`);
26
+ for (const leg of route.legs) {
27
+ assert.match(leg.from_iata, /^[A-Z]{3}$/);
28
+ assert.match(leg.to_iata, /^[A-Z]{3}$/);
29
+ assert.ok(leg.carrier_codes.length >= 1);
30
+ }
31
+ assert.equal('departure_at' in route, false, 'OpenFlights 静态包不得伪造班期时刻');
32
+ assert.equal('price' in route, false, 'OpenFlights 静态包不得伪造价格');
33
+ assert.equal('availability' in route, false, 'OpenFlights 静态包不得伪造库存');
34
+ }
35
+ assert.equal(typeof provider.resolveStaticGolden, 'function', '缺少 static→comparable record 解译时 --golden=static 仍不可执行');
36
+ const manualRecord = {
37
+ query_id: 'sf-02',
38
+ route_segments: [{
39
+ from: '北京',
40
+ to: '大理',
41
+ departure_at: '2026-10-02T14:00:00+08:00',
42
+ arrival_at: '2026-10-02T17:00:00+08:00',
43
+ transport_number: 'CA1441',
44
+ }],
45
+ journey_type: 'direct',
46
+ currency: 'CNY',
47
+ price: 2650,
48
+ source: 'manual-golden',
49
+ fetched_at: '2026-08-30T12:00:00.000Z',
50
+ verdict: 'hit',
51
+ latency_ms: 0,
52
+ read_guard_blocked: 0,
53
+ };
54
+ const staticResolution = provider.resolveStaticGolden({
55
+ query: { id: 'sf-02', from: '北京', to: '大理', date: '2026-10-02' },
56
+ manualRecord,
57
+ snapshot,
58
+ });
59
+ assert.equal(staticResolution.requested_source, 'static');
60
+ assert.equal(staticResolution.effective_source, 'static-openflights+manual-band');
61
+ assert.equal(staticResolution.fallback_reason, undefined);
62
+ assert.equal(staticResolution.record.source, 'static-openflights+manual-band');
63
+ assert.equal(staticResolution.record.journey_type, 'transfer');
64
+ assert.equal(staticResolution.record.route_segments.length, 2);
65
+ assert.deepEqual(staticResolution.record.route_segments.map((segment) => [segment.from, segment.to, segment.transport_number]), [['北京', 'KMG', '8L-STATIC'], ['KMG', '大理', '8L-STATIC']]);
66
+ assert.equal(staticResolution.record.route_segments[0]?.departure_at, '2026-10-02T14:00:00+08:00');
67
+ assert.equal(staticResolution.record.route_segments[0]?.arrival_at, '2026-10-02T15:00:00+08:00');
68
+ assert.equal(staticResolution.record.route_segments[1]?.departure_at, '2026-10-02T16:00:00+08:00');
69
+ assert.equal(staticResolution.record.route_segments[1]?.arrival_at, '2026-10-02T17:00:00+08:00');
70
+ assert.equal(staticResolution.record.price, 2650);
71
+ assert.deepEqual(staticResolution.estimated_fields, [
72
+ 'route_segments[].departure_at',
73
+ 'route_segments[].arrival_at',
74
+ 'route_segments[].transport_number',
75
+ 'price',
76
+ ]);
77
+ assert.deepEqual(staticResolution.provenance, {
78
+ route_source: snapshot.source.url,
79
+ route_revision: '4b969f8e91eb800c45f0e0e2355a0fbb93de27e4',
80
+ route_license: 'ODbL-1.0',
81
+ band_source: 'sf-golden-manifest.json',
82
+ });
83
+ const expectedStaticCoverage = [
84
+ { id: 'sf-01', from: '上海', to: '丽江', date: '2026-10-01', transport: ['MU-STATIC'] },
85
+ { id: 'sf-02', from: '北京', to: '大理', date: '2026-10-02', transport: ['8L-STATIC', '8L-STATIC'] },
86
+ { id: 'sf-03', from: '上海', to: '三亚', date: '2026-11-11', transport: ['9C-STATIC'] },
87
+ { id: 'sf-04', from: '广州', to: '昆明', date: '2026-12-20', transport: ['CA-STATIC'] },
88
+ { id: 'sf-05', from: '深圳', to: '成都', date: '2026-10-05', transport: ['3U-STATIC'] },
89
+ { id: 'sf-06', from: '杭州', to: '厦门', date: '2026-10-06', transport: ['CA-STATIC'] },
90
+ { id: 'sf-07', from: '西安', to: '桂林', date: '2026-10-07', transport: ['CA-STATIC'] },
91
+ { id: 'sf-08', from: '重庆', to: '贵阳', date: '2026-10-08', transport: ['CA-STATIC'] },
92
+ ];
93
+ for (const expected of expectedStaticCoverage) {
94
+ const record = {
95
+ ...manualRecord,
96
+ query_id: expected.id,
97
+ route_segments: [{
98
+ ...manualRecord.route_segments[0],
99
+ from: expected.from,
100
+ to: expected.to,
101
+ departure_at: `${expected.date}T06:00:00+08:00`,
102
+ arrival_at: `${expected.date}T12:00:00+08:00`,
103
+ }],
104
+ };
105
+ const resolution = provider.resolveStaticGolden({
106
+ query: { id: expected.id, from: expected.from, to: expected.to, date: expected.date },
107
+ manualRecord: record,
108
+ snapshot,
109
+ });
110
+ assert.equal(resolution.effective_source, 'static-openflights+manual-band', `${expected.id} 不得全量回退 manual`);
111
+ assert.equal(resolution.fallback_reason, undefined);
112
+ assert.equal(resolution.record.route_segments.length, expected.transport.length);
113
+ assert.equal(resolution.record.route_segments[0]?.from, expected.from);
114
+ assert.equal(resolution.record.route_segments.at(-1)?.to, expected.to);
115
+ assert.deepEqual(resolution.record.route_segments.map((segment) => segment.transport_number), expected.transport, `${expected.id} 运行时首选 carrier 必须来自已核对的 pinned route row`);
116
+ for (const segment of resolution.record.route_segments) {
117
+ assert.match(segment.transport_number, /^[A-Z0-9]{2}-STATIC$/);
118
+ assert.ok(Number.isFinite(Date.parse(segment.departure_at)));
119
+ assert.ok(Number.isFinite(Date.parse(segment.arrival_at)));
120
+ assert.ok(Date.parse(segment.arrival_at) > Date.parse(segment.departure_at));
121
+ }
122
+ }
123
+ const warnings = [];
124
+ const fallbackRecord = { ...manualRecord, query_id: 'sf-99' };
125
+ const fallbackResolution = provider.resolveStaticGolden({
126
+ query: { id: 'sf-99', from: '北京', to: '大理', date: '2026-10-02' },
127
+ manualRecord: fallbackRecord,
128
+ snapshot,
129
+ warn: (message) => warnings.push(message),
130
+ });
131
+ assert.equal(fallbackResolution.effective_source, 'manual-golden');
132
+ assert.equal(fallbackResolution.record, fallbackRecord, 'fallback 必须原样使用 manual record');
133
+ assert.equal(fallbackResolution.fallback_reason, 'static route missing for sf-99');
134
+ assert.deepEqual(warnings, [
135
+ '[sf-live-benchmark] static vendor failed for sf-99: static route missing for sf-99; fallback=manual-golden',
136
+ ]);
137
+ const snapshotWarnings = [];
138
+ const unavailableResolution = provider.resolveStaticGolden({
139
+ query: { id: 'sf-02', from: '北京', to: '大理', date: '2026-10-02' },
140
+ manualRecord,
141
+ snapshotError: 'invalid static snapshot schema_version',
142
+ warn: (message) => snapshotWarnings.push(message),
143
+ });
144
+ assert.equal(unavailableResolution.effective_source, 'manual-golden');
145
+ assert.equal(unavailableResolution.fallback_reason, 'static snapshot unavailable: invalid static snapshot schema_version');
146
+ assert.deepEqual(snapshotWarnings, [
147
+ '[sf-live-benchmark] static vendor failed for sf-02: static snapshot unavailable: invalid static snapshot schema_version; fallback=manual-golden',
148
+ ]);
149
+ const malformedRoot = mkdtempSync(join(tmpdir(), 'gotry-static-golden-'));
150
+ try {
151
+ const malformedPath = join(malformedRoot, 'malformed.json');
152
+ writeFileSync(malformedPath, JSON.stringify({ schema_version: 'sf-static-routes.v0', source: {}, routes: [] }));
153
+ assert.throws(() => provider.loadStaticFlightSnapshot(malformedPath), /invalid static snapshot schema_version: sf-static-routes.v0/, '未知 schema 不得被类型断言伪装成有效 static vendor');
154
+ const malformedRoutesPath = join(malformedRoot, 'malformed-routes.json');
155
+ writeFileSync(malformedRoutesPath, JSON.stringify({
156
+ schema_version: 'sf-static-routes.v1',
157
+ source: snapshot.source,
158
+ routes: null,
159
+ }));
160
+ assert.throws(() => provider.loadStaticFlightSnapshot(malformedRoutesPath), /invalid static snapshot routes/, 'schema 名正确但 routes 损坏时也必须由 loader 截获,runner 才能降级 manual');
161
+ }
162
+ finally {
163
+ rmSync(malformedRoot, { recursive: true, force: true });
164
+ }
165
+ console.log('STATIC GOLDEN TESTS: parser + snapshot + resolve/fallback contract OK');