@@ -83,7 +98,9 @@ function DashboardPage() {
Olá, {firstName} 👋
{subscription
- ? "Acompanhe abaixo o status do seu agente Mika."
+ ? agent
+ ? <>Seu agente {agentName} está {statusLabel}.>
+ : "Acompanhe abaixo o status do seu agente."
: "Vamos colocar seu agente Mika no ar."}
From 65ce5ef4e70653efe849f48db42f8949f802df5d Mon Sep 17 00:00:00 2001
From: "gpt-engineer-app[bot]"
<159125892+gpt-engineer-app[bot]@users.noreply.github.com>
Date: Sat, 25 Apr 2026 12:03:17 +0000
Subject: [PATCH 05/11] Changes
Co-authored-by: domfelipe <53182096+domfelipe@users.noreply.github.com>
---
src/routes/checkout.sucesso.tsx | 12 ++++--------
1 file changed, 4 insertions(+), 8 deletions(-)
diff --git a/src/routes/checkout.sucesso.tsx b/src/routes/checkout.sucesso.tsx
index 833c614..9dd763a 100644
--- a/src/routes/checkout.sucesso.tsx
+++ b/src/routes/checkout.sucesso.tsx
@@ -15,11 +15,10 @@ function CheckoutSuccessPage() {
const queryClient = useQueryClient();
useEffect(() => {
- // Invalida queries de assinatura para refletir o novo estado quando o webhook chegar
queryClient.invalidateQueries({ queryKey: ["subscription"] });
const t = setTimeout(() => {
- navigate({ to: "/painel", search: {} });
- }, 6000);
+ navigate({ to: "/bem-vindo" });
+ }, 4000);
return () => clearTimeout(t);
}, [navigate, queryClient]);
@@ -32,15 +31,12 @@ function CheckoutSuccessPage() {
Assinatura confirmada!
- Estamos provisionando seu acesso. Em alguns segundos seu plano estará ativo.
+ Em instantes vamos preparar seu agente Mika.
- Ir para o painel
-
-
- Ver faturamento
+ Continuar
Você será redirecionado em instantes…
From 9be818fcdc630f654c5b4f3aaf5bd0d5990f0d0f Mon Sep 17 00:00:00 2001
From: "gpt-engineer-app[bot]"
<159125892+gpt-engineer-app[bot]@users.noreply.github.com>
Date: Sat, 25 Apr 2026 12:03:37 +0000
Subject: [PATCH 06/11] Changes
Co-authored-by: domfelipe <53182096+domfelipe@users.noreply.github.com>
---
supabase/functions/provision-agent/index.ts | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/supabase/functions/provision-agent/index.ts b/supabase/functions/provision-agent/index.ts
index d858792..b0f53d9 100644
--- a/supabase/functions/provision-agent/index.ts
+++ b/supabase/functions/provision-agent/index.ts
@@ -78,7 +78,7 @@ Deno.serve(async (req) => {
const { data: agent, error: agentErr } = await supabase
.from("agent_instances")
.select(
- "id, user_id, uuid_tenant, status, telegram_bot_token_vault_id, telegram_bot_username, telegram_user_chat_id, railway_service_id",
+ "id, user_id, uuid_tenant, status, telegram_bot_token_vault_id, telegram_bot_username, telegram_user_chat_id, railway_service_id, agent_name",
)
.eq("id", body.agent_instance_id)
.maybeSingle();
@@ -108,7 +108,11 @@ Deno.serve(async (req) => {
const fullName = (profile?.full_name?.trim() || "Usuário").toString();
const firstName = fullName.split(" ")[0] || "Usuário";
- const agentName = body.agent_name?.trim() || `Mika de ${firstName}`;
+ // Prioridade: body > coluna agent_name no DB > default "Mika de {firstName}"
+ const agentName =
+ body.agent_name?.trim() ||
+ (agent.agent_name?.trim() ?? "") ||
+ `Mika de ${firstName}`;
console.log(`[provision-agent] profile carregado: ${fullName} → agent_name=${agentName}`);
// 1c) Carregar subscription ativa (para definir modelo Pro vs Basic)
From 16fab0c4e8a8b4f3f9765597cd51c24d1358c755 Mon Sep 17 00:00:00 2001
From: "gpt-engineer-app[bot]"
<159125892+gpt-engineer-app[bot]@users.noreply.github.com>
Date: Sat, 25 Apr 2026 12:03:54 +0000
Subject: [PATCH 07/11] Changes
Co-authored-by: domfelipe <53182096+domfelipe@users.noreply.github.com>
---
supabase/functions/provision-agent/index.ts | 1 +
1 file changed, 1 insertion(+)
diff --git a/supabase/functions/provision-agent/index.ts b/supabase/functions/provision-agent/index.ts
index b0f53d9..417d3a9 100644
--- a/supabase/functions/provision-agent/index.ts
+++ b/supabase/functions/provision-agent/index.ts
@@ -284,6 +284,7 @@ Deno.serve(async (req) => {
.update({
railway_service_id: railwayServiceId,
vps_pool_id: pool.id,
+ agent_name: agentNameFinal,
model_config: {
provider: modelFinal,
stt: sttProvider,
From 679802acf86d3e8d2e7cebf5207485eafb712918 Mon Sep 17 00:00:00 2001
From: "gpt-engineer-app[bot]"
<159125892+gpt-engineer-app[bot]@users.noreply.github.com>
Date: Sat, 25 Apr 2026 12:04:06 +0000
Subject: [PATCH 08/11] Changes
Co-authored-by: domfelipe <53182096+domfelipe@users.noreply.github.com>
---
supabase/functions/provision-agent/index.ts | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/supabase/functions/provision-agent/index.ts b/supabase/functions/provision-agent/index.ts
index 417d3a9..1ef6e02 100644
--- a/supabase/functions/provision-agent/index.ts
+++ b/supabase/functions/provision-agent/index.ts
@@ -394,7 +394,10 @@ async function handleUpdateExistingService(
const fullName = (profile?.full_name?.trim() || "Usuário").toString();
const firstName = fullName.split(" ")[0] || "Usuário";
- const agentName = body.agent_name?.trim() || `Mika de ${firstName}`;
+ const agentName =
+ body.agent_name?.trim() ||
+ (agent.agent_name?.trim() ?? "") ||
+ `Mika de ${firstName}`;
const { data: subscription } = await supabase
.from("subscriptions")
From dfd32f47c90f99f077e2a7cc6567c0e5419c3fea Mon Sep 17 00:00:00 2001
From: "gpt-engineer-app[bot]"
<159125892+gpt-engineer-app[bot]@users.noreply.github.com>
Date: Sat, 25 Apr 2026 12:04:32 +0000
Subject: [PATCH 09/11] Changes
Co-authored-by: domfelipe <53182096+domfelipe@users.noreply.github.com>
---
supabase/functions/railway-webhook/index.ts | 17 ++++++++++++++++-
1 file changed, 16 insertions(+), 1 deletion(-)
diff --git a/supabase/functions/railway-webhook/index.ts b/supabase/functions/railway-webhook/index.ts
index 67dfc01..d94019d 100644
--- a/supabase/functions/railway-webhook/index.ts
+++ b/supabase/functions/railway-webhook/index.ts
@@ -81,7 +81,9 @@ Deno.serve(async (req) => {
const { data: agent } = await supabase
.from("agent_instances")
- .select("id, status, user_id, telegram_bot_username, railway_service_id")
+ .select(
+ "id, status, user_id, telegram_bot_username, railway_service_id, telegram_user_chat_id, telegram_bot_token_vault_id, agent_name, welcome_message_sent_at",
+ )
.eq("railway_service_id", serviceId)
.maybeSingle();
@@ -123,6 +125,19 @@ Deno.serve(async (req) => {
console.log(`railway-webhook: agent ${agent.id} marcado como active (status=${upper})`);
+ // Envia mensagem de boas-vindas via Telegram (apenas na primeira ativação)
+ if (
+ !agent.welcome_message_sent_at &&
+ agent.telegram_user_chat_id &&
+ agent.telegram_bot_token_vault_id
+ ) {
+ try {
+ await sendWelcomeMessage(supabase, agent);
+ } catch (e) {
+ console.error("railway-webhook: falha ao enviar welcome message:", e);
+ }
+ }
+
// Notifica admin somente se era um auto-provisionamento (status anterior=provisioning)
if (wasProvisioning) {
const fullName = await loadFullName();
From 4204ef1a74e63123dfbb49630cc04fd5a110c6b0 Mon Sep 17 00:00:00 2001
From: "gpt-engineer-app[bot]"
<159125892+gpt-engineer-app[bot]@users.noreply.github.com>
Date: Sat, 25 Apr 2026 12:04:54 +0000
Subject: [PATCH 10/11] Changes
Co-authored-by: domfelipe <53182096+domfelipe@users.noreply.github.com>
---
supabase/functions/railway-webhook/index.ts | 57 +++++++++++++++++++++
1 file changed, 57 insertions(+)
diff --git a/supabase/functions/railway-webhook/index.ts b/supabase/functions/railway-webhook/index.ts
index d94019d..416a91e 100644
--- a/supabase/functions/railway-webhook/index.ts
+++ b/supabase/functions/railway-webhook/index.ts
@@ -196,3 +196,60 @@ function jsonResponse(status: number, body: unknown) {
headers: { ...corsHeaders, "Content-Type": "application/json" },
});
}
+
+// deno-lint-ignore no-explicit-any
+async function sendWelcomeMessage(supabase: any, agent: any): Promise
{
+ // Decifra o token do bot
+ const { data: secret } = await supabase.rpc("vault_decrypt_secret", {
+ secret_id: agent.telegram_bot_token_vault_id,
+ });
+ const token: string = secret?.[0]?.decrypted_secret ?? "";
+ if (!token) {
+ console.warn("sendWelcomeMessage: token vazio, abortando");
+ return;
+ }
+
+ // Carrega first name
+ const { data: profile } = await supabase
+ .from("profiles")
+ .select("full_name")
+ .eq("id", agent.user_id)
+ .maybeSingle();
+
+ const fullName = (profile?.full_name as string | undefined)?.trim() || "";
+ const firstName = fullName.split(" ")[0] || "você";
+ const agentName = (agent.agent_name as string | undefined)?.trim() || "Mika";
+
+ const text =
+ `Olá, ${firstName}! 👋\n\n` +
+ `Sou ${agentName}, sua assistente pessoal de IA criada pela DomCo.\n\n` +
+ `Estou pronta para começar! Aqui estão algumas coisas que posso fazer por você:\n\n` +
+ `📧 Resumir seus e-mails importantes\n` +
+ `📅 Gerenciar sua agenda\n` +
+ `✅ Organizar suas tarefas\n` +
+ `🔍 Pesquisar qualquer coisa\n` +
+ `⚡ Criar automações personalizadas\n\n` +
+ `Pode me mandar uma mensagem quando quiser. Estou aqui! 🚀`;
+
+ const res = await fetch(`https://api.telegram.org/bot${token}/sendMessage`, {
+ method: "POST",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify({
+ chat_id: agent.telegram_user_chat_id,
+ text,
+ }),
+ });
+
+ if (!res.ok) {
+ const err = await res.text().catch(() => "");
+ console.error(`sendWelcomeMessage: Telegram API ${res.status}: ${err}`);
+ return;
+ }
+
+ await supabase
+ .from("agent_instances")
+ .update({ welcome_message_sent_at: new Date().toISOString() })
+ .eq("id", agent.id);
+
+ console.log(`sendWelcomeMessage: enviada para agent ${agent.id}`);
+}
From 79a024c96a0eb9ff5fe8a752cd3d6ab747d8cf8f Mon Sep 17 00:00:00 2001
From: "gpt-engineer-app[bot]"
<159125892+gpt-engineer-app[bot]@users.noreply.github.com>
Date: Sat, 25 Apr 2026 12:05:15 +0000
Subject: [PATCH 11/11] Changes
Co-authored-by: domfelipe <53182096+domfelipe@users.noreply.github.com>
---
src/routes/admin.agente.$id.tsx | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/src/routes/admin.agente.$id.tsx b/src/routes/admin.agente.$id.tsx
index 461032e..c922d8d 100644
--- a/src/routes/admin.agente.$id.tsx
+++ b/src/routes/admin.agente.$id.tsx
@@ -59,6 +59,7 @@ interface AgentDetail {
provisioned_at: string | null;
created_at: string;
model_config: Record | null;
+ agent_name: string | null;
vps_pool: {
railway_project_id: string | null;
railway_environment_id: string | null;
@@ -100,7 +101,7 @@ function AgentDetailPage() {
const { data, error } = await supabase
.from("agent_instances")
.select(
- "id, user_id, uuid_tenant, status, telegram_bot_username, telegram_user_chat_id, railway_service_id, vps_pool_id, provisioned_at, created_at, model_config",
+ "id, user_id, uuid_tenant, status, telegram_bot_username, telegram_user_chat_id, railway_service_id, vps_pool_id, provisioned_at, created_at, model_config, agent_name",
)
.eq("id", id)
.maybeSingle();
@@ -216,7 +217,7 @@ function AgentDetailPage() {
: "openrouter/google/gemma-4-27b-a4b-it";
const cfg = (agent?.model_config ?? {}) as Record;
- const defaultAgentName = cfg.agent_name || `Mika de ${firstName}`;
+ const defaultAgentName = agent?.agent_name?.trim() || cfg.agent_name || `Mika de ${firstName}`;
const defaultSoul = useMemo(
() =>
`Você se chama ${defaultAgentName}. Você é um assistente pessoal de IA criado pela DOMCO para ${fullName}. Você é proativo, direto e fala sempre em português brasileiro. Você ajuda ${firstName} a ser mais produtivo — gerenciando emails, agenda, tarefas e automatizando o que puder. Seja conciso nas respostas via Telegram. Nunca se identifique como Hermes ou como produto da Nous Research — você é Mika.`,
@@ -404,6 +405,10 @@ function AgentDetailPage() {
Informações do cliente
+