@leterhong/multichat 1.6.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/.agents/plugins/marketplace.json +32 -0
- package/.agents/plugins/plugins/developer-toolkit/.codex-plugin/plugin.json +24 -0
- package/.agents/plugins/plugins/developer-toolkit/skills/code-review/SKILL.md +9 -0
- package/.agents/plugins/plugins/developer-toolkit/skills/code-review/agents/openai.yaml +3 -0
- package/.agents/plugins/plugins/developer-toolkit/skills/release-notes/SKILL.md +9 -0
- package/.agents/plugins/plugins/developer-toolkit/skills/release-notes/agents/openai.yaml +3 -0
- package/.agents/plugins/plugins/developer-toolkit/skills/security-review/SKILL.md +9 -0
- package/.agents/plugins/plugins/developer-toolkit/skills/security-review/agents/openai.yaml +3 -0
- package/.agents/plugins/plugins/developer-toolkit/skills/test-plan/SKILL.md +9 -0
- package/.agents/plugins/plugins/developer-toolkit/skills/test-plan/agents/openai.yaml +3 -0
- package/.agents/plugins/plugins/writing-toolkit/.codex-plugin/plugin.json +24 -0
- package/.agents/plugins/plugins/writing-toolkit/skills/meeting-notes/SKILL.md +9 -0
- package/.agents/plugins/plugins/writing-toolkit/skills/meeting-notes/agents/openai.yaml +3 -0
- package/.agents/plugins/plugins/writing-toolkit/skills/resume-tune/SKILL.md +9 -0
- package/.agents/plugins/plugins/writing-toolkit/skills/resume-tune/agents/openai.yaml +3 -0
- package/.agents/plugins/plugins/writing-toolkit/skills/weekly-report/SKILL.md +9 -0
- package/.agents/plugins/plugins/writing-toolkit/skills/weekly-report/agents/openai.yaml +3 -0
- package/.agents/skills/.gitkeep +1 -0
- package/.agents/skills/wanghong-handwritten-ppt/SKILL.md +172 -0
- package/.agents/skills/wanghong-handwritten-ppt/assets/HTML-PPT-LICENSE +21 -0
- package/.agents/skills/wanghong-handwritten-ppt/assets/NEAT-ANNOTATIONS-LICENSE +21 -0
- package/.agents/skills/wanghong-handwritten-ppt/assets/animations.css +138 -0
- package/.agents/skills/wanghong-handwritten-ppt/assets/base.css +150 -0
- package/.agents/skills/wanghong-handwritten-ppt/assets/deepseek-example.css +893 -0
- package/.agents/skills/wanghong-handwritten-ppt/assets/neat-annotations.css +152 -0
- package/.agents/skills/wanghong-handwritten-ppt/assets/preview-cover.png +0 -0
- package/.agents/skills/wanghong-handwritten-ppt/assets/preview-diagram.png +0 -0
- package/.agents/skills/wanghong-handwritten-ppt/assets/preview-summary.png +0 -0
- package/.agents/skills/wanghong-handwritten-ppt/assets/preview-table.png +0 -0
- package/.agents/skills/wanghong-handwritten-ppt/assets/runtime.js +960 -0
- package/.agents/skills/wanghong-handwritten-ppt/assets/template.css +198 -0
- package/.agents/skills/wanghong-handwritten-ppt/evals/evals.json +20 -0
- package/.agents/skills/wanghong-handwritten-ppt/examples/deepseek-v4-flash/index.html +414 -0
- package/.agents/skills/wanghong-handwritten-ppt/examples/deepseek-v4-flash/style.css +897 -0
- package/.agents/skills/wanghong-handwritten-ppt/references/prompts.md +170 -0
- package/.agents/skills/wanghong-handwritten-ppt/references/style-guide.md +133 -0
- package/.agents/skills/wanghong-handwritten-ppt/scripts/check_deck.py +41 -0
- package/.agents/skills/wanghong-handwritten-ppt/scripts/prepare_render_html.py +137 -0
- package/.agents/skills/wanghong-handwritten-ppt/scripts/render.sh +110 -0
- package/.agents/skills/wanghong-handwritten-ppt/templates/deck.html +94 -0
- package/.agents/skills/wanghong-handwritten-ppt/tests/test_font_contract.py +73 -0
- package/LICENSE +21 -0
- package/README.md +186 -0
- package/backend/adapters/README.md +77 -0
- package/backend/adapters/anthropic.ts +115 -0
- package/backend/adapters/base.ts +47 -0
- package/backend/adapters/index.ts +41 -0
- package/backend/adapters/lmstudio.ts +7 -0
- package/backend/adapters/moonshot.ts +7 -0
- package/backend/adapters/ollama.ts +7 -0
- package/backend/adapters/openai-compatible.ts +51 -0
- package/backend/adapters/openai.ts +7 -0
- package/backend/adapters/qwen.ts +112 -0
- package/backend/adapters/wenxin.ts +136 -0
- package/backend/adapters/zhipu.ts +93 -0
- package/backend/dist/adapters/anthropic.js +130 -0
- package/backend/dist/adapters/anthropic.js.map +1 -0
- package/backend/dist/adapters/base.js +38 -0
- package/backend/dist/adapters/base.js.map +1 -0
- package/backend/dist/adapters/index.js +39 -0
- package/backend/dist/adapters/index.js.map +1 -0
- package/backend/dist/adapters/lmstudio.js +8 -0
- package/backend/dist/adapters/lmstudio.js.map +1 -0
- package/backend/dist/adapters/moonshot.js +8 -0
- package/backend/dist/adapters/moonshot.js.map +1 -0
- package/backend/dist/adapters/ollama.js +8 -0
- package/backend/dist/adapters/ollama.js.map +1 -0
- package/backend/dist/adapters/openai-compatible.js +47 -0
- package/backend/dist/adapters/openai-compatible.js.map +1 -0
- package/backend/dist/adapters/openai.js +8 -0
- package/backend/dist/adapters/openai.js.map +1 -0
- package/backend/dist/adapters/qwen.js +103 -0
- package/backend/dist/adapters/qwen.js.map +1 -0
- package/backend/dist/adapters/wenxin.js +114 -0
- package/backend/dist/adapters/wenxin.js.map +1 -0
- package/backend/dist/adapters/zhipu.js +86 -0
- package/backend/dist/adapters/zhipu.js.map +1 -0
- package/backend/dist/extensions/demo-mcp-server.js +75 -0
- package/backend/dist/extensions/demo-mcp-server.js.map +1 -0
- package/backend/dist/extensions/importer.js +828 -0
- package/backend/dist/extensions/importer.js.map +1 -0
- package/backend/dist/extensions/manager.js +1154 -0
- package/backend/dist/extensions/manager.js.map +1 -0
- package/backend/dist/lib/catalog.js +30 -0
- package/backend/dist/lib/catalog.js.map +1 -0
- package/backend/dist/lib/context.js +59 -0
- package/backend/dist/lib/context.js.map +1 -0
- package/backend/dist/lib/errors.js +75 -0
- package/backend/dist/lib/errors.js.map +1 -0
- package/backend/dist/lib/provider-store.js +116 -0
- package/backend/dist/lib/provider-store.js.map +1 -0
- package/backend/dist/lib/redact.js +11 -0
- package/backend/dist/lib/redact.js.map +1 -0
- package/backend/dist/lib/runtime-store.js +28 -0
- package/backend/dist/lib/runtime-store.js.map +1 -0
- package/backend/dist/lib/sqlite-store.js +218 -0
- package/backend/dist/lib/sqlite-store.js.map +1 -0
- package/backend/dist/lib/sse.js +46 -0
- package/backend/dist/lib/sse.js.map +1 -0
- package/backend/dist/lib/ssrf.js +131 -0
- package/backend/dist/lib/ssrf.js.map +1 -0
- package/backend/dist/lib/store.js +84 -0
- package/backend/dist/lib/store.js.map +1 -0
- package/backend/dist/lib/usage.js +219 -0
- package/backend/dist/lib/usage.js.map +1 -0
- package/backend/dist/lib/util.js +38 -0
- package/backend/dist/lib/util.js.map +1 -0
- package/backend/dist/lib/workspace-store.js +152 -0
- package/backend/dist/lib/workspace-store.js.map +1 -0
- package/backend/dist/mcp.js +429 -0
- package/backend/dist/mcp.js.map +1 -0
- package/backend/dist/routes/agents.js +51 -0
- package/backend/dist/routes/agents.js.map +1 -0
- package/backend/dist/routes/assistants.js +32 -0
- package/backend/dist/routes/assistants.js.map +1 -0
- package/backend/dist/routes/chat.js +697 -0
- package/backend/dist/routes/chat.js.map +1 -0
- package/backend/dist/routes/control-plane.js +200 -0
- package/backend/dist/routes/control-plane.js.map +1 -0
- package/backend/dist/routes/conversations.js +66 -0
- package/backend/dist/routes/conversations.js.map +1 -0
- package/backend/dist/routes/extensions-import.js +22 -0
- package/backend/dist/routes/extensions-import.js.map +1 -0
- package/backend/dist/routes/import.js +85 -0
- package/backend/dist/routes/import.js.map +1 -0
- package/backend/dist/routes/mcp-servers.js +56 -0
- package/backend/dist/routes/mcp-servers.js.map +1 -0
- package/backend/dist/routes/meta.js +37 -0
- package/backend/dist/routes/meta.js.map +1 -0
- package/backend/dist/routes/mock.js +28 -0
- package/backend/dist/routes/mock.js.map +1 -0
- package/backend/dist/routes/plugins.js +41 -0
- package/backend/dist/routes/plugins.js.map +1 -0
- package/backend/dist/routes/providers.js +197 -0
- package/backend/dist/routes/providers.js.map +1 -0
- package/backend/dist/routes/runs.js +57 -0
- package/backend/dist/routes/runs.js.map +1 -0
- package/backend/dist/routes/skills.js +73 -0
- package/backend/dist/routes/skills.js.map +1 -0
- package/backend/dist/routes/tools.js +40 -0
- package/backend/dist/routes/tools.js.map +1 -0
- package/backend/dist/routes/usage.js +14 -0
- package/backend/dist/routes/usage.js.map +1 -0
- package/backend/dist/routes/workspaces.js +158 -0
- package/backend/dist/routes/workspaces.js.map +1 -0
- package/backend/dist/runtime/agent.js +518 -0
- package/backend/dist/runtime/agent.js.map +1 -0
- package/backend/dist/server.js +103 -0
- package/backend/dist/server.js.map +1 -0
- package/backend/dist/types.js +3 -0
- package/backend/dist/types.js.map +1 -0
- package/backend/extensions/demo-mcp-server.js +70 -0
- package/backend/extensions/importer.ts +709 -0
- package/backend/extensions/manager.ts +1055 -0
- package/backend/lib/catalog.ts +28 -0
- package/backend/lib/context.ts +61 -0
- package/backend/lib/errors.ts +78 -0
- package/backend/lib/provider-store.ts +116 -0
- package/backend/lib/redact.ts +9 -0
- package/backend/lib/runtime-store.ts +38 -0
- package/backend/lib/sqlite-store.ts +220 -0
- package/backend/lib/sse.ts +42 -0
- package/backend/lib/ssrf.ts +120 -0
- package/backend/lib/store.ts +79 -0
- package/backend/lib/usage.ts +212 -0
- package/backend/lib/util.ts +31 -0
- package/backend/lib/workspace-store.ts +150 -0
- package/backend/mcp.ts +417 -0
- package/backend/package.json +34 -0
- package/backend/prompts.json +82 -0
- package/backend/routes/agents.ts +55 -0
- package/backend/routes/assistants.ts +30 -0
- package/backend/routes/chat.ts +660 -0
- package/backend/routes/control-plane.ts +165 -0
- package/backend/routes/conversations.ts +62 -0
- package/backend/routes/extensions-import.ts +15 -0
- package/backend/routes/import.ts +72 -0
- package/backend/routes/mcp-servers.ts +36 -0
- package/backend/routes/meta.ts +38 -0
- package/backend/routes/mock.ts +25 -0
- package/backend/routes/plugins.ts +27 -0
- package/backend/routes/providers.ts +166 -0
- package/backend/routes/runs.ts +55 -0
- package/backend/routes/skills.ts +52 -0
- package/backend/routes/tools.ts +40 -0
- package/backend/routes/usage.ts +13 -0
- package/backend/routes/workspaces.ts +124 -0
- package/backend/runtime/agent.ts +474 -0
- package/backend/server.ts +106 -0
- package/backend/types.ts +126 -0
- package/bin/multichat.mjs +535 -0
- package/frontend/dist/assets/agentPicker-C39VzmYa.js +13 -0
- package/frontend/dist/assets/compare-BpaGD32J.js +1 -0
- package/frontend/dist/assets/conversations-COuLmg99.js +7 -0
- package/frontend/dist/assets/data-ZH7Dux1K.js +1 -0
- package/frontend/dist/assets/extensionImport-CnTWKtWm.js +28 -0
- package/frontend/dist/assets/importExport-B3mB-9zs.js +70 -0
- package/frontend/dist/assets/index-CASVCOUO.js +34 -0
- package/frontend/dist/assets/index-DSvbjNLc.css +1 -0
- package/frontend/dist/assets/init-ZPK483vB.js +1 -0
- package/frontend/dist/assets/jsx-runtime-ZSsbr0oW.js +9 -0
- package/frontend/dist/assets/modal-CgHocv3n.js +2 -0
- package/frontend/dist/assets/modelPicker-EUmmVnbj.js +14 -0
- package/frontend/dist/assets/pluginsUI-B6jGUQkx.js +16 -0
- package/frontend/dist/assets/render-DgAg1K8A.js +1 -0
- package/frontend/dist/assets/send-BJhZ_5YA.js +14 -0
- package/frontend/dist/assets/settings-DdnYwZl-.js +2 -0
- package/frontend/dist/assets/shell-DFV2khQl.js +1 -0
- package/frontend/dist/assets/workbench-BY2J4vWC.js +41 -0
- package/frontend/dist/icon-maskable.svg +4 -0
- package/frontend/dist/icon.svg +4 -0
- package/frontend/dist/index.html +21 -0
- package/frontend/dist/manifest.webmanifest +26 -0
- package/package.json +58 -0
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const crypto = require('crypto');
|
|
4
|
+
const USAGE_FILE = 'usage.json';
|
|
5
|
+
const SCHEMA_VERSION = 1;
|
|
6
|
+
const MAX_RECORDS = 20_000;
|
|
7
|
+
const RETENTION_MS = 400 * 24 * 60 * 60 * 1000;
|
|
8
|
+
function finite(value) {
|
|
9
|
+
const number = Number(value);
|
|
10
|
+
return Number.isFinite(number) && number > 0 ? Math.round(number) : 0;
|
|
11
|
+
}
|
|
12
|
+
function tokenFields(raw = {}) {
|
|
13
|
+
const input = finite(raw.prompt_tokens ?? raw.input_tokens);
|
|
14
|
+
const output = finite(raw.completion_tokens ?? raw.output_tokens);
|
|
15
|
+
const total = finite(raw.total_tokens) || input + output;
|
|
16
|
+
const cached = finite(raw.cached_tokens ?? raw.prompt_tokens_details?.cached_tokens ?? raw.input_tokens_details?.cache_read_tokens);
|
|
17
|
+
const reasoning = finite(raw.reasoning_tokens ?? raw.completion_tokens_details?.reasoning_tokens);
|
|
18
|
+
return { input, output, total, cached, reasoning };
|
|
19
|
+
}
|
|
20
|
+
function estimateText(value) {
|
|
21
|
+
if (value == null)
|
|
22
|
+
return 0;
|
|
23
|
+
const text = typeof value === 'string' ? value : JSON.stringify(value);
|
|
24
|
+
// A deterministic local estimate for providers that do not report usage.
|
|
25
|
+
// It is intentionally labelled as estimated in every API/UI surface.
|
|
26
|
+
return Math.max(0, Math.ceil(text.length / 4));
|
|
27
|
+
}
|
|
28
|
+
function mergeUsage(base = {}, next = {}) {
|
|
29
|
+
const left = tokenFields(base);
|
|
30
|
+
const right = tokenFields(next);
|
|
31
|
+
return {
|
|
32
|
+
prompt_tokens: Math.max(left.input, right.input),
|
|
33
|
+
completion_tokens: Math.max(left.output, right.output),
|
|
34
|
+
total_tokens: Math.max(left.total, right.total, Math.max(left.input, right.input) + Math.max(left.output, right.output)),
|
|
35
|
+
cached_tokens: Math.max(left.cached, right.cached),
|
|
36
|
+
reasoning_tokens: Math.max(left.reasoning, right.reasoning),
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
function normalizeUsage(raw, messages = [], output = '') {
|
|
40
|
+
const exact = tokenFields(raw || {});
|
|
41
|
+
if (exact.total > 0)
|
|
42
|
+
return { ...exact, source: 'reported' };
|
|
43
|
+
const input = messages.reduce((sum, message) => sum + estimateText(message.content) + 4, 0);
|
|
44
|
+
const outputTokens = estimateText(output);
|
|
45
|
+
return { input, output: outputTokens, total: input + outputTokens, cached: 0, reasoning: 0, source: 'estimated' };
|
|
46
|
+
}
|
|
47
|
+
function ledger(store) {
|
|
48
|
+
const value = store.read(USAGE_FILE, { version: SCHEMA_VERSION, records: [] });
|
|
49
|
+
if (Array.isArray(value))
|
|
50
|
+
return { version: SCHEMA_VERSION, records: value };
|
|
51
|
+
return { version: SCHEMA_VERSION, records: Array.isArray(value.records) ? value.records : [] };
|
|
52
|
+
}
|
|
53
|
+
async function recordUsage(store, input) {
|
|
54
|
+
const now = new Date().toISOString();
|
|
55
|
+
const normalized = input.usage || normalizeUsage(input.rawUsage, input.messages, input.output);
|
|
56
|
+
const record = {
|
|
57
|
+
id: `use_${Date.now().toString(36)}_${crypto.randomBytes(3).toString('hex')}`,
|
|
58
|
+
timestamp: input.timestamp || now,
|
|
59
|
+
finishedAt: input.finishedAt || now,
|
|
60
|
+
providerId: String(input.providerId || 'unknown'),
|
|
61
|
+
providerName: String(input.providerName || input.providerId || 'Unknown'),
|
|
62
|
+
model: String(input.model || 'unknown'),
|
|
63
|
+
mode: input.mode === 'agent' ? 'agent' : 'chat',
|
|
64
|
+
status: input.status === 'error' || input.status === 'cancelled' ? input.status : 'success',
|
|
65
|
+
errorCode: input.errorCode ? String(input.errorCode).slice(0, 80) : null,
|
|
66
|
+
workspaceId: input.workspaceId || null,
|
|
67
|
+
projectId: input.projectId || null,
|
|
68
|
+
conversationId: input.conversationId || null,
|
|
69
|
+
runId: input.runId || null,
|
|
70
|
+
interactionId: input.interactionId || input.runId || input.conversationId || null,
|
|
71
|
+
step: finite(input.step),
|
|
72
|
+
durationMs: finite(input.durationMs),
|
|
73
|
+
inputTokens: finite(normalized.input),
|
|
74
|
+
outputTokens: finite(normalized.output),
|
|
75
|
+
totalTokens: finite(normalized.total) || finite(normalized.input) + finite(normalized.output),
|
|
76
|
+
cachedTokens: finite(normalized.cached),
|
|
77
|
+
reasoningTokens: finite(normalized.reasoning),
|
|
78
|
+
source: normalized.source === 'reported' ? 'reported' : 'estimated',
|
|
79
|
+
};
|
|
80
|
+
await store.mutate(USAGE_FILE, current => {
|
|
81
|
+
const state = Array.isArray(current) ? { version: SCHEMA_VERSION, records: current } : current;
|
|
82
|
+
const cutoff = Date.now() - RETENTION_MS;
|
|
83
|
+
state.version = SCHEMA_VERSION;
|
|
84
|
+
state.records = [record, ...(state.records || [])]
|
|
85
|
+
.filter(item => Date.parse(item.timestamp || '') >= cutoff)
|
|
86
|
+
.slice(0, MAX_RECORDS);
|
|
87
|
+
return state;
|
|
88
|
+
}, { version: SCHEMA_VERSION, records: [] });
|
|
89
|
+
return record;
|
|
90
|
+
}
|
|
91
|
+
function localParts(timestamp, offsetMinutes) {
|
|
92
|
+
const parsed = Date.parse(timestamp);
|
|
93
|
+
if (!Number.isFinite(parsed))
|
|
94
|
+
return { date: '0000-00-00', hour: 0 };
|
|
95
|
+
const local = new Date(parsed - offsetMinutes * 60_000);
|
|
96
|
+
return {
|
|
97
|
+
date: local.toISOString().slice(0, 10),
|
|
98
|
+
hour: local.getUTCHours(),
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
function dateRange(days, offsetMinutes) {
|
|
102
|
+
const end = new Date(Date.now() - offsetMinutes * 60_000);
|
|
103
|
+
end.setUTCHours(0, 0, 0, 0);
|
|
104
|
+
const out = [];
|
|
105
|
+
for (let index = days - 1; index >= 0; index -= 1) {
|
|
106
|
+
out.push(new Date(end.getTime() - index * 86_400_000).toISOString().slice(0, 10));
|
|
107
|
+
}
|
|
108
|
+
return out;
|
|
109
|
+
}
|
|
110
|
+
function summarizeRows(rows, days, offsetMinutes) {
|
|
111
|
+
const dailyMap = new Map();
|
|
112
|
+
const modelMap = new Map();
|
|
113
|
+
const providerMap = new Map();
|
|
114
|
+
const hours = Array.from({ length: 24 }, () => 0);
|
|
115
|
+
const interactionIds = new Set();
|
|
116
|
+
let inputTokens = 0, outputTokens = 0, totalTokens = 0, cachedTokens = 0, reasoningTokens = 0;
|
|
117
|
+
let reportedTokens = 0, estimatedTokens = 0, errors = 0, durationMs = 0, durationCount = 0;
|
|
118
|
+
for (const row of rows) {
|
|
119
|
+
const { date, hour } = localParts(row.timestamp, offsetMinutes);
|
|
120
|
+
const daily = dailyMap.get(date) || { date, inputTokens: 0, outputTokens: 0, totalTokens: 0, requests: 0, errors: 0, models: {} };
|
|
121
|
+
daily.inputTokens += finite(row.inputTokens);
|
|
122
|
+
daily.outputTokens += finite(row.outputTokens);
|
|
123
|
+
daily.totalTokens += finite(row.totalTokens);
|
|
124
|
+
daily.requests += 1;
|
|
125
|
+
if (row.status !== 'success')
|
|
126
|
+
daily.errors += 1;
|
|
127
|
+
daily.models[row.model] = finite(daily.models[row.model]) + finite(row.totalTokens);
|
|
128
|
+
dailyMap.set(date, daily);
|
|
129
|
+
const modelKey = String(row.model || 'unknown');
|
|
130
|
+
const model = modelMap.get(modelKey) || { name: modelKey, totalTokens: 0, inputTokens: 0, outputTokens: 0, requests: 0 };
|
|
131
|
+
model.totalTokens += finite(row.totalTokens);
|
|
132
|
+
model.inputTokens += finite(row.inputTokens);
|
|
133
|
+
model.outputTokens += finite(row.outputTokens);
|
|
134
|
+
model.requests += 1;
|
|
135
|
+
modelMap.set(modelKey, model);
|
|
136
|
+
const providerKey = String(row.providerId || 'unknown');
|
|
137
|
+
const provider = providerMap.get(providerKey) || { id: providerKey, name: row.providerName || providerKey, totalTokens: 0, requests: 0, errors: 0 };
|
|
138
|
+
provider.totalTokens += finite(row.totalTokens);
|
|
139
|
+
provider.requests += 1;
|
|
140
|
+
if (row.status !== 'success')
|
|
141
|
+
provider.errors += 1;
|
|
142
|
+
providerMap.set(providerKey, provider);
|
|
143
|
+
inputTokens += finite(row.inputTokens);
|
|
144
|
+
outputTokens += finite(row.outputTokens);
|
|
145
|
+
totalTokens += finite(row.totalTokens);
|
|
146
|
+
cachedTokens += finite(row.cachedTokens);
|
|
147
|
+
reasoningTokens += finite(row.reasoningTokens);
|
|
148
|
+
if (row.source === 'reported')
|
|
149
|
+
reportedTokens += finite(row.totalTokens);
|
|
150
|
+
else
|
|
151
|
+
estimatedTokens += finite(row.totalTokens);
|
|
152
|
+
if (row.status !== 'success')
|
|
153
|
+
errors += 1;
|
|
154
|
+
if (row.durationMs) {
|
|
155
|
+
durationMs += finite(row.durationMs);
|
|
156
|
+
durationCount += 1;
|
|
157
|
+
}
|
|
158
|
+
hours[hour] += finite(row.totalTokens) || 1;
|
|
159
|
+
interactionIds.add(String(row.interactionId || row.runId || row.conversationId || row.id));
|
|
160
|
+
}
|
|
161
|
+
const dailyDates = dateRange(days, offsetMinutes);
|
|
162
|
+
const daily = dailyDates.map(date => dailyMap.get(date) || { date, inputTokens: 0, outputTokens: 0, totalTokens: 0, requests: 0, errors: 0, models: {} });
|
|
163
|
+
const models = [...modelMap.values()].filter(item => item.totalTokens > 0).sort((a, b) => b.totalTokens - a.totalTokens).map(item => ({ ...item, share: totalTokens ? item.totalTokens / totalTokens : 0 }));
|
|
164
|
+
const providers = [...providerMap.values()].sort((a, b) => b.totalTokens - a.totalTokens).map(item => ({ ...item, share: totalTokens ? item.totalTokens / totalTokens : 0 }));
|
|
165
|
+
const activeDates = new Set(rows.map(row => localParts(row.timestamp, offsetMinutes).date));
|
|
166
|
+
const today = dateRange(1, offsetMinutes)[0];
|
|
167
|
+
let currentStreak = 0;
|
|
168
|
+
for (let cursor = new Date(`${today}T00:00:00.000Z`); activeDates.has(cursor.toISOString().slice(0, 10)); cursor = new Date(cursor.getTime() - 86_400_000))
|
|
169
|
+
currentStreak += 1;
|
|
170
|
+
let longestStreak = 0, running = 0, previous = '';
|
|
171
|
+
for (const date of [...activeDates].sort()) {
|
|
172
|
+
const adjacent = previous && Date.parse(`${date}T00:00:00Z`) - Date.parse(`${previous}T00:00:00Z`) === 86_400_000;
|
|
173
|
+
running = adjacent ? running + 1 : 1;
|
|
174
|
+
longestStreak = Math.max(longestStreak, running);
|
|
175
|
+
previous = date;
|
|
176
|
+
}
|
|
177
|
+
const peakHour = hours.reduce((best, value, index) => value > hours[best] ? index : best, 0);
|
|
178
|
+
return {
|
|
179
|
+
totals: {
|
|
180
|
+
inputTokens, outputTokens, totalTokens, cachedTokens, reasoningTokens,
|
|
181
|
+
requests: rows.length, messages: interactionIds.size, sessions: interactionIds.size,
|
|
182
|
+
activeDays: activeDates.size, errors, successRate: rows.length ? (rows.length - errors) / rows.length : 1,
|
|
183
|
+
averagePerActiveDay: activeDates.size ? Math.round(totalTokens / activeDates.size) : 0,
|
|
184
|
+
averageDurationMs: durationCount ? Math.round(durationMs / durationCount) : 0,
|
|
185
|
+
reportedTokens, estimatedTokens, reportedShare: totalTokens ? reportedTokens / totalTokens : 0,
|
|
186
|
+
currentStreak, longestStreak, peakHour,
|
|
187
|
+
},
|
|
188
|
+
daily, models, providers,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
function usageSummary(store, options = {}) {
|
|
192
|
+
const all = ledger(store).records;
|
|
193
|
+
const offsetMinutes = Math.max(-840, Math.min(840, Number(options.offsetMinutes) || 0));
|
|
194
|
+
const requestedRange = String(options.range || '30');
|
|
195
|
+
const days = requestedRange === 'all'
|
|
196
|
+
? Math.max(1, Math.min(400, all.length ? Math.ceil((Date.now() - Date.parse(all[all.length - 1].timestamp)) / 86_400_000) + 1 : 30))
|
|
197
|
+
: Math.max(1, Math.min(365, Number.parseInt(requestedRange, 10) || 30));
|
|
198
|
+
const startDate = dateRange(days, offsetMinutes)[0];
|
|
199
|
+
const rows = all.filter(row => localParts(row.timestamp, offsetMinutes).date >= startDate)
|
|
200
|
+
.filter(row => !options.projectId || row.projectId === options.projectId);
|
|
201
|
+
const summary = summarizeRows(rows, days, offsetMinutes);
|
|
202
|
+
const heatmapStart = dateRange(182, offsetMinutes)[0];
|
|
203
|
+
const heatmapRows = all
|
|
204
|
+
.filter(row => localParts(row.timestamp, offsetMinutes).date >= heatmapStart)
|
|
205
|
+
.filter(row => !options.projectId || row.projectId === options.projectId);
|
|
206
|
+
const heatmap = summarizeRows(heatmapRows, 182, offsetMinutes).daily.map(day => ({ date: day.date, totalTokens: day.totalTokens, requests: day.requests }));
|
|
207
|
+
return {
|
|
208
|
+
version: SCHEMA_VERSION,
|
|
209
|
+
range: requestedRange,
|
|
210
|
+
days,
|
|
211
|
+
timezoneOffset: offsetMinutes,
|
|
212
|
+
generatedAt: new Date().toISOString(),
|
|
213
|
+
...summary,
|
|
214
|
+
heatmap,
|
|
215
|
+
recent: rows.slice(0, 30),
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
module.exports = { USAGE_FILE, mergeUsage, normalizeUsage, recordUsage, usageSummary };
|
|
219
|
+
//# sourceMappingURL=usage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage.js","sourceRoot":"","sources":["../../lib/usage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
// ── 跨路由共享的纯函数工具 ──────────────────────────────────────────────
|
|
4
|
+
// 从资产对象中剔除 content 字段,仅保留元数据(避免列表接口返回大正文)
|
|
5
|
+
function assetMeta(asset) {
|
|
6
|
+
if (!asset)
|
|
7
|
+
return asset;
|
|
8
|
+
const { content: _content, ...meta } = asset;
|
|
9
|
+
return meta;
|
|
10
|
+
}
|
|
11
|
+
async function readResponseText(response, maxBytes = 2_000_000) {
|
|
12
|
+
const declared = Number(response.headers.get('content-length') || 0);
|
|
13
|
+
if (declared > maxBytes)
|
|
14
|
+
throw new Error(`response exceeds ${maxBytes} bytes`);
|
|
15
|
+
if (!response.body)
|
|
16
|
+
return '';
|
|
17
|
+
const reader = response.body.getReader();
|
|
18
|
+
const decoder = new TextDecoder();
|
|
19
|
+
let bytes = 0, output = '';
|
|
20
|
+
while (true) {
|
|
21
|
+
const { done, value } = await reader.read();
|
|
22
|
+
if (done)
|
|
23
|
+
break;
|
|
24
|
+
bytes += value.byteLength;
|
|
25
|
+
if (bytes > maxBytes) {
|
|
26
|
+
await reader.cancel();
|
|
27
|
+
throw new Error(`response exceeds ${maxBytes} bytes`);
|
|
28
|
+
}
|
|
29
|
+
output += decoder.decode(value, { stream: true });
|
|
30
|
+
}
|
|
31
|
+
return output + decoder.decode();
|
|
32
|
+
}
|
|
33
|
+
async function readResponseJson(response, maxBytes = 2_000_000) {
|
|
34
|
+
const text = await readResponseText(response, maxBytes);
|
|
35
|
+
return JSON.parse(text);
|
|
36
|
+
}
|
|
37
|
+
module.exports = { assetMeta, readResponseText, readResponseJson };
|
|
38
|
+
//# sourceMappingURL=util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../lib/util.ts"],"names":[],"mappings":";;AAAA,gEAAgE;AAChE,0CAA0C;AAC1C,SAAS,SAAS,CAAkC,KAA2B;IAC7E,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;IAC7C,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,QAAkB,EAAE,QAAQ,GAAG,SAAS;IACtE,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;IACrE,IAAI,QAAQ,GAAG,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,QAAQ,QAAQ,CAAC,CAAC;IAC/E,IAAI,CAAC,QAAQ,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IAC9B,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;IACzC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,IAAI,KAAK,GAAG,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC;IAC3B,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QAC5C,IAAI,IAAI;YAAE,MAAM;QAChB,KAAK,IAAI,KAAK,CAAC,UAAU,CAAC;QAC1B,IAAI,KAAK,GAAG,QAAQ,EAAE,CAAC;YAAC,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;YAAC,MAAM,IAAI,KAAK,CAAC,oBAAoB,QAAQ,QAAQ,CAAC,CAAC;QAAC,CAAC;QACvG,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;AACnC,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,QAAkB,EAAE,QAAQ,GAAG,SAAS;IACtE,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACxD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,OAAO,GAAG,EAAE,SAAS,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,CAAC"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const { safeId } = require('./catalog');
|
|
4
|
+
const WORKSPACE_FILE = 'workspaces.json';
|
|
5
|
+
const PROJECT_FILE = 'projects.json';
|
|
6
|
+
const ASSET_FILE = 'assets.json';
|
|
7
|
+
function now() { return new Date().toISOString(); }
|
|
8
|
+
function createWorkspaceStore(store) {
|
|
9
|
+
function workspaces() { return store.read(WORKSPACE_FILE, []); }
|
|
10
|
+
function projects() { return store.read(PROJECT_FILE, []); }
|
|
11
|
+
function assets() { return store.read(ASSET_FILE, []); }
|
|
12
|
+
function ensureSeed() {
|
|
13
|
+
let rows = workspaces();
|
|
14
|
+
if (!rows.length) {
|
|
15
|
+
const timestamp = now();
|
|
16
|
+
rows = [{ id: 'ws_default', name: '默认工作区', description: 'MultiChat 本地 Agent 工作区', createdAt: timestamp, updatedAt: timestamp, defaultProjectId: 'pr_inbox' }];
|
|
17
|
+
store.write(WORKSPACE_FILE, rows);
|
|
18
|
+
}
|
|
19
|
+
let projectRows = projects();
|
|
20
|
+
if (!projectRows.length) {
|
|
21
|
+
const timestamp = now();
|
|
22
|
+
projectRows = [{ id: 'pr_inbox', workspaceId: rows[0].id, name: '收件箱', description: '未分类的对话和文件', createdAt: timestamp, updatedAt: timestamp }];
|
|
23
|
+
store.write(PROJECT_FILE, projectRows);
|
|
24
|
+
}
|
|
25
|
+
if (!store.read(ASSET_FILE, null))
|
|
26
|
+
store.write(ASSET_FILE, []);
|
|
27
|
+
}
|
|
28
|
+
function getWorkspace(id) { return workspaces().find(x => x.id === id) || null; }
|
|
29
|
+
function getProject(id) { return projects().find(x => x.id === id) || null; }
|
|
30
|
+
function getAsset(id) { return assets().find(x => x.id === id) || null; }
|
|
31
|
+
function requireWorkspace(id) {
|
|
32
|
+
const value = getWorkspace(id);
|
|
33
|
+
if (!value)
|
|
34
|
+
throw new Error('workspace not found');
|
|
35
|
+
return value;
|
|
36
|
+
}
|
|
37
|
+
function requireProject(id) {
|
|
38
|
+
const value = getProject(id);
|
|
39
|
+
if (!value)
|
|
40
|
+
throw new Error('project not found');
|
|
41
|
+
return value;
|
|
42
|
+
}
|
|
43
|
+
function createWorkspace(input = {}) {
|
|
44
|
+
const timestamp = now();
|
|
45
|
+
const workspaceId = 'ws_' + Date.now().toString(36);
|
|
46
|
+
const projectId = 'pr_' + Date.now().toString(36) + Math.random().toString(36).slice(2, 5);
|
|
47
|
+
const row = { id: workspaceId, name: String(input.name || '新工作区').trim(), description: String(input.description || '').trim(), createdAt: timestamp, updatedAt: timestamp, defaultProjectId: projectId };
|
|
48
|
+
if (!row.name)
|
|
49
|
+
throw new Error('workspace name is required');
|
|
50
|
+
const project = { id: projectId, workspaceId, name: '收件箱', description: '未分类的对话和文件', createdAt: timestamp, updatedAt: timestamp };
|
|
51
|
+
const rows = workspaces();
|
|
52
|
+
rows.unshift(row);
|
|
53
|
+
store.write(WORKSPACE_FILE, rows);
|
|
54
|
+
const projectRows = projects();
|
|
55
|
+
projectRows.unshift(project);
|
|
56
|
+
store.write(PROJECT_FILE, projectRows);
|
|
57
|
+
return row;
|
|
58
|
+
}
|
|
59
|
+
function updateWorkspace(id, input = {}) {
|
|
60
|
+
const rows = workspaces();
|
|
61
|
+
const index = rows.findIndex(x => x.id === id);
|
|
62
|
+
if (index < 0)
|
|
63
|
+
throw new Error('workspace not found');
|
|
64
|
+
const current = rows[index];
|
|
65
|
+
rows[index] = { ...current, ...(input.name !== undefined ? { name: String(input.name).trim() } : {}), ...(input.description !== undefined ? { description: String(input.description).trim() } : {}), updatedAt: now(), id: current.id };
|
|
66
|
+
if (!rows[index].name)
|
|
67
|
+
throw new Error('workspace name is required');
|
|
68
|
+
store.write(WORKSPACE_FILE, rows);
|
|
69
|
+
return rows[index];
|
|
70
|
+
}
|
|
71
|
+
function removeWorkspace(id) {
|
|
72
|
+
const rows = workspaces();
|
|
73
|
+
if (rows.length <= 1)
|
|
74
|
+
throw new Error('at least one workspace is required');
|
|
75
|
+
const workspace = requireWorkspace(id);
|
|
76
|
+
const remaining = rows.filter(x => x.id !== id);
|
|
77
|
+
const projectRows = projects().filter(x => x.workspaceId !== id);
|
|
78
|
+
const projectIds = new Set(projects().filter(x => x.workspaceId === id).map(x => x.id));
|
|
79
|
+
const assetRows = assets().filter(x => x.workspaceId !== id && !projectIds.has(x.projectId));
|
|
80
|
+
store.write(WORKSPACE_FILE, remaining);
|
|
81
|
+
store.write(PROJECT_FILE, projectRows);
|
|
82
|
+
store.write(ASSET_FILE, assetRows);
|
|
83
|
+
return workspace;
|
|
84
|
+
}
|
|
85
|
+
function createProject(input = {}) {
|
|
86
|
+
const workspaceId = safeId(input.workspaceId || '', 'workspace id');
|
|
87
|
+
requireWorkspace(workspaceId);
|
|
88
|
+
const timestamp = now();
|
|
89
|
+
const row = { id: 'pr_' + Date.now().toString(36), workspaceId, name: String(input.name || '新项目').trim(), description: String(input.description || '').trim(), createdAt: timestamp, updatedAt: timestamp };
|
|
90
|
+
if (!row.name)
|
|
91
|
+
throw new Error('project name is required');
|
|
92
|
+
const rows = projects();
|
|
93
|
+
rows.unshift(row);
|
|
94
|
+
store.write(PROJECT_FILE, rows);
|
|
95
|
+
return row;
|
|
96
|
+
}
|
|
97
|
+
function updateProject(id, input = {}) {
|
|
98
|
+
const rows = projects();
|
|
99
|
+
const index = rows.findIndex(x => x.id === id);
|
|
100
|
+
if (index < 0)
|
|
101
|
+
throw new Error('project not found');
|
|
102
|
+
const current = rows[index];
|
|
103
|
+
const nullableId = (value, label) => value == null || value === '' ? null : safeId(value, label);
|
|
104
|
+
rows[index] = {
|
|
105
|
+
...current,
|
|
106
|
+
...(input.name !== undefined ? { name: String(input.name).trim() } : {}),
|
|
107
|
+
...(input.description !== undefined ? { description: String(input.description).trim() } : {}),
|
|
108
|
+
...(input.defaultAgentId !== undefined ? { defaultAgentId: nullableId(input.defaultAgentId, 'agent id') } : {}),
|
|
109
|
+
...(input.defaultProviderId !== undefined ? { defaultProviderId: nullableId(input.defaultProviderId, 'provider id') } : {}),
|
|
110
|
+
...(input.defaultModel !== undefined ? { defaultModel: input.defaultModel == null || input.defaultModel === '' ? null : String(input.defaultModel).trim().slice(0, 200) } : {}),
|
|
111
|
+
updatedAt: now(), id: current.id, workspaceId: current.workspaceId,
|
|
112
|
+
};
|
|
113
|
+
if (!rows[index].name)
|
|
114
|
+
throw new Error('project name is required');
|
|
115
|
+
store.write(PROJECT_FILE, rows);
|
|
116
|
+
return rows[index];
|
|
117
|
+
}
|
|
118
|
+
function removeProject(id) {
|
|
119
|
+
const project = requireProject(id);
|
|
120
|
+
if (projects().filter(x => x.workspaceId === project.workspaceId).length <= 1)
|
|
121
|
+
throw new Error('a workspace must keep one project');
|
|
122
|
+
store.write(PROJECT_FILE, projects().filter(x => x.id !== id));
|
|
123
|
+
store.write(ASSET_FILE, assets().filter(x => x.projectId !== id));
|
|
124
|
+
return project;
|
|
125
|
+
}
|
|
126
|
+
function createAsset(input = {}) {
|
|
127
|
+
const project = requireProject(safeId(input.projectId || '', 'project id'));
|
|
128
|
+
const content = String(input.content || '');
|
|
129
|
+
if (!content)
|
|
130
|
+
throw new Error('asset content is required');
|
|
131
|
+
if (Buffer.byteLength(content, 'utf8') > 2_000_000)
|
|
132
|
+
throw new Error('asset content exceeds 2 MB');
|
|
133
|
+
const timestamp = now();
|
|
134
|
+
const row = { id: 'asset_' + Date.now().toString(36) + Math.random().toString(36).slice(2, 6), workspaceId: project.workspaceId, projectId: project.id, name: String(input.name || '未命名文件').trim(), mimeType: String(input.mimeType || 'text/plain'), size: Buffer.byteLength(content, 'utf8'), source: input.source === 'url' ? 'url' : 'local', url: input.url ? String(input.url) : null, content, createdAt: timestamp, updatedAt: timestamp };
|
|
135
|
+
if (!row.name)
|
|
136
|
+
throw new Error('asset name is required');
|
|
137
|
+
const rows = assets();
|
|
138
|
+
rows.unshift(row);
|
|
139
|
+
store.write(ASSET_FILE, rows);
|
|
140
|
+
return row;
|
|
141
|
+
}
|
|
142
|
+
function removeAsset(id) {
|
|
143
|
+
const asset = getAsset(id);
|
|
144
|
+
if (!asset)
|
|
145
|
+
throw new Error('asset not found');
|
|
146
|
+
store.write(ASSET_FILE, assets().filter(x => x.id !== id));
|
|
147
|
+
return asset;
|
|
148
|
+
}
|
|
149
|
+
return { ensureSeed, workspaces, projects, assets, getWorkspace, getProject, getAsset, requireWorkspace, requireProject, createWorkspace, updateWorkspace, removeWorkspace, createProject, updateProject, removeProject, createAsset, removeAsset };
|
|
150
|
+
}
|
|
151
|
+
module.exports = { createWorkspaceStore, WORKSPACE_FILE, PROJECT_FILE, ASSET_FILE };
|
|
152
|
+
//# sourceMappingURL=workspace-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-store.js","sourceRoot":"","sources":["../../lib/workspace-store.ts"],"names":[],"mappings":"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"}
|