@sentropic/agent-stats-core 0.1.0 → 0.2.0

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.
Files changed (47) hide show
  1. package/dist/aggregations.d.ts +13 -2
  2. package/dist/aggregations.d.ts.map +1 -1
  3. package/dist/aggregations.js +31 -6
  4. package/dist/aggregations.js.map +1 -1
  5. package/dist/anomalies.d.ts +2 -2
  6. package/dist/anomalies.d.ts.map +1 -1
  7. package/dist/cleanser.d.ts +6 -0
  8. package/dist/cleanser.d.ts.map +1 -1
  9. package/dist/cleanser.js +2 -1
  10. package/dist/cleanser.js.map +1 -1
  11. package/dist/collect.d.ts +5 -3
  12. package/dist/collect.d.ts.map +1 -1
  13. package/dist/collect.js +22 -2
  14. package/dist/collect.js.map +1 -1
  15. package/dist/index.d.ts +5 -2
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +5 -2
  18. package/dist/index.js.map +1 -1
  19. package/dist/parsers/claude.d.ts.map +1 -1
  20. package/dist/parsers/claude.js +11 -0
  21. package/dist/parsers/claude.js.map +1 -1
  22. package/dist/parsers/codex.d.ts.map +1 -1
  23. package/dist/parsers/codex.js +35 -36
  24. package/dist/parsers/codex.js.map +1 -1
  25. package/dist/parsers/cursor.d.ts +42 -0
  26. package/dist/parsers/cursor.d.ts.map +1 -0
  27. package/dist/parsers/cursor.js +222 -0
  28. package/dist/parsers/cursor.js.map +1 -0
  29. package/dist/rate-card.d.ts.map +1 -1
  30. package/dist/rate-card.js +15 -4
  31. package/dist/rate-card.js.map +1 -1
  32. package/dist/schema.d.ts +5 -1
  33. package/dist/schema.d.ts.map +1 -1
  34. package/dist/schema.js.map +1 -1
  35. package/dist/secrets.d.ts +40 -9
  36. package/dist/secrets.d.ts.map +1 -1
  37. package/dist/secrets.js +96 -10
  38. package/dist/secrets.js.map +1 -1
  39. package/dist/series.d.ts +40 -0
  40. package/dist/series.d.ts.map +1 -0
  41. package/dist/series.js +51 -0
  42. package/dist/series.js.map +1 -0
  43. package/dist/tool-stats.d.ts +21 -0
  44. package/dist/tool-stats.d.ts.map +1 -0
  45. package/dist/tool-stats.js +38 -0
  46. package/dist/tool-stats.js.map +1 -0
  47. package/package.json +3 -1
@@ -95,6 +95,14 @@ function normalizeCodexUsage(raw) {
95
95
  };
96
96
  }
97
97
  const sha256short = (text) => createHash('sha256').update(text).digest('hex').slice(0, 16);
98
+ /** Map a Codex `originator` to the local surface that produced the session. */
99
+ function codexSurface(originator) {
100
+ if (originator === 'codex_vscode')
101
+ return 'vscode';
102
+ if (originator === 'codex_exec')
103
+ return 'exec';
104
+ return 'cli'; // codex-tui, codex_cli_rs, unknown
105
+ }
98
106
  function categorizeCodexTool(name) {
99
107
  if (name.startsWith('mcp__') || name.startsWith('mcp_'))
100
108
  return 'mcp';
@@ -145,7 +153,9 @@ export async function* parseCodexRollout(opts) {
145
153
  sessionId,
146
154
  projectCwd,
147
155
  kind: 'session_start',
148
- ...(p.model_provider ? { model: p.model_provider } : {}),
156
+ // NB: `model_provider` is just "openai" the real model (gpt-5.x)
157
+ // arrives later in `turn_context` events, so we don't set it here.
158
+ surface: codexSurface(p.originator),
149
159
  ...(parentId ? { forkedFromId: parentId } : {}),
150
160
  ...(typeof depth === 'number' ? { subagentDepth: depth } : {}),
151
161
  ...(p.agent_nickname ? { agentNickname: p.agent_nickname } : {}),
@@ -155,6 +165,15 @@ export async function* parseCodexRollout(opts) {
155
165
  startEmitted = true;
156
166
  continue;
157
167
  }
168
+ if (rec.type === 'turn_context') {
169
+ // The actual model (gpt-5.4, gpt-5.3-codex, gpt-5.5, …) is declared per
170
+ // turn here, not in session_meta. Track it so turns carry the right model
171
+ // and the rate card can estimate cost.
172
+ const p = (rec.payload ?? {});
173
+ if (typeof p.model === 'string' && p.model)
174
+ model = p.model;
175
+ continue;
176
+ }
158
177
  if (rec.type === 'event_msg') {
159
178
  const p = (rec.payload ?? {});
160
179
  switch (p.type) {
@@ -193,40 +212,13 @@ export async function* parseCodexRollout(opts) {
193
212
  }
194
213
  break;
195
214
  }
196
- case 'mcp_tool_call_end': {
197
- const name = `mcp__${p.server ?? 'unknown'}__${p.tool ?? 'unknown'}`;
198
- const out = p.result ? JSON.stringify(p.result).length : 0;
199
- yield {
200
- ...base,
201
- kind: 'tool_call',
202
- name,
203
- category: 'mcp',
204
- outputBytes: out,
205
- };
206
- break;
207
- }
208
- case 'exec_command_end': {
209
- const out = (p.aggregated_output?.length ?? 0) + (p.stdout?.length ?? 0) + (p.stderr?.length ?? 0);
210
- const cmdArr = Array.isArray(p.command) ? p.command : [];
211
- const cmdName = typeof cmdArr[0] === 'string' ? cmdArr[0] : 'shell';
212
- yield {
213
- ...base,
214
- kind: 'tool_call',
215
- name: cmdName,
216
- category: 'bash',
217
- outputBytes: out,
218
- ...(typeof p.exit_code === 'number' && p.exit_code !== 0 ? { error: true } : {}),
219
- };
220
- break;
221
- }
222
- case 'web_search_end':
223
- yield {
224
- ...base,
225
- kind: 'tool_call',
226
- name: 'web_search',
227
- category: 'native',
228
- };
229
- break;
215
+ // NOTE: shell / mcp / web_search tool calls are NOT counted here.
216
+ // The `*_end` records (exec_command_end, mcp_tool_call_end,
217
+ // web_search_end) are execution RESULTS the actual model-issued tool
218
+ // calls are captured from `response_item` (function_call /
219
+ // custom_tool_call / web_search_call) below. Counting both would
220
+ // double-count (verified across the corpus: every rollout carrying
221
+ // exec_command_end also carries the matching function_call).
230
222
  default:
231
223
  break;
232
224
  }
@@ -234,7 +226,8 @@ export async function* parseCodexRollout(opts) {
234
226
  }
235
227
  if (rec.type === 'response_item') {
236
228
  const p = (rec.payload ?? {});
237
- if (p.type === 'function_call' && typeof p.name === 'string') {
229
+ if ((p.type === 'function_call' || p.type === 'custom_tool_call') &&
230
+ typeof p.name === 'string') {
238
231
  yield {
239
232
  ...base,
240
233
  kind: 'tool_call',
@@ -242,6 +235,12 @@ export async function* parseCodexRollout(opts) {
242
235
  category: categorizeCodexTool(p.name),
243
236
  };
244
237
  }
238
+ else if (p.type === 'web_search_call') {
239
+ yield { ...base, kind: 'tool_call', name: 'web_search', category: 'native' };
240
+ }
241
+ else if (p.type === 'tool_search_call') {
242
+ yield { ...base, kind: 'tool_call', name: 'tool_search', category: 'native' };
243
+ }
245
244
  continue;
246
245
  }
247
246
  if (rec.type === 'compacted') {
@@ -1 +1 @@
1
- {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/parsers/codex.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/parsers/codex.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAGtC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAgD1C;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAA0B,EAAE;IAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,wBAAwB,CAAC;IACnF,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACzE,IAAI,CAAC;QACH,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,MAAM,MAAM,GAAoC,EAAE,CAAC;QACnD,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,UAAU,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;YACxC,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;QAC5D,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,UAAU,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;YACxC,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;QAC5D,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBAClC,UAAU,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;gBACvC,MAAM,CAAC,WAAW,CAAC,GAAG,GAAG,IAAI,CAAC,UAAU,GAAG,CAAC;YAC9C,CAAC;iBAAM,CAAC;gBACN,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBAC9B,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC;YAClC,CAAC;QACH,CAAC;QACD,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3E,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClE,MAAM,GAAG,GAAG;;;;;QAKR,KAAK;;QAEL,KAAK;KACR,CAAC;QACF,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAmB,CAAC;QAC3D,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACtB,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,WAAW,EAAE,CAAC,CAAC,YAAY;YAC3B,GAAG,EAAE,CAAC,CAAC,GAAG;YACV,GAAG,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/C,SAAS,EAAE,CAAC,CAAC,UAAU;YACvB,SAAS,EAAE,CAAC,CAAC,UAAU;YACvB,UAAU,EAAE,CAAC,CAAC,WAAW;YACzB,UAAU,EAAE,CAAC,CAAC,aAAa,KAAK,UAAU;SAC3C,CAAC,CAAC,CAAC;IACN,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC;AAsED,SAAS,mBAAmB,CAAC,GAA8B;IACzD,IAAI,CAAC,GAAG;QAAE,OAAO,UAAU,CAAC;IAC5B,MAAM,MAAM,GAAG,GAAG,CAAC,mBAAmB,IAAI,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,IAAI,CAAC,CAAC;IACpC,OAAO;QACL,cAAc,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;QAC3C,iBAAiB,EAAE,MAAM;QACzB,gBAAgB,EAAE,CAAC,EAAE,gDAAgD;QACrE,YAAY,EAAE,GAAG,CAAC,aAAa,IAAI,CAAC;QACpC,eAAe,EAAE,GAAG,CAAC,uBAAuB,IAAI,CAAC;KAClD,CAAC;AACJ,CAAC;AAED,MAAM,WAAW,GAAG,CAAC,IAAY,EAAU,EAAE,CAC3C,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAE/D,+EAA+E;AAC/E,SAAS,YAAY,CAAC,UAA8B;IAClD,IAAI,UAAU,KAAK,cAAc;QAAE,OAAO,QAAQ,CAAC;IACnD,IAAI,UAAU,KAAK,YAAY;QAAE,OAAO,MAAM,CAAC;IAC/C,OAAO,KAAK,CAAC,CAAC,mCAAmC;AACnD,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAY;IACvC,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,KAAK,CAAC;IACtE,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,cAAc,IAAI,IAAI,KAAK,MAAM;QAAE,OAAO,MAAM,CAAC;IAClF,IACE,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAC/E,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CACjB;QAED,OAAO,QAAQ,CAAC;IAClB,OAAO,UAAU,CAAC;AACpB,CAAC;AASD;;GAEG;AACH,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,iBAAiB,CACtC,IAA8B;IAE9B,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IACrE,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;IAEnE,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC;IACjE,kEAAkE;IAClE,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAC9B,yEAAyE,CAC1E,CAAC;IACF,IAAI,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IACrF,IAAI,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC;IACvC,IAAI,KAAK,GAAG,SAAS,CAAC;IACtB,IAAI,MAA0B,CAAC;IAC/B,IAAI,YAAY,GAAG,KAAK,CAAC;IAEzB,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,EAAE,EAAE,CAAC;QAC5B,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YAAE,SAAS;QAC3B,IAAI,GAAc,CAAC;QACnB,IAAI,CAAC;YACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAc,CAAC;QACtC,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,MAAM,EAAE,GAAG,GAAG,CAAC,SAAS,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QACtD,MAAM,GAAG,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,EAAE,IAAI,EAAE,OAAgB,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;QAEnE,IAAI,GAAG,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;YAChC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAA4B,CAAC;YACzD,IAAI,CAAC,CAAC,EAAE;gBAAE,SAAS,GAAG,CAAC,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC,CAAC,GAAG;gBAAE,UAAU,GAAG,CAAC,CAAC,GAAG,CAAC;YAC9B,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,gBAAgB,CAAC;YACpE,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,CAAC;YACtD,MAAM,KAAK,GAAG,CAAC,CAAC,aAAa,KAAK,UAAU,CAAC;YAC7C,MAAM;gBACJ,GAAG,IAAI;gBACP,SAAS;gBACT,UAAU;gBACV,IAAI,EAAE,eAAe;gBACrB,mEAAmE;gBACnE,mEAAmE;gBACnE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,UAAU,CAAC;gBACnC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC/C,GAAG,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC9D,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChE,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvD,UAAU,EAAE,KAAK;aAClB,CAAC;YACF,YAAY,GAAG,IAAI,CAAC;YACpB,SAAS;QACX,CAAC;QAED,IAAI,GAAG,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;YAChC,wEAAwE;YACxE,0EAA0E;YAC1E,uCAAuC;YACvC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAA4B,CAAC;YACzD,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,CAAC,KAAK;gBAAE,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;YAC5D,SAAS;QACX,CAAC;QAED,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC7B,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAyB,CAAC;YACtD,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;gBACf,KAAK,aAAa,CAAC,CAAC,CAAC;oBACnB,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,gBAAgB,CAAC;oBACtC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;wBACrE,MAAM,GAAG,GAAG,CAAC,CAAC,WAAW,EAAE,OAAO,EAAE,YAAY,CAAC;wBACjD,MAAM,GAAG,GAAG,CAAC,CAAC,WAAW,EAAE,SAAS,EAAE,YAAY,CAAC;wBACnD,MAAM;4BACJ,GAAG,IAAI;4BACP,IAAI,EAAE,MAAM;4BACZ,KAAK;4BACL,KAAK,EAAE,mBAAmB,CAAC,IAAI,CAAC;4BAChC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,iBAAiB;gCAC3B,CAAC,CAAC,EAAE,UAAU,EAAE,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE;gCAC/D,CAAC,CAAC,EAAE,CAAC;4BACP,GAAG,CAAC,OAAO,GAAG,KAAK,QAAQ,IAAI,OAAO,GAAG,KAAK,QAAQ;gCACpD,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,cAAc,EAAE,GAAG,EAAE,gBAAgB,EAAE,GAAG,EAAE,EAAE;gCAC/D,CAAC,CAAC,EAAE,CAAC;yBACR,CAAC;oBACJ,CAAC;oBACD,MAAM;gBACR,CAAC;gBACD,KAAK,mBAAmB;oBACtB,MAAM,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;oBACtC,MAAM;gBACR,KAAK,cAAc,CAAC,CAAC,CAAC;oBACpB,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC5D,IAAI,IAAI,EAAE,CAAC;wBACT,MAAM;4BACJ,GAAG,IAAI;4BACP,IAAI,EAAE,aAAa;4BACnB,UAAU,EAAE,IAAI,CAAC,MAAM;4BACvB,QAAQ,EAAE,WAAW,CAAC,IAAI,CAAC;yBAC5B,CAAC;oBACJ,CAAC;oBACD,MAAM;gBACR,CAAC;gBACD,kEAAkE;gBAClE,4DAA4D;gBAC5D,uEAAuE;gBACvE,2DAA2D;gBAC3D,iEAAiE;gBACjE,mEAAmE;gBACnE,6DAA6D;gBAC7D;oBACE,MAAM;YACV,CAAC;YACD,SAAS;QACX,CAAC;QAED,IAAI,GAAG,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;YACjC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAA6B,CAAC;YAC1D,IACE,CAAC,CAAC,CAAC,IAAI,KAAK,eAAe,IAAI,CAAC,CAAC,IAAI,KAAK,kBAAkB,CAAC;gBAC7D,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,EAC1B,CAAC;gBACD,MAAM;oBACJ,GAAG,IAAI;oBACP,IAAI,EAAE,WAAW;oBACjB,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,QAAQ,EAAE,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC;iBACtC,CAAC;YACJ,CAAC;iBAAM,IAAI,CAAC,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;gBACxC,MAAM,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;YAC/E,CAAC;iBAAM,IAAI,CAAC,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;gBACzC,MAAM,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;YAChF,CAAC;YACD,SAAS;QACX,CAAC;QAED,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC7B,MAAM,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;YACtC,SAAS;QACX,CAAC;IACH,CAAC;IAED,IAAI,YAAY,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM;YACJ,IAAI,EAAE,aAAa;YACnB,EAAE,EAAE,MAAM;YACV,IAAI,EAAE,OAAO;YACb,SAAS;YACT,UAAU;SACX,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Cursor parser. Cursor stores its chat history in a single global SQLite DB
3
+ * (`~/.config/Cursor/User/globalStorage/state.vscdb`, table `cursorDiskKV`):
4
+ * - `composerData:<id>` → a session (createdAt ms, fullConversationHeadersOnly,
5
+ * context with attached file URIs).
6
+ * - `bubbleId:<composerId>:<bubbleId>` → a message (type 1=user, 2=assistant,
7
+ * tokenCount: { inputTokens, outputTokens }).
8
+ *
9
+ * Cursor exposes neither the model nor a cost/credit, so cursor rows carry
10
+ * tokens + sessions + messages only (model `unknown` → estimateCost = 0).
11
+ *
12
+ * The schema is undocumented, so every access is defensive.
13
+ */
14
+ import Database from 'better-sqlite3';
15
+ import type { SessionEvent } from '../schema.js';
16
+ export interface IndexCursorOptions {
17
+ /** Override `~/.config/Cursor/User`. */
18
+ cursorStateDir?: string;
19
+ since?: Date;
20
+ until?: Date;
21
+ projectCwd?: string;
22
+ }
23
+ export interface CursorIndexEntry {
24
+ sessionId: string;
25
+ createdAt: number;
26
+ ts: string;
27
+ projectCwd: string;
28
+ }
29
+ export declare function defaultCursorDbPath(stateDir?: string): string;
30
+ /**
31
+ * Read composer sessions from the Cursor global DB. Returns metadata only;
32
+ * call `parseCursorComposer` to stream a session's events.
33
+ */
34
+ export declare function indexCursorSessions(opts?: IndexCursorOptions): CursorIndexEntry[];
35
+ /**
36
+ * Stream the events of one composer session. Needs an open DB handle (so the
37
+ * caller can reuse it across sessions).
38
+ */
39
+ export declare function parseCursorComposer(db: Database.Database, entry: CursorIndexEntry): SessionEvent[];
40
+ /** Open the DB once and yield events for all matching composer sessions. */
41
+ export declare function collectCursorEvents(opts?: IndexCursorOptions): AsyncGenerator<SessionEvent, void, unknown>;
42
+ //# sourceMappingURL=cursor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../../src/parsers/cursor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAEtC,OAAO,KAAK,EAAE,YAAY,EAAS,MAAM,cAAc,CAAC;AAKxD,MAAM,WAAW,kBAAkB;IACjC,wCAAwC;IACxC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,IAAI,CAAC;IACb,KAAK,CAAC,EAAE,IAAI,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;CACpB;AAUD,wBAAgB,mBAAmB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAE7D;AAmED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,GAAE,kBAAuB,GAAG,gBAAgB,EAAE,CAkCrF;AAmBD;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE,gBAAgB,GACtB,YAAY,EAAE,CA0ChB;AAED,4EAA4E;AAC5E,wBAAuB,mBAAmB,CACxC,IAAI,GAAE,kBAAuB,GAC5B,cAAc,CAAC,YAAY,EAAE,IAAI,EAAE,OAAO,CAAC,CAiB7C"}
@@ -0,0 +1,222 @@
1
+ /**
2
+ * Cursor parser. Cursor stores its chat history in a single global SQLite DB
3
+ * (`~/.config/Cursor/User/globalStorage/state.vscdb`, table `cursorDiskKV`):
4
+ * - `composerData:<id>` → a session (createdAt ms, fullConversationHeadersOnly,
5
+ * context with attached file URIs).
6
+ * - `bubbleId:<composerId>:<bubbleId>` → a message (type 1=user, 2=assistant,
7
+ * tokenCount: { inputTokens, outputTokens }).
8
+ *
9
+ * Cursor exposes neither the model nor a cost/credit, so cursor rows carry
10
+ * tokens + sessions + messages only (model `unknown` → estimateCost = 0).
11
+ *
12
+ * The schema is undocumented, so every access is defensive.
13
+ */
14
+ import { createHash } from 'node:crypto';
15
+ import os from 'node:os';
16
+ import path from 'node:path';
17
+ import Database from 'better-sqlite3';
18
+ const sha256short = (text) => createHash('sha256').update(text).digest('hex').slice(0, 16);
19
+ function defaultStateDir() {
20
+ // Env override lets the test suite point at an empty dir so collect() does
21
+ // not read the real ~/.config/Cursor during tests.
22
+ return (process.env['AGENT_STATS_CURSOR_DIR'] ?? path.join(os.homedir(), '.config', 'Cursor', 'User'));
23
+ }
24
+ export function defaultCursorDbPath(stateDir) {
25
+ return path.join(stateDir ?? defaultStateDir(), 'globalStorage', 'state.vscdb');
26
+ }
27
+ function parseJson(v) {
28
+ if (v == null)
29
+ return null;
30
+ const s = typeof v === 'string' ? v : Buffer.isBuffer(v) ? v.toString('utf8') : null;
31
+ if (s == null)
32
+ return null;
33
+ try {
34
+ return JSON.parse(s);
35
+ }
36
+ catch {
37
+ return null;
38
+ }
39
+ }
40
+ /** Recursively collect `file://` URIs / absolute paths from a composer's context. */
41
+ function collectFilePaths(node, out, depth = 0) {
42
+ if (depth > 6 || out.length > 200)
43
+ return;
44
+ if (typeof node === 'string') {
45
+ if (node.startsWith('file:///')) {
46
+ try {
47
+ out.push(decodeURIComponent(node.slice('file://'.length)));
48
+ }
49
+ catch {
50
+ /* ignore */
51
+ }
52
+ }
53
+ return;
54
+ }
55
+ if (Array.isArray(node)) {
56
+ for (const v of node)
57
+ collectFilePaths(v, out, depth + 1);
58
+ }
59
+ else if (node && typeof node === 'object') {
60
+ for (const v of Object.values(node)) {
61
+ collectFilePaths(v, out, depth + 1);
62
+ }
63
+ }
64
+ }
65
+ /** Longest common directory of a set of absolute file paths. */
66
+ function commonDir(paths) {
67
+ if (paths.length === 0)
68
+ return '';
69
+ const split = paths.map((p) => p.split('/'));
70
+ const first = split[0] ?? [];
71
+ let i = 0;
72
+ for (; i < first.length; i++) {
73
+ const seg = first[i];
74
+ if (!split.every((s) => s[i] === seg))
75
+ break;
76
+ }
77
+ const dir = first.slice(0, i).join('/');
78
+ // Drop a trailing filename component (has a dot, no further children agreed on).
79
+ return dir;
80
+ }
81
+ function projectFromComposer(composer) {
82
+ const paths = [];
83
+ collectFilePaths(composer['context'], paths);
84
+ collectFilePaths(composer['allAttachedFileCodeChunksUris'], paths);
85
+ if (paths.length === 0)
86
+ return '';
87
+ const dir = commonDir(paths);
88
+ // If the common prefix is itself a file (single file selected), use its dir.
89
+ const last = dir.split('/').pop() ?? '';
90
+ return last.includes('.') ? dir.slice(0, dir.lastIndexOf('/')) : dir;
91
+ }
92
+ function matchesProject(cwd, filter) {
93
+ if (!filter)
94
+ return true;
95
+ if (filter.endsWith('/'))
96
+ return cwd.startsWith(filter);
97
+ return cwd === filter;
98
+ }
99
+ /**
100
+ * Read composer sessions from the Cursor global DB. Returns metadata only;
101
+ * call `parseCursorComposer` to stream a session's events.
102
+ */
103
+ export function indexCursorSessions(opts = {}) {
104
+ const dbPath = defaultCursorDbPath(opts.cursorStateDir);
105
+ let db;
106
+ try {
107
+ db = new Database(dbPath, { readonly: true, fileMustExist: true });
108
+ }
109
+ catch {
110
+ return [];
111
+ }
112
+ try {
113
+ const rows = db
114
+ .prepare("SELECT key, value FROM cursorDiskKV WHERE key LIKE 'composerData:%'")
115
+ .all();
116
+ const entries = [];
117
+ for (const row of rows) {
118
+ const o = parseJson(row.value);
119
+ if (!o || typeof o !== 'object')
120
+ continue;
121
+ const composer = o;
122
+ const id = typeof composer['composerId'] === 'string'
123
+ ? composer['composerId']
124
+ : row.key.slice('composerData:'.length);
125
+ const createdAt = typeof composer['createdAt'] === 'number' ? composer['createdAt'] : 0;
126
+ if (createdAt <= 0)
127
+ continue;
128
+ const when = new Date(createdAt);
129
+ if (opts.since && when < opts.since)
130
+ continue;
131
+ if (opts.until && when > opts.until)
132
+ continue;
133
+ const projectCwd = projectFromComposer(composer);
134
+ if (!matchesProject(projectCwd, opts.projectCwd))
135
+ continue;
136
+ entries.push({ sessionId: id, createdAt, ts: when.toISOString(), projectCwd });
137
+ }
138
+ return entries.sort((a, b) => a.createdAt - b.createdAt);
139
+ }
140
+ finally {
141
+ db.close();
142
+ }
143
+ }
144
+ function bubbleUsage(b) {
145
+ const tc = b.tokenCount ?? {};
146
+ return {
147
+ newInputTokens: tc.inputTokens ?? 0,
148
+ cachedInputTokens: 0,
149
+ cacheWriteTokens: 0,
150
+ outputTokens: tc.outputTokens ?? 0,
151
+ reasoningTokens: 0,
152
+ };
153
+ }
154
+ /**
155
+ * Stream the events of one composer session. Needs an open DB handle (so the
156
+ * caller can reuse it across sessions).
157
+ */
158
+ export function parseCursorComposer(db, entry) {
159
+ const events = [];
160
+ const base = {
161
+ tool: 'cursor',
162
+ sessionId: entry.sessionId,
163
+ projectCwd: entry.projectCwd,
164
+ ts: entry.ts,
165
+ };
166
+ events.push({ ...base, kind: 'session_start', surface: 'cursor', isSubagent: false });
167
+ const composerRow = db
168
+ .prepare('SELECT value FROM cursorDiskKV WHERE key = ?')
169
+ .get(`composerData:${entry.sessionId}`);
170
+ const composer = (parseJson(composerRow?.value) ?? {});
171
+ const headers = Array.isArray(composer['fullConversationHeadersOnly'])
172
+ ? composer['fullConversationHeadersOnly']
173
+ : [];
174
+ const getBubble = db.prepare('SELECT value FROM cursorDiskKV WHERE key = ?');
175
+ for (const h of headers) {
176
+ const bubbleId = h?.bubbleId;
177
+ if (!bubbleId)
178
+ continue;
179
+ const row = getBubble.get(`bubbleId:${entry.sessionId}:${bubbleId}`);
180
+ const b = parseJson(row?.value);
181
+ if (!b || typeof b !== 'object')
182
+ continue;
183
+ if (b.type === 1) {
184
+ const text = typeof b.text === 'string' ? b.text : '';
185
+ events.push({
186
+ ...base,
187
+ kind: 'user_prompt',
188
+ textLength: text.length,
189
+ textHash: sha256short(text),
190
+ });
191
+ }
192
+ else if (b.type === 2) {
193
+ events.push({ ...base, kind: 'turn', model: 'unknown', usage: bubbleUsage(b) });
194
+ }
195
+ }
196
+ events.push({ ...base, kind: 'session_end' });
197
+ return events;
198
+ }
199
+ /** Open the DB once and yield events for all matching composer sessions. */
200
+ export async function* collectCursorEvents(opts = {}) {
201
+ const entries = indexCursorSessions(opts);
202
+ if (entries.length === 0)
203
+ return;
204
+ const dbPath = defaultCursorDbPath(opts.cursorStateDir);
205
+ let db;
206
+ try {
207
+ db = new Database(dbPath, { readonly: true, fileMustExist: true });
208
+ }
209
+ catch {
210
+ return;
211
+ }
212
+ try {
213
+ for (const entry of entries) {
214
+ for (const ev of parseCursorComposer(db, entry))
215
+ yield ev;
216
+ }
217
+ }
218
+ finally {
219
+ db.close();
220
+ }
221
+ }
222
+ //# sourceMappingURL=cursor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../src/parsers/cursor.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"rate-card.d.ts","sourceRoot":"","sources":["../src/rate-card.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,MAAM,YAAY,GAAG,eAAe,GAAG,kBAAkB,GAAG,SAAS,CAAC;AAE5E,gDAAgD;AAChD,MAAM,WAAW,UAAU;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,gBAAgB,EAAE,MAAM,CAAC;IACzB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,YAAY,CAAC;CACxB;AAED,eAAO,MAAM,UAAU,EAAE,UAMxB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAsExD,CAAC;AAEF;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAqB,GACnD,UAAU,CAcZ;AAED,iEAAiE;AACjE,wBAAgB,YAAY,CAC1B,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,UAAU,GAChB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,YAAY,CAAA;CAAE,CAQ5C"}
1
+ {"version":3,"file":"rate-card.d.ts","sourceRoot":"","sources":["../src/rate-card.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,MAAM,YAAY,GAAG,eAAe,GAAG,kBAAkB,GAAG,SAAS,CAAC;AAE5E,gDAAgD;AAChD,MAAM,WAAW,UAAU;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,gBAAgB,EAAE,MAAM,CAAC;IACzB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,YAAY,CAAC;CACxB;AAED,eAAO,MAAM,UAAU,EAAE,UAMxB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAgFxD,CAAC;AAEF;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAqB,GACnD,UAAU,CAgBZ;AAED,iEAAiE;AACjE,wBAAgB,YAAY,CAC1B,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,UAAU,GAChB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,YAAY,CAAA;CAAE,CAQ5C"}
package/dist/rate-card.js CHANGED
@@ -87,6 +87,16 @@ export const DEFAULT_RATE_CARD = {
87
87
  outputPerMillion: 7500, // $75
88
88
  currency: 'claude_usd_cents',
89
89
  },
90
+ // Current generation. Same published Opus tier as 4-7 ($15 / $75); kept as an
91
+ // explicit entry (not a fallback) since it carries a large share of usage.
92
+ // Re-verify against Anthropic's pricing page if the Opus list price changes.
93
+ 'claude-opus-4-8': {
94
+ newInputPerMillion: 1500, // $15
95
+ cachedPerMillion: 150, // $1.50 (cache_read 10%)
96
+ cacheWritePerMillion: 1875, // $18.75 (cache_creation 1.25×)
97
+ outputPerMillion: 7500, // $75
98
+ currency: 'claude_usd_cents',
99
+ },
90
100
  'claude-sonnet-4-6': {
91
101
  newInputPerMillion: 300,
92
102
  cachedPerMillion: 30,
@@ -117,12 +127,13 @@ export function resolveRates(model, card = DEFAULT_RATE_CARD) {
117
127
  if (model.startsWith(key))
118
128
  return card[key];
119
129
  }
120
- // common families
121
- if (model.startsWith('claude-haiku'))
130
+ // common families — also catch the bare short aliases (`opus`, `sonnet`,
131
+ // `haiku`) that Claude Code sometimes records instead of the full id.
132
+ if (model.startsWith('claude-haiku') || model === 'haiku')
122
133
  return card['claude-haiku-4-5-20251001'];
123
- if (model.startsWith('claude-sonnet'))
134
+ if (model.startsWith('claude-sonnet') || model === 'sonnet')
124
135
  return card['claude-sonnet-4-6'];
125
- if (model.startsWith('claude-opus'))
136
+ if (model.startsWith('claude-opus') || model === 'opus')
126
137
  return card['claude-opus-4-7'];
127
138
  return ZERO_RATES;
128
139
  }
@@ -1 +1 @@
1
- {"version":3,"file":"rate-card.js","sourceRoot":"","sources":["../src/rate-card.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rate-card.js","sourceRoot":"","sources":["../src/rate-card.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAeH,MAAM,CAAC,MAAM,UAAU,GAAe;IACpC,kBAAkB,EAAE,CAAC;IACrB,gBAAgB,EAAE,CAAC;IACnB,oBAAoB,EAAE,CAAC;IACvB,gBAAgB,EAAE,CAAC;IACnB,QAAQ,EAAE,SAAS;CACpB,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAA+B;IAC3D,qDAAqD;IACrD,SAAS,EAAE;QACT,kBAAkB,EAAE,GAAG;QACvB,gBAAgB,EAAE,IAAI;QACtB,oBAAoB,EAAE,CAAC;QACvB,gBAAgB,EAAE,GAAG;QACrB,QAAQ,EAAE,eAAe;KAC1B;IACD,SAAS,EAAE;QACT,kBAAkB,EAAE,IAAI;QACxB,gBAAgB,EAAE,IAAI;QACtB,oBAAoB,EAAE,CAAC;QACvB,gBAAgB,EAAE,GAAG;QACrB,QAAQ,EAAE,eAAe;KAC1B;IACD,cAAc,EAAE;QACd,kBAAkB,EAAE,KAAK;QACzB,gBAAgB,EAAE,KAAK;QACvB,oBAAoB,EAAE,CAAC;QACvB,gBAAgB,EAAE,GAAG;QACrB,QAAQ,EAAE,eAAe;KAC1B;IACD,eAAe,EAAE;QACf,kBAAkB,EAAE,KAAK;QACzB,gBAAgB,EAAE,KAAK;QACvB,oBAAoB,EAAE,CAAC;QACvB,gBAAgB,EAAE,GAAG;QACrB,QAAQ,EAAE,eAAe;KAC1B;IACD,qBAAqB,EAAE;QACrB,sEAAsE;QACtE,qEAAqE;QACrE,kBAAkB,EAAE,KAAK;QACzB,gBAAgB,EAAE,KAAK;QACvB,oBAAoB,EAAE,CAAC;QACvB,gBAAgB,EAAE,GAAG;QACrB,QAAQ,EAAE,eAAe;KAC1B;IACD,mBAAmB,EAAE;QACnB,wEAAwE;QACxE,kBAAkB,EAAE,KAAK;QACzB,gBAAgB,EAAE,KAAK;QACvB,oBAAoB,EAAE,CAAC;QACvB,gBAAgB,EAAE,GAAG;QACrB,QAAQ,EAAE,eAAe;KAC1B;IAED,2DAA2D;IAC3D,iBAAiB,EAAE;QACjB,kBAAkB,EAAE,IAAI,EAAE,MAAM;QAChC,gBAAgB,EAAE,GAAG,EAAE,yBAAyB;QAChD,oBAAoB,EAAE,IAAI,EAAE,gCAAgC;QAC5D,gBAAgB,EAAE,IAAI,EAAE,MAAM;QAC9B,QAAQ,EAAE,kBAAkB;KAC7B;IACD,8EAA8E;IAC9E,2EAA2E;IAC3E,6EAA6E;IAC7E,iBAAiB,EAAE;QACjB,kBAAkB,EAAE,IAAI,EAAE,MAAM;QAChC,gBAAgB,EAAE,GAAG,EAAE,yBAAyB;QAChD,oBAAoB,EAAE,IAAI,EAAE,gCAAgC;QAC5D,gBAAgB,EAAE,IAAI,EAAE,MAAM;QAC9B,QAAQ,EAAE,kBAAkB;KAC7B;IACD,mBAAmB,EAAE;QACnB,kBAAkB,EAAE,GAAG;QACvB,gBAAgB,EAAE,EAAE;QACpB,oBAAoB,EAAE,GAAG;QACzB,gBAAgB,EAAE,IAAI;QACtB,QAAQ,EAAE,kBAAkB;KAC7B;IACD,2BAA2B,EAAE;QAC3B,kBAAkB,EAAE,GAAG;QACvB,gBAAgB,EAAE,EAAE;QACpB,oBAAoB,EAAE,GAAG;QACzB,gBAAgB,EAAE,GAAG;QACrB,QAAQ,EAAE,kBAAkB;KAC7B;CACF,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,YAAY,CAC1B,KAAyB,EACzB,OAAmC,iBAAiB;IAEpD,IAAI,CAAC,KAAK;QAAE,OAAO,UAAU,CAAC;IAC9B,IAAI,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC;IAEpC,kFAAkF;IAClF,wCAAwC;IACxC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC,GAAG,CAAE,CAAC;IAC/C,CAAC;IACD,yEAAyE;IACzE,sEAAsE;IACtE,IAAI,KAAK,CAAC,UAAU,CAAC,cAAc,CAAC,IAAI,KAAK,KAAK,OAAO;QACvD,OAAO,IAAI,CAAC,2BAA2B,CAAE,CAAC;IAC5C,IAAI,KAAK,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC,mBAAmB,CAAE,CAAC;IAC/F,IAAI,KAAK,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,KAAK,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC,iBAAiB,CAAE,CAAC;IACzF,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,YAAY,CAC1B,KAAY,EACZ,KAAiB;IAEjB,MAAM,MAAM,GACV,CAAC,KAAK,CAAC,cAAc,GAAG,KAAK,CAAC,kBAAkB;QAC9C,KAAK,CAAC,iBAAiB,GAAG,KAAK,CAAC,gBAAgB;QAChD,KAAK,CAAC,gBAAgB,GAAG,KAAK,CAAC,oBAAoB;QACnD,KAAK,CAAC,YAAY,GAAG,KAAK,CAAC,gBAAgB,CAAC;QAC9C,SAAS,CAAC;IACZ,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC;AAC9C,CAAC"}
package/dist/schema.d.ts CHANGED
@@ -10,7 +10,9 @@
10
10
  * - All timestamps are ISO 8601 UTC. Parsers MUST normalize.
11
11
  * - `kind` is the discriminant; the union is exhaustive (use `assertNever`).
12
12
  */
13
- export type Tool = 'claude' | 'codex';
13
+ export type Tool = 'claude' | 'codex' | 'cursor';
14
+ /** Which local surface produced the session (mainly to split Codex). */
15
+ export type Surface = 'cli' | 'vscode' | 'exec' | 'cursor';
14
16
  /**
15
17
  * Token usage breakdown for a single turn.
16
18
  * Pricing semantics (typical providers, May 2026):
@@ -49,6 +51,8 @@ export interface SessionStartEvent extends EventBase {
49
51
  /** Codex: nickname auto-assigned to subagents (philosopher names). */
50
52
  agentNickname?: string;
51
53
  cliVersion?: string;
54
+ /** Local surface (Codex CLI/VSCode/exec, or Cursor), derived from originator. */
55
+ surface?: Surface;
52
56
  /** True if originated from a parent thread (Codex fork or Claude Task). */
53
57
  isSubagent: boolean;
54
58
  }
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,MAAM,IAAI,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEtC;;;;;;;;GAQG;AACH,MAAM,WAAW,KAAK;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,eAAO,MAAM,UAAU,EAAE,KAMxB,CAAC;AAEF,wBAAgB,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,GAAG,KAAK,CAQlD;AAED,4DAA4D;AAC5D,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,KAAK,GAAG,MAAM,CAEjD;AAED,6CAA6C;AAC7C,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,IAAI,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,8CAA8C;AAC9C,MAAM,WAAW,iBAAkB,SAAQ,SAAS;IAClD,IAAI,EAAE,eAAe,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oEAAoE;IACpE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yDAAyD;IACzD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,sEAAsE;IACtE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2EAA2E;IAC3E,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,4CAA4C;AAC5C,MAAM,WAAW,eAAgB,SAAQ,SAAS;IAChD,IAAI,EAAE,aAAa,CAAC;CACrB;AAED;;;GAGG;AACH,MAAM,WAAW,SAAU,SAAQ,SAAS;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,KAAK,CAAC;IACb,0EAA0E;IAC1E,UAAU,CAAC,EAAE,KAAK,CAAC;IACnB,8DAA8D;IAC9D,SAAS,CAAC,EAAE;QACV,cAAc,EAAE,MAAM,CAAC;QACvB,gBAAgB,EAAE,MAAM,CAAC;KAC1B,CAAC;CACH;AAED,gCAAgC;AAChC,MAAM,WAAW,eAAgB,SAAQ,SAAS;IAChD,IAAI,EAAE,aAAa,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,gDAAgD;IAChD,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,4DAA4D;AAC5D,MAAM,WAAW,aAAc,SAAQ,SAAS;IAC9C,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC;IAC7D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wCAAwC;AACxC,MAAM,WAAW,gBAAiB,SAAQ,SAAS;IACjD,IAAI,EAAE,cAAc,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,6CAA6C;AAC7C,MAAM,WAAW,eAAgB,SAAQ,SAAS;IAChD,IAAI,EAAE,YAAY,CAAC;CACpB;AAED,+CAA+C;AAC/C,MAAM,MAAM,YAAY,GACpB,iBAAiB,GACjB,eAAe,GACf,SAAS,GACT,eAAe,GACf,aAAa,GACb,gBAAgB,GAChB,eAAe,CAAC;AAEpB;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,IAAI,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,KAAK,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,oDAAoD;IACpD,YAAY,CAAC,EAAE;QACb,cAAc,EAAE,MAAM,CAAC;QACvB,gBAAgB,EAAE,MAAM,CAAC;KAC1B,CAAC;CACH;AAED,4CAA4C;AAC5C,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,6CAA6C;IAC7C,IAAI,EAAE,MAAM,CAAC;IACb,wEAAwE;IACxE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC;AAED,0CAA0C;AAC1C,wBAAgB,WAAW,CAAC,CAAC,EAAE,KAAK,GAAG,KAAK,CAE3C"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAqBH,MAAM,CAAC,MAAM,UAAU,GAAU;IAC/B,cAAc,EAAE,CAAC;IACjB,iBAAiB,EAAE,CAAC;IACpB,gBAAgB,EAAE,CAAC;IACnB,YAAY,EAAE,CAAC;IACf,eAAe,EAAE,CAAC;CACnB,CAAC;AAEF,MAAM,UAAU,QAAQ,CAAC,CAAQ,EAAE,CAAQ;IACzC,OAAO;QACL,cAAc,EAAE,CAAC,CAAC,cAAc,GAAG,CAAC,CAAC,cAAc;QACnD,iBAAiB,EAAE,CAAC,CAAC,iBAAiB,GAAG,CAAC,CAAC,iBAAiB;QAC5D,gBAAgB,EAAE,CAAC,CAAC,gBAAgB,GAAG,CAAC,CAAC,gBAAgB;QACzD,YAAY,EAAE,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,YAAY;QAC7C,eAAe,EAAE,CAAC,CAAC,eAAe,GAAG,CAAC,CAAC,eAAe;KACvD,CAAC;AACJ,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,gBAAgB,CAAC,CAAQ;IACvC,OAAO,CAAC,CAAC,cAAc,GAAG,CAAC,CAAC,iBAAiB,GAAG,CAAC,CAAC,gBAAgB,CAAC;AACrE,CAAC;AA0HD,0CAA0C;AAC1C,MAAM,UAAU,WAAW,CAAC,CAAQ;IAClC,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAC1D,CAAC"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAwBH,MAAM,CAAC,MAAM,UAAU,GAAU;IAC/B,cAAc,EAAE,CAAC;IACjB,iBAAiB,EAAE,CAAC;IACpB,gBAAgB,EAAE,CAAC;IACnB,YAAY,EAAE,CAAC;IACf,eAAe,EAAE,CAAC;CACnB,CAAC;AAEF,MAAM,UAAU,QAAQ,CAAC,CAAQ,EAAE,CAAQ;IACzC,OAAO;QACL,cAAc,EAAE,CAAC,CAAC,cAAc,GAAG,CAAC,CAAC,cAAc;QACnD,iBAAiB,EAAE,CAAC,CAAC,iBAAiB,GAAG,CAAC,CAAC,iBAAiB;QAC5D,gBAAgB,EAAE,CAAC,CAAC,gBAAgB,GAAG,CAAC,CAAC,gBAAgB;QACzD,YAAY,EAAE,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,YAAY;QAC7C,eAAe,EAAE,CAAC,CAAC,eAAe,GAAG,CAAC,CAAC,eAAe;KACvD,CAAC;AACJ,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,gBAAgB,CAAC,CAAQ;IACvC,OAAO,CAAC,CAAC,cAAc,GAAG,CAAC,CAAC,iBAAiB,GAAG,CAAC,CAAC,gBAAgB,CAAC;AACrE,CAAC;AA4HD,0CAA0C;AAC1C,MAAM,UAAU,WAAW,CAAC,CAAQ;IAClC,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAC1D,CAAC"}
package/dist/secrets.d.ts CHANGED
@@ -1,24 +1,55 @@
1
1
  /**
2
- * Thin wrapper over secretlint to scan ad-hoc strings.
2
+ * Secret scanning. Combines two sources:
3
+ * 1. secretlint preset-recommend (28 rules: AWS, Anthropic, OpenAI, GitHub,
4
+ * GitLab, Slack, Stripe, JWT, private keys, …) — the generic baseline.
5
+ * 2. Optional **custom patterns** (regexes), e.g. an organisation's internal
6
+ * token formats that the generic rules don't know about. These are loaded
7
+ * from a small YAML file (see `loadSecretPatterns`).
3
8
  *
4
- * Uses the preset-recommend bundle as the default rule set. The function
5
- * returns the list of match ranges so callers can either redact in place
6
- * (cleanser) or report them (anomalies / audit).
9
+ * Returns match ranges so callers can redact in place (cleanser) or report
10
+ * them (audit). The two sources are merged and overlapping ranges are kept
11
+ * once so a string is never double-redacted.
7
12
  */
8
13
  export interface SecretMatch {
9
14
  /** UTF-16 code unit offset where the secret starts in the source string. */
10
15
  start: number;
11
16
  /** Exclusive end offset. */
12
17
  end: number;
13
- /** Rule id reporting the match (e.g. `@secretlint/secretlint-rule-aws`). */
18
+ /** Rule id reporting the match (e.g. `@secretlint/secretlint-rule-aws`, or
19
+ * `custom:<id>` for a user pattern). */
14
20
  ruleId: string;
15
21
  /** Human-readable message. */
16
22
  message: string;
17
23
  }
24
+ /** A user-supplied secret pattern (regex). */
25
+ export interface CustomSecretPattern {
26
+ /** Short identifier, surfaced in the redaction tag as `custom:<id>`. */
27
+ id: string;
28
+ /** JavaScript regular-expression source. */
29
+ pattern: string;
30
+ /** Regex flags; `g` is always enforced. Default `''`. */
31
+ flags?: string;
32
+ }
33
+ export interface ScanOptions {
34
+ /** Logical file path passed to secretlint (affects nothing material). */
35
+ filePath?: string;
36
+ /** Extra regex patterns to apply on top of the preset rules. */
37
+ customPatterns?: CustomSecretPattern[];
38
+ }
39
+ /**
40
+ * Load custom secret patterns from a YAML file. Accepts either a top-level
41
+ * list, or a `patterns:` key holding the list:
42
+ *
43
+ * - id: sentropic-token
44
+ * pattern: "stp_[A-Za-z0-9]{32}"
45
+ * flags: ""
46
+ *
47
+ * Invalid entries are skipped defensively (bad regex, missing fields).
48
+ */
49
+ export declare function loadSecretPatterns(filePath: string): CustomSecretPattern[];
18
50
  /**
19
- * Scan a single string for secrets. Returns an empty array if nothing
20
- * looks suspicious. Safe to call on small or empty strings — secretlint
21
- * short-circuits.
51
+ * Scan a single string for secrets (preset rules + optional custom patterns).
52
+ * Returns an empty array if nothing looks suspicious. Safe on empty strings.
22
53
  */
23
- export declare function scanString(text: string, filePath?: string): Promise<SecretMatch[]>;
54
+ export declare function scanString(text: string, opts?: ScanOptions): Promise<SecretMatch[]>;
24
55
  //# sourceMappingURL=secrets.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"secrets.d.ts","sourceRoot":"","sources":["../src/secrets.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,MAAM,WAAW,WAAW;IAC1B,4EAA4E;IAC5E,KAAK,EAAE,MAAM,CAAC;IACd,4BAA4B;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,4EAA4E;IAC5E,MAAM,EAAE,MAAM,CAAC;IACf,8BAA8B;IAC9B,OAAO,EAAE,MAAM,CAAC;CACjB;AAWD;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,SAAe,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAoB9F"}
1
+ {"version":3,"file":"secrets.d.ts","sourceRoot":"","sources":["../src/secrets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AASH,MAAM,WAAW,WAAW;IAC1B,4EAA4E;IAC5E,KAAK,EAAE,MAAM,CAAC;IACd,4BAA4B;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ;6CACyC;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,8BAA8B;IAC9B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,8CAA8C;AAC9C,MAAM,WAAW,mBAAmB;IAClC,wEAAwE;IACxE,EAAE,EAAE,MAAM,CAAC;IACX,4CAA4C;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,yDAAyD;IACzD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAWD,MAAM,WAAW,WAAW;IAC1B,yEAAyE;IACzE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gEAAgE;IAChE,cAAc,CAAC,EAAE,mBAAmB,EAAE,CAAC;CACxC;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,mBAAmB,EAAE,CAyB1E;AAwCD;;;GAGG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAsB7F"}