@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.
- package/README.md +172 -219
- package/README.zh-CN.md +222 -0
- package/bin/gotry-backend.js +53 -0
- package/bin/gotry-booking-copilot.js +53 -0
- package/bin/gotry-bootstrap.js +1744 -0
- package/bin/gotry-inner.js +733 -83
- package/bin/gotry-process-liveness.d.ts +27 -0
- package/bin/gotry-process-liveness.js +97 -0
- package/bin/gotry-runtime-resolution.d.ts +27 -0
- package/bin/gotry-runtime-resolution.js +49 -0
- package/bin/gotry.js +1 -1
- package/client/client.js +203 -0
- package/cordis.gotry-patch.yml +80 -56
- package/data/airline-airports.json +39 -0
- package/data/stations-12306-verify.json +524 -0
- package/dist/capabilities/agent-reach-deep.js +45 -122
- package/dist/capabilities/agent-reach.js +101 -146
- package/dist/capabilities/anything.js +135 -94
- package/dist/capabilities/artifacts.js +370 -0
- package/dist/capabilities/channel-health.js +131 -0
- package/dist/capabilities/channel-registry.js +256 -0
- package/dist/capabilities/doctor.js +546 -0
- package/dist/capabilities/effect.js +394 -0
- package/dist/capabilities/external-event.js +149 -0
- package/dist/capabilities/fact-log.js +55 -0
- package/dist/capabilities/flyai-config.js +337 -0
- package/dist/capabilities/flyai.js +947 -110
- package/dist/capabilities/fx-contract.js +293 -0
- package/dist/capabilities/geo-atlas.js +246 -0
- package/dist/capabilities/ground-transfer.js +509 -0
- package/dist/capabilities/hbcli.js +260 -123
- package/dist/capabilities/hotelbyte-transaction.js +194 -0
- package/dist/capabilities/incident-log.js +131 -61
- package/dist/capabilities/itinerary-artifact.js +190 -0
- package/dist/capabilities/itinerary-deck-artifact.js +194 -0
- package/dist/capabilities/itinerary-deck-export.js +339 -0
- package/dist/capabilities/lavish-local.js +924 -0
- package/dist/capabilities/model-override.js +38 -0
- package/dist/capabilities/opensky.js +54 -43
- package/dist/capabilities/resilience.js +191 -0
- package/dist/capabilities/session/action-cache.js +50 -44
- package/dist/capabilities/session/adapters/ctrip-flight.js +120 -62
- package/dist/capabilities/session/adapters/ctrip-hotel.js +222 -0
- package/dist/capabilities/session/adapters/dida-portal.js +274 -0
- package/dist/capabilities/session/adapters/meituan-local.js +35 -54
- package/dist/capabilities/session/adapters/rail-12306.js +342 -0
- package/dist/capabilities/session/benchmark.js +189 -0
- package/dist/capabilities/session/bridge-ledger.js +224 -0
- package/dist/capabilities/session/extension-bridge.js +636 -0
- package/dist/capabilities/session/extension-channel.js +109 -0
- package/dist/capabilities/session/extension-distribution.js +230 -0
- package/dist/capabilities/session/extract.js +31 -21
- package/dist/capabilities/session/golden-score.js +114 -0
- package/dist/capabilities/session/health-watch.js +215 -0
- package/dist/capabilities/session/read-guard.js +75 -24
- package/dist/capabilities/session/static-flight-golden.js +150 -0
- package/dist/capabilities/session/transport.js +97 -83
- package/dist/capabilities/session/wizard.js +117 -0
- package/dist/capabilities/session-consent.js +178 -0
- package/dist/capabilities/session-login.js +170 -0
- package/dist/capabilities/session-search.js +635 -44
- package/dist/capabilities/spawn-bounded.js +203 -0
- package/dist/capabilities/sponsor-plugin.js +341 -0
- package/dist/capabilities/visa-policy.js +140 -0
- package/dist/capabilities/weather.js +243 -138
- package/dist/data/session-golden-20.json +25 -0
- package/dist/data/sf-golden-manifest.json +103 -0
- package/dist/data/sf-static-routes.json +91 -0
- package/dist/scripts/action-cache-tests.js +24 -59
- package/dist/scripts/agent-planning-turn-deadline-e2e.js +242 -0
- package/dist/scripts/agent-planning-turn-deadline-tests.js +185 -0
- package/dist/scripts/agent-reach-deep-tests.js +30 -40
- package/dist/scripts/agent-reach-error-tests.js +354 -0
- package/dist/scripts/agent-reach-tests.js +26 -18
- package/dist/scripts/agent-reach-wrapper-tests.js +50 -50
- package/dist/scripts/anything-tests.js +116 -60
- package/dist/scripts/artifact-client-contract-tests.js +220 -0
- package/dist/scripts/artifacts-capability-tests.js +727 -0
- package/dist/scripts/async-collect.js +50 -11
- package/dist/scripts/benchmark-environment-bridge-e2e.js +741 -0
- package/dist/scripts/benchmark-environment-bridge-tests.js +1452 -0
- package/dist/scripts/booking-copilot-availability-ledger-binding-tests.js +126 -0
- package/dist/scripts/booking-copilot-availability-policy-tests.js +265 -0
- package/dist/scripts/booking-copilot-bin-proof-tests.js +66 -0
- package/dist/scripts/booking-copilot-cleanup-proof-helper.js +76 -0
- package/dist/scripts/booking-copilot-crossrepo-fixture-server.js +144 -0
- package/dist/scripts/booking-copilot-dsh-core-proof-tests.js +424 -0
- package/dist/scripts/booking-copilot-dsh-planner-proof-tests.js +2839 -0
- package/dist/scripts/booking-copilot-dsh-plugin-proof-tests.js +309 -0
- package/dist/scripts/booking-copilot-dsh-readiness-proof.js +238 -0
- package/dist/scripts/booking-copilot-dsh-warmer-proof.js +123 -0
- package/dist/scripts/booking-copilot-event-sequence-concurrency-proof-tests.js +156 -0
- package/dist/scripts/booking-copilot-gap-code-contract-proof-tests.js +70 -0
- package/dist/scripts/booking-copilot-intent-proof-tests.js +422 -0
- package/dist/scripts/booking-copilot-operation-ledger-concurrency-proof-tests.js +184 -0
- package/dist/scripts/booking-copilot-planner-live-probe.js +95 -0
- package/dist/scripts/booking-copilot-proof-runtime.js +42 -0
- package/dist/scripts/booking-copilot-receipt-ledger-concurrency-proof-tests.js +210 -0
- package/dist/scripts/booking-copilot-runtime-proof-tests.js +2349 -0
- package/dist/scripts/booking-copilot-server-proof-tests.js +784 -0
- package/dist/scripts/booking-copilot-startup-proof-tests.js +94 -0
- package/dist/scripts/booking-executor-tests.js +80 -0
- package/dist/scripts/booking-recovery-chain-tests.js +182 -0
- package/dist/scripts/booking-saga-tests.js +125 -0
- package/dist/scripts/booking-surface-contract-proof-tests.js +212 -0
- package/dist/scripts/bootstrap-tests.js +1479 -0
- package/dist/scripts/bridge-events-tests.js +239 -0
- package/dist/scripts/bridge-ledger-tests.js +428 -0
- package/dist/scripts/build-changelog.js +238 -0
- package/dist/scripts/build-metrics-report.js +331 -0
- package/dist/scripts/changelog-tests.js +118 -0
- package/dist/scripts/channel-probe-tests.js +103 -0
- package/dist/scripts/channel-probe.js +169 -0
- package/dist/scripts/channel-registry-tests.js +208 -0
- package/dist/scripts/companion-tests.js +25 -70
- package/dist/scripts/dida-cookie-probe.js +87 -0
- package/dist/scripts/dida-runner-stop-tests.js +311 -0
- package/dist/scripts/dida-sw-probe.js +114 -0
- package/dist/scripts/diff-test.js +17 -12
- package/dist/scripts/doctor-tests.js +564 -0
- package/dist/scripts/dsh-artifact-e2e.js +279 -0
- package/dist/scripts/dsh-artifact-web-e2e.js +675 -0
- package/dist/scripts/dsh-http-proxy-sse-proof.js +90 -0
- package/dist/scripts/dsh-runtime-closure-tests.js +182 -0
- package/dist/scripts/dsh-runtime-closure.js +162 -0
- package/dist/scripts/dsh-session-v3-migration-proof.js +109 -0
- package/dist/scripts/dsh-subprocess-local-proof.js +150 -0
- package/dist/scripts/dsh-target-closure-proof.js +178 -0
- package/dist/scripts/effect-tests.js +539 -0
- package/dist/scripts/engine-run.js +1 -3
- package/dist/scripts/engine-tests.js +16 -10
- package/dist/scripts/evaluation-cadence-tests.js +174 -0
- package/dist/scripts/evaluation-contract-tests.js +268 -0
- package/dist/scripts/extension-distribution-cli.js +39 -0
- package/dist/scripts/extension-distribution-tests.js +443 -0
- package/dist/scripts/extension-tests.js +988 -0
- package/dist/scripts/external-event-tests.js +350 -0
- package/dist/scripts/fact-gate-tests.js +869 -0
- package/dist/scripts/fixtures/extension-bridge-unref-child.mjs +21 -0
- package/dist/scripts/flight-hotel-anchor-363-registered-e2e.js +169 -0
- package/dist/scripts/flight-malformed-tests.js +159 -0
- package/dist/scripts/flyai-setup-tests.js +228 -0
- package/dist/scripts/flyai-setup-tool-tests.js +54 -0
- package/dist/scripts/flyai-tests.js +692 -0
- package/dist/scripts/flyai-tool-registration-contract-tests.js +91 -0
- package/dist/scripts/fx-contract-tests.js +201 -0
- package/dist/scripts/g5-guard-tests.js +131 -0
- package/dist/scripts/g5-guard.js +189 -0
- package/dist/scripts/gen-lunar-anchors.js +106 -0
- package/dist/scripts/geo-atlas-tests.js +283 -0
- package/dist/scripts/gotry-backend-kernel-tests.js +206 -0
- package/dist/scripts/gotry-try-demo-tests.js +79 -0
- package/dist/scripts/gotry-try-demo.js +49 -0
- package/dist/scripts/ground-transfer-tests.js +956 -0
- package/dist/scripts/hbcli-e2e-tests.js +159 -0
- package/dist/scripts/hbcli-live-optin-tests.js +96 -0
- package/dist/scripts/hbcli-release-contract-tests.js +122 -0
- package/dist/scripts/hbcli-tests.js +121 -69
- package/dist/scripts/health-watch-cli.js +73 -0
- package/dist/scripts/hotel-date-gate-tests.js +496 -0
- package/dist/scripts/hotelbyte-reconcile-tests.js +141 -0
- package/dist/scripts/hotelbyte-spawn-e2e-tests.js +373 -0
- package/dist/scripts/i18n-tests.js +41 -0
- package/dist/scripts/incident-tests.js +281 -87
- package/dist/scripts/issue-194-job-id-guard-tests.js +106 -0
- package/dist/scripts/issue-233-cancel-refund-commission-tests.js +392 -0
- package/dist/scripts/issue-271-liveness-tests.js +569 -0
- package/dist/scripts/issue-289-model-retry-real-tests.js +296 -0
- package/dist/scripts/issue-289-model-retry-tests.js +441 -0
- package/dist/scripts/issue-289-web-retry-e2e.js +630 -0
- package/dist/scripts/issue-338-home-city-e2e.js +577 -0
- package/dist/scripts/issue343-real-entry-e2e.js +160 -0
- package/dist/scripts/issue436-persisted-routing-e2e.js +247 -0
- package/dist/scripts/itinerary-artifact-tests.js +368 -0
- package/dist/scripts/itinerary-deck-artifact-tests.js +416 -0
- package/dist/scripts/itinerary-deck-export-tests.js +552 -0
- package/dist/scripts/itinerary-deck-tests.js +435 -0
- package/dist/scripts/itinerary-html-tests.js +426 -0
- package/dist/scripts/journey-tests.js +22 -27
- package/dist/scripts/kernel-manifest-evidence.js +109 -0
- package/dist/scripts/kernel-manifest-gate.js +126 -0
- package/dist/scripts/kernel-manifest-tests.js +212 -0
- package/dist/scripts/kernel-manifest-trace-entry.js +7 -0
- package/dist/scripts/kernel-manifest-trace-hook.mjs +28 -0
- package/dist/scripts/kernel-manifest.js +369 -0
- package/dist/scripts/lavish-local-tests.js +1226 -0
- package/dist/scripts/lavish-product-tools-tests.js +537 -0
- package/dist/scripts/ledger-repair-apply-tests.js +316 -0
- package/dist/scripts/ledger-repair-plan-tests.js +375 -0
- package/dist/scripts/ledger-tests.js +382 -246
- package/dist/scripts/ledger-workflow-crash.js +10 -20
- package/dist/scripts/managed-dsh-cleanup-diagnostic-proof.js +184 -0
- package/dist/scripts/managed-dsh-close-failure-proof.js +172 -0
- package/dist/scripts/managed-dsh-run-port-proof.js +153 -0
- package/dist/scripts/managed-dsh-terminal-proof.js +252 -0
- package/dist/scripts/map-tools-vendor-package-proof.js +365 -0
- package/dist/scripts/memory-capture-tests.js +242 -61
- package/dist/scripts/memory-decay-tests.js +18 -52
- package/dist/scripts/memory-lifecycle-tests.js +657 -0
- package/dist/scripts/memory-lifecycle.js +196 -0
- package/dist/scripts/memory-metrics.js +24 -12
- package/dist/scripts/memory-value-report.js +631 -0
- package/dist/scripts/memory-value-tests.js +328 -0
- package/dist/scripts/metrics-report-tests.js +151 -0
- package/dist/scripts/model-override-e2e.js +137 -0
- package/dist/scripts/nightly-evidence-tests.js +161 -0
- package/dist/scripts/nightly-evidence.js +286 -0
- package/dist/scripts/nudge-digest.js +39 -28
- package/dist/scripts/observability-tests.js +381 -0
- package/dist/scripts/onboarding-tests.js +161 -0
- package/dist/scripts/opensky-check.js +18 -13
- package/dist/scripts/opensky-tests.js +28 -28
- package/dist/scripts/persona-surface-guard-tests.js +49 -0
- package/dist/scripts/pnpm-dsh-closure-proof.js +17 -0
- package/dist/scripts/policy-anchor-359-registered-e2e.js +214 -0
- package/dist/scripts/price-drift-tests.js +340 -0
- package/dist/scripts/price-drift-watch.js +447 -0
- package/dist/scripts/probe-poi-tests.js +53 -45
- package/dist/scripts/product-metrics.js +483 -0
- package/dist/scripts/publish-preverify.js +110 -0
- package/dist/scripts/realtime-pricing-tests.js +76 -0
- package/dist/scripts/recall-tests.js +513 -0
- package/dist/scripts/replay-async.js +20 -18
- package/dist/scripts/replay-real.js +18 -18
- package/dist/scripts/replay.js +52 -82
- package/dist/scripts/session-attach-diagnose.js +20 -20
- package/dist/scripts/session-attach-poc.js +34 -37
- package/dist/scripts/session-benchmark.js +180 -0
- package/dist/scripts/session-dida-live-e2e.js +199 -0
- package/dist/scripts/session-extract-tests.js +14 -35
- package/dist/scripts/session-link-tests.js +478 -0
- package/dist/scripts/session-login.js +27 -46
- package/dist/scripts/session-tests.js +796 -96
- package/dist/scripts/session-zones-tests.js +358 -0
- package/dist/scripts/sf-live-benchmark.js +367 -0
- package/dist/scripts/sf-live-challenge-stop-tests.js +453 -0
- package/dist/scripts/sf-live-cli-tests.js +92 -0
- package/dist/scripts/sf-live-options.js +46 -0
- package/dist/scripts/sf-manifest-tests.js +30 -0
- package/dist/scripts/sf-manifest.js +33 -0
- package/dist/scripts/sf-soft-score-tests.js +67 -0
- package/dist/scripts/sf-summary-tests.js +324 -0
- package/dist/scripts/sf-summary.js +525 -0
- package/dist/scripts/share-tests.js +432 -0
- package/dist/scripts/skeleton-check.js +16 -14
- package/dist/scripts/skeleton-integration-test.js +28 -11
- package/dist/scripts/skills-contract-tests.js +51 -46
- package/dist/scripts/smoke-session-gate-tests.js +21 -0
- package/dist/scripts/smoke.js +690 -246
- package/dist/scripts/spawn-bounded-abort-tests.js +241 -0
- package/dist/scripts/sponsor-reuse-tests.js +262 -0
- package/dist/scripts/state-cli-tests.js +226 -101
- package/dist/scripts/state-cli.js +550 -199
- package/dist/scripts/state-repair-cli.js +66 -0
- package/dist/scripts/state-repair-tests.js +140 -0
- package/dist/scripts/static-golden-tests.js +165 -0
- package/dist/scripts/time-eval-tests.js +210 -192
- package/dist/scripts/travel-timeline-tests.js +29 -93
- package/dist/scripts/turn-handoff-collect-tests.js +169 -0
- package/dist/scripts/turn-handoff-collect.js +161 -0
- package/dist/scripts/turn-policy-tests.js +55 -0
- package/dist/scripts/typed-contract-canary.js +176 -0
- package/dist/scripts/tz-resolver-sanity.js +50 -0
- package/dist/scripts/tz-resolver-tests.js +584 -0
- package/dist/scripts/unified-tests.js +23 -19
- package/dist/scripts/visa-policy-tests.js +62 -0
- package/dist/scripts/weather-tests.js +276 -41
- package/dist/scripts/wish-channel-gate-tests.js +54 -0
- package/dist/scripts/write-gate-tests.js +522 -0
- package/dist/scripts/z3-lifecycle-fault-tests.js +188 -0
- package/dist/scripts/z3-lifecycle-tests.js +170 -0
- package/dist/scripts/z3-race-repeat-tests.js +39 -0
- package/dist/scripts/z3-race-tests.js +41 -0
- package/dist/src/artifact-gate.js +829 -0
- package/dist/src/backend/kernel.js +91 -0
- package/dist/src/backend/modules/booking-copilot.js +92 -0
- package/dist/src/backend/modules/booking-executor.js +124 -0
- package/dist/src/backend/modules/session-search.js +551 -0
- package/dist/src/benchmark-agent-conformance.js +578 -0
- package/dist/src/benchmark-environment-bridge.js +515 -0
- package/dist/src/benchmark-headless-child-diagnostics.js +166 -0
- package/dist/src/benchmark-tool-isolation.js +151 -0
- package/dist/src/bookable-facts.js +533 -0
- package/dist/src/booking-saga.js +97 -0
- package/dist/src/booking-surface/availability-policy.js +697 -0
- package/dist/src/booking-surface/booking-intent.js +43 -0
- package/dist/src/booking-surface/cancel-refund-commission.js +379 -0
- package/dist/src/booking-surface/canonical-schema.js +116 -0
- package/dist/src/booking-surface/contracts.js +75 -0
- package/dist/src/booking-surface/dsh-planner.js +1854 -0
- package/dist/src/booking-surface/dsh-plugin.js +378 -0
- package/dist/src/booking-surface/dsh-worker.js +98 -0
- package/dist/src/booking-surface/error-codes.js +231 -0
- package/dist/src/booking-surface/index.js +9 -0
- package/dist/src/booking-surface/managed-dsh-cleanup-diagnostic.js +97 -0
- package/dist/src/booking-surface/managed-dsh-run-port.js +244 -0
- package/dist/src/booking-surface/profile.js +24 -0
- package/dist/src/booking-surface/recovery-chain.js +367 -0
- package/dist/src/booking-surface/runtime.js +1968 -0
- package/dist/src/booking-surface/server.js +674 -0
- package/dist/src/booking-surface/startup.js +168 -0
- package/dist/src/booking-surface/validation.js +261 -0
- package/dist/src/bridge.js +20 -13
- package/dist/src/companions.js +48 -74
- package/dist/src/contracts.js +21 -43
- package/dist/src/dsh-llm.js +97 -111
- package/dist/src/engine.js +276 -193
- package/dist/src/evaluation-cadence.js +97 -0
- package/dist/src/evaluation-contracts.js +283 -0
- package/dist/src/flight-pack-adapter.js +54 -0
- package/dist/src/flight-pack-contract.js +2 -0
- package/dist/src/flyai-setup-tool.js +70 -0
- package/dist/src/gotry-backend.js +125 -0
- package/dist/src/hotel-date-gate.js +118 -0
- package/dist/src/i18n.js +88 -0
- package/dist/src/index.js +2227 -882
- package/dist/src/itinerary-deck.js +139 -0
- package/dist/src/itinerary-doc-shared.js +661 -0
- package/dist/src/itinerary-html.js +131 -0
- package/dist/src/journey.js +155 -108
- package/dist/src/lavish-tools.js +400 -0
- package/dist/src/ledger-repair-apply.js +538 -0
- package/dist/src/ledger-repair-plan.js +463 -0
- package/dist/src/loop.js +319 -160
- package/dist/src/memory-capture.js +180 -32
- package/dist/src/memory-decay.js +30 -14
- package/dist/src/memory-lifecycle.js +1310 -0
- package/dist/src/memory-utility.js +27 -40
- package/dist/src/mock-llm.js +36 -61
- package/dist/src/model.js +81 -36
- package/dist/src/realtime-pricing.js +103 -0
- package/dist/src/recall/card.js +74 -0
- package/dist/src/recall/evaluator.js +140 -0
- package/dist/src/recall/integration.js +17 -0
- package/dist/src/recall/tick.js +166 -0
- package/dist/src/session-link/plan-it-action.js +48 -0
- package/dist/src/session-link/session-link.js +248 -0
- package/dist/src/session-zones.js +507 -0
- package/dist/src/share/adapters.js +51 -0
- package/dist/src/share/share-consent.js +76 -0
- package/dist/src/share/share-deck.js +58 -0
- package/dist/src/share/share-token.js +146 -0
- package/dist/src/slot-spec.js +84 -106
- package/dist/src/state-ledger.js +435 -516
- package/dist/src/state-repair.js +299 -0
- package/dist/src/subagent-job-id-guard.js +58 -0
- package/dist/src/time-anchor.js +231 -33
- package/dist/src/tool-packet.js +20 -8
- package/dist/src/travel-slots.js +58 -35
- package/dist/src/travel-timeline.js +44 -63
- package/dist/src/turn-deadline.js +287 -0
- package/dist/src/turn-policy.js +118 -0
- package/dist/src/tz-resolver.js +143 -0
- package/dist/src/unified.js +535 -359
- package/dist/src/wish-pool.js +42 -12
- package/dist/src/write-gate.js +495 -0
- package/dist/src/z3-shared.js +284 -0
- package/extension/README.md +21 -0
- package/extension/README.zh-CN.md +21 -0
- package/extension/background.js +463 -0
- package/extension/content-bridge.js +270 -0
- package/extension/content-main.js +111 -0
- package/extension/manifest.json +60 -0
- package/package.json +407 -14
- package/schemas/booking.intent.schema.json +193 -0
- package/schemas/booking.surface.schema.json +2622 -0
- package/ts/capabilities/agent-reach-deep.ts +114 -0
- package/ts/capabilities/agent-reach.ts +198 -0
- package/ts/capabilities/anything.ts +255 -0
- package/ts/capabilities/artifacts.ts +428 -0
- package/ts/capabilities/fact-log.ts +54 -0
- package/ts/capabilities/flyai-config.ts +388 -0
- package/ts/capabilities/flyai.ts +1274 -0
- package/ts/capabilities/hbcli.ts +253 -71
- package/ts/capabilities/incident-log.ts +88 -59
- package/ts/capabilities/itinerary-artifact.ts +214 -0
- package/ts/capabilities/itinerary-deck-artifact.ts +218 -0
- package/ts/capabilities/itinerary-deck-export.ts +378 -0
- package/ts/capabilities/opensky.ts +121 -0
- package/ts/capabilities/session/action-cache.ts +148 -0
- package/ts/capabilities/session/adapters/ctrip-flight.ts +181 -0
- package/ts/capabilities/session/adapters/ctrip-hotel.ts +238 -0
- package/ts/capabilities/session/adapters/dida-portal.ts +338 -0
- package/ts/capabilities/session/adapters/meituan-local.ts +70 -0
- package/ts/capabilities/session/adapters/rail-12306.ts +392 -0
- package/ts/capabilities/session/benchmark.ts +276 -0
- package/ts/capabilities/session/bridge-ledger.ts +333 -0
- package/ts/capabilities/session/extension-bridge.ts +794 -0
- package/ts/capabilities/session/extension-channel.ts +144 -0
- package/ts/capabilities/session/extension-distribution.ts +266 -0
- package/ts/capabilities/session/extract.ts +54 -0
- package/ts/capabilities/session/golden-score.ts +139 -0
- package/ts/capabilities/session/health-watch.ts +264 -0
- package/ts/capabilities/session/read-guard.ts +141 -0
- package/ts/capabilities/session/static-flight-golden.ts +209 -0
- package/ts/capabilities/session/transport.ts +146 -0
- package/ts/capabilities/session/wizard.ts +140 -0
- package/ts/capabilities/session-consent.ts +211 -0
- package/ts/capabilities/session-login.ts +208 -0
- package/ts/capabilities/session-search.ts +893 -0
- package/ts/capabilities/weather.ts +330 -0
- package/ts/dsh-runtime/vendor/README.md +68 -0
- package/ts/dsh-runtime/vendor/dsh-map-tools/LICENSE +21 -0
- package/ts/dsh-runtime/vendor/dsh-map-tools/README.en.md +405 -0
- package/ts/dsh-runtime/vendor/dsh-map-tools/README.md +404 -0
- package/ts/dsh-runtime/vendor/dsh-map-tools/client/client.js +1584 -0
- package/ts/dsh-runtime/vendor/dsh-map-tools/cordis.patch.yml +5 -0
- package/ts/dsh-runtime/vendor/dsh-map-tools/icon.svg +5 -0
- package/ts/dsh-runtime/vendor/dsh-map-tools/lib/clients/amap.js +595 -0
- package/ts/dsh-runtime/vendor/dsh-map-tools/lib/clients/nominatim.js +63 -0
- package/ts/dsh-runtime/vendor/dsh-map-tools/lib/clients/osrm.js +58 -0
- package/ts/dsh-runtime/vendor/dsh-map-tools/lib/clients/photon.js +55 -0
- package/ts/dsh-runtime/vendor/dsh-map-tools/lib/config-file.js +87 -0
- package/ts/dsh-runtime/vendor/dsh-map-tools/lib/config-route.js +131 -0
- package/ts/dsh-runtime/vendor/dsh-map-tools/lib/config.js +16 -0
- package/ts/dsh-runtime/vendor/dsh-map-tools/lib/geo.js +232 -0
- package/ts/dsh-runtime/vendor/dsh-map-tools/lib/index.js +120 -0
- package/ts/dsh-runtime/vendor/dsh-map-tools/lib/settings-ns.js +40 -0
- package/ts/dsh-runtime/vendor/dsh-map-tools/lib/staticmap-route.js +115 -0
- package/ts/dsh-runtime/vendor/dsh-map-tools/lib/tools/geocode.js +127 -0
- package/ts/dsh-runtime/vendor/dsh-map-tools/lib/tools/poi.js +84 -0
- package/ts/dsh-runtime/vendor/dsh-map-tools/lib/tools/routes.js +267 -0
- package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/clients/amap.d.ts +90 -0
- package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/clients/nominatim.d.ts +17 -0
- package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/clients/osrm.d.ts +15 -0
- package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/clients/photon.d.ts +22 -0
- package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/config-file.d.ts +33 -0
- package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/config-route.d.ts +23 -0
- package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/config.d.ts +23 -0
- package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/geo.d.ts +61 -0
- package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/index.d.ts +18 -0
- package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/settings-ns.d.ts +14 -0
- package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/staticmap-route.d.ts +31 -0
- package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/tools/geocode.d.ts +11 -0
- package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/tools/poi.d.ts +9 -0
- package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/tools/routes.d.ts +75 -0
- package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/types.d.ts +68 -0
- package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types.js +16 -0
- package/ts/dsh-runtime/vendor/dsh-map-tools/package.json +97 -0
- package/ts/package.json +293 -3
- package/ts/scripts/async-collect.ts +91 -0
- package/ts/scripts/map-tools-vendor-package-proof.ts +404 -0
- package/ts/scripts/skeleton-check.ts +1 -1
- package/ts/scripts/skeleton-integration-test.ts +23 -1
- package/ts/scripts/state-cli.ts +568 -0
- package/ts/scripts/turn-handoff-collect.ts +178 -0
- package/ts/src/artifact-gate.ts +991 -0
- package/ts/src/benchmark-agent-conformance.ts +619 -0
- package/ts/src/benchmark-environment-bridge.ts +538 -0
- package/ts/src/benchmark-headless-child-diagnostics.ts +184 -0
- package/ts/src/benchmark-tool-isolation.ts +166 -0
- package/ts/src/bookable-facts.ts +837 -0
- package/ts/src/booking-saga.ts +133 -0
- package/ts/src/booking-surface/availability-policy.ts +522 -0
- package/ts/src/booking-surface/booking-intent.ts +86 -0
- package/ts/src/booking-surface/cancel-refund-commission.ts +488 -0
- package/ts/src/booking-surface/canonical-schema.js +116 -0
- package/ts/src/booking-surface/contracts.ts +475 -0
- package/ts/src/booking-surface/dsh-planner.ts +1949 -0
- package/ts/src/booking-surface/dsh-plugin.js +378 -0
- package/ts/src/booking-surface/dsh-worker.ts +110 -0
- package/ts/src/booking-surface/error-codes.ts +241 -0
- package/ts/src/booking-surface/index.ts +9 -0
- package/ts/src/booking-surface/managed-dsh-cleanup-diagnostic.ts +151 -0
- package/ts/src/booking-surface/managed-dsh-run-port.ts +273 -0
- package/ts/src/booking-surface/profile.ts +42 -0
- package/ts/src/booking-surface/recovery-chain.ts +409 -0
- package/ts/src/booking-surface/runtime.ts +1793 -0
- package/ts/src/booking-surface/server.ts +733 -0
- package/ts/src/booking-surface/startup.ts +201 -0
- package/ts/src/booking-surface/validation.ts +217 -0
- package/ts/src/companions.ts +113 -0
- package/ts/src/contracts.ts +13 -3
- package/ts/src/dsh-llm.ts +44 -11
- package/ts/src/flyai-setup-tool.ts +77 -0
- package/ts/src/index.ts +1948 -198
- package/ts/src/itinerary-deck.ts +189 -0
- package/ts/src/itinerary-doc-shared.ts +741 -0
- package/ts/src/itinerary-html.ts +171 -0
- package/ts/src/loop.ts +223 -25
- package/ts/src/memory-capture.ts +283 -0
- package/ts/src/memory-decay.ts +55 -0
- package/ts/src/memory-utility.ts +70 -0
- package/ts/src/mock-llm.ts +4 -8
- package/ts/src/model.ts +88 -2
- package/ts/src/recall/card.ts +106 -0
- package/ts/src/recall/evaluator.ts +170 -0
- package/ts/src/recall/integration.ts +35 -0
- package/ts/src/recall/tick.ts +213 -0
- package/ts/src/session-link/plan-it-action.ts +78 -0
- package/ts/src/session-link/session-link.ts +275 -0
- package/ts/src/share/adapters.ts +93 -0
- package/ts/src/share/share-consent.ts +105 -0
- package/ts/src/share/share-deck.ts +85 -0
- package/ts/src/share/share-token.ts +166 -0
- package/ts/src/slot-spec.ts +172 -0
- package/ts/src/state-ledger.ts +912 -0
- package/ts/src/subagent-job-id-guard.ts +72 -0
- package/ts/src/time-anchor.ts +338 -0
- package/ts/src/tool-packet.ts +32 -0
- package/ts/src/travel-slots.ts +219 -0
- package/ts/src/travel-timeline.ts +83 -0
- package/ts/src/turn-deadline.ts +366 -0
- package/ts/src/turn-policy.ts +154 -0
- package/ts/src/unified.ts +354 -88
- package/ts/src/wish-pool.ts +79 -0
- package/dist/scripts/session-attach-wait.js +0 -41
|
@@ -0,0 +1,330 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Open-Meteo 天气能力层(免费无 key):预报 + 历史气候回退。
|
|
3
|
+
*
|
|
4
|
+
* 产品定位:替代 LLM 的「雨季常识」——季节性建议、窗口内降雨概率、
|
|
5
|
+
* 体感温度范围,全部走真实数据并带证据标注 [实时API:open-meteo@ts]。
|
|
6
|
+
*
|
|
7
|
+
* 契约(与 hbcli.ts 同构,能力层不变量):
|
|
8
|
+
* - 永不抛错:网络失败/超时/解析失败一律降级返回,不穿透到调用方;
|
|
9
|
+
* - 证据链标注:成功带 [实时API:open-meteo@ts],失败带 [实时API:open-meteo@error@ts];
|
|
10
|
+
* - 免费源无配额概念,但仍记录 latency(供 L5 成本工程度量)。
|
|
11
|
+
*
|
|
12
|
+
* 端点(全部免费,无 key):
|
|
13
|
+
* 预报: https://api.open-meteo.com/v1/forecast (≤16 天)
|
|
14
|
+
* 历史气候: https://archive-api.open-meteo.com/v1/archive (1940→,做季节性)
|
|
15
|
+
* 地理编码: https://geocoding-api.open-meteo.com/v1/search (地名→坐标)
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
export interface WeatherPoint {
|
|
19
|
+
latitude: number
|
|
20
|
+
longitude: number
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface WeatherDaily {
|
|
24
|
+
date: string
|
|
25
|
+
tempMaxC: number
|
|
26
|
+
tempMinC: number
|
|
27
|
+
precipProbMaxPct: number | null
|
|
28
|
+
weatherCode: number
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface WeatherResult {
|
|
32
|
+
ok: boolean
|
|
33
|
+
via: 'open-meteo' | 'open-meteo-error'
|
|
34
|
+
evidence: string
|
|
35
|
+
latencyMs: number
|
|
36
|
+
timezone?: string
|
|
37
|
+
daily?: WeatherDaily[]
|
|
38
|
+
error?: string
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const FORECAST_BASE = 'https://api.open-meteo.com/v1/forecast'
|
|
42
|
+
const ARCHIVE_BASE = 'https://archive-api.open-meteo.com/v1/archive'
|
|
43
|
+
const GEOCODE_BASE = 'https://geocoding-api.open-meteo.com/v1/search'
|
|
44
|
+
|
|
45
|
+
/** WMO weather code → 中文描述(节选最常用的码) */
|
|
46
|
+
const WMO_ZH: Record<number, string> = {
|
|
47
|
+
0: '晴', 1: '大致晴', 2: '多云', 3: '阴',
|
|
48
|
+
45: '雾', 48: '冻雾',
|
|
49
|
+
51: '毛毛雨', 53: '毛毛雨', 55: '密集毛毛雨',
|
|
50
|
+
61: '小雨', 63: '中雨', 65: '大雨',
|
|
51
|
+
66: '冻雨', 67: '强冻雨',
|
|
52
|
+
71: '小雪', 73: '中雪', 75: '大雪', 77: '雪粒',
|
|
53
|
+
80: '阵雨', 81: '强阵雨', 82: '暴雨',
|
|
54
|
+
85: '阵雪', 86: '强阵雪',
|
|
55
|
+
95: '雷暴', 96: '雷暴伴小冰雹', 99: '雷暴伴大冰雹',
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export function wmoLabel(code: number): string {
|
|
59
|
+
return WMO_ZH[code] ?? `天气码${code}`
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
type FetchImpl = typeof fetch
|
|
63
|
+
const monotonicNow = (): number => performance.now()
|
|
64
|
+
const MIN_TIMER_MS = 1
|
|
65
|
+
const TIMEOUT_ERROR = 'timeoutMs must be a finite positive integer'
|
|
66
|
+
const BUDGET_EXHAUSTED_ERROR = 'total timeout budget exhausted'
|
|
67
|
+
const REQUEST_ERROR = 'request failed'
|
|
68
|
+
const normalizeTimeout = (value: number): number | null => Number.isInteger(value) && value > 0 ? value : null
|
|
69
|
+
|
|
70
|
+
/** Rejection values are untrusted: only a real string message is safe to expose. */
|
|
71
|
+
const normalizeError = (value: unknown): string => {
|
|
72
|
+
try {
|
|
73
|
+
if (value instanceof Error && typeof value.message === 'string' && value.message.length > 0) {
|
|
74
|
+
return value.message.slice(0, 200)
|
|
75
|
+
}
|
|
76
|
+
if (typeof value === 'string' && value.length > 0) return value.slice(0, 200)
|
|
77
|
+
} catch {
|
|
78
|
+
return REQUEST_ERROR
|
|
79
|
+
}
|
|
80
|
+
return REQUEST_ERROR
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
async function fetchJson(url: string, timeoutMs: number, headers: Record<string, string> = {}, fetchImpl: FetchImpl = globalThis.fetch): Promise<{ ok: boolean; data?: unknown; error?: string; timedOut?: boolean }> {
|
|
84
|
+
if (!Number.isFinite(timeoutMs) || timeoutMs < MIN_TIMER_MS) return { ok: false, error: BUDGET_EXHAUSTED_ERROR }
|
|
85
|
+
const ctrl = new AbortController()
|
|
86
|
+
const timerDelay = Math.floor(timeoutMs)
|
|
87
|
+
if (timerDelay < MIN_TIMER_MS) return { ok: false, error: BUDGET_EXHAUSTED_ERROR }
|
|
88
|
+
let timer: ReturnType<typeof setTimeout> | undefined
|
|
89
|
+
let timedOut = false
|
|
90
|
+
const timeout = new Promise<never>((_, reject) => {
|
|
91
|
+
timer = setTimeout(() => {
|
|
92
|
+
timedOut = true
|
|
93
|
+
ctrl.abort()
|
|
94
|
+
reject(new Error(`timeout after ${timeoutMs}ms`))
|
|
95
|
+
}, timerDelay)
|
|
96
|
+
})
|
|
97
|
+
const operation = (async () => {
|
|
98
|
+
const res = await fetchImpl(url, { signal: ctrl.signal, headers: { Accept: 'application/json', ...headers } })
|
|
99
|
+
if (!res.ok) return { ok: false, error: `HTTP ${res.status}` }
|
|
100
|
+
return { ok: true, data: await res.json() }
|
|
101
|
+
})()
|
|
102
|
+
try {
|
|
103
|
+
return await Promise.race([operation, timeout])
|
|
104
|
+
} catch (e) {
|
|
105
|
+
return { ok: false, error: normalizeError(e), ...(timedOut ? { timedOut: true } : {}) }
|
|
106
|
+
} finally {
|
|
107
|
+
if (timer !== undefined) clearTimeout(timer)
|
|
108
|
+
void operation.catch(() => undefined)
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
const NOMINATIM_BASE = 'https://nominatim.openstreetmap.org/search'
|
|
113
|
+
|
|
114
|
+
/** 行政级/人口重镇 feature_code(open-meteo 命名惯例):PPLC=首都 PPLA*=首府 PPLB=城镇 PPLX=区片 */
|
|
115
|
+
const MAJOR_FEATURE = /^(PPLC|PPLA|PPLB|PPLX)/
|
|
116
|
+
const isRecord = (value: unknown): value is Record<string, unknown> => value !== null && typeof value === 'object' && !Array.isArray(value)
|
|
117
|
+
|
|
118
|
+
interface GeoHitInternal {
|
|
119
|
+
name: string
|
|
120
|
+
latitude: number
|
|
121
|
+
longitude: number
|
|
122
|
+
country?: string
|
|
123
|
+
admin1?: string
|
|
124
|
+
/** 排序用:open-meteo 有 population;同名小地(村/镇)缺失时按 -1 处理 */
|
|
125
|
+
population: number
|
|
126
|
+
featureCode: string
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
function stripHits(hits: GeoHitInternal[]): Array<{ name: string; latitude: number; longitude: number; country?: string; admin1?: string }> {
|
|
130
|
+
return hits.map(({ name, latitude, longitude, country, admin1 }) =>
|
|
131
|
+
({ ...(country ? { country } : {}), ...(admin1 ? { admin1 } : {}), name, latitude, longitude }))
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/** 地名 → 坐标(双源,供 dsh 工具把「大理」转成经纬度):
|
|
135
|
+
* 1. Open-Meteo(主源):命中按人口/行政级降序——「大理」会同时命中云南州府与四川同名乡,不能盲信次序;
|
|
136
|
+
* 2. Nominatim(兜底):open-meteo 的中文名覆盖有洞(实测(issue #24)「普吉岛」0 结果、
|
|
137
|
+
* 裸词「普吉」错配西藏林芝同名村),弱命中/零结果时走 Nominatim 拿正确目标,
|
|
138
|
+
* 兜底仍空则回退 open-meteo 弱结果(不比此前更差)。 */
|
|
139
|
+
export async function geocodePlace(
|
|
140
|
+
name: string,
|
|
141
|
+
opts: { timeoutMs?: number; count?: number; fetchImpl?: FetchImpl } = {},
|
|
142
|
+
): Promise<{ ok: boolean; evidence: string; via?: 'open-meteo' | 'nominatim'; results: Array<{ name: string; latitude: number; longitude: number; country?: string; admin1?: string }>; error?: string }> {
|
|
143
|
+
const ts = new Date().toISOString()
|
|
144
|
+
const count = opts.count ?? 5
|
|
145
|
+
const query = name.trim()
|
|
146
|
+
const timeoutMs = normalizeTimeout(opts.timeoutMs ?? 15_000)
|
|
147
|
+
if (timeoutMs === null) return { ok: false, evidence: `[实时API:open-meteo-geo@error@${ts}]`, results: [], error: TIMEOUT_ERROR }
|
|
148
|
+
const omUrl = `${GEOCODE_BASE}?name=${encodeURIComponent(query)}&count=${count}&language=zh&format=json`
|
|
149
|
+
// timeoutMs is a budget for the complete primary→fallback chain, not per request.
|
|
150
|
+
const deadline = monotonicNow() + timeoutMs
|
|
151
|
+
const remaining = (): number | null => {
|
|
152
|
+
const value = deadline - monotonicNow()
|
|
153
|
+
return Number.isFinite(value) && value >= MIN_TIMER_MS ? value : null
|
|
154
|
+
}
|
|
155
|
+
const primaryRemaining = remaining()
|
|
156
|
+
const r = primaryRemaining === null
|
|
157
|
+
? { ok: false, error: BUDGET_EXHAUSTED_ERROR }
|
|
158
|
+
: await fetchJson(omUrl, primaryRemaining, {}, opts.fetchImpl)
|
|
159
|
+
const primaryPayload = r.ok && isRecord(r.data) && Array.isArray(r.data['results']) ? r.data['results'] : null
|
|
160
|
+
const omResults: GeoHitInternal[] = primaryPayload
|
|
161
|
+
? primaryPayload.map((item) => {
|
|
162
|
+
if (!isRecord(item)) return null
|
|
163
|
+
const it = item as Record<string, unknown>
|
|
164
|
+
return {
|
|
165
|
+
name: String(it['name'] ?? ''),
|
|
166
|
+
latitude: Number(it['latitude']),
|
|
167
|
+
longitude: Number(it['longitude']),
|
|
168
|
+
country: it['country'] ? String(it['country']) : undefined,
|
|
169
|
+
admin1: it['admin1'] ? String(it['admin1']) : undefined,
|
|
170
|
+
population: Number(it['population'] ?? 0) || 0,
|
|
171
|
+
featureCode: String(it['feature_code'] ?? ''),
|
|
172
|
+
}
|
|
173
|
+
}).filter((h) => !!h && !!h.name && Number.isFinite(h.latitude) && Number.isFinite(h.longitude)) as GeoHitInternal[]
|
|
174
|
+
: []
|
|
175
|
+
omResults.sort((a, b) => (b.population - a.population) || (Number(MAJOR_FEATURE.test(b.featureCode)) - Number(MAJOR_FEATURE.test(a.featureCode))))
|
|
176
|
+
const top = omResults[0]
|
|
177
|
+
// 强命中:有人口规模或主要行政级,直接采信(「深圳市」「曼谷」路径不变)
|
|
178
|
+
if (top && (top.population > 0 || MAJOR_FEATURE.test(top.featureCode))) {
|
|
179
|
+
return { ok: true, evidence: `[实时API:open-meteo-geo@${ts}]`, via: 'open-meteo', results: stripHits(omResults) }
|
|
180
|
+
}
|
|
181
|
+
// 弱命中/零结果/主源请求失败:Nominatim 兜底(免费无 key;中文 accept-language)
|
|
182
|
+
const nomTs = new Date().toISOString()
|
|
183
|
+
const nomUrl = `${NOMINATIM_BASE}?q=${encodeURIComponent(query)}&format=jsonv2&limit=${count}&accept-language=zh&addressdetails=1`
|
|
184
|
+
const fallbackRemaining = primaryRemaining === null || r.timedOut ? null : remaining()
|
|
185
|
+
const nom = fallbackRemaining === null
|
|
186
|
+
? { ok: false, error: BUDGET_EXHAUSTED_ERROR }
|
|
187
|
+
: await fetchJson(nomUrl, fallbackRemaining, { 'User-Agent': 'gotry-travel-agent/0.1 (+https://github.com/Danceiny/gotry)' }, opts.fetchImpl)
|
|
188
|
+
const nomResults: Array<{ name: string; latitude: number; longitude: number; country?: string; admin1?: string }> = []
|
|
189
|
+
if (nom.ok && Array.isArray(nom.data)) {
|
|
190
|
+
const parsedNom = nom.data.map((item) => {
|
|
191
|
+
if (!isRecord(item)) return null
|
|
192
|
+
const it = item as Record<string, unknown>
|
|
193
|
+
const addr = isRecord(it['address']) ? it['address'] : {}
|
|
194
|
+
const country = typeof addr['country'] === 'string' ? addr['country'] : undefined
|
|
195
|
+
const admin1 = [addr['province'], addr['state'], addr['county']].find(v => typeof v === 'string') as string | undefined
|
|
196
|
+
return { name: String(it['name'] ?? ''), latitude: Number(it['lat']), longitude: Number(it['lon']), ...(country ? { country } : {}), ...(admin1 ? { admin1 } : {}) }
|
|
197
|
+
}).filter((h) => !!h && !!h.name && Number.isFinite(h.latitude) && Number.isFinite(h.longitude)) as Array<{ name: string; latitude: number; longitude: number; country?: string; admin1?: string }>
|
|
198
|
+
nomResults.push(...parsedNom)
|
|
199
|
+
}
|
|
200
|
+
if (nomResults.length) {
|
|
201
|
+
const omNote = r.ok
|
|
202
|
+
? `open-meteo ${omResults.length} 条弱命中(无人口/行政级,不足采信)`
|
|
203
|
+
: `open-meteo 失败:${r.error ?? 'HTTP error'}`
|
|
204
|
+
return { ok: true, evidence: `[实时API:nominatim@${nomTs}](兜底层: ${omNote})`, via: 'nominatim', results: nomResults }
|
|
205
|
+
}
|
|
206
|
+
// 双源皆空/兜底失败:open-meteo 有弱结果仍返回(同构「降级不阻塞」契约),否则维持失败终态
|
|
207
|
+
if (omResults.length) {
|
|
208
|
+
return { ok: true, evidence: `[实时API:open-meteo-geo@${ts}]`, via: 'open-meteo', results: stripHits(omResults) }
|
|
209
|
+
}
|
|
210
|
+
return {
|
|
211
|
+
ok: false,
|
|
212
|
+
evidence: `[实时API:open-meteo-geo@error@${ts}];[实时API:nominatim@error@${nomTs}]`,
|
|
213
|
+
results: [],
|
|
214
|
+
error: r.ok ? `双源无结果:${nom.error ?? 'nominatim empty'}` : (r.error),
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/** 未来天气预报(≤16 天) */
|
|
219
|
+
export async function getForecast(
|
|
220
|
+
point: WeatherPoint,
|
|
221
|
+
opts: { days?: number; timeoutMs?: number; fetchImpl?: FetchImpl } = {},
|
|
222
|
+
): Promise<WeatherResult> {
|
|
223
|
+
const started = monotonicNow()
|
|
224
|
+
const ts = new Date().toISOString()
|
|
225
|
+
const requestedDays = opts.days ?? 7
|
|
226
|
+
const days = Number.isInteger(requestedDays) && requestedDays > 0 ? Math.min(requestedDays, 16) : 0
|
|
227
|
+
const timeoutMs = normalizeTimeout(opts.timeoutMs ?? 15_000)
|
|
228
|
+
if (days < 1 || timeoutMs === null) return { ok: false, via: 'open-meteo-error', evidence: `[实时API:open-meteo@error@${ts}]`, latencyMs: monotonicNow() - started, error: days < 1 ? 'days must be valid positive values' : TIMEOUT_ERROR }
|
|
229
|
+
const url = `${FORECAST_BASE}?latitude=${point.latitude}&longitude=${point.longitude}`
|
|
230
|
+
+ `&daily=temperature_2m_max,temperature_2m_min,precipitation_probability_max,weathercode`
|
|
231
|
+
+ `&forecast_days=${days}&timezone=auto`
|
|
232
|
+
const r = await fetchJson(url, timeoutMs, {}, opts.fetchImpl)
|
|
233
|
+
const latencyMs = monotonicNow() - started
|
|
234
|
+
if (!r.ok) {
|
|
235
|
+
return { ok: false, via: 'open-meteo-error', evidence: `[实时API:open-meteo@error@${ts}]`, latencyMs, error: r.error }
|
|
236
|
+
}
|
|
237
|
+
const payload = isRecord(r.data) ? r.data : null
|
|
238
|
+
const daily = isRecord(payload?.['daily']) ? payload['daily'] as { time?: unknown[]; temperature_2m_max?: unknown[]; temperature_2m_min?: unknown[]; precipitation_probability_max?: unknown[]; weathercode?: unknown[] } : null
|
|
239
|
+
if (!daily || !Array.isArray(daily.time) || !Array.isArray(daily.temperature_2m_max)
|
|
240
|
+
|| !Array.isArray(daily.temperature_2m_min) || !Array.isArray(daily.weathercode)
|
|
241
|
+
|| daily.time.length !== days || daily.temperature_2m_max.length !== days
|
|
242
|
+
|| daily.temperature_2m_min.length !== days || daily.weathercode.length !== days
|
|
243
|
+
|| daily.time.some(v => typeof v !== 'string')
|
|
244
|
+
|| daily.temperature_2m_max.some(v => typeof v !== 'number' || !Number.isFinite(v))
|
|
245
|
+
|| daily.temperature_2m_min.some(v => typeof v !== 'number' || !Number.isFinite(v))
|
|
246
|
+
|| daily.weathercode.some(v => typeof v !== 'number' || !Number.isFinite(v))
|
|
247
|
+
|| (daily.precipitation_probability_max !== undefined && daily.precipitation_probability_max !== null
|
|
248
|
+
&& !Array.isArray(daily.precipitation_probability_max))
|
|
249
|
+
|| (Array.isArray(daily.precipitation_probability_max)
|
|
250
|
+
&& (daily.precipitation_probability_max.length !== days
|
|
251
|
+
|| daily.precipitation_probability_max.some(v => v !== null && (typeof v !== 'number' || !Number.isFinite(v)))))) {
|
|
252
|
+
return { ok: false, via: 'open-meteo-error', evidence: `[实时API:open-meteo@error@${ts}]`, latencyMs, error: 'empty daily payload' }
|
|
253
|
+
}
|
|
254
|
+
const times = daily.time as string[]
|
|
255
|
+
const maxes = daily.temperature_2m_max as number[]
|
|
256
|
+
const mins = daily.temperature_2m_min as number[]
|
|
257
|
+
const codes = daily.weathercode as number[]
|
|
258
|
+
const precip = Array.isArray(daily.precipitation_probability_max)
|
|
259
|
+
? daily.precipitation_probability_max as Array<number | null>
|
|
260
|
+
: undefined
|
|
261
|
+
const rows: WeatherDaily[] = times.map((date, i) => ({
|
|
262
|
+
date, tempMaxC: maxes[i]!, tempMinC: mins[i]!, precipProbMaxPct: precip?.[i] ?? null, weatherCode: codes[i]!,
|
|
263
|
+
}))
|
|
264
|
+
return {
|
|
265
|
+
ok: true, via: 'open-meteo',
|
|
266
|
+
evidence: `[实时API:open-meteo@${ts}]`,
|
|
267
|
+
latencyMs,
|
|
268
|
+
timezone: typeof payload?.['timezone'] === 'string' ? payload['timezone'] : undefined,
|
|
269
|
+
daily: rows,
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
/** 历史气候(季节性推荐底座:去年同期日均温/降雨概率) */
|
|
274
|
+
export async function getClimate(
|
|
275
|
+
point: WeatherPoint,
|
|
276
|
+
month: number,
|
|
277
|
+
opts: { year?: number; timeoutMs?: number; fetchImpl?: FetchImpl } = {},
|
|
278
|
+
): Promise<WeatherResult> {
|
|
279
|
+
const started = monotonicNow()
|
|
280
|
+
const ts = new Date().toISOString()
|
|
281
|
+
const timeoutMs = normalizeTimeout(opts.timeoutMs ?? 15_000)
|
|
282
|
+
if (timeoutMs === null) return { ok: false, via: 'open-meteo-error', evidence: `[实时API:open-meteo-climate@error@${ts}]`, latencyMs: monotonicNow() - started, error: TIMEOUT_ERROR }
|
|
283
|
+
// 默认取去年同月做气候基线
|
|
284
|
+
const year = opts.year ?? (new Date().getUTCFullYear() - 1)
|
|
285
|
+
if (!Number.isInteger(month) || month < 1 || month > 12 || !Number.isInteger(year) || year < 1940 || year > new Date().getUTCFullYear()) {
|
|
286
|
+
return { ok: false, via: 'open-meteo-error', evidence: `[实时API:open-meteo-climate@error@${ts}]`, latencyMs: monotonicNow() - started, error: 'month/year must be valid historical calendar values' }
|
|
287
|
+
}
|
|
288
|
+
const lastDay = new Date(Date.UTC(year, month, 0)).getUTCDate()
|
|
289
|
+
const expectedDates = Array.from({ length: lastDay }, (_, i) => `${year}-${String(month).padStart(2, '0')}-${String(i + 1).padStart(2, '0')}`)
|
|
290
|
+
const start = `${year}-${String(month).padStart(2, '0')}-01`
|
|
291
|
+
const end = `${year}-${String(month).padStart(2, '0')}-${String(lastDay).padStart(2, '0')}`
|
|
292
|
+
const url = `${ARCHIVE_BASE}?latitude=${point.latitude}&longitude=${point.longitude}`
|
|
293
|
+
+ `&start_date=${start}&end_date=${end}`
|
|
294
|
+
+ `&daily=temperature_2m_max,temperature_2m_min,precipitation_sum,weathercode&timezone=auto`
|
|
295
|
+
const r = await fetchJson(url, timeoutMs, {}, opts.fetchImpl)
|
|
296
|
+
const latencyMs = monotonicNow() - started
|
|
297
|
+
if (!r.ok) {
|
|
298
|
+
return { ok: false, via: 'open-meteo-error', evidence: `[实时API:open-meteo-climate@error@${ts}]`, latencyMs, error: r.error }
|
|
299
|
+
}
|
|
300
|
+
const payload = isRecord(r.data) ? r.data : null
|
|
301
|
+
const daily = isRecord(payload?.['daily']) ? payload['daily'] as { time?: unknown[]; temperature_2m_max?: unknown[]; temperature_2m_min?: unknown[]; weathercode?: unknown[] } : null
|
|
302
|
+
if (!daily || !Array.isArray(daily.time) || !Array.isArray(daily.temperature_2m_max)
|
|
303
|
+
|| !Array.isArray(daily.temperature_2m_min) || !Array.isArray(daily.weathercode)
|
|
304
|
+
|| daily.time.length !== lastDay
|
|
305
|
+
|| daily.time.length !== daily.temperature_2m_max.length
|
|
306
|
+
|| daily.time.length !== daily.temperature_2m_min.length
|
|
307
|
+
|| daily.time.length !== daily.weathercode.length
|
|
308
|
+
|| daily.time.some(v => typeof v !== 'string')
|
|
309
|
+
|| daily.time.some((v, i) => v !== expectedDates[i])
|
|
310
|
+
|| daily.temperature_2m_max.some(v => typeof v !== 'number' || !Number.isFinite(v))
|
|
311
|
+
|| daily.temperature_2m_min.some(v => typeof v !== 'number' || !Number.isFinite(v))
|
|
312
|
+
|| daily.weathercode.some(v => typeof v !== 'number' || !Number.isFinite(v))) {
|
|
313
|
+
return { ok: false, via: 'open-meteo-error', evidence: `[实时API:open-meteo-climate@error@${ts}]`, latencyMs, error: 'empty daily payload' }
|
|
314
|
+
}
|
|
315
|
+
const times = daily.time as string[]
|
|
316
|
+
const maxes = daily.temperature_2m_max as number[]
|
|
317
|
+
const mins = daily.temperature_2m_min as number[]
|
|
318
|
+
const codes = daily.weathercode as number[]
|
|
319
|
+
const rows: WeatherDaily[] = times.map((date, i) => ({
|
|
320
|
+
date, tempMaxC: maxes[i]!, tempMinC: mins[i]!, precipProbMaxPct: null, // archive 端点没有概率,用降水量另行估算
|
|
321
|
+
weatherCode: codes[i]!,
|
|
322
|
+
}))
|
|
323
|
+
return {
|
|
324
|
+
ok: true, via: 'open-meteo',
|
|
325
|
+
evidence: `[实时API:open-meteo-climate@${ts}]`,
|
|
326
|
+
latencyMs,
|
|
327
|
+
timezone: typeof payload?.['timezone'] === 'string' ? payload['timezone'] : undefined,
|
|
328
|
+
daily: rows,
|
|
329
|
+
}
|
|
330
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# vendored dsh runtime(`vendor/`)
|
|
2
|
+
|
|
3
|
+
本目录是 [DeepSeek Harness(dsh CLI)](https://github.com/deepseek-ai/DeepSeek-Harness)
|
|
4
|
+
dsh 发布家族的全量 vendored 成员,pnpm workspace 方式参与安装
|
|
5
|
+
(`ts/dsh-runtime/pnpm-workspace.yaml` 声明 `vendor/*`,`linkWorkspacePackages: true`)。
|
|
6
|
+
|
|
7
|
+
## 当前版本
|
|
8
|
+
|
|
9
|
+
- 上游:`dsh-v0.1.2-alpha.1`(tag;alpha 面向 monorepo 内部,尚未发布到
|
|
10
|
+
npm 公共 registry——npm latest 仍为 `0.1.1-rc.2`,等上游 publish 后本目录
|
|
11
|
+
可整体换回 npm 依赖形态)。
|
|
12
|
+
- 源 commit:`cd5ef814`(/tmp 构建树为浅克隆同源;发布 tag 见上游 releases)。
|
|
13
|
+
- License:MIT © DeepSeek(upstream LICENSE);本仓 MIT 使用。
|
|
14
|
+
|
|
15
|
+
## 为什么 vendored(而不是 npm 依赖)
|
|
16
|
+
|
|
17
|
+
- 上游只挂 GitHub 预发布 tag;依赖闭包(dsh 家族 ~187 个内部包 + cordis/
|
|
18
|
+
schemastery 等 vendor 家族)里 **dsh 家族全部 0.1.2-alpha.1 均不在公共
|
|
19
|
+
npm**,外部环境不可安装。
|
|
20
|
+
- `ts/dsh-runtime` 只影响 repo 工作副本与 `./gotry`;npm 公共分发面
|
|
21
|
+
(root `package.json`)仍钉 rc.2,不受影响;CI 不安装本目录。
|
|
22
|
+
- workspace 成员 + `linkWorkspacePackages: true` 让成员间
|
|
23
|
+
`^0.1.2-alpha.1` 的 range 直接命中本地版本,干净克隆只依赖本仓文件 +
|
|
24
|
+
公共 registry(第三方),不依赖内部镜像。
|
|
25
|
+
|
|
26
|
+
## 非 dsh 家族成员:`vendor/dsh-map-tools`
|
|
27
|
+
|
|
28
|
+
`dsh-map-tools`(dshmarket 第三方宿主插件,地图/路线/POI,零 key 走
|
|
29
|
+
OSM/OSRM)与 dsh 家族不同源,进本目录的原因是 **npm 依赖形态被上游
|
|
30
|
+
peerDependencies 否决**:历史上游要求 `dsh-settings`/`dsh-tools`
|
|
31
|
+
`>=0.1.2-rc.1`,而 gotry 历史锁定的运行时家族是 `0.1.2-alpha.3`
|
|
32
|
+
(semver 上 alpha < rc)——npm/npx 严格 peer 解析直接 ERESOLVE
|
|
33
|
+
(optionalDependencies 也不豁免),硬依赖会弄坏 `npx @danceiny/gotry`
|
|
34
|
+
主安装路径。当前锁定 `0.2.0-rc.2` 家族(issue #600):上游 `>=0.1.2-rc.1`
|
|
35
|
+
开区间直接满足,npm 解析与 0.2.0 起的运行时 peer 兼容闸均通过;但继续
|
|
36
|
+
保持 vendored 形态(避免在 npm 依赖面引入额外硬依赖而弄坏
|
|
37
|
+
`npx @danceiny/gotry` 主安装路径),vendored 副本为上游 `0.7.3`
|
|
38
|
+
原样内容 + settings-ns.js 适配(SettingsForms 页策略,旧线型兼容)+ 双语 README 来源通知。vendor 副本随 tarball 分发
|
|
39
|
+
(root `package.json` `files[]` 含本目录),`bin/gotry-inner.js`
|
|
40
|
+
解析链 vendor 优先;
|
|
41
|
+
升级 = 从 npm 拉 `dsh-map-tools@<new>` 覆盖本目录(保留来源与
|
|
42
|
+
license:MIT,上游 package.json 里无 devDependencies 需清理;
|
|
43
|
+
0.5.1→0.7.3 实操:`npm pack dsh-map-tools@0.7.3` 解包覆盖 +
|
|
44
|
+
双语 README 追加 vendored 通知 + 更新 map-tools-vendor-package-proof
|
|
45
|
+
的 version/fileCount/aggregateSha256)。
|
|
46
|
+
|
|
47
|
+
## 升级/复现流程(dsh 家族,下个版本照抄)
|
|
48
|
+
|
|
49
|
+
1. `git clone --depth 1 --branch <tag> https://github.com/deepseek-ai/DeepSeek-Harness.git /tmp/dsh-<tag>`
|
|
50
|
+
2. `cd /tmp/dsh-<tag> && pnpm install && pnpm build:official`
|
|
51
|
+
3. `pnpm release:pack --family dsh --out dist/dsh`(产出 241 个 tarball)
|
|
52
|
+
4. 解包 tarball(`package/` 前缀剥掉)平铺进 `vendor/<kebab-name>/`
|
|
53
|
+
5. manifest 归一处:**删除各成员的 `devDependencies`**(上游 devDeps 引用
|
|
54
|
+
未进发布家族的 experimental 私有包,npm 安装形态本就不装 devDeps;
|
|
55
|
+
唯 `@deepseek-ai/dsh-subprocess-local` 的 `postinstall` 保
|
|
56
|
+
留——恢复 node-pty spawn-helper 可执行位,终局面依赖);
|
|
57
|
+
`scripts` 里 dev 期 `bundle/watch/build` 一并丢弃。
|
|
58
|
+
6. 更新 `package.json` 的 4 个直接依赖版本 + `pnpm install` 重新生成 lockfile
|
|
59
|
+
7. 验证:`./gotry help` 报版本;`cd ts && npx tsc --noEmit && npx tsx scripts/smoke.ts`;
|
|
60
|
+
全量 `bash scripts/run-all-tests.sh` 全绿后才可提交。
|
|
61
|
+
|
|
62
|
+
## 纪律
|
|
63
|
+
|
|
64
|
+
- 本目录内容必须与上游 tag 的 tarball 逐字节一致(`devDependencies`/
|
|
65
|
+
dev 期 `scripts` 除外);不得手改 vendor 内代码——补丁面一律走 gotry 侧
|
|
66
|
+
(`cordis.gotry-patch.yml` / `bin/gotry-inner.js`)。
|
|
67
|
+
- `gotry-state/`、`node_modules/` 已 gitignore;`vendor/` 与三份 manifest
|
|
68
|
+
(package.json / pnpm-lock.yaml / pnpm-workspace.yaml / .npmrc)入 git。
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 HorusJiang
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|