diff --git a/TODO.md b/TODO.md index ab249fe..1f9dcde 100644 --- a/TODO.md +++ b/TODO.md @@ -5,19 +5,6 @@ one in place when it turns out to need a decision. ## App — transcript -- [ ] Text inside code blocks does not highlight when selected. **Measured, and - it does** — the selection is drawn, but over the near-black surface a code - block and a tool's output sit on, Material's default 40%-alpha tint - composites to a barely-there smudge, much weaker than the same selection - over a reply. The app now states its own selection colours - (`AiAppSelectionColors`), which took the fill from #5B4C73 to #776394 on - that surface. Worth confirming this was the complaint rather than a - selection that draws *nothing* on the phone. -- [ ] Text inside an opened peer message or memory note cannot be selected at - all — the heading of the same card can, and so can a tool call's output, - so it is the markdown text specifically. Pre-existing (measured against - the build before this session's changes, by stashing them). It - contradicts AGENTS.md's "all transcript text is selectable". - [ ] Messages received from other agents are inconsistent — sometimes they appear, sometimes they don't. **Needs a rig.** Read the code rather than measured: a live Claude session only learns of a peer message from the @@ -32,10 +19,17 @@ one in place when it turns out to need a decision. ## Session settings - [ ] Autocompact belongs in session settings; empty disables it, which is the - default. **Needs a decision before building** — nothing called autocompact - exists yet on either side. `PLAN.md` has it only as a planned pi-driver - feature (`set_auto_compaction`), and Claude Code runs its own. So this is - a new server feature, and the open questions are what the empty-or-not - value *is* (a token count? a percentage of the context window?) and which - drivers it applies to. + default. Iris chose "hand it to the driver" — only where a driver has + auto-compaction of its own. **That option was offered on a false premise + and is not buildable yet.** It named pi's `set_auto_compaction`, but pi + was never built as a driver here: `session/llama.rs` talks to + `llama-server`'s OpenAI-compatible endpoint directly, and its `compact()` + refuses outright. Claude Code's auto-compaction is the CLI's own and + nothing in the stream-json control protocol this app uses configures it. + So the setting would be stored, passed to a driver, refused by every one + of them, and the field would never appear on any session. What is needed + first is either a driver that can take it, or a different rule — the + server watching `contextTokens` and running `/compact` itself is the one + that would work today, for Claude sessions, and it is the option that was + not chosen. diff --git a/app/androidApp/src/main/kotlin/com/example/aiapp/Markdown.kt b/app/androidApp/src/main/kotlin/com/example/aiapp/Markdown.kt index 82ad370..20a1b80 100644 --- a/app/androidApp/src/main/kotlin/com/example/aiapp/Markdown.kt +++ b/app/androidApp/src/main/kotlin/com/example/aiapp/Markdown.kt @@ -368,7 +368,15 @@ private fun MarkdownRoot( // exactly a card's own fill, so a fenced block inside a tool call had no // background at all and one in a reply read as a step *up* out of the page. codeBackground = rawSurface, - inlineCodeBackground = rawSurface, + // The same colour, but let through. An inline span's background is part of the + // *text's* own drawing and the selection rectangle is drawn underneath it, so an + // opaque chip hides the selection completely: selecting a sentence highlighted + // every word of it except the ones in backticks, which is a difference in + // appearance the reader has no way to account for. Translucent, the selection + // shows through and the chip still reads as one step down from the page -- there + // is no way to draw it over the selection instead, since the order is the text + // node's. + inlineCodeBackground = rawSurface.copy(alpha = INLINE_CODE_ALPHA), // The same tint a code block gets, rather than the renderer's 2%-alpha default: // two adjacent tints that differ by a fiftieth read as one flat block on a phone, // so the table would have had a border-less grid and nothing saying where it began. @@ -711,3 +719,12 @@ class ParsedReplies { ready.clear() } } + +/** + * How much of the inline-code chip's fill is its own colour, the rest being whatever it sits on. + * + * High enough that the chip is still a clear step down from the page, low enough that a selection + * under it changes what the chip looks like. Both halves are the point: at 1.0 the chip was the + * only part of a selected sentence that did not look selected. + */ +private const val INLINE_CODE_ALPHA = 0.6f