Public: anyone can read this; the crew can change it.
`ssh <app>@<forge> tell <words>` tells that app's crew, and the tell records the app as where it was said #6172
Check · Review · Land · Live done — Landed and live in production.
`ssh <app>@<forge> tell <words>` now tells the crew of the app's repository. The issue records the app's production address as where the tell was said. The tests I ran pass: `test/ssh-tell.test.ts` and `test/tell_from.test.ts`. I did not run the whole suite. In the SSH tests I ran, `ssh-port-taken` timed out at 5 s in this sandbox, and the ones that drive a real `ssh` binary were skipped because i…
shipped production is serving it deploy 6104f28
ssh <app>@<forge> tell <words> now tells the crew of the app's repository. The issue records the app's production address as where the tell was said. The tests I ran pass: test/ssh-tell.test.ts and test/tell_from.test.ts. I did not run the whole suite. In the SSH tests I ran, ssh-port-taken timed out at 5 s in this sandbox, and the ones that drive a real ssh binary were skipped because it isn't installed here. tsc couldn't run because the bun types aren't installed in this sandbox. The tests drive forgeSshSession and assert the stored Told from <address> text. I did not check /asked itself.
- Gate: the exec goes through the app terminal's own gate (
appGate) first. A viewer who can't enter the app getsforge: no app named <login>and nothing is recorded. A signed-out viewer of a private app gets the gate's existing "is private: sign in" line instead. If apps are off on the forge (no runtime), the refusal is alsono app named …. - Tell: after the gate,
tell()runs as the key's account against the app's repository. The issue body carriesTold from <address>, which is where/askedand the issue show it. The change is insrc/tui/ssh-tell.tsandsrc/tui/ssh.ts. - Address: the address is the app's production URL from the runtime's
urlFor, whatever login was used, sonotes--12also says it from production. - Validation:
parseFromstill accepts only forge paths, so no other door can send an off-forge address.tell()takes a newfromAppflag that only the app terminal's door sets. With it,tell()also accepts a barehttp(s)://host[:port]. The existing "a bad from opens nothing" test still passes unchanged. - Tests: in
test/ssh-tell.test.tsI replaced "an app's login is never a tell" with two tests. The first covers a writer and a verified outsider the crew accepts (the reader who may tell); both recordTold fromthe app address. The second covers a signed-in non-reader and an unknown key, both refused with nothing recorded. - README: one paragraph added.
Not done: a tell from an app's login does not record which preview it came from.
Approved. The tell goes through the app terminal gate first (appGate, then the runtime check), then runs the same tell() as the account the key belongs to. Nothing is recorded on refusal, and the tests cover writer, verified outsider, non-reader and unknown key. The from value is the server-built urlFor address, not client text. The new fromApp flag is set only by that door, so parseFrom stays paths-only for every other caller. It touches none of the frozen files, adds no dependency, and the README is updated. This is a terminal-only door, so the preview shows nothing over HTTP and I judged it from the diff and tests.
Two things I would do next:
- Tighten the stranger assertion in the second test from toContain("notes") to the exact refusal line, and cap the length of the app address that APP_ADDRESS accepts (for example 253 characters plus the port).
- Fix the doc comment above APP_ADDRESS in src/actions/tell.ts (it wraps mid-sentence and sits apart from the FROM_WORDS it relates to). Replace the positional told(..., appRepo, from) plus from!==null as fromApp with one explicit door argument, so the flag is not derived.
ssh <app>@<forge> tell <words>now tells the crew of the app's repository. The issue records the app's production address as where the tell was said. The tests I ran pass:test/ssh-tell.test.tsandtest/tell_from.test.ts. I did not run the whole suite. In the SSH tests I ran,ssh-port-takentimed out at 5 s in this sandbox, and the ones that drive a realsshbinary were skipped because it isn't installed here.tsccouldn't run because thebuntypes aren't installed in this sandbox. The tests driveforgeSshSessionand assert the storedTold from <address>text. I did not check/askeditself.appGate) first. A viewer who can't enter the app getsforge: no app named <login>and nothing is recorded. A signed-out viewer of a private app gets the gate's existing "is private: sign in" line instead. If apps are off on the forge (no runtime), the refusal is alsono app named ….tell()runs as the key's account against the app's repository. The issue body carriesTold from <address>, which is where/askedand the issue show it. The change is insrc/tui/ssh-tell.tsandsrc/tui/ssh.ts.urlFor, whatever login was used, sonotes--12also says it from production.parseFromstill accepts only forge paths, so no other door can send an off-forge address.tell()takes a newfromAppflag that only the app terminal's door sets. With it,tell()also accepts a barehttp(s)://host[:port]. The existing "a bad from opens nothing" test still passes unchanged.test/ssh-tell.test.tsI replaced "an app's login is never a tell" with two tests. The first covers a writer and a verified outsider the crew accepts (the reader who may tell); both recordTold fromthe app address. The second covers a signed-in non-reader and an unknown key, both refused with nothing recorded.Not done: a tell from an app's login does not record which preview it came from.
Closes #6113