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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (533) hide show
  1. package/README.md +172 -219
  2. package/README.zh-CN.md +222 -0
  3. package/bin/gotry-backend.js +53 -0
  4. package/bin/gotry-booking-copilot.js +53 -0
  5. package/bin/gotry-bootstrap.js +1788 -0
  6. package/bin/gotry-inner.js +733 -83
  7. package/bin/gotry-process-liveness.d.ts +27 -0
  8. package/bin/gotry-process-liveness.js +97 -0
  9. package/bin/gotry-runtime-resolution.d.ts +27 -0
  10. package/bin/gotry-runtime-resolution.js +49 -0
  11. package/bin/gotry.js +1 -1
  12. package/client/client.js +203 -0
  13. package/cordis.gotry-patch.yml +80 -56
  14. package/data/airline-airports.json +39 -0
  15. package/data/stations-12306-verify.json +524 -0
  16. package/dist/capabilities/agent-reach-deep.js +45 -122
  17. package/dist/capabilities/agent-reach.js +101 -146
  18. package/dist/capabilities/anything.js +161 -94
  19. package/dist/capabilities/artifacts.js +370 -0
  20. package/dist/capabilities/channel-health.js +131 -0
  21. package/dist/capabilities/channel-registry.js +256 -0
  22. package/dist/capabilities/doctor.js +553 -0
  23. package/dist/capabilities/effect.js +394 -0
  24. package/dist/capabilities/external-event.js +149 -0
  25. package/dist/capabilities/fact-log.js +55 -0
  26. package/dist/capabilities/flyai-config.js +337 -0
  27. package/dist/capabilities/flyai.js +947 -110
  28. package/dist/capabilities/fx-contract.js +293 -0
  29. package/dist/capabilities/geo-atlas.js +246 -0
  30. package/dist/capabilities/ground-transfer.js +676 -0
  31. package/dist/capabilities/hbcli.js +260 -123
  32. package/dist/capabilities/hotelbyte-transaction.js +194 -0
  33. package/dist/capabilities/incident-log.js +131 -61
  34. package/dist/capabilities/itinerary-artifact.js +190 -0
  35. package/dist/capabilities/itinerary-deck-artifact.js +194 -0
  36. package/dist/capabilities/itinerary-deck-export.js +339 -0
  37. package/dist/capabilities/lavish-local.js +924 -0
  38. package/dist/capabilities/model-override.js +38 -0
  39. package/dist/capabilities/opensky.js +54 -43
  40. package/dist/capabilities/provider-detail-sanitize.js +64 -0
  41. package/dist/capabilities/resilience.js +191 -0
  42. package/dist/capabilities/route-provider-conformance.js +341 -0
  43. package/dist/capabilities/session/action-cache.js +50 -44
  44. package/dist/capabilities/session/adapters/ctrip-flight.js +120 -62
  45. package/dist/capabilities/session/adapters/ctrip-hotel.js +222 -0
  46. package/dist/capabilities/session/adapters/dida-portal.js +274 -0
  47. package/dist/capabilities/session/adapters/meituan-local.js +35 -54
  48. package/dist/capabilities/session/adapters/rail-12306.js +342 -0
  49. package/dist/capabilities/session/benchmark.js +189 -0
  50. package/dist/capabilities/session/bridge-ledger.js +224 -0
  51. package/dist/capabilities/session/extension-bridge.js +636 -0
  52. package/dist/capabilities/session/extension-channel.js +109 -0
  53. package/dist/capabilities/session/extension-distribution.js +230 -0
  54. package/dist/capabilities/session/extract.js +31 -21
  55. package/dist/capabilities/session/golden-score.js +114 -0
  56. package/dist/capabilities/session/health-watch.js +215 -0
  57. package/dist/capabilities/session/read-guard.js +75 -24
  58. package/dist/capabilities/session/static-flight-golden.js +150 -0
  59. package/dist/capabilities/session/transport.js +97 -83
  60. package/dist/capabilities/session/wizard.js +117 -0
  61. package/dist/capabilities/session-consent.js +178 -0
  62. package/dist/capabilities/session-login.js +170 -0
  63. package/dist/capabilities/session-search.js +635 -44
  64. package/dist/capabilities/spawn-bounded.js +203 -0
  65. package/dist/capabilities/sponsor-plugin.js +341 -0
  66. package/dist/capabilities/visa-policy.js +140 -0
  67. package/dist/capabilities/weather.js +243 -138
  68. package/dist/data/session-golden-20.json +25 -0
  69. package/dist/data/sf-golden-manifest.json +103 -0
  70. package/dist/data/sf-static-routes.json +91 -0
  71. package/dist/scripts/action-cache-tests.js +24 -59
  72. package/dist/scripts/agent-planning-turn-deadline-e2e.js +242 -0
  73. package/dist/scripts/agent-planning-turn-deadline-tests.js +185 -0
  74. package/dist/scripts/agent-reach-deep-tests.js +30 -40
  75. package/dist/scripts/agent-reach-error-tests.js +354 -0
  76. package/dist/scripts/agent-reach-tests.js +26 -18
  77. package/dist/scripts/agent-reach-wrapper-tests.js +50 -50
  78. package/dist/scripts/anything-path-measure-tests.js +133 -0
  79. package/dist/scripts/anything-path-measure.js +150 -0
  80. package/dist/scripts/anything-tests.js +250 -60
  81. package/dist/scripts/artifact-client-contract-tests.js +220 -0
  82. package/dist/scripts/artifacts-capability-tests.js +727 -0
  83. package/dist/scripts/async-collect.js +50 -11
  84. package/dist/scripts/benchmark-environment-bridge-e2e.js +741 -0
  85. package/dist/scripts/benchmark-environment-bridge-tests.js +1452 -0
  86. package/dist/scripts/booking-copilot-availability-ledger-binding-tests.js +126 -0
  87. package/dist/scripts/booking-copilot-availability-policy-tests.js +265 -0
  88. package/dist/scripts/booking-copilot-bin-proof-tests.js +66 -0
  89. package/dist/scripts/booking-copilot-cleanup-proof-helper.js +76 -0
  90. package/dist/scripts/booking-copilot-crossrepo-fixture-server.js +144 -0
  91. package/dist/scripts/booking-copilot-dsh-core-proof-tests.js +424 -0
  92. package/dist/scripts/booking-copilot-dsh-planner-proof-tests.js +2839 -0
  93. package/dist/scripts/booking-copilot-dsh-plugin-proof-tests.js +309 -0
  94. package/dist/scripts/booking-copilot-dsh-readiness-proof.js +238 -0
  95. package/dist/scripts/booking-copilot-dsh-warmer-proof.js +126 -0
  96. package/dist/scripts/booking-copilot-event-sequence-concurrency-proof-tests.js +156 -0
  97. package/dist/scripts/booking-copilot-gap-code-contract-proof-tests.js +70 -0
  98. package/dist/scripts/booking-copilot-intent-proof-tests.js +422 -0
  99. package/dist/scripts/booking-copilot-operation-ledger-concurrency-proof-tests.js +184 -0
  100. package/dist/scripts/booking-copilot-planner-live-probe.js +95 -0
  101. package/dist/scripts/booking-copilot-proof-runtime.js +42 -0
  102. package/dist/scripts/booking-copilot-receipt-ledger-concurrency-proof-tests.js +210 -0
  103. package/dist/scripts/booking-copilot-runtime-proof-tests.js +2349 -0
  104. package/dist/scripts/booking-copilot-server-proof-tests.js +784 -0
  105. package/dist/scripts/booking-copilot-startup-proof-tests.js +94 -0
  106. package/dist/scripts/booking-executor-tests.js +80 -0
  107. package/dist/scripts/booking-recovery-chain-tests.js +182 -0
  108. package/dist/scripts/booking-saga-tests.js +125 -0
  109. package/dist/scripts/booking-surface-contract-proof-tests.js +212 -0
  110. package/dist/scripts/bootstrap-tests.js +1549 -0
  111. package/dist/scripts/bridge-events-tests.js +239 -0
  112. package/dist/scripts/bridge-ledger-tests.js +428 -0
  113. package/dist/scripts/build-changelog.js +238 -0
  114. package/dist/scripts/build-metrics-report.js +331 -0
  115. package/dist/scripts/changelog-tests.js +118 -0
  116. package/dist/scripts/channel-probe-tests.js +103 -0
  117. package/dist/scripts/channel-probe.js +169 -0
  118. package/dist/scripts/channel-registry-tests.js +208 -0
  119. package/dist/scripts/city-scenario-tier-tests.js +234 -0
  120. package/dist/scripts/companion-tests.js +25 -70
  121. package/dist/scripts/dida-cookie-probe.js +87 -0
  122. package/dist/scripts/dida-runner-stop-tests.js +311 -0
  123. package/dist/scripts/dida-sw-probe.js +114 -0
  124. package/dist/scripts/diff-test.js +17 -12
  125. package/dist/scripts/doctor-tests.js +600 -0
  126. package/dist/scripts/drill-multiuser-ledger-tests.js +1076 -0
  127. package/dist/scripts/drill-sdk-descendant-cleanup-tests.js +606 -0
  128. package/dist/scripts/drill-w2a-sensor-tests.js +788 -0
  129. package/dist/scripts/dsh-artifact-e2e.js +279 -0
  130. package/dist/scripts/dsh-artifact-web-e2e.js +675 -0
  131. package/dist/scripts/dsh-http-proxy-sse-proof.js +90 -0
  132. package/dist/scripts/dsh-llm-tests.js +437 -0
  133. package/dist/scripts/dsh-runtime-closure-tests.js +182 -0
  134. package/dist/scripts/dsh-runtime-closure.js +162 -0
  135. package/dist/scripts/dsh-session-v3-migration-proof.js +109 -0
  136. package/dist/scripts/dsh-subprocess-local-proof.js +150 -0
  137. package/dist/scripts/dsh-target-closure-proof.js +178 -0
  138. package/dist/scripts/effect-tests.js +539 -0
  139. package/dist/scripts/engine-run.js +1 -3
  140. package/dist/scripts/engine-tests.js +16 -10
  141. package/dist/scripts/evaluation-cadence-tests.js +174 -0
  142. package/dist/scripts/evaluation-contract-tests.js +268 -0
  143. package/dist/scripts/extension-distribution-cli.js +39 -0
  144. package/dist/scripts/extension-distribution-tests.js +443 -0
  145. package/dist/scripts/extension-tests.js +988 -0
  146. package/dist/scripts/external-event-tests.js +350 -0
  147. package/dist/scripts/fact-gate-tests.js +869 -0
  148. package/dist/scripts/fixtures/extension-bridge-unref-child.mjs +21 -0
  149. package/dist/scripts/flight-hotel-anchor-363-registered-e2e.js +169 -0
  150. package/dist/scripts/flight-malformed-tests.js +159 -0
  151. package/dist/scripts/flyai-setup-tests.js +228 -0
  152. package/dist/scripts/flyai-setup-tool-tests.js +54 -0
  153. package/dist/scripts/flyai-tests.js +692 -0
  154. package/dist/scripts/flyai-tool-registration-contract-tests.js +91 -0
  155. package/dist/scripts/fx-contract-tests.js +201 -0
  156. package/dist/scripts/g5-guard-tests.js +150 -0
  157. package/dist/scripts/g5-guard.js +193 -0
  158. package/dist/scripts/gen-lunar-anchors.js +106 -0
  159. package/dist/scripts/geo-atlas-tests.js +283 -0
  160. package/dist/scripts/gotry-backend-kernel-tests.js +206 -0
  161. package/dist/scripts/gotry-try-demo-tests.js +79 -0
  162. package/dist/scripts/gotry-try-demo.js +49 -0
  163. package/dist/scripts/ground-transfer-tests.js +956 -0
  164. package/dist/scripts/hbcli-e2e-tests.js +159 -0
  165. package/dist/scripts/hbcli-live-optin-tests.js +96 -0
  166. package/dist/scripts/hbcli-release-contract-tests.js +122 -0
  167. package/dist/scripts/hbcli-tests.js +121 -69
  168. package/dist/scripts/health-watch-cli.js +73 -0
  169. package/dist/scripts/hotel-date-gate-tests.js +496 -0
  170. package/dist/scripts/hotelbyte-reconcile-tests.js +141 -0
  171. package/dist/scripts/hotelbyte-spawn-e2e-tests.js +373 -0
  172. package/dist/scripts/i18n-tests.js +41 -0
  173. package/dist/scripts/incident-tests.js +281 -87
  174. package/dist/scripts/issue-194-job-id-guard-tests.js +106 -0
  175. package/dist/scripts/issue-233-cancel-refund-commission-tests.js +392 -0
  176. package/dist/scripts/issue-271-liveness-tests.js +569 -0
  177. package/dist/scripts/issue-289-model-retry-real-tests.js +296 -0
  178. package/dist/scripts/issue-289-model-retry-tests.js +441 -0
  179. package/dist/scripts/issue-289-web-retry-e2e.js +630 -0
  180. package/dist/scripts/issue-338-home-city-e2e.js +577 -0
  181. package/dist/scripts/issue343-real-entry-e2e.js +160 -0
  182. package/dist/scripts/issue436-persisted-routing-e2e.js +247 -0
  183. package/dist/scripts/itinerary-artifact-tests.js +368 -0
  184. package/dist/scripts/itinerary-deck-artifact-tests.js +416 -0
  185. package/dist/scripts/itinerary-deck-export-tests.js +552 -0
  186. package/dist/scripts/itinerary-deck-tests.js +435 -0
  187. package/dist/scripts/itinerary-html-tests.js +426 -0
  188. package/dist/scripts/journey-tests.js +22 -27
  189. package/dist/scripts/kernel-manifest-evidence.js +109 -0
  190. package/dist/scripts/kernel-manifest-gate.js +126 -0
  191. package/dist/scripts/kernel-manifest-tests.js +212 -0
  192. package/dist/scripts/kernel-manifest-trace-entry.js +7 -0
  193. package/dist/scripts/kernel-manifest-trace-hook.mjs +28 -0
  194. package/dist/scripts/kernel-manifest.js +369 -0
  195. package/dist/scripts/lavish-local-tests.js +1226 -0
  196. package/dist/scripts/lavish-product-tools-tests.js +537 -0
  197. package/dist/scripts/ledger-repair-apply-tests.js +316 -0
  198. package/dist/scripts/ledger-repair-plan-tests.js +375 -0
  199. package/dist/scripts/ledger-tests.js +382 -246
  200. package/dist/scripts/ledger-workflow-crash.js +10 -20
  201. package/dist/scripts/m3-cohort-tests.js +714 -0
  202. package/dist/scripts/m3-cohort.js +310 -0
  203. package/dist/scripts/managed-dsh-cleanup-diagnostic-proof.js +184 -0
  204. package/dist/scripts/managed-dsh-close-failure-proof.js +172 -0
  205. package/dist/scripts/managed-dsh-run-port-proof.js +153 -0
  206. package/dist/scripts/managed-dsh-terminal-proof.js +252 -0
  207. package/dist/scripts/map-tools-vendor-package-proof.js +365 -0
  208. package/dist/scripts/memory-capture-tests.js +242 -61
  209. package/dist/scripts/memory-decay-tests.js +18 -52
  210. package/dist/scripts/memory-lifecycle-tests.js +657 -0
  211. package/dist/scripts/memory-lifecycle.js +196 -0
  212. package/dist/scripts/memory-metrics.js +24 -12
  213. package/dist/scripts/memory-value-report.js +631 -0
  214. package/dist/scripts/memory-value-tests.js +328 -0
  215. package/dist/scripts/metrics-report-tests.js +151 -0
  216. package/dist/scripts/model-override-e2e.js +137 -0
  217. package/dist/scripts/nightly-evidence-tests.js +203 -0
  218. package/dist/scripts/nightly-evidence.js +303 -0
  219. package/dist/scripts/nudge-digest.js +39 -28
  220. package/dist/scripts/observability-tests.js +381 -0
  221. package/dist/scripts/onboarding-tests.js +161 -0
  222. package/dist/scripts/opensky-check.js +18 -13
  223. package/dist/scripts/opensky-tests.js +28 -28
  224. package/dist/scripts/outcome-projection-tests.js +427 -0
  225. package/dist/scripts/persona-sim-tests.js +603 -0
  226. package/dist/scripts/persona-sim.js +1081 -0
  227. package/dist/scripts/persona-surface-guard-tests.js +49 -0
  228. package/dist/scripts/pnpm-dsh-closure-proof.js +17 -0
  229. package/dist/scripts/policy-anchor-359-registered-e2e.js +214 -0
  230. package/dist/scripts/price-drift-tests.js +340 -0
  231. package/dist/scripts/price-drift-watch.js +447 -0
  232. package/dist/scripts/probe-poi-tests.js +53 -45
  233. package/dist/scripts/product-metrics.js +483 -0
  234. package/dist/scripts/publish-preverify.js +110 -0
  235. package/dist/scripts/realtime-pricing-tests.js +76 -0
  236. package/dist/scripts/recall-tests.js +513 -0
  237. package/dist/scripts/replay-async.js +22 -18
  238. package/dist/scripts/replay-real.js +18 -18
  239. package/dist/scripts/replay.js +54 -82
  240. package/dist/scripts/route-provider-conformance-tests.js +391 -0
  241. package/dist/scripts/session-attach-diagnose.js +20 -20
  242. package/dist/scripts/session-attach-poc.js +34 -37
  243. package/dist/scripts/session-benchmark.js +180 -0
  244. package/dist/scripts/session-dida-live-e2e.js +199 -0
  245. package/dist/scripts/session-extract-tests.js +14 -35
  246. package/dist/scripts/session-link-tests.js +478 -0
  247. package/dist/scripts/session-login.js +27 -46
  248. package/dist/scripts/session-tests.js +796 -96
  249. package/dist/scripts/session-zone-crash.js +49 -0
  250. package/dist/scripts/session-zone-ledger-tests.js +432 -0
  251. package/dist/scripts/session-zone-observation-tests.js +492 -0
  252. package/dist/scripts/session-zone-observe.js +135 -0
  253. package/dist/scripts/session-zone-wiring-tests.js +566 -0
  254. package/dist/scripts/session-zones-tests.js +374 -0
  255. package/dist/scripts/sf-live-benchmark.js +367 -0
  256. package/dist/scripts/sf-live-challenge-stop-tests.js +453 -0
  257. package/dist/scripts/sf-live-cli-tests.js +92 -0
  258. package/dist/scripts/sf-live-options.js +46 -0
  259. package/dist/scripts/sf-manifest-tests.js +30 -0
  260. package/dist/scripts/sf-manifest.js +33 -0
  261. package/dist/scripts/sf-soft-score-tests.js +67 -0
  262. package/dist/scripts/sf-summary-tests.js +324 -0
  263. package/dist/scripts/sf-summary.js +525 -0
  264. package/dist/scripts/share-tests.js +432 -0
  265. package/dist/scripts/skeleton-check.js +16 -14
  266. package/dist/scripts/skeleton-integration-test.js +28 -11
  267. package/dist/scripts/skills-contract-tests.js +51 -46
  268. package/dist/scripts/smoke-session-gate-tests.js +21 -0
  269. package/dist/scripts/smoke.js +690 -246
  270. package/dist/scripts/spawn-bounded-abort-tests.js +244 -0
  271. package/dist/scripts/sponsor-reuse-tests.js +262 -0
  272. package/dist/scripts/state-cli-tests.js +226 -101
  273. package/dist/scripts/state-cli.js +565 -198
  274. package/dist/scripts/state-repair-cli.js +66 -0
  275. package/dist/scripts/state-repair-tests.js +140 -0
  276. package/dist/scripts/static-golden-tests.js +165 -0
  277. package/dist/scripts/time-eval-tests.js +212 -192
  278. package/dist/scripts/travel-timeline-tests.js +29 -93
  279. package/dist/scripts/turn-handoff-collect-tests.js +169 -0
  280. package/dist/scripts/turn-handoff-collect.js +161 -0
  281. package/dist/scripts/turn-policy-tests.js +55 -0
  282. package/dist/scripts/typed-contract-canary.js +176 -0
  283. package/dist/scripts/tz-resolver-sanity.js +50 -0
  284. package/dist/scripts/tz-resolver-tests.js +584 -0
  285. package/dist/scripts/unified-tests.js +60 -20
  286. package/dist/scripts/visa-policy-tests.js +62 -0
  287. package/dist/scripts/weather-tests.js +276 -41
  288. package/dist/scripts/wish-channel-gate-tests.js +54 -0
  289. package/dist/scripts/write-gate-tests.js +522 -0
  290. package/dist/scripts/z3-lifecycle-fault-tests.js +188 -0
  291. package/dist/scripts/z3-lifecycle-tests.js +170 -0
  292. package/dist/scripts/z3-race-repeat-tests.js +39 -0
  293. package/dist/scripts/z3-race-tests.js +46 -0
  294. package/dist/src/artifact-gate.js +829 -0
  295. package/dist/src/backend/kernel.js +91 -0
  296. package/dist/src/backend/modules/booking-copilot.js +92 -0
  297. package/dist/src/backend/modules/booking-executor.js +124 -0
  298. package/dist/src/backend/modules/session-search.js +551 -0
  299. package/dist/src/benchmark-agent-conformance.js +578 -0
  300. package/dist/src/benchmark-environment-bridge.js +515 -0
  301. package/dist/src/benchmark-headless-child-diagnostics.js +166 -0
  302. package/dist/src/benchmark-tool-isolation.js +151 -0
  303. package/dist/src/bookable-facts.js +533 -0
  304. package/dist/src/booking-saga.js +97 -0
  305. package/dist/src/booking-surface/availability-policy.js +697 -0
  306. package/dist/src/booking-surface/booking-intent.js +43 -0
  307. package/dist/src/booking-surface/cancel-refund-commission.js +379 -0
  308. package/dist/src/booking-surface/canonical-schema.js +116 -0
  309. package/dist/src/booking-surface/contracts.js +75 -0
  310. package/dist/src/booking-surface/dsh-planner.js +1854 -0
  311. package/dist/src/booking-surface/dsh-plugin.js +378 -0
  312. package/dist/src/booking-surface/dsh-worker.js +98 -0
  313. package/dist/src/booking-surface/error-codes.js +231 -0
  314. package/dist/src/booking-surface/index.js +9 -0
  315. package/dist/src/booking-surface/managed-dsh-cleanup-diagnostic.js +97 -0
  316. package/dist/src/booking-surface/managed-dsh-run-port.js +244 -0
  317. package/dist/src/booking-surface/profile.js +24 -0
  318. package/dist/src/booking-surface/recovery-chain.js +367 -0
  319. package/dist/src/booking-surface/runtime.js +1968 -0
  320. package/dist/src/booking-surface/server.js +674 -0
  321. package/dist/src/booking-surface/startup.js +168 -0
  322. package/dist/src/booking-surface/validation.js +261 -0
  323. package/dist/src/bridge.js +20 -13
  324. package/dist/src/city-scenario-tier.js +378 -0
  325. package/dist/src/companions.js +48 -74
  326. package/dist/src/contracts.js +21 -43
  327. package/dist/src/dsh-llm.js +171 -115
  328. package/dist/src/engine.js +276 -193
  329. package/dist/src/evaluation-cadence.js +97 -0
  330. package/dist/src/evaluation-contracts.js +283 -0
  331. package/dist/src/flight-pack-adapter.js +54 -0
  332. package/dist/src/flight-pack-contract.js +2 -0
  333. package/dist/src/flyai-setup-tool.js +70 -0
  334. package/dist/src/gotry-backend.js +125 -0
  335. package/dist/src/hotel-date-gate.js +118 -0
  336. package/dist/src/i18n.js +88 -0
  337. package/dist/src/index.js +2385 -881
  338. package/dist/src/itinerary-deck.js +139 -0
  339. package/dist/src/itinerary-doc-shared.js +661 -0
  340. package/dist/src/itinerary-html.js +131 -0
  341. package/dist/src/journey.js +155 -108
  342. package/dist/src/lavish-tools.js +400 -0
  343. package/dist/src/ledger-repair-apply.js +538 -0
  344. package/dist/src/ledger-repair-plan.js +463 -0
  345. package/dist/src/loop.js +331 -161
  346. package/dist/src/m3-cohort.js +1577 -0
  347. package/dist/src/memory-capture.js +180 -32
  348. package/dist/src/memory-decay.js +30 -14
  349. package/dist/src/memory-lifecycle.js +1310 -0
  350. package/dist/src/memory-utility.js +27 -40
  351. package/dist/src/mock-llm.js +36 -61
  352. package/dist/src/model.js +81 -36
  353. package/dist/src/outcome-projection.js +746 -0
  354. package/dist/src/realtime-pricing.js +103 -0
  355. package/dist/src/recall/card.js +74 -0
  356. package/dist/src/recall/evaluator.js +140 -0
  357. package/dist/src/recall/integration.js +17 -0
  358. package/dist/src/recall/tick.js +166 -0
  359. package/dist/src/session-link/plan-it-action.js +48 -0
  360. package/dist/src/session-link/session-link.js +248 -0
  361. package/dist/src/session-zone-ledger.js +312 -0
  362. package/dist/src/session-zone-observation.js +354 -0
  363. package/dist/src/session-zone-wiring.js +658 -0
  364. package/dist/src/session-zones.js +510 -0
  365. package/dist/src/share/adapters.js +51 -0
  366. package/dist/src/share/share-consent.js +76 -0
  367. package/dist/src/share/share-deck.js +58 -0
  368. package/dist/src/share/share-token.js +146 -0
  369. package/dist/src/slot-spec.js +84 -106
  370. package/dist/src/state-ledger.js +696 -524
  371. package/dist/src/state-repair.js +299 -0
  372. package/dist/src/subagent-job-id-guard.js +58 -0
  373. package/dist/src/time-anchor.js +231 -33
  374. package/dist/src/tool-packet.js +20 -8
  375. package/dist/src/travel-slots.js +58 -35
  376. package/dist/src/travel-timeline.js +44 -63
  377. package/dist/src/turn-deadline.js +287 -0
  378. package/dist/src/turn-policy.js +118 -0
  379. package/dist/src/tz-resolver.js +143 -0
  380. package/dist/src/unified.js +600 -360
  381. package/dist/src/wish-pool.js +42 -12
  382. package/dist/src/write-gate.js +495 -0
  383. package/dist/src/z3-shared.js +284 -0
  384. package/extension/README.md +21 -0
  385. package/extension/README.zh-CN.md +21 -0
  386. package/extension/background.js +463 -0
  387. package/extension/content-bridge.js +270 -0
  388. package/extension/content-main.js +111 -0
  389. package/extension/manifest.json +60 -0
  390. package/package.json +407 -14
  391. package/schemas/booking.intent.schema.json +193 -0
  392. package/schemas/booking.surface.schema.json +2622 -0
  393. package/ts/capabilities/agent-reach-deep.ts +114 -0
  394. package/ts/capabilities/agent-reach.ts +198 -0
  395. package/ts/capabilities/anything.ts +282 -0
  396. package/ts/capabilities/artifacts.ts +428 -0
  397. package/ts/capabilities/fact-log.ts +54 -0
  398. package/ts/capabilities/flyai-config.ts +388 -0
  399. package/ts/capabilities/flyai.ts +1274 -0
  400. package/ts/capabilities/hbcli.ts +253 -71
  401. package/ts/capabilities/incident-log.ts +88 -59
  402. package/ts/capabilities/itinerary-artifact.ts +214 -0
  403. package/ts/capabilities/itinerary-deck-artifact.ts +218 -0
  404. package/ts/capabilities/itinerary-deck-export.ts +378 -0
  405. package/ts/capabilities/opensky.ts +121 -0
  406. package/ts/capabilities/session/action-cache.ts +148 -0
  407. package/ts/capabilities/session/adapters/ctrip-flight.ts +181 -0
  408. package/ts/capabilities/session/adapters/ctrip-hotel.ts +238 -0
  409. package/ts/capabilities/session/adapters/dida-portal.ts +338 -0
  410. package/ts/capabilities/session/adapters/meituan-local.ts +70 -0
  411. package/ts/capabilities/session/adapters/rail-12306.ts +392 -0
  412. package/ts/capabilities/session/benchmark.ts +276 -0
  413. package/ts/capabilities/session/bridge-ledger.ts +333 -0
  414. package/ts/capabilities/session/extension-bridge.ts +794 -0
  415. package/ts/capabilities/session/extension-channel.ts +144 -0
  416. package/ts/capabilities/session/extension-distribution.ts +266 -0
  417. package/ts/capabilities/session/extract.ts +54 -0
  418. package/ts/capabilities/session/golden-score.ts +139 -0
  419. package/ts/capabilities/session/health-watch.ts +264 -0
  420. package/ts/capabilities/session/read-guard.ts +141 -0
  421. package/ts/capabilities/session/static-flight-golden.ts +209 -0
  422. package/ts/capabilities/session/transport.ts +146 -0
  423. package/ts/capabilities/session/wizard.ts +140 -0
  424. package/ts/capabilities/session-consent.ts +211 -0
  425. package/ts/capabilities/session-login.ts +208 -0
  426. package/ts/capabilities/session-search.ts +893 -0
  427. package/ts/capabilities/weather.ts +330 -0
  428. package/ts/dsh-runtime/vendor/README.md +68 -0
  429. package/ts/dsh-runtime/vendor/dsh-map-tools/LICENSE +21 -0
  430. package/ts/dsh-runtime/vendor/dsh-map-tools/README.en.md +405 -0
  431. package/ts/dsh-runtime/vendor/dsh-map-tools/README.md +404 -0
  432. package/ts/dsh-runtime/vendor/dsh-map-tools/client/client.js +1584 -0
  433. package/ts/dsh-runtime/vendor/dsh-map-tools/cordis.patch.yml +5 -0
  434. package/ts/dsh-runtime/vendor/dsh-map-tools/icon.svg +5 -0
  435. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/clients/amap.js +595 -0
  436. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/clients/nominatim.js +63 -0
  437. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/clients/osrm.js +58 -0
  438. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/clients/photon.js +55 -0
  439. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/config-file.js +87 -0
  440. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/config-route.js +131 -0
  441. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/config.js +16 -0
  442. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/geo.js +232 -0
  443. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/index.js +120 -0
  444. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/settings-ns.js +40 -0
  445. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/staticmap-route.js +115 -0
  446. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/tools/geocode.js +127 -0
  447. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/tools/poi.js +84 -0
  448. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/tools/routes.js +267 -0
  449. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/clients/amap.d.ts +90 -0
  450. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/clients/nominatim.d.ts +17 -0
  451. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/clients/osrm.d.ts +15 -0
  452. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/clients/photon.d.ts +22 -0
  453. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/config-file.d.ts +33 -0
  454. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/config-route.d.ts +23 -0
  455. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/config.d.ts +23 -0
  456. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/geo.d.ts +61 -0
  457. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/index.d.ts +18 -0
  458. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/settings-ns.d.ts +14 -0
  459. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/staticmap-route.d.ts +31 -0
  460. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/tools/geocode.d.ts +11 -0
  461. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/tools/poi.d.ts +9 -0
  462. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/tools/routes.d.ts +75 -0
  463. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/types.d.ts +68 -0
  464. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types.js +16 -0
  465. package/ts/dsh-runtime/vendor/dsh-map-tools/package.json +97 -0
  466. package/ts/package.json +293 -3
  467. package/ts/scripts/async-collect.ts +91 -0
  468. package/ts/scripts/map-tools-vendor-package-proof.ts +404 -0
  469. package/ts/scripts/skeleton-check.ts +1 -1
  470. package/ts/scripts/skeleton-integration-test.ts +23 -1
  471. package/ts/scripts/state-cli.ts +586 -0
  472. package/ts/scripts/turn-handoff-collect.ts +178 -0
  473. package/ts/src/artifact-gate.ts +991 -0
  474. package/ts/src/benchmark-agent-conformance.ts +619 -0
  475. package/ts/src/benchmark-environment-bridge.ts +538 -0
  476. package/ts/src/benchmark-headless-child-diagnostics.ts +184 -0
  477. package/ts/src/benchmark-tool-isolation.ts +166 -0
  478. package/ts/src/bookable-facts.ts +837 -0
  479. package/ts/src/booking-saga.ts +133 -0
  480. package/ts/src/booking-surface/availability-policy.ts +522 -0
  481. package/ts/src/booking-surface/booking-intent.ts +86 -0
  482. package/ts/src/booking-surface/cancel-refund-commission.ts +488 -0
  483. package/ts/src/booking-surface/canonical-schema.js +116 -0
  484. package/ts/src/booking-surface/contracts.ts +475 -0
  485. package/ts/src/booking-surface/dsh-planner.ts +1949 -0
  486. package/ts/src/booking-surface/dsh-plugin.js +378 -0
  487. package/ts/src/booking-surface/dsh-worker.ts +110 -0
  488. package/ts/src/booking-surface/error-codes.ts +241 -0
  489. package/ts/src/booking-surface/index.ts +9 -0
  490. package/ts/src/booking-surface/managed-dsh-cleanup-diagnostic.ts +151 -0
  491. package/ts/src/booking-surface/managed-dsh-run-port.ts +273 -0
  492. package/ts/src/booking-surface/profile.ts +42 -0
  493. package/ts/src/booking-surface/recovery-chain.ts +409 -0
  494. package/ts/src/booking-surface/runtime.ts +1793 -0
  495. package/ts/src/booking-surface/server.ts +733 -0
  496. package/ts/src/booking-surface/startup.ts +201 -0
  497. package/ts/src/booking-surface/validation.ts +217 -0
  498. package/ts/src/companions.ts +113 -0
  499. package/ts/src/contracts.ts +17 -3
  500. package/ts/src/dsh-llm.ts +152 -17
  501. package/ts/src/flyai-setup-tool.ts +77 -0
  502. package/ts/src/index.ts +2123 -200
  503. package/ts/src/itinerary-deck.ts +189 -0
  504. package/ts/src/itinerary-doc-shared.ts +741 -0
  505. package/ts/src/itinerary-html.ts +171 -0
  506. package/ts/src/loop.ts +234 -26
  507. package/ts/src/memory-capture.ts +283 -0
  508. package/ts/src/memory-decay.ts +55 -0
  509. package/ts/src/memory-utility.ts +70 -0
  510. package/ts/src/mock-llm.ts +4 -8
  511. package/ts/src/model.ts +88 -2
  512. package/ts/src/recall/card.ts +106 -0
  513. package/ts/src/recall/evaluator.ts +170 -0
  514. package/ts/src/recall/integration.ts +35 -0
  515. package/ts/src/recall/tick.ts +213 -0
  516. package/ts/src/session-link/plan-it-action.ts +78 -0
  517. package/ts/src/session-link/session-link.ts +275 -0
  518. package/ts/src/share/adapters.ts +93 -0
  519. package/ts/src/share/share-consent.ts +105 -0
  520. package/ts/src/share/share-deck.ts +85 -0
  521. package/ts/src/share/share-token.ts +166 -0
  522. package/ts/src/slot-spec.ts +172 -0
  523. package/ts/src/state-ledger.ts +1166 -0
  524. package/ts/src/subagent-job-id-guard.ts +72 -0
  525. package/ts/src/time-anchor.ts +338 -0
  526. package/ts/src/tool-packet.ts +32 -0
  527. package/ts/src/travel-slots.ts +219 -0
  528. package/ts/src/travel-timeline.ts +83 -0
  529. package/ts/src/turn-deadline.ts +366 -0
  530. package/ts/src/turn-policy.ts +154 -0
  531. package/ts/src/unified.ts +444 -105
  532. package/ts/src/wish-pool.ts +79 -0
  533. package/dist/scripts/session-attach-wait.js +0 -41
@@ -0,0 +1,231 @@
1
+ /** Closed, non-sensitive error vocabulary for planner/runtime boundaries. */
2
+ export const BOOKING_TYPED_ERROR_CODES = [
3
+ 'PAYLOAD_TOO_LARGE',
4
+ 'TASK_NOT_FOUND',
5
+ 'TASK_TERMINAL',
6
+ 'RECEIPT_REQUIRED',
7
+ 'RECEIPT_CONFLICT',
8
+ 'UNSUPPORTED_ACTION',
9
+ 'PLANNER_SURFACE_ACTION_UNSUPPORTED',
10
+ 'PLANNER_NO_DECISION',
11
+ 'PLANNER_TYPED_DECISION_REQUIRED',
12
+ 'PLANNER_PROVIDER_AUTH_FAILED',
13
+ 'PLANNER_PROVIDER_QUOTA_EXHAUSTED',
14
+ 'PLANNER_PROVIDER_RATE_LIMITED',
15
+ 'PLANNER_PROVIDER_UNAVAILABLE',
16
+ 'PLANNER_PROVIDER_REQUEST_REJECTED',
17
+ 'PLANNER_PROVIDER_RESPONSE_INVALID',
18
+ 'PLANNER_PROVIDER_TIMEOUT',
19
+ 'PLANNER_BOOT_TIMEOUT',
20
+ 'PLANNER_CONFIGURATION_INVALID',
21
+ 'PLANNER_FAILED',
22
+ 'INVALID_ACTION',
23
+ 'INVALID_EVENT',
24
+ 'CONTEXT_MISMATCH',
25
+ 'WORKSPACE_MISMATCH',
26
+ 'ACTION_CONFLICT',
27
+ 'STALE_REVISION',
28
+ 'OPERATION_LIMIT_REACHED',
29
+ 'AVAILABILITY_TERMINAL_POLICY_OWNED',
30
+ 'TRUSTED_INGRESS_BINDING_REQUIRED',
31
+ 'INVALID_INGRESS_BINDING',
32
+ 'BOOKING_SURFACE_SCHEMA_MISMATCH',
33
+ 'UNAUTHORIZED',
34
+ 'NOT_FOUND',
35
+ ];
36
+ /** Exact, closed reasons safe to expose in dispatch diagnostics. */
37
+ export const BOOKING_DISPATCH_REJECTION_REASONS = [
38
+ 'approval_expired',
39
+ 'approval_mismatch',
40
+ 'approval_not_awaiting',
41
+ 'approval_not_presented',
42
+ 'approval_replayed',
43
+ 'approval_required',
44
+ 'availability_attempt_mismatch',
45
+ 'availability_attempt_unknown',
46
+ 'availability_criteria_changed',
47
+ 'availability_criteria_invalid',
48
+ 'availability_criteria_mismatch',
49
+ 'availability_criteria_required',
50
+ 'availability_duplicate_offer_ref',
51
+ 'availability_duplicate_offer_version_ref',
52
+ 'availability_expected_revision_missing',
53
+ 'availability_generation_mismatch',
54
+ 'availability_hotel_limit_exceeded',
55
+ 'availability_hotel_not_active',
56
+ 'availability_hotel_unknown',
57
+ 'availability_observation_required',
58
+ 'availability_offer_limit_exceeded',
59
+ 'availability_offers_count_mismatch',
60
+ 'availability_offers_hotel_mismatch',
61
+ 'availability_offers_observation_required',
62
+ 'availability_offers_receipt_incoherent',
63
+ 'availability_offers_unreported',
64
+ 'availability_offers_workspace_mismatch',
65
+ 'availability_query_not_reserved',
66
+ 'availability_query_provenance_mismatch',
67
+ 'availability_query_receipt_mismatch',
68
+ 'availability_receipt_digest_mismatch',
69
+ 'availability_receipt_incoherent',
70
+ 'availability_stale_receipt',
71
+ 'availability_terminal',
72
+ 'booking_malformed_workspace',
73
+ 'context_mismatch',
74
+ 'invalid_task_id',
75
+ 'receipt_action_mismatch',
76
+ 'receipt_conflict',
77
+ 'receipt_observation_action_mismatch',
78
+ 'receipt_relaxation_unauthorized',
79
+ 'receipt_required',
80
+ 'receipt_source_action_mismatch',
81
+ 'receipt_source_digest_mismatch',
82
+ 'receipt_target_mismatch',
83
+ 'receipt_verified_offer_expired',
84
+ 'reanchor_turn_required',
85
+ 'request_conflict',
86
+ 'request_key_invalidated',
87
+ 'revision_mismatch',
88
+ 'revision_regression',
89
+ 'task_not_found',
90
+ 'task_terminal',
91
+ 'turn_conflict',
92
+ 'unexpected_receipt',
93
+ 'unsafe_opaque_ref',
94
+ 'workspace_mismatch',
95
+ ];
96
+ export const BOOKING_DISPATCH_UNKNOWN_REASON = 'UNCLASSIFIED';
97
+ const DISPATCH_REJECTION_REASON_SET = new Set(BOOKING_DISPATCH_REJECTION_REASONS);
98
+ /** Returns a reason only when the complete boundary error is one known token. */
99
+ export function extractBookingDispatchReason(error) {
100
+ const message = typeof error === 'string' ? error : error instanceof Error ? error.message : undefined;
101
+ return message !== undefined && DISPATCH_REJECTION_REASON_SET.has(message)
102
+ ? message
103
+ : BOOKING_DISPATCH_UNKNOWN_REASON;
104
+ }
105
+ const ALIASES = {
106
+ payload_too_large: 'PAYLOAD_TOO_LARGE',
107
+ task_not_found: 'TASK_NOT_FOUND',
108
+ task_terminal: 'TASK_TERMINAL',
109
+ receipt_required: 'RECEIPT_REQUIRED',
110
+ receipt_conflict: 'RECEIPT_CONFLICT',
111
+ unsupported_action: 'UNSUPPORTED_ACTION',
112
+ planner_surface_action_unsupported: 'PLANNER_SURFACE_ACTION_UNSUPPORTED',
113
+ planner_no_decision: 'PLANNER_NO_DECISION',
114
+ planner_typed_decision_required: 'PLANNER_TYPED_DECISION_REQUIRED',
115
+ planner_provider_auth_failed: 'PLANNER_PROVIDER_AUTH_FAILED',
116
+ planner_provider_quota_exhausted: 'PLANNER_PROVIDER_QUOTA_EXHAUSTED',
117
+ planner_provider_rate_limited: 'PLANNER_PROVIDER_RATE_LIMITED',
118
+ planner_provider_unavailable: 'PLANNER_PROVIDER_UNAVAILABLE',
119
+ planner_provider_request_rejected: 'PLANNER_PROVIDER_REQUEST_REJECTED',
120
+ planner_provider_response_invalid: 'PLANNER_PROVIDER_RESPONSE_INVALID',
121
+ planner_provider_timeout: 'PLANNER_PROVIDER_TIMEOUT',
122
+ planner_boot_timeout: 'PLANNER_BOOT_TIMEOUT',
123
+ planner_configuration_invalid: 'PLANNER_CONFIGURATION_INVALID',
124
+ planner_failed: 'PLANNER_FAILED',
125
+ planner_invalid_tool_arguments: 'PLANNER_PROVIDER_RESPONSE_INVALID',
126
+ planner_invalid_typed_decision: 'PLANNER_PROVIDER_RESPONSE_INVALID',
127
+ planner_invalid_action: 'PLANNER_PROVIDER_RESPONSE_INVALID',
128
+ planner_booking_intent_required: 'PLANNER_PROVIDER_RESPONSE_INVALID',
129
+ planner_invalid_booking_intent: 'PLANNER_PROVIDER_RESPONSE_INVALID',
130
+ planner_ambiguous_booking_intent: 'PLANNER_PROVIDER_RESPONSE_INVALID',
131
+ planner_multiple_typed_decisions: 'PLANNER_PROVIDER_RESPONSE_INVALID',
132
+ planner_typed_decision_after_candidate: 'PLANNER_PROVIDER_RESPONSE_INVALID',
133
+ planner_typed_decision_missing: 'PLANNER_PROVIDER_RESPONSE_INVALID',
134
+ planner_unresolved_tool_call_before_candidate: 'PLANNER_PROVIDER_RESPONSE_INVALID',
135
+ planner_tool_call_duplicate_call_id: 'PLANNER_PROVIDER_RESPONSE_INVALID',
136
+ planner_tool_call_missing_call_id: 'PLANNER_PROVIDER_RESPONSE_INVALID',
137
+ planner_tool_call_rejected: 'PLANNER_PROVIDER_RESPONSE_INVALID',
138
+ planner_tool_result_malformed: 'PLANNER_PROVIDER_RESPONSE_INVALID',
139
+ planner_tool_result_out_of_order: 'PLANNER_PROVIDER_RESPONSE_INVALID',
140
+ planner_tool_result_unmatched: 'PLANNER_PROVIDER_RESPONSE_INVALID',
141
+ planner_terminal_checkpoint_mismatch: 'PLANNER_PROVIDER_RESPONSE_INVALID',
142
+ planner_terminal_checkpoint_unavailable: 'PLANNER_PROVIDER_RESPONSE_INVALID',
143
+ planner_terminal_intent_criteria_unachieved: 'PLANNER_PROVIDER_RESPONSE_INVALID',
144
+ planner_terminal_intent_target_unachieved: 'PLANNER_PROVIDER_RESPONSE_INVALID',
145
+ planner_terminal_intent_unjustified: 'PLANNER_PROVIDER_RESPONSE_INVALID',
146
+ planner_terminal_search_checkpoint_mismatch: 'PLANNER_PROVIDER_RESPONSE_INVALID',
147
+ planner_terminal_search_patch_not_ready: 'PLANNER_PROVIDER_RESPONSE_INVALID',
148
+ planner_terminal_search_results_not_ready: 'PLANNER_PROVIDER_RESPONSE_INVALID',
149
+ planner_terminal_search_workspace_mismatch: 'PLANNER_PROVIDER_RESPONSE_INVALID',
150
+ planner_forbidden_action: 'UNSUPPORTED_ACTION',
151
+ planner_forbidden_tool: 'UNSUPPORTED_ACTION',
152
+ planner_capability_action_mismatch: 'UNSUPPORTED_ACTION',
153
+ planner_intent_target_unsupported: 'PLANNER_SURFACE_ACTION_UNSUPPORTED',
154
+ planner_context_mismatch: 'CONTEXT_MISMATCH',
155
+ planner_revision_mismatch: 'STALE_REVISION',
156
+ booking_intent_required: 'INVALID_ACTION',
157
+ invalid_booking_intent: 'INVALID_ACTION',
158
+ action_intent_mismatch: 'INVALID_ACTION',
159
+ intent_mutation_forbidden: 'INVALID_ACTION',
160
+ invalid_action: 'INVALID_ACTION',
161
+ invalid_event: 'INVALID_EVENT',
162
+ context_mismatch: 'CONTEXT_MISMATCH',
163
+ workspace_mismatch: 'WORKSPACE_MISMATCH',
164
+ action_conflict: 'ACTION_CONFLICT',
165
+ approval_replayed: 'ACTION_CONFLICT',
166
+ request_conflict: 'ACTION_CONFLICT',
167
+ turn_conflict: 'ACTION_CONFLICT',
168
+ stale_revision: 'STALE_REVISION',
169
+ operation_limit_reached: 'OPERATION_LIMIT_REACHED',
170
+ availability_terminal_policy_owned: 'AVAILABILITY_TERMINAL_POLICY_OWNED',
171
+ trusted_ingress_binding_required: 'TRUSTED_INGRESS_BINDING_REQUIRED',
172
+ invalid_ingress_binding: 'INVALID_INGRESS_BINDING',
173
+ booking_surface_schema_mismatch: 'BOOKING_SURFACE_SCHEMA_MISMATCH',
174
+ unauthorized: 'UNAUTHORIZED',
175
+ not_found: 'NOT_FOUND',
176
+ };
177
+ const SAFE_MESSAGES = {
178
+ PAYLOAD_TOO_LARGE: 'Request payload exceeds the configured limit.',
179
+ TASK_NOT_FOUND: 'The requested task was not found.',
180
+ TASK_TERMINAL: 'The task is already terminal.',
181
+ RECEIPT_REQUIRED: 'A matching receipt is required before another action.',
182
+ RECEIPT_CONFLICT: 'The receipt conflicts with the durable task record.',
183
+ UNSUPPORTED_ACTION: 'The requested action is outside the trusted action policy.',
184
+ PLANNER_SURFACE_ACTION_UNSUPPORTED: 'The planner action is outside the trusted surface policy.',
185
+ PLANNER_NO_DECISION: 'The planner returned no typed decision.',
186
+ PLANNER_TYPED_DECISION_REQUIRED: 'The planner returned no typed capability decision.',
187
+ PLANNER_PROVIDER_AUTH_FAILED: 'The planner provider rejected authentication.',
188
+ PLANNER_PROVIDER_QUOTA_EXHAUSTED: 'The planner provider quota is exhausted.',
189
+ PLANNER_PROVIDER_RATE_LIMITED: 'The planner provider rate-limited the request.',
190
+ PLANNER_PROVIDER_UNAVAILABLE: 'The planner provider is temporarily unavailable.',
191
+ PLANNER_PROVIDER_REQUEST_REJECTED: 'The planner provider rejected the model request.',
192
+ PLANNER_PROVIDER_RESPONSE_INVALID: 'The planner provider returned an invalid response.',
193
+ PLANNER_PROVIDER_TIMEOUT: 'The planner did not respond within the booking turn deadline.',
194
+ PLANNER_BOOT_TIMEOUT: 'The planner runtime did not finish starting within its local boot budget.',
195
+ PLANNER_CONFIGURATION_INVALID: 'The planner provider configuration is invalid.',
196
+ PLANNER_FAILED: 'The planner stopped unexpectedly before producing a usable action.',
197
+ INVALID_ACTION: 'The planner action failed contract validation.',
198
+ INVALID_EVENT: 'The planner event failed contract validation.',
199
+ CONTEXT_MISMATCH: 'The request context does not match the trusted task.',
200
+ WORKSPACE_MISMATCH: 'The request workspace does not match the trusted task.',
201
+ ACTION_CONFLICT: 'The request conflicts with the durable action checkpoint.',
202
+ STALE_REVISION: 'The request revision is stale.',
203
+ OPERATION_LIMIT_REACHED: 'The task operation limit has been reached.',
204
+ AVAILABILITY_TERMINAL_POLICY_OWNED: 'Availability policy owns the terminal decision.',
205
+ TRUSTED_INGRESS_BINDING_REQUIRED: 'A trusted ingress binding is required.',
206
+ INVALID_INGRESS_BINDING: 'The trusted ingress binding is invalid.',
207
+ BOOKING_SURFACE_SCHEMA_MISMATCH: 'The booking surface schema is not supported.',
208
+ UNAUTHORIZED: 'The request is not authorized.',
209
+ NOT_FOUND: 'The requested resource was not found.',
210
+ };
211
+ function rawCode(error) {
212
+ if (typeof error === 'string')
213
+ return error.split(':', 1)[0];
214
+ if (error instanceof Error && error.message)
215
+ return error.message.split(':', 1)[0];
216
+ return 'planner_failed';
217
+ }
218
+ export function normalizeBookingErrorCode(error) {
219
+ const raw = rawCode(error);
220
+ const normalized = raw.trim().toLowerCase();
221
+ const aliased = ALIASES[normalized];
222
+ if (aliased)
223
+ return aliased;
224
+ const uppercase = raw.trim().replace(/[^A-Za-z0-9]+/g, '_').toUpperCase();
225
+ return BOOKING_TYPED_ERROR_CODES.includes(uppercase)
226
+ ? uppercase
227
+ : 'PLANNER_FAILED';
228
+ }
229
+ export function safeBookingErrorMessage(code) {
230
+ return SAFE_MESSAGES[BOOKING_TYPED_ERROR_CODES.includes(code) ? code : 'PLANNER_FAILED'];
231
+ }
@@ -0,0 +1,9 @@
1
+ export * from './contracts.js';
2
+ export * from './dsh-planner.js';
3
+ export * from './profile.js';
4
+ export * from './runtime.js';
5
+ export * from './server.js';
6
+ export * from './startup.js';
7
+ export * from './validation.js';
8
+ export * from './availability-policy.js';
9
+ export * from './booking-intent.js';
@@ -0,0 +1,97 @@
1
+ import { execFile } from 'node:child_process';
2
+ /** Diagnostics never include argv, environment, provider output or request data. */
3
+ export class ManagedDshCleanupError extends Error {
4
+ diagnostic;
5
+ constructor(message, diagnostic) {
6
+ // Keep the safe snapshot visible even when nested AggregateError inspection
7
+ // collapses custom object properties in an uncaught-error log.
8
+ super(`${message}; diagnostic=${JSON.stringify(diagnostic)}`);
9
+ this.diagnostic = diagnostic;
10
+ this.name = 'ManagedDshCleanupError';
11
+ }
12
+ }
13
+ const MEMBER_LINE = /^(\d+)\s+(\d+)\s+(\d+)\s+([A-Za-z+<NsLlEWXU-]+)\s+(.+?)\s*$/;
14
+ const MAX_MEMBERS = 32;
15
+ /**
16
+ * Classify one `ps -axo pid=,ppid=,pgid=,stat=,lstart=` table for the owned
17
+ * group. Pure so proofs can feed crafted tables without signalling anything.
18
+ */
19
+ export function parseManagedDshGroupSnapshot(stdout, expectedPgid, workerStartedAt = null) {
20
+ const empty = {
21
+ status: 'unknown_worker', expectedPgid, members: [], truncated: false, classification: null,
22
+ liveMemberCount: null, zombieMemberCount: null, workerStartedAt, workerIdentity: null,
23
+ };
24
+ if (expectedPgid === null)
25
+ return { ...empty, status: 'unknown_worker' };
26
+ const members = [];
27
+ for (const line of stdout.split('\n')) {
28
+ const match = line.trim().match(MEMBER_LINE);
29
+ if (!match || Number(match[3]) !== expectedPgid)
30
+ continue;
31
+ members.push({
32
+ pid: Number(match[1]), ppid: Number(match[2]), pgid: Number(match[3]),
33
+ state: match[4], startedAt: match[5] ?? null, zombie: match[4].startsWith('Z'),
34
+ });
35
+ }
36
+ const liveMemberCount = members.filter((member) => !member.zombie).length;
37
+ const zombieMemberCount = members.length - liveMemberCount;
38
+ const classification = members.length === 0 ? 'empty' : liveMemberCount === 0 ? 'zombie-only' : 'has-live-members';
39
+ let workerIdentity = 'unknown';
40
+ if (workerStartedAt !== null) {
41
+ const workerRow = members.find((member) => member.pid === expectedPgid);
42
+ workerIdentity = workerRow === undefined
43
+ ? 'worker-absent'
44
+ : workerRow.startedAt === workerStartedAt ? 'match' : 'mismatch';
45
+ }
46
+ return {
47
+ status: 'observed', expectedPgid,
48
+ members: members.slice(0, MAX_MEMBERS), truncated: members.length > MAX_MEMBERS,
49
+ classification, liveMemberCount, zombieMemberCount,
50
+ workerStartedAt, workerIdentity,
51
+ };
52
+ }
53
+ /** Whether the snapshot proves the owned group holds no live member. */
54
+ export function managedDshGroupIsQuiescent(group) {
55
+ return group.status === 'observed' && (group.classification === 'empty' || group.classification === 'zombie-only');
56
+ }
57
+ /** Read-only one-shot start-time anchor for the live worker (Darwin only). */
58
+ export function readManagedDshWorkerStart(pid) {
59
+ if (process.platform !== 'darwin')
60
+ return Promise.resolve(null);
61
+ return new Promise((resolve) => {
62
+ execFile('/bin/ps', ['-p', String(pid), '-o', 'lstart='], {
63
+ encoding: 'utf8', timeout: 250, maxBuffer: 4096,
64
+ env: { PATH: '/usr/bin:/bin', LC_ALL: 'C' },
65
+ }, (error, stdout) => resolve(error ? null : stdout.trim() || null));
66
+ });
67
+ }
68
+ /**
69
+ * Observe only the detached worker's group, without signalling any process.
70
+ * Snapshot fields are limited to pid/ppid/pgid/state/start time — never argv,
71
+ * environment, or request content.
72
+ */
73
+ export async function snapshotManagedDshGroup(workerPid, workerStartedAt = null) {
74
+ const empty = {
75
+ status: 'unknown_worker', expectedPgid: null, members: [], truncated: false, classification: null,
76
+ liveMemberCount: null, zombieMemberCount: null, workerStartedAt, workerIdentity: null,
77
+ };
78
+ if (workerPid === null)
79
+ return { ...empty, status: 'unknown_worker' };
80
+ // Only Darwin's installed detached fallback establishes PID == PGID here.
81
+ // Linux native scopes and Windows Jobs require a provider range identity,
82
+ // so an unsupported platform claims no expected group at all.
83
+ if (process.platform !== 'darwin')
84
+ return { ...empty, status: 'unsupported' };
85
+ return new Promise((resolve) => {
86
+ // A separate, bounded failure-only observation; it does not extend the
87
+ // provider's cleanup deadline or change its success/failure verdict.
88
+ execFile('/bin/ps', ['-axo', 'pid=,ppid=,pgid=,stat=,lstart='], {
89
+ encoding: 'utf8', timeout: 250, maxBuffer: 1024 * 1024,
90
+ env: { PATH: '/usr/bin:/bin', LC_ALL: 'C' },
91
+ }, (error, stdout) => {
92
+ if (error)
93
+ return resolve({ ...empty, expectedPgid: workerPid, status: 'unavailable' });
94
+ resolve(parseManagedDshGroupSnapshot(stdout, workerPid, workerStartedAt));
95
+ });
96
+ });
97
+ }
@@ -0,0 +1,244 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { fileURLToPath } from 'node:url';
3
+ import { dirname, join } from 'node:path';
4
+ import { createRequire } from 'node:module';
5
+ import { Context } from '@deepseek-ai/cordis';
6
+ import LocalSubprocessRuntime from '@deepseek-ai/dsh-subprocess-local';
7
+ import { ManagedDshCleanupError, managedDshGroupIsQuiescent, readManagedDshWorkerStart, snapshotManagedDshGroup, } from './managed-dsh-cleanup-diagnostic.js';
8
+ /** The only worker failure classifications allowed to cross the process boundary. */
9
+ const WORKER_FAILURE_CODES = new Set(['HARNESS_BOOT_TIMEOUT', 'HARNESS_START_FAILED', 'HARNESS_RUN_FAILED']);
10
+ const requireFromModule = createRequire(import.meta.url);
11
+ function workerLaunch(path) {
12
+ // The worker cwd is the isolated booking state root, so a bare `tsx/esm`
13
+ // loader would resolve from the wrong dependency tree and exit before the
14
+ // first request. Resolve the loader from this package once and pass its
15
+ // absolute installed path to Node.
16
+ return path.endsWith('.ts')
17
+ ? [process.execPath, '--import', requireFromModule.resolve('tsx/esm'), path]
18
+ : [process.execPath, path];
19
+ }
20
+ /** Run DeepSeekHarness in a child tree owned by dsh-subprocess-local. */
21
+ export class ManagedDshRunPort {
22
+ handle;
23
+ runtime;
24
+ pending = new Map();
25
+ sequence = 0;
26
+ closePromise;
27
+ terminalError;
28
+ inputBuffer = '';
29
+ workerPid = null;
30
+ workerStartedAt = null;
31
+ workerOutcome = { state: 'pending' };
32
+ cleanupRole;
33
+ graceMs;
34
+ constructor(options = {}) {
35
+ const defaultWorker = join(dirname(fileURLToPath(import.meta.url)), 'dsh-worker.js');
36
+ const workerPath = options.workerPath ?? (existsSync(defaultWorker) ? defaultWorker : defaultWorker.replace(/\.js$/, '.ts'));
37
+ const { workerPath: _worker, graceMs = 500, cleanupRole, env, groupObserver, bootLog, ...harnessOptions } = options;
38
+ this.cleanupRole = cleanupRole ?? 'unspecified';
39
+ this.graceMs = graceMs;
40
+ this.groupObserver = groupObserver ?? snapshotManagedDshGroup;
41
+ this.bootLog = bootLog ?? ((line) => { process.stderr.write(`${line}\n`); });
42
+ this.constructedAtMs = Date.now();
43
+ this.runtime = new LocalSubprocessRuntime(new Context());
44
+ this.handle = this.runtime.spawn({
45
+ argv: workerLaunch(workerPath),
46
+ cwd: options.cwd ?? process.cwd(),
47
+ // Provider diagnostics may contain request fragments. Keep a bounded
48
+ // private tail for ownership without inheriting it into service logs.
49
+ stdio: { stdin: 'pipe', stdout: 'pipe', stderr: { maxBytes: 64 * 1024 } },
50
+ graceMs,
51
+ env,
52
+ });
53
+ this.handle.stdout.setEncoding('utf8');
54
+ this.handle.stdout.on('data', (chunk) => this.consume(chunk));
55
+ this.handle.done.then((outcome) => {
56
+ this.workerOutcome = { state: 'exited', exitCode: outcome.exitCode, signal: outcome.signal };
57
+ this.markTerminal('managed DSH worker exited');
58
+ }, () => {
59
+ this.workerOutcome = { state: 'failed' };
60
+ this.markTerminal('managed DSH worker failed');
61
+ });
62
+ // Credentials are already in the managed worker environment. Never copy
63
+ // them into the JSON-lines protocol or a thrown worker error.
64
+ this.harnessOptions = harnessOptions;
65
+ this.cleanupDeadlineMs = Math.max(1_000, graceMs * 4);
66
+ }
67
+ harnessOptions;
68
+ cleanupDeadlineMs;
69
+ groupObserver;
70
+ bootLog;
71
+ constructedAtMs;
72
+ booted;
73
+ /**
74
+ * #511: surface the boot markers in the serving process. The four startup
75
+ * marker families previously existed only in build-time proof output, so a
76
+ * recurrence in service runtime left nothing to grep. Payloads are closed
77
+ * shapes only — role, timings; never prompts, provider fragments, or
78
+ * credentials.
79
+ */
80
+ emitBootLog(line) {
81
+ try {
82
+ this.bootLog(line);
83
+ }
84
+ catch { /* boot markers must never break the worker protocol */ }
85
+ }
86
+ /**
87
+ * What the most recent worker request paid for the initialize handshake: the
88
+ * measured wall time when that request started the runtime, and zero when an
89
+ * earlier request in the same worker already had. Read by the planner to keep
90
+ * our own boot cost separate from the provider budget it must not consume.
91
+ */
92
+ bootObservation() {
93
+ return this.booted;
94
+ }
95
+ consume(chunk) {
96
+ this.inputBuffer += chunk;
97
+ for (;;) {
98
+ const newline = this.inputBuffer.indexOf('\n');
99
+ if (newline < 0)
100
+ return;
101
+ const line = this.inputBuffer.slice(0, newline);
102
+ this.inputBuffer = this.inputBuffer.slice(newline + 1);
103
+ try {
104
+ const message = JSON.parse(line);
105
+ if (message.lifecycle === 'worker_started') {
106
+ if (this.workerPid === null && Number.isSafeInteger(message.workerPid) && message.workerPid > 0 && message.parentPid === process.pid) {
107
+ this.workerPid = message.workerPid;
108
+ // One bounded read-only start-time anchor, captured while the worker
109
+ // is alive, so a later failure snapshot can disprove PID reuse.
110
+ void readManagedDshWorkerStart(this.workerPid).then((startedAt) => {
111
+ if (this.workerStartedAt === null)
112
+ this.workerStartedAt = startedAt;
113
+ });
114
+ }
115
+ continue;
116
+ }
117
+ if (message.progress) {
118
+ this.pending.get(message.id)?.progress?.();
119
+ continue;
120
+ }
121
+ // A boot checkpoint carries the initialize handshake the worker already
122
+ // completed; the terminal reply for the same request still follows, and
123
+ // a request killed after booting has left this measurement behind.
124
+ if (message.boot) {
125
+ this.booted = message.boot;
126
+ // One line per real subprocess boot (#511): only a 'started'
127
+ // handshake measured an initialize; 'reused' rode an earlier one.
128
+ if (message.boot.mode === 'started') {
129
+ this.emitBootLog(`HARNESS_BOOT_STAGE ${JSON.stringify({ role: this.cleanupRole, initializeMs: message.boot.initializeMs, mode: 'started' })}`);
130
+ }
131
+ if (message.ok === undefined)
132
+ continue;
133
+ }
134
+ const waiter = this.pending.get(message.id);
135
+ if (!waiter)
136
+ continue;
137
+ this.pending.delete(message.id);
138
+ if (message.ok)
139
+ waiter.ok(message.result);
140
+ // Worker stdout is a process boundary: an arbitrary payload must never
141
+ // become the error the planner classifies on.
142
+ else if (typeof message.error === 'string' && WORKER_FAILURE_CODES.has(message.error)) {
143
+ if (message.error === 'HARNESS_BOOT_TIMEOUT') {
144
+ // The worker's own initialize deadline expired before any handshake
145
+ // completed; record the closed classification plus what this port
146
+ // observable spent on it (closeMs belongs to cleanup diagnostics).
147
+ this.emitBootLog(`HARNESS_BOOT_TIMEOUT ${JSON.stringify({
148
+ role: this.cleanupRole,
149
+ elapsedMs: Date.now() - this.constructedAtMs,
150
+ initializeMs: this.booted?.initializeMs ?? null,
151
+ })}`);
152
+ }
153
+ waiter.fail(new Error(message.error));
154
+ }
155
+ else
156
+ waiter.fail(new Error('HARNESS_RUN_FAILED'));
157
+ }
158
+ catch (error) {
159
+ this.failPending(error instanceof Error ? error : new Error(String(error)));
160
+ }
161
+ }
162
+ }
163
+ failPending(error) {
164
+ for (const waiter of this.pending.values())
165
+ waiter.fail(error);
166
+ this.pending.clear();
167
+ }
168
+ markTerminal(message) {
169
+ // Retain a safe terminal outcome before rejecting existing waiters: their
170
+ // continuations may immediately submit another request to this same port.
171
+ this.terminalError ??= new Error(message);
172
+ this.failPending(this.terminalError);
173
+ }
174
+ run(prompt, options) {
175
+ if (this.closePromise)
176
+ return Promise.reject(new Error('managed DSH run port is closed'));
177
+ if (this.terminalError)
178
+ return Promise.reject(this.terminalError);
179
+ const id = ++this.sequence;
180
+ return new Promise((resolve, reject) => {
181
+ this.pending.set(id, { ok: (value) => resolve(value), fail: reject, progress: options.onProgress });
182
+ this.handle.stdin.write(`${JSON.stringify({ id, prompt, sessionId: options.sessionId, options: this.harnessOptions })}\n`);
183
+ });
184
+ }
185
+ /** Boot the in-worker harness without consuming a provider call. */
186
+ warmup() {
187
+ if (this.closePromise)
188
+ return Promise.reject(new Error('managed DSH run port is closed'));
189
+ if (this.terminalError)
190
+ return Promise.reject(this.terminalError);
191
+ const id = ++this.sequence;
192
+ return new Promise((resolve, reject) => {
193
+ this.pending.set(id, { ok: () => resolve(), fail: reject });
194
+ this.handle.stdin.write(`${JSON.stringify({ id, warmup: true, options: this.harnessOptions })}\n`);
195
+ });
196
+ }
197
+ close() {
198
+ if (this.closePromise)
199
+ return this.closePromise;
200
+ this.closePromise = (async () => {
201
+ const started = performance.now();
202
+ this.failPending(new Error('managed DSH run port closed'));
203
+ this.handle.terminate();
204
+ // Observe worker failure even if range observation rejects or times out
205
+ // first. This derived promise must never become an unhandled rejection.
206
+ const outcome = this.handle.done.then(() => undefined, () => new Error('managed DSH worker failed'));
207
+ let rangeEmpty;
208
+ try {
209
+ rangeEmpty = await this.handle.waitForExit(AbortSignal.timeout(this.cleanupDeadlineMs));
210
+ }
211
+ catch {
212
+ throw await this.cleanupError('managed DSH process tree observation failed', started);
213
+ }
214
+ if (!rangeEmpty) {
215
+ // On Darwin the installed detached fallback observes the group through
216
+ // kill(-pgid, 0): a zombie-only group yields EPERM, which the runtime
217
+ // maps to "alive", and zombies only disappear when their owner reaps
218
+ // them — no signal can accelerate that. The deadline has not moved;
219
+ // verify through the safe process table whether a live member actually
220
+ // remains before converting the observation deadline into a failure.
221
+ const processGroup = await this.groupObserver(this.workerPid, this.workerStartedAt);
222
+ if (!managedDshGroupIsQuiescent(processGroup)) {
223
+ throw await this.cleanupError('managed DSH process tree cleanup timeout', started, processGroup);
224
+ }
225
+ }
226
+ if (await outcome)
227
+ throw await this.cleanupError('managed DSH worker failed', started);
228
+ })();
229
+ return this.closePromise;
230
+ }
231
+ async cleanupError(message, started, processGroup) {
232
+ const elapsedMs = Math.round(performance.now() - started);
233
+ const workerOutcome = { ...this.workerOutcome };
234
+ const group = processGroup ?? await this.groupObserver(this.workerPid, this.workerStartedAt);
235
+ return new ManagedDshCleanupError(message, {
236
+ schemaVersion: 'managed-dsh-cleanup.v2', role: this.cleanupRole,
237
+ workerPid: this.workerPid, elapsedMs, deadlineMs: this.cleanupDeadlineMs,
238
+ graceMs: this.graceMs, workerOutcome, processGroup: group,
239
+ });
240
+ }
241
+ }
242
+ export function createManagedDshRunPort(options) {
243
+ return new ManagedDshRunPort(options);
244
+ }
@@ -0,0 +1,24 @@
1
+ export const EMBEDDED_BOOKING_CAPABILITY_IDS = [
2
+ 'search-hotels',
3
+ 'refine-results',
4
+ 'find-room-offers',
5
+ 'compare-offers',
6
+ 'prepare-booking',
7
+ 'observe-booking',
8
+ ];
9
+ /** Closed registry. No booking/payment/write capability exists in this profile. */
10
+ export const embeddedBookingProfile = Object.freeze({
11
+ id: 'embedded-booking',
12
+ schemaVersion: 'booking.surface',
13
+ capabilities: Object.freeze([
14
+ Object.freeze({ id: 'search-hotels', effect: 'read', actions: Object.freeze(['search.patch', 'search.run']) }),
15
+ Object.freeze({ id: 'refine-results', effect: 'read', actions: Object.freeze(['results.view.patch', 'hotel.focus', 'hotel.select']) }),
16
+ Object.freeze({ id: 'find-room-offers', effect: 'read', actions: Object.freeze(['offers.query', 'offers.view.patch']) }),
17
+ Object.freeze({ id: 'compare-offers', effect: 'read', actions: Object.freeze(['offers.compare', 'offer.select']) }),
18
+ Object.freeze({ id: 'prepare-booking', effect: 'read', actions: Object.freeze(['offer.check', 'checkout.prepare']) }),
19
+ Object.freeze({ id: 'observe-booking', effect: 'read', actions: Object.freeze(['order.observe']) }),
20
+ ]),
21
+ });
22
+ export function actionsForEmbeddedCapability(id) {
23
+ return embeddedBookingProfile.capabilities.find((capability) => capability.id === id)?.actions ?? [];
24
+ }