{
  "version": 3,
  "sources": ["../../src/document/components/chrome/siteSettings/Usage/utils/fetchUsageUtils.ts", "../../src/document/stores/UsageStore.ts"],
  "sourcesContent": ["import { apiFetcher } from \"web/lib/apiFetcher.ts\"\nimport type {\n\tAgentsUsageDailyTotal,\n\tAgentsUsagePerFeature,\n\tAgentsUsagePerModel,\n\tAgentsUsagePerProject,\n\tAgentsUsagePerUser,\n\tBandwidthDailyTotal,\n} from \"../types.ts\"\n\ninterface BandwidthUsageParams {\n\tsignal: AbortSignal\n\tprojectId: string\n\tfrom: string\n\tto: string\n\ttopAssetsFrom: string\n\ttopAssetsTo: string\n\ttopAssetsCount: number\n\tassetPath?: string\n}\ninterface BandwidthUsageResponse {\n\tdailyTotals: BandwidthDailyTotal[]\n\tindividualAssets: Array<{ assetPath: string; totalBytes: number; assetUrl: string }>\n\tassetCategories: Array<{ category: string; totalBytes: number }>\n\thasSharedHostnames?: boolean\n}\n\nexport async function fetchBandwidthUsage({\n\tsignal,\n\tprojectId,\n\tfrom,\n\tto,\n\ttopAssetsFrom,\n\ttopAssetsTo,\n\ttopAssetsCount,\n\tassetPath,\n}: BandwidthUsageParams): Promise<BandwidthUsageResponse> {\n\tconst queryParams = new URLSearchParams()\n\n\tqueryParams.set(\"from\", from)\n\tqueryParams.set(\"to\", to)\n\tqueryParams.set(\"topAssetsFrom\", topAssetsFrom)\n\tqueryParams.set(\"topAssetsTo\", topAssetsTo)\n\tqueryParams.set(\"topAssetsCount\", String(topAssetsCount))\n\n\tqueryParams.set(\"includeSiteModules\", \"true\")\n\tif (assetPath) queryParams.set(\"assetPath\", assetPath)\n\n\treturn apiFetcher.get(`/web/v2/bandwidth/${projectId}/usage?${queryParams.toString()}`, undefined, signal)\n}\n\ninterface TeamAIUsageParams {\n\tsignal: AbortSignal\n\tteamId: string\n\tfrom: string\n\tto: string\n\ttopFieldsFrom?: string\n\ttopFieldsTo?: string\n\tfeature?: string\n\tmodel?: string\n\tuserId?: string\n\tprojectId?: string\n}\ninterface TeamAIUsageResponse {\n\tstats: AgentsUsageDailyTotal[]\n\tuserId: AgentsUsagePerUser[]\n\tmodel: AgentsUsagePerModel[]\n\tfeature: AgentsUsagePerFeature[]\n\tproject: AgentsUsagePerProject[]\n}\n\nexport async function fetchTeamAIUsage({\n\tsignal,\n\tteamId,\n\tprojectId,\n\tfrom,\n\tto,\n\ttopFieldsFrom,\n\ttopFieldsTo,\n\tfeature,\n\tmodel,\n\tuserId,\n}: TeamAIUsageParams): Promise<TeamAIUsageResponse> {\n\tconst queryParams = new URLSearchParams()\n\n\tqueryParams.set(\"from\", from)\n\tqueryParams.set(\"to\", to)\n\n\tif (topFieldsFrom) queryParams.set(\"topFieldsFrom\", topFieldsFrom)\n\tif (topFieldsTo) queryParams.set(\"topFieldsTo\", topFieldsTo)\n\n\tif (feature) queryParams.set(\"feature\", feature)\n\tif (model) queryParams.set(\"model\", model)\n\tif (userId) queryParams.set(\"userId\", userId)\n\tif (projectId) queryParams.set(\"projectId\", projectId)\n\n\treturn apiFetcher.get(`/web/teams/${teamId}/ai-usage?${queryParams.toString()}`, undefined, signal)\n}\n", "import { isOrganizationSpace, isPersonalSpace, TeamMemberRole } from \"@framerjs/app-shared\"\nimport { EngineStore } from \"document/EngineStore.ts\"\nimport { MAX_TOP_ASSETS } from \"document/components/chrome/siteSettings/Usage/constants.ts\"\nimport type {\n\tUsageFilterOption,\n\tUsageFilters,\n\tBandwidthUsageState,\n\tUsageType,\n\tAgentsUsageState,\n\tAgentsUsageViewState,\n} from \"document/components/chrome/siteSettings/Usage/types.ts\"\nimport {\n\tfetchBandwidthUsage,\n\tfetchTeamAIUsage,\n} from \"document/components/chrome/siteSettings/Usage/utils/fetchUsageUtils.ts\"\nimport type { ProjectStore } from \"./ProjectStore.ts\"\nimport type { SessionStore } from \"./SessionStore.ts\"\n\nexport function getUsageMonthRange(month: number, year: number) {\n\tconst daysInMonth = new Date(year, month + 1, 0).getDate()\n\n\tconst now = new Date()\n\tconst isCurrentMonth = now.getFullYear() === year && now.getMonth() === month\n\n\tlet fromDayString: string\n\tif (isCurrentMonth) {\n\t\tconst currentDay = now.getDate()\n\t\tconst thirtyDaysAgo = new Date(year, month, currentDay - 30)\n\t\tconst startOfMonth = new Date(year, month, 1)\n\t\tconst fromDate = thirtyDaysAgo < startOfMonth ? thirtyDaysAgo : startOfMonth\n\t\tfromDayString = `${fromDate.getFullYear()}-${String(fromDate.getMonth() + 1).padStart(2, \"0\")}-${String(fromDate.getDate()).padStart(2, \"0\")}`\n\t} else {\n\t\tfromDayString = `${year}-${String(month + 1).padStart(2, \"0\")}-01`\n\t}\n\n\tconst topFieldsFromString = `${year}-${String(month + 1).padStart(2, \"0\")}-01`\n\tconst toDayString = `${year}-${String(month + 1).padStart(2, \"0\")}-${String(daysInMonth).padStart(2, \"0\")}`\n\n\treturn {\n\t\tfrom: fromDayString,\n\t\tto: toDayString,\n\t\ttopFieldsFrom: topFieldsFromString,\n\t\ttopFieldsTo: toDayString,\n\t}\n}\n\nexport class UsageStore extends EngineStore {\n\t#bandwidthAbortController = new AbortController()\n\t#agentsAbortController = new AbortController()\n\n\tconstructor(\n\t\tprivate readonly sessionStore: SessionStore,\n\t\tprivate readonly projectStore: ProjectStore,\n\t) {\n\t\tsuper()\n\t}\n\n\tget #canViewAgentsUsage(): boolean {\n\t\tconst project = this.projectStore.project\n\t\tconst team = this.sessionStore.user.spaces.find(({ id }) => id === project?.space.id)\n\n\t\tif (isPersonalSpace(team)) {\n\t\t\treturn true\n\t\t}\n\n\t\treturn isOrganizationSpace(team) && [TeamMemberRole.Admin, TeamMemberRole.Editor].includes(team.role)\n\t}\n\n\tget agentsUsageView(): AgentsUsageViewState {\n\t\tconst canViewAgentsUsage = this.#canViewAgentsUsage\n\n\t\tif (!canViewAgentsUsage) {\n\t\t\treturn \"none\"\n\t\t}\n\n\t\t// Currently only workspaces on a free plan have a daily limit set\n\t\tconst dailyLimit = this.projectStore.resourceLimits?.aiCreditsDaily ?? null\n\t\treturn dailyLimit !== null ? \"limited\" : \"full\"\n\t}\n\n\tfilters: UsageFilters = {}\n\taddFilter(key: UsageFilterOption, value: string, valueLabel: string) {\n\t\tif (this.filters[key]?.value === value) return\n\n\t\tthis.filters = {\n\t\t\t...this.filters,\n\t\t\t[key]: { value, valueLabel },\n\t\t}\n\t}\n\tremoveFilter(key: UsageFilterOption) {\n\t\tconst { [key]: _, ...rest } = this.filters\n\t\tthis.filters = rest\n\t}\n\tsetDefaultFilters(usageType: UsageType) {\n\t\tthis.filters = {}\n\n\t\tswitch (usageType) {\n\t\t\tcase \"agents\": {\n\t\t\t\tconst project = this.projectStore.project\n\n\t\t\t\tthis.filters =\n\t\t\t\t\tthis.agentsUsageView === \"full\" && project\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tprojectId: {\n\t\t\t\t\t\t\t\t\tvalue: project.id,\n\t\t\t\t\t\t\t\t\tvalueLabel: project.title ?? project.id,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: {}\n\t\t\t}\n\t\t}\n\t}\n\n\tbandwidthDataLoading = false\n\tbandwidthData: BandwidthUsageState | undefined\n\n\tagentsUsageDataLoading = false\n\tagentsUsageData: AgentsUsageState | undefined\n\n\tprivate _month: number = new Date().getMonth()\n\tprivate _year: number = new Date().getFullYear()\n\n\tget month() {\n\t\treturn this._month\n\t}\n\n\tget year() {\n\t\treturn this._year\n\t}\n\n\tsetMonthAndYear(month: number, year: number) {\n\t\tthis._month = month\n\t\tthis._year = year\n\t}\n\n\tasync fetchBandwidthData() {\n\t\tthis.#bandwidthAbortController.abort()\n\t\tthis.#bandwidthAbortController = new AbortController()\n\t\tthis.bandwidthDataLoading = true\n\n\t\tconst signal = this.#bandwidthAbortController.signal\n\t\tconst { from, to, topFieldsFrom, topFieldsTo } = getUsageMonthRange(this.month, this.year)\n\t\tconst showProjectedLine = Object.keys(this.filters).length === 0\n\t\tconst month = this._month\n\t\tconst year = this._year\n\n\t\tconst params = {\n\t\t\tsignal,\n\t\t\tprojectId: this.projectStore.projectId,\n\t\t\tfrom,\n\t\t\tto,\n\t\t\ttopAssetsFrom: topFieldsFrom,\n\t\t\ttopAssetsTo: topFieldsTo,\n\t\t\ttopAssetsCount: MAX_TOP_ASSETS,\n\t\t\tassetPath: this.filters.assetPath?.value,\n\t\t}\n\n\t\ttry {\n\t\t\tconst response = await fetchBandwidthUsage(params)\n\n\t\t\tif (!signal.aborted) {\n\t\t\t\tthis.bandwidthData = { ...response, showProjectedLine, month, year }\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (error instanceof DOMException && error.name === \"AbortError\") {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthrow error\n\t\t} finally {\n\t\t\tif (!signal.aborted) {\n\t\t\t\tthis.bandwidthDataLoading = false\n\t\t\t}\n\t\t}\n\t}\n\n\tasync fetchAgentsData() {\n\t\tthis.#agentsAbortController.abort()\n\t\tthis.#agentsAbortController = new AbortController()\n\t\tthis.agentsUsageDataLoading = true\n\n\t\tconst signal = this.#agentsAbortController.signal\n\n\t\tconst { from, to, topFieldsFrom, topFieldsTo } = getUsageMonthRange(this.month, this.year)\n\t\tconst showProjectedLine = Object.keys(this.filters).length === 0\n\t\tconst month = this._month\n\t\tconst year = this._year\n\n\t\ttry {\n\t\t\tconst project = await this.projectStore.getProject()\n\n\t\t\tconst params = {\n\t\t\t\tsignal,\n\t\t\t\tfrom,\n\t\t\t\tto,\n\t\t\t\ttopFieldsFrom,\n\t\t\t\ttopFieldsTo,\n\t\t\t\tuserId: this.filters.userId?.value,\n\t\t\t\tmodel: this.filters.model?.value,\n\t\t\t\tfeature: this.filters.feature?.value,\n\t\t\t\tteamId: project.space.ownerId,\n\t\t\t\tprojectId: this.filters.projectId?.value,\n\t\t\t}\n\n\t\t\tconst response = await fetchTeamAIUsage(params)\n\n\t\t\tif (!signal.aborted) {\n\t\t\t\tthis.agentsUsageData = { ...response, showProjectedLine, month, year }\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (error instanceof DOMException && error.name === \"AbortError\") {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthrow error\n\t\t} finally {\n\t\t\tif (!signal.aborted) {\n\t\t\t\tthis.agentsUsageDataLoading = false\n\t\t\t}\n\t\t}\n\t}\n}\n"],
  "mappings": "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",
  "names": []
}
