Skip to content

fix: add global no-emoji output config#528

Merged
1jehuang merged 48 commits into
masterfrom
fix/issue-526-no-emoji
Jul 24, 2026
Merged

fix: add global no-emoji output config#528
1jehuang merged 48 commits into
masterfrom
fix/issue-526-no-emoji

Conversation

@1jehuang

Copy link
Copy Markdown
Owner

Summary

  • add [display] emoji = false and JCODE_NO_EMOJI=1
  • replace emoji grapheme clusters with readable ASCII across completed TUI frames and terminal-facing CLI output
  • preserve text-presentation symbols, other Unicode, stored messages, and protocol payloads
  • document the setting and react to live config reloads

Verification

  • focused core, config, and TUI regression tests pass
  • cargo check -p jcode --bin jcode passes
  • production clippy passes with warnings denied
  • Windows setup-hints cross-check passes
  • coordinated self-dev TUI build passes
  • code-size check has no patch-attributable violations; four pre-existing master baseline violations remain

Fixes #526

--- — Jcode agent (automated triage), on behalf of @1jehuang

1jehuang added 28 commits July 20, 2026 20:13
…scribe command

Two non-blocking, weekly-gated subscription nudges:
- Rate limited (value prop): the rate-limit system line gains
  'Get more tokens with a jcode subscription — /subscribe'.
- Long task completed (goodwill): when a todo batch that ran 1+ hour
  finishes with every item completed at/above the quality-gate
  confidence, show 'jcode just worked 1h 23m for you. Support jcode:
  /subscribe'.

Shared gating in subscribe_nudge.rs: at most once per week across
sessions (persisted in ~/.jcode/subscribe-nudge.json), once per
session, never during onboarding, never for existing jcode account
holders, never in replay/test runtimes.

/subscribe renders the pitch (token budgets, curated catalog, no key
management, failover routing, open-source funding, live tier prices)
and points at /login jcode. Registered in the command palette, /help
overlay, and per-command help.
Treat usage_limit_reached / quota-exhaustion errors as non-retryable for
auto-poke so an unattended session stops instead of re-sending refused
requests every turn. Also parse unit-suffixed reset windows (e.g.
'Resets in 30d 4h 29m') so '30d' is no longer misread as a 30-second
auto-retry; resets longer than a day are treated as terminal.
Scores each discovery sponsor 0-100 on whether agent-driven signups
are attributable to jcode (referral marker on listing URL, setup URLs,
CLI-flow attribution, live URL resolution). Includes per-sponsor
expectation file, offline unit tests, and docs. First live run: all
four sponsors score 80 because CLI-first setups rely on cookie-based
referral links.
The gate previously queued its continuation only as a hidden system
reminder, so the API call carried empty user content. Models interpreted
that as 'the user sent an empty message' and replied conversationally
instead of re-validating, burning all five gate attempts (observed live).

- Send the gate continuation through queued_messages so it lands as
  user-role content the model actually acts on.
- Rewrite the continuation texts to self-identify as an automated gate
  and to explicitly instruct re-running the todo tool with updated
  completion_confidence values.
- Keep detecting the legacy continuation texts in is_auto_poke_message
  so persisted transcripts do not re-render them as user prompts.
…del picker

Models covered only by placeholder 'remote-catalog'/'current' routes (from
names-only catalog downgrades) now get their real provider routes
(OpenAI OAuth/API key, OpenRouter, ...) re-synthesized when the picker opens.

Also stop two poisoning paths:
- debug_model_picker_live_json no longer writes lightweight fallback routes
  back into remote_model_options
- persist_remote_model_catalog_cache strips placeholder routes so a stale
  cache cannot resurrect them on cold start
- Add allocation-cheap char-presence prefilter that rejects most
  non-matching entries before running the DP.
- Replace the full (m+1)x(n+1) DP table with three rolling rows.
- Discard weak scattered matches below a per-length score floor and
  raise the interior gap penalty so noise stitched across a token no
  longer surfaces in /models.
- Multi-word queries now require every word to match some field
  (best-per-word sum) instead of stitching across the whole line.
- Add a bench example and regression tests.
- move rate-limit error formatting into openai_rate_limit_format.rs
- move parse_rate_limit_error into helpers_rate_limit_parse.rs
- move auto-poke error markers into commands_auto_poke_errors.rs
- move placeholder-route helpers + route_supports_reasoning_effort into
  inline_interactive_placeholder_routes.rs
- consolidate subscribe-nudge session fields into SubscribeNudgeState
… mcp/skills

- First line is 'jcode' (+ self-dev when canary) with dim status badges
- server/client lines keep their version labels (hash on mismatch)
- /model to switch hint moved to the front of the model line
- Removed 'built ...' line; standalone mode shows semver under model
- Auth inventory rendered vertically, one configured provider per line
- mcp/skills lines capped with '+N more'; empty mcp line hidden
- Working directory moved to the bottom of the header
…gn doc

- docs/HARNESS_API_AND_DESKTOP_REWRITE.md: plan for a stable versioned
  harness API and a pure-Rust desktop rewrite on winit+wgpu+Vello+Parley
- crates/jcode-harness-api: versioned NDJSON envelope (v/id/reply_to),
  curated ApiRequest/ApiEvent surface with forward-compat Unknown
  variants, blocking HarnessClient, schema snapshot tests
- examples/harness_repl: reference client with --demo scripted server
… on /login heading

- Updates box now renders at the top of the persistent header, sized to
  its content, instead of mid-header where it shifted the transcript
- Configured (green/yellow) providers keep their own auth lines;
  unconfigured ones are listed inline after '/login to add provider:'
  so header height stays stable as credentials are added
…on protocol

- crates/jcode-harness-api-server: jcode-harness-api-bridge binary listens
  on ~/.jcode/jcode-api.sock (JCODE_API_SOCKET) and dials the legacy daemon
  socket per client
- JSON-to-JSON BridgeState translation (subscribe/state attach chase,
  message->turn_done, ping/history/error routing), 8 unit tests
- validated live against the running daemon: hello -> attached -> pong
/reasoning felt like it controlled reasoning effort. Register /thinking
in autocomplete as the public command (with /reasoning as a hidden
alias), and reword the command output to say 'thinking display' and
point to /effort for effort changes.
Greenfield desktop app per docs/HARNESS_API_AND_DESKTOP_REWRITE.md:
- render.rs: vello RenderContext/Renderer with render-to-texture + blit
- text.rs: reusable Parley Font/LayoutContext drawing glyph runs into Vello
- main.rs: winit ApplicationHandler with a hello scene (card, accent dot,
  shaped wrapped paragraph)

Verified: builds clean and opens a rendering window under niri/Wayland.
/thinking alone read like it changed reasoning effort. /thinking and
/reasoning remain hidden aliases.
1jehuang added 19 commits July 23, 2026 19:52
- harness.rs: background worker over jcode-harness-api (hello, attach,
  streaming updates) with a dedicated writer thread for user messages
- main.rs: UI Model (status/transcript/input/busy), keyboard input,
  Enter-to-send chat loop rendered via Vello/Parley
- states.rs: named deterministic Model nodes (connecting, attached_empty,
  mid_input, streaming, turn_done, error)
- capture.rs: --capture <node|all> renders nodes offscreen to PNG
  (dependency-free PNG writer) so visuals are verifiable without a
  window, compositor, or screen capture

Validated: --capture all produces correct PNGs for all six nodes; app
connects live via the bridge and opens under niri.
Compute the initial-screen centering pad from the persistent header
height alone and re-apply the same pad above the header once messages
exist. The header stays in place when the first prompt arrives and the
padding scrolls away naturally as the transcript grows.
Per ~/jcode-website/STYLE.md: two colors (ink #111 on paper #fff, grays
as ink densities), JetBrains Mono everywhere, hairline rules instead of
cards, letterspaced captions, 1.65 line height, measure-limited body
copy, sentence case. theme.rs holds the tokens; text.rs gains
ParagraphStyle (font stack, weight, letterspacing, line height).

Verified via --capture all state-space renders.
Connects via the app's real harness worker, attaches a session, sends a
message, streams the reply, and renders the final Model offscreen.
Validated live: bridge + daemon round trip returned 'pong' and the
captured frame shows the full print-design transcript.
Follow the old desktop's DesktopTheme shape: Theme struct with mode +
semantic roles (background/text/muted/faint/rule/wash/error) carried on
the Model; scene code never names literal colors. print_light (website
ink-on-paper) is default, print_dark is the inverted variant, selectable
via JCODE_DESKTOP2_THEME=light|dark|system. New themes are plain data.

Verified: --capture renders both themes correctly.
The Updates box now fills the vertical centering padding above the
header instead of expanding the header itself. With no unseen updates
the padding stays blank, and leftover space stays at the top when the
box is shorter than the padding, so the header never shifts.
…ute upgrade; prepared fuzzy query per keystroke
…ntent anchoring

Info widgets now behave like residents of the transcript:
- New widgets may only dock next to transcript lines whose negative space
  has held still for SETTLE_AFTER_FRAMES frames (never the streaming tail
  or a re-rendering region), via a new SettlementTracker intersected into
  the reliable dock profile.
- Anchors are always content-anchored: a placed widget rides its
  transcript line in both scrolling and pinned-at-bottom modes instead of
  holding a screen row while text churns under it.
- MAX_HIDDEN_FRAMES raised to a backstop (16 -> 120): residents wait out
  transient covering instead of teleporting to a new pocket.
- Invalidation: a content-width change (re-wrap) flushes all anchors and
  settlement state for one clean global re-layout.
- Stability tests now pin content-relative invariants (zero drift, zero
  size churn) instead of absolute screen position.
- Move PLAN_MCP_SKILLS.md and terminal-capabilities.md out of repo root
- Group plan/TODO docs under docs/plans/ and audits under docs/audits/
- Update stale references in REFACTORING.md and commands_improve.rs
- Add docs/README.md index with layout conventions
@1jehuang
1jehuang merged commit 166e444 into master Jul 24, 2026
8 of 10 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

How do I disable emojis in jcode output?

1 participant