Local branch had diverged from origin/master (sibling commits on the same base). Rewrote local history linearly on top of origin/master, folding in all local content: exa/hot-platform discovery hunters, leaks ledger, nightly sweep orchestrator, updated .gitignore and skill docs, plus the latest hunt output and vault state. Remote-only files (vault keys, channel scripts) were restored rather than dropped, so the resulting tree is a full union of both sides.
1 line
15 KiB
JSON
1 line
15 KiB
JSON
{"repo": "ah734g74-svg/kai-ezz", "files": {"screenshotTests/src/test/kotlin/com/inspiredandroid/kai/screenshots/ScreenshotTestData.kt": {"94051eeb2b0aa34e9a26f39f2af6aab075323f8d": {"t": 1786068554.6097732, "n": 13530, "h": "799254345171320e", "c": "package com.inspiredandroid.kai.screenshots\n\nimport com.inspiredandroid.kai.TerminalLine\nimport com.inspiredandroid.kai.data.MemoryEntry\nimport com.inspiredandroid.kai.data.Service\nimport com.inspiredandroid.kai.getPlatformToolDefinitions\nimport com.inspiredandroid.kai.ui.chat.ChatActions\nimport com.inspiredandroid.kai.ui.chat.ChatUiState\nimport com.inspiredandroid.kai.ui.chat.History\nimport com.inspiredandroid.kai.ui.settings.ConfiguredServiceEntry\nimport com.inspiredandroid.kai.ui.settings.ConnectionStatus\nimport com.inspiredandroid.kai.ui.settings.McpConnectionStatus\nimport com.inspiredandroid.kai.ui.settings.McpServerUiState\nimport com.inspiredandroid.kai.ui.settings.SandboxUiState\nimport com.inspiredandroid.kai.ui.settings.SettingsModel\nimport com.inspiredandroid.kai.ui.settings.SettingsTab\nimport com.inspiredandroid.kai.ui.settings.SettingsUiState\nimport kotlinx.collections.immutable.persistentListOf\nimport kotlinx.collections.immutable.toImmutableList\nimport kotlinx.serialization.json.Json\nimport kotlinx.serialization.json.JsonObject\nimport kotlinx.serialization.json.jsonObject\nimport kotlinx.serialization.json.jsonPrimitive\n\nobject ScreenshotTestData {\n\n val noOpChatActions = ChatActions(\n ask = {},\n toggleSpeechOutput = {},\n retry = {},\n clearHistory = {},\n setIsSpeaking = { _, _ -> },\n addFile = { _ -> },\n removeFile = { _ -> },\n startNewChat = { },\n regenerate = {},\n cancel = {},\n selectService = {},\n loadConversation = {},\n deleteConversation = {},\n clearSnackbar = {},\n clearUnreadHeartbeat = {},\n undoDeleteConversation = { },\n submitUiCallback = { _, _ -> },\n resubmit = { _, _, _ -> },\n enterInteractiveMode = { },\n exitInteractiveMode = { },\n goBackInteractiveMode = { },\n sendSmsDraft = {},\n discardSmsDraft = {},\n )\n\n val chatEmptyState = ChatUiState(\n actions = noOpChatActions,\n history = persistentListOf(),\n showPrivacyInfo = false,\n )\n\n private val survivalGameContent =\n \"```kai-ui\\n\" +\n \"{\\\"type\\\":\\\"column\\\",\\\"spacing\\\":8,\\\"children\\\":[\" +\n \"{\\\"type\\\":\\\"text\\\",\\\"value\\\":\\\"\\u2694\\ufe0f The Goblin Tunnels\\\",\\\"style\\\":\\\"headline\\\",\\\"bold\\\":true},\" +\n \"{\\\"type\\\":\\\"text\\\",\\\"value\\\":\\\"Chapter 1 \\u2022 The Beginning\\\",\\\"style\\\":\\\"caption\\\",\\\"color\\\":\\\"secondary\\\"},\" +\n \"{\\\"type\\\":\\\"row\\\",\\\"spacing\\\":16,\\\"children\\\":[\" +\n \"{\\\"type\\\":\\\"stat\\\",\\\"value\\\":\\\"20/20\\\",\\\"label\\\":\\\"HP\\\"},\" +\n \"{\\\"type\\\":\\\"stat\\\",\\\"value\\\":\\\"Lv 1\\\",\\\"label\\\":\\\"Level\\\"},\" +\n \"{\\\"type\\\":\\\"stat\\\",\\\"value\\\":\\\"50g\\\",\\\"label\\\":\\\"Gold\\\"},\" +\n \"{\\\"type\\\":\\\"stat\\\",\\\"value\\\":\\\"2\\\",\\\"label\\\":\\\"DEF\\\"}\" +\n \"]},\" +\n \"{\\\"type\\\":\\\"image\\\",\\\"url\\\":\\\"resource://orc_survival.png\\\"},\" +\n \"{\\\"type\\\":\\\"text\\\",\\\"value\\\":\\\"The tunnel forks. To the left, faint firelight flickers. To the right, silence \\u2014 and a cold draft that makes your torch sputter.\\\",\\\"style\\\":\\\"body\\\"},\" +\n \"{\\\"type\\\":\\\"divider\\\"},\" +\n \"{\\\"type\\\":\\\"alert\\\",\\\"severity\\\":\\\"warning\\\",\\\"message\\\":\\\"\\uD83D\\uDC7A Two orcs block the left passage! They haven't noticed you yet.\\\"},\" +\n \"{\\\"type\\\":\\\"spacer\\\",\\\"height\\\":4},\" +\n \"{\\\"type\\\":\\\"button\\\",\\\"label\\\":\\\"\\u2694\\ufe0f Attack with sword\\\",\\\"variant\\\":\\\"filled\\\",\\\"action\\\":{\\\"type\\\":\\\"callback\\\",\\\"event\\\":\\\"attack\\\"}},\" +\n \"{\\\"type\\\":\\\"button\\\",\\\"label\\\":\\\"\\uD83E\\uDD2B Sneak past in the shadows\\\",\\\"variant\\\":\\\"outlined\\\",\\\"action\\\":{\\\"type\\\":\\\"callback\\\",\\\"event\\\":\\\"sneak\\\"}}\" +\n \"]}\\n\" +\n \"```\"\n\n val chatWithMessages = ChatUiState(\n actions = noOpChatActions,\n history = persistentListOf(\n History(\n id = \"1\",\n role = History.Role.USER,\n content = \"lets play a game\",\n ),\n History(\n id = \"2\",\n role = History.Role.ASSISTANT,\n content = survivalGameContent,\n ),\n ),\n )\n\n private val recipeContent =\n \"```kai-ui\\n\" +\n \"{\\\"type\\\":\\\"column\\\",\\\"spacing\\\":8,\\\"children\\\":[\" +\n \"{\\\"type\\\":\\\"text\\\",\\\"value\\\":\\\"Cacio e Pepe\\\",\\\"style\\\":\\\"headline\\\",\\\"bold\\\":true},\" +\n \"{\\\"type\\\":\\\"row\\\",\\\"spacing\\\":8,\\\"children\\\":[{\\\"type\\\":\\\"badge\\\",\\\"value\\\":\\\"\\u23f1 20 min\\\",\\\"color\\\":\\\"secondary\\\"},{\\\"type\\\":\\\"badge\\\",\\\"value\\\":\\\"\\uD83C\\uDF7D 2 servings\\\",\\\"color\\\":\\\"secondary\\\"},{\\\"type\\\":\\\"badge\\\",\\\"value\\\":\\\"\\u2b50 4.9/5\\\",\\\"color\\\":\\\"primary\\\"}]},\" +\n \"{\\\"type\\\":\\\"image\\\",\\\"url\\\":\\\"resource://cacio_e_pepe.png\\\",\\\"aspectRatio\\\":1.5},\" +\n \"{\\\"type\\\":\\\"text\\\",\\\"value\\\":\\\"Ingredients\\\",\\\"style\\\":\\\"title\\\"},\" +\n \"{\\\"type\\\":\\\"list\\\",\\\"ordered\\\":false,\\\"items\\\":[\" +\n \"{\\\"type\\\":\\\"text\\\",\\\"value\\\":\\\"200g tonnarelli or spaghetti\\\"},\" +\n \"{\\\"type\\\":\\\"text\\\",\\\"value\\\":\\\"150g Pecorino Romano, finely grated\\\"},\" +\n \"{\\\"type\\\":\\\"text\\\",\\\"value\\\":\\\"2 tsp black peppercorns\\\"},\" +\n \"{\\\"type\\\":\\\"text\\\",\\\"value\\\":\\\"Salt for pasta water\\\"}\" +\n \"]},\" +\n \"{\\\"type\\\":\\\"divider\\\"},\" +\n \"{\\\"type\\\":\\\"text\\\",\\\"value\\\":\\\"Instructions\\\",\\\"style\\\":\\\"title\\\"},\" +\n \"{\\\"type\\\":\\\"accordion\\\",\\\"title\\\":\\\"Step 1: Toast pepper & cook pasta\\\",\\\"children\\\":[{\\\"type\\\":\\\"text\\\",\\\"value\\\":\\\"Toast peppercorns in a dry pan until fragrant, crush coarsely. Boil pasta until al dente, reserve pasta water.\\\",\\\"style\\\":\\\"body\\\"}]},\" +\n \"{\\\"type\\\":\\\"accordion\\\",\\\"title\\\":\\\"Step 2: Make the sauce\\\",\\\"children\\\":[{\\\"type\\\":\\\"text\\\",\\\"value\\\":\\\"Mix grated Pecorino with warm pasta water to form a smooth cream.\\\",\\\"style\\\":\\\"body\\\"}]},\" +\n \"{\\\"type\\\":\\\"accordion\\\",\\\"title\\\":\\\"Step 3: Combine\\\",\\\"children\\\":[{\\\"type\\\":\\\"text\\\",\\\"value\\\":\\\"Toss hot pasta with pepper off heat. Add Pecorino cream and toss until silky.\\\",\\\"style\\\":\\\"body\\\"}]}\" +\n \"]}\\n\" +\n \"```\"\n\n val chatWithDynamicUi = ChatUiState(\n actions = noOpChatActions,\n history = persistentListOf(\n History(\n id = \"1\",\n role = History.Role.USER,\n content = \"suggest Cacio e Pepe recipe for 2 servings\",\n ),\n History(\n id = \"2\",\n role = History.Role.ASSISTANT,\n content = recipeContent,\n ),\n ),\n )\n\n val freeConnected = SettingsUiState(\n currentTab = SettingsTab.Services,\n configuredServices = persistentListOf(\n ConfiguredServiceEntry(\n instanceId = \"moonshot\",\n service = Service.Moonshot,\n connectionStatus = ConnectionStatus.Connected,\n apiKey = \"sk-••••••••••••••••••••••••••••••••••••\",\n selectedModel = SettingsModel(id = \"kimi-k2.5\", subtitle = \"Kimi K2.5\", isSelected = true, displayName = \"Kimi K2.5\"),\n ),\n ConfiguredServiceEntry(\n instanceId = \"anthropic\",\n service = Service.Anthropic,\n connectionStatus = ConnectionStatus.Connected,\n apiKey = \"sk-ant-••••••••••••••••••••••••••••••••\",\n selectedModel = SettingsModel(id = \"claude-opus-4-6\", subtitle = \"Claude Opus 4.6\", isSelected = true, displayName = \"Claude Opus 4.6\"),\n ),\n ),\n availableServicesToAdd = persistentListOf(Service.OpenAI, Service.DeepSeek, Service.Mistral),\n )\n\n val settingsAgent = SettingsUiState(\n currentTab = SettingsTab.Agent,\n soulText = \"\",\n isMemoryEnabled = true,\n memories = persistentListOf(\n MemoryEntry(\n key = \"user_name\",\n content = \"The user's name is Simon\",\n createdAt = 1709300000000,\n updatedAt = 1709300000000,\n ),\n MemoryEntry(\n key = \"preferred_language\",\n content = \"Prefers Kotlin for app development\",\n createdAt = 1709310000000,\n updatedAt = 1709310000000,\n ),\n ),\n )\n\n val settingsSandbox = SettingsUiState(\n currentTab = SettingsTab.Sandbox,\n )\n\n val sandboxState = SandboxUiState(\n showSandbox = true,\n sandboxInstalled = true,\n sandboxReady = true,\n sandboxDiskUsageMB = 578,\n sandboxPackagesInstalled = true,\n isSandboxEnabled = true,\n )\n\n private val fastfetchOutput =\n \" .hddddddddddddddddddddddh.\\n\" +\n \" :dddddddddddddddddddddddddd:\\n\" +\n \" /dddddddddddddddddddddddddddd/\\n\" +\n \" +dddddddddddddddddddddddddddddd+\\n\" +\n \" \\u0060sdddddddddddddddddddddddddddddddds\\u0060\\n\" +\n \" \\u0060ydddddddddddd++hdddddddddddddddddddy\\u0060\\n\" +\n \".hddddddddddd+\\u0060 \\u0060+ddddh:-sdddddddddddh.\\n\" +\n \"hdddddddddd+\\u0060 \\u0060+y: .sddddddddddh\\n\" +\n \"ddddddddh+\\u0060 \\u0060//\\u0060 \\u0060.\\u0060 -sddddddddd\\n\" +\n \"ddddddh+\\u0060 \\u0060/hddh/\\u0060 \\u0060:s- -sddddddd\\n\" +\n \"ddddh+\\u0060 \\u0060/+/dddddh/\\u0060 \\u0060+s- -sddddd\\n\" +\n \"ddd+\\u0060 \\u0060/o\\u0060 :dddddddh/\\u0060 \\u0060oy- .yddd\\n\" +\n \"hdddyo+ohddyosdddddddddho+oydddy++ohdddh\\n\" +\n \".hddddddddddddddddddddddddddddddddddddh.\\n\" +\n \" \\u0060yddddddddddddddddddddddddddddddddddy\\u0060\\n\" +\n \" \\u0060sdddddddddddddddddddddddddddddddds\\u0060\\n\" +\n \" +dddddddddddddddddddddddddddddd+\\n\" +\n \" /dddddddddddddddddddddddddddd/\\n\" +\n \" :dddddddddddddddddddddddddd:\\n\" +\n \" .hddddddddddddddddddddddh.root@localhost\\n\" +\n \"--------------\\n\" +\n \"OS: Alpine Linux v3.22 aarch64\\n\" +\n \"Kernel: Linux 6.1.145-android14-11-gfa1d6308d1fe-ab14691759\\n\" +\n \"Uptime: 3 days, 12 hours, 51 mins\\n\" +\n \"Packages: 65 (apk)\\n\" +\n \"Shell: libproot.so\\n\" +\n \"Terminal: iredandroid.kai\\n\" +\n \"CPU: Cortex-A520*4 + Cortex-A720*3 + Cortex-X4 (8) @ 3.10 GHz\\n\" +\n \"Memory: 6.75 GiB / 7.39 GiB (91%)\\n\" +\n \"\\u001B[40m \\u001B[41m \\u001B[42m \\u001B[43m \\u001B[44m \" +\n \"\\u001B[45m \\u001B[46m \\u001B[47m \\u001B[0m\\n\" +\n \"\\u001B[100m \\u001B[101m \\u001B[102m \\u001B[103m \\u001B[104m \" +\n \"\\u001B[105m \\u001B[106m \\u001B[107m \\u001B[0m\"\n\n val sandboxTerminalLines = persistentListOf(\n TerminalLine.Command(\"fastfetch\"),\n TerminalLine.Output(fastfetchOutput),\n )\n\n val settingsTools = SettingsUiState(\n currentTab = SettingsTab.Tools,\n tools = getPlatformToolDefinitions().toImmutableList(),\n mcpServers = persistentListOf(\n McpServerUiState(\n id = \"context7\",\n name = \"Context7\",\n url = \"https://context7.liam.sh/mcp\",\n isEnabled = true,\n connectionStatus = McpConnectionStatus.Connected,\n tools = persistentListOf(),\n ),\n McpServerUiState(\n id = \"manifold_markets\",\n name = \"Manifold Markets\",\n url = \"https://api.manifold.markets/v0/mcp\",\n isEnabled = true,\n connectionStatus = McpConnectionStatus.Connected,\n tools = persistentListOf(),\n ),\n ),\n )\n\n // --- Localized data loading for StoreScreenshotTest ---\n\n private fun loadJson(locale: String): JsonObject {\n val stream = ScreenshotTestData::class.java.getResourceAsStream(\"/screenshot-data/$locale.json\")\n ?: error(\"Missing screenshot data for locale: $locale\")\n val text = stream.bufferedReader().use { it.readText() }\n return Json.parseToJsonElement(text).jsonObject\n }\n\n fun localizedChatWithMessages(locale: String): ChatUiState {\n val json = loadJson(locale)\n val chat = json[\"chatWithMessages\"]!!.jsonObject\n return ChatUiState(\n actions = noOpChatActions,\n history = persistentListOf(\n History(\n id = \"1\",\n role = History.Role.USER,\n content = chat[\"userMessage\"]!!.jsonPrimitive.content,\n ),\n History(\n id = \"2\",\n role = History.Role.ASSISTANT,\n content = chat[\"assistantMessage\"]!!.jsonPrimitive.content,\n ),\n ),\n )\n }\n\n fun localizedChatWithDynamicUi(locale: String): ChatUiState {\n val json = loadJson(locale)\n val chat = json[\"chatWithDynamicUi\"]!!.jsonObject\n return ChatUiState(\n actions = noOpChatActions,\n history = persistentListOf(\n History(\n id = \"1\",\n role = History.Role.USER,\n content = chat[\"userMessage\"]!!.jsonPrimitive.content,\n ),\n History(\n id = \"2\",\n role = History.Role.ASSISTANT,\n content = chat[\"assistantMessage\"]!!.jsonPrimitive.content,\n ),\n ),\n )\n }\n}\n"}}}} |