import { createLogger } from '@sim/logger' import type { ServiceNowUpdateParams, ServiceNowUpdateResponse } from '@/tools/servicenow/types' import { createBasicAuthHeader } from '@/tools/servicenow/utils' import type { ToolConfig } from '@/tools/types' const logger = createLogger('ServiceNowUpdateRecordTool') export const updateRecordTool: ToolConfig = { id: 'servicenow_update_record', name: 'Update ServiceNow Record', description: 'Update an existing record in a ServiceNow table', version: '1.0.0', params: { instanceUrl: { type: 'string', required: true, visibility: 'user-only', description: 'ServiceNow instance URL (e.g., https://instance.service-now.com)', }, username: { type: 'string', required: true, visibility: 'user-only', description: 'ServiceNow username', }, password: { type: 'string', required: true, visibility: 'user-only', description: 'ServiceNow password', }, tableName: { type: 'string', required: true, visibility: 'user-or-llm', description: 'Table name (e.g., incident, task, sys_user, change_request)', }, sysId: { type: 'string', required: true, visibility: 'user-or-llm', description: 'Record sys_id to update (e.g., 6816f79cc0a8016401c5a33be04be441)', }, fields: { type: 'json', required: true, visibility: 'user-or-llm', description: 'Fields to update as JSON object (e.g., {"state": "2", "priority": "1"})', }, }, request: { url: (params) => { const baseUrl = params.instanceUrl.trim().replace(/\/$/, '') if (!baseUrl) { throw new Error('ServiceNow instance URL is required') } return `${baseUrl}/api/now/table/${params.tableName.trim()}/${params.sysId.trim()}` }, method: 'PATCH', headers: (params) => { if (!params.username || !params.password) { throw new Error('ServiceNow username and password are required') } return { Authorization: createBasicAuthHeader(params.username, params.password), 'Content-Type': 'application/json', Accept: 'application/json', } }, body: (params) => { if (!params.fields || typeof params.fields !== 'object') { throw new Error('Fields must be a JSON object') } return params.fields }, }, transformResponse: async (response: Response, params?: ServiceNowUpdateParams) => { try { const data = await response.json() if (!response.ok) { const error = data.error || data throw new Error(typeof error === 'string' ? error : error.message || JSON.stringify(error)) } return { success: true, output: { record: data.result, metadata: { recordCount: 1, updatedFields: params ? Object.keys(params.fields || {}) : [], }, }, } } catch (error) { logger.error('ServiceNow update record - Error processing response:', { error }) throw error } }, outputs: { record: { type: 'json', description: 'Updated ServiceNow record', }, metadata: { type: 'json', description: 'Operation metadata', }, }, }