72 lines
2.2 KiB
TypeScript
72 lines
2.2 KiB
TypeScript
import { createHash } from 'crypto'
|
|
import type { AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS } from 'src/services/analytics/index.js'
|
|
import { logEvent } from 'src/services/analytics/index.js'
|
|
|
|
/**
|
|
* Creates a truncated SHA256 hash (16 chars) for file paths
|
|
* Used for privacy-preserving analytics on file operations
|
|
*/
|
|
function hashFilePath(
|
|
filePath: string,
|
|
): AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS {
|
|
return createHash('sha256')
|
|
.update(filePath)
|
|
.digest('hex')
|
|
.slice(0, 16) as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS
|
|
}
|
|
|
|
/**
|
|
* Creates a full SHA256 hash (64 chars) for file contents
|
|
* Used for deduplication and change detection analytics
|
|
*/
|
|
function hashFileContent(
|
|
content: string,
|
|
): AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS {
|
|
return createHash('sha256')
|
|
.update(content)
|
|
.digest('hex') as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS
|
|
}
|
|
|
|
// Maximum content size to hash (100KB)
|
|
// Prevents memory exhaustion when hashing large files (e.g., base64-encoded images)
|
|
const MAX_CONTENT_HASH_SIZE = 100 * 1024
|
|
|
|
/**
|
|
* Logs file operation analytics to Statsig
|
|
*/
|
|
export function logFileOperation(params: {
|
|
operation: 'read' | 'write' | 'edit'
|
|
tool: 'FileReadTool' | 'FileWriteTool' | 'FileEditTool'
|
|
filePath: string
|
|
content?: string
|
|
type?: 'create' | 'update'
|
|
}): void {
|
|
const metadata: Record<
|
|
string,
|
|
| AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS
|
|
| number
|
|
| boolean
|
|
> = {
|
|
operation:
|
|
params.operation as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
tool: params.tool as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
filePathHash: hashFilePath(params.filePath),
|
|
}
|
|
|
|
// Only hash content if it's provided and below size limit
|
|
// This prevents memory exhaustion from hashing large files (e.g., base64-encoded images)
|
|
if (
|
|
params.content !== undefined &&
|
|
params.content.length <= MAX_CONTENT_HASH_SIZE
|
|
) {
|
|
metadata.contentHash = hashFileContent(params.content)
|
|
}
|
|
|
|
if (params.type !== undefined) {
|
|
metadata.type =
|
|
params.type as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS
|
|
}
|
|
|
|
logEvent('tengu_file_operation', metadata)
|
|
}
|