@fuzdev/fuz_app 0.146.1 → 0.148.0

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 (313) hide show
  1. package/dist/actions/CLAUDE.md +6 -4
  2. package/dist/actions/action_codegen.d.ts +15 -1
  3. package/dist/actions/action_codegen.d.ts.map +1 -1
  4. package/dist/actions/action_codegen.js +23 -2
  5. package/dist/actions/perform_action.js +1 -1
  6. package/dist/auth/CLAUDE.md +1 -1
  7. package/dist/auth/bootstrap_account.d.ts +2 -1
  8. package/dist/auth/bootstrap_account.d.ts.map +1 -1
  9. package/dist/auth/bootstrap_account.js +17 -6
  10. package/dist/auth/cell_action_specs.d.ts +3 -1
  11. package/dist/auth/cell_action_specs.d.ts.map +1 -1
  12. package/dist/auth/cell_action_specs.js +5 -5
  13. package/dist/auth/cell_actions.d.ts.map +1 -1
  14. package/dist/auth/cell_actions.js +2 -3
  15. package/dist/auth/cell_data_schema.d.ts +1 -1
  16. package/dist/auth/cell_data_schema.js +1 -1
  17. package/dist/auth/cell_field_action_specs.d.ts +4 -3
  18. package/dist/auth/cell_field_action_specs.d.ts.map +1 -1
  19. package/dist/auth/cell_field_action_specs.js +5 -6
  20. package/dist/auth/cell_field_actions.d.ts.map +1 -1
  21. package/dist/auth/cell_field_actions.js +8 -1
  22. package/dist/auth/cell_item_action_specs.d.ts +4 -2
  23. package/dist/auth/cell_item_action_specs.d.ts.map +1 -1
  24. package/dist/auth/cell_item_action_specs.js +5 -5
  25. package/dist/auth/cell_item_actions.d.ts.map +1 -1
  26. package/dist/auth/cell_item_actions.js +8 -1
  27. package/dist/auth/keyring.d.ts +35 -38
  28. package/dist/auth/keyring.d.ts.map +1 -1
  29. package/dist/auth/keyring.js +43 -50
  30. package/dist/auth/password_argon2.d.ts.map +1 -1
  31. package/dist/auth/password_argon2.js +11 -8
  32. package/dist/auth/role_grant_offer_action_specs.d.ts +2 -0
  33. package/dist/auth/role_grant_offer_action_specs.d.ts.map +1 -1
  34. package/dist/auth/role_grant_offer_action_specs.js +3 -1
  35. package/dist/auth/session_cookie.d.ts.map +1 -1
  36. package/dist/auth/session_cookie.js +5 -2
  37. package/dist/db/CLAUDE.md +18 -16
  38. package/dist/db/cell_queries.d.ts +3 -2
  39. package/dist/db/cell_queries.d.ts.map +1 -1
  40. package/dist/db/cell_queries.js +3 -2
  41. package/dist/db/fact_disk_storage.d.ts +15 -15
  42. package/dist/db/fact_disk_storage.d.ts.map +1 -1
  43. package/dist/db/fact_disk_storage.js +22 -28
  44. package/dist/db/fact_queries.d.ts +2 -3
  45. package/dist/db/fact_queries.d.ts.map +1 -1
  46. package/dist/db/fact_queries.js +2 -3
  47. package/dist/db/fact_store.d.ts +20 -18
  48. package/dist/db/fact_store.d.ts.map +1 -1
  49. package/dist/db/fact_store.js +30 -44
  50. package/dist/db/file_fact_url.d.ts +19 -4
  51. package/dist/db/file_fact_url.d.ts.map +1 -1
  52. package/dist/db/file_fact_url.js +19 -4
  53. package/dist/primitive_schemas.d.ts +1 -1
  54. package/dist/primitive_schemas.d.ts.map +1 -1
  55. package/dist/primitive_schemas.js +2 -1
  56. package/dist/schema_meta.d.ts +20 -0
  57. package/dist/schema_meta.d.ts.map +1 -1
  58. package/dist/schema_meta.js +7 -1
  59. package/dist/server/env.d.ts.map +1 -1
  60. package/dist/server/env.js +2 -2
  61. package/dist/server/serve_fact_route.d.ts +9 -5
  62. package/dist/server/serve_fact_route.d.ts.map +1 -1
  63. package/dist/server/serve_fact_route.js +15 -7
  64. package/dist/testing/CLAUDE.md +737 -114
  65. package/dist/testing/admin_integration.d.ts.map +1 -1
  66. package/dist/testing/admin_integration.js +73 -5
  67. package/dist/testing/adversarial_input.d.ts +0 -47
  68. package/dist/testing/adversarial_input.d.ts.map +1 -1
  69. package/dist/testing/adversarial_input.js +4 -340
  70. package/dist/testing/adversarial_input_cases.d.ts +64 -0
  71. package/dist/testing/adversarial_input_cases.d.ts.map +1 -0
  72. package/dist/testing/adversarial_input_cases.js +348 -0
  73. package/dist/testing/app_server.d.ts.map +1 -1
  74. package/dist/testing/app_server.js +2 -2
  75. package/dist/testing/audit_completeness.d.ts.map +1 -1
  76. package/dist/testing/audit_completeness.js +24 -20
  77. package/dist/testing/audit_drift_guard.d.ts +27 -1
  78. package/dist/testing/audit_drift_guard.d.ts.map +1 -1
  79. package/dist/testing/audit_drift_guard.js +50 -0
  80. package/dist/testing/cross_backend/account_lifecycle.d.ts.map +1 -1
  81. package/dist/testing/cross_backend/account_lifecycle.js +29 -12
  82. package/dist/testing/cross_backend/actor_lookup.d.ts.map +1 -1
  83. package/dist/testing/cross_backend/actor_lookup.js +7 -25
  84. package/dist/testing/cross_backend/app_settings.d.ts.map +1 -1
  85. package/dist/testing/cross_backend/app_settings.js +4 -6
  86. package/dist/testing/cross_backend/audit_cross_helpers.d.ts +51 -0
  87. package/dist/testing/cross_backend/audit_cross_helpers.d.ts.map +1 -0
  88. package/dist/testing/cross_backend/audit_cross_helpers.js +78 -0
  89. package/dist/testing/cross_backend/backend_config.d.ts +2 -1
  90. package/dist/testing/cross_backend/backend_config.d.ts.map +1 -1
  91. package/dist/testing/cross_backend/body_size.d.ts +6 -0
  92. package/dist/testing/cross_backend/body_size.d.ts.map +1 -1
  93. package/dist/testing/cross_backend/body_size.js +26 -44
  94. package/dist/testing/cross_backend/body_size_smuggling.d.ts +5 -0
  95. package/dist/testing/cross_backend/body_size_smuggling.d.ts.map +1 -1
  96. package/dist/testing/cross_backend/body_size_smuggling.js +7 -14
  97. package/dist/testing/cross_backend/bootstrap_backend.d.ts +11 -1
  98. package/dist/testing/cross_backend/bootstrap_backend.d.ts.map +1 -1
  99. package/dist/testing/cross_backend/bootstrap_backend.js +2 -1
  100. package/dist/testing/cross_backend/build_test_backend_paths.d.ts +3 -1
  101. package/dist/testing/cross_backend/build_test_backend_paths.d.ts.map +1 -1
  102. package/dist/testing/cross_backend/capabilities.d.ts +55 -59
  103. package/dist/testing/cross_backend/capabilities.d.ts.map +1 -1
  104. package/dist/testing/cross_backend/capabilities.js +20 -23
  105. package/dist/testing/cross_backend/cargo_binary.d.ts +70 -0
  106. package/dist/testing/cross_backend/cargo_binary.d.ts.map +1 -0
  107. package/dist/testing/cross_backend/cargo_binary.js +148 -0
  108. package/dist/testing/cross_backend/cell_crud.d.ts.map +1 -1
  109. package/dist/testing/cross_backend/cell_crud.js +57 -1
  110. package/dist/testing/cross_backend/cell_gated_create.d.ts +0 -60
  111. package/dist/testing/cross_backend/cell_gated_create.d.ts.map +1 -1
  112. package/dist/testing/cross_backend/cell_gated_create.js +9 -487
  113. package/dist/testing/cross_backend/cell_grant_role.d.ts +14 -2
  114. package/dist/testing/cross_backend/cell_grant_role.d.ts.map +1 -1
  115. package/dist/testing/cross_backend/cell_grant_role.js +22 -12
  116. package/dist/testing/cross_backend/cell_moderate.d.ts +66 -0
  117. package/dist/testing/cross_backend/cell_moderate.d.ts.map +1 -0
  118. package/dist/testing/cross_backend/cell_moderate.js +511 -0
  119. package/dist/testing/cross_backend/cell_ref_admission.d.ts.map +1 -1
  120. package/dist/testing/cross_backend/cell_ref_admission.js +1 -1
  121. package/dist/testing/cross_backend/cell_relations.d.ts.map +1 -1
  122. package/dist/testing/cross_backend/cell_relations.js +40 -19
  123. package/dist/testing/cross_backend/conformance_case.d.ts +43 -4
  124. package/dist/testing/cross_backend/conformance_case.d.ts.map +1 -1
  125. package/dist/testing/cross_backend/conformance_case.js +29 -1
  126. package/dist/testing/cross_backend/conformance_rpc_auth.d.ts +93 -0
  127. package/dist/testing/cross_backend/conformance_rpc_auth.d.ts.map +1 -0
  128. package/dist/testing/cross_backend/conformance_rpc_auth.js +125 -0
  129. package/dist/testing/cross_backend/conformance_table.d.ts +144 -4
  130. package/dist/testing/cross_backend/conformance_table.d.ts.map +1 -1
  131. package/dist/testing/cross_backend/conformance_table.js +297 -65
  132. package/dist/testing/cross_backend/cookie_attributes.d.ts.map +1 -1
  133. package/dist/testing/cross_backend/cookie_attributes.js +3 -2
  134. package/dist/testing/cross_backend/create_cross_backend_global_setup.d.ts +38 -5
  135. package/dist/testing/cross_backend/create_cross_backend_global_setup.d.ts.map +1 -1
  136. package/dist/testing/cross_backend/create_cross_backend_global_setup.js +24 -3
  137. package/dist/testing/cross_backend/create_dual_spawn_global_setup.d.ts +5 -5
  138. package/dist/testing/cross_backend/create_dual_spawn_global_setup.d.ts.map +1 -1
  139. package/dist/testing/cross_backend/credential_deadline.d.ts +10 -6
  140. package/dist/testing/cross_backend/credential_deadline.d.ts.map +1 -1
  141. package/dist/testing/cross_backend/credential_deadline.js +32 -31
  142. package/dist/testing/cross_backend/credential_header_robustness.d.ts.map +1 -1
  143. package/dist/testing/cross_backend/credential_header_robustness.js +4 -6
  144. package/dist/testing/cross_backend/{cell_cross_helpers.d.ts → cross_rpc.d.ts} +12 -2
  145. package/dist/testing/cross_backend/cross_rpc.d.ts.map +1 -0
  146. package/dist/testing/cross_backend/{cell_cross_helpers.js → cross_rpc.js} +31 -7
  147. package/dist/testing/cross_backend/default_backend_configs.d.ts +56 -61
  148. package/dist/testing/cross_backend/default_backend_configs.d.ts.map +1 -1
  149. package/dist/testing/cross_backend/default_backend_configs.js +97 -91
  150. package/dist/testing/cross_backend/default_spine_surface.d.ts.map +1 -1
  151. package/dist/testing/cross_backend/default_spine_surface.js +2 -2
  152. package/dist/testing/cross_backend/differential.d.ts +126 -0
  153. package/dist/testing/cross_backend/differential.d.ts.map +1 -0
  154. package/dist/testing/cross_backend/differential.js +201 -0
  155. package/dist/testing/cross_backend/differential_normalize.d.ts +150 -0
  156. package/dist/testing/cross_backend/differential_normalize.d.ts.map +1 -0
  157. package/dist/testing/cross_backend/differential_normalize.js +153 -0
  158. package/dist/testing/cross_backend/fact_serving.d.ts +5 -0
  159. package/dist/testing/cross_backend/fact_serving.d.ts.map +1 -1
  160. package/dist/testing/cross_backend/fact_serving.js +41 -7
  161. package/dist/testing/cross_backend/full_spine_mount.d.ts +15 -0
  162. package/dist/testing/cross_backend/full_spine_mount.d.ts.map +1 -1
  163. package/dist/testing/cross_backend/full_spine_mount.js +55 -1
  164. package/dist/testing/cross_backend/identity_parity.d.ts.map +1 -1
  165. package/dist/testing/cross_backend/identity_parity.js +6 -5
  166. package/dist/testing/cross_backend/in_process_setup.d.ts +12 -2
  167. package/dist/testing/cross_backend/in_process_setup.d.ts.map +1 -1
  168. package/dist/testing/cross_backend/in_process_setup.js +10 -7
  169. package/dist/testing/cross_backend/login_security.d.ts.map +1 -1
  170. package/dist/testing/cross_backend/login_security.js +13 -18
  171. package/dist/testing/cross_backend/origin.js +1 -1
  172. package/dist/testing/cross_backend/origin_conformance.js +1 -1
  173. package/dist/testing/cross_backend/origin_scope.d.ts +6 -0
  174. package/dist/testing/cross_backend/origin_scope.d.ts.map +1 -1
  175. package/dist/testing/cross_backend/origin_scope.js +13 -12
  176. package/dist/testing/cross_backend/peer_ping_ws.d.ts +2 -5
  177. package/dist/testing/cross_backend/peer_ping_ws.d.ts.map +1 -1
  178. package/dist/testing/cross_backend/peer_ping_ws.js +14 -24
  179. package/dist/testing/cross_backend/postgres_database.d.ts +85 -0
  180. package/dist/testing/cross_backend/postgres_database.d.ts.map +1 -0
  181. package/dist/testing/cross_backend/postgres_database.js +140 -0
  182. package/dist/testing/cross_backend/provided_context.d.ts +28 -0
  183. package/dist/testing/cross_backend/provided_context.d.ts.map +1 -0
  184. package/dist/testing/cross_backend/provided_context.js +35 -0
  185. package/dist/testing/cross_backend/query_shape.d.ts.map +1 -1
  186. package/dist/testing/cross_backend/query_shape.js +10 -12
  187. package/dist/testing/cross_backend/ready.js +2 -2
  188. package/dist/testing/cross_backend/revocation_drivers.d.ts +4 -3
  189. package/dist/testing/cross_backend/revocation_drivers.d.ts.map +1 -1
  190. package/dist/testing/cross_backend/revocation_drivers.js +1 -1
  191. package/dist/testing/cross_backend/role_grant_cross_helpers.d.ts +3 -2
  192. package/dist/testing/cross_backend/role_grant_cross_helpers.d.ts.map +1 -1
  193. package/dist/testing/cross_backend/role_grant_offer_lifecycle.d.ts +13 -0
  194. package/dist/testing/cross_backend/role_grant_offer_lifecycle.d.ts.map +1 -0
  195. package/dist/testing/cross_backend/role_grant_offer_lifecycle.js +203 -0
  196. package/dist/testing/cross_backend/role_grant_offer_notification_ws.d.ts +2 -5
  197. package/dist/testing/cross_backend/role_grant_offer_notification_ws.d.ts.map +1 -1
  198. package/dist/testing/cross_backend/role_grant_offer_notification_ws.js +203 -111
  199. package/dist/testing/cross_backend/role_grant_participation.d.ts +13 -0
  200. package/dist/testing/cross_backend/role_grant_participation.d.ts.map +1 -1
  201. package/dist/testing/cross_backend/role_grant_participation.js +32 -21
  202. package/dist/testing/cross_backend/role_grant_role_grammar.d.ts.map +1 -1
  203. package/dist/testing/cross_backend/role_grant_role_grammar.js +6 -9
  204. package/dist/testing/cross_backend/rpc_adversarial.d.ts +38 -0
  205. package/dist/testing/cross_backend/rpc_adversarial.d.ts.map +1 -0
  206. package/dist/testing/cross_backend/rpc_adversarial.js +292 -0
  207. package/dist/testing/cross_backend/rpc_success_fixtures.d.ts +24 -0
  208. package/dist/testing/cross_backend/rpc_success_fixtures.d.ts.map +1 -0
  209. package/dist/testing/cross_backend/rpc_success_fixtures.js +124 -0
  210. package/dist/testing/cross_backend/rust_spine_consumer_surface.d.ts +101 -0
  211. package/dist/testing/cross_backend/rust_spine_consumer_surface.d.ts.map +1 -0
  212. package/dist/testing/cross_backend/rust_spine_consumer_surface.js +113 -0
  213. package/dist/testing/cross_backend/rust_spine_stub_backend_config.d.ts +10 -0
  214. package/dist/testing/cross_backend/rust_spine_stub_backend_config.d.ts.map +1 -1
  215. package/dist/testing/cross_backend/rust_spine_stub_backend_config.js +27 -18
  216. package/dist/testing/cross_backend/session_cap.d.ts +9 -8
  217. package/dist/testing/cross_backend/session_cap.d.ts.map +1 -1
  218. package/dist/testing/cross_backend/session_cap.js +9 -4
  219. package/dist/testing/cross_backend/session_cookie_codec.d.ts +19 -0
  220. package/dist/testing/cross_backend/session_cookie_codec.d.ts.map +1 -0
  221. package/dist/testing/cross_backend/session_cookie_codec.js +128 -0
  222. package/dist/testing/cross_backend/setup.d.ts +56 -54
  223. package/dist/testing/cross_backend/setup.d.ts.map +1 -1
  224. package/dist/testing/cross_backend/setup.js +29 -29
  225. package/dist/testing/cross_backend/simple_request.d.ts.map +1 -1
  226. package/dist/testing/cross_backend/simple_request.js +4 -4
  227. package/dist/testing/cross_backend/spawn_backend.d.ts +59 -10
  228. package/dist/testing/cross_backend/spawn_backend.d.ts.map +1 -1
  229. package/dist/testing/cross_backend/spawn_backend.js +219 -60
  230. package/dist/testing/cross_backend/spine_suites.d.ts +231 -0
  231. package/dist/testing/cross_backend/spine_suites.d.ts.map +1 -0
  232. package/dist/testing/cross_backend/spine_suites.js +626 -0
  233. package/dist/testing/cross_backend/spine_surface_constants.d.ts +29 -0
  234. package/dist/testing/cross_backend/spine_surface_constants.d.ts.map +1 -1
  235. package/dist/testing/cross_backend/spine_surface_constants.js +29 -0
  236. package/dist/testing/cross_backend/sse_round_trip.d.ts.map +1 -1
  237. package/dist/testing/cross_backend/sse_round_trip.js +3 -4
  238. package/dist/testing/cross_backend/standard.d.ts +18 -1
  239. package/dist/testing/cross_backend/standard.d.ts.map +1 -1
  240. package/dist/testing/cross_backend/standard.js +2 -0
  241. package/dist/testing/cross_backend/test_cell_gated_create_authorize.d.ts +24 -0
  242. package/dist/testing/cross_backend/test_cell_gated_create_authorize.d.ts.map +1 -1
  243. package/dist/testing/cross_backend/test_cell_gated_create_authorize.js +15 -0
  244. package/dist/testing/cross_backend/testing_backdoor.d.ts +2 -8
  245. package/dist/testing/cross_backend/testing_backdoor.d.ts.map +1 -1
  246. package/dist/testing/cross_backend/testing_backdoor.js +7 -10
  247. package/dist/testing/cross_backend/testing_reset_actions.d.ts +10 -5
  248. package/dist/testing/cross_backend/testing_reset_actions.d.ts.map +1 -1
  249. package/dist/testing/cross_backend/testing_reset_actions.js +21 -12
  250. package/dist/testing/cross_backend/testing_server_bun.js +1 -1
  251. package/dist/testing/cross_backend/token_lifetime.js +1 -1
  252. package/dist/testing/cross_backend/token_scope_surface.d.ts.map +1 -1
  253. package/dist/testing/cross_backend/token_scope_surface.js +9 -13
  254. package/dist/testing/cross_backend/transport_composition.d.ts +26 -2
  255. package/dist/testing/cross_backend/transport_composition.d.ts.map +1 -1
  256. package/dist/testing/cross_backend/transport_composition.js +81 -51
  257. package/dist/testing/cross_backend/ts_spine_backend_config.d.ts +8 -0
  258. package/dist/testing/cross_backend/ts_spine_backend_config.d.ts.map +1 -1
  259. package/dist/testing/cross_backend/ts_spine_backend_config.js +17 -10
  260. package/dist/testing/cross_backend/ws_action_rate_limit.d.ts +2 -5
  261. package/dist/testing/cross_backend/ws_action_rate_limit.d.ts.map +1 -1
  262. package/dist/testing/cross_backend/ws_action_rate_limit.js +8 -14
  263. package/dist/testing/cross_backend/ws_connection_cap.d.ts +4 -9
  264. package/dist/testing/cross_backend/ws_connection_cap.d.ts.map +1 -1
  265. package/dist/testing/cross_backend/ws_connection_cap.js +11 -12
  266. package/dist/testing/cross_backend/ws_endpoint.d.ts +52 -0
  267. package/dist/testing/cross_backend/ws_endpoint.d.ts.map +1 -0
  268. package/dist/testing/cross_backend/ws_endpoint.js +54 -0
  269. package/dist/testing/cross_backend/ws_inbound_dispatch.d.ts +2 -5
  270. package/dist/testing/cross_backend/ws_inbound_dispatch.d.ts.map +1 -1
  271. package/dist/testing/cross_backend/ws_inbound_dispatch.js +9 -15
  272. package/dist/testing/cross_backend/ws_outbound_overflow.d.ts +2 -7
  273. package/dist/testing/cross_backend/ws_outbound_overflow.d.ts.map +1 -1
  274. package/dist/testing/cross_backend/ws_outbound_overflow.js +5 -9
  275. package/dist/testing/cross_backend/ws_role_gated.d.ts +4 -5
  276. package/dist/testing/cross_backend/ws_role_gated.d.ts.map +1 -1
  277. package/dist/testing/cross_backend/ws_role_gated.js +12 -21
  278. package/dist/testing/cross_backend/ws_round_trip.d.ts +12 -9
  279. package/dist/testing/cross_backend/ws_round_trip.d.ts.map +1 -1
  280. package/dist/testing/cross_backend/ws_round_trip.js +29 -34
  281. package/dist/testing/db_entities.d.ts +16 -3
  282. package/dist/testing/db_entities.d.ts.map +1 -1
  283. package/dist/testing/db_entities.js +28 -5
  284. package/dist/testing/integration_helpers.d.ts +61 -2
  285. package/dist/testing/integration_helpers.d.ts.map +1 -1
  286. package/dist/testing/integration_helpers.js +75 -18
  287. package/dist/testing/round_trip.d.ts +17 -0
  288. package/dist/testing/round_trip.d.ts.map +1 -1
  289. package/dist/testing/round_trip.js +67 -24
  290. package/dist/testing/rpc_attack_surface.d.ts.map +1 -1
  291. package/dist/testing/rpc_attack_surface.js +13 -138
  292. package/dist/testing/rpc_envelope_cases.d.ts +111 -0
  293. package/dist/testing/rpc_envelope_cases.d.ts.map +1 -0
  294. package/dist/testing/rpc_envelope_cases.js +240 -0
  295. package/dist/testing/rpc_helpers.d.ts +31 -0
  296. package/dist/testing/rpc_helpers.d.ts.map +1 -1
  297. package/dist/testing/rpc_helpers.js +35 -14
  298. package/dist/testing/rpc_round_trip.d.ts +62 -6
  299. package/dist/testing/rpc_round_trip.d.ts.map +1 -1
  300. package/dist/testing/rpc_round_trip.js +151 -39
  301. package/dist/testing/schema_generators.d.ts.map +1 -1
  302. package/dist/testing/schema_generators.js +22 -2
  303. package/dist/testing/standard.d.ts +26 -0
  304. package/dist/testing/standard.d.ts.map +1 -1
  305. package/dist/testing/standard.js +4 -1
  306. package/dist/testing/transports/raw_http.d.ts +21 -0
  307. package/dist/testing/transports/raw_http.d.ts.map +1 -1
  308. package/dist/testing/transports/raw_http.js +30 -0
  309. package/package.json +10 -8
  310. package/dist/testing/cross_backend/actor_search.d.ts +0 -6
  311. package/dist/testing/cross_backend/actor_search.d.ts.map +0 -1
  312. package/dist/testing/cross_backend/actor_search.js +0 -90
  313. package/dist/testing/cross_backend/cell_cross_helpers.d.ts.map +0 -1
@@ -15,6 +15,26 @@ export const TESTING_ACTION_AUTH = {
15
15
  };
16
16
  /** RPC endpoint mount path — matches the binary's `/api/rpc`. */
17
17
  export const SPINE_RPC_PATH = '/api/rpc';
18
+ /** Ungated WebSocket endpoint mount path — matches the binaries' `/api/ws`. */
19
+ export const SPINE_WS_PATH = '/api/ws';
20
+ /**
21
+ * Mount prefix of the account REST routes (login, logout, password, status,
22
+ * signup, bootstrap) on both spine binaries. The `SPINE_ACCOUNT_*_PATH`
23
+ * constants below are the routes under it the suites drive.
24
+ */
25
+ export const SPINE_ACCOUNT_PATH_PREFIX = '/api/account';
26
+ /** REST login route. */
27
+ export const SPINE_ACCOUNT_LOGIN_PATH = '/api/account/login';
28
+ /** REST logout route. */
29
+ export const SPINE_ACCOUNT_LOGOUT_PATH = '/api/account/logout';
30
+ /** REST password-change route. */
31
+ export const SPINE_ACCOUNT_PASSWORD_PATH = '/api/account/password';
32
+ /** REST account-status route. */
33
+ export const SPINE_ACCOUNT_STATUS_PATH = '/api/account/status';
34
+ /** REST signup route. */
35
+ export const SPINE_ACCOUNT_SIGNUP_PATH = '/api/account/signup';
36
+ /** REST bootstrap route — the default `BackendConfig.bootstrap_path`. */
37
+ export const SPINE_ACCOUNT_BOOTSTRAP_PATH = '/api/account/bootstrap';
18
38
  /**
19
39
  * Audit-log SSE stream path — `/api/admin` prefix + the
20
40
  * `create_audit_log_route_specs` `/audit/stream` route. Matches the default
@@ -23,6 +43,15 @@ export const SPINE_RPC_PATH = '/api/rpc';
23
43
  * surface stub leaves `ctx.audit_sse` null so the snapshot stays SSE-free.
24
44
  */
25
45
  export const SPINE_SSE_PATH = '/api/admin/audit/stream';
46
+ /**
47
+ * The request-body cap both spines ship by default, 1 MiB
48
+ * (`DEFAULT_MAX_BODY_SIZE` in TS, `DEFAULT_BODY_LIMIT_BYTES` in `fuz_http`).
49
+ * Kept here as the cross-impl contract value rather than imported from either
50
+ * impl — the boundary the body-size suites pin is the shared default, and a
51
+ * change to either is a deliberate cross-impl decision that would revisit them
52
+ * regardless.
53
+ */
54
+ export const SPINE_BODY_LIMIT_DEFAULT_BYTES = 1024 * 1024;
26
55
  /**
27
56
  * App role the role-shaped-`cell_grant` cross suite exercises. Registered
28
57
  * with no grant path (`grant_paths: []`) so it stays a valid registry member
@@ -1 +1 @@
1
- {"version":3,"file":"sse_round_trip.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/sse_round_trip.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAkF9B,OAAO,EAAE,KAAK,mBAAmB,EAAW,MAAM,mBAAmB,CAAC;AAEtE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAK5C,4DAA4D;AAC5D,MAAM,WAAW,0BAA0B;IAC1C;;;;;;OAMG;IACH,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC;IAC/B,wEAAwE;IACxE,QAAQ,CAAC,YAAY,EAAE,mBAAmB,CAAC;IAC3C,2EAA2E;IAC3E,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,6EAA6E;IAC7E,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;;;OAMG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,6DAA6D;IAC7D,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB;;;;;OAKG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,wFAAwF;IACxF,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,4FAA4F;IAC5F,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CAChC;AA0BD;;;;;;GAMG;AACH,eAAO,MAAM,gCAAgC,GAAI,SAAS,0BAA0B,KAAG,IAyStF,CAAC"}
1
+ {"version":3,"file":"sse_round_trip.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/sse_round_trip.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAkF9B,OAAO,EAAE,KAAK,mBAAmB,EAAW,MAAM,mBAAmB,CAAC;AAEtE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAO5C,4DAA4D;AAC5D,MAAM,WAAW,0BAA0B;IAC1C;;;;;;OAMG;IACH,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC;IAC/B,wEAAwE;IACxE,QAAQ,CAAC,YAAY,EAAE,mBAAmB,CAAC;IAC3C,2EAA2E;IAC3E,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,6EAA6E;IAC7E,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;;;OAMG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,6DAA6D;IAC7D,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB;;;;;OAKG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,wFAAwF;IACxF,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,4FAA4F;IAC5F,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CAChC;AA0BD;;;;;;GAMG;AACH,eAAO,MAAM,gCAAgC,GAAI,SAAS,0BAA0B,KAAG,IAyStF,CAAC"}
@@ -69,8 +69,7 @@ import { create_rpc_post_init } from '../rpc_helpers.js';
69
69
  import { DEFAULT_TEST_PASSWORD } from '../test_credentials.js';
70
70
  import { test_if } from './capabilities.js';
71
71
  import { create_account_revocations } from './revocation_drivers.js';
72
- /** Default audit-log SSE stream path — the standard fuz_app `/api/admin/audit/stream`. */
73
- const DEFAULT_SSE_PATH = '/api/admin/audit/stream';
72
+ import { SPINE_ACCOUNT_LOGOUT_PATH, SPINE_ACCOUNT_PASSWORD_PATH, SPINE_SSE_PATH } from './spine_surface_constants.js';
74
73
  /**
75
74
  * Assert a decoded SSE frame is a well-formed audit `{method, params}`
76
75
  * payload whose `params` validate against the matching `audit_log_event_specs`
@@ -94,8 +93,8 @@ const assert_audit_data_frame = (frame) => {
94
93
  * per-session cap.
95
94
  */
96
95
  export const describe_cross_process_sse_tests = (options) => {
97
- const { setup_test, capabilities, base_url, rpc_path, origin, logout_path = '/api/account/logout', password_path = '/api/account/password' } = options;
98
- const sse_path = options.sse_path ?? DEFAULT_SSE_PATH;
96
+ const { setup_test, capabilities, base_url, rpc_path, origin, logout_path = SPINE_ACCOUNT_LOGOUT_PATH, password_path = SPINE_ACCOUNT_PASSWORD_PATH } = options;
97
+ const sse_path = options.sse_path ?? SPINE_SSE_PATH;
99
98
  const max_per_scope = options.max_per_scope === undefined ? AUDIT_LOG_SSE_MAX_PER_SCOPE : options.max_per_scope;
100
99
  describe('cross-process sse', () => {
101
100
  test_if(capabilities.sse, 'connects and emits the connected comment', async () => {
@@ -41,6 +41,7 @@ import '../assert_dev_env.js';
41
41
  import type { SessionOptions } from '../../auth/session_cookie.js';
42
42
  import type { RoleSchemaResult } from '../../auth/role_schema.js';
43
43
  import type { AppSurfaceSpec } from '../../http/surface.js';
44
+ import { type RpcSuccessFixtures } from '../rpc_round_trip.js';
44
45
  import type { RpcEndpointsSuiteOption } from '../rpc_helpers.js';
45
46
  import type { BackendCapabilities } from './capabilities.js';
46
47
  import type { SetupTest, TestFixture } from './setup.js';
@@ -112,7 +113,23 @@ export interface StandardCrossProcessTestOptions {
112
113
  * schema on each backend — the success-shape parity check. See
113
114
  * `RpcRoundTripTestOptions.success_fixtures`.
114
115
  */
115
- rpc_success_fixtures?: Map<string, (fixture: TestFixture) => Promise<Record<string, unknown>>>;
116
+ rpc_success_fixtures?: RpcSuccessFixtures;
117
+ /**
118
+ * Forwarded to `describe_rpc_round_trip_tests` as `skip_methods` — the
119
+ * consumer escape hatch for a method the generic round-trip can't drive at
120
+ * all (a handler whose test wiring stubs out the deps it reaches, or reads
121
+ * tables the suite's database doesn't migrate). Each entry hides the
122
+ * method from both the crash check and the envelope check, so name the
123
+ * reason beside it.
124
+ */
125
+ rpc_skip_methods?: Array<string>;
126
+ /**
127
+ * Forwarded to `describe_rpc_round_trip_tests` as `input_overrides`
128
+ * (method name → params) — for a method whose generated params can't
129
+ * reach its handler cleanly. The response is held to the same rules as a
130
+ * generated one.
131
+ */
132
+ rpc_input_overrides?: Map<string, Record<string, unknown>>;
116
133
  /**
117
134
  * Forwarded to `describe_round_trip_validation` as `success_fixtures`
118
135
  * (`'METHOD /path'` → async `{url?, body?}` factory) for referential REST
@@ -1 +1 @@
1
- {"version":3,"file":"standard.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/standard.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAE9B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAM5D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzD;;;;;;GAMG;AACH,MAAM,WAAW,+BAA+B;IAC/C,2CAA2C;IAC3C,UAAU,EAAE,SAAS,CAAC;IACtB;;;OAGG;IACH,cAAc,EAAE,cAAc,CAAC;IAC/B;;;;OAIG;IACH,YAAY,EAAE,mBAAmB,CAAC;IAClC,uFAAuF;IACvF,eAAe,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;IACxC;;;;;OAKG;IACH,aAAa,EAAE,uBAAuB,CAAC;IACvC;;;OAGG;IACH,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;;;;OAMG;IACH,sBAAsB,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACvC;;;;OAIG;IACH,yBAAyB,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC1C;;;;;;;OAOG;IACH,oBAAoB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IAC/F;;;;OAIG;IACH,qBAAqB,CAAC,EAAE,GAAG,CAC1B,MAAM,EACN,CAAC,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CACnF,CAAC;CACF;AAED;;;;GAIG;AACH,eAAO,MAAM,qCAAqC,GACjD,SAAS,+BAA+B,KACtC,IAqCF,CAAC"}
1
+ {"version":3,"file":"standard.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/standard.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAE9B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAI5D,OAAO,EAAiC,KAAK,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE9F,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzD;;;;;;GAMG;AACH,MAAM,WAAW,+BAA+B;IAC/C,2CAA2C;IAC3C,UAAU,EAAE,SAAS,CAAC;IACtB;;;OAGG;IACH,cAAc,EAAE,cAAc,CAAC;IAC/B;;;;OAIG;IACH,YAAY,EAAE,mBAAmB,CAAC;IAClC,uFAAuF;IACvF,eAAe,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;IACxC;;;;;OAKG;IACH,aAAa,EAAE,uBAAuB,CAAC;IACvC;;;OAGG;IACH,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;;;;OAMG;IACH,sBAAsB,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACvC;;;;OAIG;IACH,yBAAyB,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC1C;;;;;;;OAOG;IACH,oBAAoB,CAAC,EAAE,kBAAkB,CAAC;IAC1C;;;;;;;OAOG;IACH,gBAAgB,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACjC;;;;;OAKG;IACH,mBAAmB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC3D;;;;OAIG;IACH,qBAAqB,CAAC,EAAE,GAAG,CAC1B,MAAM,EACN,CAAC,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CACnF,CAAC;CACF;AAED;;;;GAIG;AACH,eAAO,MAAM,qCAAqC,GACjD,SAAS,+BAA+B,KACtC,IAuCF,CAAC"}
@@ -29,6 +29,8 @@ export const describe_standard_cross_process_tests = (options) => {
29
29
  surface_source: options.surface_source,
30
30
  session_options: options.session_options,
31
31
  rpc_endpoints: options.rpc_endpoints,
32
+ skip_methods: options.rpc_skip_methods,
33
+ input_overrides: options.rpc_input_overrides,
32
34
  success_fixtures: options.rpc_success_fixtures
33
35
  });
34
36
  describe_data_exposure_tests({
@@ -8,6 +8,30 @@ export declare const SPACE_CELL_KIND = "space";
8
8
  * `"participant"` literal.
9
9
  */
10
10
  export declare const PARTICIPATION_ROLE = "participant";
11
+ /**
12
+ * A space `data.policy` mirroring the test ladder: gated `post` (moderated) +
13
+ * `react` (live) + `comment` (live), each on `PARTICIPATION_ROLE`. `comment`
14
+ * exists so a suite can create a comment under a post (`root_id !==
15
+ * parent_id`) and prove the policy resolves from the governing root (the
16
+ * space), not the immediate parent. Shared by the gated-create and moderate
17
+ * cross suites.
18
+ */
19
+ export declare const TEST_SPACE_POLICY: {
20
+ readonly policy: {
21
+ readonly post: {
22
+ readonly min_role: "participant";
23
+ readonly moderation_required: true;
24
+ };
25
+ readonly react: {
26
+ readonly min_role: "participant";
27
+ readonly moderation_required: false;
28
+ };
29
+ readonly comment: {
30
+ readonly min_role: "participant";
31
+ readonly moderation_required: false;
32
+ };
33
+ };
34
+ };
11
35
  /** A space's per-kind contribution rule (the shape stamped into `space.data.policy`). */
12
36
  export interface ContributionRule {
13
37
  min_role?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"test_cell_gated_create_authorize.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/test_cell_gated_create_authorize.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AA4B9B,OAAO,KAAK,EACX,mBAAmB,EAGnB,MAAM,4BAA4B,CAAC;AAGpC,8EAA8E;AAC9E,eAAO,MAAM,eAAe,UAAU,CAAC;AAEvC;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,gBAAyB,CAAC;AAEzD,yFAAyF;AACzF,MAAM,WAAW,gBAAgB;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAYD;;;;GAIG;AACH,eAAO,MAAM,gCAAgC,EAAE,mBAsB9C,CAAC"}
1
+ {"version":3,"file":"test_cell_gated_create_authorize.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/test_cell_gated_create_authorize.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AA4B9B,OAAO,KAAK,EACX,mBAAmB,EAGnB,MAAM,4BAA4B,CAAC;AAGpC,8EAA8E;AAC9E,eAAO,MAAM,eAAe,UAAU,CAAC;AAEvC;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,gBAAyB,CAAC;AAEzD;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;CAMpB,CAAC;AAEX,yFAAyF;AACzF,MAAM,WAAW,gBAAgB;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAYD;;;;GAIG;AACH,eAAO,MAAM,gCAAgC,EAAE,mBAsB9C,CAAC"}
@@ -33,6 +33,21 @@ export const SPACE_CELL_KIND = 'space';
33
33
  * `"participant"` literal.
34
34
  */
35
35
  export const PARTICIPATION_ROLE = SPINE_PARTICIPANT_ROLE;
36
+ /**
37
+ * A space `data.policy` mirroring the test ladder: gated `post` (moderated) +
38
+ * `react` (live) + `comment` (live), each on `PARTICIPATION_ROLE`. `comment`
39
+ * exists so a suite can create a comment under a post (`root_id !==
40
+ * parent_id`) and prove the policy resolves from the governing root (the
41
+ * space), not the immediate parent. Shared by the gated-create and moderate
42
+ * cross suites.
43
+ */
44
+ export const TEST_SPACE_POLICY = {
45
+ policy: {
46
+ post: { min_role: PARTICIPATION_ROLE, moderation_required: true },
47
+ react: { min_role: PARTICIPATION_ROLE, moderation_required: false },
48
+ comment: { min_role: PARTICIPATION_ROLE, moderation_required: false }
49
+ }
50
+ };
36
51
  /** Pull the governing root's `data.policy[kind]` rule, defensively (loose `data`). */
37
52
  const get_contribution_rule = (data, kind) => {
38
53
  if (data === null || typeof data !== 'object')
@@ -1,5 +1,6 @@
1
1
  import '../assert_dev_env.js';
2
2
  import type { RpcPathCrossSuiteOptions } from './setup.js';
3
+ import { type WsEndpointTarget } from './ws_endpoint.js';
3
4
  /** Options for the testing-backdoor negative-credential suite. */
4
5
  export interface TestingBackdoorCrossTestOptions extends RpcPathCrossSuiteOptions {
5
6
  /**
@@ -7,14 +8,7 @@ export interface TestingBackdoorCrossTestOptions extends RpcPathCrossSuiteOption
7
8
  * Pass it when the backend serves the `_testing_*` actions on its WS
8
9
  * endpoint too; omitted, those cases are skipped.
9
10
  */
10
- readonly ws?: {
11
- /** Base URL the backend is reachable at (e.g. `http://localhost:1178`). */
12
- readonly base_url: string;
13
- /** WebSocket endpoint path on the backend (e.g. `/api/ws`). */
14
- readonly ws_path: string;
15
- /** Origin for the upgrade. Defaults to `base_url`. */
16
- readonly origin?: string;
17
- };
11
+ readonly ws?: WsEndpointTarget;
18
12
  }
19
13
  export declare const describe_testing_backdoor_cross_tests: (options: TestingBackdoorCrossTestOptions) => void;
20
14
  //# sourceMappingURL=testing_backdoor.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"testing_backdoor.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/testing_backdoor.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AA4E9B,OAAO,KAAK,EAAE,wBAAwB,EAAe,MAAM,YAAY,CAAC;AAyFxE,kEAAkE;AAClE,MAAM,WAAW,+BAAgC,SAAQ,wBAAwB;IAChF;;;;OAIG;IACH,QAAQ,CAAC,EAAE,CAAC,EAAE;QACb,2EAA2E;QAC3E,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1B,+DAA+D;QAC/D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,sDAAsD;QACtD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC;CACF;AAED,eAAO,MAAM,qCAAqC,GACjD,SAAS,+BAA+B,KACtC,IAyEF,CAAC"}
1
+ {"version":3,"file":"testing_backdoor.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/testing_backdoor.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AA6E9B,OAAO,KAAK,EAAE,wBAAwB,EAAe,MAAM,YAAY,CAAC;AAExE,OAAO,EAAmB,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAwF1E,kEAAkE;AAClE,MAAM,WAAW,+BAAgC,SAAQ,wBAAwB;IAChF;;;;OAIG;IACH,QAAQ,CAAC,EAAE,CAAC,EAAE,gBAAgB,CAAC;CAC/B;AAED,eAAO,MAAM,qCAAqC,GACjD,SAAS,+BAA+B,KACtC,IAoEF,CAAC"}
@@ -18,9 +18,11 @@ import '../assert_dev_env.js';
18
18
  * each spec's `auth` axis. A test binary live-mounts them on its RPC
19
19
  * endpoint (and, on fuz_app's spine binary and the Rust stub, its WS
20
20
  * endpoint) but keeps them off the declared surface — so the spec-derived
21
- * `describe_rpc_attack_surface_tests` never enumerates them, and nothing
22
- * else fires them with a non-daemon credential to prove the gate holds
23
- * end-to-end. This suite does, against each impl's real auth resolution.
21
+ * `describe_rpc_attack_surface_tests` never enumerates them. This suite fires
22
+ * them with non-daemon credentials to prove the gate holds end-to-end, against
23
+ * each impl's real auth resolution; a conformance table given the live mount
24
+ * (`live_rpc_endpoints`) fires the same refusals through the auth rows
25
+ * `generate_rpc_auth_conformance_cases` generates for them.
24
26
  *
25
27
  * For every backdoor method, three principals:
26
28
  *
@@ -67,10 +69,10 @@ import { describe, test, assert } from 'vitest';
67
69
  import { ERROR_CREDENTIAL_TYPE_REQUIRED } from '../../http/error_schemas.js';
68
70
  import { JSONRPC_ERROR_CODES } from '../../http/jsonrpc_errors.js';
69
71
  import { rpc_call } from '../rpc_helpers.js';
70
- import { create_admitted_ws_transport } from '../transports/ws_transport.js';
71
72
  import { is_response_for } from '../transports/ws_client.js';
72
73
  import { test_if } from './capabilities.js';
73
74
  import { SPINE_RPC_PATH } from './spine_surface_constants.js';
75
+ import { open_session_ws } from './ws_endpoint.js';
74
76
  /** A well-formed UUID that never names a real row. */
75
77
  const NIL_UUID = '00000000-0000-0000-0000-000000000000';
76
78
  /**
@@ -171,12 +173,7 @@ export const describe_testing_backdoor_cross_tests = (options) => {
171
173
  for (const { method, params } of backdoor_methods) {
172
174
  test_if(ws !== undefined, `${method} over a session socket → forbidden ${ERROR_CREDENTIAL_TYPE_REQUIRED}`, async () => {
173
175
  const fixture = await setup_test();
174
- const client = await create_admitted_ws_transport({
175
- base_url: ws.base_url,
176
- ws_path: ws.ws_path,
177
- cookies: fixture.transport.cookies(),
178
- origin: ws.origin
179
- });
176
+ const client = await open_session_ws(ws, fixture, { admitted: true });
180
177
  try {
181
178
  const id = `backdoor_${method}`;
182
179
  await client.send({ jsonrpc: '2.0', id, method, params });
@@ -265,9 +265,12 @@ export declare const create_testing_drain_effects_action: (audit: AuditEmitter)
265
265
  * the put is on behalf of — recorded in `fact_holder` (deduplicated puts
266
266
  * included), as a real upload records its uploader, so the suites can drive
267
267
  * cell ref admission; absent, the put is a system put with no holder. The
268
- * referencing cell is seeded separately via the `cell_create` RPC. Embedded-only is enough for the
269
- * authz assertions (cell-scoped admit, cross-owner-no-leak, 404-mask, bare-hash
270
- * admin-only); external / X-Accel parity stays covered by the forge's own gate.
268
+ * referencing cell is seeded separately via the `cell_create` RPC. Embedded is
269
+ * enough for the authz assertions (cell-scoped admit, cross-owner-no-leak,
270
+ * 404-mask, bare-hash admin-only); external / X-Accel parity stays covered by
271
+ * the forge's own gate. `external_url`, when given, writes the row the way a
272
+ * writer past the store could — no bytes, that URL verbatim, unvalidated — so
273
+ * the suite can prove a serve refuses a URL that is not its hash's own address.
271
274
  *
272
275
  * `auth` gates on the daemon-token credential, matching `_testing_reset` — the
273
276
  * action does a direct `fact` insert the production wire never exposes. The
@@ -287,6 +290,7 @@ export declare const testing_put_fact_action_spec: {
287
290
  content: z.ZodString;
288
291
  content_type: z.ZodOptional<z.ZodString>;
289
292
  holder: z.ZodOptional<z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">>;
293
+ external_url: z.ZodOptional<z.ZodString>;
290
294
  }, z.core.$strict>;
291
295
  readonly output: z.ZodObject<{
292
296
  hash: z.ZodString & z.ZodType<import("@fuzdev/fuz_util/hash_schemas.js").FactHash, string, z.core.$ZodTypeInternals<import("@fuzdev/fuz_util/hash_schemas.js").FactHash, string>>;
@@ -628,8 +632,9 @@ export interface CreateTestingActionsOptions {
628
632
  * `db` rather than a separately-pooled connection — under the in-memory
629
633
  * drivers' single connection (pglet, PGlite) a second connection deadlocks against this still-open
630
634
  * transaction. `testing_zzz_server` clears in-memory workspace registry +
631
- * terminals + scoped-FS scratch (ignores `db`); `testing_spine_stub` has
632
- * no domain layer and omits the option. Runs inside the same RPC dispatch
635
+ * terminals + scoped-FS scratch (ignores `db`); the spine binaries
636
+ * (`testing/cross_backend/full_spine_mount.ts` and the Rust `testing_spine_stub`) empty
637
+ * the cell and fact tables. Runs inside the same RPC dispatch
633
638
  * as the auth-table writes, so a throw surfaces to the caller as a
634
639
  * JSON-RPC error and the per-test fixture short-circuits.
635
640
  */
@@ -1 +1 @@
1
- {"version":3,"file":"testing_reset_actions.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/testing_reset_actions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"testing_reset_actions.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/testing_reset_actions.ts"],"names":[],"mappings":"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"}
@@ -87,7 +87,7 @@ import { query_put_fact_holder } from '../../db/fact_holder_queries.js';
87
87
  import { ROLE_ADMIN, ROLE_KEEPER } from '../../auth/role_schema.js';
88
88
  import { query_schema_snapshot, SchemaSnapshot, query_migration_tracker, MigrationTracker } from '../schema_introspect.js';
89
89
  import { ActionManifest, build_action_manifest } from './action_manifest.js';
90
- import { query_create_actor } from '../../auth/account_queries.js';
90
+ import { create_test_extra_actor } from '../db_entities.js';
91
91
  import { create_test_account_with_credentials, mint_test_session } from '../app_server.js';
92
92
  import { DEFAULT_TEST_PASSWORD } from '../test_credentials.js';
93
93
  import { TESTING_ACTION_AUTH } from './spine_surface_constants.js';
@@ -267,9 +267,12 @@ export const create_testing_drain_effects_action = (audit) => rpc_action(testing
267
267
  * the put is on behalf of — recorded in `fact_holder` (deduplicated puts
268
268
  * included), as a real upload records its uploader, so the suites can drive
269
269
  * cell ref admission; absent, the put is a system put with no holder. The
270
- * referencing cell is seeded separately via the `cell_create` RPC. Embedded-only is enough for the
271
- * authz assertions (cell-scoped admit, cross-owner-no-leak, 404-mask, bare-hash
272
- * admin-only); external / X-Accel parity stays covered by the forge's own gate.
270
+ * referencing cell is seeded separately via the `cell_create` RPC. Embedded is
271
+ * enough for the authz assertions (cell-scoped admit, cross-owner-no-leak,
272
+ * 404-mask, bare-hash admin-only); external / X-Accel parity stays covered by
273
+ * the forge's own gate. `external_url`, when given, writes the row the way a
274
+ * writer past the store could — no bytes, that URL verbatim, unvalidated — so
275
+ * the suite can prove a serve refuses a URL that is not its hash's own address.
273
276
  *
274
277
  * `auth` gates on the daemon-token credential, matching `_testing_reset` — the
275
278
  * action does a direct `fact` insert the production wire never exposes. The
@@ -284,12 +287,14 @@ export const testing_put_fact_action_spec = {
284
287
  input: z.strictObject({
285
288
  content: z.string(),
286
289
  content_type: z.string().optional(),
287
- holder: Uuid.optional()
290
+ holder: Uuid.optional(),
291
+ external_url: z.string().optional()
288
292
  }),
289
293
  output: z.strictObject({ hash: FactHashSchema }),
290
294
  async: true,
291
- description: 'Test-binary only — seed an embedded fact (blake3 of the UTF-8 content) and return its hash, ' +
292
- 'so the cross-process fact-serving suite can store bytes without a DB handle.'
295
+ description: 'Test-binary only — seed a fact row for the blake3 of the UTF-8 content (embedded, or with ' +
296
+ 'external_url an external row naming that URL) and return its hash, so the cross-process ' +
297
+ 'fact-serving suite can store facts without a DB handle.'
293
298
  };
294
299
  /** The wire method of each notification `_testing_flood_notifications` queues. */
295
300
  export const TESTING_FLOOD_NOTIFICATION_METHOD = '_testing_flood';
@@ -677,10 +682,13 @@ export const create_testing_actions = (deps, options) => {
677
682
  // bypass as extra_accounts — no production wire path mints a
678
683
  // second actor, so the multi-actor `acting` branches need this
679
684
  // direct insert. Order-preserving so the fixture can address
680
- // them positionally.
685
+ // them positionally, and seeded at the wall clock so they sort
686
+ // after the keeper's bootstrap actor in insert order
687
+ // (`create_test_extra_actor`), as on the Rust spine
688
+ // (`query_create_actor_with_clock_timestamp`).
681
689
  const extra_actors = [];
682
690
  for (const name of input.extra_actors ?? []) {
683
- const seeded_actor = await query_create_actor({ db: ctx.db }, keeper.account.id, name);
691
+ const seeded_actor = await create_test_extra_actor(ctx.db, keeper.account.id, name);
684
692
  extra_actors.push({ id: seeded_actor.id, name: seeded_actor.name });
685
693
  }
686
694
  // 6. Refresh the daemon-token cache so subsequent daemon-token
@@ -696,7 +704,8 @@ export const create_testing_actions = (deps, options) => {
696
704
  daemon_token_state.keeper_account_id = keeper_account_id;
697
705
  });
698
706
  // 7. Fire domain-state reset (zzz workspaces/terminals/scratch,
699
- // fuz_forge cell/fact/file truncation, or no-op for spine_stub).
707
+ // fuz_forge cell/fact/file truncation, the spine binaries' cell +
708
+ // fact wipe).
700
709
  // Pass the transactional `ctx.db` so DB-domain truncation runs
701
710
  // on the same connection — a separate pool connection deadlocks
702
711
  // against this open transaction under the in-memory drivers.
@@ -719,8 +728,8 @@ export const create_testing_actions = (deps, options) => {
719
728
  const hash = fact_hash_bytes(bytes);
720
729
  await query_put_fact({ db: ctx.db }, {
721
730
  hash,
722
- bytes,
723
- external_url: null,
731
+ bytes: input.external_url === undefined ? bytes : null,
732
+ external_url: input.external_url ?? null,
724
733
  content_type: input.content_type ?? null,
725
734
  size: bytes.length
726
735
  });
@@ -72,7 +72,7 @@ export const create_bun_testing_adapter = () => {
72
72
  // hang), and the client runtime — a single server-closed WS is
73
73
  // necessary and sufficient. Client-initiated close or leaving the
74
74
  // socket open both stop cleanly in ~0ms. In this suite the trigger is
75
- // any server-initiated WS close — a revocation's (the `ws.cross.test.ts`
75
+ // any server-initiated WS close — a revocation's (the WS round-trip suite's
76
76
  // close-on-revoke cases), a cap eviction's, an oversized message's —
77
77
  // which is why teardown hangs after those and not under HTTP-only or
78
78
  // client-closed WS traffic.
@@ -37,7 +37,7 @@ import '../assert_dev_env.js';
37
37
  */
38
38
  import { describe, test, assert } from 'vitest';
39
39
  import { account_token_create_action_spec, account_token_list_action_spec, API_TOKEN_NAME_LENGTH_MAX, TokenCreateOutput, TokenListOutput } from '../../auth/account_action_specs.js';
40
- import { cross_rpc_call, error_reason, expect_output } from './cell_cross_helpers.js';
40
+ import { cross_rpc_call, error_reason, expect_output } from './cross_rpc.js';
41
41
  import { assert_iso8601_seconds } from './wire_shapes.js';
42
42
  import { SPINE_RPC_PATH } from './spine_surface_constants.js';
43
43
  /** TTL used by the bounded-mint case. */
@@ -1 +1 @@
1
- {"version":3,"file":"token_scope_surface.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/token_scope_surface.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAgF9B,OAAO,KAAK,EAAE,uCAAuC,EAAE,MAAM,YAAY,CAAC;AAqB1E,wDAAwD;AACxD,MAAM,WAAW,iCAAkC,SAAQ,uCAAuC;IACjG,6DAA6D;IAC7D,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC3B;AA6DD,eAAO,MAAM,wCAAwC,GACpD,SAAS,iCAAiC,KACxC,IA+JF,CAAC"}
1
+ {"version":3,"file":"token_scope_surface.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/token_scope_surface.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAgF9B,OAAO,KAAK,EAAE,uCAAuC,EAAE,MAAM,YAAY,CAAC;AAmB1E,wDAAwD;AACxD,MAAM,WAAW,iCAAkC,SAAQ,uCAAuC;IACjG,6DAA6D;IAC7D,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC3B;AA6DD,eAAO,MAAM,wCAAwC,GACpD,SAAS,iCAAiC,KACxC,IAqKF,CAAC"}
@@ -70,13 +70,9 @@ import '../assert_dev_env.js';
70
70
  import { describe, assert } from 'vitest';
71
71
  import { ERROR_CREDENTIAL_TYPE_REQUIRED, ERROR_TOKEN_SCOPE_REQUIRED } from '../../http/error_schemas.js';
72
72
  import { test_if } from './capabilities.js';
73
- import { cross_rpc_call } from './cell_cross_helpers.js';
73
+ import { cross_rpc_call } from './cross_rpc.js';
74
74
  import { mint_narrowed_api_token } from './narrowed_api_token.js';
75
- import { SPINE_RPC_PATH } from './spine_surface_constants.js';
76
- /** Default audit-log SSE path — the `audit_stream` surface. */
77
- const DEFAULT_SSE_PATH = '/api/admin/audit/stream';
78
- /** The account status read, which answers a narrowed token as anonymous. */
79
- const STATUS_PATH = '/api/account/status';
75
+ import { SPINE_ACCOUNT_STATUS_PATH, SPINE_RPC_PATH, SPINE_SSE_PATH } from './spine_surface_constants.js';
80
76
  /**
81
77
  * A well-formed hash that no fact has. The scope gate is a pre-authorization
82
78
  * guard, so it fires before the handler ever looks the hash up — but *params*
@@ -127,7 +123,7 @@ const assert_channel_denied = async (fresh_transport, path, token, credential_ty
127
123
  export const describe_token_scope_surface_cross_tests = (options) => {
128
124
  const { setup_test, capabilities } = options;
129
125
  const rpc_path = options.rpc_path ?? SPINE_RPC_PATH;
130
- const sse_path = options.sse_path ?? DEFAULT_SSE_PATH;
126
+ const sse_path = options.sse_path ?? SPINE_SSE_PATH;
131
127
  describe('token scope non-RPC surface parity', () => {
132
128
  /**
133
129
  * The non-vacuity control for every denial below: a narrowed token is
@@ -155,7 +151,7 @@ export const describe_token_scope_surface_cross_tests = (options) => {
155
151
  });
156
152
  await assert_channel_denied(fixture.fresh_transport, sse_path, token, ['session']);
157
153
  });
158
- test_if(capabilities.fact_serving, 'a narrowed token is refused the bare-hash fact read (surface:fact_bare)', async () => {
154
+ test_if(capabilities.fact_serving_admin_hash, 'a narrowed token is refused the bare-hash fact read (surface:fact_bare)', async () => {
159
155
  const fixture = await setup_test();
160
156
  const token = await mint_narrowed_api_token({
161
157
  app: fixture.transport,
@@ -173,7 +169,7 @@ export const describe_token_scope_surface_cross_tests = (options) => {
173
169
  * scope denial satisfies the property, so the assertion is on what the
174
170
  * response must *not* be.
175
171
  */
176
- test_if(capabilities.fact_serving, 'a full token is not refused by the scope gate on the same route', async () => {
172
+ test_if(capabilities.fact_serving_admin_hash, 'a full token is not refused by the scope gate on the same route', async () => {
177
173
  const fixture = await setup_test();
178
174
  const res = await fixture.fresh_transport({ origin: null })(`/api/facts/${ABSENT_FACT_HASH}`, { headers: fixture.create_bearer_headers() });
179
175
  const body = (await res.json().catch(() => undefined));
@@ -193,14 +189,14 @@ export const describe_token_scope_surface_cross_tests = (options) => {
193
189
  session_headers: fixture.create_session_headers(),
194
190
  methods: [ADMITTED_METHOD]
195
191
  });
196
- const anonymous = await fixture.fresh_transport({ origin: null })(STATUS_PATH, {});
197
- const narrowed = await fixture.fresh_transport({ origin: null })(STATUS_PATH, {
192
+ const anonymous = await fixture.fresh_transport({ origin: null })(SPINE_ACCOUNT_STATUS_PATH, {});
193
+ const narrowed = await fixture.fresh_transport({ origin: null })(SPINE_ACCOUNT_STATUS_PATH, {
198
194
  headers: { authorization: `Bearer ${token}` }
199
195
  });
200
196
  assert.strictEqual(anonymous.status, 401, 'anonymous status must be 401');
201
197
  assert.strictEqual(narrowed.status, 401, 'a narrowed token must read status as anonymous');
202
198
  assert.strictEqual(await narrowed.text(), await anonymous.text(), 'the narrowed answer must be the anonymous one, byte for byte');
203
- const full = await fixture.fresh_transport({ origin: null })(STATUS_PATH, {
199
+ const full = await fixture.fresh_transport({ origin: null })(SPINE_ACCOUNT_STATUS_PATH, {
204
200
  headers: fixture.create_bearer_headers()
205
201
  });
206
202
  assert.strictEqual(full.status, 200, 'a full-scope bearer must read the account');
@@ -218,7 +214,7 @@ export const describe_token_scope_surface_cross_tests = (options) => {
218
214
  * *holds* the role — so both orderings look identical there, which is
219
215
  * exactly why this divergence survived as long as it did.
220
216
  */
221
- test_if(capabilities.fact_serving, 'scope outranks role — a narrowed token lacking the role hears about its scope', async () => {
217
+ test_if(capabilities.fact_serving_admin_hash, 'scope outranks role — a narrowed token lacking the role hears about its scope', async () => {
222
218
  const fixture = await setup_test();
223
219
  const non_admin = await fixture.create_account({ username: 'scope_before_role' });
224
220
  const token = await mint_narrowed_api_token({
@@ -1,10 +1,10 @@
1
1
  import '../assert_dev_env.js';
2
2
  import { type BackendCapabilities } from './capabilities.js';
3
- import type { RpcPathCapabilityGatedCrossSuiteOptions } from './setup.js';
3
+ import type { RpcPathCapabilityGatedCrossSuiteOptions, SetupTest } from './setup.js';
4
4
  /** A transport's front door, as the table's rows name it. */
5
5
  export type TransportCompositionSurface = 'rest_post' | 'rest_password' | 'rpc_post' | 'rpc_get' | 'ws_upgrade' | 'sse';
6
6
  /** What a probe sends, as the table's columns name it. */
7
- export type TransportCompositionProbe = 'foreign_origin' | 'unreadable_origin' | 'duplicated_origin' | 'over_cap_foreign_origin' | 'no_credential' | 'narrowed_token';
7
+ export type TransportCompositionProbe = 'foreign_origin' | 'unreadable_origin' | 'duplicated_origin' | 'over_cap_foreign_origin' | 'no_credential' | 'narrowed_token' | 'multi_actor_no_acting';
8
8
  /** The refusal a case expects. */
9
9
  export interface TransportCompositionExpect {
10
10
  readonly status: number;
@@ -25,6 +25,21 @@ export interface TransportCompositionCase {
25
25
  }
26
26
  /** The front-door table — one case per cell of the module doc's matrix. */
27
27
  export declare const transport_composition_cases: ReadonlyArray<TransportCompositionCase>;
28
+ /**
29
+ * The rows that need a multi-actor keeper — run only given
30
+ * `TransportCompositionCrossTestOptions.multi_actor`, on its fixture.
31
+ */
32
+ export declare const transport_composition_multi_actor_cases: ReadonlyArray<TransportCompositionCase>;
33
+ /** The multi-actor rows' fixture, and how a backend known to diverge runs them. */
34
+ export interface TransportCompositionMultiActorOptions {
35
+ /** Per-test fixture whose keeper is seeded with at least one `extra_actors` entry. */
36
+ readonly setup_test: SetupTest;
37
+ /** Run the multi-actor rows as `xfail_until` — for a backend known to admit them. */
38
+ readonly xfail?: {
39
+ readonly tracking_id: string;
40
+ readonly reason: string;
41
+ };
42
+ }
28
43
  /** Options for `describe_transport_composition_cross_tests`. */
29
44
  export interface TransportCompositionCrossTestOptions extends RpcPathCapabilityGatedCrossSuiteOptions {
30
45
  /**
@@ -47,6 +62,15 @@ export interface TransportCompositionCrossTestOptions extends RpcPathCapabilityG
47
62
  readonly ws_path?: string;
48
63
  /** Audit-log SSE path. Default `/api/admin/audit/stream`. */
49
64
  readonly sse_path?: string;
65
+ /** Run the multi-actor rows (`transport_composition_multi_actor_cases`). */
66
+ readonly multi_actor?: TransportCompositionMultiActorOptions;
67
+ /**
68
+ * The backend's request-body cap on `rpc_path`, in bytes; the RPC row's
69
+ * over-cap probe declares a length one past it. Default
70
+ * `SPINE_BODY_LIMIT_DEFAULT_BYTES`. The REST rows probe past that default,
71
+ * the cap a backend keeps off its RPC path.
72
+ */
73
+ readonly rpc_max_body_bytes?: number;
50
74
  }
51
75
  /**
52
76
  * Register the front-door table's cases — one test per cell, each on a fresh
@@ -1 +1 @@
1
- {"version":3,"file":"transport_composition.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/transport_composition.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AA+E9B,OAAO,EAAW,KAAK,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAEtE,OAAO,KAAK,EAAE,uCAAuC,EAAe,MAAM,YAAY,CAAC;AAGvF,6DAA6D;AAC7D,MAAM,MAAM,2BAA2B,GACtC,WAAW,GAAG,eAAe,GAAG,UAAU,GAAG,SAAS,GAAG,YAAY,GAAG,KAAK,CAAC;AAE/E,0DAA0D;AAC1D,MAAM,MAAM,yBAAyB,GAClC,gBAAgB,GAChB,mBAAmB,GACnB,mBAAmB,GACnB,yBAAyB,GACzB,eAAe,GACf,gBAAgB,CAAC;AAEpB,kCAAkC;AAClC,MAAM,WAAW,0BAA0B;IAC1C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,2FAA2F;IAC3F,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,gEAAgE;IAChE,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACpD,8FAA8F;IAC9F,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,wCAAwC;AACxC,MAAM,WAAW,wBAAwB;IACxC,QAAQ,CAAC,OAAO,EAAE,2BAA2B,CAAC;IAC9C,QAAQ,CAAC,KAAK,EAAE,yBAAyB,CAAC;IAC1C,QAAQ,CAAC,MAAM,EAAE,0BAA0B,CAAC;IAC5C,gFAAgF;IAChF,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,mBAAmB,CAAC;CAC1C;AAsCD,2EAA2E;AAC3E,eAAO,MAAM,2BAA2B,EAAE,aAAa,CAAC,wBAAwB,CA4C/E,CAAC;AAEF,gEAAgE;AAChE,MAAM,WAAW,oCAAqC,SAAQ,uCAAuC;IACpG;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC;;;;OAIG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,yFAAyF;IACzF,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,yFAAyF;IACzF,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,kDAAkD;IAClD,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,6DAA6D;IAC7D,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC3B;AAwFD;;;;;;;GAOG;AACH,eAAO,MAAM,0CAA0C,GACtD,SAAS,oCAAoC,KAC3C,IA2KF,CAAC"}
1
+ {"version":3,"file":"transport_composition.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/transport_composition.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAgG9B,OAAO,EAAW,KAAK,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAEtE,OAAO,KAAK,EAAE,uCAAuC,EAAE,SAAS,EAAe,MAAM,YAAY,CAAC;AAWlG,6DAA6D;AAC7D,MAAM,MAAM,2BAA2B,GACtC,WAAW,GAAG,eAAe,GAAG,UAAU,GAAG,SAAS,GAAG,YAAY,GAAG,KAAK,CAAC;AAE/E,0DAA0D;AAC1D,MAAM,MAAM,yBAAyB,GAClC,gBAAgB,GAChB,mBAAmB,GACnB,mBAAmB,GACnB,yBAAyB,GACzB,eAAe,GACf,gBAAgB,GAChB,uBAAuB,CAAC;AAE3B,kCAAkC;AAClC,MAAM,WAAW,0BAA0B;IAC1C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,2FAA2F;IAC3F,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,gEAAgE;IAChE,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACpD,8FAA8F;IAC9F,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,wCAAwC;AACxC,MAAM,WAAW,wBAAwB;IACxC,QAAQ,CAAC,OAAO,EAAE,2BAA2B,CAAC;IAC9C,QAAQ,CAAC,KAAK,EAAE,yBAAyB,CAAC;IAC1C,QAAQ,CAAC,MAAM,EAAE,0BAA0B,CAAC;IAC5C,gFAAgF;IAChF,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,mBAAmB,CAAC;CAC1C;AAsCD,2EAA2E;AAC3E,eAAO,MAAM,2BAA2B,EAAE,aAAa,CAAC,wBAAwB,CA4C/E,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,uCAAuC,EAAE,aAAa,CAAC,wBAAwB,CAO3F,CAAC;AAEF,mFAAmF;AACnF,MAAM,WAAW,qCAAqC;IACrD,sFAAsF;IACtF,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC;IAC/B,qFAAqF;IACrF,QAAQ,CAAC,KAAK,CAAC,EAAE;QAAE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3E;AAED,gEAAgE;AAChE,MAAM,WAAW,oCAAqC,SAAQ,uCAAuC;IACpG;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC;;;;OAIG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,yFAAyF;IACzF,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,yFAAyF;IACzF,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,kDAAkD;IAClD,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,6DAA6D;IAC7D,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,4EAA4E;IAC5E,QAAQ,CAAC,WAAW,CAAC,EAAE,qCAAqC,CAAC;IAC7D;;;;;OAKG;IACH,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CACrC;AAqED;;;;;;;GAOG;AACH,eAAO,MAAM,0CAA0C,GACtD,SAAS,oCAAoC,KAC3C,IAiMF,CAAC"}