@dotobokuri/fleet-console 1.39.0 → 1.41.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -3
- package/dist/cli.d.ts +2 -1
- package/dist/cli.mjs +152 -1182
- package/dist/client/assets/{_baseUniq-BDfju2rW.js → _baseUniq-CImzMrtU.js} +1 -1
- package/dist/client/assets/{arc-DWcMv-ui.js → arc-CKb0rHjN.js} +1 -1
- package/dist/client/assets/{architectureDiagram-Q4EWVU46-DhPv_Uba.js → architectureDiagram-Q4EWVU46-BaZipXSe.js} +1 -1
- package/dist/client/assets/{blockDiagram-DXYQGD6D-D7RYcNDP.js → blockDiagram-DXYQGD6D-D4sS9TjR.js} +1 -1
- package/dist/client/assets/{c4Diagram-AHTNJAMY-9_4dQBo3.js → c4Diagram-AHTNJAMY-DvjpMsKx.js} +1 -1
- package/dist/client/assets/channel-dSuGhtYS.js +1 -0
- package/dist/client/assets/{chunk-4BX2VUAB-CQf5x2mT.js → chunk-4BX2VUAB-B47BryhY.js} +1 -1
- package/dist/client/assets/{chunk-4TB4RGXK-eeG8BKQB.js → chunk-4TB4RGXK-DKIhSC52.js} +1 -1
- package/dist/client/assets/{chunk-55IACEB6-1dkBlsDt.js → chunk-55IACEB6-B3Gvpef7.js} +1 -1
- package/dist/client/assets/{chunk-EDXVE4YY-C5vcF-lT.js → chunk-EDXVE4YY-C4gFtvU8.js} +1 -1
- package/dist/client/assets/{chunk-FMBD7UC4-CGelAuwP.js → chunk-FMBD7UC4-BADPieOa.js} +1 -1
- package/dist/client/assets/{chunk-OYMX7WX6-CbKgVyop.js → chunk-OYMX7WX6-BUdtWGUY.js} +1 -1
- package/dist/client/assets/{chunk-QZHKN3VN-CT0ppG8R.js → chunk-QZHKN3VN-CMxkeGnM.js} +1 -1
- package/dist/client/assets/{chunk-YZCP3GAM-BEf8DhxB.js → chunk-YZCP3GAM-Br6N7t8d.js} +1 -1
- package/dist/client/assets/classDiagram-6PBFFD2Q-DEN4mh7x.js +1 -0
- package/dist/client/assets/classDiagram-v2-HSJHXN6E-DEN4mh7x.js +1 -0
- package/dist/client/assets/clone-BbTnmCoq.js +1 -0
- package/dist/client/assets/{cose-bilkent-S5V4N54A-C6GtvpYi.js → cose-bilkent-S5V4N54A-D1Uw7i5_.js} +1 -1
- package/dist/client/assets/{dagre-KV5264BT-DvrU2BgH.js → dagre-KV5264BT-kop0bHkM.js} +1 -1
- package/dist/client/assets/{diagram-5BDNPKRD-Cy1qKKqt.js → diagram-5BDNPKRD-B9e41qNA.js} +1 -1
- package/dist/client/assets/{diagram-G4DWMVQ6-C4GGKnnD.js → diagram-G4DWMVQ6-Wew8X03k.js} +1 -1
- package/dist/client/assets/{diagram-MMDJMWI5-By7JFsIw.js → diagram-MMDJMWI5-DGBb5Oqa.js} +1 -1
- package/dist/client/assets/{diagram-TYMM5635-YwzVWpID.js → diagram-TYMM5635-CiVNsAz6.js} +1 -1
- package/dist/client/assets/{erDiagram-SMLLAGMA-CDsNlmLk.js → erDiagram-SMLLAGMA-BdemYTgC.js} +1 -1
- package/dist/client/assets/{flowDiagram-DWJPFMVM-BuUpIzTa.js → flowDiagram-DWJPFMVM-CXC6yxhU.js} +1 -1
- package/dist/client/assets/{ganttDiagram-T4ZO3ILL-Dqv9t2x8.js → ganttDiagram-T4ZO3ILL-SMUpaiUg.js} +1 -1
- package/dist/client/assets/{gitGraphDiagram-UUTBAWPF-DApQn2c7.js → gitGraphDiagram-UUTBAWPF-UaFgTHEh.js} +1 -1
- package/dist/client/assets/{graph-CyX-IC4n.js → graph-Ch8F0gMI.js} +1 -1
- package/dist/client/assets/index-D38r12i5.css +1 -0
- package/dist/client/assets/index-DkTcJcbj.js +452 -0
- package/dist/client/assets/{infoDiagram-42DDH7IO-DIf3qelw.js → infoDiagram-42DDH7IO-BHBzw0bu.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-UXIWVN3A-CU3QtNdx.js → ishikawaDiagram-UXIWVN3A-CnDea8bw.js} +1 -1
- package/dist/client/assets/{journeyDiagram-VCZTEJTY-Dfq4OBhW.js → journeyDiagram-VCZTEJTY-CI91m8BP.js} +1 -1
- package/dist/client/assets/{kanban-definition-6JOO6SKY-CWSe3eh7.js → kanban-definition-6JOO6SKY-D-rn-rG2.js} +1 -1
- package/dist/client/assets/{layout-CfdpDpEB.js → layout-Cd9zpG94.js} +1 -1
- package/dist/client/assets/{linear-BQA5wLDW.js → linear-Cucr1ojd.js} +1 -1
- package/dist/client/assets/{mermaid.core-BwJS5O4y.js → mermaid.core-G36P12JZ.js} +4 -4
- package/dist/client/assets/{min-Cg-Q6TB5.js → min-CzfCLG7v.js} +1 -1
- package/dist/client/assets/{mindmap-definition-QFDTVHPH-BNXT0q7L.js → mindmap-definition-QFDTVHPH-4e1VjBV7.js} +1 -1
- package/dist/client/assets/{pieDiagram-DEJITSTG-Cot4WNe7.js → pieDiagram-DEJITSTG-m2CGbU51.js} +1 -1
- package/dist/client/assets/{quadrantDiagram-34T5L4WZ-_YW3nZwc.js → quadrantDiagram-34T5L4WZ-BKNPGqMc.js} +1 -1
- package/dist/client/assets/{requirementDiagram-MS252O5E-didEilrX.js → requirementDiagram-MS252O5E-D2BMwnpz.js} +1 -1
- package/dist/client/assets/{sankeyDiagram-XADWPNL6-CIpzp5Ep.js → sankeyDiagram-XADWPNL6-Bm6hTqEh.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-FGHM5R23-CqvwD_CI.js → sequenceDiagram-FGHM5R23-Ds2FEGPj.js} +1 -1
- package/dist/client/assets/{stateDiagram-FHFEXIEX-D492KgCG.js → stateDiagram-FHFEXIEX-CrXn2Tb7.js} +1 -1
- package/dist/client/assets/stateDiagram-v2-QKLJ7IA2-BbzpXIlW.js +1 -0
- package/dist/client/assets/{timeline-definition-GMOUNBTQ-BpAwqH0H.js → timeline-definition-GMOUNBTQ-mw053fb5.js} +1 -1
- package/dist/client/assets/{vennDiagram-DHZGUBPP-DDMPO_HG.js → vennDiagram-DHZGUBPP-CAws0Vt2.js} +1 -1
- package/dist/client/assets/{wardley-RL74JXVD-TKEj0wFU.js → wardley-RL74JXVD-DGad2cmz.js} +1 -1
- package/dist/client/assets/{wardleyDiagram-NUSXRM2D-CLjBh2KA.js → wardleyDiagram-NUSXRM2D-BlIyft8I.js} +1 -1
- package/dist/client/assets/{xychartDiagram-5P7HB3ND-DEn2Z9lG.js → xychartDiagram-5P7HB3ND-DHmSULAI.js} +1 -1
- package/dist/client/index.html +2 -2
- package/dist/client/theme-boot.js +5 -4
- package/dist/fleet-plugins/file-explorer/routes.mjs +484 -56
- package/dist/fleet-plugins/ledger/routes.mjs +56 -80
- package/dist/fleet-plugins/quota/routes.mjs +19806 -0
- package/dist/fleet-plugins/repository/routes.mjs +274 -17
- package/dist/fleet-plugins/scuttlebutt/routes.mjs +6 -431
- package/dist/fleet-plugins/skills/routes.mjs +1 -79
- package/dist/fleet-plugins/terminal/routes.mjs +12449 -2974
- package/package.json +1 -1
- package/dist/client/assets/channel-Cjiuj1tM.js +0 -1
- package/dist/client/assets/classDiagram-6PBFFD2Q-B-_6FtAZ.js +0 -1
- package/dist/client/assets/classDiagram-v2-HSJHXN6E-B-_6FtAZ.js +0 -1
- package/dist/client/assets/clone-BF2H_qSP.js +0 -1
- package/dist/client/assets/index-RzoF0XVt.js +0 -452
- package/dist/client/assets/index-bog2t8Rz.css +0 -1
- package/dist/client/assets/stateDiagram-v2-QKLJ7IA2-DUe9CEL6.js +0 -1
|
@@ -16402,22 +16402,6 @@ var models_default = {
|
|
|
16402
16402
|
{ modelId: "claude-opus-4-8[1m]", name: "Claude Opus 4.8 [1M]", effort: { supported: true, levels: ["low", "medium", "high", "xhigh", "max"], default: "high" } }
|
|
16403
16403
|
]
|
|
16404
16404
|
},
|
|
16405
|
-
"claude-kimi": {
|
|
16406
|
-
name: "Kimi via Claude Code",
|
|
16407
|
-
defaultModel: "kimi-for-coding",
|
|
16408
|
-
models: [
|
|
16409
|
-
{ modelId: "kimi-for-coding", name: "Kimi for Coding", description: "Available on every Kimi Code membership tier (262K context)", effort: { supported: false }, contextWindow: 262144 },
|
|
16410
|
-
{ modelId: "k3", name: "Kimi K3", description: "Available on Moderato and higher tiers (262K context)", effort: { supported: true, levels: ["low", "high", "max"], default: "high" }, contextWindow: 262144 },
|
|
16411
|
-
{ modelId: "k3[1m]", name: "Kimi K3 [1M]", description: "Available on Allegretto and higher tiers (1M context)", effort: { supported: true, levels: ["low", "high", "max"], default: "high" }, contextWindow: 1048576 },
|
|
16412
|
-
{ modelId: "kimi-for-coding-highspeed", name: "Kimi for Coding Highspeed", description: "Available on Allegretto and higher tiers (262K context)", effort: { supported: false }, contextWindow: 262144 }
|
|
16413
|
-
],
|
|
16414
|
-
modelsMapping: {
|
|
16415
|
-
haiku: "kimi-for-coding",
|
|
16416
|
-
sonnet: "kimi-for-coding",
|
|
16417
|
-
opus: "kimi-for-coding",
|
|
16418
|
-
fable: "kimi-for-coding"
|
|
16419
|
-
}
|
|
16420
|
-
},
|
|
16421
16405
|
codex: {
|
|
16422
16406
|
name: "Codex",
|
|
16423
16407
|
defaultModel: "gpt-5.6-sol",
|
|
@@ -16432,23 +16416,6 @@ var models_default = {
|
|
|
16432
16416
|
{ modelId: "gpt-5.5-fast", name: "GPT-5.5 Fast", providerModelId: "gpt-5.5", serviceTier: "priority", effort: { supported: true, levels: ["low", "medium", "high", "xhigh"], default: "high" } }
|
|
16433
16417
|
]
|
|
16434
16418
|
},
|
|
16435
|
-
"opencode-go": {
|
|
16436
|
-
name: "OpenCode Go",
|
|
16437
|
-
defaultModel: "opencode-go/deepseek-v4-flash",
|
|
16438
|
-
models: [
|
|
16439
|
-
{ modelId: "opencode-go/deepseek-v4-flash", name: "DeepSeek V4 Flash", effort: { supported: false } },
|
|
16440
|
-
{ modelId: "opencode-go/deepseek-v4-pro", name: "DeepSeek V4 Pro", effort: { supported: false } },
|
|
16441
|
-
{ modelId: "opencode-go/glm-5.2", name: "GLM-5.2", effort: { supported: false } },
|
|
16442
|
-
{ modelId: "opencode-go/grok-4.5", name: "Grok 4.5", effort: { supported: false } },
|
|
16443
|
-
{ modelId: "opencode-go/kimi-k3", name: "Kimi K3", effort: { supported: false } },
|
|
16444
|
-
{ modelId: "opencode-go/kimi-k2.7-code", name: "Kimi K2.7 Code", effort: { supported: false } },
|
|
16445
|
-
{ modelId: "opencode-go/mimo-v2.5", name: "MiMo V2.5", effort: { supported: false } },
|
|
16446
|
-
{ modelId: "opencode-go/mimo-v2.5-pro", name: "MiMo V2.5 Pro", effort: { supported: false } },
|
|
16447
|
-
{ modelId: "opencode-go/minimax-m3", name: "MiniMax M3", effort: { supported: false } },
|
|
16448
|
-
{ modelId: "opencode-go/qwen3.7-max", name: "Qwen3.7 Max", effort: { supported: false } },
|
|
16449
|
-
{ modelId: "opencode-go/qwen3.7-plus", name: "Qwen3.7 Plus", effort: { supported: false } }
|
|
16450
|
-
]
|
|
16451
|
-
},
|
|
16452
16419
|
cursor: {
|
|
16453
16420
|
name: "Cursor Agent",
|
|
16454
16421
|
defaultModel: "auto",
|
|
@@ -16550,16 +16517,13 @@ var ModelEntrySchema = external_exports.object({
|
|
|
16550
16517
|
});
|
|
16551
16518
|
}
|
|
16552
16519
|
});
|
|
16553
|
-
var ModelsMappingSchema = external_exports.record(external_exports.string(), external_exports.string());
|
|
16554
16520
|
var ProviderSchema = external_exports.object({
|
|
16555
16521
|
/** 프로바이더 표시 이름 */
|
|
16556
16522
|
name: external_exports.string(),
|
|
16557
16523
|
/** 기본 모델 ID */
|
|
16558
16524
|
defaultModel: external_exports.string(),
|
|
16559
16525
|
/** 사용 가능한 모델 목록 */
|
|
16560
|
-
models: external_exports.array(ModelEntrySchema).min(1)
|
|
16561
|
-
/** modelId와 연관된 매핑 모델 (선택) */
|
|
16562
|
-
modelsMapping: ModelsMappingSchema.optional()
|
|
16526
|
+
models: external_exports.array(ModelEntrySchema).min(1)
|
|
16563
16527
|
}).check((ctx) => {
|
|
16564
16528
|
const ids = new Set(ctx.value.models.map((m) => m.modelId));
|
|
16565
16529
|
if (!ids.has(ctx.value.defaultModel)) {
|
|
@@ -16610,32 +16574,6 @@ var CLI_BACKENDS = {
|
|
|
16610
16574
|
usesNpxBridge: true,
|
|
16611
16575
|
defaultMaxTokens: 16384
|
|
16612
16576
|
},
|
|
16613
|
-
"claude-kimi": {
|
|
16614
|
-
id: "claude-kimi",
|
|
16615
|
-
cliCommand: "claude",
|
|
16616
|
-
protocol: "acp",
|
|
16617
|
-
authRequired: true,
|
|
16618
|
-
npxPackage: "@agentclientprotocol/claude-agent-acp@0.33.1",
|
|
16619
|
-
modes: [
|
|
16620
|
-
{ id: "default", label: "Default" },
|
|
16621
|
-
{ id: "plan", label: "Plan" },
|
|
16622
|
-
{ id: "bypassPermissions", label: "YOLO" }
|
|
16623
|
-
],
|
|
16624
|
-
supportsSessionClose: true,
|
|
16625
|
-
supportsSessionLoad: true,
|
|
16626
|
-
requiresModelAtSpawn: false,
|
|
16627
|
-
usesNpxBridge: true,
|
|
16628
|
-
defaultMaxTokens: 262144,
|
|
16629
|
-
defaultEnv: {
|
|
16630
|
-
ANTHROPIC_BASE_URL: "https://api.kimi.com/coding/",
|
|
16631
|
-
ANTHROPIC_MODEL: "kimi-for-coding",
|
|
16632
|
-
ANTHROPIC_DEFAULT_HAIKU_MODEL: "kimi-for-coding",
|
|
16633
|
-
ANTHROPIC_DEFAULT_SONNET_MODEL: "kimi-for-coding",
|
|
16634
|
-
ANTHROPIC_DEFAULT_OPUS_MODEL: "kimi-for-coding",
|
|
16635
|
-
CLAUDE_CODE_SUBAGENT_MODEL: "kimi-for-coding",
|
|
16636
|
-
API_TIMEOUT_MS: "3000000"
|
|
16637
|
-
}
|
|
16638
|
-
},
|
|
16639
16577
|
codex: {
|
|
16640
16578
|
id: "codex",
|
|
16641
16579
|
cliCommand: "codex",
|
|
@@ -16653,22 +16591,6 @@ var CLI_BACKENDS = {
|
|
|
16653
16591
|
usesNpxBridge: false,
|
|
16654
16592
|
defaultMaxTokens: 1e5
|
|
16655
16593
|
},
|
|
16656
|
-
"opencode-go": {
|
|
16657
|
-
id: "opencode-go",
|
|
16658
|
-
cliCommand: "opencode",
|
|
16659
|
-
protocol: "acp",
|
|
16660
|
-
authRequired: false,
|
|
16661
|
-
acpArgs: ["acp"],
|
|
16662
|
-
modes: [
|
|
16663
|
-
{ id: "build", label: "Build" },
|
|
16664
|
-
{ id: "plan", label: "Plan" }
|
|
16665
|
-
],
|
|
16666
|
-
supportsSessionClose: true,
|
|
16667
|
-
supportsSessionLoad: true,
|
|
16668
|
-
requiresModelAtSpawn: true,
|
|
16669
|
-
usesNpxBridge: false,
|
|
16670
|
-
defaultMaxTokens: 128e3
|
|
16671
|
-
},
|
|
16672
16594
|
cursor: {
|
|
16673
16595
|
id: "cursor",
|
|
16674
16596
|
cliCommand: "cursor-agent",
|
|
@@ -16933,6 +16855,13 @@ function isRecord2(value) {
|
|
|
16933
16855
|
function isNonNegativeSafeInteger(value) {
|
|
16934
16856
|
return typeof value === "number" && Number.isSafeInteger(value) && value >= 0;
|
|
16935
16857
|
}
|
|
16858
|
+
function isRepresentableTimestamp(value) {
|
|
16859
|
+
if (!isNonNegativeSafeInteger(value)) return false;
|
|
16860
|
+
const date5 = new Date(value);
|
|
16861
|
+
if (!Number.isFinite(date5.getTime())) return false;
|
|
16862
|
+
const localYear = date5.getFullYear();
|
|
16863
|
+
return localYear >= 0 && localYear <= 9999;
|
|
16864
|
+
}
|
|
16936
16865
|
function isNonNegativeFinite(value) {
|
|
16937
16866
|
return typeof value === "number" && Number.isFinite(value) && value >= 0;
|
|
16938
16867
|
}
|
|
@@ -16948,7 +16877,7 @@ function sanitizeModels(value) {
|
|
|
16948
16877
|
function parseSession(value) {
|
|
16949
16878
|
if (!isRecord2(value)) return null;
|
|
16950
16879
|
const models = value.models_used;
|
|
16951
|
-
if (typeof value.session_id !== "string" || typeof value.client !== "string" || !
|
|
16880
|
+
if (typeof value.session_id !== "string" || typeof value.client !== "string" || !isRepresentableTimestamp(value.created_at) || !isRepresentableTimestamp(value.last_active) || !isNonNegativeSafeInteger(value.total_input_tokens) || !isNonNegativeSafeInteger(value.total_output_tokens) || !isNonNegativeSafeInteger(value.total_cache_read) || !isNonNegativeFinite(value.total_cost) || !Array.isArray(models) || !isNonNegativeSafeInteger(value.message_count) || !isNonNegativeFinite(value.duration_minutes) || !isNullableString(value.title) || !isNullableString(value.task_category) || !isNullableString(value.description) || !isNullableString(value.complexity) || !isNullableString(value.task_group) || !isNullableString(value.summarized_at) || !isNullableString(value.fm_version)) return null;
|
|
16952
16881
|
return {
|
|
16953
16882
|
sessionId: value.session_id,
|
|
16954
16883
|
client: sanitizeClient(value.client),
|
|
@@ -16982,6 +16911,7 @@ function parseTokscaleOutput(stdout) {
|
|
|
16982
16911
|
// ../fleet-plugins/ledger/server/summary.ts
|
|
16983
16912
|
var AggregateOverflowError = class extends Error {
|
|
16984
16913
|
};
|
|
16914
|
+
var MAX_DAILY_DAYS = 366;
|
|
16985
16915
|
function emptyAccumulator() {
|
|
16986
16916
|
return { input: 0, output: 0, cacheRead: 0, costUsd: 0, messages: 0 };
|
|
16987
16917
|
}
|
|
@@ -16997,6 +16927,45 @@ function addFinite(left, right) {
|
|
|
16997
16927
|
if (!Number.isFinite(result)) throw new AggregateOverflowError("ledger aggregate overflow");
|
|
16998
16928
|
return result;
|
|
16999
16929
|
}
|
|
16930
|
+
function localDayKey(atMs) {
|
|
16931
|
+
const date5 = new Date(atMs);
|
|
16932
|
+
const year = String(date5.getFullYear()).padStart(4, "0");
|
|
16933
|
+
const month = String(date5.getMonth() + 1).padStart(2, "0");
|
|
16934
|
+
const day = String(date5.getDate()).padStart(2, "0");
|
|
16935
|
+
return `${year}-${month}-${day}`;
|
|
16936
|
+
}
|
|
16937
|
+
function localDateFromDayKey(day) {
|
|
16938
|
+
const date5 = /* @__PURE__ */ new Date(0);
|
|
16939
|
+
date5.setFullYear(Number(day.slice(0, 4)), Number(day.slice(5, 7)) - 1, Number(day.slice(8, 10)));
|
|
16940
|
+
date5.setHours(12, 0, 0, 0);
|
|
16941
|
+
return date5;
|
|
16942
|
+
}
|
|
16943
|
+
function derivedDailyRange(window, generatedAtMs) {
|
|
16944
|
+
const lastDay = localDayKey(generatedAtMs);
|
|
16945
|
+
const firstDate = localDateFromDayKey(lastDay);
|
|
16946
|
+
if (window === "week") firstDate.setDate(firstDate.getDate() - 6);
|
|
16947
|
+
if (window === "month") firstDate.setDate(1);
|
|
16948
|
+
return { firstDay: localDayKey(firstDate.getTime()), lastDay };
|
|
16949
|
+
}
|
|
16950
|
+
function fillDailyPoints(observed, derived) {
|
|
16951
|
+
if (observed.length === 0) return [];
|
|
16952
|
+
let firstDay = observed[0].day < derived.firstDay ? observed[0].day : derived.firstDay;
|
|
16953
|
+
const observedLastDay = observed[observed.length - 1].day;
|
|
16954
|
+
const lastDay = observedLastDay > derived.lastDay ? observedLastDay : derived.lastDay;
|
|
16955
|
+
const cutoffDate = localDateFromDayKey(lastDay);
|
|
16956
|
+
cutoffDate.setDate(cutoffDate.getDate() - (MAX_DAILY_DAYS - 1));
|
|
16957
|
+
const cutoffDay = localDayKey(cutoffDate.getTime());
|
|
16958
|
+
if (firstDay < cutoffDay) firstDay = cutoffDay;
|
|
16959
|
+
const costs = new Map(observed.map((point) => [point.day, point.costUsd]));
|
|
16960
|
+
const daily = [];
|
|
16961
|
+
const current = localDateFromDayKey(firstDay);
|
|
16962
|
+
while (true) {
|
|
16963
|
+
const day = localDayKey(current.getTime());
|
|
16964
|
+
daily.push({ day, costUsd: costs.get(day) ?? 0 });
|
|
16965
|
+
if (day === lastDay) return daily;
|
|
16966
|
+
current.setDate(current.getDate() + 1);
|
|
16967
|
+
}
|
|
16968
|
+
}
|
|
17000
16969
|
function usageOf(value) {
|
|
17001
16970
|
return { input: value.input, output: value.output, cacheRead: value.cacheRead };
|
|
17002
16971
|
}
|
|
@@ -17040,6 +17009,7 @@ function buildSummary(sessions, operations, scope, status = "ok", generatedAtMs
|
|
|
17040
17009
|
totals: { costUsd: 0, input: 0, output: 0, cacheRead: 0, messages: 0 },
|
|
17041
17010
|
operations: [],
|
|
17042
17011
|
clients: [],
|
|
17012
|
+
daily: [],
|
|
17043
17013
|
source: {
|
|
17044
17014
|
status: "unreadable",
|
|
17045
17015
|
skippedSessions: skippedSessions + sessions.length
|
|
@@ -17089,11 +17059,14 @@ function buildSummaryUnchecked(sessions, operations, scope, status, generatedAtM
|
|
|
17089
17059
|
totalValues.messages = addFinite(totalValues.messages, operation.messages);
|
|
17090
17060
|
}
|
|
17091
17061
|
const clientMap = /* @__PURE__ */ new Map();
|
|
17062
|
+
const dailyMap = /* @__PURE__ */ new Map();
|
|
17092
17063
|
for (const session of sessions) {
|
|
17093
17064
|
const client = clientMap.get(session.client) ?? { sessions: 0, totals: emptyAccumulator() };
|
|
17094
17065
|
client.sessions = addFinite(client.sessions, 1);
|
|
17095
17066
|
addSession(client.totals, session);
|
|
17096
17067
|
clientMap.set(session.client, client);
|
|
17068
|
+
const day = localDayKey(session.lastActive);
|
|
17069
|
+
dailyMap.set(day, addFinite(dailyMap.get(day) ?? 0, session.costUsd));
|
|
17097
17070
|
}
|
|
17098
17071
|
const clients = [...clientMap.entries()].map(([client, value]) => ({
|
|
17099
17072
|
client,
|
|
@@ -17101,6 +17074,8 @@ function buildSummaryUnchecked(sessions, operations, scope, status, generatedAtM
|
|
|
17101
17074
|
usage: usageOf(value.totals),
|
|
17102
17075
|
costUsd: value.totals.costUsd
|
|
17103
17076
|
})).sort((a, b) => b.costUsd - a.costUsd || (a.client < b.client ? -1 : a.client > b.client ? 1 : 0));
|
|
17077
|
+
const observedDaily = [...dailyMap.entries()].map(([day, costUsd]) => ({ day, costUsd })).sort((a, b) => a.day < b.day ? -1 : a.day > b.day ? 1 : 0);
|
|
17078
|
+
const daily = fillDailyPoints(observedDaily, derivedDailyRange(scope.window, generatedAtMs));
|
|
17104
17079
|
return {
|
|
17105
17080
|
schemaVersion: 1,
|
|
17106
17081
|
scope,
|
|
@@ -17108,6 +17083,7 @@ function buildSummaryUnchecked(sessions, operations, scope, status, generatedAtM
|
|
|
17108
17083
|
totals: { ...usageOf(totalValues), costUsd: totalValues.costUsd, messages: totalValues.messages },
|
|
17109
17084
|
operations: operationDtos,
|
|
17110
17085
|
clients,
|
|
17086
|
+
daily,
|
|
17111
17087
|
source: { status, skippedSessions }
|
|
17112
17088
|
};
|
|
17113
17089
|
}
|