manifest 5.28.0 → 5.28.1

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
@@ -1,3 +1,7 @@
1
+
2
+ <a href="https://luma.com/clawcondfw">
3
+ <img width="1543" height="256" alt="Capture d’écran 2026-03-18 à 16 13 34" src="https://github.com/user-attachments/assets/11294f94-76c4-47bb-9c75-5ccc6b28fbdb" />
4
+ </a>
1
5
  <p align="center">
2
6
  <picture>
3
7
  <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/mnfst/manifest/HEAD/.github/assets/logo-white.svg" />
@@ -28,6 +32,10 @@ OpenClaw costs
28
32
  <a href="https://discord.gg/FepAked3W7"><img src="https://img.shields.io/badge/Discord-Join-5865F2?logo=discord&logoColor=white" alt="Discord" /></a>
29
33
  </p>
30
34
 
35
+ <p align="center">
36
+ <a href="https://trendshift.io/repositories/12890" target="_blank"><img src="https://trendshift.io/api/badge/repositories/12890" alt="mnfst%2Fmanifest | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/></a>
37
+ </p>
38
+
31
39
  ## What do you get?
32
40
 
33
41
  - 🔀 **Route requests to the right model** — cut costs up to 70%
package/dist/index.js CHANGED
@@ -16,8 +16,8 @@ To resolve the conflict:`,(0,ni.getConflictResolutionRecipe)(u,r))),c=a):tg.diag
16
16
  openclaw config set plugins.entries.manifest.config.endpoint https://app.manifest.build/otlp`:`Invalid apiKey format. Keys must start with '${Ze}'. Fix it via:
17
17
  openclaw config set manifest.apiKey ${Ze}YOUR_KEY`:`Missing apiKey. Set it via:
18
18
  openclaw config set manifest.apiKey ${Ze}YOUR_KEY
19
- or export MANIFEST_API_KEY=${Ze}YOUR_KEY`}var oa=ve(pM()),ia=ve(Ai()),HI=ve(CI()),kI=ve(GI()),YI=ve(mo());m();var tn=null,rn=null,Lc=null,Ic=null;function FI(o,r){let i=new YI.Resource({"service.name":dr.SERVICE_NAME,"service.version":"5.28.0","manifest.plugin":"true"}),c=o.apiKey?{Authorization:`Bearer ${o.apiKey}`}:{},a=new HI.OTLPTraceExporter({url:`${o.endpoint}/v1/traces`,headers:c});tn=new oa.BasicTracerProvider({resource:i,spanProcessors:[new oa.BatchSpanProcessor(a,{scheduledDelayMillis:5e3,maxQueueSize:2048,maxExportBatchSize:512})]}),tn.register(),r.debug(`[manifest] Trace exporter -> ${o.endpoint}/v1/traces`);let u=new kI.OTLPMetricExporter({url:`${o.endpoint}/v1/metrics`,headers:c}),t=o.devMode||o.mode==="local"?Uc.METRICS_INTERVAL_MS:dr.METRICS_INTERVAL_MS;return rn=new ia.MeterProvider({resource:i,readers:[new ia.PeriodicExportingMetricReader({exporter:u,exportIntervalMillis:t})]}),gt.setGlobalMeterProvider(rn),r.debug(`[manifest] Metrics exporter -> ${o.endpoint}/v1/metrics (interval=${t}ms)`),Lc=Ge.getTracer("manifest-plugin","5.28.0"),Ic=gt.getMeter("manifest-plugin","5.28.0"),{tracer:Lc,meter:Ic}}async function KI(o){o.info("[manifest] Shutting down telemetry..."),tn&&(await tn.shutdown(),tn=null),rn&&(await rn.shutdown(),rn=null),Lc=null,Ic=null,o.info("[manifest] Telemetry shut down")}m();var V5=5,qI=30*60*1e3,w5=3e3,B5=5*60*1e3,G5=new Set(["system","developer"]),H5=10,nn=new Map,jI=!1;function k5(){if(jI)return;jI=!0;let o=setInterval(()=>{let r=Date.now();for(let[i,c]of nn)r-c.lastUpdated>qI&&nn.delete(i)},B5);typeof o=="object"&&"unref"in o&&o.unref()}async function WI(o,r,i,c){k5();let u=`${o.endpoint.replace(/\/otlp(\/v1)?\/?$/,"")}/api/v1/routing/resolve`;try{if(!r||!Array.isArray(r)||r.length===0)return c.debug("[manifest] Routing resolve: no messages, skipping"),null;let t=r.filter(C=>C&&typeof C=="object"&&"role"in C&&!G5.has(C.role)).slice(-H5).map(C=>({role:C.role,content:C.content}));if(t.length===0)return c.debug("[manifest] Routing resolve: no scorable messages, skipping"),null;let e=nn.get(i),n=e&&Date.now()-e.lastUpdated<qI?e.tiers:void 0,s={messages:t};n&&(s.recentTiers=n);let l={"Content-Type":"application/json"};o.apiKey&&(l.Authorization=`Bearer ${o.apiKey}`);let E=await fetch(u,{method:"POST",headers:l,body:JSON.stringify(s),signal:AbortSignal.timeout(w5)});if(!E.ok)return c.debug(`[manifest] Routing resolve returned ${E.status}`),null;let A=await E.json();if(!A.model)return c.debug(`[manifest] Routing resolve: no model for tier=${A.tier}`),null;let g=nn.get(i);return g?(g.tiers=[A.tier,...g.tiers].slice(0,V5),g.lastUpdated=Date.now()):nn.set(i,{tiers:[A.tier],lastUpdated:Date.now()}),c.debug(`[manifest] Routing resolved: tier=${A.tier} model=${A.model} provider=${A.provider}`),{tier:A.tier,model:A.model,provider:A.provider??"unknown",reason:A.reason??"",auth_type:A.auth_type??"api_key"}}catch(t){let e=t instanceof Error?t.message:String(t);return c.debug(`[manifest] Routing resolve failed (${e})`),null}}function zI(o,r,i){if(typeof o.registerProvider!="function"){i.debug("[manifest] registerProvider not available, skipping provider registration");return}let c=r.endpoint.replace(/\/otlp(\/v1)?\/?$/,"");try{o.registerProvider({id:"manifest",name:"Manifest Router",label:"Manifest Router",api:"openai-completions",baseUrl:c,apiKey:r.apiKey,models:["auto"]}),i.info("[manifest] Registered as OpenAI-compatible provider (proxy mode)")}catch(a){let u=a instanceof Error?a.message:String(a);i.debug(`[manifest] registerProvider failed (${u})`)}}var Er=new Map,JI,XI,$I,QI,Y5,ZI,ex,tx,rx;function nx(o){JI=o.createCounter(Oe.LLM_REQUESTS,{description:"Total LLM inference requests"}),XI=o.createCounter(Oe.LLM_TOKENS_INPUT,{description:"Total input tokens sent to LLM"}),$I=o.createCounter(Oe.LLM_TOKENS_OUTPUT,{description:"Total output tokens from LLM"}),QI=o.createCounter(Oe.LLM_TOKENS_CACHE_READ,{description:"Total cache-read tokens"}),Y5=o.createHistogram(Oe.LLM_DURATION,{description:"LLM request duration in ms",unit:"ms"}),ZI=o.createCounter(Oe.TOOL_CALLS,{description:"Total tool invocations"}),ex=o.createCounter(Oe.TOOL_ERRORS,{description:"Total tool errors"}),tx=o.createHistogram(Oe.TOOL_DURATION,{description:"Tool execution duration in ms",unit:"ms"}),rx=o.createCounter(Oe.MESSAGES_RECEIVED,{description:"Total messages received from users"})}function aa(o,r,i){typeof o.on=="function"?o.on(r,i):typeof o.registerHook=="function"&&o.registerHook(r,i)}function ox(o,r,i,c){aa(o,"message_received",a=>{let u=a.sessionKey||a.session?.key||`agent:${a.agent||"main"}:main`,t=a.channel||"unknown",e=r.startSpan(sn.REQUEST,{kind:we.SERVER,attributes:{[b.SESSION_KEY]:u,[b.CHANNEL]:t}});Er.set(u,{root:e}),rx.add(1,{[b.CHANNEL]:t}),c.debug(`[manifest] Root span started for session=${u}`)}),aa(o,"before_agent_start",a=>{let u=a.sessionKey||a.session?.key||`agent:${a.agent||"main"}:main`,t=a.agent||"main",e=Er.get(u),n=e?.root?Ge.setSpan(Be.active(),e.root):Be.active(),s=r.startSpan(sn.AGENT_TURN,{kind:we.INTERNAL,attributes:{[b.AGENT_NAME]:t,[b.SESSION_KEY]:u}},n);e?e.turn=s:Er.set(u,{root:s,turn:s}),c.debug(`[manifest] Agent turn started: agent=${t}, session=${u}`)}),aa(o,"tool_result_persist",a=>{let u=a.toolName||a.tool||"unknown",t=a.durationMs||0,e=a.error==null,n=a.sessionKey||"unknown",s=Er.get(n),l=s?.turn?Ge.setSpan(Be.active(),s.turn):Be.active(),E=r.startSpan(`${sn.TOOL_PREFIX}${u}`,{kind:we.INTERNAL,attributes:{[b.TOOL_NAME]:u,[b.TOOL_SUCCESS]:String(e),[b.SESSION_KEY]:n}},l);e||(E.setStatus({code:nt.ERROR,message:a.error?.message||"Tool execution failed"}),ex.add(1,{[b.TOOL_NAME]:u})),E.end(),ZI.add(1,{[b.TOOL_NAME]:u}),tx.record(t,{[b.TOOL_NAME]:u})}),aa(o,"agent_end",async a=>{let u=a.sessionKey||a.session?.key||`agent:${a.agent||"main"}:main`,t=a.messages||[],e=[...t].reverse().find(k=>k.role==="assistant"&&k.usage),n=e?.model||a.model||"unknown",s=e?.provider||a.provider||"unknown",l=e?.usage||a.usage||{},E=l.input||l.inputTokens||l.prompt_tokens||l.promptTokens||0,A=l.output||l.outputTokens||l.completion_tokens||l.completionTokens||0,g=l.prompt_tokens_details||{},C=l.cacheRead||l.cacheReadTokens||l.cache_read_tokens||g.cached_tokens||0,on=l.cacheWrite||l.cacheWriteTokens||l.cache_creation_tokens||0,Le=n,Sr=s,Qe=null,ht=null;if(Le==="auto"){let k=await WI(i,t,u,c);k&&(Le=k.model,Sr=k.provider,Qe=k.tier,ht=k.reason||null)}let Nt=[...t].reverse().find(k=>k?.role==="user");(Nt?typeof Nt.content=="string"?Nt.content.includes("HEARTBEAT_OK"):Array.isArray(Nt.content)?Nt.content.some(k=>k.type==="text"&&typeof k.text=="string"&&k.text.includes("HEARTBEAT_OK")):!1:!1)&&(ht="heartbeat",Qe="simple");let Ae=Er.get(u);if(Ae?.turn){if(Ae.turn.setAttributes({[b.MODEL]:Le,[b.PROVIDER]:Sr,[b.INPUT_TOKENS]:E,[b.OUTPUT_TOKENS]:A,[b.CACHE_READ_TOKENS]:C,[b.CACHE_WRITE_TOKENS]:on}),Qe&&Ae.turn.setAttribute(b.ROUTING_TIER,Qe),ht&&Ae.turn.setAttribute(b.ROUTING_REASON,ht),a.success===!1||a.error!=null){let k=a.error?.message||a.errorMessage||"Agent turn failed";Ae.turn.setStatus({code:nt.ERROR,message:typeof k=="string"?k.slice(0,500):String(k)})}Ae.turn.end()}Ae?.root&&Ae.root!==Ae.turn&&Ae.root.end(),Er.delete(u);let an={[b.MODEL]:Le,[b.PROVIDER]:Sr};JI.add(1,an),XI.add(E,an),$I.add(A,an),C>0&&QI.add(C,an),c.debug(`[manifest] agent_end tokens: in=${E}, out=${A}, cache=${C}`),c.debug(`[manifest] Trace completed for session=${u}`)}),c.debug("[manifest] All hooks registered")}async function mt(o){let r=o.endpoint.replace(/\/otlp(\/v1)?\/?$/,""),i={endpointReachable:!1,authValid:!1,agentName:null,telemetryId: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=o.apiKey?{Authorization:`Bearer ${o.apiKey}`}:{},a=await fetch(`${r}/api/v1/agent/usage?range=24h`,{headers:c,signal:AbortSignal.timeout(5e3)});if(a.status===401||a.status===403)return i.error="API key rejected \u2014 check your mnfst_ key is correct",i;if(!a.ok)return i.error=`Usage endpoint returned ${a.status}`,i;i.authValid=!0;let u=await a.json();u&&typeof u.agentName=="string"&&(i.agentName=u.agentName),u&&typeof u.telemetryId=="string"&&(i.telemetryId=u.telemetryId)}catch(c){let a=c instanceof Error?c.message:String(c);return i.error=`Auth check failed: ${a}`,i}return i}var ua={today:"24h",week:"7d",month:"30d"};async function sa(o,r,i,c){let a=`${o}${r}`;try{let u=i?{Authorization:`Bearer ${i}`}:{},t=await fetch(a,{headers:u});if(!t.ok)return{content:[{type:"text",text:JSON.stringify({error:`API returned ${t.status}`})}]};let e=await t.json();return{content:[{type:"text",text:JSON.stringify(e)}]}}catch(u){let t=u instanceof Error?u.message:String(u);return c.error(`[manifest] API call failed: ${t}`),{content:[{type:"text",text:JSON.stringify({error:t})}]}}}function ix(o){try{let r=JSON.parse(o.content[0].text);return r.error?{error:r.error}:{result:r}}catch{return{result:o.content[0].text}}}function ax(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"}}},async handler(a){let u=ua[a.period||"today"]||"24h";return ix(await sa(c,`/api/v1/agent/usage?range=${u}`,r.apiKey,i))},async execute(a,u){let t=ua[u.period||"today"]||"24h";return sa(c,`/api/v1/agent/usage?range=${t}`,r.apiKey,i)}},{optional:!0}),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"}}},async handler(a){let u=ua[a.period||"week"]||"7d";return ix(await sa(c,`/api/v1/agent/costs?range=${u}`,r.apiKey,i))},async execute(a,u){let t=ua[u.period||"week"]||"7d";return sa(c,`/api/v1/agent/costs?range=${t}`,r.apiKey,i)}},{optional:!0}),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:{}},async handler(){let a=await mt(r);return a.error?{error:a.error}:{result:{endpointReachable:a.endpointReachable,authValid:a.authValid,agentName:a.agentName,status:"ok"}}},async execute(){let a=await mt(r);return a.error?{content:[{type:"text",text:JSON.stringify({error:a.error})}]}:{content:[{type:"text",text:JSON.stringify({endpointReachable:a.endpointReachable,authValid:a.authValid,agentName:a.agentName,status:"ok"})}]}}},{optional:!0}),i.debug("[manifest] Registered agent tools: manifest_usage, manifest_costs, manifest_health")}function ux(o,r,i){if(typeof o.registerCommand!="function"){i.debug("[manifest] registerCommand not available, skipping /manifest command");return}let c=async()=>{try{let a=await mt(r),u=[`Mode: ${r.mode}`,`Dev mode: ${r.devMode?"yes":"no"}`,`Endpoint reachable: ${a.endpointReachable?"yes":"no"}`,`Auth valid: ${a.authValid?"yes":"no"}`];return a.agentName&&u.push(`Agent: ${a.agentName}`),a.error&&u.push(`Error: ${a.error}`),u.join(`
20
- `)}catch(a){return`Manifest status check failed: ${a instanceof Error?a.message:String(a)}`}};o.registerCommand({name:"manifest",description:"Show Manifest plugin status and connection info",handler:c,execute:c}),i.debug("[manifest] Registered /manifest command")}var Tr=require("./local-mode");var sx=require("crypto"),Ue=require("os");function xc(){return{optedOut:process.env.MANIFEST_TELEMETRY_OPTOUT==="1"||process.env.MANIFEST_TELEMETRY_OPTOUT==="true",packageVersion:"5.28.0"}}var cx="https://eu.i.posthog.com",lx="phc_g5pLOu5bBRjhVJBwAsx0eCzJFWq0cri2TyVLQLxf045";function px(){let o=`${(0,Ue.hostname)()}-${(0,Ue.platform)()}-${(0,Ue.arch)()}`;return(0,sx.createHash)("sha256").update(o).digest("hex").slice(0,16)}function _x(o){if(xc().optedOut)return;let i={api_key:lx,event:"$identify",properties:{distinct_id:o,$anon_distinct_id:px()},timestamp:new Date().toISOString()};fetch(`${cx}/capture`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)}).catch(()=>{})}function Cc(o,r,i){let c=xc();if(c.optedOut)return;let a={api_key:lx,event:o,properties:{distinct_id:px(),os:(0,Ue.platform)(),os_version:(0,Ue.release)(),node_version:process.versions.node,package_version:c.packageVersion,mode:i??process.env.MANIFEST_MODE??"cloud",...r},timestamp:new Date().toISOString()};fetch(`${cx}/capture`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)}).catch(()=>{})}var ca=require("./subscription");module.exports={id:"manifest",name:"Manifest \u2014 Agent Observability",register(o){let r=o.logger||{info:(...A)=>console.log(...A),debug:()=>{},error:(...A)=>console.error(...A),warn:(...A)=>console.warn(...A)},{config:i,_deprecatedDevMode:c}=Dc(o.pluginConfig);if(c&&r.warn?.(`[manifest] mode: "dev" is deprecated. Use mode: "cloud" with devMode: true instead.
19
+ or export MANIFEST_API_KEY=${Ze}YOUR_KEY`}var oa=ve(pM()),ia=ve(Ai()),HI=ve(CI()),kI=ve(GI()),YI=ve(mo());m();var tn=null,rn=null,Lc=null,Ic=null;function FI(o,r){let i=new YI.Resource({"service.name":dr.SERVICE_NAME,"service.version":"5.28.1","manifest.plugin":"true"}),c=o.apiKey?{Authorization:`Bearer ${o.apiKey}`}:{},a=new HI.OTLPTraceExporter({url:`${o.endpoint}/v1/traces`,headers:c});tn=new oa.BasicTracerProvider({resource:i,spanProcessors:[new oa.BatchSpanProcessor(a,{scheduledDelayMillis:5e3,maxQueueSize:2048,maxExportBatchSize:512})]}),tn.register(),r.debug(`[manifest] Trace exporter -> ${o.endpoint}/v1/traces`);let u=new kI.OTLPMetricExporter({url:`${o.endpoint}/v1/metrics`,headers:c}),t=o.devMode||o.mode==="local"?Uc.METRICS_INTERVAL_MS:dr.METRICS_INTERVAL_MS;return rn=new ia.MeterProvider({resource:i,readers:[new ia.PeriodicExportingMetricReader({exporter:u,exportIntervalMillis:t})]}),gt.setGlobalMeterProvider(rn),r.debug(`[manifest] Metrics exporter -> ${o.endpoint}/v1/metrics (interval=${t}ms)`),Lc=Ge.getTracer("manifest-plugin","5.28.1"),Ic=gt.getMeter("manifest-plugin","5.28.1"),{tracer:Lc,meter:Ic}}async function KI(o){o.info("[manifest] Shutting down telemetry..."),tn&&(await tn.shutdown(),tn=null),rn&&(await rn.shutdown(),rn=null),Lc=null,Ic=null,o.info("[manifest] Telemetry shut down")}m();var V5=5,qI=30*60*1e3,w5=3e3,B5=5*60*1e3,G5=new Set(["system","developer"]),H5=10,nn=new Map,jI=!1;function k5(){if(jI)return;jI=!0;let o=setInterval(()=>{let r=Date.now();for(let[i,c]of nn)r-c.lastUpdated>qI&&nn.delete(i)},B5);typeof o=="object"&&"unref"in o&&o.unref()}async function WI(o,r,i,c){k5();let u=`${o.endpoint.replace(/\/otlp(\/v1)?\/?$/,"")}/api/v1/routing/resolve`;try{if(!r||!Array.isArray(r)||r.length===0)return c.debug("[manifest] Routing resolve: no messages, skipping"),null;let t=r.filter(C=>C&&typeof C=="object"&&"role"in C&&!G5.has(C.role)).slice(-H5).map(C=>({role:C.role,content:C.content}));if(t.length===0)return c.debug("[manifest] Routing resolve: no scorable messages, skipping"),null;let e=nn.get(i),n=e&&Date.now()-e.lastUpdated<qI?e.tiers:void 0,s={messages:t};n&&(s.recentTiers=n);let l={"Content-Type":"application/json"};o.apiKey&&(l.Authorization=`Bearer ${o.apiKey}`);let E=await fetch(u,{method:"POST",headers:l,body:JSON.stringify(s),signal:AbortSignal.timeout(w5)});if(!E.ok)return c.debug(`[manifest] Routing resolve returned ${E.status}`),null;let A=await E.json();if(!A.model)return c.debug(`[manifest] Routing resolve: no model for tier=${A.tier}`),null;let g=nn.get(i);return g?(g.tiers=[A.tier,...g.tiers].slice(0,V5),g.lastUpdated=Date.now()):nn.set(i,{tiers:[A.tier],lastUpdated:Date.now()}),c.debug(`[manifest] Routing resolved: tier=${A.tier} model=${A.model} provider=${A.provider}`),{tier:A.tier,model:A.model,provider:A.provider??"unknown",reason:A.reason??"",auth_type:A.auth_type??"api_key"}}catch(t){let e=t instanceof Error?t.message:String(t);return c.debug(`[manifest] Routing resolve failed (${e})`),null}}function zI(o,r,i){if(typeof o.registerProvider!="function"){i.debug("[manifest] registerProvider not available, skipping provider registration");return}let c=r.endpoint.replace(/\/otlp(\/v1)?\/?$/,"");try{o.registerProvider({id:"manifest",name:"Manifest Router",label:"Manifest Router",api:"openai-completions",baseUrl:c,apiKey:r.apiKey,models:["auto"]}),i.info("[manifest] Registered as OpenAI-compatible provider (proxy mode)")}catch(a){let u=a instanceof Error?a.message:String(a);i.debug(`[manifest] registerProvider failed (${u})`)}}var Er=new Map,JI,XI,$I,QI,Y5,ZI,ex,tx,rx;function nx(o){JI=o.createCounter(Oe.LLM_REQUESTS,{description:"Total LLM inference requests"}),XI=o.createCounter(Oe.LLM_TOKENS_INPUT,{description:"Total input tokens sent to LLM"}),$I=o.createCounter(Oe.LLM_TOKENS_OUTPUT,{description:"Total output tokens from LLM"}),QI=o.createCounter(Oe.LLM_TOKENS_CACHE_READ,{description:"Total cache-read tokens"}),Y5=o.createHistogram(Oe.LLM_DURATION,{description:"LLM request duration in ms",unit:"ms"}),ZI=o.createCounter(Oe.TOOL_CALLS,{description:"Total tool invocations"}),ex=o.createCounter(Oe.TOOL_ERRORS,{description:"Total tool errors"}),tx=o.createHistogram(Oe.TOOL_DURATION,{description:"Tool execution duration in ms",unit:"ms"}),rx=o.createCounter(Oe.MESSAGES_RECEIVED,{description:"Total messages received from users"})}function aa(o,r,i){typeof o.on=="function"?o.on(r,i):typeof o.registerHook=="function"&&o.registerHook(r,i)}function ox(o,r,i,c){aa(o,"message_received",a=>{let u=a.sessionKey||a.session?.key||`agent:${a.agent||"main"}:main`,t=a.channel||"unknown",e=r.startSpan(sn.REQUEST,{kind:we.SERVER,attributes:{[b.SESSION_KEY]:u,[b.CHANNEL]:t}});Er.set(u,{root:e}),rx.add(1,{[b.CHANNEL]:t}),c.debug(`[manifest] Root span started for session=${u}`)}),aa(o,"before_agent_start",a=>{let u=a.sessionKey||a.session?.key||`agent:${a.agent||"main"}:main`,t=a.agent||"main",e=Er.get(u),n=e?.root?Ge.setSpan(Be.active(),e.root):Be.active(),s=r.startSpan(sn.AGENT_TURN,{kind:we.INTERNAL,attributes:{[b.AGENT_NAME]:t,[b.SESSION_KEY]:u}},n);e?e.turn=s:Er.set(u,{root:s,turn:s}),c.debug(`[manifest] Agent turn started: agent=${t}, session=${u}`)}),aa(o,"tool_result_persist",a=>{let u=a.toolName||a.tool||"unknown",t=a.durationMs||0,e=a.error==null,n=a.sessionKey||"unknown",s=Er.get(n),l=s?.turn?Ge.setSpan(Be.active(),s.turn):Be.active(),E=r.startSpan(`${sn.TOOL_PREFIX}${u}`,{kind:we.INTERNAL,attributes:{[b.TOOL_NAME]:u,[b.TOOL_SUCCESS]:String(e),[b.SESSION_KEY]:n}},l);e||(E.setStatus({code:nt.ERROR,message:a.error?.message||"Tool execution failed"}),ex.add(1,{[b.TOOL_NAME]:u})),E.end(),ZI.add(1,{[b.TOOL_NAME]:u}),tx.record(t,{[b.TOOL_NAME]:u})}),aa(o,"agent_end",async a=>{let u=a.sessionKey||a.session?.key||`agent:${a.agent||"main"}:main`,t=a.messages||[],e=[...t].reverse().find(k=>k.role==="assistant"&&k.usage),n=e?.model||a.model||"unknown",s=e?.provider||a.provider||"unknown",l=e?.usage||a.usage||{},E=l.input||l.inputTokens||l.prompt_tokens||l.promptTokens||0,A=l.output||l.outputTokens||l.completion_tokens||l.completionTokens||0,g=l.prompt_tokens_details||{},C=l.cacheRead||l.cacheReadTokens||l.cache_read_tokens||g.cached_tokens||0,on=l.cacheWrite||l.cacheWriteTokens||l.cache_creation_tokens||0,Le=n,Sr=s,Qe=null,ht=null;if(Le==="auto"){let k=await WI(i,t,u,c);k&&(Le=k.model,Sr=k.provider,Qe=k.tier,ht=k.reason||null)}let Nt=[...t].reverse().find(k=>k?.role==="user");(Nt?typeof Nt.content=="string"?Nt.content.includes("HEARTBEAT_OK"):Array.isArray(Nt.content)?Nt.content.some(k=>k.type==="text"&&typeof k.text=="string"&&k.text.includes("HEARTBEAT_OK")):!1:!1)&&(ht="heartbeat",Qe="simple");let Ae=Er.get(u);if(Ae?.turn){if(Ae.turn.setAttributes({[b.MODEL]:Le,[b.PROVIDER]:Sr,[b.INPUT_TOKENS]:E,[b.OUTPUT_TOKENS]:A,[b.CACHE_READ_TOKENS]:C,[b.CACHE_WRITE_TOKENS]:on}),Qe&&Ae.turn.setAttribute(b.ROUTING_TIER,Qe),ht&&Ae.turn.setAttribute(b.ROUTING_REASON,ht),a.success===!1||a.error!=null){let k=a.error?.message||a.errorMessage||"Agent turn failed";Ae.turn.setStatus({code:nt.ERROR,message:typeof k=="string"?k.slice(0,500):String(k)})}Ae.turn.end()}Ae?.root&&Ae.root!==Ae.turn&&Ae.root.end(),Er.delete(u);let an={[b.MODEL]:Le,[b.PROVIDER]:Sr};JI.add(1,an),XI.add(E,an),$I.add(A,an),C>0&&QI.add(C,an),c.debug(`[manifest] agent_end tokens: in=${E}, out=${A}, cache=${C}`),c.debug(`[manifest] Trace completed for session=${u}`)}),c.debug("[manifest] All hooks registered")}async function mt(o){let r=o.endpoint.replace(/\/otlp(\/v1)?\/?$/,""),i={endpointReachable:!1,authValid:!1,agentName:null,telemetryId: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=o.apiKey?{Authorization:`Bearer ${o.apiKey}`}:{},a=await fetch(`${r}/api/v1/agent/usage?range=24h`,{headers:c,signal:AbortSignal.timeout(5e3)});if(a.status===401||a.status===403)return i.error="API key rejected \u2014 check your mnfst_ key is correct",i;if(!a.ok)return i.error=`Usage endpoint returned ${a.status}`,i;i.authValid=!0;let u=await a.json();u&&typeof u.agentName=="string"&&(i.agentName=u.agentName),u&&typeof u.telemetryId=="string"&&(i.telemetryId=u.telemetryId)}catch(c){let a=c instanceof Error?c.message:String(c);return i.error=`Auth check failed: ${a}`,i}return i}var ua={today:"24h",week:"7d",month:"30d"};async function sa(o,r,i,c){let a=`${o}${r}`;try{let u=i?{Authorization:`Bearer ${i}`}:{},t=await fetch(a,{headers:u});if(!t.ok)return{content:[{type:"text",text:JSON.stringify({error:`API returned ${t.status}`})}]};let e=await t.json();return{content:[{type:"text",text:JSON.stringify(e)}]}}catch(u){let t=u instanceof Error?u.message:String(u);return c.error(`[manifest] API call failed: ${t}`),{content:[{type:"text",text:JSON.stringify({error:t})}]}}}function ix(o){try{let r=JSON.parse(o.content[0].text);return r.error?{error:r.error}:{result:r}}catch{return{result:o.content[0].text}}}function ax(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"}}},async handler(a){let u=ua[a.period||"today"]||"24h";return ix(await sa(c,`/api/v1/agent/usage?range=${u}`,r.apiKey,i))},async execute(a,u){let t=ua[u.period||"today"]||"24h";return sa(c,`/api/v1/agent/usage?range=${t}`,r.apiKey,i)}},{optional:!0}),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"}}},async handler(a){let u=ua[a.period||"week"]||"7d";return ix(await sa(c,`/api/v1/agent/costs?range=${u}`,r.apiKey,i))},async execute(a,u){let t=ua[u.period||"week"]||"7d";return sa(c,`/api/v1/agent/costs?range=${t}`,r.apiKey,i)}},{optional:!0}),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:{}},async handler(){let a=await mt(r);return a.error?{error:a.error}:{result:{endpointReachable:a.endpointReachable,authValid:a.authValid,agentName:a.agentName,status:"ok"}}},async execute(){let a=await mt(r);return a.error?{content:[{type:"text",text:JSON.stringify({error:a.error})}]}:{content:[{type:"text",text:JSON.stringify({endpointReachable:a.endpointReachable,authValid:a.authValid,agentName:a.agentName,status:"ok"})}]}}},{optional:!0}),i.debug("[manifest] Registered agent tools: manifest_usage, manifest_costs, manifest_health")}function ux(o,r,i){if(typeof o.registerCommand!="function"){i.debug("[manifest] registerCommand not available, skipping /manifest command");return}let c=async()=>{try{let a=await mt(r),u=[`Mode: ${r.mode}`,`Dev mode: ${r.devMode?"yes":"no"}`,`Endpoint reachable: ${a.endpointReachable?"yes":"no"}`,`Auth valid: ${a.authValid?"yes":"no"}`];return a.agentName&&u.push(`Agent: ${a.agentName}`),a.error&&u.push(`Error: ${a.error}`),u.join(`
20
+ `)}catch(a){return`Manifest status check failed: ${a instanceof Error?a.message:String(a)}`}};o.registerCommand({name:"manifest",description:"Show Manifest plugin status and connection info",handler:c,execute:c}),i.debug("[manifest] Registered /manifest command")}var Tr=require("./local-mode");var sx=require("crypto"),Ue=require("os");function xc(){return{optedOut:process.env.MANIFEST_TELEMETRY_OPTOUT==="1"||process.env.MANIFEST_TELEMETRY_OPTOUT==="true",packageVersion:"5.28.1"}}var cx="https://eu.i.posthog.com",lx="phc_g5pLOu5bBRjhVJBwAsx0eCzJFWq0cri2TyVLQLxf045";function px(){let o=`${(0,Ue.hostname)()}-${(0,Ue.platform)()}-${(0,Ue.arch)()}`;return(0,sx.createHash)("sha256").update(o).digest("hex").slice(0,16)}function _x(o){if(xc().optedOut)return;let i={api_key:lx,event:"$identify",properties:{distinct_id:o,$anon_distinct_id:px()},timestamp:new Date().toISOString()};fetch(`${cx}/capture`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)}).catch(()=>{})}function Cc(o,r,i){let c=xc();if(c.optedOut)return;let a={api_key:lx,event:o,properties:{distinct_id:px(),os:(0,Ue.platform)(),os_version:(0,Ue.release)(),node_version:process.versions.node,package_version:c.packageVersion,mode:i??process.env.MANIFEST_MODE??"cloud",...r},timestamp:new Date().toISOString()};fetch(`${cx}/capture`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)}).catch(()=>{})}var ca=require("./subscription");module.exports={id:"manifest",name:"Manifest \u2014 Agent Observability",register(o){let r=o.logger||{info:(...A)=>console.log(...A),debug:()=>{},error:(...A)=>console.error(...A),warn:(...A)=>console.warn(...A)},{config:i,_deprecatedDevMode:c}=Dc(o.pluginConfig);if(c&&r.warn?.(`[manifest] mode: "dev" is deprecated. Use mode: "cloud" with devMode: true instead.
21
21
  openclaw config set plugins.entries.manifest.config.mode cloud
22
22
  openclaw config set plugins.entries.manifest.config.devMode true`),i.devMode||(Cc("plugin_registered",void 0,i.mode),Cc("plugin_mode_selected",{mode:i.mode},i.mode)),i.mode==="local"){(0,Tr.registerLocalMode)(o,i,r);return}let a=Vc(i);if(a){!i.devMode&&i.mode==="cloud"&&!i.apiKey?r.info(`[manifest] Cloud mode requires an API key:
23
23
  openclaw config set plugins.entries.manifest.config.apiKey mnfst_YOUR_KEY