@titan-design/session-analytics 0.5.0 → 0.6.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.
package/dist/index.d.ts CHANGED
@@ -242,6 +242,7 @@ declare const reviewerSchema: z.ZodObject<{
242
242
  sessions: z.ZodNumber;
243
243
  requestsPerPr: z.ZodNumber;
244
244
  requestsFrom: z.ZodString;
245
+ requestsFromSessions: z.ZodNumber;
245
246
  costUsd: z.ZodNumber;
246
247
  }, z.core.$strip>>;
247
248
  standing: z.ZodArray<z.ZodObject<{
@@ -250,6 +251,7 @@ declare const reviewerSchema: z.ZodObject<{
250
251
  sessions: z.ZodNumber;
251
252
  requestsPerPr: z.ZodNumber;
252
253
  requestsFrom: z.ZodString;
254
+ requestsFromSessions: z.ZodNumber;
253
255
  costUsd: z.ZodNumber;
254
256
  }, z.core.$strip>>;
255
257
  }, z.core.$strip>;
@@ -322,6 +324,7 @@ declare const handoffThresholdSchema: z.ZodObject<{
322
324
  sessions: z.ZodNumber;
323
325
  requestsPerPr: z.ZodNumber;
324
326
  requestsFrom: z.ZodString;
327
+ requestsFromSessions: z.ZodNumber;
325
328
  costUsd: z.ZodNumber;
326
329
  }, z.core.$strip>>;
327
330
  standing: z.ZodArray<z.ZodObject<{
@@ -330,6 +333,7 @@ declare const handoffThresholdSchema: z.ZodObject<{
330
333
  sessions: z.ZodNumber;
331
334
  requestsPerPr: z.ZodNumber;
332
335
  requestsFrom: z.ZodString;
336
+ requestsFromSessions: z.ZodNumber;
333
337
  costUsd: z.ZodNumber;
334
338
  }, z.core.$strip>>;
335
339
  }, z.core.$strip>;
@@ -657,6 +661,7 @@ declare const costReportSchema: z.ZodObject<{
657
661
  sessions: z.ZodNumber;
658
662
  requestsPerPr: z.ZodNumber;
659
663
  requestsFrom: z.ZodString;
664
+ requestsFromSessions: z.ZodNumber;
660
665
  costUsd: z.ZodNumber;
661
666
  }, z.core.$strip>>;
662
667
  standing: z.ZodArray<z.ZodObject<{
@@ -665,6 +670,7 @@ declare const costReportSchema: z.ZodObject<{
665
670
  sessions: z.ZodNumber;
666
671
  requestsPerPr: z.ZodNumber;
667
672
  requestsFrom: z.ZodString;
673
+ requestsFromSessions: z.ZodNumber;
668
674
  costUsd: z.ZodNumber;
669
675
  }, z.core.$strip>>;
670
676
  }, z.core.$strip>;
@@ -1132,11 +1138,15 @@ interface DenialRecord {
1132
1138
  /** What the refused call was doing, from its tool input; the reason label alone is loose. */
1133
1139
  action: string;
1134
1140
  tool: string;
1141
+ /** The refused call's id; a forked or resumed transcript repeats it, so it is counted once. */
1142
+ toolUseId?: string;
1135
1143
  }
1136
1144
  /** Classifies a refused call by what it did; MCP tools keep their own short name. */
1137
1145
  declare function classifyDeniedAction(tool: string, input: unknown): string;
1138
1146
  /** Scans transcript JSONL for classifier refusals and joins each to the tool call it refused. */
1139
1147
  declare function parseDenials(lines: Iterable<string>, seat: string): DenialRecord[];
1148
+ /** One denial per refused call; a record without a tool_use_id cannot be matched and is kept. */
1149
+ declare function dedupeDenials(denials: readonly DenialRecord[]): DenialRecord[];
1140
1150
 
1141
1151
  /** A seat journal line that states its implementer slot count, and why it did not fill a free slot. */
1142
1152
  interface SlotTick {
@@ -1374,4 +1384,276 @@ declare function blockedFlowReport(input: BlockedFlowInput): BlockedFlowReport;
1374
1384
  /** Each table's title names the JSON field its numbers come from; the sources close the report. */
1375
1385
  declare function renderBlockedFlowText(report: BlockedFlowReport): string;
1376
1386
 
1377
- export { ACTION_CLASSES, AGENT_LIFECYCLE, ALL_REPOS, type ActionCall, type ActionClass, type ActionRule, type AgentNameRow, BLOCKED_FLOW_SOURCES, BOOT_TOOL, type Band, type BlockedFlowInput, type BlockedFlowReport, type BlockedFlowSource, CHANNEL_CLUSTER_MS, CONTEXT_BANDS, CONTEXT_RESET_TOKENS, COORDINATOR_MERGE_DEDUPE_REQUESTS, COORDINATOR_MIN_EPISODE_REQUESTS, COORDINATOR_WAVE_QUIET_REQUESTS, COST_REPORT_SECTIONS, type CacheTtlBucket, type CacheTtlWhatIf, type CostBucket, type CostReport, type CostReportOptions, type CostReportSection, type CycleParams, DEFAULT_ACTION_RULES, DEFAULT_CONFIGURED_K, DEFAULT_EPISODE_ROLES, DEFAULT_K_SWEEP, DEFAULT_MECHANICAL_CLASSES, DEFAULT_NO_ACTION_CLASSES, DEFAULT_REVIEWER_PRS, DEFAULT_REVIEWER_ROLE, DEFAULT_STANDING_ROLE, type DenialRecord, type EpisodeInbound, type EpisodeInput, type EpisodeNames, type EpisodeRequest, type EpisodeRequestRow, type EpisodeSignal, GAP_BANDS, HEURISTIC_VERSIONS, type HandoffCohort, type HandoffOptions, type HandoffRequestRow, type HandoffSession, type HandoffTeleport, type HandoffThreshold, type Heuristic, type HumanRole, IDLE_GAP_MS, type IdleSlotRow, type KSweep, LIST_PRICE_CAVEAT, type LatencyRow, type LatencyStats, type MechanicalShare, type MergeOutcome, type MergeStatus, POOLED_REVIEWERS, PRICE_TABLE, PRICE_TABLE_VERSION, PROFILE_ROLES, type ParsedVerdict, type PriceRow, type PricedRequest, type PullState, REBUILD_GAP_BANDS, type ReportScope, type ReportWindow, type RequestTokens, type ReviewerComparison, type RoleActions, STANDING_PEER_MIN_ASSIGNMENTS, STANDING_PEER_MIN_HOURS, type SeatJournal, type SessionClass, type SessionClassification, type SessionFacts, type SessionOrigin, type SlotTick, TELEPORT_EVENT, TICK_HOLD_MAX_MIN, TOKEN_CLASSES, type TaskInitiative, type TeleportEvent, type TokenClass, type TtlRequestRow, UNSTATED_REASON, type VerdictRecord, WAKE_FROM_KINDS, type WakeCauseBucket, type WakeCauseEpisodes, type WakeEpisode, type WakeEpisodes, type WakeEventRow, type WakeFromKind, type WakeGapCell, type WakePair, type WorkerFacts, type WorkerRole, type WrittenEpisodes, assignmentCount, bandOf, blockedFlowReport, blockedFlowSchema, buildEpisodes, buildWakeEpisodes, cacheTtlReport, cacheTtlWhatIf, cacheTtlWhatIfSchema, classifyDeniedAction, classifyRequest, classifySession, contextBand, costPerRequest, costReport, costReportSchema, episodeNames, findPrice, gapBand, handoffThreshold, handoffThresholdSchema, heuristicFor, idleSlotMinutes, initiativeFromCwd, isBootAction, latencyStats, latencyStatsSchema, mergeOutcomes, parseDenials, parseSeatJournal, parseTeleportEvents, parseVerdict, prKey, priceRequest, readEpisodeInput, readRequestToolCalls, readTtlRows, renderBlockedFlowText, renderCacheTtlText, renderCostReportSections, renderCostReportText, roleFromProfile, scopeFilter, sessionInitiative, sessionRole, summarizeWakeEpisodes, sweepK, wakeEpisodesSchema, workerRole, writeEpisodes };
1387
+ /** One agent-chat broker.log entry and the 1-based line it came from, so each finding can cite it. */
1388
+ interface BrokerEntry {
1389
+ line: number;
1390
+ ts: string;
1391
+ event: string;
1392
+ fields: Record<string, unknown>;
1393
+ }
1394
+ /** Broker log lines to entries; a line that is not a JSON object with `ts` and `event` is skipped but still counted. */
1395
+ declare function parseBrokerLog(lines: Iterable<string>): BrokerEntry[];
1396
+
1397
+ /**
1398
+ * How a route missed a recipient: `failed` is a `delivered:false` the broker dropped, `partial` reached
1399
+ * others but not this name, and `queued` is a `delivered:false` the broker kept for later delivery.
1400
+ */
1401
+ type RouteMissKind = "failed" | "partial" | "queued";
1402
+ /** One recipient a routed message did not reach when it was sent. */
1403
+ interface RouteMiss {
1404
+ line: number;
1405
+ at: string;
1406
+ recipient: string;
1407
+ from: string;
1408
+ kind: string;
1409
+ miss: RouteMissKind;
1410
+ }
1411
+ interface RouteFailureRow {
1412
+ recipient: string;
1413
+ failed: number;
1414
+ partial: number;
1415
+ queued: number;
1416
+ first: string;
1417
+ last: string;
1418
+ lines: number[];
1419
+ }
1420
+ /** Each recipient named in `to` that a route did not reach. */
1421
+ declare function routeMisses(entries: readonly BrokerEntry[]): RouteMiss[];
1422
+ /** Misses grouped by recipient, most first. */
1423
+ declare function routeFailureRows(misses: readonly RouteMiss[]): RouteFailureRow[];
1424
+ declare function countMisses(misses: readonly RouteMiss[]): Record<RouteMissKind, number>;
1425
+
1426
+ /** A seat off the broker for longer than this is dark; a teleport hand-off takes seconds. */
1427
+ declare const DARK_MIN = 5;
1428
+ /** A name deregistered from the broker until it registered again, or until asOf if it never did, without exiting in between. */
1429
+ interface DarkGap {
1430
+ seat: string;
1431
+ from: string;
1432
+ to: string | null;
1433
+ minutes: number;
1434
+ /** A teleport of this name started after its last registration and before the gap closed. */
1435
+ teleport: boolean;
1436
+ /** Routes to the seat during the gap logged `delivered:false` and dropped. */
1437
+ failedRoutes: number;
1438
+ /** Routes during the gap that reached other recipients but not the seat. */
1439
+ partialRoutes: number;
1440
+ /** Routes the broker held or queued in the seat's inbox for delivery when it returned. */
1441
+ queuedRoutes: number;
1442
+ /** The deregistered and registered lines, then any teleport lines. */
1443
+ lines: number[];
1444
+ routeLines: number[];
1445
+ }
1446
+ /** Gaps longer than DARK_MIN, skipping a clean exit and later resume; one still open at asOf counts only if a route missed the seat in it. */
1447
+ declare function darkGaps(entries: readonly BrokerEntry[], misses: readonly RouteMiss[], asOf: string): DarkGap[];
1448
+
1449
+ /** An `agent_spawned` row of agent-chat's events table: the agent id and the profile it ran under. */
1450
+ interface SpawnRecord {
1451
+ eventId: number;
1452
+ agentId: string;
1453
+ name: string;
1454
+ profile: string | null;
1455
+ }
1456
+ /** An agent the broker saw exit without reporting to its spawner. */
1457
+ interface UnreportedExit {
1458
+ at: string;
1459
+ line: number;
1460
+ agentId: string;
1461
+ name: string;
1462
+ spawner: string;
1463
+ lastAction: string;
1464
+ /** The `agent_spawned` row the profile came from, or null when none matched the agent id. */
1465
+ spawnEventId: number | null;
1466
+ }
1467
+ interface UnreportedExitRow {
1468
+ profile: string;
1469
+ count: number;
1470
+ exits: UnreportedExit[];
1471
+ }
1472
+ declare const UNKNOWN_PROFILE = "unknown";
1473
+ /** Broker `unreported-exit` lines grouped by the profile the agent was spawned with, most first. */
1474
+ declare function unreportedExitRows(entries: readonly BrokerEntry[], spawns: readonly SpawnRecord[]): UnreportedExitRow[];
1475
+
1476
+ /** A prompt this old with nothing after it from the agent is a hang, not a pause for the owner. */
1477
+ declare const PROMPT_STALE_MIN = 10;
1478
+ /** The newest events-table row an actor wrote before asOf. */
1479
+ interface LastEventRecord {
1480
+ eventId: number;
1481
+ at: string;
1482
+ actor: string;
1483
+ kind: string;
1484
+ /** `meta.tool_name` of an approval request. */
1485
+ tool: string | null;
1486
+ /** A `resolution` row whose `ref` is this request's msg_id, written before asOf. */
1487
+ resolutionEventId: number | null;
1488
+ /** An `agent_exited` or `agent_retired` row for this actor after the request and before asOf. */
1489
+ endEventId: number | null;
1490
+ }
1491
+ interface StalePromptRow {
1492
+ agent: string;
1493
+ at: string;
1494
+ ageMin: number;
1495
+ tool: string | null;
1496
+ eventId: number;
1497
+ resolutionEventId: number | null;
1498
+ }
1499
+ /** Live agents whose last event is an approval request older than PROMPT_STALE_MIN, oldest first; resolved ones included. */
1500
+ declare function stalePromptRows(lastEvents: readonly LastEventRecord[], broker: readonly BrokerEntry[], asOf: string): StalePromptRow[];
1501
+
1502
+ /** Where each section's findings come from: the command that re-reads them and the field it reads. */
1503
+ declare const LIVENESS_SOURCES: {
1504
+ readonly registrations: {
1505
+ readonly command: "grep -nE '\"event\":\"(registered|deregistered|agent_exited|teleport_started|teleport_completed|teleport_failed|teleport_aborted)\"' <broker.log>";
1506
+ readonly field: "ts, event, name; cited as broker.log line numbers; a gap with a clean agent_exited (code 0, not inferred) and no teleport is a resume";
1507
+ };
1508
+ readonly routes: {
1509
+ readonly command: "grep -n '\"event\":\"route\"' <broker.log>";
1510
+ readonly field: "to, delivered, recipients";
1511
+ };
1512
+ readonly exits: {
1513
+ readonly command: "grep -n '\"event\":\"unreported-exit\"' <broker.log>";
1514
+ readonly field: "agentId, name, spawner, lastAction";
1515
+ };
1516
+ readonly spawns: {
1517
+ readonly command: "sqlite3 -readonly <events.db> \"SELECT id, msg_id, target, json_extract(meta,'$.profile') FROM events WHERE kind='agent_spawned'\"";
1518
+ readonly field: "events.msg_id (agent id), events.meta.profile";
1519
+ };
1520
+ readonly prompts: {
1521
+ readonly command: "sqlite3 -readonly <events.db> \"SELECT e.* FROM events e JOIN (SELECT actor, max(id) id FROM events WHERE ts < <asOf> AND kind != 'resolution' GROUP BY actor) l ON e.id = l.id WHERE e.kind='approval_request'\"";
1522
+ readonly field: "events.ts, events.actor, events.meta.tool_name; a resolution row's events.ref; skipped after the actor's agent_exited or agent_retired, or a broker_started it never re-registered after";
1523
+ };
1524
+ };
1525
+ type LivenessSource = keyof typeof LIVENESS_SOURCES;
1526
+ interface LivenessInput {
1527
+ broker: readonly BrokerEntry[];
1528
+ spawns: readonly SpawnRecord[];
1529
+ lastEvents: readonly LastEventRecord[];
1530
+ /** Gaps still open and prompt ages are measured to here; later entries are ignored. */
1531
+ asOf: string;
1532
+ /** A finding is kept when it starts inside the window; a prompt from a live agent still unanswered at asOf is kept however old. */
1533
+ window?: {
1534
+ since?: string;
1535
+ until?: string;
1536
+ };
1537
+ /** Keeps only findings about these names: the dark seat, route recipient, exiting agent or its spawner, prompting agent. */
1538
+ seats?: readonly string[];
1539
+ }
1540
+ declare const livenessSchema: z.ZodObject<{
1541
+ asOf: z.ZodString;
1542
+ window: z.ZodObject<{
1543
+ since: z.ZodOptional<z.ZodString>;
1544
+ until: z.ZodOptional<z.ZodString>;
1545
+ }, z.core.$strip>;
1546
+ thresholds: z.ZodObject<{
1547
+ darkMin: z.ZodNumber;
1548
+ promptStaleMin: z.ZodNumber;
1549
+ }, z.core.$strip>;
1550
+ sources: z.ZodRecord<z.ZodEnum<{
1551
+ exits: "exits";
1552
+ registrations: "registrations";
1553
+ routes: "routes";
1554
+ spawns: "spawns";
1555
+ prompts: "prompts";
1556
+ }>, z.ZodObject<{
1557
+ command: z.ZodString;
1558
+ field: z.ZodString;
1559
+ }, z.core.$strip>>;
1560
+ darkSeats: z.ZodObject<{
1561
+ cites: z.ZodArray<z.ZodEnum<{
1562
+ exits: "exits";
1563
+ registrations: "registrations";
1564
+ routes: "routes";
1565
+ spawns: "spawns";
1566
+ prompts: "prompts";
1567
+ }>>;
1568
+ withTeleport: z.ZodNumber;
1569
+ withoutTeleport: z.ZodNumber;
1570
+ rows: z.ZodArray<z.ZodObject<{
1571
+ seat: z.ZodString;
1572
+ from: z.ZodString;
1573
+ to: z.ZodNullable<z.ZodString>;
1574
+ minutes: z.ZodNumber;
1575
+ teleport: z.ZodBoolean;
1576
+ failedRoutes: z.ZodNumber;
1577
+ partialRoutes: z.ZodNumber;
1578
+ queuedRoutes: z.ZodNumber;
1579
+ lines: z.ZodArray<z.ZodNumber>;
1580
+ routeLines: z.ZodArray<z.ZodNumber>;
1581
+ }, z.core.$strip>>;
1582
+ }, z.core.$strip>;
1583
+ routeFailures: z.ZodObject<{
1584
+ cites: z.ZodArray<z.ZodEnum<{
1585
+ exits: "exits";
1586
+ registrations: "registrations";
1587
+ routes: "routes";
1588
+ spawns: "spawns";
1589
+ prompts: "prompts";
1590
+ }>>;
1591
+ failed: z.ZodNumber;
1592
+ partial: z.ZodNumber;
1593
+ queued: z.ZodNumber;
1594
+ rows: z.ZodArray<z.ZodObject<{
1595
+ recipient: z.ZodString;
1596
+ failed: z.ZodNumber;
1597
+ partial: z.ZodNumber;
1598
+ queued: z.ZodNumber;
1599
+ first: z.ZodString;
1600
+ last: z.ZodString;
1601
+ lines: z.ZodArray<z.ZodNumber>;
1602
+ }, z.core.$strip>>;
1603
+ }, z.core.$strip>;
1604
+ unreportedExits: z.ZodObject<{
1605
+ cites: z.ZodArray<z.ZodEnum<{
1606
+ exits: "exits";
1607
+ registrations: "registrations";
1608
+ routes: "routes";
1609
+ spawns: "spawns";
1610
+ prompts: "prompts";
1611
+ }>>;
1612
+ total: z.ZodNumber;
1613
+ rows: z.ZodArray<z.ZodObject<{
1614
+ profile: z.ZodString;
1615
+ count: z.ZodNumber;
1616
+ exits: z.ZodArray<z.ZodObject<{
1617
+ at: z.ZodString;
1618
+ line: z.ZodNumber;
1619
+ agentId: z.ZodString;
1620
+ name: z.ZodString;
1621
+ spawner: z.ZodString;
1622
+ lastAction: z.ZodString;
1623
+ spawnEventId: z.ZodNullable<z.ZodNumber>;
1624
+ }, z.core.$strip>>;
1625
+ }, z.core.$strip>>;
1626
+ }, z.core.$strip>;
1627
+ stalePrompts: z.ZodObject<{
1628
+ cites: z.ZodArray<z.ZodEnum<{
1629
+ exits: "exits";
1630
+ registrations: "registrations";
1631
+ routes: "routes";
1632
+ spawns: "spawns";
1633
+ prompts: "prompts";
1634
+ }>>;
1635
+ rows: z.ZodArray<z.ZodObject<{
1636
+ agent: z.ZodString;
1637
+ at: z.ZodString;
1638
+ ageMin: z.ZodNumber;
1639
+ tool: z.ZodNullable<z.ZodString>;
1640
+ eventId: z.ZodNumber;
1641
+ resolutionEventId: z.ZodNullable<z.ZodNumber>;
1642
+ }, z.core.$strip>>;
1643
+ resolvedRows: z.ZodArray<z.ZodObject<{
1644
+ agent: z.ZodString;
1645
+ at: z.ZodString;
1646
+ ageMin: z.ZodNumber;
1647
+ tool: z.ZodNullable<z.ZodString>;
1648
+ eventId: z.ZodNumber;
1649
+ resolutionEventId: z.ZodNullable<z.ZodNumber>;
1650
+ }, z.core.$strip>>;
1651
+ }, z.core.$strip>;
1652
+ }, z.core.$strip>;
1653
+ type LivenessReport = z.infer<typeof livenessSchema>;
1654
+ /** Seats dark past DARK_MIN, routes that missed their recipient, unreported exits and agents stuck on a prompt. */
1655
+ declare function livenessReport(input: LivenessInput): LivenessReport;
1656
+ /** Each table's title names the JSON field its rows come from; the sources and the shared caveat close the report. */
1657
+ declare function renderLivenessText(report: LivenessReport): string;
1658
+
1659
+ export { ACTION_CLASSES, AGENT_LIFECYCLE, ALL_REPOS, type ActionCall, type ActionClass, type ActionRule, type AgentNameRow, BLOCKED_FLOW_SOURCES, BOOT_TOOL, type Band, type BlockedFlowInput, type BlockedFlowReport, type BlockedFlowSource, type BrokerEntry, CHANNEL_CLUSTER_MS, CONTEXT_BANDS, CONTEXT_RESET_TOKENS, COORDINATOR_MERGE_DEDUPE_REQUESTS, COORDINATOR_MIN_EPISODE_REQUESTS, COORDINATOR_WAVE_QUIET_REQUESTS, COST_REPORT_SECTIONS, type CacheTtlBucket, type CacheTtlWhatIf, type CostBucket, type CostReport, type CostReportOptions, type CostReportSection, type CycleParams, DARK_MIN, DEFAULT_ACTION_RULES, DEFAULT_CONFIGURED_K, DEFAULT_EPISODE_ROLES, DEFAULT_K_SWEEP, DEFAULT_MECHANICAL_CLASSES, DEFAULT_NO_ACTION_CLASSES, DEFAULT_REVIEWER_PRS, DEFAULT_REVIEWER_ROLE, DEFAULT_STANDING_ROLE, type DarkGap, type DenialRecord, type EpisodeInbound, type EpisodeInput, type EpisodeNames, type EpisodeRequest, type EpisodeRequestRow, type EpisodeSignal, GAP_BANDS, HEURISTIC_VERSIONS, type HandoffCohort, type HandoffOptions, type HandoffRequestRow, type HandoffSession, type HandoffTeleport, type HandoffThreshold, type Heuristic, type HumanRole, IDLE_GAP_MS, type IdleSlotRow, type KSweep, LIST_PRICE_CAVEAT, LIVENESS_SOURCES, type LastEventRecord, type LatencyRow, type LatencyStats, type LivenessInput, type LivenessReport, type LivenessSource, type MechanicalShare, type MergeOutcome, type MergeStatus, POOLED_REVIEWERS, PRICE_TABLE, PRICE_TABLE_VERSION, PROFILE_ROLES, PROMPT_STALE_MIN, type ParsedVerdict, type PriceRow, type PricedRequest, type PullState, REBUILD_GAP_BANDS, type ReportScope, type ReportWindow, type RequestTokens, type ReviewerComparison, type RoleActions, type RouteFailureRow, type RouteMiss, type RouteMissKind, STANDING_PEER_MIN_ASSIGNMENTS, STANDING_PEER_MIN_HOURS, type SeatJournal, type SessionClass, type SessionClassification, type SessionFacts, type SessionOrigin, type SlotTick, type SpawnRecord, type StalePromptRow, TELEPORT_EVENT, TICK_HOLD_MAX_MIN, TOKEN_CLASSES, type TaskInitiative, type TeleportEvent, type TokenClass, type TtlRequestRow, UNKNOWN_PROFILE, UNSTATED_REASON, type UnreportedExit, type UnreportedExitRow, type VerdictRecord, WAKE_FROM_KINDS, type WakeCauseBucket, type WakeCauseEpisodes, type WakeEpisode, type WakeEpisodes, type WakeEventRow, type WakeFromKind, type WakeGapCell, type WakePair, type WorkerFacts, type WorkerRole, type WrittenEpisodes, assignmentCount, bandOf, blockedFlowReport, blockedFlowSchema, buildEpisodes, buildWakeEpisodes, cacheTtlReport, cacheTtlWhatIf, cacheTtlWhatIfSchema, classifyDeniedAction, classifyRequest, classifySession, contextBand, costPerRequest, costReport, costReportSchema, countMisses, darkGaps, dedupeDenials, episodeNames, findPrice, gapBand, handoffThreshold, handoffThresholdSchema, heuristicFor, idleSlotMinutes, initiativeFromCwd, isBootAction, latencyStats, latencyStatsSchema, livenessReport, livenessSchema, mergeOutcomes, parseBrokerLog, parseDenials, parseSeatJournal, parseTeleportEvents, parseVerdict, prKey, priceRequest, readEpisodeInput, readRequestToolCalls, readTtlRows, renderBlockedFlowText, renderCacheTtlText, renderCostReportSections, renderCostReportText, renderLivenessText, roleFromProfile, routeFailureRows, routeMisses, scopeFilter, sessionInitiative, sessionRole, stalePromptRows, summarizeWakeEpisodes, sweepK, unreportedExitRows, wakeEpisodesSchema, workerRole, writeEpisodes };