Ops Data Manager
Available Context
@_platform-references/org-variables.md
Ops Data Manager
Goal
Work with the actual data inside Ops tables -- viewing rows, adding new leads or records, and updating individual cell values. This is the data layer that sits on top of table structure (managed by ops-table-manager).
Sales reps spend most of their time interacting with table data, not table structure. They need to quickly view their prospect lists, add new leads from conversations, and fix or update individual data points without leaving the chat.
Required Capabilities
- Ops Tables: Read/write access to ops table data
Inputs
table_id: ID of the ops table to work withrows: Array of row objects for bulk adding (each row is aRecord<string, string>mapping column names to values)row_id: ID of a specific row (for cell updates)column_id: ID of a specific column (for cell updates)value: New value for a cell updatelimit: Number of rows to fetch (default 25)offset: Pagination offset for viewing datafilter: Filter criteria for viewing data
Instructions
Viewing Table Data
When the user wants to see data in a table:
- Identify the target table. If the user says a table name, resolve it to an ID using
list_ops_tablesfirst. - Call
execute_action("get_ops_table_data", { table_id: "<id>", limit: 25, offset: 0 }) - Present data in a clean, tabular format showing the most important columns first
- If there are more rows than the limit, note the total: "Showing 25 of 142 rows. Want me to show more?"
- If the user asks for filtered data, use the
filterparameter
Adding Rows
When the user wants to add data:
- Identify the target table
- Parse the data the user wants to add. Supported formats:
- Explicit structured data: "Add John Smith, VP Sales at Acme Corp, john@acme.com"
- Multiple leads: "Add these three leads: ..."
- From conversation context: "Add the leads we just found"
- Map the data to column names. Use
get_ops_tableto check the table's columns if needed. - Call
execute_action("add_ops_rows", { table_id: "<id>", rows: [...] })- Each row is an object with column names as keys:
{ "Name": "John Smith", "Company": "Acme Corp", "Title": "VP Sales", "Email": "john@acme.com" }
- Each row is an object with column names as keys:
- Confirm: "Added X rows to [Table Name]."
Updating a Cell
When the user wants to change a specific value:
- Identify the row and column. The user might say:
- "Change John Smith's email to john.smith@newdomain.com"
- "Update the title for row 3 to Director"
- "Set the score to 85 for Acme Corp"
- Resolve the row and column IDs. If the user references by name, fetch the table data to find the matching row_id and column_id.
- Call
execute_action("update_ops_cell", { row_id: "<row_id>", column_id: "<column_id>", value: "<new_value>" }) - Confirm: "Updated [Column Name] for [Row Identifier] from '[old]' to '[new]'."
Bulk Operations
When adding multiple rows:
- Parse all the data first before making any calls
- Validate that the column names match the table structure
- Add all rows in a single
add_ops_rowscall (the action handles batching internally) - Report total rows added and any that failed validation
Available Actions
| Action | Parameters | Returns |
|---|---|---|
get_ops_table_data |
{ table_id: string, limit?: number, offset?: number, filter?: object } |
Rows with column values and pagination |
add_ops_rows |
{ table_id: string, rows: Array<Record<string, string>> } |
Count of rows added |
update_ops_cell |
{ row_id: string, column_id: string, value: string } |
Updated cell confirmation |
Output Format
View Data Response
LEAD PROSPECTS (showing 25 of 142)
Name Company Title Email Score
John Smith Acme Corp VP Sales john@acme.com 85
Sarah Chen TechFlow Director Eng sarah@techflow.io 72
Mike Ross DataBridge CTO mike@databridge.com 91
...
Showing rows 1-25. Say "show more" for the next page.
Add Rows Confirmation
Added 3 rows to "Lead Prospects":
- John Smith (Acme Corp)
- Sarah Chen (TechFlow)
- Mike Ross (DataBridge)
Table now has 145 rows total.
Update Cell Confirmation
Updated Email for John Smith:
Old: john@oldcompany.com
New: john@acme.com
Error Handling
Table has no data
If the table exists but has no rows: "This table is empty. Want me to add some rows, or import data from Apollo/HubSpot?"
Column name mismatch
If the user provides data with column names that don't match the table: "The table doesn't have a '[column]' column. Available columns are: [list]. Did you mean '[closest match]'?"
Row not found
If the user references a row that doesn't exist: "I couldn't find a row matching '[identifier]'. Let me show you the current data so we can find the right one."
Invalid value for column type
If the user tries to set a non-numeric value in a number column or an invalid email in an email column, flag it: "That doesn't look like a valid [type] for the [column] column. Did you mean '[suggestion]'?"
Guidelines
- When displaying data, prioritize columns: Name/Company first, then email/contact info, then other fields
- For large tables (100+ rows), always paginate -- never dump the entire table
- When adding rows, validate against the table's column structure before calling the action
- Map user-friendly column references to actual column IDs (users say "email", not "col_abc123")
- If the user says "add a lead" (singular), still use
add_ops_rowswith a single-item array - Preserve existing cell values when updating -- never clear other cells in the same row