Skip to content

streamline UI to 6 screens + CHAT_BOX overhaul for Gemma 4#13

Merged
Flynn013 merged 29 commits into
mainfrom
claude/streamline-clu-box-ui-4OWcC
May 21, 2026
Merged

streamline UI to 6 screens + CHAT_BOX overhaul for Gemma 4#13
Flynn013 merged 29 commits into
mainfrom
claude/streamline-clu-box-ui-4OWcC

Conversation

@Flynn013
Copy link
Copy Markdown
Owner

  • GalleryApp: cut drawer from 12 → 6 modules (CHAT_BOX, BRAIN_BOX,
    SKILL_BOX, MODELS, LNK_BOX, SETTINGS); remove FILE_BOX, DIFF_BOX,
    MSTR_CTRL, EXT_BOX, SCDL_BOX, PROJ_BOX and all dead imports/vars;
    rename VENDING_MACHINE → MODELS; bump version to OS v1.0

  • LlmChatScreen/ChatViewWrapper: add allowThinkingOverride: Boolean?
    param so callers can override the task-level thinking default at
    runtime without touching the Task data model

  • AgentChatScreen (CHAT_BOX): add Gemma 4-native enhancements —
    thinkingModeEnabled toggle chip (THINK) wired to allowThinkingOverride;
    live skill chip rail above the input showing all currently enabled
    skills with overflow counter; both rendered above existing tool-
    execution cards in composableAboveInput

Flynn013 added 3 commits May 20, 2026 08:46
- GalleryApp: cut drawer from 12 → 6 modules (CHAT_BOX, BRAIN_BOX,
  SKILL_BOX, MODELS, LNK_BOX, SETTINGS); remove FILE_BOX, DIFF_BOX,
  MSTR_CTRL, EXT_BOX, SCDL_BOX, PROJ_BOX and all dead imports/vars;
  rename VENDING_MACHINE → MODELS; bump version to OS v1.0

- LlmChatScreen/ChatViewWrapper: add allowThinkingOverride: Boolean?
  param so callers can override the task-level thinking default at
  runtime without touching the Task data model

- AgentChatScreen (CHAT_BOX): add Gemma 4-native enhancements —
  thinkingModeEnabled toggle chip (THINK) wired to allowThinkingOverride;
  live skill chip rail above the input showing all currently enabled
  skills with overflow counter; both rendered above existing tool-
  execution cards in composableAboveInput
…abel

- AgentGovernor: maxLoops default 25 → 100
- GalleryApp: LNK_BOX label → "MCP EXTENSIONS"
- AgentChatScreen: MAX_AUTONOMOUS_ITERATIONS 25 → 100, LinearProgressIndicator
  context fill bar (green/orange/red), auto-compression via
  ContextWindowPager.shouldPrune + pruneAndArchive before each autonomous
  iteration when context reaches 80% capacity
BrainBoxModuleScreen:
- Stats row: TOTAL / CORE / EPISODIC counts
- Search field (NeonTextField) filters by label, content, type
- TabRow: ALL / CORE / EPISODIC filter tabs with live counts

SkillBoxScreen:
- LaunchedEffect loadSkills on entry
- Scaffold + FAB to create new skills
- BUILT-IN section (skills from SkillManagerViewModel with builtIn==true)
- CUSTOM section with per-skill Switch, Edit, Delete
- Create/Edit AlertDialog with name, description, instructions fields
- Delete confirmation dialog
- Remove all AI Edge Gallery module-name artifacts
Copilot AI review requested due to automatic review settings May 20, 2026 19:16
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR streamlines the CLU/BOX Android UI down to a smaller set of OS modules and upgrades the CHAT_BOX experience for Gemma 4 by adding runtime “thinking” control, live skill visibility, and context management UX improvements.

Changes:

  • Simplifies the main drawer/modules to 6 screens (CHAT_BOX, BRAIN_BOX, SKILL_BOX, MODELS, MCP EXTENSIONS, SETTINGS) and bumps the displayed OS version to v1.0.
  • Adds allowThinkingOverride: Boolean? plumbing to let callers toggle “thinking” at runtime without mutating the Task model.
  • Enhances CHAT_BOX with a THINK chip, a live selected-skill chip rail, a context fill indicator, and auto-compression before autonomous continuation loops.

Reviewed changes

Copilot reviewed 6 out of 6 changed files in this pull request and generated 5 comments.

Show a summary per file
File Description
Android/src/app/src/main/java/com/google/ai/edge/gallery/ui/osmodules/SkillBoxScreen.kt Reworks SKILL_BOX into a CRUD/toggle UI with dialogs and FAB for custom skills.
Android/src/app/src/main/java/com/google/ai/edge/gallery/ui/osmodules/BrainBoxModuleScreen.kt Adds search + tab filtering and reorganizes BrainBox header/stats/I/O UI.
Android/src/app/src/main/java/com/google/ai/edge/gallery/ui/llmchat/LlmChatScreen.kt Introduces allowThinkingOverride and wires it into ChatViewWrapper.
Android/src/app/src/main/java/com/google/ai/edge/gallery/GalleryApp.kt Removes deprecated modules from the drawer and renames VENDING_MACHINE → MODELS.
Android/src/app/src/main/java/com/google/ai/edge/gallery/customtasks/agentchat/AgentGovernor.kt Raises the default autonomous loop cap to 100.
Android/src/app/src/main/java/com/google/ai/edge/gallery/customtasks/agentchat/AgentChatScreen.kt Adds THINK + skills chip rail + context bar, and auto-compresses context during autonomous continuation.
Comments suppressed due to low confidence (1)

Android/src/app/src/main/java/com/google/ai/edge/gallery/ui/osmodules/SkillBoxScreen.kt:303

  • The custom skills list can change size/order due to create/delete. Using LazyColumn.items(customSkills) without a stable key can cause item reuse issues during recomposition (e.g., wrong row being reused after deletion). Pass a stable key such as skillState.skill.name (and ideally do the same for builtInSkills) to keep row identity consistent.
      } else {
        items(customSkills) { skillState ->
          val skillIndex = uiState.skills.indexOf(skillState)
          SkillRow(
            name = skillState.skill.name,

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +141 to +151
TextButton(onClick = {
if (editName.isBlank()) {
editError = "Name is required."
return@TextButton
}
skillManagerViewModel.saveSkillEdit(
index = editIndex,
name = editName.trim(),
description = editDesc.trim(),
instructions = editInstructions.trim(),
scriptsContent = emptyMap(),
Comment on lines +488 to +492
else -> {
LazyColumn(verticalArrangement = Arrangement.spacedBy(8.dp)) {
items(filteredNeurons, key = { it.id }) { neuron ->
NeuronCard(
neuron = neuron,
Comment on lines 207 to 214
onInferenceError = { errorMessage ->
// ── Error recovery via AgentLoopManager ────────────────────────
// Ask the loop manager whether we should retry or halt.
// FIX: Cast errorMessage (Any?) to String.
val errorStr = errorMessage?.toString() ?: "Unknown inference error"
val shouldRetry = loopManager.onError(errorStr)
if (shouldRetry) {
Log.w(TAG, "Inference error — retrying (${AgentLoopManager.MAX_RETRIES - loopManager.errorCount} attempt(s) left)")
// Inject a SYSTEM re-evaluation message so the model understands what
// went wrong and can try a different approach on the next turn.
val model = modelManagerViewModel.uiState.value.selectedModel
val retryMsg = loopManager.formatRetrySystemMessage("Inference engine", errorStr)
viewModel.addMessage(
Comment on lines 125 to 130
/**
* Maximum number of consecutive autonomous loop iterations allowed before the
* loop is forcibly halted. This prevents a runaway agentic loop from
* crashing the app through memory exhaustion, context overflow, or native
* layer errors. The counter resets whenever the **user** sends a new message.
* loop is forcibly halted.
*/
private const val MAX_AUTONOMOUS_ITERATIONS = 25
private const val MAX_AUTONOMOUS_ITERATIONS = 100

Comment on lines +58 to +64
class AgentGovernor(
/**
* Maximum consecutive autonomous iterations before the circuit breaker halts
* the loop to protect device stability. 25 strikes a balance: enough for
* deep multi-step plans, short enough to prevent runaway battery drain.
* the loop to protect device stability. 100 allows deep multi-step plans
* while still providing a safety ceiling.
*/
val maxLoops: Int = 25,
val maxLoops: Int = 100,
Flynn013 and others added 24 commits May 20, 2026 14:24
FileBoxScreen is unreachable since the OS module list was streamlined to
6 screens. No live code references it. The backing FileBoxManager stays —
it still powers the agent's fileBoxWrite/fileBoxReadLines skills.
highlightSyntax() was only consumed by FileBoxScreen's code editor, which
has been removed. No remaining callers.
MstrCtrlScreen is unreachable after the OS module streamline. No live
code references it; the terminal/shell capability remains available to
the agent via its shell skills.
DiffBoxScreen is unreachable after the OS module streamline. Only
exported its own composable; no live callers.
ExtBoxScreen is unreachable after the OS module streamline. Its
extension-toggle function is now covered by SKILL_BOX.
ScdlBoxScreen is unreachable after the OS module streamline. The
ScdlBox data layer stays — it still powers the agent's scheduleTask
skill and WorkManager jobs.
AppProjectCreationScreen is unreachable after the OS module streamline.
Its AppConfig/FeatureNode/updateFeatureTree symbols were only used
within this file and the removed GalleryApp PROJ_BOX branch.
…bilities, step-mode, improved CLOUD_CONSTRAINT

- FileDiffSkill: BusyBox diff -u wrapper for verifying edits
- FileEditSkill: surgical search-and-replace (avoids full file rewrites)
- CodeSearchSkill: recursive grep with extension filter
- CluIdentity: add CODE workflow guidance to GENESIS_IDENTITY_BLOCK
- SkillRegistry: register 3 new coding skills + step-mode addendum injection
- CluAgentSettings: SharedPreferences toggle for STEP vs AUTO agent mode
- AgentEngine: add Capabilities (contextTokens, maxToolCallsPerTurn, parallel/thinking flags)
- AgentGovernor: replace trivial CLOUD_CONSTRAINT copy with real cloud-aware instructions
….5-flash

Coding skills (Batch 1):
- Add FileDiffSkill — BusyBox diff -u wrapper with clu_file_box path resolution
- Add FileEditSkill — precise search-and-replace with path traversal guard
- Add CodeSearchSkill — recursive grep wrapper (up to 60 results)
- Add CluAgentSettings — SharedPrefs toggle for AUTO/STEP agent mode
- AgentEngine.Capabilities — per-engine metadata (contextTokens, maxToolCallsPerTurn, etc.)
- CluIdentity — add CODE workflow rule, update TOOLS line with new skill names
- SkillRegistry — register 3 new skills, append STEP_MODE_ADDENDUM when enabled
- AgentGovernor — replace copy-paste CLOUD_CONSTRAINT with proper 128K cloud guidance

Claude OAuth infrastructure (Batch 2):
- Add ClaudeCredentialStore — EncryptedSharedPreferences singleton for OAuth tokens
- Add ClaudeAuthManager — PKCE OAuth flow with manual code entry (public client ID)
- Add ClaudeOAuthViewModel — @hiltviewmodel driving ClaudeConnectButton state
- Add ClaudeConnectButton — Compose component with code-entry AlertDialog

Provider OAuth wiring (Batch 3):
- AnthropicProvider — add bearerToken param; use Authorization + anthropic-beta header
- GeminiProvider — add bearerToken param; use Authorization: Bearer header
- ProviderRegistry — OAuth-first for both gemini and anthropic branches; fallback to API key
- GeminiCloudModelHelper.callGeminiApi — convert to suspend, OAuth-first auth
- GeminiAuthViewModel — call ProviderRegistry.invalidateAll() on sign-in/sign-out

SETTINGS CLOUD tab + agent mode (Batch 4):
- SystemSettingsScreen — add CLOUD tab at index 1; fix FAB condition; add CloudTab composable
- CloudTab — Gemini section (status chip, API key input, GeminiConnectButton, CLIENT_ID warning)
- CloudTab — Claude section (status chip, API key input, ClaudeConnectButton)
- ConfigTab — add AUTO/STEP agent mode segmented button (persisted via CluAgentSettings)

Gemini 3.5 Flash support:
- GeminiModelFetcher — gemini-3.x models sort to top of list
- GeminiCloudModelHelper — update GEMINI_MODEL_FALLBACK to gemini-3.5-flash
- ContextManager — add gemini-3.5-flash to MODEL_CONTEXT_MAP (1M token context)
- AddApiModelDialog — update placeholder hints to reference gemini-3.5-flash

https://claude.ai/code/session_01XRcHML7MNiNFfmBtr8F7kb
- Add ANTHROPIC_CLOUD RuntimeType + AnthropicCloudModelHelper (full
  LlmModelHelper via ProviderRegistry → AnthropicProvider.streamChat,
  multi-turn tool rounds, cancellation support)
- Persist Anthropic cloud models via new AnthropicCloudModel proto field
  and DataStoreRepository save/read methods; restore on app init
- Wire ANTHROPIC_CLOUD into ModelHelperExt routing and AgentEngine.CLOUD
  selection in AgentChatScreen
- Overhaul CLOUD_CLU tab in GlobalModelManager: credential status hub
  (Gemini + Claude OAUTH/API KEY/NOT SET chips), GeminiConnectButton,
  ClaudeConnectButton, Claude preset model list with add/remove per model
- Restore MstrCtrlScreen (BusyBox terminal) deleted in c5dd2a5; add
  missing Color import; register MSTR_CTRL in GalleryApp OsModule enum
- Add STACHE preset picker to LnkBoxScreen: second FAB opens a sheet
  with 5 MCP presets (Filesystem, GitHub, Web Fetch, Sequential
  Thinking, Memory) that pre-fill the AddLinkForm fields

https://claude.ai/code/session_01XRcHML7MNiNFfmBtr8F7kb
BusyBoxBridge.exec() now falls back to /system/bin/sh (always present on
Android) when the busybox-arm64-v8a asset isn't bundled in the APK. This
unblocks shellExecute, codeSearch, fileDiff, and the MSTR_CTRL terminal
for users who haven't supplied the binary, while full BusyBox capability
is preserved when the asset is present.

MstrCtrlScreen updated to reflect the fallback: shows a soft warning
instead of a hard error and marks ready=true so the terminal accepts
commands either way.

https://claude.ai/code/session_01XRcHML7MNiNFfmBtr8F7kb
Tool call cards:
- Remove verticalScroll inside LazyColumn (nested scroll killed height
  measurement, causing cards to appear collapsed / zero-height)
- Replace heightIn+verticalScroll with maxLines+TextOverflow.Ellipsis
- Restyle to CLU/BOX aesthetic: dark terminal background (terminalMidGrey),
  neonGreen dots and spinner, monospace font, outline border
- Use rememberSaveable(inProgress) to preserve user-toggled expansion
  without spurious resets from item-added recompositions

Gemma 4 multi-tool call support:
- Add TurnOutcome.ToolCalls(List<ToolCall>) to ContinuousAgentDriver
- Extract executeToolCallInLoop() helper — shared by single and batch paths
- ToolCalls batch executes each call sequentially before the next inference
  turn, matching Gemini parallel-call semantics on the context-injection side
- LiteRTProvider.chat() and streamChat() handle ToolCalls variant, emitting
  ToolCallStart/Input/End events for each call and returning full results list

https://claude.ai/code/session_01XRcHML7MNiNFfmBtr8F7kb
Replace AssistChipDefaults.assistChipBorder(enabled, borderColor) with
BorderStroke(1.dp, color) — borderColor param does not exist in the M3
version shipped with BOM 2026.02.00. Also removes unused rememberSaveable
import.

https://claude.ai/code/session_01XRcHML7MNiNFfmBtr8F7kb
…anch

emit() is a suspend function; List.map{} takes a non-suspend lambda so
calling emit inside map is a Kotlin compile error. Replace with a
mutableListOf + for-loop that collects ProviderToolCallResult while
emitting events sequentially. Also remove unused Channel import.

https://claude.ai/code/session_01XRcHML7MNiNFfmBtr8F7kb
…picCloudModelHelper

Without this import, fn.valueParameters is unresolved causing the
'Method iterator() is ambiguous' and 'Unresolved reference valueParameters'
compiler errors. GeminiCloudModelHelper had this import; porting didn't carry it over.

https://claude.ai/code/session_01XRcHML7MNiNFfmBtr8F7kb
…t, MSTR_CTRL status

AgentTools.kt: add @tool wrappers for PYTHON_EXEC and webFetch so both
tools are discoverable via the @tool reflection dispatch used by all
cloud model helpers. Previously only CluSkill entries (never called from
Gemini/Anthropic helpers), so the helpers threw IAE "Tool not found".

AnthropicCloudModelHelper.kt: add buildToolDefinitions() that reflects
@tool methods and converts them to OpenAI-format JSONObject list; pass
this to provider.streamChat() instead of emptyList(). Without tool
definitions the Anthropic API never generates tool_use blocks so the
agentic loop always stopped after one turn.

GlobalModelManager.kt: fix CloudCredentialHub layout. GeminiConnectButton
and ClaudeConnectButton use fillMaxWidth() internally; placing them in a
Row alongside a weight(1f) Column squished the label to zero width,
causing each character to wrap vertically. Now each provider uses a
Column — label row on top, full-width connect button below.

MstrCtrlScreen.kt: add busyboxInstalled flag so status bar shows
"BUSYBOX READY" only when the binary is present and "SYSTEM SH MODE"
when running on the /system/bin/sh fallback.

https://claude.ai/code/session_01XRcHML7MNiNFfmBtr8F7kb
…always continues

- MessageBodyCollapsableProgressPanel: switch from remember(inProgress) to
  rememberSaveable so cards start expanded and never auto-collapse when
  inProgress flips false

- CluIdentity: replace "Wait for the result before the next action" with
  "The system automatically returns the result — do not wait for user input"
  so the model stops pausing after each tool call; add DONE rule so CLU
  signals task completion with "✓ Done:" summary

- AgentTools: add sendAgentAction(inProgress=true/false) to fileBoxReadLines
  and brainBoxGrep so every @tool method emits progress cards consistently

- AnthropicCloudModelHelper: handle ProviderEvent.ToolCallStart to emit
  "Calling <tool>…" card; after dispatchToolCall emit completion card with
  first 120 chars of result as description

https://claude.ai/code/session_01XRcHML7MNiNFfmBtr8F7kb
Color palette — shift primary accent from pure neon green #39FF14 to
Marathon's signature acid lime #C8FF00; add marathonBlue #1A1AE6; deepen
blacks for higher contrast matching Marathon's stark aesthetic.

New MarathonDecorations.kt — reusable Marathon HUD components:
  CrosshairMark: the + registration marks from Marathon UI art
  MarathonCornerMarks: overlays crosshairs at all four corners of a panel
  MarathonSectionLabel: left-accent-bar section headers in spaced mono caps
  MarathonMetaBar: coordinate-readout metadata footer (MARATHON / TAU CETI IV style)
  MarathonPanelBorder: lime border + corner mark combo wrapper
  MarathonScreenHeader: full-width Marathon-style screen title with hairline

ModelPageAppBar — task labels now all-caps + 2sp letter-spacing in Monospace
Bold; 1dp acid-lime hairline separator below the app bar.

GlobalModelManager — replace plain title with "CLU / BOX · VENDING MACHINE"
Marathon wordmark header (crosshair + spaced mono caps + dim subtitle) and
lime hairline separator.

MstrCtrlScreen — status bar uses CrosshairMark instead of filled circle dot;
title text all-caps + letter-spacing; buffer border shifted to translucent
lime; four CrosshairMark corner overlays on the scroll buffer; MarathonMetaBar
footer shows live line count.

MessageBodyCollapsableProgressPanel — card corners sharpened to 2dp radius;
lime top accent bar while in-progress; spinner overlaid with CrosshairMark
for the Marathon faction-symbol look; tool item dots replaced with CrosshairMark.

SystemSettingsScreen — tab bar background updated to pure black; tab text
uses 1sp letter-spacing in mono caps; selected/unselected color contrast
matches Marathon UI.

https://claude.ai/code/session_01XRcHML7MNiNFfmBtr8F7kb
- AgentTools: populate addItemTitle+addItemDescription in all sendAgentAction
  completion calls so tool card items actually render when expanded (was always
  empty, causing the panel to look like it "barely expands")
- AnthropicCloudModelHelper: same fix — addItemTitle was missing from the
  post-dispatch sendAgentAction call
- LocalToolParser: port from SPL-NTR; parses XML/markdown/function-style
  <tool_call> blocks from local model text output into ProviderToolCallResult
- AgentEngineV2: inject LocalToolParser text-based tool call fallback in the
  ProviderEvent.Done handler; append tool-call format instructions to system
  prompt when provider is "litert" so Gemma knows the expected output format
- MessageBodyCollapsableProgressPanel: Marathon blue (0xFF1A1AE6) for item
  row background/border/CrosshairMark/title; card border uses blue when done

https://claude.ai/code/session_01XRcHML7MNiNFfmBtr8F7kb
…Gemini button

- ClaudeAuthManager: change OAUTH_SCOPES from ["read","write"] to
  ["org:create_api_key","user:profile","user:inference"] — Anthropic's consent
  page returned "Unknown scope: read" (confirmed by screenshot)
- SystemSettingsScreen CloudTab: replace ProviderRegistry.invalidate("x","*")
  with invalidateAll() on API key save/clear — the "*" wildcard created a
  no-op cache key that never matched any real cached provider, so stale
  providers (with no key) survived after the user saved a new key
- CloudTab Gemini section: replace GeminiConnectButton with a disabled
  OutlinedButton when CLIENT_ID is still the placeholder — prevents the
  guaranteed 400 error from accounts.google.com (confirmed by screenshot)

https://claude.ai/code/session_01XRcHML7MNiNFfmBtr8F7kb
AgentChatTaskModule always called LlmChatModelHelper.initialize() regardless
of model.runtimeType, causing cloud models (Gemini, Anthropic) to hit the
LiteRT file-existence check with their placeholder download paths and fail
with "Model file not found".

- Branch on isCloud (GEMINI_CLOUD | ANTHROPIC_CLOUD | MANUAL_API): call
  model.runtimeHelper.initialize() which skips the file check entirely.
- Set agentTools.engine = AgentEngine.CLOUD for cloud models so the agent
  loop uses AgentEngineV2 with the correct schema format.
- cleanUpModelFn now routes through model.runtimeHelper.cleanUp() for all
  runtime types instead of hardcoding LlmChatModelHelper.
- ModelManagerViewModel.downloadModel() and cancelDownloadModel() now treat
  ANTHROPIC_CLOUD the same as GEMINI_CLOUD — skip download, mark succeeded.

https://claude.ai/code/session_01XRcHML7MNiNFfmBtr8F7kb
BusyBox binary is excluded from git by design; without it, ensureInstalled()
was returning null and falling back silently to /system/bin/sh with no clear
diagnostic path for the user.

- BusyBoxBridge.ensureInstalled(): when the APK asset is absent, attempt a
  runtime download from busybox.net (1.35.0 aarch64-musl) to internal storage.
  Download uses a temp-file + rename pattern for atomicity. Falls back to
  system sh only if download also fails.

- AgentTools: add @Tool-annotated fileDiff, fileEdit, codeSearch methods.
  AnthropicCloudModelHelper.buildToolDefinitions() discovers tools via @tool
  reflection — the CluSkill wrappers (FileDiffSkill, etc.) are only reachable
  via SkillRegistry.dispatch() and were invisible to cloud models. Adding @tool
  methods makes all 13 tools available to both local LiteRT and cloud (Anthropic,
  Gemini) inference paths. Each method calls shellExecute() / File API directly
  and emits sendAgentAction with addItemTitle so tool cards populate correctly.

  Added private resolveWorkspacePath() helper for relative-path normalisation.

https://claude.ai/code/session_01XRcHML7MNiNFfmBtr8F7kb
…dule

- ClaudeAuthManager: correct CLIENT_ID (9d1c250a-e61b-44d9-88ed-5944d1962f5e),
  REDIRECT_URI (/oauth/code/callback), 10-min timeout, JSON token exchange body,
  state persistence across PKCE flow, code split on '#' per SPL-NTR pattern
- AnthropicCloudModelHelper: coerce @tool param types (Int/Long/Double/Float/Boolean)
  in dispatchToolCall — fixes fileBoxReadLines 'got String expected Int' crash
- GalleryApp: add FILE_BOX module (FolderOpen icon) to OsModule enum and routing
- FileBoxScreen: new 1564-line full-featured file manager with syntax-highlighted
  code editor (VS Dark+), CRUD ops, breadcrumb nav, zip export, file upload
- file_paths.xml: expose cache root so zip download ShareSheet works

https://claude.ai/code/session_01XRcHML7MNiNFfmBtr8F7kb
claude added 2 commits May 21, 2026 15:26
CLU name tag fix (critical):
- AgentChatTask: add agentNameRes = R.string.chat_llm_agent_name so chat
  shows "CLU" (neon green) instead of the default "Model" for every message

User profile / username feature:
- UserProfileStore: new SharedPreferences singleton (data/) — getUsername,
  setUsername, MAX_LEN=24; no proto schema change needed
- SystemSettingsScreen ConfigTab: PROFILE section at top — monospace
  BasicTextField + SAVE button + "Shown as: X" / "Not set" status line
- MessageSender: replace hardcoded chat_you with UserProfileStore fallback;
  still shows "You" when no name is set
- SystemPromptManager: optional username param prepends USER: line so CLU
  knows and uses the operator's name in conversation
- AgentChatTaskModule: reads UserProfileStore.getUsername(context) and
  passes it to SystemPromptManager.build()
- GalleryApp drawer: shows "OPERATOR: <name>" line below tagline when set

Marathon/CyberAcme UI consistency polish:
- GalleryApp: LNK_BOX label "MCP EXTENSIONS" → "LNK_BOX" (matches WORD_BOX
  naming convention); tagline em-dash → middle dot for terminal readability
- FileBoxScreen: ALLCAPS all action labels — NEW FILE, NEW FOLDER, RENAME,
  DELETE (DISCARD / KEEP EDITING were already correct)
- SystemSettingsScreen: all "Clear" OutlinedButton labels → "CLEAR"

https://claude.ai/code/session_01XRcHML7MNiNFfmBtr8F7kb
@Flynn013 Flynn013 merged commit 42ee4f5 into main May 21, 2026
1 check passed
@Flynn013 Flynn013 deleted the claude/streamline-clu-box-ui-4OWcC branch May 21, 2026 16:19
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.

3 participants