/ utils / telemetry / skillLoadedEvent.ts
skillLoadedEvent.ts
 1  import { getSkillToolCommands } from '../../commands.js'
 2  import {
 3    type AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
 4    type AnalyticsMetadata_I_VERIFIED_THIS_IS_PII_TAGGED,
 5    logEvent,
 6  } from '../../services/analytics/index.js'
 7  import { getCharBudget } from '../../tools/SkillTool/prompt.js'
 8  
 9  /**
10   * Logs a tengu_skill_loaded event for each skill available at session startup.
11   * This enables analytics on which skills are available across sessions.
12   */
13  export async function logSkillsLoaded(
14    cwd: string,
15    contextWindowTokens: number,
16  ): Promise<void> {
17    const skills = await getSkillToolCommands(cwd)
18    const skillBudget = getCharBudget(contextWindowTokens)
19  
20    for (const skill of skills) {
21      if (skill.type !== 'prompt') continue
22  
23      logEvent('tengu_skill_loaded', {
24        // _PROTO_skill_name routes to the privileged skill_name BQ column.
25        // Unredacted names don't go in additional_metadata.
26        _PROTO_skill_name:
27          skill.name as AnalyticsMetadata_I_VERIFIED_THIS_IS_PII_TAGGED,
28        skill_source:
29          skill.source as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
30        skill_loaded_from:
31          skill.loadedFrom as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
32        skill_budget: skillBudget,
33        ...(skill.kind && {
34          skill_kind:
35            skill.kind as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
36        }),
37      })
38    }
39  }