| import { getSkillToolCommands } from '../../commands.js' | |
| import { | |
| type AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS, | |
| type AnalyticsMetadata_I_VERIFIED_THIS_IS_PII_TAGGED, | |
| logEvent, | |
| } from '../../services/analytics/index.js' | |
| import { getCharBudget } from '../../tools/SkillTool/prompt.js' | |
| /** | |
| * Logs a tengu_skill_loaded event for each skill available at session startup. | |
| * This enables analytics on which skills are available across sessions. | |
| */ | |
| export async function logSkillsLoaded( | |
| cwd: string, | |
| contextWindowTokens: number, | |
| ): Promise<void> { | |
| const skills = await getSkillToolCommands(cwd) | |
| const skillBudget = getCharBudget(contextWindowTokens) | |
| for (const skill of skills) { | |
| if (skill.type !== 'prompt') continue | |
| logEvent('tengu_skill_loaded', { | |
| // _PROTO_skill_name routes to the privileged skill_name BQ column. | |
| // Unredacted names don't go in additional_metadata. | |
| _PROTO_skill_name: | |
| skill.name as AnalyticsMetadata_I_VERIFIED_THIS_IS_PII_TAGGED, | |
| skill_source: | |
| skill.source as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS, | |
| skill_loaded_from: | |
| skill.loadedFrom as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS, | |
| skill_budget: skillBudget, | |
| ...(skill.kind && { | |
| skill_kind: | |
| skill.kind as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS, | |
| }), | |
| }) | |
| } | |
| } | |