manifest 5.33.18 → 5.33.20
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
CHANGED
|
@@ -54,11 +54,6 @@ openclaw plugins install manifest
|
|
|
54
54
|
openclaw gateway restart
|
|
55
55
|
```
|
|
56
56
|
|
|
57
|
-
> **OpenClaw 2026.3.22+:** If you see `"manifest" is a skill`, install from npm directly:
|
|
58
|
-
> ```bash
|
|
59
|
-
> openclaw plugins install "/tmp/$(npm pack manifest --pack-destination /tmp | tail -1)"
|
|
60
|
-
> ```
|
|
61
|
-
|
|
62
57
|
Dashboard opens at **http://127.0.0.1:2099**. The plugin starts an embedded server, runs the dashboard locally, and registers itself as a provider automatically. No account or API key needed.
|
|
63
58
|
|
|
64
59
|
### Cloud vs local
|
|
@@ -19,20 +19,23 @@ const typeorm_2 = require("typeorm");
|
|
|
19
19
|
const uuid_1 = require("uuid");
|
|
20
20
|
const agent_message_entity_1 = require("../../entities/agent-message.entity");
|
|
21
21
|
const model_pricing_cache_service_1 = require("../../model-prices/model-pricing-cache.service");
|
|
22
|
+
const ingest_event_bus_service_1 = require("../../common/services/ingest-event-bus.service");
|
|
22
23
|
const proxy_message_dedup_1 = require("./proxy-message-dedup");
|
|
23
24
|
const cost_calculator_1 = require("../../common/utils/cost-calculator");
|
|
24
25
|
let ProxyMessageRecorder = class ProxyMessageRecorder {
|
|
25
26
|
messageRepo;
|
|
26
27
|
pricingCache;
|
|
27
28
|
dedup;
|
|
29
|
+
eventBus;
|
|
28
30
|
rateLimitCooldown = new Map();
|
|
29
31
|
RATE_LIMIT_COOLDOWN_MS = 60_000;
|
|
30
32
|
MAX_COOLDOWN_ENTRIES = 1_000;
|
|
31
33
|
cooldownCleanupTimer;
|
|
32
|
-
constructor(messageRepo, pricingCache, dedup) {
|
|
34
|
+
constructor(messageRepo, pricingCache, dedup, eventBus) {
|
|
33
35
|
this.messageRepo = messageRepo;
|
|
34
36
|
this.pricingCache = pricingCache;
|
|
35
37
|
this.dedup = dedup;
|
|
38
|
+
this.eventBus = eventBus;
|
|
36
39
|
this.cooldownCleanupTimer = setInterval(() => this.evictExpiredCooldowns(), 60_000);
|
|
37
40
|
if (typeof this.cooldownCleanupTimer === 'object' && 'unref' in this.cooldownCleanupTimer) {
|
|
38
41
|
this.cooldownCleanupTimer.unref();
|
|
@@ -77,6 +80,7 @@ let ProxyMessageRecorder = class ProxyMessageRecorder {
|
|
|
77
80
|
auth_type: authType ?? null,
|
|
78
81
|
user_id: ctx.userId,
|
|
79
82
|
});
|
|
83
|
+
this.eventBus.emit(ctx.userId);
|
|
80
84
|
}
|
|
81
85
|
async recordFailedFallbacks(ctx, tier, primaryModel, failures, opts) {
|
|
82
86
|
const { traceId, baseTimeMs, markHandled = false, lastAsError = false, authType } = opts ?? {};
|
|
@@ -113,6 +117,7 @@ let ProxyMessageRecorder = class ProxyMessageRecorder {
|
|
|
113
117
|
user_id: ctx.userId,
|
|
114
118
|
});
|
|
115
119
|
}
|
|
120
|
+
this.eventBus.emit(ctx.userId);
|
|
116
121
|
}
|
|
117
122
|
async recordPrimaryFailure(ctx, tier, model, errorBody, timestamp, authType) {
|
|
118
123
|
await this.messageRepo.insert({
|
|
@@ -135,6 +140,7 @@ let ProxyMessageRecorder = class ProxyMessageRecorder {
|
|
|
135
140
|
auth_type: authType ?? null,
|
|
136
141
|
user_id: ctx.userId,
|
|
137
142
|
});
|
|
143
|
+
this.eventBus.emit(ctx.userId);
|
|
138
144
|
}
|
|
139
145
|
async recordFallbackSuccess(ctx, model, tier, traceId, fallbackFromModel, fallbackIndex, timestamp, authType, usage) {
|
|
140
146
|
const inputTokens = usage?.prompt_tokens ?? 0;
|
|
@@ -166,6 +172,7 @@ let ProxyMessageRecorder = class ProxyMessageRecorder {
|
|
|
166
172
|
fallback_index: fallbackIndex ?? null,
|
|
167
173
|
user_id: ctx.userId,
|
|
168
174
|
});
|
|
175
|
+
this.eventBus.emit(ctx.userId);
|
|
169
176
|
}
|
|
170
177
|
async recordSuccessMessage(ctx, model, tier, reason, usage, traceId, authType, sessionKey, durationMs) {
|
|
171
178
|
if (usage.prompt_tokens === 0 && usage.completion_tokens === 0)
|
|
@@ -178,6 +185,7 @@ let ProxyMessageRecorder = class ProxyMessageRecorder {
|
|
|
178
185
|
isSubscription: authType === 'subscription',
|
|
179
186
|
});
|
|
180
187
|
const normalizedSessionKey = this.dedup.normalizeSessionKey(sessionKey);
|
|
188
|
+
let wrote = false;
|
|
181
189
|
await this.dedup.withSuccessWriteLock(this.dedup.getSuccessWriteLockKey(ctx, model, traceId, normalizedSessionKey), async () => {
|
|
182
190
|
await this.dedup.withAgentMessageTransaction(this.messageRepo, ctx, async (messageRepo) => {
|
|
183
191
|
const existing = await this.dedup.findExistingSuccessMessage(messageRepo, ctx, model, usage, traceId, normalizedSessionKey);
|
|
@@ -201,6 +209,7 @@ let ProxyMessageRecorder = class ProxyMessageRecorder {
|
|
|
201
209
|
if (normalizedSessionKey)
|
|
202
210
|
updatePayload.session_key = normalizedSessionKey;
|
|
203
211
|
await messageRepo.update({ id: existing.id }, updatePayload);
|
|
212
|
+
wrote = true;
|
|
204
213
|
return;
|
|
205
214
|
}
|
|
206
215
|
await messageRepo.insert({
|
|
@@ -226,8 +235,11 @@ let ProxyMessageRecorder = class ProxyMessageRecorder {
|
|
|
226
235
|
user_id: ctx.userId,
|
|
227
236
|
duration_ms: durationMs ?? null,
|
|
228
237
|
});
|
|
238
|
+
wrote = true;
|
|
229
239
|
});
|
|
230
240
|
});
|
|
241
|
+
if (wrote)
|
|
242
|
+
this.eventBus.emit(ctx.userId);
|
|
231
243
|
}
|
|
232
244
|
evictExpiredCooldowns() {
|
|
233
245
|
const now = Date.now();
|
|
@@ -243,6 +255,7 @@ exports.ProxyMessageRecorder = ProxyMessageRecorder = __decorate([
|
|
|
243
255
|
__param(0, (0, typeorm_1.InjectRepository)(agent_message_entity_1.AgentMessage)),
|
|
244
256
|
__metadata("design:paramtypes", [typeorm_2.Repository,
|
|
245
257
|
model_pricing_cache_service_1.ModelPricingCacheService,
|
|
246
|
-
proxy_message_dedup_1.ProxyMessageDedup
|
|
258
|
+
proxy_message_dedup_1.ProxyMessageDedup,
|
|
259
|
+
ingest_event_bus_service_1.IngestEventBusService])
|
|
247
260
|
], ProxyMessageRecorder);
|
|
248
261
|
//# sourceMappingURL=proxy-message-recorder.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "manifest",
|
|
3
3
|
"name": "Manifest — Self-Hosted LLM Router",
|
|
4
|
-
"version": "5.33.
|
|
4
|
+
"version": "5.33.20",
|
|
5
5
|
"description": "Run the Manifest LLM router locally with SQLite. Zero-config dashboard included.",
|
|
6
6
|
"author": "MNFST Inc.",
|
|
7
7
|
"homepage": "https://manifest.build",
|
package/openclaw.plugin.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "manifest",
|
|
3
3
|
"name": "Manifest — Self-Hosted LLM Router",
|
|
4
|
-
"version": "5.33.
|
|
4
|
+
"version": "5.33.20",
|
|
5
5
|
"description": "Run the Manifest LLM router locally with SQLite. Zero-config dashboard included.",
|
|
6
6
|
"author": "MNFST Inc.",
|
|
7
7
|
"homepage": "https://manifest.build",
|