1package soy.iko.opencode.ui.chat
3import androidx.compose.foundation.layout.Arrangement
4import androidx.compose.foundation.layout.Column
5import androidx.compose.foundation.layout.Row
6import androidx.compose.foundation.layout.fillMaxWidth
7import androidx.compose.foundation.layout.padding
8import androidx.compose.material.icons.Icons
9import androidx.compose.material.icons.filled.Shield
10import androidx.compose.material3.AlertDialog
11import androidx.compose.material3.Button
12import androidx.compose.material3.Icon
13import androidx.compose.material3.MaterialTheme
14import androidx.compose.material3.OutlinedButton
15import androidx.compose.material3.Text
16import androidx.compose.material3.TextButton
17import androidx.compose.runtime.Composable
18import androidx.compose.ui.Modifier
19import androidx.compose.ui.platform.LocalHapticFeedback
20import androidx.compose.ui.text.font.FontFamily
21import androidx.compose.ui.unit.dp
22import soy.iko.opencode.data.model.Permission
23import soy.iko.opencode.data.model.PermissionResponse
26 * Modal asking the user to approve a tool the agent wants to run. The agent run is
27 * paused until one of these responses is sent. Non-dismissable by tap-outside so the
28 * decision is explicit.
32 permission: Permission,
33 onRespond: (PermissionResponse) -> Unit,
35 val haptics = LocalHapticFeedback.current
37 onDismissRequest = { /* require an explicit choice */ },
38 icon = { Icon(Icons.Filled.Shield, contentDescription = null) },
39 title = { Text(permission.title ?: "Permission requested") },
41 Column(verticalArrangement = Arrangement.spacedBy(8.dp)) {
42 permission.type?.let {
43 Text(it, style = MaterialTheme.typography.labelLarge, fontFamily = FontFamily.Monospace)
45 permission.patternText?.let {
48 style = MaterialTheme.typography.bodyMedium,
49 fontFamily = FontFamily.Monospace,
50 color = MaterialTheme.colorScheme.onSurfaceVariant,
54 "Allow this tool to run?",
55 style = MaterialTheme.typography.bodySmall,
56 color = MaterialTheme.colorScheme.onSurfaceVariant,
62 modifier = Modifier.fillMaxWidth(),
63 verticalArrangement = Arrangement.spacedBy(4.dp),
67 haptics.performHapticFeedback(androidx.compose.ui.hapticfeedback.HapticFeedbackType.LongPress)
68 onRespond(PermissionResponse.ONCE)
70 modifier = Modifier.fillMaxWidth(),
71 ) { Text("Allow once") }
74 haptics.performHapticFeedback(androidx.compose.ui.hapticfeedback.HapticFeedbackType.LongPress)
75 onRespond(PermissionResponse.ALWAYS)
77 modifier = Modifier.fillMaxWidth(),
78 ) { Text("Always allow") }
82 TextButton(onClick = {
83 haptics.performHapticFeedback(androidx.compose.ui.hapticfeedback.HapticFeedbackType.LongPress)
84 onRespond(PermissionResponse.REJECT)
86 Text("Reject", color = MaterialTheme.colorScheme.error)
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list