From 9eea0d698b0fd0314eada4431525a9ac41ce5d53 Mon Sep 17 00:00:00 2001 From: Benjamin Shafii Date: Tue, 7 Jan 2025 10:51:42 +0100 Subject: [PATCH] feat: hide not finished agents + add request logo --- .cursorrules | 6 +- .../src/agents/add-to-mac-calendar-agent.tsx | 12 +- packages/desktop/src/agents/base-agent.ts | 7 +- .../desktop/src/agents/business-agent.tsx | 1 + .../src/agents/goal-planning-agent.tsx | 10 +- packages/desktop/src/agents/invoice-agent.tsx | 116 ++++++++++-------- packages/desktop/src/agents/task-agent.tsx | 5 +- .../desktop/src/assets/request-req-logo.png | Bin 0 -> 62029 bytes .../desktop/src/components/active-agents.tsx | 28 +++-- .../desktop/src/components/ai-agent-store.tsx | 12 +- .../src/components/event-classification.tsx | 9 +- .../src/stores/classification-store.ts | 3 +- packages/desktop/src/vite-env.d.ts | 16 +++ 13 files changed, 148 insertions(+), 77 deletions(-) create mode 100644 packages/desktop/src/assets/request-req-logo.png create mode 100644 packages/desktop/src/vite-env.d.ts diff --git a/.cursorrules b/.cursorrules index a591487..f044838 100644 --- a/.cursorrules +++ b/.cursorrules @@ -24,9 +24,9 @@ Assistant Guidelines: Project Structure: - Main app is in packages/desktop -- Frontend: packages/desktop/src/renderer -- Backend: packages/desktop/src/electron -- packages/landing-v0 containts landing page and in the future all account logins and signups +- Frontend: packages/desktop/src/renderer (vite) +- Backend: packages/desktop/src/electron (electron) +- packages/landing-v0 containts landing page and in the future all account logins and signups (nextjs app dir) diff --git a/packages/desktop/src/agents/add-to-mac-calendar-agent.tsx b/packages/desktop/src/agents/add-to-mac-calendar-agent.tsx index 5e7dd5f..5c76d6a 100644 --- a/packages/desktop/src/agents/add-to-mac-calendar-agent.tsx +++ b/packages/desktop/src/agents/add-to-mac-calendar-agent.tsx @@ -302,10 +302,18 @@ const AddToCalendarUI: React.FC = ({ export const AddToMacCalendarAgent: Agent = { id: 'add-to-mac-calendar', - name: 'Add to Calendar', - description: 'Creates calendar events from detected content', + name: 'Calendar Manager', + description: 'Automatically adds events to your Mac calendar', type: 'event' as AgentType, isActive: true, + isReady: false, + miniApp: () => , eventAction(context: RecognizedContext, onSuccess?: () => void): React.ReactNode { return ; diff --git a/packages/desktop/src/agents/base-agent.ts b/packages/desktop/src/agents/base-agent.ts index 73a6439..12448f9 100644 --- a/packages/desktop/src/agents/base-agent.ts +++ b/packages/desktop/src/agents/base-agent.ts @@ -1,6 +1,7 @@ import { ReactNode } from 'react'; +import { RecognizedContext } from '@/components/event-classification'; -export type AgentType = 'invoice' | 'calendar' | 'task' | 'event' | 'goal'; +export type AgentType = 'task' | 'event' | 'invoice' | 'goal' | 'business'; export interface RecognizedContext { id: string; @@ -13,11 +14,13 @@ export interface RecognizedContext { export interface Agent { id: string; name: string; + displayName?: () => ReactNode; description: string; type: AgentType; isActive: boolean; - eventAction: (context: RecognizedContext, onSuccess?: () => void) => ReactNode; + isReady: boolean; miniApp?: () => ReactNode; + eventAction(context: RecognizedContext, onSuccess?: () => void): ReactNode; } export interface ClassificationResult { diff --git a/packages/desktop/src/agents/business-agent.tsx b/packages/desktop/src/agents/business-agent.tsx index 8f26ee5..0d49c73 100644 --- a/packages/desktop/src/agents/business-agent.tsx +++ b/packages/desktop/src/agents/business-agent.tsx @@ -266,6 +266,7 @@ export const BusinessAgent: Agent = { description: 'Automatically processes and stores business-related information from your screen content', type: 'business' as AgentType, isActive: true, + isReady: false, miniApp: () => , eventAction(context: RecognizedContext, onSuccess?: () => void): React.ReactNode { diff --git a/packages/desktop/src/agents/goal-planning-agent.tsx b/packages/desktop/src/agents/goal-planning-agent.tsx index c1928cd..a505de4 100644 --- a/packages/desktop/src/agents/goal-planning-agent.tsx +++ b/packages/desktop/src/agents/goal-planning-agent.tsx @@ -351,14 +351,14 @@ const GoalPlanningDashboard: React.FC = () => { export const GoalPlanningAgent: Agent = { id: 'goal-planning', - name: 'Goal Planning', - description: 'Analyzes markdown files to extract and track goals', + name: 'Goal Planner', + description: 'Helps you track and manage your goals and objectives', type: 'goal' as AgentType, isActive: true, - + isReady: false, + miniApp: () => , + eventAction(context: RecognizedContext, onSuccess?: () => void): React.ReactNode { return ; }, - - miniApp: () => , }; diff --git a/packages/desktop/src/agents/invoice-agent.tsx b/packages/desktop/src/agents/invoice-agent.tsx index 53b9bf2..215b014 100644 --- a/packages/desktop/src/agents/invoice-agent.tsx +++ b/packages/desktop/src/agents/invoice-agent.tsx @@ -1,13 +1,10 @@ import { Agent, RecognizedContext, AgentType } from './base-agent'; import * as React from 'react'; import { Button } from '../components/ui/button'; -import { - Dialog, - DialogContent, - DialogTrigger, -} from '@/components/ui/dialog'; +import { Dialog, DialogContent, DialogTrigger } from '@/components/ui/dialog'; import { useState, useEffect } from 'react'; import { useQuery } from '@tanstack/react-query'; +import requestLogo from '@/assets/request-req-logo.png'; import { Table, TableBody, @@ -41,6 +38,16 @@ interface InvoiceAgentUIProps { onSuccess?: () => void; } +const RequestLogo = ({ className }: { className?: string }) => ( + Request Network +); + const InvoiceAgentUI: React.FC = ({ context, onSuccess, @@ -53,7 +60,7 @@ const InvoiceAgentUI: React.FC = ({ if (open && !result && !isProcessing) { console.log('0xHypr', 'Modal opened, starting invoice processing', { contextId: context.id, - vitalInfo: context.vitalInformation + vitalInfo: context.vitalInformation, }); processInvoice(context.vitalInformation); } @@ -72,16 +79,18 @@ const InvoiceAgentUI: React.FC = ({ console.log('0xHypr', 'Transforming invoice data:', invoice); // Transform buyerInfo to ensure miscellaneous is a Record - const transformedBuyerInfo: BusinessInfo | undefined = invoice.buyerInfo ? { - businessName: invoice.buyerInfo.businessName || '', - email: invoice.buyerInfo.email, - firstName: invoice.buyerInfo.firstName, - lastName: invoice.buyerInfo.lastName, - phone: invoice.buyerInfo.phone, - address: invoice.buyerInfo.address, - taxRegistration: invoice.buyerInfo.taxRegistration, - miscellaneous: {}, - } : undefined; + const transformedBuyerInfo: BusinessInfo | undefined = invoice.buyerInfo + ? { + businessName: invoice.buyerInfo.businessName || '', + email: invoice.buyerInfo.email, + firstName: invoice.buyerInfo.firstName, + lastName: invoice.buyerInfo.lastName, + phone: invoice.buyerInfo.phone, + address: invoice.buyerInfo.address, + taxRegistration: invoice.buyerInfo.taxRegistration, + miscellaneous: {}, + } + : undefined; const transformedValues: Partial = { sellerInfo: { @@ -95,25 +104,28 @@ const InvoiceAgentUI: React.FC = ({ miscellaneous: invoice.sellerInfo?.miscellaneous || {}, }, buyerInfo: transformedBuyerInfo, - invoiceItems: invoice.invoiceItems?.map(item => ({ - name: item.name || 'Untitled Item', - quantity: item.quantity || 1, - unitPrice: item.unitPrice || '0', - currency: item.currency || 'ETH', - tax: { - type: item.tax?.type || 'percentage', - amount: item.tax?.amount || '0' - }, - reference: item.reference || '', - deliveryDate: item.deliveryDate || new Date().toISOString(), - deliveryPeriod: item.deliveryPeriod || '', - })) || [], - paymentTerms: invoice.paymentTerms ? { - dueDate: invoice.paymentTerms.dueDate, - lateFeesPercent: invoice.paymentTerms.lateFeesPercent, - lateFeesFix: invoice.paymentTerms.lateFeesFix, - miscellaneous: {}, - } as ExtendedPaymentTerms : undefined, + invoiceItems: + invoice.invoiceItems?.map((item) => ({ + name: item.name || 'Untitled Item', + quantity: item.quantity || 1, + unitPrice: item.unitPrice || '0', + currency: item.currency || 'ETH', + tax: { + type: item.tax?.type || 'percentage', + amount: item.tax?.amount || '0', + }, + reference: item.reference || '', + deliveryDate: item.deliveryDate || new Date().toISOString(), + deliveryPeriod: item.deliveryPeriod || '', + })) || [], + paymentTerms: invoice.paymentTerms + ? ({ + dueDate: invoice.paymentTerms.dueDate, + lateFeesPercent: invoice.paymentTerms.lateFeesPercent, + lateFeesFix: invoice.paymentTerms.lateFeesFix, + miscellaneous: {}, + } as ExtendedPaymentTerms) + : undefined, note: invoice.note || '', terms: invoice.terms || '', purchaseOrderId: invoice.purchaseOrderId, @@ -128,7 +140,7 @@ const InvoiceAgentUI: React.FC = ({ from: open, to: newOpen, hasResult: !!result, - isProcessing + isProcessing, }); setOpen(newOpen); }; @@ -142,15 +154,15 @@ const InvoiceAgentUI: React.FC = ({ return (
-

Invoice Request

+
+

Invoice Request

+ +

{context.title}

- )}