@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,404 @@
1
+ /**
2
+ * Package proof for issue #202.
3
+ *
4
+ * The full suite passes the executable from its clean tarball install; focused
5
+ * runs pack/unpack locally and attach the already-installed root closure. Both
6
+ * paths load the plugin from the artifact, never from the checkout vendor path.
7
+ * No map provider or paid endpoint is contacted; inline-coordinate geocoding is
8
+ * asserted with fetch disabled.
9
+ */
10
+
11
+ import { execFileSync } from 'node:child_process'
12
+ import { createHash } from 'node:crypto'
13
+ import { chmodSync, copyFileSync, existsSync, mkdirSync, mkdtempSync, readFileSync, readdirSync, realpathSync, rmSync, symlinkSync, writeFileSync } from 'node:fs'
14
+ import { createRequire } from 'node:module'
15
+ import { basename, dirname, isAbsolute, join, resolve } from 'node:path'
16
+ import { tmpdir } from 'node:os'
17
+ import { fileURLToPath, pathToFileURL } from 'node:url'
18
+ import assert from 'node:assert/strict'
19
+
20
+ const repoRoot = resolve(dirname(fileURLToPath(import.meta.url)), '../..')
21
+ const upstreamLicenseSha256 = 'b6bbb0c73a02cf8d2c304e9f208b41c32f0a810fabe366986e2b14ac3338f618'
22
+ const upstreamVendorFileCount = 37
23
+ const adaptedVendorAggregateSha256 = 'f01515d8c1ec2973c7b4fb2bec0f6e2175bceef7a5331847cb210a11855a49e2'
24
+ const expectedTools = [
25
+ 'map_bicycling_route',
26
+ 'map_driving_route',
27
+ 'map_geocode',
28
+ 'map_poi_search',
29
+ 'map_reverse_geocode',
30
+ 'map_transit_route',
31
+ 'map_walking_route',
32
+ ]
33
+
34
+ function sha256(path: string): string {
35
+ return createHash('sha256').update(readFileSync(path)).digest('hex')
36
+ }
37
+
38
+ function vendorAggregate(root: string): { count: number; sha256: string } {
39
+ const files: string[] = []
40
+ const walk = (directory: string) => {
41
+ for (const entry of readdirSync(directory, { withFileTypes: true })) {
42
+ const path = join(directory, entry.name)
43
+ if (entry.isDirectory()) walk(path)
44
+ else files.push(path.slice(root.length + 1).replaceAll('\\', '/'))
45
+ }
46
+ }
47
+ walk(root)
48
+ files.sort()
49
+ const digest = createHash('sha256')
50
+ for (const relative of files) {
51
+ digest.update(relative)
52
+ digest.update('\0')
53
+ digest.update(readFileSync(join(root, relative)))
54
+ digest.update('\0')
55
+ }
56
+ return { count: files.length, sha256: digest.digest('hex') }
57
+ }
58
+
59
+ function assertPackagingExcludesNodeModules(): void {
60
+ const tempRoot = mkdtempSync(join(tmpdir(), 'gotry-pack-excl-'))
61
+ try {
62
+ const archiveTar = join(tempRoot, 'head.tar')
63
+ execFileSync('git', ['archive', '--format=tar', '--output', archiveTar, 'HEAD'], { cwd: repoRoot })
64
+ const checkoutDir = join(tempRoot, 'checkout')
65
+ mkdirSync(checkoutDir)
66
+ execFileSync('tar', ['-xf', archiveTar, '-C', checkoutDir])
67
+ copyFileSync(join(repoRoot, 'package.json'), join(checkoutDir, 'package.json'))
68
+
69
+ const vendorBinDir = join(checkoutDir, 'ts/dsh-runtime/vendor/dsh-map-tools/node_modules/.bin')
70
+ mkdirSync(vendorBinDir, { recursive: true })
71
+ for (const name of ['cordis', 'tsc', 'tsserver', 'vitest']) {
72
+ const binPath = join(vendorBinDir, name)
73
+ writeFileSync(binPath, '#!/usr/bin/env node\n')
74
+ chmodSync(binPath, 0o755)
75
+ }
76
+
77
+ const packDir = join(tempRoot, 'pack')
78
+ mkdirSync(packDir)
79
+ const packOutput = execFileSync('npm', [
80
+ 'pack', '--ignore-scripts', '--json', '--pack-destination', packDir,
81
+ ], { cwd: checkoutDir, encoding: 'utf8' })
82
+ const packInfo = JSON.parse(packOutput) as Array<{ filename: string }>
83
+ assert.equal(packInfo.length, 1, 'temp npm pack must produce one artifact')
84
+ const tarball = join(packDir, packInfo[0].filename)
85
+ assert.ok(existsSync(tarball), `temp packed artifact missing: ${tarball}`)
86
+
87
+ const entries = execFileSync('tar', ['-tzf', tarball], { encoding: 'utf8' }).trimEnd().split('\n')
88
+ const nodeModulesEntries = entries.filter(path =>
89
+ path.startsWith('package/ts/dsh-runtime/vendor/dsh-map-tools/node_modules'),
90
+ )
91
+ assert.equal(
92
+ nodeModulesEntries.length, 0,
93
+ `npm pack must exclude vendor node_modules: found ${nodeModulesEntries.join(', ')}`,
94
+ )
95
+
96
+ const extractDir = join(tempRoot, 'extracted')
97
+ mkdirSync(extractDir)
98
+ execFileSync('tar', ['-xzf', tarball, '-C', extractDir])
99
+ const packedVendorRoot = join(extractDir, 'package/ts/dsh-runtime/vendor/dsh-map-tools')
100
+ const packedAggregate = vendorAggregate(packedVendorRoot)
101
+ assert.equal(packedAggregate.count, upstreamVendorFileCount, 'packed vendor file count drifted')
102
+ assert.equal(packedAggregate.sha256, adaptedVendorAggregateSha256, 'packed vendor aggregate drifted')
103
+ } finally {
104
+ rmSync(tempRoot, { recursive: true, force: true })
105
+ }
106
+ }
107
+
108
+ function assertTargetLockClosure(): { packages: number; version: string } {
109
+ const manifest = JSON.parse(readFileSync(join(repoRoot, 'ts/package.json'), 'utf8')) as {
110
+ dependencies?: Record<string, string>
111
+ }
112
+ assert.equal(manifest.dependencies?.['dsh-map-tools'], undefined, 'external map-tools dependency must stay removed')
113
+
114
+ const lock = JSON.parse(readFileSync(join(repoRoot, 'ts/package-lock.json'), 'utf8')) as {
115
+ packages?: Record<string, { version?: string; dependencies?: Record<string, string> }>
116
+ }
117
+ assert.equal(lock.packages?.['']?.dependencies?.['dsh-map-tools'], undefined, 'lock root must not resolve external map-tools')
118
+ assert.equal(lock.packages?.['node_modules/dsh-map-tools'], undefined, 'lock must not carry external map-tools')
119
+ const dshEntries = Object.entries(lock.packages ?? {}).filter(([path]) =>
120
+ /(?:^|\/)node_modules\/@deepseek-ai\/(?:dsh|dsh-[^/]+)$/.test(path),
121
+ )
122
+ assert.ok(dshEntries.length >= 10, 'expected dsh-tools peer closure in the ts lock')
123
+ for (const [path, entry] of dshEntries) {
124
+ assert.equal(entry.version, '0.2.0-rc.2', `${path} drifted outside the 0.2.0-rc.2 closure`)
125
+ }
126
+ return { packages: dshEntries.length, version: '0.2.0-rc.2' }
127
+ }
128
+
129
+ function findPackageRoot(entry: string): string {
130
+ let cursor = dirname(entry)
131
+ for (;;) {
132
+ const manifestPath = join(cursor, 'package.json')
133
+ if (existsSync(manifestPath)) {
134
+ const manifest = JSON.parse(readFileSync(manifestPath, 'utf8')) as { name?: string }
135
+ if (manifest.name === '@danceiny/gotry') return cursor
136
+ }
137
+ const parent = dirname(cursor)
138
+ if (parent === cursor) throw new Error(`cannot locate @danceiny/gotry package root from ${entry}`)
139
+ cursor = parent
140
+ }
141
+ }
142
+
143
+ function assertBinTargetsPackage(binPath: string, expectedTarget: string): void {
144
+ const resolvedExpectedTarget = realpathSync(expectedTarget)
145
+ if (realpathSync(binPath) === resolvedExpectedTarget) return
146
+
147
+ // pnpm writes an executable shell shim instead of a symlink. Its final
148
+ // machine-readable marker is safer to verify than accepting any occurrence
149
+ // of the package path in an otherwise unrelated executable.
150
+ const shim = readFileSync(binPath, 'utf8')
151
+ assert.ok(Buffer.byteLength(shim, 'utf8') <= 32_768, 'clean-install gotry shim is unexpectedly large')
152
+ const lines = shim.trimEnd().split(/\r?\n/)
153
+ const markers = lines.filter(line => line.startsWith('# cmd-shim-target='))
154
+ assert.equal(markers.length, 1, 'pnpm gotry shim must contain exactly one target marker')
155
+ assert.equal(lines.at(-1), markers[0], 'pnpm gotry shim target marker must be the final line')
156
+ const markerTarget = markers[0].slice('# cmd-shim-target='.length)
157
+ assert.ok(isAbsolute(markerTarget), 'pnpm gotry shim target must be absolute')
158
+ assert.equal(
159
+ realpathSync(markerTarget),
160
+ resolvedExpectedTarget,
161
+ 'GOTRY_MAP_TOOLS_E2E_BIN shim must target this installed GoTry package',
162
+ )
163
+ }
164
+
165
+ function prepareProofPackage(cleanInstalledBin?: string): { packageRoot: string; proofRoot?: string } {
166
+ if (cleanInstalledBin) {
167
+ const binPath = resolve(cleanInstalledBin)
168
+ assert.equal(basename(binPath), 'gotry', 'clean-install executable must use the gotry bin name')
169
+ assert.equal(basename(dirname(binPath)), '.bin', 'clean-install executable must come from node_modules/.bin')
170
+ assert.equal(basename(dirname(dirname(binPath))), 'node_modules', 'clean-install executable must come from a consumer install')
171
+ const consumerRoot = dirname(dirname(dirname(binPath)))
172
+ const packageMain = createRequire(join(consumerRoot, 'package.json')).resolve('@danceiny/gotry')
173
+ const packageRoot = findPackageRoot(packageMain)
174
+ const installedManifest = JSON.parse(readFileSync(join(packageRoot, 'package.json'), 'utf8')) as {
175
+ name?: string
176
+ bin?: string | Record<string, string>
177
+ }
178
+ assert.equal(installedManifest.name, '@danceiny/gotry', 'clean-install executable must belong to GoTry')
179
+ const declaredBin = typeof installedManifest.bin === 'string'
180
+ ? installedManifest.bin
181
+ : installedManifest.bin?.gotry
182
+ assert.equal(declaredBin, 'bin/gotry-inner.js', 'installed package must declare the production gotry bin')
183
+ assertBinTargetsPackage(binPath, join(packageRoot, declaredBin))
184
+ return { packageRoot }
185
+ }
186
+
187
+ const proofRoot = mkdtempSync(join(repoRoot, '.tmp-map-tools-proof-'))
188
+ try {
189
+ const packOutput = execFileSync('npm', [
190
+ 'pack', '--ignore-scripts', '--json', '--pack-destination', proofRoot,
191
+ ], { cwd: repoRoot, encoding: 'utf8' })
192
+ const packInfo = JSON.parse(packOutput) as Array<{ filename: string }>
193
+ assert.equal(packInfo.length, 1, 'npm pack must produce one artifact')
194
+ const tarball = join(proofRoot, packInfo[0].filename)
195
+ assert.ok(existsSync(tarball), `packed artifact missing: ${tarball}`)
196
+ const unpackRoot = join(proofRoot, 'unpacked')
197
+ mkdirSync(unpackRoot)
198
+ execFileSync('tar', ['-xzf', tarball, '-C', unpackRoot])
199
+ const packageRoot = join(unpackRoot, 'package')
200
+ symlinkSync(join(repoRoot, 'node_modules'), join(packageRoot, 'node_modules'), process.platform === 'win32' ? 'junction' : 'dir')
201
+ return { packageRoot, proofRoot }
202
+ } catch (error) {
203
+ rmSync(proofRoot, { recursive: true, force: true })
204
+ throw error
205
+ }
206
+ }
207
+
208
+ const cleanInstalledBin = process.env.GOTRY_MAP_TOOLS_E2E_BIN
209
+ const { packageRoot, proofRoot } = prepareProofPackage(cleanInstalledBin)
210
+
211
+ try {
212
+ assertPackagingExcludesNodeModules()
213
+ const lockedDsh = assertTargetLockClosure()
214
+ const vendorRoot = join(packageRoot, 'ts/dsh-runtime/vendor/dsh-map-tools')
215
+ const requiredFiles = [
216
+ 'LICENSE',
217
+ 'package.json',
218
+ 'cordis.patch.yml',
219
+ 'lib/index.js',
220
+ 'lib/settings-ns.js',
221
+ 'lib/config.js',
222
+ 'lib/tools/geocode.js',
223
+ 'lib/tools/routes.js',
224
+ 'lib/tools/poi.js',
225
+ ]
226
+ for (const relative of requiredFiles) {
227
+ assert.ok(existsSync(join(vendorRoot, relative)), `required vendor file missing: ${relative}`)
228
+ }
229
+ const vendorTree = vendorAggregate(vendorRoot)
230
+ assert.equal(vendorTree.count, upstreamVendorFileCount, 'vendored payload file count drifted')
231
+ assert.equal(vendorTree.sha256, adaptedVendorAggregateSha256, 'vendored payload aggregate drifted')
232
+ const vendorPackage = JSON.parse(readFileSync(join(vendorRoot, 'package.json'), 'utf8')) as {
233
+ name?: string
234
+ version?: string
235
+ license?: string
236
+ }
237
+ assert.equal(vendorPackage.name, 'dsh-map-tools')
238
+ assert.equal(vendorPackage.version, '0.7.3')
239
+ assert.equal(vendorPackage.license, 'MIT')
240
+ assert.equal(sha256(join(vendorRoot, 'LICENSE')), upstreamLicenseSha256, 'upstream MIT license changed')
241
+
242
+ const packageRequire = createRequire(join(packageRoot, 'package.json'))
243
+ const dshToolsPackageJson = packageRequire.resolve('@deepseek-ai/dsh-tools/package.json')
244
+ const dshSettingsPackageJson = packageRequire.resolve('@deepseek-ai/dsh-settings/package.json')
245
+ const dshTools = JSON.parse(readFileSync(dshToolsPackageJson, 'utf8')) as { version: string }
246
+ const dshSettings = JSON.parse(readFileSync(dshSettingsPackageJson, 'utf8')) as { version: string }
247
+ assert.equal(dshTools.version, '0.2.0-rc.2')
248
+ assert.equal(dshSettings.version, '0.2.0-rc.2')
249
+ const settingsApi = await import(pathToFileURL(join(dirname(dshSettingsPackageJson), 'lib/index.js')).href) as {
250
+ SettingsForms?: { prototype?: { configure?: (...args: unknown[]) => () => void } }
251
+ }
252
+ // 0.2.0-rc.2:SettingsForms 取代了手工 section API——表单由插件导出的
253
+ // Config schema 自动生成,唯一的手工注册是页策略 settings.configure({auto}, fiber)。
254
+ const settingsConfigure = settingsApi.SettingsForms?.prototype?.configure
255
+ assert.equal(
256
+ typeof settingsConfigure,
257
+ 'function',
258
+ 'real 0.2.0-rc.2 SettingsForms.prototype.configure must be present',
259
+ )
260
+
261
+ const plugin = await import(pathToFileURL(join(vendorRoot, 'lib/index.js')).href)
262
+ type RegisteredTool = Record<string, unknown> & { name: string; execute?: unknown }
263
+ const registered = new Map<string, RegisteredTool>()
264
+ const registerEvents: string[] = []
265
+ const toolDisposeEvents: string[] = []
266
+ const settingsRegistrations: unknown[][] = []
267
+ const settingsWatchers: Array<() => void> = []
268
+ const settingsProviderDisposers: Array<() => void> = []
269
+ const contextDisposers: Array<() => void> = []
270
+ const settingsConfigureCalls: Array<{ presentation: unknown; owner: unknown }> = []
271
+ const activeToolNames = () => [...registered.keys()].sort()
272
+ const settingsConfigureDisposed: string[] = []
273
+ const settingsProvider = {
274
+ ctx: {
275
+ effect(effect: () => (() => void) | void) {
276
+ const disposer = effect()
277
+ if (typeof disposer === 'function') settingsProviderDisposers.push(disposer)
278
+ return disposer
279
+ },
280
+ },
281
+ register: (...args: unknown[]) => {
282
+ settingsRegistrations.push(args)
283
+ return {
284
+ get: () => args[2] && typeof args[2] === 'object' ? (args[2] as { base?: unknown }).base : undefined,
285
+ watch: (callback: () => void) => {
286
+ settingsWatchers.push(callback)
287
+ return () => {
288
+ const index = settingsWatchers.indexOf(callback)
289
+ if (index >= 0) settingsWatchers.splice(index, 1)
290
+ }
291
+ },
292
+ update: async () => undefined,
293
+ replace: async () => undefined,
294
+ }
295
+ },
296
+ installSection: (..._args: unknown[]) => {
297
+ throw new Error('legacy installSection must not be called on the 0.2.0-rc.2 settings service')
298
+ },
299
+ configure: (presentation: unknown, owner: unknown) => {
300
+ settingsConfigureCalls.push({ presentation, owner })
301
+ return () => {
302
+ settingsConfigureDisposed.push('policy')
303
+ }
304
+ },
305
+ }
306
+ const context = {
307
+ fiber: { state: 'active' },
308
+ effect(effect: () => (() => void) | void) {
309
+ const disposer = effect()
310
+ if (typeof disposer === 'function') contextDisposers.push(disposer)
311
+ return disposer
312
+ },
313
+ tools: {
314
+ register(tool: RegisteredTool) {
315
+ assert.ok(tool.name.startsWith('map_'), `unexpected map tool name: ${tool.name}`)
316
+ registered.set(tool.name, tool)
317
+ registerEvents.push(tool.name)
318
+ return () => {
319
+ registered.delete(tool.name)
320
+ toolDisposeEvents.push(tool.name)
321
+ }
322
+ },
323
+ },
324
+ inject(dependencies: string[], callback: (scope: Record<string, unknown>) => void) {
325
+ if (dependencies.includes('settings')) {
326
+ callback({ settings: settingsProvider })
327
+ } else if (dependencies.includes('webServer')) {
328
+ // 0.7.3 的 config-route 用 scope.effect 托管回环路由的撤销注册。
329
+ callback({
330
+ webServer: { register: () => undefined },
331
+ effect(effect: () => (() => void) | void) {
332
+ const disposer = effect()
333
+ if (typeof disposer === 'function') contextDisposers.push(disposer)
334
+ return disposer
335
+ },
336
+ })
337
+ } else {
338
+ throw new Error(`unexpected dependency injection: ${dependencies.join(',')}`)
339
+ }
340
+ },
341
+ }
342
+ plugin.apply(context, {
343
+ provider: 'osm', amapKey: '', timeoutMs: 1000, maxQps: 2,
344
+ defaultMode: 'driving', language: 'zh',
345
+ })
346
+ assert.deepEqual(activeToolNames(), expectedTools, 'exactly seven active map tools must register')
347
+ assert.equal(registerEvents.length, expectedTools.length, 'schema-driven settings add no initial tool rebuild')
348
+ assert.equal(toolDisposeEvents.length, 0, 'schema-driven settings dispose no tool generation')
349
+ assert.equal(settingsConfigureCalls.length, 1, '0.2.0-rc.2 settings page policy must configure exactly once')
350
+ assert.deepEqual(settingsConfigureCalls[0]?.presentation, { auto: true }, 'page policy presentation must opt into the automatic card')
351
+ assert.equal(settingsConfigureCalls[0]?.owner, context.fiber, 'page policy owner must be the plugin fiber')
352
+ assert.equal(settingsRegistrations.length, 0, 'legacy per-section registration must stay retired')
353
+ assert.equal(settingsWatchers.length, 0, 'legacy settings watcher must stay retired')
354
+ assert.equal(settingsProviderDisposers.length, 0, 'legacy provider-detach fallback must stay retired')
355
+ // 两个受管撤销:config-route 的回环路由注册 + settings 页策略(按注册序)。
356
+ assert.equal(contextDisposers.length, 2, 'config-route disposer + settings page-policy disposer must register with the plugin effects')
357
+
358
+ contextDisposers[1]!()
359
+ assert.equal(settingsConfigureDisposed.length, 1, 'plugin effect disposal must release the settings page policy')
360
+ assert.deepEqual(activeToolNames(), expectedTools, 'policy disposal must keep exactly seven active map tools')
361
+
362
+ const finalActiveTools = [...registered.values()]
363
+ const originalFetch = globalThis.fetch
364
+ globalThis.fetch = (async () => { throw new Error('network forbidden by package proof') }) as typeof fetch
365
+ try {
366
+ const geocode = registered.get('map_geocode')
367
+ assert.ok(geocode, 'map_geocode must be registered')
368
+ const result = await (geocode.execute as (args: unknown, execution: unknown) => Promise<unknown>)(
369
+ { address: '116.397428,39.90923' },
370
+ { signal: new AbortController().signal },
371
+ ) as { provider?: string; location?: number[] }
372
+ assert.equal(result.provider, 'inline')
373
+ assert.deepEqual(result.location, [116.397428, 39.90923])
374
+ } finally {
375
+ globalThis.fetch = originalFetch
376
+ }
377
+
378
+ for (const dispose of contextDisposers.splice(0).reverse()) dispose()
379
+ assert.equal(registered.size, 0, 'plugin unload must dispose the active map tool generation')
380
+
381
+ console.log(JSON.stringify({
382
+ proof: 'map-tools-vendor-package',
383
+ status: 'PASS',
384
+ artifactMode: cleanInstalledBin ? 'clean-installed-tarball' : 'packed-unpacked-focused',
385
+ vendored: {
386
+ sourcePackage: 'dsh-map-tools@0.7.3',
387
+ licenseSha256: upstreamLicenseSha256, vendorFileCount: vendorTree.count,
388
+ adaptedVendorAggregateSha256: vendorTree.sha256,
389
+ },
390
+ artifactVendor: vendorRoot,
391
+ dshClosure: { tools: dshTools.version, settings: dshSettings.version, ...lockedDsh },
392
+ settingsLifecycle: {
393
+ registerEvents: registerEvents.length,
394
+ toolDisposeEvents: toolDisposeEvents.length,
395
+ pagePolicyConfigured: settingsConfigureCalls.length,
396
+ legacySectionRegistrations: settingsRegistrations.length,
397
+ pluginUnloadDisposed: true,
398
+ },
399
+ tools: finalActiveTools.map(tool => tool.name).sort(),
400
+ inlineCoordinate: { provider: 'inline', network: 'forbidden' },
401
+ }, null, 2))
402
+ } finally {
403
+ if (proofRoot) rmSync(proofRoot, { recursive: true, force: true })
404
+ }
@@ -34,7 +34,7 @@ export async function checkConnectivity(a: string, b: string): Promise<{ connect
34
34
  return {
35
35
  connected: false,
36
36
  evidence: inHub
37
- ? `[骨架:openflights] ❌ ${a}↔${b} 枢纽间无直飞记录——引擎应将此候选降权或要求中转`
37
+ ? `[骨架:openflights] ❌ ${a}↔${b} 枢纽对未在骨架覆盖(实时源以新航线为准;骨架可能滞后——请用户根据行程复核)`
38
38
  : `[骨架:openflights] ○ ${a}或${b}不在枢纽集,骨架不覆盖(不作否定结论)`,
39
39
  }
40
40
  }
@@ -1,6 +1,8 @@
1
1
  /**
2
2
  * 骨架层集成验证(§7-1 消费面):开 skeletonHub + 带 route 的段 → 结果带三值标注;
3
3
  * 枢纽间否定只标注不排除——EK329(数据集滞后的新航线)必须存活。
4
+ * 用户面(issue #559 卡点 4):unscaffolded leg 必须挂 ⚠ 前缀,避免用户读到「正常选择」后才在尾部 skeleton_notes 发现矛盾。
5
+ * 内核冻结面(#234)不可擅动,⚠ 标记由 loop.ts:renderSolve 从 skeleton_notes 字符串编码里推断。
4
6
  * 运行(在 ts/ 下):npx tsx scripts/skeleton-integration-test.ts
5
7
  */
6
8
 
@@ -8,6 +10,7 @@ import assert from 'node:assert/strict'
8
10
  import { readFile } from 'node:fs/promises'
9
11
  import { join } from 'node:path'
10
12
  import { parseFlightPackToSpec, solveUnified } from '../src/unified.ts'
13
+ import { renderSolve, newState } from '../src/loop.ts'
11
14
 
12
15
  const pack = JSON.parse(await readFile(join('..', 'data', 'flights_2026.json'), 'utf-8'))
13
16
  const spec = parseFlightPackToSpec(pack)
@@ -18,6 +21,25 @@ const r = await solveUnified(spec)
18
21
  assert.equal(r.feasible, true, '骨架否定不排除——EK329 必须仍在')
19
22
  const f5 = r.legs!.find(l => l.leg === 'f5')
20
23
  assert.equal(f5?.service, 'EK329', 'EK329 存活(骨架滞后容错)')
24
+
25
+ // §7-1 issue #559 卡点 4:骨架证据不再承诺「降权或中转」——承认骨架滞后,让用户据行程复核
21
26
  assert.ok((r.skeleton_notes ?? []).some(n => n.includes('SZX') && n.includes('❌')), `枢纽否定标注在: ${r.skeleton_notes}`)
22
27
  assert.ok((r.skeleton_notes ?? []).some(n => n.includes('HKG') && n.includes('✅')), '正向标注在')
23
- console.log(`骨架集成 OK:EK329 在枢纽否定下存活,标注=[${r.skeleton_notes?.join(' | ')}]`)
28
+ assert.ok(
29
+ !(r.skeleton_notes ?? []).some(n => n.includes('应将此候选降权') || n.includes('要求中转')),
30
+ '骨架证据不再承诺「降权或中转」——承认骨架滞后,让用户据行程复核',
31
+ )
32
+
33
+ // §7-1 issue #559 卡点 4:renderSolve 从 skeleton_notes 推断 unscaffolded leg,
34
+ // 给 ⚠ 前缀 + 补充说明,用户读到即知(不动 #234 内核冻结面)
35
+ const state = newState()
36
+ state.solve = r as unknown as Parameters<typeof renderSolve>[0]['solve']
37
+ const rendered = renderSolve(state)
38
+ const f5Line = rendered.split('\n').find(line => line.includes('f5') && line.includes('EK329')) ?? ''
39
+ assert.ok(f5Line.startsWith('- ⚠'), `f5 EK329 用户面必须有 ⚠ 前缀(实测行=${f5Line})`)
40
+ assert.ok(f5Line.includes('枢纽对未在骨架覆盖'), 'f5 用户面行内必须说明「枢纽对未在骨架覆盖」')
41
+ const f1Line = rendered.split('\n').find(line => line.includes('f1 ') && line.includes(':') && line.includes('起飞') && !line.startsWith('- ⚠')) ?? ''
42
+ assert.ok(f1Line.length > 0, 'f1 HKG↔HKT 正向覆盖的 leg 行必须在(实测查找结果为空)')
43
+ assert.ok(!f1Line.startsWith('- ⚠'), `f1 正向覆盖不应有 ⚠ 前缀(实测行=${f1Line})`)
44
+
45
+ console.log(`骨架集成 OK:EK329 仍存活,用户面 ⚠ 前缀落地;EK329 行=[${f5Line.trim()}]`)