diff --git a/app/src/androidTest/java/com/ai/assistance/operit/ui/common/markdown/ToolCardStreamBoundaryAndroidTest.kt b/app/src/androidTest/java/com/ai/assistance/operit/ui/common/markdown/ToolCardStreamBoundaryAndroidTest.kt index 164e8cba38..be8e2e9389 100644 --- a/app/src/androidTest/java/com/ai/assistance/operit/ui/common/markdown/ToolCardStreamBoundaryAndroidTest.kt +++ b/app/src/androidTest/java/com/ai/assistance/operit/ui/common/markdown/ToolCardStreamBoundaryAndroidTest.kt @@ -24,8 +24,9 @@ class ToolCardStreamBoundaryAndroidTest { @get:Rule val composeRule = createComposeRule() private fun chars(text: String): Stream = stream { text.forEach { emit(it) } } + // XML 属性含双引号,使用原始字符串避免测试样例被误解析为 Kotlin 代码。 private fun tool(value: String): String = - "$value" + """$value""" private fun render(prefix: String?, tail: String): StreamMarkdownRendererState { val state = StreamMarkdownRendererState() @@ -52,13 +53,13 @@ class ToolCardStreamBoundaryAndroidTest { @Test fun closedToolPrefixKeepsFollowingRequestAndResultSeparate() { val first = tool("首次") - val result = "已创建" + val result = """已创建""" val next = tool("第二次") assertBlocks(render(first, result + next), listOf(first, result, next)) } @Test fun unfinishedToolContinuesOnceAndNewToolsStartNewCards() { - val prefix = "开始" + val prefix = """开始""" val close = "继续" val next = listOf(tool("第二次"), tool("第三次")) assertBlocks(render(prefix, close + next.joinToString("")), listOf(prefix + close) + next) @@ -96,7 +97,7 @@ class ToolCardStreamBoundaryAndroidTest { } @Test fun xmlReplayIncludesRestoredPrefixAndEndsBeforeMessageCompletion() { - val prefix = "开始" + val prefix = """开始""" val body = "继续" val end = "" val source = MutableSharedStreamImpl(replay = Int.MAX_VALUE) diff --git a/app/src/androidTest/java/com/ai/assistance/operit/ui/features/conversation/chat/components/timeline/StreamingTimelineRefreshAndroidTest.kt b/app/src/androidTest/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/timeline/StreamingTimelineRefreshAndroidTest.kt similarity index 98% rename from app/src/androidTest/java/com/ai/assistance/operit/ui/features/conversation/chat/components/timeline/StreamingTimelineRefreshAndroidTest.kt rename to app/src/androidTest/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/timeline/StreamingTimelineRefreshAndroidTest.kt index 44b1e784d6..3331d4b817 100644 --- a/app/src/androidTest/java/com/ai/assistance/operit/ui/features/conversation/chat/components/timeline/StreamingTimelineRefreshAndroidTest.kt +++ b/app/src/androidTest/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/timeline/StreamingTimelineRefreshAndroidTest.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components.timeline +package com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.timeline import androidx.compose.foundation.layout.Column import androidx.compose.material3.MaterialTheme diff --git a/app/src/androidTest/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/WorkspaceEditorCommentTest.kt b/app/src/androidTest/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/WorkspaceEditorCommentTest.kt similarity index 96% rename from app/src/androidTest/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/WorkspaceEditorCommentTest.kt rename to app/src/androidTest/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/WorkspaceEditorCommentTest.kt index 0354432dcb..aff6af69eb 100644 --- a/app/src/androidTest/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/WorkspaceEditorCommentTest.kt +++ b/app/src/androidTest/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/WorkspaceEditorCommentTest.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor +package com.ai.assistance.operit.ui.features.conversation.workspace.editor import androidx.test.ext.junit.runners.AndroidJUnit4 import org.junit.Assert.* diff --git a/app/src/androidTest/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/WorkspaceEditorInitialLineTest.kt b/app/src/androidTest/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/WorkspaceEditorInitialLineTest.kt similarity index 97% rename from app/src/androidTest/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/WorkspaceEditorInitialLineTest.kt rename to app/src/androidTest/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/WorkspaceEditorInitialLineTest.kt index a95c2e7e65..8bf16ef5b9 100644 --- a/app/src/androidTest/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/WorkspaceEditorInitialLineTest.kt +++ b/app/src/androidTest/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/WorkspaceEditorInitialLineTest.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor +package com.ai.assistance.operit.ui.features.conversation.workspace.editor import android.view.inputmethod.EditorInfo import androidx.compose.material3.MaterialTheme diff --git a/app/src/main/java/com/ai/assistance/operit/core/application/OperitApplication.kt b/app/src/main/java/com/ai/assistance/operit/core/application/OperitApplication.kt index 72fd4c08d2..7b667ecc9c 100644 --- a/app/src/main/java/com/ai/assistance/operit/core/application/OperitApplication.kt +++ b/app/src/main/java/com/ai/assistance/operit/core/application/OperitApplication.kt @@ -43,8 +43,8 @@ import com.ai.assistance.operit.data.preferences.initUserPreferencesManager import com.ai.assistance.operit.data.preferences.preferencesManager import com.ai.assistance.operit.data.repository.CustomEmojiRepository import com.ai.assistance.operit.data.stats.TokenUsageRepository -import com.ai.assistance.operit.ui.features.conversation.chat.webview.LocalWebServer -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor.language.LanguageFactory +import com.ai.assistance.operit.ui.features.conversation.workspace.preview.LocalWebServer +import com.ai.assistance.operit.ui.features.conversation.workspace.editor.language.LanguageFactory import com.ai.assistance.operit.core.diagnostics.GlobalExceptionHandler import com.ai.assistance.operit.util.media.ImagePoolManager import com.ai.assistance.operit.util.android.LocaleUtils diff --git a/app/src/main/java/com/ai/assistance/operit/core/chat/AIMessageManager.kt b/app/src/main/java/com/ai/assistance/operit/core/chat/AIMessageManager.kt index d14c9c3012..9422a2b4f4 100644 --- a/app/src/main/java/com/ai/assistance/operit/core/chat/AIMessageManager.kt +++ b/app/src/main/java/com/ai/assistance/operit/core/chat/AIMessageManager.kt @@ -36,8 +36,8 @@ import com.ai.assistance.operit.data.model.ChatMessageTimestampAllocator import com.ai.assistance.operit.data.model.ToolParameter import com.ai.assistance.operit.data.model.PromptFunctionType import com.ai.assistance.operit.data.preferences.ApiPreferences -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.process.WorkspaceAttachmentProcessor -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.process.WorkspaceChangeTracker +import com.ai.assistance.operit.ui.features.conversation.workspace.process.WorkspaceAttachmentProcessor +import com.ai.assistance.operit.ui.features.conversation.workspace.process.WorkspaceChangeTracker import com.ai.assistance.operit.util.media.ImagePoolManager import com.ai.assistance.operit.util.media.MediaPoolManager import com.ai.assistance.operit.core.chat.context.ChatUtils diff --git a/app/src/main/java/com/ai/assistance/operit/core/config/SystemPromptConfig.kt b/app/src/main/java/com/ai/assistance/operit/core/config/SystemPromptConfig.kt index 431fe5f31b..8b88edde4c 100644 --- a/app/src/main/java/com/ai/assistance/operit/core/config/SystemPromptConfig.kt +++ b/app/src/main/java/com/ai/assistance/operit/core/config/SystemPromptConfig.kt @@ -9,7 +9,7 @@ import com.ai.assistance.operit.core.tools.climode.ToolExposureMode import com.ai.assistance.operit.core.tools.packTool.PackageManager import com.ai.assistance.operit.data.preferences.ApiPreferences import com.ai.assistance.operit.data.skill.SkillRepository -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.process.WorkspaceRuleFileReader +import com.ai.assistance.operit.ui.features.conversation.workspace.process.WorkspaceRuleFileReader import com.ai.assistance.operit.util.android.LocaleUtils object SystemPromptConfig { diff --git a/app/src/main/java/com/ai/assistance/operit/core/files/transfer/FileCopyObservers.kt b/app/src/main/java/com/ai/assistance/operit/core/files/transfer/FileCopyObservers.kt new file mode 100644 index 0000000000..26eb2d20ce --- /dev/null +++ b/app/src/main/java/com/ai/assistance/operit/core/files/transfer/FileCopyObservers.kt @@ -0,0 +1,21 @@ +package com.ai.assistance.operit.core.files.transfer + +import java.util.UUID +import java.util.concurrent.ConcurrentHashMap + +internal class FileCopyObserver( + val onProgress: (FileCopyProgress) -> Unit, + val checkCancelled: () -> Unit, +) + +/** 工具执行跨越同步入口和 IO 协程;用一次性令牌关联进度,避免并行粘贴串到同一个全局状态。 */ +internal object FileCopyObservers { + const val PARAMETER = "__workspace_copy_id" + private val observers = ConcurrentHashMap() + + fun register(observer: FileCopyObserver): String = UUID.randomUUID().toString().also { observers[it] = observer } + + fun find(id: String?): FileCopyObserver? = id?.let(observers::get) + + fun remove(id: String) { observers.remove(id) } +} \ No newline at end of file diff --git a/app/src/main/java/com/ai/assistance/operit/core/files/transfer/LocalTransferPaths.kt b/app/src/main/java/com/ai/assistance/operit/core/files/transfer/LocalTransferPaths.kt new file mode 100644 index 0000000000..a439abc5e1 --- /dev/null +++ b/app/src/main/java/com/ai/assistance/operit/core/files/transfer/LocalTransferPaths.kt @@ -0,0 +1,27 @@ +package com.ai.assistance.operit.core.files.transfer + +import android.content.Context +import com.ai.assistance.operit.terminal.provider.filesystem.PRootMountMapping +import java.io.File + +/** 与终端共用软挂载映射,不能把 /sdcard 简单拼接到 Ubuntu rootfs 下。 */ +internal object LocalTransferPaths { + fun resolve(context: Context, path: String, environment: String): File { + if (environment.equals("android", ignoreCase = true)) return File(path) + require(environment.equals("linux", ignoreCase = true)) { "Not a local file environment: $environment" } + val expanded = when { + path == "~" -> "/root" + path.startsWith("~/") -> "/root/" + path.substring(2) + else -> path + } + return File(PRootMountMapping.mapLinuxPathToHostPath( + linuxPath = expanded, + ubuntuRoot = File(context.filesDir, "usr/var/lib/proot-distro/installed-rootfs/ubuntu"), + homeDir = context.filesDir.absolutePath, + appDataDir = context.applicationInfo.dataDir, + packageName = context.packageName, + chrootEnabled = context.getSharedPreferences("terminal_settings", Context.MODE_PRIVATE) + .getBoolean("chroot_enabled", false), + )) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/ai/assistance/operit/core/files/transfer/StreamingFileCopy.kt b/app/src/main/java/com/ai/assistance/operit/core/files/transfer/StreamingFileCopy.kt new file mode 100644 index 0000000000..acbb488d56 --- /dev/null +++ b/app/src/main/java/com/ai/assistance/operit/core/files/transfer/StreamingFileCopy.kt @@ -0,0 +1,182 @@ +package com.ai.assistance.operit.core.files.transfer + +import java.io.File +import java.io.IOException +import java.nio.file.FileAlreadyExistsException +import java.nio.file.FileVisitResult +import java.nio.file.Files +import java.nio.file.LinkOption +import java.nio.file.Path +import java.nio.file.OpenOption +import java.nio.file.SimpleFileVisitor +import java.nio.file.StandardCopyOption +import java.nio.file.StandardOpenOption +import java.nio.file.attribute.BasicFileAttributes + +internal enum class FileCopyPhase { SCANNING, COPYING, COMPLETED } + +internal data class FileCopyProgress( + val phase: FileCopyPhase, + val currentFile: String, + val copiedBytes: Long, + val totalBytes: Long?, + val copiedFiles: Long, + val totalFiles: Long, + val bytesPerSecond: Double?, +) { + val fraction: Float? + get() = when { + phase == FileCopyPhase.COMPLETED -> 1f + phase == FileCopyPhase.SCANNING || totalBytes == null -> null + totalBytes > 0 -> (copiedBytes.toDouble() / totalBytes).toFloat().coerceIn(0f, 0.999f) + totalFiles > 0 -> (copiedFiles.toDouble() / totalFiles).toFloat().coerceIn(0f, 0.999f) + else -> 0f + } + + val remainingBytes: Long? + get() = totalBytes?.let { (it - copiedBytes).coerceAtLeast(0L) } +} + +/** 两次逐层遍历分别统计和复制,不缓存整棵目录树,也不将文件内容转成字符串。 */ +internal object StreamingFileCopy { + const val BUFFER_SIZE = 256 * 1024 + private const val REPORT_INTERVAL_NANOS = 200_000_000L + private const val SPEED_WINDOW_NANOS = 500_000_000L + + fun copy( + source: File, + destination: File, + recursive: Boolean = true, + overwrite: Boolean = false, + onProgress: (FileCopyProgress) -> Unit = {}, + checkCancelled: () -> Unit = {}, + ): FileCopyProgress { + val sourcePath = source.absoluteFile.toPath().normalize() + val destinationPath = destination.absoluteFile.toPath().normalize() + val attributes = Files.readAttributes(sourcePath, BasicFileAttributes::class.java, LinkOption.NOFOLLOW_LINKS) + val realSource = source.canonicalFile.toPath() + val realDestination = destination.canonicalFile.toPath() + require(realSource != realDestination && (!attributes.isDirectory || !realDestination.startsWith(realSource))) { + "Cannot copy a path onto itself or into its own directory" + } + require(recursive || !attributes.isDirectory) { "Cannot copy a directory without recursive=true" } + if (!overwrite && Files.exists(destinationPath, LinkOption.NOFOLLOW_LINKS)) { + throw FileAlreadyExistsException(destination.path) + } + + var phase = FileCopyPhase.SCANNING + var currentFile = source.name + var totalBytes = 0L + var totalFiles = 0L + var copiedBytes = 0L + var copiedFiles = 0L + var lastReportedAt = System.nanoTime() + var windowStartedAt = lastReportedAt + var windowStartedBytes = 0L + var speed: Double? = null + + fun report(force: Boolean = false): FileCopyProgress? { + checkCancelled() + val now = System.nanoTime() + if (phase == FileCopyPhase.COPYING && now - windowStartedAt >= SPEED_WINDOW_NANOS) { + speed = (copiedBytes - windowStartedBytes) * 1_000_000_000.0 / (now - windowStartedAt) + windowStartedAt = now + windowStartedBytes = copiedBytes + } + if (!force && now - lastReportedAt < REPORT_INTERVAL_NANOS) return null + lastReportedAt = now + return FileCopyProgress( + phase, currentFile, copiedBytes, + totalBytes.takeUnless { phase == FileCopyPhase.SCANNING }, totalFiles = totalFiles, + copiedFiles = copiedFiles, bytesPerSecond = speed, + ).also(onProgress) + } + + fun select(path: Path) { + checkCancelled() + currentFile = sourcePath.relativize(path).toString().ifEmpty { source.name } + } + + report(force = true) + Files.walkFileTree(sourcePath, object : SimpleFileVisitor() { + override fun preVisitDirectory(dir: Path, attrs: BasicFileAttributes): FileVisitResult { + select(dir) + report() + return FileVisitResult.CONTINUE + } + + override fun visitFile(file: Path, attrs: BasicFileAttributes): FileVisitResult { + select(file) + require(attrs.isRegularFile || attrs.isSymbolicLink) { "Unsupported file type: $file" } + totalFiles = Math.addExact(totalFiles, 1L) + if (attrs.isRegularFile) totalBytes = Math.addExact(totalBytes, attrs.size()) + report() + return FileVisitResult.CONTINUE + } + }) + + phase = FileCopyPhase.COPYING + windowStartedAt = System.nanoTime() + windowStartedBytes = 0L + report(force = true) + if (attributes.isDirectory && !overwrite) { + destinationPath.parent?.let { Files.createDirectories(it) } + // 原子创建顶层目标,统计期间出现同名目录时也不能合并写入。 + Files.createDirectory(destinationPath) + } + // 整个任务复用这一块缓冲区,内存占用不随文件大小或文件数量增长。 + val buffer = ByteArray(BUFFER_SIZE) + Files.walkFileTree(sourcePath, object : SimpleFileVisitor() { + private fun target(path: Path): Path = destinationPath.resolve(sourcePath.relativize(path)) + + override fun preVisitDirectory(dir: Path, attrs: BasicFileAttributes): FileVisitResult { + select(dir) + Files.createDirectories(target(dir)) + report() + return FileVisitResult.CONTINUE + } + + override fun visitFile(file: Path, attrs: BasicFileAttributes): FileVisitResult { + select(file) + val target = target(file) + target.parent?.let { Files.createDirectories(it) } + if (attrs.isSymbolicLink) { + // 不遍历链接目标,避免目录环和将链接指向的外部目录一并复制。 + if (overwrite) Files.copy(file, target, LinkOption.NOFOLLOW_LINKS, StandardCopyOption.REPLACE_EXISTING) + else Files.copy(file, target, LinkOption.NOFOLLOW_LINKS) + } else { + require(attrs.isRegularFile) { "Unsupported file type: $file" } + val options = if (overwrite) { + arrayOf(StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING, StandardOpenOption.WRITE, LinkOption.NOFOLLOW_LINKS) + } else { + arrayOf(StandardOpenOption.CREATE_NEW, StandardOpenOption.WRITE, LinkOption.NOFOLLOW_LINKS) + } + var fileBytes = 0L + Files.newInputStream(file, LinkOption.NOFOLLOW_LINKS).use { input -> + Files.newOutputStream(target, *options).use { output -> + while (true) { + checkCancelled() + val count = input.read(buffer) + if (count < 0) break + if (count == 0) continue + output.write(buffer, 0, count) + fileBytes += count + copiedBytes += count + report() + } + } + } + if (fileBytes != attrs.size()) throw IOException("Source size changed while copying: $file") + } + copiedFiles++ + report() + return FileVisitResult.CONTINUE + } + }) + if (copiedBytes != totalBytes || copiedFiles != totalFiles) { + throw IOException("Source directory changed while copying: $source") + } + phase = FileCopyPhase.COMPLETED + return checkNotNull(report(force = true)) + } +} diff --git a/app/src/main/java/com/ai/assistance/operit/core/tools/defaultTool/standard/StandardFileSystemTools.kt b/app/src/main/java/com/ai/assistance/operit/core/tools/defaultTool/standard/StandardFileSystemTools.kt index 59f36e65c8..9b36d9c790 100644 --- a/app/src/main/java/com/ai/assistance/operit/core/tools/defaultTool/standard/StandardFileSystemTools.kt +++ b/app/src/main/java/com/ai/assistance/operit/core/tools/defaultTool/standard/StandardFileSystemTools.kt @@ -1,6 +1,13 @@ package com.ai.assistance.operit.core.tools.defaultTool.standard import android.content.Context +import com.ai.assistance.operit.core.files.transfer.FileCopyObserver +import com.ai.assistance.operit.core.files.transfer.FileCopyObservers +import com.ai.assistance.operit.core.files.transfer.LocalTransferPaths +import com.ai.assistance.operit.core.files.transfer.StreamingFileCopy +import kotlinx.coroutines.CancellationException +import kotlinx.coroutines.currentCoroutineContext +import kotlinx.coroutines.ensureActive import com.ai.assistance.operit.R import com.ai.assistance.operit.util.logging.AppLogger import com.ai.assistance.operit.api.chat.EnhancedAIService @@ -2417,30 +2424,52 @@ open class StandardFileSystemTools(protected val context: Context) { } } - /** Helper method to recursively copy a directory */ - private fun copyDirectory(sourceDir: File, destDir: File): Boolean { - try { - if (!destDir.exists()) { - destDir.mkdirs() - } - - sourceDir.listFiles()?.forEach { file -> - val destFile = File(destDir, file.name) - if (file.isDirectory) { - copyDirectory(file, destFile) - } else { - file.inputStream().use { input -> - destFile.outputStream().use { output -> - input.copyTo(output) - } - } - } - } + /** 目录内任一项失败都必须失败,避免移动操作在不完整复制后删除来源。 */ + private fun copyDirectory(sourceDir: File, destDir: File): Boolean = try { + StreamingFileCopy.copy(sourceDir, destDir, overwrite = true) + true + } catch (e: Exception) { + AppLogger.e(TAG, "Error copying directory", e) + false + } - return true + /** 本机复制直接连接两个文件流,保持二进制内容并提供任务独立的进度。 */ + private suspend fun copyLocalFile( + toolName: String, + sourcePath: String, + destPath: String, + sourceEnvironment: String, + destEnvironment: String, + recursive: Boolean, + observer: FileCopyObserver?, + ): ToolResult = withContext(Dispatchers.IO) { + try { + val executionContext = currentCoroutineContext() + val progress = StreamingFileCopy.copy( + source = LocalTransferPaths.resolve(context, sourcePath, sourceEnvironment), + destination = LocalTransferPaths.resolve(context, destPath, destEnvironment), + recursive = recursive, + overwrite = observer == null, + onProgress = { observer?.onProgress?.invoke(it) }, + checkCancelled = { + executionContext.ensureActive() + observer?.checkCancelled?.invoke() + }, + ) + ToolResult( + toolName = toolName, + success = true, + result = FileOperationData(operation = "copy", path = sourcePath, successful = true, + details = "Copied $sourceEnvironment:$sourcePath to $destEnvironment:$destPath (${progress.copiedBytes} bytes)"), + error = "", + ) + } catch (e: CancellationException) { + throw e } catch (e: Exception) { - AppLogger.e(TAG, "Error copying directory", e) - return false + AppLogger.e(TAG, "Error streaming local file copy", e) + ToolResult(toolName = toolName, success = false, + result = FileOperationData(operation = "copy", path = sourcePath, successful = false, details = e.message.orEmpty()), + error = "Failed to copy $sourcePath: ${e.message}") } } @@ -2704,7 +2733,7 @@ open class StandardFileSystemTools(protected val context: Context) { if (result.success) { copiedDirs++ } else { - AppLogger.w(TAG, "Failed to copy directory: $srcFullPath") + return result } } else { val result = copyFileCrossEnvironment( @@ -2718,7 +2747,7 @@ open class StandardFileSystemTools(protected val context: Context) { if (result.success) { copiedFiles++ } else { - AppLogger.w(TAG, "Failed to copy file: $srcFullPath") + return result } } } @@ -2799,6 +2828,23 @@ open class StandardFileSystemTools(protected val context: Context) { ) } + val observer = FileCopyObservers.find(tool.parameters.find { it.name == FileCopyObservers.PARAMETER }?.value) + val localEnvironments = listOf(srcEnv, dstEnv).all { + it.equals("android", ignoreCase = true) || it.equals("linux", ignoreCase = true) + } + val usesLinux = isLinuxEnvironment(srcEnv) || isLinuxEnvironment(dstEnv) + // 按实际后端选择传输:SSH 保持远程提供方,本机路径使用终端相同的软挂载映射。 + if (localEnvironments && (!usesLinux || !isSshFileSystemActive()) && + (usesLinux || observer != null)) { + if (!isLinuxEnvironment(srcEnv)) { + PathValidator.validateAndroidPath(sourcePath, tool.name, "source")?.let { return it } + } + if (!isLinuxEnvironment(dstEnv)) { + PathValidator.validateAndroidPath(destPath, tool.name, "destination")?.let { return it } + } + return copyLocalFile(tool.name, sourcePath, destPath, srcEnv, dstEnv, recursive, observer) + } + // 检查是否是跨环境复制 val isCrossEnvironment = srcEnv.lowercase() != dstEnv.lowercase() diff --git a/app/src/main/java/com/ai/assistance/operit/core/tools/packTool/PackageManager.kt b/app/src/main/java/com/ai/assistance/operit/core/tools/packTool/PackageManager.kt index 5df5c519d5..50325c9c0e 100644 --- a/app/src/main/java/com/ai/assistance/operit/core/tools/packTool/PackageManager.kt +++ b/app/src/main/java/com/ai/assistance/operit/core/tools/packTool/PackageManager.kt @@ -37,7 +37,7 @@ import com.ai.assistance.operit.data.preferences.androidPermissionPreferences import com.ai.assistance.operit.data.model.PackageToolPromptCategory import com.ai.assistance.operit.data.model.ToolPrompt import com.ai.assistance.operit.data.model.ToolResult -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.WorkspaceConfig +import com.ai.assistance.operit.ui.features.conversation.workspace.WorkspaceConfig import com.ai.assistance.operit.integrations.appwidget.ToolPkgDesktopWidgetHost import com.ai.assistance.operit.util.files.OperitPaths import com.ai.assistance.operit.util.ToolPkgWasmRuntime diff --git a/app/src/main/java/com/ai/assistance/operit/core/tools/packTool/PackageManagerToolPkgFacade.kt b/app/src/main/java/com/ai/assistance/operit/core/tools/packTool/PackageManagerToolPkgFacade.kt index 706d4a3a8d..6422ee9c55 100644 --- a/app/src/main/java/com/ai/assistance/operit/core/tools/packTool/PackageManagerToolPkgFacade.kt +++ b/app/src/main/java/com/ai/assistance/operit/core/tools/packTool/PackageManagerToolPkgFacade.kt @@ -5,7 +5,7 @@ import com.ai.assistance.operit.core.chat.logMessageTiming import com.ai.assistance.operit.core.chat.messageTimingNow import com.ai.assistance.operit.data.model.Workflow import com.ai.assistance.operit.data.repository.WorkflowRepository -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.WorkspaceConfigReader +import com.ai.assistance.operit.ui.features.conversation.workspace.WorkspaceConfigReader import com.ai.assistance.operit.util.logging.AppLogger import java.io.File import java.nio.charset.StandardCharsets diff --git a/app/src/main/java/com/ai/assistance/operit/plugins/toolpkg/ToolPkgChatInputHookBridge.kt b/app/src/main/java/com/ai/assistance/operit/plugins/toolpkg/ToolPkgChatInputHookBridge.kt index 3a91f93f67..cbdb5da755 100644 --- a/app/src/main/java/com/ai/assistance/operit/plugins/toolpkg/ToolPkgChatInputHookBridge.kt +++ b/app/src/main/java/com/ai/assistance/operit/plugins/toolpkg/ToolPkgChatInputHookBridge.kt @@ -4,12 +4,12 @@ import com.ai.assistance.operit.core.tools.packTool.PackageManager import com.ai.assistance.operit.core.tools.packTool.TOOLPKG_EVENT_CHAT_INPUT import com.ai.assistance.operit.core.tools.packTool.ToolPkgContainerRuntime import com.ai.assistance.operit.R -import com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.common.ChatInputEvents -import com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.common.ChatInputHook -import com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.common.ChatInputHookContext -import com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.common.ChatInputHookRegistry -import com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.common.ChatInputHookResult -import com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.common.ChatInputSubmitActions +import com.ai.assistance.operit.ui.features.conversation.chat.modules.input.common.ChatInputEvents +import com.ai.assistance.operit.ui.features.conversation.chat.modules.input.common.ChatInputHook +import com.ai.assistance.operit.ui.features.conversation.chat.modules.input.common.ChatInputHookContext +import com.ai.assistance.operit.ui.features.conversation.chat.modules.input.common.ChatInputHookRegistry +import com.ai.assistance.operit.ui.features.conversation.chat.modules.input.common.ChatInputHookResult +import com.ai.assistance.operit.ui.features.conversation.chat.modules.input.common.ChatInputSubmitActions import com.ai.assistance.operit.util.logging.AppLogger import java.util.concurrent.atomic.AtomicBoolean import kotlinx.coroutines.Dispatchers diff --git a/app/src/main/java/com/ai/assistance/operit/plugins/toolpkg/ToolPkgCommonBridgePlugin.kt b/app/src/main/java/com/ai/assistance/operit/plugins/toolpkg/ToolPkgCommonBridgePlugin.kt index 0be989b6df..6635097465 100644 --- a/app/src/main/java/com/ai/assistance/operit/plugins/toolpkg/ToolPkgCommonBridgePlugin.kt +++ b/app/src/main/java/com/ai/assistance/operit/plugins/toolpkg/ToolPkgCommonBridgePlugin.kt @@ -21,10 +21,10 @@ import com.ai.assistance.operit.plugins.OperitPlugin import com.ai.assistance.operit.ui.common.markdown.XmlRenderPlugin import com.ai.assistance.operit.ui.common.markdown.XmlRenderPluginRegistry import com.ai.assistance.operit.ui.common.markdown.XmlRenderResult -import com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.common.InputMenuToggleDefinition -import com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.common.InputMenuToggleHookParams -import com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.common.InputMenuTogglePlugin -import com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.common.InputMenuTogglePluginRegistry +import com.ai.assistance.operit.ui.features.conversation.chat.modules.input.common.InputMenuToggleDefinition +import com.ai.assistance.operit.ui.features.conversation.chat.modules.input.common.InputMenuToggleHookParams +import com.ai.assistance.operit.ui.features.conversation.chat.modules.input.common.InputMenuTogglePlugin +import com.ai.assistance.operit.ui.features.conversation.chat.modules.input.common.InputMenuTogglePluginRegistry import com.ai.assistance.operit.util.logging.AppLogger import com.ai.assistance.operit.util.stream.Stream import com.ai.assistance.operit.core.tools.packTool.ToolPkgXmlRenderHookComposeDslResult diff --git a/app/src/main/java/com/ai/assistance/operit/services/ChatServiceCore.kt b/app/src/main/java/com/ai/assistance/operit/services/ChatServiceCore.kt index af44f95dbf..5000531bab 100644 --- a/app/src/main/java/com/ai/assistance/operit/services/ChatServiceCore.kt +++ b/app/src/main/java/com/ai/assistance/operit/services/ChatServiceCore.kt @@ -18,7 +18,7 @@ import com.ai.assistance.operit.services.core.MessageProcessingDelegate import com.ai.assistance.operit.services.core.TokenStatisticsDelegate import com.ai.assistance.operit.core.tools.AIToolHandler import com.ai.assistance.operit.ui.features.conversation.chat.viewmodel.UiStateDelegate -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.process.WorkspaceChangeTracker +import com.ai.assistance.operit.ui.features.conversation.workspace.process.WorkspaceChangeTracker import com.ai.assistance.operit.util.stream.SharedStream import kotlinx.coroutines.* import kotlinx.coroutines.flow.collect diff --git a/app/src/main/java/com/ai/assistance/operit/services/core/MessageProcessingDelegate.kt b/app/src/main/java/com/ai/assistance/operit/services/core/MessageProcessingDelegate.kt index a6ef2cafe7..b1732d5ae8 100644 --- a/app/src/main/java/com/ai/assistance/operit/services/core/MessageProcessingDelegate.kt +++ b/app/src/main/java/com/ai/assistance/operit/services/core/MessageProcessingDelegate.kt @@ -33,7 +33,7 @@ import com.ai.assistance.operit.data.preferences.WaifuPreferences import com.ai.assistance.operit.data.preferences.FunctionalConfigManager import com.ai.assistance.operit.data.preferences.ModelConfigManager import com.ai.assistance.operit.data.preferences.UserPreferencesManager -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.WorkspaceBackupManager +import com.ai.assistance.operit.ui.features.conversation.workspace.WorkspaceBackupManager import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers diff --git a/app/src/main/java/com/ai/assistance/operit/ui/common/markdown/CanvasMonospaceCodeBlockBody.kt b/app/src/main/java/com/ai/assistance/operit/ui/common/markdown/CanvasMonospaceCodeBlockBody.kt index b2e11aa75b..3610ed8175 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/common/markdown/CanvasMonospaceCodeBlockBody.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/common/markdown/CanvasMonospaceCodeBlockBody.kt @@ -47,8 +47,8 @@ import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor.editorCellWidth -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor.editorNextSymbolOffset +import com.ai.assistance.operit.ui.features.conversation.workspace.editor.editorCellWidth +import com.ai.assistance.operit.ui.features.conversation.workspace.editor.editorNextSymbolOffset import kotlinx.coroutines.launch import kotlin.math.abs import kotlin.math.ceil diff --git a/app/src/main/java/com/ai/assistance/operit/ui/common/markdown/XmlRenderPluginRegistry.kt b/app/src/main/java/com/ai/assistance/operit/ui/common/markdown/XmlRenderPluginRegistry.kt index 1fad1b4a23..c92ccf534e 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/common/markdown/XmlRenderPluginRegistry.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/common/markdown/XmlRenderPluginRegistry.kt @@ -1,6 +1,6 @@ package com.ai.assistance.operit.ui.common.markdown -import com.ai.assistance.operit.ui.features.conversation.chat.voicemessages.VoiceMessageXmlPlugin +import com.ai.assistance.operit.ui.features.conversation.chat.modules.voice.VoiceMessageXmlPlugin import androidx.compose.material3.Text import androidx.compose.runtime.Composable diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/computer/ComputerScreen.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/automation/terminal/ComputerScreen.kt similarity index 56% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/computer/ComputerScreen.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/automation/terminal/ComputerScreen.kt index 2e33bf5d5e..a23034d9e0 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/computer/ComputerScreen.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/automation/terminal/ComputerScreen.kt @@ -1,10 +1,8 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.computer +package com.ai.assistance.operit.ui.features.automation.terminal import android.os.Build import androidx.annotation.RequiresApi import androidx.compose.runtime.Composable -import com.ai.assistance.operit.ui.features.automation.terminal.EmbeddedTerminalPage -import com.ai.assistance.operit.ui.features.automation.terminal.EmbeddedTerminalScreen @RequiresApi(Build.VERSION_CODES.O) @Composable diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/README.md b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/README.md deleted file mode 100644 index a5733e6aeb..0000000000 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/README.md +++ /dev/null @@ -1,16 +0,0 @@ -这里是从 Jetpack Compose Foundation 提取并本地化的 `LazyColumn` 相关源码。 - -- 来源版本:`androidx.compose.foundation:foundation-android:1.10.4` -- 入口文件:[RecyclerLazyColumn.kt](D:/Code/prog/assistance/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/RecyclerLazyColumn.kt) -- 核心布局:[LazyList.kt](D:/Code/prog/assistance/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyList.kt) -- 核心测量:[LazyListMeasure.kt](D:/Code/prog/assistance/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyListMeasure.kt) -- 状态管理:[LazyListState.kt](D:/Code/prog/assistance/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyListState.kt) - -处理方式: - -- 已改为本地包名 `com.ai.assistance.operit.ui.features.conversation.chat.components.lazy` -- 文件全部平铺在当前目录下,不再保留上游多级目录 -- `LazyColumn` 入口已重命名为 `RecyclerLazyColumn` -- 仅保留 `LazyColumn/LazyList` 这条链路相关文件,没有带入 `grid` 和 `staggeredgrid` - -这批文件目前是为了后续魔改准备的本地副本,这次没有执行编译、构建或测试。 diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/TokenHitRateFormat.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/format/TokenHitRateFormat.kt similarity index 88% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/TokenHitRateFormat.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/format/TokenHitRateFormat.kt index 56ae121a2b..9ef02204f1 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/TokenHitRateFormat.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/format/TokenHitRateFormat.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components +package com.ai.assistance.operit.ui.features.conversation.chat.foundation.format import java.util.Locale import kotlin.math.floor diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/CompactDialogLayout.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/layout/CompactDialogLayout.kt similarity index 97% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/CompactDialogLayout.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/layout/CompactDialogLayout.kt index 7cad522d53..cd770bb00b 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/CompactDialogLayout.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/layout/CompactDialogLayout.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components +package com.ai.assistance.operit.ui.features.conversation.chat.foundation.layout import androidx.compose.foundation.ScrollState import androidx.compose.foundation.layout.heightIn diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/AwaitFirstLayoutModifier.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/AwaitFirstLayoutModifier.kt similarity index 93% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/AwaitFirstLayoutModifier.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/AwaitFirstLayoutModifier.kt index f4b14b2d2a..c573c9fcc1 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/AwaitFirstLayoutModifier.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/AwaitFirstLayoutModifier.kt @@ -14,9 +14,9 @@ * limitations under the License. */ -package com.ai.assistance.operit.ui.features.conversation.chat.components.lazy +package com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy -import com.ai.assistance.operit.ui.features.conversation.chat.components.lazy.AwaitFirstLayoutModifier.Node +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy.AwaitFirstLayoutModifier.Node import androidx.compose.ui.Modifier import androidx.compose.ui.layout.registerOnLayoutRectChanged import androidx.compose.ui.node.DelegatableNode diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/CacheWindowLogic.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/CacheWindowLogic.kt similarity index 99% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/CacheWindowLogic.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/CacheWindowLogic.kt index c422b3f28a..fdd17229f1 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/CacheWindowLogic.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/CacheWindowLogic.kt @@ -14,12 +14,12 @@ * limitations under the License. */ -package com.ai.assistance.operit.ui.features.conversation.chat.components.lazy +package com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy import androidx.collection.mutableIntObjectMapOf import androidx.collection.mutableIntSetOf import androidx.compose.foundation.ExperimentalFoundationApi -import com.ai.assistance.operit.ui.features.conversation.chat.components.lazy.LazyLayoutPrefetchState.PrefetchHandle +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy.LazyLayoutPrefetchState.PrefetchHandle import androidx.compose.ui.unit.Density import androidx.compose.ui.util.fastForEach import androidx.compose.ui.util.traceValue diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/IntervalList.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/IntervalList.kt similarity index 98% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/IntervalList.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/IntervalList.kt index ffd810befd..1a2e2a6bad 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/IntervalList.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/IntervalList.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.ai.assistance.operit.ui.features.conversation.chat.components.lazy +package com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy import androidx.compose.foundation.internal.requirePrecondition import androidx.compose.foundation.internal.throwIndexOutOfBoundsException diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyItemScope.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyItemScope.kt similarity index 98% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyItemScope.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyItemScope.kt index d8caf2d9d2..3b3da261fa 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyItemScope.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyItemScope.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.ai.assistance.operit.ui.features.conversation.chat.components.lazy +package com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy import androidx.annotation.FloatRange import androidx.compose.animation.core.FiniteAnimationSpec diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyItemScopeImpl.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyItemScopeImpl.kt similarity index 96% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyItemScopeImpl.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyItemScopeImpl.kt index 3c0abcb263..5c657dd691 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyItemScopeImpl.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyItemScopeImpl.kt @@ -14,10 +14,10 @@ * limitations under the License. */ -package com.ai.assistance.operit.ui.features.conversation.chat.components.lazy +package com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy import androidx.compose.animation.core.FiniteAnimationSpec -import com.ai.assistance.operit.ui.features.conversation.chat.components.lazy.LazyLayoutAnimateItemElement +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy.LazyLayoutAnimateItemElement import androidx.compose.runtime.State import androidx.compose.runtime.mutableIntStateOf import androidx.compose.ui.Modifier diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayout.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayout.kt similarity index 99% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayout.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayout.kt index 3344ec3f65..105d1c2259 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayout.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayout.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.ai.assistance.operit.ui.features.conversation.chat.components.lazy +package com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy import androidx.collection.mutableObjectIntMapOf import androidx.compose.foundation.ExperimentalFoundationApi diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutBeyondBoundsInfo.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutBeyondBoundsInfo.kt similarity index 98% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutBeyondBoundsInfo.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutBeyondBoundsInfo.kt index 478877ba44..843d66b35f 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutBeyondBoundsInfo.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutBeyondBoundsInfo.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.ai.assistance.operit.ui.features.conversation.chat.components.lazy +package com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy import androidx.compose.foundation.internal.requirePrecondition import androidx.compose.runtime.collection.mutableVectorOf diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutBeyondBoundsModifierLocal.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutBeyondBoundsModifierLocal.kt similarity index 97% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutBeyondBoundsModifierLocal.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutBeyondBoundsModifierLocal.kt index d1a20da84c..cb06374aaa 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutBeyondBoundsModifierLocal.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutBeyondBoundsModifierLocal.kt @@ -14,10 +14,10 @@ * limitations under the License. */ -package com.ai.assistance.operit.ui.features.conversation.chat.components.lazy +package com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy import androidx.compose.foundation.gestures.Orientation -import com.ai.assistance.operit.ui.features.conversation.chat.components.lazy.LazyLayoutBeyondBoundsInfo.Interval +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy.LazyLayoutBeyondBoundsInfo.Interval import androidx.compose.ui.Modifier import androidx.compose.ui.layout.BeyondBoundsLayout import androidx.compose.ui.layout.BeyondBoundsLayout.BeyondBoundsScope diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutBeyondBoundsState.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutBeyondBoundsState.kt similarity index 96% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutBeyondBoundsState.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutBeyondBoundsState.kt index 23e239aa47..98f6ed7874 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutBeyondBoundsState.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutBeyondBoundsState.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.ai.assistance.operit.ui.features.conversation.chat.components.lazy +package com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.ui.util.fastForEach diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutCacheWindow.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutCacheWindow.kt similarity index 98% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutCacheWindow.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutCacheWindow.kt index acaf89e590..85b49f1b1f 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutCacheWindow.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutCacheWindow.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.ai.assistance.operit.ui.features.conversation.chat.components.lazy +package com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy import androidx.annotation.FloatRange import androidx.compose.foundation.ExperimentalFoundationApi diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutIntervalContent.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutIntervalContent.kt similarity index 97% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutIntervalContent.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutIntervalContent.kt index 3aefc1fc7f..b8c61cc29c 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutIntervalContent.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutIntervalContent.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.ai.assistance.operit.ui.features.conversation.chat.components.lazy +package com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy /** * Common parts backing the interval-based content of lazy layout defined through `item` DSL. diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutItemAnimation.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutItemAnimation.kt similarity index 99% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutItemAnimation.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutItemAnimation.kt index d30dd43809..198a9dbf33 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutItemAnimation.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutItemAnimation.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.ai.assistance.operit.ui.features.conversation.chat.components.lazy +package com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy import androidx.compose.animation.core.Animatable import androidx.compose.animation.core.FiniteAnimationSpec diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutItemAnimator.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutItemAnimator.kt similarity index 99% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutItemAnimator.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutItemAnimator.kt index 555fb89bf2..d497e49635 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutItemAnimator.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutItemAnimator.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.ai.assistance.operit.ui.features.conversation.chat.components.lazy +package com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy import androidx.collection.mutableScatterMapOf import androidx.collection.mutableScatterSetOf diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutItemContentFactory.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutItemContentFactory.kt similarity index 98% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutItemContentFactory.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutItemContentFactory.kt index 5bc163a3a0..007cda93d1 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutItemContentFactory.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutItemContentFactory.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.ai.assistance.operit.ui.features.conversation.chat.components.lazy +package com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy import androidx.collection.mutableScatterMapOf import androidx.compose.runtime.Composable diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutItemProvider.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutItemProvider.kt similarity index 98% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutItemProvider.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutItemProvider.kt index b64b65c892..02d27e1dcf 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutItemProvider.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutItemProvider.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.ai.assistance.operit.ui.features.conversation.chat.components.lazy +package com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy import androidx.annotation.IntRange import androidx.compose.runtime.Composable diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutKeyIndexMap.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutKeyIndexMap.kt similarity index 97% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutKeyIndexMap.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutKeyIndexMap.kt index 89bf173504..a752dbb3cd 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutKeyIndexMap.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutKeyIndexMap.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.ai.assistance.operit.ui.features.conversation.chat.components.lazy +package com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy import androidx.collection.MutableObjectIntMap import androidx.collection.ObjectIntMap diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutMeasurePolicy.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutMeasurePolicy.kt similarity index 94% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutMeasurePolicy.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutMeasurePolicy.kt index 9a01033193..0c3f0c068d 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutMeasurePolicy.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutMeasurePolicy.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.ai.assistance.operit.ui.features.conversation.chat.components.lazy +package com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy import androidx.compose.ui.layout.Measurable import androidx.compose.ui.layout.MeasureResult diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutMeasureScope.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutMeasureScope.kt similarity index 98% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutMeasureScope.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutMeasureScope.kt index 0e93f79ac0..07c79613ec 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutMeasureScope.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutMeasureScope.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.ai.assistance.operit.ui.features.conversation.chat.components.lazy +package com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy import androidx.annotation.IntRange as AndroidXIntRange import androidx.collection.mutableIntObjectMapOf diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutMeasuredItem.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutMeasuredItem.kt similarity index 97% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutMeasuredItem.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutMeasuredItem.kt index 2a8a6feeba..9364f6e32f 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutMeasuredItem.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutMeasuredItem.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.ai.assistance.operit.ui.features.conversation.chat.components.lazy +package com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy import androidx.collection.mutableIntObjectMapOf import androidx.compose.ui.layout.Placeable diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutNearestRangeState.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutNearestRangeState.kt similarity index 96% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutNearestRangeState.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutNearestRangeState.kt index 6ba6cdce24..219168fbbb 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutNearestRangeState.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutNearestRangeState.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.ai.assistance.operit.ui.features.conversation.chat.components.lazy +package com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy import androidx.compose.runtime.State import androidx.compose.runtime.getValue diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutPinnableItem.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutPinnableItem.kt similarity index 98% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutPinnableItem.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutPinnableItem.kt index d945dcac0b..9224139a44 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutPinnableItem.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutPinnableItem.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.ai.assistance.operit.ui.features.conversation.chat.components.lazy +package com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy import androidx.compose.foundation.internal.checkPrecondition import androidx.compose.runtime.Composable diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutPlatform.android.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutPlatform.android.kt similarity index 94% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutPlatform.android.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutPlatform.android.kt index 9092d263ae..385966233d 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutPlatform.android.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutPlatform.android.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.ai.assistance.operit.ui.features.conversation.chat.components.lazy +package com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy import android.annotation.SuppressLint import android.os.Parcel diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutPrefetchState.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutPrefetchState.kt similarity index 99% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutPrefetchState.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutPrefetchState.kt index 4bffcd30e0..7c9b918819 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutPrefetchState.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutPrefetchState.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.ai.assistance.operit.ui.features.conversation.chat.components.lazy +package com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy import androidx.annotation.IntRange import androidx.annotation.VisibleForTesting @@ -24,8 +24,8 @@ import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.internal.checkPrecondition import androidx.compose.foundation.internal.requirePrecondition import androidx.compose.foundation.internal.requirePreconditionNotNull -import com.ai.assistance.operit.ui.features.conversation.chat.components.lazy.LazyLayoutPrefetchState.PrefetchHandle -import com.ai.assistance.operit.ui.features.conversation.chat.components.lazy.LazyLayoutPrefetchState.PrefetchResultScope +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy.LazyLayoutPrefetchState.PrefetchHandle +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy.LazyLayoutPrefetchState.PrefetchResultScope import androidx.compose.runtime.Stable import androidx.compose.ui.Modifier import androidx.compose.ui.layout.SubcomposeLayoutState diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutScrollDeltaBetweenPasses.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutScrollDeltaBetweenPasses.kt similarity index 97% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutScrollDeltaBetweenPasses.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutScrollDeltaBetweenPasses.kt index dbe1e1f3ea..8400c4e6c8 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutScrollDeltaBetweenPasses.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutScrollDeltaBetweenPasses.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.ai.assistance.operit.ui.features.conversation.chat.components.lazy +package com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy import androidx.compose.animation.core.AnimationState import androidx.compose.animation.core.AnimationVector1D diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutScrollScope.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutScrollScope.kt similarity index 99% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutScrollScope.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutScrollScope.kt index 6c9b13cc56..9e985a0056 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutScrollScope.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutScrollScope.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.ai.assistance.operit.ui.features.conversation.chat.components.lazy +package com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy import androidx.compose.animation.core.AnimationState import androidx.compose.animation.core.AnimationVector1D diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutSemanticState.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutSemanticState.kt similarity index 86% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutSemanticState.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutSemanticState.kt index 1e4c27022a..bec6f9752d 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutSemanticState.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutSemanticState.kt @@ -14,12 +14,12 @@ * limitations under the License. */ -package com.ai.assistance.operit.ui.features.conversation.chat.components.lazy +package com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy import androidx.compose.foundation.gestures.Orientation -import com.ai.assistance.operit.ui.features.conversation.chat.components.lazy.LazyLayoutSemanticState -import com.ai.assistance.operit.ui.features.conversation.chat.components.lazy.estimatedLazyMaxScrollOffset -import com.ai.assistance.operit.ui.features.conversation.chat.components.lazy.estimatedLazyScrollOffset +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy.LazyLayoutSemanticState +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy.estimatedLazyMaxScrollOffset +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy.estimatedLazyScrollOffset import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue import androidx.compose.ui.semantics.CollectionInfo diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutSemantics.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutSemantics.kt similarity index 99% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutSemantics.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutSemantics.kt index bc317c32b5..50826e8ee0 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutSemantics.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutSemantics.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.ai.assistance.operit.ui.features.conversation.chat.components.lazy +package com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.gestures.Orientation diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutStickyItems.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutStickyItems.kt similarity index 99% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutStickyItems.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutStickyItems.kt index b7d037db5a..997643df05 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutStickyItems.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutStickyItems.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.ai.assistance.operit.ui.features.conversation.chat.components.lazy +package com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy import androidx.collection.IntList import androidx.collection.emptyIntList diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyList.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyList.kt similarity index 95% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyList.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyList.kt index 739bf237a3..80ae7f270d 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyList.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyList.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.ai.assistance.operit.ui.features.conversation.chat.components.lazy +package com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.OverscrollEffect @@ -26,13 +26,13 @@ import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.calculateEndPadding import androidx.compose.foundation.layout.calculateStartPadding -import com.ai.assistance.operit.ui.features.conversation.chat.components.lazy.CacheWindowLogic -import com.ai.assistance.operit.ui.features.conversation.chat.components.lazy.LazyLayout -import com.ai.assistance.operit.ui.features.conversation.chat.components.lazy.LazyLayoutMeasurePolicy -import com.ai.assistance.operit.ui.features.conversation.chat.components.lazy.StickyItemsPlacement -import com.ai.assistance.operit.ui.features.conversation.chat.components.lazy.calculateLazyLayoutPinnedIndices -import com.ai.assistance.operit.ui.features.conversation.chat.components.lazy.lazyLayoutBeyondBoundsModifier -import com.ai.assistance.operit.ui.features.conversation.chat.components.lazy.lazyLayoutSemantics +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy.CacheWindowLogic +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy.LazyLayout +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy.LazyLayoutMeasurePolicy +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy.StickyItemsPlacement +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy.calculateLazyLayoutPinnedIndices +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy.lazyLayoutBeyondBoundsModifier +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy.lazyLayoutSemantics import androidx.compose.foundation.scrollableArea import androidx.compose.runtime.Composable import androidx.compose.runtime.remember diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyListBeyondBoundsModifier.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyListBeyondBoundsModifier.kt similarity index 91% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyListBeyondBoundsModifier.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyListBeyondBoundsModifier.kt index a85eca87fb..639138d77f 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyListBeyondBoundsModifier.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyListBeyondBoundsModifier.kt @@ -14,9 +14,9 @@ * limitations under the License. */ -package com.ai.assistance.operit.ui.features.conversation.chat.components.lazy +package com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy -import com.ai.assistance.operit.ui.features.conversation.chat.components.lazy.LazyLayoutBeyondBoundsState +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy.LazyLayoutBeyondBoundsState import androidx.compose.runtime.Composable import androidx.compose.runtime.remember diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyListCacheWindowStrategy.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyListCacheWindowStrategy.kt similarity index 88% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyListCacheWindowStrategy.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyListCacheWindowStrategy.kt index 23c8f619fa..fc45713b4b 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyListCacheWindowStrategy.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyListCacheWindowStrategy.kt @@ -14,15 +14,15 @@ * limitations under the License. */ -package com.ai.assistance.operit.ui.features.conversation.chat.components.lazy +package com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy import androidx.compose.foundation.ExperimentalFoundationApi -import com.ai.assistance.operit.ui.features.conversation.chat.components.lazy.CacheWindowLogic -import com.ai.assistance.operit.ui.features.conversation.chat.components.lazy.CacheWindowScope -import com.ai.assistance.operit.ui.features.conversation.chat.components.lazy.InvalidIndex -import com.ai.assistance.operit.ui.features.conversation.chat.components.lazy.LazyLayoutCacheWindow -import com.ai.assistance.operit.ui.features.conversation.chat.components.lazy.LazyLayoutPrefetchState.PrefetchHandle -import com.ai.assistance.operit.ui.features.conversation.chat.components.lazy.NestedPrefetchScope +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy.CacheWindowLogic +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy.CacheWindowScope +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy.InvalidIndex +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy.LazyLayoutCacheWindow +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy.LazyLayoutPrefetchState.PrefetchHandle +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy.NestedPrefetchScope import androidx.compose.ui.unit.Density import kotlin.math.absoluteValue diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyListIntervalContent.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyListIntervalContent.kt similarity index 90% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyListIntervalContent.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyListIntervalContent.kt index fdf3a31e3c..331f26e6b8 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyListIntervalContent.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyListIntervalContent.kt @@ -14,14 +14,14 @@ * limitations under the License. */ -package com.ai.assistance.operit.ui.features.conversation.chat.components.lazy +package com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy import androidx.collection.IntList import androidx.collection.MutableIntList import androidx.collection.emptyIntList import androidx.collection.mutableIntListOf -import com.ai.assistance.operit.ui.features.conversation.chat.components.lazy.LazyLayoutIntervalContent -import com.ai.assistance.operit.ui.features.conversation.chat.components.lazy.MutableIntervalList +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy.LazyLayoutIntervalContent +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy.MutableIntervalList import androidx.compose.runtime.Composable internal class LazyListIntervalContent(content: LazyListScope.() -> Unit) : diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyListItemInfo.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyListItemInfo.kt similarity index 94% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyListItemInfo.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyListItemInfo.kt index 88574db555..3cbdaa1e45 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyListItemInfo.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyListItemInfo.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.ai.assistance.operit.ui.features.conversation.chat.components.lazy +package com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy /** * Contains useful information about an individual item in lazy lists like [LazyColumn] or diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyListItemProvider.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyListItemProvider.kt similarity index 88% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyListItemProvider.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyListItemProvider.kt index 53a568b7e6..af2e16831a 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyListItemProvider.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyListItemProvider.kt @@ -14,13 +14,13 @@ * limitations under the License. */ -package com.ai.assistance.operit.ui.features.conversation.chat.components.lazy +package com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy import androidx.collection.IntList -import com.ai.assistance.operit.ui.features.conversation.chat.components.lazy.LazyLayoutItemProvider -import com.ai.assistance.operit.ui.features.conversation.chat.components.lazy.LazyLayoutKeyIndexMap -import com.ai.assistance.operit.ui.features.conversation.chat.components.lazy.LazyLayoutPinnableItem -import com.ai.assistance.operit.ui.features.conversation.chat.components.lazy.NearestRangeKeyIndexMap +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy.LazyLayoutItemProvider +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy.LazyLayoutKeyIndexMap +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy.LazyLayoutPinnableItem +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy.NearestRangeKeyIndexMap import androidx.compose.runtime.Composable import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.referentialEqualityPolicy diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyListLayoutInfo.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyListLayoutInfo.kt similarity index 98% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyListLayoutInfo.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyListLayoutInfo.kt index 715fea8cf6..d6646a34e0 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyListLayoutInfo.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyListLayoutInfo.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.ai.assistance.operit.ui.features.conversation.chat.components.lazy +package com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy import androidx.compose.foundation.gestures.Orientation import androidx.compose.ui.unit.IntSize diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyListMeasure.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyListMeasure.kt similarity index 97% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyListMeasure.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyListMeasure.kt index 4197f03685..afad98e1ed 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyListMeasure.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyListMeasure.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.ai.assistance.operit.ui.features.conversation.chat.components.lazy +package com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.gestures.Orientation @@ -22,11 +22,11 @@ import androidx.compose.foundation.internal.checkPrecondition import androidx.compose.foundation.internal.requirePrecondition import androidx.compose.foundation.internal.requirePreconditionNotNull import androidx.compose.foundation.layout.Arrangement -import com.ai.assistance.operit.ui.features.conversation.chat.components.lazy.LazyLayoutItemAnimator -import com.ai.assistance.operit.ui.features.conversation.chat.components.lazy.ObservableScopeInvalidator -import com.ai.assistance.operit.ui.features.conversation.chat.components.lazy.StickyItemsPlacement -import com.ai.assistance.operit.ui.features.conversation.chat.components.lazy.applyStickyItems -import com.ai.assistance.operit.ui.features.conversation.chat.components.lazy.updatedVisibleItems +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy.LazyLayoutItemAnimator +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy.ObservableScopeInvalidator +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy.StickyItemsPlacement +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy.applyStickyItems +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy.updatedVisibleItems import androidx.compose.ui.graphics.GraphicsContext import androidx.compose.ui.layout.MeasureResult import androidx.compose.ui.layout.Placeable diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyListMeasureResult.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyListMeasureResult.kt similarity index 99% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyListMeasureResult.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyListMeasureResult.kt index 65c2b33777..33a32ca351 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyListMeasureResult.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyListMeasureResult.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.ai.assistance.operit.ui.features.conversation.chat.components.lazy +package com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy import androidx.compose.foundation.gestures.Orientation import androidx.compose.ui.layout.MeasureResult diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyListMeasuredItem.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyListMeasuredItem.kt similarity index 96% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyListMeasuredItem.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyListMeasuredItem.kt index a8c6d48ebe..694664531a 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyListMeasuredItem.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyListMeasuredItem.kt @@ -14,13 +14,13 @@ * limitations under the License. */ -package com.ai.assistance.operit.ui.features.conversation.chat.components.lazy +package com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy import androidx.compose.foundation.internal.requirePrecondition import androidx.compose.foundation.internal.requirePreconditionNotNull -import com.ai.assistance.operit.ui.features.conversation.chat.components.lazy.LazyLayoutItemAnimation.Companion.NotInitialized -import com.ai.assistance.operit.ui.features.conversation.chat.components.lazy.LazyLayoutItemAnimator -import com.ai.assistance.operit.ui.features.conversation.chat.components.lazy.LazyLayoutMeasuredItem +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy.LazyLayoutItemAnimation.Companion.NotInitialized +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy.LazyLayoutItemAnimator +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy.LazyLayoutMeasuredItem import androidx.compose.ui.Alignment import androidx.compose.ui.graphics.layer.GraphicsLayer import androidx.compose.ui.layout.Placeable diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyListMeasuredItemProvider.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyListMeasuredItemProvider.kt similarity index 87% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyListMeasuredItemProvider.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyListMeasuredItemProvider.kt index 4009394f4d..4e33fe42a2 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyListMeasuredItemProvider.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyListMeasuredItemProvider.kt @@ -14,12 +14,12 @@ * limitations under the License. */ -package com.ai.assistance.operit.ui.features.conversation.chat.components.lazy +package com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy import androidx.collection.IntList -import com.ai.assistance.operit.ui.features.conversation.chat.components.lazy.LazyLayoutKeyIndexMap -import com.ai.assistance.operit.ui.features.conversation.chat.components.lazy.LazyLayoutMeasureScope -import com.ai.assistance.operit.ui.features.conversation.chat.components.lazy.LazyLayoutMeasuredItemProvider +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy.LazyLayoutKeyIndexMap +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy.LazyLayoutMeasureScope +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy.LazyLayoutMeasuredItemProvider import androidx.compose.ui.layout.Placeable import androidx.compose.ui.unit.Constraints diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyListPrefetchStrategy.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyListPrefetchStrategy.kt similarity index 96% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyListPrefetchStrategy.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyListPrefetchStrategy.kt index 0c9ed8c2f5..3d69741fc1 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyListPrefetchStrategy.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyListPrefetchStrategy.kt @@ -16,13 +16,13 @@ @file:Suppress("DEPRECATION") // b/420551535 -package com.ai.assistance.operit.ui.features.conversation.chat.components.lazy +package com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy import androidx.compose.foundation.ExperimentalFoundationApi -import com.ai.assistance.operit.ui.features.conversation.chat.components.lazy.LazyLayoutPrefetchState -import com.ai.assistance.operit.ui.features.conversation.chat.components.lazy.NestedPrefetchScope -import com.ai.assistance.operit.ui.features.conversation.chat.components.lazy.PrefetchScheduler -import com.ai.assistance.operit.ui.features.conversation.chat.components.lazy.UnspecifiedNestedPrefetchCount +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy.LazyLayoutPrefetchState +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy.NestedPrefetchScope +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy.PrefetchScheduler +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy.UnspecifiedNestedPrefetchCount import androidx.compose.runtime.Stable /** diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyListScrollPosition.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyListScrollPosition.kt similarity index 94% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyListScrollPosition.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyListScrollPosition.kt index a19733b7a2..948f2a7824 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyListScrollPosition.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyListScrollPosition.kt @@ -14,13 +14,13 @@ * limitations under the License. */ -package com.ai.assistance.operit.ui.features.conversation.chat.components.lazy +package com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.internal.checkPrecondition import androidx.compose.foundation.internal.requirePrecondition -import com.ai.assistance.operit.ui.features.conversation.chat.components.lazy.LazyLayoutNearestRangeState -import com.ai.assistance.operit.ui.features.conversation.chat.components.lazy.findIndexByKey +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy.LazyLayoutNearestRangeState +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy.findIndexByKey import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.setValue diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyListScrollScope.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyListScrollScope.kt similarity index 93% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyListScrollScope.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyListScrollScope.kt index a3561f5fa1..f815f3fdfc 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyListScrollScope.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyListScrollScope.kt @@ -14,10 +14,10 @@ * limitations under the License. */ -package com.ai.assistance.operit.ui.features.conversation.chat.components.lazy +package com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy import androidx.compose.foundation.gestures.ScrollScope -import com.ai.assistance.operit.ui.features.conversation.chat.components.lazy.LazyLayoutScrollScope +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy.LazyLayoutScrollScope import androidx.compose.ui.util.fastFirstOrNull /** diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyListSemantics.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyListSemantics.kt similarity index 84% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyListSemantics.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyListSemantics.kt index 85d1bff1d6..f0d3518ad1 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyListSemantics.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyListSemantics.kt @@ -14,9 +14,9 @@ * limitations under the License. */ -package com.ai.assistance.operit.ui.features.conversation.chat.components.lazy +package com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy -import com.ai.assistance.operit.ui.features.conversation.chat.components.lazy.LazyLayoutSemanticState +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy.LazyLayoutSemanticState import androidx.compose.runtime.Composable import androidx.compose.runtime.remember diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyListState.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyListState.kt similarity index 96% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyListState.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyListState.kt index 853fde36c5..9ad936ae46 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyListState.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyListState.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.ai.assistance.operit.ui.features.conversation.chat.components.lazy +package com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy import androidx.annotation.IntRange as AndroidXIntRange import androidx.compose.foundation.ExperimentalFoundationApi @@ -26,17 +26,17 @@ import androidx.compose.foundation.gestures.ScrollableState import androidx.compose.foundation.interaction.InteractionSource import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.internal.checkPrecondition -import com.ai.assistance.operit.ui.features.conversation.chat.components.lazy.LazyListState.Companion.Saver -import com.ai.assistance.operit.ui.features.conversation.chat.components.lazy.AwaitFirstLayoutModifier -import com.ai.assistance.operit.ui.features.conversation.chat.components.lazy.CacheWindowLogic -import com.ai.assistance.operit.ui.features.conversation.chat.components.lazy.LazyLayoutBeyondBoundsInfo -import com.ai.assistance.operit.ui.features.conversation.chat.components.lazy.LazyLayoutCacheWindow -import com.ai.assistance.operit.ui.features.conversation.chat.components.lazy.LazyLayoutItemAnimator -import com.ai.assistance.operit.ui.features.conversation.chat.components.lazy.LazyLayoutPinnedItemList -import com.ai.assistance.operit.ui.features.conversation.chat.components.lazy.LazyLayoutPrefetchState -import com.ai.assistance.operit.ui.features.conversation.chat.components.lazy.LazyLayoutScrollDeltaBetweenPasses -import com.ai.assistance.operit.ui.features.conversation.chat.components.lazy.ObservableScopeInvalidator -import com.ai.assistance.operit.ui.features.conversation.chat.components.lazy.animateScrollToItem +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy.LazyListState.Companion.Saver +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy.AwaitFirstLayoutModifier +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy.CacheWindowLogic +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy.LazyLayoutBeyondBoundsInfo +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy.LazyLayoutCacheWindow +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy.LazyLayoutItemAnimator +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy.LazyLayoutPinnedItemList +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy.LazyLayoutPrefetchState +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy.LazyLayoutScrollDeltaBetweenPasses +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy.ObservableScopeInvalidator +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy.animateScrollToItem import androidx.compose.runtime.Composable import androidx.compose.runtime.Stable import androidx.compose.runtime.annotation.FrequentlyChangingValue diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazySaveableStateHolder.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazySaveableStateHolder.kt similarity index 98% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazySaveableStateHolder.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazySaveableStateHolder.kt index 9aa0bbef40..4e56c96fd7 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazySaveableStateHolder.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazySaveableStateHolder.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.ai.assistance.operit.ui.features.conversation.chat.components.lazy +package com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy import androidx.collection.mutableScatterSetOf import androidx.compose.runtime.Composable diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyScopeMarker.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyScopeMarker.kt similarity index 90% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyScopeMarker.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyScopeMarker.kt index 9bed10e636..d2e9c24e45 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyScopeMarker.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyScopeMarker.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.ai.assistance.operit.ui.features.conversation.chat.components.lazy +package com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy /** DSL marker used to distinguish between lazy layout scope and the item scope. */ @DslMarker annotation class LazyScopeMarker diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/ObservableScopeInvalidator.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/ObservableScopeInvalidator.kt similarity index 93% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/ObservableScopeInvalidator.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/ObservableScopeInvalidator.kt index 09eae01b16..ac2c1ad7a2 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/ObservableScopeInvalidator.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/ObservableScopeInvalidator.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.ai.assistance.operit.ui.features.conversation.chat.components.lazy +package com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy import androidx.compose.runtime.MutableState import androidx.compose.runtime.mutableStateOf diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/PrefetchScheduler.android.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/PrefetchScheduler.android.kt similarity index 99% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/PrefetchScheduler.android.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/PrefetchScheduler.android.kt index 604d33a071..cedd105ebc 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/PrefetchScheduler.android.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/PrefetchScheduler.android.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.ai.assistance.operit.ui.features.conversation.chat.components.lazy +package com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy import android.os.Build import android.view.Choreographer diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/PrefetchScheduler.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/PrefetchScheduler.kt similarity index 98% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/PrefetchScheduler.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/PrefetchScheduler.kt index 0d791320e6..746819cd1c 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/PrefetchScheduler.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/PrefetchScheduler.kt @@ -16,7 +16,7 @@ @file:Suppress("DEPRECATION") // b/420551535 -package com.ai.assistance.operit.ui.features.conversation.chat.components.lazy +package com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy import androidx.compose.foundation.ExperimentalFoundationApi diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/README.md b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/README.md new file mode 100644 index 0000000000..d571e8dca2 --- /dev/null +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/README.md @@ -0,0 +1,16 @@ +这里是从 Jetpack Compose Foundation 提取并本地化的 `LazyColumn` 相关源码。 + +- 来源版本:`androidx.compose.foundation:foundation-android:1.10.4` +- 入口文件:[RecyclerLazyColumn.kt](RecyclerLazyColumn.kt) +- 核心布局:[LazyList.kt](LazyList.kt) +- 核心测量:[LazyListMeasure.kt](LazyListMeasure.kt) +- 状态管理:[LazyListState.kt](LazyListState.kt) + +处理方式: + +- 已改为本地包名 `com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy` +- 文件全部平铺在当前目录下,不再保留上游多级目录 +- `LazyColumn` 入口已重命名为 `RecyclerLazyColumn` +- 仅保留 `LazyColumn/LazyList` 这条链路相关文件,没有带入 `grid` 和 `staggeredgrid` + +这批文件目前是为了后续魔改准备的本地副本,这次没有执行编译、构建或测试。 diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/RecyclerLazyColumn.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/RecyclerLazyColumn.kt similarity index 99% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/RecyclerLazyColumn.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/RecyclerLazyColumn.kt index 5ed8c910a7..d49b9abce8 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/RecyclerLazyColumn.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/RecyclerLazyColumn.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.ai.assistance.operit.ui.features.conversation.chat.components.lazy +package com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy import androidx.compose.foundation.OverscrollEffect import androidx.compose.foundation.gestures.FlingBehavior diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/ChatMessageHeightMemory.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/list/ChatMessageHeightMemory.kt similarity index 93% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/ChatMessageHeightMemory.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/list/ChatMessageHeightMemory.kt index 277ca85ffb..284b28c5ce 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/ChatMessageHeightMemory.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/list/ChatMessageHeightMemory.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components +package com.ai.assistance.operit.ui.features.conversation.chat.foundation.list import androidx.compose.runtime.Composable import androidx.compose.runtime.Stable diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/ChatScrollExtensions.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/list/ChatScrollExtensions.kt similarity index 91% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/ChatScrollExtensions.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/list/ChatScrollExtensions.kt index c1519b0396..09102ef5e8 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/ChatScrollExtensions.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/list/ChatScrollExtensions.kt @@ -1,8 +1,8 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components +package com.ai.assistance.operit.ui.features.conversation.chat.foundation.list import androidx.compose.foundation.gestures.animateScrollBy import androidx.compose.foundation.lazy.LazyListState as ComposeLazyListState -import com.ai.assistance.operit.ui.features.conversation.chat.components.lazy.LazyListState +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy.LazyListState /** * Scrolls to the actual end of the list so the trailing edge of the final item stays aligned with diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/util/MentionTokenUtils.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/mentions/MentionTokenUtils.kt similarity index 97% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/util/MentionTokenUtils.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/mentions/MentionTokenUtils.kt index d8625962ec..8473930eaa 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/util/MentionTokenUtils.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/mentions/MentionTokenUtils.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.util +package com.ai.assistance.operit.ui.features.conversation.chat.foundation.mentions data class MentionTokenRange( val triggerChar: Char, diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/model/CharacterSelectorTarget.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/model/CharacterSelectorTarget.kt new file mode 100644 index 0000000000..45a660bd62 --- /dev/null +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/model/CharacterSelectorTarget.kt @@ -0,0 +1,7 @@ +package com.ai.assistance.operit.ui.features.conversation.chat.foundation.model + +/** 聊天界面与状态管理共用的声明,独立归位以保持引用方向清晰。 */ +sealed interface CharacterSelectorTarget { + data class CharacterCardTarget(val id: String) : CharacterSelectorTarget + data class CharacterGroupTarget(val id: String) : CharacterSelectorTarget +} diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/model/ChatBatchModels.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/model/ChatBatchModels.kt new file mode 100644 index 0000000000..6b02d73536 --- /dev/null +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/model/ChatBatchModels.kt @@ -0,0 +1,10 @@ +package com.ai.assistance.operit.ui.features.conversation.chat.foundation.model + +/** 聊天界面与状态管理共用的声明,独立归位以保持引用方向清晰。 */ +enum class ChatBatchAction { SUMMARIZE_TITLES, ARCHIVE, UNARCHIVE, LOCK, UNLOCK, DELETE } + +enum class ChatBatchItemResult { SUCCEEDED, SKIPPED, FAILED } + +data class ChatBatchProgress(val action: ChatBatchAction, val completed: Int, val total: Int) + +data class ChatBatchSummary(val succeeded: Int, val skipped: Int, val failed: Int) diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/model/ChatHistoryDisplayMode.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/model/ChatHistoryDisplayMode.kt new file mode 100644 index 0000000000..4029a4c773 --- /dev/null +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/model/ChatHistoryDisplayMode.kt @@ -0,0 +1,8 @@ +package com.ai.assistance.operit.ui.features.conversation.chat.foundation.model + +/** 聊天界面与状态管理共用的声明,独立归位以保持引用方向清晰。 */ +enum class ChatHistoryDisplayMode { + BY_CHARACTER_CARD, + BY_FOLDER, + CURRENT_CHARACTER_ONLY +} diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/model/ChatStyle.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/model/ChatStyle.kt new file mode 100644 index 0000000000..76f06bca70 --- /dev/null +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/model/ChatStyle.kt @@ -0,0 +1,7 @@ +package com.ai.assistance.operit.ui.features.conversation.chat.foundation.model + +/** 聊天界面与状态管理共用的声明,独立归位以保持引用方向清晰。 */ +enum class ChatStyle { + CURSOR, + BUBBLE +} diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/model/PendingQueueMessageItem.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/model/PendingQueueMessageItem.kt new file mode 100644 index 0000000000..74006cfb40 --- /dev/null +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/model/PendingQueueMessageItem.kt @@ -0,0 +1,7 @@ +package com.ai.assistance.operit.ui.features.conversation.chat.foundation.model + +/** 聊天界面与状态管理共用的声明,独立归位以保持引用方向清晰。 */ +data class PendingQueueMessageItem( + val id: Long, + val text: String +) diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/model/TranslationUiState.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/model/TranslationUiState.kt new file mode 100644 index 0000000000..b470360b97 --- /dev/null +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/model/TranslationUiState.kt @@ -0,0 +1,9 @@ +package com.ai.assistance.operit.ui.features.conversation.chat.foundation.model + +/** 聊天界面与状态管理共用的声明,独立归位以保持引用方向清晰。 */ +data class TranslationUiState( + val isLoading: Boolean = false, + val translatedText: String? = null, + val errorMessage: String? = null, + val isFromCache: Boolean = false, +) diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/SimpleLinearProgressIndicator.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/progress/SimpleLinearProgressIndicator.kt similarity index 96% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/SimpleLinearProgressIndicator.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/progress/SimpleLinearProgressIndicator.kt index bbc3ca6320..897e3b3f0d 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/SimpleLinearProgressIndicator.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/progress/SimpleLinearProgressIndicator.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components +package com.ai.assistance.operit.ui.features.conversation.chat.foundation.progress import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/RevisableTextStreamRemember.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/stream/RevisableTextStreamRemember.kt similarity index 98% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/RevisableTextStreamRemember.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/stream/RevisableTextStreamRemember.kt index ed85ffd126..5c9204e1d8 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/RevisableTextStreamRemember.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/stream/RevisableTextStreamRemember.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components +package com.ai.assistance.operit.ui.features.conversation.chat.foundation.stream import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/AttachmentChip.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/AttachmentChip.kt similarity index 94% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/AttachmentChip.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/AttachmentChip.kt index f611660e59..01df7bdb82 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/AttachmentChip.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/AttachmentChip.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components +package com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments import android.net.Uri import androidx.compose.foundation.border @@ -39,8 +39,8 @@ import androidx.compose.ui.unit.dp import coil.compose.AsyncImage import com.ai.assistance.operit.R import com.ai.assistance.operit.data.model.AttachmentInfo -import com.ai.assistance.operit.ui.features.conversation.chat.attachments.images.AttachmentImagePreviewDialog -import com.ai.assistance.operit.ui.features.conversation.chat.attachments.images.AttachmentPreviewImage +import com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.images.AttachmentImagePreviewDialog +import com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.images.AttachmentPreviewImage import java.io.File @Composable diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/AttachmentPreview.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/AttachmentPreview.kt similarity index 97% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/AttachmentPreview.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/AttachmentPreview.kt index a2b2125b0e..ea3d96b9ed 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/AttachmentPreview.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/AttachmentPreview.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components +package com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments import androidx.compose.foundation.background import androidx.compose.foundation.border @@ -33,7 +33,6 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import com.ai.assistance.operit.R import com.ai.assistance.operit.data.model.AttachmentInfo -import com.ai.assistance.operit.ui.features.conversation.chat.attachments.AttachmentUtils /** A component that shows previews of attachments to be sent with a message */ @Composable diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/AttachmentSelector.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/AttachmentSelector.kt similarity index 99% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/AttachmentSelector.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/AttachmentSelector.kt index 720d26bbf1..b60ee40400 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/AttachmentSelector.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/AttachmentSelector.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components +package com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments import com.ai.assistance.operit.ui.common.oktoast.OKToast @@ -78,7 +78,7 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Popup import androidx.compose.ui.window.PopupProperties import com.ai.assistance.operit.R -import com.ai.assistance.operit.ui.features.conversation.chat.attachments.images.ChatImagePickerDialog +import com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.images.ChatImagePickerDialog import com.ai.assistance.operit.core.tools.AIToolHandler import com.ai.assistance.operit.core.tools.packTool.PackageManager as ToolPackageManager import com.ai.assistance.operit.data.skill.SkillRepository diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/attachments/AttachmentUtils.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/AttachmentUtils.kt similarity index 94% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/attachments/AttachmentUtils.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/AttachmentUtils.kt index 67158d6792..47a719633a 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/attachments/AttachmentUtils.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/AttachmentUtils.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.attachments +package com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments import com.ai.assistance.operit.data.model.AttachmentInfo diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/attachments/MediaFileGuard.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/MediaFileGuard.kt similarity index 98% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/attachments/MediaFileGuard.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/MediaFileGuard.kt index 07bc82df55..067a83cb37 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/attachments/MediaFileGuard.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/MediaFileGuard.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.attachments +package com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments import android.content.Context import android.net.Uri diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/PastedTextAttachment.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/PastedTextAttachment.kt similarity index 94% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/PastedTextAttachment.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/PastedTextAttachment.kt index 7505330136..6e0c81714e 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/PastedTextAttachment.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/PastedTextAttachment.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components +package com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments import androidx.compose.ui.text.input.TextFieldValue diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/attachments/images/AttachmentImagePreviewDialog.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/images/AttachmentImagePreviewDialog.kt similarity index 97% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/attachments/images/AttachmentImagePreviewDialog.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/images/AttachmentImagePreviewDialog.kt index 329506cea7..b427ebf8a1 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/attachments/images/AttachmentImagePreviewDialog.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/images/AttachmentImagePreviewDialog.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.attachments.images +package com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.images import android.net.Uri import androidx.compose.foundation.ExperimentalFoundationApi @@ -59,9 +59,9 @@ import androidx.compose.ui.window.DialogProperties import coil.compose.AsyncImage import coil.request.ImageRequest import com.ai.assistance.operit.R -import com.ai.assistance.operit.ui.features.conversation.chat.attachments.MediaFileUnavailableTag -import com.ai.assistance.operit.ui.features.conversation.chat.attachments.mediaPreviewUri -import com.ai.assistance.operit.ui.features.conversation.chat.attachments.rememberMediaPreviewRevision +import com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.MediaFileUnavailableTag +import com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.mediaPreviewUri +import com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.rememberMediaPreviewRevision import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/attachments/images/ChatImagePickerDialog.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/images/ChatImagePickerDialog.kt similarity index 99% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/attachments/images/ChatImagePickerDialog.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/images/ChatImagePickerDialog.kt index cca511e3cb..01640d6870 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/attachments/images/ChatImagePickerDialog.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/images/ChatImagePickerDialog.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.attachments.images +package com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.images import android.content.Intent import android.net.Uri diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/attachments/images/ExpiredImageGroupTag.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/images/ExpiredImageGroupTag.kt similarity index 96% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/attachments/images/ExpiredImageGroupTag.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/images/ExpiredImageGroupTag.kt index 0f1304f986..523a990443 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/attachments/images/ExpiredImageGroupTag.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/images/ExpiredImageGroupTag.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.attachments.images +package com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.images import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/attachments/images/GalleryDragSelection.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/images/GalleryDragSelection.kt similarity index 98% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/attachments/images/GalleryDragSelection.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/images/GalleryDragSelection.kt index ac1a9c5ff2..32483bf352 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/attachments/images/GalleryDragSelection.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/images/GalleryDragSelection.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.attachments.images +package com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.images import androidx.compose.foundation.gestures.awaitEachGesture import androidx.compose.foundation.gestures.awaitFirstDown diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/attachments/images/ImagePreviewTransform.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/images/ImagePreviewTransform.kt similarity index 93% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/attachments/images/ImagePreviewTransform.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/images/ImagePreviewTransform.kt index 1621b3ceed..7fba2bdbb5 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/attachments/images/ImagePreviewTransform.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/images/ImagePreviewTransform.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.attachments.images +package com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.images import androidx.compose.ui.geometry.Offset import androidx.compose.ui.geometry.Size diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/attachments/images/MediaStoreImageRepository.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/images/MediaStoreImageRepository.kt similarity index 97% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/attachments/images/MediaStoreImageRepository.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/images/MediaStoreImageRepository.kt index 8ff3c69f0b..ab8e0973ed 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/attachments/images/MediaStoreImageRepository.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/images/MediaStoreImageRepository.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.attachments.images +package com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.images import android.Manifest import android.content.ContentUris diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/attachments/images/SentImageGroup.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/images/SentImageGroup.kt similarity index 94% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/attachments/images/SentImageGroup.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/images/SentImageGroup.kt index 690ed43190..52175313db 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/attachments/images/SentImageGroup.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/images/SentImageGroup.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.attachments.images +package com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.images import android.net.Uri import androidx.compose.foundation.BorderStroke @@ -16,9 +16,9 @@ import androidx.compose.ui.unit.dp import coil.compose.AsyncImage import com.ai.assistance.operit.R import com.ai.assistance.operit.ui.common.oktoast.OKToast -import com.ai.assistance.operit.ui.features.conversation.chat.attachments.MediaFileUnavailableTag -import com.ai.assistance.operit.ui.features.conversation.chat.attachments.mediaPreviewUri -import com.ai.assistance.operit.ui.features.conversation.chat.attachments.rememberMediaPreviewRevision +import com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.MediaFileUnavailableTag +import com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.mediaPreviewUri +import com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.rememberMediaPreviewRevision import com.ai.assistance.operit.util.logging.AppLogger import com.ai.assistance.operit.util.media.ImagePoolManager import kotlinx.coroutines.CancellationException diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/attachments/images/SentImageSources.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/images/SentImageSources.kt similarity index 94% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/attachments/images/SentImageSources.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/images/SentImageSources.kt index 75c86d3954..ec6700e370 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/attachments/images/SentImageSources.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/images/SentImageSources.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.attachments.images +package com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.images import com.ai.assistance.operit.core.chat.media.MediaLinkParser import com.ai.assistance.operit.core.chat.protocol.ChatMarkupRegex diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/SharedFileTargetDialog.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/imports/SharedFileTargetDialog.kt similarity index 99% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/SharedFileTargetDialog.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/imports/SharedFileTargetDialog.kt index e60fff9eb1..bbd8ae478d 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/SharedFileTargetDialog.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/imports/SharedFileTargetDialog.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components +package com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.imports import android.net.Uri import androidx.compose.foundation.layout.Arrangement diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/SharedPackageImportChoiceDialog.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/imports/SharedPackageImportChoiceDialog.kt similarity index 98% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/SharedPackageImportChoiceDialog.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/imports/SharedPackageImportChoiceDialog.kt index 8ec578c70f..541edb480b 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/SharedPackageImportChoiceDialog.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/imports/SharedPackageImportChoiceDialog.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components +package com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.imports import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/attachments/AttachmentViewerDialog.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/preview/AttachmentViewerDialog.kt similarity index 96% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/attachments/AttachmentViewerDialog.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/preview/AttachmentViewerDialog.kt index cb7dcaa839..d75af47098 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/attachments/AttachmentViewerDialog.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/preview/AttachmentViewerDialog.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components.attachments +package com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.preview import com.ai.assistance.operit.ui.common.oktoast.OKToast @@ -56,11 +56,11 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Dialog import androidx.core.content.FileProvider import com.ai.assistance.operit.R -import com.ai.assistance.operit.ui.features.conversation.chat.attachments.MediaFileUnavailableTag -import com.ai.assistance.operit.ui.features.conversation.chat.attachments.mediaPreviewUri -import com.ai.assistance.operit.ui.features.conversation.chat.attachments.rememberMediaPreviewRevision -import com.ai.assistance.operit.ui.features.conversation.chat.components.compactDialogHeightWhenShort -import com.ai.assistance.operit.ui.features.conversation.chat.components.rememberCompactDialogMetrics +import com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.MediaFileUnavailableTag +import com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.mediaPreviewUri +import com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.rememberMediaPreviewRevision +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.layout.compactDialogHeightWhenShort +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.layout.rememberCompactDialogMetrics import com.ai.assistance.operit.util.logging.AppLogger import com.ai.assistance.operit.util.media.ImageBitmapLimiter import com.ai.assistance.operit.util.media.MediaBase64Limiter diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/attachments/AudioAttachmentPlayer.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/preview/AudioAttachmentPlayer.kt similarity index 94% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/attachments/AudioAttachmentPlayer.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/preview/AudioAttachmentPlayer.kt index d654ebd471..73f85955b0 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/attachments/AudioAttachmentPlayer.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/preview/AudioAttachmentPlayer.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components.attachments +package com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.preview import android.net.Uri import androidx.compose.runtime.DisposableEffect diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/attachments/VideoAttachmentPlayer.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/preview/VideoAttachmentPlayer.kt similarity index 94% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/attachments/VideoAttachmentPlayer.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/preview/VideoAttachmentPlayer.kt index ce3839414f..f89233aea8 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/attachments/VideoAttachmentPlayer.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/preview/VideoAttachmentPlayer.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components.attachments +package com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.preview import android.net.Uri import androidx.compose.runtime.Composable diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/CharacterSelectorPanel.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/characters/CharacterSelectorPanel.kt similarity index 98% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/CharacterSelectorPanel.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/characters/CharacterSelectorPanel.kt index 8d7af364c2..fe208e3118 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/CharacterSelectorPanel.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/characters/CharacterSelectorPanel.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components +package com.ai.assistance.operit.ui.features.conversation.chat.modules.characters import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.core.tween @@ -42,6 +42,7 @@ import com.ai.assistance.operit.data.preferences.ActivePromptManager import com.ai.assistance.operit.data.model.ActivePrompt import com.ai.assistance.operit.data.preferences.UserPreferencesManager import com.ai.assistance.operit.ui.common.rememberLocal +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.model.CharacterSelectorTarget import android.net.Uri import androidx.compose.foundation.Image import androidx.compose.ui.layout.ContentScale @@ -54,11 +55,6 @@ private enum class CharacterSelectorSortOption { CREATED_DESC } -sealed interface CharacterSelectorTarget { - data class CharacterCardTarget(val id: String) : CharacterSelectorTarget - data class CharacterGroupTarget(val id: String) : CharacterSelectorTarget -} - private fun applyCharacterSelectorSort( cards: List, sortOptionName: String diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/ExportDialogs.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/export/ExportDialogs.kt similarity index 98% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/ExportDialogs.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/export/ExportDialogs.kt index f5d95c1810..641ae848e8 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/ExportDialogs.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/export/ExportDialogs.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components +package com.ai.assistance.operit.ui.features.conversation.chat.modules.export import android.content.Context import android.graphics.BitmapFactory @@ -34,16 +34,19 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import com.ai.assistance.operit.R -import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.DialogProperties import com.ai.assistance.operit.data.resources.OfflineResources -import com.ai.assistance.operit.ui.features.conversation.chat.export.htmlpackager.PackagerPlatformDialog +import com.ai.assistance.operit.ui.features.conversation.chat.modules.export.htmlpackager.PackagerPlatformDialog import com.ai.assistance.operit.core.subpack.ApkEditor import com.ai.assistance.operit.core.subpack.ExeEditor import com.ai.assistance.operit.core.subpack.KeyStoreHelper import com.ai.assistance.operit.ui.common.rememberLocal import com.ai.assistance.operit.data.serialization.UriSerializer +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.layout.compactDialogHeightOrWrapContent +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.layout.rememberCompactDialogMetrics +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.layout.rememberCompactDialogScrollState +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.layout.verticalScrollWhenShort import java.io.File import java.io.FileInputStream import java.io.FileOutputStream diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/export/htmlpackager/HtmlPackagerScreen.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/export/htmlpackager/HtmlPackagerScreen.kt similarity index 95% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/export/htmlpackager/HtmlPackagerScreen.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/export/htmlpackager/HtmlPackagerScreen.kt index fae329ef8a..8e6aee1175 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/export/htmlpackager/HtmlPackagerScreen.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/export/htmlpackager/HtmlPackagerScreen.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.export.htmlpackager +package com.ai.assistance.operit.ui.features.conversation.chat.modules.export.htmlpackager import android.content.Context import android.net.Uri @@ -26,13 +26,13 @@ import com.ai.assistance.operit.core.tools.AIToolHandler import com.ai.assistance.operit.data.model.AITool import com.ai.assistance.operit.data.model.ToolParameter import com.ai.assistance.operit.ui.components.CustomScaffold -import com.ai.assistance.operit.ui.features.conversation.chat.components.AndroidExportDialog -import com.ai.assistance.operit.ui.features.conversation.chat.components.ExportCompleteDialog -import com.ai.assistance.operit.ui.features.conversation.chat.components.ExportPlatformDialog -import com.ai.assistance.operit.ui.features.conversation.chat.components.ExportProgressDialog -import com.ai.assistance.operit.ui.features.conversation.chat.components.WindowsExportDialog -import com.ai.assistance.operit.ui.features.conversation.chat.components.exportAndroidApp -import com.ai.assistance.operit.ui.features.conversation.chat.components.exportWindowsApp +import com.ai.assistance.operit.ui.features.conversation.chat.modules.export.AndroidExportDialog +import com.ai.assistance.operit.ui.features.conversation.chat.modules.export.ExportCompleteDialog +import com.ai.assistance.operit.ui.features.conversation.chat.modules.export.ExportPlatformDialog +import com.ai.assistance.operit.ui.features.conversation.chat.modules.export.ExportProgressDialog +import com.ai.assistance.operit.ui.features.conversation.chat.modules.export.WindowsExportDialog +import com.ai.assistance.operit.ui.features.conversation.chat.modules.export.exportAndroidApp +import com.ai.assistance.operit.ui.features.conversation.chat.modules.export.exportWindowsApp import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/export/htmlpackager/PackagerResources.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/export/htmlpackager/PackagerResources.kt similarity index 98% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/export/htmlpackager/PackagerResources.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/export/htmlpackager/PackagerResources.kt index c49fd426b5..ce0e4fd4e4 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/export/htmlpackager/PackagerResources.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/export/htmlpackager/PackagerResources.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.export.htmlpackager +package com.ai.assistance.operit.ui.features.conversation.chat.modules.export.htmlpackager import android.content.Context import android.content.Intent diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/archive/ChatArchiveFilter.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/history/ChatArchiveFilter.kt similarity index 96% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/archive/ChatArchiveFilter.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/history/ChatArchiveFilter.kt index 7740bc7252..6821ea4cf0 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/archive/ChatArchiveFilter.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/history/ChatArchiveFilter.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.archive +package com.ai.assistance.operit.ui.features.conversation.chat.modules.history import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Row diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/ChatHistorySelector.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/history/ChatHistorySelector.kt similarity index 84% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/ChatHistorySelector.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/history/ChatHistorySelector.kt index 6dedd3bae0..17def88129 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/ChatHistorySelector.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/history/ChatHistorySelector.kt @@ -1,14 +1,14 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components +package com.ai.assistance.operit.ui.features.conversation.chat.modules.history import androidx.compose.foundation.lazy.LazyListState import androidx.compose.runtime.Composable -import com.ai.assistance.operit.ui.features.conversation.chat.batch.ChatBatchAction -import com.ai.assistance.operit.ui.features.conversation.chat.batch.ChatBatchProgress +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.model.ChatBatchAction +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.model.ChatBatchProgress import androidx.compose.ui.Modifier import com.ai.assistance.operit.data.model.ActivePrompt import com.ai.assistance.operit.data.model.ChatHistory -import com.ai.assistance.operit.ui.features.conversation.chat.folders.FolderChatHistoryPanel -import com.ai.assistance.operit.ui.features.conversation.chat.viewmodel.ChatHistoryDisplayMode +import com.ai.assistance.operit.ui.features.conversation.chat.modules.history.folders.FolderChatHistoryPanel +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.model.ChatHistoryDisplayMode /** 保留聊天页现有面板入口,目录布局与行为由独立组件维护。 */ @Composable diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/batch/ChatBatchControls.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/history/batch/ChatBatchControls.kt similarity index 95% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/batch/ChatBatchControls.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/history/batch/ChatBatchControls.kt index 4265cb7366..c7b7398dc8 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/batch/ChatBatchControls.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/history/batch/ChatBatchControls.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.batch +package com.ai.assistance.operit.ui.features.conversation.chat.modules.history.batch import androidx.compose.foundation.layout.* import androidx.compose.foundation.shape.RoundedCornerShape @@ -22,6 +22,8 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import com.ai.assistance.operit.R import com.ai.assistance.operit.data.model.ChatHistory +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.model.ChatBatchAction +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.model.ChatBatchProgress @Composable internal fun ChatBatchSelectionHeader( diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/batch/ChatBatchMoveDialog.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/history/batch/ChatBatchMoveDialog.kt similarity index 97% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/batch/ChatBatchMoveDialog.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/history/batch/ChatBatchMoveDialog.kt index eb8dd426ef..62076d2efb 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/batch/ChatBatchMoveDialog.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/history/batch/ChatBatchMoveDialog.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.batch +package com.ai.assistance.operit.ui.features.conversation.chat.modules.history.batch import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/folders/ChatFolderTree.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/history/folders/ChatFolderTree.kt similarity index 98% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/folders/ChatFolderTree.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/history/folders/ChatFolderTree.kt index 06688af78d..d298a7b156 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/folders/ChatFolderTree.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/history/folders/ChatFolderTree.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.folders +package com.ai.assistance.operit.ui.features.conversation.chat.modules.history.folders import com.ai.assistance.operit.data.chat.folders.ChatFolder import com.ai.assistance.operit.data.chat.folders.ChatFolderBinding diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/folders/FolderChatHistoryPanel.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/history/folders/FolderChatHistoryPanel.kt similarity index 97% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/folders/FolderChatHistoryPanel.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/history/folders/FolderChatHistoryPanel.kt index 050765255e..00a2e9dba5 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/folders/FolderChatHistoryPanel.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/history/folders/FolderChatHistoryPanel.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.folders +package com.ai.assistance.operit.ui.features.conversation.chat.modules.history.folders import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.fadeIn @@ -7,7 +7,6 @@ import androidx.compose.animation.expandVertically import androidx.compose.animation.shrinkVertically import androidx.compose.foundation.layout.* import androidx.compose.material.icons.outlined.Checklist -import com.ai.assistance.operit.ui.features.conversation.chat.batch.* import androidx.compose.foundation.border import androidx.compose.foundation.text.BasicTextField import androidx.compose.foundation.shape.RoundedCornerShape @@ -19,7 +18,7 @@ import androidx.compose.material.icons.filled.* import androidx.compose.material3.* import androidx.compose.runtime.* import androidx.compose.runtime.saveable.rememberSaveable -import com.ai.assistance.operit.ui.features.conversation.chat.archive.ChatArchiveFilter +import com.ai.assistance.operit.ui.features.conversation.chat.modules.history.ChatArchiveFilter import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext @@ -42,7 +41,7 @@ import com.ai.assistance.operit.data.preferences.CharacterGroupCardManager import com.ai.assistance.operit.data.repository.ChatHistoryManager import com.ai.assistance.operit.ui.common.rememberLocal import com.ai.assistance.operit.ui.common.oktoast.OKToast -import com.ai.assistance.operit.ui.features.conversation.chat.viewmodel.ChatHistoryDisplayMode +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.model.ChatHistoryDisplayMode import com.ai.assistance.operit.util.logging.AppLogger import kotlinx.coroutines.CancellationException import kotlinx.coroutines.Dispatchers @@ -51,12 +50,12 @@ import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import com.ai.assistance.operit.ui.features.conversation.chat.batch.ChatBatchAction -import com.ai.assistance.operit.ui.features.conversation.chat.batch.ChatBatchActionBar -import com.ai.assistance.operit.ui.features.conversation.chat.batch.ChatBatchDeleteDialog -import com.ai.assistance.operit.ui.features.conversation.chat.batch.ChatBatchMoveDialog -import com.ai.assistance.operit.ui.features.conversation.chat.batch.ChatBatchProgress -import com.ai.assistance.operit.ui.features.conversation.chat.batch.ChatBatchSelectionHeader +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.model.ChatBatchAction +import com.ai.assistance.operit.ui.features.conversation.chat.modules.history.batch.ChatBatchActionBar +import com.ai.assistance.operit.ui.features.conversation.chat.modules.history.batch.ChatBatchDeleteDialog +import com.ai.assistance.operit.ui.features.conversation.chat.modules.history.batch.ChatBatchMoveDialog +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.model.ChatBatchProgress +import com.ai.assistance.operit.ui.features.conversation.chat.modules.history.batch.ChatBatchSelectionHeader private data class FolderEditRequest( val folder: ChatFolder? = null, val parentId: String? = null, diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/folders/FolderHistoryDialogs.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/history/folders/FolderHistoryDialogs.kt similarity index 98% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/folders/FolderHistoryDialogs.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/history/folders/FolderHistoryDialogs.kt index 02ae2e5ee9..3eb5c6d512 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/folders/FolderHistoryDialogs.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/history/folders/FolderHistoryDialogs.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.folders +package com.ai.assistance.operit.ui.features.conversation.chat.modules.history.folders import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* @@ -23,7 +23,7 @@ import com.ai.assistance.operit.data.chat.folders.ChatFolderNode import com.ai.assistance.operit.data.chat.folders.canMoveFolder import com.ai.assistance.operit.data.chat.folders.folderAncestors import com.ai.assistance.operit.data.model.ChatHistory -import com.ai.assistance.operit.ui.features.conversation.chat.viewmodel.ChatHistoryDisplayMode +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.model.ChatHistoryDisplayMode internal data class HistoryAction(val label: String, val icon: ImageVector, val enabled: Boolean = true, val action: () -> Unit) internal data class HistoryBindingOption(val label: String, val binding: ChatFolderBinding) diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/folders/FolderTreeList.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/history/folders/FolderTreeList.kt similarity index 99% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/folders/FolderTreeList.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/history/folders/FolderTreeList.kt index 009ddb4c95..f8f34d0fb5 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/folders/FolderTreeList.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/history/folders/FolderTreeList.kt @@ -1,10 +1,10 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.folders +package com.ai.assistance.operit.ui.features.conversation.chat.modules.history.folders import com.ai.assistance.operit.data.preferences.glass.GlassRegion import com.ai.assistance.operit.ui.theme.glass.rememberGlassAppearance import com.ai.assistance.operit.ui.theme.liquidGlass -import com.ai.assistance.operit.ui.features.conversation.chat.motion.DissolvingChatTitle +import com.ai.assistance.operit.ui.features.conversation.chat.modules.history.motion.DissolvingChatTitle import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.selection.toggleable diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/folders/HistoryCreateCapsule.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/history/folders/HistoryCreateCapsule.kt similarity index 96% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/folders/HistoryCreateCapsule.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/history/folders/HistoryCreateCapsule.kt index 3f58ff51f9..c251db4d4a 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/folders/HistoryCreateCapsule.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/history/folders/HistoryCreateCapsule.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.folders +package com.ai.assistance.operit.ui.features.conversation.chat.modules.history.folders import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/folders/HistoryQuickScroller.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/history/folders/HistoryQuickScroller.kt similarity index 99% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/folders/HistoryQuickScroller.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/history/folders/HistoryQuickScroller.kt index adf0502d0d..6b872f4ab2 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/folders/HistoryQuickScroller.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/history/folders/HistoryQuickScroller.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.folders +package com.ai.assistance.operit.ui.features.conversation.chat.modules.history.folders import androidx.compose.foundation.background import androidx.compose.foundation.gestures.awaitEachGesture diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/motion/DissolvingChatTitle.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/history/motion/DissolvingChatTitle.kt similarity index 99% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/motion/DissolvingChatTitle.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/history/motion/DissolvingChatTitle.kt index 39a41b38e5..c2731b646a 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/motion/DissolvingChatTitle.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/history/motion/DissolvingChatTitle.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.motion +package com.ai.assistance.operit.ui.features.conversation.chat.modules.history.motion import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/FullscreenInputDialog.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/input/FullscreenInputDialog.kt similarity index 95% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/FullscreenInputDialog.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/input/FullscreenInputDialog.kt index 46697844a7..8bab712fab 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/FullscreenInputDialog.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/input/FullscreenInputDialog.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components +package com.ai.assistance.operit.ui.features.conversation.chat.modules.input import androidx.compose.foundation.layout.* import androidx.compose.material.icons.Icons @@ -19,7 +19,7 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.DialogProperties import com.ai.assistance.operit.R -import com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.common.rememberMentionVisualTransformation +import com.ai.assistance.operit.ui.features.conversation.chat.modules.input.common.rememberMentionVisualTransformation @Composable fun FullscreenInputDialog( diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/input/agent/AgentChatInputSection.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/input/agent/AgentChatInputSection.kt similarity index 98% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/input/agent/AgentChatInputSection.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/input/agent/AgentChatInputSection.kt index 4a89bbcdae..f68e525e2a 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/input/agent/AgentChatInputSection.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/input/agent/AgentChatInputSection.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.agent +package com.ai.assistance.operit.ui.features.conversation.chat.modules.input.agent import androidx.compose.material.icons.filled.Mic @@ -8,8 +8,8 @@ import com.ai.assistance.operit.data.preferences.glass.GlassRegion import com.ai.assistance.operit.ui.common.oktoast.OKToast import androidx.compose.material3.HorizontalDivider -import com.ai.assistance.operit.ui.features.conversation.chat.components.context.ChatContextUsageEntry -import com.ai.assistance.operit.ui.features.conversation.chat.components.context.ChatContextUsageDialog +import com.ai.assistance.operit.ui.features.conversation.chat.modules.usage.ChatContextUsageEntry +import com.ai.assistance.operit.ui.features.conversation.chat.modules.usage.ChatContextUsageDialog import android.net.Uri import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.contract.ActivityResultContracts @@ -139,20 +139,20 @@ import com.ai.assistance.operit.data.preferences.UserPreferencesManager import com.ai.assistance.operit.data.repository.MemoryAutoSaveCandidateRepository import com.ai.assistance.operit.ui.common.icons.MaterialIconNameResolver import com.ai.assistance.operit.ui.common.animations.SimpleAnimatedVisibility -import com.ai.assistance.operit.ui.features.conversation.chat.components.AttachmentChip -import com.ai.assistance.operit.ui.features.conversation.chat.components.AttachmentSelectorPopupPanel -import com.ai.assistance.operit.ui.features.conversation.chat.components.FullscreenInputDialog -import com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.common.CharacterCardMemoryBindingSwitchConfirmDialog -import com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.common.CharacterCardModelBindingSwitchConfirmDialog -import com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.common.InputMenuToggleHookParams -import com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.common.InputMenuToggleDefinition -import com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.common.InputMenuTogglePluginRegistry -import com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.common.InputMenuToggleSlots -import com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.common.PendingMessageQueuePanel -import com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.common.ThinkingQualitySlider -import com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.common.PendingQueueMessageItem -import com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.common.ToolPromptManagerDialog -import com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.common.rememberMentionVisualTransformation +import com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.AttachmentChip +import com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.AttachmentSelectorPopupPanel +import com.ai.assistance.operit.ui.features.conversation.chat.modules.input.FullscreenInputDialog +import com.ai.assistance.operit.ui.features.conversation.chat.modules.input.common.CharacterCardMemoryBindingSwitchConfirmDialog +import com.ai.assistance.operit.ui.features.conversation.chat.modules.input.common.CharacterCardModelBindingSwitchConfirmDialog +import com.ai.assistance.operit.ui.features.conversation.chat.modules.input.common.InputMenuToggleHookParams +import com.ai.assistance.operit.ui.features.conversation.chat.modules.input.common.InputMenuToggleDefinition +import com.ai.assistance.operit.ui.features.conversation.chat.modules.input.common.InputMenuTogglePluginRegistry +import com.ai.assistance.operit.ui.features.conversation.chat.modules.input.common.InputMenuToggleSlots +import com.ai.assistance.operit.ui.features.conversation.chat.modules.input.common.PendingMessageQueuePanel +import com.ai.assistance.operit.ui.features.conversation.chat.modules.input.common.ThinkingQualitySlider +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.model.PendingQueueMessageItem +import com.ai.assistance.operit.ui.features.conversation.chat.modules.input.common.ToolPromptManagerDialog +import com.ai.assistance.operit.ui.features.conversation.chat.modules.input.common.rememberMentionVisualTransformation import com.ai.assistance.operit.ui.features.conversation.chat.viewmodel.ChatViewModel import com.ai.assistance.operit.ui.floating.FloatingMode import com.ai.assistance.operit.ui.permissions.PermissionLevel diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/input/classic/ClassicChatInputSection.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/input/classic/ClassicChatInputSection.kt similarity index 97% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/input/classic/ClassicChatInputSection.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/input/classic/ClassicChatInputSection.kt index 8dadbeedd7..46a7496ceb 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/input/classic/ClassicChatInputSection.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/input/classic/ClassicChatInputSection.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.classic +package com.ai.assistance.operit.ui.features.conversation.chat.modules.input.classic import androidx.compose.material.icons.filled.Mic @@ -66,13 +66,13 @@ import com.ai.assistance.operit.data.model.InputProcessingState import com.ai.assistance.operit.data.model.ChatMessage import com.ai.assistance.operit.core.tools.ToolProgressBus import com.ai.assistance.operit.ui.common.animations.SimpleAnimatedVisibility -import com.ai.assistance.operit.ui.features.conversation.chat.components.AttachmentChip -import com.ai.assistance.operit.ui.features.conversation.chat.components.AttachmentSelectorPanel -import com.ai.assistance.operit.ui.features.conversation.chat.components.FullscreenInputDialog -import com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.common.rememberMentionVisualTransformation -import com.ai.assistance.operit.ui.features.conversation.chat.components.SimpleLinearProgressIndicator -import com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.common.PendingMessageQueuePanel -import com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.common.PendingQueueMessageItem +import com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.AttachmentChip +import com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.AttachmentSelectorPanel +import com.ai.assistance.operit.ui.features.conversation.chat.modules.input.FullscreenInputDialog +import com.ai.assistance.operit.ui.features.conversation.chat.modules.input.common.rememberMentionVisualTransformation +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.progress.SimpleLinearProgressIndicator +import com.ai.assistance.operit.ui.features.conversation.chat.modules.input.common.PendingMessageQueuePanel +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.model.PendingQueueMessageItem import com.ai.assistance.operit.ui.features.conversation.chat.viewmodel.ChatViewModel import com.ai.assistance.operit.ui.floating.FloatingMode import com.ai.assistance.operit.ui.theme.isLiquidGlassSupported diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/input/classic/ClassicChatSettingsBar.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/input/classic/ClassicChatSettingsBar.kt similarity index 98% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/input/classic/ClassicChatSettingsBar.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/input/classic/ClassicChatSettingsBar.kt index 560d99eb9d..81e2fb2c17 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/input/classic/ClassicChatSettingsBar.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/input/classic/ClassicChatSettingsBar.kt @@ -1,9 +1,9 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.classic +package com.ai.assistance.operit.ui.features.conversation.chat.modules.input.classic import com.ai.assistance.operit.ui.common.oktoast.OKToast -import com.ai.assistance.operit.ui.features.conversation.chat.components.context.ChatContextUsageEntry -import com.ai.assistance.operit.ui.features.conversation.chat.components.context.ChatContextUsageDialog +import com.ai.assistance.operit.ui.features.conversation.chat.modules.usage.ChatContextUsageEntry +import com.ai.assistance.operit.ui.features.conversation.chat.modules.usage.ChatContextUsageDialog import com.ai.assistance.operit.ui.features.conversation.chat.viewmodel.ChatViewModel import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.core.animateFloatAsState @@ -74,14 +74,14 @@ import com.ai.assistance.operit.data.repository.MemoryAutoSaveCandidateRepositor import com.ai.assistance.operit.ui.common.icons.MaterialIconNameResolver import com.ai.assistance.operit.ui.common.icons.providerLogoColorFilter import com.ai.assistance.operit.ui.common.icons.rememberProviderLogoPainter -import com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.common.InputMenuToggleHookParams -import com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.common.InputMenuToggleDefinition -import com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.common.InputMenuTogglePluginRegistry -import com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.common.InputMenuToggleSlots -import com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.common.CharacterCardMemoryBindingSwitchConfirmDialog -import com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.common.CharacterCardModelBindingSwitchConfirmDialog -import com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.common.ToolPromptManagerDialog -import com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.common.ThinkingQualitySlider +import com.ai.assistance.operit.ui.features.conversation.chat.modules.input.common.InputMenuToggleHookParams +import com.ai.assistance.operit.ui.features.conversation.chat.modules.input.common.InputMenuToggleDefinition +import com.ai.assistance.operit.ui.features.conversation.chat.modules.input.common.InputMenuTogglePluginRegistry +import com.ai.assistance.operit.ui.features.conversation.chat.modules.input.common.InputMenuToggleSlots +import com.ai.assistance.operit.ui.features.conversation.chat.modules.input.common.CharacterCardMemoryBindingSwitchConfirmDialog +import com.ai.assistance.operit.ui.features.conversation.chat.modules.input.common.CharacterCardModelBindingSwitchConfirmDialog +import com.ai.assistance.operit.ui.features.conversation.chat.modules.input.common.ToolPromptManagerDialog +import com.ai.assistance.operit.ui.features.conversation.chat.modules.input.common.ThinkingQualitySlider import com.ai.assistance.operit.ui.permissions.PermissionLevel import kotlinx.coroutines.flow.first import kotlinx.coroutines.launch diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/input/common/CharacterCardMemoryBindingSwitchConfirmDialog.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/input/common/CharacterCardMemoryBindingSwitchConfirmDialog.kt similarity index 91% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/input/common/CharacterCardMemoryBindingSwitchConfirmDialog.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/input/common/CharacterCardMemoryBindingSwitchConfirmDialog.kt index 56d5663578..1890b9ad29 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/input/common/CharacterCardMemoryBindingSwitchConfirmDialog.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/input/common/CharacterCardMemoryBindingSwitchConfirmDialog.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.common +package com.ai.assistance.operit.ui.features.conversation.chat.modules.input.common import androidx.compose.material3.AlertDialog import androidx.compose.material3.Text diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/input/common/CharacterCardModelBindingSwitchConfirmDialog.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/input/common/CharacterCardModelBindingSwitchConfirmDialog.kt similarity index 91% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/input/common/CharacterCardModelBindingSwitchConfirmDialog.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/input/common/CharacterCardModelBindingSwitchConfirmDialog.kt index 6a4b47f031..d6a2cd8535 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/input/common/CharacterCardModelBindingSwitchConfirmDialog.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/input/common/CharacterCardModelBindingSwitchConfirmDialog.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.common +package com.ai.assistance.operit.ui.features.conversation.chat.modules.input.common import androidx.compose.material3.AlertDialog import androidx.compose.material3.Text diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/input/common/ChatInputHookRegistry.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/input/common/ChatInputHookRegistry.kt similarity index 97% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/input/common/ChatInputHookRegistry.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/input/common/ChatInputHookRegistry.kt index 5f5221af11..8ef1fd3db2 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/input/common/ChatInputHookRegistry.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/input/common/ChatInputHookRegistry.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.common +package com.ai.assistance.operit.ui.features.conversation.chat.modules.input.common import android.content.Context import com.ai.assistance.operit.util.logging.AppLogger diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/input/common/InputMenuTogglePluginRegistry.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/input/common/InputMenuTogglePluginRegistry.kt similarity index 96% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/input/common/InputMenuTogglePluginRegistry.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/input/common/InputMenuTogglePluginRegistry.kt index 9916cf95d4..cfe702f04d 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/input/common/InputMenuTogglePluginRegistry.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/input/common/InputMenuTogglePluginRegistry.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.common +package com.ai.assistance.operit.ui.features.conversation.chat.modules.input.common import androidx.annotation.StringRes import java.util.concurrent.CopyOnWriteArrayList diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/input/common/MentionVisualTransformation.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/input/common/MentionVisualTransformation.kt similarity index 92% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/input/common/MentionVisualTransformation.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/input/common/MentionVisualTransformation.kt index dde0875f78..4f335dd345 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/input/common/MentionVisualTransformation.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/input/common/MentionVisualTransformation.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.common +package com.ai.assistance.operit.ui.features.conversation.chat.modules.input.common import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable @@ -15,7 +15,7 @@ import androidx.compose.ui.text.input.VisualTransformation import androidx.compose.ui.unit.TextUnit import androidx.compose.ui.unit.isUnspecified import androidx.compose.ui.unit.sp -import com.ai.assistance.operit.ui.features.conversation.chat.util.findCommittedMentionTokens +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.mentions.findCommittedMentionTokens @Composable fun rememberMentionVisualTransformation(textStyle: TextStyle): VisualTransformation { diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/input/common/PendingMessageQueuePanel.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/input/common/PendingMessageQueuePanel.kt similarity index 97% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/input/common/PendingMessageQueuePanel.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/input/common/PendingMessageQueuePanel.kt index dbca2e893a..129d0fcd18 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/input/common/PendingMessageQueuePanel.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/input/common/PendingMessageQueuePanel.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.common +package com.ai.assistance.operit.ui.features.conversation.chat.modules.input.common import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box @@ -33,11 +33,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import com.ai.assistance.operit.R - -data class PendingQueueMessageItem( - val id: Long, - val text: String -) +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.model.PendingQueueMessageItem @Composable fun PendingMessageQueuePanel( diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/input/common/ThinkingQualitySlider.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/input/common/ThinkingQualitySlider.kt similarity index 99% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/input/common/ThinkingQualitySlider.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/input/common/ThinkingQualitySlider.kt index b77ef2715a..c8870a8b71 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/input/common/ThinkingQualitySlider.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/input/common/ThinkingQualitySlider.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.common +package com.ai.assistance.operit.ui.features.conversation.chat.modules.input.common import androidx.compose.animation.core.Animatable import androidx.compose.animation.core.LinearEasing diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/input/common/ToolPromptManagerDialog.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/input/common/ToolPromptManagerDialog.kt similarity index 98% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/input/common/ToolPromptManagerDialog.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/input/common/ToolPromptManagerDialog.kt index b04eae21fa..8e622aecfd 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/input/common/ToolPromptManagerDialog.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/input/common/ToolPromptManagerDialog.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.common +package com.ai.assistance.operit.ui.features.conversation.chat.modules.input.common import androidx.compose.animation.core.spring import androidx.compose.foundation.clickable diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/MemoryFolderSelectionDialog.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/input/memory/MemoryFolderSelectionDialog.kt similarity index 99% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/MemoryFolderSelectionDialog.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/input/memory/MemoryFolderSelectionDialog.kt index e9ef21b8b1..33d67ab2dd 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/MemoryFolderSelectionDialog.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/input/memory/MemoryFolderSelectionDialog.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components +package com.ai.assistance.operit.ui.features.conversation.chat.modules.input.memory import android.content.Context import com.ai.assistance.operit.util.logging.AppLogger diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/WorkspaceFileSelector.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/input/mentions/MentionSuggestionPanel.kt similarity index 99% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/WorkspaceFileSelector.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/input/mentions/MentionSuggestionPanel.kt index b1d4325073..bef42b2e75 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/WorkspaceFileSelector.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/input/mentions/MentionSuggestionPanel.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview +package com.ai.assistance.operit.ui.features.conversation.chat.modules.input.mentions import com.ai.assistance.operit.data.preferences.glass.GlassRegion import android.content.Context @@ -45,7 +45,7 @@ import com.ai.assistance.operit.core.tools.AIToolHandler import com.ai.assistance.operit.core.tools.packTool.PackageManager as ToolPackageManager import com.ai.assistance.operit.data.skill.SkillRepository import com.ai.assistance.operit.ui.features.conversation.chat.viewmodel.ChatViewModel -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.process.GitIgnoreFilter +import com.ai.assistance.operit.ui.features.conversation.workspace.process.GitIgnoreFilter import com.ai.assistance.operit.ui.theme.isLiquidGlassSupported import com.ai.assistance.operit.ui.theme.isWaterGlassSupported import com.ai.assistance.operit.ui.theme.liquidGlass diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/ChatArea.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/ChatArea.kt similarity index 97% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/ChatArea.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/ChatArea.kt index 10b5242783..dc036ffca3 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/ChatArea.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/ChatArea.kt @@ -1,9 +1,9 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components +package com.ai.assistance.operit.ui.features.conversation.chat.modules.messages import com.ai.assistance.operit.ui.common.oktoast.OKToast import androidx.compose.material.icons.filled.Translate -import com.ai.assistance.operit.ui.features.conversation.chat.components.timeline.ChatMessageSlice +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.timeline.ChatMessageSlice import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyListState import androidx.compose.foundation.lazy.items @@ -13,8 +13,8 @@ import androidx.compose.runtime.collectAsState import com.ai.assistance.operit.data.preferences.DisplayPreferencesManager import com.ai.assistance.operit.data.preferences.ToolCollapseMode import com.ai.assistance.operit.ui.common.markdown.lazy.LocalMarkdownRenderFragment -import com.ai.assistance.operit.ui.features.conversation.chat.components.timeline.LocalChatMessageSlice -import com.ai.assistance.operit.ui.features.conversation.chat.components.timeline.rememberChatTimelineEntries +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.timeline.LocalChatMessageSlice +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.timeline.rememberChatTimelineEntries import androidx.compose.animation.core.RepeatMode import androidx.compose.animation.core.StartOffset import androidx.compose.animation.core.animateFloat @@ -67,7 +67,7 @@ import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.runtime.saveable.rememberSaveableStateHolder -import com.ai.assistance.operit.ui.features.conversation.chat.copy.MessageCopyTextField +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.copy.MessageCopyTextField import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue @@ -100,12 +100,12 @@ import androidx.compose.ui.unit.sp import com.ai.assistance.operit.R import com.ai.assistance.operit.data.model.AiReference import com.ai.assistance.operit.data.model.ChatMessage -import com.ai.assistance.operit.ui.features.conversation.chat.components.details.MessageGenerationDetails -import com.ai.assistance.operit.ui.features.conversation.chat.components.details.formatMessageCompletionTime -import com.ai.assistance.operit.ui.features.conversation.chat.components.details.hasDisplayableMessageTimestamp -import com.ai.assistance.operit.ui.features.conversation.chat.components.details.hasDisplayableTimingStats -import com.ai.assistance.operit.ui.features.conversation.chat.components.details.hasDisplayableTokenSpeedStats -import com.ai.assistance.operit.ui.features.conversation.chat.components.details.hasDisplayableTokenStats +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.details.MessageGenerationDetails +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.details.formatMessageCompletionTime +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.details.hasDisplayableMessageTimestamp +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.details.hasDisplayableTimingStats +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.details.hasDisplayableTokenSpeedStats +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.details.hasDisplayableTokenStats import com.ai.assistance.operit.data.model.MessageSectionCodec import com.ai.assistance.operit.data.model.MessageSection import com.ai.assistance.operit.data.model.ChatMessageDisplayMode @@ -130,13 +130,17 @@ import com.ai.assistance.operit.plugins.chatmessage.ChatMessageMenuItemRegistry import com.ai.assistance.operit.ui.common.composedsl.ToolPkgComposeDslDialogHost import com.ai.assistance.operit.ui.common.icons.MaterialIconNameResolver import com.ai.assistance.operit.ui.common.markdown.markdownToPlainTextForCopy -import com.ai.assistance.operit.ui.features.conversation.chat.components.style.cursor.CursorStyleChatMessage -import com.ai.assistance.operit.ui.features.conversation.chat.components.style.bubble.BubbleImageStyleConfig -import com.ai.assistance.operit.ui.features.conversation.chat.components.style.bubble.BubbleStyleChatMessage +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.style.cursor.CursorStyleChatMessage +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.style.bubble.BubbleImageStyleConfig +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.style.bubble.BubbleStyleChatMessage import com.ai.assistance.operit.ui.theme.LocalThemePreferenceSnapshot import com.ai.assistance.operit.util.logging.AppLogger import com.ai.assistance.operit.core.chat.protocol.ChatMarkupRegex import com.ai.assistance.operit.util.markdown.LatexMathMlConverter +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.list.animateScrollToEnd +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.model.ChatStyle +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.details.MessageInfoDialog +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.navigation.ChatScrollNavigator import kotlin.math.roundToInt import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -197,11 +201,6 @@ private fun isHiddenUserPlaceholder(message: ChatMessage): Boolean { message.displayMode == ChatMessageDisplayMode.HIDDEN_PLACEHOLDER } -enum class ChatStyle { - CURSOR, - BUBBLE -} - @Composable fun ChatArea( chatHistory: List, diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/WorkspaceChangeConfirmDialog.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/actions/WorkspaceChangeConfirmDialog.kt similarity index 96% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/WorkspaceChangeConfirmDialog.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/actions/WorkspaceChangeConfirmDialog.kt index 4b4048a9d3..2095553a4a 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/WorkspaceChangeConfirmDialog.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/actions/WorkspaceChangeConfirmDialog.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components +package com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.actions import androidx.compose.foundation.background import androidx.compose.foundation.layout.* @@ -27,7 +27,9 @@ import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.DialogProperties import androidx.compose.material3.Icon import com.ai.assistance.operit.R -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.WorkspaceBackupManager +import com.ai.assistance.operit.ui.features.conversation.workspace.WorkspaceBackupManager +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.layout.compactDialogHeightOrWrapContent +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.layout.rememberCompactDialogMetrics enum class WorkspaceChangeConfirmMode { ROLLBACK, diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/copy/MessageCopyTextField.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/copy/MessageCopyTextField.kt similarity index 95% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/copy/MessageCopyTextField.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/copy/MessageCopyTextField.kt index bd8798ba70..fc214b9b5f 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/copy/MessageCopyTextField.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/copy/MessageCopyTextField.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.copy +package com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.copy import androidx.compose.foundation.ScrollState import androidx.compose.foundation.text.BasicTextField diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/details/MessageGenerationDetails.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/details/MessageGenerationDetails.kt similarity index 97% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/details/MessageGenerationDetails.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/details/MessageGenerationDetails.kt index acc1023cf8..efcf6f9f77 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/details/MessageGenerationDetails.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/details/MessageGenerationDetails.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components.details +package com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.details import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement @@ -30,7 +30,7 @@ import androidx.compose.ui.semantics.stateDescription import androidx.compose.ui.unit.dp import com.ai.assistance.operit.R import com.ai.assistance.operit.data.model.ChatMessage -import com.ai.assistance.operit.ui.features.conversation.chat.components.formatCacheHitRate +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.format.formatCacheHitRate internal fun hasDisplayableTokenStats(message: ChatMessage): Boolean { return message.inputTokens > 0L || message.cachedInputTokens > 0L || message.outputTokens > 0L diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/MessageInfoDialog.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/details/MessageInfoDialog.kt similarity index 93% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/MessageInfoDialog.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/details/MessageInfoDialog.kt index 7fe5e2c9eb..804de7fabc 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/MessageInfoDialog.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/details/MessageInfoDialog.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components +package com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.details import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column @@ -21,11 +21,6 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import com.ai.assistance.operit.R import com.ai.assistance.operit.data.model.ChatMessage -import com.ai.assistance.operit.ui.features.conversation.chat.components.details.calculateMessageTokenSpeed -import com.ai.assistance.operit.ui.features.conversation.chat.components.details.formatMessageDuration -import com.ai.assistance.operit.ui.features.conversation.chat.components.details.formatMessageNumber -import com.ai.assistance.operit.ui.features.conversation.chat.components.details.formatMessageTokenSpeed -import com.ai.assistance.operit.ui.features.conversation.chat.components.details.messageTokenBreakdownText import java.text.SimpleDateFormat import java.util.Date import java.util.Locale diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/details/MessageStatsFormatting.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/details/MessageStatsFormatting.kt similarity index 94% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/details/MessageStatsFormatting.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/details/MessageStatsFormatting.kt index d6b51afbd9..a70719c83e 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/details/MessageStatsFormatting.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/details/MessageStatsFormatting.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components.details +package com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.details import java.text.SimpleDateFormat import java.util.Date diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/MessageEditor.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/editor/MessageEditor.kt similarity index 99% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/MessageEditor.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/editor/MessageEditor.kt index 81c10c19d9..576ab4910d 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/MessageEditor.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/editor/MessageEditor.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components +package com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.editor import androidx.annotation.StringRes import androidx.compose.animation.AnimatedVisibility diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/MessageEditorContent.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/editor/MessageEditorContent.kt similarity index 98% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/MessageEditorContent.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/editor/MessageEditorContent.kt index c5ee1d1f7f..6bfedd0978 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/MessageEditorContent.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/editor/MessageEditorContent.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components +package com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.editor import com.ai.assistance.operit.core.chat.protocol.ThinkingMarkup diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/LinkPreviewDialog.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/links/LinkPreviewDialog.kt similarity index 92% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/LinkPreviewDialog.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/links/LinkPreviewDialog.kt index 13f99f2ea8..4f7401ae72 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/LinkPreviewDialog.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/links/LinkPreviewDialog.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components +package com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.links import com.ai.assistance.operit.ui.common.oktoast.OKToast @@ -22,8 +22,12 @@ import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.DialogProperties import com.ai.assistance.operit.R import com.ai.assistance.operit.ui.common.markdown.links.openMarkdownLink -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.links.LocalWorkspaceFileLinkOpener -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.links.parseWorkspaceFileLink +import com.ai.assistance.operit.ui.features.conversation.workspace.links.LocalWorkspaceFileLinkOpener +import com.ai.assistance.operit.ui.features.conversation.workspace.links.parseWorkspaceFileLink +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.layout.compactDialogHeight +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.layout.rememberCompactDialogMetrics +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.layout.rememberCompactDialogScrollState +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.layout.verticalScrollWhenCompact /** * 链接预览弹窗组件 diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/motion/NewChatIntro.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/motion/NewChatIntro.kt similarity index 99% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/motion/NewChatIntro.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/motion/NewChatIntro.kt index 41da15a5f3..0e0945aab6 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/motion/NewChatIntro.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/motion/NewChatIntro.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.motion +package com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.motion import android.animation.ValueAnimator import android.graphics.Bitmap diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/ChatScrollNavigator.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/navigation/ChatScrollNavigator.kt similarity index 99% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/ChatScrollNavigator.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/navigation/ChatScrollNavigator.kt index d762fb690f..f0739ce4c7 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/ChatScrollNavigator.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/navigation/ChatScrollNavigator.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components +package com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.navigation import androidx.compose.foundation.lazy.LazyListState as ComposeLazyListState import androidx.compose.animation.AnimatedVisibility @@ -67,8 +67,9 @@ import com.ai.assistance.operit.R import com.ai.assistance.operit.data.model.ChatMessage import com.ai.assistance.operit.data.model.ChatMessageDisplayMode import com.ai.assistance.operit.data.model.ChatMessageLocatorPreview -import com.ai.assistance.operit.ui.features.conversation.chat.components.lazy.LazyListState as ChatLazyListState +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy.LazyListState as ChatLazyListState import com.ai.assistance.operit.util.logging.AppLogger +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.list.animateScrollToEnd import kotlinx.coroutines.delay import kotlinx.coroutines.CancellationException import kotlinx.coroutines.flow.collectLatest diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/ScrollToBottomButton.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/navigation/ScrollToBottomButton.kt similarity index 97% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/ScrollToBottomButton.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/navigation/ScrollToBottomButton.kt index b9ea7ee8f0..5f23dece79 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/ScrollToBottomButton.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/navigation/ScrollToBottomButton.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components +package com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.navigation import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.fadeIn @@ -23,7 +23,8 @@ import androidx.compose.runtime.setValue import androidx.compose.runtime.snapshotFlow import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp -import com.ai.assistance.operit.ui.features.conversation.chat.components.lazy.LazyListState as ChatLazyListState +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy.LazyListState as ChatLazyListState +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.list.animateScrollToEnd import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.launch diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/ReferencesDisplay.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/references/ReferencesDisplay.kt similarity index 96% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/ReferencesDisplay.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/references/ReferencesDisplay.kt index 07444b56bf..311cdc211b 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/ReferencesDisplay.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/references/ReferencesDisplay.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components +package com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.references // import androidx.compose.animation.AnimatedVisibility // import androidx.compose.animation.fadeIn diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/ChatNodeVisibility.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/ChatNodeVisibility.kt similarity index 94% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/ChatNodeVisibility.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/ChatNodeVisibility.kt index 226816b1a9..a71f399698 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/ChatNodeVisibility.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/ChatNodeVisibility.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components.part +package com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering import com.ai.assistance.operit.core.chat.protocol.ChatMarkupRegex import com.ai.assistance.operit.util.markdown.MarkdownNodeStable diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/CustomXmlRenderer.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/CustomXmlRenderer.kt similarity index 99% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/CustomXmlRenderer.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/CustomXmlRenderer.kt index c3965fef02..7a8467e2e7 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/CustomXmlRenderer.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/CustomXmlRenderer.kt @@ -1,10 +1,10 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components.part +package com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering import com.ai.assistance.operit.util.toolmarkup.ToolResultMarkup import com.ai.assistance.operit.ui.common.markdown.lazy.LocalMarkdownCardNodeIndex -import com.ai.assistance.operit.ui.features.conversation.chat.components.part.tooltiming.LocalToolTimingIndex -import com.ai.assistance.operit.ui.features.conversation.chat.components.part.tooltiming.LocalInsideToolGroup -import com.ai.assistance.operit.ui.features.conversation.chat.components.part.tooltiming.toolTimingTitle +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering.tooltiming.LocalToolTimingIndex +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering.tooltiming.LocalInsideToolGroup +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering.tooltiming.toolTimingTitle import com.ai.assistance.operit.ui.common.markdown.lazy.rememberMarkdownCardValue import android.webkit.WebView import android.webkit.WebSettings diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/DetailsTagRenderer.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/DetailsTagRenderer.kt similarity index 97% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/DetailsTagRenderer.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/DetailsTagRenderer.kt index d15cdc94c7..bb55030bf4 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/DetailsTagRenderer.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/DetailsTagRenderer.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components.part +package com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering import com.ai.assistance.operit.ui.common.markdown.lazy.rememberMarkdownCardValue import androidx.compose.animation.AnimatedVisibility diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/DialogComponents.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/DialogComponents.kt similarity index 96% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/DialogComponents.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/DialogComponents.kt index 576c7cd81c..d00fe84ba7 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/DialogComponents.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/DialogComponents.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components.part +package com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering import androidx.compose.foundation.background import androidx.compose.foundation.layout.* @@ -25,8 +25,8 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.window.Dialog import com.ai.assistance.operit.R import androidx.compose.ui.window.DialogProperties -import com.ai.assistance.operit.ui.features.conversation.chat.components.compactDialogHeightWhenShort -import com.ai.assistance.operit.ui.features.conversation.chat.components.rememberCompactDialogMetrics +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.layout.compactDialogHeightWhenShort +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.layout.rememberCompactDialogMetrics /** * 通用的内容详情弹窗 diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/FileDiffDisplay.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/FileDiffDisplay.kt similarity index 97% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/FileDiffDisplay.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/FileDiffDisplay.kt index 9ef1204320..f002e26a4e 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/FileDiffDisplay.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/FileDiffDisplay.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components.part +package com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.background diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/FontTagRenderer.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/FontTagRenderer.kt similarity index 98% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/FontTagRenderer.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/FontTagRenderer.kt index abebfab88d..fd167fb19a 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/FontTagRenderer.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/FontTagRenderer.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components.part +package com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/ParamVisualizer.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/ParamVisualizer.kt similarity index 97% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/ParamVisualizer.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/ParamVisualizer.kt index 62bd05c250..0e2cbedc28 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/ParamVisualizer.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/ParamVisualizer.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components.part +package com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering import androidx.compose.foundation.background import androidx.compose.foundation.layout.* diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/StatusCardHtmlDocument.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/StatusCardHtmlDocument.kt similarity index 98% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/StatusCardHtmlDocument.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/StatusCardHtmlDocument.kt index d7444947ac..ccdd1c7de2 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/StatusCardHtmlDocument.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/StatusCardHtmlDocument.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components.part +package com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering import android.content.Context import android.util.Base64 diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/ThinkToolsRows.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/ThinkToolsRows.kt similarity index 92% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/ThinkToolsRows.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/ThinkToolsRows.kt index 9f97aa9862..a838632182 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/ThinkToolsRows.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/ThinkToolsRows.kt @@ -1,8 +1,8 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components.part +package com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering import androidx.compose.runtime.Composable -import com.ai.assistance.operit.ui.features.conversation.chat.components.part.tooltiming.ToolTimingSummary -import com.ai.assistance.operit.ui.features.conversation.chat.components.part.tooltiming.toolTimingTitle +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering.tooltiming.ToolTimingSummary +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering.tooltiming.toolTimingTitle import androidx.compose.ui.res.stringResource import com.ai.assistance.operit.R import com.ai.assistance.operit.ui.common.markdown.MarkdownGroupedItem diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/ThinkToolsXmlNodeGrouper.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/ThinkToolsXmlNodeGrouper.kt similarity index 97% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/ThinkToolsXmlNodeGrouper.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/ThinkToolsXmlNodeGrouper.kt index 062b001259..575ab656a2 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/ThinkToolsXmlNodeGrouper.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/ThinkToolsXmlNodeGrouper.kt @@ -1,9 +1,9 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components.part +package com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering import androidx.compose.runtime.CompositionLocalProvider -import com.ai.assistance.operit.ui.features.conversation.chat.components.part.tooltiming.ToolTimingIndex -import com.ai.assistance.operit.ui.features.conversation.chat.components.part.tooltiming.LocalToolTimingIndex -import com.ai.assistance.operit.ui.features.conversation.chat.components.part.tooltiming.LocalInsideToolGroup +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering.tooltiming.ToolTimingIndex +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering.tooltiming.LocalToolTimingIndex +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering.tooltiming.LocalInsideToolGroup import com.ai.assistance.operit.ui.common.markdown.lazy.LocalMarkdownCardNodeIndex import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.core.animateFloatAsState diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/ThinkingMarkdownStream.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/ThinkingMarkdownStream.kt similarity index 96% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/ThinkingMarkdownStream.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/ThinkingMarkdownStream.kt index 1f03d6cc3f..e650aff93f 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/ThinkingMarkdownStream.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/ThinkingMarkdownStream.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components.part +package com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering import com.ai.assistance.operit.core.chat.protocol.ThinkingMarkup import com.ai.assistance.operit.util.stream.Stream diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/ToolDisplayComponents.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/ToolDisplayComponents.kt similarity index 99% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/ToolDisplayComponents.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/ToolDisplayComponents.kt index 704e75720e..e1a4723a03 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/ToolDisplayComponents.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/ToolDisplayComponents.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components.part +package com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/ToolResultDisplay.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/ToolResultDisplay.kt similarity index 96% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/ToolResultDisplay.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/ToolResultDisplay.kt index 90026ca6da..5563ba680f 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/ToolResultDisplay.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/ToolResultDisplay.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components.part +package com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering import androidx.compose.foundation.background import androidx.compose.foundation.clickable @@ -25,8 +25,8 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.DialogProperties import com.ai.assistance.operit.R -import com.ai.assistance.operit.ui.features.conversation.chat.components.compactDialogHeightWhenShort -import com.ai.assistance.operit.ui.features.conversation.chat.components.rememberCompactDialogMetrics +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.layout.compactDialogHeightWhenShort +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.layout.rememberCompactDialogMetrics /** 工具执行结果显示组件 简洁风格,显示工具执行结果,无边框,与CompactToolDisplay风格一致 通过缩进和特殊图标区分工具调用和执行结果 支持点击查看详细内容 */ @Composable diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/XmlCanvasBlockComponents.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/XmlCanvasBlockComponents.kt similarity index 99% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/XmlCanvasBlockComponents.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/XmlCanvasBlockComponents.kt index c68ca1016d..991adaab42 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/XmlCanvasBlockComponents.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/XmlCanvasBlockComponents.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components.part +package com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering import androidx.compose.foundation.Canvas import androidx.compose.foundation.clickable diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/XmlCanvasSummaryComponents.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/XmlCanvasSummaryComponents.kt similarity index 99% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/XmlCanvasSummaryComponents.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/XmlCanvasSummaryComponents.kt index d869e24163..7da47307da 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/XmlCanvasSummaryComponents.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/XmlCanvasSummaryComponents.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components.part +package com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering import androidx.compose.foundation.Canvas import androidx.compose.foundation.clickable diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/tooltiming/ToolTimingIndex.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/tooltiming/ToolTimingIndex.kt similarity index 98% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/tooltiming/ToolTimingIndex.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/tooltiming/ToolTimingIndex.kt index c2ae2eefa6..12e85d618b 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/tooltiming/ToolTimingIndex.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/tooltiming/ToolTimingIndex.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components.part.tooltiming +package com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering.tooltiming import com.ai.assistance.operit.core.chat.protocol.ChatMarkupRegex import com.ai.assistance.operit.core.chat.tools.timing.ToolExecutionTiming diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/tooltiming/ToolTimingTitle.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/tooltiming/ToolTimingTitle.kt similarity index 96% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/tooltiming/ToolTimingTitle.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/tooltiming/ToolTimingTitle.kt index 4843dc5b4e..5bbf385f9e 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/tooltiming/ToolTimingTitle.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/tooltiming/ToolTimingTitle.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components.part.tooltiming +package com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering.tooltiming import android.os.SystemClock import androidx.compose.runtime.Composable diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/bubble/BubbleAiMessageComposable.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/style/bubble/BubbleAiMessageComposable.kt similarity index 97% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/bubble/BubbleAiMessageComposable.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/style/bubble/BubbleAiMessageComposable.kt index 0e8f603ded..8f744a4636 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/bubble/BubbleAiMessageComposable.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/style/bubble/BubbleAiMessageComposable.kt @@ -1,9 +1,9 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components.style.bubble +package com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.style.bubble import com.ai.assistance.operit.data.preferences.glass.GlassRegion import com.ai.assistance.operit.data.preferences.transparency.ThemeTransparencyPreferences -import com.ai.assistance.operit.ui.features.conversation.chat.components.timeline.LocalChatMessageSlice -import com.ai.assistance.operit.ui.features.conversation.chat.components.part.tooltiming.rememberMessageToolExecutions +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.timeline.LocalChatMessageSlice +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering.tooltiming.rememberMessageToolExecutions import com.ai.assistance.operit.ui.common.markdown.rememberDisplayMessageSections import com.ai.assistance.operit.ui.common.markdown.lazy.LocalMarkdownRenderFragment import android.annotation.SuppressLint @@ -38,11 +38,11 @@ import androidx.compose.ui.unit.dp import com.ai.assistance.operit.data.model.ChatMessage import com.ai.assistance.operit.ui.common.markdown.StreamMarkdownRenderer import com.ai.assistance.operit.ui.common.markdown.StreamMarkdownRendererState -import com.ai.assistance.operit.ui.features.conversation.chat.components.ChatMessageHeightMemory -import com.ai.assistance.operit.ui.features.conversation.chat.components.rememberRevisableTextStream -import com.ai.assistance.operit.ui.features.conversation.chat.components.part.CustomXmlRenderer -import com.ai.assistance.operit.ui.features.conversation.chat.components.part.ThinkToolsXmlNodeGrouper -import com.ai.assistance.operit.ui.features.conversation.chat.components.LinkPreviewDialog +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.list.ChatMessageHeightMemory +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.stream.rememberRevisableTextStream +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering.CustomXmlRenderer +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering.ThinkToolsXmlNodeGrouper +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.links.LinkPreviewDialog import com.ai.assistance.operit.util.markdown.toCharStream import com.ai.assistance.operit.data.preferences.UserPreferencesManager import com.ai.assistance.operit.data.preferences.DisplayPreferencesManager diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/bubble/BubbleImageBackgroundSurface.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/style/bubble/BubbleImageBackgroundSurface.kt similarity index 98% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/bubble/BubbleImageBackgroundSurface.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/style/bubble/BubbleImageBackgroundSurface.kt index a9d88c9b8f..3bf8668e43 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/bubble/BubbleImageBackgroundSurface.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/style/bubble/BubbleImageBackgroundSurface.kt @@ -1,10 +1,10 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components.style.bubble +package com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.style.bubble import androidx.compose.ui.geometry.Offset import androidx.compose.ui.geometry.Rect import androidx.compose.ui.graphics.Paint import androidx.collection.LruCache -import com.ai.assistance.operit.ui.features.conversation.chat.components.timeline.LocalChatMessageSlice +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.timeline.LocalChatMessageSlice import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/bubble/BubbleImageLayout.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/style/bubble/BubbleImageLayout.kt similarity index 98% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/bubble/BubbleImageLayout.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/style/bubble/BubbleImageLayout.kt index 0b8591930b..38c899fab7 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/bubble/BubbleImageLayout.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/style/bubble/BubbleImageLayout.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components.style.bubble +package com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.style.bubble import kotlin.math.max import kotlin.math.roundToInt diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/bubble/BubbleImageTiling.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/style/bubble/BubbleImageTiling.kt similarity index 98% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/bubble/BubbleImageTiling.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/style/bubble/BubbleImageTiling.kt index 054bd9cae5..756a8ae36b 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/bubble/BubbleImageTiling.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/style/bubble/BubbleImageTiling.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components.style.bubble +package com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.style.bubble import android.graphics.Bitmap import android.graphics.BitmapShader diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/bubble/BubbleStyleChatMessage.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/style/bubble/BubbleStyleChatMessage.kt similarity index 92% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/bubble/BubbleStyleChatMessage.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/style/bubble/BubbleStyleChatMessage.kt index 822e4c0f99..598abf73d1 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/bubble/BubbleStyleChatMessage.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/style/bubble/BubbleStyleChatMessage.kt @@ -1,11 +1,11 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components.style.bubble +package com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.style.bubble import androidx.compose.runtime.Composable import androidx.compose.ui.graphics.Color import com.ai.assistance.operit.data.model.ChatMessage -import com.ai.assistance.operit.ui.features.conversation.chat.components.ChatMessageHeightMemory -import com.ai.assistance.operit.ui.features.conversation.chat.components.style.cursor.SummaryMessageComposable +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.list.ChatMessageHeightMemory +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.style.cursor.SummaryMessageComposable import com.ai.assistance.operit.util.stream.Stream /** diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/bubble/BubbleUserMessageComposable.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/style/bubble/BubbleUserMessageComposable.kt similarity index 97% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/bubble/BubbleUserMessageComposable.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/style/bubble/BubbleUserMessageComposable.kt index 10a74d3bd6..a719cc7538 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/bubble/BubbleUserMessageComposable.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/style/bubble/BubbleUserMessageComposable.kt @@ -1,13 +1,13 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components.style.bubble +package com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.style.bubble import com.ai.assistance.operit.core.chat.voice.VoiceMessageMarkup import com.ai.assistance.operit.core.chat.media.unescapeMediaAttribute -import com.ai.assistance.operit.ui.features.conversation.chat.attachments.MediaFileGuard -import com.ai.assistance.operit.ui.features.conversation.chat.voicemessages.VoiceMessagePlayer -import com.ai.assistance.operit.ui.features.conversation.chat.voicemessages.ExpiredVoiceMessageTag -import com.ai.assistance.operit.ui.features.conversation.chat.attachments.rememberMediaFileMissing +import com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.MediaFileGuard +import com.ai.assistance.operit.ui.features.conversation.chat.modules.voice.VoiceMessagePlayer +import com.ai.assistance.operit.ui.features.conversation.chat.modules.voice.ExpiredVoiceMessageTag +import com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.rememberMediaFileMissing import com.ai.assistance.operit.data.preferences.glass.GlassRegion -import com.ai.assistance.operit.ui.features.conversation.chat.attachments.images.SentImageGroup -import com.ai.assistance.operit.ui.features.conversation.chat.attachments.images.sentImageSources +import com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.images.SentImageGroup +import com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.images.sentImageSources import com.ai.assistance.operit.data.preferences.transparency.ThemeTransparencyPreferences import android.annotation.SuppressLint @@ -59,9 +59,9 @@ import com.ai.assistance.operit.data.model.ChatMessageDisplayMode import com.ai.assistance.operit.data.preferences.CharacterCardManager import com.ai.assistance.operit.data.preferences.DisplayPreferencesManager import com.ai.assistance.operit.data.preferences.UserPreferencesManager -import com.ai.assistance.operit.ui.features.conversation.chat.components.attachments.AttachmentViewerDialog -import com.ai.assistance.operit.ui.features.conversation.chat.components.attachments.ChatAttachment -import com.ai.assistance.operit.ui.features.conversation.chat.components.style.common.HiddenUserMessagePlaceholderContent +import com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.preview.AttachmentViewerDialog +import com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.preview.ChatAttachment +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.style.common.HiddenUserMessagePlaceholderContent import com.ai.assistance.operit.core.chat.media.MediaLinkParser import com.ai.assistance.operit.core.chat.protocol.ChatMarkupRegex import com.ai.assistance.operit.ui.theme.applyFontFamilyToTypography diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/common/HiddenUserMessagePlaceholderContent.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/style/common/HiddenUserMessagePlaceholderContent.kt similarity index 95% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/common/HiddenUserMessagePlaceholderContent.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/style/common/HiddenUserMessagePlaceholderContent.kt index 076958c1e9..da03c919c7 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/common/HiddenUserMessagePlaceholderContent.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/style/common/HiddenUserMessagePlaceholderContent.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components.style.common +package com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.style.common import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/cursor/AiMessageComposable.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/style/cursor/AiMessageComposable.kt similarity index 92% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/cursor/AiMessageComposable.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/style/cursor/AiMessageComposable.kt index 0454d19ace..718da88287 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/cursor/AiMessageComposable.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/style/cursor/AiMessageComposable.kt @@ -1,10 +1,10 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components.style.cursor +package com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.style.cursor import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.background import com.ai.assistance.operit.data.preferences.transparency.ThemeTransparencyPreferences -import com.ai.assistance.operit.ui.features.conversation.chat.components.timeline.LocalChatMessageSlice -import com.ai.assistance.operit.ui.features.conversation.chat.components.part.tooltiming.rememberMessageToolExecutions +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.timeline.LocalChatMessageSlice +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering.tooltiming.rememberMessageToolExecutions import com.ai.assistance.operit.ui.common.markdown.rememberDisplayMessageSections import com.ai.assistance.operit.ui.common.markdown.lazy.LocalMarkdownRenderFragment import android.content.Intent @@ -25,11 +25,11 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp import com.ai.assistance.operit.data.model.ChatMessage import com.ai.assistance.operit.ui.common.markdown.StreamMarkdownRenderer -import com.ai.assistance.operit.ui.features.conversation.chat.components.ChatMessageHeightMemory -import com.ai.assistance.operit.ui.features.conversation.chat.components.rememberRevisableTextStream -import com.ai.assistance.operit.ui.features.conversation.chat.components.part.CustomXmlRenderer -import com.ai.assistance.operit.ui.features.conversation.chat.components.part.ThinkToolsXmlNodeGrouper -import com.ai.assistance.operit.ui.features.conversation.chat.components.LinkPreviewDialog +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.list.ChatMessageHeightMemory +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.stream.rememberRevisableTextStream +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering.CustomXmlRenderer +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering.ThinkToolsXmlNodeGrouper +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.links.LinkPreviewDialog import com.ai.assistance.operit.util.markdown.toCharStream import com.ai.assistance.operit.util.stream.Stream import com.ai.assistance.operit.data.preferences.DisplayPreferencesManager diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/cursor/CursorStyleChatMessage.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/style/cursor/CursorStyleChatMessage.kt similarity index 94% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/cursor/CursorStyleChatMessage.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/style/cursor/CursorStyleChatMessage.kt index 783bdcd9b6..df770c7927 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/cursor/CursorStyleChatMessage.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/style/cursor/CursorStyleChatMessage.kt @@ -1,9 +1,9 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components.style.cursor +package com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.style.cursor import androidx.compose.runtime.Composable import androidx.compose.ui.graphics.Color import com.ai.assistance.operit.data.model.ChatMessage -import com.ai.assistance.operit.ui.features.conversation.chat.components.ChatMessageHeightMemory +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.list.ChatMessageHeightMemory import com.ai.assistance.operit.util.stream.Stream /** diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/cursor/SummaryMessageComposable.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/style/cursor/SummaryMessageComposable.kt similarity index 98% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/cursor/SummaryMessageComposable.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/style/cursor/SummaryMessageComposable.kt index 0e790e263e..2387a6e7af 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/cursor/SummaryMessageComposable.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/style/cursor/SummaryMessageComposable.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components.style.cursor +package com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.style.cursor import androidx.compose.foundation.background import androidx.compose.foundation.clickable diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/cursor/UserMessageComposable.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/style/cursor/UserMessageComposable.kt similarity index 96% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/cursor/UserMessageComposable.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/style/cursor/UserMessageComposable.kt index d81f662726..7fda519e82 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/cursor/UserMessageComposable.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/style/cursor/UserMessageComposable.kt @@ -1,13 +1,13 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components.style.cursor +package com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.style.cursor import com.ai.assistance.operit.core.chat.voice.VoiceMessageMarkup import com.ai.assistance.operit.core.chat.media.unescapeMediaAttribute -import com.ai.assistance.operit.ui.features.conversation.chat.attachments.MediaFileGuard -import com.ai.assistance.operit.ui.features.conversation.chat.voicemessages.VoiceMessagePlayer -import com.ai.assistance.operit.ui.features.conversation.chat.voicemessages.ExpiredVoiceMessageTag -import com.ai.assistance.operit.ui.features.conversation.chat.attachments.rememberMediaFileMissing +import com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.MediaFileGuard +import com.ai.assistance.operit.ui.features.conversation.chat.modules.voice.VoiceMessagePlayer +import com.ai.assistance.operit.ui.features.conversation.chat.modules.voice.ExpiredVoiceMessageTag +import com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.rememberMediaFileMissing import com.ai.assistance.operit.data.preferences.glass.GlassRegion -import com.ai.assistance.operit.ui.features.conversation.chat.attachments.images.SentImageGroup -import com.ai.assistance.operit.ui.features.conversation.chat.attachments.images.sentImageSources +import com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.images.SentImageGroup +import com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.images.sentImageSources import com.ai.assistance.operit.ui.theme.LocalThemePreferenceSnapshot import com.ai.assistance.operit.data.preferences.transparency.ThemeTransparencyPreferences @@ -72,9 +72,9 @@ import androidx.compose.ui.window.Dialog import com.ai.assistance.operit.R import com.ai.assistance.operit.data.model.ChatMessage import com.ai.assistance.operit.data.model.ChatMessageDisplayMode -import com.ai.assistance.operit.ui.features.conversation.chat.components.attachments.AttachmentViewerDialog -import com.ai.assistance.operit.ui.features.conversation.chat.components.attachments.ChatAttachment -import com.ai.assistance.operit.ui.features.conversation.chat.components.style.common.HiddenUserMessagePlaceholderContent +import com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.preview.AttachmentViewerDialog +import com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.preview.ChatAttachment +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.style.common.HiddenUserMessagePlaceholderContent import com.ai.assistance.operit.core.chat.media.MediaLinkParser import com.ai.assistance.operit.ui.theme.isLiquidGlassSupported import com.ai.assistance.operit.ui.theme.isWaterGlassSupported diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/timeline/ChatTimelineEntries.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/timeline/ChatTimelineEntries.kt similarity index 92% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/timeline/ChatTimelineEntries.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/timeline/ChatTimelineEntries.kt index 533e193633..557e94bccd 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/timeline/ChatTimelineEntries.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/timeline/ChatTimelineEntries.kt @@ -1,9 +1,9 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components.timeline +package com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.timeline import com.ai.assistance.operit.ui.common.markdown.lazy.LocalMarkdownCardStateStore -import com.ai.assistance.operit.ui.features.conversation.chat.components.part.tooltiming.rememberMessageToolExecutions +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering.tooltiming.rememberMessageToolExecutions import com.ai.assistance.operit.ui.common.markdown.messageSectionsForRendering -import com.ai.assistance.operit.ui.features.conversation.chat.components.part.tooltiming.LocalInsideToolGroup +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering.tooltiming.LocalInsideToolGroup import com.ai.assistance.operit.ui.common.markdown.lazy.MarkdownCardStateStore import com.ai.assistance.operit.ui.common.markdown.lazy.markdownNodeIdentityKeys import androidx.compose.animation.core.animateFloatAsState @@ -41,13 +41,13 @@ import com.ai.assistance.operit.ui.common.markdown.StreamMarkdownRendererState import com.ai.assistance.operit.ui.common.markdown.UnifiedMarkdownCanvas import com.ai.assistance.operit.ui.common.markdown.XmlContentRenderer import com.ai.assistance.operit.ui.common.markdown.lazy.MarkdownRenderFragment -import com.ai.assistance.operit.ui.features.conversation.chat.components.part.CanvasExpandableHeaderRow -import com.ai.assistance.operit.ui.features.conversation.chat.components.part.ThinkToolsRow -import com.ai.assistance.operit.ui.features.conversation.chat.components.part.ThinkToolsXmlNodeGrouper -import com.ai.assistance.operit.ui.features.conversation.chat.components.part.buildThinkToolsRows -import com.ai.assistance.operit.ui.features.conversation.chat.components.part.isVisibleChatMarkdownNode -import com.ai.assistance.operit.ui.features.conversation.chat.components.part.thinkToolsGroupTitle -import com.ai.assistance.operit.ui.features.conversation.chat.components.rememberRevisableTextStream +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering.CanvasExpandableHeaderRow +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering.ThinkToolsRow +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering.ThinkToolsXmlNodeGrouper +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering.buildThinkToolsRows +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering.isVisibleChatMarkdownNode +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering.thinkToolsGroupTitle +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.stream.rememberRevisableTextStream import com.ai.assistance.operit.util.markdown.MarkdownNodeStable import com.ai.assistance.operit.util.markdown.toCharStream import kotlinx.coroutines.flow.Flow diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/MessageTranslationDialog.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/translation/MessageTranslationDialog.kt similarity index 98% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/MessageTranslationDialog.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/translation/MessageTranslationDialog.kt index 382c67974c..d786a4e4c3 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/MessageTranslationDialog.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/translation/MessageTranslationDialog.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components +package com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.translation import com.ai.assistance.operit.ui.common.oktoast.OKToast @@ -50,7 +50,7 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.DialogProperties import com.ai.assistance.operit.R -import com.ai.assistance.operit.ui.features.conversation.chat.viewmodel.TranslationUiState +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.model.TranslationUiState import com.ai.assistance.operit.util.android.LocaleUtils private data class TranslationLanguage( diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/util/MessageImageGenerator.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/sharing/MessageImageGenerator.kt similarity index 98% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/util/MessageImageGenerator.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/sharing/MessageImageGenerator.kt index fc58412675..e219ea48f3 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/util/MessageImageGenerator.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/sharing/MessageImageGenerator.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.util +package com.ai.assistance.operit.ui.features.conversation.chat.modules.sharing import android.app.Activity import android.content.Context @@ -38,9 +38,9 @@ import coil.compose.LocalImageLoader import coil.request.CachePolicy import com.ai.assistance.operit.data.model.ChatMessage import com.ai.assistance.operit.data.preferences.ActivePromptManager -import com.ai.assistance.operit.ui.features.conversation.chat.components.ChatStyle -import com.ai.assistance.operit.ui.features.conversation.chat.components.style.bubble.BubbleStyleChatMessage -import com.ai.assistance.operit.ui.features.conversation.chat.components.style.cursor.CursorStyleChatMessage +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.model.ChatStyle +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.style.bubble.BubbleStyleChatMessage +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.style.cursor.CursorStyleChatMessage import com.ai.assistance.operit.ui.theme.AppBackgroundLayer import com.ai.assistance.operit.ui.theme.LocalThemePreferenceSnapshot diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/ShareImagePreviewDialog.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/sharing/ShareImagePreviewDialog.kt similarity index 99% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/ShareImagePreviewDialog.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/sharing/ShareImagePreviewDialog.kt index df29349f01..ff914c556c 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/ShareImagePreviewDialog.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/sharing/ShareImagePreviewDialog.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components +package com.ai.assistance.operit.ui.features.conversation.chat.modules.sharing import android.content.ContentValues import android.net.Uri diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/sidebar/ChatSidebarContent.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/sidebar/ChatSidebarContent.kt similarity index 97% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/sidebar/ChatSidebarContent.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/sidebar/ChatSidebarContent.kt index add7b45dc0..734ac18179 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/sidebar/ChatSidebarContent.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/sidebar/ChatSidebarContent.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.sidebar +package com.ai.assistance.operit.ui.features.conversation.chat.modules.sidebar import androidx.compose.foundation.Image import androidx.compose.foundation.clickable @@ -29,9 +29,9 @@ import com.ai.assistance.operit.R import com.ai.assistance.operit.data.model.ActivePrompt import com.ai.assistance.operit.data.preferences.UserPreferencesManager import com.ai.assistance.operit.ui.common.NavItem -import com.ai.assistance.operit.ui.features.conversation.chat.components.CharacterSelectorPanel -import com.ai.assistance.operit.ui.features.conversation.chat.components.CharacterSelectorTarget -import com.ai.assistance.operit.ui.features.conversation.chat.folders.FolderChatHistoryPanel +import com.ai.assistance.operit.ui.features.conversation.chat.modules.characters.CharacterSelectorPanel +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.model.CharacterSelectorTarget +import com.ai.assistance.operit.ui.features.conversation.chat.modules.history.folders.FolderChatHistoryPanel import com.ai.assistance.operit.ui.main.components.NavigationDrawerAppearance import com.ai.assistance.operit.ui.main.navigation.NavigationEntrySpec import com.ai.assistance.operit.ui.main.screens.GestureStateHolder diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/sidebar/ChatSidebarState.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/sidebar/ChatSidebarState.kt similarity index 97% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/sidebar/ChatSidebarState.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/sidebar/ChatSidebarState.kt index ed71087d15..f533c8e444 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/sidebar/ChatSidebarState.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/sidebar/ChatSidebarState.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.sidebar +package com.ai.assistance.operit.ui.features.conversation.chat.modules.sidebar import androidx.compose.runtime.* import androidx.compose.ui.platform.LocalContext @@ -10,7 +10,7 @@ import com.ai.assistance.operit.data.preferences.ActivePromptManager import com.ai.assistance.operit.data.preferences.CharacterCardManager import com.ai.assistance.operit.data.preferences.CharacterGroupCardManager import com.ai.assistance.operit.ui.common.rememberLocal -import com.ai.assistance.operit.ui.features.conversation.chat.viewmodel.ChatHistoryDisplayMode +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.model.ChatHistoryDisplayMode import com.ai.assistance.operit.ui.features.conversation.chat.viewmodel.ChatViewModel import kotlinx.coroutines.flow.flowOf diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/sidebar/MainChatControls.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/sidebar/MainChatControls.kt similarity index 95% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/sidebar/MainChatControls.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/sidebar/MainChatControls.kt index 6c599dae90..271e7f9f20 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/sidebar/MainChatControls.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/sidebar/MainChatControls.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.sidebar +package com.ai.assistance.operit.ui.features.conversation.chat.modules.sidebar import androidx.compose.foundation.background import com.ai.assistance.operit.ui.common.oktoast.OKToast @@ -23,8 +23,8 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import com.ai.assistance.operit.R -import com.ai.assistance.operit.ui.features.conversation.chat.components.useFloatingWindowLauncher -import com.ai.assistance.operit.ui.features.conversation.chat.workspace.WorkspaceHubPage +import com.ai.assistance.operit.ui.features.conversation.chat.screens.useFloatingWindowLauncher +import com.ai.assistance.operit.ui.features.conversation.workspace.hub.WorkspaceHubPage import com.ai.assistance.operit.ui.theme.getTextColorForBackground /** 主聊天页保留一行透明操作区,标题与入口共用菜单按钮的高度。 */ diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/sidebar/SidebarButtonSurface.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/sidebar/SidebarButtonSurface.kt similarity index 94% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/sidebar/SidebarButtonSurface.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/sidebar/SidebarButtonSurface.kt index 336e41dcdd..a04036162b 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/sidebar/SidebarButtonSurface.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/sidebar/SidebarButtonSurface.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.sidebar +package com.ai.assistance.operit.ui.features.conversation.chat.modules.sidebar import com.ai.assistance.operit.data.preferences.glass.GlassRegion import androidx.compose.foundation.BorderStroke diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/sidebar/SidebarPluginSection.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/sidebar/SidebarPluginSection.kt similarity index 98% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/sidebar/SidebarPluginSection.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/sidebar/SidebarPluginSection.kt index b50e2248ef..b5a27fe19e 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/sidebar/SidebarPluginSection.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/sidebar/SidebarPluginSection.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.sidebar +package com.ai.assistance.operit.ui.features.conversation.chat.modules.sidebar import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.clickable diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/context/ChatContextUsageDialog.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/usage/ChatContextUsageDialog.kt similarity index 99% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/context/ChatContextUsageDialog.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/usage/ChatContextUsageDialog.kt index a21203a853..1020cadeac 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/context/ChatContextUsageDialog.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/usage/ChatContextUsageDialog.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components.context +package com.ai.assistance.operit.ui.features.conversation.chat.modules.usage import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/context/ChatContextUsageEntry.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/usage/ChatContextUsageEntry.kt similarity index 98% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/context/ChatContextUsageEntry.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/usage/ChatContextUsageEntry.kt index 8cdf9ef663..87a3ec9255 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/context/ChatContextUsageEntry.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/usage/ChatContextUsageEntry.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components.context +package com.ai.assistance.operit.ui.features.conversation.chat.modules.usage import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/context/ContextUsageFormat.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/usage/ContextUsageFormat.kt similarity index 84% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/context/ContextUsageFormat.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/usage/ContextUsageFormat.kt index 049207b6db..441f943ce2 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/context/ContextUsageFormat.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/usage/ContextUsageFormat.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components.context +package com.ai.assistance.operit.ui.features.conversation.chat.modules.usage import java.text.NumberFormat import java.util.Locale diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/context/ContextWindowUsageContent.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/usage/ContextWindowUsageContent.kt similarity index 99% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/context/ContextWindowUsageContent.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/usage/ContextWindowUsageContent.kt index fdd7c690f4..7e3b380fff 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/context/ContextWindowUsageContent.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/usage/ContextWindowUsageContent.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components.context +package com.ai.assistance.operit.ui.features.conversation.chat.modules.usage import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/context/CumulativeUsageContent.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/usage/CumulativeUsageContent.kt similarity index 98% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/context/CumulativeUsageContent.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/usage/CumulativeUsageContent.kt index 169f41e7d5..d6c14f017a 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/context/CumulativeUsageContent.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/usage/CumulativeUsageContent.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components.context +package com.ai.assistance.operit.ui.features.conversation.chat.modules.usage import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/config/TokenInfoDialog.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/usage/TokenInfoDialog.kt similarity index 97% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/config/TokenInfoDialog.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/usage/TokenInfoDialog.kt index 37835c774d..af3d7ceefb 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/config/TokenInfoDialog.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/usage/TokenInfoDialog.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components.config +package com.ai.assistance.operit.ui.features.conversation.chat.modules.usage import androidx.compose.foundation.layout.* import androidx.compose.material3.* diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/voicemessages/ExpiredVoiceMessageTag.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/voice/ExpiredVoiceMessageTag.kt similarity index 94% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/voicemessages/ExpiredVoiceMessageTag.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/voice/ExpiredVoiceMessageTag.kt index 00f69369ae..d61623e8d8 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/voicemessages/ExpiredVoiceMessageTag.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/voice/ExpiredVoiceMessageTag.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.voicemessages +package com.ai.assistance.operit.ui.features.conversation.chat.modules.voice import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.padding diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/voicemessages/VoiceMessagePlayer.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/voice/VoiceMessagePlayer.kt similarity index 97% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/voicemessages/VoiceMessagePlayer.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/voice/VoiceMessagePlayer.kt index 7392b4462f..4b0f33651f 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/voicemessages/VoiceMessagePlayer.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/voice/VoiceMessagePlayer.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.voicemessages +package com.ai.assistance.operit.ui.features.conversation.chat.modules.voice import android.net.Uri import androidx.compose.animation.animateContentSize @@ -24,8 +24,8 @@ import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleEventObserver import androidx.lifecycle.compose.LocalLifecycleOwner import com.ai.assistance.operit.R -import com.ai.assistance.operit.ui.features.conversation.chat.attachments.MediaFileGuard -import com.ai.assistance.operit.ui.features.conversation.chat.attachments.rememberMediaFileMissing +import com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.MediaFileGuard +import com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.rememberMediaFileMissing import com.ai.assistance.operit.util.logging.AppLogger import com.google.android.exoplayer2.audio.AudioAttributes import com.google.android.exoplayer2.C diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/voicemessages/VoiceMessageSession.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/voice/VoiceMessageSession.kt similarity index 98% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/voicemessages/VoiceMessageSession.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/voice/VoiceMessageSession.kt index 6f11a7b40b..a6258107b6 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/voicemessages/VoiceMessageSession.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/voice/VoiceMessageSession.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.voicemessages +package com.ai.assistance.operit.ui.features.conversation.chat.modules.voice import android.content.Context import com.ai.assistance.operit.R diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/voicemessages/VoiceMessageSheet.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/voice/VoiceMessageSheet.kt similarity index 98% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/voicemessages/VoiceMessageSheet.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/voice/VoiceMessageSheet.kt index 36d811fb34..9889c19a0c 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/voicemessages/VoiceMessageSheet.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/voice/VoiceMessageSheet.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.voicemessages +package com.ai.assistance.operit.ui.features.conversation.chat.modules.voice import android.Manifest import android.content.pm.PackageManager diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/voicemessages/VoiceMessageSheetContent.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/voice/VoiceMessageSheetContent.kt similarity index 99% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/voicemessages/VoiceMessageSheetContent.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/voice/VoiceMessageSheetContent.kt index dbc0f4d722..9aa268bedc 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/voicemessages/VoiceMessageSheetContent.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/voice/VoiceMessageSheetContent.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.voicemessages +package com.ai.assistance.operit.ui.features.conversation.chat.modules.voice import androidx.compose.animation.core.RepeatMode import androidx.compose.animation.core.animateFloat diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/voicemessages/VoiceMessageXmlPlugin.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/voice/VoiceMessageXmlPlugin.kt similarity index 92% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/voicemessages/VoiceMessageXmlPlugin.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/voice/VoiceMessageXmlPlugin.kt index cf8f4db6e6..81971c345d 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/voicemessages/VoiceMessageXmlPlugin.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/voice/VoiceMessageXmlPlugin.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.voicemessages +package com.ai.assistance.operit.ui.features.conversation.chat.modules.voice import android.content.Context import androidx.compose.ui.graphics.Color diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/voicemessages/VoiceWaveform.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/voice/VoiceWaveform.kt similarity index 97% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/voicemessages/VoiceWaveform.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/voice/VoiceWaveform.kt index 4d98f703f1..6061d2570d 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/voicemessages/VoiceWaveform.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/voice/VoiceWaveform.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.voicemessages +package com.ai.assistance.operit.ui.features.conversation.chat.modules.voice import androidx.compose.animation.core.animateFloatAsState import androidx.compose.animation.core.tween diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/screens/AIChatScreen.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/screens/AIChatScreen.kt index 9401c1322f..56be31c71a 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/screens/AIChatScreen.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/screens/AIChatScreen.kt @@ -1,12 +1,12 @@ package com.ai.assistance.operit.ui.features.conversation.chat.screens -import com.ai.assistance.operit.ui.features.conversation.chat.voicemessages.VoiceMessageSheet +import com.ai.assistance.operit.ui.features.conversation.chat.modules.voice.VoiceMessageSheet import com.ai.assistance.operit.core.chat.voice.canStartVoiceMessage import com.ai.assistance.operit.ui.common.oktoast.OKToast import com.ai.assistance.operit.data.preferences.transparency.ThemeTransparencyPreferences -import com.ai.assistance.operit.ui.features.conversation.chat.components.animateScrollToEnd +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.list.animateScrollToEnd import android.content.ClipboardManager import android.os.Build import android.provider.Settings @@ -56,28 +56,27 @@ import com.ai.assistance.operit.data.preferences.DisplayPreferencesManager import com.ai.assistance.operit.data.preferences.UserPreferencesManager import com.ai.assistance.operit.data.preferences.WaifuPreferences import com.ai.assistance.operit.ui.components.ErrorDialog -import com.ai.assistance.operit.ui.features.conversation.chat.components.* -import com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.agent.AgentChatInputSection -import com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.classic.ClassicChatInputSection -import com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.common.ChatInputEvents -import com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.common.ChatInputHookContext -import com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.common.ChatInputHookRegistry -import com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.common.ChatInputSubmitActions -import com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.classic.ClassicChatSettingsBar -import com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.common.PendingQueueMessageItem -import com.ai.assistance.operit.ui.features.conversation.chat.components.style.bubble.BubbleImageStyleConfig -import com.ai.assistance.operit.ui.features.conversation.chat.components.AndroidExportDialog -import com.ai.assistance.operit.ui.features.conversation.chat.components.ExportCompleteDialog -import com.ai.assistance.operit.ui.features.conversation.chat.components.ExportPlatformDialog -import com.ai.assistance.operit.ui.features.conversation.chat.components.ExportProgressDialog -import com.ai.assistance.operit.ui.features.conversation.chat.components.WindowsExportDialog -import com.ai.assistance.operit.ui.features.conversation.chat.webview.MentionSuggestionPanelStyle -import com.ai.assistance.operit.ui.features.conversation.chat.workspace.WorkspaceHubScreen -import com.ai.assistance.operit.ui.features.conversation.chat.workspace.WorkspaceHubOverlay -import com.ai.assistance.operit.ui.features.conversation.chat.workspace.WorkspaceHubPage +import com.ai.assistance.operit.ui.features.conversation.chat.modules.input.agent.AgentChatInputSection +import com.ai.assistance.operit.ui.features.conversation.chat.modules.input.classic.ClassicChatInputSection +import com.ai.assistance.operit.ui.features.conversation.chat.modules.input.common.ChatInputEvents +import com.ai.assistance.operit.ui.features.conversation.chat.modules.input.common.ChatInputHookContext +import com.ai.assistance.operit.ui.features.conversation.chat.modules.input.common.ChatInputHookRegistry +import com.ai.assistance.operit.ui.features.conversation.chat.modules.input.common.ChatInputSubmitActions +import com.ai.assistance.operit.ui.features.conversation.chat.modules.input.classic.ClassicChatSettingsBar +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.model.PendingQueueMessageItem +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.style.bubble.BubbleImageStyleConfig +import com.ai.assistance.operit.ui.features.conversation.chat.modules.export.AndroidExportDialog +import com.ai.assistance.operit.ui.features.conversation.chat.modules.export.ExportCompleteDialog +import com.ai.assistance.operit.ui.features.conversation.chat.modules.export.ExportPlatformDialog +import com.ai.assistance.operit.ui.features.conversation.chat.modules.export.ExportProgressDialog +import com.ai.assistance.operit.ui.features.conversation.chat.modules.export.WindowsExportDialog +import com.ai.assistance.operit.ui.features.conversation.chat.modules.input.mentions.MentionSuggestionPanelStyle +import com.ai.assistance.operit.ui.features.conversation.workspace.hub.WorkspaceHubScreen +import com.ai.assistance.operit.ui.features.conversation.workspace.hub.WorkspaceHubOverlay +import com.ai.assistance.operit.ui.features.conversation.workspace.hub.WorkspaceHubPage import androidx.compose.ui.platform.LocalSoftwareKeyboardController -import com.ai.assistance.operit.ui.features.conversation.chat.webview.MentionSuggestionPanel -import com.ai.assistance.operit.ui.features.conversation.chat.sidebar.* +import com.ai.assistance.operit.ui.features.conversation.chat.modules.input.mentions.MentionSuggestionPanel +import com.ai.assistance.operit.ui.features.conversation.chat.modules.sidebar.* import com.ai.assistance.operit.ui.features.conversation.chat.viewmodel.ChatViewModel import com.ai.assistance.operit.ui.main.LocalTopBarActions import com.ai.assistance.operit.ui.main.PendingChatDraftHandler @@ -104,20 +103,18 @@ import com.ai.assistance.operit.plugins.chatview.ChatViewEvent import com.ai.assistance.operit.plugins.chatview.ChatViewHookParams import com.ai.assistance.operit.plugins.chatview.ChatViewHookPluginRegistry import java.util.UUID -import com.ai.assistance.operit.ui.features.conversation.chat.components.CharacterSelectorPanel -import com.ai.assistance.operit.ui.features.conversation.chat.components.CharacterSelectorTarget -import com.ai.assistance.operit.ui.features.conversation.chat.components.ChatHistorySelectorPanel -import com.ai.assistance.operit.ui.features.conversation.chat.components.ChatScreenContent -import com.ai.assistance.operit.ui.features.conversation.chat.components.ChatStyle -import com.ai.assistance.operit.ui.features.conversation.chat.components.MemoryFolderSelectionDialog -import com.ai.assistance.operit.ui.features.conversation.chat.components.SharedIncomingContentHandler -import com.ai.assistance.operit.ui.features.conversation.chat.components.exportAndroidApp -import com.ai.assistance.operit.ui.features.conversation.chat.components.exportWindowsApp -import com.ai.assistance.operit.ui.features.conversation.chat.components.extractClipboardPastedText -import com.ai.assistance.operit.ui.features.conversation.chat.components.extractInsertedText -import com.ai.assistance.operit.ui.features.conversation.chat.sidebar.LocalMainChatSidebarState -import com.ai.assistance.operit.ui.features.conversation.chat.sidebar.LocalOpenMainChatSidebar -import com.ai.assistance.operit.ui.features.conversation.chat.sidebar.rememberChatSidebarState +import com.ai.assistance.operit.ui.features.conversation.chat.modules.characters.CharacterSelectorPanel +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.model.CharacterSelectorTarget +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.model.ChatStyle +import com.ai.assistance.operit.ui.features.conversation.chat.modules.input.memory.MemoryFolderSelectionDialog +import com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.imports.SharedIncomingContentHandler +import com.ai.assistance.operit.ui.features.conversation.chat.modules.export.exportAndroidApp +import com.ai.assistance.operit.ui.features.conversation.chat.modules.export.exportWindowsApp +import com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.extractClipboardPastedText +import com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.extractInsertedText +import com.ai.assistance.operit.ui.features.conversation.chat.modules.sidebar.LocalMainChatSidebarState +import com.ai.assistance.operit.ui.features.conversation.chat.modules.sidebar.LocalOpenMainChatSidebar +import com.ai.assistance.operit.ui.features.conversation.chat.modules.sidebar.rememberChatSidebarState @RequiresApi(Build.VERSION_CODES.O) @@ -1229,7 +1226,7 @@ val actualViewModel: ChatViewModel = viewModel ?: viewModel { ChatViewModel(cont ) } - com.ai.assistance.operit.ui.features.conversation.chat.motion.NewChatIntro( + com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.motion.NewChatIntro( requestId = newChatIntroId, currentChatId = currentChatId, ready = loadedChatId == currentChatId && currentChatId != null && !isLoading && !isLoadingDisplayWindow && !showChatHistorySelector, empty = chatHistory.isEmpty(), hasDraft = introDraft.text.isNotEmpty(), onConsumed = actualViewModel.chatListMotion::consumeIntro, diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/ChatHeader.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/screens/ChatHeader.kt similarity index 99% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/ChatHeader.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/screens/ChatHeader.kt index d582b8fe43..44b201d6c1 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/ChatHeader.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/screens/ChatHeader.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components +package com.ai.assistance.operit.ui.features.conversation.chat.screens import androidx.compose.foundation.background import androidx.compose.foundation.clickable diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/ChatScreenContent.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/screens/ChatScreenContent.kt similarity index 96% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/ChatScreenContent.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/screens/ChatScreenContent.kt index cbad0bcdf6..c2a96d4b63 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/ChatScreenContent.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/screens/ChatScreenContent.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components +package com.ai.assistance.operit.ui.features.conversation.chat.screens import com.ai.assistance.operit.ui.common.oktoast.OKToast @@ -41,10 +41,10 @@ import com.ai.assistance.operit.data.model.ChatMessage import com.ai.assistance.operit.data.model.ActivePrompt import com.ai.assistance.operit.ui.features.conversation.chat.viewmodel.ChatViewModel -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.links.WorkspaceFileLinkHost -import com.ai.assistance.operit.ui.features.conversation.chat.viewmodel.ChatHistoryDisplayMode -import com.ai.assistance.operit.ui.features.conversation.chat.components.style.bubble.BubbleImageStyleConfig -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.WorkspaceBackupManager +import com.ai.assistance.operit.ui.features.conversation.workspace.links.WorkspaceFileLinkHost +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.model.ChatHistoryDisplayMode +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.style.bubble.BubbleImageStyleConfig +import com.ai.assistance.operit.ui.features.conversation.workspace.WorkspaceBackupManager import java.io.File import kotlinx.coroutines.CancellationException import kotlinx.coroutines.CoroutineScope @@ -67,10 +67,26 @@ import androidx.compose.ui.res.pluralStringResource import androidx.compose.ui.res.stringResource import com.ai.assistance.operit.R import com.ai.assistance.operit.ui.common.markdown.markdownToPlainTextForCopy -import com.ai.assistance.operit.ui.features.conversation.chat.components.MessageEditor -import com.ai.assistance.operit.ui.features.conversation.chat.components.MessageTranslationDialog +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.editor.MessageEditor +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.translation.MessageTranslationDialog import com.ai.assistance.operit.ui.main.screens.GestureStateHolder import com.ai.assistance.operit.util.markdown.LatexMathMlConverter +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.model.CharacterSelectorTarget +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.model.ChatStyle +import com.ai.assistance.operit.ui.features.conversation.chat.modules.export.AndroidExportDialog +import com.ai.assistance.operit.ui.features.conversation.chat.modules.export.ExportCompleteDialog +import com.ai.assistance.operit.ui.features.conversation.chat.modules.export.ExportPlatformDialog +import com.ai.assistance.operit.ui.features.conversation.chat.modules.export.ExportProgressDialog +import com.ai.assistance.operit.ui.features.conversation.chat.modules.export.WindowsExportDialog +import com.ai.assistance.operit.ui.features.conversation.chat.modules.export.exportAndroidApp +import com.ai.assistance.operit.ui.features.conversation.chat.modules.export.exportWindowsApp +import com.ai.assistance.operit.ui.features.conversation.chat.modules.history.ChatHistorySelector +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.ChatArea +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.actions.WorkspaceChangeConfirmDialog +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.actions.WorkspaceChangeConfirmMode +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.buildSelectedMessagesPlainText +import com.ai.assistance.operit.ui.features.conversation.chat.modules.sharing.ShareImagePreviewDialog +import com.ai.assistance.operit.ui.features.conversation.chat.modules.sharing.saveShareImageToGallery import kotlin.math.roundToInt import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/ChatScreenHeader.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/screens/ChatScreenHeader.kt similarity index 99% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/ChatScreenHeader.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/screens/ChatScreenHeader.kt index 40604f2f94..775d994274 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/ChatScreenHeader.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/screens/ChatScreenHeader.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components +package com.ai.assistance.operit.ui.features.conversation.chat.screens import com.ai.assistance.operit.ui.common.oktoast.OKToast diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/viewmodel/ChatViewModel.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/viewmodel/ChatViewModel.kt index 59dcc4a5f9..7d5fbee0c3 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/viewmodel/ChatViewModel.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/viewmodel/ChatViewModel.kt @@ -22,7 +22,7 @@ import androidx.compose.ui.text.TextRange import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.text.input.TextFieldValue.Companion import androidx.core.content.FileProvider -import com.ai.assistance.operit.ui.features.conversation.chat.components.ChatStyle +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.model.ChatStyle import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.ai.assistance.operit.core.chat.runtime.ChatRuntimeHolder @@ -45,7 +45,7 @@ import com.ai.assistance.operit.data.repository.MessageTranslationRepository import com.ai.assistance.operit.data.model.PromptFunctionType import com.ai.assistance.operit.data.model.ToolParameter import com.ai.assistance.operit.R -import com.ai.assistance.operit.ui.features.conversation.chat.webview.LocalWebServer +import com.ai.assistance.operit.ui.features.conversation.workspace.preview.LocalWebServer import com.ai.assistance.operit.ui.floating.FloatingMode import com.ai.assistance.operit.ui.permissions.PermissionLevel import com.ai.assistance.operit.ui.permissions.ToolPermissionSystem @@ -72,9 +72,9 @@ import kotlinx.coroutines.withTimeout import kotlinx.coroutines.TimeoutCancellationException import kotlinx.coroutines.flow.filterNotNull import com.ai.assistance.operit.ui.features.automation.terminal.EmbeddedTerminalPage -import com.ai.assistance.operit.ui.features.conversation.chat.workspace.WorkspaceHubPage -import com.ai.assistance.operit.ui.features.conversation.chat.workspace.WorkspaceEntryAction -import com.ai.assistance.operit.ui.features.conversation.chat.workspace.WorkspaceEntryRequest +import com.ai.assistance.operit.ui.features.conversation.workspace.hub.WorkspaceHubPage +import com.ai.assistance.operit.ui.features.conversation.workspace.hub.WorkspaceEntryAction +import com.ai.assistance.operit.ui.features.conversation.workspace.hub.WorkspaceEntryRequest import com.ai.assistance.operit.util.text.XmlTagCleaner import com.ai.assistance.operit.api.speech.tts.TtsService import com.ai.assistance.operit.api.speech.tts.prefetch.PrefetchingTtsService @@ -88,28 +88,28 @@ import com.ai.assistance.operit.data.preferences.ActivePromptManager import com.ai.assistance.operit.data.preferences.CharacterCardManager import com.ai.assistance.operit.data.model.ActivePrompt import com.ai.assistance.operit.util.WaifuMessageProcessor -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.WorkspaceBackupManager -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.CommandConfig -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.WorkspaceCommandExecutionState -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.WorkspaceConfigReader -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.WorkspacePreviewRefreshBus -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.WorkspacePreviewRefreshEvent -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.toWorkspaceCommandOutputEntries +import com.ai.assistance.operit.ui.features.conversation.workspace.WorkspaceBackupManager +import com.ai.assistance.operit.ui.features.conversation.workspace.CommandConfig +import com.ai.assistance.operit.ui.features.conversation.workspace.WorkspaceCommandExecutionState +import com.ai.assistance.operit.ui.features.conversation.workspace.WorkspaceConfigReader +import com.ai.assistance.operit.ui.features.conversation.workspace.preview.WorkspacePreviewRefreshBus +import com.ai.assistance.operit.ui.features.conversation.workspace.preview.WorkspacePreviewRefreshEvent +import com.ai.assistance.operit.ui.features.conversation.workspace.toWorkspaceCommandOutputEntries import com.ai.assistance.operit.core.tools.system.Terminal import com.ai.assistance.operit.core.speech.text.TtsCleaner import com.ai.assistance.operit.core.speech.text.TtsSegmenter -import com.ai.assistance.operit.ui.features.conversation.chat.util.findMentionTokens -import com.ai.assistance.operit.ui.features.conversation.chat.util.findMentionTokenEndingAtCursor -import com.ai.assistance.operit.ui.features.conversation.chat.util.isMentionContinuation +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.mentions.findMentionTokens +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.mentions.findMentionTokenEndingAtCursor +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.mentions.isMentionContinuation import android.net.Uri import android.os.Build import androidx.annotation.RequiresApi import java.io.File // 使用 services/core 的 Delegate 类 import com.ai.assistance.operit.services.core.MessageProcessingDelegate -import com.ai.assistance.operit.ui.features.conversation.chat.batch.ChatBatchAction -import com.ai.assistance.operit.ui.features.conversation.chat.batch.ChatBatchController -import com.ai.assistance.operit.ui.features.conversation.chat.batch.ChatBatchItemResult +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.model.ChatBatchAction +import com.ai.assistance.operit.ui.features.conversation.chat.viewmodel.history.ChatBatchController +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.model.ChatBatchItemResult import com.ai.assistance.operit.services.core.ChatHistoryDelegate import com.ai.assistance.operit.services.core.ApiConfigDelegate import com.ai.assistance.operit.services.core.TokenStatisticsDelegate @@ -120,22 +120,11 @@ import com.ai.assistance.operit.data.model.WorkspaceRenameResult import com.ai.assistance.operit.services.ChatServiceCore import com.ai.assistance.operit.services.ChatServiceUiBridge import com.ai.assistance.operit.services.EmptyChatServiceUiBridge -import com.ai.assistance.operit.ui.features.conversation.chat.util.MessageImageGenerator -import com.ai.assistance.operit.ui.features.conversation.chat.components.CharacterSelectorTarget -import com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.common.PendingQueueMessageItem -enum class ChatHistoryDisplayMode { - BY_CHARACTER_CARD, - BY_FOLDER, - CURRENT_CHARACTER_ONLY -} - -data class TranslationUiState( - val isLoading: Boolean = false, - val translatedText: String? = null, - val errorMessage: String? = null, - val isFromCache: Boolean = false, -) - +import com.ai.assistance.operit.ui.features.conversation.chat.modules.sharing.MessageImageGenerator +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.model.CharacterSelectorTarget +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.model.PendingQueueMessageItem +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.model.ChatHistoryDisplayMode +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.model.TranslationUiState class ChatViewModel(context: Context) : ViewModel() { private val context: Context = LocaleUtils.getLocalizedContext(context.applicationContext) @@ -791,7 +780,7 @@ class ChatViewModel(context: Context) : ViewModel() { } // 聊天历史相关方法 - val chatListMotion = com.ai.assistance.operit.ui.features.conversation.chat.motion.ChatListMotionState() + val chatListMotion = com.ai.assistance.operit.ui.features.conversation.chat.viewmodel.history.ChatListMotionState() fun createNewChat( characterCardName: String? = null, characterGroupId: String? = null, diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/viewmodel/PendingMessageQueueStore.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/viewmodel/PendingMessageQueueStore.kt index 17ee35f1d5..24cd4e6203 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/viewmodel/PendingMessageQueueStore.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/viewmodel/PendingMessageQueueStore.kt @@ -1,6 +1,6 @@ package com.ai.assistance.operit.ui.features.conversation.chat.viewmodel -import com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.common.PendingQueueMessageItem +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.model.PendingQueueMessageItem import java.util.concurrent.atomic.AtomicLong import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/batch/ChatBatchController.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/viewmodel/history/ChatBatchController.kt similarity index 81% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/batch/ChatBatchController.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/viewmodel/history/ChatBatchController.kt index 2ad381f7ee..e0348306fa 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/batch/ChatBatchController.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/viewmodel/history/ChatBatchController.kt @@ -1,16 +1,14 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.batch +package com.ai.assistance.operit.ui.features.conversation.chat.viewmodel.history import kotlinx.coroutines.CancellationException import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch - -enum class ChatBatchAction { SUMMARIZE_TITLES, ARCHIVE, UNARCHIVE, LOCK, UNLOCK, DELETE } -enum class ChatBatchItemResult { SUCCEEDED, SKIPPED, FAILED } - -data class ChatBatchProgress(val action: ChatBatchAction, val completed: Int, val total: Int) -data class ChatBatchSummary(val succeeded: Int, val skipped: Int, val failed: Int) +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.model.ChatBatchAction +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.model.ChatBatchItemResult +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.model.ChatBatchProgress +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.model.ChatBatchSummary /** 批量任务随聊天模型存活,逐条等待结果;收起面板不会重复执行或中断已确认的操作。 */ internal class ChatBatchController( diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/motion/ChatListMotionState.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/viewmodel/history/ChatListMotionState.kt similarity index 96% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/motion/ChatListMotionState.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/viewmodel/history/ChatListMotionState.kt index 58b5521534..4c273b1127 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/motion/ChatListMotionState.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/viewmodel/history/ChatListMotionState.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.motion +package com.ai.assistance.operit.ui.features.conversation.chat.viewmodel.history import androidx.compose.animation.core.LinearOutSlowInEasing import androidx.compose.animation.core.animate diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/browser/WorkspaceBrowserOperations.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/browser/WorkspaceBrowserOperations.kt deleted file mode 100644 index 40de9edb8d..0000000000 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/browser/WorkspaceBrowserOperations.kt +++ /dev/null @@ -1,113 +0,0 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.browser - -import android.content.Context -import android.content.Intent -import android.util.Base64 -import androidx.core.content.FileProvider -import com.ai.assistance.operit.R -import com.ai.assistance.operit.core.tools.AIToolHandler -import com.ai.assistance.operit.core.tools.BinaryFileContentData -import com.ai.assistance.operit.core.tools.FileExistsData -import com.ai.assistance.operit.data.model.AITool -import com.ai.assistance.operit.data.model.ToolParameter -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.workspaceMimeTypeForPath -import java.io.File -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.withContext - -/** 界面操作使用现有文件工具,保留每次工具调用的成功或失败结果。 */ -internal class FileBrowserOperations(context: Context) { - private val context = context.applicationContext - private val handler = AIToolHandler.getInstance(this.context) - - private fun parameters(environment: String?, vararg values: Pair) = buildList { - values.forEach { (name, value) -> add(ToolParameter(name, value)) } - environment?.let { add(ToolParameter("environment", it)) } - } - - private fun execute(name: String, parameters: List) = - handler.executeTool(AITool(name, parameters)).also { check(it.success) { it.error.orEmpty() } } - - private fun requireNewDestination(path: String, environment: String?) { - val result = execute("file_exists", parameters(environment, "path" to path)) - check(result.result is FileExistsData && !(result.result as FileExistsData).exists) { - context.getString(R.string.file_op_confirm_overwrite) - } - } - - suspend fun rename(source: String, destination: String, environment: String?) = withContext(Dispatchers.IO) { - if (source == destination) return@withContext - requireNewDestination(destination, environment) - execute("move_file", parameters(environment, "source" to source, "destination" to destination)) - Unit - } - - suspend fun delete(path: String, environment: String?, directory: Boolean) = withContext(Dispatchers.IO) { - execute("delete_file", parameters(environment, "path" to path, "recursive" to directory.toString())) - Unit - } - - suspend fun paste(directory: String, environment: String?) = withContext(Dispatchers.IO) { - val items = FileBrowserClipboard.content.value - if (items.isEmpty()) return@withContext - val destinationEnv = environment ?: "android" - val parent = execute("file_exists", parameters(environment, "path" to directory)).result - check(parent is FileExistsData && parent.exists && parent.isDirectory) { - context.getString(R.string.workspace_error_invalid_path, directory) - } - val targets = items.map { item -> - val sourceEnv = item.environment ?: "android" - val destination = directory.trimEnd('/') + "/" + item.path.substringAfterLast('/') - check(sourceEnv != destinationEnv || - (destination != item.path && !destination.startsWith(item.path.trimEnd('/') + "/"))) { - context.getString(R.string.workspace_invalid_paste) - } - item to destination - } - check(targets.map { it.second }.distinct().size == targets.size) { - context.getString(R.string.file_op_confirm_overwrite) - } - // 全批次先检查目标,避免遇到重名时已经移动了前面的文件。 - targets.forEach { (_, destination) -> requireNewDestination(destination, environment) } - for ((item, destination) in targets) { - val sourceEnv = item.environment ?: "android" - requireNewDestination(destination, environment) - if (item.cut && sourceEnv == destinationEnv) { - execute("move_file", parameters(environment, "source" to item.path, "destination" to destination)) - } else { - execute("copy_file", listOf(ToolParameter("source", item.path), ToolParameter("destination", destination), - ToolParameter("source_environment", sourceEnv), ToolParameter("dest_environment", destinationEnv), - ToolParameter("recursive", item.isDirectory.toString()))) - // 每项复制成功才删除其来源,失败后剩余剪切项仍可继续粘贴。 - if (item.cut) delete(item.path, item.environment, item.isDirectory) - } - if (item.cut) FileBrowserClipboard.clear(item) - } - } - - suspend fun externalOpen(path: String, environment: String?, share: Boolean) { - val file = withContext(Dispatchers.IO) { - pruneWorkspaceShareCache(File(context.cacheDir, "workspace_shared_files")) - if (environment.isNullOrBlank() || environment == "android") File(path) - else { - val result = execute("read_file_binary", parameters(environment, "path" to path)) - check(result.result is BinaryFileContentData) { context.getString(R.string.file_error_share_failed) } - val directory = File(context.cacheDir, "workspace_shared_files/${("$environment:$path").hashCode()}") - check(directory.isDirectory || directory.mkdirs()) { context.getString(R.string.file_error_share_failed) } - File(directory, path.substringAfterLast('/')).apply { - writeBytes(Base64.decode((result.result as BinaryFileContentData).contentBase64, Base64.DEFAULT)) - } - } - } - val uri = FileProvider.getUriForFile(context, "${context.packageName}.fileprovider", file) - val intent = if (share) Intent(Intent.ACTION_SEND).apply { - type = workspaceMimeTypeForPath(path) - putExtra(Intent.EXTRA_STREAM, uri) - } else Intent(Intent.ACTION_VIEW).apply { setDataAndType(uri, workspaceMimeTypeForPath(path)) } - intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) - intent.clipData = android.content.ClipData.newRawUri(file.name, uri) - withContext(Dispatchers.Main) { - context.startActivity(Intent.createChooser(intent, null).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)) - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/FileManager.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/FileManager.kt similarity index 94% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/FileManager.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/FileManager.kt index 3181112a10..ad59fd32fe 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/FileManager.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/FileManager.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace +package com.ai.assistance.operit.ui.features.conversation.workspace import android.content.Intent import android.net.Uri @@ -61,23 +61,24 @@ import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.foundation.lazy.rememberLazyListState import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.OpenFileInfo -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.workspaceMimeTypeForPath -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.workspaceShouldOpenAsDirectPreview -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.text.WORKSPACE_TEXT_PREVIEW_LIMIT_BYTES -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.text.readWorkspaceTextWithinLimit +import com.ai.assistance.operit.ui.features.conversation.workspace.preview.workspaceMimeTypeForPath +import com.ai.assistance.operit.ui.features.conversation.workspace.preview.workspaceShouldOpenAsDirectPreview +import com.ai.assistance.operit.ui.features.conversation.workspace.text.WORKSPACE_TEXT_PREVIEW_LIMIT_BYTES +import com.ai.assistance.operit.ui.features.conversation.workspace.text.readWorkspaceTextWithinLimit import com.ai.assistance.operit.util.files.FileUtils -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.browser.* -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.browser.FileBrowserClipboard -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.browser.FileBrowserClipboardItem -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.browser.FileBrowserContextMenu -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.browser.FileBrowserOperations -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.browser.properties.WorkspacePropertiesTarget -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.browser.properties.WorkspacePropertiesDialog -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.browser.FileBrowserSelectionBar -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.browser.FileBrowserSortDialog -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.browser.isValidWorkspaceEntryName -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.browser.sortDirectoryEntries +import com.ai.assistance.operit.ui.features.conversation.workspace.browser.* +import com.ai.assistance.operit.ui.features.conversation.workspace.browser.transfer.WorkspaceCopyProgressDialog +import com.ai.assistance.operit.ui.features.conversation.workspace.browser.transfer.WorkspaceDeleteProgressDialog +import com.ai.assistance.operit.ui.features.conversation.workspace.browser.FileBrowserClipboard +import com.ai.assistance.operit.ui.features.conversation.workspace.browser.FileBrowserClipboardItem +import com.ai.assistance.operit.ui.features.conversation.workspace.browser.FileBrowserContextMenu +import com.ai.assistance.operit.ui.features.conversation.workspace.browser.FileBrowserOperations +import com.ai.assistance.operit.ui.features.conversation.workspace.browser.properties.WorkspacePropertiesTarget +import com.ai.assistance.operit.ui.features.conversation.workspace.browser.properties.WorkspacePropertiesDialog +import com.ai.assistance.operit.ui.features.conversation.workspace.browser.FileBrowserSelectionBar +import com.ai.assistance.operit.ui.features.conversation.workspace.browser.FileBrowserSortDialog +import com.ai.assistance.operit.ui.features.conversation.workspace.browser.isValidWorkspaceEntryName +import com.ai.assistance.operit.ui.features.conversation.workspace.browser.sortDirectoryEntries // 目录条目数据类 data class DirectoryEntry( @@ -114,6 +115,8 @@ fun FileBrowser( var currentEnvironment by rememberSaveable(initialPath, environment) { mutableStateOf(environment) } var fileList by remember { mutableStateOf>(emptyList()) } var isOperationLoading by remember { mutableStateOf(false) } + var fileOperationJob by remember { mutableStateOf(null) } + var cancellingFileOperation by remember { mutableStateOf(false) } var isDirectoryLoading by remember { mutableStateOf(false) } var directoryLoadJob by remember { mutableStateOf(null) } var directoryLoadVersion by remember { mutableIntStateOf(0) } @@ -143,6 +146,8 @@ fun FileBrowser( val listState = rememberLazyListState() val operations = remember(context) { FileBrowserOperations(context) } val clipboard by FileBrowserClipboard.content.collectAsState() + val copyProgress by operations.copyProgress.collectAsState() + val deleteProgress by operations.deleteProgress.collectAsState() var showSortMenu by remember { mutableStateOf(false) } var selectionMode by rememberSaveable(currentPath, currentEnvironment) { mutableStateOf(false) } var selectedNames by rememberSaveable(currentPath, currentEnvironment) { mutableStateOf(emptySet()) } @@ -450,7 +455,8 @@ fun FileBrowser( fun runOperation(block: suspend () -> Unit) { if (isLoading) return isOperationLoading = true - coroutineScope.launch { + cancellingFileOperation = false + fileOperationJob = coroutineScope.launch { try { block() errorMessage = null @@ -461,8 +467,9 @@ fun FileBrowser( errorMessage = e.message } finally { isOperationLoading = false + fileOperationJob = null + loadDirectory(currentPath) } - loadDirectory(currentPath) } } @@ -475,11 +482,12 @@ fun FileBrowser( TextButton(onClick = { pendingBatchDelete = null runOperation { - for (target in targets) { - operations.delete(target.path, target.environment, target.isDirectory) - selectedNames = selectedNames - target.path.substringAfterLast('/') + operations.delete(targets) { target -> + withContext(Dispatchers.Main) { + selectedNames = selectedNames - target.path.substringAfterLast('/') + if (selectedNames.isEmpty()) selectionMode = false + } } - if (selectedNames.isEmpty()) selectionMode = false } }, enabled = !isLoading) { Text(stringResource(R.string.file_manager_delete), color = MaterialTheme.colorScheme.error) } }, @@ -658,6 +666,20 @@ fun FileBrowser( }) { Text(stringResource(R.string.workspace_open_external)) } } }, confirmButton = {}) } + copyProgress?.let { progress -> + key(progress.sourceEnvironment, progress.source, progress.destinationEnvironment, progress.destination) { + WorkspaceCopyProgressDialog(progress, cancelling = cancellingFileOperation, onCancel = { + cancellingFileOperation = true + fileOperationJob?.cancel() + }) + } + } + deleteProgress?.let { progress -> + WorkspaceDeleteProgressDialog(progress, cancelling = cancellingFileOperation, onCancel = { + cancellingFileOperation = true + fileOperationJob?.cancel() + }) + } propertiesTarget?.let { target -> WorkspacePropertiesDialog(target, onDismiss = { propertiesTarget = null }, @@ -891,7 +913,7 @@ fun FileBrowser( } // 文件列表 - if (isLoading) { + if (isLoading && copyProgress == null && deleteProgress == null) { Box( modifier = Modifier.fillMaxSize().weight(1f), contentAlignment = Alignment.Center diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/WorkspaceBackupManager.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/WorkspaceBackupManager.kt similarity index 98% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/WorkspaceBackupManager.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/WorkspaceBackupManager.kt index 572512822d..63a6909c8e 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/WorkspaceBackupManager.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/WorkspaceBackupManager.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace +package com.ai.assistance.operit.ui.features.conversation.workspace import android.content.Context import android.util.Base64 @@ -17,7 +17,7 @@ import kotlinx.serialization.decodeFromString import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json import java.security.MessageDigest -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.process.GitIgnoreFilter +import com.ai.assistance.operit.ui.features.conversation.workspace.process.GitIgnoreFilter import com.ai.assistance.operit.util.files.FileUtils import com.ai.assistance.operit.data.model.AITool import com.ai.assistance.operit.data.model.ToolParameter @@ -28,7 +28,9 @@ import kotlinx.coroutines.withContext import java.text.SimpleDateFormat import java.util.Locale import java.util.concurrent.atomic.AtomicBoolean -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.process.WorkspaceChangeTracker +import com.ai.assistance.operit.ui.features.conversation.workspace.process.WorkspaceChangeTracker +import com.ai.assistance.operit.ui.features.conversation.workspace.preview.WorkspacePreviewRefreshBus +import com.ai.assistance.operit.ui.features.conversation.workspace.preview.WorkspacePreviewRefreshEvent @Serializable data class FileStat( diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/WorkspaceCommandExecutionState.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/WorkspaceCommandExecutionState.kt similarity index 87% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/WorkspaceCommandExecutionState.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/WorkspaceCommandExecutionState.kt index d7a3adb281..de21f00628 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/WorkspaceCommandExecutionState.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/WorkspaceCommandExecutionState.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace +package com.ai.assistance.operit.ui.features.conversation.workspace data class WorkspaceCommandExecutionState( val workspacePath: String, diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/WorkspaceConfig.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/WorkspaceConfig.kt similarity index 98% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/WorkspaceConfig.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/WorkspaceConfig.kt index 48ba4c6b37..30feb45ea4 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/WorkspaceConfig.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/WorkspaceConfig.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace +package com.ai.assistance.operit.ui.features.conversation.workspace import android.content.Context import com.ai.assistance.operit.R diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/WorkspaceFileModels.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/WorkspaceFileModels.kt similarity index 85% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/WorkspaceFileModels.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/WorkspaceFileModels.kt index c845e23d1e..45f0641530 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/WorkspaceFileModels.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/WorkspaceFileModels.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace +package com.ai.assistance.operit.ui.features.conversation.workspace import java.io.File import kotlinx.serialization.Serializable diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/WorkspaceManager.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/WorkspaceManager.kt similarity index 96% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/WorkspaceManager.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/WorkspaceManager.kt index 8b062c89eb..8f7c4bc710 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/WorkspaceManager.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/WorkspaceManager.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace +package com.ai.assistance.operit.ui.features.conversation.workspace import com.ai.assistance.operit.ui.common.oktoast.OKToast @@ -49,24 +49,24 @@ import androidx.compose.ui.window.DialogProperties import kotlin.math.roundToInt import androidx.compose.ui.zIndex import com.ai.assistance.operit.R -import com.ai.assistance.operit.ui.features.conversation.chat.workspace.WorkspaceEntryAction -import com.ai.assistance.operit.ui.features.conversation.chat.workspace.WorkspaceEntryRequest +import com.ai.assistance.operit.ui.features.conversation.workspace.hub.WorkspaceEntryAction +import com.ai.assistance.operit.ui.features.conversation.workspace.hub.WorkspaceEntryRequest import com.ai.assistance.operit.core.tools.AIToolHandler import com.ai.assistance.operit.core.tools.FileContentData import com.ai.assistance.operit.data.model.AITool import com.ai.assistance.operit.data.model.ChatHistory import com.ai.assistance.operit.data.model.ToolParameter import com.ai.assistance.operit.ui.common.rememberLocal -import com.ai.assistance.operit.ui.features.conversation.chat.components.rememberCompactDialogMetrics -import com.ai.assistance.operit.ui.features.conversation.chat.components.attachments.AudioAttachmentPlayer -import com.ai.assistance.operit.ui.features.conversation.chat.components.attachments.VideoAttachmentPlayer -import com.ai.assistance.operit.ui.features.conversation.chat.webview.LocalWebServer +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.layout.rememberCompactDialogMetrics +import com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.preview.AudioAttachmentPlayer +import com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.preview.VideoAttachmentPlayer +import com.ai.assistance.operit.ui.features.conversation.workspace.preview.LocalWebServer import com.ai.assistance.operit.ui.features.conversation.chat.viewmodel.ChatViewModel -import com.ai.assistance.operit.ui.features.conversation.chat.webview.WebViewHandler -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor.CodeEditor -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor.CodeFormatter -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor.EditorKeyCommand -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor.LanguageDetector +import com.ai.assistance.operit.ui.features.conversation.workspace.preview.WebViewHandler +import com.ai.assistance.operit.ui.features.conversation.workspace.editor.CodeEditor +import com.ai.assistance.operit.ui.features.conversation.workspace.editor.CodeFormatter +import com.ai.assistance.operit.ui.features.conversation.workspace.editor.EditorKeyCommand +import com.ai.assistance.operit.ui.features.conversation.workspace.editor.LanguageDetector import kotlinx.coroutines.CancellationException import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job @@ -74,14 +74,26 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import java.io.File import androidx.compose.runtime.saveable.rememberSaveableStateHolder -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.search.* -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.links.WorkspaceFileLink -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.links.WorkspaceFileLinkDialog -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.links.findWorkspaceMarkdownAnchorLine -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.markdown.WorkspaceMarkdownPreview -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.search.FileSearchBar -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.search.activeSearchMatchAfterUpdate -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.search.findTextMatches +import com.ai.assistance.operit.ui.features.conversation.workspace.search.* +import com.ai.assistance.operit.ui.features.conversation.workspace.links.WorkspaceFileLink +import com.ai.assistance.operit.ui.features.conversation.workspace.links.WorkspaceFileLinkDialog +import com.ai.assistance.operit.ui.features.conversation.workspace.links.findWorkspaceMarkdownAnchorLine +import com.ai.assistance.operit.ui.features.conversation.workspace.markdown.WorkspaceMarkdownPreview +import com.ai.assistance.operit.ui.features.conversation.workspace.search.FileSearchBar +import com.ai.assistance.operit.ui.features.conversation.workspace.search.activeSearchMatchAfterUpdate +import com.ai.assistance.operit.ui.features.conversation.workspace.search.findTextMatches +import com.ai.assistance.operit.ui.features.conversation.workspace.preview.WorkspaceImagePreview +import com.ai.assistance.operit.ui.features.conversation.workspace.preview.WorkspacePreviewRefreshBus +import com.ai.assistance.operit.ui.features.conversation.workspace.preview.WorkspaceReadOnlyDocumentPreview +import com.ai.assistance.operit.ui.features.conversation.workspace.preview.isAudio +import com.ai.assistance.operit.ui.features.conversation.workspace.preview.isHtml +import com.ai.assistance.operit.ui.features.conversation.workspace.preview.isImage +import com.ai.assistance.operit.ui.features.conversation.workspace.preview.isMarkdown +import com.ai.assistance.operit.ui.features.conversation.workspace.preview.isReadOnlyDocumentPreviewable +import com.ai.assistance.operit.ui.features.conversation.workspace.preview.isReadOnlyPreview +import com.ai.assistance.operit.ui.features.conversation.workspace.preview.isVideo +import com.ai.assistance.operit.ui.features.conversation.workspace.preview.rememberWorkspacePreviewFileState +import com.ai.assistance.operit.ui.features.conversation.workspace.preview.workspacePreviewUriFromFile private fun WebView.installWorkspaceTouchInterceptor() { setOnTouchListener { view, event -> @@ -329,7 +341,7 @@ fun WorkspaceManager( var fileToCloseIndex by remember { mutableStateOf(-1) } // 当前活动的编辑器引用 - var activeEditor by remember { mutableStateOf(null) } + var activeEditor by remember { mutableStateOf(null) } val searchableFile = openFiles.getOrNull(currentFileIndex)?.takeUnless { it.isReadOnlyPreview } LaunchedEffect(searchableFile?.key, searchableFile?.content, searchQuery, searchVisible) { val nextContext = searchableFile?.key to searchQuery diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/WorkspaceScreen.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/WorkspaceScreen.kt similarity index 95% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/WorkspaceScreen.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/WorkspaceScreen.kt index bc38ccf645..5c88577ce0 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/WorkspaceScreen.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/WorkspaceScreen.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace +package com.ai.assistance.operit.ui.features.conversation.workspace import androidx.compose.foundation.background import androidx.compose.foundation.layout.* @@ -15,7 +15,7 @@ import com.ai.assistance.operit.R import com.ai.assistance.operit.data.model.ChatHistory import com.ai.assistance.operit.ui.features.conversation.chat.viewmodel.ChatViewModel import java.io.File -import com.ai.assistance.operit.ui.features.conversation.chat.workspace.WorkspaceEntryRequest +import com.ai.assistance.operit.ui.features.conversation.workspace.hub.WorkspaceEntryRequest import androidx.compose.runtime.saveable.rememberSaveableStateHolder /** diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/WorkspaceSetup.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/WorkspaceSetup.kt similarity index 97% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/WorkspaceSetup.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/WorkspaceSetup.kt index cff79dd443..55af784d62 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/WorkspaceSetup.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/WorkspaceSetup.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace +package com.ai.assistance.operit.ui.features.conversation.workspace import androidx.compose.foundation.background import androidx.compose.foundation.clickable @@ -13,14 +13,12 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp import com.ai.assistance.operit.R -import com.ai.assistance.operit.ui.features.conversation.chat.workspace.WorkspaceEntryAction -import com.ai.assistance.operit.ui.features.conversation.chat.webview.createAndGetDefaultWorkspace +import com.ai.assistance.operit.ui.features.conversation.workspace.hub.WorkspaceEntryAction import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import com.ai.assistance.operit.core.tools.AIToolHandler import com.ai.assistance.operit.core.tools.packTool.PackageManager -import com.ai.assistance.operit.ui.features.conversation.chat.webview.createAndResetWorkspaceDirectory import kotlinx.coroutines.* /** diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/WorkspaceUtils.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/WorkspaceUtils.kt similarity index 99% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/WorkspaceUtils.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/WorkspaceUtils.kt index b90b98b9ed..bf2b56d240 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/WorkspaceUtils.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/WorkspaceUtils.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview +package com.ai.assistance.operit.ui.features.conversation.workspace import android.content.Context import com.ai.assistance.operit.R diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/browser/FileBrowserClipboard.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/FileBrowserClipboard.kt similarity index 90% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/browser/FileBrowserClipboard.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/FileBrowserClipboard.kt index f858288316..e5cae29f25 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/browser/FileBrowserClipboard.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/FileBrowserClipboard.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.browser +package com.ai.assistance.operit.ui.features.conversation.workspace.browser import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/browser/FileBrowserSelectionBar.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/FileBrowserSelectionBar.kt similarity index 96% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/browser/FileBrowserSelectionBar.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/FileBrowserSelectionBar.kt index 2fc8860ddd..61500b44ce 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/browser/FileBrowserSelectionBar.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/FileBrowserSelectionBar.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.browser +package com.ai.assistance.operit.ui.features.conversation.workspace.browser import androidx.compose.foundation.layout.* import androidx.compose.material.icons.Icons diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/browser/WorkspaceBrowserDialogs.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/WorkspaceBrowserDialogs.kt similarity index 97% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/browser/WorkspaceBrowserDialogs.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/WorkspaceBrowserDialogs.kt index 171fa00944..0b5a3affeb 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/browser/WorkspaceBrowserDialogs.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/WorkspaceBrowserDialogs.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.browser +package com.ai.assistance.operit.ui.features.conversation.workspace.browser import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* @@ -13,7 +13,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Dialog import com.ai.assistance.operit.R -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.DirectoryEntry +import com.ai.assistance.operit.ui.features.conversation.workspace.DirectoryEntry internal fun sortDirectoryEntries(entries: List, mode: Int, descending: Boolean, ignoreCase: Boolean, foldersFirst: Boolean): List { diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/WorkspaceBrowserOperations.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/WorkspaceBrowserOperations.kt new file mode 100644 index 0000000000..0aaba4b079 --- /dev/null +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/WorkspaceBrowserOperations.kt @@ -0,0 +1,168 @@ +package com.ai.assistance.operit.ui.features.conversation.workspace.browser + +import android.content.Context +import android.content.Intent +import android.util.Base64 +import androidx.core.content.FileProvider +import com.ai.assistance.operit.R +import com.ai.assistance.operit.core.files.transfer.FileCopyObserver +import com.ai.assistance.operit.core.files.transfer.FileCopyObservers +import com.ai.assistance.operit.ui.features.conversation.workspace.browser.transfer.WorkspaceCopyProgress +import com.ai.assistance.operit.ui.features.conversation.workspace.browser.transfer.WorkspaceDeleteOperation +import kotlinx.coroutines.currentCoroutineContext +import kotlinx.coroutines.ensureActive +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import com.ai.assistance.operit.core.tools.AIToolHandler +import com.ai.assistance.operit.core.tools.BinaryFileContentData +import com.ai.assistance.operit.core.tools.FileExistsData +import com.ai.assistance.operit.data.model.AITool +import com.ai.assistance.operit.data.model.ToolParameter +import com.ai.assistance.operit.ui.features.conversation.workspace.preview.workspaceMimeTypeForPath +import java.io.File +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext + +/** 界面操作使用现有文件工具,保留每次工具调用的成功或失败结果。 */ +internal class FileBrowserOperations(context: Context) { + private val context = context.applicationContext + private val handler = AIToolHandler.getInstance(this.context) + private val copyState = MutableStateFlow(null) + val copyProgress = copyState.asStateFlow() + private val deletion = WorkspaceDeleteOperation { target -> + deleteEntry(target.path, target.environment, target.isDirectory) + } + val deleteProgress = deletion.progress + + private fun parameters(environment: String?, vararg values: Pair) = buildList { + values.forEach { (name, value) -> add(ToolParameter(name, value)) } + environment?.let { add(ToolParameter("environment", it)) } + } + + private fun execute(name: String, parameters: List) = + handler.executeTool(AITool(name, parameters)).also { check(it.success) { it.error.orEmpty() } } + + private fun requireNewDestination(path: String, environment: String?) { + val result = execute("file_exists", parameters(environment, "path" to path)) + check(result.result is FileExistsData && !(result.result as FileExistsData).exists) { + context.getString(R.string.file_op_confirm_overwrite) + } + } + + suspend fun rename(source: String, destination: String, environment: String?) = withContext(Dispatchers.IO) { + if (source == destination) return@withContext + requireNewDestination(destination, environment) + execute("move_file", parameters(environment, "source" to source, "destination" to destination)) + Unit + } + + private fun deleteEntry(path: String, environment: String?, directory: Boolean) { + execute("delete_file", parameters(environment, "path" to path, "recursive" to directory.toString())) + } + + suspend fun delete(path: String, environment: String?, directory: Boolean): Unit = + delete(listOf(FileBrowserClipboardItem(path, environment, cut = false, isDirectory = directory))) + + suspend fun delete( + targets: List, + onDeleted: suspend (FileBrowserClipboardItem) -> Unit = {}, + ): Unit = withContext(Dispatchers.IO) { + deletion.run(targets, onDeleted) + } + + suspend fun paste(directory: String, environment: String?) = withContext(Dispatchers.IO) { + val items = FileBrowserClipboard.content.value + if (items.isEmpty()) return@withContext + val destinationEnv = environment ?: "android" + val executionContext = currentCoroutineContext() + fun progress(item: FileBrowserClipboardItem, index: Int) = WorkspaceCopyProgress( + source = item.path, + destination = directory.trimEnd('/') + "/" + item.path.trimEnd('/').substringAfterLast('/'), + sourceEnvironment = item.environment ?: "android", + destinationEnvironment = destinationEnv, + itemIndex = index + 1, + itemCount = items.size, + moving = item.cut, + ) + copyState.value = progress(items.first(), 0) + try { + val parent = execute("file_exists", parameters(environment, "path" to directory)).result + check(parent is FileExistsData && parent.exists && parent.isDirectory) { + context.getString(R.string.workspace_error_invalid_path, directory) + } + val targets = items.map { item -> + val sourceEnv = item.environment ?: "android" + val destination = directory.trimEnd('/') + "/" + item.path.trimEnd('/').substringAfterLast('/') + check(sourceEnv != destinationEnv || + (destination != item.path && !destination.startsWith(item.path.trimEnd('/') + "/"))) { + context.getString(R.string.workspace_invalid_paste) + } + item to destination + } + check(targets.map { it.second }.distinct().size == targets.size) { + context.getString(R.string.file_op_confirm_overwrite) + } + // 全批次先检查目标,避免遇到重名时已经移动了前面的文件。 + targets.forEach { (_, destination) -> requireNewDestination(destination, environment) } + for ((index, target) in targets.withIndex()) { + executionContext.ensureActive() + val (item, destination) = target + val sourceEnv = item.environment ?: "android" + val itemProgress = progress(item, index) + copyState.value = itemProgress + requireNewDestination(destination, environment) + if (item.cut && sourceEnv == destinationEnv) { + execute("move_file", parameters(environment, "source" to item.path, "destination" to destination)) + } else { + val token = FileCopyObservers.register(FileCopyObserver( + onProgress = { copyState.value = itemProgress.copy(detail = it) }, + checkCancelled = { executionContext.ensureActive() }, + )) + try { + execute("copy_file", listOf(ToolParameter("source", item.path), ToolParameter("destination", destination), + ToolParameter("source_environment", sourceEnv), ToolParameter("dest_environment", destinationEnv), + ToolParameter("recursive", item.isDirectory.toString()), ToolParameter(FileCopyObservers.PARAMETER, token))) + } finally { + FileCopyObservers.remove(token) + } + // 取消或复制失败时不删除来源;整项成功后才允许完成跨环境剪切。 + executionContext.ensureActive() + if (item.cut) { + copyState.value = checkNotNull(copyState.value).copy(finishing = true) + // 剪切收尾仍属于移动任务,不弹出第二个删除进度窗口。 + deleteEntry(item.path, item.environment, item.isDirectory) + } + } + if (item.cut) FileBrowserClipboard.clear(item) + } + } finally { + copyState.value = null + } + } + + suspend fun externalOpen(path: String, environment: String?, share: Boolean) { + val file = withContext(Dispatchers.IO) { + pruneWorkspaceShareCache(File(context.cacheDir, "workspace_shared_files")) + if (environment.isNullOrBlank() || environment == "android") File(path) + else { + val result = execute("read_file_binary", parameters(environment, "path" to path)) + check(result.result is BinaryFileContentData) { context.getString(R.string.file_error_share_failed) } + val directory = File(context.cacheDir, "workspace_shared_files/${("$environment:$path").hashCode()}") + check(directory.isDirectory || directory.mkdirs()) { context.getString(R.string.file_error_share_failed) } + File(directory, path.substringAfterLast('/')).apply { + writeBytes(Base64.decode((result.result as BinaryFileContentData).contentBase64, Base64.DEFAULT)) + } + } + } + val uri = FileProvider.getUriForFile(context, "${context.packageName}.fileprovider", file) + val intent = if (share) Intent(Intent.ACTION_SEND).apply { + type = workspaceMimeTypeForPath(path) + putExtra(Intent.EXTRA_STREAM, uri) + } else Intent(Intent.ACTION_VIEW).apply { setDataAndType(uri, workspaceMimeTypeForPath(path)) } + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) + intent.clipData = android.content.ClipData.newRawUri(file.name, uri) + withContext(Dispatchers.Main) { + context.startActivity(Intent.createChooser(intent, null).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)) + } + } +} diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/browser/WorkspaceBrowserSupport.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/WorkspaceBrowserSupport.kt similarity index 96% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/browser/WorkspaceBrowserSupport.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/WorkspaceBrowserSupport.kt index 2ad5711010..221a672d0b 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/browser/WorkspaceBrowserSupport.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/WorkspaceBrowserSupport.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.browser +package com.ai.assistance.operit.ui.features.conversation.workspace.browser import java.io.File import java.time.LocalDateTime diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/browser/properties/WorkspacePropertiesDialog.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/properties/WorkspacePropertiesDialog.kt similarity index 99% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/browser/properties/WorkspacePropertiesDialog.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/properties/WorkspacePropertiesDialog.kt index 75e4508f3e..22e548b0b4 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/browser/properties/WorkspacePropertiesDialog.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/properties/WorkspacePropertiesDialog.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.browser.properties +package com.ai.assistance.operit.ui.features.conversation.workspace.browser.properties import android.content.ClipData import android.content.ClipboardManager diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/browser/properties/WorkspacePropertiesRepository.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/properties/WorkspacePropertiesRepository.kt similarity index 98% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/browser/properties/WorkspacePropertiesRepository.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/properties/WorkspacePropertiesRepository.kt index 955a213370..a184874e48 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/browser/properties/WorkspacePropertiesRepository.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/properties/WorkspacePropertiesRepository.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.browser.properties +package com.ai.assistance.operit.ui.features.conversation.workspace.browser.properties import android.content.Context import com.ai.assistance.operit.R diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/browser/properties/WorkspacePropertyAccess.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/properties/WorkspacePropertyAccess.kt similarity index 95% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/browser/properties/WorkspacePropertyAccess.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/properties/WorkspacePropertyAccess.kt index cf41105d31..9255037c76 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/browser/properties/WorkspacePropertyAccess.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/properties/WorkspacePropertyAccess.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.browser.properties +package com.ai.assistance.operit.ui.features.conversation.workspace.browser.properties import android.Manifest import android.content.Context diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/browser/properties/WorkspacePropertyProviders.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/properties/WorkspacePropertyProviders.kt similarity index 96% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/browser/properties/WorkspacePropertyProviders.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/properties/WorkspacePropertyProviders.kt index 9fd88597f2..679022e7af 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/browser/properties/WorkspacePropertyProviders.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/properties/WorkspacePropertyProviders.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.browser.properties +package com.ai.assistance.operit.ui.features.conversation.workspace.browser.properties import android.content.Context import android.net.Uri @@ -6,7 +6,7 @@ import android.provider.DocumentsContract import com.ai.assistance.operit.R import com.ai.assistance.operit.data.preferences.ApiPreferences import com.ai.assistance.operit.terminal.provider.filesystem.FileSystemProvider -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.browser.directoryModifiedTime +import com.ai.assistance.operit.ui.features.conversation.workspace.browser.directoryModifiedTime import kotlinx.coroutines.currentCoroutineContext import kotlinx.coroutines.ensureActive import kotlinx.coroutines.flow.first diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/transfer/WorkspaceCopyProgress.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/transfer/WorkspaceCopyProgress.kt new file mode 100644 index 0000000000..5ba6c09d5c --- /dev/null +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/transfer/WorkspaceCopyProgress.kt @@ -0,0 +1,16 @@ +package com.ai.assistance.operit.ui.features.conversation.workspace.browser.transfer + +import com.ai.assistance.operit.core.files.transfer.FileCopyProgress + +/** 一项可包含整个目录;批量粘贴同时显示项目序号,字节进度对应当前项目。 */ +internal data class WorkspaceCopyProgress( + val source: String, + val destination: String, + val sourceEnvironment: String, + val destinationEnvironment: String, + val itemIndex: Int, + val itemCount: Int, + val moving: Boolean, + val detail: FileCopyProgress? = null, + val finishing: Boolean = false, +) \ No newline at end of file diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/transfer/WorkspaceCopyProgressDialog.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/transfer/WorkspaceCopyProgressDialog.kt new file mode 100644 index 0000000000..6767c28c9e --- /dev/null +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/transfer/WorkspaceCopyProgressDialog.kt @@ -0,0 +1,50 @@ +package com.ai.assistance.operit.ui.features.conversation.workspace.browser.transfer + +import android.text.format.Formatter +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource +import com.ai.assistance.operit.R +import com.ai.assistance.operit.core.files.transfer.FileCopyPhase + +@Composable +internal fun WorkspaceCopyProgressDialog(progress: WorkspaceCopyProgress, cancelling: Boolean, onCancel: () -> Unit) { + val context = LocalContext.current + val detail = progress.detail + val fraction = detail?.fraction?.let { if (progress.moving) it.coerceAtMost(0.999f) else it } + val unknown = "—" + fun size(bytes: Long): String = Formatter.formatFileSize(context, bytes) + val currentFile = if (detail == null) progress.source.trimEnd('/').substringAfterLast('/') else detail.currentFile + val status = when { + progress.finishing -> R.string.workspace_transfer_finishing + detail?.phase == FileCopyPhase.SCANNING -> R.string.workspace_transfer_scanning + detail == null -> R.string.workspace_transfer_processing + progress.moving -> R.string.workspace_transfer_moving + else -> R.string.workspace_transfer_copying + } + WorkspaceFileOperationDialog( + title = stringResource(if (progress.moving) R.string.workspace_transfer_moving else R.string.workspace_transfer_copying), + status = stringResource(status), + fraction = fraction, + cancelling = cancelling, + onCancel = onCancel, + ) { + if (progress.itemCount > 1) { + Text(stringResource(R.string.workspace_transfer_item, progress.itemIndex, progress.itemCount), + style = MaterialTheme.typography.labelMedium, color = MaterialTheme.colorScheme.onSurfaceVariant) + } + WorkspaceOperationDetail(stringResource(R.string.workspace_transfer_name), currentFile) + WorkspaceOperationDetail(stringResource(R.string.workspace_transfer_source), "${progress.sourceEnvironment}:${progress.source}") + WorkspaceOperationDetail(stringResource(R.string.workspace_transfer_destination), "${progress.destinationEnvironment}:${progress.destination}") + WorkspaceOperationDetail(stringResource(R.string.workspace_transfer_copied), + if (detail == null) unknown else "${size(detail.copiedBytes)} / ${detail.totalBytes?.let(::size) ?: unknown}") + WorkspaceOperationDetail(stringResource(R.string.workspace_transfer_remaining), detail?.remainingBytes?.let(::size) ?: unknown) + WorkspaceOperationDetail(stringResource(R.string.workspace_transfer_speed), detail?.bytesPerSecond?.let { "${size(it.toLong())}/s" } ?: unknown) + if (detail != null) { + Text(stringResource(R.string.workspace_transfer_files, detail.copiedFiles, detail.totalFiles), + style = MaterialTheme.typography.labelMedium, color = MaterialTheme.colorScheme.onSurfaceVariant) + } + } +} diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/transfer/WorkspaceDeleteProgress.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/transfer/WorkspaceDeleteProgress.kt new file mode 100644 index 0000000000..6b32eeac92 --- /dev/null +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/transfer/WorkspaceDeleteProgress.kt @@ -0,0 +1,51 @@ +package com.ai.assistance.operit.ui.features.conversation.workspace.browser.transfer + +import com.ai.assistance.operit.ui.features.conversation.workspace.browser.FileBrowserClipboardItem +import kotlinx.coroutines.currentCoroutineContext +import kotlinx.coroutines.ensureActive +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow + +/** 只按所选项目统计,目录内部没有上报时不能把项目比例冒充文件或字节进度。 */ +internal data class WorkspaceDeleteProgress( + val target: FileBrowserClipboardItem, + val completedItems: Int, + val totalItems: Int, +) { + val fraction: Float? + get() = when { + completedItems == totalItems -> 1f + totalItems > 1 -> completedItems.toFloat() / totalItems + else -> null + } +} + +/** 删除动作由既有文件工具执行;这里只管理进度、逐项成功通知和停止后续项。 */ +internal class WorkspaceDeleteOperation( + private val deleteItem: suspend (FileBrowserClipboardItem) -> Unit, +) { + private val state = MutableStateFlow(null) + val progress = state.asStateFlow() + + suspend fun run( + targets: List, + onDeleted: suspend (FileBrowserClipboardItem) -> Unit = {}, + ) { + if (targets.isEmpty()) return + val executionContext = currentCoroutineContext() + try { + for ((index, target) in targets.withIndex()) { + executionContext.ensureActive() + val current = WorkspaceDeleteProgress(target, index, targets.size) + state.value = current + deleteItem(target) + state.value = current.copy(completedItems = index + 1) + // 当前工具返回成功才更新选择;失败不计入完成,也不开始下一个项目。 + onDeleted(target) + executionContext.ensureActive() + } + } finally { + state.value = null + } + } +} diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/transfer/WorkspaceDeleteProgressDialog.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/transfer/WorkspaceDeleteProgressDialog.kt new file mode 100644 index 0000000000..7b5e3e936c --- /dev/null +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/transfer/WorkspaceDeleteProgressDialog.kt @@ -0,0 +1,28 @@ +package com.ai.assistance.operit.ui.features.conversation.workspace.browser.transfer + +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.res.stringResource +import com.ai.assistance.operit.R + +@Composable +internal fun WorkspaceDeleteProgressDialog(progress: WorkspaceDeleteProgress, cancelling: Boolean, onCancel: () -> Unit) { + val target = progress.target + WorkspaceFileOperationDialog( + title = stringResource(R.string.workspace_transfer_deleting), + status = stringResource(R.string.workspace_transfer_deleting), + fraction = progress.fraction, + cancelling = cancelling, + onCancel = onCancel, + ) { + WorkspaceOperationDetail(stringResource(R.string.workspace_transfer_name), target.path.trimEnd('/').substringAfterLast('/')) + WorkspaceOperationDetail(stringResource(R.string.workspace_transfer_source), "${target.environment ?: "android"}:${target.path}") + Text(stringResource(R.string.workspace_transfer_deleted_items, progress.completedItems, progress.totalItems), + style = MaterialTheme.typography.bodyMedium) + Text(stringResource(R.string.workspace_transfer_delete_scope), + style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant) + Text(stringResource(R.string.workspace_transfer_delete_cancel_note), + style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant) + } +} diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/transfer/WorkspaceFileOperationDialog.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/transfer/WorkspaceFileOperationDialog.kt new file mode 100644 index 0000000000..85619f01f5 --- /dev/null +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/transfer/WorkspaceFileOperationDialog.kt @@ -0,0 +1,79 @@ +package com.ai.assistance.operit.ui.features.conversation.workspace.browser.transfer + +import androidx.compose.animation.core.animateFloatAsState +import androidx.compose.animation.core.tween +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.ColumnScope +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.LinearProgressIndicator +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import androidx.compose.ui.window.Dialog +import androidx.compose.ui.window.DialogProperties +import com.ai.assistance.operit.R + +/** 复制、移动和删除共用外观;只有调用方提供真实比例时才显示百分比。 */ +@Composable +internal fun WorkspaceFileOperationDialog( + title: String, + status: String, + fraction: Float?, + cancelling: Boolean, + onCancel: () -> Unit, + content: @Composable ColumnScope.() -> Unit, +) { + val visibleFraction = fraction?.let { if (cancelling) it.coerceAtMost(0.999f) else it } + val animatedFraction by animateFloatAsState(visibleFraction ?: 0f, tween(180), label = "workspaceFileOperationProgress") + Dialog(onDismissRequest = {}, properties = DialogProperties(dismissOnBackPress = false, dismissOnClickOutside = false)) { + Surface(shape = MaterialTheme.shapes.extraLarge, color = MaterialTheme.colorScheme.surface, tonalElevation = 6.dp) { + Column(Modifier.fillMaxWidth().verticalScroll(rememberScrollState()).padding(24.dp), verticalArrangement = Arrangement.spacedBy(12.dp)) { + Text(title, modifier = Modifier.fillMaxWidth(), textAlign = TextAlign.Center, + style = MaterialTheme.typography.titleLarge) + content() + Spacer(Modifier.height(2.dp)) + Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically) { + Text(if (cancelling) stringResource(R.string.workspace_transfer_cancelling) else status, + Modifier.weight(1f), style = MaterialTheme.typography.labelMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant) + if (visibleFraction != null) Text(stringResource(R.string.workspace_transfer_percent, (visibleFraction * 100).toInt()), + style = MaterialTheme.typography.labelLarge, color = MaterialTheme.colorScheme.primary) + } + val bar = Modifier.fillMaxWidth().height(6.dp).clip(RoundedCornerShape(3.dp)) + if (visibleFraction == null) LinearProgressIndicator(modifier = bar) + else LinearProgressIndicator(progress = { animatedFraction }, modifier = bar) + TextButton(onClick = onCancel, enabled = !cancelling, modifier = Modifier.align(Alignment.End)) { + Text(stringResource(R.string.cancel)) + } + } + } + } +} + +@Composable +internal fun WorkspaceOperationDetail(label: String, value: String) { + Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.spacedBy(12.dp)) { + Text(label, Modifier.weight(0.25f), style = MaterialTheme.typography.bodySmall, + color = MaterialTheme.colorScheme.onSurfaceVariant) + Text(value, Modifier.weight(0.75f), maxLines = 2, overflow = TextOverflow.Ellipsis, + style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurface) + } +} diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/CanvasCodeEditorView.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/CanvasCodeEditorView.kt similarity index 98% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/CanvasCodeEditorView.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/CanvasCodeEditorView.kt index d5e480bb30..cdc1e5d663 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/CanvasCodeEditorView.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/CanvasCodeEditorView.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor +package com.ai.assistance.operit.ui.features.conversation.workspace.editor import android.content.ClipData import android.content.ClipboardManager @@ -33,12 +33,12 @@ import android.view.inputmethod.InputConnection import android.view.inputmethod.InputMethodManager import android.widget.OverScroller import androidx.compose.ui.graphics.toArgb -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor.completion.CompletionItem -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor.completion.CompletionProvider -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor.completion.CompletionProviderFactory -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor.language.LanguageSupport -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor.theme.EditorTheme -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor.theme.getThemeForLanguage +import com.ai.assistance.operit.ui.features.conversation.workspace.editor.completion.CompletionItem +import com.ai.assistance.operit.ui.features.conversation.workspace.editor.completion.CompletionProvider +import com.ai.assistance.operit.ui.features.conversation.workspace.editor.completion.CompletionProviderFactory +import com.ai.assistance.operit.ui.features.conversation.workspace.editor.language.LanguageSupport +import com.ai.assistance.operit.ui.features.conversation.workspace.editor.theme.EditorTheme +import com.ai.assistance.operit.ui.features.conversation.workspace.editor.theme.getThemeForLanguage import kotlin.math.abs import kotlin.math.ceil import kotlin.math.hypot diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/CodeEditor.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/CodeEditor.kt similarity index 96% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/CodeEditor.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/CodeEditor.kt index c68905aac7..d1e1384a4e 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/CodeEditor.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/CodeEditor.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor +package com.ai.assistance.operit.ui.features.conversation.workspace.editor import android.content.Context import android.graphics.Point @@ -41,10 +41,10 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.compose.ui.viewinterop.AndroidView import com.ai.assistance.operit.ui.components.CustomScaffold -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor.completion.CompletionItem -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor.completion.CompletionPopup -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor.theme.EditorTheme -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor.theme.getThemeForLanguage +import com.ai.assistance.operit.ui.features.conversation.workspace.editor.completion.CompletionItem +import com.ai.assistance.operit.ui.features.conversation.workspace.editor.completion.CompletionPopup +import com.ai.assistance.operit.ui.features.conversation.workspace.editor.theme.EditorTheme +import com.ai.assistance.operit.ui.features.conversation.workspace.editor.theme.getThemeForLanguage import kotlin.math.roundToInt @Composable diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/CodeFormatter.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/CodeFormatter.kt similarity index 99% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/CodeFormatter.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/CodeFormatter.kt index bf6a02f211..810ee8316f 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/CodeFormatter.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/CodeFormatter.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor +package com.ai.assistance.operit.ui.features.conversation.workspace.editor import com.ai.assistance.operit.util.logging.AppLogger diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/CommentSyntax.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/CommentSyntax.kt similarity index 98% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/CommentSyntax.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/CommentSyntax.kt index 15b57a61c4..7f35b8d7ac 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/CommentSyntax.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/CommentSyntax.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor +package com.ai.assistance.operit.ui.features.conversation.workspace.editor /** * 文件格式的注释规则。 diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/EditorDocument.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/EditorDocument.kt similarity index 99% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/EditorDocument.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/EditorDocument.kt index 25b8e3ef25..563fe4ae8f 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/EditorDocument.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/EditorDocument.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor +package com.ai.assistance.operit.ui.features.conversation.workspace.editor import android.text.SpannableStringBuilder import kotlin.math.max diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/EditorMetrics.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/EditorMetrics.kt similarity index 91% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/EditorMetrics.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/EditorMetrics.kt index be75d47e30..6b36a3f277 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/EditorMetrics.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/EditorMetrics.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor +package com.ai.assistance.operit.ui.features.conversation.workspace.editor import android.graphics.Paint import android.graphics.Typeface diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/EditorSyntaxHighlighter.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/EditorSyntaxHighlighter.kt similarity index 97% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/EditorSyntaxHighlighter.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/EditorSyntaxHighlighter.kt index bc18486918..21250ff49c 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/EditorSyntaxHighlighter.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/EditorSyntaxHighlighter.kt @@ -1,10 +1,10 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor +package com.ai.assistance.operit.ui.features.conversation.workspace.editor import android.graphics.Color import android.os.Handler import android.os.Looper -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor.language.LanguageFactory -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor.language.LanguageSupport +import com.ai.assistance.operit.ui.features.conversation.workspace.editor.language.LanguageFactory +import com.ai.assistance.operit.ui.features.conversation.workspace.editor.language.LanguageSupport import java.util.concurrent.ExecutorService import java.util.concurrent.Executors import java.util.concurrent.RejectedExecutionException diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/LanguageDetector.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/LanguageDetector.kt similarity index 97% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/LanguageDetector.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/LanguageDetector.kt index b26961f6b5..606b87e768 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/LanguageDetector.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/LanguageDetector.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor +package com.ai.assistance.operit.ui.features.conversation.workspace.editor /** * 根据文件名检测编程语言。 diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/completion/CompletionPopup.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/completion/CompletionPopup.kt similarity index 93% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/completion/CompletionPopup.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/completion/CompletionPopup.kt index 9718e12597..48eeb603f9 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/completion/CompletionPopup.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/completion/CompletionPopup.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor.completion +package com.ai.assistance.operit.ui.features.conversation.workspace.editor.completion import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.clickable @@ -20,8 +20,8 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.compose.ui.window.Popup import androidx.compose.ui.window.PopupProperties -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor.language.LanguageSupport -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor.theme.EditorTheme +import com.ai.assistance.operit.ui.features.conversation.workspace.editor.language.LanguageSupport +import com.ai.assistance.operit.ui.features.conversation.workspace.editor.theme.EditorTheme /** * 代码补全弹出组件 diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/completion/CompletionProvider.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/completion/CompletionProvider.kt similarity index 96% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/completion/CompletionProvider.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/completion/CompletionProvider.kt index 0116067924..2869ce0e55 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/completion/CompletionProvider.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/completion/CompletionProvider.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor.completion +package com.ai.assistance.operit.ui.features.conversation.workspace.editor.completion import android.text.Editable diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/completion/CompletionProviderFactory.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/completion/CompletionProviderFactory.kt similarity index 85% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/completion/CompletionProviderFactory.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/completion/CompletionProviderFactory.kt index 5aa86054ad..7855756792 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/completion/CompletionProviderFactory.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/completion/CompletionProviderFactory.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor.completion +package com.ai.assistance.operit.ui.features.conversation.workspace.editor.completion /** * 补全提供器工厂 diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/completion/DartCompletionProvider.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/completion/DartCompletionProvider.kt similarity index 94% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/completion/DartCompletionProvider.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/completion/DartCompletionProvider.kt index b68815cc7c..106d9cb122 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/completion/DartCompletionProvider.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/completion/DartCompletionProvider.kt @@ -1,6 +1,6 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor.completion +package com.ai.assistance.operit.ui.features.conversation.workspace.editor.completion -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor.language.LanguageFactory +import com.ai.assistance.operit.ui.features.conversation.workspace.editor.language.LanguageFactory /** * Dart 补全提供器 diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/completion/DefaultCompletionProvider.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/completion/DefaultCompletionProvider.kt similarity index 93% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/completion/DefaultCompletionProvider.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/completion/DefaultCompletionProvider.kt index a5734cec7c..4c33ab1d7c 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/completion/DefaultCompletionProvider.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/completion/DefaultCompletionProvider.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor.completion +package com.ai.assistance.operit.ui.features.conversation.workspace.editor.completion /** * 默认补全提供器 diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/completion/HtmlCompletionProvider.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/completion/HtmlCompletionProvider.kt similarity index 98% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/completion/HtmlCompletionProvider.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/completion/HtmlCompletionProvider.kt index 5507479f68..e1b71c7cf4 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/completion/HtmlCompletionProvider.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/completion/HtmlCompletionProvider.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor.completion +package com.ai.assistance.operit.ui.features.conversation.workspace.editor.completion /** * HTML补全提供器 diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/completion/JavaScriptCompletionProvider.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/completion/JavaScriptCompletionProvider.kt similarity index 96% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/completion/JavaScriptCompletionProvider.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/completion/JavaScriptCompletionProvider.kt index 8e8198771d..680d4f1ff0 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/completion/JavaScriptCompletionProvider.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/completion/JavaScriptCompletionProvider.kt @@ -1,6 +1,6 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor.completion +package com.ai.assistance.operit.ui.features.conversation.workspace.editor.completion -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor.language.LanguageFactory +import com.ai.assistance.operit.ui.features.conversation.workspace.editor.language.LanguageFactory /** * JavaScript补全提供器 diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/completion/KotlinCompletionProvider.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/completion/KotlinCompletionProvider.kt similarity index 96% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/completion/KotlinCompletionProvider.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/completion/KotlinCompletionProvider.kt index b40350f199..45594970c6 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/completion/KotlinCompletionProvider.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/completion/KotlinCompletionProvider.kt @@ -1,6 +1,6 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor.completion +package com.ai.assistance.operit.ui.features.conversation.workspace.editor.completion -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor.language.LanguageFactory +import com.ai.assistance.operit.ui.features.conversation.workspace.editor.language.LanguageFactory /** * Kotlin补全提供器 diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/language/BaseLanguageSupport.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/language/BaseLanguageSupport.kt similarity index 90% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/language/BaseLanguageSupport.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/language/BaseLanguageSupport.kt index 11c6303d9e..d6a87dd059 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/language/BaseLanguageSupport.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/language/BaseLanguageSupport.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor.language +package com.ai.assistance.operit.ui.features.conversation.workspace.editor.language /** * 基础语言支持抽象类,提供通用实现 diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/language/DartSupport.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/language/DartSupport.kt similarity index 95% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/language/DartSupport.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/language/DartSupport.kt index 87af6f4310..19057c5685 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/language/DartSupport.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/language/DartSupport.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor.language +package com.ai.assistance.operit.ui.features.conversation.workspace.editor.language /** * Dart 语言支持 diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/language/HtmlSupport.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/language/HtmlSupport.kt similarity index 95% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/language/HtmlSupport.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/language/HtmlSupport.kt index ee466dfd3c..0e832c3764 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/language/HtmlSupport.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/language/HtmlSupport.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor.language +package com.ai.assistance.operit.ui.features.conversation.workspace.editor.language /** * HTML语言支持 diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/language/JavaScriptSupport.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/language/JavaScriptSupport.kt similarity index 95% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/language/JavaScriptSupport.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/language/JavaScriptSupport.kt index 447ebabf7c..401acc3ee0 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/language/JavaScriptSupport.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/language/JavaScriptSupport.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor.language +package com.ai.assistance.operit.ui.features.conversation.workspace.editor.language /** * JavaScript语言支持 diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/language/KotlinSupport.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/language/KotlinSupport.kt similarity index 95% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/language/KotlinSupport.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/language/KotlinSupport.kt index e6711851fc..886241aa58 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/language/KotlinSupport.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/language/KotlinSupport.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor.language +package com.ai.assistance.operit.ui.features.conversation.workspace.editor.language /** * Kotlin语言支持 diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/language/LanguageFactory.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/language/LanguageFactory.kt similarity index 91% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/language/LanguageFactory.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/language/LanguageFactory.kt index 5141b07890..5c1879511d 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/language/LanguageFactory.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/language/LanguageFactory.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor.language +package com.ai.assistance.operit.ui.features.conversation.workspace.editor.language /** * 语言工厂类,用于初始化和获取所有语言支持 diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/language/LanguageSupport.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/language/LanguageSupport.kt similarity index 95% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/language/LanguageSupport.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/language/LanguageSupport.kt index 3e17ecd71c..8919462833 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/language/LanguageSupport.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/language/LanguageSupport.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor.language +package com.ai.assistance.operit.ui.features.conversation.workspace.editor.language import android.graphics.Color diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/language/LanguageSupportRegistry.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/language/LanguageSupportRegistry.kt similarity index 93% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/language/LanguageSupportRegistry.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/language/LanguageSupportRegistry.kt index 83d5a8461a..9808137886 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/language/LanguageSupportRegistry.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/language/LanguageSupportRegistry.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor.language +package com.ai.assistance.operit.ui.features.conversation.workspace.editor.language /** * 语言支持注册表,用于管理所有支持的语言 diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/theme/EditorTheme.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/theme/EditorTheme.kt similarity index 96% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/theme/EditorTheme.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/theme/EditorTheme.kt index 8dd073d397..b84521923b 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/theme/EditorTheme.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/theme/EditorTheme.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor.theme +package com.ai.assistance.operit.ui.features.conversation.workspace.editor.theme import androidx.compose.ui.graphics.Color import androidx.compose.ui.unit.TextUnit diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/workspace/WorkspaceHubHome.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/hub/WorkspaceHubHome.kt similarity index 99% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/workspace/WorkspaceHubHome.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/hub/WorkspaceHubHome.kt index 25e57f0bef..7d2d06a8d3 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/workspace/WorkspaceHubHome.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/hub/WorkspaceHubHome.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.workspace +package com.ai.assistance.operit.ui.features.conversation.workspace.hub import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.clickable diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/workspace/WorkspaceHubOverlay.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/hub/WorkspaceHubOverlay.kt similarity index 97% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/workspace/WorkspaceHubOverlay.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/hub/WorkspaceHubOverlay.kt index 299e2ff6f3..38826b7ad4 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/workspace/WorkspaceHubOverlay.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/hub/WorkspaceHubOverlay.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.workspace +package com.ai.assistance.operit.ui.features.conversation.workspace.hub import androidx.compose.animation.core.FastOutSlowInEasing import androidx.compose.animation.core.animateFloat diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/workspace/WorkspaceHubScreen.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/hub/WorkspaceHubScreen.kt similarity index 97% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/workspace/WorkspaceHubScreen.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/hub/WorkspaceHubScreen.kt index ffe1010bc5..f615dee255 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/workspace/WorkspaceHubScreen.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/hub/WorkspaceHubScreen.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.workspace +package com.ai.assistance.operit.ui.features.conversation.workspace.hub import android.content.Intent import android.os.Build @@ -39,8 +39,8 @@ import com.ai.assistance.operit.data.resources.OfflineResources import com.ai.assistance.operit.ui.features.management.resources.OfflineResourcesActivity import com.ai.assistance.operit.terminal.TerminalManager import com.ai.assistance.operit.ui.features.conversation.chat.viewmodel.ChatViewModel -import com.ai.assistance.operit.ui.features.conversation.chat.webview.computer.ComputerScreen -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.WorkspaceScreen +import com.ai.assistance.operit.ui.features.automation.terminal.ComputerScreen +import com.ai.assistance.operit.ui.features.conversation.workspace.WorkspaceScreen import java.io.File import androidx.compose.material3.AlertDialog import androidx.compose.material3.TextButton diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/workspace/WorkspaceHubState.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/hub/WorkspaceHubState.kt similarity index 86% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/workspace/WorkspaceHubState.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/hub/WorkspaceHubState.kt index 2f215853b3..c83ac7d50d 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/workspace/WorkspaceHubState.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/hub/WorkspaceHubState.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.workspace +package com.ai.assistance.operit.ui.features.conversation.workspace.hub /** 工作区入口和子页面共用一份导航状态,避免终端与工作区同时显示。 */ enum class WorkspaceHubPage { diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/workspace/WorkspaceSessionTabs.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/hub/WorkspaceSessionTabs.kt similarity index 99% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/workspace/WorkspaceSessionTabs.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/hub/WorkspaceSessionTabs.kt index 505bbb79c1..1a542930df 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/workspace/WorkspaceSessionTabs.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/hub/WorkspaceSessionTabs.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.workspace +package com.ai.assistance.operit.ui.features.conversation.workspace.hub import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.horizontalScroll diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/links/WorkspaceFileLink.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/links/WorkspaceFileLink.kt similarity index 97% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/links/WorkspaceFileLink.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/links/WorkspaceFileLink.kt index ae55f0817c..51c8829d0f 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/links/WorkspaceFileLink.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/links/WorkspaceFileLink.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.links +package com.ai.assistance.operit.ui.features.conversation.workspace.links import java.net.URI import java.net.URISyntaxException diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/links/WorkspaceFileLinkHost.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/links/WorkspaceFileLinkHost.kt similarity index 92% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/links/WorkspaceFileLinkHost.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/links/WorkspaceFileLinkHost.kt index 29976bfb2b..53d1d0fb34 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/links/WorkspaceFileLinkHost.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/links/WorkspaceFileLinkHost.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.links +package com.ai.assistance.operit.ui.features.conversation.workspace.links import androidx.activity.compose.BackHandler import androidx.compose.foundation.layout.* @@ -24,14 +24,14 @@ import com.ai.assistance.operit.data.model.AITool import com.ai.assistance.operit.data.model.ChatHistory import com.ai.assistance.operit.data.model.ToolParameter import com.ai.assistance.operit.ui.features.conversation.chat.viewmodel.ChatViewModel -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.FileBrowser -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.OpenFileInfo -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.WorkspaceManager -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.browser.FileBrowserOperations -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.workspaceMimeTypeForPath -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.workspaceShouldOpenAsDirectPreview -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.text.WORKSPACE_TEXT_PREVIEW_LIMIT_BYTES -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.text.readWorkspaceTextWithinLimit +import com.ai.assistance.operit.ui.features.conversation.workspace.FileBrowser +import com.ai.assistance.operit.ui.features.conversation.workspace.OpenFileInfo +import com.ai.assistance.operit.ui.features.conversation.workspace.WorkspaceManager +import com.ai.assistance.operit.ui.features.conversation.workspace.browser.FileBrowserOperations +import com.ai.assistance.operit.ui.features.conversation.workspace.preview.workspaceMimeTypeForPath +import com.ai.assistance.operit.ui.features.conversation.workspace.preview.workspaceShouldOpenAsDirectPreview +import com.ai.assistance.operit.ui.features.conversation.workspace.text.WORKSPACE_TEXT_PREVIEW_LIMIT_BYTES +import com.ai.assistance.operit.ui.features.conversation.workspace.text.readWorkspaceTextWithinLimit import com.ai.assistance.operit.util.logging.AppLogger import com.ai.assistance.operit.util.files.FileUtils import java.io.File diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/links/WorkspaceMarkdownLink.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/links/WorkspaceMarkdownLink.kt similarity index 98% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/links/WorkspaceMarkdownLink.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/links/WorkspaceMarkdownLink.kt index 33d5581c71..025e59d429 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/links/WorkspaceMarkdownLink.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/links/WorkspaceMarkdownLink.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.links +package com.ai.assistance.operit.ui.features.conversation.workspace.links import java.net.URI import java.net.URISyntaxException diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/markdown/WorkspaceMarkdownPreview.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/markdown/WorkspaceMarkdownPreview.kt similarity index 86% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/markdown/WorkspaceMarkdownPreview.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/markdown/WorkspaceMarkdownPreview.kt index 4ec870efc1..bed5ee70d8 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/markdown/WorkspaceMarkdownPreview.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/markdown/WorkspaceMarkdownPreview.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.markdown +package com.ai.assistance.operit.ui.features.conversation.workspace.markdown import com.ai.assistance.operit.ui.common.oktoast.OKToast @@ -17,10 +17,10 @@ import androidx.compose.ui.unit.dp import com.ai.assistance.operit.R import com.ai.assistance.operit.ui.common.markdown.StreamMarkdownRenderer import com.ai.assistance.operit.ui.common.markdown.links.openMarkdownLink -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.OpenFileInfo -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.links.WorkspaceFileLink -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.links.WorkspaceMarkdownLink -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.links.resolveWorkspaceMarkdownLink +import com.ai.assistance.operit.ui.features.conversation.workspace.OpenFileInfo +import com.ai.assistance.operit.ui.features.conversation.workspace.links.WorkspaceFileLink +import com.ai.assistance.operit.ui.features.conversation.workspace.links.WorkspaceMarkdownLink +import com.ai.assistance.operit.ui.features.conversation.workspace.links.resolveWorkspaceMarkdownLink import com.ai.assistance.operit.util.logging.AppLogger import kotlinx.coroutines.CancellationException diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/LocalWebServer.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/preview/LocalWebServer.kt similarity index 99% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/LocalWebServer.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/preview/LocalWebServer.kt index fbc4526202..bb97570587 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/LocalWebServer.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/preview/LocalWebServer.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview +package com.ai.assistance.operit.ui.features.conversation.workspace.preview import android.content.Context import android.os.Environment @@ -12,8 +12,8 @@ import com.ai.assistance.operit.core.tools.BinaryFileContentData import com.ai.assistance.operit.core.tools.DirectoryListingData import com.ai.assistance.operit.data.model.AITool import com.ai.assistance.operit.data.model.ToolParameter -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.workspaceMimeTypeForPath import com.ai.assistance.operit.util.logging.AppLogger +import com.ai.assistance.operit.ui.features.conversation.workspace.ensureWorkspaceDirExists import fi.iki.elonen.NanoHTTPD import java.io.ByteArrayInputStream import java.io.File diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/WebViewHandler.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/preview/WebViewHandler.kt similarity index 99% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/WebViewHandler.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/preview/WebViewHandler.kt index 5a83743ae9..91b2210d4b 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/WebViewHandler.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/preview/WebViewHandler.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview +package com.ai.assistance.operit.ui.features.conversation.workspace.preview import com.ai.assistance.operit.ui.common.oktoast.OKToast diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/WorkspaceFilePreviewSupport.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/preview/WorkspaceFilePreviewSupport.kt similarity index 97% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/WorkspaceFilePreviewSupport.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/preview/WorkspaceFilePreviewSupport.kt index f2862a7354..157d76233a 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/WorkspaceFilePreviewSupport.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/preview/WorkspaceFilePreviewSupport.kt @@ -1,10 +1,10 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace +package com.ai.assistance.operit.ui.features.conversation.workspace.preview import android.net.Uri import android.webkit.MimeTypeMap -import com.ai.assistance.operit.ui.features.conversation.chat.webview.LocalWebServer import java.io.File import java.util.Locale +import com.ai.assistance.operit.ui.features.conversation.workspace.OpenFileInfo private const val LOCAL_WORKSPACE_HOST = "127.0.0.1" diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/WorkspaceImagePreview.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/preview/WorkspaceImagePreview.kt similarity index 99% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/WorkspaceImagePreview.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/preview/WorkspaceImagePreview.kt index f54003b87f..acf4b891d1 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/WorkspaceImagePreview.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/preview/WorkspaceImagePreview.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace +package com.ai.assistance.operit.ui.features.conversation.workspace.preview import android.net.Uri import androidx.compose.animation.AnimatedVisibility diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/WorkspacePreviewRefreshBus.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/preview/WorkspacePreviewRefreshBus.kt similarity index 87% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/WorkspacePreviewRefreshBus.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/preview/WorkspacePreviewRefreshBus.kt index aae5e6551b..fe23e9989e 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/WorkspacePreviewRefreshBus.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/preview/WorkspacePreviewRefreshBus.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace +package com.ai.assistance.operit.ui.features.conversation.workspace.preview import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.asSharedFlow diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/WorkspaceReadOnlyDocumentPreview.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/preview/WorkspaceReadOnlyDocumentPreview.kt similarity index 99% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/WorkspaceReadOnlyDocumentPreview.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/preview/WorkspaceReadOnlyDocumentPreview.kt index e1cf314baa..90f169c6e8 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/WorkspaceReadOnlyDocumentPreview.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/preview/WorkspaceReadOnlyDocumentPreview.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace +package com.ai.assistance.operit.ui.features.conversation.workspace.preview import android.graphics.Bitmap import android.graphics.pdf.PdfRenderer @@ -41,6 +41,7 @@ import com.ai.assistance.operit.data.model.AITool import com.ai.assistance.operit.data.model.ToolParameter import com.ai.assistance.operit.util.logging.AppLogger import com.ai.assistance.operit.util.document.DocumentConversionUtil +import com.ai.assistance.operit.ui.features.conversation.workspace.OpenFileInfo import java.io.File import java.io.FileOutputStream import java.util.Locale diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/process/DepthLimitedFileObserver.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/process/DepthLimitedFileObserver.kt similarity index 98% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/process/DepthLimitedFileObserver.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/process/DepthLimitedFileObserver.kt index 696619bacd..bb4ce41769 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/process/DepthLimitedFileObserver.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/process/DepthLimitedFileObserver.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.process +package com.ai.assistance.operit.ui.features.conversation.workspace.process import android.os.FileObserver import com.ai.assistance.operit.util.logging.AppLogger diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/process/GitIgnoreFilter.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/process/GitIgnoreFilter.kt similarity index 98% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/process/GitIgnoreFilter.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/process/GitIgnoreFilter.kt index e7a2c831cb..4efd9c89e1 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/process/GitIgnoreFilter.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/process/GitIgnoreFilter.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.process +package com.ai.assistance.operit.ui.features.conversation.workspace.process import com.ai.assistance.operit.util.logging.AppLogger import java.io.File diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/process/WorkspaceAttachmentProcessor.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/process/WorkspaceAttachmentProcessor.kt similarity index 96% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/process/WorkspaceAttachmentProcessor.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/process/WorkspaceAttachmentProcessor.kt index 050f7f663c..6073694c06 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/process/WorkspaceAttachmentProcessor.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/process/WorkspaceAttachmentProcessor.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.process +package com.ai.assistance.operit.ui.features.conversation.workspace.process import android.content.Context import com.ai.assistance.operit.R diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/process/WorkspaceChangeTracker.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/process/WorkspaceChangeTracker.kt similarity index 97% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/process/WorkspaceChangeTracker.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/process/WorkspaceChangeTracker.kt index 1292eaaa6f..3cdd5fae9d 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/process/WorkspaceChangeTracker.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/process/WorkspaceChangeTracker.kt @@ -1,8 +1,8 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.process +package com.ai.assistance.operit.ui.features.conversation.workspace.process import android.content.Context -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.WatchConfig -import com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.WorkspaceConfigReader +import com.ai.assistance.operit.ui.features.conversation.workspace.WatchConfig +import com.ai.assistance.operit.ui.features.conversation.workspace.WorkspaceConfigReader import com.ai.assistance.operit.util.logging.AppLogger import java.io.File diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/process/WorkspaceRuleFileReader.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/process/WorkspaceRuleFileReader.kt similarity index 95% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/process/WorkspaceRuleFileReader.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/process/WorkspaceRuleFileReader.kt index 65cbfcf5ea..9df57abd46 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/process/WorkspaceRuleFileReader.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/process/WorkspaceRuleFileReader.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.process +package com.ai.assistance.operit.ui.features.conversation.workspace.process import android.content.Context import com.ai.assistance.operit.core.tools.AIToolHandler diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/search/WorkspaceTextSearch.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/search/WorkspaceTextSearch.kt similarity index 97% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/search/WorkspaceTextSearch.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/search/WorkspaceTextSearch.kt index cc72d873c2..7a7ab1cc0b 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/search/WorkspaceTextSearch.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/search/WorkspaceTextSearch.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.search +package com.ai.assistance.operit.ui.features.conversation.workspace.search import androidx.compose.foundation.layout.* import androidx.compose.foundation.text.KeyboardActions diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/text/WorkspaceTextReadPolicy.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/text/WorkspaceTextReadPolicy.kt similarity index 80% rename from app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/text/WorkspaceTextReadPolicy.kt rename to app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/text/WorkspaceTextReadPolicy.kt index fbe72ee1ce..f91a5238f4 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/text/WorkspaceTextReadPolicy.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/text/WorkspaceTextReadPolicy.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.text +package com.ai.assistance.operit.ui.features.conversation.workspace.text internal const val WORKSPACE_TEXT_PREVIEW_LIMIT_BYTES = 10L * 1024 * 1024 diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/management/settings/screens/theme/workbench/ThemePreviewSurfaces.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/management/settings/screens/theme/workbench/ThemePreviewSurfaces.kt index 36e390a1fb..8baa7d30b0 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/management/settings/screens/theme/workbench/ThemePreviewSurfaces.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/management/settings/screens/theme/workbench/ThemePreviewSurfaces.kt @@ -27,8 +27,8 @@ import com.ai.assistance.operit.data.preferences.ThemePreferenceValues import com.ai.assistance.operit.data.preferences.UserPreferencesManager import com.ai.assistance.operit.data.preferences.glass.GlassRegion import com.ai.assistance.operit.data.preferences.transparency.ThemeTransparencyPreferences -import com.ai.assistance.operit.ui.features.conversation.chat.components.style.bubble.BubbleImageBackgroundSurface -import com.ai.assistance.operit.ui.features.conversation.chat.components.style.bubble.BubbleImageStyleConfig +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.style.bubble.BubbleImageBackgroundSurface +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.style.bubble.BubbleImageStyleConfig import com.ai.assistance.operit.ui.theme.* @Composable diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/management/settings/screens/theme/workbench/ThemeWorkbenchMessageAppearance.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/management/settings/screens/theme/workbench/ThemeWorkbenchMessageAppearance.kt index 9cf0a72eea..c23a0798fa 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/management/settings/screens/theme/workbench/ThemeWorkbenchMessageAppearance.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/management/settings/screens/theme/workbench/ThemeWorkbenchMessageAppearance.kt @@ -18,7 +18,7 @@ import com.ai.assistance.operit.R import com.ai.assistance.operit.data.preferences.UserPreferencesManager import com.ai.assistance.operit.data.preferences.glass.GlassRegion import com.ai.assistance.operit.data.preferences.transparency.ThemeTransparencyPreferences -import com.ai.assistance.operit.ui.features.conversation.chat.components.style.bubble.BubbleImageStyleConfig +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.style.bubble.BubbleImageStyleConfig import com.ai.assistance.operit.ui.features.management.settings.components.ChatStyleOption import com.ai.assistance.operit.ui.features.management.settings.components.bubble.BubbleImageStyleEditor import com.ai.assistance.operit.ui.features.management.settings.components.transparency.BackgroundTransparencySlider diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/management/settings/sections/ThemeSettingsCoreSections.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/management/settings/sections/ThemeSettingsCoreSections.kt index 657c058e17..decd60e0ac 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/management/settings/sections/ThemeSettingsCoreSections.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/management/settings/sections/ThemeSettingsCoreSections.kt @@ -34,7 +34,7 @@ import androidx.compose.ui.unit.IntSize import androidx.compose.ui.unit.dp import com.ai.assistance.operit.R import com.ai.assistance.operit.data.preferences.UserPreferencesManager -import com.ai.assistance.operit.ui.features.conversation.chat.components.style.bubble.BubbleImageStyleConfig +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.style.bubble.BubbleImageStyleConfig import com.ai.assistance.operit.ui.features.management.settings.screens.theme.ThemeEditorSession import com.ai.assistance.operit.ui.features.management.settings.screens.theme.workbench.* import kotlin.math.max diff --git a/app/src/main/java/com/ai/assistance/operit/ui/features/support/demo/markdown/StreamMarkdownDemo.kt b/app/src/main/java/com/ai/assistance/operit/ui/features/support/demo/markdown/StreamMarkdownDemo.kt index 97989a261f..e027e6656d 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/features/support/demo/markdown/StreamMarkdownDemo.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/features/support/demo/markdown/StreamMarkdownDemo.kt @@ -44,7 +44,7 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.ai.assistance.operit.R -import com.ai.assistance.operit.ui.features.conversation.chat.components.part.CustomXmlRenderer +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering.CustomXmlRenderer import com.ai.assistance.operit.ui.common.markdown.StreamMarkdownRenderer import com.ai.assistance.operit.util.stream.asStream import kotlinx.coroutines.CancellationException diff --git a/app/src/main/java/com/ai/assistance/operit/ui/floating/ui/fullscreen/components/MessageDisplay.kt b/app/src/main/java/com/ai/assistance/operit/ui/floating/ui/fullscreen/components/MessageDisplay.kt index 64681aed6b..e4ec0e79f3 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/floating/ui/fullscreen/components/MessageDisplay.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/floating/ui/fullscreen/components/MessageDisplay.kt @@ -27,8 +27,8 @@ import androidx.compose.ui.graphics.CompositingStrategy import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.unit.dp import com.ai.assistance.operit.data.model.ChatMessage -import com.ai.assistance.operit.ui.features.conversation.chat.components.rememberChatMessageHeightMemory -import com.ai.assistance.operit.ui.features.conversation.chat.components.style.bubble.BubbleStyleChatMessage +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.list.rememberChatMessageHeightMemory +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.style.bubble.BubbleStyleChatMessage import com.ai.assistance.operit.ui.theme.LocalThemePreferenceSnapshot /** diff --git a/app/src/main/java/com/ai/assistance/operit/ui/floating/ui/window/components/AttachmentPanel.kt b/app/src/main/java/com/ai/assistance/operit/ui/floating/ui/window/components/AttachmentPanel.kt index 6da3244e4c..cf184a9b77 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/floating/ui/window/components/AttachmentPanel.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/floating/ui/window/components/AttachmentPanel.kt @@ -46,7 +46,7 @@ import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp -import com.ai.assistance.operit.ui.features.conversation.chat.components.PackageSelectorDialog +import com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.PackageSelectorDialog /** * 专为浮动窗口设计的简化附件选择面板 diff --git a/app/src/main/java/com/ai/assistance/operit/ui/floating/ui/window/components/ChatMessages.kt b/app/src/main/java/com/ai/assistance/operit/ui/floating/ui/window/components/ChatMessages.kt index 5d2d378d39..7bc9d4a032 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/floating/ui/window/components/ChatMessages.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/floating/ui/window/components/ChatMessages.kt @@ -5,7 +5,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import com.ai.assistance.operit.data.model.ChatMessage -import com.ai.assistance.operit.ui.features.conversation.chat.components.style.cursor.CursorStyleChatMessage +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.style.cursor.CursorStyleChatMessage /** 单个消息项组件 将消息渲染逻辑提取到单独的组件,减少重组范围 */ @Composable diff --git a/app/src/main/java/com/ai/assistance/operit/ui/floating/ui/window/components/FloatingChatWindowInputControls.kt b/app/src/main/java/com/ai/assistance/operit/ui/floating/ui/window/components/FloatingChatWindowInputControls.kt index f1134d2992..13b7beacc5 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/floating/ui/window/components/FloatingChatWindowInputControls.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/floating/ui/window/components/FloatingChatWindowInputControls.kt @@ -62,7 +62,7 @@ import androidx.compose.ui.unit.sp import com.ai.assistance.operit.R import com.ai.assistance.operit.api.chat.AIForegroundService import com.ai.assistance.operit.data.model.PromptFunctionType -import com.ai.assistance.operit.ui.features.conversation.chat.components.AttachmentChip +import com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.AttachmentChip import com.ai.assistance.operit.ui.floating.FloatContext import com.ai.assistance.operit.ui.floating.FloatingMode import com.ai.assistance.operit.ui.floating.ui.window.viewmodel.FloatingChatWindowModeViewModel diff --git a/app/src/main/java/com/ai/assistance/operit/ui/floating/ui/window/screen/FloatingChatWindowScreen.kt b/app/src/main/java/com/ai/assistance/operit/ui/floating/ui/window/screen/FloatingChatWindowScreen.kt index 0d4bb7a628..cf80201071 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/floating/ui/window/screen/FloatingChatWindowScreen.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/floating/ui/window/screen/FloatingChatWindowScreen.kt @@ -56,11 +56,11 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.style.TextOverflow -import com.ai.assistance.operit.ui.features.conversation.chat.components.AttachmentChip -import com.ai.assistance.operit.ui.features.conversation.chat.components.ChatMessageHeightMemory -import com.ai.assistance.operit.ui.features.conversation.chat.components.ScrollToBottomButton -import com.ai.assistance.operit.ui.features.conversation.chat.components.rememberChatMessageHeightMemory -import com.ai.assistance.operit.ui.features.conversation.chat.components.style.cursor.CursorStyleChatMessage +import com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.AttachmentChip +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.list.ChatMessageHeightMemory +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.navigation.ScrollToBottomButton +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.list.rememberChatMessageHeightMemory +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.style.cursor.CursorStyleChatMessage import com.ai.assistance.operit.ui.floating.ui.window.components.* import com.ai.assistance.operit.ui.floating.ui.window.models.* import com.ai.assistance.operit.ui.floating.ui.window.viewmodel.* diff --git a/app/src/main/java/com/ai/assistance/operit/ui/main/OperitApp.kt b/app/src/main/java/com/ai/assistance/operit/ui/main/OperitApp.kt index 802f09088e..ee63b07407 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/main/OperitApp.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/main/OperitApp.kt @@ -8,7 +8,7 @@ import androidx.compose.material3.DrawerValue import androidx.compose.material3.rememberDrawerState import androidx.compose.runtime.Composable import androidx.lifecycle.viewmodel.compose.viewModel -import com.ai.assistance.operit.ui.features.conversation.chat.sidebar.* +import com.ai.assistance.operit.ui.features.conversation.chat.modules.sidebar.* import com.ai.assistance.operit.ui.features.conversation.chat.viewmodel.ChatViewModel import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState @@ -59,11 +59,11 @@ import androidx.compose.runtime.DisposableEffect import com.ai.assistance.operit.R import com.ai.assistance.operit.ui.features.management.update.screens.UpdateScreen import com.ai.assistance.operit.util.logging.AppLogger -import com.ai.assistance.operit.ui.features.conversation.chat.sidebar.LocalMainChatSidebarState -import com.ai.assistance.operit.ui.features.conversation.chat.sidebar.LocalMainChatViewModel -import com.ai.assistance.operit.ui.features.conversation.chat.sidebar.LocalOpenMainChatSidebar -import com.ai.assistance.operit.ui.features.conversation.chat.sidebar.LocalRunMainChatAction -import com.ai.assistance.operit.ui.features.conversation.chat.sidebar.rememberChatSidebarState +import com.ai.assistance.operit.ui.features.conversation.chat.modules.sidebar.LocalMainChatSidebarState +import com.ai.assistance.operit.ui.features.conversation.chat.modules.sidebar.LocalMainChatViewModel +import com.ai.assistance.operit.ui.features.conversation.chat.modules.sidebar.LocalOpenMainChatSidebar +import com.ai.assistance.operit.ui.features.conversation.chat.modules.sidebar.LocalRunMainChatAction +import com.ai.assistance.operit.ui.features.conversation.chat.modules.sidebar.rememberChatSidebarState // 为TopAppBar的actions提供CompositionLocal // 它允许子组件(如AIChatScreen)向上提供它们的action Composable diff --git a/app/src/main/java/com/ai/assistance/operit/ui/main/components/AppContent.kt b/app/src/main/java/com/ai/assistance/operit/ui/main/components/AppContent.kt index d97f0cc782..3684415a1a 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/main/components/AppContent.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/main/components/AppContent.kt @@ -1,8 +1,8 @@ package com.ai.assistance.operit.ui.main.components import androidx.compose.foundation.background -import com.ai.assistance.operit.ui.features.conversation.chat.workspace.WorkspaceHubPage -import com.ai.assistance.operit.ui.features.conversation.chat.sidebar.LocalMainChatViewModel +import com.ai.assistance.operit.ui.features.conversation.workspace.hub.WorkspaceHubPage +import com.ai.assistance.operit.ui.features.conversation.chat.modules.sidebar.LocalMainChatViewModel import android.app.Activity import android.content.Context import android.content.ContextWrapper @@ -22,7 +22,7 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.statusBars import androidx.compose.foundation.layout.statusBarsPadding -import com.ai.assistance.operit.ui.features.conversation.chat.sidebar.MainChatControls +import com.ai.assistance.operit.ui.features.conversation.chat.modules.sidebar.MainChatControls import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.ArrowBack import androidx.compose.material.icons.filled.ChevronLeft diff --git a/app/src/main/java/com/ai/assistance/operit/ui/main/components/DrawerContent.kt b/app/src/main/java/com/ai/assistance/operit/ui/main/components/DrawerContent.kt index f356f98e62..a00ea833d2 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/main/components/DrawerContent.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/main/components/DrawerContent.kt @@ -60,11 +60,11 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import com.ai.assistance.operit.R -import com.ai.assistance.operit.ui.features.conversation.chat.sidebar.ChatSidebarContent -import com.ai.assistance.operit.ui.features.conversation.chat.sidebar.SidebarButtonSurface -import com.ai.assistance.operit.ui.features.conversation.chat.sidebar.LocalRunMainChatAction -import com.ai.assistance.operit.ui.features.conversation.chat.sidebar.LocalMainChatViewModel -import com.ai.assistance.operit.ui.features.conversation.chat.sidebar.LocalMainChatSidebarState +import com.ai.assistance.operit.ui.features.conversation.chat.modules.sidebar.ChatSidebarContent +import com.ai.assistance.operit.ui.features.conversation.chat.modules.sidebar.SidebarButtonSurface +import com.ai.assistance.operit.ui.features.conversation.chat.modules.sidebar.LocalRunMainChatAction +import com.ai.assistance.operit.ui.features.conversation.chat.modules.sidebar.LocalMainChatViewModel +import com.ai.assistance.operit.ui.features.conversation.chat.modules.sidebar.LocalMainChatSidebarState import com.ai.assistance.operit.ui.theme.LocalThemePreferenceSnapshot import com.ai.assistance.operit.core.tools.AIToolHandler import com.ai.assistance.operit.core.tools.packTool.PackageManager diff --git a/app/src/main/java/com/ai/assistance/operit/ui/main/screens/OperitScreens.kt b/app/src/main/java/com/ai/assistance/operit/ui/main/screens/OperitScreens.kt index bcaac6906c..77458cb8cf 100644 --- a/app/src/main/java/com/ai/assistance/operit/ui/main/screens/OperitScreens.kt +++ b/app/src/main/java/com/ai/assistance/operit/ui/main/screens/OperitScreens.kt @@ -27,8 +27,8 @@ import com.ai.assistance.operit.R import com.ai.assistance.operit.ui.common.NavItem import com.ai.assistance.operit.ui.features.support.about.screens.AboutScreen import com.ai.assistance.operit.ui.features.conversation.chat.screens.AIChatScreen -import com.ai.assistance.operit.ui.features.conversation.chat.sidebar.LocalMainChatViewModel -import com.ai.assistance.operit.ui.features.conversation.chat.sidebar.LocalRunMainChatAction +import com.ai.assistance.operit.ui.features.conversation.chat.modules.sidebar.LocalMainChatViewModel +import com.ai.assistance.operit.ui.features.conversation.chat.modules.sidebar.LocalRunMainChatAction import com.ai.assistance.operit.ui.features.support.demo.screens.ShizukuDemoScreen import com.ai.assistance.operit.ui.features.support.help.screens.HelpScreen import com.ai.assistance.operit.ui.features.conversation.memory.screens.MemoryScreen @@ -82,7 +82,7 @@ import com.ai.assistance.operit.ui.features.automation.terminal.EmbeddedTerminal import com.ai.assistance.operit.ui.features.automation.terminal.TerminalEntryScreen import com.ai.assistance.operit.ui.common.composedsl.ToolPkgComposeDslToolScreen import com.ai.assistance.operit.ui.main.screens.UIDebuggerToolScreen -import com.ai.assistance.operit.ui.features.conversation.chat.export.htmlpackager.HtmlPackagerScreen +import com.ai.assistance.operit.ui.features.conversation.chat.modules.export.htmlpackager.HtmlPackagerScreen import com.ai.assistance.operit.ui.features.management.settings.speech.stt.SpeechToTextToolScreen import com.ai.assistance.operit.ui.features.management.update.screens.UpdateScreen import com.ai.assistance.operit.ui.features.automation.workflow.screens.WorkflowListScreen diff --git a/app/src/main/java/com/ai/assistance/operit/util/files/FileUtils.kt b/app/src/main/java/com/ai/assistance/operit/util/files/FileUtils.kt index a0b598cae5..bb142568f9 100644 --- a/app/src/main/java/com/ai/assistance/operit/util/files/FileUtils.kt +++ b/app/src/main/java/com/ai/assistance/operit/util/files/FileUtils.kt @@ -242,7 +242,7 @@ object FileUtils { if (!file.isFile) return false // Use GitIgnoreFilter to check if the file should be ignored - if (com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.process.GitIgnoreFilter.shouldIgnore(file, workspaceRoot, gitignoreRules)) { + if (com.ai.assistance.operit.ui.features.conversation.workspace.process.GitIgnoreFilter.shouldIgnore(file, workspaceRoot, gitignoreRules)) { return false } diff --git a/app/src/main/res/values-en/strings_workspace_transfer.xml b/app/src/main/res/values-en/strings_workspace_transfer.xml new file mode 100644 index 0000000000..5c2bf61d9c --- /dev/null +++ b/app/src/main/res/values-en/strings_workspace_transfer.xml @@ -0,0 +1,22 @@ + + + Copying... + Moving... + Counting files... + Processing... + Removing source... + Name + From + To + Copied + Remaining + Speed + Item %1$d / %2$d · Current item progress + Files: %1$d / %2$d + %1$d%% + Cancelling... + Deleting... + Deleted %1$d / %2$d items + Progress counts selected items, not files inside each directory. + Cancel stops subsequent items after the current deletion returns. Deleted content is not restored. + diff --git a/app/src/main/res/values-es/strings_workspace_transfer.xml b/app/src/main/res/values-es/strings_workspace_transfer.xml new file mode 100644 index 0000000000..7f793effe2 --- /dev/null +++ b/app/src/main/res/values-es/strings_workspace_transfer.xml @@ -0,0 +1,22 @@ + + + Copiando... + Moviendo... + Contando archivos... + Procesando... + Eliminando el origen... + Nombre + Origen + Destino + Copiado + Restante + Velocidad + Elemento %1$d / %2$d · Progreso del elemento actual + Archivos: %1$d / %2$d + %1$d%% + Cancelando... + Eliminando... + %1$d / %2$d elementos eliminados + El progreso cuenta los elementos seleccionados, no los archivos de cada carpeta. + Cancelar detiene los siguientes elementos al terminar la eliminación actual. El contenido eliminado no se restaura. + diff --git a/app/src/main/res/values-id/strings_workspace_transfer.xml b/app/src/main/res/values-id/strings_workspace_transfer.xml new file mode 100644 index 0000000000..af2f292f31 --- /dev/null +++ b/app/src/main/res/values-id/strings_workspace_transfer.xml @@ -0,0 +1,22 @@ + + + Menyalin... + Memindahkan... + Menghitung file... + Memproses... + Menghapus sumber... + Nama + Dari + Ke + Disalin + Tersisa + Kecepatan + Item %1$d / %2$d · Progres item saat ini + File: %1$d / %2$d + %1$d%% + Membatalkan... + Menghapus... + %1$d / %2$d item dihapus + Progres menghitung item yang dipilih, bukan file di dalam setiap folder. + Pembatalan menghentikan item berikutnya setelah penghapusan saat ini selesai. Konten yang dihapus tidak dipulihkan. + diff --git a/app/src/main/res/values-ja/strings_workspace_transfer.xml b/app/src/main/res/values-ja/strings_workspace_transfer.xml new file mode 100644 index 0000000000..7775728275 --- /dev/null +++ b/app/src/main/res/values-ja/strings_workspace_transfer.xml @@ -0,0 +1,22 @@ + + + コピー中... + 移動中... + ファイルを集計中... + 処理中... + コピー元を削除中... + 名前 + コピー元 + コピー先 + コピー済み + 残り + 速度 + %1$d / %2$d 項目 · 現在の項目の進捗 + ファイル:%1$d / %2$d + %1$d%% + キャンセル中... + 削除中... + %1$d / %2$d 項目を削除済み + 進捗は選択した項目数です。各フォルダー内の進捗は不明です。 + キャンセルすると現在の削除処理が戻った後に次の項目を停止します。削除済みの内容は復元されません。 + diff --git a/app/src/main/res/values-ko/strings_workspace_transfer.xml b/app/src/main/res/values-ko/strings_workspace_transfer.xml new file mode 100644 index 0000000000..2fe0e21a47 --- /dev/null +++ b/app/src/main/res/values-ko/strings_workspace_transfer.xml @@ -0,0 +1,22 @@ + + + 복사 중... + 이동 중... + 파일 집계 중... + 처리 중... + 원본 삭제 중... + 이름 + 원본 + 대상 + 복사됨 + 남은 용량 + 속도 + 항목 %1$d / %2$d · 현재 항목 진행률 + 파일: %1$d / %2$d + %1$d%% + 취소 중... + 삭제 중... + %1$d / %2$d개 항목 삭제됨 + 진행률은 선택한 항목 기준이며 각 폴더 내부의 진행률은 알 수 없습니다. + 취소하면 현재 삭제가 반환된 후 다음 항목부터 중지합니다. 이미 삭제된 내용은 복원되지 않습니다. + diff --git a/app/src/main/res/values-ms/strings_workspace_transfer.xml b/app/src/main/res/values-ms/strings_workspace_transfer.xml new file mode 100644 index 0000000000..bcf1415ce8 --- /dev/null +++ b/app/src/main/res/values-ms/strings_workspace_transfer.xml @@ -0,0 +1,22 @@ + + + Menyalin... + Memindahkan... + Mengira fail... + Memproses... + Memadam sumber... + Nama + Dari + Ke + Disalin + Baki + Kelajuan + Item %1$d / %2$d · Kemajuan item semasa + Fail: %1$d / %2$d + %1$d%% + Membatalkan... + Memadam... + %1$d / %2$d item dipadam + Kemajuan mengira item yang dipilih, bukan fail dalam setiap folder. + Pembatalan menghentikan item seterusnya selepas pemadaman semasa selesai. Kandungan yang dipadam tidak dipulihkan. + diff --git a/app/src/main/res/values-pt-rBR/strings_workspace_transfer.xml b/app/src/main/res/values-pt-rBR/strings_workspace_transfer.xml new file mode 100644 index 0000000000..ea8dc5b9ba --- /dev/null +++ b/app/src/main/res/values-pt-rBR/strings_workspace_transfer.xml @@ -0,0 +1,22 @@ + + + Copiando... + Movendo... + Contando arquivos... + Processando... + Removendo origem... + Nome + Origem + Destino + Copiado + Restante + Velocidade + Item %1$d / %2$d · Progresso do item atual + Arquivos: %1$d / %2$d + %1$d%% + Cancelando... + Excluindo... + %1$d / %2$d itens excluídos + O progresso conta os itens selecionados, não os arquivos de cada pasta. + Cancelar interrompe os próximos itens após a exclusão atual retornar. O conteúdo excluído não é restaurado. + diff --git a/app/src/main/res/values-ro/strings_workspace_transfer.xml b/app/src/main/res/values-ro/strings_workspace_transfer.xml new file mode 100644 index 0000000000..684a77b435 --- /dev/null +++ b/app/src/main/res/values-ro/strings_workspace_transfer.xml @@ -0,0 +1,22 @@ + + + Se copiază... + Se mută... + Se numără fișierele... + Se procesează... + Se șterge sursa... + Nume + Sursă + Destinație + Copiat + Rămas + Viteză + Element %1$d / %2$d · Progresul elementului curent + Fișiere: %1$d / %2$d + %1$d%% + Se anulează... + Se șterge... + %1$d / %2$d elemente șterse + Progresul numără elementele selectate, nu fișierele din fiecare dosar. + Anularea oprește elementele următoare după încheierea ștergerii curente. Conținutul șters nu este restaurat. + diff --git a/app/src/main/res/values/strings_workspace_transfer.xml b/app/src/main/res/values/strings_workspace_transfer.xml new file mode 100644 index 0000000000..aae17048c3 --- /dev/null +++ b/app/src/main/res/values/strings_workspace_transfer.xml @@ -0,0 +1,22 @@ + + + 正在复制... + 正在移动... + 正在统计文件... + 正在处理... + 正在清理来源... + 名称 + 来源 + 目标 + 已复制 + 剩余 + 速度 + 第 %1$d / %2$d 项 · 当前项进度 + 文件:%1$d / %2$d + %1$d%% + 正在取消... + 正在删除... + 已删除 %1$d / %2$d 项 + 进度按所选项目计数,单个目录内部的进度未知。 + 取消将在当前删除返回后停止后续项目,已删除内容不会恢复。 + diff --git a/app/src/test/java/com/ai/assistance/operit/core/files/transfer/StreamingFileCopyTest.kt b/app/src/test/java/com/ai/assistance/operit/core/files/transfer/StreamingFileCopyTest.kt new file mode 100644 index 0000000000..b7d29ae84a --- /dev/null +++ b/app/src/test/java/com/ai/assistance/operit/core/files/transfer/StreamingFileCopyTest.kt @@ -0,0 +1,176 @@ +package com.ai.assistance.operit.core.files.transfer + +import java.io.File +import java.io.IOException +import java.nio.file.FileAlreadyExistsException +import java.nio.file.Files +import java.nio.file.Paths +import java.security.MessageDigest +import java.util.concurrent.CancellationException +import org.junit.Assert.assertArrayEquals +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertThrows +import org.junit.Assert.assertTrue +import org.junit.Rule +import org.junit.Test +import org.junit.rules.TemporaryFolder + +class StreamingFileCopyTest { + @get:Rule val temporary = TemporaryFolder() + + private fun digest(file: File): ByteArray { + val digest = MessageDigest.getInstance("SHA-256") + val buffer = ByteArray(64 * 1024) + file.inputStream().use { input -> + while (true) { + val count = input.read(buffer) + if (count < 0) break + digest.update(buffer, 0, count) + } + } + return digest.digest() + } + + @Test fun binaryLargerThanFiftyMiBIsCopiedWithoutTextConversion() { + val source = temporary.newFile("binary.dat") + val destination = File(temporary.root, "result.dat") + // 测试输入自身也逐块生成,不能让测试通过分配整文件字节数组掩盖问题。 + val pattern = ByteArray(256 * 1024) { ((it * 37 + 129) % 256).toByte() } + source.outputStream().use { output -> repeat(256) { output.write(pattern) } } + val progress = mutableListOf() + val result = StreamingFileCopy.copy(source, destination, onProgress = { progress += it }) + assertEquals(64L * 1024 * 1024, destination.length()) + assertArrayEquals(digest(source), digest(destination)) + assertEquals(source.length(), result.copiedBytes) + assertEquals(source.length(), result.totalBytes) + assertEquals(FileCopyPhase.SCANNING, progress.first().phase) + assertEquals(null, progress.first().totalBytes) + assertEquals(FileCopyPhase.COMPLETED, progress.last().phase) + assertEquals(1f, result.fraction) + assertTrue(progress.filter { it.phase != FileCopyPhase.COMPLETED }.all { it.fraction != 1f }) + } + + @Test fun directoryIncludesHiddenFilesEmptyDirectoriesAndZeroByteFiles() { + val source = temporary.newFolder("source") + File(source, ".git/objects").mkdirs() + File(source, ".git/objects/binary").writeBytes(byteArrayOf(0, -1, -2, 10)) + File(source, "empty").mkdir() + File(source, "zero").createNewFile() + repeat(80) { File(source, "item-$it").writeText("内容$it") } + val destination = File(temporary.root, "copied") + val result = StreamingFileCopy.copy(source, destination) + assertTrue(File(destination, "empty").isDirectory) + assertTrue(File(destination, "zero").isFile) + assertArrayEquals(byteArrayOf(0, -1, -2, 10), File(destination, ".git/objects/binary").readBytes()) + repeat(80) { assertEquals("内容$it", File(destination, "item-$it").readText()) } + assertEquals(82L, result.copiedFiles) + assertEquals(0L, result.remainingBytes) + } + + @Test fun symbolicDirectoryLinksAreCopiedWithoutFollowingTheirTargets() { + val source = temporary.newFolder("links") + File(source, "data").writeBytes(byteArrayOf(1, 2, 3)) + Files.createSymbolicLink(File(source, "loop").toPath(), Paths.get(".")) + val destination = File(temporary.root, "links-copy") + val result = StreamingFileCopy.copy(source, destination) + assertEquals(Paths.get("."), Files.readSymbolicLink(File(destination, "loop").toPath())) + assertEquals(2L, result.copiedFiles) + assertEquals(3L, result.copiedBytes) + } + + @Test fun samePathDescendantAndAliasedDescendantAreRejectedBeforeWriting() { + val source = temporary.newFolder("parent") + File(source, "child").mkdir() + assertThrows(IllegalArgumentException::class.java) { StreamingFileCopy.copy(source, source) } + val descendant = File(source, "child/../copy") + assertThrows(IllegalArgumentException::class.java) { StreamingFileCopy.copy(source, descendant) } + val alias = File(temporary.root, "alias") + Files.createSymbolicLink(alias.toPath(), source.toPath()) + assertThrows(IllegalArgumentException::class.java) { StreamingFileCopy.copy(source, File(alias, "copy")) } + assertFalse(File(source, "copy").exists()) + } + + @Test fun existingDestinationIsProtectedAndExplicitOverwriteTruncatesIt() { + val source = temporary.newFile("new-data").apply { writeBytes(byteArrayOf(0, -1)) } + val destination = temporary.newFile("old-data").apply { writeText("original content") } + assertThrows(FileAlreadyExistsException::class.java) { StreamingFileCopy.copy(source, destination) } + assertEquals("original content", destination.readText()) + StreamingFileCopy.copy(source, destination, overwrite = true) + assertArrayEquals(byteArrayOf(0, -1), destination.readBytes()) + } + + @Test fun failedDirectoryCopyDoesNotReportCompletionOrRemoveItsSource() { + val source = temporary.newFolder("failure-source") + File(source, "data").writeText("保留来源") + val blockedParent = temporary.newFile("blocked") + val progress = mutableListOf() + assertThrows(IOException::class.java) { + StreamingFileCopy.copy(source, File(blockedParent, "result"), onProgress = { progress += it }) + } + assertEquals("保留来源", File(source, "data").readText()) + assertTrue(progress.none { it.phase == FileCopyPhase.COMPLETED }) + } + + @Test fun cancellationDuringAFileStopsBeforeCompletionAndRetainsSource() { + val source = temporary.newFile("cancel-source") + val buffer = ByteArray(StreamingFileCopy.BUFFER_SIZE) { 31 } + source.outputStream().use { output -> repeat(4) { output.write(buffer) } } + val destination = File(temporary.root, "cancel-target") + val progress = mutableListOf() + assertThrows(CancellationException::class.java) { + StreamingFileCopy.copy(source, destination, onProgress = { progress += it }, checkCancelled = { + if (destination.length() >= StreamingFileCopy.BUFFER_SIZE) throw CancellationException("取消复制") + }) + } + assertEquals(4L * StreamingFileCopy.BUFFER_SIZE, source.length()) + assertTrue(destination.length() < source.length()) + assertTrue(progress.none { it.phase == FileCopyPhase.COMPLETED }) + } + + @Test fun sourceTreeChangesAreReportedAsFailureRatherThanCompleteProgress() { + val source = temporary.newFolder("changing-source") + File(source, "first").writeText("first") + val destination = File(temporary.root, "changing-target") + var changed = false + val progress = mutableListOf() + assertThrows(IOException::class.java) { + StreamingFileCopy.copy(source, destination, onProgress = { + progress += it + if (!changed && it.phase == FileCopyPhase.COPYING) { + changed = true + File(source, "added").writeText("added") + } + }) + } + assertTrue(source.exists()) + assertTrue(progress.none { it.phase == FileCopyPhase.COMPLETED }) + } + + @Test fun destinationCreatedDuringScanningIsNotMergedOrOverwritten() { + val source = temporary.newFolder("conflict-source") + File(source, "data").writeText("source") + val destination = File(temporary.root, "conflict-target") + assertThrows(FileAlreadyExistsException::class.java) { + StreamingFileCopy.copy(source, destination, onProgress = { + if (it.phase == FileCopyPhase.COPYING && !destination.exists()) { + destination.mkdir() + File(destination, "existing").writeText("保留目标") + } + }) + } + assertEquals("保留目标", File(destination, "existing").readText()) + assertFalse(File(destination, "data").exists()) + } + + @Test fun emptyDirectoryCompletesWithZeroBytesAndRecursiveFlagIsEnforced() { + val source = temporary.newFolder("empty-source") + val destination = File(temporary.root, "empty-target") + assertThrows(IllegalArgumentException::class.java) { StreamingFileCopy.copy(source, destination, recursive = false) } + assertFalse(destination.exists()) + val result = StreamingFileCopy.copy(source, destination) + assertTrue(destination.isDirectory) + assertEquals(0L, result.copiedBytes) + assertEquals(1f, result.fraction) + } +} \ No newline at end of file diff --git a/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/components/TokenHitRateFormatTest.kt b/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/format/TokenHitRateFormatTest.kt similarity index 93% rename from app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/components/TokenHitRateFormatTest.kt rename to app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/format/TokenHitRateFormatTest.kt index 754fb1be26..2e3c1d4600 100644 --- a/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/components/TokenHitRateFormatTest.kt +++ b/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/format/TokenHitRateFormatTest.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components +package com.ai.assistance.operit.ui.features.conversation.chat.foundation.format import org.junit.Assert.assertEquals import org.junit.Test diff --git a/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/components/PastedTextAttachmentTest.kt b/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/PastedTextAttachmentTest.kt similarity index 96% rename from app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/components/PastedTextAttachmentTest.kt rename to app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/PastedTextAttachmentTest.kt index 549269c937..ab5b4f4c7b 100644 --- a/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/components/PastedTextAttachmentTest.kt +++ b/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/PastedTextAttachmentTest.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components +package com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments import androidx.compose.ui.text.TextRange import androidx.compose.ui.text.input.TextFieldValue diff --git a/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/attachments/images/GalleryDragSelectionTest.kt b/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/images/GalleryDragSelectionTest.kt similarity index 91% rename from app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/attachments/images/GalleryDragSelectionTest.kt rename to app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/images/GalleryDragSelectionTest.kt index 2255e7f3a8..17f19fcd82 100644 --- a/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/attachments/images/GalleryDragSelectionTest.kt +++ b/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/images/GalleryDragSelectionTest.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.attachments.images +package com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.images import org.junit.Assert.assertEquals import org.junit.Test diff --git a/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/attachments/images/ImagePreviewTransformTest.kt b/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/images/ImagePreviewTransformTest.kt similarity index 96% rename from app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/attachments/images/ImagePreviewTransformTest.kt rename to app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/images/ImagePreviewTransformTest.kt index 963352ea60..4cc348cf9b 100644 --- a/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/attachments/images/ImagePreviewTransformTest.kt +++ b/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/images/ImagePreviewTransformTest.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.attachments.images +package com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.images import androidx.compose.ui.geometry.Offset import androidx.compose.ui.geometry.Size diff --git a/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/attachments/images/SentImageSourcesTest.kt b/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/images/SentImageSourcesTest.kt similarity index 96% rename from app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/attachments/images/SentImageSourcesTest.kt rename to app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/images/SentImageSourcesTest.kt index cc2e28d642..537831a687 100644 --- a/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/attachments/images/SentImageSourcesTest.kt +++ b/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/images/SentImageSourcesTest.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.attachments.images +package com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.images import org.junit.Assert.* import org.junit.Test diff --git a/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/folders/FolderChatHistoryTreeTest.kt b/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/history/folders/FolderChatHistoryTreeTest.kt similarity index 98% rename from app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/folders/FolderChatHistoryTreeTest.kt rename to app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/history/folders/FolderChatHistoryTreeTest.kt index f1d8e6b4c5..33778b9259 100644 --- a/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/folders/FolderChatHistoryTreeTest.kt +++ b/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/history/folders/FolderChatHistoryTreeTest.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.folders +package com.ai.assistance.operit.ui.features.conversation.chat.modules.history.folders import com.ai.assistance.operit.data.chat.folders.ChatFolder import com.ai.assistance.operit.data.chat.folders.ChatFolderBinding diff --git a/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/components/ChatAreaTokenSpeedTest.kt b/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/ChatAreaTokenSpeedTest.kt similarity index 76% rename from app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/components/ChatAreaTokenSpeedTest.kt rename to app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/ChatAreaTokenSpeedTest.kt index ad89bc0b59..0510d47251 100644 --- a/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/components/ChatAreaTokenSpeedTest.kt +++ b/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/ChatAreaTokenSpeedTest.kt @@ -1,6 +1,6 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components +package com.ai.assistance.operit.ui.features.conversation.chat.modules.messages -import com.ai.assistance.operit.ui.features.conversation.chat.components.details.calculateMessageTokenSpeed +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.details.calculateMessageTokenSpeed import org.junit.Assert.assertEquals import org.junit.Assert.assertNull import org.junit.Test diff --git a/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/components/MessageCopyTextTest.kt b/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/MessageCopyTextTest.kt similarity index 99% rename from app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/components/MessageCopyTextTest.kt rename to app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/MessageCopyTextTest.kt index 61cf2cdfc3..a81a7e9cff 100644 --- a/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/components/MessageCopyTextTest.kt +++ b/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/MessageCopyTextTest.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components +package com.ai.assistance.operit.ui.features.conversation.chat.modules.messages import com.ai.assistance.operit.data.model.ChatMessage import com.ai.assistance.operit.data.model.ChatMessageDisplayMode diff --git a/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/components/details/MessageStatsFormattingTest.kt b/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/details/MessageStatsFormattingTest.kt similarity index 96% rename from app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/components/details/MessageStatsFormattingTest.kt rename to app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/details/MessageStatsFormattingTest.kt index c8cbba1507..89e56a6b9a 100644 --- a/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/components/details/MessageStatsFormattingTest.kt +++ b/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/details/MessageStatsFormattingTest.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components.details +package com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.details import java.util.Locale import org.junit.Assert.assertEquals diff --git a/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/components/MessageEditorContentTest.kt b/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/editor/MessageEditorContentTest.kt similarity index 99% rename from app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/components/MessageEditorContentTest.kt rename to app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/editor/MessageEditorContentTest.kt index fe937286c0..db0707f7ab 100644 --- a/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/components/MessageEditorContentTest.kt +++ b/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/editor/MessageEditorContentTest.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components +package com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.editor import com.ai.assistance.operit.core.chat.protocol.ThinkingMarkup import org.junit.Assert.assertEquals diff --git a/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/StatusCardHtmlDocumentTest.kt b/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/StatusCardHtmlDocumentTest.kt similarity index 97% rename from app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/StatusCardHtmlDocumentTest.kt rename to app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/StatusCardHtmlDocumentTest.kt index 598cc38350..12358031c3 100644 --- a/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/StatusCardHtmlDocumentTest.kt +++ b/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/StatusCardHtmlDocumentTest.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components.part +package com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering import java.io.File import java.security.MessageDigest diff --git a/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/ThinkToolsRowsTest.kt b/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/ThinkToolsRowsTest.kt similarity index 97% rename from app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/ThinkToolsRowsTest.kt rename to app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/ThinkToolsRowsTest.kt index b6d7d114e5..1c090c5da8 100644 --- a/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/ThinkToolsRowsTest.kt +++ b/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/ThinkToolsRowsTest.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components.part +package com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering import com.ai.assistance.operit.ui.common.markdown.MarkdownGroupedItem import com.ai.assistance.operit.util.markdown.MarkdownNodeStable @@ -7,7 +7,7 @@ import org.junit.Assert.assertEquals import org.junit.Assert.assertFalse import org.junit.Assert.assertTrue import org.junit.Test -import com.ai.assistance.operit.ui.features.conversation.chat.components.timeline.shouldSplitChatMessage +import com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.timeline.shouldSplitChatMessage import com.ai.assistance.operit.ui.common.markdown.lazy.markdownNodeIdentityKeys import com.ai.assistance.operit.ui.common.markdown.lazy.splitPlainMarkdownNode diff --git a/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/ThinkingMarkdownStreamTest.kt b/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/ThinkingMarkdownStreamTest.kt similarity index 98% rename from app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/ThinkingMarkdownStreamTest.kt rename to app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/ThinkingMarkdownStreamTest.kt index 408d35ce1a..55cee85913 100644 --- a/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/ThinkingMarkdownStreamTest.kt +++ b/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/ThinkingMarkdownStreamTest.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components.part +package com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering import com.ai.assistance.operit.core.chat.protocol.ThinkingMarkup import com.ai.assistance.operit.util.stream.StreamLogger diff --git a/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/tooltiming/ToolTimingIndexTest.kt b/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/tooltiming/ToolTimingIndexTest.kt similarity index 97% rename from app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/tooltiming/ToolTimingIndexTest.kt rename to app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/tooltiming/ToolTimingIndexTest.kt index b54440df2e..e053c096ba 100644 --- a/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/tooltiming/ToolTimingIndexTest.kt +++ b/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/tooltiming/ToolTimingIndexTest.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components.part.tooltiming +package com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering.tooltiming import com.ai.assistance.operit.core.chat.tools.timing.ToolExecutionTiming import com.ai.assistance.operit.data.model.tooltiming.ToolCallExecution diff --git a/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/bubble/BubbleImageLayoutTest.kt b/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/style/bubble/BubbleImageLayoutTest.kt similarity index 98% rename from app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/bubble/BubbleImageLayoutTest.kt rename to app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/style/bubble/BubbleImageLayoutTest.kt index 8b3b2ea7aa..4e52a559a2 100644 --- a/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/bubble/BubbleImageLayoutTest.kt +++ b/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/style/bubble/BubbleImageLayoutTest.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.components.style.bubble +package com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.style.bubble import org.junit.Assert.assertEquals import org.junit.Assert.assertTrue diff --git a/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/batch/ChatBatchControllerTest.kt b/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/viewmodel/history/ChatBatchControllerTest.kt similarity index 91% rename from app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/batch/ChatBatchControllerTest.kt rename to app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/viewmodel/history/ChatBatchControllerTest.kt index da849e2daa..d1891902f4 100644 --- a/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/batch/ChatBatchControllerTest.kt +++ b/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/viewmodel/history/ChatBatchControllerTest.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.batch +package com.ai.assistance.operit.ui.features.conversation.chat.viewmodel.history import kotlinx.coroutines.CancellationException import kotlinx.coroutines.ExperimentalCoroutinesApi @@ -7,6 +7,10 @@ import kotlinx.coroutines.test.advanceUntilIdle import kotlinx.coroutines.test.runTest import org.junit.Assert.* import org.junit.Test +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.model.ChatBatchAction +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.model.ChatBatchItemResult +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.model.ChatBatchProgress +import com.ai.assistance.operit.ui.features.conversation.chat.foundation.model.ChatBatchSummary @OptIn(ExperimentalCoroutinesApi::class) class ChatBatchControllerTest { diff --git a/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/motion/ChatListMotionStateTest.kt b/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/viewmodel/history/ChatListMotionStateTest.kt similarity index 96% rename from app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/motion/ChatListMotionStateTest.kt rename to app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/viewmodel/history/ChatListMotionStateTest.kt index b39847ca88..cf67380553 100644 --- a/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/motion/ChatListMotionStateTest.kt +++ b/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/viewmodel/history/ChatListMotionStateTest.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.motion +package com.ai.assistance.operit.ui.features.conversation.chat.viewmodel.history import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runCurrent diff --git a/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/browser/FileBrowserClipboardTest.kt b/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/FileBrowserClipboardTest.kt similarity index 94% rename from app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/browser/FileBrowserClipboardTest.kt rename to app/src/test/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/FileBrowserClipboardTest.kt index 45d5f19b0f..b73c488828 100644 --- a/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/browser/FileBrowserClipboardTest.kt +++ b/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/FileBrowserClipboardTest.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.browser +package com.ai.assistance.operit.ui.features.conversation.workspace.browser import org.junit.After import org.junit.Assert.assertEquals diff --git a/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/browser/WorkspaceBrowserSupportTest.kt b/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/WorkspaceBrowserSupportTest.kt similarity index 96% rename from app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/browser/WorkspaceBrowserSupportTest.kt rename to app/src/test/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/WorkspaceBrowserSupportTest.kt index a367688fd0..806bef22bd 100644 --- a/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/browser/WorkspaceBrowserSupportTest.kt +++ b/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/WorkspaceBrowserSupportTest.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.browser +package com.ai.assistance.operit.ui.features.conversation.workspace.browser import java.time.LocalDateTime import java.time.ZoneId diff --git a/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/transfer/WorkspaceDeleteOperationTest.kt b/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/transfer/WorkspaceDeleteOperationTest.kt new file mode 100644 index 0000000000..dc6ad5473a --- /dev/null +++ b/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/transfer/WorkspaceDeleteOperationTest.kt @@ -0,0 +1,141 @@ +package com.ai.assistance.operit.ui.features.conversation.workspace.browser.transfer + +import com.ai.assistance.operit.ui.features.conversation.workspace.browser.FileBrowserClipboardItem +import java.io.IOException +import kotlinx.coroutines.cancel +import kotlinx.coroutines.currentCoroutineContext +import kotlinx.coroutines.launch +import kotlinx.coroutines.runBlocking +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertNull +import org.junit.Assert.assertTrue +import org.junit.Assert.fail +import org.junit.Test + +class WorkspaceDeleteOperationTest { + private fun item(name: String, environment: String? = null, directory: Boolean = false) = + FileBrowserClipboardItem("/selected/$name", environment, cut = false, isDirectory = directory) + + @Test fun singleDirectoryRemainsIndeterminateUntilItsToolReturnsSuccess() = runBlocking { + val target = item("folder", "linux", directory = true) + lateinit var operation: WorkspaceDeleteOperation + operation = WorkspaceDeleteOperation { + assertEquals(target, it) + val progress = checkNotNull(operation.progress.value) + assertEquals(target, progress.target) + assertEquals(0, progress.completedItems) + assertEquals(1, progress.totalItems) + assertNull(progress.fraction) + } + var notified = false + operation.run(listOf(target)) { + notified = true + val progress = checkNotNull(operation.progress.value) + assertEquals(1, progress.completedItems) + assertEquals(1f, checkNotNull(progress.fraction), 0f) + } + assertTrue(notified) + assertNull(operation.progress.value) + } + + @Test fun batchProgressCountsOnlySuccessfulSelectedItemsAcrossEnvironments() = runBlocking { + val targets = listOf(item("local"), item("ubuntu", "linux", true), item("document", "repo:docs")) + val before = mutableListOf() + val after = mutableListOf() + val deleted = mutableListOf() + lateinit var operation: WorkspaceDeleteOperation + operation = WorkspaceDeleteOperation { before += checkNotNull(operation.progress.value) } + operation.run(targets) { + deleted += it + after += checkNotNull(operation.progress.value) + } + assertEquals(targets, before.map { it.target }) + assertEquals(listOf(0, 1, 2), before.map { it.completedItems }) + assertEquals(listOf(1, 2, 3), after.map { it.completedItems }) + assertEquals(targets, deleted) + assertEquals(1f / 3f, checkNotNull(before[1].fraction), 0f) + assertTrue(before.all { checkNotNull(it.fraction) < 1f }) + assertEquals(1f, checkNotNull(after.last().fraction), 0f) + assertNull(operation.progress.value) + } + + @Test fun failureIsNotCountedAndRemainingItemsAreNotStarted() = runBlocking { + val targets = listOf(item("first"), item("failed"), item("remaining")) + val attempted = mutableListOf() + val deleted = mutableListOf() + val operation = WorkspaceDeleteOperation { + attempted += it + if (it == targets[1]) throw IOException("删除失败") + } + try { + operation.run(targets) { deleted += it } + fail("应传播工具删除错误") + } catch (e: IOException) { + assertEquals("删除失败", e.message) + } + assertEquals(targets.take(2), attempted) + assertEquals(targets.take(1), deleted) + assertNull(operation.progress.value) + } + + @Test fun cancellingWhileCurrentToolRunsStopsTheNextItemWithoutUndoingSuccess() = runBlocking { + val targets = listOf(item("current"), item("remaining")) + val attempted = mutableListOf() + val deleted = mutableListOf() + val operation = WorkspaceDeleteOperation { + attempted += it + // 模拟同步工具收到取消后仍返回成功:已删除项不能被视作撤销。 + currentCoroutineContext().cancel() + } + val task = launch { operation.run(targets) { deleted += it } } + task.join() + assertTrue(task.isCancelled) + assertEquals(targets.take(1), attempted) + assertEquals(targets.take(1), deleted) + assertNull(operation.progress.value) + } + + @Test fun alreadyCancelledOperationNeverStartsDeletion() = runBlocking { + var invoked = false + val operation = WorkspaceDeleteOperation { invoked = true } + val task = launch { + currentCoroutineContext().cancel() + operation.run(listOf(item("not-started"))) + } + task.join() + assertTrue(task.isCancelled) + assertFalse(invoked) + assertNull(operation.progress.value) + } + + @Test fun emptySelectionDoesNotOpenProgressOrInvokeTools() = runBlocking { + var invoked = false + var notified = false + val operation = WorkspaceDeleteOperation { invoked = true } + operation.run(emptyList()) { notified = true } + assertFalse(invoked) + assertFalse(notified) + assertNull(operation.progress.value) + } + + @Test fun nextOperationStartsWithFreshProgressAfterFailure() = runBlocking { + val failed = item("failed") + val next = item("next") + lateinit var operation: WorkspaceDeleteOperation + operation = WorkspaceDeleteOperation { + if (it == failed) throw IOException("删除失败") + assertEquals(next, checkNotNull(operation.progress.value).target) + assertEquals(0, checkNotNull(operation.progress.value).completedItems) + assertEquals(1, checkNotNull(operation.progress.value).totalItems) + } + try { + operation.run(listOf(failed, item("unprocessed"))) + fail("应传播工具删除错误") + } catch (e: IOException) { + assertNull(operation.progress.value) + } + operation.run(listOf(next)) + assertNull(operation.progress.value) + } +} diff --git a/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/WorkspaceCommentSyntaxTest.kt b/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/WorkspaceCommentSyntaxTest.kt similarity index 92% rename from app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/WorkspaceCommentSyntaxTest.kt rename to app/src/test/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/WorkspaceCommentSyntaxTest.kt index f53df4d524..7c6edcfde8 100644 --- a/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/WorkspaceCommentSyntaxTest.kt +++ b/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/WorkspaceCommentSyntaxTest.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor +package com.ai.assistance.operit.ui.features.conversation.workspace.editor import org.junit.Assert.* import org.junit.Test diff --git a/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/links/WorkspaceFileLinkTest.kt b/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/workspace/links/WorkspaceFileLinkTest.kt similarity index 98% rename from app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/links/WorkspaceFileLinkTest.kt rename to app/src/test/java/com/ai/assistance/operit/ui/features/conversation/workspace/links/WorkspaceFileLinkTest.kt index 1b007f5103..669ab1739b 100644 --- a/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/links/WorkspaceFileLinkTest.kt +++ b/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/workspace/links/WorkspaceFileLinkTest.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.links +package com.ai.assistance.operit.ui.features.conversation.workspace.links import org.junit.Assert.assertEquals import org.junit.Assert.assertNull diff --git a/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/links/WorkspaceMarkdownLinkTest.kt b/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/workspace/links/WorkspaceMarkdownLinkTest.kt similarity index 98% rename from app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/links/WorkspaceMarkdownLinkTest.kt rename to app/src/test/java/com/ai/assistance/operit/ui/features/conversation/workspace/links/WorkspaceMarkdownLinkTest.kt index 447ff8c5ef..a4a476b558 100644 --- a/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/links/WorkspaceMarkdownLinkTest.kt +++ b/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/workspace/links/WorkspaceMarkdownLinkTest.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.links +package com.ai.assistance.operit.ui.features.conversation.workspace.links import org.junit.Assert.assertEquals import org.junit.Assert.assertNull diff --git a/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/search/WorkspaceTextSearchTest.kt b/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/workspace/search/WorkspaceTextSearchTest.kt similarity index 90% rename from app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/search/WorkspaceTextSearchTest.kt rename to app/src/test/java/com/ai/assistance/operit/ui/features/conversation/workspace/search/WorkspaceTextSearchTest.kt index e4ee6b69cd..27f3765a10 100644 --- a/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/search/WorkspaceTextSearchTest.kt +++ b/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/workspace/search/WorkspaceTextSearchTest.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.search +package com.ai.assistance.operit.ui.features.conversation.workspace.search import org.junit.Assert.assertEquals import org.junit.Test diff --git a/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/text/WorkspaceTextReadPolicyTest.kt b/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/workspace/text/WorkspaceTextReadPolicyTest.kt similarity index 93% rename from app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/text/WorkspaceTextReadPolicyTest.kt rename to app/src/test/java/com/ai/assistance/operit/ui/features/conversation/workspace/text/WorkspaceTextReadPolicyTest.kt index 2e596714b1..96d755dcef 100644 --- a/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/text/WorkspaceTextReadPolicyTest.kt +++ b/app/src/test/java/com/ai/assistance/operit/ui/features/conversation/workspace/text/WorkspaceTextReadPolicyTest.kt @@ -1,4 +1,4 @@ -package com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.text +package com.ai.assistance.operit.ui.features.conversation.workspace.text import org.junit.Assert.assertEquals import org.junit.Assert.assertNull diff --git a/docs/TODO/chore/README.md b/docs/TODO/chore/README.md index 86074d4ee5..c62f6e306f 100644 --- a/docs/TODO/chore/README.md +++ b/docs/TODO/chore/README.md @@ -6,6 +6,10 @@ ## 计划索引 +- [聊天代码按职责归类](chat-responsibility-layout/index.md) + +- [会话工作区按职责归类](conversation-workspace-layout/index.md) + - [1.12.2+15 分仓与布局修复发行](release-1.12.2-plus-15/index.md) - [正式版、补丁与离线资源分仓](release-repositories/index.md) diff --git a/docs/TODO/chore/chat-responsibility-layout/01-validation.md b/docs/TODO/chore/chat-responsibility-layout/01-validation.md new file mode 100644 index 0000000000..a5201b3768 --- /dev/null +++ b/docs/TODO/chore/chat-responsibility-layout/01-validation.md @@ -0,0 +1,122 @@ +# 聊天职责整理验证 + +本批基线为 `9b9bb75d93b96b72204067fa576db30e5279d960`,承接尚未提交的工作区迁移。来源、目标、保留原路径文件和原样提取内容见 [files.json](files.json)。 + +## 已完成的静态核对 + +- 完成 173 个主源码文件、17 个 JVM 测试文件、1 个 Android 测试文件及 1 份列表来源说明的迁移,旧路径没有保留转发文件 +- 根层仅保留 `foundation`、`modules`、`screens`、`viewmodel`,主源码分别有 63、111、4、6 个 Kotlin 文件 +- 9 个共享声明原样提取到 6 个文件,逐项对照名称、字段、默认值、可见性和完整声明文本 +- 核对 381 个非私有顶层符号名的归属集合和来源文件,原有同名接口及工厂函数组合保持原样 +- 核对应用及测试源码中的 374 处聊天导入、46 处原同包引用,拆分包的 2 处星号导入已经衔接到对应显式引用 +- `foundation` 没有导入 `modules`、`screens` 或 `viewmodel`;队列条目、角色选择目标、聊天样式和共享状态类型由基础声明包提供 +- 本批声明体内仅 `ChatViewModel.kt`、`AIChatScreen.kt` 中的全限定包路径发生替换,其余变化限于声明归位、包声明和导入 +- 合并前一批工作区迁移,对基线全部 1938 个 Kotlin、Java 源文件逐一对照;归一化全限定路径并扣除清单内原样提取的声明后,全部声明体一致 +- 当前应用源码共有 1944 个 Kotlin、Java 文件,增加的 6 个文件全部属于共享声明,没有遗漏原有文件 +- 应用、工作流、终端目录和根构建配置的旧聊天包路径扫描无结果;既往 `chore/package-layout/` 清单未改写 +- 实施阶段完整差异通过临时 Git 索引执行空白检查,当时未改变真实暂存区或 HEAD;后续提交与远端验证由对应 PR 记录 + +旧路径扫描可在仓库根目录执行: + +```sh +rg -n 'features[./]conversation[./]chat[./](archive|attachments|batch|components|copy|export|folders|motion|sidebar|util|voicemessages|webview|workspace)([./]|\b)' app .github terminal build.gradle.kts settings.gradle.kts +``` + +预期无输出,`rg` 退出码为 1。声明体核对以两批清单和迁移前快照为依据,比较时只移除包声明及导入、映射完整包路径,并核对新文件包含原样提取的声明。 + +本地实施阶段未执行编译、构建或测试;远端派发与结果以目录整理和集成 PR 的验证说明为准。上述结果属于文本、声明和引用映射核对,不能代替 Kotlin 编译和 Android 运行验证。 + +## Android 测试数据字符串 + +`ToolCardStreamBoundaryAndroidTest` 中的工具请求、工具结果和未闭合请求前缀统一使用 Kotlin 三引号原始字符串,保留 XML 属性中的双引号及 `$value` 插值。此次只修正 4 处测试数据的字面量写法,原有 8 项测试及其断言保持不变。 + +已对照集成分支中的同一测试文件,并完成差异空白检查;本地未执行编译或测试,本次未手动派发工作流。 + +## 完整回归范围 + +以下保留全部既有聊天回归类,包含原路径未变的待发消息队列测试。本批只迁移已有测试,不新增行为测试。执行后预期所有既有断言通过,Android 测试源码能够解析新包路径。 + +
既有自动回归类 + +| 编号 | 执行的测试类 | 覆盖范围 | +| --- | --- | --- | +| C1 | `GalleryDragSelectionTest` | 图片拖选 | +| C2 | `ImagePreviewTransformTest` | 图片预览变换 | +| C3 | `SentImageSourcesTest` | 已发送图片来源 | +| C4 | `ChatBatchControllerTest` | 聊天批量操作控制器 | +| C5 | `ChatAreaTokenSpeedTest` | 消息 Token 速度显示 | +| C6 | `MessageCopyTextTest` | 消息复制文本 | +| C7 | `MessageEditorContentTest` | 消息编辑内容 | +| C8 | `PastedTextAttachmentTest` | 粘贴文本附件 | +| C9 | `TokenHitRateFormatTest` | Token 命中率格式 | +| C10 | `MessageStatsFormattingTest` | 消息统计格式 | +| C11 | `StatusCardHtmlDocumentTest` | 状态卡片文档 | +| C12 | `ThinkToolsRowsTest` | 思考与工具分组行 | +| C13 | `ThinkingMarkdownStreamTest` | 思考 Markdown 流 | +| C14 | `ToolTimingIndexTest` | 工具耗时索引 | +| C15 | `BubbleImageLayoutTest` | 气泡图片布局 | +| C16 | `FolderChatHistoryTreeTest` | 文件夹聊天历史树 | +| C17 | `ChatListMotionStateTest` | 聊天列表动画状态 | +| C18 | `PendingMessageQueueStoreTest` | 待发消息队列,测试路径保留 | +| C19 | `StreamingTimelineRefreshAndroidTest` | Android 流式时间线刷新 | + +
+ +
Android 界面回归范围 + +| 编号 | 做什么 | 预期行为 | +| --- | --- | --- | +| M1 | 打开主聊天,切换历史并接收流式回复 | 页面、滚动位置、消息分组和刷新沿用原行为 | +| M2 | 在 Agent 和经典输入框切换设置、提及、角色及待发队列 | 原入口、选择、队列操作和发送回调正常 | +| M3 | 切换消息样式,打开详情、编辑、翻译、复制和工具卡片 | 内容、样式与原交互一致 | +| M4 | 选择图片并查看图片、音视频及失效附件 | 选择、拖选、预览和失效状态一致 | +| M5 | 从侧栏和历史面板执行文件夹、归档、批量操作 | 共用状态、进度、列表刷新和删除动画一致 | +| M6 | 录制、试听、发送和取消语音消息 | 权限、录音会话和关闭后的资源清理一致 | +| M7 | 分享消息图片,使用既有项目导出入口 | 原内容渲染、预览、保存和导出回调正常 | +| M8 | 打开悬浮聊天和主题预览,使用输入扩展 | 共用组件、共享类型和插件桥接解析到新位置 | +| M9 | 打开工作区、终端、编辑器及各类文件预览 | 前一批工作区迁移继续正常衔接,文件操作行为一致 | + +
+ +工作区迁移的回归范围见[工作区迁移验证](../conversation-workspace-layout/01-validation.md)。复制、剪切、删除的全部 17 条自动用例与 13 项实机范围继续保留在[文件操作验证](../../fix/workspace-copy-streaming-progress/01-validation.md),不以本页的包迁移检查替代。 + +## 结果记录 + +自动测试和 Android 界面项均尚未运行,以下表格用于填写实际结果。 + +
待填写结果与证据 + +| 编号 | 结果与证据 | +| --- | --- | +| C1 | | +| C2 | | +| C3 | | +| C4 | | +| C5 | | +| C6 | | +| C7 | | +| C8 | | +| C9 | | +| C10 | | +| C11 | | +| C12 | | +| C13 | | +| C14 | | +| C15 | | +| C16 | | +| C17 | | +| C18 | | +| C19 | | +| M1 | | +| M2 | | +| M3 | | +| M4 | | +| M5 | | +| M6 | | +| M7 | | +| M8 | | +| M9 | | + +
+ +[DONE] 本地静态核对和完整回归范围记录,实际测试结果待填写。 diff --git a/docs/TODO/chore/chat-responsibility-layout/files.json b/docs/TODO/chore/chat-responsibility-layout/files.json new file mode 100644 index 0000000000..7a79ce17c2 --- /dev/null +++ b/docs/TODO/chore/chat-responsibility-layout/files.json @@ -0,0 +1,2038 @@ +{ + "baseline": "9b9bb75d93b96b72204067fa576db30e5279d960", + "precedingMigration": "../conversation-workspace-layout/files.json", + "files": [ + { + "source": "app/src/androidTest/java/com/ai/assistance/operit/ui/features/conversation/chat/components/timeline/StreamingTimelineRefreshAndroidTest.kt", + "target": "app/src/androidTest/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/timeline/StreamingTimelineRefreshAndroidTest.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.timeline", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.timeline", + "symbols": [] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/archive/ChatArchiveFilter.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/history/ChatArchiveFilter.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.archive", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.history", + "symbols": [ + "ChatArchiveFilter" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/attachments/AttachmentUtils.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/AttachmentUtils.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.attachments", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments", + "symbols": [ + "AttachmentUtils" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/attachments/MediaFileGuard.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/MediaFileGuard.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.attachments", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments", + "symbols": [ + "MediaFileGuard", + "MediaFileUnavailableTag", + "mediaPreviewUri", + "rememberMediaFileMissing", + "rememberMediaPreviewRevision" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/attachments/images/AttachmentImagePreviewDialog.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/images/AttachmentImagePreviewDialog.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.attachments.images", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.images", + "symbols": [ + "AttachmentImagePreviewDialog", + "AttachmentPreviewImage" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/attachments/images/ChatImagePickerDialog.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/images/ChatImagePickerDialog.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.attachments.images", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.images", + "symbols": [ + "ChatImagePickerDialog" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/attachments/images/ExpiredImageGroupTag.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/images/ExpiredImageGroupTag.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.attachments.images", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.images", + "symbols": [ + "ExpiredImageGroupTag" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/attachments/images/GalleryDragSelection.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/images/GalleryDragSelection.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.attachments.images", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.images", + "symbols": [ + "GalleryDragSelection", + "galleryDragSelectionModifier" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/attachments/images/ImagePreviewTransform.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/images/ImagePreviewTransform.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.attachments.images", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.images", + "symbols": [ + "ImagePreviewTransform", + "transformImagePreview" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/attachments/images/MediaStoreImageRepository.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/images/MediaStoreImageRepository.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.attachments.images", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.images", + "symbols": [ + "GalleryImage", + "ImageLibraryAccess", + "imageLibraryAccess", + "imageLibraryPermissions", + "loadGalleryImages" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/attachments/images/SentImageGroup.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/images/SentImageGroup.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.attachments.images", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.images", + "symbols": [ + "SentImageGroup", + "SentMessageImage" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/attachments/images/SentImageSources.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/images/SentImageSources.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.attachments.images", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.images", + "symbols": [ + "sentImageSources" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/batch/ChatBatchController.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/viewmodel/history/ChatBatchController.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.batch", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.viewmodel.history", + "symbols": [ + "ChatBatchController" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/batch/ChatBatchControls.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/history/batch/ChatBatchControls.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.batch", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.history.batch", + "symbols": [ + "ChatBatchActionBar", + "ChatBatchDeleteDialog", + "ChatBatchSelectionHeader" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/batch/ChatBatchMoveDialog.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/history/batch/ChatBatchMoveDialog.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.batch", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.history.batch", + "symbols": [ + "ChatBatchMoveDialog" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/AttachmentChip.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/AttachmentChip.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments", + "symbols": [ + "AttachmentChip" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/AttachmentPreview.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/AttachmentPreview.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments", + "symbols": [ + "AttachmentPreview" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/AttachmentSelector.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/AttachmentSelector.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments", + "symbols": [ + "AttachmentSelectorPanel", + "AttachmentSelectorPopupPanel", + "PackageSelectorDialog" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/CharacterSelectorPanel.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/characters/CharacterSelectorPanel.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.characters", + "symbols": [ + "CharacterGroupItem", + "CharacterItem", + "CharacterSelectorPanel" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/ChatArea.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/ChatArea.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.messages", + "symbols": [ + "ChatArea", + "MessageCopyContent", + "buildMessageCopyContent", + "buildSelectedMessagesPlainText", + "cleanMessageContentForCopy", + "cleanMessageContentForXmlCopy" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/ChatHeader.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/screens/ChatHeader.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.screens", + "symbols": [ + "ChatHeader" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/ChatHistorySelector.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/history/ChatHistorySelector.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.history", + "symbols": [ + "ChatHistorySelector" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/ChatMessageHeightMemory.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/list/ChatMessageHeightMemory.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.list", + "symbols": [ + "ChatMessageHeightMemory", + "rememberChatMessageHeightMemory" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/ChatScreenContent.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/screens/ChatScreenContent.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.screens", + "symbols": [ + "ChatHistorySelectorPanel", + "ChatScreenContent" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/ChatScreenHeader.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/screens/ChatScreenHeader.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.screens", + "symbols": [ + "ChatScreenHeader", + "StatItem", + "useFloatingWindowLauncher" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/ChatScrollExtensions.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/list/ChatScrollExtensions.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.list", + "symbols": [ + "animateScrollToEnd" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/ChatScrollNavigator.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/navigation/ChatScrollNavigator.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.navigation", + "symbols": [ + "ChatScrollNavigator" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/CompactDialogLayout.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/layout/CompactDialogLayout.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.layout", + "symbols": [ + "CompactDialogMetrics", + "compactDialogHeight", + "compactDialogHeightOrWrapContent", + "compactDialogHeightWhenShort", + "rememberCompactDialogMetrics", + "rememberCompactDialogScrollState", + "verticalScrollWhenCompact", + "verticalScrollWhenShort" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/ExportDialogs.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/export/ExportDialogs.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.export", + "symbols": [ + "AndroidExportDialog", + "ExportCompleteDialog", + "ExportPlatformDialog", + "ExportProgressDialog", + "WindowsExportDialog", + "exportAndroidApp", + "exportWindowsApp" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/FullscreenInputDialog.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/input/FullscreenInputDialog.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.input", + "symbols": [ + "FullscreenInputDialog" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/LinkPreviewDialog.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/links/LinkPreviewDialog.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.links", + "symbols": [ + "LinkPreviewDialog" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/MemoryFolderSelectionDialog.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/input/memory/MemoryFolderSelectionDialog.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.input.memory", + "symbols": [ + "FolderNode", + "MemoryFolderSelectionDialog" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/MessageEditor.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/editor/MessageEditor.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.editor", + "symbols": [ + "MessageEditor" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/MessageEditorContent.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/editor/MessageEditorContent.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.editor", + "symbols": [ + "ParsedMessagePart", + "PartType", + "createMessageEditorXmlPart", + "parseMessageContentForEditor", + "recomposeMessageFromParts" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/MessageInfoDialog.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/details/MessageInfoDialog.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.details", + "symbols": [ + "MessageInfoDialog" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/MessageTranslationDialog.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/translation/MessageTranslationDialog.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.translation", + "symbols": [ + "MessageTranslationDialog" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/PastedTextAttachment.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/PastedTextAttachment.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments", + "symbols": [ + "extractClipboardPastedText", + "extractInsertedText" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/ReferencesDisplay.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/references/ReferencesDisplay.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.references", + "symbols": [ + "ReferencesDisplay" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/RevisableTextStreamRemember.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/stream/RevisableTextStreamRemember.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.stream", + "symbols": [ + "rememberRevisableTextStream" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/ScrollToBottomButton.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/navigation/ScrollToBottomButton.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.navigation", + "symbols": [ + "ScrollToBottomButton" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/ShareImagePreviewDialog.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/sharing/ShareImagePreviewDialog.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.sharing", + "symbols": [ + "ShareImagePreviewDialog", + "saveShareImageToGallery" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/SharedFileTargetDialog.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/imports/SharedFileTargetDialog.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.imports", + "symbols": [ + "SharedFileTargetDialog", + "SharedIncomingContentHandler" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/SharedPackageImportChoiceDialog.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/imports/SharedPackageImportChoiceDialog.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.imports", + "symbols": [ + "SharedPackageImportChoiceDialog" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/SimpleLinearProgressIndicator.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/progress/SimpleLinearProgressIndicator.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.progress", + "symbols": [ + "SimpleLinearProgressIndicator" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/TokenHitRateFormat.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/format/TokenHitRateFormat.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.format", + "symbols": [ + "formatCacheHitRate" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/WorkspaceChangeConfirmDialog.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/actions/WorkspaceChangeConfirmDialog.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.actions", + "symbols": [ + "WorkspaceChangeConfirmDialog", + "WorkspaceChangeConfirmMode" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/attachments/AttachmentViewerDialog.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/preview/AttachmentViewerDialog.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.attachments", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.preview", + "symbols": [ + "AttachmentViewerDialog", + "ChatAttachment" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/attachments/AudioAttachmentPlayer.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/preview/AudioAttachmentPlayer.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.attachments", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.preview", + "symbols": [ + "AudioAttachmentPlayer" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/attachments/VideoAttachmentPlayer.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/preview/VideoAttachmentPlayer.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.attachments", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.preview", + "symbols": [ + "VideoAttachmentPlayer" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/config/TokenInfoDialog.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/usage/TokenInfoDialog.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.config", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.usage", + "symbols": [ + "TokenInfoDialog" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/context/ChatContextUsageDialog.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/usage/ChatContextUsageDialog.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.context", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.usage", + "symbols": [ + "ChatContextUsageDialog" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/context/ChatContextUsageEntry.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/usage/ChatContextUsageEntry.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.context", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.usage", + "symbols": [ + "ChatContextUsageEntry" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/context/ContextUsageFormat.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/usage/ContextUsageFormat.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.context", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.usage", + "symbols": [ + "formatUsagePercent", + "formatUsageTokens" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/context/ContextWindowUsageContent.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/usage/ContextWindowUsageContent.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.context", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.usage", + "symbols": [ + "ContextUsageTotalRow", + "ContextWindowCategoryColors", + "ContextWindowUsageContent", + "rememberContextWindowCategoryColors" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/context/CumulativeUsageContent.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/usage/CumulativeUsageContent.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.context", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.usage", + "symbols": [ + "CumulativeUsageContent" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/details/MessageGenerationDetails.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/details/MessageGenerationDetails.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.details", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.details", + "symbols": [ + "MessageGenerationDetails", + "hasDisplayableMessageTimestamp", + "hasDisplayableTimingStats", + "hasDisplayableTokenSpeedStats", + "hasDisplayableTokenStats", + "messageTokenBreakdownText" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/details/MessageStatsFormatting.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/details/MessageStatsFormatting.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.details", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.details", + "symbols": [ + "calculateMessageTokenSpeed", + "formatCompactMessageTokens", + "formatMessageCompletionTime", + "formatMessageDuration", + "formatMessageNumber", + "formatMessageTokenSpeed" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/AwaitFirstLayoutModifier.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/AwaitFirstLayoutModifier.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.lazy", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy", + "symbols": [ + "AwaitFirstLayoutModifier" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/CacheWindowLogic.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/CacheWindowLogic.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.lazy", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy", + "symbols": [ + "CacheWindowLogic", + "CacheWindowScope", + "CachedItem", + "InvalidIndex", + "forEachVisibleItem" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/IntervalList.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/IntervalList.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.lazy", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy", + "symbols": [ + "IntervalList", + "MutableIntervalList" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyItemScope.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyItemScope.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.lazy", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy", + "symbols": [ + "LazyItemScope" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyItemScopeImpl.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyItemScopeImpl.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.lazy", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy", + "symbols": [ + "LazyItemScopeImpl" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayout.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayout.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.lazy", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy", + "symbols": [ + "LazyLayout" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutBeyondBoundsInfo.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutBeyondBoundsInfo.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.lazy", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy", + "symbols": [ + "LazyLayoutBeyondBoundsInfo" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutBeyondBoundsModifierLocal.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutBeyondBoundsModifierLocal.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.lazy", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy", + "symbols": [ + "LazyLayoutBeyondBoundsProviderModifierNode", + "lazyLayoutBeyondBoundsModifier" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutBeyondBoundsState.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutBeyondBoundsState.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.lazy", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy", + "symbols": [ + "LazyLayoutBeyondBoundsState", + "calculateLazyLayoutPinnedIndices" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutCacheWindow.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutCacheWindow.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.lazy", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy", + "symbols": [ + "LazyLayoutCacheWindow" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutIntervalContent.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutIntervalContent.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.lazy", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy", + "symbols": [ + "LazyLayoutIntervalContent" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutItemAnimation.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutItemAnimation.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.lazy", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy", + "symbols": [ + "LazyLayoutAnimateItemElement", + "LazyLayoutAnimationSpecsNode", + "LazyLayoutItemAnimation" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutItemAnimator.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutItemAnimator.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.lazy", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy", + "symbols": [ + "LazyLayoutItemAnimator" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutItemContentFactory.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutItemContentFactory.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.lazy", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy", + "symbols": [ + "LazyLayoutItemContentFactory" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutItemProvider.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutItemProvider.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.lazy", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy", + "symbols": [ + "LazyLayoutItemProvider", + "findIndexByKey" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutKeyIndexMap.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutKeyIndexMap.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.lazy", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy", + "symbols": [ + "LazyLayoutKeyIndexMap", + "NearestRangeKeyIndexMap" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutMeasurePolicy.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutMeasurePolicy.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.lazy", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy", + "symbols": [ + "LazyLayoutMeasurePolicy" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutMeasureScope.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutMeasureScope.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.lazy", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy", + "symbols": [ + "LazyLayoutMeasureScope", + "LazyLayoutMeasureScopeImpl" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutMeasuredItem.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutMeasuredItem.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.lazy", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy", + "symbols": [ + "LazyLayoutMeasuredItem", + "LazyLayoutMeasuredItemProvider", + "updatedVisibleItems" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutNearestRangeState.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutNearestRangeState.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.lazy", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy", + "symbols": [ + "LazyLayoutNearestRangeState" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutPinnableItem.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutPinnableItem.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.lazy", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy", + "symbols": [ + "LazyLayoutPinnableItem", + "LazyLayoutPinnedItemList" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutPlatform.android.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutPlatform.android.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.lazy", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy", + "symbols": [ + "getDefaultLazyLayoutKey" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutPrefetchState.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutPrefetchState.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.lazy", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy", + "symbols": [ + "Averages", + "LazyLayoutPrefetchState", + "NestedPrefetchScope", + "PrefetchHandleProvider", + "PrefetchMetrics", + "UnspecifiedNestedPrefetchCount", + "traversablePrefetchState" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutScrollDeltaBetweenPasses.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutScrollDeltaBetweenPasses.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.lazy", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy", + "symbols": [ + "LazyLayoutScrollDeltaBetweenPasses" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutScrollScope.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutScrollScope.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.lazy", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy", + "symbols": [ + "LazyLayoutScrollScope", + "animateScrollToItem", + "isItemVisible" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutSemanticState.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutSemanticState.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.lazy", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy", + "symbols": [ + "LazyLayoutSemanticState" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutSemantics.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutSemantics.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.lazy", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy", + "symbols": [ + "LazyLayoutSemanticState", + "estimatedLazyMaxScrollOffset", + "estimatedLazyScrollOffset", + "lazyLayoutSemantics" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyLayoutStickyItems.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyLayoutStickyItems.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.lazy", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy", + "symbols": [ + "StickyItemsPlacement", + "applyStickyItems" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyList.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyList.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.lazy", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy", + "symbols": [ + "LazyList", + "defaultLazyListBeyondBoundsItemCount" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyListBeyondBoundsModifier.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyListBeyondBoundsModifier.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.lazy", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy", + "symbols": [ + "LazyListBeyondBoundsState", + "rememberLazyListBeyondBoundsState" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyListCacheWindowStrategy.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyListCacheWindowStrategy.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.lazy", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy", + "symbols": [ + "LazyListCacheWindowScope", + "LazyListCacheWindowStrategy" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyListIntervalContent.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyListIntervalContent.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.lazy", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy", + "symbols": [ + "LazyListInterval", + "LazyListIntervalContent" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyListItemInfo.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyListItemInfo.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.lazy", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy", + "symbols": [ + "LazyListItemInfo" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyListItemProvider.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyListItemProvider.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.lazy", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy", + "symbols": [ + "LazyListItemProvider", + "rememberLazyListItemProviderLambda" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyListLayoutInfo.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyListLayoutInfo.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.lazy", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy", + "symbols": [ + "LazyListLayoutInfo", + "calculateContentSize", + "singleAxisViewportSize", + "visibleItemsAverageSize" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyListMeasure.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyListMeasure.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.lazy", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy", + "symbols": [ + "measureLazyList" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyListMeasureResult.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyListMeasureResult.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.lazy", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy", + "symbols": [ + "LazyListMeasureResult" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyListMeasuredItem.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyListMeasuredItem.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.lazy", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy", + "symbols": [ + "LazyListMeasuredItem" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyListMeasuredItemProvider.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyListMeasuredItemProvider.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.lazy", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy", + "symbols": [ + "LazyListMeasuredItemProvider" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyListPrefetchStrategy.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyListPrefetchStrategy.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.lazy", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy", + "symbols": [ + "LazyListPrefetchResultScope", + "LazyListPrefetchResultScopeImpl", + "LazyListPrefetchScope", + "LazyListPrefetchStrategy" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyListScrollPosition.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyListScrollPosition.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.lazy", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy", + "symbols": [ + "LazyListScrollPosition", + "NearestItemsExtraItemCount", + "NearestItemsSlidingWindowSize" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyListScrollScope.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyListScrollScope.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.lazy", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy", + "symbols": [ + "LazyLayoutScrollScope" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyListSemantics.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyListSemantics.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.lazy", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy", + "symbols": [ + "rememberLazyListSemanticState" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyListState.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyListState.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.lazy", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy", + "symbols": [ + "LazyListState", + "rememberLazyListState" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazySaveableStateHolder.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazySaveableStateHolder.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.lazy", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy", + "symbols": [ + "LazySaveableStateHolderProvider" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/LazyScopeMarker.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/LazyScopeMarker.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.lazy", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy", + "symbols": [ + "LazyScopeMarker" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/ObservableScopeInvalidator.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/ObservableScopeInvalidator.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.lazy", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy", + "symbols": [ + "ObservableScopeInvalidator" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/PrefetchScheduler.android.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/PrefetchScheduler.android.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.lazy", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy", + "symbols": [ + "AndroidPrefetchScheduler", + "PriorityTask", + "rememberDefaultPrefetchScheduler" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/PrefetchScheduler.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/PrefetchScheduler.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.lazy", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy", + "symbols": [ + "PrefetchRequest", + "PrefetchRequestScope", + "PrefetchScheduler", + "PriorityPrefetchScheduler" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/README.md", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/README.md", + "oldPackage": null, + "newPackage": null, + "symbols": [] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/lazy/RecyclerLazyColumn.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/lazy/RecyclerLazyColumn.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.lazy", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.lazy", + "symbols": [ + "LazyListScope", + "LazyRow", + "RecyclerLazyColumn", + "items", + "itemsIndexed" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/mentions/MentionSuggestionPanel.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/input/mentions/MentionSuggestionPanel.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.mentions", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.input.mentions", + "symbols": [ + "MentionSuggestionPanel", + "MentionSuggestionPanelStyle" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/ChatNodeVisibility.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/ChatNodeVisibility.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.part", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering", + "symbols": [ + "isVisibleChatMarkdownNode", + "isVisibleChatXmlContent" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/CustomXmlRenderer.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/CustomXmlRenderer.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.part", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering", + "symbols": [ + "CustomXmlRenderer" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/DetailsTagRenderer.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/DetailsTagRenderer.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.part", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering", + "symbols": [ + "DetailsTagRenderer" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/DialogComponents.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/DialogComponents.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.part", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering", + "symbols": [ + "ContentDetailDialog", + "DiffContentLazyColumn" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/FileDiffDisplay.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/FileDiffDisplay.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.part", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering", + "symbols": [ + "FileDiff", + "FileDiffDisplay" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/FontTagRenderer.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/FontTagRenderer.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.part", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering", + "symbols": [ + "FontTagRenderer" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/ParamVisualizer.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/ParamVisualizer.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.part", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering", + "symbols": [ + "ParamItem", + "ParamVisualizer" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/StatusCardHtmlDocument.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/StatusCardHtmlDocument.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.part", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering", + "symbols": [ + "StatusCardHtmlDocument" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/ThinkToolsRows.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/ThinkToolsRows.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.part", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering", + "symbols": [ + "ThinkToolsGroupInfo", + "ThinkToolsRow", + "buildThinkToolsRows", + "thinkToolsGroupTitle" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/ThinkToolsXmlNodeGrouper.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/ThinkToolsXmlNodeGrouper.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.part", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering", + "symbols": [ + "ThinkToolsXmlNodeGrouper" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/ThinkingMarkdownStream.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/ThinkingMarkdownStream.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.part", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering", + "symbols": [ + "createThinkMarkdownCharStream" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/ToolDisplayComponents.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/ToolDisplayComponents.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.part", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering", + "symbols": [ + "CodeContentWithLineNumbers", + "CompactToolDisplay", + "DetailedToolDisplay", + "FormattedXmlText" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/ToolResultDisplay.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/ToolResultDisplay.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.part", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering", + "symbols": [ + "ToolResultDisplay" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/XmlCanvasBlockComponents.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/XmlCanvasBlockComponents.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.part", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering", + "symbols": [ + "CanvasExpandableHeaderRow", + "CanvasFontTextBlock", + "CanvasPillLabel" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/XmlCanvasSummaryComponents.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/XmlCanvasSummaryComponents.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.part", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering", + "symbols": [ + "CanvasStatusCard", + "CanvasToolResultRow", + "CanvasToolSummaryRow", + "CanvasWarningStatusRow" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/tooltiming/ToolTimingIndex.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/tooltiming/ToolTimingIndex.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.part.tooltiming", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering.tooltiming", + "symbols": [ + "ToolCallTiming", + "ToolTimingIndex", + "ToolTimingSummary", + "elapsedUnion" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/tooltiming/ToolTimingTitle.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/tooltiming/ToolTimingTitle.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.part.tooltiming", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering.tooltiming", + "symbols": [ + "LocalInsideToolGroup", + "LocalToolTimingIndex", + "rememberMessageToolExecutions", + "toolTimingTitle" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/bubble/BubbleAiMessageComposable.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/style/bubble/BubbleAiMessageComposable.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.style.bubble", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.style.bubble", + "symbols": [ + "BubbleAiMessageComposable" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/bubble/BubbleImageBackgroundSurface.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/style/bubble/BubbleImageBackgroundSurface.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.style.bubble", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.style.bubble", + "symbols": [ + "BubbleImageBackgroundSurface" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/bubble/BubbleImageLayout.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/style/bubble/BubbleImageLayout.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.style.bubble", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.style.bubble", + "symbols": [ + "BubbleDstSliceLayout", + "BubbleImageRenderMode", + "BubbleImageStyleConfig", + "BubbleSliceLayout", + "bubbleTileExtent", + "buildSliceLayout", + "computeDstSliceLayout", + "forMessageBlock" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/bubble/BubbleImageTiling.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/style/bubble/BubbleImageTiling.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.style.bubble", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.style.bubble", + "symbols": [ + "BubbleImageTile", + "BubbleImageTiles", + "rememberBubbleImageTiles" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/bubble/BubbleStyleChatMessage.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/style/bubble/BubbleStyleChatMessage.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.style.bubble", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.style.bubble", + "symbols": [ + "BubbleStyleChatMessage" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/bubble/BubbleUserMessageComposable.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/style/bubble/BubbleUserMessageComposable.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.style.bubble", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.style.bubble", + "symbols": [ + "AttachmentData", + "BubbleUserMessageComposable", + "ImageLinkData", + "MessageParseResult", + "ReplyInfo" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/common/HiddenUserMessagePlaceholderContent.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/style/common/HiddenUserMessagePlaceholderContent.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.style.common", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.style.common", + "symbols": [ + "HiddenUserMessagePlaceholderContent" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/cursor/AiMessageComposable.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/style/cursor/AiMessageComposable.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.style.cursor", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.style.cursor", + "symbols": [ + "AiMessageComposable" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/cursor/CursorStyleChatMessage.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/style/cursor/CursorStyleChatMessage.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.style.cursor", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.style.cursor", + "symbols": [ + "CursorStyleChatMessage" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/cursor/SummaryMessageComposable.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/style/cursor/SummaryMessageComposable.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.style.cursor", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.style.cursor", + "symbols": [ + "SummaryMessageComposable" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/cursor/UserMessageComposable.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/style/cursor/UserMessageComposable.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.style.cursor", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.style.cursor", + "symbols": [ + "AttachmentData", + "ImageLinkData", + "MessageParseResult", + "ReplyInfo", + "UserMessageComposable" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/input/agent/AgentChatInputSection.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/input/agent/AgentChatInputSection.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.agent", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.input.agent", + "symbols": [ + "AgentChatInputSection" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/input/classic/ClassicChatInputSection.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/input/classic/ClassicChatInputSection.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.classic", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.input.classic", + "symbols": [ + "ClassicChatInputSection" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/input/classic/ClassicChatSettingsBar.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/input/classic/ClassicChatSettingsBar.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.classic", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.input.classic", + "symbols": [ + "ClassicChatSettingsBar" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/input/common/CharacterCardMemoryBindingSwitchConfirmDialog.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/input/common/CharacterCardMemoryBindingSwitchConfirmDialog.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.common", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.input.common", + "symbols": [ + "CharacterCardMemoryBindingSwitchConfirmDialog" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/input/common/CharacterCardModelBindingSwitchConfirmDialog.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/input/common/CharacterCardModelBindingSwitchConfirmDialog.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.common", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.input.common", + "symbols": [ + "CharacterCardModelBindingSwitchConfirmDialog" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/input/common/ChatInputHookRegistry.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/input/common/ChatInputHookRegistry.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.common", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.input.common", + "symbols": [ + "ChatInputEvents", + "ChatInputHook", + "ChatInputHookContext", + "ChatInputHookRegistry", + "ChatInputHookResult", + "ChatInputSubmitActions" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/input/common/InputMenuTogglePluginRegistry.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/input/common/InputMenuTogglePluginRegistry.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.common", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.input.common", + "symbols": [ + "InputMenuToggleDefinition", + "InputMenuToggleHookParams", + "InputMenuTogglePlugin", + "InputMenuTogglePluginRegistry", + "InputMenuToggleSlots" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/input/common/MentionVisualTransformation.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/input/common/MentionVisualTransformation.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.common", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.input.common", + "symbols": [ + "rememberMentionVisualTransformation" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/input/common/PendingMessageQueuePanel.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/input/common/PendingMessageQueuePanel.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.common", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.input.common", + "symbols": [ + "PendingMessageQueuePanel" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/input/common/ThinkingQualitySlider.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/input/common/ThinkingQualitySlider.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.common", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.input.common", + "symbols": [ + "ThinkingQualitySlider" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/input/common/ToolPromptManagerDialog.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/input/common/ToolPromptManagerDialog.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.common", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.input.common", + "symbols": [ + "ToolPromptManagerDialog" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/timeline/ChatTimelineEntries.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/timeline/ChatTimelineEntries.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.timeline", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.timeline", + "symbols": [ + "ChatMessageAppearance", + "ChatMessageSlice", + "ChatTimelineEntry", + "LocalChatMessageSlice", + "rememberChatTimelineEntries", + "shouldSplitChatMessage" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/copy/MessageCopyTextField.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/copy/MessageCopyTextField.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.copy", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.copy", + "symbols": [ + "MessageCopyTextField" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/export/htmlpackager/HtmlPackagerScreen.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/export/htmlpackager/HtmlPackagerScreen.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.export.htmlpackager", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.export.htmlpackager", + "symbols": [ + "HtmlPackagerScreen" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/export/htmlpackager/PackagerResources.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/export/htmlpackager/PackagerResources.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.export.htmlpackager", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.export.htmlpackager", + "symbols": [ + "PackagerPlatformDialog", + "PackagerResourceGate", + "PackagerResourceState", + "PackagerResourceSummary", + "packagerResourceGroups", + "rememberPackagerResources" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/folders/ChatFolderTree.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/history/folders/ChatFolderTree.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.folders", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.history.folders", + "symbols": [ + "ChatFolderRow", + "ChatHistorySortMode", + "FolderDropZone", + "buildChatFolderTree", + "folderKey", + "node", + "resolveFolderDrop" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/folders/FolderChatHistoryPanel.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/history/folders/FolderChatHistoryPanel.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.folders", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.history.folders", + "symbols": [ + "FolderChatHistoryPanel" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/folders/FolderHistoryDialogs.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/history/folders/FolderHistoryDialogs.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.folders", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.history.folders", + "symbols": [ + "FolderHistorySettingsDialog", + "FolderNameDialog", + "HistoryAction", + "HistoryActionsDialog", + "HistoryBindingOption", + "HistoryChatEditDialog" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/folders/FolderTreeList.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/history/folders/FolderTreeList.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.folders", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.history.folders", + "symbols": [ + "FolderTreeList" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/folders/HistoryCreateCapsule.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/history/folders/HistoryCreateCapsule.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.folders", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.history.folders", + "symbols": [ + "HistoryCreateCapsule" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/folders/HistoryQuickScroller.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/history/folders/HistoryQuickScroller.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.folders", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.history.folders", + "symbols": [ + "HistoryQuickScroller" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/motion/ChatListMotionState.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/viewmodel/history/ChatListMotionState.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.motion", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.viewmodel.history", + "symbols": [ + "ChatListMotionState" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/motion/DissolvingChatTitle.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/history/motion/DissolvingChatTitle.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.motion", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.history.motion", + "symbols": [ + "DissolvingChatTitle" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/motion/NewChatIntro.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/motion/NewChatIntro.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.motion", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.motion", + "symbols": [ + "NewChatIntro" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/sidebar/ChatSidebarContent.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/sidebar/ChatSidebarContent.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.sidebar", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.sidebar", + "symbols": [ + "ChatSidebarContent" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/sidebar/ChatSidebarState.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/sidebar/ChatSidebarState.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.sidebar", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.sidebar", + "symbols": [ + "ChatSidebarState", + "LocalMainChatSidebarState", + "LocalMainChatViewModel", + "LocalOpenMainChatSidebar", + "LocalRunMainChatAction", + "rememberChatSidebarState" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/sidebar/MainChatControls.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/sidebar/MainChatControls.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.sidebar", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.sidebar", + "symbols": [ + "MainChatControls" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/sidebar/SidebarButtonSurface.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/sidebar/SidebarButtonSurface.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.sidebar", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.sidebar", + "symbols": [ + "SidebarButtonSurface" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/sidebar/SidebarPluginSection.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/sidebar/SidebarPluginSection.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.sidebar", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.sidebar", + "symbols": [ + "SidebarPluginSection" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/util/MentionTokenUtils.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/mentions/MentionTokenUtils.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.util", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.mentions", + "symbols": [ + "MentionTokenRange", + "findCommittedMentionTokens", + "findMentionTokenEndingAtCursor", + "findMentionTokens", + "isMentionContinuation" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/util/MessageImageGenerator.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/sharing/MessageImageGenerator.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.util", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.sharing", + "symbols": [ + "MessageImageGenerator" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/voicemessages/ExpiredVoiceMessageTag.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/voice/ExpiredVoiceMessageTag.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.voicemessages", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.voice", + "symbols": [ + "ExpiredVoiceMessageTag" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/voicemessages/VoiceMessagePlayer.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/voice/VoiceMessagePlayer.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.voicemessages", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.voice", + "symbols": [ + "VoiceMessagePlayer", + "voiceDurationLabel" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/voicemessages/VoiceMessageSession.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/voice/VoiceMessageSession.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.voicemessages", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.voice", + "symbols": [ + "VoiceMessagePhase", + "VoiceMessageSession", + "VoiceMessageState" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/voicemessages/VoiceMessageSheet.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/voice/VoiceMessageSheet.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.voicemessages", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.voice", + "symbols": [ + "VoiceMessageSheet" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/voicemessages/VoiceMessageSheetContent.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/voice/VoiceMessageSheetContent.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.voicemessages", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.voice", + "symbols": [ + "VoiceMessageSheetContent" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/voicemessages/VoiceMessageXmlPlugin.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/voice/VoiceMessageXmlPlugin.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.voicemessages", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.voice", + "symbols": [ + "VoiceMessageXmlPlugin" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/voicemessages/VoiceWaveform.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/voice/VoiceWaveform.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.voicemessages", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.voice", + "symbols": [ + "VoiceWaveform" + ] + }, + { + "source": "app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/attachments/images/GalleryDragSelectionTest.kt", + "target": "app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/images/GalleryDragSelectionTest.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.attachments.images", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.images", + "symbols": [] + }, + { + "source": "app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/attachments/images/ImagePreviewTransformTest.kt", + "target": "app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/images/ImagePreviewTransformTest.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.attachments.images", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.images", + "symbols": [] + }, + { + "source": "app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/attachments/images/SentImageSourcesTest.kt", + "target": "app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/images/SentImageSourcesTest.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.attachments.images", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments.images", + "symbols": [] + }, + { + "source": "app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/batch/ChatBatchControllerTest.kt", + "target": "app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/viewmodel/history/ChatBatchControllerTest.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.batch", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.viewmodel.history", + "symbols": [] + }, + { + "source": "app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/components/ChatAreaTokenSpeedTest.kt", + "target": "app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/ChatAreaTokenSpeedTest.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.messages", + "symbols": [] + }, + { + "source": "app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/components/MessageCopyTextTest.kt", + "target": "app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/MessageCopyTextTest.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.messages", + "symbols": [] + }, + { + "source": "app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/components/MessageEditorContentTest.kt", + "target": "app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/editor/MessageEditorContentTest.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.editor", + "symbols": [] + }, + { + "source": "app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/components/PastedTextAttachmentTest.kt", + "target": "app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/attachments/PastedTextAttachmentTest.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.attachments", + "symbols": [] + }, + { + "source": "app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/components/TokenHitRateFormatTest.kt", + "target": "app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/format/TokenHitRateFormatTest.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.format", + "symbols": [] + }, + { + "source": "app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/components/details/MessageStatsFormattingTest.kt", + "target": "app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/details/MessageStatsFormattingTest.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.details", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.details", + "symbols": [] + }, + { + "source": "app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/StatusCardHtmlDocumentTest.kt", + "target": "app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/StatusCardHtmlDocumentTest.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.part", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering", + "symbols": [] + }, + { + "source": "app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/ThinkToolsRowsTest.kt", + "target": "app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/ThinkToolsRowsTest.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.part", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering", + "symbols": [] + }, + { + "source": "app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/ThinkingMarkdownStreamTest.kt", + "target": "app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/ThinkingMarkdownStreamTest.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.part", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering", + "symbols": [] + }, + { + "source": "app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/components/part/tooltiming/ToolTimingIndexTest.kt", + "target": "app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/rendering/tooltiming/ToolTimingIndexTest.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.part.tooltiming", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.rendering.tooltiming", + "symbols": [] + }, + { + "source": "app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/bubble/BubbleImageLayoutTest.kt", + "target": "app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/style/bubble/BubbleImageLayoutTest.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.style.bubble", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.messages.style.bubble", + "symbols": [] + }, + { + "source": "app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/folders/FolderChatHistoryTreeTest.kt", + "target": "app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/history/folders/FolderChatHistoryTreeTest.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.folders", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.modules.history.folders", + "symbols": [] + }, + { + "source": "app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/motion/ChatListMotionStateTest.kt", + "target": "app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/viewmodel/history/ChatListMotionStateTest.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.motion", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.viewmodel.history", + "symbols": [] + } + ], + "retainedFiles": [ + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/screens/AIChatScreen.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/screens/AIChatScreen.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.screens", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.screens", + "symbols": [ + "AIChatScreen" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/viewmodel/ChatViewModel.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/viewmodel/ChatViewModel.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.viewmodel", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.viewmodel", + "symbols": [ + "ChatViewModel" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/viewmodel/FloatingWindowDelegate.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/viewmodel/FloatingWindowDelegate.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.viewmodel", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.viewmodel", + "symbols": [ + "FloatingWindowDelegate" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/viewmodel/PendingMessageQueueStore.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/viewmodel/PendingMessageQueueStore.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.viewmodel", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.viewmodel", + "symbols": [ + "PendingMessageQueueState", + "PendingMessageQueueStore" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/viewmodel/UiStateDelegate.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/viewmodel/UiStateDelegate.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.viewmodel", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.viewmodel", + "symbols": [ + "UiStateDelegate" + ] + }, + { + "source": "app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/viewmodel/PendingMessageQueueStoreTest.kt", + "target": "app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/viewmodel/PendingMessageQueueStoreTest.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.viewmodel", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.viewmodel", + "symbols": [] + } + ], + "extractions": [ + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/ChatArea.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/model/ChatStyle.kt", + "symbol": "ChatStyle", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.model", + "start": 10161, + "end": 10210, + "declaration": "enum class ChatStyle {\n CURSOR,\n BUBBLE\n}" + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/CharacterSelectorPanel.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/model/CharacterSelectorTarget.kt", + "symbol": "CharacterSelectorTarget", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.model", + "start": 2463, + "end": 2664, + "declaration": "sealed interface CharacterSelectorTarget {\n data class CharacterCardTarget(val id: String) : CharacterSelectorTarget\n data class CharacterGroupTarget(val id: String) : CharacterSelectorTarget\n}" + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/style/input/common/PendingMessageQueuePanel.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/model/PendingQueueMessageItem.kt", + "symbol": "PendingQueueMessageItem", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.style.input.common", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.model", + "start": 1663, + "end": 1741, + "declaration": "data class PendingQueueMessageItem(\n val id: Long,\n val text: String\n)" + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/viewmodel/ChatViewModel.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/model/ChatHistoryDisplayMode.kt", + "symbol": "ChatHistoryDisplayMode", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.viewmodel", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.model", + "start": 7316, + "end": 7420, + "declaration": "enum class ChatHistoryDisplayMode {\n BY_CHARACTER_CARD,\n BY_FOLDER,\n CURRENT_CHARACTER_ONLY\n}" + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/viewmodel/ChatViewModel.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/model/TranslationUiState.kt", + "symbol": "TranslationUiState", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.viewmodel", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.model", + "start": 7420, + "end": 7606, + "declaration": "data class TranslationUiState(\n val isLoading: Boolean = false,\n val translatedText: String? = null,\n val errorMessage: String? = null,\n val isFromCache: Boolean = false,\n)" + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/batch/ChatBatchController.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/model/ChatBatchModels.kt", + "symbol": "ChatBatchAction", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.batch", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.model", + "start": 284, + "end": 374, + "declaration": "enum class ChatBatchAction { SUMMARIZE_TITLES, ARCHIVE, UNARCHIVE, LOCK, UNLOCK, DELETE }" + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/batch/ChatBatchController.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/model/ChatBatchModels.kt", + "symbol": "ChatBatchItemResult", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.batch", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.model", + "start": 374, + "end": 437, + "declaration": "enum class ChatBatchItemResult { SUCCEEDED, SKIPPED, FAILED }" + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/batch/ChatBatchController.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/model/ChatBatchModels.kt", + "symbol": "ChatBatchProgress", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.batch", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.model", + "start": 437, + "end": 531, + "declaration": "data class ChatBatchProgress(val action: ChatBatchAction, val completed: Int, val total: Int)" + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/batch/ChatBatchController.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/foundation/model/ChatBatchModels.kt", + "symbol": "ChatBatchSummary", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.batch", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.foundation.model", + "start": 531, + "end": 615, + "declaration": "data class ChatBatchSummary(val succeeded: Int, val skipped: Int, val failed: Int)" + } + ] +} diff --git a/docs/TODO/chore/chat-responsibility-layout/index.md b/docs/TODO/chore/chat-responsibility-layout/index.md new file mode 100644 index 0000000000..abb2e4547b --- /dev/null +++ b/docs/TODO/chore/chat-responsibility-layout/index.md @@ -0,0 +1,66 @@ +--- +fork: https://github.com/3316891527/Operit +status: implemented-awaiting-ci +--- + +# 聊天代码按职责归类 + +工作区迁出后,原 `conversation.chat` 有 13 个直属子包、178 个 Kotlin 文件。`components` 同时容纳输入、消息渲染、附件、列表布局和页面组装;历史列表、归档与批量操作分散在多个根包。部分共享类型定义在具体 UI 文件中,被 `ChatViewModel` 和状态存储共同使用。 + +本批只整理 Kotlin 包结构,根层保留 `screens`、`modules`、`foundation`、`viewmodel`。没有拆分 Gradle 模块,也没有拆解 `ChatViewModel` 和输入框内部逻辑。当前主源码共有 184 个 Kotlin 文件,其中增加的 6 个文件承载从原文件提取的 9 个既有共享声明。 + +```text +chat/ + foundation/ + format/ + layout/ + lazy/ + list/ + mentions/ + model/ + progress/ + stream/ + modules/ + attachments/ + characters/ + export/ + history/ + input/ + messages/ + sharing/ + sidebar/ + usage/ + voice/ + screens/ + viewmodel/ + history/ +``` + +`modules` 按聊天功能归类,输入框的 Agent、经典模式、输入扩展与提及候选集中在 `input`;消息样式、时间线、XML 渲染、复制、编辑、详情与翻译集中在 `messages`。图片选择、附件预览、音视频播放和外部分享导入归入 `attachments`,消息截图生成与分享预览归入 `sharing`。 + +`foundation` 承载自定义列表、滚动扩展、流式适配、布局、格式和文本规则。该包不依赖 `modules`、`screens` 或 `viewmodel`。自定义列表的上游版本和来源说明随目录迁移,说明内源码链接改为相对路径。 + +`screens` 保留页面组装和页面标题。`viewmodel` 保留页面级状态与协调;批量控制器和聊天列表动画状态归入 `viewmodel.history`。面板持有的录音会话仍在语音功能内,生命周期不变。 + +共享声明放在 `foundation.model`,原样保留名称、字段、默认值和可见性: + +- `ChatStyle`、`CharacterSelectorTarget`、`PendingQueueMessageItem` +- `ChatHistoryDisplayMode`、`TranslationUiState` +- `ChatBatchAction`、`ChatBatchItemResult`、`ChatBatchProgress`、`ChatBatchSummary` + +- [x] 保存本批迁移前快照,建立主源码、测试和文档的逐文件映射 +- [x] 完成 173 个主源码文件、17 个 JVM 测试文件、1 个 Android 测试文件及 1 份来源说明的迁移 +- [x] 将基础能力归入 `foundation`,功能代码归入 `modules`,页面组装归入 `screens` +- [x] 将 9 个共享声明原样提取到 6 个独立文件 +- [x] 同步显式导入、全限定名和原同包引用,将拆分包的 2 处星号导入展开为对应显式引用 +- [x] 核对声明体与提取内容,检查旧路径残留、目标冲突和完整差异空白 +- [x] 更新相关文档,保留先前工作区迁移和既往清单的阶段记录 +- [x] 完成本地整理与静态核对,按后续交付要求转入独立分支和 PR 验证 + +本批不调整发送、流式渲染、复制、删除、语音、导出或权限行为,不新增旧包转发或类型别名。跨功能调用继续沿用原来的对象、参数和回调。 + +交付分支为 `refactor/conversation-chat-workspace-layout`,PR 目标为 `dev`。本批以 [PR #93](https://github.com/3316891527/Operit/pull/93) 的文件操作实现为基线;本批新增提交只整理目录和共享声明,PR 相对 `dev` 的差异同时包含该依赖。 + +逐文件映射、保留原路径文件和原样提取记录见 [files.json](files.json),静态核对及完整回归范围见[验证记录](01-validation.md)。本批承接[会话工作区迁移](../conversation-workspace-layout/index.md),已经合并核对两轮迁移前后的全部既有源码。 + +[DONE] 本地目录整理、共享声明提取与静态核对;编译、构建、测试和 CI 尚未验证本次迁移。 diff --git a/docs/TODO/chore/conversation-workspace-layout/01-validation.md b/docs/TODO/chore/conversation-workspace-layout/01-validation.md new file mode 100644 index 0000000000..623ed34bc2 --- /dev/null +++ b/docs/TODO/chore/conversation-workspace-layout/01-validation.md @@ -0,0 +1,52 @@ +# 会话工作区迁移验证 + +本页记录工作区迁移阶段的检查结果。后续聊天包迁移及两轮合并核对见[聊天迁移验证](../chat-responsibility-layout/01-validation.md)。 + +迁移基线为 `9b9bb75d93b96b72204067fa576db30e5279d960`,逐文件来源、目标、包名与主源码声明见 [files.json](files.json)。本批实施阶段先保留本地,后续交付与 CI 记录由聊天目录整理 PR 衔接。 + +## 已完成的静态核对 + +- 清单内 82 个文件全部迁移,包含 72 个主源码文件、8 个 JVM 测试文件和 2 个 Android 测试文件,目标目录与包声明一致 +- `main`、`test`、`androidTest` 中的旧 `chat/webview/` 与 `chat/workspace/` 目录均已移除,没有保留转发文件或包别名 +- 应用源码、仓库工作流、终端目录和根构建配置中没有旧 `conversation.chat.webview` 或 `conversation.chat.workspace` 引用 +- 核对 129 处相关显式导入和 17 处拆包后的原同包引用,覆盖工作区主页、网页服务、预览扩展属性、聊天提及面板和终端入口 +- 对迁移前的 1938 个 Kotlin、Java 源码文件逐一对照,确认本批变化限于 82 个迁移文件和 16 个调用方文件 +- 去除包声明及导入,并按完整符号映射替换旧包路径后,全部声明体与基线一致;声明体内仅 `WorkspaceManager.kt` 的 `NativeCodeEditor` 和 `FileUtils.kt` 的 `GitIgnoreFilter` 使用了需要同步的全限定路径 +- 使用临时 Git 索引纳入未跟踪的新路径后执行 `git diff --cached --check`,空白检查通过,Git 识别出 82 处重命名;真实暂存区未变,HEAD 仍为迁移基线 +- 更新相关开发文档中的当前路径,`chore/package-layout/` 下既往迁移清单保持原样 + +在仓库根目录可重新检查旧引用: + +```sh +rg -n 'conversation[./]chat[./](webview|workspace)' app .github terminal build.gradle.kts settings.gradle.kts +``` + +预期无输出,`rg` 退出码为 1。源码声明体对照以清单中的 `source`、`target`、`oldPackage`、`newPackage` 和基线提交为依据,比较前仅移除包声明及导入、归一化全限定包路径。 + +## 后续验证范围 + +本地未执行编译、构建或测试,后续远端验证以对应 PR 的派发及结果记录为准。静态声明和引用核对不代替 Kotlin 编译及 Android 运行验证。 + +| 编号 | 做什么 | 预期行为 | +| --- | --- | --- | +| L1 | 编译应用与 Android 测试源码 | 新包路径、显式导入和原同包引用全部解析 | +| L2 | 执行迁移的 8 个 JVM 测试类及原流式复制测试 | 原回归用例继续通过,测试没有遗漏 | +| L3 | 打开工作区主页,切换工作区与终端 | 原导航、会话标签与终端入口正常 | +| L4 | 浏览文件,打开编辑器、图片、文档、Markdown 与网页预览 | 文件入口、预览服务与刷新行为一致 | +| L5 | 在聊天输入框使用提及候选面板 | 候选展示、样式和选择行为一致 | +| L6 | 复查完整文件操作回归范围 | 复制、剪切、删除及取消保持既有行为 | + +L6 的全部自动用例、实机项与可填写结果表见[工作区复制与删除验证](../../fix/workspace-copy-streaming-progress/01-validation.md),包含此前已实现的复制及删除覆盖范围。 + +## 结果记录 + +| 编号 | 结果与证据 | +| --- | --- | +| L1 | 未运行 | +| L2 | 未运行 | +| L3 | 未验证 | +| L4 | 未验证 | +| L5 | 未验证 | +| L6 | 未验证,完整用例沿用关联记录 | + +[DONE] 静态核对;后续编译、测试和 Android 运行结果待填写。 \ No newline at end of file diff --git a/docs/TODO/chore/conversation-workspace-layout/files.json b/docs/TODO/chore/conversation-workspace-layout/files.json new file mode 100644 index 0000000000..d29c6ec86d --- /dev/null +++ b/docs/TODO/chore/conversation-workspace-layout/files.json @@ -0,0 +1,810 @@ +{ + "baseline": "9b9bb75d93b96b72204067fa576db30e5279d960", + "files": [ + { + "source": "app/src/androidTest/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/WorkspaceEditorCommentTest.kt", + "target": "app/src/androidTest/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/WorkspaceEditorCommentTest.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.editor", + "symbols": [] + }, + { + "source": "app/src/androidTest/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/WorkspaceEditorInitialLineTest.kt", + "target": "app/src/androidTest/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/WorkspaceEditorInitialLineTest.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.editor", + "symbols": [] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/LocalWebServer.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/preview/LocalWebServer.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.preview", + "symbols": [ + "FileApiEntry", + "LocalWebServer" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/WebViewHandler.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/preview/WebViewHandler.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.preview", + "symbols": [ + "WebViewHandler" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/WorkspaceFileSelector.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/components/mentions/MentionSuggestionPanel.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.chat.components.mentions", + "symbols": [ + "MentionSuggestionPanel", + "MentionSuggestionPanelStyle" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/WorkspaceUtils.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/WorkspaceUtils.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace", + "symbols": [ + "createAndGetDefaultWorkspace", + "createAndResetWorkspaceDirectory", + "ensureWorkspaceDirExists", + "getLegacyWorkspacePath", + "getWorkspacePath" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/computer/ComputerScreen.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/automation/terminal/ComputerScreen.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.computer", + "newPackage": "com.ai.assistance.operit.ui.features.automation.terminal", + "symbols": [ + "ComputerScreen" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/FileManager.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/FileManager.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace", + "symbols": [ + "DirectoryEntry", + "FileBrowser", + "QuickPathEntry", + "getFileIcon" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/WorkspaceBackupManager.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/WorkspaceBackupManager.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace", + "symbols": [ + "BackupManifest", + "FileStat", + "WorkspaceBackupManager" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/WorkspaceCommandExecutionState.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/WorkspaceCommandExecutionState.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace", + "symbols": [ + "WorkspaceCommandExecutionState", + "toWorkspaceCommandOutputEntries" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/WorkspaceConfig.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/WorkspaceConfig.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace", + "symbols": [ + "CommandConfig", + "ExportConfig", + "PreviewConfig", + "ServerConfig", + "WatchConfig", + "WorkspaceConfig", + "WorkspaceConfigReader" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/WorkspaceFileModels.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/WorkspaceFileModels.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace", + "symbols": [ + "OpenFileInfo", + "key" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/WorkspaceFilePreviewSupport.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/preview/WorkspaceFilePreviewSupport.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.preview", + "symbols": [ + "buildWorkspacePreviewUri", + "isAudio", + "isHtml", + "isImage", + "isMarkdown", + "isMediaPreviewable", + "isPdf", + "isReadOnlyDocumentPreviewable", + "isReadOnlyPreview", + "isSpreadsheetDocument", + "isVideo", + "isWordDocument", + "resolvedMimeType", + "workspaceMimeTypeForPath", + "workspaceShouldOpenAsDirectPreview" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/WorkspaceImagePreview.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/preview/WorkspaceImagePreview.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.preview", + "symbols": [ + "WorkspaceImagePreview" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/WorkspaceManager.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/WorkspaceManager.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace", + "symbols": [ + "CommandButtonsView", + "VSCodeTab", + "WorkspaceManager" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/WorkspacePreviewRefreshBus.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/preview/WorkspacePreviewRefreshBus.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.preview", + "symbols": [ + "WorkspacePreviewRefreshBus", + "WorkspacePreviewRefreshEvent" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/WorkspaceReadOnlyDocumentPreview.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/preview/WorkspaceReadOnlyDocumentPreview.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.preview", + "symbols": [ + "WorkspacePreviewFileState", + "WorkspaceReadOnlyDocumentPreview", + "rememberWorkspacePreviewFileState", + "workspacePreviewUriFromFile" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/WorkspaceScreen.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/WorkspaceScreen.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace", + "symbols": [ + "WorkspaceScreen" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/WorkspaceSetup.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/WorkspaceSetup.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace", + "symbols": [ + "ProjectTypeCard", + "WorkspaceSetup" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/browser/FileBrowserClipboard.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/FileBrowserClipboard.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.browser", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.browser", + "symbols": [ + "FileBrowserClipboard", + "FileBrowserClipboardItem" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/browser/FileBrowserSelectionBar.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/FileBrowserSelectionBar.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.browser", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.browser", + "symbols": [ + "FileBrowserSelectionBar" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/browser/WorkspaceBrowserDialogs.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/WorkspaceBrowserDialogs.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.browser", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.browser", + "symbols": [ + "FileBrowserContextMenu", + "FileBrowserSortDialog", + "sortDirectoryEntries" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/browser/WorkspaceBrowserOperations.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/WorkspaceBrowserOperations.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.browser", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.browser", + "symbols": [ + "FileBrowserOperations" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/browser/WorkspaceBrowserSupport.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/WorkspaceBrowserSupport.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.browser", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.browser", + "symbols": [ + "directoryModifiedTime", + "isValidWorkspaceEntryName", + "pruneWorkspaceShareCache" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/browser/properties/WorkspacePropertiesDialog.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/properties/WorkspacePropertiesDialog.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.browser.properties", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.browser.properties", + "symbols": [ + "WorkspacePropertiesDialog" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/browser/properties/WorkspacePropertiesRepository.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/properties/WorkspacePropertiesRepository.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.browser.properties", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.browser.properties", + "symbols": [ + "PropertyNode", + "WorkspaceDirectoryTotals", + "WorkspaceProperties", + "WorkspacePropertiesRepository", + "WorkspacePropertiesTarget", + "WorkspacePropertySource", + "WorkspaceTimeChangeResult" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/browser/properties/WorkspacePropertyAccess.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/properties/WorkspacePropertyAccess.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.browser.properties", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.browser.properties", + "symbols": [ + "WorkspacePropertyAccess" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/browser/properties/WorkspacePropertyProviders.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/properties/WorkspacePropertyProviders.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.browser.properties", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.browser.properties", + "symbols": [ + "RemoteWorkspacePropertySource", + "SafWorkspacePropertySource" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/browser/transfer/WorkspaceCopyProgress.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/transfer/WorkspaceCopyProgress.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.browser.transfer", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.browser.transfer", + "symbols": [ + "WorkspaceCopyProgress" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/browser/transfer/WorkspaceCopyProgressDialog.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/transfer/WorkspaceCopyProgressDialog.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.browser.transfer", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.browser.transfer", + "symbols": [ + "WorkspaceCopyProgressDialog" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/browser/transfer/WorkspaceDeleteProgress.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/transfer/WorkspaceDeleteProgress.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.browser.transfer", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.browser.transfer", + "symbols": [ + "WorkspaceDeleteOperation", + "WorkspaceDeleteProgress" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/browser/transfer/WorkspaceDeleteProgressDialog.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/transfer/WorkspaceDeleteProgressDialog.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.browser.transfer", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.browser.transfer", + "symbols": [ + "WorkspaceDeleteProgressDialog" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/browser/transfer/WorkspaceFileOperationDialog.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/transfer/WorkspaceFileOperationDialog.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.browser.transfer", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.browser.transfer", + "symbols": [ + "WorkspaceFileOperationDialog", + "WorkspaceOperationDetail" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/CanvasCodeEditorView.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/CanvasCodeEditorView.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.editor", + "symbols": [ + "CanvasCodeEditorView", + "EditorCompletionCallback", + "EditorKeyCommand" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/CodeEditor.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/CodeEditor.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.editor", + "symbols": [ + "CodeEditor", + "NativeCodeEditor" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/CodeFormatter.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/CodeFormatter.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.editor", + "symbols": [ + "CodeFormatter" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/CommentSyntax.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/CommentSyntax.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.editor", + "symbols": [ + "CommentSyntax", + "CommentSyntaxRegistry" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/EditorDocument.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/EditorDocument.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.editor", + "symbols": [ + "EditorDocument", + "EditorEditCommand", + "editorCellWidth", + "editorCodeUnitLength", + "editorExpandOffsetToCharacterEnd", + "editorNextCharacterOffset", + "editorNextSymbolOffset", + "editorPreviousCharacterOffset", + "editorPreviousSymbolOffset", + "editorSnapOffsetToCharacterBoundary" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/EditorMetrics.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/EditorMetrics.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.editor", + "symbols": [ + "EditorMetrics" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/EditorSyntaxHighlighter.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/EditorSyntaxHighlighter.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.editor", + "symbols": [ + "EditorSyntaxHighlighter", + "HighlightSnapshot" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/LanguageDetector.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/LanguageDetector.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.editor", + "symbols": [ + "LanguageDetector" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/completion/CompletionPopup.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/completion/CompletionPopup.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor.completion", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.editor.completion", + "symbols": [ + "CompletionItemRow", + "CompletionPopup" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/completion/CompletionProvider.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/completion/CompletionProvider.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor.completion", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.editor.completion", + "symbols": [ + "CompletionItem", + "CompletionItemKind", + "CompletionProvider" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/completion/CompletionProviderFactory.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/completion/CompletionProviderFactory.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor.completion", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.editor.completion", + "symbols": [ + "CompletionProviderFactory" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/completion/DartCompletionProvider.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/completion/DartCompletionProvider.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor.completion", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.editor.completion", + "symbols": [ + "DartCompletionProvider" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/completion/DefaultCompletionProvider.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/completion/DefaultCompletionProvider.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor.completion", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.editor.completion", + "symbols": [ + "DefaultCompletionProvider" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/completion/HtmlCompletionProvider.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/completion/HtmlCompletionProvider.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor.completion", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.editor.completion", + "symbols": [ + "HtmlCompletionProvider" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/completion/JavaScriptCompletionProvider.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/completion/JavaScriptCompletionProvider.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor.completion", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.editor.completion", + "symbols": [ + "JavaScriptCompletionProvider" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/completion/KotlinCompletionProvider.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/completion/KotlinCompletionProvider.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor.completion", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.editor.completion", + "symbols": [ + "KotlinCompletionProvider" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/language/BaseLanguageSupport.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/language/BaseLanguageSupport.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor.language", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.editor.language", + "symbols": [ + "BaseLanguageSupport" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/language/DartSupport.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/language/DartSupport.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor.language", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.editor.language", + "symbols": [ + "DartSupport" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/language/HtmlSupport.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/language/HtmlSupport.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor.language", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.editor.language", + "symbols": [ + "HtmlSupport" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/language/JavaScriptSupport.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/language/JavaScriptSupport.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor.language", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.editor.language", + "symbols": [ + "JavaScriptSupport" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/language/KotlinSupport.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/language/KotlinSupport.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor.language", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.editor.language", + "symbols": [ + "KotlinSupport" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/language/LanguageFactory.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/language/LanguageFactory.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor.language", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.editor.language", + "symbols": [ + "LanguageFactory" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/language/LanguageSupport.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/language/LanguageSupport.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor.language", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.editor.language", + "symbols": [ + "LanguageSupport" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/language/LanguageSupportRegistry.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/language/LanguageSupportRegistry.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor.language", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.editor.language", + "symbols": [ + "LanguageSupportRegistry" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/theme/EditorTheme.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/theme/EditorTheme.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor.theme", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.editor.theme", + "symbols": [ + "DarkTheme", + "EditorTheme", + "LightTheme", + "getThemeForLanguage" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/links/WorkspaceFileLink.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/links/WorkspaceFileLink.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.links", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.links", + "symbols": [ + "WorkspaceFileLink", + "parseWorkspaceFileLink" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/links/WorkspaceFileLinkHost.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/links/WorkspaceFileLinkHost.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.links", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.links", + "symbols": [ + "LocalWorkspaceFileLinkOpener", + "WorkspaceFileLinkDialog", + "WorkspaceFileLinkHost" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/links/WorkspaceMarkdownLink.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/links/WorkspaceMarkdownLink.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.links", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.links", + "symbols": [ + "WorkspaceMarkdownLink", + "findWorkspaceMarkdownAnchorLine", + "resolveWorkspaceMarkdownLink" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/markdown/WorkspaceMarkdownPreview.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/markdown/WorkspaceMarkdownPreview.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.markdown", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.markdown", + "symbols": [ + "WorkspaceMarkdownPreview" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/process/DepthLimitedFileObserver.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/process/DepthLimitedFileObserver.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.process", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.process", + "symbols": [ + "DepthLimitedFileObserver", + "WorkspaceFileChange", + "WorkspaceFileChangeKind" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/process/GitIgnoreFilter.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/process/GitIgnoreFilter.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.process", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.process", + "symbols": [ + "GitIgnoreFilter" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/process/WorkspaceAttachmentProcessor.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/process/WorkspaceAttachmentProcessor.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.process", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.process", + "symbols": [ + "WorkspaceAttachmentProcessor" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/process/WorkspaceChangeTracker.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/process/WorkspaceChangeTracker.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.process", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.process", + "symbols": [ + "WorkspaceChangeSnapshot", + "WorkspaceChangeTracker" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/process/WorkspaceRuleFileReader.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/process/WorkspaceRuleFileReader.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.process", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.process", + "symbols": [ + "WorkspaceRuleFileReader" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/search/WorkspaceTextSearch.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/search/WorkspaceTextSearch.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.search", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.search", + "symbols": [ + "FileSearchBar", + "activeSearchMatchAfterUpdate", + "findTextMatches" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/text/WorkspaceTextReadPolicy.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/text/WorkspaceTextReadPolicy.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.text", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.text", + "symbols": [ + "WORKSPACE_TEXT_PREVIEW_LIMIT_BYTES", + "readWorkspaceTextWithinLimit" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/workspace/WorkspaceHubHome.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/hub/WorkspaceHubHome.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.workspace", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.hub", + "symbols": [ + "WorkspaceHubHome" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/workspace/WorkspaceHubOverlay.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/hub/WorkspaceHubOverlay.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.workspace", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.hub", + "symbols": [ + "WorkspaceHubOverlay" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/workspace/WorkspaceHubScreen.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/hub/WorkspaceHubScreen.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.workspace", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.hub", + "symbols": [ + "WorkspaceHubScreen" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/workspace/WorkspaceHubState.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/hub/WorkspaceHubState.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.workspace", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.hub", + "symbols": [ + "WorkspaceEntryAction", + "WorkspaceEntryRequest", + "WorkspaceHubPage" + ] + }, + { + "source": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/workspace/WorkspaceSessionTabs.kt", + "target": "app/src/main/java/com/ai/assistance/operit/ui/features/conversation/workspace/hub/WorkspaceSessionTabs.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.workspace", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.hub", + "symbols": [ + "WorkspaceSessionTabs" + ] + }, + { + "source": "app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/browser/FileBrowserClipboardTest.kt", + "target": "app/src/test/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/FileBrowserClipboardTest.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.browser", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.browser", + "symbols": [] + }, + { + "source": "app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/browser/WorkspaceBrowserSupportTest.kt", + "target": "app/src/test/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/WorkspaceBrowserSupportTest.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.browser", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.browser", + "symbols": [] + }, + { + "source": "app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/browser/transfer/WorkspaceDeleteOperationTest.kt", + "target": "app/src/test/java/com/ai/assistance/operit/ui/features/conversation/workspace/browser/transfer/WorkspaceDeleteOperationTest.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.browser.transfer", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.browser.transfer", + "symbols": [] + }, + { + "source": "app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/editor/WorkspaceCommentSyntaxTest.kt", + "target": "app/src/test/java/com/ai/assistance/operit/ui/features/conversation/workspace/editor/WorkspaceCommentSyntaxTest.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.editor", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.editor", + "symbols": [] + }, + { + "source": "app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/links/WorkspaceFileLinkTest.kt", + "target": "app/src/test/java/com/ai/assistance/operit/ui/features/conversation/workspace/links/WorkspaceFileLinkTest.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.links", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.links", + "symbols": [] + }, + { + "source": "app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/links/WorkspaceMarkdownLinkTest.kt", + "target": "app/src/test/java/com/ai/assistance/operit/ui/features/conversation/workspace/links/WorkspaceMarkdownLinkTest.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.links", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.links", + "symbols": [] + }, + { + "source": "app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/search/WorkspaceTextSearchTest.kt", + "target": "app/src/test/java/com/ai/assistance/operit/ui/features/conversation/workspace/search/WorkspaceTextSearchTest.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.search", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.search", + "symbols": [] + }, + { + "source": "app/src/test/java/com/ai/assistance/operit/ui/features/conversation/chat/webview/workspace/text/WorkspaceTextReadPolicyTest.kt", + "target": "app/src/test/java/com/ai/assistance/operit/ui/features/conversation/workspace/text/WorkspaceTextReadPolicyTest.kt", + "oldPackage": "com.ai.assistance.operit.ui.features.conversation.chat.webview.workspace.text", + "newPackage": "com.ai.assistance.operit.ui.features.conversation.workspace.text", + "symbols": [] + } + ] +} diff --git a/docs/TODO/chore/conversation-workspace-layout/index.md b/docs/TODO/chore/conversation-workspace-layout/index.md new file mode 100644 index 0000000000..186d8d4ae3 --- /dev/null +++ b/docs/TODO/chore/conversation-workspace-layout/index.md @@ -0,0 +1,26 @@ +--- +fork: https://github.com/3316891527/Operit +status: implemented-awaiting-ci +--- + +# 会话工作区按职责归类 + +原 `conversation.chat.webview` 同时包含工作区、代码编辑器、文件浏览器、网页预览、聊天提及候选面板和终端入口。原 `conversation.chat.workspace` 另存放工作区主页与导航。目录归属仍以早期网页预览实现为中心,无法反映这些功能的现有职责。 + +本批将工作区提升到 `ui.features.conversation.workspace`,沿用项目已有的复数 `features`,与 `chat` 平级。现有浏览、编辑、搜索、链接、处理和文件操作子包保留各自职责,网页预览归入 `workspace.preview`,主页与导航归入 `workspace.hub`。 + +- [x] 建立逐文件迁移清单,包含 72 个主源码文件、8 个 JVM 测试文件与 2 个 Android 测试文件 +- [x] 移除旧 `chat.webview` 源码目录,工作区主页与导航一起迁出 `chat.workspace` +- [x] 提及候选面板归入 `chat.components.mentions` 并按实际组件改名为 `MentionSuggestionPanel.kt`;终端入口归入现有 `automation.terminal` +- [x] 同步所有调用、包声明、显式导入、星号导入和原同包隐式引用 +- [x] 核对迁移前后声明体,确认仅包名、导入和显式路径发生变化 +- [x] 更新当前开发文档中的路径,保留既往迁移清单的历史记录 +- [x] 完成实施阶段本地迁移,后续交付记录由聊天目录整理分支和 PR 衔接 + +此次不改变应用身份、用户工作区目录、配置 JSON、预览服务端口、编辑器行为或文件操作规则。复制与删除的实现和回归用例随目录一起迁移。 + +后续[聊天职责整理](../chat-responsibility-layout/index.md)已继续归类聊天代码,提及候选面板的当前位置为 `chat.modules.input.mentions`。本页和 `files.json` 保留工作区迁移阶段的映射,最终位置由后一阶段清单继续衔接。 + +逐文件映射见 [files.json](files.json),本批静态核对见[迁移验证记录](01-validation.md),完整文件操作回归范围见[文件操作验证](../../fix/workspace-copy-streaming-progress/01-validation.md)。 + +[DONE] 本地迁移与静态核对;编译、测试和 CI 尚未验证本次迁移。 diff --git "a/docs/TODO/feat/chat-archive-and-settings-polish/01-\345\256\236\347\216\260\344\270\216\351\252\214\350\257\201.md" "b/docs/TODO/feat/chat-archive-and-settings-polish/01-\345\256\236\347\216\260\344\270\216\351\252\214\350\257\201.md" index db7f040fde..83b6a9b65e 100644 --- "a/docs/TODO/feat/chat-archive-and-settings-polish/01-\345\256\236\347\216\260\344\270\216\351\252\214\350\257\201.md" +++ "b/docs/TODO/feat/chat-archive-and-settings-polish/01-\345\256\236\347\216\260\344\270\216\351\252\214\350\257\201.md" @@ -13,7 +13,7 @@ ## 2. 对话归档 -新增 `data/chat/archive` 与 `ui/features/chat/archive`。数据库从 27 升到 28,只为聊天元数据新增 `archived`,已有聊天默认未归档。 +归档数据实现位于 `data/chat/archive`,归档筛选界面位于 `ui/features/conversation/chat/modules/history/`。数据库从 27 升到 28,只为聊天元数据新增 `archived`,已有聊天默认未归档。 - 历史列表与主侧栏共用“归档对话”“恢复到聊天列表”操作及“已归档”筛选 - 归档保留消息、工作区、文件夹路径、角色绑定、锁定、置顶、排序和最近使用时间 diff --git "a/docs/TODO/feat/chat-batch-and-settings/01-\345\256\236\347\216\260\350\257\264\346\230\216.md" "b/docs/TODO/feat/chat-batch-and-settings/01-\345\256\236\347\216\260\350\257\264\346\230\216.md" index f727cf6ca4..f7ed3ee245 100644 --- "a/docs/TODO/feat/chat-batch-and-settings/01-\345\256\236\347\216\260\350\257\264\346\230\216.md" +++ "b/docs/TODO/feat/chat-batch-and-settings/01-\345\256\236\347\216\260\350\257\264\346\230\216.md" @@ -2,7 +2,7 @@ ## 对话批量操作 -`ui/features/chat/batch/` 独立维护执行器、进度与操作控件。侧栏和独立历史面板都通过现有聊天 ViewModel 接入,搜索与列表设置各左移一格,新建胶囊宽度不变,最右侧显示批量操作图标。 +`ui/features/conversation/chat/modules/history/batch/` 维护操作控件,执行器位于 `chat/viewmodel/history/`,动作和进度声明位于 `chat/foundation/model/`。侧栏和独立历史面板都通过现有聊天 ViewModel 接入,搜索与列表设置各左移一格,新建胶囊宽度不变,最右侧显示批量操作图标。 选择模式用整行复选框语义切换对话,不会打开聊天。可全选当前展开列表、取消选择和退出;全选包含可滚动到但尚未上屏的行,不包含折叠文件夹、另一归档视图或其他筛选范围。当前列表范围缩小时清理隐藏选择。列表仍可滚动、展开目录和快速定位。 diff --git "a/docs/TODO/feat/chat-image-picker-preview/01-\345\256\236\347\216\260\344\270\216\351\252\214\350\257\201.md" "b/docs/TODO/feat/chat-image-picker-preview/01-\345\256\236\347\216\260\344\270\216\351\252\214\350\257\201.md" index 7d92b00830..fd1787fc6f 100644 --- "a/docs/TODO/feat/chat-image-picker-preview/01-\345\256\236\347\216\260\344\270\216\351\252\214\350\257\201.md" +++ "b/docs/TODO/feat/chat-image-picker-preview/01-\345\256\236\347\216\260\344\270\216\351\252\214\350\257\201.md" @@ -8,7 +8,7 @@ ## 组件与数据流 -新增的 `ui/features/chat/attachments/images/` 包包含以下组件: +图片选择与预览位于 `ui/features/conversation/chat/modules/attachments/images/`,包含以下组件: - `ChatImagePickerDialog.kt`:全屏 Compose 相册网格,按 MediaStore 的图片时间倒序展示;支持相册筛选、跨相册多选、长按或按钮预览、确认数量、刷新,以及照片授权状态 - `MediaStoreImageRepository.kt`:在 IO 线程读取图片元数据,读取循环响应取消;区分无权限、部分图片权限和完整权限,不把查询失败显示成空相册 diff --git "a/docs/TODO/feat/chat_ui_redesign/01-\346\266\210\346\201\257\347\224\237\346\210\220\350\257\246\346\203\205.md" "b/docs/TODO/feat/chat_ui_redesign/01-\346\266\210\346\201\257\347\224\237\346\210\220\350\257\246\346\203\205.md" index c7fbb7bc69..674208efcb 100644 --- "a/docs/TODO/feat/chat_ui_redesign/01-\346\266\210\346\201\257\347\224\237\346\210\220\350\257\246\346\203\205.md" +++ "b/docs/TODO/feat/chat_ui_redesign/01-\346\266\210\346\201\257\347\224\237\346\210\220\350\257\246\346\203\205.md" @@ -8,7 +8,7 @@ ## 实现范围 -`app/src/main/java/com/ai/assistance/operit/ui/features/chat/components/details/` 独立负责生成详情和公共格式化。`ChatArea.kt` 接入详情和右下角完成时间,`MessageInfoDialog.kt` 复用完整数字、Token 明细、耗时和速率格式。 +`app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/messages/details/` 独立负责生成详情和公共格式化。`ChatArea.kt` 接入详情和右下角完成时间,`MessageInfoDialog.kt` 复用完整数字、Token 明细、耗时和速率格式。 生成详情默认折叠。启用 Token 简报时,标题只显示整数 K/M/B 总用量;不足 1,000 时显示原数字。缩写使用四舍五入,达到 1000K 或 1000M 时进位为 1M 或 1B。展开后按以下顺序显示四组信息,窄屏和大字体允许明细自然换行: diff --git "a/docs/TODO/feat/chat_ui_redesign/04-\345\267\245\344\275\234\345\214\272\344\270\216\347\273\210\347\253\257\347\273\237\344\270\200\345\205\245\345\217\243.md" "b/docs/TODO/feat/chat_ui_redesign/04-\345\267\245\344\275\234\345\214\272\344\270\216\347\273\210\347\253\257\347\273\237\344\270\200\345\205\245\345\217\243.md" index 78edc5c033..b500d356a7 100644 --- "a/docs/TODO/feat/chat_ui_redesign/04-\345\267\245\344\275\234\345\214\272\344\270\216\347\273\210\347\253\257\347\273\237\344\270\200\345\205\245\345\217\243.md" +++ "b/docs/TODO/feat/chat_ui_redesign/04-\345\267\245\344\275\234\345\214\272\344\270\216\347\273\210\347\253\257\347\273\237\344\270\200\345\205\245\345\217\243.md" @@ -6,7 +6,7 @@ ## 作用域 -- 新建 `ui/features/chat/workspace`,承载统一导航状态、主页和页面容器。 +- 工作区统一导航状态、主页和页面容器位于 `ui/features/conversation/workspace/hub/`。 - 右上角保留一个工作区按钮,继续使用已绑定/未绑定的图标;进入时隐藏输入法。 - 主页显示当前工作区、关联对话和角色卡、绑定目录、实际终端会话数,以及创建、选择、工作区和终端入口。 - 创建和选择入口直接调用现有项目模板弹窗与目录选择器;保留 Android、Linux 和 SAF 工作区的绑定能力。 diff --git "a/docs/TODO/feat/chat_ui_redesign/14-\345\257\271\350\257\235\344\270\216\350\247\222\350\211\262\350\277\233\345\205\245\344\270\273\344\276\247\350\276\271\346\240\217.md" "b/docs/TODO/feat/chat_ui_redesign/14-\345\257\271\350\257\235\344\270\216\350\247\222\350\211\262\350\277\233\345\205\245\344\270\273\344\276\247\350\276\271\346\240\217.md" index c1dfacbe0b..c5ce1bbfb4 100644 --- "a/docs/TODO/feat/chat_ui_redesign/14-\345\257\271\350\257\235\344\270\216\350\247\222\350\211\262\350\277\233\345\205\245\344\270\273\344\276\247\350\276\271\346\240\217.md" +++ "b/docs/TODO/feat/chat_ui_redesign/14-\345\257\271\350\257\235\344\270\216\350\247\222\350\211\262\350\277\233\345\205\245\344\270\273\344\276\247\350\276\271\346\240\217.md" @@ -15,7 +15,7 @@ branch: feat/chat-ui-redesign ## 实现范围 -- `ui/features/chat/sidebar/` 提供侧栏组件、共享状态和 `MainChatControls`。`OperitApp` 创建 Activity 级 ChatViewModel,侧栏和主聊天路由共用当前对话、生成状态、历史筛选及角色切换设置。 +- `ui/features/conversation/chat/modules/sidebar/` 提供侧栏组件、共享状态和 `MainChatControls`。`OperitApp` 创建 Activity 级 ChatViewModel,侧栏和主聊天路由共用当前对话、生成状态、历史筛选及角色切换设置。 - 侧栏品牌与收起按钮使用一行,角色头像、名称及切换箭头使用下一行,旁边用小图标打开角色管理。角色卡和群组选择继续复用现有选择面板,头像规则不变。 - 目录工具行包含 36dp 高的新建对话按钮,以及文件夹、搜索和历史设置图标。搜索由图标按需展开为 36dp 高的输入框,主动展开时请求焦点;关闭抽屉或跳转前清除焦点并收起输入法。 - 嵌套目录占剩余高度。原有三种显示方式、搜索、排序、拖动、置顶、锁定、绑定编辑、删除和目录数据继续复用。目录主标题、次级信息、选中行和拖动预览明确设置对应文字色,侧栏自定义背景也传递给目录。 diff --git "a/docs/TODO/feat/chat_ui_redesign/16-\350\247\222\350\211\262\345\274\271\347\252\227\344\270\216\346\250\241\345\236\213\346\240\207\350\257\206\345\217\212\350\256\260\345\277\206\350\256\276\347\275\256.md" "b/docs/TODO/feat/chat_ui_redesign/16-\350\247\222\350\211\262\345\274\271\347\252\227\344\270\216\346\250\241\345\236\213\346\240\207\350\257\206\345\217\212\350\256\260\345\277\206\350\256\276\347\275\256.md" index 383b502336..289e04f148 100644 --- "a/docs/TODO/feat/chat_ui_redesign/16-\350\247\222\350\211\262\345\274\271\347\252\227\344\270\216\346\250\241\345\236\213\346\240\207\350\257\206\345\217\212\350\256\260\345\277\206\350\256\276\347\275\256.md" +++ "b/docs/TODO/feat/chat_ui_redesign/16-\350\247\222\350\211\262\345\274\271\347\252\227\344\270\216\346\250\241\345\236\213\346\240\207\350\257\206\345\217\212\350\256\260\345\277\206\350\256\276\347\275\256.md" @@ -12,7 +12,7 @@ branch: feat/chat-ui-redesign [角色编辑](../../../../app/src/main/java/com/ai/assistance/operit/ui/features/settings/components/CharacterCardDialog.kt)复用新的[分页弹窗](../../../../app/src/main/java/com/ai/assistance/operit/ui/common/dialogs/ContentSizedTabbedDialog.kt)。窗口宽度上限为 640dp,屏幕及键盘共同限制可用高度。当前页通过滚动容器内部的完整内容测量决定页高,保留各页独立滚动位置与表单草稿;窄屏或大字体下,底部操作可换行。表单采用圆角、淡色容器和较柔和的边框。 -[Agent 输入栏](../../../../app/src/main/java/com/ai/assistance/operit/ui/features/chat/components/style/input/agent/AgentChatInputSection.kt)的两种输入布局、模型摘要、配置列表以及多模型配置展开后的各个条目,均复用 ProviderLogoLoader 的供应商素材。标识随实际配置的供应商变化;现有加载器没有登记素材时不增加占位标识。名称仍可省略,配置中的长模型名增加宽度约束。 +[Agent 输入栏](../../../../app/src/main/java/com/ai/assistance/operit/ui/features/conversation/chat/modules/input/agent/AgentChatInputSection.kt)的两种输入布局、模型摘要、配置列表以及多模型配置展开后的各个条目,均复用 ProviderLogoLoader 的供应商素材。标识随实际配置的供应商变化;现有加载器没有登记素材时不增加占位标识。名称仍可省略,配置中的长模型名增加宽度约束。 设置首页保留 GitHub 账号管理入口,登录和退出统一在既有账号页面操作。 diff --git "a/docs/TODO/feat/chat_ui_redesign/22-\344\270\212\344\270\213\346\226\207\347\273\237\350\256\241\344\270\216\347\264\257\350\256\241\347\224\250\351\207\217.md" "b/docs/TODO/feat/chat_ui_redesign/22-\344\270\212\344\270\213\346\226\207\347\273\237\350\256\241\344\270\216\347\264\257\350\256\241\347\224\250\351\207\217.md" index d46939c1b1..a638fae6d9 100644 --- "a/docs/TODO/feat/chat_ui_redesign/22-\344\270\212\344\270\213\346\226\207\347\273\237\350\256\241\344\270\216\347\264\257\350\256\241\347\224\250\351\207\217.md" +++ "b/docs/TODO/feat/chat_ui_redesign/22-\344\270\212\344\270\213\346\226\207\347\273\237\350\256\241\344\270\216\347\264\257\350\256\241\347\224\250\351\207\217.md" @@ -14,7 +14,7 @@ status: 源码完成,待仓库工作流和实机验收 ## 作用域 - 将 #1249 的请求快照、分类估算接入现有消息准备链路,详情读取不发布窗口估算,也不更新累计计数 -- 新建 `core/chat/context/` 与 `ui/features/chat/components/context/`,分别承载窗口拆分与统计界面 +- 新建 `core/chat/context/` 与 `ui/features/conversation/chat/modules/usage/`,分别承载窗口拆分与统计界面 - 窗口占用页展示消息历史及用户、AI、工具结果子项,系统提示词、常驻工具、MCP/包工具、技能目录、压缩摘要和其他占用 - 显示剩余空间、自动总结缓冲与设置阈值,复用现有手动总结操作 - 累计用量页读取当前对话已有输入、输出计数,展示总计及输入、输出构成;不从当前可见消息重新求和 diff --git "a/docs/TODO/feat/chat_ui_redesign/25-\345\244\215\345\256\241\347\277\273\350\257\221\344\270\216\347\216\273\347\222\203\346\225\210\346\236\234\346\201\242\345\244\215.md" "b/docs/TODO/feat/chat_ui_redesign/25-\345\244\215\345\256\241\347\277\273\350\257\221\344\270\216\347\216\273\347\222\203\346\225\210\346\236\234\346\201\242\345\244\215.md" index a9d7f121ba..debd689d46 100644 --- "a/docs/TODO/feat/chat_ui_redesign/25-\345\244\215\345\256\241\347\277\273\350\257\221\344\270\216\347\216\273\347\222\203\346\225\210\346\236\234\346\201\242\345\244\215.md" +++ "b/docs/TODO/feat/chat_ui_redesign/25-\345\244\215\345\256\241\347\277\273\350\257\221\344\270\216\347\216\273\347\222\203\346\225\210\346\236\234\346\201\242\345\244\215.md" @@ -12,7 +12,7 @@ ## 玻璃回归的原因与改动 -`liquidGlass` 的 `enableLens` 共享默认值由 true 改为 false,导致原来依赖默认值的三个输入框调用和一个工作区文件提及面板调用失去透镜效果。本次在 Agent 输入框两处、经典输入框一处及 `WorkspaceFileSelector` 一处显式传入 `enableLens = true`,使原有透镜不再取决于共享默认值。纯磨砂区域和气泡上原有的 `enableLens = false` 继续保留。 +`liquidGlass` 的 `enableLens` 共享默认值由 true 改为 false,导致原来依赖默认值的三个输入框调用和一个工作区文件提及面板调用失去透镜效果。本次在 Agent 输入框两处、经典输入框一处及 `chat.modules.input.mentions.MentionSuggestionPanel` 一处显式传入 `enableLens = true`,使原有透镜不再取决于共享默认值。纯磨砂区域和气泡上原有的 `enableLens = false` 继续保留。 `WaterGlass` 此前把曲面强度统一降为 0.08、折射统一降为 0.02,聊天气泡和输入框的水玻璃辨识度随之降低。本次恢复聊天区域原有的深浅主题强度:曲面为浅色 0.40、深色 0.30,折射为浅色 0.12、深色 0.09。手机与宽屏侧栏通过 `subtleRefraction = true` 显式保留 0.08、0.02,维持已经调整的低强度侧栏观感。 diff --git a/docs/TODO/feat/linux-file-preview/02-file-links-and-theme.md b/docs/TODO/feat/linux-file-preview/02-file-links-and-theme.md index cca444f027..a10a1d9ba5 100644 --- a/docs/TODO/feat/linux-file-preview/02-file-links-and-theme.md +++ b/docs/TODO/feat/linux-file-preview/02-file-links-and-theme.md @@ -4,7 +4,7 @@ ## 聊天文件入口 -新增 `ui/features/chat/webview/workspace/links/` 功能目录。WorkspaceFileLink 解析路径、来源环境与行号,WorkspaceFileLinkHost 作为 ChatScreenContent 的文件入口容器;Cursor 与 Bubble 共用的 LinkPreviewDialog 在点击“访问”后把文件请求交给该容器。 +文件链接功能位于 `ui/features/conversation/workspace/links/`。WorkspaceFileLink 解析路径、来源环境与行号,WorkspaceFileLinkHost 作为 ChatScreenContent 的文件入口容器;Cursor 与 Bubble 共用的 LinkPreviewDialog 在点击“访问”后把文件请求交给该容器。 | 链接形式 | 来源与打开行为 | | --- | --- | diff --git a/docs/TODO/feat/linux-file-preview/index.md b/docs/TODO/feat/linux-file-preview/index.md index f4f8aac9d5..24a81b72bf 100644 --- a/docs/TODO/feat/linux-file-preview/index.md +++ b/docs/TODO/feat/linux-file-preview/index.md @@ -23,7 +23,7 @@ branch: feat/linux-file-preview ## 实现范围与结构 -- 在现有 `ui/features/chat/webview/workspace/` 下扩展文件浏览器、工作区管理器和选择工作区页;文件操作菜单与排序对话框拆为同一功能包下的辅助组件。 +- 文件浏览器、工作区管理器和选择工作区页位于 `ui/features/conversation/workspace/`;文件操作菜单与排序对话框归入其 `browser/` 子包。 - 复用 `FileUtils` 的文本类型判断、已有 `CodeEditor`,以及图片、播放器、PDF、Word 和表格预览组件。 - 绑定后的 `WorkspaceManager` 默认显示 `FileBrowser`,预览通过顶部标签进入;导出、重命名和解绑移到顶部菜单,编辑操作显示在编辑页面上方。 - 未绑定状态通过 `WorkspaceScreen` 临时打开文件,保存按文件携带的来源环境执行,返回时恢复目录选择页,不修改聊天绑定。 diff --git a/docs/TODO/feat/voice-messages/01-implementation.md b/docs/TODO/feat/voice-messages/01-implementation.md index 0594c5abb0..2fdecc2f82 100644 --- a/docs/TODO/feat/voice-messages/01-implementation.md +++ b/docs/TODO/feat/voice-messages/01-implementation.md @@ -9,7 +9,7 @@ 经典和 Agent 输入组件新增可选录音回调,主聊天页主动接入。尚无当前聊天时先沿用新建聊天流程,再打开录音面板。空白文字、没有附件、没有引用且未处理请求时显示麦克风;已有附件仍走发送,正在处理仍保留取消逻辑。附件菜单里的语音通话继续使用原入口。未接入新回调的其他输入组件调用点保留原行为。 -`ui/features/chat/voicemessages/` 独立提供底部录音面板、会话状态和播放器。首次打开请求麦克风权限,录音显示计时、实际 PCM 音量波形、关闭和“说完了”。录制结束进入确认页,成功转写后才允许发送,可以试听、查看文字和重录,失败后可重试转写。 +`ui/features/conversation/chat/modules/voice/` 独立提供底部录音面板、会话状态和播放器。首次打开请求麦克风权限,录音显示计时、实际 PCM 音量波形、关闭和“说完了”。录制结束进入确认页,成功转写后才允许发送,可以试听、查看文字和重录,失败后可重试转写。 `api/speech/voicemessage/` 使用独立 AudioRecord 录制 16 kHz 单声道 PCM16 WAV,文件位于 `filesDir/media_pool/voice/`,现有媒体存储统计和音频清理会覆盖该目录。Silero VAD 检测人声,连续三秒未检测到人声时停止;从开始一直无人声同样停止并提示重新录制。第一版设置 60 秒上限,波形压缩为至多 48 个峰值。VAD 和 AudioRecord 在录制结束时释放,非阻塞读取避免取消等待音频读满。 diff --git a/docs/TODO/fix/README.md b/docs/TODO/fix/README.md index 46c524e841..5d7d328ae5 100644 --- a/docs/TODO/fix/README.md +++ b/docs/TODO/fix/README.md @@ -6,6 +6,8 @@ ## 计划索引 +- [工作区复制内存与文件操作进度](workspace-copy-streaming-progress/index.md) + - [流式气泡停更修复](streaming-bubble-freeze/index.md) - [提示、插件配置入口与 Waifu 首次展示](ux-stream-ui-followup/index.md) - [语音条 WebView 挂载焦点修复](toolpkg-webview-focus/index.md) · `toolpkg-webview-focus` diff --git "a/docs/TODO/fix/chat-single-scroll/01-\345\215\225\345\261\202\346\273\232\345\212\250\345\256\236\347\216\260.md" "b/docs/TODO/fix/chat-single-scroll/01-\345\215\225\345\261\202\346\273\232\345\212\250\345\256\236\347\216\260.md" index fcd0adab27..aadc6834fb 100644 --- "a/docs/TODO/fix/chat-single-scroll/01-\345\215\225\345\261\202\346\273\232\345\212\250\345\256\236\347\216\260.md" +++ "b/docs/TODO/fix/chat-single-scroll/01-\345\215\225\345\261\202\346\273\232\345\212\250\345\256\236\347\216\260.md" @@ -8,7 +8,7 @@ 主聊天由普通滚动列切换为标准 Compose LazyColumn。短回复仍作为完整条目;可见节点数达到 24 或可见节点正文总长度达到 32,000 字符时,长回复的分组标题、工具调用、结果与 Markdown 节点作为外层列表条目显示。超长纯文本按块保留全部内容,分块不切断 emoji 的代理对。 -`chat/components/timeline` 按消息准备流式和静态节点,并把条目映射到完整消息索引。消息身份包含聊天、时间戳、同时间戳序号与所选回答版本。分组和卡片使用节点类型及同类型序号作为身份,减少协议元数据过滤及流式转静态时的身份变化。 +`chat/modules/messages/timeline` 按消息准备流式和静态节点,并把条目映射到完整消息索引。消息身份包含聊天、时间戳、同时间戳序号与所选回答版本。分组和卡片使用节点类型及同类型序号作为身份,减少协议元数据过滤及流式转静态时的身份变化。 `common/markdown/lazy` 提供内容块渲染接口和消息持有的卡片状态。流式收集与静态解析不随条目离屏取消,离屏只停止布局和绘制;工具、思考、details 和分组的手动展开选择由消息保存。嵌套 Markdown 渲染清除外层片段上下文,完整消息预览与导出继续使用完整渲染入口。 diff --git "a/docs/TODO/fix/oom-workflow-audio/01-\345\256\232\344\275\215\344\270\216\344\277\256\345\244\215.md" "b/docs/TODO/fix/oom-workflow-audio/01-\345\256\232\344\275\215\344\270\216\344\277\256\345\244\215.md" index 9a2843f5cf..ee6307f69a 100644 --- "a/docs/TODO/fix/oom-workflow-audio/01-\345\256\232\344\275\215\344\270\216\344\277\256\345\244\215.md" +++ "b/docs/TODO/fix/oom-workflow-audio/01-\345\256\232\344\275\215\344\270\216\344\277\256\345\244\215.md" @@ -52,7 +52,7 @@ 文本、Base64 和需注入脚本的 HTML 响应继续按各自协议处理。没有新增播放器、改变音频编码或增加音频文件大小限制,也没有增加新的错误回退。 -修改位置:`ui/common/composedsl/ToolPkgComposeDslWebView.kt`、`ui/features/chat/webview/LocalWebServer.kt`。 +修改位置:`ui/common/composedsl/ToolPkgComposeDslWebView.kt`、`ui/features/conversation/workspace/preview/LocalWebServer.kt`。 ### 生命周期核对 diff --git a/docs/TODO/fix/workspace-copy-streaming-progress/01-validation.md b/docs/TODO/fix/workspace-copy-streaming-progress/01-validation.md new file mode 100644 index 0000000000..cab32693cb --- /dev/null +++ b/docs/TODO/fix/workspace-copy-streaming-progress/01-validation.md @@ -0,0 +1,88 @@ +# 工作区复制与删除验证 + +## 已完成的静态核对 + +- `git diff --check` 通过 +- 9 组新增语言资源 XML 均能解析,每组包含 19 个界面条目 +- 核对复制入口继续经过既有文件工具及权限路由,本机传输复用终端挂载映射 +- 核对传输缓冲区为任务级复用的 256 KiB,目录遍历不缓存完整文件清单 +- 核对界面通过单次调用令牌接收复制进度,结束、失败时均移除观察者并清空面板状态 +- 核对单项和批量删除复用进度窗口,既有 `delete_file` 参数、权限路由和确认入口未变;剪切收尾不弹出删除窗口 + +未执行本地编译、构建或测试。共新增 17 条 JVM 回归用例,包含 10 条流式复制用例及 7 条删除状态用例。这些用例由仓库 Android Tests 运行,远端结果以对应工作流为准;Android 实机内存峰值和 UI 尚未测量。 + +## 回归范围 + +| 编号 | 做什么 | 预期行为 | +| --- | --- | --- | +| A1 | 复制 64 MiB 二进制文件并流式计算 SHA-256 | 大小与摘要一致;统计阶段总量未知,成功完成后才出现 100% | +| A2 | 复制含隐藏文件、80 个小文件、空目录和零字节文件的目录 | 内容和目录齐全,文件数及剩余字节正确 | +| A3 | 复制带指向自身目录链接的目录 | 复制链接本身,不遍历链接目标 | +| A4 | 复制到自身、含 `..` 的子目录及别名子目录 | 写入前拒绝,不创建目标 | +| A5 | 复制到已存在文件并分别关闭、开启覆盖 | 关闭时保留目标,开启时正确截断并写入 | +| A6 | 将目录复制到无法创建文件的目标 | 返回失败,不报告完成,来源保留 | +| A7 | 在文件传输中取消调用 | 及时停止,不报告完成,来源保留 | +| A8 | 在统计完成后增加来源文件 | 来源变更导致失败,不报告完整成功 | +| A9 | 在统计完成后创建同名目标目录 | 不合并或覆盖刚出现的目标 | +| A10 | 复制空目录并检查递归开关 | 关闭递归时拒绝;开启时以零字节完整完成 | +| D1 | 删除单个目录并观察工具返回前后的状态 | 执行期间不显示未知百分比,成功后才计入完成并清理窗口 | +| D2 | 删除不同来源环境的多个所选项目 | 逐项报告当前路径,完成数和比例只随成功返回推进 | +| D3 | 批量删除第二项失败 | 失败项不计完成,不开始后续项,已完成通知和错误均保留 | +| D4 | 当前删除调用期间取消 | 当前调用返回后停止后续项,不撤销已完成项,清理窗口 | +| D5 | 操作开始前已取消 | 不调用删除工具,不打开窗口 | +| D6 | 提交空删除列表 | 不调用工具或成功通知,不打开窗口 | +| D7 | 删除失败后重新开始操作 | 新任务从零开始,路径和总数不残留上次状态 | +| M1 | 将 `/root/Operit` 从本机 Linux 复制到手机目录,再反向复制大文件 | 原始字节保持一致,不出现整文件字符串或字节数组累积 | +| M2 | 在 Linux 使用 `~/`、`/sdcard` 和宿主挂载路径复制 | 映射与终端一致,同一实际位置仍被拒绝 | +| M3 | 单选、全选、多选和跨目录粘贴 | 全批次预检重名;多项显示序号及当前项目进度 | +| M4 | 跨环境剪切,并制造目标写入失败 | 对应项完整复制成功后才删除来源;未完成的剪切项留在剪贴板 | +| M5 | 在标准、管理员和 Root 模式执行既有文件操作 | 权限后端沿用既有路由;Shell 路径没有字节数据时显示处理中 | +| M6 | 使用远程 SSH 和 SAF 粘贴 | 使用既有提供方;未知总量不显示虚构字节数或百分比 | +| M7 | 在深浅主题、大字体及横屏查看复制面板 | 标题居中、路径可辨认、百分比位于 6dp 进度条右上方;超高内容可滚动 | +| M8 | 成功、失败、点击取消和离开文件浏览器 | 面板与观察者正确结束,错误仍显示在文件浏览器中 | +| M9 | 在文件菜单确认单个文件或目录删除 | 确认后显示居中删除标题、名称和来源路径;不显示复制目标、字节数或速度 | +| M10 | 多选并确认批量删除 | 全批次显示同一窗口,所选项目完成数和百分比正确;单个目录内进度保持未知 | +| M11 | 批量删除时制造权限错误,或点击取消 | 失败/取消后不开始后续项,列表刷新,未完成项不误清选择;已删除内容不恢复 | +| M12 | 在标准、管理员、Root、Linux 和 SAF 环境删除 | 沿用原删除工具、环境及递归参数;同一删除窗口不改变后端权限 | +| M13 | 跨环境剪切进入清理来源阶段 | 保持移动窗口,不叠加删除窗口;完成、失败与取消后状态正确清理 | + +复制链接到不支持符号链接的目标存储会明确失败并保留来源。失败时已经写入的部分目标保留,不自动删除其他文件。扫描与复制期间持续修改来源不会构成目录快照。 + +删除百分比仅按所选顶层项目计数,不代表目录内文件数或字节数。已有同步删除工具不能在调用中途保证停止,取消在当前调用返回后阻止后续项;不撤销已完成删除。 + +## 结果记录 + +自动用例尚未运行,实机项尚未验证。下表用于填写实际结果。 + +| 编号 | 结果与证据 | +| --- | --- | +| A1 | | +| A2 | | +| A3 | | +| A4 | | +| A5 | | +| A6 | | +| A7 | | +| A8 | | +| A9 | | +| A10 | | +| D1 | | +| D2 | | +| D3 | | +| D4 | | +| D5 | | +| D6 | | +| D7 | | +| M1 | | +| M2 | | +| M3 | | +| M4 | | +| M5 | | +| M6 | | +| M7 | | +| M8 | | +| M9 | | +| M10 | | +| M11 | | +| M12 | | +| M13 | | diff --git a/docs/TODO/fix/workspace-copy-streaming-progress/index.md b/docs/TODO/fix/workspace-copy-streaming-progress/index.md new file mode 100644 index 0000000000..571ed2c568 --- /dev/null +++ b/docs/TODO/fix/workspace-copy-streaming-progress/index.md @@ -0,0 +1,30 @@ +--- +fork: https://github.com/3316891527/Operit +status: implemented-awaiting-ci +--- + +# 工作区复制内存与文件操作进度 + +工作区将内置 Ubuntu 文件复制到手机目录时,跨环境实现会完整读取文件、经过字符串转换,反向复制还会累积完整字节数组。目录递归会忽略子项失败,粘贴界面只显示旋转圆环。 + +本批优化本机 Android 与内置 Ubuntu 的文件复制,并为单项和批量删除补齐共用进度窗口,保持公开工具参数、权限路由、覆盖规则及删除确认。传输逻辑放入 `core/files/transfer/`,不修改终端子模块、应用身份或数据库。 + +- [x] 使用固定缓冲区复制二进制,逐层遍历目录,不保留完整目录清单 +- [x] 使用终端现有挂载映射处理 Ubuntu、手机共享目录及 `~` +- [x] 为单次粘贴隔离进度,显示当前文件、来源、目标、已复制量、剩余量、速度及百分比 +- [x] 统计期间显示明确状态,已知总量后显示确定进度;完成前不显示 100% +- [x] 子项失败立即返回失败,剪切来源只在对应项完整成功后删除 +- [x] 补充二进制大文件、隐藏文件、空目录、同路径、符号链接及失败/取消的 10 条 JVM 回归用例 +- [x] 完成差异空白、XML 和调用关系的静态核对 +- [x] 为单项和批量删除复用进度窗口,显示真实的所选项目完成数,保留既有删除后端和确认提示 +- [x] 删除失败、取消时清理窗口状态,停止后续项目;跨环境剪切清理不另弹删除窗口 +- [x] 补充删除进度、部分失败及取消的 7 条回归用例,更新完整验证范围 +- [ ] 远端构建与测试结果确认 + +远程 SSH、SAF 和独立 Shell 复制继续使用各自原有工具实现;只有后端提供真实字节进度时才显示字节百分比,否则显示当前项目和处理中状态。不会以经过时间推算百分比。 + +删除仅按所选项目计数,单个目录内部的进度未知。取消将在当前删除调用返回后停止后续项目;已删除内容不恢复,错误继续显示在文件浏览器。跨环境剪切清理不另弹删除窗口。 + +完整范围和可填写结果见[验证记录](01-validation.md)。本地未编译、构建或执行测试;CI 与 PR 交付到独立工作分支,目标为 `dev`。 + +[DONE] 实现与静态核对,编译、测试和实机结果仍待验证。