refactor(contracts): move telephony input parsing out of device-rotation
Summary
Moves the telephony input parsing out of packages/contracts/src/device-rotation.ts into a new packages/contracts/src/telephony-input.ts. That covers TELEPHONY_ACTIONS, TELEPHONY_CALL_ACTIONS, TELEPHONY_USAGE, TelephonyEventInput, and the parsers parseTelephonyEventInput, parseTelephonyPositionals, and telephonyPositionals.
#3724 put this code in device-rotation.ts because a new module would have grown the CLI and session-journal eager closures past scripts/__tests__/eager-closure-budgets.ts. That was true while the code was new. Now that it is on main, the move is a pure split, and the split tolerance in closure-growth-rule.ts accepts it: the closure gains one new module, and the statement weight stays flat. The comment explaining the old placement is removed.
7 files touched. @agent-device/contracts/device exports the same names, so no callers outside contracts change. device-rotation-telephony.test.ts is renamed to telephony-input.test.ts. There is no behavior change.
Validation
Tested SHA 98be21d (same tree as head 959bd6a, which only changes the author).
pnpm check:affected --run --head HEAD: format, lint, typecheck, layering, fallow, and build passed. vitest-related ran 5,239 tests with 3 failures:
app-log-session-resource.test.ts› unwritable tombstone plus rejecting cleanup blocks same-process replacementdaemon-session-idle-expiry.test.ts› a held-back settle leaves a repair transaction uncommitted…daemon-session-idle-expiry.test.ts› a settle that cannot confirm the claim gone keeps the session record standing
The same 3 fail on base eef1a3f in the same container, which runs as root. eager-closure-budgets.test.ts passed. No device run, because no dispatch, capture, interaction, or console code changed.