Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
7fa4d01
Add SuggestedAgentRule type, Onyx key, and agent rule tab constants
samranahm Jul 10, 2026
53af052
Add translations for agent rule Suggestions and Edit tabs
samranahm Jul 10, 2026
adc977d
dd useSuggestedAgentRules hook and suggestion icon mapping
samranahm Jul 10, 2026
dc63702
Add Suggestions and Edit tabs to the new agent rule flow
samranahm Jul 10, 2026
8a84569
Add tests for suggested agent rules
samranahm Jul 10, 2026
a233648
Update API command GET_AGENT_RULE_SUGGESTIONS and corresponding param…
samranahm Jul 11, 2026
c3e2bda
impliment review feedback
samranahm Jul 11, 2026
cb4cd9b
Add test to disable Next button when selected suggestion is filtered out
samranahm Jul 11, 2026
3f6f74d
Add loading state management for agent rule suggestions
samranahm Jul 11, 2026
04a7dea
fix typo in agent rule suggestion comment
samranahm Jul 13, 2026
d44547b
update addRuleTitle key to newRuleTitle
samranahm Jul 13, 2026
093b1c1
check isOffline before calling getAgentRuleSuggestions
samranahm Jul 13, 2026
f317678
Refactor AddAgentRulePage to manage active tab state with useState an…
samranahm Jul 13, 2026
8d0a006
update suggested agent rule icon logic with priority-based matching a…
samranahm Jul 13, 2026
3f3d465
add optional chaining in filter, change TextInput role to SEARCHBOX, …
samranahm Jul 13, 2026
ca363a7
change handleKeyPress to submitFormOnModEnter
samranahm Jul 13, 2026
a807dbe
Enhance loading and empty state handling in AddAgentRuleSuggestionsTa…
samranahm Jul 13, 2026
b9aa633
use max height in edit tab text input field
samranahm Jul 13, 2026
53aa317
Merge remote-tracking branch 'upstream/main' into 95742/agent-rule-su…
samranahm Jul 15, 2026
d04f354
Implement review feedbacks
samranahm Jul 15, 2026
2e8d12d
fix failing test
samranahm Jul 15, 2026
a5f1143
fix lint
samranahm Jul 15, 2026
ca02303
Merge remote-tracking branch 'upstream/main' into 95742/agent-rule-su…
samranahm Jul 17, 2026
fbf0fbe
Center BlockingView vertically
samranahm Jul 17, 2026
a43a2c6
update AddAgentRulePage to keep Suggestions tab mounted when inactive…
samranahm Jul 17, 2026
30687bc
Merge remote-tracking branch 'upstream/main' into 95742/agent-rule-su…
samranahm Jul 18, 2026
5d62315
fix: network flip draft clear and remove manual showConfirmModal
samranahm Jul 18, 2026
4d3e782
fix lint
samranahm Jul 18, 2026
df4e83e
correct capitalization in comment
samranahm Jul 18, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions src/CONST/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6057,6 +6057,10 @@ const CONST = {
FLAG_FOR_REVIEW: 'flagForReview',
AGENTS: 'agents',
},
AGENT_RULE: {
SUGGESTIONS: 'suggestions',
WRITE: 'write',
},
SPLIT: {
AMOUNT: 'amount',
PERCENTAGE: 'percentage',
Expand Down Expand Up @@ -8846,6 +8850,7 @@ const CONST = {
SPEND_RULE_RESTRICTION_TYPE: 'WorkspaceRules-SpendRuleRestrictionType',
AGENT_RULE_ITEM: 'WorkspaceRules-AgentRuleItem',
ADD_AGENT_RULE: 'WorkspaceRules-AddAgentRule',
SUGGESTED_AGENT_RULE: 'WorkspaceRules-SuggestedAgentRule',
AGENT_RULE_DELETE: 'WorkspaceRules-AgentRuleDelete',
NEW_RULE_MENU_ITEM: 'WorkspaceRules-NewRuleMenuItem',
NEW_RULE_MENU_ITEM_RESTRICT_CARD_SPEND: 'WorkspaceRules-NewRuleMenuItem-RestrictCardSpend',
Expand Down
8 changes: 8 additions & 0 deletions src/ONYXKEYS.ts
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,9 @@ const ONYXKEYS = {
BETAS: 'betas',
BETA_CONFIGURATION: 'betaConfiguration',

/** Agent rule suggestions for the add-rule Suggestions tab */
AGENT_RULE_SUGGESTIONS: 'agentRuleSuggestions',

/** Whether the user is a member of a policy other than their personal */
HAS_NON_PERSONAL_POLICY: 'hasNonPersonalPolicy',

Expand Down Expand Up @@ -433,6 +436,9 @@ const ONYXKEYS = {
/** Is loading policy rules preview? */
IS_LOADING_POLICY_CODING_RULES_PREVIEW: 'isLoadingPolicyCodingRulesPreview',

/** Is loading agent rule suggestions for the add-rule Suggestions tab? */
IS_LOADING_AGENT_RULE_SUGGESTIONS: 'isLoadingAgentRuleSuggestions',

/** Set when we are loading fresh subscription/billing data from the server */
IS_LOADING_SUBSCRIPTION_DATA: 'isLoadingSubscriptionData',

Expand Down Expand Up @@ -1527,6 +1533,7 @@ type OnyxValuesMapping = {
[ONYXKEYS.USER_METADATA]: OnyxTypes.UserMetadata;
[ONYXKEYS.STASHED_SESSION]: OnyxTypes.Session;
[ONYXKEYS.BETAS]: OnyxTypes.Beta[];
[ONYXKEYS.AGENT_RULE_SUGGESTIONS]: OnyxTypes.SuggestedAgentRule[];
[ONYXKEYS.BETA_CONFIGURATION]: OnyxTypes.BetaConfiguration;
[ONYXKEYS.NVP_MUTED_PLATFORMS]: Partial<Record<Platform, true>>;
[ONYXKEYS.NVP_PRIORITY_MODE]: ValueOf<typeof CONST.PRIORITY_MODE>;
Expand Down Expand Up @@ -1596,6 +1603,7 @@ type OnyxValuesMapping = {
[ONYXKEYS.IS_LOADING_SHARE_BANK_ACCOUNTS]: boolean;
[ONYXKEYS.IS_LOADING_BULK_CHANGE_APPROVER_PAGE]: boolean;
[ONYXKEYS.IS_LOADING_POLICY_CODING_RULES_PREVIEW]: boolean;
[ONYXKEYS.IS_LOADING_AGENT_RULE_SUGGESTIONS]: boolean;
[ONYXKEYS.IS_LOADING_REPORT_DATA]: boolean;
[ONYXKEYS.IS_SEARCH_FILTERS_CARD_DATA_LOADED]: boolean;
[ONYXKEYS.IS_LOADING_SUBSCRIPTION_DATA]: boolean;
Expand Down
29 changes: 29 additions & 0 deletions src/hooks/useSuggestedAgentRules.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
/**
* Reads backend-served suggested agent rules from Onyx for the add-agent-rule Suggestions tab.
*/
import ONYXKEYS from '@src/ONYXKEYS';
import type SuggestedAgentRule from '@src/types/onyx/SuggestedAgentRule';
import isLoadingOnyxValue from '@src/types/utils/isLoadingOnyxValue';

import useOnyx from './useOnyx';

type UseSuggestedAgentRulesResult = {
/** Suggested rules from Onyx, or an empty array while loading or when no suggestions exist */
data: SuggestedAgentRule[];

/** Whether Onyx is hydrating or the suggestions request is fetching data */
isLoading: boolean;
};

function useSuggestedAgentRules(): UseSuggestedAgentRulesResult {
const [suggestions, metadata] = useOnyx(ONYXKEYS.AGENT_RULE_SUGGESTIONS);
const [isFetchingSuggestions] = useOnyx(ONYXKEYS.IS_LOADING_AGENT_RULE_SUGGESTIONS);
const isLoading = isLoadingOnyxValue(metadata) || !!isFetchingSuggestions;

return {
data: suggestions ?? [],
isLoading,
Comment thread
samranahm marked this conversation as resolved.
};
}

export default useSuggestedAgentRules;
8 changes: 7 additions & 1 deletion src/languages/de.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7749,16 +7749,22 @@ Fügen Sie weitere Ausgabelimits hinzu, um den Cashflow Ihres Unternehmens zu sc
addRule: 'Agentenregel hinzufügen',
findRule: 'Agentenregel finden',
addRuleTitle: 'Regel hinzufügen',
Comment thread
samranahm marked this conversation as resolved.
newRuleTitle: 'Neue Regel',
editRuleTitle: 'Regel bearbeiten',
deleteRule: 'Regel löschen',
deleteRuleConfirmation: 'Sind Sie sicher, dass Sie diese Regel löschen möchten?',
describeRuleTitle: 'Beschreiben Sie die Regel, der Ihre KI-Agentin/Ihr KI-Agent folgen soll',
describeRuleHeadline: 'Beschreibe deine Regel',
disclaimer: 'KI-Agenten können Fehler machen.',
agentCreatedTitle: 'RuleBot wurde zu Ihrem Arbeitsbereich hinzugefügt!',
agentCreatedDescription: (agentsRoute: string) =>
`<muted-text>Um Ihre Agent-Regeln durchzusetzen, haben wir einen Agenten für Sie erstellt und ihn als Administrator zu Ihrem Arbeitsbereich hinzugefügt.<br><br>Bearbeiten Sie die Details Ihres Agenten unter <a href="${agentsRoute}">Konto &gt; Agenten</a>.</muted-text>`,
suggestionsTab: 'Vorschläge',
writeTab: 'Bearbeiten',
findSuggestion: 'Regel finden',
emptySuggestionsTitle: 'Keine Vorschläge verfügbar',
emptySuggestionsSubtitle: 'Versuchen Sie, Ihre eigene Regel zu schreiben.',
revampSubtitle: 'Beschreiben Sie flexible Regeln, die bei Bedarf ausgeführt werden.',
newRuleTitle: 'Neue Regel',
describeRuleForConcierge: 'Beschreiben Sie Ihre Regel und Concierge erstellt sie',
gotIt: 'Verstanden',
createRule: 'Regel erstellen',
Expand Down
6 changes: 6 additions & 0 deletions src/languages/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8057,12 +8057,18 @@ const translations = {
deleteRule: 'Delete rule',
deleteRuleConfirmation: 'Are you sure you want to delete this rule?',
describeRuleTitle: 'Describe the rule for your AI agent to follow',
describeRuleHeadline: 'Describe your rule',
describeRuleForConcierge: 'Describe your rule and Concierge will build it',
disclaimer: 'AI agents can make mistakes.',
createRule: 'Create rule',
agentCreatedTitle: 'RuleBot has been added to your workspace!',
agentCreatedDescription: (agentsRoute: string) =>
`<muted-text>To enforce your agent rules, we’ve created an agent for you and added it as an admin to your workspace.<br><br>Edit your agent’s details in <a href="${agentsRoute}">Account &gt; Agents</a>.</muted-text>`,
suggestionsTab: 'Suggested',
writeTab: 'Edit',
findSuggestion: 'Find a rule',
emptySuggestionsTitle: 'No suggestions available',
emptySuggestionsSubtitle: 'Try writing your own rule.',
gotIt: 'Got it',
},
},
Expand Down
8 changes: 7 additions & 1 deletion src/languages/es.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7641,16 +7641,22 @@ El plan Controlar empieza en 9 $ por miembro activo al mes.`,
addRule: 'Añadir regla de agente',
findRule: 'Encontrar regla de agente',
addRuleTitle: 'Añadir regla',
newRuleTitle: 'Nueva regla',
describeRuleTitle: 'Describe la regla que debe seguir tu agente de IA',
describeRuleHeadline: 'Describe tu regla',
editRuleTitle: 'Editar regla',
deleteRule: 'Eliminar regla',
deleteRuleConfirmation: '¿Seguro que quieres eliminar esta regla?',
disclaimer: 'Los agentes de IA pueden cometer errores.',
agentCreatedTitle: '¡RuleBot se ha añadido a tu espacio de trabajo!',
agentCreatedDescription: (agentsRoute: string) =>
`<muted-text>Para aplicar tus reglas de agente, hemos creado un agente para ti y lo hemos añadido como administrador de tu espacio de trabajo.<br><br>Edita los datos de tu agente en <a href="${agentsRoute}">Cuenta &gt; Agentes</a>.</muted-text>`,
suggestionsTab: 'Sugerencias',
writeTab: 'Editar',
findSuggestion: 'Buscar una regla',
emptySuggestionsTitle: 'No hay sugerencias disponibles',
emptySuggestionsSubtitle: 'Prueba a escribir tu propia regla.',
revampSubtitle: 'Describe reglas flexibles que se ejecutan cuando las necesitas.',
newRuleTitle: 'Nueva regla',
describeRuleForConcierge: 'Describe tu regla y Concierge la creará',
gotIt: 'Entendido',
createRule: 'Crear regla',
Expand Down
8 changes: 7 additions & 1 deletion src/languages/fr.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7779,16 +7779,22 @@ Ajoutez davantage de règles de dépenses pour protéger la trésorerie de l’e
addRule: 'Ajouter une règle d’agent',
findRule: 'Rechercher une règle d’agent',
addRuleTitle: 'Ajouter une règle',
newRuleTitle: 'Nouvelle règle',
editRuleTitle: 'Modifier la règle',
deleteRule: 'Supprimer la règle',
deleteRuleConfirmation: 'Voulez-vous vraiment supprimer cette règle ?',
describeRuleTitle: 'Décrivez la règle que votre agent IA doit suivre',
describeRuleHeadline: 'Décrivez votre règle',
disclaimer: 'Les agents IA peuvent faire des erreurs.',
agentCreatedTitle: 'RuleBot a été ajouté à votre espace de travail !',
agentCreatedDescription: (agentsRoute: string) =>
`<muted-text>Pour appliquer vos règles d’agent, nous avons créé un agent pour vous et l’avons ajouté comme administrateur de votre espace de travail.<br><br>Modifiez les détails de votre agent dans <a href="${agentsRoute}">Compte &gt; Agents</a>.</muted-text>`,
suggestionsTab: 'Suggestions',
writeTab: 'Modifier',
findSuggestion: 'Trouver une règle',
emptySuggestionsTitle: 'Aucune suggestion disponible',
emptySuggestionsSubtitle: 'Essayez d’écrire votre propre règle.',
revampSubtitle: 'Décrivez des règles flexibles qui s’exécutent quand vous en avez besoin.',
newRuleTitle: 'Nouvelle règle',
describeRuleForConcierge: 'Décrivez votre règle et Concierge la créera',
gotIt: 'Compris',
createRule: 'Créer une règle',
Expand Down
8 changes: 7 additions & 1 deletion src/languages/it.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7732,16 +7732,22 @@ Aggiungi altre regole di spesa per proteggere il flusso di cassa aziendale.`,
addRule: 'Aggiungi regola agente',
findRule: 'Trova regola agente',
addRuleTitle: 'Aggiungi regola',
newRuleTitle: 'Nuova regola',
editRuleTitle: 'Modifica regola',
deleteRule: 'Elimina regola',
deleteRuleConfirmation: 'Sei sicuro di voler eliminare questa regola?',
describeRuleTitle: 'Descrivi la regola che il tuo agente AI deve seguire',
describeRuleHeadline: 'Descrivi la tua regola',
disclaimer: 'Gli agenti IA possono commettere errori.',
agentCreatedTitle: 'RuleBot è stato aggiunto al tuo spazio di lavoro!',
agentCreatedDescription: (agentsRoute: string) =>
`<muted-text>Per applicare le tue regole dell’agente, abbiamo creato un agente per te e lo abbiamo aggiunto come amministratore del tuo spazio di lavoro.<br><br>Modifica i dettagli del tuo agente in <a href="${agentsRoute}">Account &gt; Agenti</a>.</muted-text>`,
suggestionsTab: 'Suggerimenti',
writeTab: 'Modifica',
findSuggestion: 'Trova una regola',
emptySuggestionsTitle: 'Nessun suggerimento disponibile',
emptySuggestionsSubtitle: 'Prova a scrivere la tua regola.',
revampSubtitle: 'Descrivi regole flessibili che vengono eseguite quando ne hai bisogno.',
newRuleTitle: 'Nuova regola',
describeRuleForConcierge: 'Descrivi la tua regola e Concierge la creerà',
gotIt: 'Capito',
createRule: 'Crea regola',
Expand Down
8 changes: 7 additions & 1 deletion src/languages/ja.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7636,16 +7636,22 @@ ${reportName}`,
addRule: 'エージェントルールを追加',
findRule: 'エージェントルールを検索',
addRuleTitle: 'ルールを追加',
newRuleTitle: '新しいルール',
editRuleTitle: 'ルールを編集',
deleteRule: 'ルールを削除',
deleteRuleConfirmation: 'このルールを削除してもよろしいですか?',
describeRuleTitle: 'AI エージェントに従わせるルールを記述してください',
describeRuleHeadline: 'ルールを説明する',
disclaimer: 'AI エージェントは間違える場合があります。',
agentCreatedTitle: 'RuleBot がワークスペースに追加されました!',
agentCreatedDescription: (agentsRoute: string) =>
`<muted-text>エージェント ルールを適用するために、エージェントを作成し、ワークスペースの管理者として追加しました。<br><br>エージェントの詳細は <a href="${agentsRoute}">「アカウント」&gt;「エージェント」</a> で編集できます。</muted-text>`,
suggestionsTab: 'おすすめ',

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

question: Are we sure the translation is correct?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes, these are correct.

writeTab: '編集',
findSuggestion: 'ルールを探す',
emptySuggestionsTitle: '利用可能な提案はありません',
emptySuggestionsSubtitle: '独自のルールを作成してみてください。',
revampSubtitle: '必要なときに実行できる柔軟なルールを設定します。',
newRuleTitle: '新しいルール',
describeRuleForConcierge: 'ルールの内容を入力すると、Concierge が自動作成します',
gotIt: '了解しました',
createRule: 'ルールを作成',
Expand Down
8 changes: 7 additions & 1 deletion src/languages/nl.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7710,16 +7710,22 @@ er bestedingsregels toe om de kasstroom van het bedrijf te beschermen.`,
addRule: 'Agentregel toevoegen',
findRule: 'Agentregel zoeken',
addRuleTitle: 'Regel toevoegen',
newRuleTitle: 'Nieuwe regel',
editRuleTitle: 'Regel bewerken',
deleteRule: 'Regel verwijderen',
deleteRuleConfirmation: 'Weet je zeker dat je deze regel wilt verwijderen?',
describeRuleTitle: 'Beschrijf de regel die je AI-agent moet volgen',
describeRuleHeadline: 'Beschrijf je regel',
disclaimer: 'AI-agents kunnen fouten maken.',
agentCreatedTitle: 'RuleBot is toegevoegd aan je werkruimte!',
agentCreatedDescription: (agentsRoute: string) =>
`<muted-text>Om je agentregels af te dwingen, hebben we een agent voor je gemaakt en deze als beheerder aan je werkruimte toegevoegd.<br><br>Bewerk de gegevens van je agent in <a href="${agentsRoute}">Account &gt; Agents</a>.</muted-text>`,
suggestionsTab: 'Suggesties',
writeTab: 'Bewerken',
findSuggestion: 'Zoek een regel',
emptySuggestionsTitle: 'Geen suggesties beschikbaar',
emptySuggestionsSubtitle: 'Probeer je eigen regel te schrijven.',
revampSubtitle: 'Beschrijf flexibele regels die worden uitgevoerd wanneer jij dat nodig hebt.',
newRuleTitle: 'Nieuwe regel',
describeRuleForConcierge: 'Beschrijf je regel en Concierge bouwt hem voor je',
gotIt: 'Begrepen',
createRule: 'Regel maken',
Expand Down
8 changes: 7 additions & 1 deletion src/languages/pl.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7690,16 +7690,22 @@ Dodaj więcej zasad wydatków, żeby chronić płynność finansową firmy.`,
addRule: 'Dodaj regułę agenta',
findRule: 'Znajdź regułę agenta',
addRuleTitle: 'Dodaj regułę',
newRuleTitle: 'Nowa reguła',
editRuleTitle: 'Edytuj regułę',
deleteRule: 'Usuń regułę',
deleteRuleConfirmation: 'Na pewno chcesz usunąć tę regułę?',
describeRuleTitle: 'Opisz zasadę, której ma przestrzegać twój agent AI',
describeRuleHeadline: 'Opisz swoją regułę',
disclaimer: 'Agenci AI mogą popełniać błędy.',
agentCreatedTitle: 'RuleBot został dodany do Twojego obszaru roboczego!',
agentCreatedDescription: (agentsRoute: string) =>
`<muted-text>Aby egzekwować Twoje reguły agenta, utworzyliśmy dla Ciebie agenta i dodaliśmy go jako administratora do Twojego obszaru roboczego.<br><br>Edytuj dane swojego agenta w sekcji <a href="${agentsRoute}">Konto &gt; Agenci</a>.</muted-text>`,
suggestionsTab: 'Propozycje',
writeTab: 'Edytuj',
findSuggestion: 'Znajdź regułę',
emptySuggestionsTitle: 'Brak dostępnych propozycji',
emptySuggestionsSubtitle: 'Spróbuj napisać własną regułę.',
revampSubtitle: 'Opisuj elastyczne reguły, które uruchamiają się wtedy, kiedy tego potrzebujesz.',
newRuleTitle: 'Nowa reguła',
describeRuleForConcierge: 'Opisz swoją regułę, a Concierge ją utworzy',
gotIt: 'Jasne',
createRule: 'Utwórz regułę',
Expand Down
8 changes: 7 additions & 1 deletion src/languages/pt-BR.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7702,16 +7702,22 @@ Adicione mais regras de gasto para proteger o fluxo de caixa da empresa.`,
addRule: 'Adicionar regra de agente',
findRule: 'Encontrar regra de agente',
addRuleTitle: 'Adicionar regra',
newRuleTitle: 'Nova regra',
editRuleTitle: 'Editar regra',
deleteRule: 'Excluir regra',
deleteRuleConfirmation: 'Tem certeza de que quer excluir esta regra?',
describeRuleTitle: 'Descreva a regra que seu agente de IA deve seguir',
describeRuleHeadline: 'Descreva sua regra',
disclaimer: 'Os agentes de IA podem cometer erros.',
agentCreatedTitle: 'O RuleBot foi adicionado ao seu espaço de trabalho!',
agentCreatedDescription: (agentsRoute: string) =>
`<muted-text>Para aplicar suas regras de agente, criamos um agente para você e o adicionamos como administrador do seu espaço de trabalho.<br><br>Edite os detalhes do seu agente em <a href="${agentsRoute}">Conta &gt; Agentes</a>.</muted-text>`,
suggestionsTab: 'Sugestões',
writeTab: 'Editar',
findSuggestion: 'Encontrar uma regra',
emptySuggestionsTitle: 'Nenhuma sugestão disponível',
emptySuggestionsSubtitle: 'Tente escrever sua própria regra.',
revampSubtitle: 'Descreva regras flexíveis que são executadas quando você precisar.',
newRuleTitle: 'Nova regra',
describeRuleForConcierge: 'Descreva sua regra e o Concierge vai criá-la',
gotIt: 'Entendi',
createRule: 'Criar regra',
Expand Down
Loading
Loading