@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,378 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* City × scenario tiering MECHANISM v1 (issue #339 contract slice,
|
|
3
|
+
* SIMULATED-TRIGGER DRILL — default OFF, zero callers, trigger flag frozen false,
|
|
4
|
+
* registry frozen EMPTY).
|
|
5
|
+
*
|
|
6
|
+
* ⚠ Evidence boundary: this module ships the MECHANISM only. #339's trigger is
|
|
7
|
+
* "reviewable real usage samples with a stated scenario vocabulary and success
|
|
8
|
+
* metric"; it has NOT fired. The tracker is explicit that a profile must never be
|
|
9
|
+
* fabricated from fixtures (「没有样本时保持研究/设计状态,不凭 fixture 造画像」),
|
|
10
|
+
* so there is deliberately NO taxonomy CONTENT here:
|
|
11
|
+
* - `CITY_SCENARIO_TIER_REGISTRY` is frozen `[]`;
|
|
12
|
+
* - `CITY_SCENARIO_TIER_TRIGGER_FIRED` is frozen `false`, and `admitTierEntry`
|
|
13
|
+
* refuses every admission before validating anything while it is false, so no
|
|
14
|
+
* tier can enter the registry without real samples and a founder decision;
|
|
15
|
+
* - every resolution therefore returns the NEUTRAL modifier today.
|
|
16
|
+
* Any scenario vocabulary proposal lives in the drill report as a clearly labelled
|
|
17
|
+
* unvalidated hypothesis, never in this file.
|
|
18
|
+
*
|
|
19
|
+
* Shape (mirrors ts/capabilities/fx-contract.ts #344 / ts/capabilities/geo-atlas.ts
|
|
20
|
+
* #342 / ts/src/session-zones.ts P4-1): pure functions, zero IO / network / timers,
|
|
21
|
+
* closed error-code set, typed results, deterministic, versioned, fail-closed.
|
|
22
|
+
*
|
|
23
|
+
* Frozen upstream constraints (READ-ONLY reuse):
|
|
24
|
+
* - docs/design/memory-design.md §1 item 3: the profile only feeds ranking, never
|
|
25
|
+
* hard filters — future shape `semantic × bounded_modifier`, "otherwise memory
|
|
26
|
+
* would filter the search down to nothing";
|
|
27
|
+
* - docs/rfc/loopx-inspired-upgrades-rfc.md S2: the ranking form
|
|
28
|
+
* `rank = semantic × bounded_modifier` and the evidence-grade ordering
|
|
29
|
+
* `owner_correction > controlled_replay > deterministic_effect > evaluator_inference`;
|
|
30
|
+
* - the ranking-disclosure precedent in `ts/capabilities/` (the sponsored-inventory
|
|
31
|
+
* ranker): a non-semantic weight never silently rewrites the sort key, and a
|
|
32
|
+
* tie-break bias is disclosed per candidate;
|
|
33
|
+
* - ts/src/memory-decay.ts: decay touches behavioural events only and exposes no
|
|
34
|
+
* motivation-profile API; this module likewise touches no profile and no store.
|
|
35
|
+
*
|
|
36
|
+
* Red lines encoded structurally (each has a falsification test in
|
|
37
|
+
* ts/scripts/city-scenario-tier-tests.ts, run-all §86):
|
|
38
|
+
* 1. ranking only — `applyTierRanking` has NO filter/exclude surface at all, and
|
|
39
|
+
* the output always contains exactly the input candidates: a modifier may
|
|
40
|
+
* reorder, it can never remove a candidate (not even at the lower bound with
|
|
41
|
+
* a zero semantic score);
|
|
42
|
+
* 2. bounded — the modifier is an integer ppm inside declared [min,max] bounds;
|
|
43
|
+
* 0, negative, non-integer and out-of-range are refused at admission, so no
|
|
44
|
+
* tier can zero a candidate out;
|
|
45
|
+
* 3. neutral fallback, never a guess — unknown city, unknown scenario, conflicting
|
|
46
|
+
* evidence, empty registry and trigger-not-fired all return the NEUTRAL
|
|
47
|
+
* modifier with a stated reason; conflicting entries never elect a winner;
|
|
48
|
+
* 4. per-tier provenance (evidence grade + real sample refs + reviewer + freeze
|
|
49
|
+
* instant) and a retirement condition + review deadline are MANDATORY;
|
|
50
|
+
* 5. deterministic and versioned: same inputs → byte-identical result; ties keep
|
|
51
|
+
* declaration order.
|
|
52
|
+
*
|
|
53
|
+
* Only the real #339 trigger can supply: the taxonomy members themselves, the
|
|
54
|
+
* scenario vocabulary, the success metric, the numeric bounds justified by data,
|
|
55
|
+
* and the before/after ranking hypotheses with real counterexamples.
|
|
56
|
+
*
|
|
57
|
+
* @module src/city-scenario-tier
|
|
58
|
+
*/
|
|
59
|
+
/** Versioned contract schema id (readers validate it). */
|
|
60
|
+
export const CITY_SCENARIO_TIER_SCHEMA = 'gotry_city_scenario_tier.v1';
|
|
61
|
+
/**
|
|
62
|
+
* #339 implementation trigger gate, frozen false. Flipping it true requires
|
|
63
|
+
* reviewable real usage samples plus an explicit scenario vocabulary and success
|
|
64
|
+
* metric. While false, `admitTierEntry` refuses every admission.
|
|
65
|
+
*/
|
|
66
|
+
export const CITY_SCENARIO_TIER_TRIGGER_FIRED = false;
|
|
67
|
+
/**
|
|
68
|
+
* Declared modifier bounds, in ppm (1_000_000 = neutral ×1.0).
|
|
69
|
+
*
|
|
70
|
+
* NOT data-derived: RFC S2 fixes the FORM (`semantic × bounded_modifier`) but the
|
|
71
|
+
* repo states no numeric interval anywhere. These values are drill-declared so the
|
|
72
|
+
* bound CHECK can be proven; the interval itself must be re-frozen from real
|
|
73
|
+
* samples when #339's trigger fires. The lower bound is deliberately > 0 so no
|
|
74
|
+
* tier can ever annihilate a candidate's semantic score.
|
|
75
|
+
*/
|
|
76
|
+
export const TIER_MODIFIER_PPM_NEUTRAL = 1_000_000;
|
|
77
|
+
export const TIER_MODIFIER_PPM_MIN = 850_000;
|
|
78
|
+
export const TIER_MODIFIER_PPM_MAX = 1_150_000;
|
|
79
|
+
/** The only admitted application surface. There is no hard-filter surface. */
|
|
80
|
+
export const TIER_APPLICATION_SURFACES = ['ranking'];
|
|
81
|
+
/** Evidence grades, strongest first (RFC S2 ordering, read-only reuse). */
|
|
82
|
+
export const TIER_EVIDENCE_GRADES = ['owner_correction', 'controlled_replay', 'deterministic_effect', 'evaluator_inference'];
|
|
83
|
+
/**
|
|
84
|
+
* Admitted sample sources. Exactly one member: a reviewable real usage sample.
|
|
85
|
+
* A fixture / synthetic / model-authored sample is outside the closed set and is
|
|
86
|
+
* refused by name — this is #339's「不凭 fixture 造画像」as code.
|
|
87
|
+
*/
|
|
88
|
+
export const TIER_SAMPLE_SOURCES = ['real_usage_sample'];
|
|
89
|
+
/** Bounded shapes: keys are vocabulary members, never free prose. */
|
|
90
|
+
export const TIER_KEY_MAX_CHARS = 48;
|
|
91
|
+
export const TIER_TEXT_MAX_CHARS = 200;
|
|
92
|
+
export const TIER_MAX_REGISTRY_ENTRIES = 512;
|
|
93
|
+
function fail(code, detail) {
|
|
94
|
+
return { ok: false, code, detail };
|
|
95
|
+
}
|
|
96
|
+
function pass(value) {
|
|
97
|
+
return { ok: true, value };
|
|
98
|
+
}
|
|
99
|
+
// ---------------------------------------------------------------------------
|
|
100
|
+
// Key normalization (deterministic; never a guess)
|
|
101
|
+
// ---------------------------------------------------------------------------
|
|
102
|
+
/**
|
|
103
|
+
* Normalize a city / scenario key: trim, collapse internal whitespace, lowercase.
|
|
104
|
+
* No transliteration, no alias expansion, no fuzzy matching — an unrecognized key
|
|
105
|
+
* stays unrecognized and falls back to neutral (ADR-10: nothing is fabricated).
|
|
106
|
+
*/
|
|
107
|
+
export function normalizeTierKey(value, label) {
|
|
108
|
+
if (typeof value !== 'string') {
|
|
109
|
+
return fail('bad_key', `${label} must be a string, got ${JSON.stringify(value)}`);
|
|
110
|
+
}
|
|
111
|
+
const normalized = value.trim().replace(/\s+/g, ' ').toLowerCase();
|
|
112
|
+
if (normalized === '')
|
|
113
|
+
return fail('bad_key', `${label} must not be blank (a blank key is not an unknown key; callers must pass the key they actually have)`);
|
|
114
|
+
if (normalized.length > TIER_KEY_MAX_CHARS) {
|
|
115
|
+
return fail('bad_key', `${label} exceeds ${TIER_KEY_MAX_CHARS} chars (${normalized.length}) — a key is a vocabulary member, never prose`);
|
|
116
|
+
}
|
|
117
|
+
return pass(normalized);
|
|
118
|
+
}
|
|
119
|
+
function requiredText(label, value, code) {
|
|
120
|
+
if (typeof value !== 'string' || value.trim() === '') {
|
|
121
|
+
return fail(code, `${label} must be a non-empty string, got ${JSON.stringify(value)}`);
|
|
122
|
+
}
|
|
123
|
+
if (value.length > TIER_TEXT_MAX_CHARS) {
|
|
124
|
+
return fail('bound_exceeded', `${label} exceeds ${TIER_TEXT_MAX_CHARS} chars (${value.length})`);
|
|
125
|
+
}
|
|
126
|
+
return pass(value.trim());
|
|
127
|
+
}
|
|
128
|
+
function requiredInstant(label, value) {
|
|
129
|
+
if (typeof value !== 'string' || value.trim() === '') {
|
|
130
|
+
return fail('bad_ts', `${label} must be a non-empty ISO-8601 instant, got ${JSON.stringify(value)}`);
|
|
131
|
+
}
|
|
132
|
+
if (/^\d{4}-\d{2}-\d{2}$/.test(value.trim())) {
|
|
133
|
+
return fail('bad_ts', `${label} must carry a full time-of-day (date-only '${value}' cannot order a freeze/review)`);
|
|
134
|
+
}
|
|
135
|
+
const ms = Date.parse(value);
|
|
136
|
+
if (!Number.isFinite(ms))
|
|
137
|
+
return fail('bad_ts', `${label} is not a parseable ISO-8601 instant: ${JSON.stringify(value)}`);
|
|
138
|
+
return pass(new Date(ms).toISOString());
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Runtime taxonomy registry, frozen EMPTY — #339 forbids fabricating city-scenario
|
|
142
|
+
* tiers from fixtures. A non-empty value requires reviewable real samples and is a
|
|
143
|
+
* founder decision; the focused suite asserts this declaration stays `[]` in source.
|
|
144
|
+
*/
|
|
145
|
+
export const CITY_SCENARIO_TIER_REGISTRY = [];
|
|
146
|
+
/** Minimum reviewable real samples behind one tier (a single anecdote is not a tier). */
|
|
147
|
+
export const TIER_MIN_SAMPLE_REFS = 3;
|
|
148
|
+
/**
|
|
149
|
+
* Admit one taxonomy entry.
|
|
150
|
+
*
|
|
151
|
+
* While `CITY_SCENARIO_TIER_TRIGGER_FIRED` is false this refuses BEFORE validating
|
|
152
|
+
* anything, so no tier can be fabricated from fixtures. Tests and a future admitted
|
|
153
|
+
* slice pass `{ triggerFired: true }` explicitly to exercise the validation shape.
|
|
154
|
+
*/
|
|
155
|
+
export function admitTierEntry(input, options) {
|
|
156
|
+
const triggerFired = options?.triggerFired ?? CITY_SCENARIO_TIER_TRIGGER_FIRED;
|
|
157
|
+
if (!triggerFired) {
|
|
158
|
+
return fail('trigger_not_fired', '#339 trigger has not fired (reviewable real usage samples + an explicit scenario vocabulary and success metric are required); zero tiers admitted — 不凭 fixture 造画像');
|
|
159
|
+
}
|
|
160
|
+
const registry = options?.registry ?? CITY_SCENARIO_TIER_REGISTRY;
|
|
161
|
+
if (registry.length >= TIER_MAX_REGISTRY_ENTRIES) {
|
|
162
|
+
return fail('bound_exceeded', `registry already holds ${registry.length} entries (bound ${TIER_MAX_REGISTRY_ENTRIES}); an unbounded taxonomy is not explainable`);
|
|
163
|
+
}
|
|
164
|
+
const tierId = requiredText('tier_id', input?.tier_id, 'binding_incomplete');
|
|
165
|
+
if (!tierId.ok)
|
|
166
|
+
return tierId;
|
|
167
|
+
const cityKey = normalizeTierKey(input?.city_key, 'city_key');
|
|
168
|
+
if (!cityKey.ok)
|
|
169
|
+
return cityKey;
|
|
170
|
+
const scenarioKey = normalizeTierKey(input?.scenario_key, 'scenario_key');
|
|
171
|
+
if (!scenarioKey.ok)
|
|
172
|
+
return scenarioKey;
|
|
173
|
+
const version = requiredText('taxonomy_version', input?.taxonomy_version, 'binding_incomplete');
|
|
174
|
+
if (!version.ok)
|
|
175
|
+
return version;
|
|
176
|
+
const modifier = input?.modifier_ppm;
|
|
177
|
+
if (typeof modifier !== 'number' || !Number.isInteger(modifier)) {
|
|
178
|
+
return fail('modifier_bounds', `modifier_ppm must be an integer ppm, got ${JSON.stringify(modifier)} (floats drift; ppm integers are exact)`);
|
|
179
|
+
}
|
|
180
|
+
if (modifier < TIER_MODIFIER_PPM_MIN || modifier > TIER_MODIFIER_PPM_MAX) {
|
|
181
|
+
return fail('modifier_bounds', `modifier_ppm ${modifier} is outside the declared bounds [${TIER_MODIFIER_PPM_MIN},${TIER_MODIFIER_PPM_MAX}] (lower bound is > 0 by design: a tier may reorder, never annihilate a candidate)`);
|
|
182
|
+
}
|
|
183
|
+
const surface = input?.applies_to ?? 'ranking';
|
|
184
|
+
if (!TIER_APPLICATION_SURFACES.includes(surface)) {
|
|
185
|
+
return fail('closed_set', `applies_to must be one of [${TIER_APPLICATION_SURFACES.join('/')}], got ${JSON.stringify(surface)} — memory never enters a hard filter (memory-design §1.3)`);
|
|
186
|
+
}
|
|
187
|
+
const prov = input?.provenance;
|
|
188
|
+
if (prov === null || typeof prov !== 'object') {
|
|
189
|
+
return fail('provenance_required', 'provenance is mandatory: a tier without a stated evidence source is not evidence');
|
|
190
|
+
}
|
|
191
|
+
if (!TIER_EVIDENCE_GRADES.includes(prov['evidence_grade'])) {
|
|
192
|
+
return fail('closed_set', `provenance.evidence_grade must be one of [${TIER_EVIDENCE_GRADES.join('/')}], got ${JSON.stringify(prov['evidence_grade'])}`);
|
|
193
|
+
}
|
|
194
|
+
if (!TIER_SAMPLE_SOURCES.includes(prov['sample_source'])) {
|
|
195
|
+
return fail('closed_set', `provenance.sample_source must be one of [${TIER_SAMPLE_SOURCES.join('/')}], got ${JSON.stringify(prov['sample_source'])} — fixture/synthetic/model-authored samples are refused (#339: 不凭 fixture 造画像)`);
|
|
196
|
+
}
|
|
197
|
+
const refs = prov['sample_refs'];
|
|
198
|
+
if (!Array.isArray(refs) || refs.length < TIER_MIN_SAMPLE_REFS || !refs.every(r => typeof r === 'string' && r.trim() !== '')) {
|
|
199
|
+
return fail('provenance_required', `provenance.sample_refs must list at least ${TIER_MIN_SAMPLE_REFS} non-empty reviewable sample references, got ${JSON.stringify(refs)} (a single anecdote is not a tier)`);
|
|
200
|
+
}
|
|
201
|
+
const reviewer = requiredText('provenance.reviewer', prov['reviewer'], 'provenance_required');
|
|
202
|
+
if (!reviewer.ok)
|
|
203
|
+
return reviewer;
|
|
204
|
+
const frozenAt = requiredInstant('provenance.frozen_at', prov['frozen_at']);
|
|
205
|
+
if (!frozenAt.ok)
|
|
206
|
+
return frozenAt;
|
|
207
|
+
const ret = input?.retirement;
|
|
208
|
+
if (ret === null || typeof ret !== 'object') {
|
|
209
|
+
return fail('retirement_required', 'retirement is mandatory: a tier that cannot expire is not evidence (#339 acceptance 1 requires a retirement condition per class)');
|
|
210
|
+
}
|
|
211
|
+
const condition = requiredText('retirement.condition', ret['condition'], 'retirement_required');
|
|
212
|
+
if (!condition.ok)
|
|
213
|
+
return condition;
|
|
214
|
+
const reviewBy = requiredInstant('retirement.review_by', ret['review_by']);
|
|
215
|
+
if (!reviewBy.ok)
|
|
216
|
+
return reviewBy;
|
|
217
|
+
if (reviewBy.value <= frozenAt.value) {
|
|
218
|
+
return fail('retirement_required', `retirement.review_by ${reviewBy.value} must postdate provenance.frozen_at ${frozenAt.value}`);
|
|
219
|
+
}
|
|
220
|
+
if (registry.some(e => e.tier_id === tierId.value)) {
|
|
221
|
+
return fail('duplicate_tier', `tier_id ${tierId.value} already exists in the registry`);
|
|
222
|
+
}
|
|
223
|
+
if (registry.some(e => e.city_key === cityKey.value && e.scenario_key === scenarioKey.value)) {
|
|
224
|
+
return fail('duplicate_tier', `(city ${cityKey.value}, scenario ${scenarioKey.value}) already carries a tier; a second weight for the same pair is conflicting evidence, not an additional tier`);
|
|
225
|
+
}
|
|
226
|
+
return pass(Object.freeze({
|
|
227
|
+
schema: CITY_SCENARIO_TIER_SCHEMA,
|
|
228
|
+
tier_id: tierId.value,
|
|
229
|
+
city_key: cityKey.value,
|
|
230
|
+
scenario_key: scenarioKey.value,
|
|
231
|
+
modifier_ppm: modifier,
|
|
232
|
+
applies_to: surface,
|
|
233
|
+
provenance: Object.freeze({
|
|
234
|
+
evidence_grade: prov['evidence_grade'],
|
|
235
|
+
sample_source: prov['sample_source'],
|
|
236
|
+
sample_refs: Object.freeze([...refs]),
|
|
237
|
+
reviewer: reviewer.value,
|
|
238
|
+
frozen_at: frozenAt.value,
|
|
239
|
+
}),
|
|
240
|
+
retirement: Object.freeze({ condition: condition.value, review_by: reviewBy.value }),
|
|
241
|
+
taxonomy_version: version.value,
|
|
242
|
+
}));
|
|
243
|
+
}
|
|
244
|
+
// ---------------------------------------------------------------------------
|
|
245
|
+
// Resolution: neutral fallback, never a guess
|
|
246
|
+
// ---------------------------------------------------------------------------
|
|
247
|
+
export const TIER_NEUTRAL_REASONS = [
|
|
248
|
+
'trigger_not_fired',
|
|
249
|
+
'empty_registry',
|
|
250
|
+
'unknown_city',
|
|
251
|
+
'unknown_scenario',
|
|
252
|
+
'conflicting_evidence',
|
|
253
|
+
];
|
|
254
|
+
function neutral(reason, explanation, conflicting = []) {
|
|
255
|
+
return Object.freeze({
|
|
256
|
+
status: 'neutral',
|
|
257
|
+
modifier_ppm: TIER_MODIFIER_PPM_NEUTRAL,
|
|
258
|
+
tier_id: null,
|
|
259
|
+
reason,
|
|
260
|
+
conflicting_tier_ids: Object.freeze([...conflicting]),
|
|
261
|
+
explanation,
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Resolve the bounded modifier for one (city, scenario) pair.
|
|
266
|
+
*
|
|
267
|
+
* Returns NEUTRAL (×1.0) with a stated reason for: trigger not fired, empty
|
|
268
|
+
* registry, unknown city, unknown scenario, and conflicting evidence. Conflicting
|
|
269
|
+
* entries never elect a winner (geo-atlas `ambiguous` discipline). A malformed key
|
|
270
|
+
* is a caller error and is reported as such rather than silently neutralized.
|
|
271
|
+
*/
|
|
272
|
+
export function resolveTier(query, options) {
|
|
273
|
+
const cityKey = normalizeTierKey(query?.cityKey, 'cityKey');
|
|
274
|
+
if (!cityKey.ok)
|
|
275
|
+
return cityKey;
|
|
276
|
+
const scenarioKey = normalizeTierKey(query?.scenarioKey, 'scenarioKey');
|
|
277
|
+
if (!scenarioKey.ok)
|
|
278
|
+
return scenarioKey;
|
|
279
|
+
const triggerFired = options?.triggerFired ?? CITY_SCENARIO_TIER_TRIGGER_FIRED;
|
|
280
|
+
if (!triggerFired) {
|
|
281
|
+
return pass(neutral('trigger_not_fired', '#339 trigger has not fired; every city×scenario pair resolves to the neutral modifier ×1.0 (no tier is guessed)'));
|
|
282
|
+
}
|
|
283
|
+
const registry = options?.registry ?? CITY_SCENARIO_TIER_REGISTRY;
|
|
284
|
+
if (registry.length === 0) {
|
|
285
|
+
return pass(neutral('empty_registry', 'the taxonomy registry is empty; neutral ×1.0 (an empty taxonomy is not a zero weight)'));
|
|
286
|
+
}
|
|
287
|
+
const cityMatches = registry.filter(e => e.city_key === cityKey.value);
|
|
288
|
+
if (cityMatches.length === 0) {
|
|
289
|
+
return pass(neutral('unknown_city', `city '${cityKey.value}' carries no tier in taxonomy; neutral ×1.0 (an unknown city is never guessed from a neighbour)`));
|
|
290
|
+
}
|
|
291
|
+
const matches = cityMatches.filter(e => e.scenario_key === scenarioKey.value);
|
|
292
|
+
if (matches.length === 0) {
|
|
293
|
+
return pass(neutral('unknown_scenario', `scenario '${scenarioKey.value}' carries no tier for city '${cityKey.value}'; neutral ×1.0 (an unknown scenario is never approximated by another scenario)`));
|
|
294
|
+
}
|
|
295
|
+
if (matches.length > 1) {
|
|
296
|
+
return pass(neutral('conflicting_evidence', `city '${cityKey.value}' × scenario '${scenarioKey.value}' carries ${matches.length} conflicting tiers; neutral ×1.0 and no winner is elected (conflict is surfaced, never resolved by guessing)`, matches.map(e => e.tier_id)));
|
|
297
|
+
}
|
|
298
|
+
const entry = matches[0];
|
|
299
|
+
if (entry.modifier_ppm < TIER_MODIFIER_PPM_MIN || entry.modifier_ppm > TIER_MODIFIER_PPM_MAX) {
|
|
300
|
+
return fail('modifier_bounds', `registry entry ${entry.tier_id} carries modifier_ppm ${entry.modifier_ppm} outside the declared bounds [${TIER_MODIFIER_PPM_MIN},${TIER_MODIFIER_PPM_MAX}] — a defective registry entry is refused, never clamped silently`);
|
|
301
|
+
}
|
|
302
|
+
return pass(Object.freeze({
|
|
303
|
+
status: 'hit',
|
|
304
|
+
modifier_ppm: entry.modifier_ppm,
|
|
305
|
+
tier_id: entry.tier_id,
|
|
306
|
+
taxonomy_version: entry.taxonomy_version,
|
|
307
|
+
evidence_grade: entry.provenance.evidence_grade,
|
|
308
|
+
explanation: `tier ${entry.tier_id} (${entry.taxonomy_version}, evidence ${entry.provenance.evidence_grade}) applies ×${(entry.modifier_ppm / 1_000_000).toFixed(6)} to the ranking score of city '${entry.city_key}' under scenario '${entry.scenario_key}'; retire when: ${entry.retirement.condition}`,
|
|
309
|
+
}));
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Apply tier modifiers to a candidate ranking.
|
|
313
|
+
*
|
|
314
|
+
* There is deliberately NO filter, exclude, drop or threshold parameter and no
|
|
315
|
+
* such field in the result: the returned array always contains exactly the input
|
|
316
|
+
* candidates (same ids, same count), only reordered. `semantic` is preserved on
|
|
317
|
+
* every output row so a caller can always recover the unmodified ranking.
|
|
318
|
+
* Ties keep declaration order (stable).
|
|
319
|
+
*/
|
|
320
|
+
export function applyTierRanking(candidates, context, options) {
|
|
321
|
+
if (!Array.isArray(candidates))
|
|
322
|
+
return fail('bad_candidate', 'candidates must be an array');
|
|
323
|
+
const seen = new Set();
|
|
324
|
+
for (const c of candidates) {
|
|
325
|
+
if (c === null || typeof c !== 'object' || typeof c.id !== 'string' || c.id.trim() === '') {
|
|
326
|
+
return fail('bad_candidate', `every candidate needs a non-empty id, got ${JSON.stringify(c)}`);
|
|
327
|
+
}
|
|
328
|
+
if (seen.has(c.id))
|
|
329
|
+
return fail('bad_candidate', `duplicate candidate id ${c.id} (ranking inputs must be a set)`);
|
|
330
|
+
seen.add(c.id);
|
|
331
|
+
if (typeof c.semantic !== 'number' || !Number.isFinite(c.semantic)) {
|
|
332
|
+
return fail('bad_candidate', `candidate ${c.id} semantic score must be finite, got ${String(c.semantic)}`);
|
|
333
|
+
}
|
|
334
|
+
if (c.semantic < 0) {
|
|
335
|
+
return fail('bad_candidate', `candidate ${c.id} semantic score must be non-negative, got ${String(c.semantic)} — the ranking contract is multiplicative, so a negative score would invert every modifier (a boost would demote)`);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
const ranked = [];
|
|
339
|
+
for (const c of candidates) {
|
|
340
|
+
const resolution = resolveTier({ cityKey: c.cityKey, scenarioKey: context?.scenarioKey }, options);
|
|
341
|
+
if (!resolution.ok)
|
|
342
|
+
return resolution;
|
|
343
|
+
const r = resolution.value;
|
|
344
|
+
ranked.push(Object.freeze({
|
|
345
|
+
id: c.id,
|
|
346
|
+
semantic: c.semantic,
|
|
347
|
+
modifier_ppm: r.modifier_ppm,
|
|
348
|
+
score: (c.semantic * r.modifier_ppm) / 1_000_000,
|
|
349
|
+
tier_id: r.status === 'hit' ? r.tier_id : null,
|
|
350
|
+
explanation: r.explanation,
|
|
351
|
+
}));
|
|
352
|
+
}
|
|
353
|
+
const ordered = ranked
|
|
354
|
+
.map((row, index) => ({ row, index }))
|
|
355
|
+
.sort((a, b) => (b.row.score - a.row.score) || (a.index - b.index))
|
|
356
|
+
.map(({ row }) => row);
|
|
357
|
+
// Structural invariant: ranking never removes a candidate.
|
|
358
|
+
if (ordered.length !== candidates.length || !candidates.every(c => ordered.some(r => r.id === c.id))) {
|
|
359
|
+
return fail('bad_candidate', 'internal invariant violated: tier ranking must preserve the candidate set exactly (memory never enters a hard filter)');
|
|
360
|
+
}
|
|
361
|
+
return pass(Object.freeze([...ordered]));
|
|
362
|
+
}
|
|
363
|
+
/**
|
|
364
|
+
* Mechanical no-hard-filter check a caller (or a gate) can run: the ranked output
|
|
365
|
+
* must contain exactly the input candidate ids. Returns a violation string, or null.
|
|
366
|
+
*/
|
|
367
|
+
export function tierRankingFilterViolation(before, after) {
|
|
368
|
+
if (before.length !== after.length) {
|
|
369
|
+
return `tier ranking changed the candidate count ${before.length} → ${after.length}: memory may reorder, never filter (memory-design §1.3)`;
|
|
370
|
+
}
|
|
371
|
+
const missing = before.filter(c => !after.some(r => r.id === c.id)).map(c => c.id);
|
|
372
|
+
if (missing.length > 0)
|
|
373
|
+
return `tier ranking dropped candidates [${missing.join(',')}]: memory may reorder, never filter`;
|
|
374
|
+
const added = after.filter(r => !before.some(c => c.id === r.id)).map(r => r.id);
|
|
375
|
+
if (added.length > 0)
|
|
376
|
+
return `tier ranking invented candidates [${added.join(',')}]`;
|
|
377
|
+
return null;
|
|
378
|
+
}
|
package/dist/src/companions.js
CHANGED
|
@@ -1,56 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 同行人档案(memory-design M5 层,P2):同行人及其约束(行动/健康/偏好)的持久化。
|
|
3
|
+
*
|
|
4
|
+
* 立场(memory-design §1):
|
|
5
|
+
* - 溯源 P0:每条约束伴 evidence(用户原话),追加不删史;
|
|
6
|
+
* - 约束只进排序与行程结构建议,永不进硬过滤;
|
|
7
|
+
* - **负面清单守卫**:证件号/电话/地址等敏感字段拒收入库(需要时后端从登录态
|
|
8
|
+
* 填充,fail-closed)——health 存的是「高血压/晕车」这类行为约束,不是病历;
|
|
9
|
+
* - upsert 合并语义同 mergeProfile:追加不删史/同内容幂等。
|
|
10
|
+
*/
|
|
11
|
+
/** 负面清单:命中即拒收(红线 6 + 隐私立场) */
|
|
1
12
|
const SENSITIVE_PATTERNS = [
|
|
2
|
-
{
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
},
|
|
6
|
-
{
|
|
7
|
-
re: /1[3-9]\d{9}/,
|
|
8
|
-
label: '疑似手机号'
|
|
9
|
-
},
|
|
10
|
-
{
|
|
11
|
-
re: /(护照|身份证|证件号|通行证)\s*号?\s*[::]?\s*\w+/i,
|
|
12
|
-
label: '证件信息'
|
|
13
|
-
}
|
|
13
|
+
{ re: /\d{15,17}[Xx]?/, label: '疑似证件号/卡号' },
|
|
14
|
+
{ re: /1[3-9]\d{9}/, label: '疑似手机号' },
|
|
15
|
+
{ re: /(护照|身份证|证件号|通行证)\s*号?\s*[::]?\s*\w+/i, label: '证件信息' },
|
|
14
16
|
];
|
|
17
|
+
/** 守门:内容命中负面清单 → 返回拒收理由;否则 null */
|
|
15
18
|
export function sensitiveViolation(text) {
|
|
16
|
-
for (const { re, label } of SENSITIVE_PATTERNS){
|
|
17
|
-
if (re.test(text))
|
|
19
|
+
for (const { re, label } of SENSITIVE_PATTERNS) {
|
|
20
|
+
if (re.test(text))
|
|
21
|
+
return `负面清单拒收:${label}不入库(需要时由后端从登录态填充)`;
|
|
18
22
|
}
|
|
19
23
|
return null;
|
|
20
24
|
}
|
|
25
|
+
/** 稳定主键:label 去空白 */
|
|
21
26
|
export function companionId(label) {
|
|
22
27
|
return label.replace(/\s+/g, '');
|
|
23
28
|
}
|
|
24
29
|
function mergeStrArray(oldArr, newArr) {
|
|
25
30
|
const a = oldArr ?? [];
|
|
26
31
|
let added = false;
|
|
27
|
-
for (const x of newArr ?? []){
|
|
32
|
+
for (const x of newArr ?? []) {
|
|
28
33
|
if (!a.includes(x)) {
|
|
29
34
|
a.push(x);
|
|
30
35
|
added = true;
|
|
31
36
|
}
|
|
32
37
|
}
|
|
33
|
-
return {
|
|
34
|
-
merged: a,
|
|
35
|
-
added
|
|
36
|
-
};
|
|
38
|
+
return { merged: a, added };
|
|
37
39
|
}
|
|
40
|
+
/**
|
|
41
|
+
* upsert 合并(纯函数,不改入参):同 companion_id 按 label 归并——
|
|
42
|
+
* constraints 逐字段取新值(新值覆盖旧行为约束,追加数组项),evidence 追加不删史,
|
|
43
|
+
* 全量无新增 → 幂等 no-op(appended:false)。
|
|
44
|
+
*/
|
|
38
45
|
export function upsertCompanion(profiles, patch) {
|
|
39
|
-
if (!patch.label?.trim())
|
|
40
|
-
profiles,
|
|
41
|
-
appended: false,
|
|
42
|
-
companionId: '',
|
|
43
|
-
reason: 'label 必填'
|
|
44
|
-
};
|
|
46
|
+
if (!patch.label?.trim())
|
|
47
|
+
return { profiles, appended: false, companionId: '', reason: 'label 必填' };
|
|
45
48
|
const violation = sensitiveViolation(JSON.stringify(patch));
|
|
46
|
-
if (violation)
|
|
47
|
-
profiles,
|
|
48
|
-
appended: false,
|
|
49
|
-
companionId: '',
|
|
50
|
-
reason: violation
|
|
51
|
-
};
|
|
49
|
+
if (violation)
|
|
50
|
+
return { profiles, appended: false, companionId: '', reason: violation };
|
|
52
51
|
const id = companionId(patch.label);
|
|
53
|
-
const existing = profiles.find(
|
|
52
|
+
const existing = profiles.find(p => p.companion_id === id);
|
|
54
53
|
if (!existing) {
|
|
55
54
|
const full = {
|
|
56
55
|
schema: 'companion_profile.v1',
|
|
@@ -58,55 +57,30 @@ export function upsertCompanion(profiles, patch) {
|
|
|
58
57
|
label: patch.label.trim(),
|
|
59
58
|
constraints: {
|
|
60
59
|
mobility: patch.constraints.mobility,
|
|
61
|
-
health: patch.constraints.health ? [
|
|
62
|
-
|
|
63
|
-
] : undefined,
|
|
64
|
-
prefs: patch.constraints.prefs ? [
|
|
65
|
-
...patch.constraints.prefs
|
|
66
|
-
] : undefined
|
|
60
|
+
health: patch.constraints.health ? [...patch.constraints.health] : undefined,
|
|
61
|
+
prefs: patch.constraints.prefs ? [...patch.constraints.prefs] : undefined,
|
|
67
62
|
},
|
|
68
|
-
evidence: [
|
|
69
|
-
|
|
70
|
-
],
|
|
71
|
-
ts: new Date().toISOString()
|
|
72
|
-
};
|
|
73
|
-
return {
|
|
74
|
-
profiles: [
|
|
75
|
-
...profiles,
|
|
76
|
-
full
|
|
77
|
-
],
|
|
78
|
-
appended: true,
|
|
79
|
-
companionId: id
|
|
63
|
+
evidence: [patch.evidence],
|
|
64
|
+
ts: new Date().toISOString(),
|
|
80
65
|
};
|
|
66
|
+
return { profiles: [...profiles, full], appended: true, companionId: id };
|
|
81
67
|
}
|
|
82
68
|
const mergedConstraints = {
|
|
83
69
|
mobility: patch.constraints.mobility ?? existing.constraints.mobility,
|
|
84
70
|
health: mergeStrArray(existing.constraints.health, patch.constraints.health).merged,
|
|
85
|
-
prefs: mergeStrArray(existing.constraints.prefs, patch.constraints.prefs).merged
|
|
71
|
+
prefs: mergeStrArray(existing.constraints.prefs, patch.constraints.prefs).merged,
|
|
86
72
|
};
|
|
87
|
-
const ev = mergeStrArray(existing.evidence, [
|
|
88
|
-
patch.evidence
|
|
89
|
-
]);
|
|
73
|
+
const ev = mergeStrArray(existing.evidence, [patch.evidence]);
|
|
90
74
|
const healthLen = mergedConstraints.health?.length ?? 0;
|
|
91
75
|
const prefsLen = mergedConstraints.prefs?.length ?? 0;
|
|
92
|
-
const changed = mergedConstraints.mobility !== existing.constraints.mobility ||
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
const next = profiles.map(
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
ts: new Date().toISOString()
|
|
103
|
-
} : p);
|
|
104
|
-
return {
|
|
105
|
-
profiles: next,
|
|
106
|
-
appended: true,
|
|
107
|
-
companionId: id
|
|
108
|
-
};
|
|
76
|
+
const changed = mergedConstraints.mobility !== existing.constraints.mobility ||
|
|
77
|
+
healthLen !== (existing.constraints.health?.length ?? 0) ||
|
|
78
|
+
prefsLen !== (existing.constraints.prefs?.length ?? 0) ||
|
|
79
|
+
ev.added;
|
|
80
|
+
if (!changed)
|
|
81
|
+
return { profiles, appended: false, companionId: id };
|
|
82
|
+
const next = profiles.map(p => p.companion_id === id
|
|
83
|
+
? { ...p, constraints: mergedConstraints, evidence: ev.merged, ts: new Date().toISOString() }
|
|
84
|
+
: p);
|
|
85
|
+
return { profiles: next, appended: true, companionId: id };
|
|
109
86
|
}
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
//# sourceURL=/Users/bytedance/work/gotry/ts/src/companions.ts
|
package/dist/src/contracts.js
CHANGED
|
@@ -1,64 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stage 1 契约层(S1,docs/design/stage1-top-down-design.md §2)——顶层数据与工具面契约。
|
|
3
|
+
*
|
|
4
|
+
* 自顶向下纪律:本文件是唯一权威契约。实现(mock 循环/求解器挂载/真 LLM)都向这里对齐;
|
|
5
|
+
* 契约变更需走设计文档升版,不随实现漂移。
|
|
6
|
+
* 责任铁律:LLM 只做问句组织/翻译/解释;判定与算术永远是确定性组件。
|
|
7
|
+
*/
|
|
8
|
+
/** 工具注册表:名字 → IO 类型(dsh 插件按此生成 parameters/output schema) */
|
|
1
9
|
export const TOOL_CONTRACTS = {
|
|
2
10
|
'gotry_interview_next': {},
|
|
3
11
|
'gotry_spec_extract': {},
|
|
4
12
|
'gotry_solve': {},
|
|
5
13
|
'gotry_render': {},
|
|
6
|
-
'gotry_wish_pool_add': {}
|
|
14
|
+
'gotry_wish_pool_add': {},
|
|
7
15
|
};
|
|
16
|
+
// ---- wire schema(dsh 注册用的 JSON Schema 面;type:'json' 根 + 关键字段文档) ----
|
|
8
17
|
export const TRIP_STATE_JSON_SCHEMA = {
|
|
9
18
|
type: 'object',
|
|
10
19
|
additionalProperties: false,
|
|
11
20
|
properties: {
|
|
12
21
|
calendar: {
|
|
13
|
-
type: 'object',
|
|
14
|
-
|
|
15
|
-
description: '年份与已断言的星期映射;一次断言终身使用,冲突必须显式指出'
|
|
22
|
+
type: 'object', additionalProperties: true,
|
|
23
|
+
description: '年份与已断言的星期映射;一次断言终身使用,冲突必须显式指出',
|
|
16
24
|
},
|
|
17
25
|
profile: {
|
|
18
|
-
type: 'object',
|
|
19
|
-
|
|
20
|
-
description: 'workWindow(带 evidence)/companions/budgetTier/bookedResources/motivation'
|
|
21
|
-
},
|
|
22
|
-
spec: {
|
|
23
|
-
type: 'json',
|
|
24
|
-
description: '统一行程模型 JourneySpec(见 unified.ts)'
|
|
25
|
-
},
|
|
26
|
-
solve: {
|
|
27
|
-
type: 'json',
|
|
28
|
-
description: '求解结果(锚点/排除/红旗/建议)'
|
|
26
|
+
type: 'object', additionalProperties: true,
|
|
27
|
+
description: 'workWindow(带 evidence)/companions/budgetTier/bookedResources/motivation',
|
|
29
28
|
},
|
|
29
|
+
spec: { type: 'json', description: '统一行程模型 JourneySpec(见 unified.ts)' },
|
|
30
|
+
solve: { type: 'json', description: '求解结果(锚点/排除/红旗/建议)' },
|
|
30
31
|
gates: {
|
|
31
32
|
type: 'array',
|
|
32
33
|
description: '待决问题,只能是选择题',
|
|
33
34
|
items: {
|
|
34
|
-
type: 'object',
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
id: {
|
|
38
|
-
type: 'string'
|
|
39
|
-
},
|
|
40
|
-
question: {
|
|
41
|
-
type: 'string'
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
}
|
|
35
|
+
type: 'object', additionalProperties: true,
|
|
36
|
+
properties: { id: { type: 'string' }, question: { type: 'string' } },
|
|
37
|
+
},
|
|
45
38
|
},
|
|
46
|
-
wishes: {
|
|
47
|
-
type: 'array',
|
|
48
|
-
description: '「下一次出发」清单',
|
|
49
|
-
items: {
|
|
50
|
-
type: 'object',
|
|
51
|
-
additionalProperties: true
|
|
52
|
-
}
|
|
53
|
-
}
|
|
39
|
+
wishes: { type: 'array', description: '「下一次出发」清单', items: { type: 'object', additionalProperties: true } },
|
|
54
40
|
},
|
|
55
|
-
required: [
|
|
56
|
-
'calendar',
|
|
57
|
-
'profile',
|
|
58
|
-
'gates',
|
|
59
|
-
'wishes'
|
|
60
|
-
]
|
|
41
|
+
required: ['calendar', 'profile', 'gates', 'wishes'],
|
|
61
42
|
};
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
//# sourceURL=/Users/bytedance/work/gotry/ts/src/contracts.ts
|