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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (507) hide show
  1. package/README.md +172 -219
  2. package/README.zh-CN.md +222 -0
  3. package/bin/gotry-backend.js +53 -0
  4. package/bin/gotry-booking-copilot.js +53 -0
  5. package/bin/gotry-bootstrap.js +1744 -0
  6. package/bin/gotry-inner.js +733 -83
  7. package/bin/gotry-process-liveness.d.ts +27 -0
  8. package/bin/gotry-process-liveness.js +97 -0
  9. package/bin/gotry-runtime-resolution.d.ts +27 -0
  10. package/bin/gotry-runtime-resolution.js +49 -0
  11. package/bin/gotry.js +1 -1
  12. package/client/client.js +203 -0
  13. package/cordis.gotry-patch.yml +80 -56
  14. package/data/airline-airports.json +39 -0
  15. package/data/stations-12306-verify.json +524 -0
  16. package/dist/capabilities/agent-reach-deep.js +45 -122
  17. package/dist/capabilities/agent-reach.js +101 -146
  18. package/dist/capabilities/anything.js +135 -94
  19. package/dist/capabilities/artifacts.js +370 -0
  20. package/dist/capabilities/channel-health.js +131 -0
  21. package/dist/capabilities/channel-registry.js +256 -0
  22. package/dist/capabilities/doctor.js +546 -0
  23. package/dist/capabilities/effect.js +394 -0
  24. package/dist/capabilities/external-event.js +149 -0
  25. package/dist/capabilities/fact-log.js +55 -0
  26. package/dist/capabilities/flyai-config.js +337 -0
  27. package/dist/capabilities/flyai.js +947 -110
  28. package/dist/capabilities/fx-contract.js +293 -0
  29. package/dist/capabilities/geo-atlas.js +246 -0
  30. package/dist/capabilities/ground-transfer.js +509 -0
  31. package/dist/capabilities/hbcli.js +260 -123
  32. package/dist/capabilities/hotelbyte-transaction.js +194 -0
  33. package/dist/capabilities/incident-log.js +131 -61
  34. package/dist/capabilities/itinerary-artifact.js +190 -0
  35. package/dist/capabilities/itinerary-deck-artifact.js +194 -0
  36. package/dist/capabilities/itinerary-deck-export.js +339 -0
  37. package/dist/capabilities/lavish-local.js +924 -0
  38. package/dist/capabilities/model-override.js +38 -0
  39. package/dist/capabilities/opensky.js +54 -43
  40. package/dist/capabilities/resilience.js +191 -0
  41. package/dist/capabilities/session/action-cache.js +50 -44
  42. package/dist/capabilities/session/adapters/ctrip-flight.js +120 -62
  43. package/dist/capabilities/session/adapters/ctrip-hotel.js +222 -0
  44. package/dist/capabilities/session/adapters/dida-portal.js +274 -0
  45. package/dist/capabilities/session/adapters/meituan-local.js +35 -54
  46. package/dist/capabilities/session/adapters/rail-12306.js +342 -0
  47. package/dist/capabilities/session/benchmark.js +189 -0
  48. package/dist/capabilities/session/bridge-ledger.js +224 -0
  49. package/dist/capabilities/session/extension-bridge.js +636 -0
  50. package/dist/capabilities/session/extension-channel.js +109 -0
  51. package/dist/capabilities/session/extension-distribution.js +230 -0
  52. package/dist/capabilities/session/extract.js +31 -21
  53. package/dist/capabilities/session/golden-score.js +114 -0
  54. package/dist/capabilities/session/health-watch.js +215 -0
  55. package/dist/capabilities/session/read-guard.js +75 -24
  56. package/dist/capabilities/session/static-flight-golden.js +150 -0
  57. package/dist/capabilities/session/transport.js +97 -83
  58. package/dist/capabilities/session/wizard.js +117 -0
  59. package/dist/capabilities/session-consent.js +178 -0
  60. package/dist/capabilities/session-login.js +170 -0
  61. package/dist/capabilities/session-search.js +635 -44
  62. package/dist/capabilities/spawn-bounded.js +203 -0
  63. package/dist/capabilities/sponsor-plugin.js +341 -0
  64. package/dist/capabilities/visa-policy.js +140 -0
  65. package/dist/capabilities/weather.js +243 -138
  66. package/dist/data/session-golden-20.json +25 -0
  67. package/dist/data/sf-golden-manifest.json +103 -0
  68. package/dist/data/sf-static-routes.json +91 -0
  69. package/dist/scripts/action-cache-tests.js +24 -59
  70. package/dist/scripts/agent-planning-turn-deadline-e2e.js +242 -0
  71. package/dist/scripts/agent-planning-turn-deadline-tests.js +185 -0
  72. package/dist/scripts/agent-reach-deep-tests.js +30 -40
  73. package/dist/scripts/agent-reach-error-tests.js +354 -0
  74. package/dist/scripts/agent-reach-tests.js +26 -18
  75. package/dist/scripts/agent-reach-wrapper-tests.js +50 -50
  76. package/dist/scripts/anything-tests.js +116 -60
  77. package/dist/scripts/artifact-client-contract-tests.js +220 -0
  78. package/dist/scripts/artifacts-capability-tests.js +727 -0
  79. package/dist/scripts/async-collect.js +50 -11
  80. package/dist/scripts/benchmark-environment-bridge-e2e.js +741 -0
  81. package/dist/scripts/benchmark-environment-bridge-tests.js +1452 -0
  82. package/dist/scripts/booking-copilot-availability-ledger-binding-tests.js +126 -0
  83. package/dist/scripts/booking-copilot-availability-policy-tests.js +265 -0
  84. package/dist/scripts/booking-copilot-bin-proof-tests.js +66 -0
  85. package/dist/scripts/booking-copilot-cleanup-proof-helper.js +76 -0
  86. package/dist/scripts/booking-copilot-crossrepo-fixture-server.js +144 -0
  87. package/dist/scripts/booking-copilot-dsh-core-proof-tests.js +424 -0
  88. package/dist/scripts/booking-copilot-dsh-planner-proof-tests.js +2839 -0
  89. package/dist/scripts/booking-copilot-dsh-plugin-proof-tests.js +309 -0
  90. package/dist/scripts/booking-copilot-dsh-readiness-proof.js +238 -0
  91. package/dist/scripts/booking-copilot-dsh-warmer-proof.js +123 -0
  92. package/dist/scripts/booking-copilot-event-sequence-concurrency-proof-tests.js +156 -0
  93. package/dist/scripts/booking-copilot-gap-code-contract-proof-tests.js +70 -0
  94. package/dist/scripts/booking-copilot-intent-proof-tests.js +422 -0
  95. package/dist/scripts/booking-copilot-operation-ledger-concurrency-proof-tests.js +184 -0
  96. package/dist/scripts/booking-copilot-planner-live-probe.js +95 -0
  97. package/dist/scripts/booking-copilot-proof-runtime.js +42 -0
  98. package/dist/scripts/booking-copilot-receipt-ledger-concurrency-proof-tests.js +210 -0
  99. package/dist/scripts/booking-copilot-runtime-proof-tests.js +2349 -0
  100. package/dist/scripts/booking-copilot-server-proof-tests.js +784 -0
  101. package/dist/scripts/booking-copilot-startup-proof-tests.js +94 -0
  102. package/dist/scripts/booking-executor-tests.js +80 -0
  103. package/dist/scripts/booking-recovery-chain-tests.js +182 -0
  104. package/dist/scripts/booking-saga-tests.js +125 -0
  105. package/dist/scripts/booking-surface-contract-proof-tests.js +212 -0
  106. package/dist/scripts/bootstrap-tests.js +1479 -0
  107. package/dist/scripts/bridge-events-tests.js +239 -0
  108. package/dist/scripts/bridge-ledger-tests.js +428 -0
  109. package/dist/scripts/build-changelog.js +238 -0
  110. package/dist/scripts/build-metrics-report.js +331 -0
  111. package/dist/scripts/changelog-tests.js +118 -0
  112. package/dist/scripts/channel-probe-tests.js +103 -0
  113. package/dist/scripts/channel-probe.js +169 -0
  114. package/dist/scripts/channel-registry-tests.js +208 -0
  115. package/dist/scripts/companion-tests.js +25 -70
  116. package/dist/scripts/dida-cookie-probe.js +87 -0
  117. package/dist/scripts/dida-runner-stop-tests.js +311 -0
  118. package/dist/scripts/dida-sw-probe.js +114 -0
  119. package/dist/scripts/diff-test.js +17 -12
  120. package/dist/scripts/doctor-tests.js +564 -0
  121. package/dist/scripts/dsh-artifact-e2e.js +279 -0
  122. package/dist/scripts/dsh-artifact-web-e2e.js +675 -0
  123. package/dist/scripts/dsh-http-proxy-sse-proof.js +90 -0
  124. package/dist/scripts/dsh-runtime-closure-tests.js +182 -0
  125. package/dist/scripts/dsh-runtime-closure.js +162 -0
  126. package/dist/scripts/dsh-session-v3-migration-proof.js +109 -0
  127. package/dist/scripts/dsh-subprocess-local-proof.js +150 -0
  128. package/dist/scripts/dsh-target-closure-proof.js +178 -0
  129. package/dist/scripts/effect-tests.js +539 -0
  130. package/dist/scripts/engine-run.js +1 -3
  131. package/dist/scripts/engine-tests.js +16 -10
  132. package/dist/scripts/evaluation-cadence-tests.js +174 -0
  133. package/dist/scripts/evaluation-contract-tests.js +268 -0
  134. package/dist/scripts/extension-distribution-cli.js +39 -0
  135. package/dist/scripts/extension-distribution-tests.js +443 -0
  136. package/dist/scripts/extension-tests.js +988 -0
  137. package/dist/scripts/external-event-tests.js +350 -0
  138. package/dist/scripts/fact-gate-tests.js +869 -0
  139. package/dist/scripts/fixtures/extension-bridge-unref-child.mjs +21 -0
  140. package/dist/scripts/flight-hotel-anchor-363-registered-e2e.js +169 -0
  141. package/dist/scripts/flight-malformed-tests.js +159 -0
  142. package/dist/scripts/flyai-setup-tests.js +228 -0
  143. package/dist/scripts/flyai-setup-tool-tests.js +54 -0
  144. package/dist/scripts/flyai-tests.js +692 -0
  145. package/dist/scripts/flyai-tool-registration-contract-tests.js +91 -0
  146. package/dist/scripts/fx-contract-tests.js +201 -0
  147. package/dist/scripts/g5-guard-tests.js +131 -0
  148. package/dist/scripts/g5-guard.js +189 -0
  149. package/dist/scripts/gen-lunar-anchors.js +106 -0
  150. package/dist/scripts/geo-atlas-tests.js +283 -0
  151. package/dist/scripts/gotry-backend-kernel-tests.js +206 -0
  152. package/dist/scripts/gotry-try-demo-tests.js +79 -0
  153. package/dist/scripts/gotry-try-demo.js +49 -0
  154. package/dist/scripts/ground-transfer-tests.js +956 -0
  155. package/dist/scripts/hbcli-e2e-tests.js +159 -0
  156. package/dist/scripts/hbcli-live-optin-tests.js +96 -0
  157. package/dist/scripts/hbcli-release-contract-tests.js +122 -0
  158. package/dist/scripts/hbcli-tests.js +121 -69
  159. package/dist/scripts/health-watch-cli.js +73 -0
  160. package/dist/scripts/hotel-date-gate-tests.js +496 -0
  161. package/dist/scripts/hotelbyte-reconcile-tests.js +141 -0
  162. package/dist/scripts/hotelbyte-spawn-e2e-tests.js +373 -0
  163. package/dist/scripts/i18n-tests.js +41 -0
  164. package/dist/scripts/incident-tests.js +281 -87
  165. package/dist/scripts/issue-194-job-id-guard-tests.js +106 -0
  166. package/dist/scripts/issue-233-cancel-refund-commission-tests.js +392 -0
  167. package/dist/scripts/issue-271-liveness-tests.js +569 -0
  168. package/dist/scripts/issue-289-model-retry-real-tests.js +296 -0
  169. package/dist/scripts/issue-289-model-retry-tests.js +441 -0
  170. package/dist/scripts/issue-289-web-retry-e2e.js +630 -0
  171. package/dist/scripts/issue-338-home-city-e2e.js +577 -0
  172. package/dist/scripts/issue343-real-entry-e2e.js +160 -0
  173. package/dist/scripts/issue436-persisted-routing-e2e.js +247 -0
  174. package/dist/scripts/itinerary-artifact-tests.js +368 -0
  175. package/dist/scripts/itinerary-deck-artifact-tests.js +416 -0
  176. package/dist/scripts/itinerary-deck-export-tests.js +552 -0
  177. package/dist/scripts/itinerary-deck-tests.js +435 -0
  178. package/dist/scripts/itinerary-html-tests.js +426 -0
  179. package/dist/scripts/journey-tests.js +22 -27
  180. package/dist/scripts/kernel-manifest-evidence.js +109 -0
  181. package/dist/scripts/kernel-manifest-gate.js +126 -0
  182. package/dist/scripts/kernel-manifest-tests.js +212 -0
  183. package/dist/scripts/kernel-manifest-trace-entry.js +7 -0
  184. package/dist/scripts/kernel-manifest-trace-hook.mjs +28 -0
  185. package/dist/scripts/kernel-manifest.js +369 -0
  186. package/dist/scripts/lavish-local-tests.js +1226 -0
  187. package/dist/scripts/lavish-product-tools-tests.js +537 -0
  188. package/dist/scripts/ledger-repair-apply-tests.js +316 -0
  189. package/dist/scripts/ledger-repair-plan-tests.js +375 -0
  190. package/dist/scripts/ledger-tests.js +382 -246
  191. package/dist/scripts/ledger-workflow-crash.js +10 -20
  192. package/dist/scripts/managed-dsh-cleanup-diagnostic-proof.js +184 -0
  193. package/dist/scripts/managed-dsh-close-failure-proof.js +172 -0
  194. package/dist/scripts/managed-dsh-run-port-proof.js +153 -0
  195. package/dist/scripts/managed-dsh-terminal-proof.js +252 -0
  196. package/dist/scripts/map-tools-vendor-package-proof.js +365 -0
  197. package/dist/scripts/memory-capture-tests.js +242 -61
  198. package/dist/scripts/memory-decay-tests.js +18 -52
  199. package/dist/scripts/memory-lifecycle-tests.js +657 -0
  200. package/dist/scripts/memory-lifecycle.js +196 -0
  201. package/dist/scripts/memory-metrics.js +24 -12
  202. package/dist/scripts/memory-value-report.js +631 -0
  203. package/dist/scripts/memory-value-tests.js +328 -0
  204. package/dist/scripts/metrics-report-tests.js +151 -0
  205. package/dist/scripts/model-override-e2e.js +137 -0
  206. package/dist/scripts/nightly-evidence-tests.js +161 -0
  207. package/dist/scripts/nightly-evidence.js +286 -0
  208. package/dist/scripts/nudge-digest.js +39 -28
  209. package/dist/scripts/observability-tests.js +381 -0
  210. package/dist/scripts/onboarding-tests.js +161 -0
  211. package/dist/scripts/opensky-check.js +18 -13
  212. package/dist/scripts/opensky-tests.js +28 -28
  213. package/dist/scripts/persona-surface-guard-tests.js +49 -0
  214. package/dist/scripts/pnpm-dsh-closure-proof.js +17 -0
  215. package/dist/scripts/policy-anchor-359-registered-e2e.js +214 -0
  216. package/dist/scripts/price-drift-tests.js +340 -0
  217. package/dist/scripts/price-drift-watch.js +447 -0
  218. package/dist/scripts/probe-poi-tests.js +53 -45
  219. package/dist/scripts/product-metrics.js +483 -0
  220. package/dist/scripts/publish-preverify.js +110 -0
  221. package/dist/scripts/realtime-pricing-tests.js +76 -0
  222. package/dist/scripts/recall-tests.js +513 -0
  223. package/dist/scripts/replay-async.js +20 -18
  224. package/dist/scripts/replay-real.js +18 -18
  225. package/dist/scripts/replay.js +52 -82
  226. package/dist/scripts/session-attach-diagnose.js +20 -20
  227. package/dist/scripts/session-attach-poc.js +34 -37
  228. package/dist/scripts/session-benchmark.js +180 -0
  229. package/dist/scripts/session-dida-live-e2e.js +199 -0
  230. package/dist/scripts/session-extract-tests.js +14 -35
  231. package/dist/scripts/session-link-tests.js +478 -0
  232. package/dist/scripts/session-login.js +27 -46
  233. package/dist/scripts/session-tests.js +796 -96
  234. package/dist/scripts/session-zones-tests.js +358 -0
  235. package/dist/scripts/sf-live-benchmark.js +367 -0
  236. package/dist/scripts/sf-live-challenge-stop-tests.js +453 -0
  237. package/dist/scripts/sf-live-cli-tests.js +92 -0
  238. package/dist/scripts/sf-live-options.js +46 -0
  239. package/dist/scripts/sf-manifest-tests.js +30 -0
  240. package/dist/scripts/sf-manifest.js +33 -0
  241. package/dist/scripts/sf-soft-score-tests.js +67 -0
  242. package/dist/scripts/sf-summary-tests.js +324 -0
  243. package/dist/scripts/sf-summary.js +525 -0
  244. package/dist/scripts/share-tests.js +432 -0
  245. package/dist/scripts/skeleton-check.js +16 -14
  246. package/dist/scripts/skeleton-integration-test.js +28 -11
  247. package/dist/scripts/skills-contract-tests.js +51 -46
  248. package/dist/scripts/smoke-session-gate-tests.js +21 -0
  249. package/dist/scripts/smoke.js +690 -246
  250. package/dist/scripts/spawn-bounded-abort-tests.js +241 -0
  251. package/dist/scripts/sponsor-reuse-tests.js +262 -0
  252. package/dist/scripts/state-cli-tests.js +226 -101
  253. package/dist/scripts/state-cli.js +550 -199
  254. package/dist/scripts/state-repair-cli.js +66 -0
  255. package/dist/scripts/state-repair-tests.js +140 -0
  256. package/dist/scripts/static-golden-tests.js +165 -0
  257. package/dist/scripts/time-eval-tests.js +210 -192
  258. package/dist/scripts/travel-timeline-tests.js +29 -93
  259. package/dist/scripts/turn-handoff-collect-tests.js +169 -0
  260. package/dist/scripts/turn-handoff-collect.js +161 -0
  261. package/dist/scripts/turn-policy-tests.js +55 -0
  262. package/dist/scripts/typed-contract-canary.js +176 -0
  263. package/dist/scripts/tz-resolver-sanity.js +50 -0
  264. package/dist/scripts/tz-resolver-tests.js +584 -0
  265. package/dist/scripts/unified-tests.js +23 -19
  266. package/dist/scripts/visa-policy-tests.js +62 -0
  267. package/dist/scripts/weather-tests.js +276 -41
  268. package/dist/scripts/wish-channel-gate-tests.js +54 -0
  269. package/dist/scripts/write-gate-tests.js +522 -0
  270. package/dist/scripts/z3-lifecycle-fault-tests.js +188 -0
  271. package/dist/scripts/z3-lifecycle-tests.js +170 -0
  272. package/dist/scripts/z3-race-repeat-tests.js +39 -0
  273. package/dist/scripts/z3-race-tests.js +41 -0
  274. package/dist/src/artifact-gate.js +829 -0
  275. package/dist/src/backend/kernel.js +91 -0
  276. package/dist/src/backend/modules/booking-copilot.js +92 -0
  277. package/dist/src/backend/modules/booking-executor.js +124 -0
  278. package/dist/src/backend/modules/session-search.js +551 -0
  279. package/dist/src/benchmark-agent-conformance.js +578 -0
  280. package/dist/src/benchmark-environment-bridge.js +515 -0
  281. package/dist/src/benchmark-headless-child-diagnostics.js +166 -0
  282. package/dist/src/benchmark-tool-isolation.js +151 -0
  283. package/dist/src/bookable-facts.js +533 -0
  284. package/dist/src/booking-saga.js +97 -0
  285. package/dist/src/booking-surface/availability-policy.js +697 -0
  286. package/dist/src/booking-surface/booking-intent.js +43 -0
  287. package/dist/src/booking-surface/cancel-refund-commission.js +379 -0
  288. package/dist/src/booking-surface/canonical-schema.js +116 -0
  289. package/dist/src/booking-surface/contracts.js +75 -0
  290. package/dist/src/booking-surface/dsh-planner.js +1854 -0
  291. package/dist/src/booking-surface/dsh-plugin.js +378 -0
  292. package/dist/src/booking-surface/dsh-worker.js +98 -0
  293. package/dist/src/booking-surface/error-codes.js +231 -0
  294. package/dist/src/booking-surface/index.js +9 -0
  295. package/dist/src/booking-surface/managed-dsh-cleanup-diagnostic.js +97 -0
  296. package/dist/src/booking-surface/managed-dsh-run-port.js +244 -0
  297. package/dist/src/booking-surface/profile.js +24 -0
  298. package/dist/src/booking-surface/recovery-chain.js +367 -0
  299. package/dist/src/booking-surface/runtime.js +1968 -0
  300. package/dist/src/booking-surface/server.js +674 -0
  301. package/dist/src/booking-surface/startup.js +168 -0
  302. package/dist/src/booking-surface/validation.js +261 -0
  303. package/dist/src/bridge.js +20 -13
  304. package/dist/src/companions.js +48 -74
  305. package/dist/src/contracts.js +21 -43
  306. package/dist/src/dsh-llm.js +97 -111
  307. package/dist/src/engine.js +276 -193
  308. package/dist/src/evaluation-cadence.js +97 -0
  309. package/dist/src/evaluation-contracts.js +283 -0
  310. package/dist/src/flight-pack-adapter.js +54 -0
  311. package/dist/src/flight-pack-contract.js +2 -0
  312. package/dist/src/flyai-setup-tool.js +70 -0
  313. package/dist/src/gotry-backend.js +125 -0
  314. package/dist/src/hotel-date-gate.js +118 -0
  315. package/dist/src/i18n.js +88 -0
  316. package/dist/src/index.js +2227 -882
  317. package/dist/src/itinerary-deck.js +139 -0
  318. package/dist/src/itinerary-doc-shared.js +661 -0
  319. package/dist/src/itinerary-html.js +131 -0
  320. package/dist/src/journey.js +155 -108
  321. package/dist/src/lavish-tools.js +400 -0
  322. package/dist/src/ledger-repair-apply.js +538 -0
  323. package/dist/src/ledger-repair-plan.js +463 -0
  324. package/dist/src/loop.js +319 -160
  325. package/dist/src/memory-capture.js +180 -32
  326. package/dist/src/memory-decay.js +30 -14
  327. package/dist/src/memory-lifecycle.js +1310 -0
  328. package/dist/src/memory-utility.js +27 -40
  329. package/dist/src/mock-llm.js +36 -61
  330. package/dist/src/model.js +81 -36
  331. package/dist/src/realtime-pricing.js +103 -0
  332. package/dist/src/recall/card.js +74 -0
  333. package/dist/src/recall/evaluator.js +140 -0
  334. package/dist/src/recall/integration.js +17 -0
  335. package/dist/src/recall/tick.js +166 -0
  336. package/dist/src/session-link/plan-it-action.js +48 -0
  337. package/dist/src/session-link/session-link.js +248 -0
  338. package/dist/src/session-zones.js +507 -0
  339. package/dist/src/share/adapters.js +51 -0
  340. package/dist/src/share/share-consent.js +76 -0
  341. package/dist/src/share/share-deck.js +58 -0
  342. package/dist/src/share/share-token.js +146 -0
  343. package/dist/src/slot-spec.js +84 -106
  344. package/dist/src/state-ledger.js +435 -516
  345. package/dist/src/state-repair.js +299 -0
  346. package/dist/src/subagent-job-id-guard.js +58 -0
  347. package/dist/src/time-anchor.js +231 -33
  348. package/dist/src/tool-packet.js +20 -8
  349. package/dist/src/travel-slots.js +58 -35
  350. package/dist/src/travel-timeline.js +44 -63
  351. package/dist/src/turn-deadline.js +287 -0
  352. package/dist/src/turn-policy.js +118 -0
  353. package/dist/src/tz-resolver.js +143 -0
  354. package/dist/src/unified.js +535 -359
  355. package/dist/src/wish-pool.js +42 -12
  356. package/dist/src/write-gate.js +495 -0
  357. package/dist/src/z3-shared.js +284 -0
  358. package/extension/README.md +21 -0
  359. package/extension/README.zh-CN.md +21 -0
  360. package/extension/background.js +463 -0
  361. package/extension/content-bridge.js +270 -0
  362. package/extension/content-main.js +111 -0
  363. package/extension/manifest.json +60 -0
  364. package/package.json +407 -14
  365. package/schemas/booking.intent.schema.json +193 -0
  366. package/schemas/booking.surface.schema.json +2622 -0
  367. package/ts/capabilities/agent-reach-deep.ts +114 -0
  368. package/ts/capabilities/agent-reach.ts +198 -0
  369. package/ts/capabilities/anything.ts +255 -0
  370. package/ts/capabilities/artifacts.ts +428 -0
  371. package/ts/capabilities/fact-log.ts +54 -0
  372. package/ts/capabilities/flyai-config.ts +388 -0
  373. package/ts/capabilities/flyai.ts +1274 -0
  374. package/ts/capabilities/hbcli.ts +253 -71
  375. package/ts/capabilities/incident-log.ts +88 -59
  376. package/ts/capabilities/itinerary-artifact.ts +214 -0
  377. package/ts/capabilities/itinerary-deck-artifact.ts +218 -0
  378. package/ts/capabilities/itinerary-deck-export.ts +378 -0
  379. package/ts/capabilities/opensky.ts +121 -0
  380. package/ts/capabilities/session/action-cache.ts +148 -0
  381. package/ts/capabilities/session/adapters/ctrip-flight.ts +181 -0
  382. package/ts/capabilities/session/adapters/ctrip-hotel.ts +238 -0
  383. package/ts/capabilities/session/adapters/dida-portal.ts +338 -0
  384. package/ts/capabilities/session/adapters/meituan-local.ts +70 -0
  385. package/ts/capabilities/session/adapters/rail-12306.ts +392 -0
  386. package/ts/capabilities/session/benchmark.ts +276 -0
  387. package/ts/capabilities/session/bridge-ledger.ts +333 -0
  388. package/ts/capabilities/session/extension-bridge.ts +794 -0
  389. package/ts/capabilities/session/extension-channel.ts +144 -0
  390. package/ts/capabilities/session/extension-distribution.ts +266 -0
  391. package/ts/capabilities/session/extract.ts +54 -0
  392. package/ts/capabilities/session/golden-score.ts +139 -0
  393. package/ts/capabilities/session/health-watch.ts +264 -0
  394. package/ts/capabilities/session/read-guard.ts +141 -0
  395. package/ts/capabilities/session/static-flight-golden.ts +209 -0
  396. package/ts/capabilities/session/transport.ts +146 -0
  397. package/ts/capabilities/session/wizard.ts +140 -0
  398. package/ts/capabilities/session-consent.ts +211 -0
  399. package/ts/capabilities/session-login.ts +208 -0
  400. package/ts/capabilities/session-search.ts +893 -0
  401. package/ts/capabilities/weather.ts +330 -0
  402. package/ts/dsh-runtime/vendor/README.md +68 -0
  403. package/ts/dsh-runtime/vendor/dsh-map-tools/LICENSE +21 -0
  404. package/ts/dsh-runtime/vendor/dsh-map-tools/README.en.md +405 -0
  405. package/ts/dsh-runtime/vendor/dsh-map-tools/README.md +404 -0
  406. package/ts/dsh-runtime/vendor/dsh-map-tools/client/client.js +1584 -0
  407. package/ts/dsh-runtime/vendor/dsh-map-tools/cordis.patch.yml +5 -0
  408. package/ts/dsh-runtime/vendor/dsh-map-tools/icon.svg +5 -0
  409. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/clients/amap.js +595 -0
  410. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/clients/nominatim.js +63 -0
  411. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/clients/osrm.js +58 -0
  412. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/clients/photon.js +55 -0
  413. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/config-file.js +87 -0
  414. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/config-route.js +131 -0
  415. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/config.js +16 -0
  416. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/geo.js +232 -0
  417. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/index.js +120 -0
  418. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/settings-ns.js +40 -0
  419. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/staticmap-route.js +115 -0
  420. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/tools/geocode.js +127 -0
  421. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/tools/poi.js +84 -0
  422. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/tools/routes.js +267 -0
  423. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/clients/amap.d.ts +90 -0
  424. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/clients/nominatim.d.ts +17 -0
  425. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/clients/osrm.d.ts +15 -0
  426. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/clients/photon.d.ts +22 -0
  427. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/config-file.d.ts +33 -0
  428. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/config-route.d.ts +23 -0
  429. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/config.d.ts +23 -0
  430. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/geo.d.ts +61 -0
  431. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/index.d.ts +18 -0
  432. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/settings-ns.d.ts +14 -0
  433. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/staticmap-route.d.ts +31 -0
  434. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/tools/geocode.d.ts +11 -0
  435. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/tools/poi.d.ts +9 -0
  436. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/tools/routes.d.ts +75 -0
  437. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/types.d.ts +68 -0
  438. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types.js +16 -0
  439. package/ts/dsh-runtime/vendor/dsh-map-tools/package.json +97 -0
  440. package/ts/package.json +293 -3
  441. package/ts/scripts/async-collect.ts +91 -0
  442. package/ts/scripts/map-tools-vendor-package-proof.ts +404 -0
  443. package/ts/scripts/skeleton-check.ts +1 -1
  444. package/ts/scripts/skeleton-integration-test.ts +23 -1
  445. package/ts/scripts/state-cli.ts +568 -0
  446. package/ts/scripts/turn-handoff-collect.ts +178 -0
  447. package/ts/src/artifact-gate.ts +991 -0
  448. package/ts/src/benchmark-agent-conformance.ts +619 -0
  449. package/ts/src/benchmark-environment-bridge.ts +538 -0
  450. package/ts/src/benchmark-headless-child-diagnostics.ts +184 -0
  451. package/ts/src/benchmark-tool-isolation.ts +166 -0
  452. package/ts/src/bookable-facts.ts +837 -0
  453. package/ts/src/booking-saga.ts +133 -0
  454. package/ts/src/booking-surface/availability-policy.ts +522 -0
  455. package/ts/src/booking-surface/booking-intent.ts +86 -0
  456. package/ts/src/booking-surface/cancel-refund-commission.ts +488 -0
  457. package/ts/src/booking-surface/canonical-schema.js +116 -0
  458. package/ts/src/booking-surface/contracts.ts +475 -0
  459. package/ts/src/booking-surface/dsh-planner.ts +1949 -0
  460. package/ts/src/booking-surface/dsh-plugin.js +378 -0
  461. package/ts/src/booking-surface/dsh-worker.ts +110 -0
  462. package/ts/src/booking-surface/error-codes.ts +241 -0
  463. package/ts/src/booking-surface/index.ts +9 -0
  464. package/ts/src/booking-surface/managed-dsh-cleanup-diagnostic.ts +151 -0
  465. package/ts/src/booking-surface/managed-dsh-run-port.ts +273 -0
  466. package/ts/src/booking-surface/profile.ts +42 -0
  467. package/ts/src/booking-surface/recovery-chain.ts +409 -0
  468. package/ts/src/booking-surface/runtime.ts +1793 -0
  469. package/ts/src/booking-surface/server.ts +733 -0
  470. package/ts/src/booking-surface/startup.ts +201 -0
  471. package/ts/src/booking-surface/validation.ts +217 -0
  472. package/ts/src/companions.ts +113 -0
  473. package/ts/src/contracts.ts +13 -3
  474. package/ts/src/dsh-llm.ts +44 -11
  475. package/ts/src/flyai-setup-tool.ts +77 -0
  476. package/ts/src/index.ts +1948 -198
  477. package/ts/src/itinerary-deck.ts +189 -0
  478. package/ts/src/itinerary-doc-shared.ts +741 -0
  479. package/ts/src/itinerary-html.ts +171 -0
  480. package/ts/src/loop.ts +223 -25
  481. package/ts/src/memory-capture.ts +283 -0
  482. package/ts/src/memory-decay.ts +55 -0
  483. package/ts/src/memory-utility.ts +70 -0
  484. package/ts/src/mock-llm.ts +4 -8
  485. package/ts/src/model.ts +88 -2
  486. package/ts/src/recall/card.ts +106 -0
  487. package/ts/src/recall/evaluator.ts +170 -0
  488. package/ts/src/recall/integration.ts +35 -0
  489. package/ts/src/recall/tick.ts +213 -0
  490. package/ts/src/session-link/plan-it-action.ts +78 -0
  491. package/ts/src/session-link/session-link.ts +275 -0
  492. package/ts/src/share/adapters.ts +93 -0
  493. package/ts/src/share/share-consent.ts +105 -0
  494. package/ts/src/share/share-deck.ts +85 -0
  495. package/ts/src/share/share-token.ts +166 -0
  496. package/ts/src/slot-spec.ts +172 -0
  497. package/ts/src/state-ledger.ts +912 -0
  498. package/ts/src/subagent-job-id-guard.ts +72 -0
  499. package/ts/src/time-anchor.ts +338 -0
  500. package/ts/src/tool-packet.ts +32 -0
  501. package/ts/src/travel-slots.ts +219 -0
  502. package/ts/src/travel-timeline.ts +83 -0
  503. package/ts/src/turn-deadline.ts +366 -0
  504. package/ts/src/turn-policy.ts +154 -0
  505. package/ts/src/unified.ts +354 -88
  506. package/ts/src/wish-pool.ts +79 -0
  507. package/dist/scripts/session-attach-wait.js +0 -41
@@ -0,0 +1,120 @@
1
+ import { AmapClient } from './clients/amap.js';
2
+ import { OsrmClient } from './clients/osrm.js';
3
+ import { NominatimClient } from './clients/nominatim.js';
4
+ import { PhotonClient } from './clients/photon.js';
5
+ import { registerRouteTools } from './tools/routes.js';
6
+ import { registerGeocodeTools } from './tools/geocode.js';
7
+ import { registerPoiTool } from './tools/poi.js';
8
+ import { parseLngLat } from './types.js';
9
+ import { Config } from './config.js';
10
+ import { readConfig } from './config-file.js';
11
+ import { installConfigRoute } from './config-route.js';
12
+ import { installStaticMapRoute } from './staticmap-route.js';
13
+ import { installSettingsNamespace } from './settings-ns.js';
14
+ export const name = 'dsh-map-tools';
15
+ export const inject = ['tools'];
16
+ export { Config };
17
+ /** Build (or rebuild) the provider clients. Priority: config-file (settings
18
+ * card) → schema defaults. */
19
+ function buildClients(config) {
20
+ // The settings card writes ~/.dsh-map-tools/config.json; when it holds
21
+ // values, they win over the composition-entry schema defaults.
22
+ let fileConfig = {};
23
+ try {
24
+ fileConfig = readConfig();
25
+ }
26
+ catch (error) {
27
+ console.error(`[dsh-map-tools] config read failed, using schema defaults: ${error}`);
28
+ }
29
+ const provider = fileConfig.provider ?? config.provider;
30
+ const amapKey = fileConfig.amapKey ?? config.amapKey;
31
+ const timeoutMs = fileConfig.timeoutMs ?? config.timeoutMs;
32
+ const maxQps = fileConfig.maxQps ?? config.maxQps;
33
+ // Provider selection: exactly one primary source per provider.
34
+ const amap = provider === 'amap' && amapKey
35
+ ? new AmapClient({ key: amapKey, timeoutMs, maxQps })
36
+ : undefined;
37
+ const osrm = new OsrmClient({ timeoutMs });
38
+ const nominatim = new NominatimClient({
39
+ timeoutMs,
40
+ userAgent: 'dsh-map-tools/0.1.0 (DeepSeek Harness plugin; contact: https://github.com/HorusJiang/dsh-map-tools)',
41
+ });
42
+ const photon = new PhotonClient({ timeoutMs, lang: config.language });
43
+ /** Resolve an address (or `lng,lat`) to coordinates, using the active provider. */
44
+ async function resolve(text, signal) {
45
+ const coord = parseLngLat(text);
46
+ if (coord)
47
+ return coord;
48
+ if (amap) {
49
+ const r = await amap.geocode(text, signal);
50
+ return r.location;
51
+ }
52
+ // Free sources cannot reliably geocode Chinese addresses (Nominatim is
53
+ // blocked on many CN networks, Photon returns 400 for CJK queries) — give
54
+ // an actionable prompt instead of a raw provider error.
55
+ throw new Error(`免费数据源无法可靠解析中文地址:"${text}"。请直接提供 "lng,lat" 坐标,或在插件配置中设置高德 amapKey(https://console.amap.com/dev/key/app)。`);
56
+ }
57
+ /** Resolve the city code for a point (transit queries need city1/city2).
58
+ * Amap v5 transit accepts only an adcode (e.g. "110000" / "110101") or a
59
+ * citycode (e.g. "010") — bare city names like "北京" are rejected with
60
+ * INVALID_PARAMS. Prefer the adcode from geocoding; fall back to the city
61
+ * name as a last resort. */
62
+ async function resolveCity(text, signal) {
63
+ const coord = parseLngLat(text);
64
+ if (amap) {
65
+ const r = coord ? await amap.reverseGeocode(coord, signal) : await amap.geocode(text, signal);
66
+ if (r.adcode)
67
+ return r.adcode;
68
+ const city = r.city ?? '';
69
+ return city.replace(/市$/, '');
70
+ }
71
+ return '';
72
+ }
73
+ return { amap, osrm, nominatim, photon, resolve, resolveCity };
74
+ }
75
+ /** Register every tool under the current clients; returns a disposer. */
76
+ function registerAll(ctx, clients) {
77
+ const disposers = [];
78
+ const routeClients = {
79
+ amap: clients.amap,
80
+ osrm: clients.osrm,
81
+ resolve: clients.resolve,
82
+ resolveCity: clients.resolveCity,
83
+ defaultMode: 'driving',
84
+ };
85
+ registerRouteTools(ctx, routeClients, disposers);
86
+ registerGeocodeTools(ctx, { amap: clients.amap, nominatim: clients.nominatim, photon: clients.photon }, disposers);
87
+ registerPoiTool(ctx, { amap: clients.amap, resolve: clients.resolve }, disposers);
88
+ return () => {
89
+ for (const d of disposers)
90
+ d();
91
+ };
92
+ }
93
+ export function apply(ctx, config) {
94
+ // Register tools under an effect: Cordis runs the returned disposer both on
95
+ // explicit reload (we call it) and on plugin unload (fiber disposal).
96
+ let disposeTools = () => { };
97
+ /** 当前生效的客户端集合;静态地图回环路由按需读它(保存配置后会被替换)。 */
98
+ let current;
99
+ ctx.effect(() => {
100
+ current = buildClients(config);
101
+ disposeTools = registerAll(ctx, current);
102
+ return () => {
103
+ disposeTools();
104
+ current = undefined;
105
+ };
106
+ });
107
+ const reload = () => {
108
+ disposeTools();
109
+ current = buildClients(config);
110
+ disposeTools = registerAll(ctx, current);
111
+ };
112
+ // The settings card route + namespace (modlens pattern): the card reads and
113
+ // writes ~/.dsh-map-tools/config.json through the loopback route, and the
114
+ // tools rebuild on a save (route POST → reload).
115
+ installConfigRoute(ctx, reload);
116
+ // 卡片要的静态地图(真地图 + 高德绘制的路线)也走回环路由:key 留在宿主,
117
+ // 浏览器只拿图片。没有 amapKey 时路由返回 409,卡片自动退回自绘示意图。
118
+ installStaticMapRoute(ctx, () => current?.amap);
119
+ installSettingsNamespace(ctx, config, reload);
120
+ }
@@ -0,0 +1,40 @@
1
+ import { Config as ConfigSchema } from './config.js';
2
+ /** Namespace the settings page keys this plugin's card to (plain string since DSH 0.1.2-rc.1). */
3
+ export const MAP_TOOLS_NS = 'dsh-map-tools';
4
+ /**
5
+ * Wire the settings section so the card renders. The values live in the
6
+ * config file; the section carries only the composition entry as its base so
7
+ * the page has something to dispatch on.
8
+ *
9
+ * GoTry vendored adaptation for DSH 0.2.0-rc.2: SettingsForms replaced the
10
+ * manual per-section API — forms now auto-generate from the plugin's exported
11
+ * Config schema, and the only manual registration left is the page policy via
12
+ * `settings.configure({ auto }, ownerFiber)`. Legacy hosts (installSection)
13
+ * keep the historical wiring so the same build runs on both release lines.
14
+ *
15
+ * @param ctx - plugin context.
16
+ * @param entry - the composition entry config (schema defaults).
17
+ * @param reload - rebuild tools after a settings change.
18
+ */
19
+ export function installSettingsNamespace(ctx, entry, reload) {
20
+ ctx.inject(['settings'], (scope) => {
21
+ if (typeof scope.settings.configure === 'function') {
22
+ const dispose = scope.settings.configure({ auto: true }, ctx.fiber);
23
+ if (typeof dispose === 'function' && typeof ctx.effect === 'function') {
24
+ ctx.effect(() => dispose);
25
+ }
26
+ return;
27
+ }
28
+ scope.settings.installSection(ctx, MAP_TOOLS_NS, ConfigSchema, entry, {
29
+ setSource: (current) => {
30
+ // The tools read ~/.dsh-map-tools/config.json then the composition
31
+ // entry; the section's own value is a dispatch key for the card and
32
+ // is never a tool configuration source.
33
+ void current;
34
+ },
35
+ onChange: () => {
36
+ reload();
37
+ },
38
+ });
39
+ });
40
+ }
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Loopback route serving the route-card's static map image.
3
+ *
4
+ * GET /dsh-map-tools/staticmap?w=640&h=260&line=lng,lat;lng,lat;…
5
+ *
6
+ * 为什么走回环路由而不是把图片塞进工具结果:
7
+ * 1. **key 不出宿主**——浏览器只拿到一张本地图片 URL,高德 key 始终在服务端;
8
+ * 2. **不进模型上下文**——工具结果里放 image block 会被适配器跳过/或消耗
9
+ * 视觉额度,而卡片要的只是一张示意图;
10
+ * 3. **懒加载 + 可缓存**——只有卡片真正渲染时才取图,且服务端按参数缓存。
11
+ *
12
+ * 拿不到图(没 key / 配额超限 / 网络问题)时返回错误状态码,客户端卡片会
13
+ * 自动降级为自绘示意图(client/client.js 里的 svg 兜底)。
14
+ */
15
+ import { parseLngLat } from './types.js';
16
+ import { isTrustedRequest } from './config-route.js';
17
+ /** URL 里最多接受的坐标点数(再多就截断,避免超长 query)。 */
18
+ const MAX_POINTS = 160;
19
+ /** 画布尺寸上限,与高德静态地图的限制一致。 */
20
+ const MAX_SIDE = 1024;
21
+ /** 解析 `line=lng,lat;lng,lat;…`;非法片段跳过,超过上限则等间隔截断。 */
22
+ export function parseLineParam(raw) {
23
+ if (raw === null || raw === '')
24
+ return [];
25
+ const points = [];
26
+ for (const chunk of raw.split(';')) {
27
+ const point = parseLngLat(chunk);
28
+ if (point !== null)
29
+ points.push(point);
30
+ }
31
+ if (points.length <= MAX_POINTS)
32
+ return points;
33
+ const out = [];
34
+ const step = (points.length - 1) / (MAX_POINTS - 1);
35
+ for (let i = 0; i < MAX_POINTS; i += 1)
36
+ out.push(points[Math.round(i * step)]);
37
+ return out;
38
+ }
39
+ /** 把尺寸参数钳制到合法范围(默认 640×260)。 */
40
+ export function parseSizeParam(w, h) {
41
+ const clamp = (value, fallback) => {
42
+ const n = Number(value);
43
+ if (!Number.isFinite(n) || n <= 0)
44
+ return fallback;
45
+ return Math.max(64, Math.min(MAX_SIDE, Math.round(n)));
46
+ };
47
+ return { width: clamp(w, 640), height: clamp(h, 260) };
48
+ }
49
+ /**
50
+ * Register the static-map route under the web server, when one exists.
51
+ *
52
+ * @param ctx - plugin context.
53
+ * @param getAmap - reads the current Amap client (rebuilt on every config save).
54
+ */
55
+ export function installStaticMapRoute(ctx, getAmap) {
56
+ const fn = ctx.inject;
57
+ fn(['webServer'], (scope) => {
58
+ // 同 config-route:register() 的 disposer 必须由 effect 持有,否则热替换后
59
+ // 旧处理器留在 exact 表里、新注册撞 "duplicate route" 被静默吞掉。
60
+ scope.effect(() => scope.webServer.register({
61
+ kind: 'exact',
62
+ path: '/dsh-map-tools/staticmap',
63
+ handler: async (req, res) => {
64
+ const fail = (status, message) => {
65
+ res.writeHead(status, { 'content-type': 'text/plain; charset=utf-8', 'cache-control': 'no-store' });
66
+ res.end(message);
67
+ };
68
+ if (!isTrustedRequest(req)) {
69
+ fail(403, 'request refused: this route answers same-origin loopback only');
70
+ return;
71
+ }
72
+ if (req.method !== 'GET' && req.method !== 'HEAD') {
73
+ res.writeHead(405).end();
74
+ return;
75
+ }
76
+ const url = new URL(req.url ?? '/', 'http://localhost');
77
+ const line = parseLineParam(url.searchParams.get('line'));
78
+ if (line.length < 2) {
79
+ fail(400, '需要至少两个坐标点:/dsh-map-tools/staticmap?line=lng,lat;lng,lat');
80
+ return;
81
+ }
82
+ const amap = getAmap();
83
+ if (amap === undefined) {
84
+ fail(409, '未配置高德 amapKey,静态地图不可用(卡片会退回自绘示意图)');
85
+ return;
86
+ }
87
+ const size = parseSizeParam(url.searchParams.get('w'), url.searchParams.get('h'));
88
+ // Node 的 IncomingMessage 没有 signal:用连接关闭来取消上游请求
89
+ // (用户切走/刷新时不必继续烧配额)。
90
+ const controller = new AbortController();
91
+ const onClose = () => controller.abort(new Error('client closed the static-map request'));
92
+ req.on('close', onClose);
93
+ try {
94
+ const png = await amap.staticMap(line, { width: size.width, height: size.height }, controller.signal);
95
+ res.writeHead(200, {
96
+ 'content-type': 'image/png',
97
+ 'content-length': String(png.byteLength),
98
+ // 同一张图(同一路线同尺寸)在客户端也缓存一天:回环流量几乎为零。
99
+ 'cache-control': 'private, max-age=86400',
100
+ });
101
+ if (req.method === 'HEAD')
102
+ res.end();
103
+ else
104
+ res.end(Buffer.from(png));
105
+ }
106
+ catch (error) {
107
+ fail(502, String(error?.message ?? error));
108
+ }
109
+ finally {
110
+ req.off('close', onClose);
111
+ }
112
+ },
113
+ }));
114
+ });
115
+ }
@@ -0,0 +1,127 @@
1
+ /** Geocoding tools: address → coordinates, and reverse. */
2
+ import { defineTool } from '@deepseek-ai/dsh-tools';
3
+ import { parseLngLat } from '../types.js';
4
+ export function registerGeocodeTools(ctx, clients, disposers = []) {
5
+ disposers.push(ctx.tools.register(defineTool({
6
+ name: 'map_geocode',
7
+ description: '把地址文本转换为经纬度坐标。支持中文地址、模糊地址。',
8
+ parameters: {
9
+ address: { type: 'string', required: true, description: '地址文本,如 "北京市朝阳区建国路88号"。' },
10
+ },
11
+ output: {
12
+ schema: {
13
+ type: 'object',
14
+ additionalProperties: false,
15
+ properties: {
16
+ provider: { type: 'string' },
17
+ formatted: { type: 'string' },
18
+ location: {
19
+ type: 'array',
20
+ items: { type: 'number' },
21
+ },
22
+ city: { type: 'string' },
23
+ district: { type: 'string' },
24
+ },
25
+ },
26
+ render: (_args, value) => {
27
+ const v = value;
28
+ const name = v.provider === 'amap' ? '高德' : v.provider === 'nominatim' ? 'Nominatim(OSM)' : v.provider === 'photon' ? 'Photon(OSM)' : 'inline';
29
+ const area = v.city ? `(${v.city}${v.district ? ` ${v.district}` : ''})` : '';
30
+ return [{
31
+ type: 'text',
32
+ text: `${name} 解析 "${v.formatted}" → 经纬度 ${v.location[0]}, ${v.location[1]}${area}`,
33
+ }];
34
+ },
35
+ },
36
+ async execute(args, exec) {
37
+ const coord = parseLngLat(args.address);
38
+ if (coord) {
39
+ // Input already looks like coordinates — return as-is.
40
+ return { provider: 'inline', formatted: args.address, location: coord };
41
+ }
42
+ if (clients.amap) {
43
+ const r = await clients.amap.geocode(args.address, exec.signal);
44
+ return { provider: r.provider, formatted: r.formatted, location: r.location, city: r.city, district: r.district };
45
+ }
46
+ // Free sources (Photon/Nominatim) are unreliable for Chinese addresses.
47
+ // Try them, but convert any failure into an actionable prompt.
48
+ let lastError = '免费地理编码服务不可用';
49
+ if (clients.photon) {
50
+ try {
51
+ const r = await clients.photon.geocode(args.address, exec.signal);
52
+ return { provider: r.provider, formatted: r.formatted, location: r.location, city: r.city, district: r.district };
53
+ }
54
+ catch (err) {
55
+ lastError = err instanceof Error ? err.message : String(err);
56
+ }
57
+ }
58
+ if (clients.nominatim) {
59
+ try {
60
+ const r = await clients.nominatim.geocode(args.address, exec.signal);
61
+ return { provider: r.provider, formatted: r.formatted, location: r.location, city: r.city, district: r.district };
62
+ }
63
+ catch (err) {
64
+ lastError = err instanceof Error ? err.message : String(err);
65
+ }
66
+ }
67
+ throw new Error(`免费数据源无法可靠解析中文地址:"${args.address}"(${lastError})。请直接提供 "lng,lat" 坐标,或在插件配置中设置高德 amapKey(https://console.amap.com/dev/key/app)。`);
68
+ },
69
+ })));
70
+ disposers.push(ctx.tools.register(defineTool({
71
+ name: 'map_reverse_geocode',
72
+ description: '把经纬度坐标转换为结构化地址(含城市、区县)。',
73
+ parameters: {
74
+ location: { type: 'string', required: true, description: '经纬度,格式 "lng,lat",如 "116.397428,39.90923"。' },
75
+ },
76
+ output: {
77
+ schema: {
78
+ type: 'object',
79
+ additionalProperties: false,
80
+ properties: {
81
+ provider: { type: 'string' },
82
+ formatted: { type: 'string' },
83
+ location: {
84
+ type: 'array',
85
+ items: { type: 'number' },
86
+ },
87
+ city: { type: 'string' },
88
+ district: { type: 'string' },
89
+ },
90
+ },
91
+ render: (_args, value) => {
92
+ const v = value;
93
+ const name = v.provider === 'amap' ? '高德' : v.provider === 'nominatim' ? 'Nominatim(OSM)' : v.provider === 'photon' ? 'Photon(OSM)' : '未知';
94
+ return [{ type: 'text', text: `${name}:${v.formatted}` }];
95
+ },
96
+ },
97
+ async execute(args, exec) {
98
+ const coord = parseLngLat(args.location);
99
+ if (!coord)
100
+ throw new Error(`无效的经纬度格式:${args.location}(应为 "lng,lat")`);
101
+ if (clients.amap) {
102
+ const r = await clients.amap.reverseGeocode(coord, exec.signal);
103
+ return { provider: r.provider, formatted: r.formatted, location: r.location, city: r.city, district: r.district };
104
+ }
105
+ let lastError = '免费地理编码服务不可用';
106
+ if (clients.photon) {
107
+ try {
108
+ const r = await clients.photon.reverseGeocode(coord, exec.signal);
109
+ return { provider: r.provider, formatted: r.formatted, location: r.location, city: r.city, district: r.district };
110
+ }
111
+ catch (err) {
112
+ lastError = err instanceof Error ? err.message : String(err);
113
+ }
114
+ }
115
+ if (clients.nominatim) {
116
+ try {
117
+ const r = await clients.nominatim.reverseGeocode(coord, exec.signal);
118
+ return { provider: r.provider, formatted: r.formatted, location: r.location, city: r.city, district: r.district };
119
+ }
120
+ catch (err) {
121
+ lastError = err instanceof Error ? err.message : String(err);
122
+ }
123
+ }
124
+ throw new Error(`免费逆地理编码服务不可用(${lastError})。请配置高德 amapKey(https://console.amap.com/dev/key/app)以获得稳定结果。`);
125
+ },
126
+ })));
127
+ }
@@ -0,0 +1,84 @@
1
+ /** POI search tool. */
2
+ import { defineTool } from '@deepseek-ai/dsh-tools';
3
+ import { parseLngLat } from '../types.js';
4
+ export function registerPoiTool(ctx, clients, disposers = []) {
5
+ disposers.push(ctx.tools.register(defineTool({
6
+ name: 'map_poi_search',
7
+ description: '搜索兴趣点(POI):餐厅、加油站、酒店、医院等。支持按关键词搜索或按位置周边搜索。',
8
+ parameters: {
9
+ keywords: { type: 'string', required: true, description: '搜索关键词,如 "加油站"、"咖啡"、"北京南站"。' },
10
+ location: {
11
+ type: 'string',
12
+ description: '中心点:"lng,lat" 坐标或地址文本。提供后按周边搜索(默认半径 1000 米)。',
13
+ },
14
+ radiusM: { type: 'number', description: '周边搜索半径(米),默认 1000,最大 50000。' },
15
+ region: { type: 'string', description: '限定城市(文本搜索时),如 "北京"。' },
16
+ types: { type: 'string', description: 'POI 类型编码,如 "060000"(餐饮)。' },
17
+ },
18
+ output: {
19
+ schema: {
20
+ type: 'object',
21
+ additionalProperties: false,
22
+ properties: {
23
+ count: { type: 'number' },
24
+ results: {
25
+ type: 'array',
26
+ items: {
27
+ type: 'object',
28
+ additionalProperties: false,
29
+ properties: {
30
+ name: { type: 'string' },
31
+ location: {
32
+ type: 'array',
33
+ items: { type: 'number' },
34
+ },
35
+ type: { type: 'string' },
36
+ address: { type: 'string' },
37
+ tel: { type: 'string' },
38
+ distanceM: { type: 'number' },
39
+ },
40
+ },
41
+ },
42
+ },
43
+ },
44
+ render: (_args, value) => {
45
+ const v = value;
46
+ const lines = [`找到 ${v.count} 个结果:`];
47
+ for (const r of v.results.slice(0, 10)) {
48
+ const d = r.distanceM !== undefined ? `(距中心 ${Math.round(r.distanceM)} 米)` : '';
49
+ const tel = r.tel ? ` 电话:${r.tel}` : '';
50
+ lines.push(`- ${r.name}${d}${r.type ? ` [${r.type}]` : ''}${r.address ? ` ${r.address}` : ''}${tel}`);
51
+ }
52
+ if (v.results.length > 10)
53
+ lines.push(`- …(还有 ${v.results.length - 10} 个)`);
54
+ return [{ type: 'text', text: lines.join('\n') }];
55
+ },
56
+ },
57
+ async execute(args, exec) {
58
+ if (!clients.amap)
59
+ throw new Error('POI 搜索需要配置高德 amapKey。申请:https://console.amap.com/dev/key/app');
60
+ let results;
61
+ if (args.location) {
62
+ const center = parseLngLat(args.location) ?? (await clients.resolve(args.location, exec.signal));
63
+ results = await clients.amap.poiAround(center, args.keywords, {
64
+ radiusM: args.radiusM ?? 1000,
65
+ types: args.types,
66
+ }, exec.signal);
67
+ }
68
+ else {
69
+ results = await clients.amap.poiSearch(args.keywords, { region: args.region, cityLimit: !!args.region }, exec.signal);
70
+ }
71
+ return {
72
+ count: results.length,
73
+ results: results.map((r) => ({
74
+ name: r.name,
75
+ location: r.location,
76
+ type: r.type,
77
+ address: r.address,
78
+ tel: r.tel,
79
+ distanceM: r.distanceM,
80
+ })),
81
+ };
82
+ },
83
+ })));
84
+ }