import { enrichTableToolSchema } from '@/tools/schema-enrichers' import type { TableRowInsertParams, TableUpsertResponse } from '@/tools/table/types' import type { ToolConfig } from '@/tools/types' export const tableUpsertRowTool: ToolConfig = { id: 'table_upsert_row', name: 'Upsert Row', description: 'Insert or update a row based on unique column constraints. If a row with matching unique field exists, update it; otherwise insert a new row. IMPORTANT: You must use the "data" parameter (not "values", "row", "fields", or other variations) to specify the row contents.', version: '1.0.0', toolEnrichment: { dependsOn: 'tableId', enrichTool: (tableId, schema, desc) => enrichTableToolSchema(tableId, 'table_upsert_row', schema, desc), }, params: { tableId: { type: 'string', required: true, description: 'Table ID', visibility: 'user-only', }, data: { type: 'object', required: true, description: 'Row data to insert or update', visibility: 'user-or-llm', }, conflictTarget: { type: 'string', required: false, description: 'Unique column to match on. Required only when the table has more than one unique column.', visibility: 'user-only', }, }, request: { url: (params: TableRowInsertParams) => `/api/table/${params.tableId}/rows/upsert`, method: 'POST', headers: () => ({ 'Content-Type': 'application/json', }), body: (params: TableRowInsertParams) => { const workspaceId = params._context?.workspaceId if (!workspaceId) { throw new Error('Workspace ID is required in execution context') } return { data: params.data, workspaceId, ...(params.conflictTarget ? { conflictTarget: params.conflictTarget } : {}), } }, }, transformResponse: async (response): Promise => { const result = await response.json() const data = result.data || result return { success: true, output: { row: data.row, operation: data.operation, message: data.message || 'Row upserted successfully', }, } }, outputs: { success: { type: 'boolean', description: 'Whether row was upserted' }, row: { type: 'json', description: 'Upserted row data' }, operation: { type: 'string', description: 'Operation performed: insert or update' }, message: { type: 'string', description: 'Status message' }, }, }