summaryrefslogtreecommitdiff
path: root/src
Commit message (Collapse)AuthorAge
* A file name with a newline is refused naming it once: `pardes: ↵Gabriel Schneider31 hours
| | | | | | | | | | two\nlines.txt: a file name is one line...`, not `a file name: a file name ...` The refusal's subject was the words "a file name", and its reason began with them again. It now names the name given, its newline shown `\n`, as /log and /index show one. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A second LookWord list look in a directory refills its +Search, as a ↵Gabriel Schneider31 hours
| | | | | | | | | | terminal's word looks already did, rather than stacking another Each word looked at with LookWord list opened a +Search of its own in the same directory. Word looks now share the directory's one, the next word refilling it; a `/` search still keeps a +Search each. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* `@pN:` looks at pane N, its trailing colon dropped as any look's is, and a ↵Gabriel Schneider31 hours
| | | | | | | | | | | line past the end is said one way: `<file>:N has no line N`, for `:N` as for `file:N` lookAt dropped a trailing `:` from what it read but resolved the target from the text as written, so `@p33:` was `no match for "@p33:"`. And `:99999` said `address out of range` while `file:99999` said `has no line 99999`: a bare line number past the end now says the latter too. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A terminal's petscii:on survives Dump and Restore: the dump says it, and the ↵Gabriel Schneider31 hours
| | | | | | | | | | restored terminal draws its graphics as glyph art again An image pane's Petscii choice was dumped; a terminal's was not, so a Restore brought it back drawing pixels. dump.Terminal carries petscii, and a restored terminal is turned to glyph art when it was. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A name write to a terminal, image or PDF and Edit on a pane with no text are ↵Gabriel Schneider31 hours
| | | | | | | | | | | refused EINVAL, in words a mount maps so: `invalid rename: ...` and the data write's own refusal `rename not allowed: ...` went out EPERM, and `Edit ,d` on a PDF ran and failed late, EIO, while a data write there was EINVAL. The rename refusal now says `invalid rename` with EINVAL, and Edit on a pane with no text is refused before anything runs with the data write's words. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* `:N:H` looked at on a PDF pane turns to page N, as `book.pdf:N:H` does from ↵Gabriel Schneider31 hours
| | | | | | | | | | anywhere, not a refusal that a PDF has no text A PDF's own pane took only `:N`; `:5:3` was refused as no text to address while `book.pdf:5:3` turned to page 5 (its search hit 3). lookPdfPage now reads the page before a colon and the hit after it. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* /pager resolves its directory, `~` and `..` alike, and refuses one that may ↵Gabriel Schneider31 hours
| | | | | | | | | | | | | not be written, permission denied; `pardes -` from such a directory pages into the session's `/tmp/../etc` named a +Pager `/tmp/../etc/+Pager`, a second one beside `/etc/+Pager`, and `~/x` was refused as relative. The directory is now home-expanded and resolved before it is checked, and one that may not be written is refused as a file's name there is (fs.deniedAbove). `pardes -` run in such a directory (`git log` under /usr/src) asks for the session's +Pager instead, so its text is still paged. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A refused /pager write leaves its open no answer, not the +Pager it answered ↵Gabriel Schneider31 hours
| | | | | | | | | | before writePager emptied the answer only once the directory had passed, so a read after a refused write on the same open still gave the last write's serial. It is emptied first, as a refused look or exec leaves none. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Lspinfo before any query says a server is not started yet, its first query ↵Gabriel Schneider31 hours
| | | | | | | | | | starting it, not `off` while it is on PATH A server is spawned on its first query; until then its row said `off`, which reads as disabled. It now says `not started yet (its first query starts it)`; a server disabled by its environment still says so. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A Rename, references and the like tell the server of every open file of its ↵Gabriel Schneider31 hours
| | | | | | | | | | | | | | | | language first, so a rename reaches files it had not seen and the preview lists them zls renames only in the documents in its store, and syncDoc told it of a file only when a query was asked from it, so renaming in progress.zig left main.zig unchanged and broken, with no preview. For a query whose answer can reach other files (rename, references, implementation, workspace symbols, calls and type hierarchy), the host snapshots every other open file and the client syncs those its server answers for first. The mock server answers a rename in each document it was told of; lsp-rename-files opens main.rs by a look, renames from lib.rs, and its preview lists both. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A Rename that previews other files answers its preview pane to the 9P write ↵Gabriel Schneider31 hours
| | | | | | | | | | | | | that asked it, and says on the message row that it previewed and applied nothing A multi-file Rename filled a +Search preview but the waiting exec write answered the pane it was asked from, and nothing was said. lspResponse now notes the pane it filled (fs.lsp_result); the write that waited for the answer reads that pane back, as a look or an exec answers the pane it went to, and the message row says `Rename: N edit(s) across files, previewed, not applied`. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Grep and Find pass over a directory they may not open and keep every other ↵Gabriel Schneider31 hours
| | | | | | | | | | | | hit, saying in one line how many they skipped One `chmod 000` directory anywhere under a pane made every Grep say `pattern not found` and every Find `access denied`: the walk's `try w.enter`/`try w.next` ended it at the first refusal. Each is now counted and passed over, and the +Search ends `N directories skipped: permission denied` under the hits. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Every EINVAL or ENOENT refusal a unit test meets must say its errno in words ↵Gabriel Schneider31 hours
| | | | | | | | | | | | | | a 9ns mount maps back: pardes re-pins cloud9, whose fs.enameErrno knows acme's address and argument refusals The tests' request helper asks cloud9's fs.enameErrno, the rules 9ns turns a refusal's words back into an errno with, for every EINVAL and ENOENT a request is refused with, and fails the test when a mount would hear another (EIO, mostly): "this pane has no text to address" was one. The re-pinned cloud9 maps acme's own refusals, which pardes keeps in acme's words: no match for regexp, address out of range, addresses out of order, range past end of body and the rest. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Release Pardes 0.21Gabriel Schneider32 hours
| | | | Co-Authored-By: Claude Opus 5.5 <[email protected]>
* addr, dot and limit on a pane with no text are refused `invalid address: ↵Gabriel Schneider32 hours
| | | | | | | | | this pane has no text to address`, which a mount reads as EINVAL, not EIO 9ns maps a refusal back to its errno by its words; "this pane has no text to address" held none it knows. The reference quotes the new words. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* /pager's refusals say invalid, so a mount's shell hears EINVAL: `pager: ↵Gabriel Schneider32 hours
| | | | | | | | | | | invalid directory "relative": must be absolute` 9ns maps a refusal back to an errno by its words, and "the directory must be absolute" and "one directory a write" held none it knows, so a shell through the mount got EIO for both. They now say `invalid`, as every EINVAL here does, and the reference quotes the new words. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Recipes work through a pane of their own, its look and exec, and keep a ↵Gabriel Schneider32 hours
| | | | | | command pane while their open lasts; the docs give cmd panes, the err grep, alt-screen prompts, /pager's refusals, Tty+ on a ctl, --, and theme failures in words Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A Restore whose ThemeFile fails to load changes no theme: the session goes ↵Gabriel Schneider33 hours
| | | | | | | | | | | | | on showing the one it did, its file still the one named A Restore makes a fresh core, which started at the default theme and asked for the dump's ThemeFile; when that file had broken since, the failure reverted to what the fresh core had loaded, nothing, and ink became orchard. A Restore that asks for a ThemeFile now carries over the theme the old session showed and the file it loaded (and its Theme, unless the dump names one), so a failure there changes nothing. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A msg record carries what was said, not the message row's clock: `msg 21 ↵Gabriel Schneider33 hours
| | | | | | | | | | dumped themes ...`, no `04:39:41 ` before it Messages a host stamps (saved, reloaded, dumped themes) went into the log with their clock and its double blank. The log has no times; noteMessage records the words after the stamp (Message.body). Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A pane ctl takes Tty+bash as exec and the tag do: a word that takes its ↵Gabriel Schneider33 hours
| | | | | | | | | | argument after a + is no unknown control message there checkBuiltin split a line at its first blank only, so `Tty+bash` was one unknown word on a ctl while exec ran it. It now splits at the + for the words whose registry entry says they take one so. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* /pager refuses a directory that is not there, ENOENT, and a relative one, ↵Gabriel Schneider33 hours
| | | | | | | | | | EINVAL: no +Pager named into a missing directory, none quietly the session's `/(/+Pager` was made for a missing absolute directory, and a relative one fell back to the session's without a word. An empty line still asks for the session's directory. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A body write to an image or a PDF says its body takes no writes, not that ↵Gabriel Schneider33 hours
| | | | | | | | | | the pane has no text "(a terminal, ...)" A terminal's body takes writes (its keys), so the old words named the one kind that does. data, sel and dirty keep "this pane has no text", which is true of all three. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Restore and ThemeFile failures say why in words, a ZON one with its line: ↵Gabriel Schneider33 hours
| | | | | | | | | | | | | | never FileTooLarge, ParseZon or a bare `parse zon` Restore read failures named the Zig error (FileTooLarge, NotAFile, ReadFailed), a file that is no dump said `not a pardes dump (ParseZon)`, and a ThemeFile that did not parse said `parse zon`. Messages.errorWords says an error in words (the few that read badly spelled out plainly, the rest spaced and lower case, as reportError did), and zonWhy gives the parser's first error with its line: `not a pardes dump: line 1: expected ...`, `theme file x.zon: line 3: ...`. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A name under a directory that may not be searched or written is refused, ↵Gabriel Schneider33 hours
| | | | | | | | | | | | | | permission denied, and a Save there says so, not no such directory `pardes noperm/a/b/c` and `pardes /proc/1/root/x` took the missing directory for one Save would make, opened a pane and exited 0; its Save then said "no such directory". fs.deniedAbove finds the nearest directory there and asks whether it may be searched and written: forwarding refuses such a name, exit 1, "permission denied", and a failed Save says "permission denied", which the writer's 9P error carries as EPERM (9ns: EACCES). Co-Authored-By: Claude Opus 5.5 <[email protected]>
* `--` ends pardes's options: `pardes -- -dash.txt` opens the file named -dash.txtGabriel Schneider33 hours
| | | | | | | It said `no such option: --`. What follows `--` is a name, one at most, as for any other positional. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A shell's prompt drawn on the alternate screen is a prompt: a terminal whose ↵Gabriel Schneider33 hours
| | | | | | | | | | | | | | | | program was killed there is no longer busy for ever htop killed with `sig KILL` leaves the emulator on its alternate screen; bash comes back and draws its prompt there, marks and all, but promptInputReady refused any prompt on the alternate screen, so pty/status said busy 1 and pty/run answered a bare `busy` for good. A prompt mark there now counts. A run sent at such a prompt leaves the alternate screen in the emulator first, as a reused command pane does, so its output lands on the primary screen and is read whole, not `exit 0 cut` with nothing. Busy there with no prompt drawn, and no program name to give, a run is told `busy alternate screen`. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* /index names a command's pane kind cmd, not term: a script picking a ↵Gabriel Schneider33 hours
| | | | | | | | | | terminal by kind no longer picks a pane with no shell A command pane runs one line and takes no typing; a script choosing `$2=="term"` to type into got one. Its kind is now cmd; a shell's stays term. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A command pane an exec open was answered is leased to it while that open ↵Gabriel Schneider33 hours
| | | | | | | | | | | | | | stays open: another client's command in the same directory gets a pane of its own A finished command pane was the next command's for its directory, from any client, so with four clients scripting one session, one read another's output as its own last run. An open of a look or exec file whose write was answered a pane's serial now holds that pane: reuse passes over it and a new command pane runs the line. The open's own next command may run there again, and once it is closed the directory's one command pane is reused as before. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Release Pardes 0.20Gabriel Schneider34 hours
| | | | Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The docs say Grep is a literal search, that a write's own status comes ↵Gabriel Schneider34 hours
| | | | | | before the log's last err, and that Delcol opens no +Unsaved Co-Authored-By: Claude Opus 5.5 <[email protected]>
* --wait waits on the pane its look answered, read on the look's own open, not ↵Gabriel Schneider34 hours
| | | | | | | | | | | | | one found again by name in /index The forwarded look was a write and nothing more, and --wait then looked its file up in /index. /index shows names escaped (`\\` for a backslash, `\xNN`), so a file named with one matched no pane and --wait exited 0 at once, as if the pane were already closed. The look is now asked on one open (Client.ask) and its answer is the pane waited on; /index by name stays only for a look that answers none. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* pardes - asks /pager for its +Pager and reads the serial on the same open: ↵Gabriel Schneider34 hours
| | | | | | | | | | | | | | another client's exec meanwhile can never take the text into its pane pardes - wrote `pager <dir>` to /ctl, then read /exec on a fresh open, which answers the session's last answer: a client that exec'd in between had its pane overwritten by the paged text. /pager takes the directory and answers the +Pager's serial on the open that wrote it, as /pane/new answers its own open; the ctl verb is gone. Client.ask writes and reads on one open. The README's look recipe reads its answer on its own open too. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Release Pardes 0.19Gabriel Schneider34 hours
| | | | Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A detached session's pty is sized in pixels too, at the last frontend's cell ↵Gabriel Schneider35 hours
| | | | | | | | | | | | size or a nominal 8x16 before one attached forkShell sized a new pty in pixels (ptyWinsize), but the detached server's resize set xpixel and ypixel to 0, and a pane is resized as it is placed, so a program in a detached session with no frontend (yazi) saw a pty with no pixels and drew no images. CSI 14/16/18 t were already answered at the nominal 8x16 cell. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A log follower hears every record queued before a Restore: the read it holds ↵Gabriel Schneider35 hours
| | | | | | | | | | | | takes all that fit, before the hangup cuts it A follower reads one record per read, and a Restore hangs every client up, so records queued just before it -- the ones a script most wants, what led up to the Restore -- were lost: the read after the first was cut. Before the cut, each held read of /log is answered with every whole record queued that fits it. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* addr, dot and limit on a pane with no text, a terminal, an image or a PDF, ↵Gabriel Schneider35 hours
| | | | | | | | | | | are refused alike: "this pane has no text to address" A terminal took an addr write and evaluated it over nothing, saying "bad address syntax" or "address out of range" by the expression, while dot refused it as no text at all. A range file of a pane with no text now refuses every write the same way, before the expression is read. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A size refusal quotes the bad value, "5 2", not the word sizeGabriel Schneider35 hours
| | | | | | | | size quoted its own word in every refusal, as bad values were quoted before round 31's change for the settings. The value is the offending word here too, and is now what each size refusal quotes. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* pty/run after a clear answers what the command printed from the clear on, ↵Gabriel Schneider35 hours
| | | | | | | | | | | | whole; cut only when its start really scrolled away A clear (ED 2, ED 3, a reset) under a running command marked its output lost, so `clear; ls` answered only "exit 0 cut". The output's start is now pinned again at the screen's top after the erase: what the command prints from there is its answer, whole, and a cut is said only when that start leaves the scrollback. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A look line's trailing colon is dropped, as a click leaves it off, and a ↵Gabriel Schneider35 hours
| | | | | | | | | | | | look whose address fails never leaves the file it opened `a.txt:2:3:`, as a compiler prints a place, failed as bad address syntax, and still opened a.txt: the file was opened to read the address in, and stayed when the address failed. The trailing colon is now no part of the place, and a pane opened only to evaluate an address that fails goes again, the miss said from the pane looked from. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A Restore, or -l, of a dump naming a ThemeFile asks the host to load it ↵Gabriel Schneider35 hours
| | | | | | | | | | | again, as a /ctl write of it does The dump's ThemeFile line went to the settings table, which has no such setting and never asks the host to read a file, so a restored session came back in the default theme. The restore now makes the request a /ctl ThemeFile makes, and the host loads the file. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A ThemeFile that fails to load changes nothing: /ctl and DumpConfig keep ↵Gabriel Schneider35 hours
| | | | | | | | | | | | naming the file last loaded, or none, so they always replay The request's path was taken as the theme file before the host had read it, so a file not found or not ZON left /ctl saying ThemeFile <that path>, and writing the report back failed again. The path a load succeeds with is now kept apart; a failure puts the request back to it (and watches it again), or to none. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* pardes - writes the whole text through one open of the body, so a page over ↵Gabriel Schneider35 hours
| | | | | | | | | | | | | | | 8 MiB arrives whole, not as its last chunk Each 8 MiB chunk went in by its own Client.write, which opens a body with OTRUNC, so every chunk replaced the one before and a long page kept only its tail, with exit 0. The text now goes in through one open, truncated once and written at rising offsets; a long write is timed by its progress, each 9P write answered within 30 s rather than the whole transfer within 2. fs.py pages 11 MiB of numbered lines and compares the body byte for byte, and pages past the 256 MiB cap and checks the first 256 MiB and the cut note. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Release Pardes 0.18Gabriel Schneider36 hours
| | | | Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A bad setting value is what the refusal quotes, so different bad values read ↵Gabriel Schneider36 hours
| | | | | | | | | | | | and log as different records, never merged as one (x2) A setting's bad value quoted the setting's word, so "Verbose maybe" and "Verbose nope" made the same err text and the log's repeat count merged them. The value is the offending word, and is now the one quoted, blanks and all; the log's dedupe, comparing whole texts, then keeps them apart. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* An event write-back refuses an origin not E, F, K or M, and a number past ↵Gabriel Schneider36 hours
| | | | | | | | | | | what a range holds, EINVAL with why A record from origin Q was taken as any other, and an offset past 2^32 was clamped to the largest one and acted on. Both are now refused before anything runs, the overflow as "bad number"; a range past the end was and is EINVAL too. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A write to sel leaves the text it wrote selected, as acme's wrsel does, so ↵Gabriel Schneider36 hours
| | | | | | | | | | | cat sel reads it back; one open's writes run on from the last The selection collapsed to a point after the write, so sel read back nothing. What is written is now dot, and the next write of the same open goes at its end and grows it (acme's wrselrange), so a shell's several writes make one selection; another open's write replaces it. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A PDF's body puts each line of the page's text on a line of its own, not a ↵Gabriel Schneider36 hours
| | | | | | | | | | | heading and its paragraph run together with a space MuPDF's text buffer joins the lines of one block with spaces, so a typst page's heading and the text under it read as one line ("Page one Hello normal PDF alpha."). The bridge now walks the structured text itself, structure blocks included, and ends each line with a newline. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A +PdfSections row's first number is the page: a section that is not there, ↵Gabriel Schneider36 hours
| | | | | | | | | | | or is on another page, is a miss said, not a silent success A look at `file.pdf:P:S` in +PdfSections went to section S whatever P said, and one past the last section did nothing and answered ok. The row's page is now held to: a section not in the outline, or on another page than the row names, fails with which, as every other miss does. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* pardes - keeps one +Pager per directory, refilled, named so from its first ↵Gabriel Schneider36 hours
| | | | | | | | | | | | | | | | | | | log record; streams the text in bounded writes; never loses it; handles \r, NUL and BEL as a terminal does Each paged command made another +Pager until placement failed, and then git's text was lost with exit 0; a 130 MB page timed out half written and dirty; a directory whose name held a newline left a stray +New; and the log said new +New then rename. The root ctl's `pager <dir>` now makes the directory's +Pager (named before it is announced, placed without the keyboard) or empties the one there; the text goes into it a line-ended 8 MiB chunk a write, one undo step, up to the file limit and its note, and is left clean. A directory a ctl line cannot name pages into the session's. Any failure prints the text to stderr with why and exits 1. A carriage return keeps a progress line's last state and CRLF is a newline; NUL, BEL, SO and SI go; empty stdin makes no pane. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A +Pager pane whose text is a diff is drawn and looked at as a diff, as a ↵Gabriel Schneider36 hours
| | | | | | | | | | | | diff command pane is: git diff, show and log -p page into review With git paging into +Pager, a diff arrived as plain text: no colour for its sides and a right click on a hunk line searched the word. A +Pager pane now notes, as its text is set, whether its first 64 KiB holds a diff header or a unified hunk, and such a pane takes the diff highlighting and the diff look every diff pane has. Co-Authored-By: Claude Opus 5.5 <[email protected]>