There are actually three limits on player input length:
Constant INPUT_BUFFER_LEN = 260; ! No extra byte necessary
Constant MAX_BUFFER_WORDS = 20;
Constant PARSE_BUFFER_LEN = 61;
The second of these is only invoked in one place, in VM_Tokenise:
if (numwords >= MAX_BUFFER_WORDS) break;
So it’s a limitation of the tokenizer, not of the input-reading routine itself, which makes sense: all the input has to be read from the keyboard before the concept of “words” is relevant at all.
VM_Tokenise is called at the end of VM_ReadKeyboard, the actual input-fetching routine. So in theory it shouldn’t be too hard to make a copy of that routine that doesn’t call the tokenizer, just returns a buffer with the raw text data in it.
The difficulty then is getting it into a format you, the author, can use. The right way to do this would involve TEXT_TY_CastPrimitive, but I’ve never fully understood the block-value system. The easier way is what Eric Eve’s Text Capture extension does: define a routine that prints the buffer, call that routine inside a string ("[my buffer-printing routine]"), and let Inform handle the messy bits.
The end result would be a phrase like “request a raw line of text” that you could call within Inform 7, and then a phrase “say the/-- raw captured text” to access the results. Does that sound like what you’d want? If so I can poke at this later today, it shouldn’t take too long.