codesesh 1.0.7 → 1.0.9

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 (66) hide show
  1. package/README.md +17 -1
  2. package/dist/{chunk-WIWK7BXS.js → chunk-5YY675UR.js} +25 -26
  3. package/dist/chunk-5YY675UR.js.map +1 -0
  4. package/dist/{chunk-VVCSQU5B.js → chunk-CIMPLUT6.js} +6 -6
  5. package/dist/chunk-CIMPLUT6.js.map +1 -0
  6. package/dist/{chunk-QHWSZFRM.js → chunk-MOZLVHCC.js} +23 -5
  7. package/dist/chunk-MOZLVHCC.js.map +1 -0
  8. package/dist/{chunk-DE6UJMOY.js → chunk-QFG33PKR.js} +3 -2
  9. package/dist/chunk-QFG33PKR.js.map +1 -0
  10. package/dist/{chunk-YEQTRALH.js → chunk-RDTQ2WPR.js} +3 -3
  11. package/dist/chunk-RDTQ2WPR.js.map +1 -0
  12. package/dist/{chunk-SII3M66U.js → chunk-ZDH2BKQK.js} +701 -9
  13. package/dist/chunk-ZDH2BKQK.js.map +1 -0
  14. package/dist/{chunk-EYZ73CYP.js → chunk-ZLU7ODBV.js} +2 -2
  15. package/dist/{discovery-4WAEYSTR.js → discovery-MS2ZSMZ5.js} +5 -5
  16. package/dist/index.js +10 -10
  17. package/dist/index.js.map +1 -1
  18. package/dist/project-identity-worker.js +4 -4
  19. package/dist/scan-refresh-worker.js +6 -6
  20. package/dist/search-index-worker.js +6 -6
  21. package/dist/session-detail-worker.js +6 -6
  22. package/dist/smart-tag-worker.js +3 -3
  23. package/dist/web/assets/CustomTimeWindowDialog-CGPvUFkc.js +1 -0
  24. package/dist/web/assets/DetailLanding-Dgb2Qg8H.js +1 -0
  25. package/dist/web/assets/DialogTitle-B8zPwJB8.js +1 -0
  26. package/dist/web/assets/InteractiveReceipt-SckXLiPB.js +1 -0
  27. package/dist/web/assets/OverviewScreen-D44AMeDu.js +1 -0
  28. package/dist/web/assets/PrismHighlighter-D7JLjKja.js +6 -0
  29. package/dist/web/assets/Projects-DVHOqH2Z.js +1 -0
  30. package/dist/web/assets/SearchResultsPanel-B1WEw9Q5.js +1 -0
  31. package/dist/web/assets/SessionDetail-J00I4QfE.js +53 -0
  32. package/dist/web/assets/SmartTagChips-BMP9pPRw.js +1 -0
  33. package/dist/web/assets/{api-ToidoNW6.js → api-CtZGdxlN.js} +1 -1
  34. package/dist/web/assets/index-BIpTq_7T.js +1423 -0
  35. package/dist/web/assets/index-BXhaumu7.css +1 -0
  36. package/dist/web/assets/jsx-runtime-D3jfb0Ew.js +1 -0
  37. package/dist/web/assets/panel-B-5dVddJ.js +1 -0
  38. package/dist/web/assets/session-indexes-3LjxBYNe.js +4 -0
  39. package/dist/web/assets/translate-CLoII3EO.js +2 -0
  40. package/dist/web/assets/utils-BuYa9y6l.js +1 -0
  41. package/dist/web/icon/agent/cherrystudio.svg +7 -0
  42. package/dist/web/icon/agent/deepchat.LICENSE.txt +206 -0
  43. package/dist/web/icon/agent/deepchat.svg +6 -0
  44. package/dist/web/index.html +10 -196
  45. package/package.json +3 -3
  46. package/dist/chunk-DE6UJMOY.js.map +0 -1
  47. package/dist/chunk-QHWSZFRM.js.map +0 -1
  48. package/dist/chunk-SII3M66U.js.map +0 -1
  49. package/dist/chunk-VVCSQU5B.js.map +0 -1
  50. package/dist/chunk-WIWK7BXS.js.map +0 -1
  51. package/dist/chunk-YEQTRALH.js.map +0 -1
  52. package/dist/web/assets/CustomTimeWindowDialog-CVURkiVO.js +0 -1
  53. package/dist/web/assets/InteractiveReceipt-DGC-xV7U.js +0 -1
  54. package/dist/web/assets/OverviewScreen-DoXrZ5qp.js +0 -1
  55. package/dist/web/assets/PrismHighlighter-02695Lmx.js +0 -6
  56. package/dist/web/assets/Projects-DZiYh6hp.js +0 -1
  57. package/dist/web/assets/SearchResultsPanel-CAQe8Di0.js +0 -1
  58. package/dist/web/assets/SessionDetail-Da8EBygt.js +0 -53
  59. package/dist/web/assets/index-Bl8pbRFj.js +0 -1423
  60. package/dist/web/assets/index-CRI1m3xN.css +0 -1
  61. package/dist/web/assets/jsx-runtime-B-hcVAMW.js +0 -1
  62. package/dist/web/assets/session-indexes-D5gps7K8.js +0 -4
  63. package/dist/web/assets/translate-BDFu3ZiK.js +0 -2
  64. package/dist/web/assets/utils-BIZi2up3.js +0 -1
  65. /package/dist/{chunk-EYZ73CYP.js.map → chunk-ZLU7ODBV.js.map} +0 -0
  66. /package/dist/{discovery-4WAEYSTR.js.map → discovery-MS2ZSMZ5.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../core/src/analytics/cost-attribution.ts","../../core/src/analytics/dashboard.ts","../../core/src/analytics/projects.ts"],"sourcesContent":["import type { CostSource, SessionHead } from \"../types/session.js\";\nimport {\n getSessionReferenceKey,\n type SessionTree,\n type SessionTreeNode,\n} from \"../contract/index.js\";\nimport type {\n DashboardCostFacts,\n MessageCostFact,\n SessionCostSummary,\n SessionModelCostFact,\n} from \"./cost-facts.js\";\n\nconst COST_ABSOLUTE_TOLERANCE = 1e-8;\nconst COST_RELATIVE_TOLERANCE = 1e-6;\n\ninterface MetricFactIndex {\n messagesBySession: Map<string, MessageCostFact[]>;\n summariesBySession: Map<string, SessionCostSummary>;\n}\n\nexport interface AttributedCost {\n entry: SessionTreeNode;\n time: number;\n cost: number;\n source: CostSource;\n modelCosts: SessionModelCostFact[];\n}\n\nexport interface CostAttributionOptions {\n from?: number;\n to: number;\n facts?: DashboardCostFacts | null;\n matchesEntry?: (session: SessionHead) => boolean;\n}\n\nexport interface AttributedUsage {\n entry: SessionTreeNode;\n time: number;\n messages: number;\n totalTokens: number;\n inputTokens: number;\n outputTokens: number;\n cacheReadTokens: number;\n cacheCreateTokens: number;\n}\n\nexport type UsageAttributionOptions = CostAttributionOptions;\n\nfunction indexFacts(facts: DashboardCostFacts | null | undefined): MetricFactIndex {\n const messagesBySession = new Map<string, MessageCostFact[]>();\n const summariesBySession = new Map<string, SessionCostSummary>();\n if (!facts) return { messagesBySession, summariesBySession };\n\n for (const summary of facts.sessions) {\n summariesBySession.set(getSessionReferenceKey(summary.reference), summary);\n }\n for (const message of facts.messages) {\n const key = getSessionReferenceKey(message.reference);\n const messages = messagesBySession.get(key);\n if (messages) messages.push(message);\n else messagesBySession.set(key, [message]);\n }\n return { messagesBySession, summariesBySession };\n}\n\nfunction nonNegative(value: number | undefined): number {\n return Math.max(0, Number(value ?? 0));\n}\n\nfunction costsReconcile(left: number, right: number): boolean {\n const tolerance = Math.max(\n COST_ABSOLUTE_TOLERANCE,\n Math.max(Math.abs(left), Math.abs(right)) * COST_RELATIVE_TOLERANCE,\n );\n return Math.abs(left - right) <= tolerance;\n}\n\nfunction hasDetailedCost(session: SessionHead, summary: SessionCostSummary | undefined): boolean {\n const totalCost = Math.max(0, session.stats.total_cost);\n return (\n totalCost > 0 &&\n summary != null &&\n summary.untimedMessageCost <= COST_ABSOLUTE_TOLERANCE &&\n costsReconcile(summary.messageCost, totalCost)\n );\n}\n\nfunction hasDetailedMessages(\n session: SessionHead,\n summary: SessionCostSummary | undefined,\n): boolean {\n return (\n summary != null &&\n summary.untimedMessageCount === 0 &&\n summary.messageCount === nonNegative(session.stats.message_count)\n );\n}\n\n// Provider payloads disagree on whether reasoning is already included in output.\nfunction detailedOutputIncludesReasoning(\n session: SessionHead,\n summary: SessionCostSummary | undefined,\n): boolean | null {\n if (!summary) return null;\n const stats = session.stats;\n const sessionInput = nonNegative(stats.total_input_tokens);\n const sessionOutput = nonNegative(stats.total_output_tokens);\n const sessionCacheRead = nonNegative(stats.total_cache_read_tokens);\n const sessionCacheCreate = nonNegative(stats.total_cache_create_tokens);\n const sessionTotal = nonNegative(stats.total_tokens ?? sessionInput + sessionOutput);\n const outputIncludesReasoning = summary.outputTokens + summary.reasoningTokens;\n const outputMatches = summary.outputTokens === sessionOutput;\n const outputWithReasoningMatches = outputIncludesReasoning === sessionOutput;\n const effectiveOutput = outputMatches\n ? summary.outputTokens\n : outputWithReasoningMatches\n ? outputIncludesReasoning\n : null;\n\n if (\n effectiveOutput == null ||\n summary.inputTokens !== sessionInput ||\n summary.cacheReadTokens !== sessionCacheRead ||\n summary.cacheCreateTokens !== sessionCacheCreate ||\n summary.inputTokens + effectiveOutput !== sessionTotal ||\n summary.untimedInputTokens > 0 ||\n summary.untimedOutputTokens > 0 ||\n summary.untimedReasoningTokens > 0 ||\n summary.untimedCacheReadTokens > 0 ||\n summary.untimedCacheCreateTokens > 0\n ) {\n return null;\n }\n return !outputMatches && outputWithReasoningMatches;\n}\n\nfunction isInWindow(time: number, from: number | undefined, to: number): boolean {\n return (from == null || time >= from) && time <= to;\n}\n\nfunction resolvedCostSource(session: SessionHead, source?: CostSource): CostSource {\n return source ?? session.stats.cost_source ?? \"recorded\";\n}\n\nfunction fallbackModelCosts(\n summary: SessionCostSummary | undefined,\n totalCost: number,\n): SessionModelCostFact[] {\n if (!summary) return [];\n const modelTotal = summary.modelCosts.reduce((sum, model) => sum + model.cost, 0);\n return modelTotal > totalCost && !costsReconcile(modelTotal, totalCost) ? [] : summary.modelCosts;\n}\n\nexport function visitAttributedCosts(\n tree: SessionTree,\n options: CostAttributionOptions,\n visit: (attributed: AttributedCost) => void,\n): void {\n const factIndex = indexFacts(options.facts);\n const factsAvailable = options.facts != null;\n\n for (const entry of tree.entries) {\n if (options.matchesEntry && !options.matchesEntry(entry.session)) continue;\n const fallbackTime = entry.session.time_updated ?? entry.session.time_created;\n const pending = [entry];\n\n while (pending.length > 0) {\n const node = pending.pop()!;\n for (const child of node.children) pending.push(child);\n\n const session = node.session;\n const totalCost = Math.max(0, session.stats.total_cost);\n if (totalCost <= 0) continue;\n const key = getSessionReferenceKey(session.reference);\n const summary = factIndex.summariesBySession.get(key);\n\n if (factsAvailable && hasDetailedCost(session, summary)) {\n for (const message of factIndex.messagesBySession.get(key) ?? []) {\n if (!isInWindow(message.time, options.from, options.to) || message.cost <= 0) continue;\n const source = resolvedCostSource(session, message.costSource);\n visit({\n entry,\n time: message.time,\n cost: message.cost,\n source,\n modelCosts: message.model\n ? [\n {\n model: message.model,\n cost: message.cost,\n costRecorded: source === \"recorded\" ? message.cost : 0,\n },\n ]\n : [],\n });\n }\n continue;\n }\n\n if (!isInWindow(fallbackTime, options.from, options.to)) continue;\n visit({\n entry,\n time: fallbackTime,\n cost: totalCost,\n source: resolvedCostSource(session),\n modelCosts: factsAvailable ? fallbackModelCosts(summary, totalCost) : [],\n });\n }\n }\n}\n\nexport function visitAttributedUsage(\n tree: SessionTree,\n options: UsageAttributionOptions,\n visit: (attributed: AttributedUsage) => void,\n): void {\n const factIndex = indexFacts(options.facts);\n const factsAvailable = options.facts != null;\n\n for (const entry of tree.entries) {\n if (options.matchesEntry && !options.matchesEntry(entry.session)) continue;\n const fallbackTime = entry.session.time_updated ?? entry.session.time_created;\n const pending = [entry];\n\n while (pending.length > 0) {\n const node = pending.pop()!;\n for (const child of node.children) pending.push(child);\n\n const session = node.session;\n const key = getSessionReferenceKey(session.reference);\n const summary = factIndex.summariesBySession.get(key);\n const detailedMessages = factsAvailable && hasDetailedMessages(session, summary);\n const outputIncludesReasoning = factsAvailable\n ? detailedOutputIncludesReasoning(session, summary)\n : null;\n const detailedTokens = outputIncludesReasoning != null;\n\n if (detailedMessages || detailedTokens) {\n for (const message of factIndex.messagesBySession.get(key) ?? []) {\n if (!isInWindow(message.time, options.from, options.to)) continue;\n const outputTokens = detailedTokens\n ? message.outputTokens + (outputIncludesReasoning ? message.reasoningTokens : 0)\n : 0;\n visit({\n entry,\n time: message.time,\n messages: detailedMessages ? 1 : 0,\n totalTokens: detailedTokens ? message.inputTokens + outputTokens : 0,\n inputTokens: detailedTokens ? message.inputTokens : 0,\n outputTokens,\n cacheReadTokens: detailedTokens ? message.cacheReadTokens : 0,\n cacheCreateTokens: detailedTokens ? message.cacheCreateTokens : 0,\n });\n }\n }\n\n if (!isInWindow(fallbackTime, options.from, options.to)) continue;\n if (!detailedMessages) {\n visit({\n entry,\n time: fallbackTime,\n messages: nonNegative(session.stats.message_count),\n totalTokens: 0,\n inputTokens: 0,\n outputTokens: 0,\n cacheReadTokens: 0,\n cacheCreateTokens: 0,\n });\n }\n if (!detailedTokens) {\n const inputTokens = nonNegative(session.stats.total_input_tokens);\n const outputTokens = nonNegative(session.stats.total_output_tokens);\n visit({\n entry,\n time: fallbackTime,\n messages: 0,\n totalTokens: nonNegative(session.stats.total_tokens ?? inputTokens + outputTokens),\n inputTokens,\n outputTokens,\n cacheReadTokens: nonNegative(session.stats.total_cache_read_tokens),\n cacheCreateTokens: nonNegative(session.stats.total_cache_create_tokens),\n });\n }\n }\n }\n}\n","/**\n * Dashboard analytics — pure aggregation over SessionHead[] with no HTTP or DB\n * coupling. The handler parses request params and supplies file-activity; this\n * module owns the domain math: per-agent metrics, daily buckets, model\n * distribution, project ranking and the recent-sessions window.\n *\n * Metrics are *inclusive*: the unit of work is a top-level node (root or\n * orphan) and every descendant's stats roll into it. See contract/session-tree.\n */\nimport type { AgentInfo } from \"../types/index.js\";\nimport type { CostSource, ProjectIdentityKind, SessionHead } from \"../types/session.js\";\nimport type {\n DashboardAgentStat,\n DashboardAggregate,\n DashboardDailyBucket,\n DashboardData,\n DashboardPreviousTotals,\n DashboardProjectRollup,\n DashboardProjectStat,\n DashboardRecentSession,\n DashboardTotals,\n ModelCostEntry,\n ModelDistributionEntry,\n SessionTree,\n SessionTreeNode,\n} from \"../contract/index.js\";\nimport {\n addCalendarDays,\n buildSessionTree,\n countCalendarDays,\n filterSessionTreeEntriesByActivityWindow,\n getProjectIdentityKey,\n getSessionAgentKey,\n toCalendarDayKey,\n} from \"../contract/index.js\";\nimport type { DashboardCostFacts } from \"./cost-facts.js\";\nimport { visitAttributedCosts, visitAttributedUsage } from \"./cost-attribution.js\";\n\nexport type {\n DashboardAgentStat,\n DashboardAggregate,\n DashboardDailyBucket,\n DashboardData,\n DashboardPreviousTotals,\n DashboardProjectRollup,\n DashboardProjectStat,\n DashboardRecentSession,\n DashboardTotals,\n ModelDistributionEntry,\n};\n\nexport const DASHBOARD_RECENT_LIMIT = 10;\nexport const DASHBOARD_PROJECT_LIMIT = 12;\nexport const PROJECT_SPARKLINE_DAYS = 14;\nconst MODEL_COST_LIMIT = 20;\n\nexport interface DashboardScope {\n agent?: string;\n projectKind?: ProjectIdentityKind;\n projectKey?: string;\n}\n\ninterface DashboardAgentAggregate {\n name: string;\n sessions: number;\n messages: number;\n tokens: number;\n cost: number;\n}\n\ninterface DashboardProjectAggregate {\n identityKind: ProjectIdentityKind;\n identityKey: string;\n displayName: string;\n sessions: number;\n messages: number;\n tokens: number;\n cost: number;\n hasEstimatedCost: boolean;\n agentSessions: Map<string, number>;\n sparkline: number[];\n}\n\ninterface DashboardRecentCandidate {\n session: SessionHead;\n activity: number;\n}\n\ninterface DashboardAccumulator {\n sessions: number;\n messages: number;\n tokens: number;\n cost: number;\n costRecorded: number;\n costEstimated: number;\n cacheReadTokens: number;\n hasEstimatedCost: boolean;\n agents: Map<string, DashboardAgentAggregate>;\n agentKeys: Set<string>;\n daily: Map<string, DashboardDailyBucket>;\n models: Map<string, { tokens: number; sessions: number }>;\n modelCosts: Map<string, ModelCostEntry>;\n projects: Map<string, DashboardProjectAggregate>;\n projectKeys: Set<string>;\n /** Calendar day key → sparkline slot; anchored at the window's `to`. */\n sparklineSlots: Map<string, number>;\n /** Activity-desc, capped at DASHBOARD_RECENT_LIMIT; index 0 is the latest entry. */\n recent: DashboardRecentCandidate[];\n}\n\nexport interface DashboardOptions {\n byAgentNames: string[];\n scope: DashboardScope;\n from?: number;\n to: number;\n agentInfoMap?: Map<string, AgentInfo>;\n /** Immediately preceding window of equal length; drives `totals.previous`. */\n compare?: { from: number; to: number };\n /** Message-level cost and usage facts; null/undefined keeps session-activity fallback behavior. */\n costFacts?: DashboardCostFacts | null;\n}\n\n// --- SessionHead domain helpers (shared with other handlers via re-export) ---\n\nexport function getTotalTokens(stats: SessionHead[\"stats\"]): number {\n return stats.total_tokens ?? stats.total_input_tokens + stats.total_output_tokens;\n}\n\nexport function getSessionAgentName(session: SessionHead): string {\n return getSessionAgentKey(session);\n}\n\nexport function getSessionActivityTime(session: SessionHead): number {\n return session.time_updated ?? session.time_created;\n}\n\nfunction matchesScope(session: SessionHead, scope: DashboardScope): boolean {\n if (scope.agent && getSessionAgentName(session) !== scope.agent) return false;\n if (scope.projectKind == null && scope.projectKey == null) return true;\n const identity = session.project_identity;\n // A half-specified scope matches nothing: identity fields are never undefined.\n return (\n identity != null && identity.kind === scope.projectKind && identity.key === scope.projectKey\n );\n}\n\n/** Top-level nodes (roots ∪ orphans) inside the window that match the scope. */\nfunction scopedEntries(\n tree: SessionTree,\n scope: DashboardScope,\n from: number | undefined,\n to: number,\n): SessionTreeNode[] {\n return filterSessionTreeEntriesByActivityWindow(tree, from, to).filter((node) =>\n matchesScope(node.session, scope),\n );\n}\n\nfunction emptyDailyBucket(date: string): DashboardDailyBucket {\n return {\n date,\n sessions: 0,\n messages: 0,\n cost: 0,\n input: 0,\n output: 0,\n cache_read: 0,\n cache_create: 0,\n };\n}\n\nfunction createAccumulator(\n byAgentNames: string[],\n scope: DashboardScope,\n to: number,\n): DashboardAccumulator {\n const agents = new Map<string, DashboardAgentAggregate>();\n for (const name of byAgentNames) {\n const key = name.toLowerCase();\n if (scope.agent && key !== scope.agent) continue;\n agents.set(key, { name, sessions: 0, messages: 0, tokens: 0, cost: 0 });\n }\n\n const sparklineSlots = new Map<string, number>();\n for (let slot = 0; slot < PROJECT_SPARKLINE_DAYS; slot += 1) {\n const day = addCalendarDays(to, slot - (PROJECT_SPARKLINE_DAYS - 1));\n sparklineSlots.set(toCalendarDayKey(day), slot);\n }\n\n return {\n sessions: 0,\n messages: 0,\n tokens: 0,\n cost: 0,\n costRecorded: 0,\n costEstimated: 0,\n cacheReadTokens: 0,\n hasEstimatedCost: false,\n agents,\n agentKeys: new Set(),\n daily: new Map(),\n models: new Map(),\n modelCosts: new Map(),\n projects: new Map(),\n projectKeys: new Set(),\n sparklineSlots,\n recent: [],\n };\n}\n\nfunction foldModelUsage(node: SessionTreeNode, into: Map<string, number>): void {\n if (node.session.model_usage) {\n for (const [model, tokens] of Object.entries(node.session.model_usage)) {\n into.set(model, (into.get(model) ?? 0) + tokens);\n }\n }\n for (const child of node.children) foldModelUsage(child, into);\n}\n\nfunction getOrCreateProject(\n session: SessionHead,\n acc: DashboardAccumulator,\n): DashboardProjectAggregate | undefined {\n const identity = session.project_identity;\n if (!identity) return undefined;\n\n const key = getProjectIdentityKey(identity);\n let project = acc.projects.get(key);\n if (!project) {\n project = {\n identityKind: identity.kind,\n identityKey: identity.key,\n displayName: identity.displayName,\n sessions: 0,\n messages: 0,\n tokens: 0,\n cost: 0,\n hasEstimatedCost: false,\n agentSessions: new Map(),\n sparkline: Array.from({ length: PROJECT_SPARKLINE_DAYS }, () => 0),\n };\n acc.projects.set(key, project);\n }\n return project;\n}\n\nfunction trackProjectActivity(\n node: SessionTreeNode,\n acc: DashboardAccumulator,\n agentKey: string,\n): void {\n const identity = node.session.project_identity;\n const project = getOrCreateProject(node.session, acc);\n if (!identity || !project) return;\n\n project.sessions += 1;\n project.agentSessions.set(agentKey, (project.agentSessions.get(agentKey) ?? 0) + 1);\n acc.projectKeys.add(getProjectIdentityKey(identity));\n}\n\n/** Fold activity metrics for one top-level node and its inclusive subtree. */\nfunction accumulateActivity(node: SessionTreeNode, acc: DashboardAccumulator): void {\n const session = node.session;\n const activity = getSessionActivityTime(session);\n const agentKey = getSessionAgentName(session);\n\n acc.sessions += 1;\n acc.agentKeys.add(agentKey);\n\n const metric = acc.agents.get(agentKey);\n if (metric) {\n metric.sessions += 1;\n }\n\n const dayKey = toCalendarDayKey(activity);\n let bucket = acc.daily.get(dayKey);\n if (!bucket) {\n bucket = emptyDailyBucket(dayKey);\n acc.daily.set(dayKey, bucket);\n }\n bucket.sessions += 1;\n\n const usage = new Map<string, number>();\n foldModelUsage(node, usage);\n for (const [model, tokens] of usage) {\n const entry = acc.models.get(model);\n if (entry) {\n entry.tokens += tokens;\n entry.sessions += 1;\n } else {\n acc.models.set(model, { tokens, sessions: 1 });\n }\n }\n\n trackProjectActivity(node, acc, agentKey);\n\n let recentIndex = acc.recent.length;\n for (let i = 0; i < acc.recent.length; i += 1) {\n if (activity > acc.recent[i]!.activity) {\n recentIndex = i;\n break;\n }\n }\n if (recentIndex < DASHBOARD_RECENT_LIMIT) {\n acc.recent.splice(recentIndex, 0, { session, activity });\n if (acc.recent.length > DASHBOARD_RECENT_LIMIT) acc.recent.pop();\n }\n}\n\nfunction addUsage(\n acc: DashboardAccumulator,\n entry: SessionTreeNode,\n time: number,\n usage: {\n messages: number;\n totalTokens: number;\n inputTokens: number;\n outputTokens: number;\n cacheReadTokens: number;\n cacheCreateTokens: number;\n },\n): void {\n const { messages, totalTokens, inputTokens, outputTokens, cacheReadTokens, cacheCreateTokens } =\n usage;\n if (\n messages <= 0 &&\n totalTokens <= 0 &&\n inputTokens <= 0 &&\n outputTokens <= 0 &&\n cacheReadTokens <= 0 &&\n cacheCreateTokens <= 0\n ) {\n return;\n }\n\n acc.messages += messages;\n acc.tokens += totalTokens;\n acc.cacheReadTokens += cacheReadTokens;\n\n const agentKey = getSessionAgentName(entry.session);\n let metric = acc.agents.get(agentKey);\n if (!metric) {\n metric = { name: agentKey, sessions: 0, messages: 0, tokens: 0, cost: 0 };\n acc.agents.set(agentKey, metric);\n }\n metric.messages += messages;\n metric.tokens += totalTokens;\n\n const dayKey = toCalendarDayKey(time);\n let bucket = acc.daily.get(dayKey);\n if (!bucket) {\n bucket = emptyDailyBucket(dayKey);\n acc.daily.set(dayKey, bucket);\n }\n bucket.messages += messages;\n bucket.input += Math.max(0, inputTokens - cacheReadTokens - cacheCreateTokens);\n bucket.output += outputTokens;\n bucket.cache_read += cacheReadTokens;\n bucket.cache_create += cacheCreateTokens;\n\n const project = getOrCreateProject(entry.session, acc);\n if (!project) return;\n project.messages += messages;\n project.tokens += totalTokens;\n}\n\nfunction accumulateUsage(\n tree: SessionTree,\n scope: DashboardScope,\n acc: DashboardAccumulator,\n from: number | undefined,\n to: number,\n costFacts: DashboardCostFacts | null | undefined,\n): void {\n visitAttributedUsage(\n tree,\n { from, to, facts: costFacts, matchesEntry: (session) => matchesScope(session, scope) },\n ({ entry, time, ...usage }) => addUsage(acc, entry, time, usage),\n );\n}\n\nfunction addModelCost(\n acc: DashboardAccumulator,\n model: string | undefined,\n cost: number,\n recordedCost: number,\n): void {\n if (!model || cost <= 0) return;\n const recorded = Math.max(0, Math.min(cost, recordedCost));\n const current = acc.modelCosts.get(model);\n if (current) {\n current.cost += cost;\n current.costRecorded += recorded;\n current.costEstimated += cost - recorded;\n return;\n }\n acc.modelCosts.set(model, {\n model,\n cost,\n costRecorded: recorded,\n costEstimated: cost - recorded,\n });\n}\n\nfunction addCost(\n acc: DashboardAccumulator,\n entry: SessionTreeNode,\n time: number,\n cost: number,\n source: CostSource,\n): void {\n if (cost <= 0) return;\n acc.cost += cost;\n if (source === \"recorded\") acc.costRecorded += cost;\n else {\n acc.costEstimated += cost;\n acc.hasEstimatedCost = true;\n }\n\n const agentKey = getSessionAgentName(entry.session);\n let metric = acc.agents.get(agentKey);\n if (!metric) {\n metric = { name: agentKey, sessions: 0, messages: 0, tokens: 0, cost: 0 };\n acc.agents.set(agentKey, metric);\n }\n metric.cost += cost;\n\n const dayKey = toCalendarDayKey(time);\n let bucket = acc.daily.get(dayKey);\n if (!bucket) {\n bucket = emptyDailyBucket(dayKey);\n acc.daily.set(dayKey, bucket);\n }\n bucket.cost += cost;\n\n const project = getOrCreateProject(entry.session, acc);\n if (!project) return;\n project.cost += cost;\n if (source === \"estimated\") project.hasEstimatedCost = true;\n const slot = acc.sparklineSlots.get(dayKey);\n if (slot != null) project.sparkline[slot]! += cost;\n}\n\nfunction accumulateCosts(\n tree: SessionTree,\n scope: DashboardScope,\n acc: DashboardAccumulator,\n from: number | undefined,\n to: number,\n costFacts: DashboardCostFacts | null | undefined,\n): void {\n visitAttributedCosts(\n tree,\n { from, to, facts: costFacts, matchesEntry: (session) => matchesScope(session, scope) },\n ({ entry, time, cost, source, modelCosts }) => {\n addCost(acc, entry, time, cost, source);\n for (const model of modelCosts) {\n addModelCost(acc, model.model, model.cost, model.costRecorded);\n }\n },\n );\n}\n\nfunction toPreviousTotals(acc: DashboardAccumulator): DashboardPreviousTotals {\n return { sessions: acc.sessions, messages: acc.messages, tokens: acc.tokens, cost: acc.cost };\n}\n\nfunction toProjectStat(project: DashboardProjectAggregate): DashboardProjectStat {\n return {\n identityKind: project.identityKind,\n identityKey: project.identityKey,\n displayName: project.displayName,\n sessions: project.sessions,\n messages: project.messages,\n tokens: project.tokens,\n cost: project.cost,\n cost_source:\n project.cost > 0 ? (project.hasEstimatedCost ? \"estimated\" : \"recorded\") : undefined,\n agents: [...project.agentSessions.entries()]\n .sort((a, b) => b[1] - a[1])\n .map(([agentKey]) => agentKey),\n sparkline: project.sparkline,\n };\n}\n\n/**\n * Aggregate sessions into dashboard metrics, daily buckets, model distribution,\n * project ranking and the recent-sessions window. Pure — no HTTP, no DB.\n */\nexport function buildDashboard(\n sessions: SessionHead[],\n options: DashboardOptions,\n): DashboardAggregate {\n const { byAgentNames, scope, from, to, agentInfoMap, compare, costFacts } = options;\n const tree = buildSessionTree(sessions);\n const costFactsAvailable = costFacts != null;\n\n const acc = createAccumulator(byAgentNames, scope, to);\n if (from != null) {\n const bucketDays = countCalendarDays(from, to);\n for (let i = 0; i < bucketDays; i += 1) {\n const key = toCalendarDayKey(addCalendarDays(from, i));\n acc.daily.set(key, emptyDailyBucket(key));\n }\n }\n for (const node of scopedEntries(tree, scope, from, to)) accumulateActivity(node, acc);\n accumulateUsage(tree, scope, acc, from, to, costFacts);\n accumulateCosts(tree, scope, acc, from, to, costFacts);\n\n let previous: DashboardPreviousTotals | undefined;\n if (compare) {\n const compareAcc = createAccumulator(byAgentNames, scope, compare.to);\n for (const node of scopedEntries(tree, scope, compare.from, compare.to)) {\n accumulateActivity(node, compareAcc);\n }\n accumulateUsage(tree, scope, compareAcc, compare.from, compare.to, costFacts);\n accumulateCosts(tree, scope, compareAcc, compare.from, compare.to, costFacts);\n previous = toPreviousTotals(compareAcc);\n }\n\n const perAgent: DashboardAgentStat[] = [...acc.agents.values()]\n .map((metrics) => {\n const info = agentInfoMap?.get(metrics.name);\n return {\n name: metrics.name,\n displayName: info?.displayName ?? metrics.name,\n icon: info?.icon ?? \"\",\n iconColored: info?.iconColored,\n sessions: metrics.sessions,\n messages: metrics.messages,\n tokens: metrics.tokens,\n cost: metrics.cost,\n };\n })\n .filter((item) => item.sessions > 0 || item.messages > 0 || item.tokens > 0 || item.cost > 0)\n .sort((a, b) => b.sessions - a.sessions || b.cost - a.cost);\n\n const dailyActivity = [...acc.daily.values()].sort((a, b) => a.date.localeCompare(b.date));\n const modelDistribution: ModelDistributionEntry[] = [...acc.models.entries()]\n .map(([model, { tokens, sessions: count }]) => ({ model, tokens, sessions: count }))\n .sort((a, b) => b.tokens - a.tokens);\n const modelCost = costFactsAvailable\n ? [...acc.modelCosts.values()].sort((a, b) => b.cost - a.cost).slice(0, MODEL_COST_LIMIT)\n : null;\n\n const rankedProjects = [...acc.projects.values()].sort((a, b) => b.cost - a.cost);\n const perProject = rankedProjects.slice(0, DASHBOARD_PROJECT_LIMIT).map(toProjectStat);\n const projectRollup = rankedProjects\n .slice(DASHBOARD_PROJECT_LIMIT)\n .reduce<DashboardProjectRollup>(\n (rollup, project) => ({\n projects: rollup.projects + 1,\n sessions: rollup.sessions + project.sessions,\n tokens: rollup.tokens + project.tokens,\n cost: rollup.cost + project.cost,\n }),\n { projects: 0, sessions: 0, tokens: 0, cost: 0 },\n );\n\n const recentSessions: DashboardRecentSession[] = acc.recent.map(({ session }) => ({\n reference: session.reference,\n session,\n }));\n\n const latest = acc.recent[0];\n return {\n totals: {\n sessions: acc.sessions,\n messages: acc.messages,\n tokens: acc.tokens,\n cost: acc.cost,\n costRecorded: acc.costRecorded,\n costEstimated: acc.costEstimated,\n cacheReadTokens: acc.cacheReadTokens,\n cost_source: acc.cost > 0 ? (acc.hasEstimatedCost ? \"estimated\" : \"recorded\") : undefined,\n latestActivity: latest?.activity || undefined,\n latestActivityProject: latest?.session.project_identity?.displayName,\n latestActivityAgent: latest ? getSessionAgentName(latest.session) : undefined,\n previous,\n },\n scopeCounts: { projects: acc.projectKeys.size, agents: acc.agentKeys.size },\n perAgent,\n dailyActivity,\n modelDistribution,\n modelCost,\n perProject,\n projectRollup,\n recentSessions,\n };\n}\n","/**\n * Project analytics — pure aggregation over SessionHead[], the project-level\n * counterpart to dashboard.ts. No HTTP, no DB: the caller supplies the groups\n * and the sessions, this module owns the arithmetic.\n *\n * Metrics are inclusive of sub-sessions and `sessionCount` is recomputed from\n * the sessions actually handed in, so a windowed caller gets windowed counts\n * instead of the cache-wide count carried by ProjectGroup.\n */\nimport type { ProjectGroup, SessionHead } from \"../types/index.js\";\nimport type {\n ApiProjectAgentStat,\n ApiProjectGroup,\n ApiProjectSummary,\n SessionTree,\n SessionTreeNode,\n} from \"../contract/index.js\";\nimport { getProjectIdentityKey } from \"../contract/project-identity.js\";\nimport {\n buildSessionTree,\n filterSessionTreeEntriesByActivityWindow,\n} from \"../contract/session-tree.js\";\nimport { getSessionAgentName } from \"./dashboard.js\";\nimport type { DashboardCostFacts } from \"./cost-facts.js\";\nimport { visitAttributedCosts, visitAttributedUsage } from \"./cost-attribution.js\";\n\ninterface ProjectMetrics {\n sessions: number;\n messages: number;\n tokens: number;\n cost: number;\n hasEstimatedCost: boolean;\n agentStats: Map<string, ApiProjectAgentStat>;\n}\n\nexport function summarizeProjects(projects: readonly ApiProjectGroup[]): ApiProjectSummary {\n const summary: ApiProjectSummary = {\n projects: projects.length,\n sessions: 0,\n tokens: 0,\n cost: 0,\n latestActivity: null,\n };\n\n for (const project of projects) {\n summary.sessions += project.sessionCount;\n summary.tokens += project.tokens;\n summary.cost += project.cost;\n if (project.lastActivity != null) {\n summary.latestActivity =\n summary.latestActivity == null\n ? project.lastActivity\n : Math.max(summary.latestActivity, project.lastActivity);\n }\n }\n\n return summary;\n}\n\nfunction emptyMetrics(): ProjectMetrics {\n return {\n sessions: 0,\n messages: 0,\n tokens: 0,\n cost: 0,\n hasEstimatedCost: false,\n agentStats: new Map(),\n };\n}\n\n/**\n * Fold per-session totals into the project groups they belong to. Sessions with\n * no resolved project identity contribute to nothing.\n */\nexport function attachProjectMetrics(\n projects: ProjectGroup[],\n sessions: SessionHead[],\n): ApiProjectGroup[] {\n const tree = buildSessionTree(sessions);\n return attachProjectMetricsToEntries(projects, tree, tree.entries);\n}\n\nexport function attachProjectMetricsFromTree(\n projects: ProjectGroup[],\n tree: SessionTree,\n from?: number,\n to?: number,\n costFacts?: DashboardCostFacts | null,\n): ApiProjectGroup[] {\n return attachProjectMetricsToEntries(\n projects,\n tree,\n filterSessionTreeEntriesByActivityWindow(tree, from, to),\n from,\n to,\n costFacts,\n );\n}\n\nfunction attachProjectMetricsToEntries(\n projects: ProjectGroup[],\n tree: SessionTree,\n entries: SessionTreeNode[],\n from?: number,\n to?: number,\n costFacts?: DashboardCostFacts | null,\n): ApiProjectGroup[] {\n const metrics = new Map<string, ProjectMetrics>();\n\n for (const node of entries) {\n const identity = node.session.project_identity;\n if (!identity) continue;\n\n const key = getProjectIdentityKey(identity);\n let current = metrics.get(key);\n if (!current) {\n current = emptyMetrics();\n metrics.set(key, current);\n }\n\n current.sessions += 1;\n\n const agentName = getSessionAgentName(node.session);\n const agent = current.agentStats.get(agentName);\n if (agent) {\n agent.sessions += 1;\n } else {\n current.agentStats.set(agentName, {\n name: agentName,\n sessions: 1,\n messages: 0,\n tokens: 0,\n cost: 0,\n });\n }\n }\n\n visitAttributedUsage(\n tree,\n { from, to: to ?? Number.POSITIVE_INFINITY, facts: costFacts },\n ({ entry, messages, totalTokens }) => {\n const identity = entry.session.project_identity;\n if (!identity) return;\n const key = getProjectIdentityKey(identity);\n let current = metrics.get(key);\n if (!current) {\n current = emptyMetrics();\n metrics.set(key, current);\n }\n current.messages += messages;\n current.tokens += totalTokens;\n\n const agentName = getSessionAgentName(entry.session);\n const agent = current.agentStats.get(agentName);\n if (agent) {\n agent.messages += messages;\n agent.tokens += totalTokens;\n } else {\n current.agentStats.set(agentName, {\n name: agentName,\n sessions: 0,\n messages,\n tokens: totalTokens,\n cost: 0,\n });\n }\n },\n );\n\n visitAttributedCosts(\n tree,\n { from, to: to ?? Number.POSITIVE_INFINITY, facts: costFacts },\n ({ entry, cost, source }) => {\n const identity = entry.session.project_identity;\n if (!identity) return;\n const key = getProjectIdentityKey(identity);\n let current = metrics.get(key);\n if (!current) {\n current = emptyMetrics();\n metrics.set(key, current);\n }\n current.cost += cost;\n if (source === \"estimated\") current.hasEstimatedCost = true;\n\n const agentName = getSessionAgentName(entry.session);\n const agent = current.agentStats.get(agentName);\n if (agent) agent.cost += cost;\n else {\n current.agentStats.set(agentName, {\n name: agentName,\n sessions: 0,\n messages: 0,\n tokens: 0,\n cost,\n });\n }\n },\n );\n\n return projects.map((project) => {\n const metric = metrics.get(\n getProjectIdentityKey({ kind: project.identityKind, key: project.identityKey }),\n );\n return {\n ...project,\n sessionCount: metric?.sessions ?? 0,\n messages: metric?.messages ?? 0,\n tokens: metric?.tokens ?? 0,\n cost: metric?.cost ?? 0,\n cost_source:\n metric && metric.cost > 0\n ? metric.hasEstimatedCost\n ? \"estimated\"\n : \"recorded\"\n : undefined,\n agentStats: [...(metric?.agentStats.values() ?? [])].sort((a, b) => b.sessions - a.sessions),\n };\n });\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../core/src/projects/identity.ts","../../core/src/projects/display-name.ts","../../core/src/projects/fs.ts","../../core/src/projects/scope.ts","../../core/src/projects/groups.ts"],"sourcesContent":["import * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport { createHash } from \"node:crypto\";\nimport type { ProjectIdentity, ProjectIdentityKind } from \"../types/index.js\";\nimport { fallbackDisplayName } from \"./display-name.js\";\nimport { realFs, type IdentityFs } from \"./fs.js\";\n\nexport type { IdentityFs } from \"./fs.js\";\n\nexport const PROJECT_IDENTITY_RESOLVER_REVISION = \"project-identity-v2\";\n\nexport interface ProjectIdentityProjection {\n identity: ProjectIdentity;\n resolverRevision: string;\n inputSignature: string;\n}\n\nconst MANIFESTS = [\n \"package.json\",\n \"Cargo.toml\",\n \"pyproject.toml\",\n \"go.mod\",\n \"Gemfile\",\n \"pom.xml\",\n \"build.gradle\",\n] as const;\n\nconst PARSEABLE_MANIFESTS = [\"package.json\", \"Cargo.toml\", \"pyproject.toml\"] as const;\n\nconst LOOSE_DIRS = new Set([\"/tmp\", \"/private/tmp\"]);\nconst LOOSE_HOME_DIRS = [\"Desktop\", \"Downloads\", \"Documents\"];\ntype PathOps = Pick<\n typeof path.posix,\n \"dirname\" | \"isAbsolute\" | \"join\" | \"relative\" | \"resolve\" | \"sep\"\n>;\n\n// Identity semantics live in the contract; this module only discovers them\n// from the filesystem and git.\nexport {\n getProjectIdentityKey,\n isProjectIdentityKind,\n matchesProjectIdentity,\n} from \"../contract/project-identity.js\";\n\nexport function normalizeGitRemote(url: string): string | null {\n if (!url) return null;\n let value = url.trim();\n if (/^[a-z][a-z\\d+.-]*:\\/\\//i.test(value)) {\n try {\n const parsed = new URL(value);\n value = `${parsed.hostname}${parsed.pathname}`;\n } catch {\n return null;\n }\n } else {\n const sshMatch = value.match(/^[^@]+@([^:]+):(.+)$/);\n if (sshMatch) value = `${sshMatch[1]}/${sshMatch[2]}`;\n }\n value = value.replace(/\\.git$/, \"\");\n if (!value.includes(\"/\")) return null;\n return value.toLowerCase();\n}\n\n// Process-lifetime identity cache, keyed by directory. Only used for the real\n// filesystem (fs === realFs); tests inject fake IdentityFs implementations and\n// must bypass the cache to stay isolated from each other. git remotes change\n// rarely, so a coarse TTL is enough — no file-watch invalidation needed.\nconst IDENTITY_CACHE_TTL_MS = 10 * 60 * 1000;\nexport const IDENTITY_CACHE_MAX_ENTRIES = 512;\n\ninterface IdentityCacheEntry {\n projection: ProjectIdentityProjection;\n resolvedAt: number;\n}\n\nconst identityCache = new Map<string, IdentityCacheEntry>();\n\n/** Clears the process-lifetime identity cache. For tests and explicit invalidation. */\nexport function clearIdentityCache(): void {\n identityCache.clear();\n}\n\nexport function computeIdentity(cwd: string | null | undefined, fs: IdentityFs): ProjectIdentity {\n return computeIdentityProjection(cwd, fs).identity;\n}\n\nexport function normalizeProjectDirectory(cwd: string | null | undefined): string {\n if (!cwd) return \"\";\n return getPathOps(cwd).resolve(cwd);\n}\n\nexport function computeIdentityProjection(\n cwd: string | null | undefined,\n fs: IdentityFs = realFs,\n resolverRevision = PROJECT_IDENTITY_RESOLVER_REVISION,\n): ProjectIdentityProjection {\n if (fs !== realFs) return resolveIdentityProjection(cwd, fs, resolverRevision);\n\n const key = normalizeProjectDirectory(cwd);\n const cached = identityCache.get(key);\n if (cached) {\n if (\n cached.projection.resolverRevision === resolverRevision &&\n Date.now() - cached.resolvedAt < IDENTITY_CACHE_TTL_MS\n ) {\n identityCache.delete(key);\n identityCache.set(key, cached);\n return cached.projection;\n }\n identityCache.delete(key);\n }\n const projection = resolveIdentityProjection(cwd, fs, resolverRevision);\n identityCache.set(key, { projection, resolvedAt: Date.now() });\n while (identityCache.size > IDENTITY_CACHE_MAX_ENTRIES) {\n const oldestKey = identityCache.keys().next().value;\n if (oldestKey == null) break;\n identityCache.delete(oldestKey);\n }\n return projection;\n}\n\nfunction resolveIdentityProjection(\n cwd: string | null | undefined,\n fs: IdentityFs,\n resolverRevision: string,\n): ProjectIdentityProjection {\n if (!cwd) return projectIdentityProjection(loose(), resolverRevision, [\"loose\", \"missing\"]);\n\n const pathOps = getPathOps(cwd);\n const absoluteCwd = pathOps.resolve(cwd);\n const homeDir = os.homedir();\n const homePathOps = getPathOps(homeDir);\n const home = homePathOps === pathOps ? pathOps.resolve(homeDir) : homeDir;\n if (absoluteCwd === home || LOOSE_DIRS.has(absoluteCwd)) {\n return projectIdentityProjection(loose(), resolverRevision, [\"loose\", absoluteCwd]);\n }\n if (\n homePathOps === pathOps &&\n LOOSE_HOME_DIRS.some((dir) => absoluteCwd === pathOps.join(home, dir))\n ) {\n return projectIdentityProjection(loose(), resolverRevision, [\"loose\", absoluteCwd]);\n }\n\n const gitRoot = findGitRoot(absoluteCwd, fs, pathOps);\n if (gitRoot) {\n const remote = fs.spawn(\"git\", [\"config\", \"--get\", \"remote.origin.url\"], { cwd: gitRoot });\n if (remote.exitCode === 0) {\n const normalized = normalizeGitRemote(remote.stdout.trim());\n if (normalized) {\n const identity: ProjectIdentity = {\n kind: \"git_remote\",\n key: normalized,\n displayName: deriveDisplayName({ kind: \"git_remote\", key: normalized, gitRoot, fs }),\n };\n return projectIdentityProjection(identity, resolverRevision, [\n \"git_remote\",\n gitRoot,\n normalized,\n identity.displayName,\n ]);\n }\n }\n\n const common = fs.spawn(\"git\", [\"rev-parse\", \"--git-common-dir\"], { cwd: gitRoot });\n if (common.exitCode === 0) {\n const raw = common.stdout.trim();\n if (raw) {\n const key = pathOps.isAbsolute(raw) ? raw : pathOps.resolve(gitRoot, raw);\n const identity: ProjectIdentity = {\n kind: \"git_common_dir\",\n key,\n displayName: deriveDisplayName({ kind: \"git_common_dir\", key, gitRoot, fs }),\n };\n return projectIdentityProjection(identity, resolverRevision, [\n \"git_common_dir\",\n gitRoot,\n key,\n identity.displayName,\n ]);\n }\n }\n }\n\n const manifestDir = findManifestDir(absoluteCwd, fs, pathOps);\n if (manifestDir) {\n const identity: ProjectIdentity = {\n kind: \"manifest_path\",\n key: manifestDir,\n displayName: deriveDisplayName({ kind: \"manifest_path\", key: manifestDir, fs }),\n };\n return projectIdentityProjection(identity, resolverRevision, [\n \"manifest_path\",\n manifestDir,\n identity.displayName,\n ]);\n }\n\n if (homePathOps === pathOps) {\n const synthetic = synthesizeCodexScratchIdentity(absoluteCwd, home, pathOps);\n if (synthetic) {\n return projectIdentityProjection(synthetic, resolverRevision, [\"synthetic\", synthetic.key]);\n }\n }\n\n const identity: ProjectIdentity = {\n kind: \"path\",\n key: absoluteCwd,\n displayName: fallbackDisplayName(absoluteCwd),\n };\n return projectIdentityProjection(identity, resolverRevision, [\"path\", absoluteCwd]);\n}\n\nfunction projectIdentityProjection(\n identity: ProjectIdentity,\n resolverRevision: string,\n inputs: readonly string[],\n): ProjectIdentityProjection {\n return {\n identity,\n resolverRevision,\n inputSignature: createHash(\"sha256\").update(JSON.stringify(inputs)).digest(\"hex\"),\n };\n}\n\nfunction loose(): ProjectIdentity {\n return { kind: \"loose\", key: \"loose\", displayName: \"Loose\" };\n}\n\nfunction synthesizeCodexScratchIdentity(\n absoluteCwd: string,\n home: string,\n pathOps: PathOps,\n): ProjectIdentity | null {\n const root = pathOps.resolve(pathOps.join(home, \"Documents\", \"Codex\"));\n const child = pathOps.relative(root, absoluteCwd);\n if (\n !child ||\n child === \"..\" ||\n child.startsWith(`..${pathOps.sep}`) ||\n pathOps.isAbsolute(child)\n ) {\n return null;\n }\n return { kind: \"synthetic\", key: \"codex:scratch\", displayName: \"Chats\" };\n}\n\nfunction getPathOps(input: string): PathOps {\n if (/^[a-zA-Z]:[\\\\/]/.test(input) || input.startsWith(\"\\\\\\\\\")) {\n return path.win32;\n }\n if (input.startsWith(\"/\")) return path.posix;\n return path;\n}\n\nfunction findGitRoot(start: string, fs: IdentityFs, pathOps: PathOps): string | null {\n let current = start;\n while (current) {\n if (fs.exists(pathOps.join(current, \".git\"))) return current;\n const parent = pathOps.dirname(current);\n if (parent === current) break;\n current = parent;\n }\n return null;\n}\n\nfunction findManifestDir(start: string, fs: IdentityFs, pathOps: PathOps): string | null {\n let current = start;\n while (current) {\n for (const manifest of MANIFESTS) {\n if (fs.exists(pathOps.join(current, manifest))) return current;\n }\n const parent = pathOps.dirname(current);\n if (parent === current) break;\n current = parent;\n }\n return null;\n}\n\ninterface DisplayNameInput {\n kind: ProjectIdentityKind;\n key: string;\n gitRoot?: string;\n fs: IdentityFs;\n}\n\nfunction deriveDisplayName(input: DisplayNameInput): string {\n const pathOps = getPathOps(input.gitRoot ?? input.key);\n const dir = input.gitRoot ?? (input.kind === \"manifest_path\" ? input.key : null);\n if (dir) {\n for (const manifest of PARSEABLE_MANIFESTS) {\n const manifestPath = pathOps.join(dir, manifest);\n if (input.fs.exists(manifestPath)) {\n const name = parseManifestName(manifest, input.fs.readText(manifestPath) ?? \"\");\n if (name) return name;\n }\n }\n }\n\n if (input.kind === \"git_remote\") {\n return input.key.split(\"/\").at(-1) || input.key;\n }\n if (input.gitRoot) return fallbackDisplayName(input.gitRoot);\n return fallbackDisplayName(input.key);\n}\n\nfunction parseManifestName(file: string, text: string): string | null {\n if (!text) return null;\n if (file === \"package.json\" || file === \"Cargo.toml\" || file === \"pyproject.toml\") {\n const match = text.match(/\"name\"\\s*:\\s*\"([^\"]+)\"/) || text.match(/^\\s*name\\s*=\\s*\"([^\"]+)\"/m);\n if (match?.[1]) return match[1];\n }\n return null;\n}\n","export function fallbackDisplayName(input: string): string {\n if (input === \"/\") return \"(root)\";\n const trimmed = input.replace(/[/\\\\]+$/, \"\");\n const parts = trimmed.split(/[/\\\\]+/).filter(Boolean);\n return parts.at(-1) ?? trimmed;\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { spawnSync } from \"node:child_process\";\n\nexport interface IdentityFs {\n exists(path: string): boolean;\n readText(path: string): string | null;\n spawn(cmd: string, args: string[], opts: { cwd: string }): { stdout: string; exitCode: number };\n}\n\nexport const realFs: IdentityFs = {\n exists(path) {\n return existsSync(path);\n },\n readText(path) {\n try {\n return readFileSync(path, \"utf8\");\n } catch {\n return null;\n }\n },\n spawn(cmd, args, opts) {\n const result = spawnSync(cmd, args, { cwd: opts.cwd, encoding: \"utf8\", timeout: 1000 });\n return {\n stdout: typeof result.stdout === \"string\" ? result.stdout : \"\",\n exitCode: result.status ?? 1,\n };\n },\n};\n","import type { ProjectIdentityRef, SessionHead } from \"../types/index.js\";\nimport {\n computeIdentity,\n matchesProjectIdentity,\n normalizeProjectDirectory,\n type IdentityFs,\n} from \"./identity.js\";\nimport { realFs } from \"./fs.js\";\n\nexport interface ProjectScopeMatcher {\n identity: ProjectIdentityRef;\n path: string;\n}\n\nexport function createProjectScopeMatcher(\n queryPath: string,\n fs: IdentityFs = realFs,\n): ProjectScopeMatcher {\n const identity = computeIdentity(queryPath, fs);\n return createProjectScopeMatcherFromIdentity(queryPath, identity);\n}\n\nexport function createProjectScopeMatcherFromIdentity(\n queryPath: string,\n identity: ProjectIdentityRef,\n): ProjectScopeMatcher {\n return {\n identity: { kind: identity.kind, key: identity.key },\n path: normalizeProjectScopePath(queryPath),\n };\n}\n\nexport function matchesProjectScope(session: SessionHead, scope: ProjectScopeMatcher): boolean {\n if (matchesProjectIdentity(session.project_identity, scope.identity)) return true;\n return session.directory ? isPathScopeMatch(scope.path, session.directory) : false;\n}\n\nexport function filterSessionsByProjectScope<T extends SessionHead>(\n sessions: T[],\n queryPath: string,\n fs?: IdentityFs,\n): T[] {\n const scope = createProjectScopeMatcher(queryPath, fs);\n return sessions.filter((session) => matchesProjectScope(session, scope));\n}\n\nfunction isPathScopeMatch(queryPath: string, sessionPath: string): boolean {\n const session = normalizeProjectScopePath(sessionPath);\n return (\n session === queryPath ||\n session.startsWith(queryPath + \"/\") ||\n queryPath.startsWith(session + \"/\")\n );\n}\n\nexport function normalizeProjectScopePath(path: string): string {\n return normalizeProjectDirectory(path).replaceAll(\"\\\\\", \"/\");\n}\n","import type { ProjectGroup, ProjectIdentity, SessionHead } from \"../types/index.js\";\nimport { buildSessionTree, getSessionAgentKey } from \"../contract/index.js\";\nimport { getProjectIdentityKey } from \"./identity.js\";\n\nexport function buildProjectGroups(sessions: SessionHead[]): ProjectGroup[] {\n const groups = new Map<\n string,\n { identity: ProjectIdentity; sources: Set<string>; sessionCount: number; lastActivity: number }\n >();\n\n const tree = buildSessionTree(sessions);\n for (const session of sessions) {\n if (tree.mountStateOf(session) === \"mounted-child\") continue;\n const identity = session.project_identity;\n if (!identity) continue;\n const activity = session.time_updated ?? session.time_created;\n const groupKey = getProjectIdentityKey(identity);\n const current = groups.get(groupKey);\n if (current) {\n current.sources.add(getSessionAgentKey(session));\n current.sessionCount += 1;\n current.lastActivity = Math.max(current.lastActivity, activity);\n } else {\n groups.set(groupKey, {\n identity,\n sources: new Set([getSessionAgentKey(session)]),\n sessionCount: 1,\n lastActivity: activity,\n });\n }\n }\n\n return [...groups.values()]\n .map((group) => ({\n identityKind: group.identity.kind,\n identityKey: group.identity.key,\n displayName: group.identity.displayName,\n sources: [...group.sources].sort(),\n sessionCount: group.sessionCount,\n lastActivity: group.lastActivity || null,\n }))\n .sort((a, b) => {\n if (a.identityKind === \"loose\" && b.identityKind !== \"loose\") return 1;\n if (b.identityKind === \"loose\" && a.identityKind !== \"loose\") return -1;\n return (b.lastActivity ?? 0) - (a.lastActivity ?? 0);\n });\n}\n"],"mappings":"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","names":["path","identity"]}
@@ -1 +0,0 @@
1
- import{a as e,n as t,t as n}from"./jsx-runtime-B-hcVAMW.js";import{Kt as r,On as i,t as a,v as o,w as s,x as c,y as l}from"./utils-BIZi2up3.js";import{n as u,t as d}from"./translate-BDFu3ZiK.js";import{o as f}from"./api-ToidoNW6.js";var p=e(t(),1),m=n(),h=p.createContext(void 0),g=e=>{let t=p.useContext(h);if(e)return e;if(!t)throw Error(`No QueryClient set, use QueryClientProvider to set one`);return t},_=({client:e,children:t})=>(p.useEffect(()=>(e.mount(),()=>{e.unmount()}),[e]),(0,m.jsx)(h.Provider,{value:e,children:t})),v={setTimeout:(e,t)=>setTimeout(e,t),clearTimeout:e=>clearTimeout(e),setInterval:(e,t)=>setInterval(e,t),clearInterval:e=>clearInterval(e)},y=new class{#e=v;setTimeoutProvider(e){this.#e=e}setTimeout(e,t){return this.#e.setTimeout(e,t)}clearTimeout(e){this.#e.clearTimeout(e)}setInterval(e,t){return this.#e.setInterval(e,t)}clearInterval(e){this.#e.clearInterval(e)}};function b(e){setTimeout(e,0)}var ee=typeof window>`u`||`Deno`in globalThis;function x(){}function te(e,t){return typeof e==`function`?e(t):e}function S(e){return typeof e==`number`&&e>=0&&e!==1/0}function C(e,t){return Math.max(e+(t||0)-Date.now(),0)}function w(e,t){return typeof e==`function`?e(t):e}function ne(e,t){let{type:n=`all`,exact:r,fetchStatus:i,predicate:a,queryKey:o,stale:s}=e;if(o){if(r){if(t.queryHash!==T(o,t.options))return!1}else if(!D(t.queryKey,o))return!1}if(n!==`all`){let e=t.isActive();if(n===`active`&&!e||n===`inactive`&&e)return!1}return!(typeof s==`boolean`&&t.isStale()!==s||i&&i!==t.state.fetchStatus||a&&!a(t))}function re(e,t){let{exact:n,status:r,predicate:i,mutationKey:a}=e;if(a){if(!t.options.mutationKey)return!1;if(n){if(E(t.options.mutationKey)!==E(a))return!1}else if(!D(t.options.mutationKey,a))return!1}return!(r&&t.state.status!==r||i&&!i(t))}function T(e,t){return(t?.queryKeyHashFn||E)(e)}function E(e){return JSON.stringify(e,(e,t)=>j(t)?Object.keys(t).sort().reduce((e,n)=>(e[n]=t[n],e),{}):t)}function D(e,t){if(e===t)return!0;if(typeof e!=typeof t)return!1;if(e&&t&&typeof e==`object`&&typeof t==`object`){if(Array.isArray(e)&&Array.isArray(t)){for(let n=0;n<t.length;n++)if(!D(e[n],t[n]))return!1;return!0}let n=Object.keys(t);for(let r of n)if(!D(e[r],t[r]))return!1;return!0}return!1}var ie=Object.prototype.hasOwnProperty;function O(e,t,n=0){if(e===t)return e;if(n>500)return t;let r=A(e)&&A(t);if(!r&&!(j(e)&&j(t)))return t;let i=(r?e:Object.keys(e)).length,a=r?t:Object.keys(t),o=a.length,s=r?Array(o):{},c=0;for(let l=0;l<o;l++){let o=r?l:a[l],u=e[o],d=t[o];if(u===d){s[o]=u,(r?l<i:ie.call(e,o))&&c++;continue}if(u===null||d===null||typeof u!=`object`||typeof d!=`object`){s[o]=d;continue}let f=O(u,d,n+1);s[o]=f,f===u&&c++}return i===o&&c===i?e:s}function k(e,t){if(!t||Object.keys(e).length!==Object.keys(t).length)return!1;for(let n in e)if(e[n]!==t[n])return!1;return!0}function A(e){return Array.isArray(e)&&e.length===Object.keys(e).length}function j(e){if(!M(e))return!1;let t=e.constructor;if(t===void 0)return!0;let n=t.prototype;return!(!M(n)||!n.hasOwnProperty(`isPrototypeOf`)||Object.getPrototypeOf(e)!==Object.prototype)}function M(e){return Object.prototype.toString.call(e)===`[object Object]`}function ae(e){return new Promise(t=>{y.setTimeout(t,e)})}function N(e,t,n){return typeof n.structuralSharing==`function`?n.structuralSharing(e,t):n.structuralSharing===!1?t:O(e,t)}function oe(e){return e}function se(e,t,n=0){let r=[...e,t];return n&&r.length>n?r.slice(1):r}function ce(e,t,n=0){let r=[t,...e];return n&&r.length>n?r.slice(0,-1):r}var P=Symbol();function F(e,t){return!e.queryFn&&t?.initialPromise?()=>t.initialPromise:!e.queryFn||e.queryFn===P?()=>Promise.reject(Error(`Missing queryFn: '${e.queryHash}'`)):e.queryFn}function I(e,t){return typeof e==`function`?e(...t):!!e}function le(e,t,n){let r=!1,i;return Object.defineProperty(e,"signal",{enumerable:!0,get:()=>(i??=t(),r?i:(r=!0,i.aborted?n():i.addEventListener(`abort`,n,{once:!0}),i))}),e}var ue=()=>ee,L=()=>ue(),R=class{constructor(){this.listeners=new Set,this.subscribe=this.subscribe.bind(this)}subscribe(e){return this.listeners.add(e),this.onSubscribe(),()=>{this.listeners.delete(e),this.onUnsubscribe()}}hasListeners(){return this.listeners.size>0}onSubscribe(){}onUnsubscribe(){}},z=new class extends R{#e;#t;#n;constructor(){super(),this.#n=e=>{if(typeof window<`u`&&window.addEventListener){let t=()=>e();return window.addEventListener(`visibilitychange`,t,!1),()=>{window.removeEventListener(`visibilitychange`,t)}}}}onSubscribe(){this.#t||this.setEventListener(this.#n)}onUnsubscribe(){this.hasListeners()||(this.#t?.(),this.#t=void 0)}setEventListener(e){this.#n=e,this.#t?.(),this.#t=e(e=>{typeof e==`boolean`?this.setFocused(e):this.onFocus()})}setFocused(e){this.#e!==e&&(this.#e=e,this.onFocus())}onFocus(){let e=this.isFocused();this.listeners.forEach(t=>{t(e)})}isFocused(){return typeof this.#e==`boolean`?this.#e:globalThis.document?.visibilityState!==`hidden`}},de=b;function fe(){let e=[],t=0,n=e=>{e()},r=e=>{e()},i=de,a=r=>{t?e.push(r):i(()=>{n(r)})},o=()=>{let t=e;e=[],t.length&&i(()=>{r(()=>{t.forEach(e=>{n(e)})})})};return{batch:e=>{let n;t++;try{n=e()}finally{t--,t||o()}return n},batchCalls:e=>(...t)=>{a(()=>{e(...t)})},schedule:a,setNotifyFunction:e=>{n=e},setBatchNotifyFunction:e=>{r=e},setScheduler:e=>{i=e}}}var B=fe(),V=new class extends R{#e=!0;#t;#n;constructor(){super(),this.#n=e=>{if(typeof window<`u`&&window.addEventListener){let t=()=>e(!0),n=()=>e(!1);return window.addEventListener(`online`,t,!1),window.addEventListener(`offline`,n,!1),()=>{window.removeEventListener(`online`,t),window.removeEventListener(`offline`,n)}}}}onSubscribe(){this.#t||this.setEventListener(this.#n)}onUnsubscribe(){this.hasListeners()||(this.#t?.(),this.#t=void 0)}setEventListener(e){this.#n=e,this.#t?.(),this.#t=e(this.setOnline.bind(this))}setOnline(e){this.#e!==e&&(this.#e=e,this.listeners.forEach(t=>{t(e)}))}isOnline(){return this.#e}};function pe(e){return Math.min(1e3*2**e,3e4)}function H(e){return(e??`online`)!==`online`||V.isOnline()}var U=class extends Error{constructor(e){super(`CancelledError`),this.revert=e?.revert,this.silent=e?.silent}};function W(e){let t=!1,n=0,r,i=`pending`,a,o,s=new Promise((e,t)=>{a=e,o=t});s.catch(x);let c=()=>i!==`pending`,l=t=>{if(!c()){let n=new U(t);h(n),e.onCancel?.(n)}},u=()=>{t=!0},d=()=>{t=!1},f=()=>z.isFocused()&&(e.networkMode===`always`||V.isOnline())&&e.canRun(),p=()=>H(e.networkMode)&&e.canRun(),m=e=>{c()||(r?.(),i=`resolved`,a(e))},h=e=>{c()||(r?.(),i=`rejected`,o(e))},g=()=>new Promise(t=>{r=e=>{(c()||f())&&t(e)},e.onPause?.()}).then(()=>{r=void 0,c()||e.onContinue?.()}),_=()=>{if(c())return;let r,i=n===0?e.initialPromise:void 0;try{r=i??e.fn()}catch(e){r=Promise.reject(e)}Promise.resolve(r).then(m).catch(r=>{if(c())return;let i=e.retry??(L()?0:3),a=e.retryDelay??pe,o=typeof a==`function`?a(n,r):a,s=i===!0||typeof i==`number`&&n<i||typeof i==`function`&&i(n,r);if(t||!s){h(r);return}n++,e.onFail?.(n,r),ae(o).then(()=>f()?void 0:g()).then(()=>{t?h(r):_()})})};return{promise:s,status:()=>i,cancel:l,continue:()=>(r?.(),s),cancelRetry:u,continueRetry:d,canStart:p,start:()=>(p()?_():g().then(_),s)}}var G=class{#e;destroy(){this.clearGcTimeout()}scheduleGc(){this.clearGcTimeout(),S(this.gcTime)&&(this.#e=y.setTimeout(()=>{this.optionalRemove()},this.gcTime))}updateGcTime(e){this.gcTime=Math.max(this.gcTime||0,e??(L()?1/0:3e5))}clearGcTimeout(){this.#e!==void 0&&(y.clearTimeout(this.#e),this.#e=void 0)}};function me(e){return{onFetch:(t,n)=>{let r=t.options,i=t.fetchOptions?.meta?.fetchMore?.direction,a=t.state.data?.pages||[],o=t.state.data?.pageParams||[],s={pages:[],pageParams:[]},c=0,l=async()=>{let n=!1,l=e=>{le(e,()=>t.signal,()=>n=!0)},u=F(t.options,t.fetchOptions),d=async(e,r,i)=>{if(n)return Promise.reject(t.signal.reason);if(r==null&&e.pages.length)return Promise.resolve(e);let a=(()=>{let e={client:t.client,queryKey:t.queryKey,pageParam:r,direction:i?`backward`:`forward`,meta:t.options.meta};return l(e),e})(),o=await u(a),{maxPages:s}=t.options,c=i?ce:se;return{pages:c(e.pages,o,s),pageParams:c(e.pageParams,r,s)}};if(i&&a.length){let e=i===`backward`,t=e?he:K,n={pages:a,pageParams:o};s=await d(n,t(r,n),e)}else{let t=e??a.length;do{let e=c===0?o[0]??r.initialPageParam:K(r,s);if(c>0&&e==null)break;s=await d(s,e),c++}while(c<t)}return s};t.fetchFn=t.options.persister?()=>t.options.persister?.(l,{client:t.client,queryKey:t.queryKey,meta:t.options.meta,signal:t.signal},n):l}}}function K(e,{pages:t,pageParams:n}){let r=t.length-1;return t.length>0?e.getNextPageParam(t[r],t,n[r],n):void 0}function he(e,{pages:t,pageParams:n}){return t.length>0?e.getPreviousPageParam?.(t[0],t,n[0],n):void 0}var ge=class extends G{#e;#t;#n;#r;#i;#a;#o;#s;constructor(e){super(),this.#s=!1,this.#o=e.defaultOptions,this.setOptions(e.options),this.observers=[],this.#i=e.client,this.#r=this.#i.getQueryCache(),this.queryKey=e.queryKey,this.queryHash=e.queryHash,this.#t=Y(this.options),this.state=e.state??this.#t,this.scheduleGc()}get meta(){return this.options.meta}get queryType(){return this.#e}get promise(){return this.#a?.promise}setOptions(e){if(this.options={...this.#o,...e},e?._type&&(this.#e=e._type),this.updateGcTime(this.options.gcTime),this.state&&this.state.data===void 0){let e=Y(this.options);e.data!==void 0&&(this.setState(J(e.data,e.dataUpdatedAt)),this.#t=e)}}optionalRemove(){!this.observers.length&&this.state.fetchStatus===`idle`&&this.#r.remove(this)}setData(e,t){let n=N(this.state.data,e,this.options);return this.#c({data:n,type:`success`,dataUpdatedAt:t?.updatedAt,manual:t?.manual}),n}setState(e){this.#c({type:`setState`,state:e})}cancel(e){let t=this.#a?.promise;return this.#a?.cancel(e),t?t.then(x).catch(x):Promise.resolve()}destroy(){super.destroy(),this.cancel({silent:!0})}get resetState(){return this.#t}reset(){this.destroy(),this.setState(this.resetState)}isActive(){return this.observers.some(e=>w(e.options.enabled,this)!==!1)}isDisabled(){return this.getObserversCount()>0?!this.isActive():this.options.queryFn===P||!this.isFetched()}isFetched(){return this.state.dataUpdateCount+this.state.errorUpdateCount>0}isStatic(){return this.getObserversCount()>0&&this.observers.some(e=>w(e.options.staleTime,this)===`static`)}isStale(){return this.getObserversCount()>0?this.observers.some(e=>e.getCurrentResult().isStale):this.state.data===void 0||this.state.isInvalidated}isStaleByTime(e=0){return this.state.data===void 0?!0:e===`static`?!1:this.state.isInvalidated?!0:!C(this.state.dataUpdatedAt,e)}onFocus(){this.observers.find(e=>e.shouldFetchOnWindowFocus())?.refetch({cancelRefetch:!1}),this.#a?.continue()}onOnline(){this.observers.find(e=>e.shouldFetchOnReconnect())?.refetch({cancelRefetch:!1}),this.#a?.continue()}addObserver(e){this.observers.includes(e)||(this.observers.push(e),this.clearGcTimeout(),this.#r.notify({type:`observerAdded`,query:this,observer:e}))}removeObserver(e){let t=this.observers.indexOf(e);t!==-1&&(this.observers.splice(t,1),this.observers.length||(this.#a&&(this.#s||this.state.fetchStatus===`paused`&&this.state.status===`pending`?this.#a.cancel({revert:!0}):this.#a.cancelRetry()),this.scheduleGc()),this.#r.notify({type:`observerRemoved`,query:this,observer:e}))}getObserversCount(){return this.observers.length}invalidate(){this.state.isInvalidated||this.#c({type:`invalidate`})}async fetch(e,t){if(this.state.fetchStatus!==`idle`&&this.#a?.status()!==`rejected`){if(this.state.data!==void 0&&t?.cancelRefetch)this.cancel({silent:!0});else if(this.#a)return this.#a.continueRetry(),this.#a.promise}if(e&&this.setOptions(e),!this.options.queryFn){let e=this.observers.find(e=>e.options.queryFn);e&&this.setOptions(e.options)}let n=new AbortController,r=e=>{Object.defineProperty(e,"signal",{enumerable:!0,get:()=>(this.#s=!0,n.signal)})},i=()=>{let e=F(this.options,t),n=(()=>{let e={client:this.#i,queryKey:this.queryKey,meta:this.meta};return r(e),e})();return this.#s=!1,this.options.persister?this.options.persister(e,n,this):e(n)},a=(()=>{let e={fetchOptions:t,options:this.options,queryKey:this.queryKey,client:this.#i,state:this.state,fetchFn:i};return r(e),e})();(this.#e===`infinite`?me(this.options.pages):this.options.behavior)?.onFetch(a,this),this.#n=this.state,(this.state.fetchStatus===`idle`||this.state.fetchMeta!==a.fetchOptions?.meta)&&this.#c({type:`fetch`,meta:a.fetchOptions?.meta});let o=this.#a=W({initialPromise:t?.initialPromise,fn:a.fetchFn,onCancel:e=>{e instanceof U&&e.revert&&this.setState({...this.#n,fetchStatus:`idle`}),n.abort()},onFail:(e,t)=>{this.#c({type:`failed`,failureCount:e,error:t})},onPause:()=>{this.#c({type:`pause`})},onContinue:()=>{this.#c({type:`continue`})},retry:a.options.retry,retryDelay:a.options.retryDelay,networkMode:a.options.networkMode,canRun:()=>!0});try{let e=await o.start();if(e===void 0)throw Error(`${this.queryHash} data is undefined`);return this.setData(e),this.#r.config.onSuccess?.(e,this),this.#r.config.onSettled?.(e,this.state.error,this),e}catch(e){if(e instanceof U){if(e.silent)return this.#a.promise;if(e.revert){if(this.state.data===void 0)throw e;return this.state.data}}throw this.#c({type:`error`,error:e}),this.#r.config.onError?.(e,this),this.#r.config.onSettled?.(this.state.data,e,this),e}finally{this.#a===o&&(this.#a=void 0),this.scheduleGc()}}#c(e){let t=t=>{switch(e.type){case`failed`:return{...t,fetchFailureCount:e.failureCount,fetchFailureReason:e.error};case`pause`:return{...t,fetchStatus:`paused`};case`continue`:return{...t,fetchStatus:`fetching`};case`fetch`:return{...t,...q(t.data,this.options),fetchMeta:e.meta??null};case`success`:let n={...t,...J(e.data,e.dataUpdatedAt),dataUpdateCount:t.dataUpdateCount+1,...!e.manual&&{fetchStatus:`idle`,fetchFailureCount:0,fetchFailureReason:null}};return this.#n=e.manual?n:void 0,n;case`error`:let r=e.error;return{...t,error:r,errorUpdateCount:t.errorUpdateCount+1,errorUpdatedAt:Date.now(),fetchFailureCount:t.fetchFailureCount+1,fetchFailureReason:r,fetchStatus:`idle`,status:`error`,isInvalidated:!0};case`invalidate`:return{...t,isInvalidated:!0};case`setState`:return{...t,...e.state}}};this.state=t(this.state),B.batch(()=>{this.observers.slice().forEach(e=>{e.onQueryUpdate()}),this.#r.notify({query:this,type:`updated`,action:e})})}};function q(e,t){return{fetchFailureCount:0,fetchFailureReason:null,fetchStatus:H(t.networkMode)?`fetching`:`paused`,...e===void 0&&{error:null,status:`pending`}}}function J(e,t){return{data:e,dataUpdatedAt:t??Date.now(),error:null,isInvalidated:!1,status:`success`}}function Y(e){let t=typeof e.initialData==`function`?e.initialData():e.initialData,n=t!==void 0,r=n?typeof e.initialDataUpdatedAt==`function`?e.initialDataUpdatedAt():e.initialDataUpdatedAt:0;return{data:t,dataUpdateCount:0,dataUpdatedAt:n?r??Date.now():0,error:null,errorUpdateCount:0,errorUpdatedAt:0,fetchFailureCount:0,fetchFailureReason:null,fetchMeta:null,isInvalidated:!1,status:n?`success`:`pending`,fetchStatus:`idle`}}var _e=class extends R{#e;#t=void 0;#n=void 0;#r=void 0;#i;#a;#o;#s;#c;#l;#u;#d;#f;#p=new Set;constructor(e,t){super(),this.options=t,this.#e=e,this.#o=null,this.bindMethods(),this.setOptions(t)}bindMethods(){this.refetch=this.refetch.bind(this)}onSubscribe(){this.listeners.size===1&&(this.#t.addObserver(this),ye(this.#t,this.options)?this.#m():this.updateResult(),this.#y())}onUnsubscribe(){this.hasListeners()||this.destroy()}shouldFetchOnReconnect(){return X(this.#t,this.options,this.options.refetchOnReconnect)}shouldFetchOnWindowFocus(){return X(this.#t,this.options,this.options.refetchOnWindowFocus)}destroy(){this.listeners=new Set,this.#b(),this.#x(),this.#t.removeObserver(this)}setOptions(e){let t=this.options,n=this.#t;if(this.options=this.#e.defaultQueryOptions(e),this.options.enabled!==void 0&&typeof this.options.enabled!=`boolean`&&typeof this.options.enabled!=`function`&&typeof w(this.options.enabled,this.#t)!=`boolean`)throw Error(`Expected enabled to be a boolean or a callback that returns a boolean`);this.#S(),this.#t.setOptions(this.options),t._defaulted&&!k(this.options,t)&&this.#e.getQueryCache().notify({type:`observerOptionsUpdated`,query:this.#t,observer:this});let r=this.hasListeners();r&&be(this.#t,n,this.options,t)&&this.#m(),this.updateResult(),r&&(this.#t!==n||w(this.options.enabled,this.#t)!==w(t.enabled,this.#t)||w(this.options.staleTime,this.#t)!==w(t.staleTime,this.#t))&&this.#g();let i=this.#_();r&&(this.#t!==n||w(this.options.enabled,this.#t)!==w(t.enabled,this.#t)||i!==this.#f)&&this.#v(i)}getOptimisticResult(e){let t=this.#e.getQueryCache().build(this.#e,e),n=this.createResult(t,e);return k(this.getCurrentResult(),n)||(this.#r=n,this.#a=this.options,this.#i=this.#t.state),n}getCurrentResult(){return this.#r}trackResult(e,t){return new Proxy(e,{get:(e,n)=>(this.trackProp(n),t?.(n),Reflect.get(e,n))})}trackProp(e){this.#p.add(e)}getCurrentQuery(){return this.#t}refetch({...e}={}){return this.fetch({...e})}fetchOptimistic(e){let t=this.#e.defaultQueryOptions(e),n=this.#e.getQueryCache().build(this.#e,t),r=()=>{},i,a=new Promise(e=>{i=e,r=this.#e.getQueryCache().subscribe(i=>{i.type===`updated`&&i.query.queryHash===n.queryHash&&n.state.data!==void 0&&(r(),e(this.createResult(n,t)))})});return Promise.race([n.fetch().then(()=>{let e=this.createResult(n,t);return i?.(e),e}).finally(()=>{r()}),a])}fetch(e){return this.#m({...e,cancelRefetch:e.cancelRefetch??!0}).then(()=>(this.updateResult(),this.#r))}#m(e){this.#S();let t=this.#t.fetch(this.options,e);return e?.throwOnError||(t=t.catch(x)),t}#h(e){return!L()&&w(this.options.enabled,this.#t)!==!1&&S(e)}#g(){this.#b();let e=w(this.options.staleTime,this.#t);if(this.#r.isStale||!this.#h(e))return;let t=C(this.#r.dataUpdatedAt,e)+1;this.#u=y.setTimeout(()=>{this.#r.isStale||this.updateResult()},t)}#_(){return(typeof this.options.refetchInterval==`function`?this.options.refetchInterval(this.#t):this.options.refetchInterval)??!1}#v(e){this.#x(),this.#f=e,!(this.#f===0||!this.#h(this.#f))&&(this.#d=y.setInterval(()=>{(this.options.refetchIntervalInBackground||z.isFocused())&&this.#m()},this.#f))}#y(){this.#g(),this.#v(this.#_())}#b(){this.#u!==void 0&&(y.clearTimeout(this.#u),this.#u=void 0)}#x(){this.#d!==void 0&&(y.clearInterval(this.#d),this.#d=void 0)}createResult(e,t){let n=this.#t,r=this.options,i=this.#r,a=this.#i,o=this.#a,s=e===n?this.#n:e.state,{state:c}=e,l={...c},u=!1,d;if(t._optimisticResults){let i=this.hasListeners(),a=!i&&ye(e,t),o=i&&be(e,n,t,r);(a||o)&&(l={...l,...q(c.data,e.options)}),t._optimisticResults===`isRestoring`&&(l.fetchStatus=`idle`)}let{error:f,errorUpdatedAt:p,status:m}=l;d=l.data;let h=!1;if(t.placeholderData!==void 0&&d===void 0&&m===`pending`){let e;i?.isPlaceholderData&&t.placeholderData===o?.placeholderData?(e=i.data,h=!0):e=typeof t.placeholderData==`function`?t.placeholderData(this.#l?.state.data,this.#l):t.placeholderData,e!==void 0&&(m=`success`,d=N(i?.data,e,t),u=!0)}if(t.select&&d!==void 0&&!h){if(i&&d===a?.data&&t.select===this.#s)d=this.#c;else try{this.#s=t.select,d=t.select(d),d=N(i?.data,d,t),this.#c=d,this.#o=null}catch(e){this.#o=e}}else d===void 0&&(this.#o=null);this.#o&&(f=this.#o,d=this.#c,p=Date.now(),m=`error`,u=!1);let g=l.fetchStatus===`fetching`,_=m===`pending`,v=m===`error`,y=_&&g,b=d!==void 0;return{status:m,fetchStatus:l.fetchStatus,isPending:_,isSuccess:m===`success`,isError:v,isInitialLoading:y,isLoading:y,data:d,dataUpdatedAt:l.dataUpdatedAt,error:f,errorUpdatedAt:p,failureCount:l.fetchFailureCount,failureReason:l.fetchFailureReason,errorUpdateCount:l.errorUpdateCount,isFetched:e.isFetched(),isFetchedAfterMount:l.dataUpdateCount>s.dataUpdateCount||l.errorUpdateCount>s.errorUpdateCount,isFetching:g,isRefetching:g&&!_,isLoadingError:v&&!b,isPaused:l.fetchStatus===`paused`,isPlaceholderData:u,isRefetchError:v&&b,isStale:Z(e,t),refetch:this.refetch,isEnabled:w(t.enabled,e)!==!1}}updateResult(){let e=this.#r,t=this.createResult(this.#t,this.options);if(this.#i=this.#t.state,this.#a=this.options,this.#i.data!==void 0&&(this.#l=this.#t),k(t,e))return;this.#r=t;let n=(()=>{if(!e)return!0;let{notifyOnChangeProps:t}=this.options,n=typeof t==`function`?t():t;if(n===`all`||!n&&!this.#p.size)return!0;let r=new Set(n??this.#p);return this.options.throwOnError&&r.add(`error`),Object.keys(this.#r).some(t=>{let n=t;return this.#r[n]!==e[n]&&r.has(n)})})();B.batch(()=>{n&&this.listeners.forEach(e=>{e(this.#r)}),this.#e.getQueryCache().notify({query:this.#t,type:`observerResultsUpdated`})})}#S(){let e=this.#e.getQueryCache().build(this.#e,this.options);if(e===this.#t)return;let t=this.#t;this.#t=e,this.#n=e.state,this.hasListeners()&&(t?.removeObserver(this),e.addObserver(this))}onQueryUpdate(){this.updateResult(),this.hasListeners()&&this.#y()}};function ve(e,t){return w(t.enabled,e)!==!1&&e.state.data===void 0&&(e.state.status!==`error`||w(t.retryOnMount,e)!==!1)}function ye(e,t){return ve(e,t)||e.state.data!==void 0&&X(e,t,t.refetchOnMount)}function X(e,t,n){if(w(t.enabled,e)!==!1&&w(t.staleTime,e)!==`static`){let r=typeof n==`function`?n(e):n;return r===`always`||r!==!1&&Z(e,t)}return!1}function be(e,t,n,r){return(e!==t||w(r.enabled,e)===!1)&&(!n.suspense||e.state.status!==`error`)&&Z(e,n)}function Z(e,t){return w(t.enabled,e)!==!1&&e.isStaleByTime(w(t.staleTime,e))}var xe=p.createContext(!1),Se=()=>p.useContext(xe);xe.Provider;function Ce(){let e=!1;return{clearReset:()=>{e=!1},reset:()=>{e=!0},isReset:()=>e}}var we=p.createContext(Ce()),Te=()=>p.useContext(we),Ee=(e,t,n)=>{let r=n?.state.error&&typeof e.throwOnError==`function`?I(e.throwOnError,[n.state.error,n]):e.throwOnError;(e.suspense||r)&&(t.isReset()||(e.retryOnMount=!1))},De=e=>{p.useEffect(()=>{e.clearReset()},[e])},Oe=({result:e,errorResetBoundary:t,throwOnError:n,query:r,suspense:i})=>e.isError&&!t.isReset()&&!e.isFetching&&r&&(i&&e.data===void 0||I(n,[e.error,r])),ke=e=>{if(e.suspense){let t=1e3,n=e=>e===`static`?e:Math.max(e??t,t),r=e.staleTime;e.staleTime=typeof r==`function`?(...e)=>n(r(...e)):n(r),typeof e.gcTime==`number`&&(e.gcTime=Math.max(e.gcTime,t))}},Ae=(e,t)=>e?.suspense&&t.isPending,je=(e,t,n)=>t.fetchOptimistic(e).catch(()=>{n.clearReset()});function Me(e,t,n){let r=Se(),i=Te(),a=g(n),o=a.defaultQueryOptions(e),s=a.getQueryCache().get(o.queryHash),c=e.subscribed!==!1;o._optimisticResults=r?`isRestoring`:c?`optimistic`:void 0,ke(o),Ee(o,i,s),De(i);let[l]=p.useState(()=>new t(a,o)),u=l.getOptimisticResult(o),d=!r&&c;if(p.useSyncExternalStore(p.useCallback(e=>{let t=d?l.subscribe(B.batchCalls(e)):x;return l.updateResult(),t},[l,d]),()=>l.getCurrentResult(),()=>l.getCurrentResult()),p.useEffect(()=>{l.setOptions(o)},[o,l]),Ae(o,u))throw je(o,l,i);if(Oe({result:u,errorResetBoundary:i,throwOnError:o.throwOnError,query:s,suspense:o.suspense}))throw u.error;return o.notifyOnChangeProps?u:l.trackResult(u)}function Ne(e,t){return Me(e,_e,t)}function Pe(e){return e}function Q(e){return{days:e.days,from:e.from,to:e.to}}function Fe(e){return{...e.project?{project:e.project}:{},...e.agent?{agent:e.agent}:{},timeZone:e.timeZone??Intl.DateTimeFormat().resolvedOptions().timeZone}}var Ie={bookmarks:[`bookmarks`],config:[`config`],dashboards:[`dashboard`],dashboard:(e,t)=>[`dashboard`,Q(e),Fe(t)],agentCatalogs:[`agent-catalog`],agentCatalog:e=>[`agent-catalog`,Q(e)],projects:[`projects`],projectWindow:e=>[`projects`,Q(e)],projectPage:(e,t)=>[`projects`,Q(e),`page`,t??null],projectDetail:(e,t)=>[`projects`,Q(e),`detail`,t],search:(e,t)=>[`search`,e,t],searches:[`search`],sessionDetails:[`session-detail`],sessionDetail:(e,t)=>[`session-detail`,e,t],sessionProjections:[`session-projection`],sessionProjection:e=>[`session-projection`,Q(e)]},Le=2e3;function Re(e,t){return Pe({queryKey:Ie.dashboard(e,t),staleTime:Le,queryFn:async({signal:n})=>{try{return await f(e,t,{signal:n})}catch(e){throw n.aborted||console.error(`Failed to load dashboard:`,e),e}}})}var ze=(0,p.createContext)(`light`),Be=`(prefers-color-scheme: dark)`;function Ve(){return typeof window>`u`||typeof window.matchMedia!=`function`?!1:window.matchMedia(Be).matches}function He(e){let[t,n]=(0,p.useState)(Ve);(0,p.useEffect)(()=>{if(typeof window>`u`||typeof window.matchMedia!=`function`)return;let e=window.matchMedia(Be),t=e=>n(e.matches);return e.addEventListener(`change`,t),()=>e.removeEventListener(`change`,t)},[]);let r=e===`system`?t?`dark`:`light`:e;return(0,p.useEffect)(()=>{document.documentElement.classList.toggle(`dark`,r===`dark`)},[r]),r}function Ue({title:e,message:t,onRetry:n,className:r=``}){return u(),(0,m.jsxs)(`div`,{role:`alert`,className:`rounded-sm border border-[var(--console-error-border)] bg-[var(--console-error-bg)] p-4 text-[var(--console-error)] ${r}`,children:[(0,m.jsx)(`p`,{className:`text-sm font-medium`,children:e}),(0,m.jsx)(`p`,{className:`console-mono mt-1 break-words text-[11px]`,children:t}),(0,m.jsx)(`button`,{type:`button`,onClick:n,className:`console-mono mt-3 rounded-sm border border-[var(--console-error-border)] bg-[var(--console-surface)] px-2.5 py-1 text-[11px] font-semibold motion-hover hover:bg-[var(--console-error-bg)] focus-visible:ring-2 focus-visible:ring-[var(--brand)] focus-visible:outline-none`,children:d(`Retry`)})]})}function We({className:e,children:t,...n}){return(0,m.jsx)(`section`,{className:a(`rounded-lg border border-[var(--console-border)] bg-[var(--console-surface)] shadow-[var(--shadow-raised)]`,e),...n,children:t})}function Ge({title:e,meta:t,action:n}){return(0,m.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,m.jsx)(`h3`,{className:`console-display min-w-0 truncate text-[15px] font-semibold text-[var(--console-text)]`,children:e}),(0,m.jsxs)(`div`,{className:`ml-auto flex shrink-0 items-center gap-3`,children:[t===void 0?null:(0,m.jsx)(`span`,{className:`console-mono text-[10.5px] text-[var(--console-muted)]`,children:t}),n]})]})}function Ke(e){let t=e.sourceFailureCount;return[t==null?null:d(`{0} source{1} failed`,[t,t===1?``:`s`]),e.sourceFailureSummary].filter(e=>e!=null).join(` · `)}function qe(e){return(e.sourceFailureCount??0)>0||e.sourceFailureSummary!=null}function $(e){let t=new Date(e);return`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,`0`)}-${String(t.getDate()).padStart(2,`0`)}`}function Je(e){if(!e)return null;let{from:t,to:n,days:r}=e.window;if(r===0||t==null)return d(`All time`);let i=$(t),a=$(n??Date.now());return r?d(`Last {0}d · {1} → {2}`,[r,i,a]):`${i} → ${a}`}function Ye(e,t,n){return t?e?d(`Searching for "{0}"`,[e]):d(`Loading recent sessions`):e?d(`{0} matches for "{1}"`,[n,e]):d(`{0} recent sessions`,[n])}function Xe(e){if(!e)return null;if(e.backfill?.active){let t=e.backfill.currentAgent,n=e.backfill.pendingAgents.length,r=e.backfill.progress,i=(r?.phase==null||r.phase===`scanning`||r.phase===`finalizing`)&&r?.total&&r.processed!=null?` · ${r.processed}/${r.total}`:``,a=r?.phase===`publish-queued`?d(`Full-history publication queued`):r?.phase===`committing`?d(`Committing full-history publication`):r?.phase===`indexing`?d(`Writing full-history search index`):r?.phase===`publishing`?d(`Preparing full-history publication`):r?.phase===`finalizing`?d(`Finalizing full-history metadata`):d(`Scanning full session history`);return t?`${a} · ${t}${i}${n>0?d(` · {0} history scan queued`,[n]):``}`:`${a}${i}`}if(e.backfill?.failedAgents.length)return d(`Full-history refresh failed · {0}`,[e.backfill.failedAgents.join(`, `)]);let t=Object.values(e.agentStatuses??{}).find(e=>e.status===`failed`);if(t)return d(`Session refresh failed · {0}{1}`,[t.agentName,t.error?` · ${t.error}`:``]);if(e.active&&e.phase===`initializing`)return d(`Initializing recent sessions`);let n=Object.entries(e.backfill?.partialAgents??{}).find(([,e])=>e.completeness===`partial`&&qe(e));if(n){let[e,t]=n,r=Ke(t);return d(`Full-history refresh completed with partial data · {0}{1}`,[e,r?` · ${r}`:``])}let r=Object.values(e.agentStatuses??{}).find(e=>e.status===`complete`&&e.completeness===`partial`&&qe(e));if(r){let e=Ke(r);return d(`Session refresh completed with partial data · {0}{1}`,[r.agentName,e?` · ${e}`:``])}return e.searchIndexMaintenance?.failedAgents.length?d(`Background search index maintenance paused · {0}`,[e.searchIndexMaintenance.failedAgents.join(`, `)]):null}function Ze({open:e,onOpenChange:t,window:n,customFrom:r,customTo:i,onSelectCustom:a}){u();let o=r??(n?.from==null?``:$(n.from)),s=i??(n?.to==null?null:$(n.to));return(0,m.jsx)(l,{open:e,onOpenChange:t,children:e?(0,m.jsx)(Qe,{initialFrom:o,initialTo:s,onOpenChange:t,onSelectCustom:a}):null})}function Qe({initialFrom:e,initialTo:t,onOpenChange:n,onSelectCustom:a}){u();let[l,f]=(0,p.useState)(e),[h,g]=(0,p.useState)(()=>t??$(Date.now()));return(0,m.jsxs)(c,{children:[(0,m.jsx)(i,{className:`motion-backdrop fixed inset-0 z-50 bg-[var(--scrim)]`}),(0,m.jsxs)(s,{className:`motion-modal fixed top-1/2 left-1/2 z-50 w-[calc(100%-2rem)] max-w-sm -translate-x-1/2 -translate-y-1/2 rounded-lg border border-[var(--console-border)] bg-[var(--console-surface)] p-5 shadow-[var(--shadow-overlay)] outline-none`,children:[(0,m.jsx)(o,{className:`console-mono text-sm font-semibold text-[var(--console-text)]`,children:d(`Custom time range`)}),(0,m.jsx)(`p`,{className:`mt-1 text-xs text-[var(--console-muted)]`,children:d(`Both dates are included.`)}),(0,m.jsxs)(`div`,{className:`mt-4 grid grid-cols-2 gap-3`,children:[(0,m.jsxs)(`label`,{className:`console-mono text-[11px] uppercase tracking-wide text-[var(--console-muted)]`,children:[d(`From`),` `,(0,m.jsx)(`input`,{type:`date`,value:l,max:h||void 0,onChange:e=>f(e.target.value),className:`mt-1.5 w-full rounded-sm border border-[var(--console-border-strong)] bg-[var(--console-surface)] px-2 py-2 text-xs normal-case tracking-normal text-[var(--console-text)] outline-none focus:border-[var(--brand)] focus:ring-2 focus:ring-[var(--brand)]/25`})]}),(0,m.jsxs)(`label`,{className:`console-mono text-[11px] uppercase tracking-wide text-[var(--console-muted)]`,children:[d(`To`),` `,(0,m.jsx)(`input`,{type:`date`,value:h,min:l||void 0,onChange:e=>g(e.target.value),className:`mt-1.5 w-full rounded-sm border border-[var(--console-border-strong)] bg-[var(--console-surface)] px-2 py-2 text-xs normal-case tracking-normal text-[var(--console-text)] outline-none focus:border-[var(--brand)] focus:ring-2 focus:ring-[var(--brand)]/25`})]})]}),(0,m.jsxs)(`div`,{className:`mt-5 flex justify-end gap-2`,children:[(0,m.jsx)(r,{className:`rounded-sm border border-[var(--console-border)] px-3 py-1.5 text-xs text-[var(--console-text)] hover:bg-[var(--console-surface-muted)]`,children:d(`Cancel`)}),(0,m.jsx)(`button`,{type:`button`,disabled:!l||!h||l>h,onClick:()=>{a(l,h),n(!1)},className:`rounded-sm border border-[var(--console-accent)] bg-[var(--console-accent)] px-3 py-1.5 text-xs text-[var(--console-accent-fg)] hover:opacity-90 disabled:cursor-not-allowed disabled:opacity-40`,children:d(`Apply range`)})]})]})]})}export{O as A,E as C,ne as D,re as E,_ as F,g as I,k as M,I as N,x as O,P,te as S,oe as T,W as _,We as a,z as b,ze as c,Re as d,Ie as f,G as g,ge as h,Je as i,w as j,D as k,He as l,Ne as m,Xe as n,Ge as o,Pe as p,Ye as r,Ue as s,Ze as t,Le as u,V as v,T as w,R as x,B as y};
@@ -1 +0,0 @@
1
- import{a as e,n as t,t as n}from"./jsx-runtime-B-hcVAMW.js";import{D as r,i,n as a,t as o}from"./translate-BDFu3ZiK.js";import{H as s}from"./index-Bl8pbRFj.js";var c=e(t(),1);function l(e,t){return t===0||e-t>=15.666666666666668}function u(e,t,n){return!e&&t<=.12?n+1:0}function d(e,t){return e?0:t+1}function f(){let e=typeof document>`u`?void 0:document.fonts;return e?e.ready.then(()=>void 0):Promise.resolve()}function p(e,t,n){return e>=2&&(t>=8||n>=300)}function m(e,t){return!e||Math.abs(e.receiptWidth-t.receiptWidth)>.5||Math.abs(e.receiptHeight-t.receiptHeight)>.5||Math.abs(e.startX-t.startX)>.5||Math.abs(e.startY-t.startY)>.5}var h=18,g=42,ee=5,_=270,v=500,y=2,b=.035;function te(e){let t=window.getComputedStyle(e),n=(e,n)=>t.getPropertyValue(e).trim()||n;return{paperTop:n(`--console-surface`,`white`),paperBottom:n(`--console-surface-sunken`,`whitesmoke`),ink:n(`--console-text`,`black`),inkMuted:n(`--console-text-secondary`,`dimgray`),line:n(`--console-border-strong`,`silver`),shadow:n(`--scrim`,`gray`)}}function ne(e){return window.getComputedStyle(e).getPropertyValue(`--font-mono`).trim()||`monospace`}function x(e){return Math.round(e??0).toLocaleString(i())}function S(e){return`$${(e??0).toFixed(4)}`}function C(e){return new Date(e).toLocaleString(i(),{month:`short`,day:`2-digit`,hour:`2-digit`,minute:`2-digit`})}function w(e){let t=2166136261;for(let n=0;n<e.length;n+=1)t^=e.charCodeAt(n),t=Math.imul(t,16777619);return t>>>0}function T(e){let t=e||1;return()=>(t=Math.imul(t^t>>>15,1|t),t^=t+Math.imul(t^t>>>7,61|t),((t^t>>>14)>>>0)/4294967296)}function E(e,t,n,r,i){let a=t.toUpperCase(),o=n.toUpperCase();e.fillText(a,18,r),e.fillText(o,i-18-e.measureText(o).width,r)}function D(e,t,n){if(e.measureText(t).width<=n)return t;let r=t;for(;r.length>1&&e.measureText(`${r}...`).width>n;)r=r.slice(0,-1);return`${r}...`}function O(e,t,n,r){let i=t.toUpperCase().split(/\s+/).filter(Boolean),a=[],o=``;for(let t of i){let i=o?`${o} ${t}`:t;if(e.measureText(i).width<=n){o=i;continue}if(o?(a.push(o),o=t):(a.push(D(e,t,n)),o=``),a.length===r)break}return a.length<r&&o&&a.push(o),a.length>0&&a.length===r&&(a[a.length-1]=D(e,a[a.length-1]??``,n)),a.slice(0,r)}function re(e,t,n){let r=document.createElement(`canvas`);r.width=_*y,r.height=v*y;let i=r.getContext(`2d`);if(!i)return r;i.scale(y,y);let a=e=>`${e} ${n}`,s=i.createLinearGradient(0,0,_,v);s.addColorStop(0,t.paperTop),s.addColorStop(1,t.paperBottom),i.fillStyle=s,i.fillRect(0,0,_,v);let c=T(w(e.id));i.fillStyle=t.ink;for(let e=0;e<1200;e+=1)i.globalAlpha=b*(.12+c()*.14),i.fillRect(c()*_,c()*v,.7,.7);i.globalAlpha=1,i.fillStyle=t.ink,i.font=a(`700 18px`),i.textAlign=`center`,i.fillText(`CODESESH MART`,_/2,34),i.fillStyle=t.inkMuted,i.font=a(`11px`),i.fillText(D(i,e.subtitle.toUpperCase(),234),_/2,51),i.strokeStyle=t.line,i.lineWidth=1,i.setLineDash([4,4]),i.beginPath(),i.moveTo(18,66),i.lineTo(252,66),i.stroke(),i.setLineDash([]),i.textAlign=`left`,i.fillStyle=t.ink,i.font=a(`11px`),E(i,o(`Agent`),e.agent,88,_),E(i,o(`Updated`),C(e.updatedAt),104,_),E(i,o(`Session`),`#${e.id.slice(0,8)}`,120,_),i.setLineDash([2,3]),i.beginPath(),i.moveTo(18,140),i.lineTo(252,140),i.stroke(),i.setLineDash([]),i.font=a(`700 12px`),i.fillText(o(`SESSION TOC RECEIPT LIST`),18,163),i.font=a(`11px`);let l=185;for(let t of e.items){let e=x(t.count);i.fillText(D(i,t.label,168),18,l),i.fillText(e,252-i.measureText(e).width,l),l+=17}return i.strokeStyle=t.line,i.lineWidth=1.5,i.beginPath(),i.moveTo(18,l+5),i.lineTo(252,l+5),i.stroke(),l+=26,E(i,o(`Input tokens`),x(e.inputTokens),l,_),l+=16,E(i,o(`Output tokens`),x(e.outputTokens),l,_),l+=16,E(i,o(`Messages`),x(e.messageCount),l,_),l+=22,i.font=a(`700 13px`),E(i,o(`TOTAL COST`),S(e.totalCost),l,_),i.strokeStyle=t.line,i.setLineDash([4,4]),i.beginPath(),i.moveTo(18,l+18),i.lineTo(252,l+18),i.stroke(),i.setLineDash([]),i.font=a(`10px`),i.textAlign=`center`,i.fillStyle=t.inkMuted,O(i,e.title,234,2).forEach((e,t)=>{i.fillText(e,_/2,l+38+t*13)}),r}function k(e,t){return e*h+t}function A(e){let{receiptWidth:t,receiptHeight:n,startX:r,startY:i}=e,a=t/17,o=n/41,s=[],c=[];for(let e=0;e<g;e+=1)for(let t=0;t<h;t+=1){let n=r+t*a,c=i+e*o;s.push({x:n,y:c,oldX:n,oldY:c,fixedX:e===0?n:null,fixedY:e===0?c:null})}let l=(e,t,n)=>{let r=s[e],i=s[t];!r||!i||c.push({a:e,b:t,length:Math.hypot(i.x-r.x,i.y-r.y),stiffness:n})};for(let e=0;e<g;e+=1)for(let t=0;t<h;t+=1){let n=k(e,t);t<17&&l(n,k(e,t+1),.98),e<41&&l(n,k(e+1,t),.92),e<41&&t<17&&(l(n,k(e+1,t+1),.46),l(k(e+1,t),k(e,t+1),.46)),t<16&&l(n,k(e,t+2),.35),e<40&&l(n,k(e+2,t),.28)}return{particles:s,constraints:c,receiptWidth:t,receiptHeight:n}}function ie(e,t){let n=t.receiptWidth/17;for(let r=0;r<h;r+=1){let i=e[r];i&&(i.fixedX=t.startX+r*n,i.fixedY=t.startY)}}function j(e){for(let t=0;t<h;t+=1){let n=e[t];!n||n.fixedX==null||n.fixedY==null||(n.x=n.fixedX,n.y=n.fixedY,n.oldX=n.fixedX,n.oldY=n.fixedY)}}function ae(e,t){let n=e[t.a],r=e[t.b];if(!n||!r)return;let i=r.x-n.x,a=r.y-n.y,o=Math.hypot(i,a);if(o<1e-4)return;let s=(o-t.length)/o*t.stiffness,c=n.fixedX!=null&&n.fixedY!=null,l=r.fixedX!=null&&r.fixedY!=null,u=c?0:l?1:.5,d=l?0:c?1:.5,f=i*s,p=a*s;c||(n.x+=f*u,n.y+=p*u),l||(r.x-=f*d,r.y-=p*d)}function M(e,t,n,r,i,a){let o=r[k(i,a)],s=r[k(i,a+1)],c=r[k(i+1,a)],l=r[k(i+1,a+1)];if(!o||!s||!c||!l)return;let u=a/17*t.width,d=i/41*t.height,f=t.width/17,p=t.height/41;e.save(),e.beginPath(),e.moveTo(o.x,o.y),e.lineTo(s.x,s.y),e.lineTo(l.x,l.y),e.lineTo(c.x,c.y),e.closePath(),e.clip(),e.transform((s.x-o.x)/f,(s.y-o.y)/f,(c.x-o.x)/p,(c.y-o.y)/p,o.x,o.y),e.drawImage(t,u,d,f+1,p+1,0,0,f+1,p+1),e.restore();let m=Math.atan2(s.y-o.y,s.x-o.x),h=Math.hypot(c.x-o.x,c.y-o.y)/(v/41),g=Math.sin(m)*.08+(h-1)*.16;Math.abs(g)<.01||(e.save(),e.beginPath(),e.moveTo(o.x,o.y),e.lineTo(s.x,s.y),e.lineTo(l.x,l.y),e.lineTo(c.x,c.y),e.closePath(),e.globalAlpha=Math.abs(g),e.fillStyle=g>0?n.paperTop:n.shadow,e.fill(),e.restore())}function N(e,t,n){let r=null,i=44;for(let a=h;a<e.length;a+=1){let o=e[a];if(!o)continue;let s=Math.hypot(o.x-t,o.y-n);s<i&&(i=s,r=a)}return r}function oe(e){let t=0;for(let n=h;n<e.length;n+=1){let r=e[n];r&&(t=Math.max(t,Math.hypot(r.x-r.oldX,r.y-r.oldY)))}return t}function P({canvas:e,anchor:t,hitSurface:n,payload:r,minWidthQuery:i}){let a=e.getContext(`2d`,{alpha:!0});if(!a)return null;let o=r,s={id:null,x:0,y:0,prevX:0,prevY:0,vx:0,vy:0,grabbedIndex:null},c=null,g=!1,y=0,b=0,x=0,S=A({receiptWidth:_,receiptHeight:v,startX:0,startY:32}),C=performance.now(),w=null,T=0,E=0,D=0,O=0,k=!1,P=!1,F=window.matchMedia(i),I=window.matchMedia(`(prefers-reduced-motion: reduce)`),L=()=>c!=null&&F.matches&&document.visibilityState===`visible`,R=()=>{let e=te(t);c={texture:re(o,e,ne(t)),palette:e}},z=()=>{let e=t.getBoundingClientRect(),n=Math.max(280,e.width||320),r=Math.min(_,n-34);return{receiptWidth:r,receiptHeight:Math.min(v,Math.max(320,x-42)),startX:(n-r)/2,startY:32}},B=t=>{k!==t&&(k=t,e.style.visibility=t?`visible`:`hidden`,n.style.visibility=t&&!I.matches?`visible`:`hidden`)},V=()=>{P=!1,y&&=(window.cancelAnimationFrame(y),0),B(!1)},H=(e,t=performance.now())=>{S=A(e),w=e,C=t},U=()=>{let n=window.devicePixelRatio||1,r=t.getBoundingClientRect();b=Math.max(1,r.width),x=Math.max(1,r.height),e.width=Math.floor(b*n),e.height=Math.floor(x*n),a.setTransform(n,0,0,n,0,0),T=0,E=0,D=0,O=0,B(!1),H(z()),L()&&W()},W=()=>{P||!L()||(P=!0,y=window.requestAnimationFrame(Z))},G=()=>{L()?U():V()},K=e=>{let n=t.getBoundingClientRect();return{x:e.clientX-n.left,y:e.clientY-n.top}},q=e=>{if(e.button!==0||I.matches)return;let t=K(e),r=N(S.particles,t.x,t.y);r!=null&&(e.preventDefault(),n.setPointerCapture(e.pointerId),s.id=e.pointerId,s.x=t.x,s.y=t.y,s.prevX=t.x,s.prevY=t.y,s.vx=0,s.vy=0,s.grabbedIndex=r,E=0,D=0,W())},J=e=>{if(s.id!==e.pointerId)return;let t=K(e);s.vx=t.x-s.prevX,s.vy=t.y-s.prevY,s.prevX=t.x,s.prevY=t.y,s.x=t.x,s.y=t.y},Y=e=>{if(s.id!==e.pointerId)return;let t=s.grabbedIndex==null?null:S.particles[s.grabbedIndex];t&&(t.oldX=t.x-s.vx*.9,t.oldY=t.y-s.vy*.9),s.id=null,s.grabbedIndex=null},se=e=>{let t=(e-C)/1e3;for(let e=h;e<S.particles.length;e+=1){let n=S.particles[e];if(!n)continue;let r=(n.x-n.oldX)*.985,i=(n.y-n.oldY)*.985;n.oldX=n.x,n.oldY=n.y,n.x+=r+Math.sin(t*1.7+e*.19)*.018,n.y+=i+.22}let n=s.grabbedIndex==null?null:S.particles[s.grabbedIndex];n&&(n.x+=(s.x-n.x)*.72,n.y+=(s.y-n.y)*.72)},ce=()=>{for(let e=0;e<ee;e+=1){j(S.particles);for(let e of S.constraints)ae(S.particles,e)}j(S.particles)},le=()=>{let e=1/0,t=1/0,r=-1/0,i=-1/0;for(let n of S.particles)e=Math.min(e,n.x),t=Math.min(t,n.y),r=Math.max(r,n.x),i=Math.max(i,n.y);n.style.transform=`translate3d(${e-20}px, ${t-20}px, 0)`,n.style.width=`${r-e+40}px`,n.style.height=`${i-t+40}px`},ue=e=>{let t=S.particles[0],n=S.particles[17],r=S.particles[755],i=S.particles[738];!t||!n||!r||!i||(a.save(),a.shadowColor=e.shadow,a.shadowBlur=24,a.shadowOffsetY=16,a.fillStyle=e.shadow,a.beginPath(),a.moveTo(t.x,t.y),a.lineTo(n.x,n.y),a.lineTo(r.x,r.y),a.lineTo(i.x,i.y),a.closePath(),a.fill(),a.restore())},de=e=>{let t=S.particles[0],n=S.particles[17];!t||!n||(a.save(),a.strokeStyle=e.ink,a.lineWidth=4,a.lineCap=`round`,a.beginPath(),a.moveTo(t.x-10,t.y-3),a.lineTo(n.x+10,n.y-3),a.stroke(),a.strokeStyle=e.paperTop,a.lineWidth=1,a.beginPath(),a.moveTo(t.x-8,t.y-5),a.lineTo(n.x+8,n.y-5),a.stroke(),a.restore())},X=()=>{if(c){a.clearRect(0,0,b,x),ue(c.palette);for(let e=0;e<41;e+=1)for(let t=0;t<17;t+=1)M(a,c.texture,c.palette,S.particles,e,t);de(c.palette),le()}},Z=e=>{if(!P)return;if(!L()){V();return}if(!l(e,O)){y=window.requestAnimationFrame(Z);return}O=e;let t=z();m(w,t)&&s.id==null?(T=0,B(!1),H(t,e)):(T+=1,w=t),ie(S.particles,t),I.matches||(se(e),ce()),X();let n=s.id!=null;E=u(n,oe(S.particles),E),D=d(n,D);let r=I.matches;if((r||T>=2)&&B(!0),r||p(T,E,D)){r||(H(t,e),X()),P=!1,y=0;return}y=window.requestAnimationFrame(Z)};B(!1),f().then(()=>{g||(R(),G())});let Q=new ResizeObserver(U);Q.observe(t);let $=new MutationObserver(()=>{R(),X()});return $.observe(document.documentElement,{attributes:!0,attributeFilter:[`class`]}),F.addEventListener(`change`,G),I.addEventListener(`change`,G),document.addEventListener(`visibilitychange`,G),window.addEventListener(`resize`,G),n.addEventListener(`pointerdown`,q),n.addEventListener(`pointermove`,J),n.addEventListener(`pointerup`,Y),n.addEventListener(`pointercancel`,Y),{updatePayload(e){o=e,!(g||!c)&&(R(),X())},destroy(){g||(g=!0,V(),Q.disconnect(),$.disconnect(),F.removeEventListener(`change`,G),I.removeEventListener(`change`,G),document.removeEventListener(`visibilitychange`,G),window.removeEventListener(`resize`,G),n.removeEventListener(`pointerdown`,q),n.removeEventListener(`pointermove`,J),n.removeEventListener(`pointerup`,Y),n.removeEventListener(`pointercancel`,Y))}}}var F=n();function I(e){let t=[{label:o(`User`),count:e.counts.user},{label:o(`Agent Responses`),count:e.counts.agent_message},{label:o(`Thinking`),count:e.counts.thinking},{label:o(`Plans`),count:e.counts.plan},{label:o(`Tools`),count:e.counts.tools_all}].filter(e=>e.count>0),n=e.tools.map(e=>({label:e.label,count:e.count})),r=Math.max(0,9-t.length),i=n.length>r?n.slice(0,Math.max(0,r-1)):n,a=n.slice(i.length).reduce((e,t)=>e+t.count,0);return a>0&&i.push({label:o(`Other tools`),count:a}),[...t,...i].slice(0,9)}function L(e){return!e||e.length===0?o(`SESSION ACTIVITY RECEIPT`):e.map(e=>o(e)).join(` / `)}function R(e,t){return{id:e.reference.sessionId,title:s(e)||o(`Untitled session`),agent:r(e),updatedAt:e.time_updated??e.time_created,subtitle:L(e.smart_tags),inputTokens:e.stats.total_input_tokens??0,outputTokens:e.stats.total_output_tokens??0,messageCount:e.stats.message_count??0,totalCost:e.stats.total_cost??0,items:I(t)}}function z({session:e,toc:t,minWidthQuery:n=`(min-width: 1025px)`}){let r=a(),i=(0,c.useRef)(null),s=(0,c.useRef)(null),l=(0,c.useRef)(null),u=(0,c.useRef)(null),d=(0,c.useMemo)(()=>R(e,t),[r,e,t]),f=(0,c.useRef)(d);return(0,c.useLayoutEffect)(()=>{let e=i.current,t=s.current,r=l.current;if(!e||!t||!r)return;let a=P({canvas:e,anchor:t,hitSurface:r,payload:f.current,minWidthQuery:n});return u.current=a,()=>{a?.destroy(),u.current===a&&(u.current=null)}},[n]),(0,c.useLayoutEffect)(()=>{f.current=d,u.current?.updatePayload(d)},[d]),(0,F.jsxs)(`div`,{ref:s,className:`relative h-[calc(100dvh-5.5rem)] min-h-[420px]`,children:[(0,F.jsx)(`canvas`,{ref:i,className:`invisible pointer-events-none absolute inset-0 z-[61] block h-full w-full touch-none`,"aria-hidden":`true`}),(0,F.jsx)(`div`,{ref:l,className:`invisible absolute left-0 top-0 z-[62] cursor-grab touch-none active:cursor-grabbing`,"aria-label":o(`Interactive thermal receipt with Verlet paper simulation`)})]})}export{z as InteractiveReceipt};
@@ -1 +0,0 @@
1
- import{a as e,n as t,t as n}from"./jsx-runtime-B-hcVAMW.js";import{_ as r,f as i,g as a,i as o,n as s,o as c,p as l,s as u,t as d,u as f}from"./utils-BIZi2up3.js";import{a as p,c as m,d as h,m as g,o as _,s as v,t as y}from"./CustomTimeWindowDialog-CVURkiVO.js";import{n as b,t as x}from"./translate-BDFu3ZiK.js";var S=e(t(),1);function C(e,t){let n=e!==null,r=g({...h(e??{},t),enabled:n}),i=r.refetch,a=(0,S.useCallback)(async()=>{await i()},[i]);return{dashboard:n?r.data??null:null,loading:n&&r.isPending,error:n&&r.isError?r.error instanceof Error?r.error.message:x(`Unable to load dashboard.`):null,retry:a}}var w=n();function T({index:e,count:t,children:n}){let r=(e+.5)/t*100;return(0,w.jsx)(`div`,{role:`tooltip`,className:`console-mono pointer-events-none absolute top-2 z-10 w-max max-w-full rounded-md border border-[var(--console-border)] bg-[var(--console-surface)] px-2.5 py-2 text-[10.5px] break-words text-[var(--console-text)] shadow-[var(--shadow-overlay)]`,style:{left:`${r}%`,transform:`translateX(-${r}%)`},children:n})}var E=Math.PI*2;function D(e){return e<0?0:e>1?1:e}function O(e){let t=D(e);return t*t*(3-2*t)}function k(e,t){let n=Math.imul(Math.round(e*16)^2654435769,2246822507);return n=Math.imul(n^n>>>13^Math.round(t*16),3266489909),((n^n>>>16)>>>0)/4294967296}function A(e,t,n){return O((Math.sin(e*.09+n)+Math.sin(t*.075-n*.83)+Math.sin((e+t)*.045+n*1.31)+2)/4)}function j(e){if(e<=0)return 1;let t=10**Math.floor(Math.log10(e)),n=e/t;return(n<=1?1:n<=2?2:n<=5?5:10)*t}var M=/^var\((--[\w-]+)\)$/;function N(e,t){let n=M.exec(t)?.[1];return n&&e.getPropertyValue(n).trim()||t}function P(e,t){let n=/^#([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(e)?.[1];if(!n)return e;let r=n.length===3?n.replace(/./g,e=>e+e):n,i=parseInt(r,16);return`rgba(${i>>16&255}, ${i>>8&255}, ${i&255}, ${t})`}var F=50;function ee(){let e=!1,t=null,n=0,r=0,i=()=>{n&&cancelAnimationFrame(n),r&&window.clearTimeout(r),n=0,r=0},a=()=>{!e||t===null||n||(r&&=(window.clearTimeout(r),0),n=requestAnimationFrame(s))},o=()=>{!e||t===null||r||n||(r=window.setTimeout(()=>{r=0,a()},F))};function s(r){if(n=0,!e||t===null)return;let i=t(r);i===`active`?a():i===`idle`&&o()}return{api:{requestFrame:a,setFrameHandler:e=>{t=e,e===null?i():a()}},setEnabled:t=>{e!==t&&(e=t,e?a():i())}}}function I(e,t){let[n]=(0,S.useState)(ee);return(0,S.useEffect)(()=>{let r=e.current;if(!r||t){n.setEnabled(!1);return}let i=!0,a=document.visibilityState===`visible`,o=()=>n.setEnabled(i&&a),s=()=>{a=document.visibilityState===`visible`,o()},c=typeof IntersectionObserver>`u`?null:new IntersectionObserver(([e])=>{i=e?.isIntersecting??!1,o()});return c?.observe(r),document.addEventListener(`visibilitychange`,s),o(),()=>{n.setEnabled(!1),c?.disconnect(),document.removeEventListener(`visibilitychange`,s)}},[n,t,e]),n.api}var te=2,L=5,ne=8,re=7,ie=620,ae=.05,oe=.8,se=.0018,ce=.3,le=.48,ue={barRatio:.62,barMax:76,bandGap:4,minBand:6};function de(e,t,n){let r=Math.max(1,t-1),i=Math.min(ae,oe/r),a=1-(t-1)*i;return 1-(1-D((n-e*i)/a))**3}function fe(e,{values:t,axisMax:n,colors:r,highlight:i,hovered:a,layout:o,reducedMotion:s}){let c=(0,S.useContext)(m),l=I(e,s),u=r.join(`\0`),d=(0,S.useRef)({values:t,axisMax:n,hovered:a,layout:o}),f=(0,S.useRef)(new Map),p=(0,S.useRef)(new Map),h=(0,S.useRef)({startedAt:0,running:!1}),g=(0,S.useRef)({w:0,h:0}),_=(0,S.useRef)(()=>{});return(0,S.useEffect)(()=>{d.current={values:t,axisMax:n,hovered:a,layout:o},s?_.current():l.requestFrame()},[n,l,a,o,s,t]),(0,S.useEffect)(()=>{p.current=new Map(f.current),s?(h.current.running=!1,_.current()):(h.current={startedAt:performance.now(),running:!0},l.requestFrame())},[n,l,s,t]),(0,S.useEffect)(()=>{let t=e.current,n=t?.parentElement,r=t?.getContext(`2d`);if(!t||!n||!r)return;let a=getComputedStyle(t),o=(u?u.split(`\0`):[]).map(e=>N(a,e)),c=N(a,i),m=()=>{let e=n.clientWidth,i=n.clientHeight;if(!e||!i)return;let a=Math.min(te,window.devicePixelRatio||1);t.width=Math.round(e*a),t.height=Math.round(i*a),t.style.width=`${e}px`,t.style.height=`${i}px`,r.setTransform(a,0,0,a,0,0),g.current={w:e,h:i}},v=0,y=(e,t,n)=>{if(!h.current.running)return 1;let r=D((n-h.current.startedAt)/ie);return r>=1&&(h.current.running=!1),de(e,t,r)},b=(e,t,n,i,a,o,s,c,l,u,d)=>{let f=[l?ne:L,l?ne:L,u?re:L,u?re:L],p=()=>{r.beginPath(),r.roundRect(e,t,n,i,f)};r.save(),p(),r.clip(),r.globalAlpha=s,r.fillStyle=a;let m=c?.5:.36,h=Math.min(d,i)/2;r.beginPath();for(let a=e+d/2;a<e+n;a+=d)for(let e=t+h;e<t+i;e+=d){let n=O(1-(e-t)/i),o=A(a,e,v),s=d*(m+.34*n+.26*o)*(.8+.4*k(a,e));r.rect(a-s/2,e-s/2,s,s)}r.fill(),r.restore(),c&&(r.save(),p(),r.strokeStyle=o,r.lineWidth=1.75,r.shadowColor=o,r.shadowBlur=10,r.stroke(),r.restore())},x=e=>{v=e*se;let{w:t,h:n}=g.current;if(!t||!n)return;let i=d.current;if(r.clearRect(0,0,t,n),!i.values.length||i.axisMax<=0){h.current.running=!1;return}let{barRatio:a,barMax:s,bandGap:l,minBand:u}=i.layout,m=i.values.length,_=t/m,x=Math.min(_*a,s),S=Math.max(3,Math.round(t/200)),C=n/i.axisMax,w=i.hovered;i.values.forEach((t,r)=>{let i=y(r,m,e),a=r*_+(_-x)/2,s=n;t.forEach((e,n)=>{let d=`${r}:${n}`,m=e>0?Math.max(u,e*C):0,h=p.current.get(d)??0,g=h+(m-h)*i;f.current.set(d,g);let _=w?.column===r&&w.band===n,v=w==null?1:w.column===r?w.band===null||_?1:le:ce;g>0&&b(a,s-g,x,g,o[n]??o[0]??c,c,v,_,n===t.length-1,n===0,S),s-=g+l})})};_.current=()=>{m(),x(performance.now())},l.setFrameHandler(e=>(x(e),h.current.running?`active`:d.current.hovered===null?`stop`:`idle`)),m();let S=new ResizeObserver(()=>{m(),s?x(performance.now()):l.requestFrame()});return S.observe(n),s&&x(performance.now()),()=>{l.setFrameHandler(null),S.disconnect()}},[e,u,l,i,s,c]),{hitTest:(t,n)=>{let r=e.current,{w:i,h:a}=g.current;if(!r||!i)return null;let o=r.getBoundingClientRect(),s=(t-o.left)/o.width*i,c=(n-o.top)/o.height*a,{values:l,layout:u}=d.current,p=l.length,m=i/p,h=Math.floor(s/m);if(h<0||h>=p)return null;let _=Math.min(m*u.barRatio,u.barMax),v=h*m+(m-_)/2;if(s<v||s>v+_)return{column:h,band:null};let y=a;for(let e=0;e<l[h].length;e++){let t=f.current.get(`${h}:${e}`)??0;if(t>0&&c<=y&&c>=y-t)return{column:h,band:e};y-=t+u.bandGap}return{column:h,band:null}}}}var pe=`(prefers-reduced-motion: reduce)`;function R(){let[e,t]=(0,S.useState)(()=>globalThis.matchMedia?.(pe).matches??!1);return(0,S.useEffect)(()=>{let e=globalThis.matchMedia?.(pe);if(!e)return;let n=()=>t(e.matches);return n(),e.addEventListener(`change`,n),()=>e.removeEventListener(`change`,n)},[]),e}function me(e,t,n){return e===`ArrowLeft`?Math.max(0,t-1):e===`ArrowRight`?Math.min(n,t+1):e===`Home`?0:e===`End`?n:null}function he({label:e,itemLabels:t,activeIndex:n,onActiveIndexChange:r,layout:i}){let a=(0,S.useRef)([]),[o,s]=(0,S.useState)(0),c=t.length-1,l=Math.min(o,Math.max(0,c)),u=(e,t)=>{if(e.key===`Escape`){e.preventDefault(),r(null);return}let n=me(e.key,t,c);n!==null&&(e.preventDefault(),s(n),a.current[n]?.focus())};return(0,w.jsxs)(w.Fragment,{children:[(0,w.jsx)(`div`,{role:`listbox`,"aria-label":e,"aria-orientation":`horizontal`,className:d(`pointer-events-none absolute inset-0 z-[1]`,i===`columns`?`flex`:null),onBlur:e=>{e.currentTarget.contains(e.relatedTarget)||r(null)},children:t.map((e,t)=>(0,w.jsx)(`div`,{ref:e=>{a.current[t]=e},role:`option`,"aria-label":e,"aria-selected":n===t,tabIndex:t===l?0:-1,className:d(`pointer-events-none focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-[var(--brand)]`,i===`columns`?`h-full min-w-0 flex-1 rounded-sm`:`absolute inset-0 rounded-full`),onFocus:()=>{s(t),r(t)},onKeyDown:e=>u(e,t)},t))}),(0,w.jsx)(`span`,{role:`status`,"aria-live":`polite`,"aria-atomic":`true`,className:`sr-only`,children:n===null?``:t[n]})]})}var ge=[1,.75,.5,.25,0];function _e(e,t){return e===t||e!==null&&t!==null&&e.column===t.column&&e.band===t.band}function ve({values:e,axisMax:t,colors:n,highlight:r=`var(--brand)`,hovered:i,onHover:a,layout:o,height:s,formatTick:c,ariaLabel:l,itemLabels:u,className:f}){let p=(0,S.useRef)(null),m=(0,S.useRef)(i),h=R(),{hitTest:g}=fe(p,{values:e,axisMax:t,colors:n,highlight:r,hovered:i,layout:{...ue,...o},reducedMotion:h});(0,S.useEffect)(()=>{m.current=i},[i]);let _=e=>{_e(m.current,e)||(m.current=e,a(e))};return(0,w.jsxs)(`div`,{className:d(`flex`,f),children:[c?(0,w.jsx)(`div`,{className:`relative shrink-0`,style:{height:s,width:38},"aria-hidden":!0,children:ge.map(e=>(0,w.jsx)(`span`,{className:`console-mono absolute right-2 -translate-y-1/2 text-[9.5px] whitespace-nowrap text-[var(--console-muted)]`,style:{top:`${(1-e)*100}%`},children:c(t*e)},e))}):null,(0,w.jsxs)(`div`,{className:`chart-hatch relative min-w-0 flex-1 touch-none`,style:{height:s},onPointerMove:e=>_(g(e.clientX,e.clientY)),onPointerLeave:()=>_(null),children:[ge.map(e=>(0,w.jsx)(`span`,{"aria-hidden":!0,className:d(`pointer-events-none absolute inset-x-0`,e===0?`h-px bg-[var(--console-border-strong)]`:`border-t border-dashed border-[var(--console-border)]`),style:{top:`${(1-e)*100}%`}},e)),(0,w.jsx)(`canvas`,{ref:p,"aria-hidden":!0,className:`absolute inset-0 block`}),(0,w.jsx)(he,{label:l,itemLabels:u,activeIndex:i?.column??null,onActiveIndexChange:e=>_(e===null?null:{column:e,band:null}),layout:`columns`})]})]})}var z=6,ye=118,be={barRatio:.52,barMax:34,bandGap:0,minBand:4},xe=[`var(--brand)`];function Se({perAgent:e}){let t=b(),[n,r]=(0,S.useState)(null),{byCost:i,visible:c,values:l,axisMax:f,itemLabels:m}=(0,S.useMemo)(()=>{let t=e.some(e=>e.cost>0),n=e=>t?e.cost:e.sessions,r=[...e].sort((e,t)=>n(t)-n(e)).slice(0,z),i=r.map(e=>[n(e)]),o=r.map(e=>t?x(`{0}: {1}, {2} sessions`,[e.displayName,a(e.cost),u(e.sessions)]):x(`{0}: {1} sessions`,[e.displayName,u(e.sessions)]));return{byCost:t,visible:r,values:i,axisMax:Math.max(...i.flat(),0),itemLabels:o}},[t,e]),h=n===null?void 0:c[n.column];return(0,w.jsxs)(p,{role:`region`,"aria-label":x(`Agents`),className:`p-4`,children:[(0,w.jsx)(_,{title:x(`Agents`),meta:x(`{0} · {1} total`,[x(i?`by cost`:`by sessions`),e.length])}),c.length===0?(0,w.jsx)(`p`,{className:`console-mono mt-3 text-[11px] text-[var(--console-muted)]`,children:x(`No data`)}):(0,w.jsxs)(`div`,{className:`relative mt-[14px]`,children:[(0,w.jsx)(ve,{values:l,axisMax:f,colors:xe,hovered:n,onHover:r,layout:be,height:ye,ariaLabel:x(`Agent distribution chart`),itemLabels:m}),h&&n?(0,w.jsxs)(T,{index:n.column,count:c.length,children:[(0,w.jsx)(`div`,{children:h.displayName}),(0,w.jsxs)(`div`,{children:[o(h.tokens),` `,x(`tok ·`),` `,(0,w.jsx)(`span`,{className:`text-[var(--brand)]`,children:a(h.cost)})]}),(0,w.jsxs)(`div`,{children:[u(h.sessions),` `,x(`sessions ·`),` `,u(h.messages),` `,x(`messages`)]})]}):null,(0,w.jsx)(`div`,{className:`mt-2 grid`,style:{gridTemplateColumns:`repeat(${c.length}, minmax(0, 1fr))`},children:c.map((e,t)=>(0,w.jsxs)(`div`,{"data-testid":`overview-agent-row`,className:`flex min-w-0 flex-col items-center gap-[5px]`,children:[(0,w.jsx)(`span`,{className:`flex size-[18px] items-center justify-center rounded-sm border border-[var(--console-border)] bg-[var(--console-surface-muted)]`,children:(0,w.jsx)(s,{icon:e.icon,iconColored:e.iconColored,alt:e.displayName,className:`size-[10px]`})}),(0,w.jsx)(`span`,{className:d(`console-mono max-w-full truncate text-[9.5px]`,n?.column===t?`text-[var(--console-text)]`:`text-[var(--console-muted)]`),children:e.displayName}),(0,w.jsx)(`span`,{className:`console-mono text-[9.5px] text-[var(--console-text)]`,children:i?a(e.cost):u(e.sessions)}),i?(0,w.jsx)(`span`,{className:`console-mono text-[9.5px] text-[var(--console-muted)]`,children:u(e.sessions)}):null]},e.name))})]}),e.length>z?(0,w.jsxs)(`p`,{className:`console-mono mt-3 text-[10.5px] text-[var(--console-muted)]`,children:[`+ `,e.length-z,` `,x(`more`)]}):null]})}var B=200,V=100,H=100,U=86,W=55,Ce=-Math.PI/2,we=.07,Te=6,G=4.6,Ee=2,De=.0018,Oe=500,ke=6,Ae=.72,je=.3,Me=(()=>{let e=[];for(let t=14;t<=186;t+=G)for(let n=14;n<=186;n+=G){let r=t-V,i=n-H,a=Math.hypot(r,i);a<50.4||a>90.6||e.push({x:t,y:n,angle:Math.atan2(i,r),fullness:.62+.38*O((a-W)/31),jitter:k(t,n)})}return e})();function Ne(e,{a0:t,a1:n}){let r=n-t,i=Math.min(Te,31*.45,W*r*.45),a=i/U,o=i/W,s=(e,t)=>[V+Math.cos(t)*e,H+Math.sin(t)*e],[c,l]=s(U,t+a);e.beginPath(),e.moveTo(c,l),e.arc(V,H,U,t+a,n-a),e.arcTo(...s(U,n),...s(W,n),i),e.arcTo(...s(W,n),...s(W,n-o),i),e.arc(V,H,W,n-o,t+o,!0),e.arcTo(...s(W,t),...s(U,t),i),e.arcTo(...s(U,t),c,l,i),e.closePath()}function Pe(e){let t=Ce;return e.map(e=>{let n=e*E,r={a0:t+we/2,a1:t+n-we/2};return t+=n,r})}function Fe(e,{shares:t,colors:n,hovered:r,reducedMotion:i}){let a=(0,S.useContext)(m),o=I(e,i),s=n.join(`\0`),c=(0,S.useRef)(r),l=(0,S.useRef)({displayed:t.slice(),from:t.slice(),target:t.slice(),startedAt:0,running:!1}),u=(0,S.useRef)(Pe(t)),d=(0,S.useRef)(()=>{});return(0,S.useEffect)(()=>{let e=l.current;e.from=e.displayed.slice(),e.target=t.slice(),i?(e.displayed=t.slice(),e.running=!1,d.current()):(e.startedAt=performance.now(),e.running=!0,o.requestFrame())},[o,i,t]),(0,S.useEffect)(()=>{c.current=r,i?d.current():o.requestFrame()},[o,r,i]),(0,S.useEffect)(()=>{let t=e.current,n=t?.parentElement,r=t?.getContext(`2d`);if(!t||!n||!r)return;let a=getComputedStyle(t),f=(s?s.split(`\0`):[]).map(e=>N(a,e)),p=1,m=()=>{let e=n.clientWidth;if(!e)return;let r=Math.min(Ee,window.devicePixelRatio||1);t.width=Math.ceil(e*r),t.height=Math.ceil(e*r),t.style.width=`${e}px`,t.style.height=`${e}px`,p=e/B*r},h=0,g=e=>{let t=l.current;if(!t.running)return;let n=D((e-t.startedAt)/Oe),r=1-2**(-10*n);t.displayed=t.target.map((e,n)=>{let i=t.from[n]??0;return i+(e-i)*r}),n>=1&&(t.displayed=t.target.slice(),t.running=!1)},_=(e,t,n,i)=>{if(t.a1-t.a0<=.004)return;if(r.save(),n){let n=(t.a0+t.a1)/2;r.translate(Math.cos(n)*ke,Math.sin(n)*ke),r.shadowColor=P(e,.55),r.shadowBlur=5}Ne(r,t),r.clip(),r.globalAlpha=i?n?1:je*Ae:Ae,r.fillStyle=e;let a=n?.46:.34,o=t.a0-.06,s=t.a1+.06;r.beginPath();for(let e of Me){let t=e.angle;for(;t<o;)t+=E;for(;t>=o+E;)t-=E;if(t>s)continue;let n=A(e.x,e.y,h),i=G*(a+.36*e.fullness+.26*n)*(.78+.42*e.jitter);r.rect(e.x-i/2,e.y-i/2,i,i)}r.fill(),r.restore()},v=e=>{h=e*De,r.setTransform(p,0,0,p,0,0),r.clearRect(0,0,B,B);let t=Pe(l.current.displayed);u.current=t;let n=c.current,i=n!==null;t.forEach((e,t)=>{t!==n&&_(f[t]??f[0]??``,e,!1,i)});let a=n===null?void 0:t[n];a&&_(f[n]??``,a,!0,!0)};d.current=()=>{m(),v(performance.now())},o.setFrameHandler(e=>(g(e),v(e),l.current.running?`active`:c.current===null?`stop`:`idle`)),m();let y=new ResizeObserver(()=>{m(),i?v(performance.now()):o.requestFrame()});return y.observe(n),i&&v(performance.now()),()=>{o.setFrameHandler(null),y.disconnect()}},[e,s,o,i,a]),{hitTest:(t,n)=>{let r=e.current;if(!r)return null;let i=r.getBoundingClientRect();if(!i.width)return null;let a=(t-i.left)/i.width*B-V,o=(n-i.top)/i.height*B-H,s=Math.hypot(a,o);if(s<W||s>U)return null;let c=Math.atan2(o,a);for(let e=0;e<u.current.length;e++){let{a0:t,a1:n}=u.current[e],r=c;for(;r<t;)r+=E;for(;r>=t+E;)r-=E;if(r<=n)return e}return null}}}function Ie({shares:e,colors:t,hovered:n,onHover:r,size:i,ariaLabel:a,itemLabels:o,children:s}){let c=(0,S.useRef)(null),{hitTest:l}=Fe(c,{shares:e,colors:t,hovered:n,reducedMotion:R()});return(0,w.jsxs)(`div`,{className:`relative shrink-0 touch-none`,style:{width:i,height:i},onPointerMove:e=>r(l(e.clientX,e.clientY)),onPointerLeave:()=>r(null),children:[(0,w.jsx)(`canvas`,{ref:c,"aria-hidden":!0,className:`block size-full`}),(0,w.jsx)(`div`,{className:`pointer-events-none absolute inset-0 flex flex-col items-center justify-center`,children:s}),(0,w.jsx)(he,{label:a,itemLabels:o,activeIndex:n,onActiveIndexChange:r,layout:`surface`})]})}var Le=5,Re=142,ze=.01;function Be(e){return e!==null&&e.some(e=>e.cost>0)}function Ve(e,t){let n=[...e].sort((e,t)=>t.cost-e.cost).slice(0,Le),i=n.map((e,t)=>({key:e.model,label:e.model,value:e.cost,color:`var(--chart-${t+1})`,display:r(e.cost)})),a=t-n.reduce((e,t)=>e+t.cost,0);return t>0&&a>t*ze&&i.push({key:`__remainder`,label:x(`Other`),value:a,color:`var(--console-border-strong)`,display:r(a)}),i}function He(e){return[...e].sort((e,t)=>t.tokens-e.tokens).slice(0,Le).map((e,t)=>({key:e.model,label:e.model,value:e.tokens,color:`var(--chart-${t+1})`,display:o(e.tokens)}))}function Ue({modelCost:e,modelDistribution:t,totals:n}){let s=b(),[c,l]=(0,S.useState)(null),{byCost:u,entries:f}=(0,S.useMemo)(()=>{let r=Be(e);return{byCost:r,entries:r?Ve(e,n.cost):He(t)}},[s,e,t,n.cost]),m=f.reduce((e,t)=>e+t.value,0),h=(0,S.useMemo)(()=>f.map(e=>m>0?e.value/m:1/f.length),[f,m]),g=x(u?`Cost by Model`:`Models`),v=f.map(e=>`${e.label}: ${i(m>0?e.value/m:0)}, ${e.display}`);return(0,w.jsxs)(p,{role:`region`,"aria-label":g,className:`p-4`,children:[(0,w.jsx)(_,{title:g,meta:x(u?`by cost`:`by tokens`)}),f.length===0?(0,w.jsx)(`p`,{className:`console-mono mt-3 text-[11px] text-[var(--console-muted)]`,children:x(`No model data`)}):(0,w.jsxs)(`div`,{className:`mt-[14px] flex items-center gap-[18px]`,children:[(0,w.jsxs)(Ie,{shares:h,colors:f.map(e=>e.color),hovered:c,onHover:l,size:Re,ariaLabel:x(`{0} chart`,[g]),itemLabels:v,children:[(0,w.jsx)(`span`,{className:`console-mono text-[16px] font-semibold text-[var(--console-text)]`,children:u?r(n.cost):o(n.tokens)}),(0,w.jsx)(`span`,{className:`console-mono mt-0.5 text-[9px] text-[var(--console-muted)]`,children:x(u?`total cost`:`total tokens`)})]}),(0,w.jsx)(`ul`,{className:`flex min-w-0 flex-1 flex-col gap-[7px]`,children:f.map((e,t)=>(0,w.jsxs)(`li`,{className:d(`flex min-w-0 items-center gap-2 transition-opacity`,c!==null&&c!==t?`opacity-45`:null),onPointerEnter:()=>l(t),onPointerLeave:()=>l(null),children:[(0,w.jsx)(`span`,{className:`size-2 shrink-0 rounded-[2px]`,style:{background:e.color},"aria-hidden":!0}),(0,w.jsx)(`span`,{className:`console-mono min-w-0 flex-1 truncate text-[10.5px] text-[var(--console-text)]`,children:e.label}),(0,w.jsx)(`span`,{className:`console-mono w-[34px] shrink-0 text-right text-[10.5px] text-[var(--console-muted)]`,children:i(m>0?e.value/m:0)}),(0,w.jsx)(`span`,{className:`console-mono w-[54px] shrink-0 text-right text-[10.5px] text-[var(--console-text)]`,children:e.display})]},e.key))})]}),(0,w.jsx)(`p`,{className:`console-mono mt-3 border-t border-dashed border-[var(--console-border)] pt-3 text-[10.5px] text-[var(--console-muted)]`,children:u?(0,w.jsxs)(w.Fragment,{children:[(0,w.jsx)(`span`,{className:`mr-1.5 rounded-sm bg-[var(--brand-soft)] px-1.5 py-0.5 text-[var(--brand)]`,children:x(`Estimated`)}),a(n.costEstimated),` `,x(`from model unit price,`),` `,a(n.costRecorded),` `,x(`from agent records`)]}):x(`Per-model cost needs the message cache, which is unavailable here; showing token share instead.`)})]})}var We=[{value:`7d`,label:`7d`},{value:`30d`,label:`30d`},{value:`90d`,label:`90d`},{value:`all`,label:`All`},{value:`custom`,label:`Custom`}],K=`__all__`;function Ge({agent:e,onAgentChange:t,agentCatalog:n,scopeCounts:r,window:i,rangePreset:a,onRangeChange:o,onSelectCustom:s}){b();let[c,l]=(0,S.useState)(!1);return(0,w.jsxs)(w.Fragment,{children:[(0,w.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3`,children:[t?(0,w.jsxs)(`select`,{"aria-label":x(`Filter by agent`),value:e??K,onChange:e=>t(e.target.value===K?void 0:e.target.value),className:`console-mono max-w-[220px] rounded-sm border border-[var(--console-border)] bg-[var(--console-surface)] px-2 py-1.5 text-xs text-[var(--console-text)] focus-visible:ring-2 focus-visible:ring-[var(--brand)] focus-visible:outline-none`,children:[(0,w.jsx)(`option`,{value:K,children:x(`All agents`)}),n.active.map(e=>(0,w.jsx)(`option`,{value:e.name.toLowerCase(),children:e.displayName},e.name))]}):null,r?(0,w.jsx)(`span`,{className:`console-mono text-[11px] text-[var(--console-muted)]`,children:x(`{0} projects · {1} agents in scope`,[r.projects,r.agents])}):null,(0,w.jsx)(`div`,{className:`ml-auto flex items-center gap-1.5`,children:We.map(e=>{let t=e.value===a;return(0,w.jsx)(`button`,{type:`button`,"aria-pressed":t,onClick:()=>{e.value===`custom`?l(!0):o(e.value)},className:d(`console-mono motion-hover rounded-full border px-[13px] py-[5px] text-[11px] focus-visible:ring-2 focus-visible:ring-[var(--brand)] focus-visible:outline-none`,t?`border-[var(--brand)] bg-[var(--brand)] text-[var(--brand-fg)]`:`border-[var(--console-border)] bg-[var(--console-surface)] text-[var(--console-muted)]`),children:x(e.label)},e.value)})})]}),(0,w.jsx)(y,{open:c,onOpenChange:l,window:i,onSelectCustom:s})]})}function Ke(e){return e.toFixed(1)}var qe={neutral:`text-[var(--console-muted)]`,warning:`text-[var(--brand)]`,positive:`text-[var(--positive)]`};function q({label:e,value:t,trend:n,trendTone:r=`neutral`,hint:i,emphasis:a=!1}){return b(),(0,w.jsxs)(p,{className:d(`px-4 py-[14px]`,a?`border-[var(--brand-line)]`:null),children:[(0,w.jsx)(`p`,{className:`console-eyebrow`,children:e}),(0,w.jsx)(`p`,{className:d(`console-mono mt-[9px] text-[27px] font-semibold tracking-[-0.02em]`,a?`text-[var(--brand)]`:`text-[var(--console-text)]`),children:t}),(0,w.jsxs)(`div`,{className:`mt-[7px] flex items-center gap-[7px]`,children:[n===void 0?null:(0,w.jsx)(`span`,{"data-testid":`overview-kpi-trend`,className:d(`console-mono text-[10.5px]`,qe[r]),children:n}),i===void 0?null:(0,w.jsx)(`span`,{className:`console-mono truncate text-[10.5px] text-[var(--console-muted)]`,children:i})]})]})}function Je(e){return e.costEstimated===0?x(`All recorded by agents`):e.costEstimated===e.cost&&e.cost>0?x(`All estimated from unit price`):x(`{0} estimated`,[a(e.costEstimated)])}function Ye(e){let t=[e.latestActivityProject,e.latestActivityAgent].filter(e=>!!e);return t.length>0?t.join(` · `):void 0}function Xe({totals:e,rangeDays:t}){b();let n=e.previous,r=(e,t)=>t===void 0?null:c(e,t),s=r(e.sessions,n?.sessions),d=r(e.messages,n?.messages),f=r(e.tokens,n?.tokens),p=r(e.cost,n?.cost),m=n?.cost!==void 0&&e.cost>n.cost;return(0,w.jsxs)(`div`,{className:`grid grid-cols-2 gap-3 md:grid-cols-3 xl:grid-cols-5`,children:[(0,w.jsx)(q,{label:x(`Sessions`),value:u(e.sessions),trend:s??void 0,hint:t?x(`{0}/day`,[Ke(e.sessions/t)]):void 0}),(0,w.jsx)(q,{label:x(`Messages`),value:u(e.messages),trend:d??void 0,hint:e.sessions>0?x(`{0}/session`,[Ke(e.messages/e.sessions)]):void 0}),(0,w.jsx)(q,{label:x(`Tokens`),value:o(e.tokens),trend:f??void 0,hint:x(`Cache hit {0}`,[i(e.cacheReadTokens/e.tokens)])}),(0,w.jsx)(q,{label:x(`Cost`),value:a(e.cost),trend:p??void 0,trendTone:m?`warning`:`positive`,hint:Je(e),emphasis:!0}),(0,w.jsx)(q,{label:x(`Last activity`),value:e.latestActivity===void 0?x(`No activity`):l(e.latestActivity),trend:e.latestActivity===void 0?void 0:`●`,trendTone:`positive`,hint:e.latestActivity===void 0?void 0:Ye(e)})]})}var Ze=[0,1,2,3,4];function J({className:e}){return b(),(0,w.jsx)(`span`,{className:`skeleton-shimmer block rounded-sm ${e}`})}function Y({bodyClassName:e}){return b(),(0,w.jsxs)(p,{className:`p-4`,children:[(0,w.jsx)(J,{className:`h-[15px] w-28`}),(0,w.jsx)(J,{className:`mt-3 ${e}`})]})}function Qe(){return b(),(0,w.jsxs)(`div`,{className:`space-y-4`,"aria-hidden":!0,"data-testid":`overview-skeleton`,children:[(0,w.jsx)(`div`,{className:`grid grid-cols-2 gap-3 md:grid-cols-3 xl:grid-cols-5`,children:Ze.map(e=>(0,w.jsxs)(p,{className:`px-4 py-[14px]`,children:[(0,w.jsx)(J,{className:`h-[10px] w-16`}),(0,w.jsx)(J,{className:`mt-[9px] h-[27px] w-24`}),(0,w.jsx)(J,{className:`mt-[7px] h-[11px] w-20`})]},e))}),(0,w.jsxs)(p,{className:`p-4`,children:[(0,w.jsx)(J,{className:`h-[15px] w-28`}),(0,w.jsx)(J,{className:`mt-[14px] h-[168px] w-full`})]}),(0,w.jsx)(Y,{bodyClassName:`h-[428px] w-full`}),(0,w.jsxs)(`div`,{className:`grid gap-4 lg:grid-cols-[1.45fr_1fr]`,children:[(0,w.jsx)(Y,{bodyClassName:`h-[248px] w-full`}),(0,w.jsxs)(`div`,{className:`grid content-start gap-4`,children:[(0,w.jsx)(Y,{bodyClassName:`h-[116px] w-full`}),(0,w.jsx)(Y,{bodyClassName:`h-[100px] w-full`})]})]})]})}function $e(e){return`${String(e*2).padStart(2,`0`)}:00–${String(e*2+2).padStart(2,`0`)}:00`}function et({count:e,peak:t}){let n=(0,S.useId)(),r=t>0?Math.sqrt(e/t):0,i=12*r;return(0,w.jsx)(`svg`,{width:`28`,height:`28`,viewBox:`0 0 28 28`,"aria-hidden":`true`,style:{color:`color-mix(in oklab, var(--activity-high) ${r*100}%, var(--activity-low))`},children:e>0?(0,w.jsxs)(w.Fragment,{children:[(0,w.jsx)(`defs`,{children:(0,w.jsx)(`pattern`,{id:n,width:`3`,height:`3`,patternUnits:`userSpaceOnUse`,children:(0,w.jsx)(`rect`,{width:`2`,height:`2`,fill:`currentColor`})})}),(0,w.jsx)(`circle`,{cx:`14`,cy:`14`,r:i,fill:`currentColor`,opacity:`0.2`}),(0,w.jsx)(`circle`,{cx:`14`,cy:`14`,r:i,fill:`url(#${n})`})]}):null})}function tt({activity:e}){let t=b(),n=[x(`Overnight`),x(`Morning`),x(`Afternoon`),x(`Evening`)],[r,i]=(0,S.useState)(null),a=t===`zh-CN`?[1,2,3,4,5,6,0]:[0,1,2,3,4,5,6],o=new Intl.DateTimeFormat(t,{weekday:`short`,timeZone:`UTC`}),s=a.map(e=>o.format(Date.UTC(2026,8,6+e))),c=Math.max(0,...e?.counts??[]),l=e?.counts.reduce((e,t)=>e+t,0)??0;return(0,w.jsxs)(p,{className:`p-4`,"aria-label":x(`Active hours`),children:[(0,w.jsx)(_,{title:x(`Active hours`)}),(0,w.jsx)(`p`,{className:`mt-1 text-xs text-[var(--console-muted)]`,children:x(`User messages by weekday and two-hour period. Counts are cumulative within the selected range.`)}),e?(0,w.jsxs)(w.Fragment,{children:[(0,w.jsxs)(`div`,{className:`mt-3 flex flex-wrap items-center justify-between gap-2 console-mono text-[10.5px] text-[var(--console-muted)]`,children:[(0,w.jsx)(`span`,{children:x(`Time zone: {0}`,[e.timeZone])}),(0,w.jsx)(`span`,{children:x(`{0} user messages`,[u(l)])})]}),(0,w.jsxs)(`table`,{className:`mt-[14px] w-full table-fixed border-collapse console-mono text-[10.5px] text-[var(--console-muted)]`,children:[(0,w.jsx)(`caption`,{className:`sr-only`,children:x(`Active hours`)}),(0,w.jsx)(`thead`,{children:(0,w.jsxs)(`tr`,{children:[(0,w.jsx)(`th`,{scope:`col`,className:t===`en`?`w-16`:`w-9`,children:(0,w.jsx)(`span`,{className:`sr-only`,children:x(`Day period`)})}),(0,w.jsx)(`th`,{scope:`col`,className:`w-11 pb-2 text-left font-normal`,children:x(`Time`)}),s.map(e=>(0,w.jsx)(`th`,{scope:`col`,className:`pb-2 font-normal`,children:e},e))]})}),n.map((t,n)=>(0,w.jsx)(`tbody`,{className:`chart-hatch`,children:Array.from({length:3},(o,l)=>{let d=n*3+l;return(0,w.jsxs)(`tr`,{className:l===0&&n>0?`border-t border-solid border-[var(--console-border-strong)]`:`border-t border-dashed border-[var(--console-border)]`,children:[l===0?(0,w.jsx)(`th`,{scope:`rowgroup`,rowSpan:3,className:`bg-[var(--console-surface)] pr-2 text-left align-middle font-normal`,children:t}):null,(0,w.jsx)(`th`,{scope:`row`,className:`h-8 bg-[var(--console-surface)] text-left font-normal tabular-nums`,children:`${String(d*2).padStart(2,`0`)}:00`}),a.map((t,n)=>{let a=t*12+d,o=e.counts[a]??0,l=`${s[n]} · ${$e(d)} · ${x(`{0} user messages`,[u(o)])}`;return(0,w.jsxs)(`td`,{className:`relative p-0 text-center`,children:[(0,w.jsx)(`button`,{type:`button`,"aria-label":l,className:`flex h-8 w-full items-center justify-center rounded-sm outline-none hover:bg-[var(--brand-soft)] focus-visible:ring-2 focus-visible:ring-[var(--brand)]`,onMouseEnter:()=>i(a),onMouseLeave:()=>i(null),onFocus:()=>i(a),onBlur:()=>i(null),onClick:()=>i(a),onKeyDown:e=>{e.key===`Escape`&&i(null)},children:(0,w.jsx)(et,{count:o,peak:c})}),r===a?(0,w.jsxs)(`span`,{role:`tooltip`,className:`pointer-events-none absolute bottom-full z-10 w-max max-w-[180px] rounded-md border border-[var(--console-border)] bg-[var(--console-surface)] px-2.5 py-2 text-left text-[var(--console-text)] shadow-[var(--shadow-overlay)] ${n<3?`left-0`:`right-0`}`,children:[`${s[n]} · ${$e(d)} · `,(0,w.jsx)(`span`,{className:`font-semibold text-[var(--brand)]`,children:x(`{0} user messages`,[u(o)])})]}):null]},t)})]},d)})},t))]}),(0,w.jsx)(`div`,{className:`mt-3 flex min-h-7 flex-wrap items-center justify-end gap-4 console-mono text-[10.5px] text-[var(--console-muted)]`,children:c===0?(0,w.jsx)(`span`,{children:x(`No user messages in this range.`)}):(0,w.jsxs)(w.Fragment,{children:[(0,w.jsxs)(`span`,{className:`flex items-center gap-1.5`,"aria-label":x(`Size reference (messages)`),children:[x(`Less`),[1,4,9].map(e=>(0,w.jsx)(et,{count:e,peak:9},e)),x(`More`)]}),(0,w.jsx)(`span`,{children:x(`Peak: {0}`,[u(c)])})]})})]}):(0,w.jsx)(`p`,{className:`py-8 text-center text-sm text-[var(--console-muted)]`,children:x(`Activity data is unavailable.`)})]})}var nt=.16;function rt(e){return e*e*(3-2*e)}function it(e,t,n){return e<t?t:e>n?n:e}function X(e,t=new Float32Array(512)){let n=e.length;if(n===0)return t.fill(0),t;for(let r=0;r<512;r++){let i=it(r/511*n-.5,0,n-1),a=Math.min(n-2,Math.floor(i));if(a<0){t[r]=e[0];continue}let o=rt(i-a);t[r]=e[a]*(1-o)+e[a+1]*o}return t}function at(e,t){let n=it(t,0,1)*511,r=Math.min(510,Math.floor(n)),i=n-r;return e[r]*(1-i)+e[r+1]*i}function ot(e,t){return 1-(t>0?Math.min(1,e/t):0)*.84}var st=2,ct=460,lt=180,Z=32,ut=.06,dt=.24,ft=/oklch\(\s*([\d.]+)\s+([\d.]+)\s+([\d.]+)/;function pt(e){let t=Math.imul(e^2654435769,2246822507);return t=Math.imul(t^t>>>13,3266489909),((t^t>>>16)>>>0)/4294967296}function mt(e,t){let n=ft.exec(e),r=ft.exec(t);if(!n||!r)return Array.from({length:33},()=>t);let[i,a,o]=[Number(n[1]),Number(n[2]),Number(n[3])],[s,c,l]=[Number(r[1]),Number(r[2]),Number(r[3])];return Array.from({length:33},(e,t)=>{let n=t/Z,r=i+(s-i)*n,u=a+(c-a)*n,d=o+(l-o)*n;return`oklch(${r.toFixed(3)} ${u.toFixed(3)} ${d.toFixed(1)})`})}function ht(e,{values:t,max:n,reducedMotion:r}){let i=(0,S.useContext)(m),a=I(e,r),o=(0,S.useRef)({from:X(t),to:X(t),current:X(t),fromMax:n,toMax:n,currentMax:n,startedAt:0,duration:0}),s=(0,S.useRef)(null),c=(0,S.useRef)(()=>{}),l=(0,S.useRef)({x:-1e4,y:-1e4,smoothX:-1e4,smoothY:-1e4,speed:0,inside:!1});(0,S.useEffect)(()=>{let e=o.current;e.from.set(e.current),e.fromMax=e.currentMax,X(t,e.to),e.toMax=n,e.startedAt=performance.now(),e.duration=r?0:ct,r?c.current():a.requestFrame()},[a,n,r,t]),(0,S.useEffect)(()=>{let t=e.current,n=t?.parentElement,i=t?.getContext(`2d`);if(!t||!n||!i)return;let u=l.current,d=getComputedStyle(t),f=d.getPropertyValue(`--tile-rest`).trim(),p=mt(d.getPropertyValue(`--tile-wash`).trim(),d.getPropertyValue(`--tile-ink`).trim()),m=()=>{let e=n.clientWidth,r=n.clientHeight;if(!e||!r)return;let a=n.getBoundingClientRect(),o=Math.min(st,window.devicePixelRatio||1);t.width=Math.round(e*o),t.height=Math.round(r*o),t.style.width=`${e}px`,t.style.height=`${r}px`,i.setTransform(o,0,0,o,0,0),i.imageSmoothingEnabled=!1;let c=Math.max(3,Math.round(e/lt)),l=Math.ceil(e/c),u=Math.ceil(r/c),d=l*u,f=new Uint8Array(d);for(let e=0;e<d;e++)f[e]=+(pt(e)<ut);s.current={cell:c,cols:l,rows:u,width:e,height:r,left:a.left,top:a.top,step:1/o,glow:new Float32Array(d),spark:f}},h=e=>{let t=o.current,n=t.duration>0?Math.min(1,(e-t.startedAt)/t.duration):1;for(let e=0;e<512;e++)t.current[e]=t.from[e]+(t.to[e]-t.from[e])*n;return t.currentMax=t.fromMax+(t.toMax-t.fromMax)*n,n>=1&&(t.duration=0),n<1},g=e=>{let t=l.current,n=t.smoothX,r=t.smoothY,i=1-.72**e;t.smoothX+=(t.x-n)*i,t.smoothY+=(t.y-r)*i,t.speed=Math.hypot(t.smoothX-n,t.smoothY-r)},_=(e,t=1)=>{let n=s.current;if(!n)return!1;let a=o.current,{cell:c,cols:u,rows:d,width:m,height:h,step:g,glow:_,spark:v}=n,y=e=>Math.round(e/g)*g,b=Math.max(g,y(c*.34)),x=y((c-b)/2);i.clearRect(0,0,m,h),i.fillStyle=f;for(let e=0;e<u;e++){let t=e*c+x;for(let e=0;e<d;e++)i.fillRect(t,e*c+x,b,b)}let S=l.current,C=h*(dt+Math.min(1,S.speed/25)*.26),w=!r&&S.inside,T=1-.78**t,E=1-.95**t,D=e*.0018,O=-1,k=!1;for(let t=0;t<u;t++){let n=u>1?(t+.5)/u:.5,o=ot(at(a.current,n),a.currentMax),s=Math.max(.001,1-o),l=t*c,m=l+c/2;for(let n=0;n<d;n++){let a=t*d+n,u=n*c,b=(u+c/2)/h,x=0;b>=o&&(x=1-.55*((b-o)/s));let A=_[a];if(w){let e=Math.hypot(m-S.smoothX,u+c/2-S.smoothY),t=e<C?1-e/C:0;A+=(t-A)*(t>A?T:E),_[a]=A}else A>0&&(A*=1-E,_[a]=A<.002?0:A);_[a]>0&&(k=!0);let j=Math.min(1,x+A*.5);if(j<=.02)continue;let M=j;r||(M*=1+.07*Math.sin(b*Math.PI*3-D),v[a]&&A>.02&&(M*=1+.25*A*Math.sin(e*.012+a)),M=Math.min(1,M));let N=Math.max(g,y(c*(.28+.42*j))),P=y((c-N)/2),F=Math.round(M*Z);F!==O&&(O=F,i.fillStyle=p[O]??p[Z]??f),i.fillRect(l+P,u+P,N,N)}}return k},v=()=>{m(),h(performance.now()),_(performance.now())};c.current=v;let y=e=>{let t=s.current;if(!t)return;let r=l.current;if(!r.inside){let e=n.getBoundingClientRect();t.left=e.left,t.top=e.top}r.x=e.clientX-t.left,r.y=e.clientY-t.top,r.inside||(r.smoothX=r.x,r.smoothY=r.y),r.inside=!0,a.requestFrame()},b=()=>{l.current.inside=!1,a.requestFrame()},x=0;a.setFrameHandler(e=>{let t=x===0?1:Math.min(3,(e-x)/(1e3/60));x=e;let n=h(e);g(t);let r=_(e,t);return n?`active`:l.current.inside||r?`idle`:(x=0,`stop`)}),m();let S=new ResizeObserver(()=>{m(),r?(h(performance.now()),_(performance.now())):a.requestFrame()});return S.observe(n),r?v():(n.addEventListener(`pointermove`,y,{passive:!0}),n.addEventListener(`pointerleave`,b)),()=>{a.setFrameHandler(null),S.disconnect(),n.removeEventListener(`pointermove`,y),n.removeEventListener(`pointerleave`,b),u.inside=!1}},[e,a,r,i])}var gt=[1,.66,.33,0],_t=e=>`${(1-e*(1-nt))*100}%`,vt=(e,t)=>(e+.5)/t*100;function yt({values:e,max:t,labels:n,formatValue:r}){let[i,a]=(0,S.useState)(null),o=(0,S.useRef)(null),s=R(),c=t=>{let n=o.current?.getBoundingClientRect();if(!n?.width)return;let r=(t-n.left)/n.width,i=Math.round(r*e.length-.5);a(Math.min(e.length-1,Math.max(0,i)))},l=i!==null,u=i??0,f=e[u]??0,p=s?void 0:`left 260ms ease-out, top 260ms ease-out`;return(0,w.jsxs)(`div`,{ref:o,className:`absolute inset-0 cursor-crosshair touch-none`,onPointerMove:e=>c(e.clientX),onPointerLeave:()=>a(null),children:[(0,w.jsx)(`span`,{className:d(`pointer-events-none absolute inset-y-0 w-px -translate-x-1/2 bg-[var(--brand-line)] transition-opacity duration-150`,l?`opacity-100`:`opacity-0`),style:{left:`${vt(u,e.length)}%`,transition:p}}),(0,w.jsxs)(`div`,{className:d(`pointer-events-none absolute size-0 transition-opacity duration-150`,l?`opacity-100`:`opacity-0`),style:{left:`${vt(u,e.length)}%`,top:`${ot(f,t)*100}%`,transition:p},children:[(0,w.jsx)(`span`,{className:`absolute size-[9px] -translate-x-1/2 -translate-y-1/2 rounded-full bg-[var(--brand)] ring-2 ring-[var(--console-surface)]`}),(0,w.jsxs)(`span`,{className:`console-mono absolute bottom-3 flex -translate-x-1/2 items-baseline gap-1.5 rounded-md border border-[var(--console-border)] bg-[var(--console-surface)] px-2 py-1 whitespace-nowrap shadow-[var(--shadow-overlay)]`,children:[(0,w.jsx)(`span`,{className:`text-[10px] text-[var(--console-muted)]`,children:n[u]}),(0,w.jsx)(`span`,{className:`text-[12px] font-semibold text-[var(--console-text)]`,children:r(f)})]})]})]})}function bt({values:e,max:t,labels:n,height:r,formatValue:i,formatTick:a,className:o}){let s=(0,S.useRef)(null);return ht(s,{values:e,max:t,reducedMotion:R()}),(0,w.jsxs)(`div`,{className:d(`flex`,o),"aria-hidden":!0,children:[a?(0,w.jsx)(`div`,{className:`relative shrink-0`,style:{height:r,width:38},children:gt.map(e=>(0,w.jsx)(`span`,{className:`console-mono absolute right-2 -translate-y-1/2 text-[9.5px] whitespace-nowrap text-[var(--console-muted)]`,style:{top:_t(e)},children:a(t*e)},e))}):null,(0,w.jsxs)(`div`,{className:`chart-hatch relative min-w-0 flex-1`,style:{height:r},children:[gt.map(e=>(0,w.jsx)(`span`,{className:d(`pointer-events-none absolute inset-x-0`,e===0?`h-px bg-[var(--console-border-strong)]`:`border-t border-dashed border-[var(--console-border)]`),style:{top:_t(e)}},e)),(0,w.jsx)(`canvas`,{ref:s,className:`absolute inset-0 block`}),e.length>0?(0,w.jsx)(yt,{values:e,max:t,labels:n,formatValue:i}):null]})]})}var xt=168,St=132,Ct=6,wt={barRatio:.86,barMax:46,bandGap:2,minBand:3},Q=[{key:`input`,label:`Input`,color:`var(--token-input)`},{key:`output`,label:`Output`,color:`var(--token-output)`},{key:`cache_read`,label:`Cache read`,color:`var(--token-cache-read)`},{key:`cache_create`,label:`Cache write`,color:`var(--token-cache-write)`}],Tt=Q.map(e=>e.color);function Et(e){return e>=1e3?`$${o(e)}`:`$${Math.round(e)}`}function $(e){return e.input+e.output+e.cache_read+e.cache_create}function Dt(e){return x(`{0}: {1} tokens, {2}, {3} sessions, {4} messages, input {5}, output {6}, cache read {7}, cache write {8}`,[f(e.date),o($(e)),a(e.cost),u(e.sessions),u(e.messages),o(e.input),o(e.output),o(e.cache_read),o(e.cache_create)])}function Ot({daily:e}){b();let t=(0,S.useMemo)(()=>e.map(e=>e.cost),[e]),n=(0,S.useMemo)(()=>e.map(e=>f(e.date)),[e]),r=t.reduce((e,t)=>e+t,0),i=t.reduce((e,t)=>Math.max(e,t),0);return i<=0?null:(0,w.jsxs)(w.Fragment,{children:[(0,w.jsxs)(`div`,{className:`mt-[14px] flex items-baseline justify-between border-t border-dashed border-[var(--console-border)] pt-[11px]`,children:[(0,w.jsx)(`span`,{className:`console-mono text-[10.5px] text-[var(--console-text)]`,children:x(`Daily cost`)}),(0,w.jsxs)(`span`,{className:`console-mono text-[10px] text-[var(--console-muted)]`,children:[x(`Peak`),` `,a(i),` `,x(`· Avg`),` `,a(r/e.length),` `,x(`· Total`),` `,a(r)]})]}),(0,w.jsx)(bt,{values:t,max:i,labels:n,height:St,formatValue:a,formatTick:Et,className:`mt-[7px]`})]})}function kt({bucket:e,index:t,count:n}){return b(),(0,w.jsxs)(T,{index:t,count:n,children:[(0,w.jsx)(`div`,{children:f(e.date)}),(0,w.jsxs)(`div`,{children:[o($(e)),` `,x(`tok ·`),` `,(0,w.jsx)(`span`,{className:`text-[var(--brand)]`,children:a(e.cost)})]}),(0,w.jsxs)(`div`,{children:[u(e.sessions),` `,x(`sessions ·`),` `,u(e.messages),` `,x(`messages`)]}),(0,w.jsxs)(`div`,{className:`text-[var(--console-muted)]`,children:[x(`In`),` `,o(e.input),` `,x(`· Out`),` `,o(e.output),` `,x(`· Read`),` `,o(e.cache_read),` `,x(`· Write`),` `,o(e.cache_create)]})]})}function At({daily:e}){let t=b(),[n,r]=(0,S.useState)(null),i=(0,S.useMemo)(()=>e.map(e=>Q.map(t=>e[t.key])),[e]),a=(0,S.useMemo)(()=>e.map(Dt),[t,e]),s=(0,S.useMemo)(()=>j(e.reduce((e,t)=>Math.max(e,$(t)),0)),[e]),c=n===null?void 0:e[n.column];return(0,w.jsxs)(`div`,{className:`relative mt-[14px]`,children:[(0,w.jsx)(ve,{values:i,axisMax:s,colors:Tt,hovered:n,onHover:r,layout:wt,height:xt,formatTick:o,ariaLabel:x(`Daily usage chart`),itemLabels:a}),c&&n?(0,w.jsx)(`div`,{className:`absolute inset-x-0 top-0`,style:{left:38},children:(0,w.jsx)(kt,{bucket:c,index:n.column,count:e.length})}):null]})}function jt({daily:e}){b();let t=e[0],n=e[e.length-1],r=t&&n?` · ${f(t.date)} → ${f(n.date)}`:``,i=Math.max(1,Math.ceil(e.length/Ct));return(0,w.jsxs)(p,{role:`region`,"aria-label":x(`Daily usage`),className:`p-4`,children:[(0,w.jsx)(_,{title:x(`Daily usage`),action:(0,w.jsx)(`div`,{className:`console-mono flex flex-wrap items-center gap-x-3 gap-y-1 text-[10px] text-[var(--console-muted)]`,children:Q.map(e=>(0,w.jsxs)(`span`,{"data-testid":`overview-legend-token`,className:`flex items-center gap-1`,children:[(0,w.jsx)(`span`,{className:`size-2 rounded-[2px]`,style:{background:e.color},"aria-hidden":!0}),x(e.label)]},e.key))})}),(0,w.jsxs)(`p`,{className:`console-mono mt-1 text-[10.5px] text-[var(--console-muted)]`,children:[x(`Stacked bars = token mix · Area below = daily cost`),r]}),e.length===0?(0,w.jsx)(`p`,{className:`console-mono mt-[14px] text-[11px] text-[var(--console-muted)]`,children:x(`No usage data`)}):(0,w.jsxs)(w.Fragment,{children:[(0,w.jsx)(At,{daily:e}),(0,w.jsx)(Ot,{daily:e}),(0,w.jsx)(`div`,{style:{paddingLeft:38},children:(0,w.jsx)(`div`,{className:`console-mono mt-2 flex text-[10px] text-[var(--console-muted)]`,children:e.map((t,n)=>(0,w.jsx)(`span`,{className:`flex-1 text-center`,children:n%i===0||n===e.length-1?f(t.date):``},t.date))})})]}),(0,w.jsxs)(`table`,{className:`sr-only`,"aria-label":x(`Daily usage data`),children:[(0,w.jsx)(`thead`,{children:(0,w.jsxs)(`tr`,{children:[(0,w.jsx)(`th`,{children:x(`Date`)}),(0,w.jsx)(`th`,{children:x(`Sessions`)}),(0,w.jsx)(`th`,{children:x(`Messages`)}),(0,w.jsx)(`th`,{children:x(`Tokens`)}),(0,w.jsx)(`th`,{children:x(`Cost`)})]})}),(0,w.jsx)(`tbody`,{children:e.map(e=>(0,w.jsxs)(`tr`,{children:[(0,w.jsx)(`td`,{children:f(e.date)}),(0,w.jsx)(`td`,{children:u(e.sessions)}),(0,w.jsx)(`td`,{children:u(e.messages)}),(0,w.jsx)(`td`,{children:u($(e))}),(0,w.jsx)(`td`,{children:a(e.cost)})]},e.date))})]})]})}function Mt({project:e,agent:t,onAgentChange:n,window:r,agentCatalog:i,rangePreset:a,onRangeChange:o,onSelectCustom:s}){b();let[c,l]=(0,S.useState)(void 0),u=n?t:c,{dashboard:d,error:f,retry:p}=C(r,{project:e,agent:u});return(0,w.jsxs)(`div`,{"data-testid":`dashboard`,className:`mx-auto max-w-6xl space-y-4`,children:[(0,w.jsx)(Ge,{agent:u,onAgentChange:n?void 0:l,agentCatalog:i,scopeCounts:d?.scopeCounts,window:r,rangePreset:a,onRangeChange:o,onSelectCustom:s}),f?(0,w.jsx)(v,{title:x(`Couldn't load the dashboard.`),message:f,onRetry:()=>void p()}):null,d?(0,w.jsxs)(w.Fragment,{children:[(0,w.jsx)(Xe,{totals:d.totals,rangeDays:d.window.days}),(0,w.jsx)(jt,{daily:d.dailyActivity}),(0,w.jsx)(tt,{activity:d.activeHours}),(0,w.jsxs)(`div`,{className:`grid gap-4 lg:grid-cols-2`,children:[(0,w.jsx)(Se,{perAgent:d.perAgent}),(0,w.jsx)(Ue,{modelCost:d.modelCost,modelDistribution:d.modelDistribution,totals:d.totals})]})]}):f?null:(0,w.jsx)(Qe,{})]})}export{Mt as OverviewScreen};