diff --git a/apps/rowboat/app/lib/prebuilt-cards/Financial Summary Generator.json b/apps/rowboat/app/lib/prebuilt-cards/Financial Summary Generator.json deleted file mode 100644 index 1d341064..00000000 --- a/apps/rowboat/app/lib/prebuilt-cards/Financial Summary Generator.json +++ /dev/null @@ -1,183 +0,0 @@ -{ - "agents": [ - { - "name": "Financial Summary Generator", - "type": "conversation", - "description": "Processes parsed quarterly earnings reports (e.g., SEC Form 10-Q), generates a universal one-page financial summary in strict format, and creates a new Google Doc with the summary.", - "instructions": "## 🧑‍💼 Role:\nYou are a financial analysis agent that generates a universal one-page financial summary from quarterly earnings reports (typically SEC Form 10-Q or equivalent) provided as unstructured PDF documents in the Finance Document data source. You must extract all required information by first converting the PDF to text using the Convert PDF to Text tool, then parsing the text for the necessary details. Never ask the user for company name, ticker, period end date, or any other information that can be found in the PDF.\n\n---\n## ⚙️ Steps to Follow:\n1. When the user requests a summary, use the [@tool:Convert PDF to Text](#mention) tool to extract the full text from the PDF in the Finance Document data source. (If there are multiple PDFs, process each one in turn.)\n2. Parse the extracted text to find all required values for each section:\n - Income Statement fields (e.g., total revenue, gross profit, operating income, net income, earnings per share)\n - Balance Sheet fields (e.g., total assets, total liabilities, shareholders’ equity, cash and cash equivalents)\n - Cash Flow fields (e.g., operating cash flow, investing cash flow, financing cash flow)\n - Key Ratios, Management Commentary, and Notable Events (e.g., gross margin, operating margin, net margin, debt-to-equity, management discussion, notable events, disclosures)\n3. For each required value, if it cannot be found in the extracted text, use \"Not disclosed\".\n4. Never fabricate, infer, or guess values. Only use information explicitly found in the extracted text.\n5. Generate a JSON object with this structure:\n{\n \"document_title\": \"[Generated Title]\",\n \"content\": \"[Formatted Financial Summary Below]\"\n}\n6. The document_title must follow this structure:\n [Company Name] – Q[Quarter Number] [Year] Financial Summary\n - Use the fiscal period end date in the report to determine the quarter and year (e.g., March 31 = Q1).\n7. The content field must follow this exact summary format:\n\nCompany Name: [Name]\nTicker Symbol: [Ticker]\nReport Period Ending: [Date]\nFiling Type: [e.g., 10-Q]\nFiling Date: [Date]\n\n1. Income Statement Summary:\n - Total Revenue: $[value]\n - Gross Profit: $[value]\n - Operating Income: $[value]\n - Net Income: $[value]\n - Earnings Per Share (Basic): $[value]\n - Earnings Per Share (Diluted): $[value]\n\n2. Balance Sheet Highlights:\n - Total Assets: $[value]\n - Total Liabilities: $[value]\n - Shareholders’ Equity: $[value]\n - Cash and Cash Equivalents: $[value]\n\n3. Cash Flow Summary:\n - Operating Cash Flow: $[value]\n - Investing Cash Flow: $[value]\n - Financing Cash Flow: $[value]\n\n4. Key Financial Ratios (if provided or derivable):\n - Gross Margin: [value or “Not disclosed”]\n - Operating Margin: [value or “Not disclosed”]\n - Net Margin: [value or “Not disclosed”]\n - Debt-to-Equity Ratio: [value or “Not disclosed”]\n\n5. Management Commentary (Summary):\n - [2–3 sentence summary of any forward-looking statements or business highlights from the “Management’s Discussion and Analysis” section.]\n\n6. Notable Events or Disclosures:\n - [E.g., acquisitions, legal risks, restatements, or changes in accounting treatment.]\n\nGenerated based solely on the provided PDF document(s) using Convert PDF to Text. No external data or assumptions included.\n\n8. Use the [@tool:Create Document Markdown](#mention) tool to create a new Google Doc with the generated title and the formatted summary as markdown.\n9. Return the link to the created Google Doc to the user.\n\n---\n## 🎯 Scope:\n✅ In Scope:\n- Extracting and summarizing financial data from unstructured quarterly reports by converting PDF to text.\n- Generating a strict JSON summary and document title.\n- Creating a new Google Doc with the summary.\n\n❌ Out of Scope:\n- Using any data not present in the PDF document.\n- Fabricating or guessing values.\n- Expecting a pre-parsed or structured input.\n- Asking the user for information that can be found in the PDF document.\n- Answering questions outside the scope of financial summary generation.\n\n---\n## 📋 Guidelines:\n✔️ Dos:\n- For every required field, always parse the extracted PDF text.\n- Always follow the strict output format and behavior rules.\n- Use “Not disclosed” for missing data.\n- Use U.S. dollars unless otherwise specified in the document.\n- Only use information from the PDF document.\n- Always return a valid JSON object with the exact structure specified.\n\n🚫 Don'ts:\n- Do not use external data or assumptions.\n- Do not fabricate or guess values.\n- Do not expect a pre-parsed document.\n- Do not ask the user for company name, ticker, period end date, or any other information that can be found in the PDF document.\n- Do not deviate from the required format.\n\n---\n## Data Source\nYou have access to the following data source:\n- Finance Document: PDF documents for parsing\nCall [@tool:Convert PDF to Text](#mention) to extract the text from the PDF before answering any questions on it.\n\n# Examples\n- **User** : Hi send me my read up!\n - **Agent actions**: Use [@tool:Convert PDF to Text](#mention) to extract text from the PDF. Parse all required values from the text. Use “Not disclosed” if missing. Generate the JSON summary and document title. Call [@tool:Create Document Markdown](#mention) with the title and formatted summary. Return the Google Doc link.\n\n- **User** : The report is missing some values.\n - **Agent actions**: Use “Not disclosed” for any missing values. Continue with the summary and document creation.\n\n- **User** : Can you add information from Yahoo Finance?\n - **Agent response**: Sorry, I can only use information found in the provided PDF document. No external data or assumptions are included.\n\n- **User** : Please summarize this 10-Q for Widget Inc. (period ending June 30, 2025).\n - **Agent actions**: Use [@tool:Convert PDF to Text](#mention) to extract text from the PDF. Parse all required values from the text. Use “Not disclosed” if missing. Generate the JSON summary and document title. Call [@tool:Create Document Markdown](#mention) with the title and formatted summary. Return the Google Doc link.\n\n- **User** : Can you guess the net margin?\n - **Agent response**: Sorry, I cannot fabricate or guess values. If the net margin is not disclosed in the report, I will indicate “Not disclosed.”", - "examples": "\n", - "model": "google/gemini-2.5-flash", - "toggleAble": true, - "ragDataSources": [], - "ragReturnType": "chunks", - "ragK": 3, - "outputVisibility": "user_facing", - "controlType": "retain" - } - ], - "prompts": [], - "tools": [ - { - "name": "Create Document Markdown", - "description": "Creates a new google docs document, optionally initializing it with a title and content provided as markdown text.", - "mockTool": false, - "parameters": { - "type": "object", - "properties": { - "markdown_text": { - "description": "The initial content for the document, formatted as Markdown. Supports various Markdown elements including headings, lists (nested lists are not supported), tables, images (via publicly accessible URLs), blockquotes, code blocks, and text formatting (bold, italic, etc.). If an empty string is provided, the document will be created with only the title.", - "title": "Markdown Text", - "type": "string" - }, - "title": { - "description": "The title for the new Google Docs document.", - "examples": [ - "Meeting Notes Q3", - "Project Alpha Proposal", - "My New Story Draft" - ], - "title": "Title", - "type": "string" - } - }, - "required": [ - "title", - "markdown_text" - ] - }, - "isComposio": true, - "composioData": { - "slug": "GOOGLEDOCS_CREATE_DOCUMENT_MARKDOWN", - "noAuth": false, - "toolkitName": "googledocs", - "toolkitSlug": "googledocs", - "logo": "https://cdn.jsdelivr.net/gh/ComposioHQ/open-logos@master/google-docs.svg" - } - }, - { - "name": "Convert PDF to Text", - "description": "Tool to convert pdf or scanned images to plain text. use when you need raw text output preserving layout.", - "mockTool": false, - "parameters": { - "type": "object", - "properties": { - "callback": { - "default": null, - "description": "Webhook URL to receive callback when async=true.", - "nullable": true, - "title": "Callback", - "type": "string" - }, - "expiration": { - "default": 60, - "description": "Expiration time in minutes for the output file link.", - "minimum": 1, - "nullable": true, - "title": "Expiration", - "type": "integer" - }, - "httppassword": { - "default": null, - "description": "HTTP auth password for source URL.", - "nullable": true, - "title": "Httppassword", - "type": "string" - }, - "httpusername": { - "default": null, - "description": "HTTP auth username for source URL.", - "nullable": true, - "title": "Httpusername", - "type": "string" - }, - "inline": { - "default": false, - "description": "Return text inline in response instead of URL.", - "nullable": true, - "title": "Inline", - "type": "boolean" - }, - "lang": { - "default": "eng", - "description": "OCR language(s) code, e.g. 'eng', or 'eng+deu'.", - "nullable": true, - "title": "Lang", - "type": "string" - }, - "lineGrouping": { - "default": null, - "description": "Line grouping mode: '1', '2', or '3'.", - "nullable": true, - "title": "Line Grouping", - "type": "string" - }, - "name": { - "default": null, - "description": "Desired name for the output file (e.g. 'result.txt').", - "nullable": true, - "title": "Name", - "type": "string" - }, - "pages": { - "default": null, - "description": "Comma-separated page indices or ranges to process (e.g. '0,2-4').", - "nullable": true, - "title": "Pages", - "type": "string" - }, - "password": { - "default": null, - "description": "Password for protected PDF files.", - "nullable": true, - "title": "Password", - "type": "string" - }, - "rect": { - "default": null, - "description": "Extraction rectangle in format '{x} {y} {width} {height}'.", - "nullable": true, - "title": "Rect", - "type": "string" - }, - "run_async": { - "default": false, - "description": "Run process asynchronously; returns jobId if true.", - "nullable": true, - "title": "Run Async", - "type": "boolean" - }, - "unwrap": { - "default": false, - "description": "Unwrap lines into a single line within table cells (only when lineGrouping='1').", - "nullable": true, - "title": "Unwrap", - "type": "boolean" - }, - "url": { - "description": "URL to the source PDF or image file.", - "examples": [ - "https://example.com/sample.pdf" - ], - "title": "Url", - "type": "string" - } - }, - "required": [ - "url" - ] - }, - "isComposio": true, - "composioData": { - "slug": "PDF_CO_PDF_TO_TEXT", - "noAuth": false, - "toolkitName": "pdf_co", - "toolkitSlug": "pdf_co", - "logo": "some_logo_url" - } - } - ], - "startAgent": "Financial Summary Generator", - "lastUpdatedAt": "2025-08-25T11:30:38.878Z", - "name": "Financial Summary Generator", - "description": "Generate a universal one-page financial summary from quarterly earnings reports (e.g., SEC Form 10-Q), generates a universal one-page financial summary in strict format, and creates a new Google Doc with the summary." -} \ No newline at end of file diff --git a/apps/rowboat/app/lib/prebuilt-cards/meeting-prep.json b/apps/rowboat/app/lib/prebuilt-cards/meeting-prep.json deleted file mode 100644 index 860a24f1..00000000 --- a/apps/rowboat/app/lib/prebuilt-cards/meeting-prep.json +++ /dev/null @@ -1,237 +0,0 @@ -{ - "agents": [ - { - "name": "Research Agent", - "type": "pipeline", - "description": "Internal agent that researches meeting attendees and returns a compiled summary.", - "instructions": "## Role\nYou are a pipeline agent that researches meeting attendees.\n\n---\n## Task\n1. You will receive attendee details from a previous step.\n2. For each attendee, you **must** research them **one at a time** using the [@tool:Search](#mention). Do NOT research the user `{{Exclude user}}`!\n3. After all searches are complete, compile the findings into a single, plain text summary.\n4. If no information is found for an attendee, state \"No public information found.\" for that person.\n5. Return **only** the final compiled summary.\n\n---\n## Constraint\nDo **NOT** interact with users or send messages. Your only output is the final summary text.", - "model": "google/gemini-2.5-flash", - "toggleAble": true, - "ragReturnType": "chunks", - "ragK": 3, - "controlType": "relinquish_to_parent", - "outputVisibility": "internal", - "maxCallsPerParentAgent": 3 - }, - { - "name": "Slack Send Agent", - "type": "pipeline", - "description": "Internal agent that sends the compiled research summary to a channel via Slack direct message and returns confirmation.", - "disabled": false, - "instructions": "## Role\nYou are a pipeline agent that sends a research summary to a Slack channel.\n\n---\n## Task\n1. You will receive a compiled text summary from the previous step.\n2. Use the [@tool:Send message](#mention) tool to post this summary, using these parameters:\n * **channel**: `{{Slack Channel}}`\n * **markdown_text**: Create a message starting with the subject \"*Meeting Attendee Research Summary*\", followed by the summary text you received.\n3. Your job is complete after sending the message.\n\n---\n## Constraint\nDo **NOT** perform any action other than sending the Slack message as instructed.", - "model": "google/gemini-2.5-flash", - "locked": false, - "toggleAble": true, - "ragReturnType": "chunks", - "ragK": 3, - "controlType": "relinquish_to_parent", - "outputVisibility": "internal", - "maxCallsPerParentAgent": 3, - "examples": "- **Parent agent** : \n - **Agent actions**: Call [@tool:Send message](#mention)\n - **Agent response**: Message sent to Slack channel.\n" - }, - { - "name": "Attendee Research & Slack Pipeline Step 1", - "type": "pipeline", - "description": "", - "disabled": false, - "instructions": "", - "model": "gpt-4o", - "locked": false, - "toggleAble": true, - "ragReturnType": "chunks", - "ragK": 3, - "controlType": "relinquish_to_parent", - "outputVisibility": "internal", - "maxCallsPerParentAgent": 3 - } - ], - "prompts": [ - { - "name": "Slack Channel", - "type": "base_prompt", - "prompt": "" - }, - { - "name": "Exclude user", - "type": "base_prompt", - "prompt": "" - } - ], - "tools": [ - { - "name": "Search", - "description": "Performs a web search and scrapes content from the top results.", - "parameters": { - "type": "object", - "properties": { - "query": { - "type": "string", - "description": "The search query." - } - }, - "required": [ - "query" - ] - }, - "mockTool": true, - "isComposio": true, - "composioData": { - "slug": "FIRECRWAL_SEARCH", - "noAuth": false, - "toolkitName": "firecrawl", - "toolkitSlug": "firecrawl", - "logo": "https://cdn.jsdelivr.net/gh/ComposioHQ/open-logos@master/firecrawl.svg" - } - }, - { - "name": "Send message", - "description": "Posts a message to a slack channel, direct message, or private group; requires content via `text`, `blocks`, or `attachments`.", - "parameters": { - "type": "object", - "properties": { - "as_user": { - "description": "Post as the authenticated user instead of as a bot. Defaults to `false`. If `true`, `username`, `icon_emoji`, and `icon_url` are ignored. If `false`, the message is posted as a bot, allowing appearance customization.", - "title": "As User", - "type": "boolean" - }, - "attachments": { - "description": "URL-encoded JSON array of message attachments, a legacy method for rich content. See Slack API documentation for structure.", - "examples": [ - "%5B%7B%22fallback%22%3A%20%22Required%20plain-text%20summary%20of%20the%20attachment.%22%2C%20%22color%22%3A%20%22%2336a64f%22%2C%20%22pretext%22%3A%20%22Optional%20text%20that%20appears%20above%20the%20attachment%20block%22%2C%20%22author_name%22%3A%20%22Bobby%20Tables%22%2C%20%22title%22%3A%20%22Slack%20API%20Documentation%22%2C%20%22title_link%22%3A%20%22https%3A%2F%2Fapi.slack.com%2F%22%2C%20%22text%22%3A%20%22Optional%20text%20that%20appears%20within%20the%20attachment%22%7D%5D" - ], - "title": "Attachments", - "type": "string" - }, - "blocks": { - "description": "DEPRECATED: Use `markdown_text` field instead. URL-encoded JSON array of layout blocks for rich/interactive messages. See Slack API Block Kit docs for structure.", - "examples": [ - "%5B%7B%22type%22%3A%20%22section%22%2C%20%22text%22%3A%20%7B%22type%22%3A%20%22mrkdwn%22%2C%20%22text%22%3A%20%22Hello%2C%20world%21%22%7D%7D%5D" - ], - "title": "Blocks", - "type": "string" - }, - "channel": { - "description": "ID or name of the channel, private group, or IM channel to send the message to.", - "examples": [ - "C1234567890", - "general" - ], - "title": "Channel", - "type": "string" - }, - "icon_emoji": { - "description": "Emoji for bot's icon (e.g., ':robot_face:'). Overrides `icon_url`. Applies if `as_user` is `false`.", - "examples": [ - ":tada:", - ":slack:" - ], - "title": "Icon Emoji", - "type": "string" - }, - "icon_url": { - "description": "Image URL for bot's icon (must be HTTPS). Applies if `as_user` is `false`.", - "examples": [ - "https://slack.com/img/icons/appDir_2019_01/Tonito64.png" - ], - "title": "Icon Url", - "type": "string" - }, - "link_names": { - "description": "Automatically hyperlink channel names (e.g., #channel) and usernames (e.g., @user) in message text. Defaults to `false` for bot messages.", - "title": "Link Names", - "type": "boolean" - }, - "markdown_text": { - "description": "PREFERRED: Write your message in markdown for nicely formatted display. Supports: headers (# ## ###), bold (**text** or __text__), italic (*text* or _text_), strikethrough (~~text~~), inline code (`code`), code blocks (```), links ([text](url)), block quotes (>), lists (- item, 1. item), dividers (--- or ***), context blocks (:::context with images), and section buttons (:::section-button). IMPORTANT: Use \\n for line breaks (e.g., 'Line 1\\nLine 2'), not actual newlines. USER MENTIONS: To tag users, use their user ID with <@USER_ID> format (e.g., <@U1234567890>), not username. ", - "examples": [ - "# Status Update\\n\\nSystem is **running smoothly** with *excellent* performance.\\n\\n```bash\\nkubectl get pods\\n```\\n\\n> All services operational ✅", - "## Daily Report\\n\\n- **Deployments**: 5 successful\\n- *Issues*: 0 critical\\n- ~~Maintenance~~: **Completed**\\n\\n---\\n\\n**Next**: Monitor for 24h" - ], - "title": "Markdown Text", - "type": "string" - }, - "mrkdwn": { - "description": "Disable Slack's markdown for `text` field if `false`. Default `true` (allows *bold*, _italic_, etc.).", - "title": "Mrkdwn", - "type": "boolean" - }, - "parse": { - "description": "Message text parsing behavior. Default `none` (no special parsing). `full` parses as user-typed (links @mentions, #channels). See Slack API docs for details.", - "examples": [ - "none", - "full" - ], - "title": "Parse", - "type": "string" - }, - "reply_broadcast": { - "description": "If `true` for a threaded reply, also posts to main channel. Defaults to `false`.", - "title": "Reply Broadcast", - "type": "boolean" - }, - "text": { - "description": "DEPRECATED: This sends raw text only, use markdown_text field. Primary textual content. Recommended fallback if using `blocks` or `attachments`. Supports mrkdwn unless `mrkdwn` is `false`.", - "examples": [ - "Hello from your friendly bot!", - "Reminder: Team meeting at 3 PM today." - ], - "title": "Text", - "type": "string" - }, - "thread_ts": { - "description": "Timestamp (`ts`) of an existing message to make this a threaded reply. Use `ts` of the parent message, not another reply. Example: '1476746824.000004'.", - "examples": [ - "1618033790.001500" - ], - "title": "Thread Ts", - "type": "string" - }, - "unfurl_links": { - "description": "Enable unfurling of text-based URLs. Defaults `false` for bots, `true` if `as_user` is `true`.", - "title": "Unfurl Links", - "type": "boolean" - }, - "unfurl_media": { - "description": "Disable unfurling of media content from URLs if `false`. Defaults to `true`.", - "title": "Unfurl Media", - "type": "boolean" - }, - "username": { - "description": "Bot's name in Slack (max 80 chars). Applies if `as_user` is `false`.", - "examples": [ - "MyBot", - "AlertBot" - ], - "title": "Username", - "type": "string" - } - }, - "required": [ - "channel" - ] - }, - "mockTool": true, - "isComposio": true, - "composioData": { - "slug": "SLACK_SEND_MESSAGE", - "noAuth": false, - "toolkitName": "slack", - "toolkitSlug": "slack", - "logo": "https://cdn.jsdelivr.net/gh/ComposioHQ/open-logos@master/slack.svg" - } - } - ], - "startAgent": "Attendee Research & Slack Pipeline", - "pipelines": [ - { - "name": "Attendee Research & Slack Pipeline", - "description": "Pipeline that researches meeting attendees and sends the compiled summary to a specified Slack channel.", - "agents": [ - "Research Agent", - "Slack Send Agent" - ] - } - ], - "name": "Meeting Prep", - "description": "Research meeting attendees and send summary to Slack" -}