Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -4974,7 +4974,7 @@
]
},
{
"name": "io.askimo.core.providers.ChatClient$MockitoMock$LyMoAAaM",
"name": "io.askimo.core.providers.ChatClient$MockitoMock$Xm2yYCXe",
"queryAllDeclaredConstructors": true,
"methods": [{ "name": "<init>", "parameterTypes": [] }]
},
Expand Down Expand Up @@ -7373,7 +7373,7 @@
]
},
{
"name": "org.jline.reader.ParsedLine$MockitoMock$dZdAwrXL",
"name": "org.jline.reader.ParsedLine$MockitoMock$BQiCsOjI",
"queryAllDeclaredConstructors": true,
"methods": [{ "name": "<init>", "parameterTypes": [] }]
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -267,7 +267,7 @@ class ListRecipesCommandHandlerTest : CommandHandlerTestBase() {
val recipeLine = lines.find { it.contains("my-recipe") }

assertTrue(recipeLine != null)
assertTrue(recipeLine!!.contains("my-recipe"))
assertTrue(recipeLine.contains("my-recipe"))
assertTrue(!recipeLine.endsWith(".yml"))
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ class SessionMemoryRepositoryIT {

val retrieved = memoryRepository.getBySessionId(session.id)
assertNotNull(retrieved)
assertEquals(session.id, retrieved!!.sessionId)
assertEquals(session.id, retrieved.sessionId)
assertEquals(memory.memorySummary, retrieved.memorySummary)
assertEquals(memory.memoryMessages, retrieved.memoryMessages)
}
Expand Down Expand Up @@ -131,7 +131,7 @@ class SessionMemoryRepositoryIT {

val retrieved = memoryRepository.getBySessionId(session.id)
assertNotNull(retrieved)
assertEquals(memory2.memorySummary, retrieved!!.memorySummary)
assertEquals(memory2.memorySummary, retrieved.memorySummary)
assertEquals(memory2.memoryMessages, retrieved.memoryMessages)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -167,11 +167,11 @@ class ChatRequestTransformersTest {
}

assertTrue(
resultTexts.any { it?.contains("Recent user question") == true },
resultTexts.any { it.contains("Recent user question") },
"Should keep most recent user message",
)
assertTrue(
resultTexts.any { it?.contains("Recent AI answer") == true },
resultTexts.any { it.contains("Recent AI answer") },
"Should keep most recent AI message",
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,10 +80,10 @@ class KeychainManagerLinuxIntegrationTest {
val retrievedKey = KeychainManager.retrieveSecretKey(provider)
assertNotNull(retrievedKey, "Retrieved API key should not be null")

println("Retrieved length: ${retrievedKey?.length ?: 0}")
println("Retrieved prefix: ${retrievedKey?.take(20) ?: "null"}...")
println("Retrieved length: ${retrievedKey.length}")
println("Retrieved prefix: ${retrievedKey.take(20)}...")

assertEquals(LONG_API_KEY.length, retrievedKey?.length, "Retrieved API key length should match original")
assertEquals(LONG_API_KEY.length, retrievedKey.length, "Retrieved API key length should match original")
assertEquals(LONG_API_KEY, retrievedKey, "Retrieved API key should match stored key exactly")
}

Expand Down Expand Up @@ -191,7 +191,7 @@ class KeychainManagerLinuxIntegrationTest {

val retrievedKey = KeychainManager.retrieveSecretKey(provider)
assertNotNull(retrievedKey, "Very long API key should be retrievable")
assertEquals(veryLongKey.length, retrievedKey?.length, "Very long API key length should match")
assertEquals(veryLongKey.length, retrievedKey.length, "Very long API key length should match")
assertEquals(veryLongKey, retrievedKey, "Very long API key should match exactly")
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,8 +80,8 @@ class KeychainManagerMacOSIntegrationTest {
val retrievedKey = KeychainManager.retrieveSecretKey(provider)
assertNotNull(retrievedKey, "Retrieved API key should not be null")

println("Retrieved length: ${retrievedKey?.length ?: 0}")
println("Retrieved prefix: ${retrievedKey?.take(20) ?: "null"}...")
println("Retrieved length: ${retrievedKey.length}")
println("Retrieved prefix: ${retrievedKey.take(20)}...")

assertEquals(LONG_API_KEY.length, retrievedKey?.length, "Retrieved API key length should match original")
assertEquals(LONG_API_KEY, retrievedKey, "Retrieved API key should match stored key exactly")
Expand Down Expand Up @@ -191,7 +191,7 @@ class KeychainManagerMacOSIntegrationTest {

val retrievedKey = KeychainManager.retrieveSecretKey(provider)
assertNotNull(retrievedKey, "Very long API key should be retrievable")
assertEquals(veryLongKey.length, retrievedKey?.length, "Very long API key length should match")
assertEquals(veryLongKey.length, retrievedKey.length, "Very long API key length should match")
assertEquals(veryLongKey, retrievedKey, "Very long API key should match exactly")
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,10 +85,10 @@ class KeychainManagerWindowsIntegrationTest {
val retrievedKey = KeychainManager.retrieveSecretKey(provider)
assertNotNull(retrievedKey, "Retrieved API key should not be null")

println("Retrieved length: ${retrievedKey?.length ?: 0}")
println("Retrieved prefix: ${retrievedKey?.take(20) ?: "null"}...")
println("Retrieved length: ${retrievedKey.length}")
println("Retrieved prefix: ${retrievedKey.take(20)}...")

assertEquals(LONG_API_KEY.length, retrievedKey?.length, "Retrieved API key length should match original")
assertEquals(LONG_API_KEY.length, retrievedKey.length, "Retrieved API key length should match original")
assertEquals(LONG_API_KEY, retrievedKey, "Retrieved API key should match stored key exactly")
}

Expand Down Expand Up @@ -181,7 +181,7 @@ class KeychainManagerWindowsIntegrationTest {

val retrievedKey = KeychainManager.retrieveSecretKey(provider)
assertNotNull(retrievedKey, "Very long API key should be retrievable")
assertEquals(veryLongKey.length, retrievedKey?.length, "Very long API key length should match")
assertEquals(veryLongKey.length, retrievedKey.length, "Very long API key length should match")
assertEquals(veryLongKey, retrievedKey, "Very long API key should match exactly")
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ class SecureKeyManagerMacOSIntegrationTest {
println("Retrieved key is null: ${retrievedKey == null}")
assertNotNull(retrievedKey, "Retrieved API key should not be null")

val retrieved = retrievedKey!!
val retrieved = retrievedKey
println("Retrieved length: ${retrieved.length}")
println("Retrieved prefix: ${retrieved.take(20)}...")
println("Retrieved suffix: ...${retrieved.takeLast(20)}")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ class SecureKeyManagerWindowsIntegrationTest {
println("Retrieved key is null: ${retrievedKey == null}")
assertNotNull(retrievedKey, "Retrieved API key should not be null")

val retrieved = retrievedKey!!
val retrieved = retrievedKey
println("Retrieved length: ${retrieved.length}")
println("Retrieved prefix: ${retrieved.take(20)}...")
println("Retrieved suffix: ...${retrieved.takeLast(20)}")
Expand Down
70 changes: 33 additions & 37 deletions desktop-shared/src/main/kotlin/io/askimo/ui/chat/ChatInputField.kt
Original file line number Diff line number Diff line change
Expand Up @@ -367,44 +367,44 @@ fun chatInputField(

Column {
// Main input row with text field and send button
// Resize handle sits above the row so it doesn't affect button alignment.
Box(
modifier = Modifier
.fillMaxWidth()
.height(8.dp)
.background(MaterialTheme.colorScheme.surfaceVariant.copy(alpha = 0.3f))
.pointerHoverIcon(
PointerIcon(Cursor.getPredefinedCursor(Cursor.N_RESIZE_CURSOR)),
)
.pointerInput(Unit) {
detectVerticalDragGestures { change, dragAmount ->
change.consume()
val newHeight = textFieldHeight - dragAmount.toDp()
textFieldHeight = newHeight.coerceIn(defaultTextFieldHeight, maxTextFieldHeight)
manuallyResized = true
}
},
contentAlignment = Alignment.Center,
) {
// Visual grip indicator
Box(
modifier = Modifier
.width(40.dp)
.height(4.dp)
.background(
MaterialTheme.colorScheme.onSurfaceVariant.copy(alpha = 0.5f),
RoundedCornerShape(2.dp),
),
)
}

Row(
modifier = Modifier.fillMaxWidth(),
verticalAlignment = Alignment.Top,
verticalAlignment = Alignment.CenterVertically,
) {
Column(
modifier = Modifier.weight(1f),
) {
// Resize handle
Box(
modifier = Modifier
.fillMaxWidth()
.height(8.dp)
.background(MaterialTheme.colorScheme.surfaceVariant.copy(alpha = 0.3f))
.pointerHoverIcon(
PointerIcon(Cursor.getPredefinedCursor(Cursor.N_RESIZE_CURSOR)),
)
.pointerInput(Unit) {
detectVerticalDragGestures { change, dragAmount ->
change.consume()
val newHeight = textFieldHeight - dragAmount.toDp()
textFieldHeight = newHeight.coerceIn(defaultTextFieldHeight, maxTextFieldHeight)
manuallyResized = true
}
},
contentAlignment = Alignment.Center,
) {
// Visual indicator
Box(
modifier = Modifier
.width(40.dp)
.height(4.dp)
.background(
MaterialTheme.colorScheme.onSurfaceVariant.copy(alpha = 0.5f),
RoundedCornerShape(2.dp),
),
)
}

// Text field
OutlinedTextField(
value = inputText,
Expand Down Expand Up @@ -506,11 +506,7 @@ fun chatInputField(

Spacer(modifier = Modifier.width(8.dp))

// Send/Stop button
Box(
modifier = Modifier.height(textFieldHeight),
contentAlignment = Alignment.Center,
) {
Box(contentAlignment = Alignment.Center) {
if (isLoading || isThinking) {
IconButton(
onClick = onStopResponse,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@ import java.net.URI
import java.util.Base64
import javax.imageio.ImageIO
import javax.swing.SwingUtilities
import kotlin.time.Duration.Companion.milliseconds
import org.commonmark.node.Text as MarkdownText

private val log = currentFileLogger()
Expand Down Expand Up @@ -804,7 +805,7 @@ private fun renderCodeBlock(codeBlock: FencedCodeBlock, viewportTopY: Float? = n
clipboardManager.setText(AnnotatedString(codeBlock.literal.trimEnd('\n', '\r')))
showCopyFeedback = true
coroutineScope.launch {
delay(2000)
delay(2000.milliseconds)
showCopyFeedback = false
}
},
Expand Down
Loading