manifest 5.6.5 → 5.7.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.
Files changed (30) hide show
  1. package/dist/backend/health/health.controller.d.ts +5 -0
  2. package/dist/backend/health/health.controller.js +8 -1
  3. package/dist/backend/health/health.controller.js.map +1 -1
  4. package/dist/backend/health/health.module.js +2 -0
  5. package/dist/backend/health/health.module.js.map +1 -1
  6. package/dist/backend/health/version-check.service.d.ts +20 -0
  7. package/dist/backend/health/version-check.service.js +84 -0
  8. package/dist/backend/health/version-check.service.js.map +1 -0
  9. package/dist/index.js +2 -2
  10. package/dist/server.d.ts +1 -1
  11. package/dist/server.js +4 -1
  12. package/package.json +1 -1
  13. package/public/assets/{EmailProviderConfig-BWTWQMLx.js → EmailProviderConfig-CS-GqTj9.js} +1 -1
  14. package/public/assets/{NotificationEmailSection-CgdATWK2.js → NotificationEmailSection-pk09N_ie.js} +1 -1
  15. package/public/assets/{index-Dn0JJjxw.css → index-CQkDZdf3.css} +1 -1
  16. package/public/assets/index-Ck-Ng2iC.js +5 -0
  17. package/public/icons/providers/alibaba.svg +1 -0
  18. package/public/icons/providers/amazon.svg +1 -0
  19. package/public/icons/providers/anthropic.svg +1 -0
  20. package/public/icons/providers/cohere.svg +1 -0
  21. package/public/icons/providers/deepseek.svg +1 -0
  22. package/public/icons/providers/google.svg +1 -0
  23. package/public/icons/providers/meta.svg +1 -0
  24. package/public/icons/providers/mistral.svg +1 -0
  25. package/public/icons/providers/moonshot.svg +1 -0
  26. package/public/icons/providers/openai.svg +1 -0
  27. package/public/icons/providers/xai.svg +1 -0
  28. package/public/icons/providers/zhipu.svg +1 -0
  29. package/public/index.html +2 -2
  30. package/public/assets/index-D6VMzqMs.js +0 -5
@@ -1,6 +1,11 @@
1
+ import { VersionCheckService } from './version-check.service';
1
2
  export declare class HealthController {
3
+ private readonly versionCheck;
2
4
  private readonly startTime;
5
+ constructor(versionCheck: VersionCheckService);
3
6
  getHealth(): {
7
+ latestVersion?: string;
8
+ updateAvailable?: boolean;
4
9
  status: string;
5
10
  uptime_seconds: number;
6
11
  version: string;
@@ -14,15 +14,21 @@ const common_1 = require("@nestjs/common");
14
14
  const public_decorator_1 = require("../common/decorators/public.decorator");
15
15
  const fs_1 = require("fs");
16
16
  const path_1 = require("path");
17
+ const version_check_service_1 = require("./version-check.service");
17
18
  const pkg = JSON.parse((0, fs_1.readFileSync)((0, path_1.join)(__dirname, '..', '..', 'package.json'), 'utf-8'));
18
19
  let HealthController = class HealthController {
20
+ versionCheck;
19
21
  startTime = Date.now();
22
+ constructor(versionCheck) {
23
+ this.versionCheck = versionCheck;
24
+ }
20
25
  getHealth() {
21
26
  return {
22
27
  status: 'healthy',
23
28
  uptime_seconds: Math.floor((Date.now() - this.startTime) / 1000),
24
29
  version: pkg.version,
25
30
  mode: process.env['MANIFEST_MODE'] === 'local' ? 'local' : 'cloud',
31
+ ...this.versionCheck.getUpdateInfo(),
26
32
  };
27
33
  }
28
34
  };
@@ -35,6 +41,7 @@ __decorate([
35
41
  __metadata("design:returntype", void 0)
36
42
  ], HealthController.prototype, "getHealth", null);
37
43
  exports.HealthController = HealthController = __decorate([
38
- (0, common_1.Controller)('api/v1')
44
+ (0, common_1.Controller)('api/v1'),
45
+ __metadata("design:paramtypes", [version_check_service_1.VersionCheckService])
39
46
  ], HealthController);
40
47
  //# sourceMappingURL=health.controller.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"health.controller.js","sourceRoot":"","sources":["../../src/health/health.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAAiD;AACjD,4EAA+D;AAC/D,2BAAkC;AAClC,+BAA4B;AAE5B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,iBAAY,EAAC,IAAA,WAAI,EAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAwB,CAAC;AAG3G,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;IACV,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAIxC,SAAS;QACP,OAAO;YACL,MAAM,EAAE,SAAS;YACjB,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;YAChE,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO;SACnE,CAAC;IACJ,CAAC;CACF,CAAA;AAbY,4CAAgB;AAK3B;IAFC,IAAA,yBAAM,GAAE;IACR,IAAA,YAAG,EAAC,QAAQ,CAAC;;;;iDAQb;2BAZU,gBAAgB;IAD5B,IAAA,mBAAU,EAAC,QAAQ,CAAC;GACR,gBAAgB,CAa5B"}
1
+ {"version":3,"file":"health.controller.js","sourceRoot":"","sources":["../../src/health/health.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAAiD;AACjD,4EAA+D;AAC/D,2BAAkC;AAClC,+BAA4B;AAC5B,mEAA8D;AAE9D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,iBAAY,EAAC,IAAA,WAAI,EAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAwB,CAAC;AAG3G,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;IAGE;IAFZ,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAExC,YAA6B,YAAiC;QAAjC,iBAAY,GAAZ,YAAY,CAAqB;IAAG,CAAC;IAIlE,SAAS;QACP,OAAO;YACL,MAAM,EAAE,SAAS;YACjB,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;YAChE,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO;YAClE,GAAG,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE;SACrC,CAAC;IACJ,CAAC;CACF,CAAA;AAhBY,4CAAgB;AAO3B;IAFC,IAAA,yBAAM,GAAE;IACR,IAAA,YAAG,EAAC,QAAQ,CAAC;;;;iDASb;2BAfU,gBAAgB;IAD5B,IAAA,mBAAU,EAAC,QAAQ,CAAC;qCAIwB,2CAAmB;GAHnD,gBAAgB,CAgB5B"}
@@ -9,12 +9,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
9
9
  exports.HealthModule = void 0;
10
10
  const common_1 = require("@nestjs/common");
11
11
  const health_controller_1 = require("./health.controller");
12
+ const version_check_service_1 = require("./version-check.service");
12
13
  let HealthModule = class HealthModule {
13
14
  };
14
15
  exports.HealthModule = HealthModule;
15
16
  exports.HealthModule = HealthModule = __decorate([
16
17
  (0, common_1.Module)({
17
18
  controllers: [health_controller_1.HealthController],
19
+ providers: [version_check_service_1.VersionCheckService],
18
20
  })
19
21
  ], HealthModule);
20
22
  //# sourceMappingURL=health.module.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"health.module.js","sourceRoot":"","sources":["../../src/health/health.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,2DAAuD;AAKhD,IAAM,YAAY,GAAlB,MAAM,YAAY;CAAG,CAAA;AAAf,oCAAY;uBAAZ,YAAY;IAHxB,IAAA,eAAM,EAAC;QACN,WAAW,EAAE,CAAC,oCAAgB,CAAC;KAChC,CAAC;GACW,YAAY,CAAG"}
1
+ {"version":3,"file":"health.module.js","sourceRoot":"","sources":["../../src/health/health.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,2DAAuD;AACvD,mEAA8D;AAMvD,IAAM,YAAY,GAAlB,MAAM,YAAY;CAAG,CAAA;AAAf,oCAAY;uBAAZ,YAAY;IAJxB,IAAA,eAAM,EAAC;QACN,WAAW,EAAE,CAAC,oCAAgB,CAAC;QAC/B,SAAS,EAAE,CAAC,2CAAmB,CAAC;KACjC,CAAC;GACW,YAAY,CAAG"}
@@ -0,0 +1,20 @@
1
+ import { OnModuleInit } from '@nestjs/common';
2
+ interface UpdateInfo {
3
+ latestVersion?: string;
4
+ updateAvailable?: boolean;
5
+ }
6
+ export declare class VersionCheckService implements OnModuleInit {
7
+ private readonly logger;
8
+ private cachedLatest;
9
+ private cacheExpiry;
10
+ private static readonly CACHE_TTL_MS;
11
+ private static readonly FETCH_TIMEOUT_MS;
12
+ private static readonly VERSION_RE;
13
+ onModuleInit(): Promise<void>;
14
+ getCurrentVersion(): string;
15
+ getUpdateInfo(): UpdateInfo;
16
+ isNewer(latest: string, current: string): boolean;
17
+ fetchLatestVersion(): Promise<string | null>;
18
+ private isEnabled;
19
+ }
20
+ export {};
@@ -0,0 +1,84 @@
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 VersionCheckService_1;
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.VersionCheckService = void 0;
11
+ const common_1 = require("@nestjs/common");
12
+ let VersionCheckService = class VersionCheckService {
13
+ static { VersionCheckService_1 = this; }
14
+ logger = new common_1.Logger(VersionCheckService_1.name);
15
+ cachedLatest = null;
16
+ cacheExpiry = 0;
17
+ static CACHE_TTL_MS = 24 * 60 * 60 * 1000;
18
+ static FETCH_TIMEOUT_MS = 5000;
19
+ static VERSION_RE = /^\d+\.\d+\.\d+$/;
20
+ async onModuleInit() {
21
+ if (!this.isEnabled())
22
+ return;
23
+ this.fetchLatestVersion().catch(() => { });
24
+ }
25
+ getCurrentVersion() {
26
+ return process.env['MANIFEST_PACKAGE_VERSION'] ?? '0.0.0';
27
+ }
28
+ getUpdateInfo() {
29
+ if (!this.cachedLatest)
30
+ return {};
31
+ const current = this.getCurrentVersion();
32
+ if (!this.isNewer(this.cachedLatest, current))
33
+ return {};
34
+ return { latestVersion: this.cachedLatest, updateAvailable: true };
35
+ }
36
+ isNewer(latest, current) {
37
+ const [lMaj, lMin, lPat] = latest.split('.').map(Number);
38
+ const [cMaj, cMin, cPat] = current.split('.').map(Number);
39
+ if (lMaj !== cMaj)
40
+ return lMaj > cMaj;
41
+ if (lMin !== cMin)
42
+ return lMin > cMin;
43
+ return lPat > cPat;
44
+ }
45
+ async fetchLatestVersion() {
46
+ if (this.cachedLatest && Date.now() < this.cacheExpiry) {
47
+ return this.cachedLatest;
48
+ }
49
+ try {
50
+ const controller = new AbortController();
51
+ const timer = setTimeout(() => controller.abort(), VersionCheckService_1.FETCH_TIMEOUT_MS);
52
+ const res = await fetch('https://registry.npmjs.org/manifest/latest', { signal: controller.signal });
53
+ clearTimeout(timer);
54
+ if (!res.ok)
55
+ return null;
56
+ const data = (await res.json());
57
+ const version = data?.version;
58
+ if (!version || !VersionCheckService_1.VERSION_RE.test(version)) {
59
+ return null;
60
+ }
61
+ this.cachedLatest = version;
62
+ this.cacheExpiry = Date.now() + VersionCheckService_1.CACHE_TTL_MS;
63
+ this.logger.log(`Latest manifest version: ${version}`);
64
+ return version;
65
+ }
66
+ catch {
67
+ this.logger.debug('Failed to check for updates');
68
+ return null;
69
+ }
70
+ }
71
+ isEnabled() {
72
+ if (process.env['MANIFEST_MODE'] !== 'local')
73
+ return false;
74
+ const opt = process.env['MANIFEST_TELEMETRY_OPTOUT'];
75
+ if (opt === '1' || opt === 'true')
76
+ return false;
77
+ return true;
78
+ }
79
+ };
80
+ exports.VersionCheckService = VersionCheckService;
81
+ exports.VersionCheckService = VersionCheckService = VersionCheckService_1 = __decorate([
82
+ (0, common_1.Injectable)()
83
+ ], VersionCheckService);
84
+ //# sourceMappingURL=version-check.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version-check.service.js","sourceRoot":"","sources":["../../src/health/version-check.service.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -16,11 +16,11 @@ To resolve the conflict:`,(0,$o.getConflictResolutionRecipe)(u,r))),c=a):ZM.diag
16
16
  openclaw config set plugins.entries.manifest.config.endpoint https://app.manifest.build/otlp`:`Invalid apiKey format. Keys must start with '${Ce}'. Fix it via:
17
17
  openclaw config set manifest.apiKey ${Ce}YOUR_KEY`:`Missing apiKey. Set it via:
18
18
  openclaw config set manifest.apiKey ${Ce}YOUR_KEY
19
- or export MANIFEST_API_KEY=${Ce}YOUR_KEY`}var Qi=Oe(cM()),Zi=Oe(_i()),BI=Oe(II()),GI=Oe(wI()),HI=Oe(To());m();var zr=null,Jr=null,Pc=null,Mc=null;function ea(o,r){let i=new HI.Resource({"service.name":o.serviceName,"service.version":"5.6.5","manifest.plugin":"true"}),c={Authorization:`Bearer ${o.apiKey}`},a=new BI.OTLPTraceExporter({url:`${o.endpoint}/v1/traces`,headers:c});zr=new Qi.BasicTracerProvider({resource:i,spanProcessors:[new Qi.BatchSpanProcessor(a,{scheduledDelayMillis:5e3,maxQueueSize:2048,maxExportBatchSize:512})]}),zr.register(),r.debug(`[manifest] Trace exporter -> ${o.endpoint}/v1/traces`);let u=new GI.OTLPMetricExporter({url:`${o.endpoint}/v1/metrics`,headers:c});return Jr=new Zi.MeterProvider({resource:i,readers:[new Zi.PeriodicExportingMetricReader({exporter:u,exportIntervalMillis:o.metricsIntervalMs})]}),yt.setGlobalMeterProvider(Jr),r.debug(`[manifest] Metrics exporter -> ${o.endpoint}/v1/metrics (interval=${o.metricsIntervalMs}ms)`),Pc=ke.getTracer("manifest-plugin","5.6.5"),Mc=yt.getMeter("manifest-plugin","5.6.5"),{tracer:Pc,meter:Mc}}async function ta(o){o.info("[manifest] Shutting down telemetry..."),zr&&(await zr.shutdown(),zr=null),Jr&&(await Jr.shutdown(),Jr=null),Pc=null,Mc=null,o.info("[manifest] Telemetry shut down")}m();var lr=new Map,kI,YI,FI,KI,g5,jI,qI,WI,zI;function ra(o){kI=o.createCounter(me.LLM_REQUESTS,{description:"Total LLM inference requests"}),YI=o.createCounter(me.LLM_TOKENS_INPUT,{description:"Total input tokens sent to LLM"}),FI=o.createCounter(me.LLM_TOKENS_OUTPUT,{description:"Total output tokens from LLM"}),KI=o.createCounter(me.LLM_TOKENS_CACHE_READ,{description:"Total cache-read tokens"}),g5=o.createHistogram(me.LLM_DURATION,{description:"LLM request duration in ms",unit:"ms"}),jI=o.createCounter(me.TOOL_CALLS,{description:"Total tool invocations"}),qI=o.createCounter(me.TOOL_ERRORS,{description:"Total tool errors"}),WI=o.createHistogram(me.TOOL_DURATION,{description:"Tool execution duration in ms",unit:"ms"}),zI=o.createCounter(me.MESSAGES_RECEIVED,{description:"Total messages received from users"})}function na(o,r,i,c){o.on("message_received",a=>{let u=a.sessionKey||a.session?.key||`agent:${a.agent||"main"}:main`,t=a.channel||"unknown",e=r.startSpan(en.REQUEST,{kind:Ge.SERVER,attributes:{[B.SESSION_KEY]:u,[B.CHANNEL]:t}});lr.set(u,{root:e}),zI.add(1,{[B.CHANNEL]:t}),c.debug(`[manifest] Root span started for session=${u}`)}),o.on("before_agent_start",a=>{let u=a.sessionKey||a.session?.key||`agent:${a.agent||"main"}:main`,t=a.agent||"main",e=lr.get(u),n=e?.root?ke.setSpan(He.active(),e.root):He.active(),s=r.startSpan(en.AGENT_TURN,{kind:Ge.INTERNAL,attributes:{[B.AGENT_NAME]:t,[B.SESSION_KEY]:u}},n);e?e.turn=s:lr.set(u,{root:s,turn:s}),c.debug(`[manifest] Agent turn started: agent=${t}, session=${u}`)}),o.on("tool_result_persist",a=>{let u=a.toolName||a.tool||"unknown",t=a.durationMs||0,e=a.error==null,n=a.sessionKey||"unknown",s=lr.get(n),l=s?.turn?ke.setSpan(He.active(),s.turn):He.active(),E=r.startSpan(`${en.TOOL_PREFIX}${u}`,{kind:Ge.INTERNAL,attributes:{[B.TOOL_NAME]:u,[B.TOOL_SUCCESS]:String(e),[B.SESSION_KEY]:n}},l);e||(E.setStatus({code:Rt.ERROR,message:a.error?.message||"Tool execution failed"}),qI.add(1,{[B.TOOL_NAME]:u})),E.end(),jI.add(1,{[B.TOOL_NAME]:u}),WI.record(t,{[B.TOOL_NAME]:u})}),o.on("agent_end",a=>{let u=a.sessionKey||a.session?.key||`agent:${a.agent||"main"}:main`,e=[...a.messages||[]].reverse().find($r=>$r.role==="assistant"&&$r.usage),n=e?.model||a.model||"unknown",s=e?.provider||a.provider||"unknown",l=e?.usage||a.usage||{},E=l.input||l.inputTokens||0,O=l.output||l.outputTokens||0,g=l.cacheRead||l.cacheReadTokens||0,ue=l.cacheWrite||l.cacheWriteTokens||0,ve=lr.get(u);ve?.turn&&(ve.turn.setAttributes({[B.MODEL]:n,[B.PROVIDER]:s,[B.INPUT_TOKENS]:E,[B.OUTPUT_TOKENS]:O,[B.CACHE_READ_TOKENS]:g,[B.CACHE_WRITE_TOKENS]:ue}),ve.turn.end()),ve?.root&&ve.root!==ve.turn&&ve.root.end(),lr.delete(u);let Ie={[B.MODEL]:n,[B.PROVIDER]:s};kI.add(1,Ie),YI.add(E,Ie),FI.add(O,Ie),g>0&&KI.add(g,Ie),c.debug(`[manifest] agent_end tokens: in=${E}, out=${O}, cache=${g}`),c.debug(`[manifest] Trace completed for session=${u}`)}),c.debug("[manifest] All hooks registered")}async function oa(o){let r=o.endpoint.replace(/\/otlp(\/v1)?\/?$/,""),i={endpointReachable:!1,authValid:!1,agentName:null,error:null};try{let c=await fetch(`${r}/api/v1/health`,{signal:AbortSignal.timeout(5e3)});if(!c.ok)return i.error=`Health endpoint returned ${c.status}`,i;i.endpointReachable=!0}catch(c){let a=c instanceof Error?c.message:String(c);return i.error=`Cannot reach endpoint: ${a}`,i}try{let c=await fetch(`${r}/api/v1/agent/usage?range=24h`,{headers:{Authorization:`Bearer ${o.apiKey}`},signal:AbortSignal.timeout(5e3)});if(c.status===401||c.status===403)return i.error="API key rejected \u2014 check your mnfst_ key is correct",i;if(!c.ok)return i.error=`Usage endpoint returned ${c.status}`,i;i.authValid=!0;let a=await c.json();a&&typeof a.agentName=="string"&&(i.agentName=a.agentName)}catch(c){let a=c instanceof Error?c.message:String(c);return i.error=`Auth check failed: ${a}`,i}return i}var JI={today:"24h",week:"7d",month:"30d"};async function XI(o,r,i,c){let a=`${o}${r}`;try{let u=await fetch(a,{headers:{Authorization:`Bearer ${i}`}});return u.ok?{result:await u.json()}:{error:`API returned ${u.status}`}}catch(u){let t=u instanceof Error?u.message:String(u);return c.error(`[manifest] API call failed: ${t}`),{error:t}}}function ia(o,r,i){let c=r.endpoint.replace(/\/otlp(\/v1)?\/?$/,"");o.registerTool({name:"manifest_usage",description:"Get token consumption for this agent: total, input, output, cache-read tokens, and action count. Use when the user asks about token usage or consumption.",parameters:{type:"object",properties:{period:{type:"string",enum:["today","week","month"],default:"today",description:"Time period"}}},handler:async a=>{let u=JI[a.period||"today"]||"24h";return XI(c,`/api/v1/agent/usage?range=${u}`,r.apiKey,i)}}),o.registerTool({name:"manifest_costs",description:"Get cost breakdown for this agent in USD, grouped by model. Use when the user asks about costs, spending, or money burned.",parameters:{type:"object",properties:{period:{type:"string",enum:["today","week","month"],default:"week",description:"Time period"}}},handler:async a=>{let u=JI[a.period||"week"]||"7d";return XI(c,`/api/v1/agent/costs?range=${u}`,r.apiKey,i)}}),o.registerTool({name:"manifest_health",description:"Check whether Manifest observability is connected and working. Use when the user asks if monitoring is set up or wants a connectivity test.",parameters:{type:"object",properties:{}},handler:async()=>{let a=await oa(r);return a.error?{error:a.error}:{result:{endpointReachable:a.endpointReachable,authValid:a.authValid,agentName:a.agentName,status:"ok"}}}}),i.debug("[manifest] Registered agent tools: manifest_usage, manifest_costs, manifest_health")}var U=require("fs"),Ae=require("path"),gc=require("os"),QI=require("crypto");var aa=(0,Ae.join)((0,gc.homedir)(),".openclaw","manifest"),Xr=(0,Ae.join)(aa,"config.json"),ZI=(0,Ae.join)((0,gc.homedir)(),".openclaw"),$I=(0,Ae.join)(ZI,"openclaw.json"),L5=3e3;function I5(){(0,U.existsSync)(aa)||(0,U.mkdirSync)(aa,{recursive:!0,mode:448})}function C5(){if(I5(),(0,U.existsSync)(Xr))try{let i=JSON.parse((0,U.readFileSync)(Xr,"utf-8"));if(i.apiKey&&i.apiKey.startsWith(Ce))return i.apiKey}catch{}let o=`${Ce}local_${(0,QI.randomBytes)(24).toString("hex")}`,r={};if((0,U.existsSync)(Xr))try{r=JSON.parse((0,U.readFileSync)(Xr,"utf-8"))}catch{}return(0,U.writeFileSync)(Xr,JSON.stringify({...r,apiKey:o},null,2),{mode:384}),o}function eC(o){if(!(0,U.existsSync)(o))return{};try{return JSON.parse((0,U.readFileSync)(o,"utf-8"))}catch{return{}}}function tC(o,r){let i=(0,Ae.dirname)(o);(0,U.existsSync)(i)||(0,U.mkdirSync)(i,{recursive:!0,mode:448});let c=`${o}.tmp.${process.pid}`;(0,U.writeFileSync)(c,JSON.stringify(r,null,2),{mode:384}),(0,U.renameSync)(c,o)}function x5(o,r,i,c,a){let t={baseUrl:`http://${r}:${i}/v1`,api:"openai-completions",apiKey:c,models:[{id:"auto",name:"auto"}]};try{let e=eC($I);e.models||(e.models={}),e.models.providers||(e.models.providers={}),e.models.providers.manifest=t,e.agents||(e.agents={}),e.agents.defaults||(e.agents.defaults={}),e.agents.defaults.models||(e.agents.defaults.models={});let n=e.agents.defaults.models;Array.isArray(n)?n.includes("manifest/auto")||n.push("manifest/auto"):typeof n=="object"&&("manifest/auto"in n||(n["manifest/auto"]={})),tC($I,e),a.debug("[manifest] Wrote provider config to openclaw.json")}catch(e){let n=e instanceof Error?e.message:String(e);a.debug(`[manifest] Could not write openclaw.json: ${n}`)}try{if(o.config){o.config.models||(o.config.models={}),o.config.models.providers||(o.config.models.providers={}),o.config.models.providers.manifest=t,o.config.agents||(o.config.agents={}),o.config.agents.defaults||(o.config.agents.defaults={}),o.config.agents.defaults.models||(o.config.agents.defaults.models={});let e=o.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"]={}))}a.debug("[manifest] Injected provider into runtime config")}catch(e){let n=e instanceof Error?e.message:String(e);a.debug(`[manifest] Could not inject runtime config: ${n}`)}}function b5(o,r){let i=(0,Ae.join)(ZI,"agents");if(!(0,U.existsSync)(i)){r.debug("[manifest] No agents directory found, skipping auth profile injection");return}let c={type:"api_key",provider:"manifest",key:o},a=0;try{let u=(0,U.readdirSync)(i,{withFileTypes:!0}).filter(t=>t.isDirectory());for(let t of u){let e=(0,Ae.join)(i,t.name,"agent","auth-profiles.json"),n=(0,Ae.dirname)(e);if(!(0,U.existsSync)(n))continue;let s=eC(e);s.version||(s.version=1),s.profiles||(s.profiles={});let l=s.profiles["manifest:default"];l&&l.key===o||(s.profiles["manifest:default"]=c,tC(e,s),a++)}}catch(u){let t=u instanceof Error?u.message:String(u);r.debug(`[manifest] Auth profile injection error: ${t}`)}a>0&&r.debug(`[manifest] Injected auth profile into ${a} agent(s)`)}async function U5(o,r){try{return(await fetch(`http://${o}:${r}/api/v1/health`,{signal:AbortSignal.timeout(L5)})).ok}catch{return!1}}function rC(o,r,i){let c=r.port,a=r.host,u=C5(),t=(0,Ae.join)(aa,"manifest.db");i.debug("[manifest] Local mode \u2014 starting embedded server..."),x5(o,a,c,u,i),b5(u,i);let e;try{e=require("./server")}catch(O){let g=O instanceof Error?O.message:String(O);i.error(`[manifest] Failed to load embedded server.
19
+ or export MANIFEST_API_KEY=${Ce}YOUR_KEY`}var Qi=Oe(cM()),Zi=Oe(_i()),BI=Oe(II()),GI=Oe(wI()),HI=Oe(To());m();var zr=null,Jr=null,Pc=null,Mc=null;function ea(o,r){let i=new HI.Resource({"service.name":o.serviceName,"service.version":"5.7.0","manifest.plugin":"true"}),c={Authorization:`Bearer ${o.apiKey}`},a=new BI.OTLPTraceExporter({url:`${o.endpoint}/v1/traces`,headers:c});zr=new Qi.BasicTracerProvider({resource:i,spanProcessors:[new Qi.BatchSpanProcessor(a,{scheduledDelayMillis:5e3,maxQueueSize:2048,maxExportBatchSize:512})]}),zr.register(),r.debug(`[manifest] Trace exporter -> ${o.endpoint}/v1/traces`);let u=new GI.OTLPMetricExporter({url:`${o.endpoint}/v1/metrics`,headers:c});return Jr=new Zi.MeterProvider({resource:i,readers:[new Zi.PeriodicExportingMetricReader({exporter:u,exportIntervalMillis:o.metricsIntervalMs})]}),yt.setGlobalMeterProvider(Jr),r.debug(`[manifest] Metrics exporter -> ${o.endpoint}/v1/metrics (interval=${o.metricsIntervalMs}ms)`),Pc=ke.getTracer("manifest-plugin","5.7.0"),Mc=yt.getMeter("manifest-plugin","5.7.0"),{tracer:Pc,meter:Mc}}async function ta(o){o.info("[manifest] Shutting down telemetry..."),zr&&(await zr.shutdown(),zr=null),Jr&&(await Jr.shutdown(),Jr=null),Pc=null,Mc=null,o.info("[manifest] Telemetry shut down")}m();var lr=new Map,kI,YI,FI,KI,g5,jI,qI,WI,zI;function ra(o){kI=o.createCounter(me.LLM_REQUESTS,{description:"Total LLM inference requests"}),YI=o.createCounter(me.LLM_TOKENS_INPUT,{description:"Total input tokens sent to LLM"}),FI=o.createCounter(me.LLM_TOKENS_OUTPUT,{description:"Total output tokens from LLM"}),KI=o.createCounter(me.LLM_TOKENS_CACHE_READ,{description:"Total cache-read tokens"}),g5=o.createHistogram(me.LLM_DURATION,{description:"LLM request duration in ms",unit:"ms"}),jI=o.createCounter(me.TOOL_CALLS,{description:"Total tool invocations"}),qI=o.createCounter(me.TOOL_ERRORS,{description:"Total tool errors"}),WI=o.createHistogram(me.TOOL_DURATION,{description:"Tool execution duration in ms",unit:"ms"}),zI=o.createCounter(me.MESSAGES_RECEIVED,{description:"Total messages received from users"})}function na(o,r,i,c){o.on("message_received",a=>{let u=a.sessionKey||a.session?.key||`agent:${a.agent||"main"}:main`,t=a.channel||"unknown",e=r.startSpan(en.REQUEST,{kind:Ge.SERVER,attributes:{[B.SESSION_KEY]:u,[B.CHANNEL]:t}});lr.set(u,{root:e}),zI.add(1,{[B.CHANNEL]:t}),c.debug(`[manifest] Root span started for session=${u}`)}),o.on("before_agent_start",a=>{let u=a.sessionKey||a.session?.key||`agent:${a.agent||"main"}:main`,t=a.agent||"main",e=lr.get(u),n=e?.root?ke.setSpan(He.active(),e.root):He.active(),s=r.startSpan(en.AGENT_TURN,{kind:Ge.INTERNAL,attributes:{[B.AGENT_NAME]:t,[B.SESSION_KEY]:u}},n);e?e.turn=s:lr.set(u,{root:s,turn:s}),c.debug(`[manifest] Agent turn started: agent=${t}, session=${u}`)}),o.on("tool_result_persist",a=>{let u=a.toolName||a.tool||"unknown",t=a.durationMs||0,e=a.error==null,n=a.sessionKey||"unknown",s=lr.get(n),l=s?.turn?ke.setSpan(He.active(),s.turn):He.active(),E=r.startSpan(`${en.TOOL_PREFIX}${u}`,{kind:Ge.INTERNAL,attributes:{[B.TOOL_NAME]:u,[B.TOOL_SUCCESS]:String(e),[B.SESSION_KEY]:n}},l);e||(E.setStatus({code:Rt.ERROR,message:a.error?.message||"Tool execution failed"}),qI.add(1,{[B.TOOL_NAME]:u})),E.end(),jI.add(1,{[B.TOOL_NAME]:u}),WI.record(t,{[B.TOOL_NAME]:u})}),o.on("agent_end",a=>{let u=a.sessionKey||a.session?.key||`agent:${a.agent||"main"}:main`,e=[...a.messages||[]].reverse().find($r=>$r.role==="assistant"&&$r.usage),n=e?.model||a.model||"unknown",s=e?.provider||a.provider||"unknown",l=e?.usage||a.usage||{},E=l.input||l.inputTokens||0,O=l.output||l.outputTokens||0,g=l.cacheRead||l.cacheReadTokens||0,ue=l.cacheWrite||l.cacheWriteTokens||0,ve=lr.get(u);ve?.turn&&(ve.turn.setAttributes({[B.MODEL]:n,[B.PROVIDER]:s,[B.INPUT_TOKENS]:E,[B.OUTPUT_TOKENS]:O,[B.CACHE_READ_TOKENS]:g,[B.CACHE_WRITE_TOKENS]:ue}),ve.turn.end()),ve?.root&&ve.root!==ve.turn&&ve.root.end(),lr.delete(u);let Ie={[B.MODEL]:n,[B.PROVIDER]:s};kI.add(1,Ie),YI.add(E,Ie),FI.add(O,Ie),g>0&&KI.add(g,Ie),c.debug(`[manifest] agent_end tokens: in=${E}, out=${O}, cache=${g}`),c.debug(`[manifest] Trace completed for session=${u}`)}),c.debug("[manifest] All hooks registered")}async function oa(o){let r=o.endpoint.replace(/\/otlp(\/v1)?\/?$/,""),i={endpointReachable:!1,authValid:!1,agentName:null,error:null};try{let c=await fetch(`${r}/api/v1/health`,{signal:AbortSignal.timeout(5e3)});if(!c.ok)return i.error=`Health endpoint returned ${c.status}`,i;i.endpointReachable=!0}catch(c){let a=c instanceof Error?c.message:String(c);return i.error=`Cannot reach endpoint: ${a}`,i}try{let c=await fetch(`${r}/api/v1/agent/usage?range=24h`,{headers:{Authorization:`Bearer ${o.apiKey}`},signal:AbortSignal.timeout(5e3)});if(c.status===401||c.status===403)return i.error="API key rejected \u2014 check your mnfst_ key is correct",i;if(!c.ok)return i.error=`Usage endpoint returned ${c.status}`,i;i.authValid=!0;let a=await c.json();a&&typeof a.agentName=="string"&&(i.agentName=a.agentName)}catch(c){let a=c instanceof Error?c.message:String(c);return i.error=`Auth check failed: ${a}`,i}return i}var JI={today:"24h",week:"7d",month:"30d"};async function XI(o,r,i,c){let a=`${o}${r}`;try{let u=await fetch(a,{headers:{Authorization:`Bearer ${i}`}});return u.ok?{result:await u.json()}:{error:`API returned ${u.status}`}}catch(u){let t=u instanceof Error?u.message:String(u);return c.error(`[manifest] API call failed: ${t}`),{error:t}}}function ia(o,r,i){let c=r.endpoint.replace(/\/otlp(\/v1)?\/?$/,"");o.registerTool({name:"manifest_usage",description:"Get token consumption for this agent: total, input, output, cache-read tokens, and action count. Use when the user asks about token usage or consumption.",parameters:{type:"object",properties:{period:{type:"string",enum:["today","week","month"],default:"today",description:"Time period"}}},handler:async a=>{let u=JI[a.period||"today"]||"24h";return XI(c,`/api/v1/agent/usage?range=${u}`,r.apiKey,i)}}),o.registerTool({name:"manifest_costs",description:"Get cost breakdown for this agent in USD, grouped by model. Use when the user asks about costs, spending, or money burned.",parameters:{type:"object",properties:{period:{type:"string",enum:["today","week","month"],default:"week",description:"Time period"}}},handler:async a=>{let u=JI[a.period||"week"]||"7d";return XI(c,`/api/v1/agent/costs?range=${u}`,r.apiKey,i)}}),o.registerTool({name:"manifest_health",description:"Check whether Manifest observability is connected and working. Use when the user asks if monitoring is set up or wants a connectivity test.",parameters:{type:"object",properties:{}},handler:async()=>{let a=await oa(r);return a.error?{error:a.error}:{result:{endpointReachable:a.endpointReachable,authValid:a.authValid,agentName:a.agentName,status:"ok"}}}}),i.debug("[manifest] Registered agent tools: manifest_usage, manifest_costs, manifest_health")}var U=require("fs"),Ae=require("path"),gc=require("os"),QI=require("crypto");var aa=(0,Ae.join)((0,gc.homedir)(),".openclaw","manifest"),Xr=(0,Ae.join)(aa,"config.json"),ZI=(0,Ae.join)((0,gc.homedir)(),".openclaw"),$I=(0,Ae.join)(ZI,"openclaw.json"),L5=3e3;function I5(){(0,U.existsSync)(aa)||(0,U.mkdirSync)(aa,{recursive:!0,mode:448})}function C5(){if(I5(),(0,U.existsSync)(Xr))try{let i=JSON.parse((0,U.readFileSync)(Xr,"utf-8"));if(i.apiKey&&i.apiKey.startsWith(Ce))return i.apiKey}catch{}let o=`${Ce}local_${(0,QI.randomBytes)(24).toString("hex")}`,r={};if((0,U.existsSync)(Xr))try{r=JSON.parse((0,U.readFileSync)(Xr,"utf-8"))}catch{}return(0,U.writeFileSync)(Xr,JSON.stringify({...r,apiKey:o},null,2),{mode:384}),o}function eC(o){if(!(0,U.existsSync)(o))return{};try{return JSON.parse((0,U.readFileSync)(o,"utf-8"))}catch{return{}}}function tC(o,r){let i=(0,Ae.dirname)(o);(0,U.existsSync)(i)||(0,U.mkdirSync)(i,{recursive:!0,mode:448});let c=`${o}.tmp.${process.pid}`;(0,U.writeFileSync)(c,JSON.stringify(r,null,2),{mode:384}),(0,U.renameSync)(c,o)}function x5(o,r,i,c,a){let t={baseUrl:`http://${r}:${i}/v1`,api:"openai-completions",apiKey:c,models:[{id:"auto",name:"auto"}]};try{let e=eC($I);e.models||(e.models={}),e.models.providers||(e.models.providers={}),e.models.providers.manifest=t,e.agents||(e.agents={}),e.agents.defaults||(e.agents.defaults={}),e.agents.defaults.models||(e.agents.defaults.models={});let n=e.agents.defaults.models;Array.isArray(n)?n.includes("manifest/auto")||n.push("manifest/auto"):typeof n=="object"&&("manifest/auto"in n||(n["manifest/auto"]={})),tC($I,e),a.debug("[manifest] Wrote provider config to openclaw.json")}catch(e){let n=e instanceof Error?e.message:String(e);a.debug(`[manifest] Could not write openclaw.json: ${n}`)}try{if(o.config){o.config.models||(o.config.models={}),o.config.models.providers||(o.config.models.providers={}),o.config.models.providers.manifest=t,o.config.agents||(o.config.agents={}),o.config.agents.defaults||(o.config.agents.defaults={}),o.config.agents.defaults.models||(o.config.agents.defaults.models={});let e=o.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"]={}))}a.debug("[manifest] Injected provider into runtime config")}catch(e){let n=e instanceof Error?e.message:String(e);a.debug(`[manifest] Could not inject runtime config: ${n}`)}}function b5(o,r){let i=(0,Ae.join)(ZI,"agents");if(!(0,U.existsSync)(i)){r.debug("[manifest] No agents directory found, skipping auth profile injection");return}let c={type:"api_key",provider:"manifest",key:o},a=0;try{let u=(0,U.readdirSync)(i,{withFileTypes:!0}).filter(t=>t.isDirectory());for(let t of u){let e=(0,Ae.join)(i,t.name,"agent","auth-profiles.json"),n=(0,Ae.dirname)(e);if(!(0,U.existsSync)(n))continue;let s=eC(e);s.version||(s.version=1),s.profiles||(s.profiles={});let l=s.profiles["manifest:default"];l&&l.key===o||(s.profiles["manifest:default"]=c,tC(e,s),a++)}}catch(u){let t=u instanceof Error?u.message:String(u);r.debug(`[manifest] Auth profile injection error: ${t}`)}a>0&&r.debug(`[manifest] Injected auth profile into ${a} agent(s)`)}async function U5(o,r){try{return(await fetch(`http://${o}:${r}/api/v1/health`,{signal:AbortSignal.timeout(L5)})).ok}catch{return!1}}function rC(o,r,i){let c=r.port,a=r.host,u=C5(),t=(0,Ae.join)(aa,"manifest.db");i.debug("[manifest] Local mode \u2014 starting embedded server..."),x5(o,a,c,u,i),b5(u,i);let e;try{e=require("./server")}catch(O){let g=O instanceof Error?O.message:String(O);i.error(`[manifest] Failed to load embedded server.
20
20
  Error: ${g}
21
21
  This is a packaging error \u2014 please reinstall the manifest plugin.`);return}let n=`http://${a}:${c}/otlp`,s={...r,apiKey:u,endpoint:n,captureContent:!0,metricsIntervalMs:xc.METRICS_INTERVAL_MS},{tracer:l,meter:E}=ea(s,i);ra(E),na(o,l,s,i),typeof o.registerTool=="function"&&ia(o,s,i),i.info(`[manifest] \u{1F99A} View your Manifest Dashboard -> http://${a}:${c}`),o.registerService({id:"manifest-local",start:async()=>{try{await e.start({port:c,host:a,dbPath:t}),i.info(`[manifest] Local server running on http://${a}:${c}`),i.info(`[manifest] Dashboard: http://${a}:${c}`),i.info(`[manifest] DB: ${t}`)}catch(O){let g=O instanceof Error?O.message:String(O);g.includes("EADDRINUSE")||g.includes("address already in use")?await U5(a,c)?i.info(`[manifest] Reusing existing server at http://${a}:${c}`):i.error(`[manifest] Port ${c} is already in use by another process.
22
22
  Change it with: openclaw config set plugins.entries.manifest.config.port ${c+1}
23
- Then restart the gateway.`):i.error(`[manifest] Failed to start local server: ${g}`)}},stop:async()=>{await ta(i)}})}var oC=require("crypto"),Ve=require("os");function nC(){return{optedOut:__fromEnv.MANIFEST_TELEMETRY_OPTOUT==="1"||__fromEnv.MANIFEST_TELEMETRY_OPTOUT==="true",packageVersion:"5.6.5"}}var D5="https://eu.i.posthog.com",V5="phc_g5pLOu5bBRjhVJBwAsx0eCzJFWq0cri2TyVLQLxf045";function w5(){let o=`${(0,Ve.hostname)()}-${(0,Ve.platform)()}-${(0,Ve.arch)()}`;return(0,oC.createHash)("sha256").update(o).digest("hex").slice(0,16)}function Lc(o,r){let i=nC();if(i.optedOut)return;let c={api_key:V5,event:o,properties:{distinct_id:w5(),os:(0,Ve.platform)(),os_version:(0,Ve.release)(),node_version:process.versions.node,package_version:i.packageVersion,...r},timestamp:new Date().toISOString()};fetch(`${D5}/capture`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(c)}).catch(()=>{})}module.exports={id:"manifest",name:"Manifest \u2014 Agent Observability",register(o){let r=o.logger||{info:(...e)=>console.log(...e),debug:()=>{},error:(...e)=>console.error(...e),warn:(...e)=>console.warn(...e)},i=bc(o.pluginConfig);if(Lc("plugin_registered"),Lc("plugin_mode_selected",{mode:i.mode}),i.mode==="local"){rC(o,i,r);return}let c=Uc(i);if(c){i.apiKey?r.error(`[manifest] Configuration error:
23
+ Then restart the gateway.`):i.error(`[manifest] Failed to start local server: ${g}`)}},stop:async()=>{await ta(i)}})}var oC=require("crypto"),Ve=require("os");function nC(){return{optedOut:__fromEnv.MANIFEST_TELEMETRY_OPTOUT==="1"||__fromEnv.MANIFEST_TELEMETRY_OPTOUT==="true",packageVersion:"5.7.0"}}var D5="https://eu.i.posthog.com",V5="phc_g5pLOu5bBRjhVJBwAsx0eCzJFWq0cri2TyVLQLxf045";function w5(){let o=`${(0,Ve.hostname)()}-${(0,Ve.platform)()}-${(0,Ve.arch)()}`;return(0,oC.createHash)("sha256").update(o).digest("hex").slice(0,16)}function Lc(o,r){let i=nC();if(i.optedOut)return;let c={api_key:V5,event:o,properties:{distinct_id:w5(),os:(0,Ve.platform)(),os_version:(0,Ve.release)(),node_version:process.versions.node,package_version:i.packageVersion,...r},timestamp:new Date().toISOString()};fetch(`${D5}/capture`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(c)}).catch(()=>{})}module.exports={id:"manifest",name:"Manifest \u2014 Agent Observability",register(o){let r=o.logger||{info:(...e)=>console.log(...e),debug:()=>{},error:(...e)=>console.error(...e),warn:(...e)=>console.warn(...e)},i=bc(o.pluginConfig);if(Lc("plugin_registered"),Lc("plugin_mode_selected",{mode:i.mode}),i.mode==="local"){rC(o,i,r);return}let c=Uc(i);if(c){i.apiKey?r.error(`[manifest] Configuration error:
24
24
  ${c}`):r.info(`[manifest] Cloud mode requires an API key:
25
25
  openclaw config set plugins.entries.manifest.config.apiKey mnfst_YOUR_KEY
26
26
  openclaw gateway restart
package/dist/server.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export declare const version = "0.1.0";
1
+ export declare const version: string;
2
2
  interface StartOptions {
3
3
  port?: number;
4
4
  host?: string;
package/dist/server.js CHANGED
@@ -37,7 +37,9 @@ exports.version = void 0;
37
37
  exports.start = start;
38
38
  const path_1 = require("path");
39
39
  const os_1 = require("os");
40
- exports.version = '0.1.0';
40
+ const fs_1 = require("fs");
41
+ const pkg = JSON.parse((0, fs_1.readFileSync)((0, path_1.join)(__dirname, '..', 'package.json'), 'utf-8'));
42
+ exports.version = pkg.version;
41
43
  const LOCAL_DEFAULT_PORT = 2099;
42
44
  // Dynamic path prevents tsc from resolving at compile time;
43
45
  // the backend dist is copied into dist/backend/ at build time.
@@ -47,6 +49,7 @@ async function start(options = {}) {
47
49
  const host = options.host ?? '127.0.0.1';
48
50
  const dbPath = options.dbPath ?? (0, path_1.join)((0, os_1.homedir)(), '.openclaw', 'manifest', 'manifest.db');
49
51
  // Set environment before importing the backend (it reads env at import time)
52
+ process.env['MANIFEST_PACKAGE_VERSION'] = exports.version;
50
53
  process.env['MANIFEST_MODE'] = 'local';
51
54
  process.env['MANIFEST_EMBEDDED'] = '1';
52
55
  process.env['PORT'] = String(port);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "manifest",
3
- "version": "5.6.5",
3
+ "version": "5.7.0",
4
4
  "description": "Observability plugin for OpenClaw — traces, metrics, and cost tracking for your AI agent",
5
5
  "main": "dist/index.js",
6
6
  "license": "MIT",
@@ -1 +1 @@
1
- import{j as Q,c as U,k as W,a as o,l as X,i as a,b as m,S as f,d as c,s as Z,t as l,m as ee,e as p,g as te,n as se,o as ie,h as ae}from"./index-D6VMzqMs.js";var le=l("<h3 class=settings-section__title>Email Provider"),ne=l('<div class="waiting-banner waiting-banner--success"role=status><i class="bxd bx-check-circle"></i><p>Email delivery is configured via <strong></strong>.'),re=l("<span class=settings-card__label-desc>Leave blank to keep existing key."),ce=l("<div class=settings-card__row><div class=settings-card__label><span class=settings-card__label-title>Domain</span><span class=settings-card__label-desc>Your Mailgun sending domain (e.g. mg.example.com)</span></div><div class=settings-card__control><input class=settings-card__input type=text placeholder=mg.example.com>"),de=l("<div class=email-config__form><div class=settings-card__row><div class=settings-card__label><span class=settings-card__label-title>Provider</span></div><div class=settings-card__control><select class=settings-card__input></select></div></div><div class=settings-card__row><div class=settings-card__label><span class=settings-card__label-title>API Key</span></div><div class=settings-card__control><input class=settings-card__input type=password></div></div><div class=settings-card__row><div class=settings-card__label><span class=settings-card__label-title>From Email</span><span class=settings-card__label-desc>Sender address for notifications (optional)</span></div><div class=settings-card__control><input class=settings-card__input type=email placeholder=noreply@example.com>"),oe=l('<button class="btn btn--ghost"style=color:hsl(var(--destructive))>Remove'),ge=l('<div class=settings-card><div class=settings-card__body><p class=settings-card__desc>Configure an email provider to receive notification alerts. Your API key is stored locally and never sent to any third party.</p></div><div class=settings-card__footer><button class="btn btn--outline"style=font-size:var(--font-size-sm)></button><button class="btn btn--primary"style=font-size:var(--font-size-sm)>'),ve=l("<p>Loading..."),_e=l("<option>");const ue=[{value:"mailgun",label:"Mailgun"},{value:"sendgrid",label:"SendGrid"},{value:"resend",label:"Resend"}],fe=()=>{const Y=Q.useSession(),j=()=>Y()?.data?.user?.email??"",[n,{refetch:T}]=U(W),[$,b]=o("resend"),[g,h]=o(""),[y,E]=o(""),[S,C]=o(""),[R,A]=o(!1),[K,z]=o(!1);X(()=>{const e=n();e?.configured&&e.provider&&(b(e.provider),e.domain&&E(e.domain),e.fromEmail&&C(e.fromEmail))});const G=async()=>{let e=j();try{const i=await te();i.email&&(e=i.email)}catch{}if(!e||e==="local@manifest.local"){p.error("Set a notification email in the section above before sending a test");return}A(!0);try{const i=await se({to:e,provider:$(),apiKey:g(),domain:y()||void 0,fromEmail:S()||void 0});i.success?p.success(`Test email sent to ${e}`):p.error(i.error??"Test email failed")}catch{}finally{A(!1)}},N=async()=>{z(!0);try{await ie({provider:$(),apiKey:g(),domain:y()||void 0,fromEmail:S()||void 0}),p.success("Email provider saved"),h(""),T()}catch{}finally{z(!1)}},O=async()=>{try{await ee(),p.success("Email provider removed"),h(""),E(""),C(""),b("resend"),T()}catch{}};return[le(),(()=>{var e=ge(),i=e.firstChild;i.firstChild;var I=i.nextSibling,v=I.firstChild,x=v.nextSibling;return a(i,m(f,{get when(){return!n.loading},get fallback(){return ve()},get children(){return[m(f,{get when(){return n()?.configured},get children(){var t=ne(),r=t.firstChild,d=r.nextSibling,w=d.firstChild,_=w.nextSibling;return a(_,()=>n()?.provider),t}}),(()=>{var t=de(),r=t.firstChild,d=r.firstChild,w=d.nextSibling,_=w.firstChild,D=r.nextSibling,k=D.firstChild;k.firstChild;var V=k.nextSibling,P=V.firstChild,L=D.nextSibling,q=L.firstChild,B=q.nextSibling,F=B.firstChild;return _.addEventListener("change",s=>b(s.currentTarget.value)),a(_,()=>ue.map(s=>(()=>{var u=_e();return a(u,()=>s.label),c(()=>u.value=s.value),u})())),a(k,m(f,{get when(){return n()?.configured},get children(){return re()}}),null),P.$$input=s=>h(s.currentTarget.value),a(t,m(f,{get when(){return $()==="mailgun"},get children(){var s=ce(),u=s.firstChild,H=u.nextSibling,M=H.firstChild;return M.$$input=J=>E(J.currentTarget.value),c(()=>M.value=y()),s}}),L),F.$$input=s=>C(s.currentTarget.value),c(()=>Z(P,"placeholder",n()?.configured?"********":"Enter API key")),c(()=>_.value=$()),c(()=>P.value=g()),c(()=>F.value=S()),t})()]}}),null),a(I,m(f,{get when(){return n()?.configured},get children(){var t=oe();return t.$$click=O,t}}),v),v.$$click=G,a(v,()=>R()?"Sending...":"Send test email"),x.$$click=N,a(x,()=>K()?"Saving...":"Save"),c(t=>{var r=R()||!g()&&!n()?.configured,d=K()||!g();return r!==t.e&&(v.disabled=t.e=r),d!==t.t&&(x.disabled=t.t=d),t},{e:void 0,t:void 0}),e})()]};ae(["input","click"]);export{fe as default};
1
+ import{j as Q,c as U,k as W,a as o,l as X,i as a,b as m,S as f,d as c,s as Z,t as l,m as ee,e as p,g as te,n as se,o as ie,h as ae}from"./index-Ck-Ng2iC.js";var le=l("<h3 class=settings-section__title>Email Provider"),ne=l('<div class="waiting-banner waiting-banner--success"role=status><i class="bxd bx-check-circle"></i><p>Email delivery is configured via <strong></strong>.'),re=l("<span class=settings-card__label-desc>Leave blank to keep existing key."),ce=l("<div class=settings-card__row><div class=settings-card__label><span class=settings-card__label-title>Domain</span><span class=settings-card__label-desc>Your Mailgun sending domain (e.g. mg.example.com)</span></div><div class=settings-card__control><input class=settings-card__input type=text placeholder=mg.example.com>"),de=l("<div class=email-config__form><div class=settings-card__row><div class=settings-card__label><span class=settings-card__label-title>Provider</span></div><div class=settings-card__control><select class=settings-card__input></select></div></div><div class=settings-card__row><div class=settings-card__label><span class=settings-card__label-title>API Key</span></div><div class=settings-card__control><input class=settings-card__input type=password></div></div><div class=settings-card__row><div class=settings-card__label><span class=settings-card__label-title>From Email</span><span class=settings-card__label-desc>Sender address for notifications (optional)</span></div><div class=settings-card__control><input class=settings-card__input type=email placeholder=noreply@example.com>"),oe=l('<button class="btn btn--ghost"style=color:hsl(var(--destructive))>Remove'),ge=l('<div class=settings-card><div class=settings-card__body><p class=settings-card__desc>Configure an email provider to receive notification alerts. Your API key is stored locally and never sent to any third party.</p></div><div class=settings-card__footer><button class="btn btn--outline"style=font-size:var(--font-size-sm)></button><button class="btn btn--primary"style=font-size:var(--font-size-sm)>'),ve=l("<p>Loading..."),_e=l("<option>");const ue=[{value:"mailgun",label:"Mailgun"},{value:"sendgrid",label:"SendGrid"},{value:"resend",label:"Resend"}],fe=()=>{const Y=Q.useSession(),j=()=>Y()?.data?.user?.email??"",[n,{refetch:T}]=U(W),[$,b]=o("resend"),[g,h]=o(""),[y,E]=o(""),[S,C]=o(""),[R,A]=o(!1),[K,z]=o(!1);X(()=>{const e=n();e?.configured&&e.provider&&(b(e.provider),e.domain&&E(e.domain),e.fromEmail&&C(e.fromEmail))});const G=async()=>{let e=j();try{const i=await te();i.email&&(e=i.email)}catch{}if(!e||e==="local@manifest.local"){p.error("Set a notification email in the section above before sending a test");return}A(!0);try{const i=await se({to:e,provider:$(),apiKey:g(),domain:y()||void 0,fromEmail:S()||void 0});i.success?p.success(`Test email sent to ${e}`):p.error(i.error??"Test email failed")}catch{}finally{A(!1)}},N=async()=>{z(!0);try{await ie({provider:$(),apiKey:g(),domain:y()||void 0,fromEmail:S()||void 0}),p.success("Email provider saved"),h(""),T()}catch{}finally{z(!1)}},O=async()=>{try{await ee(),p.success("Email provider removed"),h(""),E(""),C(""),b("resend"),T()}catch{}};return[le(),(()=>{var e=ge(),i=e.firstChild;i.firstChild;var I=i.nextSibling,v=I.firstChild,x=v.nextSibling;return a(i,m(f,{get when(){return!n.loading},get fallback(){return ve()},get children(){return[m(f,{get when(){return n()?.configured},get children(){var t=ne(),r=t.firstChild,d=r.nextSibling,w=d.firstChild,_=w.nextSibling;return a(_,()=>n()?.provider),t}}),(()=>{var t=de(),r=t.firstChild,d=r.firstChild,w=d.nextSibling,_=w.firstChild,D=r.nextSibling,k=D.firstChild;k.firstChild;var V=k.nextSibling,P=V.firstChild,L=D.nextSibling,q=L.firstChild,B=q.nextSibling,F=B.firstChild;return _.addEventListener("change",s=>b(s.currentTarget.value)),a(_,()=>ue.map(s=>(()=>{var u=_e();return a(u,()=>s.label),c(()=>u.value=s.value),u})())),a(k,m(f,{get when(){return n()?.configured},get children(){return re()}}),null),P.$$input=s=>h(s.currentTarget.value),a(t,m(f,{get when(){return $()==="mailgun"},get children(){var s=ce(),u=s.firstChild,H=u.nextSibling,M=H.firstChild;return M.$$input=J=>E(J.currentTarget.value),c(()=>M.value=y()),s}}),L),F.$$input=s=>C(s.currentTarget.value),c(()=>Z(P,"placeholder",n()?.configured?"********":"Enter API key")),c(()=>_.value=$()),c(()=>P.value=g()),c(()=>F.value=S()),t})()]}}),null),a(I,m(f,{get when(){return n()?.configured},get children(){var t=oe();return t.$$click=O,t}}),v),v.$$click=G,a(v,()=>R()?"Sending...":"Send test email"),x.$$click=N,a(x,()=>K()?"Saving...":"Save"),c(t=>{var r=R()||!g()&&!n()?.configured,d=K()||!g();return r!==t.e&&(v.disabled=t.e=r),d!==t.t&&(x.disabled=t.t=d),t},{e:void 0,t:void 0}),e})()]};ae(["input","click"]);export{fe as default};
@@ -1 +1 @@
1
- import{c as x,g as y,a as v,i as g,b,S as p,d as _,s as C,t as e,e as h,f as E,h as N}from"./index-D6VMzqMs.js";var k=e("<h3 class=settings-section__title>Notification Email"),z=e('<div class="waiting-banner waiting-banner--success"role=status><i class="bxd bx-check-circle"></i><p>Notifications will be sent to <strong></strong>.'),A=e("<div class=settings-card__row><div class=settings-card__label><span class=settings-card__label-title>Email address</span><span class=settings-card__label-desc>Where to receive notification alerts.</span></div><div class=settings-card__control><input class=settings-card__input type=email>"),R=e('<div class=settings-card><div class=settings-card__body><p class=settings-card__desc>Set the email address where threshold alerts and notifications will be sent.</p></div><div class=settings-card__footer><button class="btn btn--primary"style=font-size:var(--font-size-sm)>'),L=e("<p>Loading..."),P=e('<div class="waiting-banner waiting-banner--warning"role=alert><i class="bxd bx-x-circle"></i><p>No notification email configured. Alerts will not be delivered until you set one.');const W=()=>{const[s,{refetch:$}]=x(y),[l,f]=v(""),[m,u]=v(!1),w=async()=>{const t=l().trim();if(!t){h.error("Please enter an email address");return}u(!0);try{await E(t),h.success("Notification email saved"),f(""),$()}catch{}finally{u(!1)}};return[k(),(()=>{var t=R(),n=t.firstChild;n.firstChild;var S=n.nextSibling,r=S.firstChild;return g(n,b(p,{get when(){return!s.loading},get fallback(){return L()},get children(){return[b(p,{get when(){return s()?.email},get fallback(){return P()},get children(){var i=z(),c=i.firstChild,o=c.nextSibling,a=o.firstChild,d=a.nextSibling;return g(d,()=>s().email),i}}),(()=>{var i=A(),c=i.firstChild,o=c.nextSibling,a=o.firstChild;return a.$$input=d=>f(d.currentTarget.value),_(()=>C(a,"placeholder",s()?.email??"you@example.com")),_(()=>a.value=l()),i})()]}}),null),r.$$click=w,g(r,()=>m()?"Saving...":"Save"),_(()=>r.disabled=m()||!l().trim()),t})()]};N(["input","click"]);export{W as default};
1
+ import{c as x,g as y,a as v,i as g,b,S as p,d as _,s as C,t as e,e as h,f as E,h as N}from"./index-Ck-Ng2iC.js";var k=e("<h3 class=settings-section__title>Notification Email"),z=e('<div class="waiting-banner waiting-banner--success"role=status><i class="bxd bx-check-circle"></i><p>Notifications will be sent to <strong></strong>.'),A=e("<div class=settings-card__row><div class=settings-card__label><span class=settings-card__label-title>Email address</span><span class=settings-card__label-desc>Where to receive notification alerts.</span></div><div class=settings-card__control><input class=settings-card__input type=email>"),R=e('<div class=settings-card><div class=settings-card__body><p class=settings-card__desc>Set the email address where threshold alerts and notifications will be sent.</p></div><div class=settings-card__footer><button class="btn btn--primary"style=font-size:var(--font-size-sm)>'),L=e("<p>Loading..."),P=e('<div class="waiting-banner waiting-banner--warning"role=alert><i class="bxd bx-x-circle"></i><p>No notification email configured. Alerts will not be delivered until you set one.');const W=()=>{const[s,{refetch:$}]=x(y),[l,f]=v(""),[m,u]=v(!1),w=async()=>{const t=l().trim();if(!t){h.error("Please enter an email address");return}u(!0);try{await E(t),h.success("Notification email saved"),f(""),$()}catch{}finally{u(!1)}};return[k(),(()=>{var t=R(),n=t.firstChild;n.firstChild;var S=n.nextSibling,r=S.firstChild;return g(n,b(p,{get when(){return!s.loading},get fallback(){return L()},get children(){return[b(p,{get when(){return s()?.email},get fallback(){return P()},get children(){var i=z(),c=i.firstChild,o=c.nextSibling,a=o.firstChild,d=a.nextSibling;return g(d,()=>s().email),i}}),(()=>{var i=A(),c=i.firstChild,o=c.nextSibling,a=o.firstChild;return a.$$input=d=>f(d.currentTarget.value),_(()=>C(a,"placeholder",s()?.email??"you@example.com")),_(()=>a.value=l()),i})()]}}),null),r.$$click=w,g(r,()=>m()?"Saving...":"Save"),_(()=>r.disabled=m()||!l().trim()),t})()]};N(["input","click"]);export{W as default};