@danceiny/gotry 0.0.1-rc.9 → 0.2.0-rc.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (507) hide show
  1. package/README.md +172 -219
  2. package/README.zh-CN.md +222 -0
  3. package/bin/gotry-backend.js +53 -0
  4. package/bin/gotry-booking-copilot.js +53 -0
  5. package/bin/gotry-bootstrap.js +1744 -0
  6. package/bin/gotry-inner.js +733 -83
  7. package/bin/gotry-process-liveness.d.ts +27 -0
  8. package/bin/gotry-process-liveness.js +97 -0
  9. package/bin/gotry-runtime-resolution.d.ts +27 -0
  10. package/bin/gotry-runtime-resolution.js +49 -0
  11. package/bin/gotry.js +1 -1
  12. package/client/client.js +203 -0
  13. package/cordis.gotry-patch.yml +80 -56
  14. package/data/airline-airports.json +39 -0
  15. package/data/stations-12306-verify.json +524 -0
  16. package/dist/capabilities/agent-reach-deep.js +45 -122
  17. package/dist/capabilities/agent-reach.js +101 -146
  18. package/dist/capabilities/anything.js +135 -94
  19. package/dist/capabilities/artifacts.js +370 -0
  20. package/dist/capabilities/channel-health.js +131 -0
  21. package/dist/capabilities/channel-registry.js +256 -0
  22. package/dist/capabilities/doctor.js +546 -0
  23. package/dist/capabilities/effect.js +394 -0
  24. package/dist/capabilities/external-event.js +149 -0
  25. package/dist/capabilities/fact-log.js +55 -0
  26. package/dist/capabilities/flyai-config.js +337 -0
  27. package/dist/capabilities/flyai.js +947 -110
  28. package/dist/capabilities/fx-contract.js +293 -0
  29. package/dist/capabilities/geo-atlas.js +246 -0
  30. package/dist/capabilities/ground-transfer.js +509 -0
  31. package/dist/capabilities/hbcli.js +260 -123
  32. package/dist/capabilities/hotelbyte-transaction.js +194 -0
  33. package/dist/capabilities/incident-log.js +131 -61
  34. package/dist/capabilities/itinerary-artifact.js +190 -0
  35. package/dist/capabilities/itinerary-deck-artifact.js +194 -0
  36. package/dist/capabilities/itinerary-deck-export.js +339 -0
  37. package/dist/capabilities/lavish-local.js +924 -0
  38. package/dist/capabilities/model-override.js +38 -0
  39. package/dist/capabilities/opensky.js +54 -43
  40. package/dist/capabilities/resilience.js +191 -0
  41. package/dist/capabilities/session/action-cache.js +50 -44
  42. package/dist/capabilities/session/adapters/ctrip-flight.js +120 -62
  43. package/dist/capabilities/session/adapters/ctrip-hotel.js +222 -0
  44. package/dist/capabilities/session/adapters/dida-portal.js +274 -0
  45. package/dist/capabilities/session/adapters/meituan-local.js +35 -54
  46. package/dist/capabilities/session/adapters/rail-12306.js +342 -0
  47. package/dist/capabilities/session/benchmark.js +189 -0
  48. package/dist/capabilities/session/bridge-ledger.js +224 -0
  49. package/dist/capabilities/session/extension-bridge.js +636 -0
  50. package/dist/capabilities/session/extension-channel.js +109 -0
  51. package/dist/capabilities/session/extension-distribution.js +230 -0
  52. package/dist/capabilities/session/extract.js +31 -21
  53. package/dist/capabilities/session/golden-score.js +114 -0
  54. package/dist/capabilities/session/health-watch.js +215 -0
  55. package/dist/capabilities/session/read-guard.js +75 -24
  56. package/dist/capabilities/session/static-flight-golden.js +150 -0
  57. package/dist/capabilities/session/transport.js +97 -83
  58. package/dist/capabilities/session/wizard.js +117 -0
  59. package/dist/capabilities/session-consent.js +178 -0
  60. package/dist/capabilities/session-login.js +170 -0
  61. package/dist/capabilities/session-search.js +635 -44
  62. package/dist/capabilities/spawn-bounded.js +203 -0
  63. package/dist/capabilities/sponsor-plugin.js +341 -0
  64. package/dist/capabilities/visa-policy.js +140 -0
  65. package/dist/capabilities/weather.js +243 -138
  66. package/dist/data/session-golden-20.json +25 -0
  67. package/dist/data/sf-golden-manifest.json +103 -0
  68. package/dist/data/sf-static-routes.json +91 -0
  69. package/dist/scripts/action-cache-tests.js +24 -59
  70. package/dist/scripts/agent-planning-turn-deadline-e2e.js +242 -0
  71. package/dist/scripts/agent-planning-turn-deadline-tests.js +185 -0
  72. package/dist/scripts/agent-reach-deep-tests.js +30 -40
  73. package/dist/scripts/agent-reach-error-tests.js +354 -0
  74. package/dist/scripts/agent-reach-tests.js +26 -18
  75. package/dist/scripts/agent-reach-wrapper-tests.js +50 -50
  76. package/dist/scripts/anything-tests.js +116 -60
  77. package/dist/scripts/artifact-client-contract-tests.js +220 -0
  78. package/dist/scripts/artifacts-capability-tests.js +727 -0
  79. package/dist/scripts/async-collect.js +50 -11
  80. package/dist/scripts/benchmark-environment-bridge-e2e.js +741 -0
  81. package/dist/scripts/benchmark-environment-bridge-tests.js +1452 -0
  82. package/dist/scripts/booking-copilot-availability-ledger-binding-tests.js +126 -0
  83. package/dist/scripts/booking-copilot-availability-policy-tests.js +265 -0
  84. package/dist/scripts/booking-copilot-bin-proof-tests.js +66 -0
  85. package/dist/scripts/booking-copilot-cleanup-proof-helper.js +76 -0
  86. package/dist/scripts/booking-copilot-crossrepo-fixture-server.js +144 -0
  87. package/dist/scripts/booking-copilot-dsh-core-proof-tests.js +424 -0
  88. package/dist/scripts/booking-copilot-dsh-planner-proof-tests.js +2839 -0
  89. package/dist/scripts/booking-copilot-dsh-plugin-proof-tests.js +309 -0
  90. package/dist/scripts/booking-copilot-dsh-readiness-proof.js +238 -0
  91. package/dist/scripts/booking-copilot-dsh-warmer-proof.js +123 -0
  92. package/dist/scripts/booking-copilot-event-sequence-concurrency-proof-tests.js +156 -0
  93. package/dist/scripts/booking-copilot-gap-code-contract-proof-tests.js +70 -0
  94. package/dist/scripts/booking-copilot-intent-proof-tests.js +422 -0
  95. package/dist/scripts/booking-copilot-operation-ledger-concurrency-proof-tests.js +184 -0
  96. package/dist/scripts/booking-copilot-planner-live-probe.js +95 -0
  97. package/dist/scripts/booking-copilot-proof-runtime.js +42 -0
  98. package/dist/scripts/booking-copilot-receipt-ledger-concurrency-proof-tests.js +210 -0
  99. package/dist/scripts/booking-copilot-runtime-proof-tests.js +2349 -0
  100. package/dist/scripts/booking-copilot-server-proof-tests.js +784 -0
  101. package/dist/scripts/booking-copilot-startup-proof-tests.js +94 -0
  102. package/dist/scripts/booking-executor-tests.js +80 -0
  103. package/dist/scripts/booking-recovery-chain-tests.js +182 -0
  104. package/dist/scripts/booking-saga-tests.js +125 -0
  105. package/dist/scripts/booking-surface-contract-proof-tests.js +212 -0
  106. package/dist/scripts/bootstrap-tests.js +1479 -0
  107. package/dist/scripts/bridge-events-tests.js +239 -0
  108. package/dist/scripts/bridge-ledger-tests.js +428 -0
  109. package/dist/scripts/build-changelog.js +238 -0
  110. package/dist/scripts/build-metrics-report.js +331 -0
  111. package/dist/scripts/changelog-tests.js +118 -0
  112. package/dist/scripts/channel-probe-tests.js +103 -0
  113. package/dist/scripts/channel-probe.js +169 -0
  114. package/dist/scripts/channel-registry-tests.js +208 -0
  115. package/dist/scripts/companion-tests.js +25 -70
  116. package/dist/scripts/dida-cookie-probe.js +87 -0
  117. package/dist/scripts/dida-runner-stop-tests.js +311 -0
  118. package/dist/scripts/dida-sw-probe.js +114 -0
  119. package/dist/scripts/diff-test.js +17 -12
  120. package/dist/scripts/doctor-tests.js +564 -0
  121. package/dist/scripts/dsh-artifact-e2e.js +279 -0
  122. package/dist/scripts/dsh-artifact-web-e2e.js +675 -0
  123. package/dist/scripts/dsh-http-proxy-sse-proof.js +90 -0
  124. package/dist/scripts/dsh-runtime-closure-tests.js +182 -0
  125. package/dist/scripts/dsh-runtime-closure.js +162 -0
  126. package/dist/scripts/dsh-session-v3-migration-proof.js +109 -0
  127. package/dist/scripts/dsh-subprocess-local-proof.js +150 -0
  128. package/dist/scripts/dsh-target-closure-proof.js +178 -0
  129. package/dist/scripts/effect-tests.js +539 -0
  130. package/dist/scripts/engine-run.js +1 -3
  131. package/dist/scripts/engine-tests.js +16 -10
  132. package/dist/scripts/evaluation-cadence-tests.js +174 -0
  133. package/dist/scripts/evaluation-contract-tests.js +268 -0
  134. package/dist/scripts/extension-distribution-cli.js +39 -0
  135. package/dist/scripts/extension-distribution-tests.js +443 -0
  136. package/dist/scripts/extension-tests.js +988 -0
  137. package/dist/scripts/external-event-tests.js +350 -0
  138. package/dist/scripts/fact-gate-tests.js +869 -0
  139. package/dist/scripts/fixtures/extension-bridge-unref-child.mjs +21 -0
  140. package/dist/scripts/flight-hotel-anchor-363-registered-e2e.js +169 -0
  141. package/dist/scripts/flight-malformed-tests.js +159 -0
  142. package/dist/scripts/flyai-setup-tests.js +228 -0
  143. package/dist/scripts/flyai-setup-tool-tests.js +54 -0
  144. package/dist/scripts/flyai-tests.js +692 -0
  145. package/dist/scripts/flyai-tool-registration-contract-tests.js +91 -0
  146. package/dist/scripts/fx-contract-tests.js +201 -0
  147. package/dist/scripts/g5-guard-tests.js +131 -0
  148. package/dist/scripts/g5-guard.js +189 -0
  149. package/dist/scripts/gen-lunar-anchors.js +106 -0
  150. package/dist/scripts/geo-atlas-tests.js +283 -0
  151. package/dist/scripts/gotry-backend-kernel-tests.js +206 -0
  152. package/dist/scripts/gotry-try-demo-tests.js +79 -0
  153. package/dist/scripts/gotry-try-demo.js +49 -0
  154. package/dist/scripts/ground-transfer-tests.js +956 -0
  155. package/dist/scripts/hbcli-e2e-tests.js +159 -0
  156. package/dist/scripts/hbcli-live-optin-tests.js +96 -0
  157. package/dist/scripts/hbcli-release-contract-tests.js +122 -0
  158. package/dist/scripts/hbcli-tests.js +121 -69
  159. package/dist/scripts/health-watch-cli.js +73 -0
  160. package/dist/scripts/hotel-date-gate-tests.js +496 -0
  161. package/dist/scripts/hotelbyte-reconcile-tests.js +141 -0
  162. package/dist/scripts/hotelbyte-spawn-e2e-tests.js +373 -0
  163. package/dist/scripts/i18n-tests.js +41 -0
  164. package/dist/scripts/incident-tests.js +281 -87
  165. package/dist/scripts/issue-194-job-id-guard-tests.js +106 -0
  166. package/dist/scripts/issue-233-cancel-refund-commission-tests.js +392 -0
  167. package/dist/scripts/issue-271-liveness-tests.js +569 -0
  168. package/dist/scripts/issue-289-model-retry-real-tests.js +296 -0
  169. package/dist/scripts/issue-289-model-retry-tests.js +441 -0
  170. package/dist/scripts/issue-289-web-retry-e2e.js +630 -0
  171. package/dist/scripts/issue-338-home-city-e2e.js +577 -0
  172. package/dist/scripts/issue343-real-entry-e2e.js +160 -0
  173. package/dist/scripts/issue436-persisted-routing-e2e.js +247 -0
  174. package/dist/scripts/itinerary-artifact-tests.js +368 -0
  175. package/dist/scripts/itinerary-deck-artifact-tests.js +416 -0
  176. package/dist/scripts/itinerary-deck-export-tests.js +552 -0
  177. package/dist/scripts/itinerary-deck-tests.js +435 -0
  178. package/dist/scripts/itinerary-html-tests.js +426 -0
  179. package/dist/scripts/journey-tests.js +22 -27
  180. package/dist/scripts/kernel-manifest-evidence.js +109 -0
  181. package/dist/scripts/kernel-manifest-gate.js +126 -0
  182. package/dist/scripts/kernel-manifest-tests.js +212 -0
  183. package/dist/scripts/kernel-manifest-trace-entry.js +7 -0
  184. package/dist/scripts/kernel-manifest-trace-hook.mjs +28 -0
  185. package/dist/scripts/kernel-manifest.js +369 -0
  186. package/dist/scripts/lavish-local-tests.js +1226 -0
  187. package/dist/scripts/lavish-product-tools-tests.js +537 -0
  188. package/dist/scripts/ledger-repair-apply-tests.js +316 -0
  189. package/dist/scripts/ledger-repair-plan-tests.js +375 -0
  190. package/dist/scripts/ledger-tests.js +382 -246
  191. package/dist/scripts/ledger-workflow-crash.js +10 -20
  192. package/dist/scripts/managed-dsh-cleanup-diagnostic-proof.js +184 -0
  193. package/dist/scripts/managed-dsh-close-failure-proof.js +172 -0
  194. package/dist/scripts/managed-dsh-run-port-proof.js +153 -0
  195. package/dist/scripts/managed-dsh-terminal-proof.js +252 -0
  196. package/dist/scripts/map-tools-vendor-package-proof.js +365 -0
  197. package/dist/scripts/memory-capture-tests.js +242 -61
  198. package/dist/scripts/memory-decay-tests.js +18 -52
  199. package/dist/scripts/memory-lifecycle-tests.js +657 -0
  200. package/dist/scripts/memory-lifecycle.js +196 -0
  201. package/dist/scripts/memory-metrics.js +24 -12
  202. package/dist/scripts/memory-value-report.js +631 -0
  203. package/dist/scripts/memory-value-tests.js +328 -0
  204. package/dist/scripts/metrics-report-tests.js +151 -0
  205. package/dist/scripts/model-override-e2e.js +137 -0
  206. package/dist/scripts/nightly-evidence-tests.js +161 -0
  207. package/dist/scripts/nightly-evidence.js +286 -0
  208. package/dist/scripts/nudge-digest.js +39 -28
  209. package/dist/scripts/observability-tests.js +381 -0
  210. package/dist/scripts/onboarding-tests.js +161 -0
  211. package/dist/scripts/opensky-check.js +18 -13
  212. package/dist/scripts/opensky-tests.js +28 -28
  213. package/dist/scripts/persona-surface-guard-tests.js +49 -0
  214. package/dist/scripts/pnpm-dsh-closure-proof.js +17 -0
  215. package/dist/scripts/policy-anchor-359-registered-e2e.js +214 -0
  216. package/dist/scripts/price-drift-tests.js +340 -0
  217. package/dist/scripts/price-drift-watch.js +447 -0
  218. package/dist/scripts/probe-poi-tests.js +53 -45
  219. package/dist/scripts/product-metrics.js +483 -0
  220. package/dist/scripts/publish-preverify.js +110 -0
  221. package/dist/scripts/realtime-pricing-tests.js +76 -0
  222. package/dist/scripts/recall-tests.js +513 -0
  223. package/dist/scripts/replay-async.js +20 -18
  224. package/dist/scripts/replay-real.js +18 -18
  225. package/dist/scripts/replay.js +52 -82
  226. package/dist/scripts/session-attach-diagnose.js +20 -20
  227. package/dist/scripts/session-attach-poc.js +34 -37
  228. package/dist/scripts/session-benchmark.js +180 -0
  229. package/dist/scripts/session-dida-live-e2e.js +199 -0
  230. package/dist/scripts/session-extract-tests.js +14 -35
  231. package/dist/scripts/session-link-tests.js +478 -0
  232. package/dist/scripts/session-login.js +27 -46
  233. package/dist/scripts/session-tests.js +796 -96
  234. package/dist/scripts/session-zones-tests.js +358 -0
  235. package/dist/scripts/sf-live-benchmark.js +367 -0
  236. package/dist/scripts/sf-live-challenge-stop-tests.js +453 -0
  237. package/dist/scripts/sf-live-cli-tests.js +92 -0
  238. package/dist/scripts/sf-live-options.js +46 -0
  239. package/dist/scripts/sf-manifest-tests.js +30 -0
  240. package/dist/scripts/sf-manifest.js +33 -0
  241. package/dist/scripts/sf-soft-score-tests.js +67 -0
  242. package/dist/scripts/sf-summary-tests.js +324 -0
  243. package/dist/scripts/sf-summary.js +525 -0
  244. package/dist/scripts/share-tests.js +432 -0
  245. package/dist/scripts/skeleton-check.js +16 -14
  246. package/dist/scripts/skeleton-integration-test.js +28 -11
  247. package/dist/scripts/skills-contract-tests.js +51 -46
  248. package/dist/scripts/smoke-session-gate-tests.js +21 -0
  249. package/dist/scripts/smoke.js +690 -246
  250. package/dist/scripts/spawn-bounded-abort-tests.js +241 -0
  251. package/dist/scripts/sponsor-reuse-tests.js +262 -0
  252. package/dist/scripts/state-cli-tests.js +226 -101
  253. package/dist/scripts/state-cli.js +550 -199
  254. package/dist/scripts/state-repair-cli.js +66 -0
  255. package/dist/scripts/state-repair-tests.js +140 -0
  256. package/dist/scripts/static-golden-tests.js +165 -0
  257. package/dist/scripts/time-eval-tests.js +210 -192
  258. package/dist/scripts/travel-timeline-tests.js +29 -93
  259. package/dist/scripts/turn-handoff-collect-tests.js +169 -0
  260. package/dist/scripts/turn-handoff-collect.js +161 -0
  261. package/dist/scripts/turn-policy-tests.js +55 -0
  262. package/dist/scripts/typed-contract-canary.js +176 -0
  263. package/dist/scripts/tz-resolver-sanity.js +50 -0
  264. package/dist/scripts/tz-resolver-tests.js +584 -0
  265. package/dist/scripts/unified-tests.js +23 -19
  266. package/dist/scripts/visa-policy-tests.js +62 -0
  267. package/dist/scripts/weather-tests.js +276 -41
  268. package/dist/scripts/wish-channel-gate-tests.js +54 -0
  269. package/dist/scripts/write-gate-tests.js +522 -0
  270. package/dist/scripts/z3-lifecycle-fault-tests.js +188 -0
  271. package/dist/scripts/z3-lifecycle-tests.js +170 -0
  272. package/dist/scripts/z3-race-repeat-tests.js +39 -0
  273. package/dist/scripts/z3-race-tests.js +41 -0
  274. package/dist/src/artifact-gate.js +829 -0
  275. package/dist/src/backend/kernel.js +91 -0
  276. package/dist/src/backend/modules/booking-copilot.js +92 -0
  277. package/dist/src/backend/modules/booking-executor.js +124 -0
  278. package/dist/src/backend/modules/session-search.js +551 -0
  279. package/dist/src/benchmark-agent-conformance.js +578 -0
  280. package/dist/src/benchmark-environment-bridge.js +515 -0
  281. package/dist/src/benchmark-headless-child-diagnostics.js +166 -0
  282. package/dist/src/benchmark-tool-isolation.js +151 -0
  283. package/dist/src/bookable-facts.js +533 -0
  284. package/dist/src/booking-saga.js +97 -0
  285. package/dist/src/booking-surface/availability-policy.js +697 -0
  286. package/dist/src/booking-surface/booking-intent.js +43 -0
  287. package/dist/src/booking-surface/cancel-refund-commission.js +379 -0
  288. package/dist/src/booking-surface/canonical-schema.js +116 -0
  289. package/dist/src/booking-surface/contracts.js +75 -0
  290. package/dist/src/booking-surface/dsh-planner.js +1854 -0
  291. package/dist/src/booking-surface/dsh-plugin.js +378 -0
  292. package/dist/src/booking-surface/dsh-worker.js +98 -0
  293. package/dist/src/booking-surface/error-codes.js +231 -0
  294. package/dist/src/booking-surface/index.js +9 -0
  295. package/dist/src/booking-surface/managed-dsh-cleanup-diagnostic.js +97 -0
  296. package/dist/src/booking-surface/managed-dsh-run-port.js +244 -0
  297. package/dist/src/booking-surface/profile.js +24 -0
  298. package/dist/src/booking-surface/recovery-chain.js +367 -0
  299. package/dist/src/booking-surface/runtime.js +1968 -0
  300. package/dist/src/booking-surface/server.js +674 -0
  301. package/dist/src/booking-surface/startup.js +168 -0
  302. package/dist/src/booking-surface/validation.js +261 -0
  303. package/dist/src/bridge.js +20 -13
  304. package/dist/src/companions.js +48 -74
  305. package/dist/src/contracts.js +21 -43
  306. package/dist/src/dsh-llm.js +97 -111
  307. package/dist/src/engine.js +276 -193
  308. package/dist/src/evaluation-cadence.js +97 -0
  309. package/dist/src/evaluation-contracts.js +283 -0
  310. package/dist/src/flight-pack-adapter.js +54 -0
  311. package/dist/src/flight-pack-contract.js +2 -0
  312. package/dist/src/flyai-setup-tool.js +70 -0
  313. package/dist/src/gotry-backend.js +125 -0
  314. package/dist/src/hotel-date-gate.js +118 -0
  315. package/dist/src/i18n.js +88 -0
  316. package/dist/src/index.js +2227 -882
  317. package/dist/src/itinerary-deck.js +139 -0
  318. package/dist/src/itinerary-doc-shared.js +661 -0
  319. package/dist/src/itinerary-html.js +131 -0
  320. package/dist/src/journey.js +155 -108
  321. package/dist/src/lavish-tools.js +400 -0
  322. package/dist/src/ledger-repair-apply.js +538 -0
  323. package/dist/src/ledger-repair-plan.js +463 -0
  324. package/dist/src/loop.js +319 -160
  325. package/dist/src/memory-capture.js +180 -32
  326. package/dist/src/memory-decay.js +30 -14
  327. package/dist/src/memory-lifecycle.js +1310 -0
  328. package/dist/src/memory-utility.js +27 -40
  329. package/dist/src/mock-llm.js +36 -61
  330. package/dist/src/model.js +81 -36
  331. package/dist/src/realtime-pricing.js +103 -0
  332. package/dist/src/recall/card.js +74 -0
  333. package/dist/src/recall/evaluator.js +140 -0
  334. package/dist/src/recall/integration.js +17 -0
  335. package/dist/src/recall/tick.js +166 -0
  336. package/dist/src/session-link/plan-it-action.js +48 -0
  337. package/dist/src/session-link/session-link.js +248 -0
  338. package/dist/src/session-zones.js +507 -0
  339. package/dist/src/share/adapters.js +51 -0
  340. package/dist/src/share/share-consent.js +76 -0
  341. package/dist/src/share/share-deck.js +58 -0
  342. package/dist/src/share/share-token.js +146 -0
  343. package/dist/src/slot-spec.js +84 -106
  344. package/dist/src/state-ledger.js +435 -516
  345. package/dist/src/state-repair.js +299 -0
  346. package/dist/src/subagent-job-id-guard.js +58 -0
  347. package/dist/src/time-anchor.js +231 -33
  348. package/dist/src/tool-packet.js +20 -8
  349. package/dist/src/travel-slots.js +58 -35
  350. package/dist/src/travel-timeline.js +44 -63
  351. package/dist/src/turn-deadline.js +287 -0
  352. package/dist/src/turn-policy.js +118 -0
  353. package/dist/src/tz-resolver.js +143 -0
  354. package/dist/src/unified.js +535 -359
  355. package/dist/src/wish-pool.js +42 -12
  356. package/dist/src/write-gate.js +495 -0
  357. package/dist/src/z3-shared.js +284 -0
  358. package/extension/README.md +21 -0
  359. package/extension/README.zh-CN.md +21 -0
  360. package/extension/background.js +463 -0
  361. package/extension/content-bridge.js +270 -0
  362. package/extension/content-main.js +111 -0
  363. package/extension/manifest.json +60 -0
  364. package/package.json +407 -14
  365. package/schemas/booking.intent.schema.json +193 -0
  366. package/schemas/booking.surface.schema.json +2622 -0
  367. package/ts/capabilities/agent-reach-deep.ts +114 -0
  368. package/ts/capabilities/agent-reach.ts +198 -0
  369. package/ts/capabilities/anything.ts +255 -0
  370. package/ts/capabilities/artifacts.ts +428 -0
  371. package/ts/capabilities/fact-log.ts +54 -0
  372. package/ts/capabilities/flyai-config.ts +388 -0
  373. package/ts/capabilities/flyai.ts +1274 -0
  374. package/ts/capabilities/hbcli.ts +253 -71
  375. package/ts/capabilities/incident-log.ts +88 -59
  376. package/ts/capabilities/itinerary-artifact.ts +214 -0
  377. package/ts/capabilities/itinerary-deck-artifact.ts +218 -0
  378. package/ts/capabilities/itinerary-deck-export.ts +378 -0
  379. package/ts/capabilities/opensky.ts +121 -0
  380. package/ts/capabilities/session/action-cache.ts +148 -0
  381. package/ts/capabilities/session/adapters/ctrip-flight.ts +181 -0
  382. package/ts/capabilities/session/adapters/ctrip-hotel.ts +238 -0
  383. package/ts/capabilities/session/adapters/dida-portal.ts +338 -0
  384. package/ts/capabilities/session/adapters/meituan-local.ts +70 -0
  385. package/ts/capabilities/session/adapters/rail-12306.ts +392 -0
  386. package/ts/capabilities/session/benchmark.ts +276 -0
  387. package/ts/capabilities/session/bridge-ledger.ts +333 -0
  388. package/ts/capabilities/session/extension-bridge.ts +794 -0
  389. package/ts/capabilities/session/extension-channel.ts +144 -0
  390. package/ts/capabilities/session/extension-distribution.ts +266 -0
  391. package/ts/capabilities/session/extract.ts +54 -0
  392. package/ts/capabilities/session/golden-score.ts +139 -0
  393. package/ts/capabilities/session/health-watch.ts +264 -0
  394. package/ts/capabilities/session/read-guard.ts +141 -0
  395. package/ts/capabilities/session/static-flight-golden.ts +209 -0
  396. package/ts/capabilities/session/transport.ts +146 -0
  397. package/ts/capabilities/session/wizard.ts +140 -0
  398. package/ts/capabilities/session-consent.ts +211 -0
  399. package/ts/capabilities/session-login.ts +208 -0
  400. package/ts/capabilities/session-search.ts +893 -0
  401. package/ts/capabilities/weather.ts +330 -0
  402. package/ts/dsh-runtime/vendor/README.md +68 -0
  403. package/ts/dsh-runtime/vendor/dsh-map-tools/LICENSE +21 -0
  404. package/ts/dsh-runtime/vendor/dsh-map-tools/README.en.md +405 -0
  405. package/ts/dsh-runtime/vendor/dsh-map-tools/README.md +404 -0
  406. package/ts/dsh-runtime/vendor/dsh-map-tools/client/client.js +1584 -0
  407. package/ts/dsh-runtime/vendor/dsh-map-tools/cordis.patch.yml +5 -0
  408. package/ts/dsh-runtime/vendor/dsh-map-tools/icon.svg +5 -0
  409. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/clients/amap.js +595 -0
  410. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/clients/nominatim.js +63 -0
  411. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/clients/osrm.js +58 -0
  412. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/clients/photon.js +55 -0
  413. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/config-file.js +87 -0
  414. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/config-route.js +131 -0
  415. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/config.js +16 -0
  416. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/geo.js +232 -0
  417. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/index.js +120 -0
  418. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/settings-ns.js +40 -0
  419. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/staticmap-route.js +115 -0
  420. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/tools/geocode.js +127 -0
  421. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/tools/poi.js +84 -0
  422. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/tools/routes.js +267 -0
  423. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/clients/amap.d.ts +90 -0
  424. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/clients/nominatim.d.ts +17 -0
  425. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/clients/osrm.d.ts +15 -0
  426. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/clients/photon.d.ts +22 -0
  427. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/config-file.d.ts +33 -0
  428. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/config-route.d.ts +23 -0
  429. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/config.d.ts +23 -0
  430. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/geo.d.ts +61 -0
  431. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/index.d.ts +18 -0
  432. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/settings-ns.d.ts +14 -0
  433. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/staticmap-route.d.ts +31 -0
  434. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/tools/geocode.d.ts +11 -0
  435. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/tools/poi.d.ts +9 -0
  436. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/tools/routes.d.ts +75 -0
  437. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/types.d.ts +68 -0
  438. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types.js +16 -0
  439. package/ts/dsh-runtime/vendor/dsh-map-tools/package.json +97 -0
  440. package/ts/package.json +293 -3
  441. package/ts/scripts/async-collect.ts +91 -0
  442. package/ts/scripts/map-tools-vendor-package-proof.ts +404 -0
  443. package/ts/scripts/skeleton-check.ts +1 -1
  444. package/ts/scripts/skeleton-integration-test.ts +23 -1
  445. package/ts/scripts/state-cli.ts +568 -0
  446. package/ts/scripts/turn-handoff-collect.ts +178 -0
  447. package/ts/src/artifact-gate.ts +991 -0
  448. package/ts/src/benchmark-agent-conformance.ts +619 -0
  449. package/ts/src/benchmark-environment-bridge.ts +538 -0
  450. package/ts/src/benchmark-headless-child-diagnostics.ts +184 -0
  451. package/ts/src/benchmark-tool-isolation.ts +166 -0
  452. package/ts/src/bookable-facts.ts +837 -0
  453. package/ts/src/booking-saga.ts +133 -0
  454. package/ts/src/booking-surface/availability-policy.ts +522 -0
  455. package/ts/src/booking-surface/booking-intent.ts +86 -0
  456. package/ts/src/booking-surface/cancel-refund-commission.ts +488 -0
  457. package/ts/src/booking-surface/canonical-schema.js +116 -0
  458. package/ts/src/booking-surface/contracts.ts +475 -0
  459. package/ts/src/booking-surface/dsh-planner.ts +1949 -0
  460. package/ts/src/booking-surface/dsh-plugin.js +378 -0
  461. package/ts/src/booking-surface/dsh-worker.ts +110 -0
  462. package/ts/src/booking-surface/error-codes.ts +241 -0
  463. package/ts/src/booking-surface/index.ts +9 -0
  464. package/ts/src/booking-surface/managed-dsh-cleanup-diagnostic.ts +151 -0
  465. package/ts/src/booking-surface/managed-dsh-run-port.ts +273 -0
  466. package/ts/src/booking-surface/profile.ts +42 -0
  467. package/ts/src/booking-surface/recovery-chain.ts +409 -0
  468. package/ts/src/booking-surface/runtime.ts +1793 -0
  469. package/ts/src/booking-surface/server.ts +733 -0
  470. package/ts/src/booking-surface/startup.ts +201 -0
  471. package/ts/src/booking-surface/validation.ts +217 -0
  472. package/ts/src/companions.ts +113 -0
  473. package/ts/src/contracts.ts +13 -3
  474. package/ts/src/dsh-llm.ts +44 -11
  475. package/ts/src/flyai-setup-tool.ts +77 -0
  476. package/ts/src/index.ts +1948 -198
  477. package/ts/src/itinerary-deck.ts +189 -0
  478. package/ts/src/itinerary-doc-shared.ts +741 -0
  479. package/ts/src/itinerary-html.ts +171 -0
  480. package/ts/src/loop.ts +223 -25
  481. package/ts/src/memory-capture.ts +283 -0
  482. package/ts/src/memory-decay.ts +55 -0
  483. package/ts/src/memory-utility.ts +70 -0
  484. package/ts/src/mock-llm.ts +4 -8
  485. package/ts/src/model.ts +88 -2
  486. package/ts/src/recall/card.ts +106 -0
  487. package/ts/src/recall/evaluator.ts +170 -0
  488. package/ts/src/recall/integration.ts +35 -0
  489. package/ts/src/recall/tick.ts +213 -0
  490. package/ts/src/session-link/plan-it-action.ts +78 -0
  491. package/ts/src/session-link/session-link.ts +275 -0
  492. package/ts/src/share/adapters.ts +93 -0
  493. package/ts/src/share/share-consent.ts +105 -0
  494. package/ts/src/share/share-deck.ts +85 -0
  495. package/ts/src/share/share-token.ts +166 -0
  496. package/ts/src/slot-spec.ts +172 -0
  497. package/ts/src/state-ledger.ts +912 -0
  498. package/ts/src/subagent-job-id-guard.ts +72 -0
  499. package/ts/src/time-anchor.ts +338 -0
  500. package/ts/src/tool-packet.ts +32 -0
  501. package/ts/src/travel-slots.ts +219 -0
  502. package/ts/src/travel-timeline.ts +83 -0
  503. package/ts/src/turn-deadline.ts +366 -0
  504. package/ts/src/turn-policy.ts +154 -0
  505. package/ts/src/unified.ts +354 -88
  506. package/ts/src/wish-pool.ts +79 -0
  507. package/dist/scripts/session-attach-wait.js +0 -41
@@ -0,0 +1,631 @@
1
+ /**
2
+ * M4 memory value evidence scorer (GitHub Issue #20/#223).
3
+ *
4
+ * The scorer is deliberately read-only. It accepts a public fixture or a
5
+ * private observed cohort manifest and emits one deterministic JSON report.
6
+ * Synthetic fixtures can prove the contract and calculations, but can never
7
+ * satisfy M4 Exit. Observed-private inputs only become exit-eligible when a
8
+ * human source-review attestation contract is present; the scorer validates
9
+ * that contract shape but does not inspect private raw material.
10
+ *
11
+ * Usage:
12
+ * npx tsx scripts/memory-value-report.ts data/memory-value-fixture.json
13
+ */
14
+ import { createHash } from 'node:crypto';
15
+ import { readFileSync } from 'node:fs';
16
+ import { resolve } from 'node:path';
17
+ import { pathToFileURL } from 'node:url';
18
+ const M4_ACCEPTANCE = {
19
+ minimumPairCountForExit: 5,
20
+ targetMedianReductionRatio: 0.5,
21
+ };
22
+ const HMAC_REF = /^hmac-sha256:[0-9a-f]{64}$/;
23
+ const SHA256 = /^[0-9a-f]{64}$/;
24
+ const ISO_UTC_TIMESTAMP = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{3})?Z$/;
25
+ function isObject(value) {
26
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
27
+ }
28
+ function nonEmptyString(value) {
29
+ return typeof value === 'string' && value.trim().length > 0;
30
+ }
31
+ function round(value) {
32
+ return Math.round((value + Number.EPSILON) * 1_000_000) / 1_000_000;
33
+ }
34
+ function nearestRankRaw(values, percentile) {
35
+ if (values.length === 0)
36
+ return 0;
37
+ const sorted = [...values].sort((a, b) => a - b);
38
+ const index = Math.max(0, Math.ceil(percentile * sorted.length) - 1);
39
+ return sorted[index];
40
+ }
41
+ function nearestRank(values, percentile) {
42
+ return round(nearestRankRaw(values, percentile));
43
+ }
44
+ function canonical(value) {
45
+ if (Array.isArray(value))
46
+ return `[${value.map(canonical).join(',')}]`;
47
+ if (isObject(value)) {
48
+ return `{${Object.keys(value).sort().map(key => `${JSON.stringify(key)}:${canonical(value[key])}`).join(',')}}`;
49
+ }
50
+ return JSON.stringify(value);
51
+ }
52
+ export function memoryValueSummaryDigest(input) {
53
+ const payload = isObject(input)
54
+ ? Object.fromEntries(Object.entries(input).filter(([key]) => key !== 'source_review'))
55
+ : input;
56
+ return createHash('sha256').update(canonical(payload)).digest('hex');
57
+ }
58
+ function exactKeys(value, label, keys, errors) {
59
+ const expected = new Set(keys);
60
+ if (Object.keys(value).some(key => !expected.has(key))) {
61
+ errors.push(`${label} contains undeclared field(s)`);
62
+ }
63
+ if (keys.some(key => !(key in value))) {
64
+ errors.push(`${label} is missing required field(s)`);
65
+ }
66
+ }
67
+ function object(value, label, errors) {
68
+ if (!isObject(value)) {
69
+ errors.push(`${label} must be an object`);
70
+ return null;
71
+ }
72
+ return value;
73
+ }
74
+ function array(value, label, errors, options = {}) {
75
+ if (!Array.isArray(value)) {
76
+ errors.push(`${label} must be an array`);
77
+ return [];
78
+ }
79
+ if (options.nonEmpty && value.length === 0)
80
+ errors.push(`${label} must be a non-empty array`);
81
+ return value;
82
+ }
83
+ function string(value, label, errors) {
84
+ if (!nonEmptyString(value)) {
85
+ errors.push(`${label} must be a non-empty string`);
86
+ return null;
87
+ }
88
+ return value;
89
+ }
90
+ function nullableString(value, label, errors) {
91
+ if (value === null)
92
+ return null;
93
+ return string(value, label, errors);
94
+ }
95
+ function boolean(value, label, errors) {
96
+ if (typeof value !== 'boolean') {
97
+ errors.push(`${label} must be boolean`);
98
+ return null;
99
+ }
100
+ return value;
101
+ }
102
+ function finiteNumber(value, label, errors) {
103
+ if (typeof value !== 'number' || !Number.isFinite(value)) {
104
+ errors.push(`${label} must be a finite number`);
105
+ return null;
106
+ }
107
+ return value;
108
+ }
109
+ function integer(value, label, errors) {
110
+ const result = finiteNumber(value, label, errors);
111
+ if (result === null)
112
+ return null;
113
+ if (!Number.isInteger(result)) {
114
+ errors.push(`${label} must be an integer`);
115
+ return null;
116
+ }
117
+ return result;
118
+ }
119
+ function literal(value, label, allowed, errors) {
120
+ const result = string(value, label, errors);
121
+ if (result === null)
122
+ return null;
123
+ if (!allowed.includes(result)) {
124
+ errors.push(`${label} must be one of the declared enum values`);
125
+ return null;
126
+ }
127
+ return result;
128
+ }
129
+ function hmacRef(value, label, errors) {
130
+ const result = string(value, label, errors);
131
+ if (result === null)
132
+ return null;
133
+ if (!HMAC_REF.test(result)) {
134
+ errors.push(`${label} must be an hmac-sha256 pseudonymous reference`);
135
+ return null;
136
+ }
137
+ return result;
138
+ }
139
+ function nullableHmacRef(value, label, errors) {
140
+ if (value === null)
141
+ return null;
142
+ return hmacRef(value, label, errors);
143
+ }
144
+ function nullableSha256(value, label, errors) {
145
+ if (value === null)
146
+ return null;
147
+ const result = string(value, label, errors);
148
+ if (result === null)
149
+ return null;
150
+ if (!SHA256.test(result)) {
151
+ errors.push(`${label} must be a lowercase SHA-256 digest`);
152
+ return null;
153
+ }
154
+ return result;
155
+ }
156
+ function parseTimestamp(value, label, errors) {
157
+ const result = string(value, label, errors);
158
+ if (result === null)
159
+ return null;
160
+ if (!ISO_UTC_TIMESTAMP.test(result)) {
161
+ errors.push(`${label} must be a strict UTC ISO timestamp`);
162
+ return null;
163
+ }
164
+ const parsed = Date.parse(result);
165
+ if (!Number.isFinite(parsed)) {
166
+ errors.push(`${label} must be a valid UTC ISO timestamp`);
167
+ return null;
168
+ }
169
+ const canonical = new Date(parsed).toISOString();
170
+ const normalized = result.includes('.') ? result : result.replace('Z', '.000Z');
171
+ if (canonical !== normalized) {
172
+ errors.push(`${label} must be a valid UTC ISO timestamp`);
173
+ return null;
174
+ }
175
+ return { text: result, ms: parsed };
176
+ }
177
+ function nullableTimestamp(value, label, errors) {
178
+ if (value === null)
179
+ return null;
180
+ return parseTimestamp(value, label, errors);
181
+ }
182
+ function assertUnique(value, seen, label, errors) {
183
+ if (value === null)
184
+ return;
185
+ if (seen.has(value))
186
+ errors.push(`${label} must be unique`);
187
+ else
188
+ seen.add(value);
189
+ }
190
+ function waitCode(value, label, allowedWaitCodes, errors) {
191
+ const code = string(value, label, errors);
192
+ if (code === null)
193
+ return null;
194
+ if (!/^[a-z][a-z0-9_]{0,31}$/.test(code) || !allowedWaitCodes.has(code)) {
195
+ errors.push(`${label} must be predeclared by measurement_policy`);
196
+ return null;
197
+ }
198
+ return code;
199
+ }
200
+ function scoreFlow(value, path, expectedEligibleIndex, allowedWaitCodes, errors) {
201
+ const raw = object(value, path, errors);
202
+ if (raw === null)
203
+ return null;
204
+ exactKeys(raw, path, ['flow_id', 'eligible_planning_index', 'eligible', 'status', 'started_at', 'completed_at', 'external_waits'], errors);
205
+ const flowId = hmacRef(raw.flow_id, `${path}.flow_id`, errors);
206
+ const eligible = boolean(raw.eligible, `${path}.eligible`, errors);
207
+ if (eligible !== true)
208
+ errors.push(`${path}.eligible must be true`);
209
+ literal(raw.status, `${path}.status`, ['completed'], errors);
210
+ const eligiblePlanningIndex = integer(raw.eligible_planning_index, `${path}.eligible_planning_index`, errors);
211
+ if (eligiblePlanningIndex !== null && eligiblePlanningIndex !== expectedEligibleIndex) {
212
+ errors.push(`${path}.eligible_planning_index must match the paired flow position`);
213
+ }
214
+ const startedAt = parseTimestamp(raw.started_at, `${path}.started_at`, errors);
215
+ const completedAt = parseTimestamp(raw.completed_at, `${path}.completed_at`, errors);
216
+ if (startedAt === null || completedAt === null)
217
+ return null;
218
+ if (completedAt.ms <= startedAt.ms) {
219
+ errors.push(`${path}.completed_at must be after started_at`);
220
+ return null;
221
+ }
222
+ const waits = [];
223
+ for (const [index, rawWait] of array(raw.external_waits, `${path}.external_waits`, errors).entries()) {
224
+ const waitPath = `${path}.external_waits[${index}]`;
225
+ const wait = object(rawWait, waitPath, errors);
226
+ if (wait === null)
227
+ continue;
228
+ exactKeys(wait, waitPath, ['code', 'started_at', 'completed_at'], errors);
229
+ const code = waitCode(wait.code, `${waitPath}.code`, allowedWaitCodes, errors);
230
+ const waitStartedAt = parseTimestamp(wait.started_at, `${waitPath}.started_at`, errors);
231
+ const waitCompletedAt = parseTimestamp(wait.completed_at, `${waitPath}.completed_at`, errors);
232
+ if (code === null || waitStartedAt === null || waitCompletedAt === null)
233
+ continue;
234
+ if (waitCompletedAt.ms <= waitStartedAt.ms) {
235
+ errors.push(`${waitPath}.completed_at must be after started_at`);
236
+ continue;
237
+ }
238
+ if (waitStartedAt.ms < startedAt.ms || waitCompletedAt.ms > completedAt.ms) {
239
+ errors.push(`${waitPath} must stay inside the planning flow`);
240
+ continue;
241
+ }
242
+ waits.push({ code, startedAtMs: waitStartedAt.ms, completedAtMs: waitCompletedAt.ms });
243
+ }
244
+ waits.sort((a, b) => a.startedAtMs - b.startedAtMs);
245
+ for (let index = 1; index < waits.length; index += 1) {
246
+ if (waits[index].startedAtMs < waits[index - 1].completedAtMs) {
247
+ errors.push(`${path}.external_waits must not overlap`);
248
+ }
249
+ }
250
+ const externalWaitMs = waits.reduce((total, wait) => total + wait.completedAtMs - wait.startedAtMs, 0);
251
+ const activeSeconds = (completedAt.ms - startedAt.ms - externalWaitMs) / 1_000;
252
+ if (activeSeconds <= 0)
253
+ errors.push(`${path} must have positive active planning duration`);
254
+ return flowId === null
255
+ ? null
256
+ : { activeSeconds, completedAtMs: completedAt.ms, flowId, startedAtMs: startedAt.ms };
257
+ }
258
+ function sourceReviewReport(evidenceKind, state, contractMet, fields = {}) {
259
+ const shared = {
260
+ reviewed_at: fields.reviewedAt ?? null,
261
+ reviewer_ref: fields.reviewerRef ?? null,
262
+ attestation_ref: fields.attestationRef ?? null,
263
+ private_source_digest_sha256: fields.privateSourceDigest ?? null,
264
+ reviewed_summary_digest_sha256: fields.reviewedSummaryDigest ?? null,
265
+ current_summary_digest_sha256: fields.currentSummaryDigest ?? null,
266
+ };
267
+ if (evidenceKind === 'synthetic_fixture') {
268
+ return {
269
+ required_for_exit: false,
270
+ state,
271
+ contract_met: false,
272
+ provenance_verified_by_scorer: false,
273
+ ...shared,
274
+ reason: 'synthetic_fixture validates formulas only and is never business evidence',
275
+ };
276
+ }
277
+ if (contractMet) {
278
+ return {
279
+ required_for_exit: true,
280
+ state,
281
+ contract_met: true,
282
+ provenance_verified_by_scorer: false,
283
+ ...shared,
284
+ reason: 'manual source-review attestation contract is present for this scoring payload; raw private source review remains a human responsibility',
285
+ };
286
+ }
287
+ return {
288
+ required_for_exit: evidenceKind === 'observed_private',
289
+ state,
290
+ contract_met: false,
291
+ provenance_verified_by_scorer: false,
292
+ ...shared,
293
+ reason: evidenceKind === 'observed_private'
294
+ ? 'observed_private remains a candidate until the manual source-review attestation contract matches this scoring payload'
295
+ : 'source kind is not exit-eligible',
296
+ };
297
+ }
298
+ function scoreSourceReview(value, evidenceKind, currentSummaryDigest, errors) {
299
+ const raw = object(value, 'source_review', errors);
300
+ if (raw === null) {
301
+ return { report: sourceReviewReport(evidenceKind, 'unknown', false, { currentSummaryDigest }) };
302
+ }
303
+ exactKeys(raw, 'source_review', [
304
+ 'schema_version',
305
+ 'state',
306
+ 'reviewed_at',
307
+ 'reviewer_ref',
308
+ 'attestation_ref',
309
+ 'private_source_digest_sha256',
310
+ 'reviewed_summary_digest_sha256',
311
+ 'checks',
312
+ ], errors);
313
+ literal(raw.schema_version, 'source_review.schema_version', ['memory_value_source_review.v1'], errors);
314
+ const state = literal(raw.state, 'source_review.state', ['not_required_for_synthetic', 'candidate', 'manual_attested'], errors) ?? 'unknown';
315
+ const reviewedAt = nullableTimestamp(raw.reviewed_at, 'source_review.reviewed_at', errors);
316
+ const reviewerRef = nullableHmacRef(raw.reviewer_ref, 'source_review.reviewer_ref', errors);
317
+ const attestationRef = nullableHmacRef(raw.attestation_ref, 'source_review.attestation_ref', errors);
318
+ const privateSourceDigest = nullableSha256(raw.private_source_digest_sha256, 'source_review.private_source_digest_sha256', errors);
319
+ const reviewedSummaryDigest = nullableSha256(raw.reviewed_summary_digest_sha256, 'source_review.reviewed_summary_digest_sha256', errors);
320
+ if (reviewedSummaryDigest !== null && reviewedSummaryDigest !== currentSummaryDigest) {
321
+ errors.push('source_review.reviewed_summary_digest_sha256 must match the current scoring payload digest');
322
+ }
323
+ const checks = object(raw.checks, 'source_review.checks', errors);
324
+ const parsedChecks = {};
325
+ if (checks !== null) {
326
+ exactKeys(checks, 'source_review.checks', [
327
+ 'raw_private_material_excluded',
328
+ 'paired_cohort_source_reviewed',
329
+ 'summary_matches_private_source',
330
+ 'no_synthetic_or_test_subjects',
331
+ ], errors);
332
+ for (const key of [
333
+ 'raw_private_material_excluded',
334
+ 'paired_cohort_source_reviewed',
335
+ 'summary_matches_private_source',
336
+ 'no_synthetic_or_test_subjects',
337
+ ]) {
338
+ const parsed = boolean(checks[key], `source_review.checks.${key}`, errors);
339
+ if (parsed !== null)
340
+ parsedChecks[key] = parsed;
341
+ }
342
+ }
343
+ if (evidenceKind === 'synthetic_fixture' && state !== 'not_required_for_synthetic') {
344
+ errors.push('source_review.state must match synthetic evidence');
345
+ }
346
+ if (evidenceKind === 'observed_private' && state === 'not_required_for_synthetic') {
347
+ errors.push('source_review.state must require observed private review');
348
+ }
349
+ const allReviewChecksMet = [
350
+ parsedChecks.raw_private_material_excluded,
351
+ parsedChecks.paired_cohort_source_reviewed,
352
+ parsedChecks.summary_matches_private_source,
353
+ parsedChecks.no_synthetic_or_test_subjects,
354
+ ].every(Boolean);
355
+ const contractMet = evidenceKind === 'observed_private'
356
+ && state === 'manual_attested'
357
+ && reviewedAt !== null
358
+ && reviewerRef !== null
359
+ && attestationRef !== null
360
+ && privateSourceDigest !== null
361
+ && reviewedSummaryDigest === currentSummaryDigest
362
+ && allReviewChecksMet;
363
+ return {
364
+ report: sourceReviewReport(evidenceKind, state, contractMet, {
365
+ reviewedAt: reviewedAt?.text ?? null,
366
+ reviewerRef,
367
+ attestationRef,
368
+ privateSourceDigest,
369
+ reviewedSummaryDigest,
370
+ currentSummaryDigest,
371
+ }),
372
+ };
373
+ }
374
+ function invalidReport(errors, schema = '', evidenceKind = '', sourceReview = sourceReviewReport(evidenceKind || null, 'unknown', false)) {
375
+ return {
376
+ schema: 'memory_value_report.v1',
377
+ contract_valid: false,
378
+ errors,
379
+ source: {
380
+ fixture_schema: schema,
381
+ evidence_kind: evidenceKind,
382
+ quantile_method: 'nearest_rank',
383
+ active_duration_rule: 'wall_clock_minus_non_overlapping_predeclared_external_waits',
384
+ id_format: 'hmac-sha256:<64lowerhex>',
385
+ source_review: sourceReview,
386
+ },
387
+ cohort: {
388
+ eligible_pair_count: 0,
389
+ first_active_seconds: { p50: 0, p75: 0 },
390
+ returning_active_seconds: { p50: 0, p75: 0 },
391
+ paired_reduction_ratio: { p50: 0, p75: 0 },
392
+ target_median_reduction_ratio: 0,
393
+ target_met: false,
394
+ minimum_pair_count_for_exit: 0,
395
+ sample_size_met: false,
396
+ },
397
+ experience_reflux: {
398
+ recalled_experience_count: 0,
399
+ verified_experience_count: 0,
400
+ baseline: null,
401
+ baseline_available: false,
402
+ real_evidence: false,
403
+ },
404
+ preference_assertions: {
405
+ total_count: 0,
406
+ traceable_count: 0,
407
+ traceable_ratio: 0,
408
+ hard_filter_violation_count: 0,
409
+ contract_met: false,
410
+ },
411
+ p4: { state: 'unknown', trigger_observed: false, contract_met: false },
412
+ exit_evidence_eligible: false,
413
+ exit_ready: false,
414
+ };
415
+ }
416
+ export function scoreMemoryValue(input) {
417
+ const errors = [];
418
+ if (!isObject(input))
419
+ return invalidReport(['root must be an object']);
420
+ exactKeys(input, 'root', ['schema', 'evidence_kind', 'source_review', 'measurement_policy', 'pairs', 'experience_reflux_events', 'preference_assertions', 'p4'], errors);
421
+ const currentSummaryDigest = memoryValueSummaryDigest(input);
422
+ const schema = literal(input.schema, 'schema', ['memory_value_fixture.v1'], errors);
423
+ const evidenceKind = literal(input.evidence_kind, 'evidence_kind', ['synthetic_fixture', 'observed_private'], errors);
424
+ const sourceReview = scoreSourceReview(input.source_review, evidenceKind, currentSummaryDigest, errors).report;
425
+ const policy = object(input.measurement_policy, 'measurement_policy', errors);
426
+ const allowedWaitCodes = new Set();
427
+ if (policy !== null) {
428
+ exactKeys(policy, 'measurement_policy', [
429
+ 'quantile_method',
430
+ 'predeclared_external_wait_codes',
431
+ 'minimum_pair_count_for_exit',
432
+ 'target_median_reduction_ratio',
433
+ ], errors);
434
+ literal(policy.quantile_method, 'measurement_policy.quantile_method', ['nearest_rank'], errors);
435
+ for (const code of array(policy.predeclared_external_wait_codes, 'measurement_policy.predeclared_external_wait_codes', errors, { nonEmpty: true })) {
436
+ if (!nonEmptyString(code) || !/^[a-z][a-z0-9_]{0,31}$/.test(code)) {
437
+ errors.push('measurement_policy.predeclared_external_wait_codes must contain declared wait-code strings');
438
+ continue;
439
+ }
440
+ if (allowedWaitCodes.has(code))
441
+ errors.push('measurement_policy.predeclared_external_wait_codes must not contain duplicates');
442
+ allowedWaitCodes.add(code);
443
+ }
444
+ const minimumPairCount = integer(policy.minimum_pair_count_for_exit, 'measurement_policy.minimum_pair_count_for_exit', errors);
445
+ if (minimumPairCount !== null && minimumPairCount !== M4_ACCEPTANCE.minimumPairCountForExit) {
446
+ errors.push(`measurement_policy.minimum_pair_count_for_exit is frozen at ${M4_ACCEPTANCE.minimumPairCountForExit}`);
447
+ }
448
+ const targetReduction = finiteNumber(policy.target_median_reduction_ratio, 'measurement_policy.target_median_reduction_ratio', errors);
449
+ if (targetReduction !== null && targetReduction !== M4_ACCEPTANCE.targetMedianReductionRatio) {
450
+ errors.push(`measurement_policy.target_median_reduction_ratio is frozen at ${M4_ACCEPTANCE.targetMedianReductionRatio}`);
451
+ }
452
+ }
453
+ const firstDurations = [];
454
+ const returningDurations = [];
455
+ const reductions = [];
456
+ const pairIds = new Set();
457
+ const subjectRefs = new Set();
458
+ const flowIds = new Set();
459
+ for (const [index, rawPair] of array(input.pairs, 'pairs', errors, { nonEmpty: true }).entries()) {
460
+ const pairPath = `pairs[${index}]`;
461
+ const pair = object(rawPair, pairPath, errors);
462
+ if (pair === null)
463
+ continue;
464
+ exactKeys(pair, pairPath, ['pair_id', 'subject_ref', 'first', 'returning'], errors);
465
+ const pairId = hmacRef(pair.pair_id, `${pairPath}.pair_id`, errors);
466
+ const subjectRef = hmacRef(pair.subject_ref, `${pairPath}.subject_ref`, errors);
467
+ assertUnique(pairId, pairIds, `${pairPath}.pair_id`, errors);
468
+ assertUnique(subjectRef, subjectRefs, `${pairPath}.subject_ref`, errors);
469
+ const first = scoreFlow(pair.first, `${pairPath}.first`, 1, allowedWaitCodes, errors);
470
+ const returning = scoreFlow(pair.returning, `${pairPath}.returning`, 2, allowedWaitCodes, errors);
471
+ for (const flow of [first, returning]) {
472
+ if (!flow)
473
+ continue;
474
+ assertUnique(flow.flowId, flowIds, `${pairPath}.flow_id`, errors);
475
+ }
476
+ if (!first || !returning || first.activeSeconds <= 0 || returning.activeSeconds <= 0)
477
+ continue;
478
+ if (returning.startedAtMs <= first.completedAtMs) {
479
+ errors.push(`${pairPath}.returning must start after the first completed flow`);
480
+ }
481
+ firstDurations.push(first.activeSeconds);
482
+ returningDurations.push(returning.activeSeconds);
483
+ reductions.push((first.activeSeconds - returning.activeSeconds) / first.activeSeconds);
484
+ }
485
+ const recalled = new Set();
486
+ const verified = new Set();
487
+ const refluxEventKeys = new Set();
488
+ const refluxEvidenceRefs = new Set();
489
+ for (const [index, rawEvent] of array(input.experience_reflux_events, 'experience_reflux_events', errors).entries()) {
490
+ const eventPath = `experience_reflux_events[${index}]`;
491
+ const event = object(rawEvent, eventPath, errors);
492
+ if (event === null)
493
+ continue;
494
+ exactKeys(event, eventPath, ['experience_id', 'kind', 'evidence_ref'], errors);
495
+ const experienceId = hmacRef(event.experience_id, `${eventPath}.experience_id`, errors);
496
+ const kind = literal(event.kind, `${eventPath}.kind`, ['recalled', 'verified_outcome'], errors);
497
+ const evidenceRef = hmacRef(event.evidence_ref, `${eventPath}.evidence_ref`, errors);
498
+ assertUnique(evidenceRef, refluxEvidenceRefs, `${eventPath}.evidence_ref`, errors);
499
+ if (experienceId === null || kind === null)
500
+ continue;
501
+ assertUnique(`${kind}:${experienceId}`, refluxEventKeys, `${eventPath}.experience_id+kind`, errors);
502
+ if (kind === 'recalled')
503
+ recalled.add(experienceId);
504
+ else
505
+ verified.add(experienceId);
506
+ }
507
+ for (const experienceId of verified) {
508
+ if (!recalled.has(experienceId))
509
+ errors.push('each verified_outcome experience must have a recalled event');
510
+ }
511
+ const verifiedRecalledCount = [...verified].filter(id => recalled.has(id)).length;
512
+ const refluxBaseline = recalled.size > 0 ? round(verifiedRecalledCount / recalled.size) : null;
513
+ const assertionsRaw = array(input.preference_assertions, 'preference_assertions', errors);
514
+ let traceableCount = 0;
515
+ let hardFilterViolationCount = 0;
516
+ const assertionIds = new Set();
517
+ for (const [index, rawAssertion] of assertionsRaw.entries()) {
518
+ const assertionPath = `preference_assertions[${index}]`;
519
+ const assertion = object(rawAssertion, assertionPath, errors);
520
+ if (assertion === null)
521
+ continue;
522
+ exactKeys(assertion, assertionPath, ['assertion_id', 'evidence_ref', 'consumer', 'hard_filter'], errors);
523
+ const assertionId = hmacRef(assertion.assertion_id, `${assertionPath}.assertion_id`, errors);
524
+ const evidenceRef = hmacRef(assertion.evidence_ref, `${assertionPath}.evidence_ref`, errors);
525
+ const consumer = literal(assertion.consumer, `${assertionPath}.consumer`, ['ranking', 'explanation', 'hard_filter'], errors);
526
+ const hardFilter = boolean(assertion.hard_filter, `${assertionPath}.hard_filter`, errors);
527
+ assertUnique(assertionId, assertionIds, `${assertionPath}.assertion_id`, errors);
528
+ if (evidenceRef !== null)
529
+ traceableCount += 1;
530
+ if (hardFilter === true || consumer === 'hard_filter')
531
+ hardFilterViolationCount += 1;
532
+ }
533
+ const traceableRatio = assertionsRaw.length > 0 ? round(traceableCount / assertionsRaw.length) : 0;
534
+ const assertionContractMet = assertionsRaw.length > 0 && traceableRatio === 1 && hardFilterViolationCount === 0;
535
+ let p4State = 'unknown';
536
+ let p4TriggerObserved = false;
537
+ const rawP4 = object(input.p4, 'p4', errors);
538
+ if (rawP4 !== null) {
539
+ exactKeys(rawP4, 'p4', ['state', 'triggers'], errors);
540
+ p4State = literal(rawP4.state, 'p4.state', ['closed', 'open'], errors) ?? 'unknown';
541
+ const triggers = object(rawP4.triggers, 'p4.triggers', errors);
542
+ if (triggers !== null) {
543
+ exactKeys(triggers, 'p4.triggers', ['real_usage', 'multi_user'], errors);
544
+ const realUsage = boolean(triggers.real_usage, 'p4.triggers.real_usage', errors);
545
+ const multiUser = boolean(triggers.multi_user, 'p4.triggers.multi_user', errors);
546
+ p4TriggerObserved = realUsage === true || multiUser === true;
547
+ }
548
+ }
549
+ const p4ContractMet = p4TriggerObserved || p4State === 'closed';
550
+ if (errors.length > 0)
551
+ return invalidReport(errors, schema ?? '', evidenceKind ?? '', sourceReview);
552
+ const medianReduction = nearestRankRaw(reductions, 0.5);
553
+ const sampleSizeMet = firstDurations.length >= M4_ACCEPTANCE.minimumPairCountForExit;
554
+ const targetMet = medianReduction >= M4_ACCEPTANCE.targetMedianReductionRatio;
555
+ const sourceEvidenceEligible = evidenceKind === 'observed_private' && sourceReview.contract_met;
556
+ const baselineAvailable = refluxBaseline !== null;
557
+ const exitReady = sourceEvidenceEligible
558
+ && sampleSizeMet
559
+ && targetMet
560
+ && baselineAvailable
561
+ && assertionContractMet
562
+ && p4ContractMet;
563
+ return {
564
+ schema: 'memory_value_report.v1',
565
+ contract_valid: true,
566
+ errors: [],
567
+ source: {
568
+ fixture_schema: schema,
569
+ evidence_kind: evidenceKind,
570
+ quantile_method: 'nearest_rank',
571
+ active_duration_rule: 'wall_clock_minus_non_overlapping_predeclared_external_waits',
572
+ id_format: 'hmac-sha256:<64lowerhex>',
573
+ source_review: sourceReview,
574
+ },
575
+ cohort: {
576
+ eligible_pair_count: firstDurations.length,
577
+ first_active_seconds: { p50: nearestRank(firstDurations, 0.5), p75: nearestRank(firstDurations, 0.75) },
578
+ returning_active_seconds: { p50: nearestRank(returningDurations, 0.5), p75: nearestRank(returningDurations, 0.75) },
579
+ paired_reduction_ratio: { p50: round(medianReduction), p75: nearestRank(reductions, 0.75) },
580
+ target_median_reduction_ratio: M4_ACCEPTANCE.targetMedianReductionRatio,
581
+ target_met: targetMet,
582
+ minimum_pair_count_for_exit: M4_ACCEPTANCE.minimumPairCountForExit,
583
+ sample_size_met: sampleSizeMet,
584
+ },
585
+ experience_reflux: {
586
+ recalled_experience_count: recalled.size,
587
+ verified_experience_count: verifiedRecalledCount,
588
+ baseline: refluxBaseline,
589
+ baseline_available: baselineAvailable,
590
+ real_evidence: sourceEvidenceEligible,
591
+ },
592
+ preference_assertions: {
593
+ total_count: assertionsRaw.length,
594
+ traceable_count: traceableCount,
595
+ traceable_ratio: traceableRatio,
596
+ hard_filter_violation_count: hardFilterViolationCount,
597
+ contract_met: assertionContractMet,
598
+ },
599
+ p4: {
600
+ state: p4State,
601
+ trigger_observed: p4TriggerObserved,
602
+ contract_met: p4ContractMet,
603
+ },
604
+ exit_evidence_eligible: sourceEvidenceEligible,
605
+ exit_ready: exitReady,
606
+ };
607
+ }
608
+ function main() {
609
+ const inputPath = process.argv[2];
610
+ if (!inputPath) {
611
+ console.error('usage: npx tsx scripts/memory-value-report.ts <fixture-or-private-manifest.json>');
612
+ process.exitCode = 2;
613
+ return;
614
+ }
615
+ let input;
616
+ try {
617
+ input = JSON.parse(readFileSync(resolve(inputPath), 'utf8'));
618
+ }
619
+ catch {
620
+ console.error('MEMORY_VALUE_INPUT_INVALID: input file could not be read or parsed');
621
+ process.exitCode = 2;
622
+ return;
623
+ }
624
+ const report = scoreMemoryValue(input);
625
+ console.log(JSON.stringify(report, null, 2));
626
+ if (!report.contract_valid)
627
+ process.exitCode = 2;
628
+ }
629
+ const invokedPath = process.argv[1] ? pathToFileURL(resolve(process.argv[1])).href : '';
630
+ if (import.meta.url === invokedPath)
631
+ main();