airbyte-faros-destination 0.23.20 → 0.23.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,4 +5,5 @@ export declare class AnalyticsSkills extends ClaudeConverter {
5
5
  readonly destinationModels: ReadonlyArray<DestinationModel>;
6
6
  id(record: AirbyteRecord): string;
7
7
  convert(record: AirbyteRecord, ctx: StreamContext): Promise<ReadonlyArray<DestinationRecord>>;
8
+ private skillMetric;
8
9
  }
@@ -3,9 +3,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.AnalyticsSkills = void 0;
4
4
  const common_1 = require("faros-airbyte-common/common");
5
5
  const faros_js_client_1 = require("faros-js-client");
6
+ const lodash_1 = require("lodash");
6
7
  const vcs_1 = require("../common/vcs");
7
8
  const common_2 = require("./common");
8
9
  const DAY_MS = 24 * 60 * 60 * 1000;
10
+ const SESSIONS_DETAIL = 'analytics_skills';
11
+ const INVOCATIONS_DETAIL = 'analytics_skills_invocations';
9
12
  class AnalyticsSkills extends common_2.ClaudeConverter {
10
13
  constructor() {
11
14
  super(...arguments);
@@ -15,13 +18,14 @@ class AnalyticsSkills extends common_2.ClaudeConverter {
15
18
  }
16
19
  id(record) {
17
20
  const item = record.record.data;
18
- return `${item.date}__${item.skill_name}`;
21
+ const scope = item.user_id || 'organization';
22
+ return `${item.date}__${item.skill_name}__${scope}`;
19
23
  }
20
24
  async convert(record, ctx) {
21
25
  const item = record.record.data;
22
- // Only write Claude Code metrics (skip chat-only skills)
23
- const claudeCodeUsageCount = item.claude_code_metrics?.distinct_session_skill_used_count ?? 0;
24
- if (claudeCodeUsageCount <= 0) {
26
+ // User-grouped rows carry a user_id; drop any the source could not resolve
27
+ // to an email, since every other Claude metric keys vcs_User on email
28
+ if (item.user_id && !item.user_email) {
25
29
  return [];
26
30
  }
27
31
  const day = faros_js_client_1.Utils.toDate(item.date);
@@ -29,37 +33,72 @@ class AnalyticsSkills extends common_2.ClaudeConverter {
29
33
  uid: this.streamName.source,
30
34
  source: this.streamName.source,
31
35
  };
32
- const feature = `skill:${item.skill_name}`;
33
- return [
34
- {
35
- model: 'vcs_AssistantMetric',
36
- record: {
37
- uid: (0, common_1.digest)([
38
- vcs_1.VCSToolDetail.ClaudeCode,
39
- vcs_1.AssistantMetric.Usages,
40
- 'analytics_skills',
41
- day.toISOString(),
42
- organization.uid,
43
- feature,
44
- ].join('__')),
45
- source: this.source,
46
- startedAt: day,
47
- endedAt: faros_js_client_1.Utils.toDate(day.getTime() + DAY_MS),
48
- type: {
49
- category: vcs_1.AssistantMetric.Usages,
50
- detail: 'analytics_skills',
51
- },
52
- valueType: 'Int',
53
- value: String(claudeCodeUsageCount),
54
- organization,
55
- tool: {
56
- category: vcs_1.VCSToolCategory.CodingAssistant,
57
- detail: vcs_1.VCSToolDetail.ClaudeCode,
58
- },
59
- feature,
36
+ // skill_name is an opaque id for user- and organization-scoped skills
37
+ const feature = `skill:${item.skill_display_name ?? item.skill_name}`;
38
+ const res = [];
39
+ const sessionCount = item.claude_code_metrics?.distinct_session_skill_used_count ?? 0;
40
+ if (sessionCount > 0) {
41
+ res.push(this.skillMetric({
42
+ day,
43
+ detail: SESSIONS_DETAIL,
44
+ value: sessionCount,
45
+ organization,
46
+ feature,
47
+ skillName: item.skill_name,
48
+ userEmail: item.user_email,
49
+ }));
50
+ }
51
+ // Null when invocation reporting is not enabled for the organization
52
+ if (!(0, lodash_1.isNil)(item.invocation_count) && item.invocation_count > 0) {
53
+ res.push(this.skillMetric({
54
+ day,
55
+ detail: INVOCATIONS_DETAIL,
56
+ value: item.invocation_count,
57
+ organization,
58
+ feature,
59
+ skillName: item.skill_name,
60
+ userEmail: item.user_email,
61
+ }));
62
+ }
63
+ return res;
64
+ }
65
+ skillMetric(config) {
66
+ const { day, detail, value, organization, feature, skillName, userEmail } = config;
67
+ const uidParts = [
68
+ vcs_1.VCSToolDetail.ClaudeCode,
69
+ vcs_1.AssistantMetric.Usages,
70
+ detail,
71
+ day.toISOString(),
72
+ organization.uid,
73
+ `skill:${skillName}`,
74
+ ];
75
+ if (userEmail) {
76
+ uidParts.push(userEmail);
77
+ }
78
+ return {
79
+ model: 'vcs_AssistantMetric',
80
+ record: {
81
+ uid: (0, common_1.digest)(uidParts.join('__')),
82
+ source: this.source,
83
+ startedAt: day,
84
+ endedAt: faros_js_client_1.Utils.toDate(day.getTime() + DAY_MS),
85
+ type: {
86
+ category: vcs_1.AssistantMetric.Usages,
87
+ detail,
88
+ },
89
+ valueType: 'Int',
90
+ value: String(value),
91
+ organization,
92
+ ...(userEmail && {
93
+ user: { uid: userEmail, source: this.streamName.source },
94
+ }),
95
+ tool: {
96
+ category: vcs_1.VCSToolCategory.CodingAssistant,
97
+ detail: vcs_1.VCSToolDetail.ClaudeCode,
60
98
  },
99
+ feature,
61
100
  },
62
- ];
101
+ };
63
102
  }
64
103
  }
65
104
  exports.AnalyticsSkills = AnalyticsSkills;
@@ -1 +1 @@
1
- {"version":3,"file":"analytics_skills.js","sourceRoot":"","sources":["../../../src/converters/claude/analytics_skills.ts"],"names":[],"mappings":";;;AAEA,wDAAmD;AACnD,qDAAsC;AAEtC,uCAA8E;AAE9E,qCAAyC;AAEzC,MAAM,MAAM,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAOnC,MAAa,eAAgB,SAAQ,wBAAe;IAApD;;QACW,sBAAiB,GAAoC;YAC5D,qBAAqB;SACtB,CAAC;IA8DJ,CAAC;IA5DC,EAAE,CAAC,MAAqB;QACtB,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,IAA6B,CAAC;QACzD,OAAO,GAAG,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,UAAU,EAAE,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,OAAO,CACX,MAAqB,EACrB,GAAkB;QAElB,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,IAA6B,CAAC;QAEzD,yDAAyD;QACzD,MAAM,oBAAoB,GACxB,IAAI,CAAC,mBAAmB,EAAE,iCAAiC,IAAI,CAAC,CAAC;QAEnE,IAAI,oBAAoB,IAAI,CAAC,EAAE,CAAC;YAC9B,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,GAAG,GAAG,uBAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,YAAY,GAAG;YACnB,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM;YAC3B,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM;SAC/B,CAAC;QAEF,MAAM,OAAO,GAAG,SAAS,IAAI,CAAC,UAAU,EAAE,CAAC;QAE3C,OAAO;YACL;gBACE,KAAK,EAAE,qBAAqB;gBAC5B,MAAM,EAAE;oBACN,GAAG,EAAE,IAAA,eAAM,EACT;wBACE,mBAAa,CAAC,UAAU;wBACxB,qBAAe,CAAC,MAAM;wBACtB,kBAAkB;wBAClB,GAAG,CAAC,WAAW,EAAE;wBACjB,YAAY,CAAC,GAAG;wBAChB,OAAO;qBACR,CAAC,IAAI,CAAC,IAAI,CAAC,CACb;oBACD,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,SAAS,EAAE,GAAG;oBACd,OAAO,EAAE,uBAAK,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC;oBAC7C,IAAI,EAAE;wBACJ,QAAQ,EAAE,qBAAe,CAAC,MAAM;wBAChC,MAAM,EAAE,kBAAkB;qBAC3B;oBACD,SAAS,EAAE,KAAK;oBAChB,KAAK,EAAE,MAAM,CAAC,oBAAoB,CAAC;oBACnC,YAAY;oBACZ,IAAI,EAAE;wBACJ,QAAQ,EAAE,qBAAe,CAAC,eAAe;wBACzC,MAAM,EAAE,mBAAa,CAAC,UAAU;qBACjC;oBACD,OAAO;iBACR;aACF;SACF,CAAC;IACJ,CAAC;CACF;AAjED,0CAiEC"}
1
+ {"version":3,"file":"analytics_skills.js","sourceRoot":"","sources":["../../../src/converters/claude/analytics_skills.ts"],"names":[],"mappings":"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"}