streamline UI to 6 screens + CHAT_BOX overhaul for Gemma 4#13
Merged
Conversation
- 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
There was a problem hiding this comment.
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, |
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
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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