codesesh 1.0.2 → 1.0.4

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 (64) hide show
  1. package/README.md +18 -10
  2. package/dist/chunk-3SXCTDD6.js +326 -0
  3. package/dist/chunk-3SXCTDD6.js.map +1 -0
  4. package/dist/chunk-BYB77UAJ.js +6054 -0
  5. package/dist/chunk-BYB77UAJ.js.map +1 -0
  6. package/dist/{chunk-PROMURPM.js → chunk-G4HRD3AR.js} +13 -8
  7. package/dist/chunk-G4HRD3AR.js.map +1 -0
  8. package/dist/chunk-MBZ4VV4C.js +670 -0
  9. package/dist/chunk-MBZ4VV4C.js.map +1 -0
  10. package/dist/chunk-QH2HOXJH.js +2 -0
  11. package/dist/chunk-RF3EEWPH.js +17 -0
  12. package/dist/chunk-RF3EEWPH.js.map +1 -0
  13. package/dist/chunk-W4PZHL2C.js +2035 -0
  14. package/dist/chunk-W4PZHL2C.js.map +1 -0
  15. package/dist/chunk-YCUN52HA.js +8422 -0
  16. package/dist/chunk-YCUN52HA.js.map +1 -0
  17. package/dist/discovery-K3GLISI6.js +102 -0
  18. package/dist/discovery-K3GLISI6.js.map +1 -0
  19. package/dist/index.js +3016 -1392
  20. package/dist/index.js.map +1 -1
  21. package/dist/project-identity-worker.js +29 -0
  22. package/dist/project-identity-worker.js.map +1 -0
  23. package/dist/scan-refresh-worker.js +129 -139
  24. package/dist/scan-refresh-worker.js.map +1 -1
  25. package/dist/search-index-worker.js +39 -13
  26. package/dist/search-index-worker.js.map +1 -1
  27. package/dist/smart-tag-worker.js +8 -5
  28. package/dist/smart-tag-worker.js.map +1 -1
  29. package/dist/web/assets/InteractiveReceipt-Dk50TBsH.js +1 -0
  30. package/dist/web/assets/OverviewScreen-5hvQVp4H.js +1 -0
  31. package/dist/web/assets/{PrismHighlighter-BZkkX0AU.js → PrismHighlighter-B1a2dPJO.js} +2 -2
  32. package/dist/web/assets/Projects-Cy_v2yep.js +1 -0
  33. package/dist/web/assets/SearchResultsPanel-DfheEwpz.js +1 -0
  34. package/dist/web/assets/SessionDetail-DRI8R3st.js +53 -0
  35. package/dist/web/assets/api-GP9UCedC.js +1 -0
  36. package/dist/web/assets/contract-xJyW5u7a.js +2 -0
  37. package/dist/web/assets/index-Bd-YkWkZ.css +1 -0
  38. package/dist/web/assets/index-DEjvzumm.js +1410 -0
  39. package/dist/web/assets/panel-ND0J63d3.js +1 -0
  40. package/dist/web/assets/{session-indexes-0oT5HSS5.js → session-indexes-BsgjUoc1.js} +2 -2
  41. package/dist/web/assets/utils-C7BqyxxV.js +1 -0
  42. package/dist/web/index.html +7 -11
  43. package/package.json +4 -10
  44. package/dist/chunk-PROMURPM.js.map +0 -1
  45. package/dist/chunk-VAUC2W7I.js +0 -16119
  46. package/dist/chunk-VAUC2W7I.js.map +0 -1
  47. package/dist/dist-6QTGTYZT.js +0 -175
  48. package/dist/web/assets/ErrorBoundary-D11tWzfn.js +0 -1
  49. package/dist/web/assets/InteractiveReceipt-DYGyHeZd.js +0 -1
  50. package/dist/web/assets/OverviewScreen-DriPmCam.js +0 -1
  51. package/dist/web/assets/Projects-BPDIcUBK.js +0 -1
  52. package/dist/web/assets/SearchFilterBar-Bx73B5e9.js +0 -1
  53. package/dist/web/assets/SearchResultsPanel-A6_3TPhW.js +0 -1
  54. package/dist/web/assets/SessionDetail-BnpvDwtH.js +0 -54
  55. package/dist/web/assets/SmartTagChips-ux6idUGJ.js +0 -1
  56. package/dist/web/assets/agents-BkRP_ww3.js +0 -1
  57. package/dist/web/assets/code-metrics-UYFsCC7E.js +0 -1
  58. package/dist/web/assets/contract-V6QuD0UY.js +0 -1
  59. package/dist/web/assets/index-99ZxpV2y.js +0 -1410
  60. package/dist/web/assets/index-B2RqUgZ5.css +0 -1
  61. package/dist/web/assets/panel-C-gc79Gz.js +0 -1
  62. package/dist/web/assets/session-title-DdtlxtlR.js +0 -1
  63. package/dist/web/assets/utils-DgUgu15E.js +0 -1
  64. /package/dist/{dist-6QTGTYZT.js.map → chunk-QH2HOXJH.js.map} +0 -0
@@ -1,16 +1,22 @@
1
1
  #!/usr/bin/env node
2
+ import "./chunk-QH2HOXJH.js";
2
3
  import {
3
4
  appLogger
4
- } from "./chunk-PROMURPM.js";
5
+ } from "./chunk-G4HRD3AR.js";
5
6
  import {
6
7
  commitDurableSessionPublication,
7
- createRegisteredAgents,
8
8
  markAgentCacheInitialized,
9
9
  sessionDetailVersion,
10
10
  syncSessionSearchIndex,
11
- syncSessionSearchIndexChanges,
11
+ syncSessionSearchIndexChanges
12
+ } from "./chunk-BYB77UAJ.js";
13
+ import "./chunk-3SXCTDD6.js";
14
+ import {
15
+ createRegisteredAgents
16
+ } from "./chunk-YCUN52HA.js";
17
+ import {
12
18
  synchronizePricingGeneration
13
- } from "./chunk-VAUC2W7I.js";
19
+ } from "./chunk-W4PZHL2C.js";
14
20
 
15
21
  // src/search-index-worker.ts
16
22
  import { randomUUID } from "crypto";
@@ -41,7 +47,8 @@ function reportPersistFailure(job, failure) {
41
47
  stage: failure.stage,
42
48
  publicationId: failure.publicationId,
43
49
  agentName: job.agentName,
44
- sessions: jobSessionCount(job)
50
+ sessions: jobSessionCount(job),
51
+ fatal: jobIsDurablePublication(job)
45
52
  });
46
53
  }
47
54
  function runJob(job, agent) {
@@ -70,7 +77,7 @@ function runJob(job, agent) {
70
77
  ...job.publicationId ? { publicationId: job.publicationId } : {}
71
78
  },
72
79
  (sessionId) => agent.getSessionData(sessionId),
73
- job.searchIndexOptions
80
+ publicationSearchIndexOptions(job)
74
81
  );
75
82
  if (publication.status === "rolled-back") return publication;
76
83
  postSyncResult(job.context, publication.searchIndex);
@@ -88,7 +95,7 @@ function runJob(job, agent) {
88
95
  ...job.publicationId ? { publicationId: job.publicationId } : {}
89
96
  },
90
97
  (sessionId) => agent.getSessionData(sessionId),
91
- job.searchIndexOptions
98
+ publicationSearchIndexOptions(job)
92
99
  );
93
100
  if (publication.status === "rolled-back") return publication;
94
101
  const result2 = publication.searchIndex;
@@ -113,6 +120,18 @@ function runJob(job, agent) {
113
120
  postSyncResult(job.context, result);
114
121
  return null;
115
122
  }
123
+ function publicationSearchIndexOptions(job) {
124
+ return {
125
+ ...job.searchIndexOptions,
126
+ onPublicationStage: (stage) => {
127
+ parentPort?.postMessage({
128
+ type: "publication-progress",
129
+ agentName: job.agentName,
130
+ stage
131
+ });
132
+ }
133
+ };
134
+ }
116
135
  function postSyncResult(context, result) {
117
136
  parentPort?.postMessage({
118
137
  type: "sync-result",
@@ -121,6 +140,9 @@ function postSyncResult(context, result) {
121
140
  });
122
141
  }
123
142
  var pricingGenerationId = null;
143
+ function jobIsDurablePublication(job) {
144
+ return job.kind !== "maintenance" && job.publicationId != null;
145
+ }
124
146
  function jobsFromRequest(request) {
125
147
  if (request.jobs) return request.jobs;
126
148
  return (request.agentNames ?? []).map((agentName) => ({
@@ -141,29 +163,33 @@ function runBatch(request) {
141
163
  }
142
164
  const agents = createRegisteredAgents();
143
165
  const jobs = jobsFromRequest(request);
166
+ const failedAgents = /* @__PURE__ */ new Set();
144
167
  for (const job of jobs) {
168
+ if (failedAgents.has(job.agentName)) continue;
145
169
  const agent = agents.find((item) => item.name === job.agentName);
146
170
  if (!agent) {
147
171
  reportPersistFailure(job, {
148
172
  stage: "prepare",
149
173
  publicationId: job.kind === "maintenance" ? randomUUID() : job.publicationId ?? randomUUID()
150
174
  });
151
- return;
152
- }
153
- if (agent.setSessionMetaMap) {
154
- agent.setSessionMetaMap(new Map(Object.entries(job.meta)));
175
+ if (jobIsDurablePublication(job)) return;
176
+ failedAgents.add(job.agentName);
177
+ continue;
155
178
  }
179
+ agent.restoreSessionCacheMeta(job.meta);
156
180
  const failure = runJob(job, agent);
157
181
  if (failure) {
158
182
  reportPersistFailure(job, failure);
159
- return;
183
+ if (jobIsDurablePublication(job)) return;
184
+ failedAgents.add(job.agentName);
160
185
  }
161
186
  }
162
187
  parentPort?.postMessage({
163
188
  type: "done",
164
189
  context: request.context,
165
190
  durationMs: performance.now() - startedAt,
166
- sessions: jobs.reduce((total, job) => total + jobSessionCount(job), 0)
191
+ sessions: jobs.reduce((total, job) => total + jobSessionCount(job), 0),
192
+ failedAgents: [...failedAgents]
167
193
  });
168
194
  }
169
195
  parentPort?.on("message", (message) => {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/search-index-worker.ts"],"sourcesContent":["import \"./diagnostics-bridge.js\";\nimport { randomUUID } from \"node:crypto\";\nimport { parentPort, workerData } from \"node:worker_threads\";\nimport {\n commitDurableSessionPublication,\n createRegisteredAgents,\n markAgentCacheInitialized,\n sessionDetailVersion,\n synchronizePricingGeneration,\n syncSessionSearchIndex,\n syncSessionSearchIndexChanges,\n type SearchIndexSyncResult,\n type SearchIndexSyncOptions,\n type SessionCacheMeta,\n type SessionHeadChange,\n type SessionHead,\n type SessionSnapshotCompleteness,\n type DurableSessionPublicationFailureStage,\n} from \"@codesesh/core\";\nimport { appLogger } from \"./logging.js\";\n\nexport type SearchIndexPersistStage = DurableSessionPublicationFailureStage;\n\nexport type SearchIndexWorkerMessage =\n | {\n type: \"sync-result\";\n context: string;\n result: SearchIndexSyncResult | null;\n }\n | {\n type: \"persist-failed\";\n context: string;\n stage: SearchIndexPersistStage;\n publicationId: string;\n agentName: string;\n sessions: number;\n }\n | {\n type: \"done\";\n context: string;\n durationMs: number;\n sessions: number;\n };\n\nexport type SearchIndexWorkerJob =\n | {\n kind: \"full\";\n context: string;\n agentName: string;\n sessions: SessionHead[];\n meta: Record<string, SessionCacheMeta>;\n completeness: SessionSnapshotCompleteness;\n removedSessionIds: string[];\n publicationId?: string;\n saveCache?: boolean;\n searchIndexOptions?: SearchIndexSyncOptions;\n }\n | {\n kind: \"changes\";\n context: string;\n agentName: string;\n changes: SessionHeadChange[];\n removedSessionIds: string[];\n meta: Record<string, SessionCacheMeta>;\n publicationId?: string;\n searchIndexOptions?: SearchIndexSyncOptions;\n }\n | {\n kind: \"maintenance\";\n context: string;\n agentName: string;\n changes: SessionHeadChange[];\n removedSessionIds: string[];\n meta: Record<string, SessionCacheMeta>;\n searchIndexOptions?: SearchIndexSyncOptions;\n };\n\nexport interface SearchIndexWorkerRunRequest {\n type: \"run\";\n pricingGenerationId: number;\n jobs?: SearchIndexWorkerJob[];\n context: string;\n agentNames?: string[];\n sessionsByAgent?: Record<string, SessionHead[]>;\n metaByAgent?: Record<string, Record<string, SessionCacheMeta>>;\n}\n\ntype WorkerAgent = ReturnType<typeof createRegisteredAgents>[number];\n\nfunction jobSessionCount(job: SearchIndexWorkerJob): number {\n return job.kind === \"full\" ? job.sessions.length : job.changes.length;\n}\n\nfunction searchIndexOptions(job: SearchIndexWorkerJob): SearchIndexSyncOptions {\n return {\n ...job.searchIndexOptions,\n ...(job.kind === \"full\"\n ? { completeness: job.completeness, removedSessionIds: job.removedSessionIds }\n : {}),\n detailVersions: Object.fromEntries(\n Object.entries(job.meta).map(([sessionId, meta]) => [sessionId, sessionDetailVersion(meta)]),\n ),\n };\n}\n\n/**\n * Reports a persistence failure so the batch is rejected instead of settling as\n * `done`; the caller keeps its previously published snapshot and can retry.\n */\nfunction reportPersistFailure(\n job: SearchIndexWorkerJob,\n failure: { stage: SearchIndexPersistStage; publicationId: string },\n): void {\n appLogger.error(\"search_index.persist_failed\", {\n context: job.context,\n stage: failure.stage,\n agent: job.agentName,\n sessions: jobSessionCount(job),\n publication_id: failure.publicationId,\n });\n parentPort?.postMessage({\n type: \"persist-failed\",\n context: job.context,\n stage: failure.stage,\n publicationId: failure.publicationId,\n agentName: job.agentName,\n sessions: jobSessionCount(job),\n } satisfies SearchIndexWorkerMessage);\n}\n\nfunction runJob(\n job: SearchIndexWorkerJob,\n agent: WorkerAgent,\n): { stage: SearchIndexPersistStage; publicationId: string } | null {\n if (job.kind === \"maintenance\") {\n const result = syncSessionSearchIndexChanges(\n job.agentName,\n job.changes,\n job.removedSessionIds,\n (sessionId) => agent.getSessionData(sessionId),\n searchIndexOptions(job),\n );\n if (!result) {\n return { stage: \"search_index\", publicationId: randomUUID() };\n }\n postSyncResult(job.context, result);\n return null;\n }\n\n if (job.kind === \"changes\") {\n const publication = commitDurableSessionPublication(\n {\n kind: \"changes\",\n agentName: job.agentName,\n changes: job.changes,\n removedSessionIds: job.removedSessionIds,\n meta: job.meta,\n ...(job.publicationId ? { publicationId: job.publicationId } : {}),\n },\n (sessionId) => agent.getSessionData(sessionId),\n job.searchIndexOptions,\n );\n if (publication.status === \"rolled-back\") return publication;\n postSyncResult(job.context, publication.searchIndex);\n return null;\n }\n\n if (job.saveCache) {\n const publication = commitDurableSessionPublication(\n {\n kind: \"snapshot\",\n agentName: job.agentName,\n sessions: job.sessions,\n meta: job.meta,\n completeness: job.completeness,\n removedSessionIds: job.removedSessionIds,\n ...(job.publicationId ? { publicationId: job.publicationId } : {}),\n },\n (sessionId) => agent.getSessionData(sessionId),\n job.searchIndexOptions,\n );\n if (publication.status === \"rolled-back\") return publication;\n const result = publication.searchIndex;\n // Head cache init is decoupled from search-index completeness (CS-73): a\n // session that fails to load must not permanently block future incremental scans.\n markAgentCacheInitialized(job.agentName);\n if (result.skipped > 0) {\n appLogger.warn(\"search_index.sync_incomplete\", {\n agent: job.agentName,\n skipped: result.skipped,\n });\n }\n postSyncResult(job.context, result);\n return null;\n }\n\n const publicationId = job.publicationId ?? randomUUID();\n const result = syncSessionSearchIndex(\n job.agentName,\n job.sessions,\n (sessionId) => agent.getSessionData(sessionId),\n searchIndexOptions(job),\n );\n if (!result) return { stage: \"search_index\", publicationId };\n postSyncResult(job.context, result);\n return null;\n}\n\nfunction postSyncResult(context: string, result: SearchIndexSyncResult): void {\n parentPort?.postMessage({\n type: \"sync-result\",\n context,\n result,\n } satisfies SearchIndexWorkerMessage);\n}\n\nlet pricingGenerationId: number | null = null;\n\nfunction jobsFromRequest(request: SearchIndexWorkerRunRequest): SearchIndexWorkerJob[] {\n if (request.jobs) return request.jobs;\n return (request.agentNames ?? []).map((agentName): SearchIndexWorkerJob => ({\n kind: \"full\",\n context: request.context,\n agentName,\n sessions: request.sessionsByAgent?.[agentName] ?? [],\n meta: request.metaByAgent?.[agentName] ?? {},\n completeness: \"complete\",\n removedSessionIds: [],\n }));\n}\n\nfunction runBatch(request: SearchIndexWorkerRunRequest): void {\n const startedAt = performance.now();\n if (pricingGenerationId !== request.pricingGenerationId) {\n synchronizePricingGeneration(request.pricingGenerationId);\n pricingGenerationId = request.pricingGenerationId;\n }\n const agents = createRegisteredAgents();\n const jobs = jobsFromRequest(request);\n\n for (const job of jobs) {\n const agent = agents.find((item) => item.name === job.agentName);\n if (!agent) {\n reportPersistFailure(job, {\n stage: \"prepare\",\n publicationId:\n job.kind === \"maintenance\" ? randomUUID() : (job.publicationId ?? randomUUID()),\n });\n return;\n }\n\n if (agent.setSessionMetaMap) {\n agent.setSessionMetaMap(new Map(Object.entries(job.meta)));\n }\n\n const failure = runJob(job, agent);\n if (failure) {\n reportPersistFailure(job, failure);\n return;\n }\n }\n\n parentPort?.postMessage({\n type: \"done\",\n context: request.context,\n durationMs: performance.now() - startedAt,\n sessions: jobs.reduce((total, job) => total + jobSessionCount(job), 0),\n } satisfies SearchIndexWorkerMessage);\n}\n\nparentPort?.on(\"message\", (message: SearchIndexWorkerRunRequest) => {\n if (message.type === \"run\") runBatch(message);\n});\nrunBatch(workerData as SearchIndexWorkerRunRequest);\n"],"mappings":"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","names":["result"]}
1
+ {"version":3,"sources":["../src/search-index-worker.ts"],"sourcesContent":["import \"./diagnostics-bridge.js\";\nimport { randomUUID } from \"node:crypto\";\nimport { parentPort, workerData } from \"node:worker_threads\";\nimport {\n commitDurableSessionPublication,\n markAgentCacheInitialized,\n sessionDetailVersion,\n syncSessionSearchIndex,\n syncSessionSearchIndexChanges,\n type IdentifiedSessionHead,\n type SearchIndexSyncResult,\n type SearchIndexSyncOptions,\n type SearchIndexPublicationStage,\n type PersistedSessionHeadChange,\n type SessionSnapshotCompleteness,\n type DurableSessionPublicationFailureStage,\n} from \"@codesesh/core/runtime/discovery\";\nimport { createRegisteredAgents, type SessionCacheMeta } from \"@codesesh/core/runtime/agents\";\nimport { synchronizePricingGeneration } from \"@codesesh/core/runtime/pricing\";\nimport { appLogger } from \"./logging.js\";\n\nexport type SearchIndexPersistStage = DurableSessionPublicationFailureStage;\n\nexport interface SearchIndexPublicationProgress {\n agentName: string;\n stage: SearchIndexPublicationStage;\n}\n\nexport type SearchIndexWorkerOptions = Omit<SearchIndexSyncOptions, \"onPublicationStage\">;\n\nexport type SearchIndexWorkerMessage =\n | {\n type: \"sync-result\";\n context: string;\n result: SearchIndexSyncResult | null;\n }\n | {\n type: \"persist-failed\";\n context: string;\n stage: SearchIndexPersistStage;\n publicationId: string;\n agentName: string;\n sessions: number;\n /** True when the job carries a durable publication whose staged state must be rolled back. */\n fatal: boolean;\n }\n | ({ type: \"publication-progress\" } & SearchIndexPublicationProgress)\n | {\n type: \"done\";\n context: string;\n durationMs: number;\n sessions: number;\n failedAgents: string[];\n };\n\nexport type SearchIndexWorkerJob =\n | {\n kind: \"full\";\n context: string;\n agentName: string;\n sessions: IdentifiedSessionHead[];\n meta: Record<string, SessionCacheMeta>;\n completeness: SessionSnapshotCompleteness;\n removedSessionIds: string[];\n publicationId?: string;\n saveCache?: boolean;\n searchIndexOptions?: SearchIndexWorkerOptions;\n }\n | {\n kind: \"changes\";\n context: string;\n agentName: string;\n changes: PersistedSessionHeadChange<IdentifiedSessionHead>[];\n removedSessionIds: string[];\n meta: Record<string, SessionCacheMeta>;\n publicationId?: string;\n searchIndexOptions?: SearchIndexWorkerOptions;\n }\n | {\n kind: \"maintenance\";\n context: string;\n agentName: string;\n changes: PersistedSessionHeadChange<IdentifiedSessionHead>[];\n removedSessionIds: string[];\n meta: Record<string, SessionCacheMeta>;\n searchIndexOptions?: SearchIndexWorkerOptions;\n };\n\nexport interface SearchIndexWorkerRunRequest {\n type: \"run\";\n pricingGenerationId: number;\n jobs?: SearchIndexWorkerJob[];\n context: string;\n agentNames?: string[];\n sessionsByAgent?: Record<string, IdentifiedSessionHead[]>;\n metaByAgent?: Record<string, Record<string, SessionCacheMeta>>;\n}\n\ntype WorkerAgent = ReturnType<typeof createRegisteredAgents>[number];\n\nfunction jobSessionCount(job: SearchIndexWorkerJob): number {\n return job.kind === \"full\" ? job.sessions.length : job.changes.length;\n}\n\nfunction searchIndexOptions(job: SearchIndexWorkerJob): SearchIndexSyncOptions {\n return {\n ...job.searchIndexOptions,\n ...(job.kind === \"full\"\n ? { completeness: job.completeness, removedSessionIds: job.removedSessionIds }\n : {}),\n detailVersions: Object.fromEntries(\n Object.entries(job.meta).map(([sessionId, meta]) => [sessionId, sessionDetailVersion(meta)]),\n ),\n };\n}\n\n/**\n * Reports a persistence failure so the batch is rejected instead of settling as\n * `done`; the caller keeps its previously published snapshot and can retry.\n */\nfunction reportPersistFailure(\n job: SearchIndexWorkerJob,\n failure: { stage: SearchIndexPersistStage; publicationId: string },\n): void {\n appLogger.error(\"search_index.persist_failed\", {\n context: job.context,\n stage: failure.stage,\n agent: job.agentName,\n sessions: jobSessionCount(job),\n publication_id: failure.publicationId,\n });\n parentPort?.postMessage({\n type: \"persist-failed\",\n context: job.context,\n stage: failure.stage,\n publicationId: failure.publicationId,\n agentName: job.agentName,\n sessions: jobSessionCount(job),\n fatal: jobIsDurablePublication(job),\n } satisfies SearchIndexWorkerMessage);\n}\n\nfunction runJob(\n job: SearchIndexWorkerJob,\n agent: WorkerAgent,\n): { stage: SearchIndexPersistStage; publicationId: string } | null {\n if (job.kind === \"maintenance\") {\n const result = syncSessionSearchIndexChanges(\n job.agentName,\n job.changes,\n job.removedSessionIds,\n (sessionId) => agent.getSessionData(sessionId),\n searchIndexOptions(job),\n );\n if (!result) {\n return { stage: \"search_index\", publicationId: randomUUID() };\n }\n postSyncResult(job.context, result);\n return null;\n }\n\n if (job.kind === \"changes\") {\n const publication = commitDurableSessionPublication(\n {\n kind: \"changes\",\n agentName: job.agentName,\n changes: job.changes,\n removedSessionIds: job.removedSessionIds,\n meta: job.meta,\n ...(job.publicationId ? { publicationId: job.publicationId } : {}),\n },\n (sessionId) => agent.getSessionData(sessionId),\n publicationSearchIndexOptions(job),\n );\n if (publication.status === \"rolled-back\") return publication;\n postSyncResult(job.context, publication.searchIndex);\n return null;\n }\n\n if (job.saveCache) {\n const publication = commitDurableSessionPublication(\n {\n kind: \"snapshot\",\n agentName: job.agentName,\n sessions: job.sessions,\n meta: job.meta,\n completeness: job.completeness,\n removedSessionIds: job.removedSessionIds,\n ...(job.publicationId ? { publicationId: job.publicationId } : {}),\n },\n (sessionId) => agent.getSessionData(sessionId),\n publicationSearchIndexOptions(job),\n );\n if (publication.status === \"rolled-back\") return publication;\n const result = publication.searchIndex;\n // Head cache init is decoupled from search-index completeness (CS-73): a\n // session that fails to load must not permanently block future incremental scans.\n markAgentCacheInitialized(job.agentName);\n if (result.skipped > 0) {\n appLogger.warn(\"search_index.sync_incomplete\", {\n agent: job.agentName,\n skipped: result.skipped,\n });\n }\n postSyncResult(job.context, result);\n return null;\n }\n\n const publicationId = job.publicationId ?? randomUUID();\n const result = syncSessionSearchIndex(\n job.agentName,\n job.sessions,\n (sessionId) => agent.getSessionData(sessionId),\n searchIndexOptions(job),\n );\n if (!result) return { stage: \"search_index\", publicationId };\n postSyncResult(job.context, result);\n return null;\n}\n\nfunction publicationSearchIndexOptions(job: SearchIndexWorkerJob): SearchIndexSyncOptions {\n return {\n ...job.searchIndexOptions,\n onPublicationStage: (stage) => {\n parentPort?.postMessage({\n type: \"publication-progress\",\n agentName: job.agentName,\n stage,\n } satisfies SearchIndexWorkerMessage);\n },\n };\n}\n\nfunction postSyncResult(context: string, result: SearchIndexSyncResult): void {\n parentPort?.postMessage({\n type: \"sync-result\",\n context,\n result,\n } satisfies SearchIndexWorkerMessage);\n}\n\nlet pricingGenerationId: number | null = null;\n\nfunction jobIsDurablePublication(job: SearchIndexWorkerJob): boolean {\n return job.kind !== \"maintenance\" && job.publicationId != null;\n}\n\nfunction jobsFromRequest(request: SearchIndexWorkerRunRequest): SearchIndexWorkerJob[] {\n if (request.jobs) return request.jobs;\n return (request.agentNames ?? []).map((agentName): SearchIndexWorkerJob => ({\n kind: \"full\",\n context: request.context,\n agentName,\n sessions: request.sessionsByAgent?.[agentName] ?? [],\n meta: request.metaByAgent?.[agentName] ?? {},\n completeness: \"complete\",\n removedSessionIds: [],\n }));\n}\n\nfunction runBatch(request: SearchIndexWorkerRunRequest): void {\n const startedAt = performance.now();\n if (pricingGenerationId !== request.pricingGenerationId) {\n synchronizePricingGeneration(request.pricingGenerationId);\n pricingGenerationId = request.pricingGenerationId;\n }\n const agents = createRegisteredAgents();\n const jobs = jobsFromRequest(request);\n\n const failedAgents = new Set<string>();\n for (const job of jobs) {\n // Later chunks for an agent whose earlier job failed would commit on top\n // of unknown state; other agents' jobs are independent and keep going.\n if (failedAgents.has(job.agentName)) continue;\n const agent = agents.find((item) => item.name === job.agentName);\n if (!agent) {\n reportPersistFailure(job, {\n stage: \"prepare\",\n publicationId:\n job.kind === \"maintenance\" ? randomUUID() : (job.publicationId ?? randomUUID()),\n });\n // A session publication must reject the whole batch so its staged\n // state gets rolled back by the caller.\n if (jobIsDurablePublication(job)) return;\n failedAgents.add(job.agentName);\n continue;\n }\n\n agent.restoreSessionCacheMeta(job.meta);\n\n const failure = runJob(job, agent);\n if (failure) {\n reportPersistFailure(job, failure);\n if (jobIsDurablePublication(job)) return;\n failedAgents.add(job.agentName);\n }\n }\n\n parentPort?.postMessage({\n type: \"done\",\n context: request.context,\n durationMs: performance.now() - startedAt,\n sessions: jobs.reduce((total, job) => total + jobSessionCount(job), 0),\n failedAgents: [...failedAgents],\n } satisfies SearchIndexWorkerMessage);\n}\n\nparentPort?.on(\"message\", (message: SearchIndexWorkerRunRequest) => {\n if (message.type === \"run\") runBatch(message);\n});\nrunBatch(workerData as SearchIndexWorkerRunRequest);\n"],"mappings":"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","names":["result"]}
@@ -1,11 +1,14 @@
1
1
  #!/usr/bin/env node
2
- import "./chunk-PROMURPM.js";
2
+ import "./chunk-QH2HOXJH.js";
3
+ import "./chunk-G4HRD3AR.js";
4
+ import {
5
+ createRegisteredAgents
6
+ } from "./chunk-YCUN52HA.js";
3
7
  import {
4
8
  classifySessionTags,
5
- createRegisteredAgents,
6
9
  getSmartTagSourceTimestamp,
7
10
  synchronizePricingGeneration
8
- } from "./chunk-VAUC2W7I.js";
11
+ } from "./chunk-W4PZHL2C.js";
9
12
 
10
13
  // src/smart-tag-worker.ts
11
14
  import { parentPort, workerData } from "worker_threads";
@@ -14,8 +17,8 @@ synchronizePricingGeneration(data.pricingGenerationId);
14
17
  var agents = createRegisteredAgents();
15
18
  var agent = agents.find((a) => a.name === data.agentName);
16
19
  var results = [];
17
- if (agent && agent.setSessionMetaMap) {
18
- agent.setSessionMetaMap(new Map(Object.entries(data.meta)));
20
+ if (agent) {
21
+ agent.restoreSessionCacheMeta(data.meta);
19
22
  for (const sessionId of data.sessionIds) {
20
23
  try {
21
24
  const sessionData = agent.getSessionData(sessionId);
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/smart-tag-worker.ts"],"sourcesContent":["import \"./diagnostics-bridge.js\";\nimport { parentPort, workerData } from \"node:worker_threads\";\nimport {\n createRegisteredAgents,\n classifySessionTags,\n getSmartTagSourceTimestamp,\n synchronizePricingGeneration,\n type SessionCacheMeta,\n} from \"@codesesh/core\";\n\ninterface SmartTagWorkerData {\n pricingGenerationId: number;\n agentName: string;\n sessionIds: string[];\n meta: Record<string, Record<string, unknown>>;\n}\n\ninterface SmartTagWorkerResult {\n id: string;\n tags?: ReturnType<typeof classifySessionTags>;\n sourceUpdatedAt?: number;\n error?: string;\n}\n\nconst data = workerData as SmartTagWorkerData;\nsynchronizePricingGeneration(data.pricingGenerationId);\nconst agents = createRegisteredAgents();\nconst agent = agents.find((a) => a.name === data.agentName);\nconst results: SmartTagWorkerResult[] = [];\n\nif (agent && agent.setSessionMetaMap) {\n agent.setSessionMetaMap(new Map(Object.entries(data.meta)) as Map<string, SessionCacheMeta>);\n\n for (const sessionId of data.sessionIds) {\n try {\n const sessionData = agent.getSessionData(sessionId);\n results.push({\n id: sessionId,\n tags: classifySessionTags(sessionData),\n sourceUpdatedAt: getSmartTagSourceTimestamp(sessionData),\n });\n } catch (error) {\n results.push({\n id: sessionId,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n}\n\nparentPort?.postMessage(results);\n"],"mappings":";;;;;;;;;;AACA,SAAS,YAAY,kBAAkB;AAuBvC,IAAM,OAAO;AACb,6BAA6B,KAAK,mBAAmB;AACrD,IAAM,SAAS,uBAAuB;AACtC,IAAM,QAAQ,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,KAAK,SAAS;AAC1D,IAAM,UAAkC,CAAC;AAEzC,IAAI,SAAS,MAAM,mBAAmB;AACpC,QAAM,kBAAkB,IAAI,IAAI,OAAO,QAAQ,KAAK,IAAI,CAAC,CAAkC;AAE3F,aAAW,aAAa,KAAK,YAAY;AACvC,QAAI;AACF,YAAM,cAAc,MAAM,eAAe,SAAS;AAClD,cAAQ,KAAK;AAAA,QACX,IAAI;AAAA,QACJ,MAAM,oBAAoB,WAAW;AAAA,QACrC,iBAAiB,2BAA2B,WAAW;AAAA,MACzD,CAAC;AAAA,IACH,SAAS,OAAO;AACd,cAAQ,KAAK;AAAA,QACX,IAAI;AAAA,QACJ,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC9D,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,YAAY,YAAY,OAAO;","names":[]}
1
+ {"version":3,"sources":["../src/smart-tag-worker.ts"],"sourcesContent":["import \"./diagnostics-bridge.js\";\nimport { parentPort, workerData } from \"node:worker_threads\";\nimport { createRegisteredAgents, type SessionCacheMeta } from \"@codesesh/core/runtime/agents\";\nimport {\n classifySessionTags,\n getSmartTagSourceTimestamp,\n} from \"@codesesh/core/runtime/diagnostics\";\nimport { synchronizePricingGeneration } from \"@codesesh/core/runtime/pricing\";\n\ninterface SmartTagWorkerData {\n pricingGenerationId: number;\n agentName: string;\n sessionIds: string[];\n meta: Record<string, SessionCacheMeta>;\n}\n\ninterface SmartTagWorkerResult {\n id: string;\n tags?: ReturnType<typeof classifySessionTags>;\n sourceUpdatedAt?: number;\n error?: string;\n}\n\nconst data = workerData as SmartTagWorkerData;\nsynchronizePricingGeneration(data.pricingGenerationId);\nconst agents = createRegisteredAgents();\nconst agent = agents.find((a) => a.name === data.agentName);\nconst results: SmartTagWorkerResult[] = [];\n\nif (agent) {\n agent.restoreSessionCacheMeta(data.meta);\n\n for (const sessionId of data.sessionIds) {\n try {\n const sessionData = agent.getSessionData(sessionId);\n results.push({\n id: sessionId,\n tags: classifySessionTags(sessionData),\n sourceUpdatedAt: getSmartTagSourceTimestamp(sessionData),\n });\n } catch (error) {\n results.push({\n id: sessionId,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n}\n\nparentPort?.postMessage(results);\n"],"mappings":";;;;;;;;;;;;;AACA,SAAS,YAAY,kBAAkB;AAsBvC,IAAM,OAAO;AACb,6BAA6B,KAAK,mBAAmB;AACrD,IAAM,SAAS,uBAAuB;AACtC,IAAM,QAAQ,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,KAAK,SAAS;AAC1D,IAAM,UAAkC,CAAC;AAEzC,IAAI,OAAO;AACT,QAAM,wBAAwB,KAAK,IAAI;AAEvC,aAAW,aAAa,KAAK,YAAY;AACvC,QAAI;AACF,YAAM,cAAc,MAAM,eAAe,SAAS;AAClD,cAAQ,KAAK;AAAA,QACX,IAAI;AAAA,QACJ,MAAM,oBAAoB,WAAW;AAAA,QACrC,iBAAiB,2BAA2B,WAAW;AAAA,MACzD,CAAC;AAAA,IACH,SAAS,OAAO;AACd,cAAQ,KAAK;AAAA,QACX,IAAI;AAAA,QACJ,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC9D,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,YAAY,YAAY,OAAO;","names":[]}
@@ -0,0 +1 @@
1
+ import{a as e,n as t,t as n}from"./jsx-runtime-B-hcVAMW.js";import{v as r}from"./contract-xJyW5u7a.js";import{r as i}from"./index-DEjvzumm.js";var a=e(t(),1);function o(e,t){return t===0||e-t>=15.666666666666668}function s(e,t,n){return!e&&t<=.12?n+1:0}function c(e,t){return e?0:t+1}function l(){let e=typeof document>`u`?void 0:document.fonts;return e?e.ready.then(()=>void 0):Promise.resolve()}function u(e,t,n){return e>=2&&(t>=8||n>=300)}function d(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 f=18,p=42,m=5,h=270,g=500,_=2,v=.035;function y(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 ee(e){return window.getComputedStyle(e).getPropertyValue(`--font-mono`).trim()||`monospace`}function b(e){return Math.round(e??0).toLocaleString(`en-US`)}function x(e){return`$${(e??0).toFixed(4)}`}function S(e){return new Date(e).toLocaleString(`en-US`,{month:`short`,day:`2-digit`,hour:`2-digit`,minute:`2-digit`})}function C(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 w(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 T(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 E(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 D(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(E(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]=E(e,a[a.length-1]??``,n)),a.slice(0,r)}function te(e,t,n){let r=document.createElement(`canvas`);r.width=h*_,r.height=g*_;let i=r.getContext(`2d`);if(!i)return r;i.scale(_,_);let a=e=>`${e} ${n}`,o=i.createLinearGradient(0,0,h,g);o.addColorStop(0,t.paperTop),o.addColorStop(1,t.paperBottom),i.fillStyle=o,i.fillRect(0,0,h,g);let s=w(C(e.id));i.fillStyle=t.ink;for(let e=0;e<1200;e+=1)i.globalAlpha=v*(.12+s()*.14),i.fillRect(s()*h,s()*g,.7,.7);i.globalAlpha=1,i.fillStyle=t.ink,i.font=a(`700 18px`),i.textAlign=`center`,i.fillText(`CODESESH MART`,h/2,34),i.fillStyle=t.inkMuted,i.font=a(`11px`),i.fillText(E(i,e.subtitle.toUpperCase(),234),h/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`),T(i,`Agent`,e.agent,88,h),T(i,`Updated`,S(e.updatedAt),104,h),T(i,`Session`,`#${e.id.slice(0,8)}`,120,h),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(`SESSION TOC RECEIPT LIST`,18,163),i.font=a(`11px`);let c=185;for(let t of e.items){let e=b(t.count);i.fillText(E(i,t.label,168),18,c),i.fillText(e,252-i.measureText(e).width,c),c+=17}return i.strokeStyle=t.line,i.lineWidth=1.5,i.beginPath(),i.moveTo(18,c+5),i.lineTo(252,c+5),i.stroke(),c+=26,T(i,`Input tokens`,b(e.inputTokens),c,h),c+=16,T(i,`Output tokens`,b(e.outputTokens),c,h),c+=16,T(i,`Messages`,b(e.messageCount),c,h),c+=22,i.font=a(`700 13px`),T(i,`TOTAL COST`,x(e.totalCost),c,h),i.strokeStyle=t.line,i.setLineDash([4,4]),i.beginPath(),i.moveTo(18,c+18),i.lineTo(252,c+18),i.stroke(),i.setLineDash([]),i.font=a(`10px`),i.textAlign=`center`,i.fillStyle=t.inkMuted,D(i,e.title,234,2).forEach((e,t)=>{i.fillText(e,h/2,c+38+t*13)}),r}function O(e,t){return e*f+t}function k(e){let{receiptWidth:t,receiptHeight:n,startX:r,startY:i}=e,a=t/17,o=n/41,s=[],c=[];for(let e=0;e<p;e+=1)for(let t=0;t<f;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<p;e+=1)for(let t=0;t<f;t+=1){let n=O(e,t);t<17&&l(n,O(e,t+1),.98),e<41&&l(n,O(e+1,t),.92),e<41&&t<17&&(l(n,O(e+1,t+1),.46),l(O(e+1,t),O(e,t+1),.46)),t<16&&l(n,O(e,t+2),.35),e<40&&l(n,O(e+2,t),.28)}return{particles:s,constraints:c,receiptWidth:t,receiptHeight:n}}function ne(e,t){let n=t.receiptWidth/17;for(let r=0;r<f;r+=1){let i=e[r];i&&(i.fixedX=t.startX+r*n,i.fixedY=t.startY)}}function A(e){for(let t=0;t<f;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 re(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 ie(e,t,n,r,i,a){let o=r[O(i,a)],s=r[O(i,a+1)],c=r[O(i+1,a)],l=r[O(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)/(g/41),_=Math.sin(m)*.08+(h-1)*.16;Math.abs(_)<.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(_),e.fillStyle=_>0?n.paperTop:n.shadow,e.fill(),e.restore())}function ae(e,t,n){let r=null,i=44;for(let a=f;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=f;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 j({canvas:e,anchor:t,hitSurface:n,payload:r,minWidthQuery:i}){let a=e.getContext(`2d`,{alpha:!0});if(!a)return null;let p=r,_={id:null,x:0,y:0,prevX:0,prevY:0,vx:0,vy:0,grabbedIndex:null},v=null,b=!1,x=0,S=0,C=0,w=k({receiptWidth:h,receiptHeight:g,startX:0,startY:32}),T=performance.now(),E=null,D=0,O=0,j=0,M=0,N=!1,P=!1,F=window.matchMedia(i),I=window.matchMedia(`(prefers-reduced-motion: reduce)`),L=()=>v!=null&&F.matches&&document.visibilityState===`visible`,R=()=>{let e=y(t);v={texture:te(p,e,ee(t)),palette:e}},z=()=>{let e=t.getBoundingClientRect(),n=Math.max(280,e.width||320),r=Math.min(h,n-34);return{receiptWidth:r,receiptHeight:Math.min(g,Math.max(320,C-42)),startX:(n-r)/2,startY:32}},B=t=>{N!==t&&(N=t,e.style.visibility=t?`visible`:`hidden`,n.style.visibility=t&&!I.matches?`visible`:`hidden`)},V=()=>{P=!1,x&&=(window.cancelAnimationFrame(x),0),B(!1)},H=(e,t=performance.now())=>{w=k(e),E=e,T=t},U=()=>{let n=window.devicePixelRatio||1,r=t.getBoundingClientRect();S=Math.max(1,r.width),C=Math.max(1,r.height),e.width=Math.floor(S*n),e.height=Math.floor(C*n),a.setTransform(n,0,0,n,0,0),D=0,O=0,j=0,M=0,B(!1),H(z()),L()&&W()},W=()=>{P||!L()||(P=!0,x=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=ae(w.particles,t.x,t.y);r!=null&&(e.preventDefault(),n.setPointerCapture(e.pointerId),_.id=e.pointerId,_.x=t.x,_.y=t.y,_.prevX=t.x,_.prevY=t.y,_.vx=0,_.vy=0,_.grabbedIndex=r,O=0,j=0,W())},J=e=>{if(_.id!==e.pointerId)return;let t=K(e);_.vx=t.x-_.prevX,_.vy=t.y-_.prevY,_.prevX=t.x,_.prevY=t.y,_.x=t.x,_.y=t.y},Y=e=>{if(_.id!==e.pointerId)return;let t=_.grabbedIndex==null?null:w.particles[_.grabbedIndex];t&&(t.oldX=t.x-_.vx*.9,t.oldY=t.y-_.vy*.9),_.id=null,_.grabbedIndex=null},se=e=>{let t=(e-T)/1e3;for(let e=f;e<w.particles.length;e+=1){let n=w.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=_.grabbedIndex==null?null:w.particles[_.grabbedIndex];n&&(n.x+=(_.x-n.x)*.72,n.y+=(_.y-n.y)*.72)},ce=()=>{for(let e=0;e<m;e+=1){A(w.particles);for(let e of w.constraints)re(w.particles,e)}A(w.particles)},le=()=>{let e=1/0,t=1/0,r=-1/0,i=-1/0;for(let n of w.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=w.particles[0],n=w.particles[17],r=w.particles[755],i=w.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=w.particles[0],n=w.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(v){a.clearRect(0,0,S,C),ue(v.palette);for(let e=0;e<41;e+=1)for(let t=0;t<17;t+=1)ie(a,v.texture,v.palette,w.particles,e,t);de(v.palette),le()}},Z=e=>{if(!P)return;if(!L()){V();return}if(!o(e,M)){x=window.requestAnimationFrame(Z);return}M=e;let t=z();d(E,t)&&_.id==null?(D=0,B(!1),H(t,e)):(D+=1,E=t),ne(w.particles,t),I.matches||(se(e),ce()),X();let n=_.id!=null;O=s(n,oe(w.particles),O),j=c(n,j);let r=I.matches;if((r||D>=2)&&B(!0),r||u(D,O,j)){r||(H(t,e),X()),P=!1,x=0;return}x=window.requestAnimationFrame(Z)};B(!1),l().then(()=>{b||(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){p=e,!(b||!v)&&(R(),X())},destroy(){b||(b=!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 M=n();function N(e){let t=[{label:`User`,count:e.counts.user},{label:`Agent Responses`,count:e.counts.agent_message},{label:`Thinking`,count:e.counts.thinking},{label:`Plans`,count:e.counts.plan},{label:`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:`Other tools`,count:a}),[...t,...i].slice(0,9)}function P(e){return!e||e.length===0?`SESSION ACTIVITY RECEIPT`:e.join(` / `)}function F(e,t){return{id:e.reference.sessionId,title:i(e)||`Untitled session`,agent:r(e),updatedAt:e.time_updated??e.time_created,subtitle:P(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:N(t)}}function I({session:e,toc:t,minWidthQuery:n=`(min-width: 1025px)`}){let r=(0,a.useRef)(null),i=(0,a.useRef)(null),o=(0,a.useRef)(null),s=(0,a.useRef)(null),c=(0,a.useMemo)(()=>F(e,t),[e,t]),l=(0,a.useRef)(c);return(0,a.useLayoutEffect)(()=>{let e=r.current,t=i.current,a=o.current;if(!e||!t||!a)return;let c=j({canvas:e,anchor:t,hitSurface:a,payload:l.current,minWidthQuery:n});return s.current=c,()=>{c?.destroy(),s.current===c&&(s.current=null)}},[n]),(0,a.useLayoutEffect)(()=>{l.current=c,s.current?.updatePayload(c)},[c]),(0,M.jsxs)(`div`,{ref:i,className:`relative h-[calc(100dvh-5.5rem)] min-h-[420px]`,children:[(0,M.jsx)(`canvas`,{ref:r,className:`invisible pointer-events-none absolute inset-0 z-[61] block h-full w-full touch-none`,"aria-hidden":`true`}),(0,M.jsx)(`div`,{ref:o,className:`invisible absolute left-0 top-0 z-[62] cursor-grab touch-none active:cursor-grabbing`,"aria-label":`Interactive thermal receipt with Verlet paper simulation`})]})}export{I as InteractiveReceipt};
@@ -0,0 +1 @@
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-C7BqyxxV.js";import{c as p,i as m,m as h,n as g,r as _,s as v,t as y}from"./panel-ND0J63d3.js";var b=e(t(),1);function x(e,t){let n=e!==null,r=h({...v(e??{},t),enabled:n}),i=r.refetch,a=(0,b.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:`Unable to load dashboard.`:null,retry:a}}var S=Math.PI*2;function C(e){return e<0?0:e>1?1:e}function w(e){let t=C(e);return t*t*(3-2*t)}function T(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 E(e,t,n){return w((Math.sin(e*.09+n)+Math.sin(t*.075-n*.83)+Math.sin((e+t)*.045+n*1.31)+2)/4)}function ee(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 D=/^var\((--[\w-]+)\)$/;function O(e,t){let n=D.exec(t)?.[1];return n&&e.getPropertyValue(n).trim()||t}function k(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 A=50;function j(){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()},A))};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 M(e,t){let[n]=(0,b.useState)(j);return(0,b.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 N=2,P=5,te=8,ne=7,re=620,ie=.05,ae=.8,oe=.0018,se=.3,ce=.48,le={barRatio:.62,barMax:76,bandGap:4,minBand:6};function ue(e,t,n){let r=Math.max(1,t-1),i=Math.min(ie,ae/r),a=1-(t-1)*i;return 1-(1-C((n-e*i)/a))**3}function de(e,{values:t,axisMax:n,colors:r,highlight:i,hovered:a,layout:o,reducedMotion:s}){let c=(0,b.useContext)(m),l=M(e,s),u=r.join(`\0`),d=(0,b.useRef)({values:t,axisMax:n,hovered:a,layout:o}),f=(0,b.useRef)(new Map),p=(0,b.useRef)(new Map),h=(0,b.useRef)({startedAt:0,running:!1}),g=(0,b.useRef)({w:0,h:0}),_=(0,b.useRef)(()=>{});return(0,b.useEffect)(()=>{d.current={values:t,axisMax:n,hovered:a,layout:o},s?_.current():l.requestFrame()},[n,l,a,o,s,t]),(0,b.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,b.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=>O(a,e)),c=O(a,i),m=()=>{let e=n.clientWidth,i=n.clientHeight;if(!e||!i)return;let a=Math.min(N,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=C((n-h.current.startedAt)/re);return r>=1&&(h.current.running=!1),ue(e,t,r)},b=(e,t,n,i,a,o,s,c,l,u,d)=>{let f=[l?te:P,l?te:P,u?ne:P,u?ne:P],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=w(1-(e-t)/i),o=E(a,e,v),s=d*(m+.34*n+.26*o)*(.8+.4*T(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*oe;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:ce:se;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 fe=`(prefers-reduced-motion: reduce)`;function F(){let[e,t]=(0,b.useState)(()=>globalThis.matchMedia?.(fe).matches??!1);return(0,b.useEffect)(()=>{let e=globalThis.matchMedia?.(fe);if(!e)return;let n=()=>t(e.matches);return n(),e.addEventListener(`change`,n),()=>e.removeEventListener(`change`,n)},[]),e}var I=n();function pe(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 me({label:e,itemLabels:t,activeIndex:n,onActiveIndexChange:r,layout:i}){let a=(0,b.useRef)([]),[o,s]=(0,b.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=pe(e.key,t,c);n!==null&&(e.preventDefault(),s(n),a.current[n]?.focus())};return(0,I.jsxs)(I.Fragment,{children:[(0,I.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,I.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,I.jsx)(`span`,{role:`status`,"aria-live":`polite`,"aria-atomic":`true`,className:`sr-only`,children:n===null?``:t[n]})]})}var he=[1,.75,.5,.25,0];function ge(e,t){return e===t||e!==null&&t!==null&&e.column===t.column&&e.band===t.band}function L({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,b.useRef)(null),m=(0,b.useRef)(i),h=F(),{hitTest:g}=de(p,{values:e,axisMax:t,colors:n,highlight:r,hovered:i,layout:{...le,...o},reducedMotion:h});(0,b.useEffect)(()=>{m.current=i},[i]);let _=e=>{ge(m.current,e)||(m.current=e,a(e))};return(0,I.jsxs)(`div`,{className:d(`flex`,f),children:[c?(0,I.jsx)(`div`,{className:`relative shrink-0`,style:{height:s,width:38},"aria-hidden":!0,children:he.map(e=>(0,I.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,I.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:[he.map(e=>(0,I.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,I.jsx)(`canvas`,{ref:p,"aria-hidden":!0,className:`absolute inset-0 block`}),(0,I.jsx)(me,{label:l,itemLabels:u,activeIndex:i?.column??null,onActiveIndexChange:e=>_(e===null?null:{column:e,band:null}),layout:`columns`})]})]})}var R=6,_e=118,ve={barRatio:.52,barMax:34,bandGap:0,minBand:4},ye=[`var(--brand)`];function be({perAgent:e}){let[t,n]=(0,b.useState)(null),{byCost:r,visible:i,values:o,axisMax:c,itemLabels:l}=(0,b.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,R),i=r.map(e=>[n(e)]),o=r.map(e=>t?`${e.displayName}: ${a(e.cost)}, ${u(e.sessions)} sessions`:`${e.displayName}: ${u(e.sessions)} sessions`);return{byCost:t,visible:r,values:i,axisMax:Math.max(...i.flat(),0),itemLabels:o}},[e]);return(0,I.jsxs)(y,{role:`region`,"aria-label":`Agents`,className:`p-4`,children:[(0,I.jsx)(g,{title:`Agents`,meta:`${r?`by cost`:`by sessions`} · ${e.length} total`}),i.length===0?(0,I.jsx)(`p`,{className:`console-mono mt-3 text-[11px] text-[var(--console-muted)]`,children:`No data`}):(0,I.jsxs)(`div`,{className:`mt-[14px]`,children:[(0,I.jsx)(L,{values:o,axisMax:c,colors:ye,hovered:t,onHover:n,layout:ve,height:_e,ariaLabel:`Agent distribution chart`,itemLabels:l}),(0,I.jsx)(`div`,{className:`mt-2 grid`,style:{gridTemplateColumns:`repeat(${i.length}, minmax(0, 1fr))`},children:i.map((e,n)=>(0,I.jsxs)(`div`,{"data-testid":`overview-agent-row`,className:`flex min-w-0 flex-col items-center gap-[5px]`,children:[(0,I.jsx)(`span`,{className:`flex size-[18px] items-center justify-center rounded-sm border border-[var(--console-border)] bg-[var(--console-surface-muted)]`,children:(0,I.jsx)(s,{icon:e.icon,iconColored:e.iconColored,alt:e.displayName,className:`size-[10px]`})}),(0,I.jsx)(`span`,{className:d(`console-mono max-w-full truncate text-[9.5px]`,t?.column===n?`text-[var(--console-text)]`:`text-[var(--console-muted)]`),children:e.displayName}),(0,I.jsx)(`span`,{className:`console-mono text-[9.5px] text-[var(--console-text)]`,children:r?a(e.cost):u(e.sessions)}),r?(0,I.jsx)(`span`,{className:`console-mono text-[9.5px] text-[var(--console-muted)]`,children:u(e.sessions)}):null]},e.name))})]}),e.length>R?(0,I.jsxs)(`p`,{className:`console-mono mt-3 text-[10.5px] text-[var(--console-muted)]`,children:[`+ `,e.length-R,` more`]}):null]})}var z=200,B=100,V=100,H=86,U=55,xe=-Math.PI/2,Se=.07,Ce=6,W=4.6,we=2,Te=.0018,Ee=500,G=6,De=.72,Oe=.3,ke=(()=>{let e=[];for(let t=14;t<=186;t+=W)for(let n=14;n<=186;n+=W){let r=t-B,i=n-V,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*w((a-U)/31),jitter:T(t,n)})}return e})();function Ae(e,{a0:t,a1:n}){let r=n-t,i=Math.min(Ce,31*.45,U*r*.45),a=i/H,o=i/U,s=(e,t)=>[B+Math.cos(t)*e,V+Math.sin(t)*e],[c,l]=s(H,t+a);e.beginPath(),e.moveTo(c,l),e.arc(B,V,H,t+a,n-a),e.arcTo(...s(H,n),...s(U,n),i),e.arcTo(...s(U,n),...s(U,n-o),i),e.arc(B,V,U,n-o,t+o,!0),e.arcTo(...s(U,t),...s(H,t),i),e.arcTo(...s(H,t),c,l,i),e.closePath()}function je(e){let t=xe;return e.map(e=>{let n=e*S,r={a0:t+Se/2,a1:t+n-Se/2};return t+=n,r})}function Me(e,{shares:t,colors:n,hovered:r,reducedMotion:i}){let a=(0,b.useContext)(m),o=M(e,i),s=n.join(`\0`),c=(0,b.useRef)(r),l=(0,b.useRef)({displayed:t.slice(),from:t.slice(),target:t.slice(),startedAt:0,running:!1}),u=(0,b.useRef)(je(t)),d=(0,b.useRef)(()=>{});return(0,b.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,b.useEffect)(()=>{c.current=r,i?d.current():o.requestFrame()},[o,r,i]),(0,b.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=>O(a,e)),p=1,m=()=>{let e=n.clientWidth;if(!e)return;let r=Math.min(we,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/z*r},h=0,g=e=>{let t=l.current;if(!t.running)return;let n=C((e-t.startedAt)/Ee),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)*G,Math.sin(n)*G),r.shadowColor=k(e,.55),r.shadowBlur=5}Ae(r,t),r.clip(),r.globalAlpha=i?n?1:Oe*De:De,r.fillStyle=e;let a=n?.46:.34,o=t.a0-.06,s=t.a1+.06;r.beginPath();for(let e of ke){let t=e.angle;for(;t<o;)t+=S;for(;t>=o+S;)t-=S;if(t>s)continue;let n=E(e.x,e.y,h),i=W*(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*Te,r.setTransform(p,0,0,p,0,0),r.clearRect(0,0,z,z);let t=je(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*z-B,o=(n-i.top)/i.height*z-V,s=Math.hypot(a,o);if(s<U||s>H)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+=S;for(;r>=t+S;)r-=S;if(r<=n)return e}return null}}}function Ne({shares:e,colors:t,hovered:n,onHover:r,size:i,ariaLabel:a,itemLabels:o,children:s}){let c=(0,b.useRef)(null),{hitTest:l}=Me(c,{shares:e,colors:t,hovered:n,reducedMotion:F()});return(0,I.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,I.jsx)(`canvas`,{ref:c,"aria-hidden":!0,className:`block size-full`}),(0,I.jsx)(`div`,{className:`pointer-events-none absolute inset-0 flex flex-col items-center justify-center`,children:s}),(0,I.jsx)(me,{label:a,itemLabels:o,activeIndex:n,onActiveIndexChange:r,layout:`surface`})]})}var Pe=5,Fe=142,Ie=.01;function Le(e){return e!==null&&e.some(e=>e.cost>0)}function Re(e,t){let n=[...e].sort((e,t)=>t.cost-e.cost).slice(0,Pe),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*Ie&&i.push({key:`__remainder`,label:`Other`,value:a,color:`var(--console-border-strong)`,display:r(a)}),i}function ze(e){return[...e].sort((e,t)=>t.tokens-e.tokens).slice(0,Pe).map((e,t)=>({key:e.model,label:e.model,value:e.tokens,color:`var(--chart-${t+1})`,display:o(e.tokens)}))}function Be({modelCost:e,modelDistribution:t,totals:n}){let[s,c]=(0,b.useState)(null),{byCost:l,entries:u}=(0,b.useMemo)(()=>{let r=Le(e);return{byCost:r,entries:r?Re(e,n.cost):ze(t)}},[e,t,n.cost]),f=u.reduce((e,t)=>e+t.value,0),p=(0,b.useMemo)(()=>u.map(e=>f>0?e.value/f:1/u.length),[u,f]),m=l?`Cost by Model`:`Models`,h=u.map(e=>`${e.label}: ${i(f>0?e.value/f:0)}, ${e.display}`);return(0,I.jsxs)(y,{role:`region`,"aria-label":m,className:`p-4`,children:[(0,I.jsx)(g,{title:m,meta:l?`by cost`:`by tokens`}),u.length===0?(0,I.jsx)(`p`,{className:`console-mono mt-3 text-[11px] text-[var(--console-muted)]`,children:`No model data`}):(0,I.jsxs)(`div`,{className:`mt-[14px] flex items-center gap-[18px]`,children:[(0,I.jsxs)(Ne,{shares:p,colors:u.map(e=>e.color),hovered:s,onHover:c,size:Fe,ariaLabel:`${m} chart`,itemLabels:h,children:[(0,I.jsx)(`span`,{className:`console-mono text-[16px] font-semibold text-[var(--console-text)]`,children:l?r(n.cost):o(n.tokens)}),(0,I.jsx)(`span`,{className:`console-mono mt-0.5 text-[9px] text-[var(--console-muted)]`,children:l?`total cost`:`total tokens`})]}),(0,I.jsx)(`ul`,{className:`flex min-w-0 flex-1 flex-col gap-[7px]`,children:u.map((e,t)=>(0,I.jsxs)(`li`,{className:d(`flex min-w-0 items-center gap-2 transition-opacity`,s!==null&&s!==t?`opacity-45`:null),onPointerEnter:()=>c(t),onPointerLeave:()=>c(null),children:[(0,I.jsx)(`span`,{className:`size-2 shrink-0 rounded-[2px]`,style:{background:e.color},"aria-hidden":!0}),(0,I.jsx)(`span`,{className:`console-mono min-w-0 flex-1 truncate text-[10.5px] text-[var(--console-text)]`,children:e.label}),(0,I.jsx)(`span`,{className:`console-mono w-[34px] shrink-0 text-right text-[10.5px] text-[var(--console-muted)]`,children:i(f>0?e.value/f:0)}),(0,I.jsx)(`span`,{className:`console-mono w-[54px] shrink-0 text-right text-[10.5px] text-[var(--console-text)]`,children:e.display})]},e.key))})]}),(0,I.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:l?(0,I.jsxs)(I.Fragment,{children:[(0,I.jsx)(`span`,{className:`mr-1.5 rounded-sm bg-[var(--brand-soft)] px-1.5 py-0.5 text-[var(--brand)]`,children:`Estimated`}),a(n.costEstimated),` from model unit price,`,` `,a(n.costRecorded),` from agent records`]}):`Per-model cost needs the message cache, which is unavailable here; showing token share instead.`})]})}var Ve=[{value:`7d`,label:`7d`},{value:`30d`,label:`30d`},{value:`90d`,label:`90d`},{value:`all`,label:`All`},{value:`custom`,label:`Custom`}],K=`__all__`;function He({agent:e,onAgentChange:t,agentCatalog:n,scopeCounts:r,window:i,rangePreset:a,onRangeChange:o,onSelectCustom:s}){let[c,l]=(0,b.useState)(!1);return(0,I.jsxs)(I.Fragment,{children:[(0,I.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3`,children:[t?(0,I.jsxs)(`select`,{"aria-label":`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,I.jsx)(`option`,{value:K,children:`All agents`}),n.active.map(e=>(0,I.jsx)(`option`,{value:e.name.toLowerCase(),children:e.displayName},e.name))]}):null,r?(0,I.jsxs)(`span`,{className:`console-mono text-[11px] text-[var(--console-muted)]`,children:[r.projects,` projects · `,r.agents,` agents in scope`]}):null,(0,I.jsx)(`div`,{className:`ml-auto flex items-center gap-1.5`,children:Ve.map(e=>{let t=e.value===a;return(0,I.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:e.label},e.value)})})]}),(0,I.jsx)(p,{open:c,onOpenChange:l,window:i,onSelectCustom:s})]})}function Ue(e){return e.toFixed(1)}var We={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(0,I.jsxs)(y,{className:d(`px-4 py-[14px]`,a?`border-[var(--brand-line)]`:null),children:[(0,I.jsx)(`p`,{className:`console-eyebrow`,children:e}),(0,I.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,I.jsxs)(`div`,{className:`mt-[7px] flex items-center gap-[7px]`,children:[n===void 0?null:(0,I.jsx)(`span`,{"data-testid":`overview-kpi-trend`,className:d(`console-mono text-[10.5px]`,We[r]),children:n}),i===void 0?null:(0,I.jsx)(`span`,{className:`console-mono truncate text-[10.5px] text-[var(--console-muted)]`,children:i})]})]})}function Ge(e){return e.costEstimated===0?`All recorded by agents`:e.costEstimated===e.cost&&e.cost>0?`All estimated from unit price`:`${a(e.costEstimated)} estimated`}function Ke(e){let t=[e.latestActivityProject,e.latestActivityAgent].filter(e=>!!e);return t.length>0?t.join(` · `):void 0}function qe({totals:e,rangeDays:t}){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,I.jsxs)(`div`,{className:`grid grid-cols-2 gap-3 md:grid-cols-3 xl:grid-cols-5`,children:[(0,I.jsx)(q,{label:`Sessions`,value:u(e.sessions),trend:s??void 0,hint:t?`${Ue(e.sessions/t)}/day`:void 0}),(0,I.jsx)(q,{label:`Messages`,value:u(e.messages),trend:d??void 0,hint:e.sessions>0?`${Ue(e.messages/e.sessions)}/session`:void 0}),(0,I.jsx)(q,{label:`Tokens`,value:o(e.tokens),trend:f??void 0,hint:`Cache hit ${i(e.cacheReadTokens/e.tokens)}`}),(0,I.jsx)(q,{label:`Cost`,value:a(e.cost),trend:p??void 0,trendTone:m?`warning`:`positive`,hint:Ge(e),emphasis:!0}),(0,I.jsx)(q,{label:`Last activity`,value:e.latestActivity===void 0?`No activity`:l(e.latestActivity),trend:e.latestActivity===void 0?void 0:`●`,trendTone:`positive`,hint:e.latestActivity===void 0?void 0:Ke(e)})]})}var Je=[0,1,2,3,4];function J({className:e}){return(0,I.jsx)(`span`,{className:`skeleton-shimmer block rounded-sm ${e}`})}function Y({bodyClassName:e}){return(0,I.jsxs)(y,{className:`p-4`,children:[(0,I.jsx)(J,{className:`h-[15px] w-28`}),(0,I.jsx)(J,{className:`mt-3 ${e}`})]})}function Ye(){return(0,I.jsxs)(`div`,{className:`space-y-4`,"aria-hidden":!0,"data-testid":`overview-skeleton`,children:[(0,I.jsx)(`div`,{className:`grid grid-cols-2 gap-3 md:grid-cols-3 xl:grid-cols-5`,children:Je.map(e=>(0,I.jsxs)(y,{className:`px-4 py-[14px]`,children:[(0,I.jsx)(J,{className:`h-[10px] w-16`}),(0,I.jsx)(J,{className:`mt-[9px] h-[27px] w-24`}),(0,I.jsx)(J,{className:`mt-[7px] h-[11px] w-20`})]},e))}),(0,I.jsxs)(y,{className:`p-4`,children:[(0,I.jsx)(J,{className:`h-[15px] w-28`}),(0,I.jsx)(J,{className:`mt-[14px] h-[168px] w-full`})]}),(0,I.jsxs)(`div`,{className:`grid gap-4 lg:grid-cols-[1.45fr_1fr]`,children:[(0,I.jsx)(Y,{bodyClassName:`h-[248px] w-full`}),(0,I.jsxs)(`div`,{className:`grid content-start gap-4`,children:[(0,I.jsx)(Y,{bodyClassName:`h-[116px] w-full`}),(0,I.jsx)(Y,{bodyClassName:`h-[100px] w-full`})]})]})]})}var Xe=.16;function Ze(e){return e*e*(3-2*e)}function Qe(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=Qe(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=Ze(i-a);t[r]=e[a]*(1-o)+e[a+1]*o}return t}function $e(e,t){let n=Qe(t,0,1)*511,r=Math.min(510,Math.floor(n)),i=n-r;return e[r]*(1-i)+e[r+1]*i}function et(e,t){return 1-(t>0?Math.min(1,e/t):0)*.84}var tt=2,nt=460,rt=180,Z=32,it=.06,at=.24,ot=/oklch\(\s*([\d.]+)\s+([\d.]+)\s+([\d.]+)/;function st(e){let t=Math.imul(e^2654435769,2246822507);return t=Math.imul(t^t>>>13,3266489909),((t^t>>>16)>>>0)/4294967296}function ct(e,t){let n=ot.exec(e),r=ot.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 lt(e,{values:t,max:n,reducedMotion:r}){let i=(0,b.useContext)(m),a=M(e,r),o=(0,b.useRef)({from:X(t),to:X(t),current:X(t),fromMax:n,toMax:n,currentMax:n,startedAt:0,duration:0}),s=(0,b.useRef)(null),c=(0,b.useRef)(()=>{}),l=(0,b.useRef)({x:-1e4,y:-1e4,smoothX:-1e4,smoothY:-1e4,speed:0,inside:!1});(0,b.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:nt,r?c.current():a.requestFrame()},[a,n,r,t]),(0,b.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=ct(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(tt,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/rt)),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]=+(st(e)<it);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*(at+Math.min(1,S.speed/25)*.26),w=!r&&S.inside,T=1-.78**t,E=1-.95**t,ee=e*.0018,D=-1,O=!1;for(let t=0;t<u;t++){let n=u>1?(t+.5)/u:.5,o=et($e(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 k=_[a];if(w){let e=Math.hypot(m-S.smoothX,u+c/2-S.smoothY),t=e<C?1-e/C:0;k+=(t-k)*(t>k?T:E),_[a]=k}else k>0&&(k*=1-E,_[a]=k<.002?0:k);_[a]>0&&(O=!0);let A=Math.min(1,x+k*.5);if(A<=.02)continue;let j=A;r||(j*=1+.07*Math.sin(b*Math.PI*3-ee),v[a]&&k>.02&&(j*=1+.25*k*Math.sin(e*.012+a)),j=Math.min(1,j));let M=Math.max(g,y(c*(.28+.42*A))),N=y((c-M)/2),P=Math.round(j*Z);P!==D&&(D=P,i.fillStyle=p[D]??p[Z]??f),i.fillRect(l+N,u+N,M,M)}}return O},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 ut=[1,.66,.33,0],dt=e=>`${(1-e*(1-Xe))*100}%`,ft=(e,t)=>(e+.5)/t*100;function pt({values:e,max:t,labels:n,formatValue:r}){let[i,a]=(0,b.useState)(null),o=(0,b.useRef)(null),s=F(),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,I.jsxs)(`div`,{ref:o,className:`absolute inset-0 cursor-crosshair touch-none`,onPointerMove:e=>c(e.clientX),onPointerLeave:()=>a(null),children:[(0,I.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:`${ft(u,e.length)}%`,transition:p}}),(0,I.jsxs)(`div`,{className:d(`pointer-events-none absolute size-0 transition-opacity duration-150`,l?`opacity-100`:`opacity-0`),style:{left:`${ft(u,e.length)}%`,top:`${et(f,t)*100}%`,transition:p},children:[(0,I.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,I.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,I.jsx)(`span`,{className:`text-[10px] text-[var(--console-muted)]`,children:n[u]}),(0,I.jsx)(`span`,{className:`text-[12px] font-semibold text-[var(--console-text)]`,children:r(f)})]})]})]})}function mt({values:e,max:t,labels:n,height:r,formatValue:i,formatTick:a,className:o}){let s=(0,b.useRef)(null);return lt(s,{values:e,max:t,reducedMotion:F()}),(0,I.jsxs)(`div`,{className:d(`flex`,o),"aria-hidden":!0,children:[a?(0,I.jsx)(`div`,{className:`relative shrink-0`,style:{height:r,width:38},children:ut.map(e=>(0,I.jsx)(`span`,{className:`console-mono absolute right-2 -translate-y-1/2 text-[9.5px] whitespace-nowrap text-[var(--console-muted)]`,style:{top:dt(e)},children:a(t*e)},e))}):null,(0,I.jsxs)(`div`,{className:`chart-hatch relative min-w-0 flex-1`,style:{height:r},children:[ut.map(e=>(0,I.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:dt(e)}},e)),(0,I.jsx)(`canvas`,{ref:s,className:`absolute inset-0 block`}),e.length>0?(0,I.jsx)(pt,{values:e,max:t,labels:n,formatValue:i}):null]})]})}var ht=168,gt=132,_t=6,vt={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)`}],yt=Q.map(e=>e.color);function bt(e){return e>=1e3?`$${o(e)}`:`$${Math.round(e)}`}function $(e){return e.input+e.output+e.cache_read+e.cache_create}function xt(e){return`${f(e.date)}: ${o($(e))} tokens, ${a(e.cost)}, ${u(e.sessions)} sessions, ${u(e.messages)} messages, input ${o(e.input)}, output ${o(e.output)}, cache read ${o(e.cache_read)}, cache write ${o(e.cache_create)}`}function St({daily:e}){let t=(0,b.useMemo)(()=>e.map(e=>e.cost),[e]),n=(0,b.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,I.jsxs)(I.Fragment,{children:[(0,I.jsxs)(`div`,{className:`mt-[14px] flex items-baseline justify-between border-t border-dashed border-[var(--console-border)] pt-[11px]`,children:[(0,I.jsx)(`span`,{className:`console-mono text-[10.5px] text-[var(--console-text)]`,children:`Daily cost`}),(0,I.jsxs)(`span`,{className:`console-mono text-[10px] text-[var(--console-muted)]`,children:[`Peak `,a(i),` · Avg `,a(r/e.length),` · Total `,a(r)]})]}),(0,I.jsx)(mt,{values:t,max:i,labels:n,height:gt,formatValue:a,formatTick:bt,className:`mt-[7px]`})]})}function Ct({bucket:e,index:t,count:n}){return(0,I.jsxs)(`div`,{className:d(`console-mono pointer-events-none absolute top-2 z-10 rounded-md border border-[var(--console-border)] bg-[var(--console-surface)] px-2.5 py-2 text-[10.5px] whitespace-nowrap text-[var(--console-text)] shadow-[var(--shadow-overlay)]`,t>=n*.75?`-translate-x-full`:`-translate-x-1/2`),style:{left:`${(t+.5)/n*100}%`},children:[(0,I.jsx)(`div`,{children:f(e.date)}),(0,I.jsxs)(`div`,{children:[o($(e)),` tok ·`,` `,(0,I.jsx)(`span`,{className:`text-[var(--brand)]`,children:a(e.cost)})]}),(0,I.jsxs)(`div`,{children:[u(e.sessions),` sessions · `,u(e.messages),` messages`]}),(0,I.jsxs)(`div`,{className:`text-[var(--console-muted)]`,children:[`In `,o(e.input),` · Out `,o(e.output),` · Read`,` `,o(e.cache_read),` · Write `,o(e.cache_create)]})]})}function wt({daily:e}){let[t,n]=(0,b.useState)(null),r=(0,b.useMemo)(()=>e.map(e=>Q.map(t=>e[t.key])),[e]),i=(0,b.useMemo)(()=>e.map(xt),[e]),a=(0,b.useMemo)(()=>ee(e.reduce((e,t)=>Math.max(e,$(t)),0)),[e]),s=t===null?void 0:e[t.column];return(0,I.jsxs)(`div`,{className:`relative mt-[14px]`,children:[(0,I.jsx)(L,{values:r,axisMax:a,colors:yt,hovered:t,onHover:n,layout:vt,height:ht,formatTick:o,ariaLabel:`Daily usage chart`,itemLabels:i}),s&&t?(0,I.jsx)(`div`,{className:`absolute inset-x-0 top-0`,style:{left:38},children:(0,I.jsx)(Ct,{bucket:s,index:t.column,count:e.length})}):null]})}function Tt({daily:e}){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/_t));return(0,I.jsxs)(y,{role:`region`,"aria-label":`Daily usage`,className:`p-4`,children:[(0,I.jsx)(g,{title:`Daily usage`,action:(0,I.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,I.jsxs)(`span`,{"data-testid":`overview-legend-token`,className:`flex items-center gap-1`,children:[(0,I.jsx)(`span`,{className:`size-2 rounded-[2px]`,style:{background:e.color},"aria-hidden":!0}),e.label]},e.key))})}),(0,I.jsxs)(`p`,{className:`console-mono mt-1 text-[10.5px] text-[var(--console-muted)]`,children:[`Stacked bars = token mix · Area below = daily cost`,r]}),e.length===0?(0,I.jsx)(`p`,{className:`console-mono mt-[14px] text-[11px] text-[var(--console-muted)]`,children:`No usage data`}):(0,I.jsxs)(I.Fragment,{children:[(0,I.jsx)(wt,{daily:e}),(0,I.jsx)(St,{daily:e}),(0,I.jsx)(`div`,{style:{paddingLeft:38},children:(0,I.jsx)(`div`,{className:`console-mono mt-2 flex text-[10px] text-[var(--console-muted)]`,children:e.map((t,n)=>(0,I.jsx)(`span`,{className:`flex-1 text-center`,children:n%i===0||n===e.length-1?f(t.date):``},t.date))})})]}),(0,I.jsxs)(`table`,{className:`sr-only`,"aria-label":`Daily usage data`,children:[(0,I.jsx)(`thead`,{children:(0,I.jsxs)(`tr`,{children:[(0,I.jsx)(`th`,{children:`Date`}),(0,I.jsx)(`th`,{children:`Sessions`}),(0,I.jsx)(`th`,{children:`Messages`}),(0,I.jsx)(`th`,{children:`Tokens`}),(0,I.jsx)(`th`,{children:`Cost`})]})}),(0,I.jsx)(`tbody`,{children:e.map(e=>(0,I.jsxs)(`tr`,{children:[(0,I.jsx)(`td`,{children:f(e.date)}),(0,I.jsx)(`td`,{children:u(e.sessions)}),(0,I.jsx)(`td`,{children:u(e.messages)}),(0,I.jsx)(`td`,{children:u($(e))}),(0,I.jsx)(`td`,{children:a(e.cost)})]},e.date))})]})]})}function Et({project:e,agent:t,onAgentChange:n,window:r,agentCatalog:i,rangePreset:a,onRangeChange:o,onSelectCustom:s}){let[c,l]=(0,b.useState)(void 0),u=n?t:c,{dashboard:d,error:f,retry:p}=x(r,{project:e,agent:u});return(0,I.jsxs)(`div`,{"data-testid":`dashboard`,className:`mx-auto max-w-6xl space-y-4`,children:[(0,I.jsx)(He,{agent:u,onAgentChange:n?void 0:l,agentCatalog:i,scopeCounts:d?.scopeCounts,window:r,rangePreset:a,onRangeChange:o,onSelectCustom:s}),f?(0,I.jsx)(_,{title:`Couldn't load the dashboard.`,message:f,onRetry:()=>void p()}):null,d?(0,I.jsxs)(I.Fragment,{children:[(0,I.jsx)(qe,{totals:d.totals,rangeDays:d.window.days}),(0,I.jsx)(Tt,{daily:d.dailyActivity}),(0,I.jsxs)(`div`,{className:`grid gap-4 lg:grid-cols-2`,children:[(0,I.jsx)(be,{perAgent:d.perAgent}),(0,I.jsx)(Be,{modelCost:d.modelCost,modelDistribution:d.modelDistribution,totals:d.totals})]})]}):f?null:(0,I.jsx)(Ye,{})]})}export{Et as OverviewScreen};