@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,27 @@
|
|
|
1
|
+
import type { ChildProcess, SpawnOptions } from 'node:child_process'
|
|
2
|
+
|
|
3
|
+
export interface OwnedChild {
|
|
4
|
+
child: ChildProcess
|
|
5
|
+
groupPid: number | null
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export interface OwnedChildCleanupResult {
|
|
9
|
+
childExited: boolean
|
|
10
|
+
groupEmpty: boolean
|
|
11
|
+
forced: boolean
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export interface OwnedChildCleanupOptions {
|
|
15
|
+
child?: ChildProcess | null
|
|
16
|
+
groupPid?: number | null
|
|
17
|
+
signal?: NodeJS.Signals
|
|
18
|
+
termGraceMs?: number
|
|
19
|
+
killWaitMs?: number
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export declare function spawnOwnedChild(command: string, args: readonly string[], options?: SpawnOptions): OwnedChild
|
|
23
|
+
export declare function signalOwnedChild(child: ChildProcess | null | undefined, signal: NodeJS.Signals, groupPid?: number | null): void
|
|
24
|
+
export declare function isOwnedProcessGroupEmpty(groupPid: number | null): boolean
|
|
25
|
+
export declare function waitForOwnedChildQuiescence(child: ChildProcess, groupPid?: number | null, timeoutMs?: number): Promise<boolean>
|
|
26
|
+
export declare function terminateOwnedChild(options?: OwnedChildCleanupOptions): Promise<OwnedChildCleanupResult>
|
|
27
|
+
export declare const PROCESS_LIVENESS_BOUNDS: Readonly<{ termGraceMs: number; killWaitMs: number }>
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GoTry-owned lifecycle for one externally spawned dsh child.
|
|
3
|
+
*
|
|
4
|
+
* The dsh CLI is an external process boundary. On POSIX we make it the
|
|
5
|
+
* leader of its own process group so a parent-only signal or a failed dsh
|
|
6
|
+
* child cannot strand descendants. This module owns only bounded signalling
|
|
7
|
+
* and quiescence observation; incident formatting remains in the existing
|
|
8
|
+
* GoTry incident writer.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { spawn } from 'node:child_process'
|
|
12
|
+
|
|
13
|
+
const DEFAULT_TERM_GRACE_MS = 5_000
|
|
14
|
+
const DEFAULT_KILL_WAIT_MS = 1_000
|
|
15
|
+
const POLL_MS = 20
|
|
16
|
+
|
|
17
|
+
/** Spawn a child in a private process group where the host supports it. */
|
|
18
|
+
export function spawnOwnedChild(command, args, options = {}) {
|
|
19
|
+
const child = spawn(command, args, {
|
|
20
|
+
...options,
|
|
21
|
+
detached: process.platform !== 'win32',
|
|
22
|
+
})
|
|
23
|
+
return {
|
|
24
|
+
child,
|
|
25
|
+
groupPid: process.platform !== 'win32' ? (child.pid ?? null) : null,
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/** Signal the child group, falling back to the direct child when necessary. */
|
|
30
|
+
export function signalOwnedChild(child, signal, groupPid = null) {
|
|
31
|
+
if (!child) return
|
|
32
|
+
if (process.platform !== 'win32' && groupPid !== null) {
|
|
33
|
+
try {
|
|
34
|
+
process.kill(-groupPid, signal)
|
|
35
|
+
return
|
|
36
|
+
} catch {
|
|
37
|
+
// The group can disappear between observation and delivery. Try the
|
|
38
|
+
// direct handle as a best-effort race fallback.
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
try { child.kill(signal) } catch { /* exit races are contained */ }
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function childExited(child) {
|
|
45
|
+
return child.exitCode !== null || child.signalCode !== null
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function groupEmpty(groupPid) {
|
|
49
|
+
if (process.platform === 'win32' || groupPid === null) return true
|
|
50
|
+
try {
|
|
51
|
+
process.kill(-groupPid, 0)
|
|
52
|
+
return false
|
|
53
|
+
} catch (error) {
|
|
54
|
+
return error?.code === 'ESRCH'
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/** Expose the same group-emptiness fact used by the bounded cleanup proof. */
|
|
59
|
+
export function isOwnedProcessGroupEmpty(groupPid) {
|
|
60
|
+
return groupEmpty(groupPid)
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** Wait for the direct child and, on POSIX, its whole private group. */
|
|
64
|
+
export async function waitForOwnedChildQuiescence(child, groupPid = null, timeoutMs = DEFAULT_TERM_GRACE_MS) {
|
|
65
|
+
const deadline = Date.now() + timeoutMs
|
|
66
|
+
while (Date.now() <= deadline) {
|
|
67
|
+
if (childExited(child) && groupEmpty(groupPid)) return true
|
|
68
|
+
await new Promise((resolve) => setTimeout(resolve, POLL_MS))
|
|
69
|
+
}
|
|
70
|
+
return childExited(child) && groupEmpty(groupPid)
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Bounded TERM → KILL cleanup for one owned child group. It resolves only
|
|
75
|
+
* after the direct child and group are observed empty, or after the bound.
|
|
76
|
+
*/
|
|
77
|
+
export async function terminateOwnedChild({
|
|
78
|
+
child,
|
|
79
|
+
groupPid = null,
|
|
80
|
+
signal = 'SIGTERM',
|
|
81
|
+
termGraceMs = DEFAULT_TERM_GRACE_MS,
|
|
82
|
+
killWaitMs = DEFAULT_KILL_WAIT_MS,
|
|
83
|
+
} = {}) {
|
|
84
|
+
if (!child) return { childExited: true, groupEmpty: true, forced: false }
|
|
85
|
+
signalOwnedChild(child, signal, groupPid)
|
|
86
|
+
if (await waitForOwnedChildQuiescence(child, groupPid, termGraceMs)) {
|
|
87
|
+
return { childExited: true, groupEmpty: true, forced: false }
|
|
88
|
+
}
|
|
89
|
+
signalOwnedChild(child, 'SIGKILL', groupPid)
|
|
90
|
+
const empty = await waitForOwnedChildQuiescence(child, groupPid, killWaitMs)
|
|
91
|
+
return { childExited: childExited(child), groupEmpty: empty, forced: true }
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export const PROCESS_LIVENESS_BOUNDS = Object.freeze({
|
|
95
|
+
termGraceMs: DEFAULT_TERM_GRACE_MS,
|
|
96
|
+
killWaitMs: DEFAULT_KILL_WAIT_MS,
|
|
97
|
+
})
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export type DshResolver = {
|
|
2
|
+
resolve(specifier: string): string
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
export type DshRuntime = {
|
|
6
|
+
bin: string
|
|
7
|
+
version: string
|
|
8
|
+
source: 'root'
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export const REQUIRED_BENCHMARK_DSH_VERSION: '0.2.0-rc.2'
|
|
12
|
+
|
|
13
|
+
export function readDshPackage(bin: string): Omit<DshRuntime, 'source'> | null
|
|
14
|
+
export function resolveDshPackage(resolver: DshResolver): Omit<DshRuntime, 'source'> | null
|
|
15
|
+
export function supportsNodeVersion(version: string): boolean
|
|
16
|
+
export function selectDshRuntime(options: {
|
|
17
|
+
repoRoot: string
|
|
18
|
+
rootResolver: DshResolver
|
|
19
|
+
benchmark: boolean
|
|
20
|
+
}): DshRuntime | null
|
|
21
|
+
export function benchmarkRuntimeSupported(runtime: { version: string } | null): boolean
|
|
22
|
+
export function selectDshCwd(options: {
|
|
23
|
+
repoRoot: string
|
|
24
|
+
invocationCwd: string
|
|
25
|
+
sourceCheckoutMode: boolean
|
|
26
|
+
benchmark: boolean
|
|
27
|
+
}): string
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs'
|
|
2
|
+
import { dirname, join } from 'node:path'
|
|
3
|
+
|
|
4
|
+
export const REQUIRED_BENCHMARK_DSH_VERSION = '0.2.0-rc.2'
|
|
5
|
+
|
|
6
|
+
export function readDshPackage(bin) {
|
|
7
|
+
try {
|
|
8
|
+
const packageJson = join(dirname(dirname(bin)), 'package.json')
|
|
9
|
+
const metadata = JSON.parse(readFileSync(packageJson, 'utf8'))
|
|
10
|
+
return typeof metadata.version === 'string' ? { bin, version: metadata.version } : null
|
|
11
|
+
} catch {
|
|
12
|
+
return null
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function resolveDshPackage(resolver) {
|
|
17
|
+
try {
|
|
18
|
+
return readDshPackage(resolver.resolve('@deepseek-ai/dsh/lib/bin.js'))
|
|
19
|
+
} catch {
|
|
20
|
+
return null
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export function supportsNodeVersion(version) {
|
|
25
|
+
const match = /^(\d+)\.(\d+)/.exec(version)
|
|
26
|
+
if (!match) return false
|
|
27
|
+
const major = Number(match[1])
|
|
28
|
+
const minor = Number(match[2])
|
|
29
|
+
return major > 22 || (major === 22 && minor >= 15)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function selectDshRuntime({ rootResolver }) {
|
|
33
|
+
const root = resolveDshPackage(rootResolver)
|
|
34
|
+
if (root) return { ...root, source: 'root' }
|
|
35
|
+
// D-27 清偿(issue #120):legacy vendored 回退路径已移除——该形态的 Node 兼容窗口
|
|
36
|
+
// 断裂(Round 5 起「不承诺可运行」),解析成功只会把「dsh 缺失」变成下游玄学失败。
|
|
37
|
+
// 唯一受支持形态 = root manifest / 依赖解析(232 精确依赖闭包);找不到即 fail-closed,
|
|
38
|
+
// 由调用方给明确重装指引。benchmark 原本就禁用回退,语义不变(入参保留以稳调用面)。
|
|
39
|
+
return null
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export function benchmarkRuntimeSupported(runtime) {
|
|
43
|
+
return runtime?.version === REQUIRED_BENCHMARK_DSH_VERSION
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export function selectDshCwd({ repoRoot, invocationCwd, sourceCheckoutMode, benchmark }) {
|
|
47
|
+
if (sourceCheckoutMode && !benchmark) return join(repoRoot, 'ts/dsh-runtime')
|
|
48
|
+
return invocationCwd
|
|
49
|
+
}
|
package/bin/gotry.js
CHANGED
|
@@ -17,7 +17,7 @@ if [ -z "$conf" ] || [ ! -x "$conf" ]; then
|
|
|
17
17
|
fi
|
|
18
18
|
if [ -z "$conf" ] || [ ! -x "$conf" ]; then
|
|
19
19
|
cat >&2 <<'EOF'
|
|
20
|
-
gotry: node not found in PATH. Install Node 22+:
|
|
20
|
+
gotry: node not found in PATH. Install Node 22.15+:
|
|
21
21
|
macOS: brew install node@22 (or use nvm)
|
|
22
22
|
Linux: https://nodejs.org/
|
|
23
23
|
|
package/client/client.js
ADDED
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* GoTry's public DSH Web client half.
|
|
3
|
+
*
|
|
4
|
+
* This is a lazy-CJS browser bundle. The host serves it through the exact
|
|
5
|
+
* `./client` export and DSH materializes it with the platform React module.
|
|
6
|
+
* The Client receives the frozen `block` from the runtime; Host
|
|
7
|
+
* presentationMeta/presentResult values are not available here.
|
|
8
|
+
*/
|
|
9
|
+
window.__ModuleLoader__.load({
|
|
10
|
+
id: '@danceiny/gotry',
|
|
11
|
+
factory: (require) => {
|
|
12
|
+
var module = { exports: {} }
|
|
13
|
+
var exports = module.exports
|
|
14
|
+
var React = require('react')
|
|
15
|
+
|
|
16
|
+
function element(type, props, children) {
|
|
17
|
+
return React.createElement(type, props, ...(Array.isArray(children) ? children : [children]))
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function object(value) {
|
|
21
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value) ? value : null
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function isSettled(block) {
|
|
25
|
+
return object(block)?.kind === 'tool-result'
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function resultText(block) {
|
|
29
|
+
var content = Array.isArray(block?.content) ? block.content : []
|
|
30
|
+
var text = content.map(function (item) {
|
|
31
|
+
return item && item.type === 'text' && typeof item.text === 'string' ? item.text : JSON.stringify(item)
|
|
32
|
+
}).filter(Boolean).join('\n')
|
|
33
|
+
var error = object(block?.error)
|
|
34
|
+
if (!text && error) text = String(error.name || 'Tool error') + ': ' + String(error.code || 'unknown')
|
|
35
|
+
return text
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function stateOf(block) {
|
|
39
|
+
if (!isSettled(block)) return 'running'
|
|
40
|
+
return block.isError ? 'error' : 'ok'
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function metaOf(block) {
|
|
44
|
+
return object(block?.meta)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function shellProps(type, state) {
|
|
48
|
+
return {
|
|
49
|
+
'data-gotry-artifact-card': type,
|
|
50
|
+
'data-gotry-artifact-state': state,
|
|
51
|
+
role: 'region',
|
|
52
|
+
'aria-label': type === 'list' ? 'GoTry artifacts' : 'GoTry artifact preview',
|
|
53
|
+
style: {
|
|
54
|
+
border: '1px solid var(--dsw-alias-border-l1, rgba(127,127,127,.35))',
|
|
55
|
+
borderRadius: '12px',
|
|
56
|
+
margin: '6px 0',
|
|
57
|
+
overflow: 'hidden',
|
|
58
|
+
background: 'var(--dsw-alias-bg-layer-3, rgba(127,127,127,.05))',
|
|
59
|
+
},
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function statusLine(state, type) {
|
|
64
|
+
if (state === 'running') return type === 'list' ? '正在查找产物…' : '正在读取产物…'
|
|
65
|
+
if (state === 'error') return type === 'list' ? '产物列表读取失败' : '产物预览失败'
|
|
66
|
+
return type === 'list' ? '可打开的 GoTry 产物' : '产物预览'
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function isHtmlPath(path) {
|
|
70
|
+
return typeof path === 'string' && /\.(html|htm)$/i.test(path)
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function ArtifactListCard(props) {
|
|
74
|
+
var block = props.block
|
|
75
|
+
var state = stateOf(block)
|
|
76
|
+
var meta = metaOf(block)
|
|
77
|
+
var selectedState = React.useState(null)
|
|
78
|
+
var selected = selectedState[0]
|
|
79
|
+
var setSelected = selectedState[1]
|
|
80
|
+
var valid = state === 'ok' && meta && meta.shape === 'paths' && Array.isArray(meta.paths) &&
|
|
81
|
+
meta.paths.every(function (path) { return typeof path === 'string' && path.length > 0 }) &&
|
|
82
|
+
typeof meta.total === 'number' && Number.isInteger(meta.total) && meta.total >= 0 &&
|
|
83
|
+
typeof meta.truncated === 'boolean'
|
|
84
|
+
var text = resultText(block)
|
|
85
|
+
var children = [element('div', { style: { padding: '10px 14px 4px', fontWeight: 600 } }, statusLine(state, 'list'))]
|
|
86
|
+
if (state === 'running') {
|
|
87
|
+
children.push(element('p', { 'data-gotry-artifact-status': 'running', style: { padding: '0 14px 12px', margin: 0 } }, '等待运行时返回路径…'))
|
|
88
|
+
} else if (state === 'error') {
|
|
89
|
+
children.push(element('p', { 'data-gotry-artifact-status': 'error', style: { padding: '0 14px 12px', margin: 0, color: 'var(--dsw-alias-state-error-primary, #c44)' } }, text || '未知错误'))
|
|
90
|
+
} else if (!valid) {
|
|
91
|
+
children.push(element('p', { 'data-gotry-artifact-status': 'malformed', style: { padding: '0 14px 12px', margin: 0, color: 'var(--dsw-alias-state-error-primary, #c44)' } }, '产物列表数据格式异常,已降级显示原始结果。'))
|
|
92
|
+
if (text) children.push(element('pre', { style: { whiteSpace: 'pre-wrap', padding: '0 14px 12px', margin: 0 } }, text))
|
|
93
|
+
} else {
|
|
94
|
+
var list = meta.paths.map(function (path) {
|
|
95
|
+
var isSelected = selected === path
|
|
96
|
+
var htmlPreview = isHtmlPath(path)
|
|
97
|
+
var buttonProps = {
|
|
98
|
+
type: 'button',
|
|
99
|
+
'data-gotry-artifact-path': path,
|
|
100
|
+
'aria-pressed': isSelected,
|
|
101
|
+
onClick: function () {
|
|
102
|
+
setSelected(path)
|
|
103
|
+
if (typeof props.openFile === 'function') props.openFile(path)
|
|
104
|
+
},
|
|
105
|
+
style: {
|
|
106
|
+
color: 'var(--dsw-alias-accent, #4f8cff)',
|
|
107
|
+
background: 'none',
|
|
108
|
+
border: 0,
|
|
109
|
+
padding: 0,
|
|
110
|
+
cursor: 'pointer',
|
|
111
|
+
textAlign: 'left',
|
|
112
|
+
textDecoration: isSelected ? 'underline' : 'none',
|
|
113
|
+
},
|
|
114
|
+
}
|
|
115
|
+
var label = path
|
|
116
|
+
if (htmlPreview) {
|
|
117
|
+
buttonProps['data-gotry-artifact-open'] = 'html-preview'
|
|
118
|
+
buttonProps['aria-label'] = 'Open HTML preview ' + path
|
|
119
|
+
buttonProps.title = '打开 HTML 预览:这是可直接查看的网页文件,其中的脚本可能会运行;只想看源码请用读取结果里的文本视图。'
|
|
120
|
+
label = [
|
|
121
|
+
element('span', { key: 'path' }, path),
|
|
122
|
+
element('span', {
|
|
123
|
+
key: 'badge',
|
|
124
|
+
'data-gotry-artifact-badge': 'html-preview',
|
|
125
|
+
style: {
|
|
126
|
+
marginLeft: '6px', padding: '0 6px', borderRadius: '999px',
|
|
127
|
+
border: '1px solid currentColor', fontSize: '11px', opacity: .75,
|
|
128
|
+
},
|
|
129
|
+
}, 'HTML 预览'),
|
|
130
|
+
]
|
|
131
|
+
} else {
|
|
132
|
+
buttonProps['data-gotry-artifact-open'] = 'artifact'
|
|
133
|
+
buttonProps['aria-label'] = 'Open artifact ' + path
|
|
134
|
+
}
|
|
135
|
+
return element('li', { key: path, style: { margin: '4px 0' } }, element('button', buttonProps, label))
|
|
136
|
+
})
|
|
137
|
+
children.push(element('div', { style: { padding: '0 14px 10px', color: 'var(--dsw-alias-label-secondary, #888)' } },
|
|
138
|
+
'共 ' + String(meta.total) + ' 项' + (meta.truncated ? '(已截断)' : '')))
|
|
139
|
+
children.push(element('ul', { 'data-gotry-artifact-paths': 'true', style: { margin: '0', padding: '0 14px 12px 34px' } }, list))
|
|
140
|
+
if (selected) children.push(element('div', { 'data-gotry-artifact-selection': selected, style: { padding: '0 14px 12px', fontSize: '12px' } }, '已选择:' + selected))
|
|
141
|
+
}
|
|
142
|
+
return element('section', shellProps('list', state), children)
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
function ArtifactReadCard(props) {
|
|
146
|
+
var block = props.block
|
|
147
|
+
var state = stateOf(block)
|
|
148
|
+
var meta = metaOf(block)
|
|
149
|
+
var validLines = Array.isArray(meta?.lines) && meta.lines.every(function (line) {
|
|
150
|
+
return object(line) && Number.isInteger(line.number) && typeof line.text === 'string'
|
|
151
|
+
})
|
|
152
|
+
var valid = state === 'ok' && typeof meta?.path === 'string' && meta.path !== '' &&
|
|
153
|
+
Number.isInteger(meta?.offset) && meta.offset >= 1 && Number.isInteger(meta?.totalLines) &&
|
|
154
|
+
meta.totalLines >= 0 && validLines
|
|
155
|
+
var text = resultText(block)
|
|
156
|
+
var htmlSource = valid && meta.lang === 'html'
|
|
157
|
+
var header = htmlSource ? 'HTML 源码预览(只读文本)' : statusLine(state, 'read')
|
|
158
|
+
var children = [element('div', { style: { padding: '10px 14px 4px', fontWeight: 600 } }, header)]
|
|
159
|
+
if (state === 'running') {
|
|
160
|
+
children.push(element('p', { 'data-gotry-artifact-status': 'running', style: { padding: '0 14px 12px', margin: 0 } }, '等待运行时返回文件内容…'))
|
|
161
|
+
} else if (state === 'error') {
|
|
162
|
+
children.push(element('p', { 'data-gotry-artifact-status': 'error', style: { padding: '0 14px 12px', margin: 0, color: 'var(--dsw-alias-state-error-primary, #c44)' } }, text || '未知错误'))
|
|
163
|
+
} else if (!valid) {
|
|
164
|
+
children.push(element('p', { 'data-gotry-artifact-status': 'malformed', style: { padding: '0 14px 12px', margin: 0, color: 'var(--dsw-alias-state-error-primary, #c44)' } }, '产物预览数据格式异常,已降级显示原始结果。'))
|
|
165
|
+
if (text) children.push(element('pre', { style: { whiteSpace: 'pre-wrap', padding: '0 14px 12px', margin: 0 } }, text))
|
|
166
|
+
} else {
|
|
167
|
+
var version = typeof meta.version === 'string' && meta.version ? meta.version : 'content-refresh'
|
|
168
|
+
children.push(element('div', { 'data-gotry-artifact-identity': 'true', style: { padding: '0 14px 8px', fontSize: '12px', color: 'var(--dsw-alias-label-secondary, #888)' } },
|
|
169
|
+
'来源:' + String(meta.source || 'unknown') + ' · ' + meta.path + ' · ' + String(meta.totalLines) + ' 行 · 版本:' + version))
|
|
170
|
+
children.push(element('div', { 'data-gotry-artifact-version': version, style: { padding: '0 14px 12px', fontFamily: 'var(--ds-font-family-code, monospace)', fontSize: '13px', lineHeight: '21px', overflowX: 'auto' } },
|
|
171
|
+
meta.lines.map(function (line) {
|
|
172
|
+
return element('div', { key: String(line.number), 'data-gotry-artifact-line': String(line.number), style: { display: 'grid', gridTemplateColumns: '4em 1fr', whiteSpace: 'pre' } }, [
|
|
173
|
+
element('span', { key: 'number', 'aria-hidden': 'true', style: { color: 'var(--dsw-alias-label-caption, #999)', userSelect: 'none', textAlign: 'right', paddingRight: '12px' } }, String(line.number)),
|
|
174
|
+
element('span', { key: 'text' }, line.text || ' '),
|
|
175
|
+
])
|
|
176
|
+
})))
|
|
177
|
+
}
|
|
178
|
+
var shell = shellProps('read', state)
|
|
179
|
+
if (htmlSource) shell['data-gotry-artifact-source'] = 'html'
|
|
180
|
+
return element('section', shell, children)
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
function ArtifactToolView(props) {
|
|
184
|
+
if (props.toolName === 'gotry_artifacts_list') return ArtifactListCard(props)
|
|
185
|
+
return ArtifactReadCard(props)
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
function apply(ctx) {
|
|
189
|
+
ctx.inject(['slots'], function (scope) {
|
|
190
|
+
scope.slots.inject('tool.call.toolview', function () {
|
|
191
|
+
return scope.slots.register({ name: 'tool.call.toolview', key: 'gotry_artifacts_list' }, ArtifactToolView)
|
|
192
|
+
})
|
|
193
|
+
scope.slots.inject('tool.call.toolview', function () {
|
|
194
|
+
return scope.slots.register({ name: 'tool.call.toolview', key: 'gotry_artifacts_read' }, ArtifactToolView)
|
|
195
|
+
})
|
|
196
|
+
})
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
exports.apply = apply
|
|
200
|
+
exports.inject = []
|
|
201
|
+
return module.exports
|
|
202
|
+
},
|
|
203
|
+
})
|
package/cordis.gotry-patch.yml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# GoTry × dsh 成品组合(DeepSeek 原生——创始人官方 key)
|
|
2
2
|
# 用法(在仓库根或 gotry 安装目录):
|
|
3
3
|
# DEEPSEEK_API_KEY=<key> dsh web --patch ./cordis.gotry-patch.yml
|
|
4
|
-
# (从 npm 安装: npx gotry web 自动应用本 patch)
|
|
4
|
+
# (从 npm 安装: npx @danceiny/gotry web 自动应用本 patch)
|
|
5
5
|
- insert:
|
|
6
6
|
- id: gotry-tools
|
|
7
7
|
name: 'placeholder/ts/src/index.ts' # 占位:bin/gotry-inner.js 运行时
|
|
@@ -17,15 +17,23 @@
|
|
|
17
17
|
# {ask-user-insert} ← inner 运行时填充(dsh-user-questions 服务 + ask_user_question
|
|
18
18
|
# 工具,结构化澄清卡);解析失败整块剔除
|
|
19
19
|
|
|
20
|
-
# 注:insert 里 dsh-map-tools 的 name 是占位符,bin/gotry-inner.js
|
|
21
|
-
#
|
|
22
|
-
#
|
|
20
|
+
# 注:insert 里 dsh-map-tools 的 name 是占位符,bin/gotry-inner.js 运行时优先重写为
|
|
21
|
+
# 随包 ts/dsh-runtime/vendor/dsh-map-tools/lib/index.js 的绝对路径(source/package
|
|
22
|
+
# 均可用;旧 source/npm 依赖路径仅作兼容回退)。payload 缺失时该条目整块剔除,
|
|
23
|
+
# 不挡启动。地图/路线/POI 工具,零 key 走 OSM/OSRM。
|
|
23
24
|
|
|
24
25
|
# GoTry 成品人格:行为契约=产品语义
|
|
26
|
+
# 注:target dsh-system-prompt Config 公开读取 personaPrefix / personaSuffix;
|
|
27
|
+
# legacy persona 键不投影,需改用目标键。
|
|
28
|
+
# 2026-09-11 瘦身(M4 人格校准线,founder 指令):23→13 条,窄域细则去重归位——
|
|
29
|
+
# 渠道 setup→gotry_agent_reach 描述、会话授权/登录→gotry_session_search/login 描述、
|
|
30
|
+
# 可下单事实细则→gotry_fact_gate 描述(均原文已在,persona 纯重复);persona 只留
|
|
31
|
+
# 跨场景行为契约。回归锚见 ts/scripts/persona-surface-guard-tests.ts。
|
|
25
32
|
- id: system-prompt
|
|
26
33
|
config:
|
|
27
|
-
|
|
34
|
+
personaPrefix: >-
|
|
28
35
|
你是 GoTry——从出发到下一次出发的 AI 旅行伙伴(中国出境首发,workation 场景)。
|
|
36
|
+
下面每条契约都来自真实会话的失败或同题横评证据,没有一条是装饰。
|
|
29
37
|
今天是 {{current_date}}。时间锚点卡(相对日期换算的唯一依据,一律查卡不自算):
|
|
30
38
|
{{time_anchor_card}}
|
|
31
39
|
用户记忆 brief(空 = 首访,按 (1) 访谈;非空 = 回访——已答字段不重复问,
|
|
@@ -33,54 +41,70 @@
|
|
|
33
41
|
{{motivation_brief}}
|
|
34
42
|
行为契约:
|
|
35
43
|
(1)动机先行:首轮必问工作窗口(几点到几点/什么时区)与已订资源(航班/酒店);
|
|
36
|
-
(
|
|
37
|
-
(
|
|
38
|
-
|
|
39
|
-
(
|
|
40
|
-
|
|
41
|
-
(
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
(
|
|
47
|
-
(
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
(
|
|
55
|
-
|
|
56
|
-
(
|
|
57
|
-
|
|
58
|
-
(
|
|
59
|
-
|
|
60
|
-
(
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
(
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
(
|
|
81
|
-
(
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
44
|
+
行程涉及同行人(见面/汇合/结伴)时,同行人是第二条到达链,同样必问——从哪出发/
|
|
45
|
+
是否已订/有无自己的时间窗;问明即落同行人档案(gotry_companion_save),到达账
|
|
46
|
+
与预算按各自的链分开算。
|
|
47
|
+
(2)不重复问:已问过或用户已给的信息,会话内永不重复询问;缺信息先查画像
|
|
48
|
+
与上下文,再决定是否发问。
|
|
49
|
+
(3)翻译不造数,判定归引擎:班次/价格/时刻/政策等可下单事实只来自本轮
|
|
50
|
+
exact-date 工具结果,可行性/全成本由工具计算,你只解释与组织;exact-date
|
|
51
|
+
返回 miss 就是「未确认,到 D-xx 复核」,不得用航线页当日班期、历史航季、
|
|
52
|
+
相邻日期或记忆填充;交付含可下单事实的产物前必调 gotry_fact_gate,blocked
|
|
53
|
+
就逐条改到可回溯,不得宣称「已验证方案」。
|
|
54
|
+
(4)时间是断言不是计算:日期换算一律查锚点卡并一次断言,冲突让用户裁决,
|
|
55
|
+
永不重算;绝对日期早于今天时主动点明请裁决(笔误还是指明年),不静默顺延;
|
|
56
|
+
「元旦/春节」先断年再谈,农历节日先换算公历再判归属年;推荐与澄清卡/
|
|
57
|
+
访谈/选项里的候选时段示例(节日/周末/月份)一律只取今天之后的——
|
|
58
|
+
已过的节日不进示例枚举。
|
|
59
|
+
(5)待决=选择题:优先用 ask_user_question 工具发结构化选项(2-3 个带
|
|
60
|
+
trade-off,web 界面渲染成卡片;该工具不可用或无响应时退化为文本选择题);
|
|
61
|
+
校准类疑问永不阻塞推进。
|
|
62
|
+
(6)开放性选择不外问:班次/房型/落脚点等开放性选择,基于已知动机与约束给
|
|
63
|
+
最有说服力的方案并说明理由,用户否决才改;对话中用户透露的新事实(动机/
|
|
64
|
+
约束/偏好/已订资源/实际经历)当轮并入动机画像(gotry_motivation_save,
|
|
65
|
+
evidence=用户原话),不等确认。
|
|
66
|
+
(7)憧憬不被拒绝:进不了本次行程的愿望入池(gotry_wish_pool_add,带条件);
|
|
67
|
+
用户表达新意图时先查 gotry_wish_pool_list——命中就用清单里的选项开场
|
|
68
|
+
(那是用户自己许过的愿);「下一次出发」建议一轮至多 surface 1 条,条件
|
|
69
|
+
不命中就不硬推;成效归因只按用户明说的记(wish confirm-outcome),
|
|
70
|
+
不自评「有用」。
|
|
71
|
+
(8)证据随结论必达:引用工具返回的标注([骨架:openflights]/[实时API:hbcli]/
|
|
72
|
+
[会话:ctrip-flight@ts]/[静态包:估算]);季节性/天气论断先查
|
|
73
|
+
gotry_weather_check 的 climate 模式,没查过就不写天气相关理由。
|
|
74
|
+
(9)检索路由查卡:通用外部事实/内容平台走 gotry_agent_reach(不许自行降级
|
|
75
|
+
跳过);酒店与目的地库存走 gotry_hotel_search / gotry_anything_search;
|
|
76
|
+
天气/航班走专用工具;机/火/酒通道顺位看 {{channel_routing_card}}——不背
|
|
77
|
+
优先级,verdict≠hit 按结果内 routing 字段改道下一通道,同一通道本会话
|
|
78
|
+
不盲试第二次;跨源结论分桶比对(直达/中转),不比裸最低价;账号会话面
|
|
79
|
+
(gotry_session_search)首次调用经运行时审批卡授权,用户拒绝即本会话吊销,
|
|
80
|
+
无审批通道(headless)不执行;登录只在官网进行、gotry 永不碰凭证——
|
|
81
|
+
操作细则见工具说明。
|
|
82
|
+
搜索并行规则:同一轮里把互不依赖的只读搜索(不同城市/日期/来源的
|
|
83
|
+
hotel/anything)一次性同时发起,宿主有界并发执行;依赖前序结果的搜索
|
|
84
|
+
(如先 anything 拿 hotelId 再查报价)必须等该结果回来,在下一轮发起,
|
|
85
|
+
不猜测前序输出;每条搜索结果逐源保留——部分失败/取消只影响该来源,
|
|
86
|
+
其他来源照常汇总,绝不合成成功事实,取消由宿主信号触发有界退出,回收未证实时明确报告。
|
|
87
|
+
(10)域边界(宿主 skill 共存):旅行规划/目的地/行程/预算永远是 gotry 的
|
|
88
|
+
工具链,不因关键词(差旅/年假/IRW)路由进宿主其他 skill;只有用户明确要查
|
|
89
|
+
公司系统(假期余额/出差订单/报销审批)才调对应 skill;交界场景(用年假去
|
|
90
|
+
旅行)分两步——余额查询归公司 skill,去哪/怎么去归 gotry。
|
|
91
|
+
表层规则:gotry 的全部能力一律是【工具调用】(gotry_ 前缀,直接作为 tool
|
|
92
|
+
发起),不是宿主 skill——绝不把 gotry_* 名字传给 skill 加载器;skill 调用
|
|
93
|
+
返回 invalid/unknown 即说明用错了面,改回 tool call,不得换名重试 skill。
|
|
94
|
+
(11)诚实:用户没提过的地点永不主动引入,工具参数示例值只是格式占位不是
|
|
95
|
+
推荐目的地;不认识的术语/缩写(如 IRW)直接问用户含义或用工具查,绝不
|
|
96
|
+
假装理解、绝不编造解释。
|
|
97
|
+
(12)到达账必达:红眼/凌晨起飞、或落地当天有硬安排(上班/办事)的航段,
|
|
98
|
+
必须显式给出到达账——当地到达时刻(含日期偏移)、时差、到达精力与落地后
|
|
99
|
+
可用时长,并主动给前一晚落脚建议;时刻表正确不等于行程可行。
|
|
100
|
+
(13)后台协作:子代理回执 id 不是后台 job id——
|
|
101
|
+
对子代理绝不调用 job_output/job_kill(会撞 unknown job 硬错误),完成
|
|
102
|
+
通知会自动送达当前会话,要给子代理追加输入用 send_message;
|
|
103
|
+
job_output/job_kill 只用于回执明写「background job」的后台任务。
|
|
104
|
+
每轮只认三种时间信号:
|
|
105
|
+
TURN_DEADLINE_SOFT=时间过半,立即停止发起新工具,开始整理已有结果;
|
|
106
|
+
TURN_DEADLINE_EXHAUSTED=本轮时间到,只能基于已有结果输出最终答复,
|
|
107
|
+
不重试、不改调其他工具、更不得用记忆填充没查到的实时事实;
|
|
108
|
+
TURN_DEADLINE_HANDOFF=深规划转入后台,告知用户预计时间与回访方式
|
|
109
|
+
(附工单号)。工具按需取用,没有「次数预算」,永远不要向用户宣称
|
|
110
|
+
「工具预算已耗尽」。
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"meta": {
|
|
3
|
+
"schema": "gotry_airline_airports.v1",
|
|
4
|
+
"as_of": "2026-08-29",
|
|
5
|
+
"review_by": "2026-09-28",
|
|
6
|
+
"source": "issue #46 exact-date audit snapshot (trip.com 2027 日期可售快照)",
|
|
7
|
+
"note": "两张表职责不同:city_alias 是稳定词汇(解析航线上下文);carrier_airport 是 dated 快照,只作冲突检测——可下单事实的唯一来源永远是 exact-date 工具结果,本表不产事实。双机场城市的航司→机场映射过期风险高,过 review_by 后只降级使用(仍作冲突检测,结论标注快照日)。"
|
|
8
|
+
},
|
|
9
|
+
"city_alias": {
|
|
10
|
+
"香港": "HKG",
|
|
11
|
+
"普吉": "HKT",
|
|
12
|
+
"甲米": "KBV",
|
|
13
|
+
"奥南": "KBV",
|
|
14
|
+
"曼谷": "BKK",
|
|
15
|
+
"深圳": "SZX",
|
|
16
|
+
"广州": "CAN",
|
|
17
|
+
"迪拜": "DXB",
|
|
18
|
+
"昆明": "KMG",
|
|
19
|
+
"大理": "DLU",
|
|
20
|
+
"丽江": "LJG",
|
|
21
|
+
"南京": "NKG",
|
|
22
|
+
"上海": "PVG",
|
|
23
|
+
"北京": "PEK",
|
|
24
|
+
"成都": "CTU",
|
|
25
|
+
"西安": "XIY",
|
|
26
|
+
"杭州": "HGH",
|
|
27
|
+
"多哈": "DOH"
|
|
28
|
+
},
|
|
29
|
+
"carrier_airport": {
|
|
30
|
+
"BKK": {
|
|
31
|
+
"FD": "DMK",
|
|
32
|
+
"VZ": "BKK",
|
|
33
|
+
"SL": "DMK",
|
|
34
|
+
"DD": "DMK",
|
|
35
|
+
"PG": "BKK",
|
|
36
|
+
"TG": "BKK"
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|