summaryrefslogtreecommitdiff
path: root/src/ninep
Commit message (Collapse)AuthorAge
* /index shows names as the log does, one line of UTF-8, and a newline in a ↵Gabriel Schneider4 days
| | | | | | | | | | | | name as \n /index printed a name as it was, so a directory with a newline in it split its row in two, and bytes not UTF-8 went through; the log turned the newline into a space, silently another name. Both now show a name one way: a newline `\n`, other controls, DEL and C1 a space, bytes not UTF-8 `\xNN`. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Every EINVAL a write gets says why; DEL in an exec or look line is a control ↵Gabriel Schneider4 days
| | | | | | | | | | | | character An empty name, a word written to log other than follow, a data, sel, dot or dirty write to a pane with no text, a truncate other than to zero, and a control character in a look line written through a held open were refused with no words, logged as `Invalid argument`. Each says its reason now; and DEL is refused in exec and look lines as in names. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* pty/ctl exec fails the write when the shell cannot start; a directory ↵Gabriel Schneider4 days
| | | | | | | | | | | | | removed under a shell leaves its name `exec` on pty/ctl restarted a shell in a directory that was gone, the write succeeding and the pane dead; and the pane was then renamed `<dir> (deleted)` from /proc, so a restart failed even once the directory was back. `exec` is now refused up front, ENOENT, where the directory is gone; a shell the host cannot start fails the waiting write (late failure, as a Save's); and a `(deleted)` cwd is no name to take. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A pane's word written to /tagexec or a column's exec is refused, not done at ↵Gabriel Schneider4 days
| | | | | | | | | | | the focused pane Undo, Msg and the other pane words written to a tag no pane owns ran at whichever pane had the keyboard. They are refused as the root's ctl refuses them, EINVAL; the tag's own words (a column's New, Tty, Find, Grep) still run. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A command from a missing directory fails ENOENT with no pane; one whose ↵Gabriel Schneider4 days
| | | | | | | | | | | | | shell never started ends exit 127 Exec made a command pane in a directory that was not there, whose shell never started: it said running for ever, a follower waited for an exit that never came, and Kill found it. The line now fails up front, as Tty does, `exec: <dir>: no such directory`; and a command pane whose shell the host could not start ends `exit 127` at once. A shell that could not start in its directory says `directory missing`, not `file not found`. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A shell given a directory is not taken to be in this process's before it has ↵Gabriel Schneider4 days
| | | | | | | | | | | | | spoken, so it logs no rename to the session's and back Each host read /proc/<pid>/cwd right after forking the shell and at every frame after; before the shell's chdir that says this process's directory, a rename to it, then the real one a frame later, a rename back. A shell given a directory is named by it already (newShell) and is no longer asked at fork; and until it has printed anything, an answer naming this process's directory is not taken. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A terminal is typed into only when idle at an empty promptGabriel Schneider4 days
| | | | | | | | | A look at a directory, or an exec at a terminal, typed its line after whatever sat unsent at the prompt and ran the two joined (`echo TYPEDls`). A terminal with text at its prompt now takes no line; a look at its directory opens a new terminal, an exec runs as a command pane. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Grep and Find count the rows they found, so a hit opens its +Search and a ↵Gabriel Schneider4 days
| | | | | | | | | | | | miss fails Round 18 made a search that found nothing fail, but grep and find never counted their rows (only a pane search did), so every Grep read as a miss. Both count the lines they wrote now; a Find or Grep that finds nothing fails alike, `find: no match, not found` / `grep: ...`, ENOENT, and opens no empty +Search. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A new terminal is named by its directory from the start, so its shell ↵Gabriel Schneider4 days
| | | | | | | | | | arriving there is no rename Tty's terminal was `new N /` until its shell reported its directory, then `rename N <dir>`: a rename for no change of place. The pane owns the directory it is started in from the first; only a move elsewhere renames. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A builtin failure over something not there answers ENOENT: Unmount of a name ↵Gabriel Schneider4 days
| | | | | | | | | | not mounted `Unmount nothere` failed EIO with `not mounted`. It says `no such mount nothere` now, and a builtin's failure that says `no such` (this, Tty's `no such directory`) answers ENOENT, the errno 9ns reads from those words. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Grep with no hit says grep: no match, and a pane directory that is not there ↵Gabriel Schneider4 days
| | | | | | | | | | | is passed over Grep walks every pane's directory; one not there (a scratch named into a directory not made yet) failed the whole search with `file not found`. Such a root is passed over now, and a search that finds nothing says `grep: no match` and opens no empty +Search. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A builtin that needs its argument, written bare to an exec, is EINVAL as ↵Gabriel Schneider4 days
| | | | | | | | | | through ctl Through a ctl the bare word was refused up front (EINVAL); through exec it ran, failed with EIO or asked for the argument. The exec now refuses it the same way before it runs. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* get on a pane of a peer out of reach says dial failed, as look and Save doGabriel Schneider4 days
| | | | | | | | get's failure named the path and `cannot be read` for any error but a missing file; a peer that did not answer now reads `get: <path>: dial failed: no answer`. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A column ctl write reads back what it touched aloneGabriel Schneider4 days
| | | | | | | writeCtl never cleared what the last write touched before its lines ran, so `New` through col/<n>/ctl read back the earlier write's serial too. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A name write is one name, refused with its reason otherwise; a log record is ↵Gabriel Schneider4 days
| | | | | | | | | | | | | one line of UTF-8 A name took a second line, DEL, a C1 control or bytes that are not UTF-8, which then went into /index and /log as they were and split or garbled a reader's lines. `name` strips one trailing newline and refuses the rest, saying which (`bad character in file name: not UTF-8`); and the log turns DEL and C1 into spaces, as it did control characters, and escapes bytes that are not UTF-8 as `\xNN`. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A rename alone does not make a pane dirtyGabriel Schneider4 days
| | | | | | | | | Any rename marked the pane dirty (saved revision one back), while the guards ask only whether its text was ever edited: /index said dirty for a pane Exit let go without asking. The name is no edit now, so /index, the guards and Restore agree; Save writes under the new name all the same. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The root exec's refusals before a line runs name the pane, and say invalid, ↵Gabriel Schneider4 days
| | | | | | | | | | | so a mount reads EINVAL A line over 1024 bytes or with a control character was refused with its errno EINVAL but words 9ns reads as EIO (no `invalid` in them), and logged `err - exec`. They now say `invalid command line: ...`, and the root's err record names the pane the line would have run at. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* `@p<terminal>:N` past the terminal's last line is a miss, as in a fileGabriel Schneider4 days
| | | | | | | | The line-past-end check read only a file pane's lines, so a terminal's look went nowhere and said nothing. A terminal's lines are its logical lines, as a +Search of it lists them. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Tty in a missing directory fails and makes no pane; a shell that never ↵Gabriel Schneider4 days
| | | | | | | | | | | | | started answers runs The host could not start the shell (its chdir failed), and the pane stayed with no pty: a run written to it waited for a prompt for ever. Tty now refuses a directory that is not there, `Tty: <dir>: no such directory`, before making a pane; and a terminal whose shell the host could not start (Pardes.shellFailed, from each host's spawn) answers any run with `error shell gone`. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A Save refused for want of a name counts as a failure, so its announcement goesGabriel Schneider4 days
| | | | | | | | A builtin that would open a prompt nobody can answer (Save with no name on a scratch, through a ctl write) failed the write without saying a failure, so the announcement rule missed it and `msg N Save` stayed. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A name written with a blank at either end is refused, not quietly trimmedGabriel Schneider4 days
| | | | | | | | | | `name` trimmed blanks off both ends, so `trailing.zig ` named another file than the one written without a word. acme refuses any blank in a name, `bad character in file name` (xfid.c:650); pardes takes one inside (it names files with spaces) and now refuses one at an end, and a control character, in acme's words. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A root exec or look that fails logs its err against the pane it ran atGabriel Schneider4 days
| | | | | | | | `err - exec: ...` said nothing of where the line ran; the root's exec and look run at the keyboard's pane, and their err now names it, as a click there would. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Mount dials its peer at once and fails if none answers; a peer out of reach ↵Gabriel Schneider4 days
| | | | | | | | | | | | | is said as `dial failed: <reason>` Mount took any well-formed dial and nothing was found out until the first look through it, which then said `look: look: dial`. Mount now probes the peer (version, attach, its root) with the turn out, and fails its write, mounting nothing, when none answers; the dial errors read as words, `no answer`, `timed out`, `hung up`, and a look through a peer gone since names its path: `look: /n/peer/f: dial failed: no answer`. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* New from a column's exec makes its scratch in the session's directory, as ↵Gabriel Schneider4 days
| | | | | | | | | tagexec's does A word run from a header runs in the session's directory (execDir), but New named its scratch after the pane with the keyboard. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A look that goes to another pane leaves the looking pane's dot aloneGabriel Schneider4 days
| | | | | | | | | | Every look that found something cleared the looker's selection first, so `@p5:2` or `f.txt:2` written to a pane's look collapsed its dot to q1-1. Only a look that stays in the pane starts from a clean selection now; one that goes elsewhere takes away just the click's highlight, and a miss changes nothing, as acme's look does. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* An event record never carries flag 2, as no expansion record follows; flag 1 ↵Gabriel Schneider4 days
| | | | | | | | | | | | reads the first word In acme flag 2 promises a second record with the expanded range, and acme's libraries read one. F records set it always and a click with no range known set it, with none following: a library then took the next event for it. Records here carry the word already, so 2 is never set. Flag 1 now reads the first word as acme's lookup does, so `Msg hi` is 1. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* An empty match at a search's start is passed over, as sam's nextmatch doesGabriel Schneider4 days
| | | | | | | | | Repeated `/^/` from #3 stayed at #3: the search found the empty match where it started and called that the next one. sam (editors/sam/ address.c:97-119) searches again a character on, or back, wrapping; so does addr now, and `/$/` and `/x*/` step as they should. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* `size` is refused only when the panes' own minima do not fit, so it is monotonicGabriel Schneider4 days
| | | | | | | | | | | | The check read how the weights shared the rows after the resize, not whether the rows could hold every pane's tag and two rows: a pane the proportional squeeze took short made `size` refuse, growing included, and refuse sizes it took a moment before. It now asks layout.minRows, the minimum placement asks, per column; a size they fit is taken, and a pane the resize took under its minimum gets its rows back. An out of range size says `invalid size`, which 9ns reads as EINVAL, as the doc had. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A look line takes `?re?` after its colon, as addr doesGabriel Schneider4 days
| | | | | | | | `file:?foo?`, `@p5:?foo?` and `:?foo?` were not taken for addresses (the first character had to be one of `0-9+-/$.#,;`), so they went the path way and found nothing. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* `@p<terminal>:<address>` takes any address over the terminal's logical linesGabriel Schneider4 days
| | | | | | | | | Only a line number reached a terminal (the line way); any other address went to lookAddress, which wanted a file and said the terminal was no text. The body is now the lines a +Search of it lists, addressed from the cursor, and the match selected as a +Search row's range is. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A line address to no open pane, `@p77:3`, is a miss said as one, not the ↵Gabriel Schneider4 days
| | | | | | | | | active pane `@p<serial>:<line>` goes the line way (parsePathLine), where a serial naming no pane quietly did nothing and look read back the active pane. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A refusal over unsaved panes logs each as `unsaved <serial> <name>`, and its ↵Gabriel Schneider4 days
| | | | | | | | | | | | err never cuts a list Exit's refusal joined every name into one err, cut at the record's cap in mid-name, so a script could not tell which panes held it up. Each pane is now an `unsaved` record before the err, and the err names the one pane or counts them: `4 unsaved panes: Modified (Exit again to discard)`. Restore, Del and Delcol refuse the same way. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A builtin's Verbose announcement is logged only when it succeedsGabriel Schneider4 days
| | | | | | | | | | | A failure said while it ran (Exit's refusal, a Del refused) or later by the host (a Save's write, a Dump's) left `msg N Save` in the log as if it had worked. The announcement's record is remembered and taken back out on either, unless a follower read it already. A refused pane/new logs its err alone, and a failed Dump says its reason in words (`file not found`, not `FileNotFound`) so its msg goes and the err is the one record. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A long msg record is cut between words with an ellipsis, as an err record isGabriel Schneider4 days
| | | | | | | A Msg past 256 bytes was cut mid-word and silently: nothing told a reader of /log that the line went on. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Every builtin says what it does in /commands, and a test holds each to itGabriel Schneider4 days
| | | | | | | | | 87 of the listed words had no description: settings have no doc comment to read, so each now carries a one-sentence doc, and the builtins without one got theirs. Exit's no longer names an internal function, and Repl's first sentence is short enough to be read whole. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A pane from pane/new is the session's directory's scratch, not the last ↵Gabriel Schneider4 days
| | | | | | | | | | active pane's No pane asked for it, so borrowing the directory of whichever pane last had the keyboard named it after an accident; acme's new window has acme's directory. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A pty/ctl winsize gives a terminal two rows at least, so it no longer reads ↵Gabriel Schneider4 days
| | | | | | | | | | | | busy for ever A one-row pty loses the prompt's input mark as soon as the prompt wraps, and busy detection never sees the shell idle again. Placement already keeps a new terminal at tag + 2 rows; a winsize write now keeps the pty at two. A pane dragged down to one body row keeps a one-row pty, since a taller pty than the pane shows would put its cursor below the pane. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A new pane with no room under the last goes last all the sameGabriel Schneider4 days
| | | | | | | | | | | | | A pane from pane/new or New takes the bottom half of its column's last pane, as acme's coladd does (cols.c:62-65); when that pane is too short to give it a tag and 2 rows, the fallback halved the tallest pane and put the new one under it, mid-column (the 7 9 8 found). It now goes last all the same, with half the tallest pane's rows (its tag measured at the column's width). Tty from a pane's ctl already follows acme's makenewwindow (the active column first, util.c:456-467); fs.md now says so rather than beside that pane. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* @p<serial>:<address> takes any sam address, as file:<address> doesGabriel Schneider4 days
| | | | | | | | | | @p<serial> took a line spot but an address after it (/re/, #n, $, 0/re/, a range) was dropped, the name failing the file check, and an unknown serial fell through to a search. The pane is now addressed like a file; a miss and a serial no pane has each log an err, and look reads back empty. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A word written to a raw terminal's look is listed, as in normal modeGabriel Schneider4 days
| | | | | | | | | A new Tty is in raw mode, where a right click is its program's, and a look written to it over 9P did nothing for that reason. The look file is no keyboard input: over 9P a plain word is listed in a +Search pane and read back whatever the terminal's key mode. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* One rule for failing builtins: the write fails, one err, no msgGabriel Schneider4 days
| | | | | | | | | | | | | | | | A builtin that failed through a ctl failed the write and logged its err, but through look, exec, tagexec or a column's exec it only said so on the message row, logged as a msg, and the write succeeded. Now every click write runs its builtin as a ctl line does (ctl.captured): a failure fails the write, with its words (EINVAL for malformed input, else EIO or what the words name), logs one err and no msg or announcement. get's Modified and a look miss are shown but logged once, as their err. A control character's refusal names its reason, a failed click reads back nothing, and look never reads back a pane closed since. The special case for a cut-short Edit through exec goes (the rule covers it); fs.md's table of exceptions becomes the one rule, as does the skill. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* An Edit block cut short through exec is an err, not a msgGabriel Schneider4 days
| | | | | | | | | An exec write does not fail for what its command says, so an a/c/i text or { group cut short by a write that ended early was only a msg, easy to miss. Over 9P, that failure (a truncated write, not a command's) is now logged as an err record naming exec; the pane still says it. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* get and a deleted file say what happened: the path, changed <serial> ↵Gabriel Schneider4 days
| | | | | | | | | | | | | | deleted, reloaded get on a file gone from disk failed with a bare ENOENT; it now says get: <path>: no such file. A watched file deleted on disk was silent; the pane keeps its text and says <file> deleted on disk (Save writes it again) once, logged changed <serial> deleted (only a path the watch has read: a pane renamed to a name never on disk is not deleted). A get that throws a dirty buffer's state away logs changed <serial> reloaded, as the watch's reload does. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A long err record is cut between words, with an ellipsisGabriel Schneider4 days
| | | | | | | An err record's reason was cut at 200 bytes, mid-word. It is now cut at the last word that fits, and ends with an ellipsis. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A look that makes a +Search pane reads back that paneGabriel Schneider4 days
| | | | | | | | With LookWord list, or in a terminal, a look lists every place in a +Search pane, yet look read back the source pane, as if the hit were selected there. It now reads back the +Search pane it made. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A prompt a 9P request opens is an ask, answered with answer, never stackedGabriel Schneider4 days
| | | | | | | | | | | Save through exec on a terminal (or a scratch) opened its path prompt on screen, where no script could see or answer it, and a second Save stacked another. Opened while a 9P request is served, it now logs ask <serial> save path; answer <path> on the pane's ctl saves there and closes it, answer - closes it; asked again, the open one stands. A pane closed with it open logs answer <serial> -. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Tty takes a directory as long as a path may beGabriel Schneider4 days
| | | | | | | | | | | A terminal's directory rode inline in the spawn effect, capped at 256 bytes, so Tty in a directory of about 377 bytes said path too long. A directory past the inline buffer now goes out of line (Pardes.spawn_dirs, given to the host when the spawn is performed), up to the host's path limit (4095); past that, Tty says its directory is longer than a path may be. The effect queue stays its size. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Newcol at the column cap says so, and a desktop session holds 16 columnsGabriel Schneider4 days
| | | | | | | | | | | Newcol with every column slot taken, or a column too narrow to split, did nothing and said nothing. It now fails (a ctl write with it) with no space for a column: 16 max (ENOSPC through 9ns), or that the column is too narrow. MAX_COLS is 16 on a desktop, 6 on the board; each column costs about 8 KB of core state (the Pardes struct grows from 1.47 MB to 1.56 MB), most of it its tag's text. fs.md and the skill give the cap. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* /commands takes each word's own doc comment, whole, without citationsGabriel Schneider4 days
| | | | | | | | | | | Repl showed Joincol's first line and Joincol another's, because a comment had drifted above the wrong declaration in builtins.zig; Kill's was cut mid-sentence and Exit's cited exec.c:892. The drifted line is back on Joincol, a parenthesis citing source (.c, .zig) is dropped, and the first sentence is kept whole up to 240 bytes, then cut between words with an ellipsis. A test checks every description opens its own word's comment. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A Save that fails logs its err, not a save recordGabriel Schneider4 days
| | | | | | | | | The save record was logged as soon as the host was asked to write, so a Save into a read-only directory logged save and then failed. It is now logged only once the write is done; a failure's err record (the write's, naming the path) stands alone, the msg it was also said as dropped. Co-Authored-By: Claude Opus 5.5 <[email protected]>