pilotswarm-sdk 0.1.19 → 0.1.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.
Files changed (95) hide show
  1. package/README.md +6 -0
  2. package/dist/artifact-tools.d.ts.map +1 -1
  3. package/dist/artifact-tools.js +20 -5
  4. package/dist/artifact-tools.js.map +1 -1
  5. package/dist/blob-store.d.ts +6 -4
  6. package/dist/blob-store.d.ts.map +1 -1
  7. package/dist/blob-store.js +55 -12
  8. package/dist/blob-store.js.map +1 -1
  9. package/dist/client.d.ts +4 -1
  10. package/dist/client.d.ts.map +1 -1
  11. package/dist/client.js +4 -0
  12. package/dist/client.js.map +1 -1
  13. package/dist/cms-migrations.d.ts.map +1 -1
  14. package/dist/cms-migrations.js +628 -0
  15. package/dist/cms-migrations.js.map +1 -1
  16. package/dist/cms.d.ts +145 -0
  17. package/dist/cms.d.ts.map +1 -1
  18. package/dist/cms.js +288 -17
  19. package/dist/cms.js.map +1 -1
  20. package/dist/facts-migrations.d.ts.map +1 -1
  21. package/dist/facts-migrations.js +227 -0
  22. package/dist/facts-migrations.js.map +1 -1
  23. package/dist/facts-store.d.ts +21 -0
  24. package/dist/facts-store.d.ts.map +1 -1
  25. package/dist/facts-store.js +34 -1
  26. package/dist/facts-store.js.map +1 -1
  27. package/dist/facts-tools.d.ts +7 -0
  28. package/dist/facts-tools.d.ts.map +1 -1
  29. package/dist/facts-tools.js +29 -2
  30. package/dist/facts-tools.js.map +1 -1
  31. package/dist/index.d.ts +6 -5
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +3 -1
  34. package/dist/index.js.map +1 -1
  35. package/dist/inspect-tools.d.ts +42 -0
  36. package/dist/inspect-tools.d.ts.map +1 -0
  37. package/dist/inspect-tools.js +800 -0
  38. package/dist/inspect-tools.js.map +1 -0
  39. package/dist/managed-session.d.ts.map +1 -1
  40. package/dist/managed-session.js +76 -35
  41. package/dist/managed-session.js.map +1 -1
  42. package/dist/management-client.d.ts +64 -2
  43. package/dist/management-client.d.ts.map +1 -1
  44. package/dist/management-client.js +109 -0
  45. package/dist/management-client.js.map +1 -1
  46. package/dist/orchestration-registry.d.ts.map +1 -1
  47. package/dist/orchestration-registry.js +6 -2
  48. package/dist/orchestration-registry.js.map +1 -1
  49. package/dist/orchestration-version.d.ts +1 -1
  50. package/dist/orchestration-version.js +1 -1
  51. package/dist/orchestration.d.ts +3 -3
  52. package/dist/orchestration.d.ts.map +1 -1
  53. package/dist/orchestration.js +27 -4
  54. package/dist/orchestration.js.map +1 -1
  55. package/dist/orchestration_1_0_43.d.ts +12 -0
  56. package/dist/orchestration_1_0_43.d.ts.map +1 -0
  57. package/dist/orchestration_1_0_43.js +2710 -0
  58. package/dist/orchestration_1_0_43.js.map +1 -0
  59. package/dist/orchestration_1_0_44.d.ts +12 -0
  60. package/dist/orchestration_1_0_44.d.ts.map +1 -0
  61. package/dist/orchestration_1_0_44.js +2710 -0
  62. package/dist/orchestration_1_0_44.js.map +1 -0
  63. package/dist/session-manager.d.ts +9 -0
  64. package/dist/session-manager.d.ts.map +1 -1
  65. package/dist/session-manager.js +40 -3
  66. package/dist/session-manager.js.map +1 -1
  67. package/dist/session-owner-utils.d.ts +25 -0
  68. package/dist/session-owner-utils.d.ts.map +1 -0
  69. package/dist/session-owner-utils.js +82 -0
  70. package/dist/session-owner-utils.js.map +1 -0
  71. package/dist/session-proxy.d.ts +5 -1
  72. package/dist/session-proxy.d.ts.map +1 -1
  73. package/dist/session-proxy.js +70 -8
  74. package/dist/session-proxy.js.map +1 -1
  75. package/dist/session-store.d.ts +38 -6
  76. package/dist/session-store.d.ts.map +1 -1
  77. package/dist/session-store.js +187 -9
  78. package/dist/session-store.js.map +1 -1
  79. package/dist/types.d.ts +19 -1
  80. package/dist/types.d.ts.map +1 -1
  81. package/dist/types.js.map +1 -1
  82. package/dist/worker.d.ts.map +1 -1
  83. package/dist/worker.js +11 -2
  84. package/dist/worker.js.map +1 -1
  85. package/package.json +10 -4
  86. package/plugins/mgmt/agents/agent-tuner.agent.md +222 -0
  87. package/plugins/mgmt/agents/facts-manager.agent.md +8 -1
  88. package/plugins/mgmt/agents/pilotswarm.agent.md +13 -10
  89. package/plugins/mgmt/agents/resourcemgr.agent.md +11 -4
  90. package/plugins/mgmt/agents/sweeper.agent.md +5 -4
  91. package/plugins/mgmt/skills/cost-latency-analysis/SKILL.md +117 -0
  92. package/plugins/mgmt/skills/orchestration-session-lifecycle/SKILL.md +117 -0
  93. package/plugins/mgmt/skills/resourcemgr/SKILL.md +1 -1
  94. package/plugins/mgmt/skills/sweeper/SKILL.md +4 -4
  95. package/plugins/system/agents/default.agent.md +22 -0
package/dist/cms.d.ts CHANGED
@@ -7,6 +7,7 @@
7
7
  *
8
8
  * @module
9
9
  */
10
+ import type { SessionOwnerInfo } from "./types.js";
10
11
  /** A persisted session event (non-ephemeral). */
11
12
  export interface SessionEvent {
12
13
  seq: number;
@@ -40,6 +41,8 @@ export interface SessionRow {
40
41
  agentId: string | null;
41
42
  /** Splash banner (terminal markup) from the agent definition. */
42
43
  splash: string | null;
44
+ /** Authenticated user associated with this session, if any. */
45
+ owner: SessionOwnerInfo | null;
43
46
  }
44
47
  /** Fields that can be updated on a session row. */
45
48
  export interface SessionRowUpdates {
@@ -73,6 +76,8 @@ export interface SessionMetricSummary {
73
76
  tokensOutput: number;
74
77
  tokensCacheRead: number;
75
78
  tokensCacheWrite: number;
79
+ /** Cached-prompt hit ratio (0..1), null when tokensInput is 0. Derived. */
80
+ cacheHitRatio: number | null;
76
81
  deletedAt: number | null;
77
82
  createdAt: number;
78
83
  updatedAt: number;
@@ -105,12 +110,64 @@ export interface FleetStats {
105
110
  totalLossyHandoffCount: number;
106
111
  totalTokensInput: number;
107
112
  totalTokensOutput: number;
113
+ totalTokensCacheRead: number;
114
+ totalTokensCacheWrite: number;
115
+ /** Derived: cache_read / input. Null when input is 0. */
116
+ cacheHitRatio: number | null;
108
117
  }>;
109
118
  totals: {
110
119
  sessionCount: number;
111
120
  totalSnapshotSizeBytes: number;
112
121
  totalTokensInput: number;
113
122
  totalTokensOutput: number;
123
+ totalTokensCacheRead: number;
124
+ totalTokensCacheWrite: number;
125
+ cacheHitRatio: number | null;
126
+ };
127
+ }
128
+ export type UserStatsOwnerKind = "user" | "system" | "unowned";
129
+ export interface UserStatsModelBucket {
130
+ model: string | null;
131
+ sessionIds: string[];
132
+ sessionCount: number;
133
+ totalSnapshotSizeBytes: number;
134
+ totalOrchestrationHistorySizeBytes: number;
135
+ totalDehydrationCount: number;
136
+ totalHydrationCount: number;
137
+ totalLossyHandoffCount: number;
138
+ totalTokensInput: number;
139
+ totalTokensOutput: number;
140
+ totalTokensCacheRead: number;
141
+ totalTokensCacheWrite: number;
142
+ cacheHitRatio: number | null;
143
+ }
144
+ export interface UserStatsBucket {
145
+ ownerKind: UserStatsOwnerKind;
146
+ owner: SessionOwnerInfo | null;
147
+ sessionIds: string[];
148
+ sessionCount: number;
149
+ totalSnapshotSizeBytes: number;
150
+ totalOrchestrationHistorySizeBytes: number;
151
+ totalTokensInput: number;
152
+ totalTokensOutput: number;
153
+ totalTokensCacheRead: number;
154
+ totalTokensCacheWrite: number;
155
+ cacheHitRatio: number | null;
156
+ byModel: UserStatsModelBucket[];
157
+ }
158
+ export interface UserStats {
159
+ windowStart: number | null;
160
+ earliestSessionCreatedAt: number | null;
161
+ users: UserStatsBucket[];
162
+ totals: {
163
+ sessionCount: number;
164
+ totalSnapshotSizeBytes: number;
165
+ totalOrchestrationHistorySizeBytes: number;
166
+ totalTokensInput: number;
167
+ totalTokensOutput: number;
168
+ totalTokensCacheRead: number;
169
+ totalTokensCacheWrite: number;
170
+ cacheHitRatio: number | null;
114
171
  };
115
172
  }
116
173
  /** Aggregate of a session and all its descendants. */
@@ -123,11 +180,65 @@ export interface SessionTreeStats {
123
180
  totalTokensOutput: number;
124
181
  totalTokensCacheRead: number;
125
182
  totalTokensCacheWrite: number;
183
+ /** Derived: cache_read / input across the tree. Null when input is 0. */
184
+ cacheHitRatio: number | null;
126
185
  totalDehydrationCount: number;
127
186
  totalHydrationCount: number;
128
187
  totalLossyHandoffCount: number;
129
188
  totalSnapshotSizeBytes: number;
130
189
  };
190
+ /** Per-model breakdown across the tree, sorted by total input tokens. */
191
+ byModel: Array<{
192
+ model: string;
193
+ sessionCount: number;
194
+ totalTokensInput: number;
195
+ totalTokensOutput: number;
196
+ totalTokensCacheRead: number;
197
+ totalTokensCacheWrite: number;
198
+ totalSnapshotSizeBytes: number;
199
+ /** Derived per model. Null when input is 0. */
200
+ cacheHitRatio: number | null;
201
+ }>;
202
+ }
203
+ /**
204
+ * Compute prompt-cache hit ratio with the inclusive token convention.
205
+ * Returns a value in [0, 1] or null when tokensInput is 0 / negative / missing.
206
+ * Defined once so per-session, tree, and fleet surfaces report identical values.
207
+ */
208
+ export declare function computeCacheHitRatio(tokensInput: number | null | undefined, tokensCacheRead: number | null | undefined): number | null;
209
+ /** Discriminator: 'static' = SDK skill.invoked, 'learned' = read_facts on skills/. */
210
+ export type SkillKind = "static" | "learned";
211
+ /** One row of skill-usage aggregation for a single session. */
212
+ export interface SkillUsageRow {
213
+ kind: SkillKind;
214
+ /** Static: skill name. Learned: requested key or keyPattern (e.g. "skills/foo/%"). */
215
+ name: string;
216
+ pluginName: string | null;
217
+ pluginVersion: string | null;
218
+ invocations: number;
219
+ firstUsedAt: Date;
220
+ lastUsedAt: Date;
221
+ }
222
+ /** Skill usage rolled up across the spawn tree rooted at a session. */
223
+ export interface SessionTreeSkillUsage {
224
+ rootSessionId: string;
225
+ perSession: Array<{
226
+ sessionId: string;
227
+ agentId: string | null;
228
+ skills: SkillUsageRow[];
229
+ }>;
230
+ rolledUp: SkillUsageRow[];
231
+ totalInvocations: number;
232
+ }
233
+ /** One row of skill-usage aggregation across the fleet, by agent. */
234
+ export interface FleetSkillUsageRow extends SkillUsageRow {
235
+ agentId: string | null;
236
+ sessionCount: number;
237
+ }
238
+ /** Fleet-wide skill usage. */
239
+ export interface FleetSkillUsage {
240
+ windowStart: number | null;
241
+ rows: FleetSkillUsageRow[];
131
242
  }
132
243
  /**
133
244
  * SessionCatalogProvider — abstraction over the CMS backing store.
@@ -145,6 +256,7 @@ export interface SessionCatalogProvider {
145
256
  isSystem?: boolean;
146
257
  agentId?: string;
147
258
  splash?: string;
259
+ owner?: SessionOwnerInfo | null;
148
260
  }): Promise<void>;
149
261
  /** Update one or more fields on an existing session. */
150
262
  updateSession(sessionId: string, updates: SessionRowUpdates): Promise<void>;
@@ -176,6 +288,24 @@ export interface SessionCatalogProvider {
176
288
  includeDeleted?: boolean;
177
289
  since?: Date;
178
290
  }): Promise<FleetStats>;
291
+ /** Get user/session-owner aggregate stats, optionally filtered. */
292
+ getUserStats(opts?: {
293
+ includeDeleted?: boolean;
294
+ since?: Date;
295
+ }): Promise<UserStats>;
296
+ /** Get skill usage (skill.invoked event aggregation) for a single session. */
297
+ getSessionSkillUsage(sessionId: string, opts?: {
298
+ since?: Date;
299
+ }): Promise<SkillUsageRow[]>;
300
+ /** Get skill usage rolled across the spawn tree rooted at the given session. */
301
+ getSessionTreeSkillUsage(sessionId: string, opts?: {
302
+ since?: Date;
303
+ }): Promise<SessionTreeSkillUsage>;
304
+ /** Get fleet-wide skill usage broken down by agent. Tuner / management surface. */
305
+ getFleetSkillUsage(opts?: {
306
+ since?: Date;
307
+ includeDeleted?: boolean;
308
+ }): Promise<FleetSkillUsage>;
179
309
  /** Upsert a session metric summary with atomic increments. */
180
310
  upsertSessionMetricSummary(sessionId: string, updates: SessionMetricSummaryUpsert): Promise<void>;
181
311
  /** Hard-delete summary rows for sessions deleted before the cutoff. Returns count removed. */
@@ -203,6 +333,7 @@ export declare class PgSessionCatalogProvider implements SessionCatalogProvider
203
333
  isSystem?: boolean;
204
334
  agentId?: string;
205
335
  splash?: string;
336
+ owner?: SessionOwnerInfo | null;
206
337
  }): Promise<void>;
207
338
  updateSession(sessionId: string, updates: SessionRowUpdates): Promise<void>;
208
339
  softDeleteSession(sessionId: string): Promise<void>;
@@ -222,8 +353,22 @@ export declare class PgSessionCatalogProvider implements SessionCatalogProvider
222
353
  includeDeleted?: boolean;
223
354
  since?: Date;
224
355
  }): Promise<FleetStats>;
356
+ getUserStats(opts?: {
357
+ includeDeleted?: boolean;
358
+ since?: Date;
359
+ }): Promise<UserStats>;
225
360
  upsertSessionMetricSummary(sessionId: string, updates: SessionMetricSummaryUpsert): Promise<void>;
226
361
  pruneDeletedSummaries(olderThan: Date): Promise<number>;
362
+ getSessionSkillUsage(sessionId: string, opts?: {
363
+ since?: Date;
364
+ }): Promise<SkillUsageRow[]>;
365
+ getSessionTreeSkillUsage(sessionId: string, opts?: {
366
+ since?: Date;
367
+ }): Promise<SessionTreeSkillUsage>;
368
+ getFleetSkillUsage(opts?: {
369
+ since?: Date;
370
+ includeDeleted?: boolean;
371
+ }): Promise<FleetSkillUsage>;
227
372
  close(): Promise<void>;
228
373
  }
229
374
  //# sourceMappingURL=cms.d.ts.map
package/dist/cms.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cms.d.ts","sourceRoot":"","sources":["../src/cms.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cms.d.ts","sourceRoot":"","sources":["../src/cms.ts"],"names":[],"mappings":"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"}
package/dist/cms.js CHANGED
@@ -8,6 +8,21 @@
8
8
  * @module
9
9
  */
10
10
  import { runCmsMigrations } from "./cms-migrator.js";
11
+ /**
12
+ * Compute prompt-cache hit ratio with the inclusive token convention.
13
+ * Returns a value in [0, 1] or null when tokensInput is 0 / negative / missing.
14
+ * Defined once so per-session, tree, and fleet surfaces report identical values.
15
+ */
16
+ export function computeCacheHitRatio(tokensInput, tokensCacheRead) {
17
+ const input = Number(tokensInput);
18
+ const read = Number(tokensCacheRead);
19
+ if (!Number.isFinite(input) || input <= 0)
20
+ return null;
21
+ if (!Number.isFinite(read) || read <= 0)
22
+ return 0;
23
+ const ratio = read / input;
24
+ return Math.max(0, Math.min(1, ratio));
25
+ }
11
26
  // ─── PostgreSQL Implementation ───────────────────────────────────
12
27
  const DEFAULT_SCHEMA = "copilot_sessions";
13
28
  /**
@@ -20,6 +35,8 @@ function sqlForSchema(schema) {
20
35
  schema,
21
36
  fn: {
22
37
  createSession: `${s}.cms_create_session`,
38
+ setSessionOwner: `${s}.cms_set_session_owner`,
39
+ inheritSessionOwner: `${s}.cms_inherit_session_owner`,
23
40
  updateSession: `${s}.cms_update_session`,
24
41
  softDeleteSession: `${s}.cms_soft_delete_session`,
25
42
  listSessions: `${s}.cms_list_sessions`,
@@ -31,10 +48,15 @@ function sqlForSchema(schema) {
31
48
  getSessionEventsBefore: `${s}.cms_get_session_events_before`,
32
49
  getSessionMetricSummary: `${s}.cms_get_session_metric_summary`,
33
50
  getSessionTreeStats: `${s}.cms_get_session_tree_stats`,
51
+ getSessionTreeStatsByModel: `${s}.cms_get_session_tree_stats_by_model`,
34
52
  getFleetStatsByAgent: `${s}.cms_get_fleet_stats_by_agent`,
35
53
  getFleetStatsTotals: `${s}.cms_get_fleet_stats_totals`,
54
+ getUserStatsByModel: `${s}.cms_get_user_stats_by_model`,
36
55
  upsertSessionMetricSummary: `${s}.cms_upsert_session_metric_summary`,
37
56
  pruneDeletedSummaries: `${s}.cms_prune_deleted_summaries`,
57
+ getSessionSkillUsage: `${s}.cms_get_session_skill_usage`,
58
+ getSessionTreeSkillUsage: `${s}.cms_get_session_tree_skill_usage`,
59
+ getFleetSkillUsage: `${s}.cms_get_fleet_skill_usage`,
38
60
  },
39
61
  };
40
62
  }
@@ -83,6 +105,21 @@ export class PgSessionCatalogProvider {
83
105
  // ── Writes ───────────────────────────────────────────────
84
106
  async createSession(sessionId, opts) {
85
107
  await this.pool.query(`SELECT ${this.sql.fn.createSession}($1, $2, $3, $4, $5, $6)`, [sessionId, opts?.model ?? null, opts?.parentSessionId ?? null, opts?.isSystem ?? false, opts?.agentId ?? null, opts?.splash ?? null]);
108
+ if (opts?.isSystem)
109
+ return;
110
+ if (opts?.owner?.provider && opts?.owner?.subject) {
111
+ await this.pool.query(`SELECT ${this.sql.fn.setSessionOwner}($1, $2, $3, $4, $5)`, [
112
+ sessionId,
113
+ opts.owner.provider,
114
+ opts.owner.subject,
115
+ opts.owner.email ?? null,
116
+ opts.owner.displayName ?? null,
117
+ ]);
118
+ return;
119
+ }
120
+ if (opts?.parentSessionId) {
121
+ await this.pool.query(`SELECT ${this.sql.fn.inheritSessionOwner}($1, $2)`, [sessionId, opts.parentSessionId]);
122
+ }
86
123
  }
87
124
  async updateSession(sessionId, updates) {
88
125
  const jsonUpdates = {};
@@ -167,22 +204,43 @@ export class PgSessionCatalogProvider {
167
204
  const self = await this.getSessionMetricSummary(sessionId);
168
205
  if (!self)
169
206
  return null;
170
- const { rows } = await this.pool.query(`SELECT * FROM ${this.sql.fn.getSessionTreeStats}($1)`, [sessionId]);
207
+ const [{ rows }, { rows: modelRows }] = await Promise.all([
208
+ this.pool.query(`SELECT * FROM ${this.sql.fn.getSessionTreeStats}($1)`, [sessionId]),
209
+ this.pool.query(`SELECT * FROM ${this.sql.fn.getSessionTreeStatsByModel}($1)`, [sessionId]),
210
+ ]);
171
211
  const r = rows[0];
212
+ const treeTokensInput = Number(r.total_tokens_input) || 0;
213
+ const treeTokensCacheRead = Number(r.total_tokens_cache_read) || 0;
214
+ const byModel = modelRows.map((mr) => {
215
+ const input = Number(mr.total_tokens_input) || 0;
216
+ const cacheRead = Number(mr.total_tokens_cache_read) || 0;
217
+ return {
218
+ model: String(mr.model || "(unknown)"),
219
+ sessionCount: Number(mr.session_count) || 0,
220
+ totalTokensInput: input,
221
+ totalTokensOutput: Number(mr.total_tokens_output) || 0,
222
+ totalTokensCacheRead: cacheRead,
223
+ totalTokensCacheWrite: Number(mr.total_tokens_cache_write) || 0,
224
+ totalSnapshotSizeBytes: Number(mr.total_snapshot_size_bytes) || 0,
225
+ cacheHitRatio: computeCacheHitRatio(input, cacheRead),
226
+ };
227
+ });
172
228
  return {
173
229
  rootSessionId: sessionId,
174
230
  self,
175
231
  tree: {
176
232
  sessionCount: Number(r.session_count) || 0,
177
- totalTokensInput: Number(r.total_tokens_input) || 0,
233
+ totalTokensInput: treeTokensInput,
178
234
  totalTokensOutput: Number(r.total_tokens_output) || 0,
179
- totalTokensCacheRead: Number(r.total_tokens_cache_read) || 0,
235
+ totalTokensCacheRead: treeTokensCacheRead,
180
236
  totalTokensCacheWrite: Number(r.total_tokens_cache_write) || 0,
237
+ cacheHitRatio: computeCacheHitRatio(treeTokensInput, treeTokensCacheRead),
181
238
  totalDehydrationCount: Number(r.total_dehydration_count) || 0,
182
239
  totalHydrationCount: Number(r.total_hydration_count) || 0,
183
240
  totalLossyHandoffCount: Number(r.total_lossy_handoff_count) || 0,
184
241
  totalSnapshotSizeBytes: Number(r.total_snapshot_size_bytes) || 0,
185
242
  },
243
+ byModel,
186
244
  };
187
245
  }
188
246
  async getFleetStats(opts) {
@@ -193,27 +251,144 @@ export class PgSessionCatalogProvider {
193
251
  // Totals + earliest date
194
252
  const { rows: totalsRows } = await this.pool.query(`SELECT * FROM ${this.sql.fn.getFleetStatsTotals}($1, $2)`, [includeDeleted, since]);
195
253
  const t = totalsRows[0];
254
+ const totalsTokensInput = Number(t.total_tokens_input) || 0;
255
+ const totalsTokensCacheRead = Number(t.total_tokens_cache_read) || 0;
196
256
  return {
197
257
  windowStart: opts?.since ? opts.since.getTime() : null,
198
258
  earliestSessionCreatedAt: t.earliest_session_created_at
199
259
  ? new Date(t.earliest_session_created_at).getTime()
200
260
  : null,
201
- byAgent: groups.map((g) => ({
202
- agentId: g.agent_id ?? null,
203
- model: g.model ?? null,
204
- sessionCount: Number(g.session_count) || 0,
205
- totalSnapshotSizeBytes: Number(g.total_snapshot_size_bytes) || 0,
206
- totalDehydrationCount: Number(g.total_dehydration_count) || 0,
207
- totalHydrationCount: Number(g.total_hydration_count) || 0,
208
- totalLossyHandoffCount: Number(g.total_lossy_handoff_count) || 0,
209
- totalTokensInput: Number(g.total_tokens_input) || 0,
210
- totalTokensOutput: Number(g.total_tokens_output) || 0,
211
- })),
261
+ byAgent: groups.map((g) => {
262
+ const tokensInput = Number(g.total_tokens_input) || 0;
263
+ const tokensCacheRead = Number(g.total_tokens_cache_read) || 0;
264
+ return {
265
+ agentId: g.agent_id ?? null,
266
+ model: g.model ?? null,
267
+ sessionCount: Number(g.session_count) || 0,
268
+ totalSnapshotSizeBytes: Number(g.total_snapshot_size_bytes) || 0,
269
+ totalDehydrationCount: Number(g.total_dehydration_count) || 0,
270
+ totalHydrationCount: Number(g.total_hydration_count) || 0,
271
+ totalLossyHandoffCount: Number(g.total_lossy_handoff_count) || 0,
272
+ totalTokensInput: tokensInput,
273
+ totalTokensOutput: Number(g.total_tokens_output) || 0,
274
+ totalTokensCacheRead: tokensCacheRead,
275
+ totalTokensCacheWrite: Number(g.total_tokens_cache_write) || 0,
276
+ cacheHitRatio: computeCacheHitRatio(tokensInput, tokensCacheRead),
277
+ };
278
+ }),
212
279
  totals: {
213
280
  sessionCount: Number(t.session_count) || 0,
214
281
  totalSnapshotSizeBytes: Number(t.total_snapshot_size_bytes) || 0,
215
- totalTokensInput: Number(t.total_tokens_input) || 0,
282
+ totalTokensInput: totalsTokensInput,
216
283
  totalTokensOutput: Number(t.total_tokens_output) || 0,
284
+ totalTokensCacheRead: totalsTokensCacheRead,
285
+ totalTokensCacheWrite: Number(t.total_tokens_cache_write) || 0,
286
+ cacheHitRatio: computeCacheHitRatio(totalsTokensInput, totalsTokensCacheRead),
287
+ },
288
+ };
289
+ }
290
+ async getUserStats(opts) {
291
+ const includeDeleted = opts?.includeDeleted ?? false;
292
+ const since = opts?.since ?? null;
293
+ const { rows } = await this.pool.query(`SELECT * FROM ${this.sql.fn.getUserStatsByModel}($1, $2)`, [includeDeleted, since]);
294
+ const byOwner = new Map();
295
+ let earliestSessionCreatedAt = null;
296
+ const totals = {
297
+ sessionCount: 0,
298
+ totalSnapshotSizeBytes: 0,
299
+ totalOrchestrationHistorySizeBytes: 0,
300
+ totalTokensInput: 0,
301
+ totalTokensOutput: 0,
302
+ totalTokensCacheRead: 0,
303
+ totalTokensCacheWrite: 0,
304
+ cacheHitRatio: null,
305
+ };
306
+ for (const row of rows) {
307
+ const ownerKind = normalizeOwnerKind(row.owner_kind);
308
+ const owner = ownerKind === "user" && row.owner_provider && row.owner_subject
309
+ ? {
310
+ provider: row.owner_provider,
311
+ subject: row.owner_subject,
312
+ email: row.owner_email ?? null,
313
+ displayName: row.owner_display_name ?? null,
314
+ }
315
+ : null;
316
+ const ownerKey = userStatsOwnerKey(ownerKind, owner);
317
+ const sessionIds = Array.isArray(row.session_ids)
318
+ ? row.session_ids.map((id) => String(id || "")).filter(Boolean)
319
+ : [];
320
+ const tokensInput = Number(row.total_tokens_input) || 0;
321
+ const tokensCacheRead = Number(row.total_tokens_cache_read) || 0;
322
+ const modelBucket = {
323
+ model: row.model ?? null,
324
+ sessionIds,
325
+ sessionCount: Number(row.session_count) || 0,
326
+ totalSnapshotSizeBytes: Number(row.total_snapshot_size_bytes) || 0,
327
+ totalOrchestrationHistorySizeBytes: 0,
328
+ totalDehydrationCount: Number(row.total_dehydration_count) || 0,
329
+ totalHydrationCount: Number(row.total_hydration_count) || 0,
330
+ totalLossyHandoffCount: Number(row.total_lossy_handoff_count) || 0,
331
+ totalTokensInput: tokensInput,
332
+ totalTokensOutput: Number(row.total_tokens_output) || 0,
333
+ totalTokensCacheRead: tokensCacheRead,
334
+ totalTokensCacheWrite: Number(row.total_tokens_cache_write) || 0,
335
+ cacheHitRatio: computeCacheHitRatio(tokensInput, tokensCacheRead),
336
+ };
337
+ let bucket = byOwner.get(ownerKey);
338
+ if (!bucket) {
339
+ bucket = {
340
+ ownerKind,
341
+ owner,
342
+ sessionIds: [],
343
+ sessionCount: 0,
344
+ totalSnapshotSizeBytes: 0,
345
+ totalOrchestrationHistorySizeBytes: 0,
346
+ totalTokensInput: 0,
347
+ totalTokensOutput: 0,
348
+ totalTokensCacheRead: 0,
349
+ totalTokensCacheWrite: 0,
350
+ cacheHitRatio: null,
351
+ byModel: [],
352
+ };
353
+ byOwner.set(ownerKey, bucket);
354
+ }
355
+ bucket.byModel.push(modelBucket);
356
+ bucket.sessionIds.push(...sessionIds);
357
+ bucket.sessionCount += modelBucket.sessionCount;
358
+ bucket.totalSnapshotSizeBytes += modelBucket.totalSnapshotSizeBytes;
359
+ bucket.totalTokensInput += modelBucket.totalTokensInput;
360
+ bucket.totalTokensOutput += modelBucket.totalTokensOutput;
361
+ bucket.totalTokensCacheRead += modelBucket.totalTokensCacheRead;
362
+ bucket.totalTokensCacheWrite += modelBucket.totalTokensCacheWrite;
363
+ totals.sessionCount += modelBucket.sessionCount;
364
+ totals.totalSnapshotSizeBytes += modelBucket.totalSnapshotSizeBytes;
365
+ totals.totalTokensInput += modelBucket.totalTokensInput;
366
+ totals.totalTokensOutput += modelBucket.totalTokensOutput;
367
+ totals.totalTokensCacheRead += modelBucket.totalTokensCacheRead;
368
+ totals.totalTokensCacheWrite += modelBucket.totalTokensCacheWrite;
369
+ if (row.earliest_session_created_at) {
370
+ const ts = new Date(row.earliest_session_created_at).getTime();
371
+ if (Number.isFinite(ts) && (earliestSessionCreatedAt == null || ts < earliestSessionCreatedAt)) {
372
+ earliestSessionCreatedAt = ts;
373
+ }
374
+ }
375
+ }
376
+ const users = Array.from(byOwner.values()).map((bucket) => ({
377
+ ...bucket,
378
+ sessionIds: [...new Set(bucket.sessionIds)],
379
+ cacheHitRatio: computeCacheHitRatio(bucket.totalTokensInput, bucket.totalTokensCacheRead),
380
+ byModel: bucket.byModel.sort((a, b) => (b.totalTokensInput - a.totalTokensInput)
381
+ || String(a.model || "").localeCompare(String(b.model || ""))),
382
+ })).sort((a, b) => (b.totalTokensInput - a.totalTokensInput)
383
+ || (b.totalSnapshotSizeBytes - a.totalSnapshotSizeBytes)
384
+ || userStatsOwnerLabel(a).localeCompare(userStatsOwnerLabel(b)));
385
+ return {
386
+ windowStart: opts?.since ? opts.since.getTime() : null,
387
+ earliestSessionCreatedAt,
388
+ users,
389
+ totals: {
390
+ ...totals,
391
+ cacheHitRatio: computeCacheHitRatio(totals.totalTokensInput, totals.totalTokensCacheRead),
217
392
  },
218
393
  };
219
394
  }
@@ -224,6 +399,62 @@ export class PgSessionCatalogProvider {
224
399
  const { rows } = await this.pool.query(`SELECT ${this.sql.fn.pruneDeletedSummaries}($1) AS deleted_count`, [olderThan]);
225
400
  return Number(rows[0]?.deleted_count) || 0;
226
401
  }
402
+ async getSessionSkillUsage(sessionId, opts) {
403
+ const { rows } = await this.pool.query(`SELECT * FROM ${this.sql.fn.getSessionSkillUsage}($1, $2)`, [sessionId, opts?.since ?? null]);
404
+ return rows.map(rowToSkillUsageRow);
405
+ }
406
+ async getSessionTreeSkillUsage(sessionId, opts) {
407
+ const { rows } = await this.pool.query(`SELECT * FROM ${this.sql.fn.getSessionTreeSkillUsage}($1, $2)`, [sessionId, opts?.since ?? null]);
408
+ const perSessionMap = new Map();
409
+ const rolledUpMap = new Map();
410
+ let totalInvocations = 0;
411
+ for (const r of rows) {
412
+ const sid = String(r.session_id);
413
+ const item = rowToSkillUsageRow(r);
414
+ const bucket = perSessionMap.get(sid)
415
+ ?? ({ agentId: (r.agent_id ?? null), skills: [] });
416
+ bucket.skills.push(item);
417
+ perSessionMap.set(sid, bucket);
418
+ const key = `${item.kind}\u0001${item.name}\u0001${item.pluginName ?? ""}\u0001${item.pluginVersion ?? ""}`;
419
+ const existing = rolledUpMap.get(key);
420
+ if (existing) {
421
+ existing.invocations += item.invocations;
422
+ if (item.firstUsedAt < existing.firstUsedAt)
423
+ existing.firstUsedAt = item.firstUsedAt;
424
+ if (item.lastUsedAt > existing.lastUsedAt)
425
+ existing.lastUsedAt = item.lastUsedAt;
426
+ }
427
+ else {
428
+ rolledUpMap.set(key, { ...item });
429
+ }
430
+ totalInvocations += item.invocations;
431
+ }
432
+ const rolledUp = Array.from(rolledUpMap.values()).sort((a, b) => b.invocations - a.invocations || b.lastUsedAt.getTime() - a.lastUsedAt.getTime());
433
+ const perSession = Array.from(perSessionMap.entries()).map(([sid, bucket]) => ({
434
+ sessionId: sid,
435
+ agentId: bucket.agentId,
436
+ skills: bucket.skills,
437
+ }));
438
+ return {
439
+ rootSessionId: sessionId,
440
+ perSession,
441
+ rolledUp,
442
+ totalInvocations,
443
+ };
444
+ }
445
+ async getFleetSkillUsage(opts) {
446
+ const since = opts?.since ?? null;
447
+ const includeDeleted = opts?.includeDeleted ?? false;
448
+ const { rows } = await this.pool.query(`SELECT * FROM ${this.sql.fn.getFleetSkillUsage}($1, $2)`, [since, includeDeleted]);
449
+ return {
450
+ windowStart: opts?.since ? opts.since.getTime() : null,
451
+ rows: rows.map((r) => ({
452
+ ...rowToSkillUsageRow(r),
453
+ agentId: r.agent_id ?? null,
454
+ sessionCount: Number(r.session_count) || 0,
455
+ })),
456
+ };
457
+ }
227
458
  async close() {
228
459
  if (this.pool) {
229
460
  await this.pool.end();
@@ -234,6 +465,14 @@ export class PgSessionCatalogProvider {
234
465
  // ─── Helpers ─────────────────────────────────────────────────────
235
466
  /** Map a PG row (snake_case) to SessionRow (camelCase). */
236
467
  function rowToSessionRow(row) {
468
+ const owner = row.owner_provider && row.owner_subject
469
+ ? {
470
+ provider: row.owner_provider,
471
+ subject: row.owner_subject,
472
+ email: row.owner_email ?? null,
473
+ displayName: row.owner_display_name ?? null,
474
+ }
475
+ : null;
237
476
  return {
238
477
  sessionId: row.session_id,
239
478
  orchestrationId: row.orchestration_id ?? null,
@@ -252,6 +491,7 @@ function rowToSessionRow(row) {
252
491
  isSystem: row.is_system ?? false,
253
492
  agentId: row.agent_id ?? null,
254
493
  splash: row.splash ?? null,
494
+ owner,
255
495
  };
256
496
  }
257
497
  /** Map a PG row to SessionEvent. */
@@ -265,8 +505,25 @@ function rowToSessionEvent(row) {
265
505
  workerNodeId: row.worker_node_id ?? undefined,
266
506
  };
267
507
  }
508
+ function normalizeOwnerKind(value) {
509
+ return value === "system" || value === "unowned" ? value : "user";
510
+ }
511
+ function userStatsOwnerKey(ownerKind, owner) {
512
+ if (ownerKind !== "user")
513
+ return ownerKind;
514
+ return `${owner?.provider || ""}\u0001${owner?.subject || ""}`;
515
+ }
516
+ function userStatsOwnerLabel(bucket) {
517
+ if (bucket.ownerKind === "system")
518
+ return "system";
519
+ if (bucket.ownerKind === "unowned")
520
+ return "unowned";
521
+ return String(bucket.owner?.displayName || bucket.owner?.email || bucket.owner?.subject || "user");
522
+ }
268
523
  /** Map a PG row to SessionMetricSummary. */
269
524
  function rowToSessionMetricSummary(row) {
525
+ const tokensInput = Number(row.tokens_input) || 0;
526
+ const tokensCacheRead = Number(row.tokens_cache_read) || 0;
270
527
  return {
271
528
  sessionId: row.session_id,
272
529
  agentId: row.agent_id ?? null,
@@ -279,13 +536,27 @@ function rowToSessionMetricSummary(row) {
279
536
  lastDehydratedAt: row.last_dehydrated_at ? new Date(row.last_dehydrated_at).getTime() : null,
280
537
  lastHydratedAt: row.last_hydrated_at ? new Date(row.last_hydrated_at).getTime() : null,
281
538
  lastCheckpointAt: row.last_checkpoint_at ? new Date(row.last_checkpoint_at).getTime() : null,
282
- tokensInput: Number(row.tokens_input) || 0,
539
+ tokensInput,
283
540
  tokensOutput: Number(row.tokens_output) || 0,
284
- tokensCacheRead: Number(row.tokens_cache_read) || 0,
541
+ tokensCacheRead,
285
542
  tokensCacheWrite: Number(row.tokens_cache_write) || 0,
543
+ cacheHitRatio: computeCacheHitRatio(tokensInput, tokensCacheRead),
286
544
  deletedAt: row.deleted_at ? new Date(row.deleted_at).getTime() : null,
287
545
  createdAt: new Date(row.created_at).getTime(),
288
546
  updatedAt: new Date(row.updated_at).getTime(),
289
547
  };
290
548
  }
549
+ /** Map a PG row to SkillUsageRow. Used for per-session, tree, and fleet rows. */
550
+ function rowToSkillUsageRow(row) {
551
+ const kind = row.kind === "learned" ? "learned" : "static";
552
+ return {
553
+ kind,
554
+ name: String(row.name ?? ""),
555
+ pluginName: row.plugin_name ?? null,
556
+ pluginVersion: row.plugin_version ?? null,
557
+ invocations: Number(row.invocations) || 0,
558
+ firstUsedAt: new Date(row.first_used_at ?? row.last_used_at),
559
+ lastUsedAt: new Date(row.last_used_at),
560
+ };
561
+ }
291
562
  //# sourceMappingURL=cms.js.map