@danceiny/gotry 0.0.1-rc.9 → 0.2.0-rc.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +1788 -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 +161 -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 +553 -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 +676 -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/provider-detail-sanitize.js +64 -0
- package/dist/capabilities/resilience.js +191 -0
- package/dist/capabilities/route-provider-conformance.js +341 -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-path-measure-tests.js +133 -0
- package/dist/scripts/anything-path-measure.js +150 -0
- package/dist/scripts/anything-tests.js +250 -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 +126 -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 +1549 -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/city-scenario-tier-tests.js +234 -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 +600 -0
- package/dist/scripts/drill-multiuser-ledger-tests.js +1076 -0
- package/dist/scripts/drill-sdk-descendant-cleanup-tests.js +606 -0
- package/dist/scripts/drill-w2a-sensor-tests.js +788 -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-llm-tests.js +437 -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 +150 -0
- package/dist/scripts/g5-guard.js +193 -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/m3-cohort-tests.js +714 -0
- package/dist/scripts/m3-cohort.js +310 -0
- 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 +203 -0
- package/dist/scripts/nightly-evidence.js +303 -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/outcome-projection-tests.js +427 -0
- package/dist/scripts/persona-sim-tests.js +603 -0
- package/dist/scripts/persona-sim.js +1081 -0
- 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 +22 -18
- package/dist/scripts/replay-real.js +18 -18
- package/dist/scripts/replay.js +54 -82
- package/dist/scripts/route-provider-conformance-tests.js +391 -0
- 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-zone-crash.js +49 -0
- package/dist/scripts/session-zone-ledger-tests.js +432 -0
- package/dist/scripts/session-zone-observation-tests.js +492 -0
- package/dist/scripts/session-zone-observe.js +135 -0
- package/dist/scripts/session-zone-wiring-tests.js +566 -0
- package/dist/scripts/session-zones-tests.js +374 -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 +244 -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 +565 -198
- 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 +212 -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 +60 -20
- 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 +46 -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/city-scenario-tier.js +378 -0
- package/dist/src/companions.js +48 -74
- package/dist/src/contracts.js +21 -43
- package/dist/src/dsh-llm.js +171 -115
- 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 +2385 -881
- 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 +331 -161
- package/dist/src/m3-cohort.js +1577 -0
- 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/outcome-projection.js +746 -0
- 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-zone-ledger.js +312 -0
- package/dist/src/session-zone-observation.js +354 -0
- package/dist/src/session-zone-wiring.js +658 -0
- package/dist/src/session-zones.js +510 -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 +696 -524
- 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 +600 -360
- 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 +282 -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 +586 -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 +17 -3
- package/ts/src/dsh-llm.ts +152 -17
- package/ts/src/flyai-setup-tool.ts +77 -0
- package/ts/src/index.ts +2123 -200
- 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 +234 -26
- 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 +1166 -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 +444 -105
- package/ts/src/wish-pool.ts +79 -0
- package/dist/scripts/session-attach-wait.js +0 -41
|
@@ -0,0 +1,404 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Package proof for issue #202.
|
|
3
|
+
*
|
|
4
|
+
* The full suite passes the executable from its clean tarball install; focused
|
|
5
|
+
* runs pack/unpack locally and attach the already-installed root closure. Both
|
|
6
|
+
* paths load the plugin from the artifact, never from the checkout vendor path.
|
|
7
|
+
* No map provider or paid endpoint is contacted; inline-coordinate geocoding is
|
|
8
|
+
* asserted with fetch disabled.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { execFileSync } from 'node:child_process'
|
|
12
|
+
import { createHash } from 'node:crypto'
|
|
13
|
+
import { chmodSync, copyFileSync, existsSync, mkdirSync, mkdtempSync, readFileSync, readdirSync, realpathSync, rmSync, symlinkSync, writeFileSync } from 'node:fs'
|
|
14
|
+
import { createRequire } from 'node:module'
|
|
15
|
+
import { basename, dirname, isAbsolute, join, resolve } from 'node:path'
|
|
16
|
+
import { tmpdir } from 'node:os'
|
|
17
|
+
import { fileURLToPath, pathToFileURL } from 'node:url'
|
|
18
|
+
import assert from 'node:assert/strict'
|
|
19
|
+
|
|
20
|
+
const repoRoot = resolve(dirname(fileURLToPath(import.meta.url)), '../..')
|
|
21
|
+
const upstreamLicenseSha256 = 'b6bbb0c73a02cf8d2c304e9f208b41c32f0a810fabe366986e2b14ac3338f618'
|
|
22
|
+
const upstreamVendorFileCount = 37
|
|
23
|
+
const adaptedVendorAggregateSha256 = 'f01515d8c1ec2973c7b4fb2bec0f6e2175bceef7a5331847cb210a11855a49e2'
|
|
24
|
+
const expectedTools = [
|
|
25
|
+
'map_bicycling_route',
|
|
26
|
+
'map_driving_route',
|
|
27
|
+
'map_geocode',
|
|
28
|
+
'map_poi_search',
|
|
29
|
+
'map_reverse_geocode',
|
|
30
|
+
'map_transit_route',
|
|
31
|
+
'map_walking_route',
|
|
32
|
+
]
|
|
33
|
+
|
|
34
|
+
function sha256(path: string): string {
|
|
35
|
+
return createHash('sha256').update(readFileSync(path)).digest('hex')
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function vendorAggregate(root: string): { count: number; sha256: string } {
|
|
39
|
+
const files: string[] = []
|
|
40
|
+
const walk = (directory: string) => {
|
|
41
|
+
for (const entry of readdirSync(directory, { withFileTypes: true })) {
|
|
42
|
+
const path = join(directory, entry.name)
|
|
43
|
+
if (entry.isDirectory()) walk(path)
|
|
44
|
+
else files.push(path.slice(root.length + 1).replaceAll('\\', '/'))
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
walk(root)
|
|
48
|
+
files.sort()
|
|
49
|
+
const digest = createHash('sha256')
|
|
50
|
+
for (const relative of files) {
|
|
51
|
+
digest.update(relative)
|
|
52
|
+
digest.update('\0')
|
|
53
|
+
digest.update(readFileSync(join(root, relative)))
|
|
54
|
+
digest.update('\0')
|
|
55
|
+
}
|
|
56
|
+
return { count: files.length, sha256: digest.digest('hex') }
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function assertPackagingExcludesNodeModules(): void {
|
|
60
|
+
const tempRoot = mkdtempSync(join(tmpdir(), 'gotry-pack-excl-'))
|
|
61
|
+
try {
|
|
62
|
+
const archiveTar = join(tempRoot, 'head.tar')
|
|
63
|
+
execFileSync('git', ['archive', '--format=tar', '--output', archiveTar, 'HEAD'], { cwd: repoRoot })
|
|
64
|
+
const checkoutDir = join(tempRoot, 'checkout')
|
|
65
|
+
mkdirSync(checkoutDir)
|
|
66
|
+
execFileSync('tar', ['-xf', archiveTar, '-C', checkoutDir])
|
|
67
|
+
copyFileSync(join(repoRoot, 'package.json'), join(checkoutDir, 'package.json'))
|
|
68
|
+
|
|
69
|
+
const vendorBinDir = join(checkoutDir, 'ts/dsh-runtime/vendor/dsh-map-tools/node_modules/.bin')
|
|
70
|
+
mkdirSync(vendorBinDir, { recursive: true })
|
|
71
|
+
for (const name of ['cordis', 'tsc', 'tsserver', 'vitest']) {
|
|
72
|
+
const binPath = join(vendorBinDir, name)
|
|
73
|
+
writeFileSync(binPath, '#!/usr/bin/env node\n')
|
|
74
|
+
chmodSync(binPath, 0o755)
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const packDir = join(tempRoot, 'pack')
|
|
78
|
+
mkdirSync(packDir)
|
|
79
|
+
const packOutput = execFileSync('npm', [
|
|
80
|
+
'pack', '--ignore-scripts', '--json', '--pack-destination', packDir,
|
|
81
|
+
], { cwd: checkoutDir, encoding: 'utf8' })
|
|
82
|
+
const packInfo = JSON.parse(packOutput) as Array<{ filename: string }>
|
|
83
|
+
assert.equal(packInfo.length, 1, 'temp npm pack must produce one artifact')
|
|
84
|
+
const tarball = join(packDir, packInfo[0].filename)
|
|
85
|
+
assert.ok(existsSync(tarball), `temp packed artifact missing: ${tarball}`)
|
|
86
|
+
|
|
87
|
+
const entries = execFileSync('tar', ['-tzf', tarball], { encoding: 'utf8' }).trimEnd().split('\n')
|
|
88
|
+
const nodeModulesEntries = entries.filter(path =>
|
|
89
|
+
path.startsWith('package/ts/dsh-runtime/vendor/dsh-map-tools/node_modules'),
|
|
90
|
+
)
|
|
91
|
+
assert.equal(
|
|
92
|
+
nodeModulesEntries.length, 0,
|
|
93
|
+
`npm pack must exclude vendor node_modules: found ${nodeModulesEntries.join(', ')}`,
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
const extractDir = join(tempRoot, 'extracted')
|
|
97
|
+
mkdirSync(extractDir)
|
|
98
|
+
execFileSync('tar', ['-xzf', tarball, '-C', extractDir])
|
|
99
|
+
const packedVendorRoot = join(extractDir, 'package/ts/dsh-runtime/vendor/dsh-map-tools')
|
|
100
|
+
const packedAggregate = vendorAggregate(packedVendorRoot)
|
|
101
|
+
assert.equal(packedAggregate.count, upstreamVendorFileCount, 'packed vendor file count drifted')
|
|
102
|
+
assert.equal(packedAggregate.sha256, adaptedVendorAggregateSha256, 'packed vendor aggregate drifted')
|
|
103
|
+
} finally {
|
|
104
|
+
rmSync(tempRoot, { recursive: true, force: true })
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function assertTargetLockClosure(): { packages: number; version: string } {
|
|
109
|
+
const manifest = JSON.parse(readFileSync(join(repoRoot, 'ts/package.json'), 'utf8')) as {
|
|
110
|
+
dependencies?: Record<string, string>
|
|
111
|
+
}
|
|
112
|
+
assert.equal(manifest.dependencies?.['dsh-map-tools'], undefined, 'external map-tools dependency must stay removed')
|
|
113
|
+
|
|
114
|
+
const lock = JSON.parse(readFileSync(join(repoRoot, 'ts/package-lock.json'), 'utf8')) as {
|
|
115
|
+
packages?: Record<string, { version?: string; dependencies?: Record<string, string> }>
|
|
116
|
+
}
|
|
117
|
+
assert.equal(lock.packages?.['']?.dependencies?.['dsh-map-tools'], undefined, 'lock root must not resolve external map-tools')
|
|
118
|
+
assert.equal(lock.packages?.['node_modules/dsh-map-tools'], undefined, 'lock must not carry external map-tools')
|
|
119
|
+
const dshEntries = Object.entries(lock.packages ?? {}).filter(([path]) =>
|
|
120
|
+
/(?:^|\/)node_modules\/@deepseek-ai\/(?:dsh|dsh-[^/]+)$/.test(path),
|
|
121
|
+
)
|
|
122
|
+
assert.ok(dshEntries.length >= 10, 'expected dsh-tools peer closure in the ts lock')
|
|
123
|
+
for (const [path, entry] of dshEntries) {
|
|
124
|
+
assert.equal(entry.version, '0.2.0-rc.2', `${path} drifted outside the 0.2.0-rc.2 closure`)
|
|
125
|
+
}
|
|
126
|
+
return { packages: dshEntries.length, version: '0.2.0-rc.2' }
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
function findPackageRoot(entry: string): string {
|
|
130
|
+
let cursor = dirname(entry)
|
|
131
|
+
for (;;) {
|
|
132
|
+
const manifestPath = join(cursor, 'package.json')
|
|
133
|
+
if (existsSync(manifestPath)) {
|
|
134
|
+
const manifest = JSON.parse(readFileSync(manifestPath, 'utf8')) as { name?: string }
|
|
135
|
+
if (manifest.name === '@danceiny/gotry') return cursor
|
|
136
|
+
}
|
|
137
|
+
const parent = dirname(cursor)
|
|
138
|
+
if (parent === cursor) throw new Error(`cannot locate @danceiny/gotry package root from ${entry}`)
|
|
139
|
+
cursor = parent
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
function assertBinTargetsPackage(binPath: string, expectedTarget: string): void {
|
|
144
|
+
const resolvedExpectedTarget = realpathSync(expectedTarget)
|
|
145
|
+
if (realpathSync(binPath) === resolvedExpectedTarget) return
|
|
146
|
+
|
|
147
|
+
// pnpm writes an executable shell shim instead of a symlink. Its final
|
|
148
|
+
// machine-readable marker is safer to verify than accepting any occurrence
|
|
149
|
+
// of the package path in an otherwise unrelated executable.
|
|
150
|
+
const shim = readFileSync(binPath, 'utf8')
|
|
151
|
+
assert.ok(Buffer.byteLength(shim, 'utf8') <= 32_768, 'clean-install gotry shim is unexpectedly large')
|
|
152
|
+
const lines = shim.trimEnd().split(/\r?\n/)
|
|
153
|
+
const markers = lines.filter(line => line.startsWith('# cmd-shim-target='))
|
|
154
|
+
assert.equal(markers.length, 1, 'pnpm gotry shim must contain exactly one target marker')
|
|
155
|
+
assert.equal(lines.at(-1), markers[0], 'pnpm gotry shim target marker must be the final line')
|
|
156
|
+
const markerTarget = markers[0].slice('# cmd-shim-target='.length)
|
|
157
|
+
assert.ok(isAbsolute(markerTarget), 'pnpm gotry shim target must be absolute')
|
|
158
|
+
assert.equal(
|
|
159
|
+
realpathSync(markerTarget),
|
|
160
|
+
resolvedExpectedTarget,
|
|
161
|
+
'GOTRY_MAP_TOOLS_E2E_BIN shim must target this installed GoTry package',
|
|
162
|
+
)
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
function prepareProofPackage(cleanInstalledBin?: string): { packageRoot: string; proofRoot?: string } {
|
|
166
|
+
if (cleanInstalledBin) {
|
|
167
|
+
const binPath = resolve(cleanInstalledBin)
|
|
168
|
+
assert.equal(basename(binPath), 'gotry', 'clean-install executable must use the gotry bin name')
|
|
169
|
+
assert.equal(basename(dirname(binPath)), '.bin', 'clean-install executable must come from node_modules/.bin')
|
|
170
|
+
assert.equal(basename(dirname(dirname(binPath))), 'node_modules', 'clean-install executable must come from a consumer install')
|
|
171
|
+
const consumerRoot = dirname(dirname(dirname(binPath)))
|
|
172
|
+
const packageMain = createRequire(join(consumerRoot, 'package.json')).resolve('@danceiny/gotry')
|
|
173
|
+
const packageRoot = findPackageRoot(packageMain)
|
|
174
|
+
const installedManifest = JSON.parse(readFileSync(join(packageRoot, 'package.json'), 'utf8')) as {
|
|
175
|
+
name?: string
|
|
176
|
+
bin?: string | Record<string, string>
|
|
177
|
+
}
|
|
178
|
+
assert.equal(installedManifest.name, '@danceiny/gotry', 'clean-install executable must belong to GoTry')
|
|
179
|
+
const declaredBin = typeof installedManifest.bin === 'string'
|
|
180
|
+
? installedManifest.bin
|
|
181
|
+
: installedManifest.bin?.gotry
|
|
182
|
+
assert.equal(declaredBin, 'bin/gotry-inner.js', 'installed package must declare the production gotry bin')
|
|
183
|
+
assertBinTargetsPackage(binPath, join(packageRoot, declaredBin))
|
|
184
|
+
return { packageRoot }
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
const proofRoot = mkdtempSync(join(repoRoot, '.tmp-map-tools-proof-'))
|
|
188
|
+
try {
|
|
189
|
+
const packOutput = execFileSync('npm', [
|
|
190
|
+
'pack', '--ignore-scripts', '--json', '--pack-destination', proofRoot,
|
|
191
|
+
], { cwd: repoRoot, encoding: 'utf8' })
|
|
192
|
+
const packInfo = JSON.parse(packOutput) as Array<{ filename: string }>
|
|
193
|
+
assert.equal(packInfo.length, 1, 'npm pack must produce one artifact')
|
|
194
|
+
const tarball = join(proofRoot, packInfo[0].filename)
|
|
195
|
+
assert.ok(existsSync(tarball), `packed artifact missing: ${tarball}`)
|
|
196
|
+
const unpackRoot = join(proofRoot, 'unpacked')
|
|
197
|
+
mkdirSync(unpackRoot)
|
|
198
|
+
execFileSync('tar', ['-xzf', tarball, '-C', unpackRoot])
|
|
199
|
+
const packageRoot = join(unpackRoot, 'package')
|
|
200
|
+
symlinkSync(join(repoRoot, 'node_modules'), join(packageRoot, 'node_modules'), process.platform === 'win32' ? 'junction' : 'dir')
|
|
201
|
+
return { packageRoot, proofRoot }
|
|
202
|
+
} catch (error) {
|
|
203
|
+
rmSync(proofRoot, { recursive: true, force: true })
|
|
204
|
+
throw error
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
const cleanInstalledBin = process.env.GOTRY_MAP_TOOLS_E2E_BIN
|
|
209
|
+
const { packageRoot, proofRoot } = prepareProofPackage(cleanInstalledBin)
|
|
210
|
+
|
|
211
|
+
try {
|
|
212
|
+
assertPackagingExcludesNodeModules()
|
|
213
|
+
const lockedDsh = assertTargetLockClosure()
|
|
214
|
+
const vendorRoot = join(packageRoot, 'ts/dsh-runtime/vendor/dsh-map-tools')
|
|
215
|
+
const requiredFiles = [
|
|
216
|
+
'LICENSE',
|
|
217
|
+
'package.json',
|
|
218
|
+
'cordis.patch.yml',
|
|
219
|
+
'lib/index.js',
|
|
220
|
+
'lib/settings-ns.js',
|
|
221
|
+
'lib/config.js',
|
|
222
|
+
'lib/tools/geocode.js',
|
|
223
|
+
'lib/tools/routes.js',
|
|
224
|
+
'lib/tools/poi.js',
|
|
225
|
+
]
|
|
226
|
+
for (const relative of requiredFiles) {
|
|
227
|
+
assert.ok(existsSync(join(vendorRoot, relative)), `required vendor file missing: ${relative}`)
|
|
228
|
+
}
|
|
229
|
+
const vendorTree = vendorAggregate(vendorRoot)
|
|
230
|
+
assert.equal(vendorTree.count, upstreamVendorFileCount, 'vendored payload file count drifted')
|
|
231
|
+
assert.equal(vendorTree.sha256, adaptedVendorAggregateSha256, 'vendored payload aggregate drifted')
|
|
232
|
+
const vendorPackage = JSON.parse(readFileSync(join(vendorRoot, 'package.json'), 'utf8')) as {
|
|
233
|
+
name?: string
|
|
234
|
+
version?: string
|
|
235
|
+
license?: string
|
|
236
|
+
}
|
|
237
|
+
assert.equal(vendorPackage.name, 'dsh-map-tools')
|
|
238
|
+
assert.equal(vendorPackage.version, '0.7.3')
|
|
239
|
+
assert.equal(vendorPackage.license, 'MIT')
|
|
240
|
+
assert.equal(sha256(join(vendorRoot, 'LICENSE')), upstreamLicenseSha256, 'upstream MIT license changed')
|
|
241
|
+
|
|
242
|
+
const packageRequire = createRequire(join(packageRoot, 'package.json'))
|
|
243
|
+
const dshToolsPackageJson = packageRequire.resolve('@deepseek-ai/dsh-tools/package.json')
|
|
244
|
+
const dshSettingsPackageJson = packageRequire.resolve('@deepseek-ai/dsh-settings/package.json')
|
|
245
|
+
const dshTools = JSON.parse(readFileSync(dshToolsPackageJson, 'utf8')) as { version: string }
|
|
246
|
+
const dshSettings = JSON.parse(readFileSync(dshSettingsPackageJson, 'utf8')) as { version: string }
|
|
247
|
+
assert.equal(dshTools.version, '0.2.0-rc.2')
|
|
248
|
+
assert.equal(dshSettings.version, '0.2.0-rc.2')
|
|
249
|
+
const settingsApi = await import(pathToFileURL(join(dirname(dshSettingsPackageJson), 'lib/index.js')).href) as {
|
|
250
|
+
SettingsForms?: { prototype?: { configure?: (...args: unknown[]) => () => void } }
|
|
251
|
+
}
|
|
252
|
+
// 0.2.0-rc.2:SettingsForms 取代了手工 section API——表单由插件导出的
|
|
253
|
+
// Config schema 自动生成,唯一的手工注册是页策略 settings.configure({auto}, fiber)。
|
|
254
|
+
const settingsConfigure = settingsApi.SettingsForms?.prototype?.configure
|
|
255
|
+
assert.equal(
|
|
256
|
+
typeof settingsConfigure,
|
|
257
|
+
'function',
|
|
258
|
+
'real 0.2.0-rc.2 SettingsForms.prototype.configure must be present',
|
|
259
|
+
)
|
|
260
|
+
|
|
261
|
+
const plugin = await import(pathToFileURL(join(vendorRoot, 'lib/index.js')).href)
|
|
262
|
+
type RegisteredTool = Record<string, unknown> & { name: string; execute?: unknown }
|
|
263
|
+
const registered = new Map<string, RegisteredTool>()
|
|
264
|
+
const registerEvents: string[] = []
|
|
265
|
+
const toolDisposeEvents: string[] = []
|
|
266
|
+
const settingsRegistrations: unknown[][] = []
|
|
267
|
+
const settingsWatchers: Array<() => void> = []
|
|
268
|
+
const settingsProviderDisposers: Array<() => void> = []
|
|
269
|
+
const contextDisposers: Array<() => void> = []
|
|
270
|
+
const settingsConfigureCalls: Array<{ presentation: unknown; owner: unknown }> = []
|
|
271
|
+
const activeToolNames = () => [...registered.keys()].sort()
|
|
272
|
+
const settingsConfigureDisposed: string[] = []
|
|
273
|
+
const settingsProvider = {
|
|
274
|
+
ctx: {
|
|
275
|
+
effect(effect: () => (() => void) | void) {
|
|
276
|
+
const disposer = effect()
|
|
277
|
+
if (typeof disposer === 'function') settingsProviderDisposers.push(disposer)
|
|
278
|
+
return disposer
|
|
279
|
+
},
|
|
280
|
+
},
|
|
281
|
+
register: (...args: unknown[]) => {
|
|
282
|
+
settingsRegistrations.push(args)
|
|
283
|
+
return {
|
|
284
|
+
get: () => args[2] && typeof args[2] === 'object' ? (args[2] as { base?: unknown }).base : undefined,
|
|
285
|
+
watch: (callback: () => void) => {
|
|
286
|
+
settingsWatchers.push(callback)
|
|
287
|
+
return () => {
|
|
288
|
+
const index = settingsWatchers.indexOf(callback)
|
|
289
|
+
if (index >= 0) settingsWatchers.splice(index, 1)
|
|
290
|
+
}
|
|
291
|
+
},
|
|
292
|
+
update: async () => undefined,
|
|
293
|
+
replace: async () => undefined,
|
|
294
|
+
}
|
|
295
|
+
},
|
|
296
|
+
installSection: (..._args: unknown[]) => {
|
|
297
|
+
throw new Error('legacy installSection must not be called on the 0.2.0-rc.2 settings service')
|
|
298
|
+
},
|
|
299
|
+
configure: (presentation: unknown, owner: unknown) => {
|
|
300
|
+
settingsConfigureCalls.push({ presentation, owner })
|
|
301
|
+
return () => {
|
|
302
|
+
settingsConfigureDisposed.push('policy')
|
|
303
|
+
}
|
|
304
|
+
},
|
|
305
|
+
}
|
|
306
|
+
const context = {
|
|
307
|
+
fiber: { state: 'active' },
|
|
308
|
+
effect(effect: () => (() => void) | void) {
|
|
309
|
+
const disposer = effect()
|
|
310
|
+
if (typeof disposer === 'function') contextDisposers.push(disposer)
|
|
311
|
+
return disposer
|
|
312
|
+
},
|
|
313
|
+
tools: {
|
|
314
|
+
register(tool: RegisteredTool) {
|
|
315
|
+
assert.ok(tool.name.startsWith('map_'), `unexpected map tool name: ${tool.name}`)
|
|
316
|
+
registered.set(tool.name, tool)
|
|
317
|
+
registerEvents.push(tool.name)
|
|
318
|
+
return () => {
|
|
319
|
+
registered.delete(tool.name)
|
|
320
|
+
toolDisposeEvents.push(tool.name)
|
|
321
|
+
}
|
|
322
|
+
},
|
|
323
|
+
},
|
|
324
|
+
inject(dependencies: string[], callback: (scope: Record<string, unknown>) => void) {
|
|
325
|
+
if (dependencies.includes('settings')) {
|
|
326
|
+
callback({ settings: settingsProvider })
|
|
327
|
+
} else if (dependencies.includes('webServer')) {
|
|
328
|
+
// 0.7.3 的 config-route 用 scope.effect 托管回环路由的撤销注册。
|
|
329
|
+
callback({
|
|
330
|
+
webServer: { register: () => undefined },
|
|
331
|
+
effect(effect: () => (() => void) | void) {
|
|
332
|
+
const disposer = effect()
|
|
333
|
+
if (typeof disposer === 'function') contextDisposers.push(disposer)
|
|
334
|
+
return disposer
|
|
335
|
+
},
|
|
336
|
+
})
|
|
337
|
+
} else {
|
|
338
|
+
throw new Error(`unexpected dependency injection: ${dependencies.join(',')}`)
|
|
339
|
+
}
|
|
340
|
+
},
|
|
341
|
+
}
|
|
342
|
+
plugin.apply(context, {
|
|
343
|
+
provider: 'osm', amapKey: '', timeoutMs: 1000, maxQps: 2,
|
|
344
|
+
defaultMode: 'driving', language: 'zh',
|
|
345
|
+
})
|
|
346
|
+
assert.deepEqual(activeToolNames(), expectedTools, 'exactly seven active map tools must register')
|
|
347
|
+
assert.equal(registerEvents.length, expectedTools.length, 'schema-driven settings add no initial tool rebuild')
|
|
348
|
+
assert.equal(toolDisposeEvents.length, 0, 'schema-driven settings dispose no tool generation')
|
|
349
|
+
assert.equal(settingsConfigureCalls.length, 1, '0.2.0-rc.2 settings page policy must configure exactly once')
|
|
350
|
+
assert.deepEqual(settingsConfigureCalls[0]?.presentation, { auto: true }, 'page policy presentation must opt into the automatic card')
|
|
351
|
+
assert.equal(settingsConfigureCalls[0]?.owner, context.fiber, 'page policy owner must be the plugin fiber')
|
|
352
|
+
assert.equal(settingsRegistrations.length, 0, 'legacy per-section registration must stay retired')
|
|
353
|
+
assert.equal(settingsWatchers.length, 0, 'legacy settings watcher must stay retired')
|
|
354
|
+
assert.equal(settingsProviderDisposers.length, 0, 'legacy provider-detach fallback must stay retired')
|
|
355
|
+
// 两个受管撤销:config-route 的回环路由注册 + settings 页策略(按注册序)。
|
|
356
|
+
assert.equal(contextDisposers.length, 2, 'config-route disposer + settings page-policy disposer must register with the plugin effects')
|
|
357
|
+
|
|
358
|
+
contextDisposers[1]!()
|
|
359
|
+
assert.equal(settingsConfigureDisposed.length, 1, 'plugin effect disposal must release the settings page policy')
|
|
360
|
+
assert.deepEqual(activeToolNames(), expectedTools, 'policy disposal must keep exactly seven active map tools')
|
|
361
|
+
|
|
362
|
+
const finalActiveTools = [...registered.values()]
|
|
363
|
+
const originalFetch = globalThis.fetch
|
|
364
|
+
globalThis.fetch = (async () => { throw new Error('network forbidden by package proof') }) as typeof fetch
|
|
365
|
+
try {
|
|
366
|
+
const geocode = registered.get('map_geocode')
|
|
367
|
+
assert.ok(geocode, 'map_geocode must be registered')
|
|
368
|
+
const result = await (geocode.execute as (args: unknown, execution: unknown) => Promise<unknown>)(
|
|
369
|
+
{ address: '116.397428,39.90923' },
|
|
370
|
+
{ signal: new AbortController().signal },
|
|
371
|
+
) as { provider?: string; location?: number[] }
|
|
372
|
+
assert.equal(result.provider, 'inline')
|
|
373
|
+
assert.deepEqual(result.location, [116.397428, 39.90923])
|
|
374
|
+
} finally {
|
|
375
|
+
globalThis.fetch = originalFetch
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
for (const dispose of contextDisposers.splice(0).reverse()) dispose()
|
|
379
|
+
assert.equal(registered.size, 0, 'plugin unload must dispose the active map tool generation')
|
|
380
|
+
|
|
381
|
+
console.log(JSON.stringify({
|
|
382
|
+
proof: 'map-tools-vendor-package',
|
|
383
|
+
status: 'PASS',
|
|
384
|
+
artifactMode: cleanInstalledBin ? 'clean-installed-tarball' : 'packed-unpacked-focused',
|
|
385
|
+
vendored: {
|
|
386
|
+
sourcePackage: 'dsh-map-tools@0.7.3',
|
|
387
|
+
licenseSha256: upstreamLicenseSha256, vendorFileCount: vendorTree.count,
|
|
388
|
+
adaptedVendorAggregateSha256: vendorTree.sha256,
|
|
389
|
+
},
|
|
390
|
+
artifactVendor: vendorRoot,
|
|
391
|
+
dshClosure: { tools: dshTools.version, settings: dshSettings.version, ...lockedDsh },
|
|
392
|
+
settingsLifecycle: {
|
|
393
|
+
registerEvents: registerEvents.length,
|
|
394
|
+
toolDisposeEvents: toolDisposeEvents.length,
|
|
395
|
+
pagePolicyConfigured: settingsConfigureCalls.length,
|
|
396
|
+
legacySectionRegistrations: settingsRegistrations.length,
|
|
397
|
+
pluginUnloadDisposed: true,
|
|
398
|
+
},
|
|
399
|
+
tools: finalActiveTools.map(tool => tool.name).sort(),
|
|
400
|
+
inlineCoordinate: { provider: 'inline', network: 'forbidden' },
|
|
401
|
+
}, null, 2))
|
|
402
|
+
} finally {
|
|
403
|
+
if (proofRoot) rmSync(proofRoot, { recursive: true, force: true })
|
|
404
|
+
}
|
|
@@ -34,7 +34,7 @@ export async function checkConnectivity(a: string, b: string): Promise<{ connect
|
|
|
34
34
|
return {
|
|
35
35
|
connected: false,
|
|
36
36
|
evidence: inHub
|
|
37
|
-
? `[骨架:openflights] ❌ ${a}↔${b}
|
|
37
|
+
? `[骨架:openflights] ❌ ${a}↔${b} 枢纽对未在骨架覆盖(实时源以新航线为准;骨架可能滞后——请用户根据行程复核)`
|
|
38
38
|
: `[骨架:openflights] ○ ${a}或${b}不在枢纽集,骨架不覆盖(不作否定结论)`,
|
|
39
39
|
}
|
|
40
40
|
}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* 骨架层集成验证(§7-1 消费面):开 skeletonHub + 带 route 的段 → 结果带三值标注;
|
|
3
3
|
* 枢纽间否定只标注不排除——EK329(数据集滞后的新航线)必须存活。
|
|
4
|
+
* 用户面(issue #559 卡点 4):unscaffolded leg 必须挂 ⚠ 前缀,避免用户读到「正常选择」后才在尾部 skeleton_notes 发现矛盾。
|
|
5
|
+
* 内核冻结面(#234)不可擅动,⚠ 标记由 loop.ts:renderSolve 从 skeleton_notes 字符串编码里推断。
|
|
4
6
|
* 运行(在 ts/ 下):npx tsx scripts/skeleton-integration-test.ts
|
|
5
7
|
*/
|
|
6
8
|
|
|
@@ -8,6 +10,7 @@ import assert from 'node:assert/strict'
|
|
|
8
10
|
import { readFile } from 'node:fs/promises'
|
|
9
11
|
import { join } from 'node:path'
|
|
10
12
|
import { parseFlightPackToSpec, solveUnified } from '../src/unified.ts'
|
|
13
|
+
import { renderSolve, newState } from '../src/loop.ts'
|
|
11
14
|
|
|
12
15
|
const pack = JSON.parse(await readFile(join('..', 'data', 'flights_2026.json'), 'utf-8'))
|
|
13
16
|
const spec = parseFlightPackToSpec(pack)
|
|
@@ -18,6 +21,25 @@ const r = await solveUnified(spec)
|
|
|
18
21
|
assert.equal(r.feasible, true, '骨架否定不排除——EK329 必须仍在')
|
|
19
22
|
const f5 = r.legs!.find(l => l.leg === 'f5')
|
|
20
23
|
assert.equal(f5?.service, 'EK329', 'EK329 存活(骨架滞后容错)')
|
|
24
|
+
|
|
25
|
+
// §7-1 issue #559 卡点 4:骨架证据不再承诺「降权或中转」——承认骨架滞后,让用户据行程复核
|
|
21
26
|
assert.ok((r.skeleton_notes ?? []).some(n => n.includes('SZX') && n.includes('❌')), `枢纽否定标注在: ${r.skeleton_notes}`)
|
|
22
27
|
assert.ok((r.skeleton_notes ?? []).some(n => n.includes('HKG') && n.includes('✅')), '正向标注在')
|
|
23
|
-
|
|
28
|
+
assert.ok(
|
|
29
|
+
!(r.skeleton_notes ?? []).some(n => n.includes('应将此候选降权') || n.includes('要求中转')),
|
|
30
|
+
'骨架证据不再承诺「降权或中转」——承认骨架滞后,让用户据行程复核',
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
// §7-1 issue #559 卡点 4:renderSolve 从 skeleton_notes 推断 unscaffolded leg,
|
|
34
|
+
// 给 ⚠ 前缀 + 补充说明,用户读到即知(不动 #234 内核冻结面)
|
|
35
|
+
const state = newState()
|
|
36
|
+
state.solve = r as unknown as Parameters<typeof renderSolve>[0]['solve']
|
|
37
|
+
const rendered = renderSolve(state)
|
|
38
|
+
const f5Line = rendered.split('\n').find(line => line.includes('f5') && line.includes('EK329')) ?? ''
|
|
39
|
+
assert.ok(f5Line.startsWith('- ⚠'), `f5 EK329 用户面必须有 ⚠ 前缀(实测行=${f5Line})`)
|
|
40
|
+
assert.ok(f5Line.includes('枢纽对未在骨架覆盖'), 'f5 用户面行内必须说明「枢纽对未在骨架覆盖」')
|
|
41
|
+
const f1Line = rendered.split('\n').find(line => line.includes('f1 ') && line.includes(':') && line.includes('起飞') && !line.startsWith('- ⚠')) ?? ''
|
|
42
|
+
assert.ok(f1Line.length > 0, 'f1 HKG↔HKT 正向覆盖的 leg 行必须在(实测查找结果为空)')
|
|
43
|
+
assert.ok(!f1Line.startsWith('- ⚠'), `f1 正向覆盖不应有 ⚠ 前缀(实测行=${f1Line})`)
|
|
44
|
+
|
|
45
|
+
console.log(`骨架集成 OK:EK329 仍存活,用户面 ⚠ 前缀落地;EK329 行=[${f5Line.trim()}]`)
|