@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,400 @@
|
|
|
1
|
+
/** Host-owned Lavish Editor lifecycle tools for issue #443. */
|
|
2
|
+
import { realpath } from 'node:fs/promises';
|
|
3
|
+
import { isAbsolute } from 'node:path';
|
|
4
|
+
import { defineTool } from '@deepseek-ai/dsh-tools';
|
|
5
|
+
import { LavishLocalSession, } from '../capabilities/lavish-local.js';
|
|
6
|
+
export function registerLavishTools(options) {
|
|
7
|
+
const cliPackageRoot = options.getConfig().lavishAxiPackageRoot ?? '';
|
|
8
|
+
if (cliPackageRoot.length === 0)
|
|
9
|
+
return { registered: false, reason: 'lavishAxiPackageRoot is not configured' };
|
|
10
|
+
if (!isAbsolute(cliPackageRoot))
|
|
11
|
+
return { registered: false, reason: 'lavishAxiPackageRoot must be absolute' };
|
|
12
|
+
const records = new Map();
|
|
13
|
+
const disposedIds = new Set();
|
|
14
|
+
// Registrar-wide terminal: once set, bind() refuses any new record creation
|
|
15
|
+
// or reuse, regardless of authority or cwd. Set synchronously by the plugin
|
|
16
|
+
// unload disposer before any await so unload cannot race a late bind call.
|
|
17
|
+
let closed = false;
|
|
18
|
+
const closedFailure = () => failure('lavish-plugin-closed', 'Lavish plugin is unloaded; no new host sessions may be opened');
|
|
19
|
+
const bind = async (exec) => {
|
|
20
|
+
const authority = readAuthority(exec);
|
|
21
|
+
if (!authority.ok)
|
|
22
|
+
return failure('lavish-authority-rejected', authority.detail);
|
|
23
|
+
if (closed)
|
|
24
|
+
return closedFailure();
|
|
25
|
+
if (disposedIds.has(authority.id))
|
|
26
|
+
return failure('lavish-session-terminal', `host session ${authority.id} was disposed`);
|
|
27
|
+
const existing = records.get(authority.id);
|
|
28
|
+
if (existing && existing.rawCwd !== authority.cwd) {
|
|
29
|
+
return failure('lavish-cwd-drift', `host session ${authority.id} is already bound to a different raw cwd`);
|
|
30
|
+
}
|
|
31
|
+
let canonicalCwd;
|
|
32
|
+
try {
|
|
33
|
+
canonicalCwd = await realpath(authority.cwd);
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return failure('lavish-authority-rejected', 'host session header.cwd must name an existing directory');
|
|
37
|
+
}
|
|
38
|
+
if (closed)
|
|
39
|
+
return closedFailure();
|
|
40
|
+
if (disposedIds.has(authority.id))
|
|
41
|
+
return failure('lavish-session-terminal', `host session ${authority.id} was disposed`);
|
|
42
|
+
// Another first call for this id may have bound the record while realpath awaited.
|
|
43
|
+
const bound = records.get(authority.id);
|
|
44
|
+
if (bound) {
|
|
45
|
+
if (bound.rawCwd !== authority.cwd || bound.canonicalCwd !== canonicalCwd) {
|
|
46
|
+
return failure('lavish-cwd-drift', `host session ${authority.id} canonical cwd changed`);
|
|
47
|
+
}
|
|
48
|
+
return bound;
|
|
49
|
+
}
|
|
50
|
+
if (closed)
|
|
51
|
+
return closedFailure();
|
|
52
|
+
const record = {
|
|
53
|
+
id: authority.id,
|
|
54
|
+
rawCwd: authority.cwd,
|
|
55
|
+
canonicalCwd,
|
|
56
|
+
session: null,
|
|
57
|
+
terminal: null,
|
|
58
|
+
tail: Promise.resolve(),
|
|
59
|
+
cleanup: null,
|
|
60
|
+
stopResult: null,
|
|
61
|
+
};
|
|
62
|
+
records.set(authority.id, record);
|
|
63
|
+
return record;
|
|
64
|
+
};
|
|
65
|
+
const runActive = async (exec, operation) => {
|
|
66
|
+
const record = await bind(exec);
|
|
67
|
+
if (!isRecord(record))
|
|
68
|
+
return record;
|
|
69
|
+
return enqueue(record, async () => {
|
|
70
|
+
if (record.terminal)
|
|
71
|
+
return terminalFailure(record);
|
|
72
|
+
return operation(record);
|
|
73
|
+
});
|
|
74
|
+
};
|
|
75
|
+
const getSession = async (record) => {
|
|
76
|
+
if (record.session)
|
|
77
|
+
return record.session;
|
|
78
|
+
const creation = LavishLocalSession.create({
|
|
79
|
+
cliPackageRoot,
|
|
80
|
+
cwd: record.rawCwd,
|
|
81
|
+
allowedRoot: record.rawCwd,
|
|
82
|
+
});
|
|
83
|
+
try {
|
|
84
|
+
const session = await creation;
|
|
85
|
+
record.session = session;
|
|
86
|
+
return session;
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
return failure('lavish-create-failed', error instanceof Error ? error.message : 'Lavish session creation failed');
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
const finishCommand = async (record, result) => {
|
|
93
|
+
// Snapshot host authority before any adapter signal latches: a stop/dispose
|
|
94
|
+
// that fired during this in-flight command must preserve its precedence
|
|
95
|
+
// over a just-completed user-ended / poll-outcome-unknown result.
|
|
96
|
+
const prior = record.terminal;
|
|
97
|
+
latchAdapterTerminal(record, result);
|
|
98
|
+
if (prior === 'disposed' || prior === 'stopped') {
|
|
99
|
+
record.terminal = prior;
|
|
100
|
+
await cleanup(record);
|
|
101
|
+
return terminalFailure(record);
|
|
102
|
+
}
|
|
103
|
+
if (record.terminal === 'disposed' || record.terminal === 'stopped') {
|
|
104
|
+
await cleanup(record);
|
|
105
|
+
return terminalFailure(record);
|
|
106
|
+
}
|
|
107
|
+
return present(result);
|
|
108
|
+
};
|
|
109
|
+
const finishEnd = async (record, result) => {
|
|
110
|
+
// End must preserve host authority: a concurrent stop/dispose that fired
|
|
111
|
+
// during this end() call retains terminal, and the explicit 'ended'
|
|
112
|
+
// latch must not overwrite an existing 'ended' / 'stopped' / 'disposed'.
|
|
113
|
+
const prior = record.terminal;
|
|
114
|
+
latchAdapterTerminal(record, result);
|
|
115
|
+
if (prior === 'disposed' || prior === 'stopped') {
|
|
116
|
+
record.terminal = prior;
|
|
117
|
+
await cleanup(record);
|
|
118
|
+
return terminalFailure(record);
|
|
119
|
+
}
|
|
120
|
+
if (record.terminal === 'disposed' || record.terminal === 'stopped') {
|
|
121
|
+
await cleanup(record);
|
|
122
|
+
return terminalFailure(record);
|
|
123
|
+
}
|
|
124
|
+
if (result.ok && !record.terminal)
|
|
125
|
+
record.terminal = 'ended';
|
|
126
|
+
return present(result);
|
|
127
|
+
};
|
|
128
|
+
options.register(defineTool({
|
|
129
|
+
name: 'gotry_lavish_open',
|
|
130
|
+
description: 'Open an existing HTML artifact in the host-owned local Lavish Editor. The trusted pinned CLI and workspace root come only from host configuration and session metadata.',
|
|
131
|
+
parameters: { path: { type: 'string', required: true, description: 'HTML/HTM artifact path under the host session cwd' } },
|
|
132
|
+
output: outputPresentation('Lavish open'),
|
|
133
|
+
async execute(args, exec) {
|
|
134
|
+
return runActive(exec, async (record) => {
|
|
135
|
+
const session = await getSession(record);
|
|
136
|
+
if (!isSession(session))
|
|
137
|
+
return session;
|
|
138
|
+
if (record.terminal) {
|
|
139
|
+
await cleanup(record);
|
|
140
|
+
return terminalFailure(record);
|
|
141
|
+
}
|
|
142
|
+
const result = await session.open(args.path);
|
|
143
|
+
return finishCommand(record, result);
|
|
144
|
+
});
|
|
145
|
+
},
|
|
146
|
+
presentCall: args => callPresentation('Lavish open', args),
|
|
147
|
+
presentResult: resultPresentation('Lavish open'),
|
|
148
|
+
}));
|
|
149
|
+
options.register(defineTool({
|
|
150
|
+
name: 'gotry_lavish_poll',
|
|
151
|
+
description: 'Wait once for untrusted user feedback from the host session Lavish Editor. An uncertain poll outcome is terminal because retrying could double-consume feedback.',
|
|
152
|
+
parameters: {
|
|
153
|
+
path: { type: 'string', required: true, description: 'Previously opened HTML/HTM artifact path' },
|
|
154
|
+
timeoutMs: { type: 'integer', description: 'Optional bounded positive poll timeout in milliseconds' },
|
|
155
|
+
},
|
|
156
|
+
output: outputPresentation('Lavish poll'),
|
|
157
|
+
async execute(args, exec) {
|
|
158
|
+
return runActive(exec, async (record) => {
|
|
159
|
+
if (!record.session)
|
|
160
|
+
return failure('lavish-session-missing', 'call gotry_lavish_open first');
|
|
161
|
+
const result = await record.session.poll(args.path, args.timeoutMs === undefined ? {} : { timeoutMs: args.timeoutMs });
|
|
162
|
+
return finishCommand(record, result);
|
|
163
|
+
});
|
|
164
|
+
},
|
|
165
|
+
presentCall: args => callPresentation('Lavish poll', args),
|
|
166
|
+
presentResult: resultPresentation('Lavish poll'),
|
|
167
|
+
}));
|
|
168
|
+
options.register(defineTool({
|
|
169
|
+
name: 'gotry_lavish_reply',
|
|
170
|
+
description: 'Send one bounded visible reply and wait once for the next untrusted Lavish feedback state.',
|
|
171
|
+
parameters: {
|
|
172
|
+
path: { type: 'string', required: true, description: 'Previously opened HTML/HTM artifact path' },
|
|
173
|
+
reply: { type: 'string', required: true, description: 'Visible reply text' },
|
|
174
|
+
timeoutMs: { type: 'integer', description: 'Optional bounded positive poll timeout in milliseconds' },
|
|
175
|
+
},
|
|
176
|
+
output: outputPresentation('Lavish reply'),
|
|
177
|
+
async execute(args, exec) {
|
|
178
|
+
return runActive(exec, async (record) => {
|
|
179
|
+
if (!record.session)
|
|
180
|
+
return failure('lavish-session-missing', 'call gotry_lavish_open first');
|
|
181
|
+
const result = await record.session.reply(args.path, args.reply, args.timeoutMs === undefined ? {} : { timeoutMs: args.timeoutMs });
|
|
182
|
+
return finishCommand(record, result);
|
|
183
|
+
});
|
|
184
|
+
},
|
|
185
|
+
presentCall: args => callPresentation('Lavish reply', args),
|
|
186
|
+
presentResult: resultPresentation('Lavish reply'),
|
|
187
|
+
}));
|
|
188
|
+
options.register(defineTool({
|
|
189
|
+
name: 'gotry_lavish_end',
|
|
190
|
+
description: 'End the current Lavish review session while retaining the owned server handle for explicit stop or host disposal cleanup.',
|
|
191
|
+
parameters: { path: { type: 'string', required: true, description: 'Previously opened HTML/HTM artifact path' } },
|
|
192
|
+
output: outputPresentation('Lavish end'),
|
|
193
|
+
async execute(args, exec) {
|
|
194
|
+
return runActive(exec, async (record) => {
|
|
195
|
+
if (!record.session)
|
|
196
|
+
return failure('lavish-session-missing', 'call gotry_lavish_open first');
|
|
197
|
+
const result = await record.session.end(args.path);
|
|
198
|
+
return finishEnd(record, result);
|
|
199
|
+
});
|
|
200
|
+
},
|
|
201
|
+
presentCall: args => callPresentation('Lavish end', args),
|
|
202
|
+
presentResult: resultPresentation('Lavish end'),
|
|
203
|
+
}));
|
|
204
|
+
options.register(defineTool({
|
|
205
|
+
name: 'gotry_lavish_stop',
|
|
206
|
+
description: 'Terminally stop and reap only the Lavish server owned by this exact host session. Cleanup failure remains visible on later stop calls.',
|
|
207
|
+
parameters: {},
|
|
208
|
+
output: outputPresentation('Lavish stop'),
|
|
209
|
+
async execute(_args, exec) {
|
|
210
|
+
const authority = readAuthority(exec);
|
|
211
|
+
if (!authority.ok)
|
|
212
|
+
return failure('lavish-authority-rejected', authority.detail);
|
|
213
|
+
let record = records.get(authority.id);
|
|
214
|
+
if (record) {
|
|
215
|
+
if (record.rawCwd !== authority.cwd)
|
|
216
|
+
return failure('lavish-cwd-drift', `host session ${authority.id} is bound to a different raw cwd`);
|
|
217
|
+
// Terminal before any await: an in-flight create/open cannot publish success afterwards.
|
|
218
|
+
record.terminal = record.terminal ?? 'stopped';
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
if (disposedIds.has(authority.id)) {
|
|
222
|
+
return present({ ok: true, kind: 'stop', status: 'not-running', ownedServerExited: true });
|
|
223
|
+
}
|
|
224
|
+
const bound = await bind(exec);
|
|
225
|
+
if (!isRecord(bound))
|
|
226
|
+
return bound;
|
|
227
|
+
record = bound;
|
|
228
|
+
record.terminal = 'stopped';
|
|
229
|
+
}
|
|
230
|
+
return enqueue(record, async () => present(await cleanup(record)));
|
|
231
|
+
},
|
|
232
|
+
presentCall: args => callPresentation('Lavish stop', args),
|
|
233
|
+
presentResult: resultPresentation('Lavish stop'),
|
|
234
|
+
}));
|
|
235
|
+
const ctxOn = options.ctx.on;
|
|
236
|
+
if (typeof ctxOn === 'function') {
|
|
237
|
+
;
|
|
238
|
+
ctxOn.call(options.ctx, 'session/disposed', async (subject) => {
|
|
239
|
+
const id = disposedSubjectId(subject);
|
|
240
|
+
if (!id)
|
|
241
|
+
return;
|
|
242
|
+
disposedIds.add(id);
|
|
243
|
+
const record = records.get(id);
|
|
244
|
+
if (!record)
|
|
245
|
+
return;
|
|
246
|
+
// Terminal before any await: queued and in-flight commands re-check this state.
|
|
247
|
+
record.terminal = 'disposed';
|
|
248
|
+
await enqueue(record, async () => { await cleanup(record); });
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
const ctxEffect = options.ctx.effect;
|
|
252
|
+
if (typeof ctxEffect === 'function') {
|
|
253
|
+
;
|
|
254
|
+
ctxEffect.call(options.ctx, () => async () => {
|
|
255
|
+
// Synchronous registrar closure before any await: a bind() call that
|
|
256
|
+
// is currently awaiting realpath (or about to start one) must observe
|
|
257
|
+
// the closed flag and refuse to create a new record, regardless of
|
|
258
|
+
// whether the bind target id is fresh or already known. This is the
|
|
259
|
+
// only point where closed becomes true.
|
|
260
|
+
closed = true;
|
|
261
|
+
const active = [...records.values()];
|
|
262
|
+
// Freeze every record before awaiting any queue, so unload cannot race a late command.
|
|
263
|
+
for (const record of active) {
|
|
264
|
+
disposedIds.add(record.id);
|
|
265
|
+
record.terminal = 'disposed';
|
|
266
|
+
}
|
|
267
|
+
const results = await Promise.all(active.map(record => enqueue(record, () => cleanup(record))));
|
|
268
|
+
const unreaped = results.filter(result => !result.ok || result.ownedServerExited !== true);
|
|
269
|
+
if (unreaped.length > 0) {
|
|
270
|
+
throw new Error(`Lavish plugin cleanup failed: ${unreaped.map(item => item.ok ? item.status : item.code).join(', ')}`);
|
|
271
|
+
}
|
|
272
|
+
}, 'gotry-lavish-lifecycle');
|
|
273
|
+
}
|
|
274
|
+
return { registered: true };
|
|
275
|
+
}
|
|
276
|
+
function enqueue(record, operation) {
|
|
277
|
+
const result = record.tail.then(operation);
|
|
278
|
+
record.tail = result.then(() => undefined, () => undefined);
|
|
279
|
+
return result;
|
|
280
|
+
}
|
|
281
|
+
async function cleanup(record) {
|
|
282
|
+
if (record.stopResult)
|
|
283
|
+
return record.stopResult;
|
|
284
|
+
if (record.cleanup)
|
|
285
|
+
return record.cleanup;
|
|
286
|
+
if (!record.session) {
|
|
287
|
+
const result = { ok: true, kind: 'stop', status: 'not-running', ownedServerExited: true };
|
|
288
|
+
record.stopResult = result;
|
|
289
|
+
return result;
|
|
290
|
+
}
|
|
291
|
+
const session = record.session;
|
|
292
|
+
record.cleanup = (async () => {
|
|
293
|
+
try {
|
|
294
|
+
const result = await session.stop();
|
|
295
|
+
record.stopResult = result;
|
|
296
|
+
return result;
|
|
297
|
+
}
|
|
298
|
+
catch (error) {
|
|
299
|
+
const result = {
|
|
300
|
+
ok: false,
|
|
301
|
+
kind: 'error',
|
|
302
|
+
code: 'command-failed',
|
|
303
|
+
detail: error instanceof Error ? error.message : 'Lavish cleanup failed',
|
|
304
|
+
};
|
|
305
|
+
record.stopResult = result;
|
|
306
|
+
return result;
|
|
307
|
+
}
|
|
308
|
+
})();
|
|
309
|
+
return record.cleanup;
|
|
310
|
+
}
|
|
311
|
+
function latchAdapterTerminal(record, result) {
|
|
312
|
+
// Host-authority terminals (stopped/disposed) and explicit 'ended' are
|
|
313
|
+
// precedence-preserving; adapter signals (user-ended / poll-outcome-unknown)
|
|
314
|
+
// must not overwrite them.
|
|
315
|
+
if (record.terminal === 'disposed' || record.terminal === 'stopped' || record.terminal === 'ended')
|
|
316
|
+
return;
|
|
317
|
+
const state = record.session?.state();
|
|
318
|
+
const view = result;
|
|
319
|
+
if (state?.pollOutcomeUnknown)
|
|
320
|
+
record.terminal = 'poll-outcome-unknown';
|
|
321
|
+
else if (state?.userEnded)
|
|
322
|
+
record.terminal = 'user-ended';
|
|
323
|
+
if (result && typeof result === 'object') {
|
|
324
|
+
if (view.code === 'poll-outcome-unknown')
|
|
325
|
+
record.terminal = 'poll-outcome-unknown';
|
|
326
|
+
if (view.code === 'session-user-ended')
|
|
327
|
+
record.terminal = 'user-ended';
|
|
328
|
+
if (view.sessionEnded === true && view.endedBy === 'user')
|
|
329
|
+
record.terminal = 'user-ended';
|
|
330
|
+
if (view.status === 'ended' && view.endedBy === 'user')
|
|
331
|
+
record.terminal = 'user-ended';
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
function readAuthority(exec) {
|
|
335
|
+
const candidate = exec;
|
|
336
|
+
const id = candidate?.agent?.session?.id;
|
|
337
|
+
if (typeof id !== 'string' || id.trim().length === 0) {
|
|
338
|
+
return { ok: false, detail: 'exec.agent.session.id is required; agent.id fallback is forbidden' };
|
|
339
|
+
}
|
|
340
|
+
const cwd = candidate?.agent?.session?.header?.cwd;
|
|
341
|
+
if (typeof cwd !== 'string' || cwd.trim().length === 0 || !isAbsolute(cwd)) {
|
|
342
|
+
return { ok: false, detail: 'exec.agent.session.header.cwd must be a nonblank absolute path' };
|
|
343
|
+
}
|
|
344
|
+
return { ok: true, id, cwd };
|
|
345
|
+
}
|
|
346
|
+
function disposedSubjectId(subject) {
|
|
347
|
+
if (!subject || typeof subject !== 'object')
|
|
348
|
+
return null;
|
|
349
|
+
const id = subject.id;
|
|
350
|
+
return typeof id === 'string' && id.trim().length > 0 ? id : null;
|
|
351
|
+
}
|
|
352
|
+
function isRecord(value) {
|
|
353
|
+
return 'rawCwd' in value && 'canonicalCwd' in value && 'tail' in value;
|
|
354
|
+
}
|
|
355
|
+
function isSession(value) {
|
|
356
|
+
return value instanceof LavishLocalSession;
|
|
357
|
+
}
|
|
358
|
+
function terminalFailure(record) {
|
|
359
|
+
return failure('lavish-session-terminal', `host session ${record.id} is terminal: ${record.terminal ?? 'unknown'}`);
|
|
360
|
+
}
|
|
361
|
+
function failure(code, detail) {
|
|
362
|
+
return { ok: false, code, error: detail, summary: `${code}: ${detail}`.slice(0, 800) };
|
|
363
|
+
}
|
|
364
|
+
function present(result) {
|
|
365
|
+
const view = result;
|
|
366
|
+
if (!view.ok) {
|
|
367
|
+
const detail = String(view.detail ?? view.error ?? 'Lavish operation failed');
|
|
368
|
+
return { ...view, error: detail, summary: `${String(view.code ?? 'lavish-error')}: ${detail}`.slice(0, 800) };
|
|
369
|
+
}
|
|
370
|
+
const summary = view.kind === 'open'
|
|
371
|
+
? `Lavish opened ${String(view.file ?? '')} at ${String(view.url ?? '')}`
|
|
372
|
+
: `Lavish ${String(view.kind ?? 'operation')}: ${String(view.status ?? 'ok')}`;
|
|
373
|
+
return { ...view, summary };
|
|
374
|
+
}
|
|
375
|
+
function outputPresentation(title) {
|
|
376
|
+
return {
|
|
377
|
+
schema: { type: 'json' },
|
|
378
|
+
// The model needs the usable loopback URL and actual bounded feedback fields.
|
|
379
|
+
// Adapter feedback remains explicitly tagged `trust: "untrusted"` in this JSON.
|
|
380
|
+
render: (_args, value) => [{ type: 'text', text: renderValue(value, title) }],
|
|
381
|
+
};
|
|
382
|
+
}
|
|
383
|
+
function callPresentation(title, args) {
|
|
384
|
+
return { card: 'generic', title, kind: 'execute', rawInput: args };
|
|
385
|
+
}
|
|
386
|
+
function resultPresentation(title) {
|
|
387
|
+
return (_args, value) => ({
|
|
388
|
+
card: 'generic',
|
|
389
|
+
title,
|
|
390
|
+
content: [{ type: 'text', text: renderValue(value, title) }],
|
|
391
|
+
});
|
|
392
|
+
}
|
|
393
|
+
function renderValue(value, fallback) {
|
|
394
|
+
try {
|
|
395
|
+
return JSON.stringify(value).slice(0, 128 * 1024);
|
|
396
|
+
}
|
|
397
|
+
catch {
|
|
398
|
+
return String(value?.summary ?? fallback);
|
|
399
|
+
}
|
|
400
|
+
}
|