From 3bdbbfcd25f60d99fcffd4cd54628081688fbb93 Mon Sep 17 00:00:00 2001 From: luinbytes <42706009+luinbytes@users.noreply.github.com> Date: Mon, 24 Aug 2026 22:02:34 +0100 Subject: [PATCH] feat: add installable assistant packs --- Cargo.lock | 7 + Cargo.toml | 2 +- .../java/dev/homebot/android/MainActivity.kt | 75 +++++ .../java/dev/homebot/android/MainViewModel.kt | 22 ++ .../java/dev/homebot/android/ProductModels.kt | 3 + .../android/connection/HomeBotClient.kt | 23 ++ .../android/connection/HomeBotClientTest.kt | 35 +++ .../kotlin/dev/homebot/protocol/ProtocolV1.kt | 15 + crates/homebot-desktop/src/app.rs | 267 +++++++++++++++- crates/homebot-desktop/src/skills.rs | 6 +- crates/homebot-desktop/src/transport.rs | 43 ++- crates/homebot-desktop/src/transport/api.rs | 35 +++ crates/homebot-desktop/src/transport/tests.rs | 33 +- .../snapshots/production_approval_dark.png | Bin 86341 -> 88372 bytes ...duction_assistant_pack_configure_light.png | Bin 0 -> 112310 bytes .../production_assistant_packs_light.png | Bin 0 -> 99441 bytes .../tests/snapshots/production_chat_dark.png | Bin 75621 -> 77652 bytes .../production_computer_details_dark.png | Bin 80315 -> 82346 bytes .../snapshots/production_devices_light.png | Bin 130460 -> 132739 bytes .../production_disconnected_dark.png | Bin 42824 -> 44855 bytes .../snapshots/production_group_chat_dark.png | Bin 77162 -> 79193 bytes .../production_provider_unavailable_light.png | Bin 81317 -> 83343 bytes .../production_routine_editor_dark.png | Bin 83127 -> 85254 bytes .../production_routine_recording_dark.png | Bin 75651 -> 77682 bytes .../snapshots/production_routines_dark.png | Bin 74794 -> 76825 bytes .../snapshots/production_settings_light.png | Bin 73335 -> 75372 bytes .../homebot-desktop/tests/visual_goldens.rs | 11 + .../examples/export_android.rs | 15 + crates/homebot-protocol/src/lib.rs | 50 +++ crates/homebot-routines/src/schedule.rs | 42 ++- crates/homebot-server/src/assistant_packs.rs | 289 ++++++++++++++++++ crates/homebot-server/src/lib.rs | 6 + crates/homebot-server/src/routines.rs | 7 +- crates/homebot-server/src/scheduler.rs | 7 +- crates/homebot-server/src/skills.rs | 2 +- crates/homebot-server/src/tests.rs | 162 ++++++++-- crates/homebot-storage/src/lib.rs | 76 +++++ docs/android.md | 2 + docs/assistant-packs.md | 16 + docs/parity-matrix.md | 1 + docs/personal-assistant-direction-research.md | 32 ++ docs/protocol.md | 2 + docs/visual-reference-index.md | 3 + protocol/schema/homebot-v1.schema.json | 189 ++++++++++++ 44 files changed, 1428 insertions(+), 50 deletions(-) create mode 100644 crates/homebot-desktop/tests/snapshots/production_assistant_pack_configure_light.png create mode 100644 crates/homebot-desktop/tests/snapshots/production_assistant_packs_light.png create mode 100644 crates/homebot-server/src/assistant_packs.rs create mode 100644 docs/assistant-packs.md create mode 100644 docs/personal-assistant-direction-research.md diff --git a/Cargo.lock b/Cargo.lock index 3615650..c87f008 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4254,6 +4254,12 @@ dependencies = [ "digest", ] +[[package]] +name = "sha1_smol" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbfa15b3dddfee50a0fff136974b3e1bde555604ba463834a7eb7deb6417705d" + [[package]] name = "sha2" version = "0.10.9" @@ -5231,6 +5237,7 @@ dependencies = [ "getrandom 0.4.3", "js-sys", "serde_core", + "sha1_smol", "wasm-bindgen", ] diff --git a/Cargo.toml b/Cargo.toml index dbec786..3799597 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -60,7 +60,7 @@ tokio-tungstenite = "0.29" tracing = "0.1" tracing-subscriber = { version = "0.3", features = ["env-filter", "fmt"] } tower = { version = "0.5", features = ["util"] } -uuid = { version = "1.18", features = ["serde", "v7"] } +uuid = { version = "1.18", features = ["serde", "v5", "v7"] } url = "2.5" zeroize = "1.8" portable-pty = "0.9" diff --git a/android/app/src/main/java/dev/homebot/android/MainActivity.kt b/android/app/src/main/java/dev/homebot/android/MainActivity.kt index d42acf4..b307459 100644 --- a/android/app/src/main/java/dev/homebot/android/MainActivity.kt +++ b/android/app/src/main/java/dev/homebot/android/MainActivity.kt @@ -519,6 +519,11 @@ private fun ConnectedSettings(viewModel: MainViewModel, live: ConnectionState.Li var recordingBotId by rememberSaveable { mutableStateOf("") } var recordingRequiresApproval by rememberSaveable { mutableStateOf(true) } var deleteRoutineId by rememberSaveable { mutableStateOf(null) } + var configuringPackId by rememberSaveable { mutableStateOf(null) } + var packBotId by rememberSaveable { mutableStateOf("") } + var packTimezone by rememberSaveable { mutableStateOf("UTC") } + var packHour by rememberSaveable { mutableStateOf("8") } + var packMinute by rememberSaveable { mutableStateOf("0") } val selectedRoutine = state.routines.firstOrNull { it.id == state.selectedRoutineId } LazyColumn(Modifier.fillMaxSize().padding(horizontal = 20.dp), verticalArrangement = Arrangement.spacedBy(10.dp)) { item { @@ -568,6 +573,76 @@ private fun ConnectedSettings(viewModel: MainViewModel, live: ConnectionState.Li } } } + item { + SectionTitle("Assistant Packs") + Text("Install a useful Skill and scheduled routine onto one Bot.", color = Muted) + state.assistantPackNotice?.let { Text(it, color = Violet) } + } + items(state.assistantPacks, key = { "assistant-pack-${it.id}" }) { pack -> + Card(shape = CardShape) { + Column(Modifier.fillMaxWidth().padding(14.dp)) { + Text(pack.name, fontWeight = FontWeight.Bold) + Text(pack.description, color = Muted) + Text( + "${pack.schedule.cadence.name.lowercase().replaceFirstChar { it.uppercase() }} • default ${pack.schedule.default_hour.toString().padStart(2, '0')}:${pack.schedule.default_minute.toString().padStart(2, '0')}", + color = Muted, + fontSize = 12.sp, + ) + TextButton( + onClick = { + configuringPackId = if (configuringPackId == pack.id) null else pack.id + packBotId = live.snapshot.bots.firstOrNull { !it.archived }?.id.orEmpty() + packHour = pack.schedule.default_hour.toString() + packMinute = pack.schedule.default_minute.toString() + }, + ) { Text(if (configuringPackId == pack.id) "Cancel" else "Configure") } + if (configuringPackId == pack.id) { + Text("Run with", fontWeight = FontWeight.SemiBold) + live.snapshot.bots.filterNot { it.archived }.forEach { bot -> + Row(verticalAlignment = Alignment.CenterVertically) { + RadioButton(selected = packBotId == bot.id, onClick = { packBotId = bot.id }) + Text(bot.name) + } + } + OutlinedTextField( + packTimezone, + { packTimezone = it }, + label = { Text("Timezone, for example Europe/London") }, + modifier = Modifier.fillMaxWidth(), + ) + Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) { + OutlinedTextField( + packHour, + { packHour = it.filter(Char::isDigit).take(2) }, + label = { Text("Hour") }, + modifier = Modifier.weight(1f), + ) + OutlinedTextField( + packMinute, + { packMinute = it.filter(Char::isDigit).take(2) }, + label = { Text("Minute") }, + modifier = Modifier.weight(1f), + ) + } + val hour = packHour.toIntOrNull() + val minute = packMinute.toIntOrNull() + Button( + onClick = { + viewModel.installAssistantPack( + pack.id, + packBotId, + packTimezone, + hour ?: 0, + minute ?: 0, + ) + configuringPackId = null + }, + enabled = packBotId.isNotBlank() && packTimezone.isNotBlank() && hour != null && hour in 0..23 && minute != null && minute in 0..59, + ) { Text("Install and enable") } + } + } + } + } item { SectionTitle("Routines") Text("Create, test, record and schedule server-owned Bot workflows.", color = Muted) diff --git a/android/app/src/main/java/dev/homebot/android/MainViewModel.kt b/android/app/src/main/java/dev/homebot/android/MainViewModel.kt index 366fad6..507bbda 100644 --- a/android/app/src/main/java/dev/homebot/android/MainViewModel.kt +++ b/android/app/src/main/java/dev/homebot/android/MainViewModel.kt @@ -132,12 +132,14 @@ class MainViewModel(application: Application) : AndroidViewModel(application) { } private suspend fun loadServicesNow() { + val assistantPacks = homeBot.client.assistantPacks().getOrThrow() val skills = homeBot.client.skills().getOrThrow() val plugins = homeBot.client.plugins().getOrThrow() val routines = homeBot.client.routines().getOrThrow() val secrets = homeBot.client.secrets().getOrThrow() val device = homeBot.client.currentDevice().getOrThrow() mutableProduct.value = mutableProduct.value.copy( + assistantPacks = assistantPacks, skills = skills, plugins = plugins, routines = routines, @@ -278,6 +280,26 @@ class MainViewModel(application: Application) : AndroidViewModel(application) { loadServicesNow() } + fun installAssistantPack( + packId: String, + botId: String, + timezone: String, + hour: Int, + minute: Int, + ) = perform { + val installed = homeBot.client.installAssistantPack( + packId, + botId, + timezone.trim(), + hour, + minute, + ).getOrThrow() + loadServicesNow() + mutableProduct.value = mutableProduct.value.copy( + assistantPackNotice = "${installed.routine.name} installed and scheduled", + ) + } + fun toggleSkill(skillId: String, botId: String, enabled: Boolean) = perform { homeBot.client.setSkillAssigned(skillId, botId, enabled).getOrThrow() loadServicesNow() diff --git a/android/app/src/main/java/dev/homebot/android/ProductModels.kt b/android/app/src/main/java/dev/homebot/android/ProductModels.kt index e126541..1b8a7f2 100644 --- a/android/app/src/main/java/dev/homebot/android/ProductModels.kt +++ b/android/app/src/main/java/dev/homebot/android/ProductModels.kt @@ -1,6 +1,7 @@ package dev.homebot.android import dev.homebot.protocol.ChatTimelineResponse +import dev.homebot.protocol.AssistantPackSummary import dev.homebot.protocol.GroupTimelineResponse import dev.homebot.protocol.VcsStatus import dev.homebot.protocol.WorkingTreeDiffResponse @@ -32,6 +33,7 @@ data class AndroidProductState( val directTimeline: ChatTimelineResponse? = null, val groupTimeline: GroupTimelineResponse? = null, val coding: CodingWorkspaceProjection = CodingWorkspaceProjection(), + val assistantPacks: List = emptyList(), val skills: List = emptyList(), val plugins: List = emptyList(), val routines: List = emptyList(), @@ -46,6 +48,7 @@ data class AndroidProductState( val searchQuery: String = "", val searchResults: List = emptyList(), val skillTestPreview: String? = null, + val assistantPackNotice: String? = null, val loading: Boolean = false, val error: String? = null, ) diff --git a/android/app/src/main/java/dev/homebot/android/connection/HomeBotClient.kt b/android/app/src/main/java/dev/homebot/android/connection/HomeBotClient.kt index 169f854..e577ad2 100644 --- a/android/app/src/main/java/dev/homebot/android/connection/HomeBotClient.kt +++ b/android/app/src/main/java/dev/homebot/android/connection/HomeBotClient.kt @@ -27,6 +27,7 @@ import dev.homebot.protocol.GroupChatSummary import dev.homebot.protocol.GroupTimelineResponse import dev.homebot.protocol.GlobalSearchResponse import dev.homebot.protocol.HandoffGroupRequest +import dev.homebot.protocol.InstallAssistantPackRequest import dev.homebot.protocol.MessageMutationRequest import dev.homebot.protocol.MessageSummary import dev.homebot.protocol.MessageReferenceInput @@ -45,6 +46,8 @@ import dev.homebot.protocol.UpdateBotRequest import dev.homebot.protocol.VcsStatus import dev.homebot.protocol.WorkingTreeDiffResponse import dev.homebot.protocol.ApprovalDecisionRequest +import dev.homebot.protocol.AssistantPackInstallationSummary +import dev.homebot.protocol.AssistantPackSummary import dev.homebot.protocol.Attachment import dev.homebot.protocol.CreateAttachmentRequest import dev.homebot.protocol.CreateAttachmentResponse @@ -408,6 +411,26 @@ class HomeBotClient( get("api/v1/skills", ListSerializer(SkillSummary.serializer())) } + suspend fun assistantPacks(): Result> = authenticated { + get("api/v1/assistant-packs", ListSerializer(AssistantPackSummary.serializer())) + } + + suspend fun installAssistantPack( + packId: String, + botId: String, + timezone: String, + hour: Int, + minute: Int, + ): Result = authenticated { + val request = InstallAssistantPackRequest(ids(), ids(), botId, timezone, hour, minute) + post( + "api/v1/assistant-packs/$packId/install", + request, + InstallAssistantPackRequest.serializer(), + AssistantPackInstallationSummary.serializer(), + ) + } + suspend fun setSkillAssigned(skillId: String, botId: String, enabled: Boolean): Result = authenticated { val request = SkillAssignmentRequest(ids(), ids(), botId, enabled) put( diff --git a/android/app/src/test/java/dev/homebot/android/connection/HomeBotClientTest.kt b/android/app/src/test/java/dev/homebot/android/connection/HomeBotClientTest.kt index 3804ff6..06df2fa 100644 --- a/android/app/src/test/java/dev/homebot/android/connection/HomeBotClientTest.kt +++ b/android/app/src/test/java/dev/homebot/android/connection/HomeBotClientTest.kt @@ -309,6 +309,39 @@ class HomeBotClientTest { } } + @Test + fun assistantPackCatalogAndInstallUseTheAuthenticatedServerContract() = runBlocking { + server.enqueue(jsonResponse(ASSISTANT_PACKS_RESPONSE)) + server.enqueue(jsonResponse(ASSISTANT_PACK_INSTALL_RESPONSE)) + server.start() + sessions.save(credentials()) + val client = client() + + val packs = client.assistantPacks().getOrThrow() + val installed = client.installAssistantPack( + packId = "morning-brief", + botId = BOT_ID, + timezone = "Europe/London", + hour = 8, + minute = 15, + ).getOrThrow() + + assertEquals("Morning Brief", packs.single().name) + assertEquals("morning-brief", installed.pack_id) + val list = server.takeRequest() + assertEquals("/api/v1/assistant-packs", list.path) + assertEquals("GET", list.method) + val install = server.takeRequest() + assertEquals("/api/v1/assistant-packs/morning-brief/install", install.path) + assertEquals("POST", install.method) + val body = install.body.readUtf8() + assertTrue(body.contains("Europe/London")) + assertTrue(body.contains("\"bot_id\":\"$BOT_ID\"")) + assertTrue(body.contains("\"hour\":8")) + assertTrue(body.contains("\"minute\":15")) + assertEquals("Bearer hbds_fixture_session", install.getHeader("Authorization")) + } + @Test fun authoritativeRoutineLifecycleUsesEveryServerMutationPath() = runBlocking { repeat(3) { server.enqueue(jsonResponse(ROUTINE_RESPONSE)) } @@ -435,6 +468,8 @@ class HomeBotClientTest { const val PLUGINS_RESPONSE = """[{"id":"00000000-0000-0000-0000-000000000060","name":"Repository MCP","description":"Repository tools","kind":"local_mcp","enabled":true,"connection_state":"connected","auth_state":"ready","tools":[],"bot_ids":[],"updated_at_unix_ms":1}]""" const val SECRETS_RESPONSE = """[{"id":"00000000-0000-0000-0000-000000000070","label":"OpenAI work","status":"ready","created_at_unix_ms":1,"updated_at_unix_ms":1}]""" const val CURRENT_DEVICE_RESPONSE = """{"id":"$DEVICE_ID","name":"Pixel 9","endpoint_kind":"loopback","created_at_unix_ms":1,"last_seen_at_unix_ms":2,"revoked_at_unix_ms":null}""" + const val ASSISTANT_PACKS_RESPONSE = """[{"id":"morning-brief","name":"Morning Brief","description":"Start the day","skill_name":"Morning brief","routine_name":"Morning brief","schedule":{"cadence":"daily","weekday":null,"default_hour":8,"default_minute":0}}]""" + const val ASSISTANT_PACK_INSTALL_RESPONSE = """{"pack_id":"morning-brief","skill":{"id":"00000000-0000-0000-0000-000000000090","name":"Morning brief · Nova","description":"Start the day","active_version_id":"00000000-0000-0000-0000-000000000091","version":1,"definition":{"instructions":"Prepare a brief","context":[],"tools":[]},"bot_ids":["$BOT_ID"],"created_at_unix_ms":1,"updated_at_unix_ms":1},"routine":{"id":"$ROUTINE_ID","bot_id":"$BOT_ID","name":"Review","description":"Repository review","enabled":true,"draft":false,"active_version_id":"$ROUTINE_VERSION_ID","version":1,"definition":{"inputs":[],"steps":[{"kind":"bot_prompt","bot_id":"$BOT_ID","prompt_template":"Check the repository","requires_approval":false}],"expected_outputs":[]},"created_at_unix_ms":1,"updated_at_unix_ms":1},"trigger":{"id":"00000000-0000-0000-0000-000000000092","routine_id":"$ROUTINE_ID","definition":{"source":{"kind":"schedule","schedule":{"kind":"daily_local","timezone":"Europe/London","hour":8,"minute":15}},"missed_run_policy":"run_once","overlap_policy":{"kind":"queue"},"retry_policy":{"maximum_attempts":1,"initial_backoff_seconds":5,"maximum_backoff_seconds":300},"catch_up_limit":1},"enabled":true,"last_evaluated_at_unix_ms":null,"next_fire_at_unix_ms":2,"created_at_unix_ms":1,"updated_at_unix_ms":1}}""" const val ROUTINE_RESPONSE = """{"id":"$ROUTINE_ID","bot_id":"$BOT_ID","name":"Review","description":"Repository review","enabled":true,"draft":false,"active_version_id":"$ROUTINE_VERSION_ID","version":1,"definition":{"inputs":[],"steps":[{"kind":"bot_prompt","bot_id":"$BOT_ID","prompt_template":"Check the repository","requires_approval":false}],"expected_outputs":[]},"created_at_unix_ms":1,"updated_at_unix_ms":1}""" const val ROUTINE_RUN_RESPONSE = """{"id":"00000000-0000-0000-0000-000000000083","routine_id":"$ROUTINE_ID","routine_version_id":"$ROUTINE_VERSION_ID","bot_id":"$BOT_ID","status":"succeeded","trigger":{},"input_metadata":{},"dry_run":true,"results":[],"attempt_count":1,"started_at_unix_ms":1,"finished_at_unix_ms":2}""" const val RECORDING_EMPTY_RESPONSE = """{"id":"$RECORDING_ID","bot_id":"$BOT_ID","name":"Recorded review","description":"","actions":[],"created_at_unix_ms":1,"updated_at_unix_ms":1}""" diff --git a/android/protocol/src/main/kotlin/dev/homebot/protocol/ProtocolV1.kt b/android/protocol/src/main/kotlin/dev/homebot/protocol/ProtocolV1.kt index f98141e..0c1e187 100644 --- a/android/protocol/src/main/kotlin/dev/homebot/protocol/ProtocolV1.kt +++ b/android/protocol/src/main/kotlin/dev/homebot/protocol/ProtocolV1.kt @@ -387,6 +387,18 @@ data class SkillAssignmentRequest(val request_id: String, val idempotency_key: S @Serializable data class SkillTestSummary(val skill_id: String, val skill_version_id: String, val version: Int, val prompt_preview: String, val capability_policy_enforced: Boolean) +@Serializable +enum class AssistantPackCadence { @SerialName("daily") DAILY, @SerialName("weekly") WEEKLY } + +@Serializable +data class AssistantPackSchedule(val cadence: AssistantPackCadence, val weekday: Int? = null, val default_hour: Int, val default_minute: Int) + +@Serializable +data class AssistantPackSummary(val id: String, val name: String, val description: String, val skill_name: String, val routine_name: String, val schedule: AssistantPackSchedule) + +@Serializable +data class InstallAssistantPackRequest(val request_id: String, val idempotency_key: String, val bot_id: String, val timezone: String, val hour: Int, val minute: Int) + @Serializable data class SkillBundle(val format_version: Int, val name: String, val description: String, val definition: SkillDefinition) @@ -513,6 +525,9 @@ data class RoutineRunSummary(val id: String, val routine_id: String, val routine @Serializable data class RoutineTriggerSummary(val id: String, val routine_id: String, val definition: JsonElement, val enabled: Boolean, val last_evaluated_at_unix_ms: Long? = null, val next_fire_at_unix_ms: Long? = null, val created_at_unix_ms: Long, val updated_at_unix_ms: Long) +@Serializable +data class AssistantPackInstallationSummary(val pack_id: String, val skill: SkillSummary, val routine: RoutineSummary, val trigger: RoutineTriggerSummary) + @Serializable data class CreateRoutineTriggerRequest(val request_id: String, val idempotency_key: String, val definition: JsonElement, val enabled: Boolean = true) diff --git a/crates/homebot-desktop/src/app.rs b/crates/homebot-desktop/src/app.rs index cd481a0..7cec043 100644 --- a/crates/homebot-desktop/src/app.rs +++ b/crates/homebot-desktop/src/app.rs @@ -83,6 +83,15 @@ struct RoutineEditorDraft { draft: bool, } +#[derive(Clone, Debug)] +struct AssistantPackInstallDraft { + pack_id: String, + bot_id: Uuid, + timezone: String, + hour: u8, + minute: u8, +} + impl RoutineEditorDraft { fn from_summary(routine: &RoutineSummary) -> Self { Self { @@ -114,6 +123,7 @@ pub struct HomeBotApp { pub capability_rules: Vec, pub browser_sessions: Vec, pub provider_profiles: Vec, + pub assistant_packs: Vec, pairing_endpoint: String, pairing_insecure_private_acknowledged: bool, vcs_commit_message: String, @@ -128,6 +138,9 @@ pub struct HomeBotApp { notification_sink: SystemNotificationSink, deep_link_receiver: Receiver, settings_open: bool, + assistant_packs_open: bool, + assistant_pack_install: Option, + assistant_pack_notice: Option, routines_open: bool, routine_editor: Option, routine_recording: Option, @@ -169,6 +182,7 @@ impl Default for HomeBotApp { capability_rules: Vec::new(), browser_sessions: Vec::new(), provider_profiles: Vec::new(), + assistant_packs: Vec::new(), pairing_endpoint: "http://127.0.0.1:7123".to_owned(), pairing_insecure_private_acknowledged: false, vcs_commit_message: String::new(), @@ -183,6 +197,9 @@ impl Default for HomeBotApp { notification_sink: SystemNotificationSink::new(deep_link_sender), deep_link_receiver, settings_open: false, + assistant_packs_open: false, + assistant_pack_install: None, + assistant_pack_notice: None, routines_open: false, routine_editor: None, routine_recording: None, @@ -262,7 +279,9 @@ impl HomeBotApp { self.composer_panel(context); } CentralPanel::default().show(context, |ui| { - if self.routines_open { + if self.assistant_packs_open { + self.assistant_pack_content(ui); + } else if self.routines_open { self.routine_content(ui); } else if self.search.is_some() { self.search_content(ui); @@ -345,20 +364,24 @@ impl HomeBotApp { }); if settings { self.settings_open = !self.settings_open; + self.assistant_packs_open = false; self.routines_open = false; } if create_bot { self.settings_open = false; + self.assistant_packs_open = false; self.routines_open = false; self.roster.begin_create(); } if composer { self.settings_open = false; + self.assistant_packs_open = false; self.routines_open = false; self.focus_composer = true; } if search { self.settings_open = false; + self.assistant_packs_open = false; self.routines_open = false; self.search.get_or_insert_with(SearchProjection::default); } @@ -367,6 +390,7 @@ impl HomeBotApp { } if escape { self.settings_open = false; + self.assistant_packs_open = false; self.routines_open = false; self.roster.editor = None; self.editor_error = None; @@ -628,6 +652,14 @@ impl HomeBotApp { DesktopEvent::DeviceRevoked(device) => self.apply_device_revoked(device), DesktopEvent::CheckpointDiff(diff) => self.checkpoint_diff = Some(diff), DesktopEvent::Search(response) => self.apply_search(response), + DesktopEvent::AssistantPacks(packs) => self.assistant_packs = packs, + DesktopEvent::AssistantPackInstalled(installation) => { + self.skills.apply_skill(installation.skill); + self.routines.apply_routine(installation.routine); + self.assistant_pack_install = None; + self.assistant_pack_notice = + Some(format!("{} installed and scheduled", installation.pack_id)); + } DesktopEvent::Routines(routines) => self.routines.hydrate(routines), DesktopEvent::RoutineMutation(routine) => { self.routines.apply_routine(routine); @@ -674,6 +706,7 @@ impl HomeBotApp { self.transport_error = None; self.send_transport(DesktopCommand::LoadDevices); self.send_transport(DesktopCommand::LoadPlugins); + self.send_transport(DesktopCommand::LoadAssistantPacks); } fn apply_plugins(&mut self, plugins: Vec) { @@ -1208,6 +1241,7 @@ impl HomeBotApp { .clicked() { self.settings_open = true; + self.assistant_packs_open = false; self.routines_open = false; self.search = None; } @@ -1220,12 +1254,23 @@ impl HomeBotApp { .clicked() { self.settings_open = true; + self.assistant_packs_open = false; self.routines_open = false; self.settings.section = SettingsSection::Plugins; self.search = None; } + if navigation_row(ui, self.theme, "Assistant Packs", self.assistant_packs_open) + .clicked() + { + self.settings_open = false; + self.assistant_packs_open = true; + self.routines_open = false; + self.search = None; + self.send_transport(DesktopCommand::LoadAssistantPacks); + } if navigation_row(ui, self.theme, "Routines", self.routines_open).clicked() { self.settings_open = false; + self.assistant_packs_open = false; self.routines_open = true; self.search = None; self.send_transport(DesktopCommand::LoadRoutines); @@ -1282,7 +1327,9 @@ impl HomeBotApp { .selected_group .and_then(|id| self.groups.iter().find(|group| group.id == id)); ui.label( - RichText::new(if self.routines_open { + RichText::new(if self.assistant_packs_open { + "Assistant Packs" + } else if self.routines_open { "Routines" } else if self.search.is_some() { "Search" @@ -1293,6 +1340,14 @@ impl HomeBotApp { }) .strong(), ); + if self.assistant_packs_open { + ui.with_layout(Layout::right_to_left(Align::Center), |ui| { + if ui.button("Done").clicked() { + self.assistant_packs_open = false; + } + }); + return; + } if self.routines_open { ui.with_layout(Layout::right_to_left(Align::Center), |ui| { if ui.button("Done").clicked() { @@ -1619,6 +1674,145 @@ impl HomeBotApp { }); } + #[allow(clippy::too_many_lines)] // Catalog cards and one contextual install form share one surface. + fn assistant_pack_content(&mut self, ui: &mut egui::Ui) { + ui.vertical_centered(|ui| { + ui.set_max_width(self.theme.layout.content_max_width); + ui.add_space(self.theme.spacing.xl); + ui.heading("Assistant Packs"); + ui.label("Install a useful Skill and scheduled routine onto one Bot."); + if let Some(notice) = &self.assistant_pack_notice { + ui.colored_label(self.theme.palette.success, notice); + } + ui.add_space(self.theme.spacing.lg); + if self.assistant_packs.is_empty() { + ui.label("No Assistant Packs are available."); + } + for pack in self.assistant_packs.clone() { + let mut configure = false; + Frame::NONE + .fill(self.theme.palette.surface) + .stroke(Stroke::new( + self.theme.layout.hairline, + self.theme.palette.border, + )) + .corner_radius(CornerRadius::same(self.theme.radii.md)) + .inner_margin(egui::Margin::same(self.theme.insets.lg)) + .show(ui, |ui| { + ui.horizontal(|ui| { + ui.vertical(|ui| { + ui.strong(&pack.name); + let cadence = match pack.schedule.cadence { + homebot_protocol::AssistantPackCadence::Daily => "Daily", + homebot_protocol::AssistantPackCadence::Weekly => "Weekly", + }; + ui.small(format!( + "{cadence} · default {:02}:{:02}", + pack.schedule.default_hour, pack.schedule.default_minute + )); + ui.label(&pack.description); + }); + ui.with_layout(Layout::right_to_left(Align::Center), |ui| { + configure = ui.button("Configure").clicked(); + }); + }); + }); + ui.add_space(self.theme.spacing.sm); + if configure { + let bot_id = self + .roster + .selected + .filter(|selected| { + self.roster + .bots + .iter() + .any(|bot| bot.id == *selected && !bot.archived) + }) + .or_else(|| { + self.roster + .bots + .iter() + .find(|bot| !bot.archived) + .map(|bot| bot.id) + }); + if let Some(bot_id) = bot_id { + self.assistant_pack_install = Some(AssistantPackInstallDraft { + pack_id: pack.id, + bot_id, + timezone: "UTC".to_owned(), + hour: pack.schedule.default_hour, + minute: pack.schedule.default_minute, + }); + self.assistant_pack_notice = None; + } else { + self.assistant_pack_notice = + Some("Create a Bot before installing an Assistant Pack.".to_owned()); + } + } + } + + let Some(mut draft) = self.assistant_pack_install.take() else { + return; + }; + ui.separator(); + let pack_name = self + .assistant_packs + .iter() + .find(|pack| pack.id == draft.pack_id) + .map_or(draft.pack_id.as_str(), |pack| pack.name.as_str()); + ui.heading(format!("Configure {pack_name}")); + egui::ComboBox::from_id_salt("assistant_pack_bot") + .selected_text( + self.roster + .bots + .iter() + .find(|bot| bot.id == draft.bot_id) + .map_or("Choose Bot", |bot| bot.name.as_str()), + ) + .show_ui(ui, |ui| { + for bot in self.roster.bots.iter().filter(|bot| !bot.archived) { + ui.selectable_value(&mut draft.bot_id, bot.id, &bot.name); + } + }); + ui.horizontal(|ui| { + ui.label("Timezone"); + ui.text_edit_singleline(&mut draft.timezone); + }); + ui.horizontal(|ui| { + ui.label("Run at"); + ui.add(egui::DragValue::new(&mut draft.hour).range(0..=23)); + ui.label(":"); + ui.add(egui::DragValue::new(&mut draft.minute).range(0..=59)); + }); + let mut keep_draft = true; + ui.horizontal(|ui| { + if ui + .add_enabled( + !draft.timezone.trim().is_empty(), + egui::Button::new("Install and enable"), + ) + .clicked() + { + self.send_transport(DesktopCommand::InstallAssistantPack { + pack_id: draft.pack_id.clone(), + bot_id: draft.bot_id, + timezone: draft.timezone.trim().to_owned(), + hour: draft.hour, + minute: draft.minute, + }); + self.assistant_pack_notice = Some("Installing Assistant Pack…".to_owned()); + keep_draft = false; + } + if ui.button("Cancel").clicked() { + keep_draft = false; + } + }); + if keep_draft { + self.assistant_pack_install = Some(draft); + } + }); + } + #[allow(clippy::too_many_lines)] // List, contextual creation and server actions share one surface. fn routine_content(&mut self, ui: &mut egui::Ui) { ui.vertical_centered(|ui| { @@ -2104,7 +2298,8 @@ impl HomeBotApp { } fn should_show_composer(&self) -> bool { - !self.routines_open + !self.assistant_packs_open + && !self.routines_open && self.search.is_none() && self.roster.connection == ConnectionState::Connected && (self.roster.selected.is_some() || self.selected_group.is_some()) @@ -2920,6 +3115,8 @@ pub enum ProductionFixtureState { ProviderUnavailable, Settings, SettingsDevices, + AssistantPacks, + AssistantPackConfigure, Routines, RoutineEditor, RoutineRecording, @@ -3098,6 +3295,47 @@ fn production_fixture(theme: HomeBotTheme, state: ProductionFixtureState) -> Hom state, ProductionFixtureState::Settings | ProductionFixtureState::SettingsDevices ); + app.assistant_packs_open = matches!( + state, + ProductionFixtureState::AssistantPacks | ProductionFixtureState::AssistantPackConfigure + ); + if app.assistant_packs_open { + app.assistant_packs = vec![ + fixture_assistant_pack( + "morning-brief", + "Morning Brief", + "Start the day with priorities, commitments, and anything needing attention.", + homebot_protocol::AssistantPackCadence::Daily, + None, + 8, + ), + fixture_assistant_pack( + "weekly-rundown", + "Weekly Rundown", + "Wrap up the week with progress, loose ends, and next-week priorities.", + homebot_protocol::AssistantPackCadence::Weekly, + Some(5), + 17, + ), + fixture_assistant_pack( + "end-of-day-review", + "End-of-Day Review", + "Close the day with completed work, open loops, and tomorrow's first move.", + homebot_protocol::AssistantPackCadence::Daily, + None, + 18, + ), + ]; + if state == ProductionFixtureState::AssistantPackConfigure { + app.assistant_pack_install = Some(AssistantPackInstallDraft { + pack_id: "morning-brief".to_owned(), + bot_id: Uuid::from_u128(2), + timezone: "Europe/London".to_owned(), + hour: 7, + minute: 45, + }); + } + } if state == ProductionFixtureState::SettingsDevices { app.settings.section = SettingsSection::Devices; app.settings.paired_devices = 1; @@ -3159,6 +3397,29 @@ fn production_fixture(theme: HomeBotTheme, state: ProductionFixtureState) -> Hom app } +fn fixture_assistant_pack( + id: &str, + name: &str, + description: &str, + cadence: homebot_protocol::AssistantPackCadence, + weekday: Option, + default_hour: u8, +) -> homebot_protocol::AssistantPackSummary { + homebot_protocol::AssistantPackSummary { + id: id.to_owned(), + name: name.to_owned(), + description: description.to_owned(), + skill_name: name.to_owned(), + routine_name: name.to_owned(), + schedule: homebot_protocol::AssistantPackSchedule { + cadence, + weekday, + default_hour, + default_minute: 0, + }, + } +} + fn fixture_bot(id: u128, name: &str, title: &str, color: BotColor, shape: BotShape) -> BotSummary { BotSummary { id: Uuid::from_u128(id), diff --git a/crates/homebot-desktop/src/skills.rs b/crates/homebot-desktop/src/skills.rs index c67c6bb..884c908 100644 --- a/crates/homebot-desktop/src/skills.rs +++ b/crates/homebot-desktop/src/skills.rs @@ -14,10 +14,14 @@ impl SkillProjection { self.skills = skills.into_iter().map(|skill| (skill.id, skill)).collect(); } + pub fn apply_skill(&mut self, skill: SkillSummary) { + self.skills.insert(skill.id, skill); + } + pub fn apply(&mut self, event: &ServerEvent) { match &event.body { ServerEventBody::SkillChanged { skill } => { - self.skills.insert(skill.id, skill.clone()); + self.apply_skill(skill.clone()); } ServerEventBody::SkillRemoved { skill_id } => { self.skills.remove(skill_id); diff --git a/crates/homebot-desktop/src/transport.rs b/crates/homebot-desktop/src/transport.rs index b2caaa6..18f9c23 100644 --- a/crates/homebot-desktop/src/transport.rs +++ b/crates/homebot-desktop/src/transport.rs @@ -11,22 +11,23 @@ use std::{ use futures_util::{SinkExt, StreamExt}; use homebot_protocol::{ - ApprovalDecisionRequest, AttachChatWorkspaceRequest, BotMutationRequest, BotResponse, - BrowserActionRequest, BrowserActionResponse, BrowserCommand, BrowserMutationRequest, - ChatTimelineResponse, ChatWorkspaceSummary, CheckpointDiffResponse, ClientMessage, - CompactWorkingContextRequest, CreateAttachmentRequest, CreateAttachmentResponse, - CreateBotRequest, CreateDirectChatRequest, CreateDirectChatResponse, CreateGroupChatResponse, - CreatePairingRequest, CreatePullRequestRequest, CreateRepositoryWorkspaceRequest, - DeleteBotRequest, DetachChatWorkspaceRequest, DeviceSessionSummary, ErrorEnvelope, - FinalizeAttachmentRequest, GlobalSearchResponse, GroupChatSummary, GroupTimelineResponse, - MIN_COMPATIBLE_PROTOCOL_VERSION, MessageMutationRequest, PROTOCOL_VERSION, PairingOffer, - PluginSummary, ProtocolRange, PullRequestMetadata, PullRequestMutationResponse, - ReactionMutationRequest, RecordedAction, RepositoryWorkspaceSummary, RestoreCheckpointRequest, - RevokeDeviceSessionRequest, RoutineDefinition, RoutineRecordingSummary, RoutineRunSummary, - RoutineSummary, SendMessageRequest, ServerEvent, ServerEventBody, SetInteractionModeRequest, - Snapshot, UpdateBotRequest, VcsCommitRequest, VcsCommitResult, VcsCreateBranchRequest, - VcsPushRequest, VcsRemoteMutationResponse, VcsStatus, WorkingContextSummary, - WorkingTreeDiffResponse, WorkspaceBranchesResponse, + ApprovalDecisionRequest, AssistantPackInstallationSummary, AssistantPackSummary, + AttachChatWorkspaceRequest, BotMutationRequest, BotResponse, BrowserActionRequest, + BrowserActionResponse, BrowserCommand, BrowserMutationRequest, ChatTimelineResponse, + ChatWorkspaceSummary, CheckpointDiffResponse, ClientMessage, CompactWorkingContextRequest, + CreateAttachmentRequest, CreateAttachmentResponse, CreateBotRequest, CreateDirectChatRequest, + CreateDirectChatResponse, CreateGroupChatResponse, CreatePairingRequest, + CreatePullRequestRequest, CreateRepositoryWorkspaceRequest, DeleteBotRequest, + DetachChatWorkspaceRequest, DeviceSessionSummary, ErrorEnvelope, FinalizeAttachmentRequest, + GlobalSearchResponse, GroupChatSummary, GroupTimelineResponse, MIN_COMPATIBLE_PROTOCOL_VERSION, + MessageMutationRequest, PROTOCOL_VERSION, PairingOffer, PluginSummary, ProtocolRange, + PullRequestMetadata, PullRequestMutationResponse, ReactionMutationRequest, RecordedAction, + RepositoryWorkspaceSummary, RestoreCheckpointRequest, RevokeDeviceSessionRequest, + RoutineDefinition, RoutineRecordingSummary, RoutineRunSummary, RoutineSummary, + SendMessageRequest, ServerEvent, ServerEventBody, SetInteractionModeRequest, Snapshot, + UpdateBotRequest, VcsCommitRequest, VcsCommitResult, VcsCreateBranchRequest, VcsPushRequest, + VcsRemoteMutationResponse, VcsStatus, WorkingContextSummary, WorkingTreeDiffResponse, + WorkspaceBranchesResponse, }; use reqwest::{Client, Method, StatusCode}; use serde::Deserialize; @@ -176,6 +177,8 @@ pub enum DesktopEvent { BrowserAction(BrowserActionResponse), CheckpointDiff(CheckpointDiffResponse), Search(GlobalSearchResponse), + AssistantPacks(Vec), + AssistantPackInstalled(AssistantPackInstallationSummary), Routines(Vec), RoutineMutation(RoutineSummary), RoutineRecording(RoutineRecordingSummary), @@ -230,6 +233,14 @@ pub enum DesktopCommand { BrowserReturn(Uuid), BrowserWatch(Uuid), Search(String), + LoadAssistantPacks, + InstallAssistantPack { + pack_id: String, + bot_id: Uuid, + timezone: String, + hour: u8, + minute: u8, + }, LoadRoutines, CreateRoutine { bot_id: Uuid, diff --git a/crates/homebot-desktop/src/transport/api.rs b/crates/homebot-desktop/src/transport/api.rs index edc1a2a..3ca5063 100644 --- a/crates/homebot-desktop/src/transport/api.rs +++ b/crates/homebot-desktop/src/transport/api.rs @@ -170,6 +170,41 @@ pub(super) async fn execute_command( let _ = events.send(DesktopEvent::Search(response)); Ok(()) } + DesktopCommand::LoadAssistantPacks => { + let packs = response_json( + authenticated(client, config, Method::GET, "/api/v1/assistant-packs") + .send() + .await + .map_err(request_error)?, + ) + .await?; + let _ = events.send(DesktopEvent::AssistantPacks(packs)); + Ok(()) + } + DesktopCommand::InstallAssistantPack { + pack_id, + bot_id, + timezone, + hour, + minute, + } => { + let installed = post_json( + client, + config, + &format!("/api/v1/assistant-packs/{pack_id}/install"), + &homebot_protocol::InstallAssistantPackRequest { + request_id: Uuid::now_v7(), + idempotency_key: Uuid::now_v7(), + bot_id, + timezone, + hour, + minute, + }, + ) + .await?; + let _ = events.send(DesktopEvent::AssistantPackInstalled(installed)); + Ok(()) + } DesktopCommand::LoadRoutines => { let routines = response_json( authenticated(client, config, Method::GET, "/api/v1/routines") diff --git a/crates/homebot-desktop/src/transport/tests.rs b/crates/homebot-desktop/src/transport/tests.rs index 80cadec..304a320 100644 --- a/crates/homebot-desktop/src/transport/tests.rs +++ b/crates/homebot-desktop/src/transport/tests.rs @@ -117,6 +117,35 @@ fn clean_local_launch_supervises_server_and_persists_real_api_state() }) .ok_or("missing Bot mutation")?; + transport.send(DesktopCommand::LoadAssistantPacks)?; + let packs = receive_until( + &transport, + Duration::from_secs(10), + |event| matches!(event, DesktopEvent::AssistantPacks(packs) if packs.len() == 3), + )?; + assert!(packs.iter().any(|event| matches!( + event, + DesktopEvent::AssistantPacks(packs) + if packs.iter().any(|pack| pack.id == "morning-brief") + ))); + transport.send(DesktopCommand::InstallAssistantPack { + pack_id: "morning-brief".to_owned(), + bot_id: bot.id, + timezone: "Europe/London".to_owned(), + hour: 8, + minute: 0, + })?; + let installed = receive_until( + &transport, + Duration::from_secs(10), + |event| matches!(event, DesktopEvent::AssistantPackInstalled(installation) if installation.pack_id == "morning-brief"), + )?; + assert!(installed.iter().any(|event| matches!( + event, + DesktopEvent::AssistantPackInstalled(installation) + if installation.skill.bot_ids == vec![bot.id] && installation.routine.enabled + ))); + transport.send(DesktopCommand::Timeline { bot_id: bot.id, chat_id: None, @@ -401,11 +430,11 @@ fn clean_local_launch_supervises_server_and_persists_real_api_state() let routines = receive_until( &restarted, Duration::from_secs(10), - |event| matches!(event, DesktopEvent::Routines(routines) if routines.len() == 3), + |event| matches!(event, DesktopEvent::Routines(routines) if routines.len() == 4), )?; assert!(routines.iter().any(|event| matches!( event, - DesktopEvent::Routines(routines) if routines.len() == 3 + DesktopEvent::Routines(routines) if routines.len() == 4 ))); Ok(()) } diff --git a/crates/homebot-desktop/tests/snapshots/production_approval_dark.png b/crates/homebot-desktop/tests/snapshots/production_approval_dark.png index 581e317a2697691ecfbf5a2c4e5f7e6d7a5b7120..48b1260c48a12f17d4369e71daecbf954325e085 100644 GIT binary patch delta 5941 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 delta 3793 zcmZ`+2~<;OzE4ENiZ-&V2vKmOSfipW5|VkZw6>0#TB~$Gl3~Wmv>*{ELI~tq89}6w zYKjq|#MXn1wUAOohy*T?y$DfJ0!<)5SY*ozWV=b`yYb9&-Z_tRvXFd9{>yK>4}W!R z|IzVV{}m_Je!abJJGRHIvc(Cz()Axm_=kReS6BP3xb$>eQ1{WqRPH`Utb34cvj{#B zaHUywzs}V~M)3Pb-3xt0g}e1#(!_hDzuS)4AG{)6ZP!PX3nN8&WMqu<+~5u+d~6Ka zRq=7cB<+&~$2)Z$I$b7TpDFA}5U#2_9i4!T;jLR?Z6N$4$9HjyHH7gj$G1&aD-d)~ zXZ201yLm|W(f&5*?|BjPaYV&N@u(pCbslS%8fj)O=tigb|4obIr=RTley9iMY&XIfkFbrrpsAM1u%76+1E+8=7r8Kvp}DTi}Ue z>P)fWKF<`u#X4Z!A@@(M#eSEes;i(+2T(9h@#KoLEM1)3=az1pn~bG!7(1iQKQvvrnXGXmi=IDsp)Y6Bift->hvFREG*{XOr zfcds9M%W&sewIi2uE2}1pC@Mg&*=vq7z#_vF$#F*uo3OM@*7T>x)3PUS9A671*I&E zHNKN|`R-kR%#i@0%?y(3A>q>=;oANK8he9FG~2;{Z~4u>IW1l* zA^0s3{7Iym@8LqMhfNRQ@x_^bVc(qaZSgVJbXl?!tP6)*r>1uB4Eek+3(0hseETqQ z+yxn+TRg$=z%uWD72CNkMAnkfJe80Fhh*f0j2@)v4hrPnLXr0`R6Zj~FH6PQG0U?V zdAdC+?VdA`WeFp+&cP7LUNhhFJ3qP8Cmo}%!JBJ{C=}4C8w+5AGdhJE4T_?0!}oHd zPjEMj%f)q=5k3!p=9(vCHoz{`8C`6H*~)078%0+o zYqs)5nh&O=Tj8q@_0>0YCaaqC+BJOj8sTyR91I%@;4YPAM3wy2S8bdz*bSn8Fi8vW zGf1wjE|(6~#v534Ign>Ze?Ou?^E2y+Ll%d^* za+SCI1uyr!6}*3&jdZam06cq*04RSQSw1iKywt3kd0Z5eByhxhwA<4;scGqSxzvt) zn9G7@xKoo<<)p#LvoR8N@z8R-Ox58{pP1<8Wc^;5y-ECTkP)CE4P%|*hpV|SQ$}BFkB{#=6WZMX3O>2 zjIQ^5pGdNLC2Co2+~~{uCyCnY?6c|VUQ(Ir3kq`+F8lR+MpR@TJ$m%|aZwa&GHPld zhCX>SCMmAwGxe=bVy?5-9yKB~H^Skli2Ty~mzvRLvr=JXwE6prD*njLII*_1 zvSF^eu|bZGR(o8vc>L*fYIH&(ovzbEHoblQwL{;CO+SmrSrzWbzdzLO@2gpTF+H7e z;_MEdW+P8zp=vy6*KtS-ZX$@R3u3&y>)WnW?s+7T_m?jpu!9jnz-afgvnKqFLa~`> zMZ~r;p0R`{3g*;!xdDC_LlsZA0X%gbrQT{(J}w{_ZxF_uVYM@Zm3Z<<9G%Xtp3AsX zSh((H&vuM{gh}9QHt|J0fc@%JvOd*r9Y78Et*ySxd#!4m?c3?)+kE3~JIl}$UsP#; z$g+f6^78UtMl((f-uv!JD$~@@>+^0p_1wEAx~gGmAO`!{9_|@o#&rVngfJmkP%8JA z_8RI9{bb9@k=d$|Yo$q#^P8F?9#<>A4h{|mhl%8>gUz!Kny)2P3v%^YV*SKj((GLW z0Nt0I=XGun9;P7xoT?ag&vMN=BLqlWtN|VOr zv(qf)bOw4Bcn~$8XE{B@a~%EGk;ik@3PFT2nf=#`BEm8(|*7h*$*0^49&mIA(4k}Wet zGEgPBJ+OH^P+I~}^7HAy<7J^DJR-uY5%3RdIUc%+gDlT*p9{{ox*%4SjRb4FVNt>C z2vaqwR1G?Wkh`U7{8(W%l;R5$#M6yBk#EIqXjph8 z1=+&u6{$O;fa#-h+}~&g>bI%csdNX8J3^nc?Bsa_K?I znfI!SL6F#AGu(69ghUueNI^Slfb^CUe1?Wi4KV%hWfWIR<_k{73r=|(!KNiRT$rn>|Mj!o7{deD6o~qtb(wCvDW${T z(~x#rq^q9U&CU7sVG#8=CyX9YpbHWb znl|emGLqqs#=n&<6x$+22NbTKxcCEZQiNme1(F7m7SEg(+v)JGr?Y2)qrSG+A8-87 z*VuJf+d)S85-x~gG=`v zbF)W0Y4d_qi`tqjLs2MH&Nc7BJQDl|@!W7H?3%_)G0y!68- z!GvoAoAh?iN)b$;Gvx-Hz;5Nds#_mLja+G4hvuf6D4r(MsMBe7*mNXMph_o@r)PDh ztL?3;=7(ytK&bX3bnRVhFVN-*1`S=>MtYq?y6QE>Y@TLr=)8_P1PU3~!1Vw!%;nvH z8}c?u_OK+5EBpi-c2sXJQW@T60T6v>Cy#~=5pA1Fy3x;T^Ffxj+n35_RWW8y@{R;t zL1W=m0EMvz;G{hb*kz~>O`Tc`t{!|)hbX!C z)}{VRimvN0=|*M5!WZae&lzw*N4QVnJhJ+K|9ttM D@kgC4 diff --git a/crates/homebot-desktop/tests/snapshots/production_assistant_pack_configure_light.png b/crates/homebot-desktop/tests/snapshots/production_assistant_pack_configure_light.png new file mode 100644 index 0000000000000000000000000000000000000000..4cdabc2b3398fc9e6f81bf3b61d6f79e07f77ede GIT binary patch literal 112310 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 Y8J24tJTxQ6!2jZhJs9`#FDESc-`JMV!vFvP literal 0 HcmV?d00001 diff --git a/crates/homebot-desktop/tests/snapshots/production_assistant_packs_light.png b/crates/homebot-desktop/tests/snapshots/production_assistant_packs_light.png new file mode 100644 index 0000000000000000000000000000000000000000..b16f38cbbcdba4b60ae32623032ae9c88d66d459 GIT binary patch literal 99441 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%0AAd6AppUL@mNnY~=5 z)w`T}-pj3$M$`?zmX+Oi94a3UrVJo+Xa!mScqH&tVEBto^cS00Jz~rzcDpn7bm!-9 z&m-Ya*p9hK;4phB)-+tIZlyVUXbVr-D|@$8Ek=551r}Hi&NU#;5ThQ8AvNz0a)R{b zqekjOhQoH1Ik8Bz``KLV;xwmU{@Uczew>ONFEMB zSS5wy?se@k(AG2c$L-JhbAXcgI$u{ zAFNajx*3pm+xV@>euJ`K`tcNUY~2a!@dQG+4pkUGh_xiMeMlX<{s6AX-*>g$d^QOnP>{Qg33!U zCb&1h*uHJCC(iiLOaQYcKIj?)B2YJIDV9+1zN)jLPlvqYu{YmxZFqGvyh-M+K_mp$ z-|D974p1FKbP|`Amgn*O*|X|kgyOeoJf9kPu! za7+7Dkc%_OEoraCzPuI+4Gz@o9YtGs+%*+lZbH~It(BVB5)jjdnt=DZJN02z+Au59 z_mPzGq0brMpmTh_^qoo^20O#FW-`~!p^mPn*3C4BtIgqOwfB%-5b&Cd;1!Ze}1)Pw{;?{T(B16n6NW<;v z@)W)Y!e}GWn^rlq0LyOfMYpuovGDf^{j*>$3w`Wo*0l>YU@LtC%@+#kC%{O`G`Bkr zY0-n_8f6hgfkmw&Xf}dC9+VLUs?#A)KvHlUf&e8R&sD1aAIRxT377ZYNBGYCHAyF7 z0y&3d=)*Sm-(R#9@_H9h@3$3jr|ZWt^6*9FHh-J7hR~~;0>I^ z=9Un1jXzif*G9RJsyjhUON?$W#xaGxLZQuM3}h0mC{v=AZc7e8LLA|Wc6XhCLR6hY zGY@fE7X^&>L30g#BvGhkK0;`Wy+ob(f!Z@mZJ5Qo7eT4%fceYN0sH|24lY{n>y5eM z-CY}CT6i_1nL{uUGQ54ZXYK8p_M3a@rPE!-&9U5SSwyvM zqzpK~7~N4T`7KHV8h0TdvS1R@0y1W;{d}bu*vUE00jKQd<@Og5f8WBDR-`Uf(B%>W zs5TqgxWFKZ}?WBi>n&$ zQe{V_KZ)ua7?_qJZlk#^!kBX|x+X~s(0jI5FGQEK&GDoTMG#y?Y&_4 zro&B$*;2t$CgT8%dCHiS051gf$3JhaSQV!z=tH#TS|GZ$f9ZSn%EwzOy~QhIdZyUE zCr`XV?1VBiCy!YEuPmij_Im-JSYfi7LhRKNr#VF{=FOzo+vP`KekAlIk~#5^KJif4 z57x6Atp>`}s0qwy+eNc|OY25`fi_(v7;n|hXs1>MKILmdhnjPP=%q*@`%!po)0^xX zbl$}N=J}+9i@?!J35AveWCN~Ic$QD00+SElr(t1aog`Y8T} z&CBQyEPRD!)wxB4pnb2m73g>SM-n#bIK06pgQ7mjVt8ll_T^rT;>`tz_jG}4d+jR2 zTT;_o_|A>U=bI5(xA$LVyu8X4v{J5w$(L94EH^!e#SI?}$XkkGlmTCP4jSsgy?S9T z?I$+YINB2O0nVPpqGVQ(;*p_v>iz(Y|-D6VZ0qbeX_BX(>I;Ky8~mO7+-plWfj zgCk~F^5}gDexFcbgb`FDw4Fn`=|*@s0c?aW%=B6LAUOayAEUK+@PGF(phW{*ym9MR z?cYjzHjE*1#0P}Vr9LZneLuLCV!k9d{CxsBTL_Cmkl?O6hmV1E2J=G7y-yStaTC8c zQn0w_$?2}HnAqVbvDx+je}BV%pilzYNXzdL>U05Z z2EMqwgmkFNwx4)Zj%^>gJGjz`79Kpbb!6hT%vB$GxuQeV{2=r|wmhY4X|j)ExWSL} xCHS;JhVfK;|B3&&3(QL_Q>l24+v|bei{!c&?J=M2A;G^*8$N#j`k%iz{y$hCYL);1 delta 3697 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 diff --git a/crates/homebot-desktop/tests/snapshots/production_devices_light.png b/crates/homebot-desktop/tests/snapshots/production_devices_light.png index 3a29b90688515f805ebcdeb47f1fefc699808fde..6e586be19cb56f1d36c5ab7cc1cb5cbbaf9cd6e2 100644 GIT binary patch delta 23208 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
  • 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 L>XEk=ZutKIgBChl delta 21963 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 delta 3758 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 diff --git a/crates/homebot-desktop/tests/snapshots/production_provider_unavailable_light.png b/crates/homebot-desktop/tests/snapshots/production_provider_unavailable_light.png index e630a7c22c29ea5c0d46ef7c6510bcbcacf3252a..d2fae8b4c75bacd1e7179eef773d67de8accec6c 100644 GIT binary patch delta 5827 zcmZ`-30PBC+P+~CtqWDC$gso(Wvtccpn^4!wqo5zsoH9*lGLRzEoubBB$DKURKcR4 zMw%i>wAP{4kql!oq9K<}!fIS9ONmJ!kf1EtfF$H5nR9Muo>~6+c^F~zgFCne+aCK-(#^{s#2&+P zu3i4%PC<@F-MbeX+iO?%!8^|Thb`n+rTo{W?B<;%wSr8gABs&XK(oNrwb&1rJ>E+& z<9IvMIU6{*FW7Zd+^U2 z0X8s+vGXJQ?n|+YPX~Om*t@$^ms#Q(Ew#V}bL%&7y%HZ6_b4k6_2vH zjoBY1_0zhCCF;ke=tSwx%{}dVnf-G9kUR=?Q4RQGLo3#&a1ANgEfVe)0g2=<#7HD> z)FfUwrJMR>r)c8iZN*VFg%OEJ6mMc>X`E1de1@A{8m?;RWf#2FbxJo>_SzNzF*1P0D5o6*eqxV)E z@9p>wlaA@qDUUzj+NpEM437K9U(JGbxTBu9Q`nY(;C7LFjYOF;6~kMw))sJ^Ix+es zvMl~VJ=tv{TRvote%Pr?M8^{=hwpXYcTEg(iX@zbpv{YsPF(TtUS91A`}(Y88L z#a4KVjgy$wEmg`E(*l}#fihJQjr;~+iZz8IAFNUhCTq_}dKl9f z)-bcNitp1v$PO+(#=tMNUT>rZ|ERr=peZTfRVrs z-^xOTktc6N_P(GGzxec>*@CBfe>CA^SHb*K=$)Kv6%C$OV|Z7rsN1T~Ms3;lHZ{JL zZhDJxF_QN@a{a8CHG{H|K@a04a2DK#MDC=z<;Pq&XQawXkI|>b_-vB)ZIOjpU$V#q zwwF{rTVi@nb3R9=)m2C3DU;ai+p6-~ zBvrOl1zR5umOX_1CbFy%)urZ6rd!h(0T~1?B4V@=bIxSS43+97n0blCLUUV`hUEP8 zV5WHyv-TxR-S#Lqz&@mK9Y#Ve-^q=IB75PXMWCGm0x0ypRIt+fYBk=bHsXgCf$#r7 zE~=1{Z#?|tiuT^Grg#& zh-$u=A3IAhZw_F)sRiy2efh>LdtaRE(8z$ucE35-r25v*QZ}Ct zX!8QZ@x}ucdy;jnfhD3+YX9P38oxMTeMed`x|Wp}bo73vqpCBvY7TAU2CX@z@`v_j zmn#P1z_|RFso+jeMZvxsR7H3zm&!lXyy5q?{g-{4Bm~&bvR+`tHGsBiQssR zKZHl0^$XuN_pBqjZ=Nr~gLY0%56WyO@x(ngGT@|Xs!^o3-x;bi2lAdZ*Avq9QBXIl!$h`L3Z_!AM>m) z<-X1*zNYDF<8~kjGO+hh475l zL`7-x){bb@uiI2ZZ8ku?TY%2E&PAe@$eli#@_gPqK0ZFmbVC(YB99p_4-O7C{#+V; z9=#){xlDh2UcXeLtUX9}d&1eLY_w42t zY4dIA8w$mNat-L9HhVkDbnXIld5=@DoAVZ3pGMCPc(JNuUtL4Pq)Sjg5g-oIS4FbL zkfj^BG4j<=nhdTH!#1^5>g>j%)s|>=-GOpoGr)oYr%@$28psKYZ!VwaS+Pq6;9OWX zh_DAG{3KcbUfJpM=cni8<*`ixXfk~${1JUx#)jzE+qpFXToU*(<*~Zy#ef8{iQCxs zgYS-8t(;0>`kLS19r5$NWo_7w*pD{%tbe*^K?H}t>-Jj`)yX9mdvVdx2WR&zq5SmF zAS;SUd<dZt;K6n z&y)?a`Cx60e}pRk{)o(R^l|Z;b$1GUepRazs{-kS5|59M-)EcVLy5ZEb?$cAM8`?N z^{&A8-)rfAh6lxZ-Snq_*Z#Z0rcZXqkGT~=z$6*FF=zL_v=`u&f8BT&pf_6US6{ji z8;e{h>}*(lPf$MKH@$2E%>y3r$YIYXd$fX?-EVp5-@p6RMec4@)ALIrP@z553&pDxjFTgw_Ts*pq11 zRGOSv8{IHQ$2V{ag`B|9jRMijz#Zyy&FDpi8&~MRpzFRs;ASaqGesfBo5eVQ zmNLVw3bS~BkM03-P|~p4>LA)0=<1c- z0H;0M^H2JdZJFfB)hDZTpD@Ng;hf&h_NI@0!YJtA4|nJUD@gudFwQokS-Am}6mU)^ zApgyXv~I1`lWAGatb=^GzevK)m1uat8rmvj5`bo*wop&l~w*ERv^i9d?XszEQt zP5cnodq?&94*O*XFP>N*D_z3ULZxFXwW0Ew8j@)2Gm&>jn9T7ID*{SQ>!;OmV+bc> zA6C1LAfaxX{4QN=2Q2;hnf=!W-=#ZWFs=ec74@vh=S&0I7ztK`P0tAXm+>xpAQ=92 z%He{^u3YKs+p@Qza5m)vT>^`Qc7SAqa)08)3HG(;rEv#~UVQZkJp&%4zIwJ0ahWOZ zOW+k~JT1m-S~0=d5P54(49$VQs4*Nhhg@zBg!4XV`8Zc!oK3=p+;-R!qBey{mlM?0kwzW ze+PJIw8qL+SdFkZxX&Ybe$Q8y-@RL>a4HqanArA>SmOi^(gu!v|5tbRJve?=!t0jw z^TE}IM-QvIA10goHUX7_%FN!r-b+1xMBMoPuWQC5-r2~yB5zJiWKN=RO+iualP|=Ig>l+=}RHopiBp|3s{5 zwe@Am^X+&)acP7)W zm1V(jh^O;F!B%LaQUsZN|Je0L#=t?^_(A)3`Sv+P+%wEOyW@>Z?EQdD=x5v;DV9G_ z>ZV!<-f3XslN9WR2wRuP`I&0qyefyq5wdy+WkkK!_P*=CEgxrm9iE&$K zBA6fh68XAB8<40}7YIbf&>?C0|GXN00g#;SAtBx&<-i^gfrmC502``vDEl7^4B@i)4`#tWlYmAAqUDduubUZtkQVG92W~qm zHGO!rvVXR0s6}>8VLPWlG$2P7ExrkU(ddhGPWsQMI=(i_!wBujX`0IUQXP^3TT#b{0a_skfU-b}K%@Y|3k>FEhT2kYbEy&Mg76p!j1|@haq{L& zE>O}4;0{5blaOvAtStboVgo^QRhVfri1!FrQtGP<-;kDV2RYWBPZp`7&^7SI9u$dZ3ba zc6K8Fy(l<9K`;IYHuaNu;%(q|>H_#Z0V&uP;WCpRb?K#G2toZ%)(89*z}jJv=L0|%DOlWa{U z%d`0d*)U!pVf%|5JkVwoy+Wjit&7?Kp5qD54EXcqTF*_jt0}Dn5}_n;pM~>gfvigb z^Ac-1CbZ}k7T7EJh{3fC$dYKHK_;qVD8g52y`^}m<)Z-Y4K3l1ct?y+<1LX;CmL^&#rT)ORQFYH@8 zQ427u_*y>>b~ti8UjDpfd?m!aKOlp6)_smm<;{+-zbj1fy`r!SC7T-ld>@Y&g62c?Lv#bXjK4wD6@*L(g!g?l|Hi2dM_WYV8?*Hkw oE1UzPji8{5DLLRrqP*?zH*zMO9a(b)0e_p;Z;LJa;PX>|2e0c&QUCw| delta 3800 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 Q{;gcTc3JNKd~x9a0CB95c>n+a delta 9932 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 diff --git a/crates/homebot-desktop/tests/snapshots/production_routine_recording_dark.png b/crates/homebot-desktop/tests/snapshots/production_routine_recording_dark.png index f21a1defe617692bb0791fa42866a658958044aa..ba6d0308eddde9801d124e28362d51905ed0ecab 100644 GIT binary patch delta 6759 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 ZnkkQuq|MprO#nZeHf&#i>+^%B{|y81JB|PV diff --git a/crates/homebot-desktop/tests/snapshots/production_routines_dark.png b/crates/homebot-desktop/tests/snapshots/production_routines_dark.png index a7e8d758dc0b20766c2cb5ce915d094b9345fb22..df61bc63210571b171eeeeb48b48d96c5c287b6c 100644 GIT binary patch delta 6722 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 H{?q>l>cWSz diff --git a/crates/homebot-desktop/tests/snapshots/production_settings_light.png b/crates/homebot-desktop/tests/snapshots/production_settings_light.png index afa9cfef31463d7a68614cf5bf044f4840be8590..a550c5b2eb69288ad672c4c454437c0ee5152106 100644 GIT binary patch delta 14250 zcmZ`=30#zQw;n*n9RbaqNf&bptvC#Dj3MHqoNGM0JG0~pYwuWSoik(CCkjb|K)7Yd7gthx6kw2eGWO8 zPnwxIQQk20C}ZitTk@U_?|kNvr~rxC@6FR2qJ9O!Rv?qOJGcqlTy z#wK%L91jGT9E=ZqjU%>|rZh?>Jh1if-Fs6OEwJCicq}@URMDgjtE#svmPiesc>68t zW5s9+!;~YLpgU4wDLbjTRNAclPufR@=cT5%MCva^?o;-${pnFfF}9M-Wy5FseW3Ni z2HJl5rvD7vN|(Ej&TR`b)bmTn=3X9q_T0HblgVwQqfY~yppCfGl2_gG;nG^#1;fPN zWF+B=yu^}{6<>b&C9k5odTV%ivfgM?ux_^+6JERs@M&%IiA!&}AeS3TO$-*0}NS_A8*>$MJ=Cl4fq>h3d+rcOu-HbuAgq(Iz}CEL^AAe!XW819Q0wz-ZxOh&S%kxcE^_#51N1fMJ%8ct;^VB{|r{vzgl{Fe#cJ~#C6WH)6@l_DrUe4JC$QF>C)1_MZk}3}82Wq*|JJ>G)-vT-+2!sH z2RGkQ9&mTrv!yuhoxv88%%{VdH`kbs3X~ZWW17$B<(2s5J@iu+GlpVp+F)T7UQrnO zTjK61f(bFjZe5wYs-3sqHfZA6Ic2lxa;mHCMEdihSiz2*#@BF~B65tjv-@4YmEoYg zjmIYavc2xgzCpZ-t)u#_l)9A!UwZmW@&$Q7_Ty`5+0{3f<=y{mnOPfIO}_zGXEa7u zx4x*3Yo7G4ua7oIgq_OHT#Ow`5a?cWsbybhArduW4rvx?WCExSJ&nCr7*BE)mY65?|Mtr z)=yLrJoVIBnXEKVU45&mX;Q)k`Rwxbg%m%J5+na(dJ=Cs@NkT0h=2LbAtBhAHV%Y*$TrAsbN6j z^beM9%JL4XKj_^4)nu3G?Z-4pQtfD-za(kgxN(79&;R4(j?UsC|;?il?E-v(2#Nic{>>JwfBbe(2o2qI?(c`Sa&(KTmdzsoZhtVB+rI z66Xi23AEk~c-w-lB zKJxjNoX&^q=FXW@^P^Sd8>Im`>wo|Ftpoi{6P>F=9a0~BGicbQ$cDJOt zyx8tpf67;P%Irez*JD3U`)K{ep7r^=SK4?D=T@ox6br=cFN})U$)ctv?6?lL^9d4{Y-}L%zf`L#BUfp&lHufI9#+d z=VwK@Y+ z>+0$nReTuXjQH^VJv-Z7uD;zIY;t&^P}o|(_1Yl+En_Pywu(gY+mBWJ^_RW<*@FSR zl=dU1+m8BbkFMYKU~Oqj7SfIOh1?X7zU|_(GpXr4|1hcXtR}v>){2>vaOf+6V8Q?o zRJw#iedaIXy&jWl(i`C?6OJ+#m7h$qzC1{R%GDQJq!?sk>x<)6{7<)S+s_=tjhJTo z2LzaHOr{KTFu;F{#QN!Q8)nFx?EB|$Ea&0LyvmAx1x}LavJw4DKh%btrD9t9V1)VZ z{FByyn$KEe8sySA#j}>&8JBIqYH0u>q z;q*gE$L9ur9k2T}ezQ}uS=#_<+kgmUo6%}LZg&%vF}XU@w^cnw+CGK1KDcCd#O>mU z!Ib2#H#4T@GPSGJ_()oUEN^{z){3go`hyW2?#!$N-UY;-<`%lA{mdL**(~M!!s*lF9IQGP`*tjL`9LzwWH*J^c2KT4nA_zia}sI3 z7G2++*ECb8nyF2d>87?`Qn=agp*+xI>czO4SOfCr^ho)+_0t|be%!d$w{vY6)tlB_ z)kpNavhr-e3Dp$E8hKoZY+$o39yOMY#C#P$7w$n(GZWQ6_DxO2dKBKyHY0)%+>@nAp90 zExrs1$ua3#rkvsh0;RaBs|o=`=Y08m6q_U|nKsUTt=ERmT<)3)H8%a7^vR|sVVjagP4X?cBiO?3Gko1IG}Izb8QTTpe?e4vj1 zB1GIA@>yDtB>H>XMH!3Rd_P0>MFA1k%csuN{_d!sF>U>YfX4rk!^9@g+3_^-?xw|`W(#-$7^;%V_Q)%h+!AK|9uJtP|-JQ49 zDOp+NuW}6A9};Rwh}kR<$J!=t+SX3n$*r53Z_h)TSYbPM>{u6JOXrYdw?DyWe)>40 zd~jibWI~xOBYf>BYcGU<7q4)BT=Z^U*}F=ul+}J)zXXAT$~RJ6JM#DS)6CG1G?lr% zC_}k(G+c4~Bxk+(Spe44k$;^wYl}ffj4(AbZV8;X_0Dc;{Si;?a9(;&(-^m=EpA^c zbm@w^7|#fMwf?M?emX-afaeDLB*Pf?d$u3Dpu9F#3$XW@AV}t^J>qFrLq4zt9}e9F zRCb~1m|tkSM0%UbP5TCU=Z0?h&F|X8zgFTbA6&2@~Eis zL?|p=E!C}Ydv?<88^p!U48zjz`Xdn&LMZLN3>#bq@;Y;efIwhf(Ew^~=)7&{As_M# zO(GMj?MOyB(qiM-D1zGpdrh6AX*171SoUxXPo_T9^lt7wYOe-fL2z;d@# z9ma1}?-gqH8tz&dhf(?HUw}psncH`fT#Z}iY*zV+%vhOwrzLl&TK|)y&faGYU_Pp* zPv=_S5mD+esk&B-X9%xb8Sh#t>CSl(#&X6rqy5c{E6G@zz($jpYmnruQLa+*S>=+t z5Jnvm)87rpmyoNYOC7;j8%A;+BhRku?0&PhdC27k)Z!`XOMrJ3C& zQxd}F@b9cQ*}hyS28bi>+QxjR2L@JloEDzg@6s>g#B<^YFgg$$5{GgKoW@%>(+rmH+$}?($RQ zDI~?#5dDj6!1vGvVs!|UNDy|Dn{>%%DxQ4&5Q<)6X3_x2p>%! zT(zrw1A(pZ)|~w>{|Dq$s)VenO2Oera>43`71dvH)u*P07sXW(%3xs<=P+9??_(1w zm431=KNb0B?v3Q!0fekdE?+j|C7dlWijmr+cvC)_M@nm(J)14uYAixG+3>_$t8X zd*|?T&h?M+nJ|?z6HHBKs~Wt69z7H1@)5ez%shUZ8Na}op4a6K1mSpna^#?6cXZ z^BNdqgWFSyTg<_OLvY<2%FSMnQHRUa_3r{?Xn_WYe4d7q!o5XbvUR3g$3o$e4DGRu z+N(a#uL4SHEV;(I`z+{5d~cvQqc4$6E*ruKZFEsq8lLQCYVJVx@z9||FEpow&p|OR zjvHSuwzRaY0+J>GP2Omr&bic89oTexG)Smxui%2dQRpWFYp?Vr7D8EHtSv_mdE7Pp zJL*?f4P?EEF#uCRZcfe1{PQ`X%Ek6*F4l)U-o>l9=5#)jT9;%BB#=_riw3!PD|JiF zoquH*|1xxmSSN1lJ^ysd9uSeDl3ad&^hP5`5Zq*kty{N_>lbqZ0s@q6`-R6xZtZ~) zE<%;|c(N!z$#Py;y8v`ogM71_G+0&QtP<^NZ}6b5X3$QQ1Q2U+0sg8hFk3s^>B!5Z zDp^qFVgA!j0v@B|0VO(D-}lau3ecyNuCVbkmS&HyWf6lr}U}m<4 z+RuKO{=pB}-4biF;r-c<&u5mbWmECY;X~OiNNn${u;qR=m3}pZ-QrQ#)^-Th@)`5C z#QNdzVa)%4IGiDA+!+%UH4dj5Sr}4h0lAO6JL>}pKx0E%MN|FrWpHA}a`qcN@zCj}| z^y-`|dToaM z9|)ECa1r&agaC}VD3A4>LV^d1wxNoGy>=b16U(W&U20fv>hNTbctu?GYCw|No_257 zc(tUcn2D?^R#t(qJoo6^=50NY?qzrXH{@k(x!Y0xYH%i^hp-Oy*%_K|GOk-hUYQ(W z&YjdKMzDSllU1uD5*L$PnAv+3 z*NHwI)sGfRV$yoy3ZLd(KKm(e0C3o`nqr`6mwp}+v+r%0kI3Y2p%eUi)5f0I-74zZ z%F(8Nk3n%0Ig@riJDV6Q-v8fH5(~qA_wVK;BeTRvJ6%$Dh7J1FFf#0%bNEaG-b%;A zMRVe&f3cxBIQ+>%{!I`9X|tD3G59U+W7R?FiEGN4HcO^};Fu~0*&Z;0yYU=jR zr<&XyH2nECw;FAtK%tADCW>R4oB#65XspQG0^f@0n=Kc=8y{X(-<`GdxJtTep!#tL zpFJT^URh#3--eg)uW(>VBEd_g@dBP8=m9%wjma{!qR{Rd@fRwP2TK-nenW@7L-qu3 zmAK3YEnZ0c%p0sL_!?;e5hlcs86L|SxhDx`8 zjcI?yqer#Tgh5p*!Wc;5ze7VIF1$=?`hshz8LqiBwe4344-5QNKh4?oY&c3CfxdsO zKOQfTE|6*}chLAYH6=5mrst2&xoB^AHbHKPxYHallqv~p4Wb;+OrJVCgzh-ccrB5w;0yfuJn5M{N>x??o-?69o!01|@=TxXcgy z*F_G2d6?^)Gv|ZhEVA%`c84|BvJTd$PT#NDqyKef{fPgDS?CQ3=^1;p{=d(kTSDx4G1h<|r(} zu<@Zq4i_4~TSwX>0K$K{=$>?K(yzY|7!7Hmok)E8RDlzSg>gdhIFIh^!((8*#eFCZ zF|*!;|4bZE$)ojn;FJYC&Wo?mXF%8zgm1l2KlGRF_A^O0Q=dB+(7G)-HC-3qMx9MA zs`f-y`luWF@mepoOye@G=xEX(4>hH$mQH|!y(}a;_Q?RxQ1ce1^B8jjv?t19dJ7$c zVfd6zyVUB@#fQNfK^;g4-J#Ns^Ek2!tsfcz-J(8V)v>$o5Lp7>=fV)?N#WuSwx_ET zm~9;EQ8CH>i9RJ?kvXIQDU8^Be~XRDmcN&*^)jw|;2p+L@@Kc5&s?!}GhojzS=Scw zbsw1We%THk>^~XhhIIhpu#flDzkQgMJ`O4#50q}2h;)Jo#gh*$@*5HbARG+d8hq7! zxf+^lu+Rg0QBOTZEDr<-IP_QKo*rP(x!fMQhUvDn8O-qL{lB+OHo*OI7T|dh+0PXU z(+lp*l?L}SSvzI;xfky$ z_2I8@G{hcBF+CRP6t0%5X<-pGS;z?#s&H4HATu-b^5_m>BUs+all;z0?4;dHg%!8DiJ0M*X0Yv}+khXUve!>f27>N+J6K@i~-@pc(cKCIUZB?twKqg z5W`q`7?`c_$@l1dz3+P_v;r$mre(*F@~Q+E7k| zqA|2^IuuXfKy*eIo(ZMM09$A$O}Oc^LzpP!F#HIr)@#Gjq)#T5&BD1NK_$0Y=_rU-pJ@&N(4SUC_yAbzA5A1qQ*5{Z22QK-M z2PJz5mZvIMmQ*beerer-uG!}P?b2v2|I*acz z8?Ob6HYVS05Wj*?nRG(&I5o|X(A3ACCFYzOO)MjqZMgN9n7>X?;_WxtrIbREm-lw# zp-f+<$kRlHeVVhr9eETi4`JmU7i#-a zydz0-D29;MWQ;9+o(8b6JR$V;$|aPp;amO|cozx@@`nLuX2;+*yPbl|pZ`rHt~+v- z@6-Rxj=au~QcNAEXAZV-JRoQ-SG$rQhqmqIe~Tm##8t3vbaomm{w0@hBcNew1_x*c#*PC>ks`x)pO`CGaNw6V1scU1K+#$%GgRQZi2*7VM#V0) zGt~L09D1q*_YTG=U5q4I_TRHm)kW#znqGji9`~R-e5K|v$%2&R?h9Jq$=CrF`XT^( za(FaaPP}^r0`jG~xzgVY#p_r?tD&zmK$UF2qwIT_dEq!vVp+A)9o%$B=qA$XNHUz6 zToMWad|{JnE_)bi4ZyXf_q0S{kk-Vc2#~uoNv63;L|r2J0s&!I1bG8h3HRpfZj-<} z(0_)ccTN{26a_PqqF|(0R`G$>u|p!%N;ron*$%3r!Ly5qXRa%9yx!V6P2M&{UO;1A z5Dc{#&3MzTakbk%b_w3(d%GF$Yn%VyZv%w{7Q8v{MD6w&1`{rx7;~V8o!JwP1R$8+ z8v+=`P9Sw4Yj8s>P+w~Zr-v;-9?SDlRsHwN4_Vh_4}crxb;MMVRH% zcndej!6p$fhv*+`06Q?I+?R1BjrRt%9w@pS%7bJy3rKV@Mz;h(#?EpTkCDFD)u&e~>8*rWINh3K+r>g-nXu&Zthy6&?Flmt z<}h}`?gCt8&?GX{gEcY*XT6UV_-tC?c`v5JW5{kunby_wq7kk>5c|q`9{)D;<3Ij)eg>Edq=EnL8I(Ckq;^;`mF@CY$va58;j|@Tny;Fqt@S1 z7*=u<1kM-^X^75;N-yC?mWIGj!+wBBq^LQCk)lu%RQy$MW3mNWg@LEg=PL%y_d7^M zgxNIef*ei0v}?Qc{qkK<_7Wo>B`S%1-~(i3u6ARIpdlvCWoVdl4>VA{n4CbC__iNTQBd8Qc^M|K? z*2VNK$MRiU}HrAuJ{hohA(o$JSMcD;mkH+OIq{eE<-MK-J#k8$YZ@?mI-RM-4er z*bn3p7!l4j6Sg}D-%C46j9UXuwGpoaK9v$Vx)L-YW(71EXF5rYl*tgrqedDC&+$5b z&3sl}Go(6-uRYBF@!?GxvTCm=cKeR9qI@Oh3x7a%xaSR$zZV+vGWumbB$kVlDdHD5 z3Lk;$g|fp5C3FC8l7;dV(u$&(rZSN#b2eZc3S)dJm5?Wk@r!7v3=EG_7k3FG0cDec zPOFHcC8ZQ{8;{@lA^$3|%1UlhiA2}Z($xHCsoZ29NAA%1uS^!#P2PzLi`1|hMIm$n zhqMj~e1>Bz^zG~_h!j6(y+37Nb2B%yL_uQ0NcOi3oxIjosI+}lRnk3PtNj|mf;UEgo<{Y{ zu#U7g5ULQ<^J6H?h!Nw)AGBfnyh8hap2iSsPp1@qEf82+|MBo|iUeSdiG4T*Gb=r% zN5YN4V<0l)X7D9#Q!=J94VV~shx^T?{FY1Y3xypExub3<$83=1dc0u?N0IV%Kk~V; z0{A*GB^|dtMWIcJkTdE?K9^AZNDi`$ylWXG%Z{wfZsg{fAV&|f-vhvp!Q*AhpLU<} z+C33DE`L9yE6D4_Hmk#-jb7niZ^WDu0t=I&9Z$<5s){4Wanv!X?DTq&jDBqPgi8B8 zm;yVyoe=355~T&oX{g@ZXd7Mr;`7V-DYLMOaZ=AvexwTmV*rE&-eF*y+YGpMSLSc5*&OuaWWGFfQ zWz4Sen2^Msyc%B^k-C^}0XPY4@6tilR(#YeY=qAmh?^rJNgB3c{O;2{A4F6+5ciAL zR*b9VVAADKk@3!ncZ(z32qrf-V~D<@2`Ki+Dor_Nc#aF16w}Ljs<8 zu8T_p&94J<(M)m`w)&{DvK|l^Q))&?QuJpGDDJ0@m=_>$@znLVw~@`B&N&oIcyU6rC{`k$sHbL7Z6)PYbOn6`k8NO*E_Xw;@r zVDWnIa`%Tr3V9d}Bx(w@r90Z)snms1JksO=3EudVfqH^`WNpR`oXEz^k7=Z_x2YMU z-}4tQ5G>TWlVEytEt`?sK2^ICX z_2??@0@x|10w2gu5DMjapo)E-MvU$&7qN-x#5ikY*lyeWTmSHdKvX- zZ7Gd_3tZuM5Y5)#d;+asS_)bAvoyR4vdy|%fPtu+abN8U+rtd(Ay7N(JNeW^z^{N0 zf}ykaIt3nrh6%F<7wuLXp2yJ!N%vi&HWhUz3r;)AsfU`g4ExlE>h0 z2LN(kcEQMbtQ^;g`FqE#kHDd2eFPuG_Q?q`0NpQAE=j^99NC3gCs%hwmab)kz^GU+ z*a`y_LJG&~BG0KioP6PRwZ@4G3x7vVP9 z9x+OkU%F1V*amDDF{~h!?cT8G<~T8L06`ZxAzpw+46l1nJvDskl-?bK%-8SW!!c#E zy4%@`t?)R`FG$`>@<~n|MJNX)d3aM|_cAQ*|GCQ<{mJNHueKRRGEPLko;XWk;{4CLRbANKIpaO?rCBds|Z z#VqmOATwKr2wq~yY0Ylhq2=YfnLfmugW*8;|2HoR_K>ylz~~-m0A>)rkuT-AYPLn7 zG~gk?#uOKDy;9K4T-=hr_B!54nDXUz2hO)~9O&V~IOEUHJnFD-9G{Khn1F81JY6T; zce6X}*?Qt6I3^W`enlNengQ?d5|?`P=yp2(GLmzNoaq(1CN-y=onckK_83IAXC|%q z>JzPqA+ULQ<>d*zc`-&%BA<>ZSOFSrJ#mtT@Sjf|RP8iND#Ue@W@ T+lD(l{O7TF<)ZZWHtzXfyooIP delta 12138 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 J%7Qg}{|~}gkt_fJ diff --git a/crates/homebot-desktop/tests/visual_goldens.rs b/crates/homebot-desktop/tests/visual_goldens.rs index 1857c7a..4a7b99b 100644 --- a/crates/homebot-desktop/tests/visual_goldens.rs +++ b/crates/homebot-desktop/tests/visual_goldens.rs @@ -59,6 +59,7 @@ fn production_shell_exposes_working_navigation_and_send_states() { for label in [ "Search", + "Assistant Packs", "Routines", "Plugins", "Account & settings", @@ -117,6 +118,16 @@ fn production_desktop_visual_goldens() { HomeBotTheme::light(), ProductionFixtureState::SettingsDevices, ); + snapshot( + "production_assistant_packs_light", + HomeBotTheme::light(), + ProductionFixtureState::AssistantPacks, + ); + snapshot( + "production_assistant_pack_configure_light", + HomeBotTheme::light(), + ProductionFixtureState::AssistantPackConfigure, + ); snapshot( "production_routines_dark", HomeBotTheme::dark(), diff --git a/crates/homebot-protocol/examples/export_android.rs b/crates/homebot-protocol/examples/export_android.rs index 1ed54bd..0828fb9 100644 --- a/crates/homebot-protocol/examples/export_android.rs +++ b/crates/homebot-protocol/examples/export_android.rs @@ -389,6 +389,18 @@ data class SkillAssignmentRequest(val request_id: String, val idempotency_key: S @Serializable data class SkillTestSummary(val skill_id: String, val skill_version_id: String, val version: Int, val prompt_preview: String, val capability_policy_enforced: Boolean) +@Serializable +enum class AssistantPackCadence { @SerialName("daily") DAILY, @SerialName("weekly") WEEKLY } + +@Serializable +data class AssistantPackSchedule(val cadence: AssistantPackCadence, val weekday: Int? = null, val default_hour: Int, val default_minute: Int) + +@Serializable +data class AssistantPackSummary(val id: String, val name: String, val description: String, val skill_name: String, val routine_name: String, val schedule: AssistantPackSchedule) + +@Serializable +data class InstallAssistantPackRequest(val request_id: String, val idempotency_key: String, val bot_id: String, val timezone: String, val hour: Int, val minute: Int) + @Serializable data class SkillBundle(val format_version: Int, val name: String, val description: String, val definition: SkillDefinition) @@ -515,6 +527,9 @@ data class RoutineRunSummary(val id: String, val routine_id: String, val routine @Serializable data class RoutineTriggerSummary(val id: String, val routine_id: String, val definition: JsonElement, val enabled: Boolean, val last_evaluated_at_unix_ms: Long? = null, val next_fire_at_unix_ms: Long? = null, val created_at_unix_ms: Long, val updated_at_unix_ms: Long) +@Serializable +data class AssistantPackInstallationSummary(val pack_id: String, val skill: SkillSummary, val routine: RoutineSummary, val trigger: RoutineTriggerSummary) + @Serializable data class CreateRoutineTriggerRequest(val request_id: String, val idempotency_key: String, val definition: JsonElement, val enabled: Boolean = true) diff --git a/crates/homebot-protocol/src/lib.rs b/crates/homebot-protocol/src/lib.rs index 48bfaca..1d44eb0 100644 --- a/crates/homebot-protocol/src/lib.rs +++ b/crates/homebot-protocol/src/lib.rs @@ -1382,6 +1382,53 @@ pub struct SkillTestSummary { pub capability_policy_enforced: bool, } +#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)] +#[serde(rename_all = "snake_case")] +pub enum AssistantPackCadence { + Daily, + Weekly, +} + +#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)] +#[serde(deny_unknown_fields)] +pub struct AssistantPackSchedule { + pub cadence: AssistantPackCadence, + pub weekday: Option, + pub default_hour: u8, + pub default_minute: u8, +} + +#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)] +#[serde(deny_unknown_fields)] +pub struct AssistantPackSummary { + pub id: String, + pub name: String, + pub description: String, + pub skill_name: String, + pub routine_name: String, + pub schedule: AssistantPackSchedule, +} + +#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)] +#[serde(deny_unknown_fields)] +pub struct InstallAssistantPackRequest { + pub request_id: Uuid, + pub idempotency_key: Uuid, + pub bot_id: Uuid, + pub timezone: String, + pub hour: u8, + pub minute: u8, +} + +#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)] +#[serde(deny_unknown_fields)] +pub struct AssistantPackInstallationSummary { + pub pack_id: String, + pub skill: SkillSummary, + pub routine: RoutineSummary, + pub trigger: RoutineTriggerSummary, +} + #[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)] #[serde(deny_unknown_fields)] pub struct SkillBundle { @@ -1813,6 +1860,9 @@ pub struct ProtocolV1Schema { pub skill: SkillSummary, pub skill_test: SkillTestSummary, pub applied_skill: AppliedSkillSummary, + pub assistant_pack: AssistantPackSummary, + pub install_assistant_pack_request: InstallAssistantPackRequest, + pub assistant_pack_installation: AssistantPackInstallationSummary, pub create_repository_workspace_request: CreateRepositoryWorkspaceRequest, pub attach_chat_workspace_request: AttachChatWorkspaceRequest, pub detach_chat_workspace_request: DetachChatWorkspaceRequest, diff --git a/crates/homebot-routines/src/schedule.rs b/crates/homebot-routines/src/schedule.rs index 1c71d46..072147e 100644 --- a/crates/homebot-routines/src/schedule.rs +++ b/crates/homebot-routines/src/schedule.rs @@ -24,6 +24,12 @@ pub enum RoutineSchedule { hour: u8, minute: u8, }, + WeeklyLocal { + timezone: String, + weekday: u8, + hour: u8, + minute: u8, + }, } #[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)] @@ -134,7 +140,13 @@ pub fn next_occurrence( timezone, hour, minute, - } => next_daily(timezone, *hour, *minute, after_unix_ms).map(Some), + } => next_local(timezone, None, *hour, *minute, after_unix_ms).map(Some), + RoutineSchedule::WeeklyLocal { + timezone, + weekday, + hour, + minute, + } => next_local(timezone, Some(*weekday), *hour, *minute, after_unix_ms).map(Some), } } @@ -211,13 +223,14 @@ fn apply_missed( selected } -fn next_daily( +fn next_local( timezone: &str, + weekday: Option, hour: u8, minute: u8, after_unix_ms: i64, ) -> Result { - if hour > 23 || minute > 59 { + if hour > 23 || minute > 59 || weekday.is_some_and(|day| !(1..=7).contains(&day)) { return Err(ScheduleError::Invalid); } let timezone: Tz = timezone @@ -233,6 +246,9 @@ fn next_daily( u64::try_from(day_offset).map_err(|_| ScheduleError::Invalid)?, )) .ok_or(ScheduleError::Invalid)?; + if weekday.is_some_and(|day| date.weekday().number_from_monday() != u32::from(day)) { + continue; + } let candidate = timezone.with_ymd_and_hms( date.year(), date.month(), @@ -283,6 +299,26 @@ mod tests { Ok(()) } + #[test] + fn weekly_schedule_keeps_its_local_weekday_across_dst() -> Result<(), Box> + { + let schedule = RoutineSchedule::WeeklyLocal { + timezone: "Europe/London".to_owned(), + weekday: 1, + hour: 8, + minute: 0, + }; + assert_eq!( + next_occurrence(&schedule, utc("2026-03-23T08:00:00Z")?)?, + Some(utc("2026-03-30T07:00:00Z")?) + ); + assert_eq!( + next_occurrence(&schedule, utc("2026-10-19T07:00:00Z")?)?, + Some(utc("2026-10-26T08:00:00Z")?) + ); + Ok(()) + } + #[test] fn missed_occurrences_are_bounded_and_recent_poll_latency_always_runs() -> Result<(), ScheduleError> { diff --git a/crates/homebot-server/src/assistant_packs.rs b/crates/homebot-server/src/assistant_packs.rs new file mode 100644 index 0000000..d55d552 --- /dev/null +++ b/crates/homebot-server/src/assistant_packs.rs @@ -0,0 +1,289 @@ +//! Curated personal-assistant packs installed through existing server-owned primitives. + +use axum::{ + Json, + extract::{Path, State}, + http::StatusCode, +}; +use homebot_protocol::{ + AssistantPackCadence, AssistantPackInstallationSummary, AssistantPackSchedule, + AssistantPackSummary, InstallAssistantPackRequest, MissedRunPolicy, OverlapPolicy, RetryPolicy, + RoutineDefinition, RoutineSchedule, RoutineStep, RoutineTriggerDefinition, + RoutineTriggerSource, SkillDefinition, +}; +use homebot_routines::{next_occurrence, validate as validate_routine}; +use homebot_storage::{IdempotencyClaim, RoutineRecord, RoutineTriggerRecord, SkillRecord}; +use uuid::Uuid; + +use crate::{ + AppState, + bots::{ApiError, claim}, + routines, scheduler, skills, unix_time_ms, +}; + +struct AssistantPack { + id: &'static str, + name: &'static str, + description: &'static str, + skill_name: &'static str, + routine_name: &'static str, + instructions: &'static str, + prompt: &'static str, + schedule: AssistantPackSchedule, +} + +const PACKS: [AssistantPack; 3] = [ + AssistantPack { + id: "morning-brief", + name: "Morning Brief", + description: "Start the day with priorities, commitments, and anything needing attention.", + skill_name: "Morning brief", + routine_name: "Morning brief", + instructions: "Prepare concise personal morning briefs. Use only available HomeBot context and connected tools. Separate confirmed facts from missing sources, prioritize what needs attention today, and finish with practical next actions.", + prompt: "Prepare today's morning brief. Include priorities, upcoming commitments, blockers, and useful next actions. Clearly say when a source such as a calendar or inbox is unavailable.", + schedule: AssistantPackSchedule { + cadence: AssistantPackCadence::Daily, + weekday: None, + default_hour: 8, + default_minute: 0, + }, + }, + AssistantPack { + id: "weekly-rundown", + name: "Weekly Rundown", + description: "Wrap up the week with progress, loose ends, and next-week priorities.", + skill_name: "Weekly rundown", + routine_name: "Weekly rundown", + instructions: "Prepare concise weekly reviews from available HomeBot context and connected tools. Distinguish completed work, unresolved items, and inferred suggestions. Never invent activity that is not present in the available sources.", + prompt: "Prepare this week's rundown. Summarize progress, decisions, unfinished work, and the most useful priorities for next week. Clearly note unavailable sources.", + schedule: AssistantPackSchedule { + cadence: AssistantPackCadence::Weekly, + weekday: Some(5), + default_hour: 17, + default_minute: 0, + }, + }, + AssistantPack { + id: "end-of-day-review", + name: "End-of-Day Review", + description: "Close the day with completed work, open loops, and tomorrow's first move.", + skill_name: "End-of-day review", + routine_name: "End-of-day review", + instructions: "Prepare short end-of-day reviews from available HomeBot context. Capture completed work, unresolved items, and tomorrow's first useful action. Do not claim access to unavailable services or invent events.", + prompt: "Prepare today's end-of-day review. Capture what was completed, open loops, and the best first action for tomorrow. Clearly note unavailable sources.", + schedule: AssistantPackSchedule { + cadence: AssistantPackCadence::Daily, + weekday: None, + default_hour: 18, + default_minute: 0, + }, + }, +]; + +pub(super) async fn list() -> Json> { + Json(PACKS.iter().map(summary).collect()) +} + +pub(super) async fn install( + State(state): State, + Path(pack_id): Path, + Json(request): Json, +) -> Result<(StatusCode, Json), ApiError> { + let pack = PACKS + .iter() + .find(|pack| pack.id == pack_id) + .ok_or_else(|| ApiError::validation("Assistant Pack was not found"))?; + let bot = state + .storage + .get_bot(state.owner_id, request.bot_id) + .await?; + let install_id = Uuid::new_v5( + &state.owner_id, + format!("{}:{}", pack.id, request.bot_id).as_bytes(), + ); + let skill_id = Uuid::new_v5(&install_id, b"skill"); + let routine_id = Uuid::new_v5(&install_id, b"routine"); + let trigger_id = Uuid::new_v5(&install_id, b"trigger"); + if let (Ok(skill), Ok(routine), Ok(trigger)) = ( + state.storage.skill(state.owner_id, skill_id).await, + state.storage.routine(state.owner_id, routine_id).await, + state + .storage + .routine_trigger(state.owner_id, trigger_id) + .await, + ) { + let expected = schedule(pack, &request)?; + let expected_source = RoutineTriggerSource::Schedule { schedule: expected }; + if trigger.definition.source != expected_source { + return Err(ApiError::conflict( + "This Assistant Pack is already installed for the Bot with a different schedule", + )); + } + return Ok(( + StatusCode::OK, + Json(installation(pack, &skill, &routine, &trigger)), + )); + } + let (skill, routine, trigger) = new_records( + &state, + pack, + &request, + &bot.name, + (skill_id, routine_id, trigger_id), + ) + .await?; + let replayed = matches!( + claim( + &state, + request.idempotency_key, + &format!("install_assistant_pack:{}:{}", pack.id, request.bot_id), + &request, + ) + .await?, + IdempotencyClaim::Replayed { .. } + ); + if replayed { + return Err(ApiError::conflict( + "The original Assistant Pack installation is not reflected in current state", + )); + } + + if let Err(error) = state + .storage + .install_assistant_pack(&skill, &routine, &trigger) + .await + { + state + .storage + .release_idempotency(request.idempotency_key) + .await?; + return Err(error.into()); + } + let installed = installation(pack, &skill, &routine, &trigger); + skills::publish(&state, installed.skill.clone()).await?; + routines::publish_routine(&state, installed.routine.clone()).await?; + scheduler::publish_trigger(&state, installed.trigger.clone()).await?; + Ok((StatusCode::CREATED, Json(installed))) +} + +async fn new_records( + state: &AppState, + pack: &AssistantPack, + request: &InstallAssistantPackRequest, + bot_name: &str, + (skill_id, routine_id, trigger_id): (Uuid, Uuid, Uuid), +) -> Result<(SkillRecord, RoutineRecord, RoutineTriggerRecord), ApiError> { + let now = unix_time_ms(); + let schedule = schedule(pack, request)?; + let skill = SkillRecord { + id: skill_id, + owner_id: state.owner_id, + name: format!("{} · {bot_name}", pack.skill_name), + description: pack.description.to_owned(), + active_version_id: Uuid::now_v7(), + version: 1, + definition: SkillDefinition { + instructions: pack.instructions.to_owned(), + context: Vec::new(), + tools: Vec::new(), + }, + bot_ids: vec![request.bot_id], + created_at_ms: now, + updated_at_ms: now, + }; + let routine = RoutineRecord { + id: routine_id, + owner_id: state.owner_id, + bot_id: request.bot_id, + name: format!("{} · {bot_name}", pack.routine_name), + description: pack.description.to_owned(), + enabled: true, + draft: false, + active_version_id: Uuid::now_v7(), + version: 1, + definition: RoutineDefinition { + inputs: Vec::new(), + steps: vec![RoutineStep::BotPrompt { + bot_id: request.bot_id, + prompt_template: pack.prompt.to_owned(), + requires_approval: false, + }], + expected_outputs: Vec::new(), + }, + created_at_ms: now, + updated_at_ms: now, + }; + homebot_skills::validate(&skill.definition) + .map_err(|error| ApiError::validation(&error.to_string()))?; + validate_routine(&routine.definition) + .map_err(|error| ApiError::validation(&error.to_string()))?; + let trigger = RoutineTriggerRecord { + id: trigger_id, + owner_id: state.owner_id, + routine_id, + definition: RoutineTriggerDefinition { + source: RoutineTriggerSource::Schedule { + schedule: schedule.clone(), + }, + missed_run_policy: MissedRunPolicy::RunOnce, + overlap_policy: OverlapPolicy::Queue, + retry_policy: RetryPolicy::default(), + catch_up_limit: 1, + }, + enabled: true, + last_evaluated_at_ms: None, + next_fire_at_ms: next_occurrence(&schedule, now.saturating_sub(1)) + .map_err(|error| ApiError::validation(&error.to_string()))?, + last_event_sequence: state.storage.latest_sequence(state.owner_id).await?, + created_at_ms: now, + updated_at_ms: now, + }; + Ok((skill, routine, trigger)) +} + +fn summary(pack: &AssistantPack) -> AssistantPackSummary { + AssistantPackSummary { + id: pack.id.to_owned(), + name: pack.name.to_owned(), + description: pack.description.to_owned(), + skill_name: pack.skill_name.to_owned(), + routine_name: pack.routine_name.to_owned(), + schedule: pack.schedule.clone(), + } +} + +fn schedule( + pack: &AssistantPack, + request: &InstallAssistantPackRequest, +) -> Result { + let schedule = match pack.schedule.cadence { + AssistantPackCadence::Daily => RoutineSchedule::DailyLocal { + timezone: request.timezone.clone(), + hour: request.hour, + minute: request.minute, + }, + AssistantPackCadence::Weekly => RoutineSchedule::WeeklyLocal { + timezone: request.timezone.clone(), + weekday: pack.schedule.weekday.unwrap_or(5), + hour: request.hour, + minute: request.minute, + }, + }; + next_occurrence(&schedule, unix_time_ms().saturating_sub(1)) + .map_err(|error| ApiError::validation(&error.to_string()))?; + Ok(schedule) +} + +fn installation( + pack: &AssistantPack, + skill: &SkillRecord, + routine: &RoutineRecord, + trigger: &RoutineTriggerRecord, +) -> AssistantPackInstallationSummary { + AssistantPackInstallationSummary { + pack_id: pack.id.to_owned(), + skill: skills::summary(skill), + routine: routines::summary(routine), + trigger: scheduler::trigger_summary(trigger), + } +} diff --git a/crates/homebot-server/src/lib.rs b/crates/homebot-server/src/lib.rs index 8005acb..26cb4d4 100644 --- a/crates/homebot-server/src/lib.rs +++ b/crates/homebot-server/src/lib.rs @@ -1,6 +1,7 @@ //! Authoritative authenticated HTTP and WebSocket transport. pub mod artifacts; +mod assistant_packs; mod attachments; mod bots; mod browser_sessions; @@ -517,6 +518,11 @@ pub fn router(state: AppState) -> Router { "/api/v1/routines", get(routines::list).post(routines::create), ) + .route("/api/v1/assistant-packs", get(assistant_packs::list)) + .route( + "/api/v1/assistant-packs/{pack_id}/install", + post(assistant_packs::install), + ) .route( "/api/v1/routines/{routine_id}", put(routines::update).delete(routines::delete), diff --git a/crates/homebot-server/src/routines.rs b/crates/homebot-server/src/routines.rs index 97c81d3..d03a972 100644 --- a/crates/homebot-server/src/routines.rs +++ b/crates/homebot-server/src/routines.rs @@ -770,7 +770,7 @@ fn render_template(template: &str, inputs: &Value) -> String { rendered } -fn summary(record: &RoutineRecord) -> RoutineSummary { +pub(super) fn summary(record: &RoutineRecord) -> RoutineSummary { RoutineSummary { id: record.id, bot_id: record.bot_id, @@ -817,7 +817,10 @@ fn run_summary(record: &RoutineRunRecord) -> RoutineRunSummary { fn millis(value: i64) -> u64 { u64::try_from(value).unwrap_or_default() } -async fn publish_routine(state: &AppState, routine: RoutineSummary) -> Result<(), ApiError> { +pub(super) async fn publish_routine( + state: &AppState, + routine: RoutineSummary, +) -> Result<(), ApiError> { persist_event( state, "routine_changed", diff --git a/crates/homebot-server/src/scheduler.rs b/crates/homebot-server/src/scheduler.rs index 48c1c42..7636444 100644 --- a/crates/homebot-server/src/scheduler.rs +++ b/crates/homebot-server/src/scheduler.rs @@ -582,7 +582,7 @@ fn schedule(definition: &homebot_routines::RoutineTriggerDefinition) -> Option<& } } -fn trigger_summary(record: &RoutineTriggerRecord) -> RoutineTriggerSummary { +pub(super) fn trigger_summary(record: &RoutineTriggerRecord) -> RoutineTriggerSummary { RoutineTriggerSummary { id: record.id, routine_id: record.routine_id, @@ -641,7 +641,10 @@ fn input_metadata(inputs: &Value) -> Value { ) } -async fn publish_trigger(state: &AppState, trigger: RoutineTriggerSummary) -> Result<(), ApiError> { +pub(super) async fn publish_trigger( + state: &AppState, + trigger: RoutineTriggerSummary, +) -> Result<(), ApiError> { persist_event( state, "routine_trigger_changed", diff --git a/crates/homebot-server/src/skills.rs b/crates/homebot-server/src/skills.rs index 73b8a3a..a97125b 100644 --- a/crates/homebot-server/src/skills.rs +++ b/crates/homebot-server/src/skills.rs @@ -511,7 +511,7 @@ pub(super) fn summary(record: &SkillRecord) -> SkillSummary { } } -async fn publish(state: &AppState, skill: SkillSummary) -> Result<(), ApiError> { +pub(super) async fn publish(state: &AppState, skill: SkillSummary) -> Result<(), ApiError> { persist_event( state, "skill_changed", diff --git a/crates/homebot-server/src/tests.rs b/crates/homebot-server/src/tests.rs index 55bee9b..d892fdb 100644 --- a/crates/homebot-server/src/tests.rs +++ b/crates/homebot-server/src/tests.rs @@ -8,28 +8,29 @@ use axum::{ use futures_util::{SinkExt, StreamExt}; use homebot_protocol::{ AddGroupParticipantRequest, AppendRoutineRecordingRequest, ApprovalDecisionRequest, - ArtifactSummary, AttachChatWorkspaceRequest, Attachment, BotColor, BotMutationRequest, - BotPermissionProfile, BotProviderStatus, BotResponse, BotShape, BrowserActionRequest, - BrowserActionResponse, BrowserCommand, BrowserController, BrowserMutationRequest, - BrowserSessionStatus, CapabilityClass, CapabilityRuleAuditSummary, CapabilityRuleEffect, - CapabilityRuleSummary, ChatTimelineResponse, ChatWorkspaceSummary, CheckpointDiffResponse, - CheckpointPhase, CheckpointRestoreSummary, CompactWorkingContextRequest, - ContextCompactionStatus, ContextCompactionStrategy, ConversationReconciliation, - CreateAttachmentRequest, CreateAttachmentResponse, CreateBotRequest, - CreateBrowserSessionRequest, CreateDirectChatRequest, CreateDirectChatResponse, - CreateGroupChatRequest, CreateGroupChatResponse, CreateLocalMcpPluginRequest, - CreatePairingRequest, CreatePullRequestRequest, CreateRepositoryWorkspaceRequest, - CreateRoutineRequest, CreateRoutineTriggerRequest, CreateSkillRequest, DeleteBotRequest, + ArtifactSummary, AssistantPackCadence, AssistantPackInstallationSummary, AssistantPackSummary, + AttachChatWorkspaceRequest, Attachment, BotColor, BotMutationRequest, BotPermissionProfile, + BotProviderStatus, BotResponse, BotShape, BrowserActionRequest, BrowserActionResponse, + BrowserCommand, BrowserController, BrowserMutationRequest, BrowserSessionStatus, + CapabilityClass, CapabilityRuleAuditSummary, CapabilityRuleEffect, CapabilityRuleSummary, + ChatTimelineResponse, ChatWorkspaceSummary, CheckpointDiffResponse, CheckpointPhase, + CheckpointRestoreSummary, CompactWorkingContextRequest, ContextCompactionStatus, + ContextCompactionStrategy, ConversationReconciliation, CreateAttachmentRequest, + CreateAttachmentResponse, CreateBotRequest, CreateBrowserSessionRequest, + CreateDirectChatRequest, CreateDirectChatResponse, CreateGroupChatRequest, + CreateGroupChatResponse, CreateLocalMcpPluginRequest, CreatePairingRequest, + CreatePullRequestRequest, CreateRepositoryWorkspaceRequest, CreateRoutineRequest, + CreateRoutineTriggerRequest, CreateSkillRequest, DeleteBotRequest, DeliverRoutineTriggerRequest, DetachChatWorkspaceRequest, DeviceSessionSummary, DuplicateRoutineRequest, DuplicateSkillRequest, ExchangePairingRequest, FinalizeAttachmentRequest, GlobalSearchResponse, GroupBotStatus, GroupTimelineResponse, - HandoffGroupRequest, ImportSkillRequest, InteractionMode, MessageReferenceInput, - MessageReferenceKind, MissedRunPolicy, OverlapPolicy, PairingEndpointKind, - PairingExchangeResponse, PairingOffer, PluginAssignmentRequest, PluginConnectionState, - PluginMutationRequest, PluginSummary, PullRequestMetadata, PullRequestMutationResponse, - QueuedPromptKind, ReactionMutationRequest, RecordedAction, RecordedActor, - RenameGroupChatRequest, RepositoryWorkspaceSummary, RestoreCheckpointRequest, RetryPolicy, - RevokeDeviceSessionRequest, RoutineDefinition, RoutineInput, RoutineInputKind, + HandoffGroupRequest, ImportSkillRequest, InstallAssistantPackRequest, InteractionMode, + MessageReferenceInput, MessageReferenceKind, MissedRunPolicy, OverlapPolicy, + PairingEndpointKind, PairingExchangeResponse, PairingOffer, PluginAssignmentRequest, + PluginConnectionState, PluginMutationRequest, PluginSummary, PullRequestMetadata, + PullRequestMutationResponse, QueuedPromptKind, ReactionMutationRequest, RecordedAction, + RecordedActor, RenameGroupChatRequest, RepositoryWorkspaceSummary, RestoreCheckpointRequest, + RetryPolicy, RevokeDeviceSessionRequest, RoutineDefinition, RoutineInput, RoutineInputKind, RoutineJobSummary, RoutineRecordingSummary, RoutineRunSummary, RoutineSchedule, RoutineStep, RoutineStepStatus, RoutineSummary, RoutineTriggerDefinition, RoutineTriggerSource, RunRoutineRequest, SecretSummary, SendGroupMessageRequest, SendMessageRequest, @@ -70,6 +71,129 @@ async fn provider_queue_test_guard() -> tokio::sync::MutexGuard<'static, ()> { .await } +#[tokio::test] +#[allow(clippy::too_many_lines)] // One end-to-end contract covers catalog, install, replay, and execution. +async fn assistant_pack_catalog_installs_a_scheduled_skill_for_one_bot_idempotently() +-> Result<(), Box> { + let directory = tempfile::tempdir()?; + let storage = Storage::open(&directory.path().join("homebot.db")).await?; + let bot = storage + .create_bot( + Uuid::nil(), + homebot_domain::Bot::create("Nova", "Personal assistant")?, + 1, + ) + .await?; + let app = router(AppState::new(storage.clone(), "correct-token")); + + let response = app + .clone() + .oneshot( + Request::get("/api/v1/assistant-packs") + .header("authorization", "Bearer correct-token") + .body(Body::empty())?, + ) + .await?; + assert_eq!(response.status(), StatusCode::OK); + let catalog: Vec = response_json(response).await?; + assert_eq!( + catalog + .iter() + .map(|pack| pack.id.as_str()) + .collect::>(), + vec!["morning-brief", "weekly-rundown", "end-of-day-review"] + ); + assert_eq!(catalog[1].schedule.cadence, AssistantPackCadence::Weekly); + assert_eq!(catalog[1].schedule.weekday, Some(5)); + + let idempotency_key = Uuid::now_v7(); + let mut request = InstallAssistantPackRequest { + request_id: Uuid::now_v7(), + idempotency_key, + bot_id: bot.id.0, + timezone: "not-a-timezone".to_owned(), + hour: 8, + minute: 30, + }; + for _ in 0..2 { + let invalid = app + .clone() + .oneshot(json_request( + "POST", + "/api/v1/assistant-packs/morning-brief/install", + &request, + )) + .await?; + assert_eq!(invalid.status(), StatusCode::UNPROCESSABLE_ENTITY); + } + request.timezone = "Europe/London".to_owned(); + let response = app + .clone() + .oneshot(json_request( + "POST", + "/api/v1/assistant-packs/morning-brief/install", + &request, + )) + .await?; + assert_eq!(response.status(), StatusCode::CREATED); + let installed: AssistantPackInstallationSummary = response_json(response).await?; + assert_eq!(installed.pack_id, "morning-brief"); + assert_eq!(installed.skill.bot_ids, vec![bot.id.0]); + assert_eq!(installed.routine.bot_id, bot.id.0); + assert!(installed.routine.enabled); + assert!(!installed.routine.draft); + assert!(matches!( + installed.trigger.definition.source, + RoutineTriggerSource::Schedule { + schedule: RoutineSchedule::DailyLocal { + ref timezone, + hour: 8, + minute: 30, + } + } if timezone == "Europe/London" + )); + + let replay = app + .clone() + .oneshot(json_request( + "POST", + "/api/v1/assistant-packs/morning-brief/install", + &request, + )) + .await?; + assert_eq!(replay.status(), StatusCode::OK); + let replayed: AssistantPackInstallationSummary = response_json(replay).await?; + assert_eq!(replayed.skill.id, installed.skill.id); + assert_eq!(replayed.routine.id, installed.routine.id); + assert_eq!(replayed.trigger.id, installed.trigger.id); + assert_eq!(replayed.trigger.definition, installed.trigger.definition); + assert_eq!(storage.list_skills(Uuid::nil()).await?.len(), 1); + assert_eq!(storage.list_routines(Uuid::nil()).await?.len(), 1); + assert_eq!( + storage + .routine_triggers(Uuid::nil(), Some(installed.routine.id)) + .await? + .len(), + 1 + ); + let dry_run = app + .oneshot(json_request( + "POST", + &format!("/api/v1/routines/{}/dry-run", installed.routine.id), + &RunRoutineRequest { + request_id: Uuid::now_v7(), + idempotency_key: Uuid::now_v7(), + inputs: serde_json::json!({}), + }, + )) + .await?; + assert_eq!(dry_run.status(), StatusCode::OK); + let dry_run: RoutineRunSummary = response_json(dry_run).await?; + assert_eq!(dry_run.status, "dry_run_succeeded"); + assert_eq!(dry_run.results[0].status, RoutineStepStatus::Planned); + Ok(()) +} + #[derive(Debug)] struct ChatFakeAdapter { id: ProviderAdapterId, diff --git a/crates/homebot-storage/src/lib.rs b/crates/homebot-storage/src/lib.rs index 04ae82a..fa2f45e 100644 --- a/crates/homebot-storage/src/lib.rs +++ b/crates/homebot-storage/src/lib.rs @@ -1270,6 +1270,82 @@ impl Storage { Ok(()) } + /// Installs one curated Assistant Pack as a Skill, Bot assignment, routine, and trigger. + /// + /// # Errors + /// Returns missing-Bot, duplicate-name, serialization, integrity, or database errors. + pub async fn install_assistant_pack( + &self, + skill: &SkillRecord, + routine: &RoutineRecord, + trigger: &RoutineTriggerRecord, + ) -> Result<(), StorageError> { + if skill.owner_id != routine.owner_id + || routine.owner_id != trigger.owner_id + || skill.bot_ids.as_slice() != [routine.bot_id] + || trigger.routine_id != routine.id + { + return Err(StorageError::Integrity( + "Assistant Pack records do not share one owner, Bot, and routine".to_owned(), + )); + } + let skill_definition = serde_json::to_string(&skill.definition) + .map_err(|error| StorageError::Serialization(error.to_string()))?; + let routine_definition = serde_json::to_string(&routine.definition) + .map_err(|error| StorageError::Serialization(error.to_string()))?; + let trigger_definition = serde_json::to_string(&trigger.definition) + .map_err(|error| StorageError::Serialization(error.to_string()))?; + let last_event_sequence = i64::try_from(trigger.last_event_sequence) + .map_err(|_| StorageError::Integrity("event cursor exceeds SQLite range".to_owned()))?; + let mut transaction = self.pool.begin().await?; + let bot_count: i64 = + sqlx::query_scalar("SELECT count(*) FROM bots WHERE owner_id = ? AND id = ?") + .bind(routine.owner_id.to_string()) + .bind(routine.bot_id.to_string()) + .fetch_one(&mut *transaction) + .await?; + if bot_count == 0 { + return Err(StorageError::BotNotFound); + } + let duplicate_skill: i64 = sqlx::query_scalar("SELECT count(*) FROM skills WHERE owner_id = ? AND name_normalized = ? AND deleted_at_ms IS NULL") + .bind(skill.owner_id.to_string()).bind(normalize_skill_name(&skill.name)).fetch_one(&mut *transaction).await?; + if duplicate_skill > 0 { + return Err(StorageError::DuplicateSkillName); + } + let duplicate_routine: i64 = sqlx::query_scalar("SELECT count(*) FROM routines WHERE owner_id = ? AND lower(trim(name)) = lower(trim(?))") + .bind(routine.owner_id.to_string()).bind(&routine.name).fetch_one(&mut *transaction).await?; + if duplicate_routine > 0 { + return Err(StorageError::DuplicateRoutineName); + } + sqlx::query("INSERT INTO skills (id, owner_id, name, name_normalized, description, active_version_id, version, created_at_ms, updated_at_ms) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)") + .bind(skill.id.to_string()).bind(skill.owner_id.to_string()).bind(&skill.name) + .bind(normalize_skill_name(&skill.name)).bind(&skill.description).bind(skill.active_version_id.to_string()) + .bind(i64::from(skill.version)).bind(skill.created_at_ms).bind(skill.updated_at_ms) + .execute(&mut *transaction).await?; + sqlx::query("INSERT INTO skill_versions (id, skill_id, version, definition_json, name, description, created_at_ms) VALUES (?, ?, ?, ?, ?, ?, ?)") + .bind(skill.active_version_id.to_string()).bind(skill.id.to_string()).bind(i64::from(skill.version)) + .bind(skill_definition).bind(&skill.name).bind(&skill.description).bind(skill.created_at_ms) + .execute(&mut *transaction).await?; + sqlx::query("INSERT INTO skill_bot_assignments (owner_id, skill_id, bot_id, assigned_at_ms) VALUES (?, ?, ?, ?)") + .bind(skill.owner_id.to_string()).bind(skill.id.to_string()).bind(routine.bot_id.to_string()) + .bind(skill.created_at_ms).execute(&mut *transaction).await?; + sqlx::query("INSERT INTO routines (id, owner_id, bot_id, name, description, active_version_id, enabled, draft, created_at_ms, updated_at_ms) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)") + .bind(routine.id.to_string()).bind(routine.owner_id.to_string()).bind(routine.bot_id.to_string()) + .bind(&routine.name).bind(&routine.description).bind(routine.active_version_id.to_string()) + .bind(routine.enabled).bind(routine.draft).bind(routine.created_at_ms).bind(routine.updated_at_ms) + .execute(&mut *transaction).await?; + sqlx::query("INSERT INTO routine_versions (id, routine_id, version, definition_json, created_at_ms) VALUES (?, ?, ?, ?, ?)") + .bind(routine.active_version_id.to_string()).bind(routine.id.to_string()).bind(i64::from(routine.version)) + .bind(routine_definition).bind(routine.created_at_ms).execute(&mut *transaction).await?; + sqlx::query("INSERT INTO routine_triggers (id, owner_id, routine_id, kind, configuration_json, enabled, last_evaluated_at_ms, next_fire_at_ms, last_event_sequence, created_at_ms, updated_at_ms) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)") + .bind(trigger.id.to_string()).bind(trigger.owner_id.to_string()).bind(trigger.routine_id.to_string()) + .bind(trigger_kind(&trigger.definition)).bind(trigger_definition).bind(trigger.enabled) + .bind(trigger.last_evaluated_at_ms).bind(trigger.next_fire_at_ms).bind(last_event_sequence) + .bind(trigger.created_at_ms).bind(trigger.updated_at_ms).execute(&mut *transaction).await?; + transaction.commit().await?; + Ok(()) + } + /// Lists active owner-scoped Skills with current versions and Bot assignments. /// /// # Errors diff --git a/docs/android.md b/docs/android.md index 0964e1b..c69e44a 100644 --- a/docs/android.md +++ b/docs/android.md @@ -29,6 +29,8 @@ The Android document picker feeds the three-stage authenticated attachment contr The settings and automations surface fetches routine definitions, run history and triggers. It supports authoritative create/edit/duplicate/delete, dry run, Run now, enable/disable and explicit one-shot scheduling. A mobile demonstration recorder starts a durable server recording, appends structured Bot-prompt actions and explicitly finishes to an editable disabled draft or cancels without creating a routine. Every successful mutation refreshes the server-owned routine projection and selected history in the same coroutine instead of manufacturing local routine state. Skills assignment and plugin/MCP health and enablement use the same authenticated mutation contract. Secret rows contain only label and availability status—values are never returned or rendered. A paired device can inspect and revoke only its own session; owner-wide session listing and revocation remain forbidden to paired-device credentials. +Assistant Packs appear in the same surface. Users choose a pack, Bot, IANA timezone, and local time; Android sends one authenticated install mutation and then refreshes the server-owned Skills and routines. The client does not assemble or persist marketplace instructions itself. + ## Notifications and background behavior While the app process is alive, the authenticated WebSocket remains the only live notification source. Terminal Bot messages, pending approvals, terminal routine runs and attention-required activities are mapped from sequenced events into Android notification channels. Notification intents use exact `homebot://chat/?activity=` or `homebot://routine/?run=` targets; reopening hydrates the authoritative timeline before highlighting the target. diff --git a/docs/assistant-packs.md b/docs/assistant-packs.md new file mode 100644 index 0000000..08351c6 --- /dev/null +++ b/docs/assistant-packs.md @@ -0,0 +1,16 @@ +# Assistant Packs + +Assistant Packs are HomeBot's curated personal-assistant marketplace. An installation reuses the existing server-owned primitives: one versioned Skill assigned to one Bot, one enabled routine, and one timezone-safe schedule. The routine writes its result into that Bot's existing chat and run history. + +The initial catalog contains Morning Brief, Weekly Rundown, and End-of-Day Review. Catalog contents are bundled with the server; there is no remote publishing format or executable marketplace code in this version. + +Installation is `browse -> configure Bot/timezone/time -> install and enable`. The authenticated server validates the Bot and schedule, then commits the Skill, assignment, routine, and trigger atomically. Repeating the same installation returns the existing records; changing the schedule requires editing or removing the installed routine rather than silently replacing it. + +Routes: + +- `GET /api/v1/assistant-packs` +- `POST /api/v1/assistant-packs/{pack_id}/install` + +Weekly schedules use an ISO weekday (`1` Monday through `7` Sunday) and retain the selected local wall-clock time across daylight-saving changes. Installed prompts must distinguish available evidence from unavailable sources and must not claim access to connectors that are not configured. + +Public marketplace publishing, OAuth connectors, external-channel delivery, arbitrary executable plugins, and a separate Brief data model remain outside this initial contract. diff --git a/docs/parity-matrix.md b/docs/parity-matrix.md index 6b29578..bb058bd 100644 --- a/docs/parity-matrix.md +++ b/docs/parity-matrix.md @@ -41,6 +41,7 @@ replace the official sources above, grant code-reuse rights, or turn a row into | Teach workflow recording | Skills | Record/review draft | Mobile can inspect result | Structured action capture | Recording becomes editable/testable skill | Specified | | Routine create/manual run/test | Skills | Bot routine editor | Mobile create/edit/duplicate/delete and dry-run/Run-now controls | Versioned routine runner | Safe test and run history exist | Specified | | Scheduled routine/time zone | Skills | Schedule/next-run UI | View/edit controls | Headless scheduler | DST and restart boundary pass | Specified | +| Curated Assistant Packs and briefs | HomeBot Assistant Packs | Catalog, Bot/time configuration, install | Equivalent catalog and configuration | Atomically create assigned Skill, enabled Routine, and schedule | Retry-safe install; daily and weekly schedules retain local time across DST | Implemented; Android visual capture pending | | Event-triggered routine | Skills | Narrow event rule UI | Equivalent controls | Idempotent webhook/plugin trigger | Duplicate event produces one run | Specified | | Routine enable/pause/delete/history | Skills, mobile | Full management | Server-authoritative management and refreshed history | Durable run state/history | No client open required | Specified | | Structured approval once/deny | Security | Target/scope/value card | Equivalent approve/deny | Operation-digest approval | Prose cannot approve; expiry works | Specified | diff --git a/docs/personal-assistant-direction-research.md b/docs/personal-assistant-direction-research.md new file mode 100644 index 0000000..3c204cc --- /dev/null +++ b/docs/personal-assistant-direction-research.md @@ -0,0 +1,32 @@ +# HomeBot personal-assistant direction: Grok Bot and Hermes Agent + +Research date: 2026-08-24. External claims below use only first-party xAI or Nous Research sources. HomeBot context comes from the existing repository docs linked in the table. + +## Bottom line + +HomeBot already has the durable Bot, Bot-owned routine, group handoff, provider-neutral skill, MCP, server approval, and native attention primitives needed for a personal assistant. Its intended shape is closest to Grok Bot at the product level (named teammates that own work) and to Hermes Agent at the self-hosted integration level (skills, MCP, profiles, cron, memory, and many delivery surfaces). The clearest remaining product decisions are first-class skill/connector discovery, memory controls, brief/continuation UX, and whether delivery should remain native-only or become gateway-based. + +## Comparison + +| Focus | Grok Bot | Hermes Agent | HomeBot implication | +| --- | --- | --- | --- | +| Marketplace and skill installation | Bot skills are reusable instructions available across Bots; private skills can be enabled per Bot. Settings → Plugins exposes Marketplace/Yours for packaged skills and connectors; `/` references a skill and `@` references Bots, groups, routines, and connectors. Teach a task creates a reviewable draft skill. ([skills and routines](https://docs.x.ai/grok-bot/skills-routines-and-automations), [settings and notifications](https://docs.x.ai/grok-bot/settings-and-notifications)) | Bundled and optional skills live under the Hermes profile; the Skills Hub can browse, search, inspect, install, update, audit, and uninstall skills from official, GitHub, URL, and community sources. Installed skills become slash commands. Plugins can bundle namespaced skills and are opt-in by default. ([Skills System](https://hermes-agent.nousresearch.com/docs/user-guide/features/skills/), [working with skills](https://hermes-agent.nousresearch.com/docs/guides/work-with-skills), [plugins](https://hermes-agent.nousresearch.com/docs/user-guide/features/plugins)) | HomeBot has versioned provider-neutral Skills, per-Bot assignment, import/export, and safe tool references, but the inspected docs do not define a catalog/marketplace, install preview, provenance scan, or update flow. ([Skills](skills.md), [Plugins and MCP](plugins.md)) | +| Workflow and routine scheduling | A routine belongs to one Bot and runs on a schedule or supported event; it can be tested, paused, edited, and reviewed in Bot details. Background routines run while the laptop is closed, with a 50-routine-per-Bot limit and 20 recent run records. ([skills and routines](https://docs.x.ai/grok-bot/skills-routines-and-automations)) | Cron supports one-shot/recurring natural-language or cron schedules, attached skills, pause/resume/edit/run/remove, fresh agent sessions, and no-agent scripts. Delivery can target the origin chat, files, a platform, or another local profile's Bot Chat. ([Scheduled Tasks](https://hermes-agent.nousresearch.com/docs/user-guide/features/cron/)) | HomeBot is stronger on durable execution semantics: immutable routine versions, dry run, headless daily/interval/webhook/event triggers, durable jobs, overlap/misfire policy, cancellation, and run history. ([Routines](routines.md)) | +| Morning, daily, and weekly briefs | xAI presents daily briefing and morning briefing roles, weekly summaries, and weekday 8:00 AM routine examples; the brief is ordinary Bot work rather than a separate data type. ([Grok Bot use cases](https://x.ai/bot/use-cases), [skills and routines](https://docs.x.ai/grok-bot/skills-routines-and-automations), [get started](https://docs.x.ai/grok-bot/get-started)) | A morning brief can be created in natural language, combine multiple skills, and deliver to a chosen channel. Cron deliveries are fire-and-forget by default, with an opt-in continuable/threaded mode for follow-up. ([Scheduled Tasks](https://hermes-agent.nousresearch.com/docs/user-guide/features/cron/)) | HomeBot can express these as routines, but the existing docs do not define a named Brief template, source aggregation contract, or continuation surface. Keep the routine engine generic; add a brief UX only when a distinct user workflow is accepted. ([Routines](routines.md), [desktop settings and notifications](desktop-settings.md)) | +| Bot assignment and coordination | A Bot is a durable named teammate with a job, conversation, tools, approval boundary, and recurring schedule. Users create 2–6-Bot groups and direct work with `@`; all Bots share one account cloud computer, so Bot identity is not a security boundary. ([create and manage Bots](https://docs.x.ai/grok-bot/bots), [message and collaborate](https://docs.x.ai/grok-bot/chat-and-collaboration), [approvals, security, and privacy](https://docs.x.ai/grok-bot/approvals-security-and-privacy)) | Desktop Bot Mode presents each Hermes profile as a bot with its own Bot Chat and routines; each profile has its own config, memory, sessions, skills, cron jobs, and gateway state. Cron can deliver into the current or another local profile's Bot Chat. ([desktop app](https://hermes-agent.nousresearch.com/docs/user-guide/desktop), [profiles](https://hermes-agent.nousresearch.com/docs/user-guide/profiles), [Scheduled Tasks](https://hermes-agent.nousresearch.com/docs/user-guide/features/cron/)) | HomeBot deliberately separates durable Bot identity from provider profile, supports per-Bot Skill/plugin assignment, and makes group ownership/handoffs explicit and bounded. This is the right security posture to retain. ([Bots](bots.md), [group chats](group-chats.md), [Skills](skills.md)) | +| Connectors and plugins | Bot connectors are installed from Marketplace, may require browser authentication, and expose individually toggleable tools. Teams inherit Cursor plugin/MCP policy and can restrict servers or member-added servers. ([settings and notifications](https://docs.x.ai/grok-bot/settings-and-notifications), [teams and enterprises](https://docs.x.ai/grok-bot/teams-and-enterprises)) | MCP connects local stdio or remote HTTP servers with startup discovery and per-server tool filtering. Python plugins add tools, hooks, slash/CLI commands, platforms, skills, and memory/provider backends; general plugins are discovered but disabled until explicitly enabled. ([MCP](https://hermes-agent.nousresearch.com/docs/user-guide/features/mcp), [plugins](https://hermes-agent.nousresearch.com/docs/user-guide/features/plugins), [toolsets](https://hermes-agent.nousresearch.com/docs/reference/toolsets-reference)) | HomeBot's server-owned local MCP registry, per-Bot assignment, cleared environment, bounded process lifecycle, opaque secret references, and untrusted-output boundary are a sound minimal core. Hosted/OAuth connectors remain an adapter decision, not a client shortcut. ([Plugins and MCP](plugins.md), [security](security.md)) | +| Memory | Bot docs promise retained working preferences, facts, and summaries, while copied Bots do not inherit learned memory. The Bot pages reviewed do not specify a bounded memory store, editor, or write-approval workflow. ([create and manage Bots](https://docs.x.ai/grok-bot/bots)) | Hermes has bounded per-profile `MEMORY.md` and `USER.md`, injected as a session-start snapshot; the desktop exposes a Memory Graph with edit/delete, and external memory providers are supported. ([Persistent Memory](https://hermes-agent.nousresearch.com/docs/user-guide/features/memory/), [desktop app](https://hermes-agent.nousresearch.com/docs/user-guide/desktop)) | HomeBot's parity contract says app-owned memory survives provider reset, but the inspected docs do not define its storage, editing, bounds, or approval UX. This is the largest personal-assistant semantics gap. ([parity matrix](parity-matrix.md), [working context](working-context.md)) | +| Notifications and delivery | Bot settings can send OS/mobile notifications when a Bot finishes or needs input; focus suppresses notifications while sidebar/dock badges retain unread state. Group chats lack the same per-Bot switch, and mobile push is still rollout-dependent. ([settings and notifications](https://docs.x.ai/grok-bot/settings-and-notifications)) | The gateway delivers through configured messaging channels and cron targets. Responses have an at-least-once delivery ledger; cron can fan out, enter Bot Chat, or become a continuable thread. ([Messaging Gateway](https://hermes-agent.nousresearch.com/docs/user-guide/messaging), [Scheduled Tasks](https://hermes-agent.nousresearch.com/docs/user-guide/features/cron/)) | HomeBot has a precise native macOS/Linux contract for completed work, approvals, failures, focus suppression, and deep links, but no documented multi-channel gateway. ([desktop settings and notifications](desktop-settings.md)) | +| Permissions and approvals | Review shows the proposed action and inputs; Allow once/Deny and narrow Auto Review rules are available, with Require Approval taking precedence. Local-computer execution defaults to Ask every time; secrets and MFA use user takeover. ([approvals, security, and privacy](https://docs.x.ai/grok-bot/approvals-security-and-privacy)) | Dangerous commands use smart/manual/off modes; headless cron defaults to deny on dangerous-command approval. Allowlists and DM pairing authorize messaging users, while file safety, isolation, MCP filtering, and injection scanning add layers. ([Security](https://hermes-agent.nousresearch.com/docs/user-guide/security/)) | HomeBot's server policy, `ask-before-changes` Bot default, explicit routine approval steps, plugin read/write checks, and fail-safe unattended jobs match the strongest common denominator. ([Bots](bots.md), [Routines](routines.md), [Plugins and MCP](plugins.md), [activity surfaces](activity-surfaces.md)) | +| User-facing UX | Chat-first teammate UX spans desktop/iOS, with a Bot sidebar, one thread, inline tool/computer/activity records, `/` skills, `@` routing, group chats, and direct redirection while work is running. ([message and collaborate](https://docs.x.ai/grok-bot/chat-and-collaboration), [get started](https://docs.x.ai/grok-bot/get-started)) | Chat-first desktop, CLI/TUI, dashboard, and gateway share sessions; the desktop adds live tool activity, queue editing, management panes, and a Bot roster with profiles and routines. ([desktop app](https://hermes-agent.nousresearch.com/docs/user-guide/desktop), [Messaging Gateway](https://hermes-agent.nousresearch.com/docs/user-guide/messaging)) | HomeBot already projects the same server-owned state to native desktop and Android, with durable activity, approval, unread, and attention surfaces. The missing choice is delivery breadth, not another client-specific authority. ([README](../README.md), [activity surfaces](activity-surfaces.md), [desktop settings and notifications](desktop-settings.md)) | + +## Direction for HomeBot + +- Preserve the current seam: HomeBot owns Bot identity, history, routines, skills, permissions, and delivery state; providers and plugins remain replaceable capability sources. That is safer and more portable than Grok Bot's shared-computer model. ([Bots](bots.md), [providers](providers.md), [Plugins and MCP](plugins.md)) +- If marketplace work is added, copy the user journey rather than either product's trust assumptions: browse → inspect contents and required access → install/enable per Bot → authenticate separately → test safely → update/revoke. Hermes's security scan/opt-in model and xAI's per-Bot enablement are the useful references. ([working with skills](https://hermes-agent.nousresearch.com/docs/guides/work-with-skills), [plugins](https://hermes-agent.nousresearch.com/docs/user-guide/features/plugins), [skills and routines](https://docs.x.ai/grok-bot/skills-routines-and-automations)) +- Treat memory as a product contract before expanding it: define scope (owner/Bot/profile), bounded storage, edit/delete, stale-fact correction, and optional write approval. Hermes documents these controls more concretely than the Grok Bot pages reviewed. ([Persistent Memory](https://hermes-agent.nousresearch.com/docs/user-guide/features/memory/), [configuration](https://hermes-agent.nousresearch.com/docs/user-guide/configuration)) +- Keep briefs as ordinary versioned routines until a first-class Brief object earns its keep; make delivery and continuation explicit when an external channel is added. HomeBot's existing durable job/run model already covers the hard reliability part. ([Routines](routines.md), [Scheduled Tasks](https://hermes-agent.nousresearch.com/docs/user-guide/features/cron/)) + +## Source boundary + +xAI's public [plugin-marketplace repository](https://github.com/xai-org/plugin-marketplace) and [Grok Build marketplace documentation](https://docs.x.ai/build/features/skills-plugins-marketplaces) explicitly describe Grok Build. They are not treated as evidence that Grok Bot has the same package format; Bot-specific claims above use the Grok Bot documentation pages. diff --git a/docs/protocol.md b/docs/protocol.md index 278a257..9b9582e 100644 --- a/docs/protocol.md +++ b/docs/protocol.md @@ -60,6 +60,8 @@ Routine triggers and jobs use authenticated HTTP mutations plus durable `routine Skills use authenticated CRUD, duplication, assignment, and versioned import/export endpoints. The initial snapshot carries the Skill library; `skill_changed` and `skill_removed` keep client projections current. `SendMessageRequest.skill_ids` adds turn-specific Skills, while assigned and explicit active versions are resolved once and persisted in `MessageSummary.applied_skills`. Queued prompts similarly pin version IDs internally, so edit, reconnect, retry, or restart cannot silently change accepted context. Portable tool references remain subject to server capability and approval policy. +Assistant Packs expose a server-owned curated catalog at `GET /api/v1/assistant-packs`. Installing through `POST /api/v1/assistant-packs/{pack_id}/install` atomically creates and assigns the pack's Skill, enabled routine, and timezone-safe trigger for one Bot. The response returns all three authoritative summaries; normal Skill, routine, and trigger events keep connected clients current. + ## Repository workspaces Authenticated workspace endpoints register canonical Git repositories, list local branches, attach a chat in primary or isolated mode, and detach it. Snapshot fields and sequenced `repository_workspace_changed`, `chat_workspace_changed`, and `chat_workspace_removed` events keep desktop and Android projections aligned with SQLite authority. Summaries report the effective path, selected branch/base ref and `clean`, `dirty`, `conflicted`, or `unavailable` condition. Clients never construct managed paths or perform worktree lifecycle locally. diff --git a/docs/visual-reference-index.md b/docs/visual-reference-index.md index 98097f5..2ce3397 100644 --- a/docs/visual-reference-index.md +++ b/docs/visual-reference-index.md @@ -50,6 +50,8 @@ The public sources specify product surfaces and observable states. Exact pixel m | `desktop.composer.mention` | `@` mention picker | Chat, Message a Bot | Bot/group/routine/plugin results | Capture required | | `desktop.composer.skill` | `/` skill picker | Chat; Skills, Save a skill | Empty/search/selected states | Capture required | | `desktop.composer.attachments` | Drag/paste/select files | Files, Attach files | Uploading, complete, limit/error | Capture required | +| `desktop.assistant-packs.catalog` | Curated personal-assistant pack catalog | HomeBot Assistant Packs contract | `production_assistant_packs_light` | HomeBot-original golden present | +| `desktop.assistant-packs.configure` | Choose Bot, timezone, and run time | HomeBot Assistant Packs contract | `production_assistant_pack_configure_light` | HomeBot-original golden present | | `desktop.message.reply` | Thread/reply view | Chat, threads and reactions | Collapsed/open thread states | Capture required | | `desktop.message.reactions` | Message reactions | Chat, threads and reactions | Picker and applied reactions | Capture required | | `desktop.activity.tool` | Tool activity in transcript | Chat, transcript activity | Running/success/failure/expanded | Capture required | @@ -89,6 +91,7 @@ HomeBot intentionally exceeds initial Grok Bot mobile parity where the official | `android.activity.approval` | Approval request | Security, Review an action | Approve once/deny/stale | Capture required | | `android.computer.observe` | Watch/take over/return control | Mobile, Review the computer | Loading/live/disconnected | Capture required | | `android.routines` | List, schedule, history, controls | Mobile, Manage recurring work; Skills | Full HomeBot parity states | Capture required | +| `android.assistant-packs` | Catalog and Bot/time installation | HomeBot Assistant Packs contract | Catalog, configuration, validation, installed notice | Capture required; transport contract tested | | `android.plugins` | Install/review plugins | Mobile, Settings | Auth and health states | Capture required | | `android.notifications` | Result/question/approval push | Mobile setup; Settings notifications | Permission/deep-link/fallback | Capture required | | `android.settings` | Appearance, devices, providers | Mobile, Settings | Full HomeBot settings reachability | Capture required | diff --git a/protocol/schema/homebot-v1.schema.json b/protocol/schema/homebot-v1.schema.json index 2dd1041..507934e 100644 --- a/protocol/schema/homebot-v1.schema.json +++ b/protocol/schema/homebot-v1.schema.json @@ -19,6 +19,12 @@ "artifact": { "$ref": "#/$defs/ArtifactSummary" }, + "assistant_pack": { + "$ref": "#/$defs/AssistantPackSummary" + }, + "assistant_pack_installation": { + "$ref": "#/$defs/AssistantPackInstallationSummary" + }, "attach_chat_workspace_request": { "$ref": "#/$defs/AttachChatWorkspaceRequest" }, @@ -151,6 +157,9 @@ "import_skill_request": { "$ref": "#/$defs/ImportSkillRequest" }, + "install_assistant_pack_request": { + "$ref": "#/$defs/InstallAssistantPackRequest" + }, "message_mutation_request": { "$ref": "#/$defs/MessageMutationRequest" }, @@ -313,6 +322,9 @@ "skill", "skill_test", "applied_skill", + "assistant_pack", + "install_assistant_pack_request", + "assistant_pack_installation", "create_repository_workspace_request", "attach_chat_workspace_request", "detach_chat_workspace_request", @@ -861,6 +873,104 @@ "created_at_ms" ] }, + "AssistantPackCadence": { + "type": "string", + "enum": [ + "daily", + "weekly" + ] + }, + "AssistantPackInstallationSummary": { + "type": "object", + "properties": { + "pack_id": { + "type": "string" + }, + "routine": { + "$ref": "#/$defs/RoutineSummary" + }, + "skill": { + "$ref": "#/$defs/SkillSummary" + }, + "trigger": { + "$ref": "#/$defs/RoutineTriggerSummary" + } + }, + "additionalProperties": false, + "required": [ + "pack_id", + "skill", + "routine", + "trigger" + ] + }, + "AssistantPackSchedule": { + "type": "object", + "properties": { + "cadence": { + "$ref": "#/$defs/AssistantPackCadence" + }, + "default_hour": { + "type": "integer", + "format": "uint8", + "maximum": 255, + "minimum": 0 + }, + "default_minute": { + "type": "integer", + "format": "uint8", + "maximum": 255, + "minimum": 0 + }, + "weekday": { + "type": [ + "integer", + "null" + ], + "format": "uint8", + "maximum": 255, + "minimum": 0 + } + }, + "additionalProperties": false, + "required": [ + "cadence", + "default_hour", + "default_minute" + ] + }, + "AssistantPackSummary": { + "type": "object", + "properties": { + "description": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "routine_name": { + "type": "string" + }, + "schedule": { + "$ref": "#/$defs/AssistantPackSchedule" + }, + "skill_name": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "id", + "name", + "description", + "skill_name", + "routine_name", + "schedule" + ] + }, "AttachChatWorkspaceRequest": { "type": "object", "properties": { @@ -2881,6 +2991,47 @@ "conflict_policy" ] }, + "InstallAssistantPackRequest": { + "type": "object", + "properties": { + "bot_id": { + "type": "string", + "format": "uuid" + }, + "hour": { + "type": "integer", + "format": "uint8", + "maximum": 255, + "minimum": 0 + }, + "idempotency_key": { + "type": "string", + "format": "uuid" + }, + "minute": { + "type": "integer", + "format": "uint8", + "maximum": 255, + "minimum": 0 + }, + "request_id": { + "type": "string", + "format": "uuid" + }, + "timezone": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "request_id", + "idempotency_key", + "bot_id", + "timezone", + "hour", + "minute" + ] + }, "InteractionMode": { "type": "string", "enum": [ @@ -4300,6 +4451,44 @@ "hour", "minute" ] + }, + { + "type": "object", + "properties": { + "hour": { + "type": "integer", + "format": "uint8", + "maximum": 255, + "minimum": 0 + }, + "kind": { + "type": "string", + "const": "weekly_local" + }, + "minute": { + "type": "integer", + "format": "uint8", + "maximum": 255, + "minimum": 0 + }, + "timezone": { + "type": "string" + }, + "weekday": { + "type": "integer", + "format": "uint8", + "maximum": 255, + "minimum": 0 + } + }, + "additionalProperties": false, + "required": [ + "kind", + "timezone", + "weekday", + "hour", + "minute" + ] } ] },