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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (507) hide show
  1. package/README.md +172 -219
  2. package/README.zh-CN.md +222 -0
  3. package/bin/gotry-backend.js +53 -0
  4. package/bin/gotry-booking-copilot.js +53 -0
  5. package/bin/gotry-bootstrap.js +1744 -0
  6. package/bin/gotry-inner.js +733 -83
  7. package/bin/gotry-process-liveness.d.ts +27 -0
  8. package/bin/gotry-process-liveness.js +97 -0
  9. package/bin/gotry-runtime-resolution.d.ts +27 -0
  10. package/bin/gotry-runtime-resolution.js +49 -0
  11. package/bin/gotry.js +1 -1
  12. package/client/client.js +203 -0
  13. package/cordis.gotry-patch.yml +80 -56
  14. package/data/airline-airports.json +39 -0
  15. package/data/stations-12306-verify.json +524 -0
  16. package/dist/capabilities/agent-reach-deep.js +45 -122
  17. package/dist/capabilities/agent-reach.js +101 -146
  18. package/dist/capabilities/anything.js +135 -94
  19. package/dist/capabilities/artifacts.js +370 -0
  20. package/dist/capabilities/channel-health.js +131 -0
  21. package/dist/capabilities/channel-registry.js +256 -0
  22. package/dist/capabilities/doctor.js +546 -0
  23. package/dist/capabilities/effect.js +394 -0
  24. package/dist/capabilities/external-event.js +149 -0
  25. package/dist/capabilities/fact-log.js +55 -0
  26. package/dist/capabilities/flyai-config.js +337 -0
  27. package/dist/capabilities/flyai.js +947 -110
  28. package/dist/capabilities/fx-contract.js +293 -0
  29. package/dist/capabilities/geo-atlas.js +246 -0
  30. package/dist/capabilities/ground-transfer.js +509 -0
  31. package/dist/capabilities/hbcli.js +260 -123
  32. package/dist/capabilities/hotelbyte-transaction.js +194 -0
  33. package/dist/capabilities/incident-log.js +131 -61
  34. package/dist/capabilities/itinerary-artifact.js +190 -0
  35. package/dist/capabilities/itinerary-deck-artifact.js +194 -0
  36. package/dist/capabilities/itinerary-deck-export.js +339 -0
  37. package/dist/capabilities/lavish-local.js +924 -0
  38. package/dist/capabilities/model-override.js +38 -0
  39. package/dist/capabilities/opensky.js +54 -43
  40. package/dist/capabilities/resilience.js +191 -0
  41. package/dist/capabilities/session/action-cache.js +50 -44
  42. package/dist/capabilities/session/adapters/ctrip-flight.js +120 -62
  43. package/dist/capabilities/session/adapters/ctrip-hotel.js +222 -0
  44. package/dist/capabilities/session/adapters/dida-portal.js +274 -0
  45. package/dist/capabilities/session/adapters/meituan-local.js +35 -54
  46. package/dist/capabilities/session/adapters/rail-12306.js +342 -0
  47. package/dist/capabilities/session/benchmark.js +189 -0
  48. package/dist/capabilities/session/bridge-ledger.js +224 -0
  49. package/dist/capabilities/session/extension-bridge.js +636 -0
  50. package/dist/capabilities/session/extension-channel.js +109 -0
  51. package/dist/capabilities/session/extension-distribution.js +230 -0
  52. package/dist/capabilities/session/extract.js +31 -21
  53. package/dist/capabilities/session/golden-score.js +114 -0
  54. package/dist/capabilities/session/health-watch.js +215 -0
  55. package/dist/capabilities/session/read-guard.js +75 -24
  56. package/dist/capabilities/session/static-flight-golden.js +150 -0
  57. package/dist/capabilities/session/transport.js +97 -83
  58. package/dist/capabilities/session/wizard.js +117 -0
  59. package/dist/capabilities/session-consent.js +178 -0
  60. package/dist/capabilities/session-login.js +170 -0
  61. package/dist/capabilities/session-search.js +635 -44
  62. package/dist/capabilities/spawn-bounded.js +203 -0
  63. package/dist/capabilities/sponsor-plugin.js +341 -0
  64. package/dist/capabilities/visa-policy.js +140 -0
  65. package/dist/capabilities/weather.js +243 -138
  66. package/dist/data/session-golden-20.json +25 -0
  67. package/dist/data/sf-golden-manifest.json +103 -0
  68. package/dist/data/sf-static-routes.json +91 -0
  69. package/dist/scripts/action-cache-tests.js +24 -59
  70. package/dist/scripts/agent-planning-turn-deadline-e2e.js +242 -0
  71. package/dist/scripts/agent-planning-turn-deadline-tests.js +185 -0
  72. package/dist/scripts/agent-reach-deep-tests.js +30 -40
  73. package/dist/scripts/agent-reach-error-tests.js +354 -0
  74. package/dist/scripts/agent-reach-tests.js +26 -18
  75. package/dist/scripts/agent-reach-wrapper-tests.js +50 -50
  76. package/dist/scripts/anything-tests.js +116 -60
  77. package/dist/scripts/artifact-client-contract-tests.js +220 -0
  78. package/dist/scripts/artifacts-capability-tests.js +727 -0
  79. package/dist/scripts/async-collect.js +50 -11
  80. package/dist/scripts/benchmark-environment-bridge-e2e.js +741 -0
  81. package/dist/scripts/benchmark-environment-bridge-tests.js +1452 -0
  82. package/dist/scripts/booking-copilot-availability-ledger-binding-tests.js +126 -0
  83. package/dist/scripts/booking-copilot-availability-policy-tests.js +265 -0
  84. package/dist/scripts/booking-copilot-bin-proof-tests.js +66 -0
  85. package/dist/scripts/booking-copilot-cleanup-proof-helper.js +76 -0
  86. package/dist/scripts/booking-copilot-crossrepo-fixture-server.js +144 -0
  87. package/dist/scripts/booking-copilot-dsh-core-proof-tests.js +424 -0
  88. package/dist/scripts/booking-copilot-dsh-planner-proof-tests.js +2839 -0
  89. package/dist/scripts/booking-copilot-dsh-plugin-proof-tests.js +309 -0
  90. package/dist/scripts/booking-copilot-dsh-readiness-proof.js +238 -0
  91. package/dist/scripts/booking-copilot-dsh-warmer-proof.js +123 -0
  92. package/dist/scripts/booking-copilot-event-sequence-concurrency-proof-tests.js +156 -0
  93. package/dist/scripts/booking-copilot-gap-code-contract-proof-tests.js +70 -0
  94. package/dist/scripts/booking-copilot-intent-proof-tests.js +422 -0
  95. package/dist/scripts/booking-copilot-operation-ledger-concurrency-proof-tests.js +184 -0
  96. package/dist/scripts/booking-copilot-planner-live-probe.js +95 -0
  97. package/dist/scripts/booking-copilot-proof-runtime.js +42 -0
  98. package/dist/scripts/booking-copilot-receipt-ledger-concurrency-proof-tests.js +210 -0
  99. package/dist/scripts/booking-copilot-runtime-proof-tests.js +2349 -0
  100. package/dist/scripts/booking-copilot-server-proof-tests.js +784 -0
  101. package/dist/scripts/booking-copilot-startup-proof-tests.js +94 -0
  102. package/dist/scripts/booking-executor-tests.js +80 -0
  103. package/dist/scripts/booking-recovery-chain-tests.js +182 -0
  104. package/dist/scripts/booking-saga-tests.js +125 -0
  105. package/dist/scripts/booking-surface-contract-proof-tests.js +212 -0
  106. package/dist/scripts/bootstrap-tests.js +1479 -0
  107. package/dist/scripts/bridge-events-tests.js +239 -0
  108. package/dist/scripts/bridge-ledger-tests.js +428 -0
  109. package/dist/scripts/build-changelog.js +238 -0
  110. package/dist/scripts/build-metrics-report.js +331 -0
  111. package/dist/scripts/changelog-tests.js +118 -0
  112. package/dist/scripts/channel-probe-tests.js +103 -0
  113. package/dist/scripts/channel-probe.js +169 -0
  114. package/dist/scripts/channel-registry-tests.js +208 -0
  115. package/dist/scripts/companion-tests.js +25 -70
  116. package/dist/scripts/dida-cookie-probe.js +87 -0
  117. package/dist/scripts/dida-runner-stop-tests.js +311 -0
  118. package/dist/scripts/dida-sw-probe.js +114 -0
  119. package/dist/scripts/diff-test.js +17 -12
  120. package/dist/scripts/doctor-tests.js +564 -0
  121. package/dist/scripts/dsh-artifact-e2e.js +279 -0
  122. package/dist/scripts/dsh-artifact-web-e2e.js +675 -0
  123. package/dist/scripts/dsh-http-proxy-sse-proof.js +90 -0
  124. package/dist/scripts/dsh-runtime-closure-tests.js +182 -0
  125. package/dist/scripts/dsh-runtime-closure.js +162 -0
  126. package/dist/scripts/dsh-session-v3-migration-proof.js +109 -0
  127. package/dist/scripts/dsh-subprocess-local-proof.js +150 -0
  128. package/dist/scripts/dsh-target-closure-proof.js +178 -0
  129. package/dist/scripts/effect-tests.js +539 -0
  130. package/dist/scripts/engine-run.js +1 -3
  131. package/dist/scripts/engine-tests.js +16 -10
  132. package/dist/scripts/evaluation-cadence-tests.js +174 -0
  133. package/dist/scripts/evaluation-contract-tests.js +268 -0
  134. package/dist/scripts/extension-distribution-cli.js +39 -0
  135. package/dist/scripts/extension-distribution-tests.js +443 -0
  136. package/dist/scripts/extension-tests.js +988 -0
  137. package/dist/scripts/external-event-tests.js +350 -0
  138. package/dist/scripts/fact-gate-tests.js +869 -0
  139. package/dist/scripts/fixtures/extension-bridge-unref-child.mjs +21 -0
  140. package/dist/scripts/flight-hotel-anchor-363-registered-e2e.js +169 -0
  141. package/dist/scripts/flight-malformed-tests.js +159 -0
  142. package/dist/scripts/flyai-setup-tests.js +228 -0
  143. package/dist/scripts/flyai-setup-tool-tests.js +54 -0
  144. package/dist/scripts/flyai-tests.js +692 -0
  145. package/dist/scripts/flyai-tool-registration-contract-tests.js +91 -0
  146. package/dist/scripts/fx-contract-tests.js +201 -0
  147. package/dist/scripts/g5-guard-tests.js +131 -0
  148. package/dist/scripts/g5-guard.js +189 -0
  149. package/dist/scripts/gen-lunar-anchors.js +106 -0
  150. package/dist/scripts/geo-atlas-tests.js +283 -0
  151. package/dist/scripts/gotry-backend-kernel-tests.js +206 -0
  152. package/dist/scripts/gotry-try-demo-tests.js +79 -0
  153. package/dist/scripts/gotry-try-demo.js +49 -0
  154. package/dist/scripts/ground-transfer-tests.js +956 -0
  155. package/dist/scripts/hbcli-e2e-tests.js +159 -0
  156. package/dist/scripts/hbcli-live-optin-tests.js +96 -0
  157. package/dist/scripts/hbcli-release-contract-tests.js +122 -0
  158. package/dist/scripts/hbcli-tests.js +121 -69
  159. package/dist/scripts/health-watch-cli.js +73 -0
  160. package/dist/scripts/hotel-date-gate-tests.js +496 -0
  161. package/dist/scripts/hotelbyte-reconcile-tests.js +141 -0
  162. package/dist/scripts/hotelbyte-spawn-e2e-tests.js +373 -0
  163. package/dist/scripts/i18n-tests.js +41 -0
  164. package/dist/scripts/incident-tests.js +281 -87
  165. package/dist/scripts/issue-194-job-id-guard-tests.js +106 -0
  166. package/dist/scripts/issue-233-cancel-refund-commission-tests.js +392 -0
  167. package/dist/scripts/issue-271-liveness-tests.js +569 -0
  168. package/dist/scripts/issue-289-model-retry-real-tests.js +296 -0
  169. package/dist/scripts/issue-289-model-retry-tests.js +441 -0
  170. package/dist/scripts/issue-289-web-retry-e2e.js +630 -0
  171. package/dist/scripts/issue-338-home-city-e2e.js +577 -0
  172. package/dist/scripts/issue343-real-entry-e2e.js +160 -0
  173. package/dist/scripts/issue436-persisted-routing-e2e.js +247 -0
  174. package/dist/scripts/itinerary-artifact-tests.js +368 -0
  175. package/dist/scripts/itinerary-deck-artifact-tests.js +416 -0
  176. package/dist/scripts/itinerary-deck-export-tests.js +552 -0
  177. package/dist/scripts/itinerary-deck-tests.js +435 -0
  178. package/dist/scripts/itinerary-html-tests.js +426 -0
  179. package/dist/scripts/journey-tests.js +22 -27
  180. package/dist/scripts/kernel-manifest-evidence.js +109 -0
  181. package/dist/scripts/kernel-manifest-gate.js +126 -0
  182. package/dist/scripts/kernel-manifest-tests.js +212 -0
  183. package/dist/scripts/kernel-manifest-trace-entry.js +7 -0
  184. package/dist/scripts/kernel-manifest-trace-hook.mjs +28 -0
  185. package/dist/scripts/kernel-manifest.js +369 -0
  186. package/dist/scripts/lavish-local-tests.js +1226 -0
  187. package/dist/scripts/lavish-product-tools-tests.js +537 -0
  188. package/dist/scripts/ledger-repair-apply-tests.js +316 -0
  189. package/dist/scripts/ledger-repair-plan-tests.js +375 -0
  190. package/dist/scripts/ledger-tests.js +382 -246
  191. package/dist/scripts/ledger-workflow-crash.js +10 -20
  192. package/dist/scripts/managed-dsh-cleanup-diagnostic-proof.js +184 -0
  193. package/dist/scripts/managed-dsh-close-failure-proof.js +172 -0
  194. package/dist/scripts/managed-dsh-run-port-proof.js +153 -0
  195. package/dist/scripts/managed-dsh-terminal-proof.js +252 -0
  196. package/dist/scripts/map-tools-vendor-package-proof.js +365 -0
  197. package/dist/scripts/memory-capture-tests.js +242 -61
  198. package/dist/scripts/memory-decay-tests.js +18 -52
  199. package/dist/scripts/memory-lifecycle-tests.js +657 -0
  200. package/dist/scripts/memory-lifecycle.js +196 -0
  201. package/dist/scripts/memory-metrics.js +24 -12
  202. package/dist/scripts/memory-value-report.js +631 -0
  203. package/dist/scripts/memory-value-tests.js +328 -0
  204. package/dist/scripts/metrics-report-tests.js +151 -0
  205. package/dist/scripts/model-override-e2e.js +137 -0
  206. package/dist/scripts/nightly-evidence-tests.js +161 -0
  207. package/dist/scripts/nightly-evidence.js +286 -0
  208. package/dist/scripts/nudge-digest.js +39 -28
  209. package/dist/scripts/observability-tests.js +381 -0
  210. package/dist/scripts/onboarding-tests.js +161 -0
  211. package/dist/scripts/opensky-check.js +18 -13
  212. package/dist/scripts/opensky-tests.js +28 -28
  213. package/dist/scripts/persona-surface-guard-tests.js +49 -0
  214. package/dist/scripts/pnpm-dsh-closure-proof.js +17 -0
  215. package/dist/scripts/policy-anchor-359-registered-e2e.js +214 -0
  216. package/dist/scripts/price-drift-tests.js +340 -0
  217. package/dist/scripts/price-drift-watch.js +447 -0
  218. package/dist/scripts/probe-poi-tests.js +53 -45
  219. package/dist/scripts/product-metrics.js +483 -0
  220. package/dist/scripts/publish-preverify.js +110 -0
  221. package/dist/scripts/realtime-pricing-tests.js +76 -0
  222. package/dist/scripts/recall-tests.js +513 -0
  223. package/dist/scripts/replay-async.js +20 -18
  224. package/dist/scripts/replay-real.js +18 -18
  225. package/dist/scripts/replay.js +52 -82
  226. package/dist/scripts/session-attach-diagnose.js +20 -20
  227. package/dist/scripts/session-attach-poc.js +34 -37
  228. package/dist/scripts/session-benchmark.js +180 -0
  229. package/dist/scripts/session-dida-live-e2e.js +199 -0
  230. package/dist/scripts/session-extract-tests.js +14 -35
  231. package/dist/scripts/session-link-tests.js +478 -0
  232. package/dist/scripts/session-login.js +27 -46
  233. package/dist/scripts/session-tests.js +796 -96
  234. package/dist/scripts/session-zones-tests.js +358 -0
  235. package/dist/scripts/sf-live-benchmark.js +367 -0
  236. package/dist/scripts/sf-live-challenge-stop-tests.js +453 -0
  237. package/dist/scripts/sf-live-cli-tests.js +92 -0
  238. package/dist/scripts/sf-live-options.js +46 -0
  239. package/dist/scripts/sf-manifest-tests.js +30 -0
  240. package/dist/scripts/sf-manifest.js +33 -0
  241. package/dist/scripts/sf-soft-score-tests.js +67 -0
  242. package/dist/scripts/sf-summary-tests.js +324 -0
  243. package/dist/scripts/sf-summary.js +525 -0
  244. package/dist/scripts/share-tests.js +432 -0
  245. package/dist/scripts/skeleton-check.js +16 -14
  246. package/dist/scripts/skeleton-integration-test.js +28 -11
  247. package/dist/scripts/skills-contract-tests.js +51 -46
  248. package/dist/scripts/smoke-session-gate-tests.js +21 -0
  249. package/dist/scripts/smoke.js +690 -246
  250. package/dist/scripts/spawn-bounded-abort-tests.js +241 -0
  251. package/dist/scripts/sponsor-reuse-tests.js +262 -0
  252. package/dist/scripts/state-cli-tests.js +226 -101
  253. package/dist/scripts/state-cli.js +550 -199
  254. package/dist/scripts/state-repair-cli.js +66 -0
  255. package/dist/scripts/state-repair-tests.js +140 -0
  256. package/dist/scripts/static-golden-tests.js +165 -0
  257. package/dist/scripts/time-eval-tests.js +210 -192
  258. package/dist/scripts/travel-timeline-tests.js +29 -93
  259. package/dist/scripts/turn-handoff-collect-tests.js +169 -0
  260. package/dist/scripts/turn-handoff-collect.js +161 -0
  261. package/dist/scripts/turn-policy-tests.js +55 -0
  262. package/dist/scripts/typed-contract-canary.js +176 -0
  263. package/dist/scripts/tz-resolver-sanity.js +50 -0
  264. package/dist/scripts/tz-resolver-tests.js +584 -0
  265. package/dist/scripts/unified-tests.js +23 -19
  266. package/dist/scripts/visa-policy-tests.js +62 -0
  267. package/dist/scripts/weather-tests.js +276 -41
  268. package/dist/scripts/wish-channel-gate-tests.js +54 -0
  269. package/dist/scripts/write-gate-tests.js +522 -0
  270. package/dist/scripts/z3-lifecycle-fault-tests.js +188 -0
  271. package/dist/scripts/z3-lifecycle-tests.js +170 -0
  272. package/dist/scripts/z3-race-repeat-tests.js +39 -0
  273. package/dist/scripts/z3-race-tests.js +41 -0
  274. package/dist/src/artifact-gate.js +829 -0
  275. package/dist/src/backend/kernel.js +91 -0
  276. package/dist/src/backend/modules/booking-copilot.js +92 -0
  277. package/dist/src/backend/modules/booking-executor.js +124 -0
  278. package/dist/src/backend/modules/session-search.js +551 -0
  279. package/dist/src/benchmark-agent-conformance.js +578 -0
  280. package/dist/src/benchmark-environment-bridge.js +515 -0
  281. package/dist/src/benchmark-headless-child-diagnostics.js +166 -0
  282. package/dist/src/benchmark-tool-isolation.js +151 -0
  283. package/dist/src/bookable-facts.js +533 -0
  284. package/dist/src/booking-saga.js +97 -0
  285. package/dist/src/booking-surface/availability-policy.js +697 -0
  286. package/dist/src/booking-surface/booking-intent.js +43 -0
  287. package/dist/src/booking-surface/cancel-refund-commission.js +379 -0
  288. package/dist/src/booking-surface/canonical-schema.js +116 -0
  289. package/dist/src/booking-surface/contracts.js +75 -0
  290. package/dist/src/booking-surface/dsh-planner.js +1854 -0
  291. package/dist/src/booking-surface/dsh-plugin.js +378 -0
  292. package/dist/src/booking-surface/dsh-worker.js +98 -0
  293. package/dist/src/booking-surface/error-codes.js +231 -0
  294. package/dist/src/booking-surface/index.js +9 -0
  295. package/dist/src/booking-surface/managed-dsh-cleanup-diagnostic.js +97 -0
  296. package/dist/src/booking-surface/managed-dsh-run-port.js +244 -0
  297. package/dist/src/booking-surface/profile.js +24 -0
  298. package/dist/src/booking-surface/recovery-chain.js +367 -0
  299. package/dist/src/booking-surface/runtime.js +1968 -0
  300. package/dist/src/booking-surface/server.js +674 -0
  301. package/dist/src/booking-surface/startup.js +168 -0
  302. package/dist/src/booking-surface/validation.js +261 -0
  303. package/dist/src/bridge.js +20 -13
  304. package/dist/src/companions.js +48 -74
  305. package/dist/src/contracts.js +21 -43
  306. package/dist/src/dsh-llm.js +97 -111
  307. package/dist/src/engine.js +276 -193
  308. package/dist/src/evaluation-cadence.js +97 -0
  309. package/dist/src/evaluation-contracts.js +283 -0
  310. package/dist/src/flight-pack-adapter.js +54 -0
  311. package/dist/src/flight-pack-contract.js +2 -0
  312. package/dist/src/flyai-setup-tool.js +70 -0
  313. package/dist/src/gotry-backend.js +125 -0
  314. package/dist/src/hotel-date-gate.js +118 -0
  315. package/dist/src/i18n.js +88 -0
  316. package/dist/src/index.js +2227 -882
  317. package/dist/src/itinerary-deck.js +139 -0
  318. package/dist/src/itinerary-doc-shared.js +661 -0
  319. package/dist/src/itinerary-html.js +131 -0
  320. package/dist/src/journey.js +155 -108
  321. package/dist/src/lavish-tools.js +400 -0
  322. package/dist/src/ledger-repair-apply.js +538 -0
  323. package/dist/src/ledger-repair-plan.js +463 -0
  324. package/dist/src/loop.js +319 -160
  325. package/dist/src/memory-capture.js +180 -32
  326. package/dist/src/memory-decay.js +30 -14
  327. package/dist/src/memory-lifecycle.js +1310 -0
  328. package/dist/src/memory-utility.js +27 -40
  329. package/dist/src/mock-llm.js +36 -61
  330. package/dist/src/model.js +81 -36
  331. package/dist/src/realtime-pricing.js +103 -0
  332. package/dist/src/recall/card.js +74 -0
  333. package/dist/src/recall/evaluator.js +140 -0
  334. package/dist/src/recall/integration.js +17 -0
  335. package/dist/src/recall/tick.js +166 -0
  336. package/dist/src/session-link/plan-it-action.js +48 -0
  337. package/dist/src/session-link/session-link.js +248 -0
  338. package/dist/src/session-zones.js +507 -0
  339. package/dist/src/share/adapters.js +51 -0
  340. package/dist/src/share/share-consent.js +76 -0
  341. package/dist/src/share/share-deck.js +58 -0
  342. package/dist/src/share/share-token.js +146 -0
  343. package/dist/src/slot-spec.js +84 -106
  344. package/dist/src/state-ledger.js +435 -516
  345. package/dist/src/state-repair.js +299 -0
  346. package/dist/src/subagent-job-id-guard.js +58 -0
  347. package/dist/src/time-anchor.js +231 -33
  348. package/dist/src/tool-packet.js +20 -8
  349. package/dist/src/travel-slots.js +58 -35
  350. package/dist/src/travel-timeline.js +44 -63
  351. package/dist/src/turn-deadline.js +287 -0
  352. package/dist/src/turn-policy.js +118 -0
  353. package/dist/src/tz-resolver.js +143 -0
  354. package/dist/src/unified.js +535 -359
  355. package/dist/src/wish-pool.js +42 -12
  356. package/dist/src/write-gate.js +495 -0
  357. package/dist/src/z3-shared.js +284 -0
  358. package/extension/README.md +21 -0
  359. package/extension/README.zh-CN.md +21 -0
  360. package/extension/background.js +463 -0
  361. package/extension/content-bridge.js +270 -0
  362. package/extension/content-main.js +111 -0
  363. package/extension/manifest.json +60 -0
  364. package/package.json +407 -14
  365. package/schemas/booking.intent.schema.json +193 -0
  366. package/schemas/booking.surface.schema.json +2622 -0
  367. package/ts/capabilities/agent-reach-deep.ts +114 -0
  368. package/ts/capabilities/agent-reach.ts +198 -0
  369. package/ts/capabilities/anything.ts +255 -0
  370. package/ts/capabilities/artifacts.ts +428 -0
  371. package/ts/capabilities/fact-log.ts +54 -0
  372. package/ts/capabilities/flyai-config.ts +388 -0
  373. package/ts/capabilities/flyai.ts +1274 -0
  374. package/ts/capabilities/hbcli.ts +253 -71
  375. package/ts/capabilities/incident-log.ts +88 -59
  376. package/ts/capabilities/itinerary-artifact.ts +214 -0
  377. package/ts/capabilities/itinerary-deck-artifact.ts +218 -0
  378. package/ts/capabilities/itinerary-deck-export.ts +378 -0
  379. package/ts/capabilities/opensky.ts +121 -0
  380. package/ts/capabilities/session/action-cache.ts +148 -0
  381. package/ts/capabilities/session/adapters/ctrip-flight.ts +181 -0
  382. package/ts/capabilities/session/adapters/ctrip-hotel.ts +238 -0
  383. package/ts/capabilities/session/adapters/dida-portal.ts +338 -0
  384. package/ts/capabilities/session/adapters/meituan-local.ts +70 -0
  385. package/ts/capabilities/session/adapters/rail-12306.ts +392 -0
  386. package/ts/capabilities/session/benchmark.ts +276 -0
  387. package/ts/capabilities/session/bridge-ledger.ts +333 -0
  388. package/ts/capabilities/session/extension-bridge.ts +794 -0
  389. package/ts/capabilities/session/extension-channel.ts +144 -0
  390. package/ts/capabilities/session/extension-distribution.ts +266 -0
  391. package/ts/capabilities/session/extract.ts +54 -0
  392. package/ts/capabilities/session/golden-score.ts +139 -0
  393. package/ts/capabilities/session/health-watch.ts +264 -0
  394. package/ts/capabilities/session/read-guard.ts +141 -0
  395. package/ts/capabilities/session/static-flight-golden.ts +209 -0
  396. package/ts/capabilities/session/transport.ts +146 -0
  397. package/ts/capabilities/session/wizard.ts +140 -0
  398. package/ts/capabilities/session-consent.ts +211 -0
  399. package/ts/capabilities/session-login.ts +208 -0
  400. package/ts/capabilities/session-search.ts +893 -0
  401. package/ts/capabilities/weather.ts +330 -0
  402. package/ts/dsh-runtime/vendor/README.md +68 -0
  403. package/ts/dsh-runtime/vendor/dsh-map-tools/LICENSE +21 -0
  404. package/ts/dsh-runtime/vendor/dsh-map-tools/README.en.md +405 -0
  405. package/ts/dsh-runtime/vendor/dsh-map-tools/README.md +404 -0
  406. package/ts/dsh-runtime/vendor/dsh-map-tools/client/client.js +1584 -0
  407. package/ts/dsh-runtime/vendor/dsh-map-tools/cordis.patch.yml +5 -0
  408. package/ts/dsh-runtime/vendor/dsh-map-tools/icon.svg +5 -0
  409. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/clients/amap.js +595 -0
  410. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/clients/nominatim.js +63 -0
  411. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/clients/osrm.js +58 -0
  412. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/clients/photon.js +55 -0
  413. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/config-file.js +87 -0
  414. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/config-route.js +131 -0
  415. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/config.js +16 -0
  416. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/geo.js +232 -0
  417. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/index.js +120 -0
  418. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/settings-ns.js +40 -0
  419. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/staticmap-route.js +115 -0
  420. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/tools/geocode.js +127 -0
  421. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/tools/poi.js +84 -0
  422. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/tools/routes.js +267 -0
  423. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/clients/amap.d.ts +90 -0
  424. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/clients/nominatim.d.ts +17 -0
  425. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/clients/osrm.d.ts +15 -0
  426. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/clients/photon.d.ts +22 -0
  427. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/config-file.d.ts +33 -0
  428. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/config-route.d.ts +23 -0
  429. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/config.d.ts +23 -0
  430. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/geo.d.ts +61 -0
  431. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/index.d.ts +18 -0
  432. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/settings-ns.d.ts +14 -0
  433. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/staticmap-route.d.ts +31 -0
  434. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/tools/geocode.d.ts +11 -0
  435. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/tools/poi.d.ts +9 -0
  436. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/tools/routes.d.ts +75 -0
  437. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/types.d.ts +68 -0
  438. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types.js +16 -0
  439. package/ts/dsh-runtime/vendor/dsh-map-tools/package.json +97 -0
  440. package/ts/package.json +293 -3
  441. package/ts/scripts/async-collect.ts +91 -0
  442. package/ts/scripts/map-tools-vendor-package-proof.ts +404 -0
  443. package/ts/scripts/skeleton-check.ts +1 -1
  444. package/ts/scripts/skeleton-integration-test.ts +23 -1
  445. package/ts/scripts/state-cli.ts +568 -0
  446. package/ts/scripts/turn-handoff-collect.ts +178 -0
  447. package/ts/src/artifact-gate.ts +991 -0
  448. package/ts/src/benchmark-agent-conformance.ts +619 -0
  449. package/ts/src/benchmark-environment-bridge.ts +538 -0
  450. package/ts/src/benchmark-headless-child-diagnostics.ts +184 -0
  451. package/ts/src/benchmark-tool-isolation.ts +166 -0
  452. package/ts/src/bookable-facts.ts +837 -0
  453. package/ts/src/booking-saga.ts +133 -0
  454. package/ts/src/booking-surface/availability-policy.ts +522 -0
  455. package/ts/src/booking-surface/booking-intent.ts +86 -0
  456. package/ts/src/booking-surface/cancel-refund-commission.ts +488 -0
  457. package/ts/src/booking-surface/canonical-schema.js +116 -0
  458. package/ts/src/booking-surface/contracts.ts +475 -0
  459. package/ts/src/booking-surface/dsh-planner.ts +1949 -0
  460. package/ts/src/booking-surface/dsh-plugin.js +378 -0
  461. package/ts/src/booking-surface/dsh-worker.ts +110 -0
  462. package/ts/src/booking-surface/error-codes.ts +241 -0
  463. package/ts/src/booking-surface/index.ts +9 -0
  464. package/ts/src/booking-surface/managed-dsh-cleanup-diagnostic.ts +151 -0
  465. package/ts/src/booking-surface/managed-dsh-run-port.ts +273 -0
  466. package/ts/src/booking-surface/profile.ts +42 -0
  467. package/ts/src/booking-surface/recovery-chain.ts +409 -0
  468. package/ts/src/booking-surface/runtime.ts +1793 -0
  469. package/ts/src/booking-surface/server.ts +733 -0
  470. package/ts/src/booking-surface/startup.ts +201 -0
  471. package/ts/src/booking-surface/validation.ts +217 -0
  472. package/ts/src/companions.ts +113 -0
  473. package/ts/src/contracts.ts +13 -3
  474. package/ts/src/dsh-llm.ts +44 -11
  475. package/ts/src/flyai-setup-tool.ts +77 -0
  476. package/ts/src/index.ts +1948 -198
  477. package/ts/src/itinerary-deck.ts +189 -0
  478. package/ts/src/itinerary-doc-shared.ts +741 -0
  479. package/ts/src/itinerary-html.ts +171 -0
  480. package/ts/src/loop.ts +223 -25
  481. package/ts/src/memory-capture.ts +283 -0
  482. package/ts/src/memory-decay.ts +55 -0
  483. package/ts/src/memory-utility.ts +70 -0
  484. package/ts/src/mock-llm.ts +4 -8
  485. package/ts/src/model.ts +88 -2
  486. package/ts/src/recall/card.ts +106 -0
  487. package/ts/src/recall/evaluator.ts +170 -0
  488. package/ts/src/recall/integration.ts +35 -0
  489. package/ts/src/recall/tick.ts +213 -0
  490. package/ts/src/session-link/plan-it-action.ts +78 -0
  491. package/ts/src/session-link/session-link.ts +275 -0
  492. package/ts/src/share/adapters.ts +93 -0
  493. package/ts/src/share/share-consent.ts +105 -0
  494. package/ts/src/share/share-deck.ts +85 -0
  495. package/ts/src/share/share-token.ts +166 -0
  496. package/ts/src/slot-spec.ts +172 -0
  497. package/ts/src/state-ledger.ts +912 -0
  498. package/ts/src/subagent-job-id-guard.ts +72 -0
  499. package/ts/src/time-anchor.ts +338 -0
  500. package/ts/src/tool-packet.ts +32 -0
  501. package/ts/src/travel-slots.ts +219 -0
  502. package/ts/src/travel-timeline.ts +83 -0
  503. package/ts/src/turn-deadline.ts +366 -0
  504. package/ts/src/turn-policy.ts +154 -0
  505. package/ts/src/unified.ts +354 -88
  506. package/ts/src/wish-pool.ts +79 -0
  507. package/dist/scripts/session-attach-wait.js +0 -41
@@ -1,19 +1,19 @@
1
- import { init } from 'z3-solver';
1
+ /**
2
+ * 可行性引擎 TS 版(与 py/gotry_feasibility/engine.py 对齐;Python 是对照实现/oracle)。
3
+ * DEPRECATED(D-1 清偿):统一模型(unified.ts)是唯一求解入口;保留为兼容层与差分 oracle。
4
+ *
5
+ * Z3 走 npm z3-solver(WASM):
6
+ * - API 为驼峰(addAndTrack/unsatCore/getLower),check/getLower 返回 Promise;
7
+ * - exactly-one 用 Sum(If(sel,1,0)) == 1 表达(JS 绑定的 PbEq 有上下文强转问题);
8
+ * - 有效时长约束整体放大 200 倍避免整除(与 Python 的 /200、/10 数学等价);
9
+ * - WASM init ~60-140ms 一次性,单次求解 ~6ms(进程内,无子进程桥)。
10
+ */
2
11
  import { evaluateChoice, minToHhmm, requiredUsableHours, trueCostToDict, LATEST_ARRIVE_STAY_MIN } from './model.js';
3
- let z3Promise = null;
4
- async function getZ3() {
5
- if (!z3Promise) {
6
- z3Promise = (async ()=>(await init()).Context('main'))();
7
- }
8
- return z3Promise;
9
- }
12
+ import { withZ3 } from './z3-shared.js';
13
+ import { t } from './i18n.js';
10
14
  const CONSTRAINT_LABEL_KEYS = [
11
- 'wake_floor',
12
- 'energy_floor',
13
- 'usable_hours',
14
- 'budget',
15
- 'duration',
16
- 'arrival_before_evening'
15
+ 'wake_floor', 'energy_floor', 'usable_hours', 'budget',
16
+ 'duration', 'arrival_before_evening',
17
17
  ];
18
18
  class Encoding {
19
19
  days;
@@ -27,41 +27,50 @@ class Encoding {
27
27
  assertions;
28
28
  moneyExpr;
29
29
  z3;
30
- constructor(z3, cand, req, days){
30
+ constructor(z3, cand, req, days) {
31
31
  this.z3 = z3;
32
32
  this.cand = cand;
33
33
  this.req = req;
34
34
  this.days = days ?? req.windowDays;
35
35
  const { Bool, Int, If, Sum, And } = this.z3;
36
36
  const mot = req.motivation;
37
- this.selO = cand.servicesOut.map((_, i)=>Bool.const(`o${i}`));
38
- this.selT = cand.destTransfers.map((_, j)=>Bool.const(`t${j}`));
39
- this.selR = cand.servicesRet.map((_, k)=>Bool.const(`r${k}`));
40
- this.selTr = cand.destTransfers.map((_, m)=>Bool.const(`tr${m}`));
37
+ this.selO = cand.servicesOut.map((_, i) => Bool.const(`o${i}`));
38
+ this.selT = cand.destTransfers.map((_, j) => Bool.const(`t${j}`));
39
+ this.selR = cand.servicesRet.map((_, k) => Bool.const(`r${k}`));
40
+ this.selTr = cand.destTransfers.map((_, m) => Bool.const(`tr${m}`));
41
41
  const access = req.homeHubAccess[cand.hub];
42
- const pick = (sels, values)=>Sum(...sels.map((s, i)=>If(s, Int.val(values[i]), Int.val(0))));
43
- const depOut = pick(this.selO, cand.servicesOut.map((s)=>s.depMin));
44
- const arrOut = pick(this.selO, cand.servicesOut.map((s)=>s.arrMin));
45
- const priceOut = pick(this.selO, cand.servicesOut.map((s)=>s.priceCny));
46
- const transferOut = pick(this.selT, cand.destTransfers.map((t)=>t.minutes));
47
- const transferOutPrice = pick(this.selT, cand.destTransfers.map((t)=>t.priceCny));
48
- const depRet = pick(this.selR, cand.servicesRet.map((s)=>s.depMin));
49
- const priceRet = pick(this.selR, cand.servicesRet.map((s)=>s.priceCny));
50
- const transferRet = pick(this.selTr, cand.destTransfers.map((t)=>t.minutes));
51
- const transferRetPrice = pick(this.selTr, cand.destTransfers.map((t)=>t.priceCny));
42
+ const pick = (sels, values) => Sum(...sels.map((s, i) => If(s, Int.val(values[i]), Int.val(0))));
43
+ const depOut = pick(this.selO, cand.servicesOut.map(s => s.depMin));
44
+ const arrOut = pick(this.selO, cand.servicesOut.map(s => s.arrMin));
45
+ const priceOut = pick(this.selO, cand.servicesOut.map(s => s.priceCny));
46
+ const transferOut = pick(this.selT, cand.destTransfers.map(t => t.minutes));
47
+ const transferOutPrice = pick(this.selT, cand.destTransfers.map(t => t.priceCny));
48
+ const depRet = pick(this.selR, cand.servicesRet.map(s => s.depMin));
49
+ const priceRet = pick(this.selR, cand.servicesRet.map(s => s.priceCny));
50
+ const transferRet = pick(this.selTr, cand.destTransfers.map(t => t.minutes));
51
+ const transferRetPrice = pick(this.selTr, cand.destTransfers.map(t => t.priceCny));
52
52
  const wake = depOut.sub(Int.val(cand.bufferOutMin + access.toHubMin));
53
53
  const arriveStay = arrOut.add(transferOut);
54
54
  const d2dOut = arriveStay.sub(wake);
55
55
  const wakePen = If(wake.lt(Int.val(300)), Int.val(30), If(wake.lt(Int.val(360)), Int.val(25), If(wake.lt(Int.val(390)), Int.val(15), Int.val(0))));
56
- const energy = Int.val(100).sub(wakePen).sub(Int.val(2 * 8)).sub(If(arriveStay.gt(Int.val(21 * 60)), Int.val(10), Int.val(0))).sub(If(d2dOut.gt(Int.val(6 * 60)), Int.val(10), Int.val(0)));
56
+ const energy = Int.val(100)
57
+ .sub(wakePen)
58
+ .sub(Int.val(2 * 8))
59
+ .sub(If(arriveStay.gt(Int.val(21 * 60)), Int.val(10), Int.val(0)))
60
+ .sub(If(d2dOut.gt(Int.val(6 * 60)), Int.val(10), Int.val(0)));
61
+ // 有效时长整体放大 200 倍(免整除,与 Python /200、/10 等价):
62
+ // 200*usable = day1Raw*(100+energy) + 180*day2Raw + 86400*midDays
57
63
  const dayEnd = Int.val(LATEST_ARRIVE_STAY_MIN + 3 * 60);
58
64
  const day1Raw = If(arriveStay.lt(dayEnd), dayEnd.sub(arriveStay), Int.val(0));
59
65
  const leaveStayRet = depRet.sub(Int.val(cand.bufferRetMin)).sub(transferRet);
60
66
  const day2Raw = If(leaveStayRet.gt(Int.val(9 * 60)), leaveStayRet.sub(Int.val(9 * 60)), Int.val(0));
61
67
  const midDays = Math.max(0, this.days - 2);
62
- const usable200 = day1Raw.mul(energy.add(Int.val(100))).add(day2Raw.mul(Int.val(180))).add(Int.val(midDays * 86400));
63
- const money = priceOut.add(priceRet).add(transferOutPrice).add(transferRetPrice).add(Int.val(cand.stayCnyPerNight * (this.days - 1) + cand.localDailyCny * this.days));
64
- const exactlyOne = (sels)=>Sum(...sels.map((s)=>If(s, Int.val(1), Int.val(0)))).eq(Int.val(1));
68
+ const usable200 = day1Raw.mul(energy.add(Int.val(100)))
69
+ .add(day2Raw.mul(Int.val(180)))
70
+ .add(Int.val(midDays * 86400));
71
+ const money = priceOut.add(priceRet).add(transferOutPrice).add(transferRetPrice)
72
+ .add(Int.val(cand.stayCnyPerNight * (this.days - 1) + cand.localDailyCny * this.days));
73
+ const exactlyOne = (sels) => Sum(...sels.map(s => If(s, Int.val(1), Int.val(0)))).eq(Int.val(1));
65
74
  const requiredMin = Math.round(requiredUsableHours(mot) * 60);
66
75
  this.assertions = {
67
76
  wake_floor: wake.ge(Int.val(mot.wakeFloorMin)),
@@ -69,24 +78,32 @@ class Encoding {
69
78
  usable_hours: usable200.ge(Int.val(requiredMin * 200)),
70
79
  budget: money.le(Int.val(req.budgetCny)),
71
80
  duration: Bool.val(this.days >= cand.minDaysForPurpose),
72
- arrival_before_evening: arriveStay.le(Int.val(LATEST_ARRIVE_STAY_MIN))
81
+ arrival_before_evening: arriveStay.le(Int.val(LATEST_ARRIVE_STAY_MIN)),
73
82
  };
74
83
  this.structure = And(exactlyOne(this.selO), exactlyOne(this.selT), exactlyOne(this.selR), exactlyOne(this.selTr));
75
84
  this.moneyExpr = money;
76
85
  }
77
86
  async solverWith(skip = new Set()) {
78
87
  const s = new this.z3.Solver();
79
- s.add(this.structure);
80
- for (const name of CONSTRAINT_LABEL_KEYS){
81
- if (!skip.has(name)) s.addAndTrack(this.assertions[name], name);
88
+ try {
89
+ s.add(this.structure);
90
+ for (const name of CONSTRAINT_LABEL_KEYS) {
91
+ if (!skip.has(name))
92
+ s.addAndTrack(this.assertions[name], name);
93
+ }
94
+ return s;
95
+ }
96
+ catch (error) {
97
+ releaseZ3(s);
98
+ throw error;
82
99
  }
83
- return s;
84
100
  }
85
101
  async extract(model) {
86
- const chosen = async (sels, items)=>{
87
- for(let i = 0; i < sels.length; i++){
102
+ const chosen = async (sels, items) => {
103
+ for (let i = 0; i < sels.length; i++) {
88
104
  const v = await maybeAwait(model.eval(sels[i], true));
89
- if (String(v) === 'true' || String(String(v)) === 'true') return items[i];
105
+ if (String(v) === 'true' || String(String(v)) === 'true')
106
+ return items[i];
90
107
  }
91
108
  throw new Error('no selection in model');
92
109
  };
@@ -95,10 +112,14 @@ class Encoding {
95
112
  outTransfer: await chosen(this.selT, this.cand.destTransfers),
96
113
  retService: await chosen(this.selR, this.cand.servicesRet),
97
114
  retTransfer: await chosen(this.selTr, this.cand.destTransfers),
98
- days: this.days
115
+ days: this.days,
99
116
  };
100
117
  }
101
118
  }
119
+ function releaseZ3(resource) {
120
+ if (typeof resource?.release === 'function')
121
+ resource.release();
122
+ }
102
123
  async function maybeAwait(v) {
103
124
  return v instanceof Promise ? await v : v;
104
125
  }
@@ -108,146 +129,202 @@ async function isUnsat(s) {
108
129
  async function unsatCoreOf(s) {
109
130
  const v = s.unsatCore();
110
131
  const out = [];
111
- for(let i = 0; i < v.length(); i++)out.push(String(v.get(i)));
132
+ for (let i = 0; i < v.length(); i++)
133
+ out.push(String(v.get(i)));
112
134
  return out;
113
135
  }
114
- async function cheapestPlan(enc, skip) {
115
- const z3 = await getZ3();
136
+ async function cheapestPlan(enc, skip, z3) {
137
+ /** 放宽 skip 约束下的最省钱方案:getLower 取最优值,等值回代提模(与 Python _cheapest_plan 同)。 */
116
138
  const opt = new z3.Optimize();
117
- opt.add(enc.structure);
118
- for (const name of CONSTRAINT_LABEL_KEYS){
119
- if (!skip.has(name)) opt.add(enc.assertions[name]);
120
- }
121
- const obj = opt.minimize(enc.moneyExpr);
122
- if (await isUnsat(opt)) return null;
123
- const best = Number(String(await maybeAwait(opt.getLower(obj))));
124
- const s = await enc.solverWith(skip);
125
- s.add(enc.moneyExpr.eq(z3.Int.val(best)));
126
- if (await isUnsat(s)) return null;
127
- const choice = await enc.extract(s.model());
128
- return {
129
- choice,
130
- cost: evaluateChoice(enc.cand, enc.req, choice)
139
+ let optOpen = true;
140
+ const closeOpt = () => {
141
+ if (optOpen) {
142
+ releaseZ3(opt);
143
+ optOpen = false;
144
+ }
131
145
  };
146
+ try {
147
+ opt.add(enc.structure);
148
+ for (const name of CONSTRAINT_LABEL_KEYS) {
149
+ if (!skip.has(name))
150
+ opt.add(enc.assertions[name]);
151
+ }
152
+ const obj = opt.minimize(enc.moneyExpr);
153
+ if (await isUnsat(opt))
154
+ return null;
155
+ const best = Number(String(await maybeAwait(opt.getLower(obj))));
156
+ closeOpt();
157
+ const s = await enc.solverWith(skip);
158
+ try {
159
+ s.add(enc.moneyExpr.eq(z3.Int.val(best)));
160
+ if (await isUnsat(s))
161
+ return null;
162
+ const model = s.model();
163
+ try {
164
+ const choice = await enc.extract(model);
165
+ return { choice, cost: evaluateChoice(enc.cand, enc.req, choice) };
166
+ }
167
+ finally {
168
+ releaseZ3(model);
169
+ }
170
+ }
171
+ finally {
172
+ releaseZ3(s);
173
+ }
174
+ }
175
+ finally {
176
+ closeOpt();
177
+ }
132
178
  }
133
179
  function suggestText(relax, cand, req, choice, cost) {
134
180
  const mot = req.motivation;
135
181
  const parts = [];
136
- if (relax.includes('duration')) parts.push(`把行程延长到 ${choice.days} 天(${cand.name} 值得这个窗口)`);
137
- if (relax.includes('budget')) parts.push(`预算提高到 ¥${cost.moneyCny}(原 ¥${req.budgetCny})`);
138
- if (relax.includes('wake_floor')) parts.push(`接受 ${minToHhmm(cost.wakeMin)} 起床——破坏生物钟,与你的休整动机冲突,不推荐`);
139
- if (relax.includes('energy_floor')) parts.push(`接受到达精力 ${cost.energyArrivalPct}%(低于你要求的 ${mot.minArrivalEnergyPct}%)`);
140
- if (relax.includes('usable_hours')) parts.push(`接受有效休整 ${cost.usableHours.toFixed(1)}h(低于动机所需的 ${requiredUsableHours(mot).toFixed(1)}h)`);
141
- if (relax.includes('arrival_before_evening')) parts.push(`接受 ${minToHhmm(cost.arriveStayMin)} 才到住处`);
142
- const plan = `可行方案:${choice.outService.id} ${minToHhmm(choice.outService.depMin)} 出发、` + `${choice.outTransfer.mode} 接驳,¥${cost.moneyCny},${minToHhmm(cost.wakeMin)} 起床,` + `${minToHhmm(cost.arriveStayMin)} 到住处,到达精力 ${cost.energyArrivalPct}%`;
182
+ if (relax.includes('duration'))
183
+ parts.push(t('sg.duration', { days: choice.days, name: cand.name }));
184
+ if (relax.includes('budget'))
185
+ parts.push(t('sg.budget', { cost: cost.moneyCny, budget: req.budgetCny }));
186
+ if (relax.includes('wake_floor'))
187
+ parts.push(t('sg.wake_floor', { wake: minToHhmm(cost.wakeMin) }));
188
+ if (relax.includes('energy_floor'))
189
+ parts.push(t('sg.energy_floor', { pct: cost.energyArrivalPct, min: mot.minArrivalEnergyPct }));
190
+ if (relax.includes('usable_hours'))
191
+ parts.push(t('sg.usable_hours', { hours: cost.usableHours.toFixed(1), need: requiredUsableHours(mot).toFixed(1) }));
192
+ if (relax.includes('arrival_before_evening'))
193
+ parts.push(t('sg.arrival', { time: minToHhmm(cost.arriveStayMin) }));
194
+ const plan = t('sg.plan', {
195
+ id: choice.outService.id, dep: minToHhmm(choice.outService.depMin), mode: choice.outTransfer.mode,
196
+ money: cost.moneyCny, wake: minToHhmm(cost.wakeMin), arrive: minToHhmm(cost.arriveStayMin),
197
+ percent: cost.energyArrivalPct,
198
+ });
143
199
  return parts.join(' + ') + `;${plan}`;
144
200
  }
145
201
  export async function solveCandidate(cand, req) {
146
- const z3 = await getZ3();
147
- const enc = new Encoding(z3, cand, req);
148
- const verdict = {
149
- candidateId: cand.id,
150
- name: cand.name,
151
- feasible: false,
152
- imageryMatch: cand.imageryMatch,
153
- unsatCore: [],
154
- suggestions: []
155
- };
156
- const s = await enc.solverWith();
157
- if (!await isUnsat(s)) {
158
- verdict.feasible = true;
159
- verdict.choice = await enc.extract(s.model());
160
- verdict.trueCost = evaluateChoice(cand, req, verdict.choice);
161
- return verdict;
162
- }
163
- const core = (await unsatCoreOf(s)).sort();
164
- verdict.unsatCore = core;
165
- for (const name of core){
166
- const skip = new Set([
167
- name
168
- ]);
169
- const enc2 = name === 'duration' ? new Encoding(z3, cand, req, cand.minDaysForPurpose) : enc;
170
- const s2 = await enc2.solverWith(skip);
171
- if (!await isUnsat(s2)) {
172
- const choice = await enc2.extract(s2.model());
173
- const cost = evaluateChoice(cand, req, choice);
174
- verdict.suggestions.push({
175
- relax: [
176
- name
177
- ],
178
- text: suggestText([
179
- name
180
- ], cand, req, choice, cost),
181
- resulting: {
182
- days: choice.days,
183
- ...trueCostToDict(cost)
202
+ // 会话级互斥门:整个判定(编码 + 多轮求解)独占共享实例;门内绝不嵌套 withZ3。
203
+ return withZ3('engine.solveCandidate', async (z3) => {
204
+ const enc = new Encoding(z3, cand, req);
205
+ const verdict = {
206
+ candidateId: cand.id, name: cand.name, feasible: false,
207
+ imageryMatch: cand.imageryMatch, unsatCore: [], suggestions: [],
208
+ };
209
+ const s = await enc.solverWith();
210
+ let sOpen = true;
211
+ const closeS = () => {
212
+ if (sOpen) {
213
+ releaseZ3(s);
214
+ sOpen = false;
215
+ }
216
+ };
217
+ try {
218
+ if (!(await isUnsat(s))) {
219
+ verdict.feasible = true;
220
+ const model = s.model();
221
+ try {
222
+ verdict.choice = await enc.extract(model);
223
+ }
224
+ finally {
225
+ releaseZ3(model);
226
+ }
227
+ verdict.trueCost = evaluateChoice(cand, req, verdict.choice);
228
+ return verdict;
229
+ }
230
+ const core = (await unsatCoreOf(s)).sort();
231
+ verdict.unsatCore = core;
232
+ closeS();
233
+ // 单条放宽(days 仍是数据:放宽 duration 时换长窗口口径重新编码)
234
+ for (const name of core) {
235
+ const skip = new Set([name]);
236
+ const enc2 = name === 'duration' ? new Encoding(z3, cand, req, cand.minDaysForPurpose) : enc;
237
+ const s2 = await enc2.solverWith(skip);
238
+ try {
239
+ if (!(await isUnsat(s2))) {
240
+ const model = s2.model();
241
+ try {
242
+ const choice = await enc2.extract(model);
243
+ const cost = evaluateChoice(cand, req, choice);
244
+ verdict.suggestions.push({ relax: [name], text: suggestText([name], cand, req, choice, cost), resulting: { days: choice.days, ...trueCostToDict(cost) } });
245
+ }
246
+ finally {
247
+ releaseZ3(model);
248
+ }
249
+ }
250
+ }
251
+ finally {
252
+ releaseZ3(s2);
184
253
  }
185
- });
186
- }
187
- }
188
- if (core.includes('duration')) {
189
- const longEnc = new Encoding(z3, cand, req, cand.minDaysForPurpose);
190
- const s2 = await longEnc.solverWith(new Set([
191
- 'duration'
192
- ]));
193
- if (await isUnsat(s2)) {
194
- const core2 = await unsatCoreOf(s2);
195
- let joint = [
196
- 'duration',
197
- ...core2.filter((n)=>n !== 'duration')
198
- ];
199
- for (const name of joint.filter((n)=>n !== 'duration')){
200
- const trial = new Set(joint.filter((n)=>n !== name));
201
- if (!await isUnsat(await longEnc.solverWith(trial))) joint = [
202
- ...trial
203
- ];
204
254
  }
205
- const plan = await cheapestPlan(longEnc, new Set(joint));
206
- if (plan) {
207
- verdict.suggestions.push({
208
- relax: joint,
209
- text: suggestText(joint, cand, req, plan.choice, plan.cost),
210
- resulting: {
211
- days: plan.choice.days,
212
- ...trueCostToDict(plan.cost)
255
+ // 组合 core:放宽 duration 换长口径 → 取新口径 core 叠加 → 收缩
256
+ if (core.includes('duration')) {
257
+ const longEnc = new Encoding(z3, cand, req, cand.minDaysForPurpose);
258
+ const s2 = await longEnc.solverWith(new Set(['duration']));
259
+ try {
260
+ if (await isUnsat(s2)) {
261
+ const core2 = await unsatCoreOf(s2);
262
+ let joint = ['duration', ...core2.filter(n => n !== 'duration')];
263
+ for (const name of joint.filter(n => n !== 'duration')) {
264
+ const trial = new Set(joint.filter(n => n !== name));
265
+ const trialSolver = await longEnc.solverWith(trial);
266
+ try {
267
+ if (!(await isUnsat(trialSolver)))
268
+ joint = [...trial];
269
+ }
270
+ finally {
271
+ releaseZ3(trialSolver);
272
+ }
273
+ }
274
+ const plan = await cheapestPlan(longEnc, new Set(joint), z3);
275
+ if (plan) {
276
+ verdict.suggestions.push({
277
+ relax: joint,
278
+ text: suggestText(joint, cand, req, plan.choice, plan.cost),
279
+ resulting: { days: plan.choice.days, ...trueCostToDict(plan.cost) },
280
+ });
281
+ }
213
282
  }
214
- });
283
+ }
284
+ finally {
285
+ releaseZ3(s2);
286
+ }
287
+ }
288
+ // 憧憬不被拒绝:放宽时长能救活 → wish pool + 成行条件(最省钱口径)
289
+ if (verdict.suggestions.some(sg => sg.relax.includes('duration'))) {
290
+ const longEnc = new Encoding(z3, cand, req, cand.minDaysForPurpose);
291
+ const plan = await cheapestPlan(longEnc, new Set(['duration', 'budget']), z3);
292
+ const conditions = { days: cand.minDaysForPurpose };
293
+ if (plan)
294
+ conditions['budget_cny'] = plan.cost.moneyCny;
295
+ if (cand.bestMonths.length)
296
+ conditions['best_months'] = cand.bestMonths;
297
+ verdict.wishPool = {
298
+ name: cand.name,
299
+ conditions,
300
+ reason: t('sg.wish_reason_engine', { weights: JSON.stringify(req.motivation.weights), days: req.windowDays }),
301
+ };
215
302
  }
303
+ return verdict;
216
304
  }
217
- }
218
- if (verdict.suggestions.some((sg)=>sg.relax.includes('duration'))) {
219
- const longEnc = new Encoding(z3, cand, req, cand.minDaysForPurpose);
220
- const plan = await cheapestPlan(longEnc, new Set([
221
- 'duration',
222
- 'budget'
223
- ]));
224
- const conditions = {
225
- days: cand.minDaysForPurpose
226
- };
227
- if (plan) conditions['budget_cny'] = plan.cost.moneyCny;
228
- if (cand.bestMonths.length) conditions['best_months'] = cand.bestMonths;
229
- verdict.wishPool = {
230
- name: cand.name,
231
- conditions,
232
- reason: `动机谱系 ${JSON.stringify(req.motivation.weights)} 下,${req.windowDays} 天窗口装不下这个目的地`
233
- };
234
- }
235
- return verdict;
305
+ finally {
306
+ closeS();
307
+ }
308
+ });
236
309
  }
237
310
  export async function solve(req, candidates) {
238
- const verdicts = await Promise.all(candidates.map((c)=>solveCandidate(c, req)));
239
- const feasible = verdicts.filter((v)=>v.feasible).sort((a, b)=>b.imageryMatch - a.imageryMatch);
311
+ // 顺序求解:候选间共享单一 WASM 实例,不并发交错(此前 Promise.all 是
312
+ // 「memory access out of bounds」偶发的根因;求解 ~6ms/次,串行可忽略)。
313
+ const verdicts = [];
314
+ for (const c of candidates)
315
+ verdicts.push(await solveCandidate(c, req));
316
+ const feasible = verdicts.filter(v => v.feasible).sort((a, b) => b.imageryMatch - a.imageryMatch);
240
317
  const recommended = feasible[0]?.candidateId ?? null;
241
318
  return {
242
319
  request: {
243
320
  note: req.note,
244
321
  window_days: req.windowDays,
245
322
  budget_cny: req.budgetCny,
246
- required_usable_hours: Math.round(requiredUsableHours(req.motivation) * 10) / 10
323
+ required_usable_hours: Math.round(requiredUsableHours(req.motivation) * 10) / 10,
247
324
  },
248
325
  verdicts: verdicts.map(verdictToDict),
249
326
  recommended,
250
- answer_md: renderMarkdown(req, verdicts, recommended)
327
+ answer_md: renderMarkdown(req, verdicts, recommended),
251
328
  };
252
329
  }
253
330
  function verdictToDict(v) {
@@ -257,11 +334,7 @@ function verdictToDict(v) {
257
334
  feasible: v.feasible,
258
335
  imagery_match: v.imageryMatch,
259
336
  unsat_core: v.unsatCore,
260
- suggestions: v.suggestions.map((s)=>({
261
- relax: s.relax,
262
- text: s.text,
263
- resulting: s.resulting
264
- }))
337
+ suggestions: v.suggestions.map(s => ({ relax: s.relax, text: s.text, resulting: s.resulting })),
265
338
  };
266
339
  if (v.choice) {
267
340
  d['chosen'] = {
@@ -269,63 +342,73 @@ function verdictToDict(v) {
269
342
  out_transfer: v.choice.outTransfer.mode,
270
343
  ret_service: v.choice.retService.id,
271
344
  ret_transfer: v.choice.retTransfer.mode,
272
- days: v.choice.days
345
+ days: v.choice.days,
273
346
  };
274
347
  }
275
- if (v.trueCost) d['true_cost'] = trueCostToDict(v.trueCost);
276
- if (v.wishPool) d['wish_pool'] = {
277
- name: v.wishPool.name,
278
- conditions: v.wishPool.conditions,
279
- reason: v.wishPool.reason
280
- };
348
+ if (v.trueCost)
349
+ d['true_cost'] = trueCostToDict(v.trueCost);
350
+ if (v.wishPool)
351
+ d['wish_pool'] = { name: v.wishPool.name, conditions: v.wishPool.conditions, reason: v.wishPool.reason };
281
352
  return d;
282
353
  }
283
354
  function renderMarkdown(req, verdicts, recommended) {
284
- const feasible = verdicts.filter((v)=>v.feasible).sort((a, b)=>b.imageryMatch - a.imageryMatch);
285
- const parked = verdicts.filter((v)=>!v.feasible);
355
+ const feasible = verdicts.filter(v => v.feasible).sort((a, b) => b.imageryMatch - a.imageryMatch);
356
+ const parked = verdicts.filter(v => !v.feasible);
286
357
  const lines = [];
287
- lines.push(`> 憧憬:${req.note}`);
288
- lines.push(`> 已识别约束:窗口 ${req.windowDays} 天 | 预算 ¥${req.budgetCny} | ` + `动机(休整改写需求 ${requiredUsableHours(req.motivation).toFixed(1)}h 有效休整)`);
358
+ lines.push(t('md.header', { note: req.note }));
359
+ lines.push(t('md.constraints', {
360
+ days: req.windowDays, budget: req.budgetCny,
361
+ hours: requiredUsableHours(req.motivation).toFixed(1),
362
+ }));
289
363
  lines.push('');
290
- for (const v of parked){
291
- lines.push(`**${v.name}:现在不行**——冲突约束:${v.unsatCore.join('、')}。`);
292
- for (const sg of v.suggestions.slice(0, 1))lines.push(`- ${sg.text}`);
364
+ for (const v of parked) {
365
+ lines.push(t('md.infeasible', { name: v.name, core: v.unsatCore.join('、') }));
366
+ for (const sg of v.suggestions.slice(0, 1))
367
+ lines.push(`- ${sg.text}`);
293
368
  if (v.wishPool) {
294
369
  const conds = v.wishPool.conditions;
295
- const budgetNote = conds['budget_cny'] ? `、约 ¥${conds['budget_cny']}` : '';
370
+ const budgetNote = conds['budget_cny'] ? t('md.wish_budget', { cny: String(conds['budget_cny']) }) : '';
296
371
  const months = conds['best_months'];
297
- const season = months ? `,${months} 月最佳` : '';
298
- lines.push(`- 已放入「下一次出发」清单:需要 ${conds['days']} 天${budgetNote}${season}`);
372
+ const season = months ? t('md.wish_season', { months: months.join(',') }) : '';
373
+ lines.push(t('md.wish_pool', { days: String(conds['days']), budgetNote, season }));
299
374
  }
300
375
  }
301
376
  lines.push('');
302
- for (const v of feasible){
303
- const c = v.choice, t = v.trueCost;
304
- lines.push(`**${v.name}:可行**` + `(${c.outService.id} ${minToHhmm(c.outService.depMin)} 出发,` + `${c.outTransfer.mode} 接驳,${minToHhmm(t.arriveStayMin)} 到住处,` + `起床 ${minToHhmm(t.wakeMin)},到达精力 ${t.energyArrivalPct}%,` + `门到门 ${Math.floor(t.doorToDoorOutMin / 60)}h${String(t.doorToDoorOutMin % 60).padStart(2, '0')}m,` + `有效休整 ${t.usableHours.toFixed(1)}h,共 ¥${t.moneyCny})`);
377
+ for (const v of feasible) {
378
+ const c = v.choice, cost = v.trueCost;
379
+ lines.push(t('md.feasible_engine', {
380
+ name: v.name, id: c.outService.id, dep: minToHhmm(c.outService.depMin), mode: c.outTransfer.mode,
381
+ arrive: minToHhmm(cost.arriveStayMin), wake: minToHhmm(cost.wakeMin), energy: cost.energyArrivalPct,
382
+ d2d: `${Math.floor(cost.doorToDoorOutMin / 60)}h${String(cost.doorToDoorOutMin % 60).padStart(2, '0')}m`,
383
+ hours: cost.usableHours.toFixed(1), money: cost.moneyCny,
384
+ }));
305
385
  }
306
386
  if (feasible.length) {
307
387
  lines.push('');
308
388
  const best = feasible[0];
309
389
  const alt = feasible[1];
310
- lines.push(`**建议:${best.name}**(意象匹配 ${(best.imageryMatch * 100).toFixed(0)}%)。` + (alt ? `备选:${alt.name}(¥${alt.trueCost.moneyCny},匹配 ${(alt.imageryMatch * 100).toFixed(0)}%)。` : ''));
390
+ lines.push(t('md.recommend', { best: best.name, match: (best.imageryMatch * 100).toFixed(0) })
391
+ + (alt ? t('md.alt', { name: alt.name, money: alt.trueCost.moneyCny, match: (alt.imageryMatch * 100).toFixed(0) }) : ''));
311
392
  }
312
393
  lines.push('');
313
- lines.push('**待你决定的两个问题**:');
394
+ lines.push(t('md.decide_two'));
314
395
  if (feasible.length >= 2) {
315
- lines.push(`1. ${feasible[0].name} 还是 ${feasible[1].name}?(前者更贴意象,后者更省)`);
316
- } else if (feasible.length === 1) {
317
- lines.push(`1. 就去 ${feasible[0].name} 吗?`);
318
- } else {
319
- lines.push('1. 所有候选都不可行——考虑放宽哪条约束?');
396
+ lines.push(t('md.q_choice', { a: feasible[0].name, b: feasible[1].name }));
397
+ }
398
+ else if (feasible.length === 1) {
399
+ lines.push(t('md.q_single', { name: feasible[0].name }));
400
+ }
401
+ else {
402
+ lines.push(t('md.q_none'));
320
403
  }
321
404
  const p0 = parked[0];
322
405
  if (p0?.wishPool) {
323
- lines.push(`2. 把 ${p0.name} 留给「下一次出发」(${p0.wishPool.conditions['days']} 天起),这次先去可行的?`);
324
- } else if (feasible.length) {
325
- lines.push(`2. 出发班次选 ${feasible[0].choice.outService.id}(${minToHhmm(feasible[0].choice.outService.depMin)})还是更晚的?`);
406
+ lines.push(t('md.q_wish', { name: p0.name, days: String(p0.wishPool.conditions['days']) }));
407
+ }
408
+ else if (feasible.length) {
409
+ lines.push(t('md.q_depart', {
410
+ id: feasible[0].choice.outService.id, dep: minToHhmm(feasible[0].choice.outService.depMin),
411
+ }));
326
412
  }
327
413
  return lines.join('\n');
328
414
  }
329
-
330
-
331
- //# sourceURL=/Users/bytedance/work/gotry/ts/src/engine.ts