@agent-native/core 0.94.3 → 0.95.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/corpus/README.md +2 -2
- package/corpus/core/CHANGELOG.md +16 -0
- package/corpus/core/docs/content/locales/ar-SA/template-design.mdx +13 -0
- package/corpus/core/docs/content/locales/de-DE/template-design.mdx +18 -0
- package/corpus/core/docs/content/locales/es-ES/template-design.mdx +16 -0
- package/corpus/core/docs/content/locales/fr-FR/template-design.mdx +17 -0
- package/corpus/core/docs/content/locales/hi-IN/template-design.mdx +16 -0
- package/corpus/core/docs/content/locales/ja-JP/template-design.mdx +17 -0
- package/corpus/core/docs/content/locales/ko-KR/template-design.mdx +15 -0
- package/corpus/core/docs/content/locales/pt-BR/template-design.mdx +16 -0
- package/corpus/core/docs/content/locales/zh-CN/template-design.mdx +11 -0
- package/corpus/core/docs/content/locales/zh-TW/template-design.mdx +12 -0
- package/corpus/core/docs/content/pr-visual-recap.mdx +20 -12
- package/corpus/core/docs/content/template-design.mdx +16 -0
- package/corpus/core/package.json +2 -2
- package/corpus/core/src/agent/engine/ai-sdk-engine.ts +3 -0
- package/corpus/core/src/agent/engine/registry.ts +6 -1
- package/corpus/core/src/agent/engine/types.ts +2 -0
- package/corpus/core/src/agent/production-agent.ts +20 -0
- package/corpus/core/src/agent/thread-data-builder.ts +41 -17
- package/corpus/core/src/cli/code-agent-executor.ts +61 -1
- package/corpus/core/src/cli/pr-visual-recap-workflow.ts +1 -1
- package/corpus/core/src/cli/recap.ts +262 -25
- package/corpus/core/src/client/AssistantChat.tsx +250 -25
- package/corpus/core/src/client/chat/tool-call-display.tsx +1 -1
- package/corpus/core/src/client/chat/use-reconnect-reader-owner.ts +28 -0
- package/corpus/core/src/client/guided-questions.tsx +9 -1
- package/corpus/core/src/client/integrations/IntegrationsPanel.tsx +6 -7
- package/corpus/core/src/client/settings/UsageSection.tsx +26 -5
- package/corpus/core/src/client/sse-event-processor.ts +90 -21
- package/corpus/core/src/connections/catalog.ts +2 -2
- package/corpus/core/src/deploy/build.ts +3 -0
- package/corpus/core/src/index.ts +2 -0
- package/corpus/core/src/integrations/catalog.ts +2 -2
- package/corpus/core/src/server/auth.ts +1 -1
- package/corpus/core/src/server/credential-provider.ts +7 -3
- package/corpus/core/src/shared/cache-control.ts +10 -4
- package/corpus/core/src/usage/store.ts +82 -20
- package/corpus/templates/analytics/app/lib/data-sources.ts +5 -4
- package/corpus/templates/analytics/changelog/2026-07-10-slack-token-setup-marked-legacy.md +6 -0
- package/corpus/templates/analytics/server/lib/credential-keys.ts +6 -2
- package/corpus/templates/brain/changelog/2026-07-10-slack-backfill-token-marked-legacy.md +6 -0
- package/corpus/templates/brain/server/register-secrets.ts +2 -2
- package/corpus/templates/clips/app/components/library/library-layout.tsx +7 -1
- package/corpus/templates/clips/app/components/library/page-header.tsx +19 -3
- package/corpus/templates/clips/app/routes/_app.library._index.tsx +16 -12
- package/corpus/templates/clips/changelog/2026-07-10-new-recording-appears-once-when-the-library-sidebar-is-open.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-10-slack-token-fallback-guidance.md +6 -0
- package/corpus/templates/clips/server/register-secrets.ts +1 -1
- package/corpus/templates/content/app/components/editor/DocumentEditor.tsx +0 -66
- package/corpus/templates/content/app/routes/_app.local-files.tsx +7 -47
- package/corpus/templates/content/changelog/2026-07-10-local-folders-now-wait-for-an-explicit-pull-before-content-r.md +6 -0
- package/corpus/templates/content/package.json +1 -1
- package/corpus/templates/design/actions/generate-design.ts +128 -31
- package/corpus/templates/design/actions/present-design-variants.ts +37 -9
- package/corpus/templates/design/app/components/design/DesignCanvas.tsx +9 -3
- package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +32 -10
- package/corpus/templates/design/app/components/design/QuestionFlow.tsx +2 -2
- package/corpus/templates/design/app/components/design/TweaksPanel.tsx +9 -1
- package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +7 -5
- package/corpus/templates/design/app/components/design/multi-screen/types.ts +3 -0
- package/corpus/templates/design/app/global.css +10 -0
- package/corpus/templates/design/app/hooks/use-question-flow.ts +9 -2
- package/corpus/templates/design/app/i18n/zh-TW.ts +1 -0
- package/corpus/templates/design/app/i18n-data.ts +21 -11
- package/corpus/templates/design/changelog/2026-07-10-editor-panels-are-easier-to-distinguish-and-design-intake-qu.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-interact-mode-now-stays-on-the-full-canvas-matches-edit-visu.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-new-web-designs-open-at-desktop-size-and-adapt-across-mobile.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-tweaks-now-link-to-full-documentation.md +6 -0
- package/corpus/templates/design/server/plugins/agent-chat.ts +2 -0
- package/corpus/templates/mail/app/i18n/ar-SA.ts +3 -3
- package/corpus/templates/mail/app/i18n/de-DE.ts +3 -3
- package/corpus/templates/mail/app/i18n/en-US.ts +4 -3
- package/corpus/templates/mail/app/i18n/es-ES.ts +3 -3
- package/corpus/templates/mail/app/i18n/fr-FR.ts +3 -3
- package/corpus/templates/mail/app/i18n/hi-IN.ts +3 -3
- package/corpus/templates/mail/app/i18n/ja-JP.ts +3 -3
- package/corpus/templates/mail/app/i18n/ko-KR.ts +3 -3
- package/corpus/templates/mail/app/i18n/pt-BR.ts +3 -3
- package/corpus/templates/mail/app/i18n/zh-CN.ts +3 -3
- package/corpus/templates/mail/app/i18n/zh-TW.ts +3 -3
- package/corpus/templates/mail/changelog/2026-07-10-slack-intake-marked-legacy.md +6 -0
- package/corpus/templates/mail/server/lib/env-config.ts +5 -4
- package/corpus/templates/plan/actions/record-recap-usage-cost.ts +49 -0
- package/corpus/templates/plan/actions/record-recap-usage.ts +15 -22
- package/corpus/templates/plan/package.json +1 -1
- package/dist/agent/engine/ai-sdk-engine.d.ts.map +1 -1
- package/dist/agent/engine/ai-sdk-engine.js +3 -0
- package/dist/agent/engine/ai-sdk-engine.js.map +1 -1
- package/dist/agent/engine/registry.d.ts +1 -1
- package/dist/agent/engine/registry.d.ts.map +1 -1
- package/dist/agent/engine/registry.js +2 -0
- package/dist/agent/engine/registry.js.map +1 -1
- package/dist/agent/engine/types.d.ts +2 -0
- package/dist/agent/engine/types.d.ts.map +1 -1
- package/dist/agent/engine/types.js.map +1 -1
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +20 -0
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/agent/thread-data-builder.d.ts.map +1 -1
- package/dist/agent/thread-data-builder.js +36 -18
- package/dist/agent/thread-data-builder.js.map +1 -1
- package/dist/cli/code-agent-executor.d.ts +2 -0
- package/dist/cli/code-agent-executor.d.ts.map +1 -1
- package/dist/cli/code-agent-executor.js +52 -3
- package/dist/cli/code-agent-executor.js.map +1 -1
- package/dist/cli/pr-visual-recap-workflow.d.ts +1 -1
- package/dist/cli/pr-visual-recap-workflow.d.ts.map +1 -1
- package/dist/cli/pr-visual-recap-workflow.js +1 -1
- package/dist/cli/pr-visual-recap-workflow.js.map +1 -1
- package/dist/cli/recap.d.ts +22 -2
- package/dist/cli/recap.d.ts.map +1 -1
- package/dist/cli/recap.js +199 -22
- package/dist/cli/recap.js.map +1 -1
- package/dist/client/AssistantChat.d.ts +3 -1
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +200 -28
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/chat/tool-call-display.js +1 -1
- package/dist/client/chat/tool-call-display.js.map +1 -1
- package/dist/client/chat/use-reconnect-reader-owner.d.ts +11 -0
- package/dist/client/chat/use-reconnect-reader-owner.d.ts.map +1 -0
- package/dist/client/chat/use-reconnect-reader-owner.js +21 -0
- package/dist/client/chat/use-reconnect-reader-owner.js.map +1 -0
- package/dist/client/guided-questions.d.ts.map +1 -1
- package/dist/client/guided-questions.js +5 -1
- package/dist/client/guided-questions.js.map +1 -1
- package/dist/client/integrations/IntegrationsPanel.d.ts.map +1 -1
- package/dist/client/integrations/IntegrationsPanel.js +5 -7
- package/dist/client/integrations/IntegrationsPanel.js.map +1 -1
- package/dist/client/settings/UsageSection.d.ts.map +1 -1
- package/dist/client/settings/UsageSection.js +12 -3
- package/dist/client/settings/UsageSection.js.map +1 -1
- package/dist/client/sse-event-processor.d.ts.map +1 -1
- package/dist/client/sse-event-processor.js +67 -20
- package/dist/client/sse-event-processor.js.map +1 -1
- package/dist/collab/routes.d.ts +1 -1
- package/dist/collab/struct-routes.d.ts +1 -1
- package/dist/connections/catalog.d.ts +2 -2
- package/dist/connections/catalog.js +2 -2
- package/dist/connections/catalog.js.map +1 -1
- package/dist/deploy/build.d.ts.map +1 -1
- package/dist/deploy/build.js +3 -1
- package/dist/deploy/build.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/integrations/catalog.js +2 -2
- package/dist/integrations/catalog.js.map +1 -1
- package/dist/notifications/routes.d.ts +2 -2
- package/dist/observability/routes.d.ts +1 -1
- package/dist/provider-api/corpus-jobs.d.ts +2 -2
- package/dist/resources/handlers.d.ts +1 -1
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/dist/server/auth.js +1 -1
- package/dist/server/auth.js.map +1 -1
- package/dist/server/credential-provider.d.ts +5 -3
- package/dist/server/credential-provider.d.ts.map +1 -1
- package/dist/server/credential-provider.js +7 -3
- package/dist/server/credential-provider.js.map +1 -1
- package/dist/shared/cache-control.d.ts +8 -6
- package/dist/shared/cache-control.d.ts.map +1 -1
- package/dist/shared/cache-control.js +8 -3
- package/dist/shared/cache-control.js.map +1 -1
- package/dist/usage/store.d.ts +21 -0
- package/dist/usage/store.d.ts.map +1 -1
- package/dist/usage/store.js +54 -19
- package/dist/usage/store.js.map +1 -1
- package/docs/content/locales/ar-SA/template-design.mdx +13 -0
- package/docs/content/locales/de-DE/template-design.mdx +18 -0
- package/docs/content/locales/es-ES/template-design.mdx +16 -0
- package/docs/content/locales/fr-FR/template-design.mdx +17 -0
- package/docs/content/locales/hi-IN/template-design.mdx +16 -0
- package/docs/content/locales/ja-JP/template-design.mdx +17 -0
- package/docs/content/locales/ko-KR/template-design.mdx +15 -0
- package/docs/content/locales/pt-BR/template-design.mdx +16 -0
- package/docs/content/locales/zh-CN/template-design.mdx +11 -0
- package/docs/content/locales/zh-TW/template-design.mdx +12 -0
- package/docs/content/pr-visual-recap.mdx +20 -12
- package/docs/content/template-design.mdx +16 -0
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UsageSection.js","sourceRoot":"","sources":["../../../src/client/settings/UsageSection.tsx"],"names":[],"mappings":"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","sourcesContent":["import { IconLoader2, IconRefresh } from \"@tabler/icons-react\";\nimport { useEffect, useState } from \"react\";\n\nimport { agentNativePath } from \"../api-path.js\";\n\ninterface UsageBucket {\n key: string;\n cents: number;\n calls: number;\n inputTokens: number;\n outputTokens: number;\n cacheReadTokens: number;\n cacheWriteTokens: number;\n}\n\ninterface DailyBucket {\n date: string;\n cents: number;\n calls: number;\n}\n\ninterface UsageRecentEntry {\n id: number;\n createdAt: number;\n label: string;\n app: string;\n model: string;\n inputTokens: number;\n outputTokens: number;\n cacheReadTokens: number;\n cacheWriteTokens: number;\n cents: number;\n}\n\ninterface UsageBillingMode {\n unit: \"usd\" | \"builder-credits\";\n label: string;\n shortLabel: string;\n source: \"estimated-provider-cost\" | \"builder-agent-credits\";\n hardCostMarginMultiplier?: number;\n creditsPerUsd?: number;\n}\n\ninterface UsageSummary {\n billing?: UsageBillingMode;\n totalCents: number;\n totalCalls: number;\n totalInputTokens: number;\n totalOutputTokens: number;\n totalCacheReadTokens: number;\n totalCacheWriteTokens: number;\n sinceMs: number;\n byLabel: UsageBucket[];\n byModel: UsageBucket[];\n byApp: UsageBucket[];\n byDay: DailyBucket[];\n recent: UsageRecentEntry[];\n}\n\nconst RANGES = [\n { value: 1, label: \"24h\" },\n { value: 7, label: \"7d\" },\n { value: 30, label: \"30d\" },\n { value: 90, label: \"90d\" },\n];\n\nconst USD_BILLING: UsageBillingMode = {\n unit: \"usd\",\n label: \"Estimated spend\",\n shortLabel: \"Cost\",\n source: \"estimated-provider-cost\",\n};\n\nfunction displayAmountFromCostCents(\n cents: number,\n billing: UsageBillingMode,\n): number {\n if (billing.unit !== \"builder-credits\") return cents;\n const margin = billing.hardCostMarginMultiplier ?? 1.25;\n const creditsPerUsd = billing.creditsPerUsd ?? 20;\n const credits = (cents / 100) * margin * creditsPerUsd;\n return credits <= 0 ? 0 : Math.ceil(credits * 1000) / 1000;\n}\n\nfunction formatCredits(credits: number): string {\n if (!Number.isFinite(credits) || credits === 0) return \"0 credits\";\n const maximumFractionDigits = credits < 1 ? 3 : credits < 10 ? 2 : 1;\n const value = credits.toLocaleString(undefined, {\n maximumFractionDigits,\n });\n return `${value} ${credits === 1 ? \"credit\" : \"credits\"}`;\n}\n\nfunction formatSpend(cents: number, billing: UsageBillingMode): string {\n if (billing.unit === \"builder-credits\") {\n return formatCredits(displayAmountFromCostCents(cents, billing));\n }\n // Sub-cent values (e.g. a single LLM call at $0.0045 = 0.45¢) — keep\n // three decimals so tiny calls don't round to 0.00¢. The prior impl\n // multiplied by 100 in this branch, overstating small costs 100×.\n if (cents < 1) return `${cents.toFixed(3)}¢`;\n if (cents < 100) return `${cents.toFixed(2)}¢`;\n return `$${(cents / 100).toFixed(2)}`;\n}\n\nfunction formatTokens(n: number): string {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1_000) return `${(n / 1_000).toFixed(1)}K`;\n return String(n);\n}\n\nfunction BucketBars({\n buckets,\n emptyMessage,\n billing,\n}: {\n buckets: UsageBucket[];\n emptyMessage: string;\n billing: UsageBillingMode;\n}) {\n if (buckets.length === 0) {\n return (\n <p className=\"text-[10px] text-muted-foreground py-1.5\">{emptyMessage}</p>\n );\n }\n const max = Math.max(\n ...buckets.map((b) => displayAmountFromCostCents(b.cents, billing)),\n 0.0001,\n );\n return (\n <div className=\"space-y-1\">\n {buckets.map((b) => (\n <div key={b.key} className=\"text-[10px]\">\n <div className=\"flex items-center justify-between gap-2 mb-0.5\">\n <span\n className=\"truncate text-foreground\"\n title={b.key || \"(none)\"}\n >\n {b.key || \"(none)\"}\n </span>\n <span className=\"shrink-0 text-muted-foreground tabular-nums\">\n {formatSpend(b.cents, billing)}\n <span className=\"ms-1 opacity-60\">\n · {formatTokens(b.inputTokens + b.outputTokens)} tok\n </span>\n </span>\n </div>\n <div className=\"h-1 rounded-full bg-accent/40 overflow-hidden\">\n <div\n className=\"h-full bg-foreground/70\"\n style={{\n width: `${(displayAmountFromCostCents(b.cents, billing) / max) * 100}%`,\n }}\n />\n </div>\n </div>\n ))}\n </div>\n );\n}\n\nfunction DailySparkline({\n days,\n billing,\n}: {\n days: DailyBucket[];\n billing: UsageBillingMode;\n}) {\n if (days.length === 0) return null;\n const max = Math.max(\n ...days.map((d) => displayAmountFromCostCents(d.cents, billing)),\n 0.0001,\n );\n return (\n <div className=\"flex items-end gap-[2px] h-8 pt-2\">\n {days.map((d) => (\n <div\n key={d.date}\n className=\"flex-1 bg-foreground/60 rounded-sm min-h-[1px]\"\n style={{\n height: `${Math.max(\n 2,\n (displayAmountFromCostCents(d.cents, billing) / max) * 100,\n )}%`,\n }}\n title={`${d.date}: ${formatSpend(d.cents, billing)} (${d.calls} calls)`}\n />\n ))}\n </div>\n );\n}\n\nexport function UsageSection() {\n const [days, setDays] = useState(30);\n const [data, setData] = useState<UsageSummary | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const billing = data?.billing ?? USD_BILLING;\n\n const load = async (rangeDays: number) => {\n setLoading(true);\n setError(null);\n try {\n const res = await fetch(\n agentNativePath(`/_agent-native/usage?sinceDays=${rangeDays}`),\n );\n if (!res.ok) {\n throw new Error(`Failed (${res.status})`);\n }\n const json = (await res.json()) as UsageSummary;\n setData(json);\n } catch (err: any) {\n setError(err?.message || \"Failed to load usage\");\n } finally {\n setLoading(false);\n }\n };\n\n useEffect(() => {\n load(days);\n }, [days]);\n\n return (\n <div className=\"space-y-3\">\n {/* Range selector + refresh */}\n <div className=\"flex items-center justify-between\">\n <div className=\"flex gap-1 rounded-md border border-border p-0.5\">\n {RANGES.map((r) => (\n <button\n key={r.value}\n onClick={() => setDays(r.value)}\n className={`px-2 py-0.5 text-[10px] rounded ${\n days === r.value\n ? \"bg-accent text-foreground\"\n : \"text-muted-foreground hover:text-foreground\"\n }`}\n >\n {r.label}\n </button>\n ))}\n </div>\n <button\n onClick={() => load(days)}\n className=\"flex items-center gap-1 text-[10px] text-muted-foreground hover:text-foreground\"\n disabled={loading}\n >\n {loading ? (\n <IconLoader2 size={11} className=\"animate-spin\" />\n ) : (\n <IconRefresh size={11} />\n )}\n </button>\n </div>\n\n {error && <p className=\"text-[10px] text-red-500\">{error}</p>}\n\n {data && (\n <>\n {/* Totals */}\n <div className=\"rounded-md border border-border px-2.5 py-2\">\n <div className=\"flex items-baseline justify-between\">\n <div>\n <div className=\"text-[10px] text-muted-foreground\">\n {billing.unit === \"builder-credits\"\n ? \"Builder.io credit spend\"\n : \"Total spend\"}\n </div>\n <div className=\"text-[18px] font-semibold tabular-nums\">\n {formatSpend(data.totalCents, billing)}\n </div>\n </div>\n <div className=\"text-end\">\n <div className=\"text-[10px] text-muted-foreground\">\n {data.totalCalls} calls\n </div>\n <div className=\"text-[10px] text-muted-foreground\">\n {formatTokens(data.totalInputTokens)} in ·{\" \"}\n {formatTokens(data.totalOutputTokens)} out\n </div>\n {data.totalCacheReadTokens > 0 && (\n <div className=\"text-[10px] text-green-500/80\">\n {formatTokens(data.totalCacheReadTokens)} cached\n </div>\n )}\n </div>\n </div>\n <DailySparkline days={data.byDay} billing={billing} />\n </div>\n\n {/* By label */}\n <div>\n <div className=\"text-[10px] font-medium text-foreground mb-1\">\n By label\n </div>\n <BucketBars\n buckets={data.byLabel}\n emptyMessage=\"No labeled calls yet.\"\n billing={billing}\n />\n </div>\n\n {/* By model */}\n <div>\n <div className=\"text-[10px] font-medium text-foreground mb-1\">\n By model\n </div>\n <BucketBars\n buckets={data.byModel}\n emptyMessage=\"No calls recorded.\"\n billing={billing}\n />\n </div>\n\n {/* By app — only show when multiple apps contribute */}\n {data.byApp.filter((b) => b.key).length > 1 && (\n <div>\n <div className=\"text-[10px] font-medium text-foreground mb-1\">\n By app\n </div>\n <BucketBars\n buckets={data.byApp}\n emptyMessage=\"\"\n billing={billing}\n />\n </div>\n )}\n\n {/* Recent calls */}\n {data.recent.length > 0 && (\n <details>\n <summary className=\"text-[10px] font-medium text-foreground cursor-pointer select-none hover:text-foreground/80\">\n Recent calls ({data.recent.length})\n </summary>\n <div className=\"mt-1.5 max-h-48 overflow-y-auto space-y-0.5 rounded border border-border\">\n {data.recent.map((r) => (\n <div\n key={r.id}\n className=\"flex items-center justify-between gap-2 px-2 py-1 text-[10px] border-b border-border last:border-b-0\"\n >\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-foreground\" title={r.label}>\n {r.label}\n {r.app ? (\n <span className=\"text-muted-foreground\">\n {\" \"}\n · {r.app}\n </span>\n ) : null}\n </div>\n <div className=\"truncate text-muted-foreground\">\n {new Date(r.createdAt).toLocaleString()} · {r.model}\n </div>\n </div>\n <div className=\"shrink-0 text-end tabular-nums text-muted-foreground\">\n {formatSpend(r.cents, billing)}\n </div>\n </div>\n ))}\n </div>\n </details>\n )}\n\n {billing.unit === \"builder-credits\" ? (\n <p className=\"text-[10px] text-muted-foreground\">\n Builder.io credits are estimated from hard token cost, a{\" \"}\n {billing.hardCostMarginMultiplier ?? 1.25}x margin, and{\" \"}\n {billing.creditsPerUsd ?? 20} credits per dollar.\n </p>\n ) : (\n <p className=\"text-[10px] text-muted-foreground\">\n Spend is estimated from published Anthropic pricing and your own\n recorded token counts. Cached input is priced at ~10% of regular\n input.\n </p>\n )}\n </>\n )}\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"UsageSection.js","sourceRoot":"","sources":["../../../src/client/settings/UsageSection.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE5C,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAiEjD,MAAM,MAAM,GAAG;IACb,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE;IAC1B,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE;IACzB,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE;IAC3B,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE;CAC5B,CAAC;AAEF,MAAM,WAAW,GAAqB;IACpC,IAAI,EAAE,KAAK;IACX,KAAK,EAAE,iBAAiB;IACxB,UAAU,EAAE,MAAM;IAClB,MAAM,EAAE,yBAAyB;CAClC,CAAC;AAEF,SAAS,0BAA0B,CACjC,KAAa,EACb,OAAyB;IAEzB,IAAI,OAAO,CAAC,IAAI,KAAK,iBAAiB;QAAE,OAAO,KAAK,CAAC;IACrD,MAAM,MAAM,GAAG,OAAO,CAAC,wBAAwB,IAAI,IAAI,CAAC;IACxD,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,EAAE,CAAC;IAClD,MAAM,OAAO,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,MAAM,GAAG,aAAa,CAAC;IACvD,OAAO,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;AAC7D,CAAC;AAED,SAAS,aAAa,CAAC,OAAe;IACpC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,KAAK,CAAC;QAAE,OAAO,WAAW,CAAC;IACnE,MAAM,qBAAqB,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrE,MAAM,KAAK,GAAG,OAAO,CAAC,cAAc,CAAC,SAAS,EAAE;QAC9C,qBAAqB;KACtB,CAAC,CAAC;IACH,OAAO,GAAG,KAAK,IAAI,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;AAC5D,CAAC;AAED,SAAS,WAAW,CAAC,KAAa,EAAE,OAAyB;IAC3D,IAAI,OAAO,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;QACvC,OAAO,aAAa,CAAC,0BAA0B,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;IACnE,CAAC;IACD,qEAAqE;IACrE,oEAAoE;IACpE,kEAAkE;IAClE,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IAC7C,IAAI,KAAK,GAAG,GAAG;QAAE,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IAC/C,OAAO,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;AACxC,CAAC;AAED,SAAS,mBAAmB,CAC1B,IAAwB,EACxB,OAAyB;IAEzB,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO;QAAE,OAAO,WAAW,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAC1E,IAAI,IAAI,CAAC,MAAM,KAAK,aAAa;QAAE,OAAO,SAAS,CAAC;IACpD,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,MAAM,IAAI,CAAC,gBAAgB,WAAW,CAAC;AACxF,CAAC;AAED,SAAS,YAAY,CAAC,CAAS;IAC7B,IAAI,CAAC,IAAI,SAAS;QAAE,OAAO,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IAC5D,IAAI,CAAC,IAAI,KAAK;QAAE,OAAO,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IACpD,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;AACnB,CAAC;AAED,SAAS,UAAU,CAAC,EAClB,OAAO,EACP,YAAY,EACZ,OAAO,GAKR;IACC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CACL,YAAG,SAAS,EAAC,0CAA0C,YAAE,YAAY,GAAK,CAC3E,CAAC;IACJ,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAClB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,0BAA0B,CAAC,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,EACnE,MAAM,CACP,CAAC;IACF,OAAO,CACL,cAAK,SAAS,EAAC,WAAW,YACvB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAClB,eAAiB,SAAS,EAAC,aAAa,aACtC,eAAK,SAAS,EAAC,gDAAgD,aAC7D,eACE,SAAS,EAAC,0BAA0B,EACpC,KAAK,EAAE,CAAC,CAAC,GAAG,IAAI,QAAQ,YAEvB,CAAC,CAAC,GAAG,IAAI,QAAQ,GACb,EACP,gBAAM,SAAS,EAAC,6CAA6C,aAC1D,mBAAmB,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,EACrC,gBAAM,SAAS,EAAC,iBAAiB,wBAC5B,YAAY,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,YAAY,CAAC,YAC1C,IACF,IACH,EACN,cAAK,SAAS,EAAC,+CAA+C,YAC5D,cACE,SAAS,EAAC,yBAAyB,EACnC,KAAK,EAAE;4BACL,KAAK,EAAE,GAAG,CAAC,0BAA0B,CAAC,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG;yBACxE,GACD,GACE,KAtBE,CAAC,CAAC,GAAG,CAuBT,CACP,CAAC,GACE,CACP,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,EACtB,IAAI,EACJ,OAAO,GAIR;IACC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAClB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,0BAA0B,CAAC,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,EAChE,MAAM,CACP,CAAC;IACF,OAAO,CACL,cAAK,SAAS,EAAC,mCAAmC,YAC/C,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CACf,cAEE,SAAS,EAAC,gDAAgD,EAC1D,KAAK,EAAE;gBACL,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CACjB,CAAC,EACD,CAAC,0BAA0B,CAAC,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAC3D,GAAG;aACL,EACD,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,KAAK,mBAAmB,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,KAAK,SAAS,IARzE,CAAC,CAAC,IAAI,CASX,CACH,CAAC,GACE,CACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACrC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAsB,IAAI,CAAC,CAAC;IAC5D,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IACxD,MAAM,OAAO,GAAG,IAAI,EAAE,OAAO,IAAI,WAAW,CAAC;IAE7C,MAAM,IAAI,GAAG,KAAK,EAAE,SAAiB,EAAE,EAAE;QACvC,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CACrB,eAAe,CAAC,kCAAkC,SAAS,EAAE,CAAC,CAC/D,CAAC;YACF,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBACZ,MAAM,IAAI,KAAK,CAAC,WAAW,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;YAC5C,CAAC;YACD,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAiB,CAAC;YAChD,OAAO,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,QAAQ,CAAC,GAAG,EAAE,OAAO,IAAI,sBAAsB,CAAC,CAAC;QACnD,CAAC;gBAAS,CAAC;YACT,UAAU,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,IAAI,CAAC,CAAC;IACb,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAEX,OAAO,CACL,eAAK,SAAS,EAAC,WAAW,aAExB,eAAK,SAAS,EAAC,mCAAmC,aAChD,cAAK,SAAS,EAAC,kDAAkD,YAC9D,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CACjB,iBAEE,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,EAC/B,SAAS,EAAE,mCACT,IAAI,KAAK,CAAC,CAAC,KAAK;gCACd,CAAC,CAAC,2BAA2B;gCAC7B,CAAC,CAAC,6CACN,EAAE,YAED,CAAC,CAAC,KAAK,IARH,CAAC,CAAC,KAAK,CASL,CACV,CAAC,GACE,EACN,iBACE,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EACzB,SAAS,EAAC,iFAAiF,EAC3F,QAAQ,EAAE,OAAO,YAEhB,OAAO,CAAC,CAAC,CAAC,CACT,KAAC,WAAW,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,cAAc,GAAG,CACnD,CAAC,CAAC,CAAC,CACF,KAAC,WAAW,IAAC,IAAI,EAAE,EAAE,GAAI,CAC1B,GACM,IACL,EAEL,KAAK,IAAI,YAAG,SAAS,EAAC,0BAA0B,YAAE,KAAK,GAAK,EAE5D,IAAI,IAAI,CACP,8BAEE,eAAK,SAAS,EAAC,6CAA6C,aAC1D,eAAK,SAAS,EAAC,qCAAqC,aAClD,0BACE,cAAK,SAAS,EAAC,mCAAmC,YAC/C,OAAO,CAAC,IAAI,KAAK,iBAAiB;oDACjC,CAAC,CAAC,yBAAyB;oDAC3B,CAAC,CAAC,aAAa,GACb,EACN,cAAK,SAAS,EAAC,wCAAwC,YACpD,mBAAmB,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,GACzC,IACF,EACN,eAAK,SAAS,EAAC,UAAU,aACvB,eAAK,SAAS,EAAC,mCAAmC,aAC/C,IAAI,CAAC,UAAU,cACZ,EACN,eAAK,SAAS,EAAC,mCAAmC,aAC/C,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC,gBAAO,GAAG,EAC7C,YAAY,CAAC,IAAI,CAAC,iBAAiB,CAAC,YACjC,EACL,IAAI,CAAC,oBAAoB,GAAG,CAAC,IAAI,CAChC,eAAK,SAAS,EAAC,+BAA+B,aAC3C,YAAY,CAAC,IAAI,CAAC,oBAAoB,CAAC,eACpC,CACP,IACG,IACF,EACN,KAAC,cAAc,IAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,GAAI,IAClD,EAGN,0BACE,cAAK,SAAS,EAAC,8CAA8C,yBAEvD,EACN,KAAC,UAAU,IACT,OAAO,EAAE,IAAI,CAAC,OAAO,EACrB,YAAY,EAAC,uBAAuB,EACpC,OAAO,EAAE,OAAO,GAChB,IACE,EAGN,0BACE,cAAK,SAAS,EAAC,8CAA8C,yBAEvD,EACN,KAAC,UAAU,IACT,OAAO,EAAE,IAAI,CAAC,OAAO,EACrB,YAAY,EAAC,oBAAoB,EACjC,OAAO,EAAE,OAAO,GAChB,IACE,EAGL,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAC7C,0BACE,cAAK,SAAS,EAAC,8CAA8C,uBAEvD,EACN,KAAC,UAAU,IACT,OAAO,EAAE,IAAI,CAAC,KAAK,EACnB,YAAY,EAAC,EAAE,EACf,OAAO,EAAE,OAAO,GAChB,IACE,CACP,EAGA,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CACzB,8BACE,mBAAS,SAAS,EAAC,6FAA6F,+BAC/F,IAAI,CAAC,MAAM,CAAC,MAAM,SACzB,EACV,cAAK,SAAS,EAAC,0EAA0E,YACtF,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CACtB,eAEE,SAAS,EAAC,sGAAsG,aAEhH,eAAK,SAAS,EAAC,gBAAgB,aAC7B,eAAK,SAAS,EAAC,0BAA0B,EAAC,KAAK,EAAE,CAAC,CAAC,KAAK,aACrD,CAAC,CAAC,KAAK,EACP,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CACP,gBAAM,SAAS,EAAC,uBAAuB,aACpC,GAAG,aACD,CAAC,CAAC,GAAG,IACH,CACR,CAAC,CAAC,CAAC,IAAI,IACJ,EACN,eAAK,SAAS,EAAC,gCAAgC,aAC5C,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,cAAc,EAAE,cAAK,CAAC,CAAC,KAAK,IAC/C,IACF,EACN,cAAK,SAAS,EAAC,sDAAsD,YAClE,CAAC,CAAC,UAAU,KAAK,aAAa;gDAC7B,CAAC,CAAC,SAAS;gDACX,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC,GAC7B,KArBD,CAAC,CAAC,EAAE,CAsBL,CACP,CAAC,GACE,IACE,CACX,EAEA,OAAO,CAAC,IAAI,KAAK,iBAAiB,CAAC,CAAC,CAAC,CACpC,aAAG,SAAS,EAAC,mCAAmC,yEACW,GAAG,EAC3D,OAAO,CAAC,wBAAwB,IAAI,IAAI,mBAAe,GAAG,EAC1D,OAAO,CAAC,aAAa,IAAI,EAAE,4BAC1B,CACL,CAAC,CAAC,CAAC,CACF,YAAG,SAAS,EAAC,mCAAmC,mPAK5C,CACL,IACA,CACJ,IACG,CACP,CAAC;AACJ,CAAC","sourcesContent":["import { IconLoader2, IconRefresh } from \"@tabler/icons-react\";\nimport { useEffect, useState } from \"react\";\n\nimport { agentNativePath } from \"../api-path.js\";\n\ninterface UsageBucket {\n key: string;\n cents: number;\n cost: UsageCostAggregate;\n calls: number;\n inputTokens: number;\n outputTokens: number;\n cacheReadTokens: number;\n cacheWriteTokens: number;\n}\n\ninterface DailyBucket {\n date: string;\n cents: number;\n cost: UsageCostAggregate;\n calls: number;\n}\n\ninterface UsageRecentEntry {\n id: number;\n createdAt: number;\n label: string;\n app: string;\n model: string;\n inputTokens: number;\n outputTokens: number;\n cacheReadTokens: number;\n cacheWriteTokens: number;\n cents: number;\n costSource: \"reported\" | \"estimated\" | \"unavailable\";\n}\n\ntype UsageCostAggregate =\n | { status: \"known\"; knownCents: number; unavailableCalls: 0 }\n | { status: \"partial\"; knownCents: number; unavailableCalls: number }\n | { status: \"unavailable\"; knownCents: 0; unavailableCalls: number };\n\ninterface UsageBillingMode {\n unit: \"usd\" | \"builder-credits\";\n label: string;\n shortLabel: string;\n source: \"estimated-provider-cost\" | \"builder-agent-credits\";\n hardCostMarginMultiplier?: number;\n creditsPerUsd?: number;\n}\n\ninterface UsageSummary {\n billing?: UsageBillingMode;\n totalCents: number;\n totalCost: UsageCostAggregate;\n totalCalls: number;\n totalInputTokens: number;\n totalOutputTokens: number;\n totalCacheReadTokens: number;\n totalCacheWriteTokens: number;\n sinceMs: number;\n byLabel: UsageBucket[];\n byModel: UsageBucket[];\n byApp: UsageBucket[];\n byDay: DailyBucket[];\n recent: UsageRecentEntry[];\n}\n\nconst RANGES = [\n { value: 1, label: \"24h\" },\n { value: 7, label: \"7d\" },\n { value: 30, label: \"30d\" },\n { value: 90, label: \"90d\" },\n];\n\nconst USD_BILLING: UsageBillingMode = {\n unit: \"usd\",\n label: \"Estimated spend\",\n shortLabel: \"Cost\",\n source: \"estimated-provider-cost\",\n};\n\nfunction displayAmountFromCostCents(\n cents: number,\n billing: UsageBillingMode,\n): number {\n if (billing.unit !== \"builder-credits\") return cents;\n const margin = billing.hardCostMarginMultiplier ?? 1.25;\n const creditsPerUsd = billing.creditsPerUsd ?? 20;\n const credits = (cents / 100) * margin * creditsPerUsd;\n return credits <= 0 ? 0 : Math.ceil(credits * 1000) / 1000;\n}\n\nfunction formatCredits(credits: number): string {\n if (!Number.isFinite(credits) || credits === 0) return \"0 credits\";\n const maximumFractionDigits = credits < 1 ? 3 : credits < 10 ? 2 : 1;\n const value = credits.toLocaleString(undefined, {\n maximumFractionDigits,\n });\n return `${value} ${credits === 1 ? \"credit\" : \"credits\"}`;\n}\n\nfunction formatSpend(cents: number, billing: UsageBillingMode): string {\n if (billing.unit === \"builder-credits\") {\n return formatCredits(displayAmountFromCostCents(cents, billing));\n }\n // Sub-cent values (e.g. a single LLM call at $0.0045 = 0.45¢) — keep\n // three decimals so tiny calls don't round to 0.00¢. The prior impl\n // multiplied by 100 in this branch, overstating small costs 100×.\n if (cents < 1) return `${cents.toFixed(3)}¢`;\n if (cents < 100) return `${cents.toFixed(2)}¢`;\n return `$${(cents / 100).toFixed(2)}`;\n}\n\nfunction formatAggregateCost(\n cost: UsageCostAggregate,\n billing: UsageBillingMode,\n): string {\n if (cost.status === \"known\") return formatSpend(cost.knownCents, billing);\n if (cost.status === \"unavailable\") return \"Unknown\";\n return `${formatSpend(cost.knownCents, billing)} + ${cost.unavailableCalls} unpriced`;\n}\n\nfunction formatTokens(n: number): string {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1_000) return `${(n / 1_000).toFixed(1)}K`;\n return String(n);\n}\n\nfunction BucketBars({\n buckets,\n emptyMessage,\n billing,\n}: {\n buckets: UsageBucket[];\n emptyMessage: string;\n billing: UsageBillingMode;\n}) {\n if (buckets.length === 0) {\n return (\n <p className=\"text-[10px] text-muted-foreground py-1.5\">{emptyMessage}</p>\n );\n }\n const max = Math.max(\n ...buckets.map((b) => displayAmountFromCostCents(b.cents, billing)),\n 0.0001,\n );\n return (\n <div className=\"space-y-1\">\n {buckets.map((b) => (\n <div key={b.key} className=\"text-[10px]\">\n <div className=\"flex items-center justify-between gap-2 mb-0.5\">\n <span\n className=\"truncate text-foreground\"\n title={b.key || \"(none)\"}\n >\n {b.key || \"(none)\"}\n </span>\n <span className=\"shrink-0 text-muted-foreground tabular-nums\">\n {formatAggregateCost(b.cost, billing)}\n <span className=\"ms-1 opacity-60\">\n · {formatTokens(b.inputTokens + b.outputTokens)} tok\n </span>\n </span>\n </div>\n <div className=\"h-1 rounded-full bg-accent/40 overflow-hidden\">\n <div\n className=\"h-full bg-foreground/70\"\n style={{\n width: `${(displayAmountFromCostCents(b.cents, billing) / max) * 100}%`,\n }}\n />\n </div>\n </div>\n ))}\n </div>\n );\n}\n\nfunction DailySparkline({\n days,\n billing,\n}: {\n days: DailyBucket[];\n billing: UsageBillingMode;\n}) {\n if (days.length === 0) return null;\n const max = Math.max(\n ...days.map((d) => displayAmountFromCostCents(d.cents, billing)),\n 0.0001,\n );\n return (\n <div className=\"flex items-end gap-[2px] h-8 pt-2\">\n {days.map((d) => (\n <div\n key={d.date}\n className=\"flex-1 bg-foreground/60 rounded-sm min-h-[1px]\"\n style={{\n height: `${Math.max(\n 2,\n (displayAmountFromCostCents(d.cents, billing) / max) * 100,\n )}%`,\n }}\n title={`${d.date}: ${formatAggregateCost(d.cost, billing)} (${d.calls} calls)`}\n />\n ))}\n </div>\n );\n}\n\nexport function UsageSection() {\n const [days, setDays] = useState(30);\n const [data, setData] = useState<UsageSummary | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const billing = data?.billing ?? USD_BILLING;\n\n const load = async (rangeDays: number) => {\n setLoading(true);\n setError(null);\n try {\n const res = await fetch(\n agentNativePath(`/_agent-native/usage?sinceDays=${rangeDays}`),\n );\n if (!res.ok) {\n throw new Error(`Failed (${res.status})`);\n }\n const json = (await res.json()) as UsageSummary;\n setData(json);\n } catch (err: any) {\n setError(err?.message || \"Failed to load usage\");\n } finally {\n setLoading(false);\n }\n };\n\n useEffect(() => {\n load(days);\n }, [days]);\n\n return (\n <div className=\"space-y-3\">\n {/* Range selector + refresh */}\n <div className=\"flex items-center justify-between\">\n <div className=\"flex gap-1 rounded-md border border-border p-0.5\">\n {RANGES.map((r) => (\n <button\n key={r.value}\n onClick={() => setDays(r.value)}\n className={`px-2 py-0.5 text-[10px] rounded ${\n days === r.value\n ? \"bg-accent text-foreground\"\n : \"text-muted-foreground hover:text-foreground\"\n }`}\n >\n {r.label}\n </button>\n ))}\n </div>\n <button\n onClick={() => load(days)}\n className=\"flex items-center gap-1 text-[10px] text-muted-foreground hover:text-foreground\"\n disabled={loading}\n >\n {loading ? (\n <IconLoader2 size={11} className=\"animate-spin\" />\n ) : (\n <IconRefresh size={11} />\n )}\n </button>\n </div>\n\n {error && <p className=\"text-[10px] text-red-500\">{error}</p>}\n\n {data && (\n <>\n {/* Totals */}\n <div className=\"rounded-md border border-border px-2.5 py-2\">\n <div className=\"flex items-baseline justify-between\">\n <div>\n <div className=\"text-[10px] text-muted-foreground\">\n {billing.unit === \"builder-credits\"\n ? \"Builder.io credit spend\"\n : \"Total spend\"}\n </div>\n <div className=\"text-[18px] font-semibold tabular-nums\">\n {formatAggregateCost(data.totalCost, billing)}\n </div>\n </div>\n <div className=\"text-end\">\n <div className=\"text-[10px] text-muted-foreground\">\n {data.totalCalls} calls\n </div>\n <div className=\"text-[10px] text-muted-foreground\">\n {formatTokens(data.totalInputTokens)} in ·{\" \"}\n {formatTokens(data.totalOutputTokens)} out\n </div>\n {data.totalCacheReadTokens > 0 && (\n <div className=\"text-[10px] text-green-500/80\">\n {formatTokens(data.totalCacheReadTokens)} cached\n </div>\n )}\n </div>\n </div>\n <DailySparkline days={data.byDay} billing={billing} />\n </div>\n\n {/* By label */}\n <div>\n <div className=\"text-[10px] font-medium text-foreground mb-1\">\n By label\n </div>\n <BucketBars\n buckets={data.byLabel}\n emptyMessage=\"No labeled calls yet.\"\n billing={billing}\n />\n </div>\n\n {/* By model */}\n <div>\n <div className=\"text-[10px] font-medium text-foreground mb-1\">\n By model\n </div>\n <BucketBars\n buckets={data.byModel}\n emptyMessage=\"No calls recorded.\"\n billing={billing}\n />\n </div>\n\n {/* By app — only show when multiple apps contribute */}\n {data.byApp.filter((b) => b.key).length > 1 && (\n <div>\n <div className=\"text-[10px] font-medium text-foreground mb-1\">\n By app\n </div>\n <BucketBars\n buckets={data.byApp}\n emptyMessage=\"\"\n billing={billing}\n />\n </div>\n )}\n\n {/* Recent calls */}\n {data.recent.length > 0 && (\n <details>\n <summary className=\"text-[10px] font-medium text-foreground cursor-pointer select-none hover:text-foreground/80\">\n Recent calls ({data.recent.length})\n </summary>\n <div className=\"mt-1.5 max-h-48 overflow-y-auto space-y-0.5 rounded border border-border\">\n {data.recent.map((r) => (\n <div\n key={r.id}\n className=\"flex items-center justify-between gap-2 px-2 py-1 text-[10px] border-b border-border last:border-b-0\"\n >\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-foreground\" title={r.label}>\n {r.label}\n {r.app ? (\n <span className=\"text-muted-foreground\">\n {\" \"}\n · {r.app}\n </span>\n ) : null}\n </div>\n <div className=\"truncate text-muted-foreground\">\n {new Date(r.createdAt).toLocaleString()} · {r.model}\n </div>\n </div>\n <div className=\"shrink-0 text-end tabular-nums text-muted-foreground\">\n {r.costSource === \"unavailable\"\n ? \"Unknown\"\n : formatSpend(r.cents, billing)}\n </div>\n </div>\n ))}\n </div>\n </details>\n )}\n\n {billing.unit === \"builder-credits\" ? (\n <p className=\"text-[10px] text-muted-foreground\">\n Builder.io credits are estimated from hard token cost, a{\" \"}\n {billing.hardCostMarginMultiplier ?? 1.25}x margin, and{\" \"}\n {billing.creditsPerUsd ?? 20} credits per dollar.\n </p>\n ) : (\n <p className=\"text-[10px] text-muted-foreground\">\n Spend is estimated from published Anthropic pricing and your own\n recorded token counts. Cached input is priced at ~10% of regular\n input. Calls without provider pricing are marked unknown and\n excluded from known-cost subtotals.\n </p>\n )}\n </>\n )}\n </div>\n );\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sse-event-processor.d.ts","sourceRoot":"","sources":["../../src/client/sse-event-processor.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"sse-event-processor.d.ts","sourceRoot":"","sources":["../../src/client/sse-event-processor.ts"],"names":[],"mappings":"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"}
|
|
@@ -61,13 +61,6 @@ function sseActionPreparationStallTimeoutMs(options) {
|
|
|
61
61
|
? SSE_DURABLE_ACTION_PREPARATION_STALL_TIMEOUT_MS
|
|
62
62
|
: SSE_ACTION_PREPARATION_STALL_TIMEOUT_MS;
|
|
63
63
|
}
|
|
64
|
-
function formatProgressBytes(bytes) {
|
|
65
|
-
if (bytes < 1024)
|
|
66
|
-
return `${bytes} B`;
|
|
67
|
-
if (bytes < 1024 * 1024)
|
|
68
|
-
return `${(bytes / 1024).toFixed(1)} KB`;
|
|
69
|
-
return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
|
|
70
|
-
}
|
|
71
64
|
function activityProgressBytes(ev) {
|
|
72
65
|
return typeof ev.progressBytes === "number" &&
|
|
73
66
|
Number.isFinite(ev.progressBytes) &&
|
|
@@ -103,7 +96,7 @@ function preparationActivityLabel(tool, progressBytes) {
|
|
|
103
96
|
if (progressBytes <= 0) {
|
|
104
97
|
return `Preparing ${action}...`;
|
|
105
98
|
}
|
|
106
|
-
return `Writing ${action}
|
|
99
|
+
return `Writing ${action}...`;
|
|
107
100
|
}
|
|
108
101
|
function visibleActivityLabel(ev, tool) {
|
|
109
102
|
const progressBytes = activityProgressBytes(ev);
|
|
@@ -117,14 +110,9 @@ function findPendingToolCallIndex(content, toolName, toolCallId) {
|
|
|
117
110
|
// calls can be in flight simultaneously, and name-only matching would
|
|
118
111
|
// attach a result to the wrong call.
|
|
119
112
|
if (toolCallId) {
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
part.toolCallId === toolCallId &&
|
|
124
|
-
part.result === undefined) {
|
|
125
|
-
return i;
|
|
126
|
-
}
|
|
127
|
-
}
|
|
113
|
+
const exactIndex = findPendingToolCallIndexById(content, toolCallId);
|
|
114
|
+
if (exactIndex >= 0)
|
|
115
|
+
return exactIndex;
|
|
128
116
|
// Fall through to name-matching: the start event may have arrived before
|
|
129
117
|
// the server started emitting ids (e.g. older server build), so the
|
|
130
118
|
// stored toolCallId is the locally-generated "tc_N" value rather than the
|
|
@@ -140,6 +128,56 @@ function findPendingToolCallIndex(content, toolName, toolCallId) {
|
|
|
140
128
|
}
|
|
141
129
|
return -1;
|
|
142
130
|
}
|
|
131
|
+
function findPendingToolCallIndexById(content, toolCallId) {
|
|
132
|
+
for (let i = content.length - 1; i >= 0; i--) {
|
|
133
|
+
const part = content[i];
|
|
134
|
+
if (part.type === "tool-call" &&
|
|
135
|
+
part.toolCallId === toolCallId &&
|
|
136
|
+
part.result === undefined) {
|
|
137
|
+
return i;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return -1;
|
|
141
|
+
}
|
|
142
|
+
function findOldestPendingActivityToolCallIndex(content, toolName) {
|
|
143
|
+
for (let i = 0; i < content.length; i += 1) {
|
|
144
|
+
const part = content[i];
|
|
145
|
+
if (part.type === "tool-call" &&
|
|
146
|
+
part.toolName === toolName &&
|
|
147
|
+
part.activity === true &&
|
|
148
|
+
part.result === undefined) {
|
|
149
|
+
return i;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return -1;
|
|
153
|
+
}
|
|
154
|
+
function findPendingActivityToolCallIndex(content, toolName, toolCallId) {
|
|
155
|
+
if (!toolCallId) {
|
|
156
|
+
return findPendingToolCallIndex(content, toolName);
|
|
157
|
+
}
|
|
158
|
+
// Activity events emitted while the model is assembling tool input already
|
|
159
|
+
// carry the engine's stable call id. Match that id exactly so repeated
|
|
160
|
+
// progress for one call updates one placeholder while parallel same-name
|
|
161
|
+
// calls retain separate cards.
|
|
162
|
+
const exactIndex = findPendingToolCallIndexById(content, toolCallId);
|
|
163
|
+
if (exactIndex >= 0)
|
|
164
|
+
return exactIndex;
|
|
165
|
+
// Older activity events may omit the id before a later progress event adds
|
|
166
|
+
// it. Upgrade one unambiguous reader-local placeholder instead of painting a
|
|
167
|
+
// second card for the same logical call.
|
|
168
|
+
const readerLocalCandidates = [];
|
|
169
|
+
for (let i = 0; i < content.length; i += 1) {
|
|
170
|
+
const part = content[i];
|
|
171
|
+
if (part.type === "tool-call" &&
|
|
172
|
+
part.toolName === toolName &&
|
|
173
|
+
part.activity === true &&
|
|
174
|
+
part.result === undefined &&
|
|
175
|
+
/^tc_\d+$/.test(part.toolCallId)) {
|
|
176
|
+
readerLocalCandidates.push(i);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
return readerLocalCandidates.length === 1 ? readerLocalCandidates[0] : -1;
|
|
180
|
+
}
|
|
143
181
|
function findCompletedToolCallIndex(content, toolCallId) {
|
|
144
182
|
if (!toolCallId)
|
|
145
183
|
return -1;
|
|
@@ -687,7 +725,13 @@ export function processEvent(ev, content, toolCallCounter, tabId, state) {
|
|
|
687
725
|
}
|
|
688
726
|
if (!tool)
|
|
689
727
|
return { action: "continue" };
|
|
690
|
-
const pendingToolCallIndex =
|
|
728
|
+
const pendingToolCallIndex = findPendingActivityToolCallIndex(content, tool, ev.id);
|
|
729
|
+
if (pendingToolCallIndex >= 0 && ev.id) {
|
|
730
|
+
const pending = content[pendingToolCallIndex];
|
|
731
|
+
if (pending?.type === "tool-call" && pending.toolCallId !== ev.id) {
|
|
732
|
+
content[pendingToolCallIndex] = { ...pending, toolCallId: ev.id };
|
|
733
|
+
}
|
|
734
|
+
}
|
|
691
735
|
if (pendingToolCallIndex === -1) {
|
|
692
736
|
// Only surface a placeholder spinner when this tool has no card yet. A
|
|
693
737
|
// trailing activity heartbeat that arrives after the matching tool_done
|
|
@@ -696,11 +740,12 @@ export function processEvent(ev, content, toolCallCounter, tabId, state) {
|
|
|
696
740
|
// flicker. The real card reappears on the next tool_start regardless.
|
|
697
741
|
const hasCompletedSameTool = content.some((part) => part.type === "tool-call" &&
|
|
698
742
|
part.toolName === tool &&
|
|
699
|
-
part.result !== undefined
|
|
743
|
+
part.result !== undefined &&
|
|
744
|
+
(!ev.id || part.toolCallId === ev.id));
|
|
700
745
|
if (!hasCompletedSameTool) {
|
|
701
746
|
content.push({
|
|
702
747
|
type: "tool-call",
|
|
703
|
-
toolCallId: `tc_${++toolCallCounter.value}`,
|
|
748
|
+
toolCallId: ev.id ?? `tc_${++toolCallCounter.value}`,
|
|
704
749
|
toolName: tool,
|
|
705
750
|
argsText: "",
|
|
706
751
|
args: {},
|
|
@@ -733,7 +778,9 @@ export function processEvent(ev, content, toolCallCounter, tabId, state) {
|
|
|
733
778
|
}
|
|
734
779
|
// Pass the server-assigned id so we upgrade the pending activity card
|
|
735
780
|
// using id-match when available (parallel same-name calls stay separate).
|
|
736
|
-
const pendingToolCallIndex =
|
|
781
|
+
const pendingToolCallIndex = ev.id
|
|
782
|
+
? findPendingActivityToolCallIndex(content, tool, ev.id)
|
|
783
|
+
: findOldestPendingActivityToolCallIndex(content, tool);
|
|
737
784
|
const pendingToolCall = pendingToolCallIndex >= 0 ? content[pendingToolCallIndex] : undefined;
|
|
738
785
|
const pendingIsActivityPlaceholder = pendingToolCall?.type === "tool-call" &&
|
|
739
786
|
pendingToolCall.activity === true &&
|