@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,38 @@
1
+ /**
2
+ * LLM_MODEL 会话面覆盖(issue #77)。
3
+ *
4
+ * dsh settings 分层:schema 默认 < composition 配置(cordis patch)< 用户层
5
+ *(~/.dsh/settings.yaml)。bin/gotry-inner.js 已把 LLM_MODEL 注入 composition
6
+ * 层(agent-default-model 默认模型 + llm-deepseek 目录),但用户在 dsh web UI
7
+ * 选过模型时,用户层压过 composition 层——单靠 patch,.env 承诺仍落空。
8
+ *
9
+ * 这里在 agent/request 瀑布(dsh-agent-loop 每次发起 LLM 请求前解析
10
+ * provider/model 的闸口,dsh-agent installModelSelection 也在此处施加选择)挂
11
+ * 监听,post-next 覆盖 provider/model:本插件随 cordis patch 在根组装载,先于
12
+ * 任何 agent 创建;瀑布按注册序嵌套(先注册 = 最外层,post-next 最后生效),
13
+ * 因此显式 .env 意图压过一切持久层选择。内存态零持久化,进程退即散,不改写
14
+ * 用户 ~/.dsh 设置。
15
+ *
16
+ * GOTRY_LLM_MODEL 未设置时不挂监听:默认路径(组合配置或用户 web 设置)面不变。
17
+ *
18
+ * @module gotry/capabilities/model-override
19
+ */
20
+ export const MODEL_OVERRIDE_ENV = 'GOTRY_LLM_MODEL';
21
+ /**
22
+ * 挂载模型覆盖;返回是否实际挂载(未设环境变量或 ctx 无事件总线时为 false)。
23
+ * provider 固定 deepseek-official:llm-deepseek 是 gotry 组合里唯一持有
24
+ * DEEPSEEK_API_KEY/DEEPSEEK_BASE_URL 映射凭证的 provider 路由。
25
+ */
26
+ export function installModelOverride(ctx, env = process.env) {
27
+ const model = env[MODEL_OVERRIDE_ENV];
28
+ if (!model || typeof ctx.on !== 'function')
29
+ return false;
30
+ ctx.on('agent/request', async (_payload, next) => {
31
+ const resolved = await next();
32
+ // 与 installModelSelection 同语义:选中项无 effort 时清掉继承值,回落
33
+ // provider 默认推理档——不把上一个模型的 effort 错配到被覆盖的模型上
34
+ const { reasoningEffort: _inherited, ...rest } = resolved;
35
+ return { ...rest, provider: 'deepseek-official', model };
36
+ });
37
+ return true;
38
+ }
@@ -1,33 +1,46 @@
1
+ /**
2
+ * OpenSky 实时观测桥(免费匿名,~400 credits/天,~4 req/s burst):
3
+ * 查某 callsign 的飞机是否在 ADS-B 网络的当前观测里——航线层的实时印证。
4
+ *
5
+ * 契约(与 weather.ts / hbcli.ts 同构):
6
+ * - 永不抛错:网络失败/超时/解析失败一律降级返回;
7
+ * - 三值语义:命中=强肯定;查空≠证伪(ADS-B 覆盖有限,降权不排除);服务不可用=无结论;
8
+ * - 证据链:成功 [实时API:opensky@ts];失败 [实时API:opensky@error@ts]。
9
+ *
10
+ * 接口面(2026-08 实际可达,匿名路径):
11
+ * GET /api/states/all — 当前全球 ADS-B 状态,~10000 架
12
+ * GET /api/states/all?icao24=<hex> — 单飞机
13
+ * /api/flights/airport 历史查 = 需鉴权(匿名 403)
14
+ *
15
+ * 数据意义:与 OpenFlights 骨架(通航性)+ 静态班次包(班期时刻) 三值互补——
16
+ * OpenFlights = 历史上是否通航过(offline)
17
+ * flights_2026.json = 调研估算的班次时刻
18
+ * OpenSky = 该 callsign 的飞机「现在」是否在观测网络里(实时刻正飞)
19
+ *
20
+ * v0.0.1-rc.3 +: 之前是 scripts/opensky-check.ts 一次性 CLI(M2 时设计为 7 天窗
21
+ * 历史校验,但匿名路径实际不可达),现升级为能力层封装 + dsh 插件工具。
22
+ */
1
23
  const BASE = 'https://opensky-network.org/api';
2
24
  async function fetchOpenSky(url, timeoutMs) {
3
25
  const ctrl = new AbortController();
4
- const timer = setTimeout(()=>ctrl.abort(), timeoutMs);
26
+ const timer = setTimeout(() => ctrl.abort(), timeoutMs);
5
27
  try {
6
28
  const res = await fetch(url, {
7
29
  signal: ctrl.signal,
8
- headers: {
9
- Accept: 'application/json',
10
- 'User-Agent': 'gotry/0.0.1-rc.3 (+https://github.com/Danceiny/gotry)'
11
- }
30
+ headers: { Accept: 'application/json', 'User-Agent': 'gotry/0.0.1-rc.3 (+https://github.com/Danceiny/gotry)' },
12
31
  });
13
- if (!res.ok) return {
14
- ok: false,
15
- error: `opensky HTTP ${res.status}${res.status === 429 ? ' (rate limited, 400 credits/day anonymous)' : ''}`
16
- };
17
- return {
18
- ok: true,
19
- data: await res.json()
20
- };
21
- } catch (e) {
22
- return {
23
- ok: false,
24
- error: e.message.slice(0, 200)
25
- };
26
- } finally{
32
+ if (!res.ok)
33
+ return { ok: false, error: `opensky HTTP ${res.status}${res.status === 429 ? ' (rate limited, 400 credits/day anonymous)' : ''}` };
34
+ return { ok: true, data: await res.json() };
35
+ }
36
+ catch (e) {
37
+ return { ok: false, error: e.message.slice(0, 200) };
38
+ }
39
+ finally {
27
40
  clearTimeout(timer);
28
41
  }
29
42
  }
30
- const upper = (s)=>s.trim().toUpperCase();
43
+ const upper = (s) => s.trim().toUpperCase();
31
44
  export async function verifyFlight(query) {
32
45
  const started = Date.now();
33
46
  const ts = new Date().toISOString();
@@ -38,37 +51,35 @@ export async function verifyFlight(query) {
38
51
  if (!r.ok) {
39
52
  return {
40
53
  verdict: 'unavailable',
41
- callsign: cs,
42
- airport,
43
- sampleSize: 0,
44
- hits: [],
54
+ callsign: cs, airport,
55
+ sampleSize: 0, hits: [],
45
56
  evidence: `[实时API:opensky@error@${ts}] ${r.error}`,
46
57
  via: 'opensky-error',
47
- latencyMs,
48
- error: r.error
58
+ latencyMs, error: r.error,
49
59
  };
50
60
  }
61
+ // /api/states/all → { time, states: Array<17 元素数组> }
62
+ // [0 icao24, 1 callsign, 2 origin_country, 3 time_position, 4 last_contact,
63
+ // 5 lon, 6 lat, 7 baro_altitude, 8 on_ground, ...]
51
64
  const rawStates = (r.data ?? {}).states ?? [];
52
- const observed = rawStates.filter((row)=>(row[1] ?? '').trim().toUpperCase().includes(cs)).map((row)=>({
53
- icao24: String(row[0] ?? ''),
54
- callsign: (row[1] ?? '').trim() || null,
55
- lastSeen: Number(row[4] ?? 0),
56
- firstSeen: Number(row[4] ?? 0),
57
- estArrivalAirport: airport
58
- }));
65
+ const observed = rawStates
66
+ .filter(row => (row[1] ?? '').trim().toUpperCase().includes(cs))
67
+ .map(row => ({
68
+ icao24: String(row[0] ?? ''),
69
+ callsign: (row[1] ?? '').trim() || null,
70
+ lastSeen: Number(row[4] ?? 0),
71
+ firstSeen: Number(row[4] ?? 0),
72
+ estArrivalAirport: airport,
73
+ }));
59
74
  const verdict = observed.length > 0 ? 'observed' : 'not_observed';
60
- const evidence = observed.length > 0 ? `[实时API:opensky@${ts}] ✅ 全球 ADS-B 当前观测命中 ${cs} (${observed.length} 架)` : `[实时API:opensky@${ts}] ○ 当前 ADS-B 全球观测列表未见 ${cs}(ADS-B 覆盖有限,不作否定结论)`;
75
+ const evidence = observed.length > 0
76
+ ? `[实时API:opensky@${ts}] ✅ 全球 ADS-B 当前观测命中 ${cs} (${observed.length} 架)`
77
+ : `[实时API:opensky@${ts}] ○ 当前 ADS-B 全球观测列表未见 ${cs}(ADS-B 覆盖有限,不作否定结论)`;
61
78
  return {
62
- verdict,
63
- callsign: cs,
64
- airport,
79
+ verdict, callsign: cs, airport,
65
80
  sampleSize: rawStates.length,
66
- hits: observed,
67
- evidence,
81
+ hits: observed, evidence,
68
82
  via: 'opensky',
69
- latencyMs
83
+ latencyMs,
70
84
  };
71
85
  }
72
-
73
-
74
- //# sourceURL=/Users/bytedance/work/gotry/ts/capabilities/opensky.ts
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Provider fault-detail sanitizer (shared, pure, zero imports).
3
+ *
4
+ * A provider's failure text is a LABEL for operators, never a channel for a
5
+ * provider response body. Any string that may reach the evidence/verdict surface
6
+ * passes through `sanitizeFaultDetail` first: markup, credential assignments and
7
+ * URLs are redacted, whitespace is collapsed, and the result is length-bounded.
8
+ * `faultDetailLeak` is the mechanical check a gate (or a test) can run over a
9
+ * string that is about to be exposed.
10
+ *
11
+ * Extracted so that exactly one implementation serves both
12
+ * `ts/capabilities/route-provider-conformance.ts` (the #429 conformance gate,
13
+ * which re-exports it) and `ts/capabilities/ground-transfer.ts` (the live
14
+ * product path, issue #429 GAP-429-3 fix). Keeping it in its own file means the
15
+ * conformance gate itself stays free of product callers.
16
+ *
17
+ * Deliberately pure: zero imports, zero IO, zero network, zero clock.
18
+ *
19
+ * @module capabilities/provider-detail-sanitize
20
+ */
21
+ /** Default bound for a provider fragment embedded in a gate refusal. */
22
+ export const FAULT_DETAIL_MAX_CHARS = 120;
23
+ const DETAIL_SCRUB_PATTERNS = [
24
+ { re: /<[^>]*>/g, label: 'markup' },
25
+ { re: /\b(?:cookie|set-cookie|authorization|api[_-]?key|token|secret|password|passwd|sid)\s*[:=]\s*\S+/gi, label: 'credential' },
26
+ { re: /\bbearer\s+[A-Za-z0-9._-]{8,}/gi, label: 'credential' },
27
+ { re: /https?:\/\/\S+/gi, label: 'url' },
28
+ ];
29
+ /**
30
+ * Sanitize a provider fault detail.
31
+ *
32
+ * `maxChars` lets a caller keep its own historical bound (ground-transfer keeps
33
+ * 400 so no existing `fallbackReason` text changes); `emptyPlaceholder` lets a
34
+ * caller keep its own historical empty-case wording.
35
+ */
36
+ export function sanitizeFaultDetail(detail, options) {
37
+ const maxChars = options?.maxChars ?? FAULT_DETAIL_MAX_CHARS;
38
+ const placeholder = options?.emptyPlaceholder ?? '(no detail)';
39
+ let text = typeof detail === 'string' ? detail : '';
40
+ for (const { re, label } of DETAIL_SCRUB_PATTERNS)
41
+ text = text.replace(re, `[${label}-redacted]`);
42
+ text = text.replace(/\s+/g, ' ').trim();
43
+ if (text.length > maxChars)
44
+ text = `${text.slice(0, maxChars - 1)}…`;
45
+ return text === '' ? placeholder : text;
46
+ }
47
+ /**
48
+ * Mechanical leak check for any string about to reach the evidence surface.
49
+ *
50
+ * Shape-only by design: it looks for provider-response-body tells (markup,
51
+ * credential assignments, URLs) and deliberately does NOT bound length — the
52
+ * length bound belongs to `sanitizeFaultDetail`, which caps the PROVIDER
53
+ * fragment, whereas a gate's own refusal explanation is host-authored prose and
54
+ * may legitimately be longer.
55
+ */
56
+ export function faultDetailLeak(detail) {
57
+ if (/<[^>]*>/.test(detail))
58
+ return 'fault detail carries markup (a provider response body must never reach the evidence surface)';
59
+ if (/\b(?:cookie|authorization|api[_-]?key|token|secret|password|passwd|sid)\s*[:=]\s*\S+/i.test(detail))
60
+ return 'fault detail carries a credential assignment';
61
+ if (/https?:\/\//i.test(detail))
62
+ return 'fault detail carries a URL';
63
+ return null;
64
+ }
@@ -0,0 +1,191 @@
1
+ /**
2
+ * 外部依赖韧性原语(issue #16 采纳,ADR-18):effect_interpreter.v1 解译器层的横切面。
3
+ *
4
+ * 对外通道的三类故障形态在此归一一处,能力层 handler(永不抛错契约)零改写:
5
+ * - 指数退避重试 withRetry:只对「瞬时类失败」按策略重试,不改变单次失败语义;
6
+ * - 断路器 CircuitBreaker:closed→open→half-open,连续失败达阈值即熔断,
7
+ * 冷却后放行单探测——保护配额与上游,拒绝也是显式结构化观察(不抛错);
8
+ *
9
+ * 策略边界(issue #16 三个解译器主张在本仓的保守落法,详见 docs/design/effect-interpreter.md):
10
+ * - 重试只属于被判定「值得重试」的瞬时失败;风控/挑战/限流类上游明确说「不」的
11
+ * 失败(如 FlyAI Sentinel)永不重试——重试是放大器,不是修复器;
12
+ * - 断路器状态是进程内瞬态(同 session-search 节律闸的先例),重启即重置;
13
+ * 不把瞬态熔断写盘成持久资产。
14
+ */
15
+ /** 第 failedAttempt 次失败后的等待时长(纯函数,单测锁定 500→1000→2000 封顶链) */
16
+ export function backoffDelayMs(policy, failedAttempt) {
17
+ const raw = policy.baseDelayMs * 2 ** (Math.max(1, failedAttempt) - 1);
18
+ return Math.min(raw, policy.maxDelayMs);
19
+ }
20
+ const defaultSleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
21
+ /**
22
+ * 带指数退避的受控重试:handler 本身永不抛错(能力层契约),这里兼容抛错的
23
+ * 「裸调用方」——异常按 isRetryable(result=null, error) 判定后并入同一计数。
24
+ * 重试只针对瞬时失败;上限到点即返回最后结果,永不向上抛。
25
+ */
26
+ export async function withRetry(fn, policy, onBackoff) {
27
+ const sleep = policy.sleep ?? defaultSleep;
28
+ const maxAttempts = Math.max(1, policy.maxAttempts);
29
+ let attempts = 0;
30
+ let backoffMs = 0;
31
+ const abortableSleep = (ms) => {
32
+ const signal = policy.signal;
33
+ if (signal?.aborted)
34
+ return Promise.resolve('aborted');
35
+ // The injected sleep is part of the retry contract. Keep its rejection
36
+ // visible to callers, while making an abort win the race and consuming a
37
+ // later rejection so cancellation cannot create an unhandled rejection.
38
+ if (!signal)
39
+ return sleep(ms).then(() => 'slept');
40
+ return new Promise((resolve, reject) => {
41
+ let settled = false;
42
+ let timer;
43
+ const cleanup = () => signal.removeEventListener('abort', onAbort);
44
+ const finish = (outcome) => {
45
+ if (settled)
46
+ return;
47
+ settled = true;
48
+ if (timer !== undefined)
49
+ clearTimeout(timer);
50
+ cleanup();
51
+ resolve(outcome);
52
+ };
53
+ const onAbort = () => finish('aborted');
54
+ const onSleepResolved = () => finish('slept');
55
+ const onSleepRejected = (error) => {
56
+ if (settled)
57
+ return;
58
+ settled = true;
59
+ cleanup();
60
+ reject(error);
61
+ };
62
+ signal.addEventListener('abort', onAbort, { once: true });
63
+ if (policy.sleep) {
64
+ void Promise.resolve().then(() => policy.sleep(ms)).then(onSleepResolved, onSleepRejected);
65
+ }
66
+ else {
67
+ timer = setTimeout(onSleepResolved, ms);
68
+ }
69
+ });
70
+ };
71
+ for (;;) {
72
+ if (policy.signal?.aborted) {
73
+ return { result: null, error: null, attempts, backoffMs, aborted: true };
74
+ }
75
+ attempts += 1;
76
+ let result = null;
77
+ let error = null;
78
+ try {
79
+ result = await fn();
80
+ }
81
+ catch (e) {
82
+ error = e;
83
+ }
84
+ if (policy.signal?.aborted) {
85
+ return { result: null, error, attempts, backoffMs, aborted: true };
86
+ }
87
+ const retryable = policy.isRetryable?.(result, error)
88
+ ?? (error != null || result?.ok === false);
89
+ if (attempts < maxAttempts && retryable) {
90
+ const delay = backoffDelayMs(policy, attempts);
91
+ onBackoff?.(attempts, delay);
92
+ backoffMs += delay;
93
+ if (await abortableSleep(delay) === 'aborted') {
94
+ return { result: null, error, attempts, backoffMs, aborted: true };
95
+ }
96
+ continue;
97
+ }
98
+ return { result, error, attempts, backoffMs, aborted: false };
99
+ }
100
+ }
101
+ /**
102
+ * 断路器(每效应一个实例):
103
+ * closed 常态放行;连续失败达 failureThreshold → open;
104
+ * open 拒绝(new attempts=0,.fail-fast 保护上游/配额);冷却满 openMs → half-open;
105
+ * half-open 仅放行单个探测:onSuccess → closed 清零;onFailure → 重新 open(冷却重启)。
106
+ * 「失败」按效应的 isFailure 语义计数(一次调用一次计数,重试耗尽才计,非每 attempt)。
107
+ */
108
+ export class CircuitBreaker {
109
+ o;
110
+ consecutiveFailures = 0;
111
+ openedAt = 0;
112
+ generation = 0;
113
+ nextTokenId = 0;
114
+ probeToken = null;
115
+ constructor(o) {
116
+ this.o = o;
117
+ }
118
+ threshold() {
119
+ return Math.max(1, this.o.failureThreshold);
120
+ }
121
+ now() {
122
+ return (this.o.now ?? Date.now)();
123
+ }
124
+ state() {
125
+ if (this.openedAt > 0 && this.now() - this.openedAt >= this.o.openMs)
126
+ return 'half-open';
127
+ if (this.openedAt > 0)
128
+ return 'open';
129
+ return 'closed';
130
+ }
131
+ /** 发起一次调用前问闸:open 回 {allowed:false}(调用方须返回显式降级观察,不重试) */
132
+ canAttempt() {
133
+ const s = this.state();
134
+ if (s === 'closed')
135
+ return { allowed: true, state: s, token: this.makeToken(false) };
136
+ if (s === 'open')
137
+ return { allowed: false, state: s };
138
+ // half-open:单探测语义——已有探测在途拒其余并发
139
+ if (this.probeToken)
140
+ return { allowed: false, state: s };
141
+ this.generation += 1;
142
+ const token = this.makeToken(true);
143
+ this.probeToken = token;
144
+ return { allowed: true, state: s, token };
145
+ }
146
+ /**
147
+ * half-open 探测被取消:仅令牌持有者释放所有权,不把 probe 永久卡死,
148
+ * 也不让旧 closed 调用或旧 generation 释放新探测。
149
+ */
150
+ releaseProbe(token) {
151
+ if (token?.probe !== true || this.probeToken !== token || this.state() !== 'half-open')
152
+ return;
153
+ this.probeToken = null;
154
+ this.generation += 1;
155
+ }
156
+ /** 一次解译调用成功(非 isFailure)——清零;half-open 探测成功即回 closed */
157
+ onSuccess(token) {
158
+ if (!this.owns(token))
159
+ return;
160
+ this.consecutiveFailures = 0;
161
+ this.openedAt = 0;
162
+ if (token?.probe === true || (!token && this.probeToken !== null)) {
163
+ this.probeToken = null;
164
+ this.generation += 1;
165
+ }
166
+ }
167
+ /** 一次解译调用失败(含重试耗尽)——半开探测失败 = 重新开闸 */
168
+ onFailure(token) {
169
+ if (!this.owns(token))
170
+ return;
171
+ if (token?.probe === true || (!token && this.probeToken !== null))
172
+ this.probeToken = null;
173
+ this.consecutiveFailures += 1;
174
+ if (this.openedAt > 0 || this.consecutiveFailures >= this.threshold()) {
175
+ this.openedAt = this.now();
176
+ this.generation += 1;
177
+ }
178
+ }
179
+ makeToken(probe) {
180
+ return Object.freeze({ generation: this.generation, probe, id: ++this.nextTokenId });
181
+ }
182
+ owns(token) {
183
+ // Keep the direct CircuitBreaker API backwards-compatible for callers
184
+ // that settle the currently active call without retaining its token.
185
+ if (!token)
186
+ return true;
187
+ if (token.probe)
188
+ return this.probeToken === token && this.state() === 'half-open';
189
+ return token.generation === this.generation && this.probeToken === null;
190
+ }
191
+ }