manifest 5.33.8 → 5.33.10

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
@@ -45,13 +45,7 @@ Manifest is a smart model router for OpenClaw. It sits between your agent and yo
45
45
 
46
46
  ### Cloud version
47
47
 
48
- ```bash
49
- openclaw plugins install manifest-provider
50
- openclaw providers setup manifest-provider # prompts for your API key
51
- openclaw gateway restart
52
- ```
53
-
54
- Get your API key at [app.manifest.build](https://app.manifest.build). After setup, `manifest/auto` is available as a model.
48
+ Go to [app.manifest.build](https://app.manifest.build) and follow the guide.
55
49
 
56
50
  ### Local version
57
51
 
@@ -60,13 +54,11 @@ openclaw plugins install manifest
60
54
  openclaw gateway restart
61
55
  ```
62
56
 
63
- 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. No account or API key needed.
64
-
65
- Open the dashboard, connect a provider, and start chatting. All data stays on your machine.
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.
66
58
 
67
59
  ### Cloud vs local
68
60
 
69
- Pick cloud (`manifest-provider`) for quick setup and multi-device access. Pick local (`manifest`) for keeping all data on your machine or for using local models like Ollama.
61
+ Pick cloud version for quick setup and multi-device access. Pick local version for keeping all your data on your machine or for using local models like Ollama.
70
62
 
71
63
  Not sure which one to choose? Start with cloud.
72
64
 
@@ -80,7 +72,7 @@ All routing data (tokens, costs, model, duration) is recorded automatically. You
80
72
 
81
73
  | | Manifest | OpenRouter |
82
74
  | ------------ | -------------------------------------------- | --------------------------------------------------- |
83
- | Architecture | Your providers, your keys. Local or cloud | Cloud proxy. All traffic goes through their servers |
75
+ | Architecture | Local. Your requests, your providers | Cloud proxy. All traffic goes through their servers |
84
76
  | Cost | Free | 5% fee on every API call |
85
77
  | Source code | MIT, fully open | Proprietary |
86
78
  | Data privacy | Metadata only (cloud) or fully local | Prompts and responses pass through a third party |
@@ -112,6 +104,7 @@ Manifest is open source under the [MIT license](LICENSE). See [CONTRIBUTING.md](
112
104
 
113
105
  ## Quick links
114
106
 
107
+ - [GitHub](https://github.com/mnfst/manifest)
115
108
  - [Docs](https://manifest.build/docs)
116
109
  - [Discord](https://discord.com/invite/FepAked3W7)
117
110
  - [Discussions](https://github.com/mnfst/manifest/discussions)
@@ -12,7 +12,8 @@ function computeTokenCost(input) {
12
12
  if (!pricing || pricing.input_price_per_token == null || pricing.output_price_per_token == null) {
13
13
  return null;
14
14
  }
15
- return (input.inputTokens * Number(pricing.input_price_per_token) +
16
- input.outputTokens * Number(pricing.output_price_per_token));
15
+ const cost = input.inputTokens * Number(pricing.input_price_per_token) +
16
+ input.outputTokens * Number(pricing.output_price_per_token);
17
+ return cost < 0 ? null : cost;
17
18
  }
18
19
  //# sourceMappingURL=cost-calculator.js.map
@@ -67,6 +67,7 @@ const _1773500000000_DropModelPricingTables_1 = require("./migrations/1773500000
67
67
  const _1773600000000_AddOverrideProvider_1 = require("./migrations/1773600000000-AddOverrideProvider");
68
68
  const _1773650000000_AddProviderRegion_1 = require("./migrations/1773650000000-AddProviderRegion");
69
69
  const _1773700000000_DropSecurityEventTable_1 = require("./migrations/1773700000000-DropSecurityEventTable");
70
+ const _1773800000000_FixNegativeCosts_1 = require("./migrations/1773800000000-FixNegativeCosts");
70
71
  const entities = [
71
72
  agent_message_entity_1.AgentMessage,
72
73
  llm_call_entity_1.LlmCall,
@@ -123,6 +124,7 @@ const migrations = [
123
124
  _1773600000000_AddOverrideProvider_1.AddOverrideProvider1773600000000,
124
125
  _1773650000000_AddProviderRegion_1.AddProviderRegion1773650000000,
125
126
  _1773700000000_DropSecurityEventTable_1.DropSecurityEventTable1773700000000,
127
+ _1773800000000_FixNegativeCosts_1.FixNegativeCosts1773800000000,
126
128
  ];
127
129
  const isLocalMode = process.env['MANIFEST_MODE'] === 'local';
128
130
  function buildModeServices() {
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FixNegativeCosts1773800000000 = void 0;
4
+ class FixNegativeCosts1773800000000 {
5
+ async up(queryRunner) {
6
+ await queryRunner.query(`UPDATE "agent_messages" SET "cost_usd" = NULL WHERE "cost_usd" < 0`);
7
+ }
8
+ async down(_queryRunner) {
9
+ }
10
+ }
11
+ exports.FixNegativeCosts1773800000000 = FixNegativeCosts1773800000000;
12
+ //# sourceMappingURL=1773800000000-FixNegativeCosts.js.map
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.OtlpDeprecatedController = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const public_decorator_1 = require("../common/decorators/public.decorator");
15
+ const GONE_RESPONSE = {
16
+ error: {
17
+ message: 'OTLP telemetry endpoints have been removed. ' +
18
+ 'Use the routing proxy at /v1/chat/completions instead. ' +
19
+ 'See https://manifest.build/docs/migration for details.',
20
+ type: 'gone',
21
+ status: 410,
22
+ },
23
+ };
24
+ let OtlpDeprecatedController = class OtlpDeprecatedController {
25
+ traces() {
26
+ return GONE_RESPONSE;
27
+ }
28
+ metrics() {
29
+ return GONE_RESPONSE;
30
+ }
31
+ logs() {
32
+ return GONE_RESPONSE;
33
+ }
34
+ };
35
+ exports.OtlpDeprecatedController = OtlpDeprecatedController;
36
+ __decorate([
37
+ (0, common_1.All)('otlp/v1/traces'),
38
+ (0, common_1.HttpCode)(common_1.HttpStatus.GONE),
39
+ __metadata("design:type", Function),
40
+ __metadata("design:paramtypes", []),
41
+ __metadata("design:returntype", void 0)
42
+ ], OtlpDeprecatedController.prototype, "traces", null);
43
+ __decorate([
44
+ (0, common_1.All)('otlp/v1/metrics'),
45
+ (0, common_1.HttpCode)(common_1.HttpStatus.GONE),
46
+ __metadata("design:type", Function),
47
+ __metadata("design:paramtypes", []),
48
+ __metadata("design:returntype", void 0)
49
+ ], OtlpDeprecatedController.prototype, "metrics", null);
50
+ __decorate([
51
+ (0, common_1.All)('otlp/v1/logs'),
52
+ (0, common_1.HttpCode)(common_1.HttpStatus.GONE),
53
+ __metadata("design:type", Function),
54
+ __metadata("design:paramtypes", []),
55
+ __metadata("design:returntype", void 0)
56
+ ], OtlpDeprecatedController.prototype, "logs", null);
57
+ exports.OtlpDeprecatedController = OtlpDeprecatedController = __decorate([
58
+ (0, common_1.Controller)(),
59
+ (0, public_decorator_1.Public)()
60
+ ], OtlpDeprecatedController);
61
+ //# sourceMappingURL=otlp-deprecated.controller.js.map
@@ -15,12 +15,14 @@ const tenant_entity_1 = require("../entities/tenant.entity");
15
15
  const user_provider_entity_1 = require("../entities/user-provider.entity");
16
16
  const api_key_service_1 = require("./services/api-key.service");
17
17
  const agent_key_auth_guard_1 = require("./guards/agent-key-auth.guard");
18
+ const otlp_deprecated_controller_1 = require("./otlp-deprecated.controller");
18
19
  let OtlpModule = class OtlpModule {
19
20
  };
20
21
  exports.OtlpModule = OtlpModule;
21
22
  exports.OtlpModule = OtlpModule = __decorate([
22
23
  (0, common_1.Module)({
23
24
  imports: [typeorm_1.TypeOrmModule.forFeature([agent_api_key_entity_1.AgentApiKey, agent_entity_1.Agent, tenant_entity_1.Tenant, user_provider_entity_1.UserProvider])],
25
+ controllers: [otlp_deprecated_controller_1.OtlpDeprecatedController],
24
26
  providers: [api_key_service_1.ApiKeyGeneratorService, agent_key_auth_guard_1.AgentKeyAuthGuard],
25
27
  exports: [api_key_service_1.ApiKeyGeneratorService, agent_key_auth_guard_1.AgentKeyAuthGuard, typeorm_1.TypeOrmModule],
26
28
  })
@@ -50,6 +50,7 @@ let ProxyService = ProxyService_1 = class ProxyService {
50
50
  if (!messages || !Array.isArray(messages) || messages.length === 0) {
51
51
  throw new common_1.BadRequestException('messages array is required');
52
52
  }
53
+ sanitizeNullContent(messages);
53
54
  await this.enforceLimits(tenantId, agentName);
54
55
  const scoringMessages = this.filterScoringMessages(messages);
55
56
  const scoringTools = Array.isArray(body.tools) ? body.tools : undefined;
@@ -269,4 +270,10 @@ exports.ProxyService = ProxyService = ProxyService_1 = __decorate([
269
270
  limit_check_service_1.LimitCheckService,
270
271
  proxy_fallback_service_1.ProxyFallbackService])
271
272
  ], ProxyService);
273
+ function sanitizeNullContent(messages) {
274
+ for (const msg of messages) {
275
+ if (msg && typeof msg === 'object' && msg.content === null)
276
+ msg.content = '';
277
+ }
278
+ }
272
279
  //# sourceMappingURL=proxy.service.js.map
package/dist/index.js CHANGED
@@ -1,8 +1,9 @@
1
1
  /* manifest-local — OpenClaw Self-Hosted LLM Router */
2
- "use strict";var r=require("fs"),c=require("path"),h=require("os"),b=require("crypto");var u=require("fs");function d(n){if(!(0,u.existsSync)(n))return{};try{let i=JSON.parse((0,u.readFileSync)(n,"utf-8"));return i&&typeof i=="object"&&!Array.isArray(i)?i:{}}catch{return{}}}var v="mnfst_",p=(0,c.join)((0,h.homedir)(),".openclaw","manifest"),m=(0,c.join)(p,"config.json"),w=(0,c.join)((0,h.homedir)(),".openclaw"),S=(0,c.join)(w,"openclaw.json"),P=3e3;function E(){(0,r.existsSync)(p)||(0,r.mkdirSync)(p,{recursive:!0,mode:448})}function j(){if(E(),(0,r.existsSync)(m)){let t=d(m);if(t.apiKey&&t.apiKey.startsWith(v))return t.apiKey}let n=`${v}local_${(0,b.randomBytes)(24).toString("hex")}`,i=d(m);return(0,r.writeFileSync)(m,JSON.stringify({...i,apiKey:n},null,2),{mode:384}),n}function y(n,i){let t=(0,c.dirname)(n);(0,r.existsSync)(t)||(0,r.mkdirSync)(t,{recursive:!0,mode:448});let o=`${n}.tmp.${process.pid}`;(0,r.writeFileSync)(o,JSON.stringify(i,null,2),{mode:384}),(0,r.renameSync)(o,n)}function x(n,i,t,o){let f={baseUrl:i,api:"openai-completions",apiKey:t,models:[{id:"auto",name:"auto"}]};try{let e=d(S);e.models||(e.models={}),e.models.providers||(e.models.providers={}),e.models.providers.manifest=f,e.agents||(e.agents={}),e.agents.defaults||(e.agents.defaults={}),e.agents.defaults.models||(e.agents.defaults.models={});let s=e.agents.defaults.models;Array.isArray(s)?s.includes("manifest/auto")||s.push("manifest/auto"):typeof s=="object"&&("manifest/auto"in s||(s["manifest/auto"]={})),y(S,e),o.debug("[manifest] Wrote provider config to openclaw.json")}catch(e){let s=e instanceof Error?e.message:String(e);o.debug(`[manifest] Could not write openclaw.json: ${s}`)}try{let e=(0,c.join)(w,"agents");if((0,r.existsSync)(e)){let s=(0,r.readdirSync)(e,{withFileTypes:!0}).filter(a=>a.isDirectory());for(let a of s){let l=(0,c.join)(e,a.name,"agent","models.json");if(!(0,r.existsSync)(l))continue;let g=d(l);g.providers?.manifest&&(delete g.providers.manifest,y(l,g))}}}catch{}try{if(n.config){n.config.models||(n.config.models={}),n.config.models.providers||(n.config.models.providers={}),n.config.models.providers.manifest=f,n.config.agents||(n.config.agents={}),n.config.agents.defaults||(n.config.agents.defaults={}),n.config.agents.defaults.models||(n.config.agents.defaults.models={});let e=n.config.agents.defaults.models;Array.isArray(e)?e.includes("manifest/auto")||e.push("manifest/auto"):typeof e=="object"&&("manifest/auto"in e||(e["manifest/auto"]={}))}}catch{}}function A(n,i){let t=(0,c.join)(w,"agents");if(!(0,r.existsSync)(t))return;let o={type:"api_key",provider:"manifest",key:n};try{let f=(0,r.readdirSync)(t,{withFileTypes:!0}).filter(e=>e.isDirectory());for(let e of f){let s=(0,c.join)(t,e.name,"agent","auth-profiles.json");if(!(0,r.existsSync)((0,c.dirname)(s)))continue;let a=d(s);a.version||(a.version=1),a.profiles||(a.profiles={});let l=a.profiles["manifest:default"];l&&l.key===n||(a.profiles["manifest:default"]=o,y(s,a))}}catch(f){let e=f instanceof Error?f.message:String(f);i.debug(`[manifest] Auth profile injection error: ${e}`)}}async function $(n,i){try{return(await fetch(`http://${n}:${i}/api/v1/health`,{signal:AbortSignal.timeout(P)})).ok}catch{return!1}}function k(n,i,t,o){let f=j(),e=(0,c.join)(p,"manifest.db");o.debug("[manifest] Starting embedded server..."),x(n,`http://${t}:${i}/v1`,f,o),A(f,o);let s;try{s=require("./server")}catch(a){let l=a instanceof Error?a.message:String(a);o.error(`[manifest] Failed to load embedded server.
3
- Error: ${l}
4
- This is a packaging error \u2014 please reinstall the manifest plugin.`);return}o.info(`[manifest] Dashboard -> http://${t}:${i}`),n.registerService({id:"manifest",start:async()=>{if(await $(t,i)){o.info(`[manifest] Reusing existing server at http://${t}:${i}`);return}try{await s.start({port:i,host:t,dbPath:e,quiet:!0}),o.info(`[manifest] Server running on http://${t}:${i}`),o.info(`[manifest] DB: ${e}`)}catch(l){let g=l instanceof Error?l.message:String(l);g.includes("EADDRINUSE")||g.includes("address already in use")?await $(t,i)?o.info(`[manifest] Reusing existing server at http://${t}:${i}`):o.error(`[manifest] Port ${i} is already in use by another process.
5
- Change it with: openclaw config set plugins.entries.manifest.config.port ${i+1}
6
- Then restart the gateway.`):o.error(`[manifest] Failed to start local server: ${g}
2
+ "use strict";var r=require("fs"),l=require("path"),w=require("os"),S=require("crypto");var g=require("fs");function u(n){if(!(0,g.existsSync)(n))return{};try{let s=JSON.parse((0,g.readFileSync)(n,"utf-8"));return s&&typeof s=="object"&&!Array.isArray(s)?s:{}}catch{return{}}}var b="mnfst_",y=(0,l.join)((0,w.homedir)(),".openclaw","manifest"),m=(0,l.join)(y,"config.json"),v=(0,l.join)((0,w.homedir)(),".openclaw"),k=(0,l.join)(v,"openclaw.json"),P=3e3;function j(){(0,r.existsSync)(y)||(0,r.mkdirSync)(y,{recursive:!0,mode:448})}function E(){if(j(),(0,r.existsSync)(m)){let t=u(m);if(t.apiKey&&t.apiKey.startsWith(b))return t.apiKey}let n=`${b}local_${(0,S.randomBytes)(24).toString("hex")}`,s=u(m);return(0,r.writeFileSync)(m,JSON.stringify({...s,apiKey:n},null,2),{mode:384}),n}function h(n,s){let t=(0,l.dirname)(n);(0,r.existsSync)(t)||(0,r.mkdirSync)(t,{recursive:!0,mode:448});let i=`${n}.tmp.${process.pid}`;(0,r.writeFileSync)(i,JSON.stringify(s,null,2),{mode:384}),(0,r.renameSync)(i,n)}function x(n,s,t,i){let f={baseUrl:s,api:"openai-completions",apiKey:t,models:[{id:"auto",name:"auto"}]};try{let e=u(k);e.models||(e.models={}),e.models.providers||(e.models.providers={}),e.models.providers.manifest=f,e.agents||(e.agents={}),e.agents.defaults||(e.agents.defaults={}),e.agents.defaults.models||(e.agents.defaults.models={});let o=e.agents.defaults.models;Array.isArray(o)?o.includes("manifest/auto")||o.push("manifest/auto"):typeof o=="object"&&("manifest/auto"in o||(o["manifest/auto"]={})),h(k,e),i.debug("[manifest] Wrote provider config to openclaw.json")}catch(e){let o=e instanceof Error?e.message:String(e);i.debug(`[manifest] Could not write openclaw.json: ${o}`)}try{let e=(0,l.join)(v,"agents");if((0,r.existsSync)(e)){let o=(0,r.readdirSync)(e,{withFileTypes:!0}).filter(a=>a.isDirectory());for(let a of o){let c=(0,l.join)(e,a.name,"agent","models.json");if(!(0,r.existsSync)(c))continue;let d=u(c);d.providers?.manifest&&(delete d.providers.manifest,h(c,d))}}}catch{}try{if(n.config){n.config.models||(n.config.models={}),n.config.models.providers||(n.config.models.providers={}),n.config.models.providers.manifest=f,n.config.agents||(n.config.agents={}),n.config.agents.defaults||(n.config.agents.defaults={}),n.config.agents.defaults.models||(n.config.agents.defaults.models={});let e=n.config.agents.defaults.models;Array.isArray(e)?e.includes("manifest/auto")||e.push("manifest/auto"):typeof e=="object"&&("manifest/auto"in e||(e["manifest/auto"]={}))}}catch{}}function A(n,s){let t=(0,l.join)(v,"agents");if(!(0,r.existsSync)(t))return;let i={type:"api_key",provider:"manifest",key:n};try{let f=(0,r.readdirSync)(t,{withFileTypes:!0}).filter(e=>e.isDirectory());for(let e of f){let o=(0,l.join)(t,e.name,"agent","auth-profiles.json");if(!(0,r.existsSync)((0,l.dirname)(o)))continue;let a=u(o);a.version||(a.version=1),a.profiles||(a.profiles={});let c=a.profiles["manifest:default"];c&&c.key===n||(a.profiles["manifest:default"]=i,h(o,a))}}catch(f){let e=f instanceof Error?f.message:String(f);s.debug(`[manifest] Auth profile injection error: ${e}`)}}async function p(n,s){try{let t=await fetch(`http://${n}:${s}/api/v1/health`,{signal:AbortSignal.timeout(P)});if(!t.ok)return!1;let i=await t.json();return i!==null&&typeof i=="object"&&"status"in i&&i.status==="healthy"}catch{return!1}}function $(n,s,t,i){let f=E(),e=(0,l.join)(y,"manifest.db");i.debug("[manifest] Starting embedded server..."),x(n,`http://${t}:${s}/v1`,f,i),A(f,i);let o;try{o=require("./server")}catch(a){let c=a instanceof Error?a.message:String(a);i.error(`[manifest] Failed to load embedded server.
3
+ Error: ${c}
4
+ This is a packaging error \u2014 please reinstall the manifest plugin.`);return}n.registerService({id:"manifest",start:async()=>{if(i.debug("[manifest] Service start callback invoked"),await p(t,s)){i.info(`[manifest] Reusing existing server at http://${t}:${s}`);return}try{await o.start({port:s,host:t,dbPath:e,quiet:!0}),await p(t,s)?(i.info(`[manifest] Dashboard -> http://${t}:${s}`),i.info(`[manifest] DB: ${e}`)):(i.warn??i.info)(`[manifest] Server started but health check failed.
5
+ The dashboard may not be accessible at http://${t}:${s}`)}catch(c){let d=c instanceof Error?c.message:String(c);d.includes("EADDRINUSE")||d.includes("address already in use")?await p(t,s)?i.info(`[manifest] Reusing existing server at http://${t}:${s}`):i.error(`[manifest] Port ${s} is already in use by another process.
6
+ Change it with: openclaw config set plugins.entries.manifest.config.port ${s+1}
7
+ Then restart the gateway.`):i.error(`[manifest] Failed to start local server: ${d}
7
8
  Try reinstalling: openclaw plugins install manifest
8
- Then restart: openclaw gateway restart`)}}})}module.exports={id:"manifest",name:"Manifest \u2014 Self-Hosted LLM Router",register(n){let i=n.logger||{info:(...s)=>console.log(...s),debug:()=>{},error:(...s)=>console.error(...s),warn:(...s)=>console.warn(...s)},t=n.pluginConfig||{},o=t&&typeof t=="object"&&"config"in t&&t.config!=null&&typeof t.config=="object"?t.config:t,f=typeof o.port=="number"&&o.port>0?o.port:2099,e=typeof o.host=="string"&&o.host.length>0?o.host:"127.0.0.1";k(n,f,e,i)}};
9
+ Then restart: openclaw gateway restart`)}}})}module.exports={id:"manifest",name:"Manifest \u2014 Self-Hosted LLM Router",register(n){let s=n.logger||{info:(...o)=>console.log(...o),debug:()=>{},error:(...o)=>console.error(...o),warn:(...o)=>console.warn(...o)},t=n.pluginConfig||{},i=t&&typeof t=="object"&&"config"in t&&t.config!=null&&typeof t.config=="object"?t.config:t,f=typeof i.port=="number"&&i.port>0?i.port:2099,e=typeof i.host=="string"&&i.host.length>0?i.host:"127.0.0.1";$(n,f,e,s)}};
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "manifest",
3
3
  "name": "Manifest — Self-Hosted LLM Router",
4
- "version": "5.33.8",
4
+ "version": "5.33.10",
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.8",
4
+ "version": "5.33.10",
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.8",
3
+ "version": "5.33.10",
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",