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.18",
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",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "manifest",
3
3
  "name": "Manifest — Self-Hosted LLM Router",
4
- "version": "5.33.18",
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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "manifest",
3
- "version": "5.33.18",
3
+ "version": "5.33.20",
4
4
  "description": "Self-hosted Manifest LLM router with embedded server, SQLite database, and dashboard",
5
5
  "main": "dist/index.js",
6
6
  "license": "MIT",