Function: safeWriteProgress()
safeWriteProgress(
log,writer,toolCallId,event,context?):Promise<void>
Best-effort native custom progress write. No-op when the writer or owning
tool call id is unavailable;
caught errors are logged via log.warn("writer:error", ...)
along with any caller-supplied context fields (e.g. a
chartId or messageId) so the warning is greppable per
resource.
Returns when the write resolves or rejects; never throws.
Parameters
Section titled “Parameters”Logger
writer
Section titled “writer”ToolStream | undefined
toolCallId
Section titled “toolCallId”string | undefined
{ content: string; conversation_id?: string; message_id?: string; space_id: string; type: "question"; } | { conversation_id?: string; message: { attachments?: object[]; auto_regenerate_count?: number; content: string; conversation_id: string; created_timestamp?: number; error?: { error?: string; type?: "BLOCK_MULTIPLE_EXECUTIONS_EXCEPTION" | "CHAT_COMPLETION_CLIENT_EXCEPTION" | "CHAT_COMPLETION_CLIENT_TIMEOUT_EXCEPTION" | "CHAT_COMPLETION_NETWORK_EXCEPTION" | "CONTENT_FILTER_EXCEPTION" | "CONTEXT_EXCEEDED_EXCEPTION" | "COULD_NOT_GET_MODEL_DEPLOYMENTS_EXCEPTION" | "COULD_NOT_GET_UC_SCHEMA_EXCEPTION" | "DEPLOYMENT_NOT_FOUND_EXCEPTION" | "DESCRIBE_QUERY_INVALID_SQL_ERROR" | "DESCRIBE_QUERY_TIMEOUT" | "DESCRIBE_QUERY_UNEXPECTED_FAILURE" | "EXCEEDED_MAX_TOKEN_LENGTH_EXCEPTION" | "FUNCTIONS_NOT_AVAILABLE_EXCEPTION" | "FUNCTION_ARGUMENTS_INVALID_EXCEPTION" | "FUNCTION_ARGUMENTS_INVALID_JSON_EXCEPTION" | "FUNCTION_ARGUMENTS_INVALID_TYPE_EXCEPTION" | "FUNCTION_CALL_MISSING_PARAMETER_EXCEPTION" | "GENERATED_SQL_QUERY_TOO_LONG_EXCEPTION" | "GENERIC_CHAT_COMPLETION_EXCEPTION" | "GENERIC_CHAT_COMPLETION_SERVICE_EXCEPTION" | "GENERIC_SQL_EXEC_API_CALL_EXCEPTION" | "ILLEGAL_PARAMETER_DEFINITION_EXCEPTION" | "INTERNAL_CATALOG_ASSET_CREATION_FAILED_EXCEPTION" | "INTERNAL_CATALOG_ASSET_CREATION_ONGOING_EXCEPTION" | "INTERNAL_CATALOG_ASSET_CREATION_UNSUPPORTED_EXCEPTION" | "INTERNAL_CATALOG_MISSING_UC_PATH_EXCEPTION" | "INTERNAL_CATALOG_PATH_OVERLAP_EXCEPTION" | "INVALID_CERTIFIED_ANSWER_FUNCTION_EXCEPTION" | "INVALID_CERTIFIED_ANSWER_IDENTIFIER_EXCEPTION" | "INVALID_CHAT_COMPLETION_ARGUMENTS_JSON_EXCEPTION" | "INVALID_CHAT_COMPLETION_JSON_EXCEPTION" | "INVALID_COMPLETION_REQUEST_EXCEPTION" | "INVALID_FUNCTION_CALL_EXCEPTION" | "INVALID_SQL_MULTIPLE_DATASET_REFERENCES_EXCEPTION" | "INVALID_SQL_MULTIPLE_STATEMENTS_EXCEPTION" | "INVALID_SQL_UNKNOWN_TABLE_EXCEPTION" | "INVALID_TABLE_IDENTIFIER_EXCEPTION" | "LOCAL_CONTEXT_EXCEEDED_EXCEPTION" | "MESSAGE_ATTACHMENT_TOO_LONG_ERROR" | "MESSAGE_CANCELLED_WHILE_EXECUTING_EXCEPTION" | "MESSAGE_DELETED_WHILE_EXECUTING_EXCEPTION" | "MESSAGE_UPDATED_WHILE_EXECUTING_EXCEPTION" | "MISSING_SQL_QUERY_EXCEPTION" | "NO_DEPLOYMENTS_AVAILABLE_TO_WORKSPACE" | "NO_QUERY_TO_VISUALIZE_EXCEPTION" | "NO_TABLES_TO_QUERY_EXCEPTION" | "RATE_LIMIT_EXCEEDED_GENERIC_EXCEPTION" | "RATE_LIMIT_EXCEEDED_SPECIFIED_WAIT_EXCEPTION" | "REPLY_PROCESS_TIMEOUT_EXCEPTION" | "RETRYABLE_PROCESSING_EXCEPTION" | "SQL_EXECUTION_EXCEPTION" | "STOP_PROCESS_DUE_TO_AUTO_REGENERATE" | "TABLES_MISSING_EXCEPTION" | "TOO_MANY_CERTIFIED_ANSWERS_EXCEPTION" | "TOO_MANY_TABLES_EXCEPTION" | "UNEXPECTED_REPLY_PROCESS_EXCEPTION" | "UNKNOWN_AI_MODEL" | "UNSUPPORTED_CONVERSATION_TYPE_EXCEPTION" | "WAREHOUSE_ACCESS_MISSING_EXCEPTION" | "WAREHOUSE_NOT_FOUND_EXCEPTION"; }; feedback?: { rating?: "NONE" | "NEGATIVE" | "POSITIVE"; }; id: string; last_updated_timestamp?: number; message_id: string; query_result?: { is_truncated?: boolean; row_count?: number; statement_id?: string; statement_id_signature?: string; }; space_id: string; status?: "ASKING_AI" | "CANCELLED" | "COMPLETED" | "EXECUTING_QUERY" | "FAILED" | "FETCHING_METADATA" | "FILTERING_CONTEXT" | "PENDING_WAREHOUSE" | "QUERY_RESULT_EXPIRED" | "SUBMITTED"; user_id?: number; }; message_id?: string; space_id: string; type: "message"; } | { conversation_id?: string; message_id?: string; previous_status?: "ASKING_AI" | "CANCELLED" | "COMPLETED" | "EXECUTING_QUERY" | "FAILED" | "FETCHING_METADATA" | "FILTERING_CONTEXT" | "PENDING_WAREHOUSE" | "QUERY_RESULT_EXPIRED" | "SUBMITTED"; space_id: string; status: "ASKING_AI" | "CANCELLED" | "COMPLETED" | "EXECUTING_QUERY" | "FAILED" | "FETCHING_METADATA" | "FILTERING_CONTEXT" | "PENDING_WAREHOUSE" | "QUERY_RESULT_EXPIRED" | "SUBMITTED"; type: "status"; } | { attachment_id?: string; attachment_type: string; conversation_id?: string; index: number; message_id?: string; space_id: string; type: "attachment"; } | { attachment_id?: string; conversation_id?: string; message_id?: string; space_id: string; text: string; thought_type: string; type: "thinking"; } | { attachment_id?: string; conversation_id?: string; message_id?: string; space_id: string; text: string; type: "text"; } | { attachment_id?: string; conversation_id?: string; description?: string; message_id?: string; space_id: string; sql: string; title?: string; type: "query"; } | { attachment_id?: string; conversation_id?: string; message_id?: string; space_id: string; statement_id: string; type: "statement"; } | { attachment_id?: string; conversation_id?: string; message_id?: string; previous_row_count?: number; row_count: number; space_id: string; statement_id?: string; type: "rows"; } | { attachment_id?: string; conversation_id?: string; message_id?: string; questions: string[]; space_id: string; type: "suggested_questions"; } | { conversation_id?: string; message: { attachments?: object[]; auto_regenerate_count?: number; content: string; conversation_id: string; created_timestamp?: number; error?: { error?: string; type?: "BLOCK_MULTIPLE_EXECUTIONS_EXCEPTION" | "CHAT_COMPLETION_CLIENT_EXCEPTION" | "CHAT_COMPLETION_CLIENT_TIMEOUT_EXCEPTION" | "CHAT_COMPLETION_NETWORK_EXCEPTION" | "CONTENT_FILTER_EXCEPTION" | "CONTEXT_EXCEEDED_EXCEPTION" | "COULD_NOT_GET_MODEL_DEPLOYMENTS_EXCEPTION" | "COULD_NOT_GET_UC_SCHEMA_EXCEPTION" | "DEPLOYMENT_NOT_FOUND_EXCEPTION" | "DESCRIBE_QUERY_INVALID_SQL_ERROR" | "DESCRIBE_QUERY_TIMEOUT" | "DESCRIBE_QUERY_UNEXPECTED_FAILURE" | "EXCEEDED_MAX_TOKEN_LENGTH_EXCEPTION" | "FUNCTIONS_NOT_AVAILABLE_EXCEPTION" | "FUNCTION_ARGUMENTS_INVALID_EXCEPTION" | "FUNCTION_ARGUMENTS_INVALID_JSON_EXCEPTION" | "FUNCTION_ARGUMENTS_INVALID_TYPE_EXCEPTION" | "FUNCTION_CALL_MISSING_PARAMETER_EXCEPTION" | "GENERATED_SQL_QUERY_TOO_LONG_EXCEPTION" | "GENERIC_CHAT_COMPLETION_EXCEPTION" | "GENERIC_CHAT_COMPLETION_SERVICE_EXCEPTION" | "GENERIC_SQL_EXEC_API_CALL_EXCEPTION" | "ILLEGAL_PARAMETER_DEFINITION_EXCEPTION" | "INTERNAL_CATALOG_ASSET_CREATION_FAILED_EXCEPTION" | "INTERNAL_CATALOG_ASSET_CREATION_ONGOING_EXCEPTION" | "INTERNAL_CATALOG_ASSET_CREATION_UNSUPPORTED_EXCEPTION" | "INTERNAL_CATALOG_MISSING_UC_PATH_EXCEPTION" | "INTERNAL_CATALOG_PATH_OVERLAP_EXCEPTION" | "INVALID_CERTIFIED_ANSWER_FUNCTION_EXCEPTION" | "INVALID_CERTIFIED_ANSWER_IDENTIFIER_EXCEPTION" | "INVALID_CHAT_COMPLETION_ARGUMENTS_JSON_EXCEPTION" | "INVALID_CHAT_COMPLETION_JSON_EXCEPTION" | "INVALID_COMPLETION_REQUEST_EXCEPTION" | "INVALID_FUNCTION_CALL_EXCEPTION" | "INVALID_SQL_MULTIPLE_DATASET_REFERENCES_EXCEPTION" | "INVALID_SQL_MULTIPLE_STATEMENTS_EXCEPTION" | "INVALID_SQL_UNKNOWN_TABLE_EXCEPTION" | "INVALID_TABLE_IDENTIFIER_EXCEPTION" | "LOCAL_CONTEXT_EXCEEDED_EXCEPTION" | "MESSAGE_ATTACHMENT_TOO_LONG_ERROR" | "MESSAGE_CANCELLED_WHILE_EXECUTING_EXCEPTION" | "MESSAGE_DELETED_WHILE_EXECUTING_EXCEPTION" | "MESSAGE_UPDATED_WHILE_EXECUTING_EXCEPTION" | "MISSING_SQL_QUERY_EXCEPTION" | "NO_DEPLOYMENTS_AVAILABLE_TO_WORKSPACE" | "NO_QUERY_TO_VISUALIZE_EXCEPTION" | "NO_TABLES_TO_QUERY_EXCEPTION" | "RATE_LIMIT_EXCEEDED_GENERIC_EXCEPTION" | "RATE_LIMIT_EXCEEDED_SPECIFIED_WAIT_EXCEPTION" | "REPLY_PROCESS_TIMEOUT_EXCEPTION" | "RETRYABLE_PROCESSING_EXCEPTION" | "SQL_EXECUTION_EXCEPTION" | "STOP_PROCESS_DUE_TO_AUTO_REGENERATE" | "TABLES_MISSING_EXCEPTION" | "TOO_MANY_CERTIFIED_ANSWERS_EXCEPTION" | "TOO_MANY_TABLES_EXCEPTION" | "UNEXPECTED_REPLY_PROCESS_EXCEPTION" | "UNKNOWN_AI_MODEL" | "UNSUPPORTED_CONVERSATION_TYPE_EXCEPTION" | "WAREHOUSE_ACCESS_MISSING_EXCEPTION" | "WAREHOUSE_NOT_FOUND_EXCEPTION"; }; feedback?: { rating?: "NONE" | "NEGATIVE" | "POSITIVE"; }; id: string; last_updated_timestamp?: number; message_id: string; query_result?: { is_truncated?: boolean; row_count?: number; statement_id?: string; statement_id_signature?: string; }; space_id: string; status?: "ASKING_AI" | "CANCELLED" | "COMPLETED" | "EXECUTING_QUERY" | "FAILED" | "FETCHING_METADATA" | "FILTERING_CONTEXT" | "PENDING_WAREHOUSE" | "QUERY_RESULT_EXPIRED" | "SUBMITTED"; user_id?: number; }; message_id?: string; space_id: string; status: "CANCELLED" | "COMPLETED" | "FAILED"; type: "result"; } | { content: string; conversationId?: string; messageId?: string; spaceId: string; type: "started"; } | { answer?: string; conversationId?: string; messageId?: string; spaceId: string; statementIds: string[]; status: "ASKING_AI" | "CANCELLED" | "COMPLETED" | "EXECUTING_QUERY" | "FAILED" | "FETCHING_METADATA" | "FILTERING_CONTEXT" | "PENDING_WAREHOUSE" | "QUERY_RESULT_EXPIRED" | "SUBMITTED"; type: "ask_genie_done"; } | { conversationId?: string; error: string; messageId?: string; spaceId?: string; type: "error"; } | { dataItems: number; items: number; spaceId: string; textItems: number; type: "summary"; }
context?
Section titled “context?”Record<string, unknown> = {}
Returns
Section titled “Returns”Promise<void>