manifest 5.24.2 → 5.25.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 (43) hide show
  1. package/dist/backend/analytics/controllers/messages.controller.js +1 -2
  2. package/dist/backend/analytics/dto/messages-query.dto.js +2 -8
  3. package/dist/backend/analytics/services/messages-query.service.js +23 -8
  4. package/dist/backend/auth/auth.instance.js +2 -1
  5. package/dist/backend/common/utils/provider-inference.js +30 -0
  6. package/dist/backend/routing/routing.service.js +4 -16
  7. package/dist/index.js +2 -2
  8. package/package.json +1 -1
  9. package/public/assets/{Account-D79xeKyT.js → Account-BTS5z9ZI.js} +1 -1
  10. package/public/assets/{AuthBadge-D4H7aZ6T.js → AuthBadge-CXkjgzF2.js} +1 -1
  11. package/public/assets/Help-BCxDh7o6.js +1 -0
  12. package/public/assets/{InfoTooltip-BgPRXOPt.js → InfoTooltip-Bno8U6nE.js} +1 -1
  13. package/public/assets/Limits-CRdLGW1-.js +1 -0
  14. package/public/assets/Login-CfGUFi77.js +1 -0
  15. package/public/assets/MessageLog-D_Cu7rch.js +1 -0
  16. package/public/assets/{ModelPrices-Dfn6eK1-.js → ModelPrices-BbHSkT6Z.js} +1 -1
  17. package/public/assets/Overview-kF_Bct6K.js +1 -0
  18. package/public/assets/{Pagination-qcyFxNyW.js → Pagination-CQk_Ps2L.js} +1 -1
  19. package/public/assets/{ProviderIcon-DkiiWOHz.js → ProviderIcon-CsB_Gx2t.js} +1 -1
  20. package/public/assets/{Register-DH-OYkxl.js → Register-CnO4K1tM.js} +1 -1
  21. package/public/assets/{ResetPassword-Bd22sqer.js → ResetPassword-iCeAfd1k.js} +1 -1
  22. package/public/assets/Routing-BRLZGQzX.js +3 -0
  23. package/public/assets/Settings-BKKkYuZx.js +1 -0
  24. package/public/assets/{SetupStepInstall-FQkRe6aV.js → SetupStepInstall-gm9pOgFh.js} +1 -1
  25. package/public/assets/{SetupStepVerify-NS7Lj6qk.js → SetupStepVerify-B01hQCeb.js} +1 -1
  26. package/public/assets/{SocialButtons-BmEEEVZg.js → SocialButtons-CJFTtTz6.js} +1 -1
  27. package/public/assets/{auth-yjhjkKyr.js → auth-C2bQ9WcQ.js} +1 -1
  28. package/public/assets/index-DrLOx3nR.js +2 -0
  29. package/public/assets/index-fyETryMo.css +1 -0
  30. package/public/assets/{overview-B6JfuXXv.js → overview-DoY4lTQc.js} +1 -1
  31. package/public/assets/vendor-K8fEFSq9.js +1 -0
  32. package/public/icons/providers/moonshot.svg +1 -1
  33. package/public/index.html +4 -4
  34. package/public/assets/Help-0qmJVFn8.js +0 -1
  35. package/public/assets/Limits-68Jol4KI.js +0 -1
  36. package/public/assets/Login-q9JoAR_x.js +0 -1
  37. package/public/assets/MessageLog-CUR9du7l.js +0 -1
  38. package/public/assets/Overview-QSa9JMZx.js +0 -1
  39. package/public/assets/Routing-C-8PKTEa.js +0 -3
  40. package/public/assets/Settings-B7NcLutw.js +0 -1
  41. package/public/assets/index-DBqZDW9Z.css +0 -1
  42. package/public/assets/index-DKNLgS0h.js +0 -2
  43. package/public/assets/vendor-COodrVsO.js +0 -1
@@ -26,9 +26,8 @@ let MessagesController = class MessagesController {
26
26
  return this.messagesQuery.getMessages({
27
27
  range: query.range,
28
28
  userId: user.id,
29
- status: query.status,
29
+ provider: query.provider,
30
30
  service_type: query.service_type,
31
- model: query.model,
32
31
  cost_min: query.cost_min,
33
32
  cost_max: query.cost_max,
34
33
  limit: Math.min(query.limit ?? 50, 200),
@@ -14,9 +14,8 @@ const class_transformer_1 = require("class-transformer");
14
14
  const class_validator_1 = require("class-validator");
15
15
  class MessagesQueryDto {
16
16
  range;
17
- status;
17
+ provider;
18
18
  service_type;
19
- model;
20
19
  cost_min;
21
20
  cost_max;
22
21
  limit;
@@ -33,17 +32,12 @@ __decorate([
33
32
  (0, class_validator_1.IsOptional)(),
34
33
  (0, class_validator_1.IsString)(),
35
34
  __metadata("design:type", String)
36
- ], MessagesQueryDto.prototype, "status", void 0);
35
+ ], MessagesQueryDto.prototype, "provider", void 0);
37
36
  __decorate([
38
37
  (0, class_validator_1.IsOptional)(),
39
38
  (0, class_validator_1.IsString)(),
40
39
  __metadata("design:type", String)
41
40
  ], MessagesQueryDto.prototype, "service_type", void 0);
42
- __decorate([
43
- (0, class_validator_1.IsOptional)(),
44
- (0, class_validator_1.IsString)(),
45
- __metadata("design:type", String)
46
- ], MessagesQueryDto.prototype, "model", void 0);
47
41
  __decorate([
48
42
  (0, class_validator_1.IsOptional)(),
49
43
  (0, class_validator_1.IsNumber)(),
@@ -21,6 +21,7 @@ const range_util_1 = require("../../common/utils/range.util");
21
21
  const query_helpers_1 = require("./query-helpers");
22
22
  const tenant_cache_service_1 = require("../../common/services/tenant-cache.service");
23
23
  const sql_dialect_1 = require("../../common/utils/sql-dialect");
24
+ const provider_inference_1 = require("../../common/utils/provider-inference");
24
25
  const MODELS_CACHE_TTL_MS = 60_000;
25
26
  const COUNT_CACHE_TTL_MS = 30_000;
26
27
  const MAX_CACHE_ENTRIES = 5_000;
@@ -45,18 +46,23 @@ let MessagesQueryService = class MessagesQueryService {
45
46
  baseQb.where('at.timestamp >= :cutoff', { cutoff });
46
47
  }
47
48
  (0, query_helpers_1.addTenantFilter)(baseQb, params.userId, undefined, tenantId);
48
- if (params.status)
49
- baseQb.andWhere('at.status = :status', { status: params.status });
50
49
  if (params.service_type)
51
50
  baseQb.andWhere('at.service_type = :serviceType', { serviceType: params.service_type });
52
- if (params.model)
53
- baseQb.andWhere('at.model = :model', { model: params.model });
54
51
  if (params.cost_min !== undefined)
55
52
  baseQb.andWhere('at.cost_usd >= :costMin', { costMin: params.cost_min });
56
53
  if (params.cost_max !== undefined)
57
54
  baseQb.andWhere('at.cost_usd <= :costMax', { costMax: params.cost_max });
58
55
  if (params.agent_name)
59
56
  baseQb.andWhere('at.agent_name = :filterAgent', { filterAgent: params.agent_name });
57
+ if (params.provider) {
58
+ const allModels = await this.getDistinctModels(params.userId, params.range, tenantId, params.agent_name);
59
+ const matching = allModels.filter((m) => (0, provider_inference_1.inferProviderFromModel)(m) === params.provider);
60
+ if (matching.length === 0) {
61
+ const providers = this.deriveProviders(allModels);
62
+ return { items: [], next_cursor: null, total_count: 0, providers };
63
+ }
64
+ baseQb.andWhere('at.model IN (:...providerModels)', { providerModels: matching });
65
+ }
60
66
  const countCacheKey = this.buildCountCacheKey(params);
61
67
  const countQb = baseQb.clone().select('COUNT(*)', 'total');
62
68
  const costExpr = (0, sql_dialect_1.sqlCastFloat)((0, sql_dialect_1.sqlSanitizeCost)('at.cost_usd'), this.dialect);
@@ -98,7 +104,7 @@ let MessagesQueryService = class MessagesQueryService {
98
104
  }
99
105
  const cachedCount = params.cursor ? this.countCache.get(countCacheKey) : undefined;
100
106
  const countHit = cachedCount && cachedCount.expiresAt > Date.now();
101
- const [countResult, rows, models] = await Promise.all([
107
+ const [countResult, rows, allModels] = await Promise.all([
102
108
  countHit ? null : countQb.getRawOne(),
103
109
  dataQb
104
110
  .orderBy('at.timestamp', 'DESC')
@@ -122,13 +128,23 @@ let MessagesQueryService = class MessagesQueryService {
122
128
  const tsStr = ts instanceof Date ? (0, query_helpers_1.formatTimestamp)(ts) : String(ts ?? '');
123
129
  const lastId = lastItem?.['id'];
124
130
  const nextCursor = hasMore && lastItem ? `${tsStr}|${String(lastId)}` : null;
131
+ const providers = this.deriveProviders(allModels);
125
132
  return {
126
133
  items,
127
134
  next_cursor: nextCursor,
128
135
  total_count: totalCount,
129
- models,
136
+ providers,
130
137
  };
131
138
  }
139
+ deriveProviders(models) {
140
+ const seen = new Set();
141
+ for (const m of models) {
142
+ const p = (0, provider_inference_1.inferProviderFromModel)(m);
143
+ if (p)
144
+ seen.add(p);
145
+ }
146
+ return [...seen].sort();
147
+ }
132
148
  async getDistinctModels(userId, range, tenantId, agentName) {
133
149
  const cacheKey = `${userId}:${agentName ?? ''}:${range ?? 'all'}`;
134
150
  const cached = this.modelsCache.get(cacheKey);
@@ -161,9 +177,8 @@ let MessagesQueryService = class MessagesQueryService {
161
177
  return [
162
178
  params.userId,
163
179
  params.range ?? '',
164
- params.status ?? '',
180
+ params.provider ?? '',
165
181
  params.service_type ?? '',
166
- params.model ?? '',
167
182
  params.agent_name ?? '',
168
183
  params.cost_min ?? '',
169
184
  params.cost_max ?? '',
@@ -44,7 +44,7 @@ function buildTrustedOrigins() {
44
44
  }
45
45
  return origins;
46
46
  }
47
- exports.auth = isLocalMode
47
+ const authInstance = isLocalMode
48
48
  ? null
49
49
  : (0, better_auth_1.betterAuth)({
50
50
  database: database,
@@ -126,4 +126,5 @@ exports.auth = isLocalMode
126
126
  },
127
127
  },
128
128
  });
129
+ exports.auth = authInstance;
129
130
  //# sourceMappingURL=auth.instance.js.map
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.inferProviderFromModel = inferProviderFromModel;
4
+ const MODEL_PREFIX_MAP = [
5
+ [/^openrouter\//, 'openrouter'],
6
+ [/^claude-/, 'anthropic'],
7
+ [/^gpt-|^o[134]-|^o[134] |^chatgpt-/, 'openai'],
8
+ [/^gemini-/, 'gemini'],
9
+ [/^deepseek-/, 'deepseek'],
10
+ [/^grok-/, 'xai'],
11
+ [/^mistral-|^codestral|^pixtral|^open-mistral/, 'mistral'],
12
+ [/^kimi-|^moonshot-/, 'moonshot'],
13
+ [/^minimax-/i, 'minimax'],
14
+ [/^glm-/, 'zai'],
15
+ [/^qwen[23]|^qwq-/, 'qwen'],
16
+ [/^[a-z][\w-]*\//, 'openrouter'],
17
+ ];
18
+ function inferProviderFromModel(model) {
19
+ if (model.startsWith('custom:'))
20
+ return 'custom';
21
+ if (/:/.test(model) && !model.endsWith(':free'))
22
+ return 'ollama';
23
+ const lower = model.toLowerCase();
24
+ for (const [re, id] of MODEL_PREFIX_MAP) {
25
+ if (re.test(lower))
26
+ return id;
27
+ }
28
+ return undefined;
29
+ }
30
+ //# sourceMappingURL=provider-inference.js.map
@@ -69,9 +69,6 @@ let RoutingService = RoutingService_1 = class RoutingService {
69
69
  existing.is_active = true;
70
70
  existing.updated_at = new Date().toISOString();
71
71
  await this.providerRepo.save(existing);
72
- if (effectiveAuthType === 'api_key') {
73
- await this.deactivateSubscriptionForProvider(agentId, provider);
74
- }
75
72
  await this.autoAssign.recalculate(agentId);
76
73
  this.routingCache.invalidateAgent(agentId);
77
74
  return { provider: existing, isNew: false };
@@ -89,9 +86,6 @@ let RoutingService = RoutingService_1 = class RoutingService {
89
86
  updated_at: new Date().toISOString(),
90
87
  });
91
88
  await this.providerRepo.insert(record);
92
- if (effectiveAuthType === 'api_key') {
93
- await this.deactivateSubscriptionForProvider(agentId, provider);
94
- }
95
89
  await this.autoAssign.recalculate(agentId);
96
90
  this.routingCache.invalidateAgent(agentId);
97
91
  return { provider: record, isNew: true };
@@ -124,16 +118,6 @@ let RoutingService = RoutingService_1 = class RoutingService {
124
118
  this.routingCache.invalidateAgent(agentId);
125
119
  return { isNew: true };
126
120
  }
127
- async deactivateSubscriptionForProvider(agentId, provider) {
128
- const sub = await this.providerRepo.findOne({
129
- where: { agent_id: agentId, provider, auth_type: 'subscription', is_active: true },
130
- });
131
- if (!sub)
132
- return;
133
- sub.is_active = false;
134
- sub.updated_at = new Date().toISOString();
135
- await this.providerRepo.save(sub);
136
- }
137
121
  async removeProvider(agentId, provider, authType) {
138
122
  const where = { agent_id: agentId, provider };
139
123
  if (authType)
@@ -300,6 +284,10 @@ let RoutingService = RoutingService_1 = class RoutingService {
300
284
  if (existing) {
301
285
  existing.override_model = model;
302
286
  existing.override_auth_type = authType ?? null;
287
+ if (existing.fallback_models?.includes(model)) {
288
+ const filtered = existing.fallback_models.filter((m) => m !== model);
289
+ existing.fallback_models = filtered.length > 0 ? filtered : null;
290
+ }
303
291
  existing.updated_at = new Date().toISOString();
304
292
  await this.tierRepo.save(existing);
305
293
  this.routingCache.invalidateAgent(agentId);
package/dist/index.js CHANGED
@@ -17,14 +17,14 @@ To resolve the conflict:`,(0,ai.getConflictResolutionRecipe)(u,r))),c=a):Ag.diag
17
17
  openclaw config set plugins.entries.manifest.config.endpoint https://app.manifest.build/otlp`:`Invalid apiKey format. Keys must start with '${Ne}'. Fix it via:
18
18
  openclaw config set manifest.apiKey ${Ne}YOUR_KEY`:`Missing apiKey. Set it via:
19
19
  openclaw config set manifest.apiKey ${Ne}YOUR_KEY
20
- or export MANIFEST_API_KEY=${Ne}YOUR_KEY`}var ua=Oe(gM()),sa=Oe(Oi()),nx=Oe(zI()),ox=Oe(rx()),ix=Oe(yo());O();var on=null,an=null,Hc=null,kc=null;function ca(o,r){let i=new ix.Resource({"service.name":mr.SERVICE_NAME,"service.version":"5.24.2","manifest.plugin":"true"}),c=o.apiKey?{Authorization:`Bearer ${o.apiKey}`}:{},a=new nx.OTLPTraceExporter({url:`${o.endpoint}/v1/traces`,headers:c});on=new ua.BasicTracerProvider({resource:i,spanProcessors:[new ua.BatchSpanProcessor(a,{scheduledDelayMillis:5e3,maxQueueSize:2048,maxExportBatchSize:512})]}),on.register(),r.debug(`[manifest] Trace exporter -> ${o.endpoint}/v1/traces`);let u=new ox.OTLPMetricExporter({url:`${o.endpoint}/v1/metrics`,headers:c}),t=o.devMode||o.mode==="local"?$c.METRICS_INTERVAL_MS:mr.METRICS_INTERVAL_MS;return an=new sa.MeterProvider({resource:i,readers:[new sa.PeriodicExportingMetricReader({exporter:u,exportIntervalMillis:t})]}),xt.setGlobalMeterProvider(an),r.debug(`[manifest] Metrics exporter -> ${o.endpoint}/v1/metrics (interval=${t}ms)`),Hc=Ye.getTracer("manifest-plugin","5.24.2"),kc=xt.getMeter("manifest-plugin","5.24.2"),{tracer:Hc,meter:kc}}async function la(o){o.info("[manifest] Shutting down telemetry..."),on&&(await on.shutdown(),on=null),an&&(await an.shutdown(),an=null),Hc=null,kc=null,o.info("[manifest] Telemetry shut down")}O();var Z5=5,ux=30*60*1e3,e7=3e3,t7=5*60*1e3,r7=new Set(["system","developer"]),n7=10,un=new Map,ax=!1;function o7(){if(ax)return;ax=!0;let o=setInterval(()=>{let r=Date.now();for(let[i,c]of un)r-c.lastUpdated>ux&&un.delete(i)},t7);typeof o=="object"&&"unref"in o&&o.unref()}async function sx(o,r,i,c){o7();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(L=>L&&typeof L=="object"&&"role"in L&&!r7.has(L.role)).slice(-n7).map(L=>({role:L.role,content:L.content}));if(t.length===0)return c.debug("[manifest] Routing resolve: no scorable messages, skipping"),null;let e=un.get(i),n=e&&Date.now()-e.lastUpdated<ux?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(e7)});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 M=un.get(i);return M?(M.tiers=[A.tier,...M.tiers].slice(0,Z5),M.lastUpdated=Date.now()):un.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 pa(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 fr=new Map,cx,lx,px,_x,i7,Ex,Tx,Sx,fx;function Ea(o){cx=o.createCounter(he.LLM_REQUESTS,{description:"Total LLM inference requests"}),lx=o.createCounter(he.LLM_TOKENS_INPUT,{description:"Total input tokens sent to LLM"}),px=o.createCounter(he.LLM_TOKENS_OUTPUT,{description:"Total output tokens from LLM"}),_x=o.createCounter(he.LLM_TOKENS_CACHE_READ,{description:"Total cache-read tokens"}),i7=o.createHistogram(he.LLM_DURATION,{description:"LLM request duration in ms",unit:"ms"}),Ex=o.createCounter(he.TOOL_CALLS,{description:"Total tool invocations"}),Tx=o.createCounter(he.TOOL_ERRORS,{description:"Total tool errors"}),Sx=o.createHistogram(he.TOOL_DURATION,{description:"Tool execution duration in ms",unit:"ms"}),fx=o.createCounter(he.MESSAGES_RECEIVED,{description:"Total messages received from users"})}function _a(o,r,i){typeof o.on=="function"?o.on(r,i):typeof o.registerHook=="function"&&o.registerHook(r,i)}function Ta(o,r,i,c){_a(o,"message_received",a=>{let u=a.sessionKey||a.session?.key||`agent:${a.agent||"main"}:main`,t=a.channel||"unknown",e=r.startSpan(pn.REQUEST,{kind:He.SERVER,attributes:{[U.SESSION_KEY]:u,[U.CHANNEL]:t}});fr.set(u,{root:e}),fx.add(1,{[U.CHANNEL]:t}),c.debug(`[manifest] Root span started for session=${u}`)}),_a(o,"before_agent_start",a=>{let u=a.sessionKey||a.session?.key||`agent:${a.agent||"main"}:main`,t=a.agent||"main",e=fr.get(u),n=e?.root?Ye.setSpan(ke.active(),e.root):ke.active(),s=r.startSpan(pn.AGENT_TURN,{kind:He.INTERNAL,attributes:{[U.AGENT_NAME]:t,[U.SESSION_KEY]:u}},n);e?e.turn=s:fr.set(u,{root:s,turn:s}),c.debug(`[manifest] Agent turn started: agent=${t}, session=${u}`)}),_a(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=fr.get(n),l=s?.turn?Ye.setSpan(ke.active(),s.turn):ke.active(),E=r.startSpan(`${pn.TOOL_PREFIX}${u}`,{kind:He.INTERNAL,attributes:{[U.TOOL_NAME]:u,[U.TOOL_SUCCESS]:String(e),[U.SESSION_KEY]:n}},l);e||(E.setStatus({code:it.ERROR,message:a.error?.message||"Tool execution failed"}),Tx.add(1,{[U.TOOL_NAME]:u})),E.end(),Ex.add(1,{[U.TOOL_NAME]:u}),Sx.record(t,{[U.TOOL_NAME]:u})}),_a(o,"agent_end",async a=>{let u=a.sessionKey||a.session?.key||`agent:${a.agent||"main"}:main`,t=a.messages||[],e=[...t].reverse().find(Y=>Y.role==="assistant"&&Y.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,M=l.prompt_tokens_details||{},L=l.cacheRead||l.cacheReadTokens||l.cache_read_tokens||M.cached_tokens||0,dr=l.cacheWrite||l.cacheWriteTokens||l.cache_creation_tokens||0,Ce=n,Ar=s,tt=null,Rt=null;if(Ce==="auto"){let Y=await sx(i,t,u,c);Y&&(Ce=Y.model,Ar=Y.provider,tt=Y.tier,Rt=Y.reason||null)}let Pt=[...t].reverse().find(Y=>Y?.role==="user");(Pt?typeof Pt.content=="string"?Pt.content.includes("HEARTBEAT_OK"):Array.isArray(Pt.content)?Pt.content.some(Y=>Y.type==="text"&&typeof Y.text=="string"&&Y.text.includes("HEARTBEAT_OK")):!1:!1)&&(Rt="heartbeat",tt="simple");let me=fr.get(u);if(me?.turn){if(me.turn.setAttributes({[U.MODEL]:Ce,[U.PROVIDER]:Ar,[U.INPUT_TOKENS]:E,[U.OUTPUT_TOKENS]:A,[U.CACHE_READ_TOKENS]:L,[U.CACHE_WRITE_TOKENS]:dr}),tt&&me.turn.setAttribute(U.ROUTING_TIER,tt),Rt&&me.turn.setAttribute(U.ROUTING_REASON,Rt),a.success===!1||a.error!=null){let Y=a.error?.message||a.errorMessage||"Agent turn failed";me.turn.setStatus({code:it.ERROR,message:typeof Y=="string"?Y.slice(0,500):String(Y)})}me.turn.end()}me?.root&&me.root!==me.turn&&me.root.end(),fr.delete(u);let cn={[U.MODEL]:Ce,[U.PROVIDER]:Ar};cx.add(1,cn),lx.add(E,cn),px.add(A,cn),L>0&&_x.add(L,cn),c.debug(`[manifest] agent_end tokens: in=${E}, out=${A}, cache=${L}`),c.debug(`[manifest] Trace completed for session=${u}`)}),c.debug("[manifest] All hooks registered")}async function Nt(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 Sa={today:"24h",week:"7d",month:"30d"};async function fa(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 dx(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 da(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=Sa[a.period||"today"]||"24h";return dx(await fa(c,`/api/v1/agent/usage?range=${u}`,r.apiKey,i))},async execute(a,u){let t=Sa[u.period||"today"]||"24h";return fa(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=Sa[a.period||"week"]||"7d";return dx(await fa(c,`/api/v1/agent/costs?range=${u}`,r.apiKey,i))},async execute(a,u){let t=Sa[u.period||"week"]||"7d";return fa(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 Nt(r);return a.error?{error:a.error}:{result:{endpointReachable:a.endpointReachable,authValid:a.authValid,agentName:a.agentName,status:"ok"}}},async execute(){let a=await Nt(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 Aa(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 Nt(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
+ or export MANIFEST_API_KEY=${Ne}YOUR_KEY`}var ua=Oe(gM()),sa=Oe(Oi()),nx=Oe(zI()),ox=Oe(rx()),ix=Oe(yo());O();var on=null,an=null,Hc=null,kc=null;function ca(o,r){let i=new ix.Resource({"service.name":mr.SERVICE_NAME,"service.version":"5.25.0","manifest.plugin":"true"}),c=o.apiKey?{Authorization:`Bearer ${o.apiKey}`}:{},a=new nx.OTLPTraceExporter({url:`${o.endpoint}/v1/traces`,headers:c});on=new ua.BasicTracerProvider({resource:i,spanProcessors:[new ua.BatchSpanProcessor(a,{scheduledDelayMillis:5e3,maxQueueSize:2048,maxExportBatchSize:512})]}),on.register(),r.debug(`[manifest] Trace exporter -> ${o.endpoint}/v1/traces`);let u=new ox.OTLPMetricExporter({url:`${o.endpoint}/v1/metrics`,headers:c}),t=o.devMode||o.mode==="local"?$c.METRICS_INTERVAL_MS:mr.METRICS_INTERVAL_MS;return an=new sa.MeterProvider({resource:i,readers:[new sa.PeriodicExportingMetricReader({exporter:u,exportIntervalMillis:t})]}),xt.setGlobalMeterProvider(an),r.debug(`[manifest] Metrics exporter -> ${o.endpoint}/v1/metrics (interval=${t}ms)`),Hc=Ye.getTracer("manifest-plugin","5.25.0"),kc=xt.getMeter("manifest-plugin","5.25.0"),{tracer:Hc,meter:kc}}async function la(o){o.info("[manifest] Shutting down telemetry..."),on&&(await on.shutdown(),on=null),an&&(await an.shutdown(),an=null),Hc=null,kc=null,o.info("[manifest] Telemetry shut down")}O();var Z5=5,ux=30*60*1e3,e7=3e3,t7=5*60*1e3,r7=new Set(["system","developer"]),n7=10,un=new Map,ax=!1;function o7(){if(ax)return;ax=!0;let o=setInterval(()=>{let r=Date.now();for(let[i,c]of un)r-c.lastUpdated>ux&&un.delete(i)},t7);typeof o=="object"&&"unref"in o&&o.unref()}async function sx(o,r,i,c){o7();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(L=>L&&typeof L=="object"&&"role"in L&&!r7.has(L.role)).slice(-n7).map(L=>({role:L.role,content:L.content}));if(t.length===0)return c.debug("[manifest] Routing resolve: no scorable messages, skipping"),null;let e=un.get(i),n=e&&Date.now()-e.lastUpdated<ux?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(e7)});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 M=un.get(i);return M?(M.tiers=[A.tier,...M.tiers].slice(0,Z5),M.lastUpdated=Date.now()):un.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 pa(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 fr=new Map,cx,lx,px,_x,i7,Ex,Tx,Sx,fx;function Ea(o){cx=o.createCounter(he.LLM_REQUESTS,{description:"Total LLM inference requests"}),lx=o.createCounter(he.LLM_TOKENS_INPUT,{description:"Total input tokens sent to LLM"}),px=o.createCounter(he.LLM_TOKENS_OUTPUT,{description:"Total output tokens from LLM"}),_x=o.createCounter(he.LLM_TOKENS_CACHE_READ,{description:"Total cache-read tokens"}),i7=o.createHistogram(he.LLM_DURATION,{description:"LLM request duration in ms",unit:"ms"}),Ex=o.createCounter(he.TOOL_CALLS,{description:"Total tool invocations"}),Tx=o.createCounter(he.TOOL_ERRORS,{description:"Total tool errors"}),Sx=o.createHistogram(he.TOOL_DURATION,{description:"Tool execution duration in ms",unit:"ms"}),fx=o.createCounter(he.MESSAGES_RECEIVED,{description:"Total messages received from users"})}function _a(o,r,i){typeof o.on=="function"?o.on(r,i):typeof o.registerHook=="function"&&o.registerHook(r,i)}function Ta(o,r,i,c){_a(o,"message_received",a=>{let u=a.sessionKey||a.session?.key||`agent:${a.agent||"main"}:main`,t=a.channel||"unknown",e=r.startSpan(pn.REQUEST,{kind:He.SERVER,attributes:{[U.SESSION_KEY]:u,[U.CHANNEL]:t}});fr.set(u,{root:e}),fx.add(1,{[U.CHANNEL]:t}),c.debug(`[manifest] Root span started for session=${u}`)}),_a(o,"before_agent_start",a=>{let u=a.sessionKey||a.session?.key||`agent:${a.agent||"main"}:main`,t=a.agent||"main",e=fr.get(u),n=e?.root?Ye.setSpan(ke.active(),e.root):ke.active(),s=r.startSpan(pn.AGENT_TURN,{kind:He.INTERNAL,attributes:{[U.AGENT_NAME]:t,[U.SESSION_KEY]:u}},n);e?e.turn=s:fr.set(u,{root:s,turn:s}),c.debug(`[manifest] Agent turn started: agent=${t}, session=${u}`)}),_a(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=fr.get(n),l=s?.turn?Ye.setSpan(ke.active(),s.turn):ke.active(),E=r.startSpan(`${pn.TOOL_PREFIX}${u}`,{kind:He.INTERNAL,attributes:{[U.TOOL_NAME]:u,[U.TOOL_SUCCESS]:String(e),[U.SESSION_KEY]:n}},l);e||(E.setStatus({code:it.ERROR,message:a.error?.message||"Tool execution failed"}),Tx.add(1,{[U.TOOL_NAME]:u})),E.end(),Ex.add(1,{[U.TOOL_NAME]:u}),Sx.record(t,{[U.TOOL_NAME]:u})}),_a(o,"agent_end",async a=>{let u=a.sessionKey||a.session?.key||`agent:${a.agent||"main"}:main`,t=a.messages||[],e=[...t].reverse().find(Y=>Y.role==="assistant"&&Y.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,M=l.prompt_tokens_details||{},L=l.cacheRead||l.cacheReadTokens||l.cache_read_tokens||M.cached_tokens||0,dr=l.cacheWrite||l.cacheWriteTokens||l.cache_creation_tokens||0,Ce=n,Ar=s,tt=null,Rt=null;if(Ce==="auto"){let Y=await sx(i,t,u,c);Y&&(Ce=Y.model,Ar=Y.provider,tt=Y.tier,Rt=Y.reason||null)}let Pt=[...t].reverse().find(Y=>Y?.role==="user");(Pt?typeof Pt.content=="string"?Pt.content.includes("HEARTBEAT_OK"):Array.isArray(Pt.content)?Pt.content.some(Y=>Y.type==="text"&&typeof Y.text=="string"&&Y.text.includes("HEARTBEAT_OK")):!1:!1)&&(Rt="heartbeat",tt="simple");let me=fr.get(u);if(me?.turn){if(me.turn.setAttributes({[U.MODEL]:Ce,[U.PROVIDER]:Ar,[U.INPUT_TOKENS]:E,[U.OUTPUT_TOKENS]:A,[U.CACHE_READ_TOKENS]:L,[U.CACHE_WRITE_TOKENS]:dr}),tt&&me.turn.setAttribute(U.ROUTING_TIER,tt),Rt&&me.turn.setAttribute(U.ROUTING_REASON,Rt),a.success===!1||a.error!=null){let Y=a.error?.message||a.errorMessage||"Agent turn failed";me.turn.setStatus({code:it.ERROR,message:typeof Y=="string"?Y.slice(0,500):String(Y)})}me.turn.end()}me?.root&&me.root!==me.turn&&me.root.end(),fr.delete(u);let cn={[U.MODEL]:Ce,[U.PROVIDER]:Ar};cx.add(1,cn),lx.add(E,cn),px.add(A,cn),L>0&&_x.add(L,cn),c.debug(`[manifest] agent_end tokens: in=${E}, out=${A}, cache=${L}`),c.debug(`[manifest] Trace completed for session=${u}`)}),c.debug("[manifest] All hooks registered")}async function Nt(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 Sa={today:"24h",week:"7d",month:"30d"};async function fa(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 dx(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 da(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=Sa[a.period||"today"]||"24h";return dx(await fa(c,`/api/v1/agent/usage?range=${u}`,r.apiKey,i))},async execute(a,u){let t=Sa[u.period||"today"]||"24h";return fa(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=Sa[a.period||"week"]||"7d";return dx(await fa(c,`/api/v1/agent/costs?range=${u}`,r.apiKey,i))},async execute(a,u){let t=Sa[u.period||"week"]||"7d";return fa(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 Nt(r);return a.error?{error:a.error}:{result:{endpointReachable:a.endpointReachable,authValid:a.authValid,agentName:a.agentName,status:"ok"}}},async execute(){let a=await Nt(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 Aa(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 Nt(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(`
21
21
  `)}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 x=require("fs"),ce=require("path"),Kc=require("os"),mx=require("crypto");var va=(0,ce.join)((0,Kc.homedir)(),".openclaw","manifest"),sn=(0,ce.join)(va,"config.json"),jc=(0,ce.join)((0,Kc.homedir)(),".openclaw"),Ax=(0,ce.join)(jc,"openclaw.json"),a7=3e3;function u7(){(0,x.existsSync)(va)||(0,x.mkdirSync)(va,{recursive:!0,mode:448})}function s7(){if(u7(),(0,x.existsSync)(sn))try{let i=JSON.parse((0,x.readFileSync)(sn,"utf-8"));if(i.apiKey&&i.apiKey.startsWith(Ne))return i.apiKey}catch{}let o=`${Ne}local_${(0,mx.randomBytes)(24).toString("hex")}`,r={};if((0,x.existsSync)(sn))try{r=JSON.parse((0,x.readFileSync)(sn,"utf-8"))}catch{}return(0,x.writeFileSync)(sn,JSON.stringify({...r,apiKey:o},null,2),{mode:384}),o}function Yc(o){if(!(0,x.existsSync)(o))return{};try{return JSON.parse((0,x.readFileSync)(o,"utf-8"))}catch{return{}}}function Fc(o,r){let i=(0,ce.dirname)(o);(0,x.existsSync)(i)||(0,x.mkdirSync)(i,{recursive:!0,mode:448});let c=`${o}.tmp.${process.pid}`;(0,x.writeFileSync)(c,JSON.stringify(r,null,2),{mode:384}),(0,x.renameSync)(c,o)}function qc(o,r,i,c){let a={baseUrl:r,api:"openai-completions",apiKey:i,models:[{id:"auto",name:"auto"}]};try{let u=Yc(Ax);u.models||(u.models={}),u.models.providers||(u.models.providers={}),u.models.providers.manifest=a,u.agents||(u.agents={}),u.agents.defaults||(u.agents.defaults={}),u.agents.defaults.models||(u.agents.defaults.models={});let t=u.agents.defaults.models;Array.isArray(t)?t.includes("manifest/auto")||t.push("manifest/auto"):typeof t=="object"&&("manifest/auto"in t||(t["manifest/auto"]={})),Fc(Ax,u),c.debug("[manifest] Wrote provider config to openclaw.json")}catch(u){let t=u instanceof Error?u.message:String(u);c.debug(`[manifest] Could not write openclaw.json: ${t}`)}try{let u=(0,ce.join)(jc,"agents");if((0,x.existsSync)(u)){let t=(0,x.readdirSync)(u,{withFileTypes:!0}).filter(e=>e.isDirectory());for(let e of t){let n=(0,ce.join)(u,e.name,"agent","models.json");if(!(0,x.existsSync)(n))continue;let s=Yc(n);s.providers?.manifest&&(delete s.providers.manifest,Fc(n,s),c.debug(`[manifest] Removed stale manifest entry from models.json for agent ${e.name}`))}}}catch(u){let t=u instanceof Error?u.message:String(u);c.debug(`[manifest] Could not clean agent models.json: ${t}`)}try{if(o.config){o.config.models||(o.config.models={}),o.config.models.providers||(o.config.models.providers={}),o.config.models.providers.manifest=a,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 u=o.config.agents.defaults.models;Array.isArray(u)?u.includes("manifest/auto")||u.push("manifest/auto"):typeof u=="object"&&("manifest/auto"in u||(u["manifest/auto"]={}))}c.debug("[manifest] Injected provider into runtime config")}catch(u){let t=u instanceof Error?u.message:String(u);c.debug(`[manifest] Could not inject runtime config: ${t}`)}}function Wc(o,r){let i=(0,ce.join)(jc,"agents");if(!(0,x.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,x.readdirSync)(i,{withFileTypes:!0}).filter(t=>t.isDirectory());for(let t of u){let e=(0,ce.join)(i,t.name,"agent","auth-profiles.json"),n=(0,ce.dirname)(e);if(!(0,x.existsSync)(n))continue;let s=Yc(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,Fc(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 vx(o,r){try{return(await fetch(`http://${o}:${r}/api/v1/health`,{signal:AbortSignal.timeout(a7)})).ok}catch{return!1}}function Ox(o,r,i){let c=r.port,a=r.host,u=s7(),t=(0,ce.join)(va,"manifest.db");i.debug("[manifest] Local mode \u2014 starting embedded server..."),qc(o,`http://${a}:${c}/v1`,u,i),Wc(u,i);let e;try{e=require("./server")}catch(A){let M=A instanceof Error?A.message:String(A);i.error(`[manifest] Failed to load embedded server.
22
22
  Error: ${M}
23
23
  This is a packaging error \u2014 please reinstall the manifest plugin.`);return}let n=`http://${a}:${c}/otlp`,s={...r,apiKey:u,endpoint:n},{tracer:l,meter:E}=ca(s,i);Ea(E),Ta(o,l,s,i),pa(o,s,i),typeof o.registerTool=="function"&&da(o,s,i),Aa(o,s,i),i.info(`[manifest] \u{1F99A} View your Manifest Dashboard -> http://${a}:${c}`),o.registerService({id:"manifest-local",start:async()=>{if(await vx(a,c)){i.info(`[manifest] Reusing existing server at http://${a}:${c}`);return}try{await e.start({port:c,host:a,dbPath:t,quiet:!0}),i.info(`[manifest] Local server running on http://${a}:${c}`),i.info(`[manifest] Dashboard: http://${a}:${c}`),i.info(`[manifest] DB: ${t}`)}catch(M){let L=M instanceof Error?M.message:String(M);L.includes("EADDRINUSE")||L.includes("address already in use")?await vx(a,c)?i.info(`[manifest] Reusing existing server at http://${a}:${c}`):i.error(`[manifest] Port ${c} is already in use by another process.
24
24
  Change it with: openclaw config set plugins.entries.manifest.config.port ${c+1}
25
25
  Then restart the gateway.`):i.error(`[manifest] Failed to start local server: ${L}
26
26
  Try reinstalling: openclaw plugins install manifest
27
- Then restart: openclaw gateway restart`)}},stop:async()=>{await la(i)}})}var hx=require("crypto"),we=require("os");function Jc(){return{optedOut:__fromEnv.MANIFEST_TELEMETRY_OPTOUT==="1"||__fromEnv.MANIFEST_TELEMETRY_OPTOUT==="true",packageVersion:"5.24.2"}}var Nx="https://eu.i.posthog.com",yx="phc_g5pLOu5bBRjhVJBwAsx0eCzJFWq0cri2TyVLQLxf045";function Rx(){let o=`${(0,we.hostname)()}-${(0,we.platform)()}-${(0,we.arch)()}`;return(0,hx.createHash)("sha256").update(o).digest("hex").slice(0,16)}function Px(o){if(Jc().optedOut)return;let i={api_key:yx,event:"$identify",properties:{distinct_id:o,$anon_distinct_id:Rx()},timestamp:new Date().toISOString()};fetch(`${Nx}/capture`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)}).catch(()=>{})}function zc(o,r,i){let c=Jc();if(c.optedOut)return;let a={api_key:yx,event:o,properties:{distinct_id:Rx(),os:(0,we.platform)(),os_version:(0,we.release)(),node_version:process.versions.node,package_version:c.packageVersion,mode:i??__fromEnv.MANIFEST_MODE??"cloud",...r},timestamp:new Date().toISOString()};fetch(`${Nx}/capture`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)}).catch(()=>{})}var yt=require("fs"),ma=require("path"),Mx=require("os"),c7=(0,ma.join)((0,Mx.homedir)(),".openclaw"),l7={anthropic:"anthropic","openai-codex":"openai",openai:"openai","google-gemini":"gemini","google-antigravity":"gemini",google:"gemini",gemini:"gemini","github-copilot":"openai",qwen:"qwen","qwen-portal":"qwen",moonshot:"moonshot",kimi:"moonshot",minimax:"minimax"};function p7(o){if(!(0,yt.existsSync)(o))return{};try{return JSON.parse((0,yt.readFileSync)(o,"utf-8"))}catch{return{}}}function gx(o){let r=(0,ma.join)(c7,"agents");if(!(0,yt.existsSync)(r))return o.debug("[manifest] No agents directory, no subscription providers"),[];let i=new Map;try{let a=(0,yt.readdirSync)(r,{withFileTypes:!0}).filter(u=>u.isDirectory());for(let u of a){let t=(0,ma.join)(r,u.name,"agent","auth-profiles.json"),e=p7(t);if(!(!e.profiles||typeof e.profiles!="object"))for(let n of Object.values(e.profiles)){let s=n;if(s.type==="api_key"||s.provider==="manifest")continue;let l=l7[s.provider?.toLowerCase()??""];if(!l){o.debug(`[manifest] Unknown subscription provider: ${s.provider}`);continue}i.has(l)||i.set(l,{openclawId:s.provider,manifestId:l,authType:s.type})}}}catch(a){let u=a instanceof Error?a.message:String(a);o.debug(`[manifest] Error scanning auth profiles: ${u}`)}let c=Array.from(i.values());return c.length>0&&o.info(`[manifest] Detected ${c.length} subscription provider(s): ${c.map(a=>a.manifestId).join(", ")}`),c}async function Lx(o,r,i,c){if(o.length===0)return;let u=`${r.replace(/\/otlp(\/v1)?\/?$/,"")}/api/v1/routing/subscription-providers`;try{let t={"Content-Type":"application/json"};i&&(t.Authorization=`Bearer ${i}`);let e=await fetch(u,{method:"POST",headers:t,body:JSON.stringify({providers:o.map(n=>({provider:n.manifestId}))}),signal:AbortSignal.timeout(5e3)});if(e.ok){let n=await e.json();c.info(`[manifest] Registered ${n.registered} subscription provider(s)`)}else c.debug(`[manifest] Failed to register subscription providers: ${e.status}`)}catch(t){let e=t instanceof Error?t.message:String(t);c.debug(`[manifest] Error registering subscription providers: ${e}`)}}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}=Qc(o.pluginConfig);if(c&&r.warn?.(`[manifest] mode: "dev" is deprecated. Use mode: "cloud" with devMode: true instead.
27
+ Then restart: openclaw gateway restart`)}},stop:async()=>{await la(i)}})}var hx=require("crypto"),we=require("os");function Jc(){return{optedOut:__fromEnv.MANIFEST_TELEMETRY_OPTOUT==="1"||__fromEnv.MANIFEST_TELEMETRY_OPTOUT==="true",packageVersion:"5.25.0"}}var Nx="https://eu.i.posthog.com",yx="phc_g5pLOu5bBRjhVJBwAsx0eCzJFWq0cri2TyVLQLxf045";function Rx(){let o=`${(0,we.hostname)()}-${(0,we.platform)()}-${(0,we.arch)()}`;return(0,hx.createHash)("sha256").update(o).digest("hex").slice(0,16)}function Px(o){if(Jc().optedOut)return;let i={api_key:yx,event:"$identify",properties:{distinct_id:o,$anon_distinct_id:Rx()},timestamp:new Date().toISOString()};fetch(`${Nx}/capture`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)}).catch(()=>{})}function zc(o,r,i){let c=Jc();if(c.optedOut)return;let a={api_key:yx,event:o,properties:{distinct_id:Rx(),os:(0,we.platform)(),os_version:(0,we.release)(),node_version:process.versions.node,package_version:c.packageVersion,mode:i??__fromEnv.MANIFEST_MODE??"cloud",...r},timestamp:new Date().toISOString()};fetch(`${Nx}/capture`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)}).catch(()=>{})}var yt=require("fs"),ma=require("path"),Mx=require("os"),c7=(0,ma.join)((0,Mx.homedir)(),".openclaw"),l7={anthropic:"anthropic","openai-codex":"openai",openai:"openai","google-gemini":"gemini","google-antigravity":"gemini",google:"gemini",gemini:"gemini","github-copilot":"openai",qwen:"qwen","qwen-portal":"qwen",moonshot:"moonshot",kimi:"moonshot",minimax:"minimax"};function p7(o){if(!(0,yt.existsSync)(o))return{};try{return JSON.parse((0,yt.readFileSync)(o,"utf-8"))}catch{return{}}}function gx(o){let r=(0,ma.join)(c7,"agents");if(!(0,yt.existsSync)(r))return o.debug("[manifest] No agents directory, no subscription providers"),[];let i=new Map;try{let a=(0,yt.readdirSync)(r,{withFileTypes:!0}).filter(u=>u.isDirectory());for(let u of a){let t=(0,ma.join)(r,u.name,"agent","auth-profiles.json"),e=p7(t);if(!(!e.profiles||typeof e.profiles!="object"))for(let n of Object.values(e.profiles)){let s=n;if(s.type==="api_key"||s.provider==="manifest")continue;let l=l7[s.provider?.toLowerCase()??""];if(!l){o.debug(`[manifest] Unknown subscription provider: ${s.provider}`);continue}i.has(l)||i.set(l,{openclawId:s.provider,manifestId:l,authType:s.type})}}}catch(a){let u=a instanceof Error?a.message:String(a);o.debug(`[manifest] Error scanning auth profiles: ${u}`)}let c=Array.from(i.values());return c.length>0&&o.info(`[manifest] Detected ${c.length} subscription provider(s): ${c.map(a=>a.manifestId).join(", ")}`),c}async function Lx(o,r,i,c){if(o.length===0)return;let u=`${r.replace(/\/otlp(\/v1)?\/?$/,"")}/api/v1/routing/subscription-providers`;try{let t={"Content-Type":"application/json"};i&&(t.Authorization=`Bearer ${i}`);let e=await fetch(u,{method:"POST",headers:t,body:JSON.stringify({providers:o.map(n=>({provider:n.manifestId}))}),signal:AbortSignal.timeout(5e3)});if(e.ok){let n=await e.json();c.info(`[manifest] Registered ${n.registered} subscription provider(s)`)}else c.debug(`[manifest] Failed to register subscription providers: ${e.status}`)}catch(t){let e=t instanceof Error?t.message:String(t);c.debug(`[manifest] Error registering subscription providers: ${e}`)}}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}=Qc(o.pluginConfig);if(c&&r.warn?.(`[manifest] mode: "dev" is deprecated. Use mode: "cloud" with devMode: true instead.
28
28
  openclaw config set plugins.entries.manifest.config.mode cloud
29
29
  openclaw config set plugins.entries.manifest.config.devMode true`),i.devMode||(zc("plugin_registered",void 0,i.mode),zc("plugin_mode_selected",{mode:i.mode},i.mode)),i.mode==="local"){Ox(o,i,r);return}let a=Zc(i);if(a){!i.devMode&&i.mode==="cloud"&&!i.apiKey?r.info(`[manifest] Cloud mode requires an API key:
30
30
  openclaw config set plugins.entries.manifest.config.apiKey mnfst_YOUR_KEY
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "manifest",
3
- "version": "5.24.2",
3
+ "version": "5.25.0",
4
4
  "description": "LLM router and observability plugin for OpenClaw — smart model routing, real-time cost tracking, and telemetry for your AI agents",
5
5
  "main": "dist/index.js",
6
6
  "license": "MIT",
@@ -1 +1 @@
1
- import{b as V,a as b,e as H,i as c,g as d,T as R,M as W,h,m as Z,S as M,t as l,d as F}from"./vendor-COodrVsO.js";import{I as G,T as J,U as K,i as L,V as E}from"./index-DKNLgS0h.js";import"./auth-yjhjkKyr.js";var O=l("<h3 class=settings-section__title>Profile information"),Q=l('<div class=settings-card><div class=settings-card__row><div class=settings-card__label><span class=settings-card__label-title>Display name</span><span class=settings-card__label-desc>Name shown throughout the dashboard.</span></div><div class=settings-card__control><input class=settings-card__input type=text aria-label="Display name"readonly></div></div><div class=settings-card__row><div class=settings-card__label><span class=settings-card__label-title>Email</span><span class=settings-card__label-desc>Used for account notifications and limit alerts.</span></div><div class=settings-card__control><input class=settings-card__input type=email aria-label=Email readonly></div></div><div class=settings-card__footer><span style=font-size:var(--font-size-xs);color:hsl(var(--muted-foreground))>Profile information is managed through your authentication provider.'),X=l("<h3 class=settings-section__title>Workspace"),ee=l("<div class=settings-card><div class=settings-card__body><p class=settings-card__desc>Your unique workspace identifier. You may need this for support requests or advanced integrations.</p><div class=settings-card__id-row><code class=settings-card__id-value></code><button class=settings-card__copy-btn title=Copy>"),te=l("<h3 class=settings-section__title>Profile"),se=l('<div class=settings-card><div class=settings-card__row><div class=settings-card__label><span class=settings-card__label-title>Display name</span><span class=settings-card__label-desc>Name shown throughout the dashboard.</span></div><div class=settings-card__control><input class=settings-card__input type=text aria-label="Display name"placeholder="Local User">'),ie=l('<div class=account-modal><div class=account-modal__inner><button class=account-modal__back><svg width=16 height=16 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round><path d="m15 18-6-6 6-6"></path></svg>Back</button><div class=page-header><div><h1>Account Preferences</h1><span class=breadcrumb>Your profile, workspace details, and display preferences</span></div></div><h3 class=settings-section__title>Appearance</h3><div class=settings-card><div class=settings-card__body><p class=settings-card__desc>Choose how Manifest looks for you.</p><div class=theme-picker><button class=theme-picker__option><svg width=18 height=18 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round><circle cx=12 cy=12 r=4></circle><path d="M12 2v2"></path><path d="M12 20v2"></path><path d="m4.93 4.93 1.41 1.41"></path><path d="m17.66 17.66 1.41 1.41"></path><path d="M2 12h2"></path><path d="M20 12h2"></path><path d="m6.34 17.66-1.41 1.41"></path><path d="m19.07 4.93-1.41 1.41"></path></svg>Light</button><button class=theme-picker__option><svg width=18 height=18 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round><path d="M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z"></path></svg>Dark</button><button class=theme-picker__option><svg width=18 height=18 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round><rect x=2 y=3 width=20 height=14 rx=2></rect><path d="M8 21h8"></path><path d="M12 17v4"></path></svg>System'),ae=l('<svg width=14 height=14 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round><polyline points="20 6 9 17 4 12">'),le=l('<svg width=14 height=14 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round><rect x=9 y=9 width=13 height=13 rx=2></rect><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">');const ce=()=>{const T=V(),p=G.useSession(),[N,w]=b(!1),[_,g]=b("system"),[u,y]=b(""),B=()=>p()?.data?.user?.name??"",D=()=>p()?.data?.user?.email??"",x=()=>p()?.data?.user?.id??"";H(()=>{J(),y(K()||"Local User");const t=localStorage.getItem("theme");g(t==="dark"||t==="light"?t:"system")});const m=t=>{if(g(t),t==="system"){localStorage.removeItem("theme");const o=window.matchMedia("(prefers-color-scheme: dark)").matches;document.documentElement.classList.toggle("dark",o)}else localStorage.setItem("theme",t),document.documentElement.classList.toggle("dark",t==="dark")},j=()=>{navigator.clipboard.writeText(x()),w(!0),setTimeout(()=>w(!1),2e3)};return(()=>{var t=ie(),o=t.firstChild,C=o.firstChild,I=C.nextSibling,v=I.nextSibling,P=v.nextSibling,A=P.firstChild,U=A.firstChild,Y=U.nextSibling,k=Y.firstChild,f=k.nextSibling,S=f.nextSibling;return c(t,d(R,{children:"Account Preferences - Manifest"}),o),c(t,d(W,{name:"description",content:"Manage your profile, workspace, and theme preferences."}),o),C.$$click=()=>T(-1),c(o,d(M,{get when(){return!L()},get children(){return[O(),(()=>{var e=Q(),s=e.firstChild,r=s.firstChild,n=r.nextSibling,i=n.firstChild,a=s.nextSibling,$=a.firstChild,q=$.nextSibling,z=q.firstChild;return h(()=>i.value=B()),h(()=>z.value=D()),e})(),X(),(()=>{var e=ee(),s=e.firstChild,r=s.firstChild,n=r.nextSibling,i=n.firstChild,a=i.nextSibling;return c(i,x),a.$$click=j,c(a,(()=>{var $=Z(()=>!!N());return()=>$()?ae():le()})()),e})()]}}),v),c(o,d(M,{get when(){return L()},get children(){return[te(),(()=>{var e=se(),s=e.firstChild,r=s.firstChild,n=r.nextSibling,i=n.firstChild;return i.$$keydown=a=>{a.key==="Enter"&&(E(u()),a.currentTarget.blur())},i.addEventListener("blur",()=>E(u())),i.$$input=a=>y(a.currentTarget.value),h(()=>i.value=u()),e})()]}}),v),k.$$click=()=>m("light"),f.$$click=()=>m("dark"),S.$$click=()=>m("system"),h(e=>{var s=_()==="light",r=_()==="dark",n=_()==="system";return s!==e.e&&k.classList.toggle("theme-picker__option--active",e.e=s),r!==e.t&&f.classList.toggle("theme-picker__option--active",e.t=r),n!==e.a&&S.classList.toggle("theme-picker__option--active",e.a=n),e},{e:void 0,t:void 0,a:void 0}),t})()};F(["click","input","keydown"]);export{ce as default};
1
+ import{b as V,a as b,e as W,i as c,g as d,T as H,M as J,h,m as R,S as M,t as l,d as Z}from"./vendor-K8fEFSq9.js";import{J as F,U as G,V as K,i as L,W as E}from"./index-DrLOx3nR.js";import"./auth-C2bQ9WcQ.js";var O=l("<h3 class=settings-section__title>Profile information"),Q=l('<div class=settings-card><div class=settings-card__row><div class=settings-card__label><span class=settings-card__label-title>Display name</span><span class=settings-card__label-desc>Name shown throughout the dashboard.</span></div><div class=settings-card__control><input class=settings-card__input type=text aria-label="Display name"readonly></div></div><div class=settings-card__row><div class=settings-card__label><span class=settings-card__label-title>Email</span><span class=settings-card__label-desc>Used for account notifications and limit alerts.</span></div><div class=settings-card__control><input class=settings-card__input type=email aria-label=Email readonly></div></div><div class=settings-card__footer><span style=font-size:var(--font-size-xs);color:hsl(var(--muted-foreground))>Profile information is managed through your authentication provider.'),X=l("<h3 class=settings-section__title>Workspace"),ee=l("<div class=settings-card><div class=settings-card__body><p class=settings-card__desc>Your unique workspace identifier. You may need this for support requests or advanced integrations.</p><div class=settings-card__id-row><code class=settings-card__id-value></code><button class=settings-card__copy-btn title=Copy>"),te=l("<h3 class=settings-section__title>Profile"),se=l('<div class=settings-card><div class=settings-card__row><div class=settings-card__label><span class=settings-card__label-title>Display name</span><span class=settings-card__label-desc>Name shown throughout the dashboard.</span></div><div class=settings-card__control><input class=settings-card__input type=text aria-label="Display name"placeholder="Local User">'),ie=l('<div class=account-modal><div class=account-modal__inner><button class=account-modal__back><svg width=16 height=16 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round><path d="m15 18-6-6 6-6"></path></svg>Back</button><div class=page-header><div><h1>Account Preferences</h1><span class=breadcrumb>Your profile, workspace details, and display preferences</span></div></div><h3 class=settings-section__title>Appearance</h3><div class=settings-card><div class=settings-card__body><p class=settings-card__desc>Choose how Manifest looks for you.</p><div class=theme-picker><button class=theme-picker__option><svg width=18 height=18 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round><circle cx=12 cy=12 r=4></circle><path d="M12 2v2"></path><path d="M12 20v2"></path><path d="m4.93 4.93 1.41 1.41"></path><path d="m17.66 17.66 1.41 1.41"></path><path d="M2 12h2"></path><path d="M20 12h2"></path><path d="m6.34 17.66-1.41 1.41"></path><path d="m19.07 4.93-1.41 1.41"></path></svg>Light</button><button class=theme-picker__option><svg width=18 height=18 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round><path d="M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z"></path></svg>Dark</button><button class=theme-picker__option><svg width=18 height=18 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round><rect x=2 y=3 width=20 height=14 rx=2></rect><path d="M8 21h8"></path><path d="M12 17v4"></path></svg>System'),ae=l('<svg width=14 height=14 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round><polyline points="20 6 9 17 4 12">'),le=l('<svg width=14 height=14 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round><rect x=9 y=9 width=13 height=13 rx=2></rect><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">');const ce=()=>{const N=V(),p=F.useSession(),[T,w]=b(!1),[_,g]=b("system"),[u,y]=b(""),B=()=>p()?.data?.user?.name??"",D=()=>p()?.data?.user?.email??"",x=()=>p()?.data?.user?.id??"";W(()=>{G(),y(K()||"Local User");const t=localStorage.getItem("theme");g(t==="dark"||t==="light"?t:"system")});const m=t=>{if(g(t),t==="system"){localStorage.removeItem("theme");const o=window.matchMedia("(prefers-color-scheme: dark)").matches;document.documentElement.classList.toggle("dark",o)}else localStorage.setItem("theme",t),document.documentElement.classList.toggle("dark",t==="dark")},j=()=>{navigator.clipboard.writeText(x()),w(!0),setTimeout(()=>w(!1),2e3)};return(()=>{var t=ie(),o=t.firstChild,C=o.firstChild,I=C.nextSibling,v=I.nextSibling,P=v.nextSibling,A=P.firstChild,U=A.firstChild,Y=U.nextSibling,k=Y.firstChild,f=k.nextSibling,S=f.nextSibling;return c(t,d(H,{children:"Account Preferences - Manifest"}),o),c(t,d(J,{name:"description",content:"Manage your profile, workspace, and theme preferences."}),o),C.$$click=()=>N(-1),c(o,d(M,{get when(){return!L()},get children(){return[O(),(()=>{var e=Q(),s=e.firstChild,r=s.firstChild,n=r.nextSibling,i=n.firstChild,a=s.nextSibling,$=a.firstChild,q=$.nextSibling,z=q.firstChild;return h(()=>i.value=B()),h(()=>z.value=D()),e})(),X(),(()=>{var e=ee(),s=e.firstChild,r=s.firstChild,n=r.nextSibling,i=n.firstChild,a=i.nextSibling;return c(i,x),a.$$click=j,c(a,(()=>{var $=R(()=>!!T());return()=>$()?ae():le()})()),e})()]}}),v),c(o,d(M,{get when(){return L()},get children(){return[te(),(()=>{var e=se(),s=e.firstChild,r=s.firstChild,n=r.nextSibling,i=n.firstChild;return i.$$keydown=a=>{a.key==="Enter"&&(E(u()),a.currentTarget.blur())},i.addEventListener("blur",()=>E(u())),i.$$input=a=>y(a.currentTarget.value),h(()=>i.value=u()),e})()]}}),v),k.$$click=()=>m("light"),f.$$click=()=>m("dark"),S.$$click=()=>m("system"),h(e=>{var s=_()==="light",r=_()==="dark",n=_()==="system";return s!==e.e&&k.classList.toggle("theme-picker__option--active",e.e=s),r!==e.t&&f.classList.toggle("theme-picker__option--active",e.t=r),n!==e.a&&S.classList.toggle("theme-picker__option--active",e.a=n),e},{e:void 0,t:void 0,a:void 0}),t})()};Z(["click","input","keydown"]);export{ce as default};
@@ -1 +1 @@
1
- import{P as d}from"./ProviderIcon-DkiiWOHz.js";import{q as v,C as o,i as b,t as u,s as l}from"./vendor-COodrVsO.js";function g(t){return d.find(r=>r.id===t)}function S(t,r){if(t.noKeyRequired)return{valid:!0};const n=r.replace(/\s/g,"");return n?t.keyPrefix&&!n.startsWith(t.keyPrefix)?{valid:!1,error:`${t.name} keys start with "${t.keyPrefix}"`}:t.minKeyLength&&n.length<t.minKeyLength?{valid:!1,error:`Key is too short (minimum ${t.minKeyLength} characters)`}:{valid:!0}:{valid:!1,error:"API key is required"}}const y={anthropic:"sk-ant-oat"};function L(t,r){const n=r.replace(/\s/g,"");if(!n)return{valid:!1,error:"Token is required"};if(n.length<10)return{valid:!1,error:"Token is too short (minimum 10 characters)"};const e=y[t.id];return e&&!n.startsWith(e)?{valid:!1,error:`${t.name} subscription tokens start with "${e}"`}:{valid:!0}}function C(t,r){const n=g(t);if(!n)return r;const e=n.models.find(i=>i.value===r);if(e)return e.label;const h=r.replace(/-\d{8}$/,"");if(h!==r){const i=n.models.find(s=>s.value===h);if(i)return i.label}const p=n.models.find(i=>r.startsWith(i.value+"-"));if(p)return p.label;const m=r.indexOf("/");if(m!==-1){const i=r.substring(m+1);for(const f of d){const a=f.models.find(c=>c.value===i);if(a)return a.label}const s=i.replace(/\./g,"-");if(s!==i)for(const f of d){const a=f.models.find(c=>c.value===s);if(a)return a.label}return i}return r}var $=u('<svg viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=3 stroke-linecap=round stroke-linejoin=round aria-hidden=true><path d="M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2"></path><circle cx=12 cy=7 r=4>'),k=u('<svg viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=3 stroke-linecap=round stroke-linejoin=round aria-hidden=true><path d="m21 2-2 2m-7.61 7.61a5.5 5.5 0 1 1-7.778 7.778 5.5 5.5 0 0 1 7.777-7.777zm0 0L15.5 7.5m0 0 3 3L22 7l-3-3m-3.5 3.5L19 4">'),x=u("<span aria-label=Subscription>"),P=u('<span aria-label="API Key">');const _=t=>(()=>{var r=$();return l(r,"width",t),l(r,"height",t),r})(),w=t=>(()=>{var r=k();return l(r,"width",t),l(r,"height",t),r})();function R(t){return t==="subscription"?"Subscription":"API Key"}function A(t,r){const n=r<=8?" provider-auth-badge--overlay":"";return t==="subscription"?(()=>{var e=x();return v(e,`provider-auth-badge provider-auth-badge--sub${n}`),o(e,"width",`${r}px`),o(e,"height",`${r}px`),b(e,()=>_(r*.58)),e})():t==="api_key"?(()=>{var e=P();return v(e,`provider-auth-badge provider-auth-badge--key${n}`),o(e,"width",`${r}px`),o(e,"height",`${r}px`),b(e,()=>w(r*.58)),e})():null}export{A as a,R as b,S as c,C as g,L as v};
1
+ import{P as d}from"./ProviderIcon-CsB_Gx2t.js";import{q as v,B as o,i as b,t as u,s as l}from"./vendor-K8fEFSq9.js";function g(t){return d.find(r=>r.id===t)}function S(t,r){if(t.noKeyRequired)return{valid:!0};const n=r.replace(/\s/g,"");return n?t.keyPrefix&&!n.startsWith(t.keyPrefix)?{valid:!1,error:`${t.name} keys start with "${t.keyPrefix}"`}:t.minKeyLength&&n.length<t.minKeyLength?{valid:!1,error:`Key is too short (minimum ${t.minKeyLength} characters)`}:{valid:!0}:{valid:!1,error:"API key is required"}}const y={anthropic:"sk-ant-oat"};function L(t,r){const n=r.replace(/\s/g,"");if(!n)return{valid:!1,error:"Token is required"};if(n.length<10)return{valid:!1,error:"Token is too short (minimum 10 characters)"};const e=y[t.id];return e&&!n.startsWith(e)?{valid:!1,error:`${t.name} subscription tokens start with "${e}"`}:{valid:!0}}function R(t,r){const n=g(t);if(!n)return r;const e=n.models.find(i=>i.value===r);if(e)return e.label;const h=r.replace(/-\d{8}$/,"");if(h!==r){const i=n.models.find(s=>s.value===h);if(i)return i.label}const p=n.models.find(i=>r.startsWith(i.value+"-"));if(p)return p.label;const m=r.indexOf("/");if(m!==-1){const i=r.substring(m+1);for(const f of d){const a=f.models.find(c=>c.value===i);if(a)return a.label}const s=i.replace(/\./g,"-");if(s!==i)for(const f of d){const a=f.models.find(c=>c.value===s);if(a)return a.label}return i}return r}var $=u('<svg viewBox="2 1 20 22"fill=none stroke=currentColor stroke-width=3 stroke-linecap=round stroke-linejoin=round aria-hidden=true><path d="M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2"></path><circle cx=12 cy=7 r=4>'),k=u('<svg viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=3 stroke-linecap=round stroke-linejoin=round aria-hidden=true><path d="m21 2-2 2m-7.61 7.61a5.5 5.5 0 1 1-7.778 7.778 5.5 5.5 0 0 1 7.777-7.777zm0 0L15.5 7.5m0 0 3 3L22 7l-3-3m-3.5 3.5L19 4">'),x=u("<span aria-label=Subscription>"),P=u('<span aria-label="API Key">');const _=t=>(()=>{var r=$();return l(r,"width",t),l(r,"height",t),r})(),w=t=>(()=>{var r=k();return l(r,"width",t),l(r,"height",t),r})();function A(t){return t==="subscription"?"Subscription":"API Key"}function B(t,r){const n=r<=8?" provider-auth-badge--overlay":"";return t==="subscription"?(()=>{var e=x();return v(e,`provider-auth-badge provider-auth-badge--sub${n}`),o(e,"width",`${r}px`),o(e,"height",`${r}px`),b(e,()=>_(r*.58)),e})():t==="api_key"?(()=>{var e=P();return v(e,`provider-auth-badge provider-auth-badge--key${n}`),o(e,"width",`${r}px`),o(e,"height",`${r}px`),b(e,()=>w(r*.58)),e})():null}export{B as a,A as b,S as c,R as g,L as v};
@@ -0,0 +1 @@
1
+ import{i as s,g as a,T as n,M as i,t as l}from"./vendor-K8fEFSq9.js";var o=l(`<div class=container--sm><div class=page-header><div><h1>Help & Support</h1><span class=breadcrumb>Questions or issues? Reach out and we'll get back to you quickly</span></div></div><div class=settings-card><div class=settings-card__row><div class=settings-card__label><span class=settings-card__label-title>Schedule a Call</span><span class=settings-card__label-desc>Book a 30-min call with us to get help setting things up.</span></div><div class=settings-card__control><a href="https://calendly.com/sebastien-manifest/30min?month=2026-02"target=_blank rel="noopener noreferrer"class="btn btn--outline btn--sm"style=text-decoration:none>Book<svg width=12 height=12 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round style=margin-left:4px><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path><polyline points="15 3 21 3 21 9"></polyline><line x1=10 y1=14 x2=21 y2=3></line></svg></a></div></div><div class=settings-card__row><div class=settings-card__label><span class=settings-card__label-title>Email Support</span><span class=settings-card__label-desc>sebastien@manifest.build &mdash; we typically respond within 24 hours.</span></div><div class=settings-card__control><a href=mailto:sebastien@manifest.build class="btn btn--outline btn--sm"style=text-decoration:none>Contact<svg width=12 height=12 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round style=margin-left:4px><path d="M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z"></path><polyline points="22,6 12,13 2,6">`);const c=()=>(()=>{var t=o(),e=t.firstChild;return s(t,a(n,{children:"Help & Support - Manifest"}),e),s(t,a(i,{name:"description",content:"Get help with Manifest. Schedule a call or contact support."}),e),t})();export{c as default};
@@ -1 +1 @@
1
- import{a as u,i as v,h as x,s as r,t as k,d as y}from"./vendor-COodrVsO.js";var p=k('<span class=info-tooltip tabindex=0 role=button><svg class=info-tooltip__icon width=13 height=13 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round aria-hidden=true><circle cx=12 cy=12 r=10></circle><line x1=12 y1=16 x2=12 y2=12></line><line x1=12 y1=8 x2=12.01 y2=8></line></svg><span class=info-tooltip__bubble role=tooltip>');const g=n=>{const[o,i]=u(!1),c=e=>{e.key==="Enter"||e.key===" "?(e.preventDefault(),i(!o())):e.key==="Escape"&&i(!1)};return(()=>{var e=p(),d=e.firstChild,f=d.nextSibling;return e.$$focusout=()=>i(!1),e.$$click=()=>i(!o()),e.$$keydown=c,v(f,()=>n.text),x(t=>{var a=!!o(),l=`Info: ${n.text}`,s=o();return a!==t.e&&e.classList.toggle("info-tooltip--active",t.e=a),l!==t.t&&r(e,"aria-label",t.t=l),s!==t.a&&r(e,"aria-expanded",t.a=s),t},{e:void 0,t:void 0,a:void 0}),e})()};y(["keydown","click","focusout"]);export{g as I};
1
+ import{a as u,i as v,h as x,s as r,t as k,d as y}from"./vendor-K8fEFSq9.js";var p=k('<span class=info-tooltip tabindex=0 role=button><svg class=info-tooltip__icon width=13 height=13 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round aria-hidden=true><circle cx=12 cy=12 r=10></circle><line x1=12 y1=16 x2=12 y2=12></line><line x1=12 y1=8 x2=12.01 y2=8></line></svg><span class=info-tooltip__bubble role=tooltip>');const g=n=>{const[o,i]=u(!1),c=e=>{e.key==="Enter"||e.key===" "?(e.preventDefault(),i(!o())):e.key==="Escape"&&i(!1)};return(()=>{var e=p(),d=e.firstChild,f=d.nextSibling;return e.$$focusout=()=>i(!1),e.$$click=()=>i(!o()),e.$$keydown=c,v(f,()=>n.text),x(t=>{var a=!!o(),l=`Info: ${n.text}`,s=o();return a!==t.e&&e.classList.toggle("info-tooltip--active",t.e=a),l!==t.t&&r(e,"aria-label",t.t=l),s!==t.a&&r(e,"aria-expanded",t.a=s),t},{e:void 0,t:void 0,a:void 0}),e})()};y(["keydown","click","focusout"]);export{g as I};
@@ -0,0 +1 @@
1
+ import{a as p,o as Ie,i as e,g as n,S as m,h as E,s as ie,t as s,d as fe,f as ze,m as te,P as pe,n as He,k as Se,T as Ve,M as qe,F as Ce,B as Pe}from"./vendor-K8fEFSq9.js";import{J as Be,i as ve,t as W,K as Ze,L as Fe,M as We,N as Ye,O as Ue,P as Je,b as Ee,Q as Qe,R as Xe,S as et,T as tt}from"./index-DrLOx3nR.js";import"./auth-C2bQ9WcQ.js";var it=s('<div class=provider-card__dropdown><button class=provider-card__dropdown-item><svg width=14 height=14 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"></path><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"></path></svg>Edit</button><button class="provider-card__dropdown-item provider-card__dropdown-item--danger"><svg width=14 height=14 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round><polyline points="3 6 5 6 21 6"></polyline><path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"></path></svg>Remove'),lt=s("<span>"),nt=s('<span class=provider-card__email><svg width=12 height=12 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round><path d="M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z"></path><polyline points="22,6 12,13 2,6">'),rt=s('<div class=provider-card><div class=provider-card__header><span class=provider-card__label>Your provider</span><div class=provider-card__menu><button class=provider-card__menu-btn aria-label="Provider options"><svg width=16 height=16 viewBox="0 0 24 24"fill=currentColor><circle cx=12 cy=5 r=2></circle><circle cx=12 cy=12 r=2></circle><circle cx=12 cy=19 r=2></circle></svg></button></div></div><div class=provider-card__body><img alt class=provider-card__logo><div><div class=provider-card__name></div><div class=provider-card__meta><span class=provider-card__key>...');const st={resend:"/logos/resend.svg",mailgun:"/logos/mailgun.svg",sendgrid:"/logos/sendgrid.svg"},at={resend:"Resend",mailgun:"Mailgun",sendgrid:"SendGrid"},ot=t=>{const r=()=>st[t.config.provider]??"/logos/resend.svg",g=()=>at[t.config.provider]??t.config.provider,[u,v]=p(!1),h=k=>{k.target.closest(".provider-card__menu")||v(!1)},C=()=>{const k=!u();v(k),k&&document.addEventListener("click",h,{once:!0})};return Ie(()=>document.removeEventListener("click",h)),(()=>{var k=rt(),T=k.firstChild,D=T.firstChild,Y=D.nextSibling,z=Y.firstChild,P=T.nextSibling,A=P.firstChild,S=A.nextSibling,H=S.firstChild,R=H.nextSibling,o=R.firstChild,w=o.firstChild;return z.$$click=C,e(Y,n(m,{get when(){return u()},get children(){var _=it(),B=_.firstChild,V=B.nextSibling;return B.$$click=()=>{v(!1),t.onEdit()},V.$$click=()=>{v(!1),t.onRemove()},_}}),null),e(H,g),e(R,n(m,{get when(){return t.config.domain},get children(){var _=lt();return e(_,()=>t.config.domain),_}}),o),e(o,()=>t.config.keyPrefix,w),e(R,n(m,{get when(){return t.config.notificationEmail},get children(){var _=nt();return _.firstChild,e(_,()=>t.config.notificationEmail,null),_}}),null),E(()=>ie(A,"src",r())),k})()};fe(["click"]);var dt=s("<input class=modal-card__input type=password autofocus>"),Re=s("<p class=modal-card__field-error>"),ct=s("<label class=modal-card__field-label>Sending domain"),ut=s('<input class=modal-card__input type=text placeholder="e.g. notifications.mycompany.com">'),vt=s('<div class=modal-overlay><div class=modal-card role=dialog aria-modal=true aria-labelledby=provider-modal-title><h2 class=modal-card__title id=provider-modal-title></h2><p class=modal-card__desc>Enter your API credentials to enable email alert delivery.</p><label class=modal-card__field-label>Provider</label><div class=provider-modal-picker><button class=provider-modal-option type=button><img src=/logos/resend.svg alt class=provider-modal-option__logo><span>Resend</span></button><button class=provider-modal-option type=button><img src=/logos/mailgun.svg alt class=provider-modal-option__logo><span>Mailgun</span></button><button class=provider-modal-option type=button><img src=/logos/sendgrid.svg alt class=provider-modal-option__logo><span>SendGrid</span></button></div><label class=modal-card__field-label>API Key</label><label class=modal-card__field-label>Notification email</label><input class=modal-card__input type=email><p class=modal-card__field-hint>Where threshold alerts will be sent.</p><div class="modal-card__footer modal-card__footer--split"><button class="btn btn--ghost btn--sm"type=button></button><button class="btn btn--primary btn--sm">'),gt=s('<div class=masked-key><span class=masked-key__value></span><button class="btn btn--ghost btn--sm masked-key__edit"type=button>Change'),ht=s("<span class=spinner>");const Me=/^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)+$/i,mt={resend:"Resend",mailgun:"Mailgun",sendgrid:"SendGrid"},Oe=t=>{const[r,g]=p("resend"),[u,v]=p(""),[h,C]=p(""),[k,T]=p(""),[D,Y]=p(!1),[z,P]=p(!1),[A,S]=p(""),[H,R]=p(""),[o,w]=p(!1),_=Be.useSession(),B=()=>t.editMode&&!!t.existingKeyPrefix&&r()===t.initialProvider,V=()=>(t.existingKeyPrefix??"")+"••••••••";ze(()=>{if(t.open){g(t.initialProvider),v("");const d=t.editMode&&!!t.existingKeyPrefix;w(!d),C(t.existingDomain??"");const $=t.existingNotificationEmail??(ve()?"":_()?.data?.user?.email??"");T($),S(""),R("")}});const U=()=>r()==="mailgun",K=()=>{let d=!0;const $=u().trim(),M=h().trim().toLowerCase();return!o()&&B()?S(""):$?$.length<8?(S("API key must be at least 8 characters"),d=!1):r()==="resend"&&!$.startsWith("re_")?(S("Resend API key must start with re_"),d=!1):r()==="sendgrid"&&!$.startsWith("SG.")?(S("SendGrid API key must start with SG."),d=!1):S(""):(S("API key is required"),d=!1),U()?M?Me.test(M)?R(""):(R("Invalid domain format"),d=!1):(R("Domain is required"),d=!1):M&&!Me.test(M)?(R("Invalid domain format"),d=!1):R(""),d},le=()=>{const d=k().trim();return d||(_()?.data?.user?.email??null)},q=async()=>{const d=u().trim(),$=h().trim().toLowerCase(),M=le();if(!M)return W.error("Enter a notification email to send the test to"),!1;P(!0);try{const N={provider:r(),apiKey:d,to:M};$&&(N.domain=$);const c=await We(N);return c.success?!0:(W.error(c.error??"Email test failed — check your credentials"),!1)}catch{return!1}finally{P(!1)}},se=async()=>{const d=le();if(!d)return W.error("Enter a notification email to send the test to"),!1;P(!0);try{const $=await Fe(d);return $.success?!0:(W.error($.error??"Email test failed — check your credentials"),!1)}catch{return!1}finally{P(!1)}},ae=async()=>{if(!K()||Z())return;(!o()&&B()?await se():await q())&&W.success(`Test email sent to ${le()}`)},ne=async()=>{if(!K()||D()||z())return;const d=!o()&&B();if(!(d?await se():await q()))return;const M=h().trim().toLowerCase();Y(!0);try{const N={provider:r()};d||(N.apiKey=u().trim()),M&&(N.domain=M);const c=k().trim();c&&(N.notificationEmail=c),await Ze(N);const F=mt[r()]??r();W.success(`${F} connected`),t.onSaved(),t.onClose()}catch{}finally{Y(!1)}},J=d=>{d.key==="Enter"&&ne(),d.key==="Escape"&&t.onClose()},Z=()=>D()||z(),oe=()=>!o()&&B()?!!(U()&&!h().trim()):!!(!u().trim()||U()&&!h().trim()),Q=()=>z()?"Testing...":D()?"Saving...":t.editMode?"Test & Save":"Test & Connect",ge=()=>{switch(r()){case"resend":return"re_xxxx...";case"sendgrid":return"SG.xxxx...";default:return"key-xxxx..."}};return n(pe,{get children(){return n(m,{get when(){return t.open},get children(){var d=vt(),$=d.firstChild,M=$.firstChild,N=M.nextSibling,c=N.nextSibling,F=c.nextSibling,re=F.firstChild,X=re.nextSibling,de=X.nextSibling,i=F.nextSibling,y=i.nextSibling,ee=y.nextSibling,ce=ee.nextSibling,$e=ce.nextSibling,ue=$e.firstChild,he=ue.nextSibling;return d.$$click=()=>t.onClose(),$.$$click=l=>l.stopPropagation(),e(M,()=>t.editMode?"Edit email provider":"Configure email provider"),re.$$click=()=>{g("resend"),S("")},X.$$click=()=>{g("mailgun"),S("")},de.$$click=()=>{g("sendgrid"),S("")},e($,n(m,{get when(){return o()||!B()},get fallback(){return(()=>{var l=gt(),a=l.firstChild,b=a.nextSibling;return e(a,V),b.$$click=()=>{w(!0),v("")},l})()},get children(){var l=dt();return l.$$keydown=J,l.$$input=a=>{v(a.currentTarget.value),S("")},E(a=>{var b=!!A(),x=ge();return b!==a.e&&l.classList.toggle("modal-card__input--error",a.e=b),x!==a.t&&ie(l,"placeholder",a.t=x),a},{e:void 0,t:void 0}),E(()=>l.value=u()),l}}),y),e($,n(m,{get when(){return A()},get children(){var l=Re();return e(l,A),l}}),y),e($,n(m,{get when(){return U()},get children(){return[ct(),(()=>{var l=ut();return l.$$keydown=J,l.$$input=a=>{C(a.currentTarget.value),R("")},E(()=>l.classList.toggle("modal-card__input--error",!!H())),E(()=>l.value=h()),l})(),n(m,{get when(){return H()},get children(){var l=Re();return e(l,H),l}})]}}),y),ee.$$keydown=J,ee.$$input=l=>T(l.currentTarget.value),ue.$$click=ae,e(ue,(()=>{var l=te(()=>!!z());return()=>l()?ht():"Send test email"})()),he.$$click=ne,e(he,Q),E(l=>{var a=r()==="resend",b=r()==="mailgun",x=r()==="sendgrid",f=ve()?"you@example.com":_()?.data?.user?.email??"you@example.com",I=Z()||oe(),L=Z()||oe();return a!==l.e&&re.classList.toggle("provider-modal-option--active",l.e=a),b!==l.t&&X.classList.toggle("provider-modal-option--active",l.t=b),x!==l.a&&de.classList.toggle("provider-modal-option--active",l.a=x),f!==l.o&&ie(ee,"placeholder",l.o=f),I!==l.i&&(ue.disabled=l.i=I),L!==l.n&&(he.disabled=l.n=L),l},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0,n:void 0}),E(()=>ee.value=k()),d}})}})};fe(["click","input","keydown"]);var _t=s("<h3 class=provider-setup__title>Configure email provider"),pt=s("<p class=provider-setup__subtitle>Choose a service to send alert notifications via email."),ft=s("<div class=provider-setup-grid><button class=provider-setup-card><img src=/logos/resend.svg alt class=provider-setup-card__logo><div><div class=provider-setup-card__name>Resend</div><div class=provider-setup-card__desc>Email API</div></div></button><button class=provider-setup-card><img src=/logos/mailgun.svg alt class=provider-setup-card__logo><div><div class=provider-setup-card__name>Mailgun</div><div class=provider-setup-card__desc>Transactional email</div></div></button><button class=provider-setup-card><img src=/logos/sendgrid.svg alt class=provider-setup-card__logo><div><div class=provider-setup-card__name>SendGrid</div><div class=provider-setup-card__desc>Email delivery");const $t=t=>{const[r,g]=p(!1),[u,v]=p("resend"),h=C=>{v(C),g(!0)};return[_t(),pt(),(()=>{var C=ft(),k=C.firstChild,T=k.nextSibling,D=T.nextSibling;return k.$$click=()=>h("resend"),T.$$click=()=>h("mailgun"),D.$$click=()=>h("sendgrid"),C})(),n(Oe,{get open(){return r()},get initialProvider(){return u()},onClose:()=>g(!1),get onSaved(){return t.onConfigured}})]};fe(["click"]);var bt=s('<div class=cloud-email-info><svg class=cloud-email-info__icon width=20 height=20 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round><path d="M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z"></path><polyline points="22,6 12,13 2,6"></polyline></svg><div><div class=cloud-email-info__title>Email alerts</div><div class=cloud-email-info__desc>Alerts will be sent to <strong>');const yt=t=>(()=>{var r=bt(),g=r.firstChild,u=g.nextSibling,v=u.firstChild,h=v.nextSibling,C=h.firstChild,k=C.nextSibling;return e(k,()=>t.email),r})();var xt=s('<svg xmlns=http://www.w3.org/2000/svg viewBox="0 0 24 24"fill=currentColor aria-hidden=true><path d=m12,21c1.31,0,2.41-.83,2.82-2h-5.64c.41,1.17,1.51,2,2.82,2Z></path><path d=m19.27,13.7l-.87-.65c-.25-.19-.4-.49-.4-.8v-2.01c0-2.72-1.73-5.1-4.13-5.92-.28-.77-1.01-1.31-1.87-1.31s-1.58.54-1.87,1.29c-.79.26-1.53.68-2.17,1.27-1.25,1.14-1.96,2.75-1.96,4.44v2.25c0,.31-.15.61-.4.8l-.87.65c-.46.34-.73.89-.73,1.47,0,1.01.82,1.83,1.83,1.83h12.33c1.01,0,1.83-.82,1.83-1.83,0-.57-.27-1.12-.73-1.47Zm-1.1,2.3H5.83c-.46,0-.83-.37-.83-.83,0-.26.12-.51.33-.67l.87-.65c.5-.38.8-.97.8-1.6v-2.25c0-1.41.6-2.75,1.64-3.7.93-.85,2.11-1.3,3.36-1.3.17,0,.33,0,.5.02,2.53.24,4.51,2.53,4.51,5.21v2.01c0,.63.3,1.22.8,1.6l.87.65c.21.16.33.41.33.67,0,.46-.37.83-.83.83Z>');const je=t=>{const r=()=>t.size??16;return(()=>{var g=xt();return E(u=>{var v=r(),h=r();return v!==u.e&&ie(g,"width",u.e=v),h!==u.t&&ie(g,"height",u.t=h),u},{e:void 0,t:void 0}),g})()};var kt=s('<svg xmlns=http://www.w3.org/2000/svg viewBox="0 0 24 24"fill=currentColor aria-hidden=true><rect x=7 y=10 width=10 height=4 rx=1 ry=1></rect><path d=m12,3C7.04,3,3,7.04,3,12s4.04,9,9,9,9-4.04,9-9S16.96,3,12,3Zm0,17c-4.41,0-8-3.59-8-8S7.59,4,12,4s8,3.59,8,8-3.59,8-8,8Z>');const Ge=t=>{const r=()=>t.size??16;return(()=>{var g=kt();return E(u=>{var v=r(),h=r();return v!==u.e&&ie(g,"width",u.e=v),h!==u.t&&ie(g,"height",u.t=h),u},{e:void 0,t:void 0}),g})()};var Le=s('<svg class=limit-type-option__check width=16 height=16 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2.5 stroke-linecap=round stroke-linejoin=round><polyline points="20 6 9 17 4 12">'),wt=s("<p class=limit-type-hint>Email alerts require an email provider. You can set one up once you're done creating your rule."),St=s(`<div class=modal-overlay><div class=modal-card role=dialog aria-modal=true aria-labelledby=limit-modal-title><h2 class=modal-card__title id=limit-modal-title></h2><p class=modal-card__desc>Set up an email alert or hard limit for this agent's usage.</p><label class=modal-card__field-label style=margin-top:0>Rule type</label><div class=limit-type-selector><button class=limit-type-option><span class=limit-type-option__label>Email Alert</span></button><button class=limit-type-option><span class=limit-type-option__label>Hard Limit</span></button></div><label class=modal-card__field-label>Metric</label><select class="select notification-modal__select"><option value=tokens>Tokens</option><option value=cost>Cost (USD)</option></select><div class=limit-modal__row><div class=limit-modal__col><label class=modal-card__field-label>Threshold</label><input class=modal-card__input type=number min=0></div><div class=limit-modal__col><label class=modal-card__field-label>Period</label><select class="select notification-modal__select"><option value=hour>Per hour</option><option value=day>Per day</option><option value=week>Per week</option><option value=month>Per month</option></select></div></div><div class=modal-card__footer><button class="btn btn--primary btn--sm">`),Ct=s("<span class=spinner>");const Et=t=>{const[r,g]=p(new Set(["notify"])),[u,v]=p("tokens"),[h,C]=p(""),[k,T]=p("day"),D=o=>{g(w=>{const _=new Set(w);return _.has(o)?_.size>1&&_.delete(o):_.add(o),_})},Y=()=>{const o=r();return o.has("notify")&&o.has("block")?"both":o.has("block")?"block":"notify"},z=()=>{g(new Set(["notify"])),v("tokens"),C(""),T("day")};ze(()=>{if(t.open&&t.editData){const o=t.editData;v(o.metric_type),C(String(o.threshold)),T(o.period);const w=new Set;(o.action==="notify"||o.action==="both")&&w.add("notify"),(o.action==="block"||o.action==="both")&&w.add("block"),g(w)}else t.open&&z()});const[P,A]=p(!1),S=async()=>{if(P())return;const o=Number(h());if(!(isNaN(o)||o<=0)){A(!0);try{await t.onSave({metric_type:u(),threshold:o,period:k(),action:Y()}),z()}finally{A(!1)}}},H=()=>{z(),t.onClose()},R=()=>!!t.editData;return n(pe,{get children(){return n(m,{get when(){return t.open},get children(){var o=St(),w=o.firstChild,_=w.firstChild,B=_.nextSibling,V=B.nextSibling,U=V.nextSibling,K=U.firstChild,le=K.firstChild,q=K.nextSibling,se=q.firstChild,ae=U.nextSibling,ne=ae.nextSibling,J=ne.nextSibling,Z=J.firstChild,oe=Z.firstChild,Q=oe.nextSibling,ge=Z.nextSibling,d=ge.firstChild,$=d.nextSibling,M=J.nextSibling,N=M.firstChild;return o.$$click=()=>H(),w.$$click=c=>c.stopPropagation(),e(_,()=>R()?"Edit rule":"Create rule"),K.$$click=()=>D("notify"),e(K,n(je,{size:16}),le),e(K,n(m,{get when(){return r().has("notify")},get children(){return Le()}}),null),q.$$click=()=>D("block"),e(q,n(Ge,{size:16}),se),e(q,n(m,{get when(){return r().has("block")},get children(){return Le()}}),null),e(w,n(m,{get when(){return te(()=>!!r().has("notify"))()&&t.hasProvider===!1},get children(){return wt()}}),ae),ne.addEventListener("change",c=>v(c.currentTarget.value)),Q.$$keydown=c=>{c.key==="Enter"&&S()},Q.$$input=c=>C(c.currentTarget.value),$.addEventListener("change",c=>T(c.currentTarget.value)),N.$$click=S,e(N,(()=>{var c=te(()=>!!P());return()=>c()?Ct():R()?"Save changes":"Create rule"})()),E(c=>{var F=!!r().has("notify"),re=!!r().has("block"),X=u()==="cost"?"0.01":"1",de=u()==="cost"?"e.g. 10.00":"e.g. 50000",i=!h()||Number(h())<=0||P();return F!==c.e&&K.classList.toggle("limit-type-option--active",c.e=F),re!==c.t&&q.classList.toggle("limit-type-option--active",c.t=re),X!==c.a&&ie(Q,"step",c.a=X),de!==c.o&&ie(Q,"placeholder",c.o=de),i!==c.i&&(N.disabled=c.i=i),c},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0}),E(()=>ne.value=u()),E(()=>Q.value=h()),E(()=>$.value=k()),o}})}})};fe(["click","input","keydown"]);var Pt=s('<div class=limits-warning-banner><svg width=20 height=20 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round><path d="M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"></path><line x1=12 y1=9 x2=12 y2=13></line><line x1=12 y1=17 x2=12.01 y2=17></line></svg><span>One or more hard limits triggered. New proxy requests for this agent will be blocked until the usage resets in the next period.'),Rt=s('<div class=limits-routing-cta><svg width=20 height=20 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round><circle cx=12 cy=12 r=10></circle><line x1=12 y1=16 x2=12 y2=12></line><line x1=12 y1=8 x2=12.01 y2=8></line></svg><div><strong>Enable routing to set hard limits</strong><p>Hard limits automatically block proxy requests when usage exceeds a threshold. Email alerts work without routing &mdash; only hard limits require it.'),Te=s("<div style=margin-bottom:var(--gap-lg)>"),De=s('<table class="notif-table notif-table--flush"><thead><tr><th>Type</th><th>Threshold</th><th>Triggered</th><th style=text-align:right>Actions</th></tr></thead><tbody>'),Mt=s('<div class=modal-overlay><div class=modal-card role=dialog aria-modal=true style=max-width:440px><h2 class=modal-card__title>Delete rule</h2><p class=modal-card__desc>This will permanently delete the <span style=font-weight:600></span> rule (<!> <!>). This action cannot be undone.</p><label class=confirm-modal__confirm-row><input type=checkbox>I understand this action is irreversible</label><div class=confirm-modal__footer><button class="btn btn--ghost btn--sm">Cancel</button><button class="btn btn--danger btn--sm">'),Lt=s('<div class=modal-overlay><div class=modal-card role=dialog aria-modal=true style=max-width:440px><h2 class=modal-card__title>Remove provider</h2><p class=modal-card__desc>This will disconnect your email provider.</p><div class=confirm-modal__footer><button class="btn btn--ghost btn--sm">Cancel</button><button class="btn btn--danger btn--sm">'),Tt=s('<div class=container--sm><div class=page-header><div><h1>Limits</h1><span class=breadcrumb> &rsaquo; Get notified or block requests when token or cost thresholds are exceeded</span></div><button class="btn btn--primary btn--sm">+ Create rule</button></div><div class=panel><div class=panel__title>Rules'),Dt=s('<div class=provider-card><div class=provider-card__header><span class=provider-card__label>Your provider</span><div class="skeleton skeleton--text"style="width:16px;height:16px;border-radius:calc(var(--radius) - 2px)"></div></div><div class=provider-card__body><div class="skeleton skeleton--rect"style="width:32px;height:32px;border-radius:calc(var(--radius) - 2px);flex-shrink:0"></div><div><div class="skeleton skeleton--text"style=width:80px;height:14px></div><div class="skeleton skeleton--text"style=width:160px;height:12px;margin-top:6px>'),Nt=s('<div class=panel><div class="skeleton skeleton--text"style=width:180px;height:16px></div><div class="skeleton skeleton--text"style=width:280px;height:13px;margin-top:6px></div><div style=display:flex;gap:var(--gap-md);margin-top:var(--gap-lg)>'),At=s('<div class="skeleton skeleton--rect"style=flex:1;height:64px;border-radius:var(--radius)>'),Kt=s('<tr><td><div class="skeleton skeleton--text"style=width:28px></div></td><td><div class="skeleton skeleton--text"style=width:80px></div></td><td><div class="skeleton skeleton--text"style=width:20px></div></td><td style=text-align:right><div class="skeleton skeleton--text"style=width:16px;margin-left:auto>'),It=s("<div class=empty-state><div class=empty-state__title>No rules yet</div><p>Set up alerts for usage spikes, or hard limits to block requests over budget."),zt=s('<span class=limit-type-icon title="Email Alert">'),Bt=s('<span class=limit-type-icon title="Hard Limit">'),Ot=s('<span class=limit-warn-tag><svg width=12 height=12 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round><path d="M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"></path><line x1=12 y1=9 x2=12 y2=13></line><line x1=12 y1=17 x2=12.01 y2=17></line></svg>No provider'),jt=s('<tr><td><div class=limit-type-icons></div></td><td><span class=notif-table__mono></span> <span class=notif-table__period></span></td><td class=notif-table__mono></td><td><div class=notif-table__actions><button class=rule-menu__btn aria-label="Rule options"><svg width=16 height=16 viewBox="0 0 24 24"fill=currentColor><circle cx=12 cy=5 r=2></circle><circle cx=12 cy=12 r=2></circle><circle cx=12 cy=19 r=2>'),Gt=s('<div class=rule-menu__dropdown style=position:fixed;transform:translateX(-100%)><button class=rule-menu__item><svg width=14 height=14 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"></path><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"></path></svg>Edit</button><button class="rule-menu__item rule-menu__item--danger"><svg width=14 height=14 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round><polyline points="3 6 5 6 21 6"></polyline><path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"></path></svg>Delete'),Ne=s("<span class=spinner>");function Ae(t){return t.metric_type==="cost"?`$${Number(t.threshold).toFixed(2)}`:Number(t.threshold).toLocaleString()}const Ke={hour:"Per hour",day:"Per day",week:"Per week",month:"Per month"},Zt=()=>{const t=He(),r=()=>decodeURIComponent(t.agentName),[g,{refetch:u}]=Se(()=>r(),i=>Ye(i)),[v,{refetch:h}]=Se(Ue),[C]=Se(()=>r(),Je),k=Be.useSession(),[T,D]=p(!1),[Y,z]=p(!1),[P,A]=p(null),[S,H]=p(null),[R,o]=p({top:0,left:0}),[w,_]=p(null),[B,V]=p(!1),[U,K]=p(!1),[le,q]=p(!1),[se,ae]=p(!1),ne=()=>C()?.enabled??!1,J=()=>!ve()||!!v(),Z=()=>H(null),oe=()=>Z(),Q=(i,y)=>{if(y.stopPropagation(),S()===i)Z();else{const ce=y.currentTarget.getBoundingClientRect();o({top:ce.bottom+4,left:ce.right}),H(i),setTimeout(()=>document.addEventListener("click",oe,{once:!0}),0)}};Ie(()=>document.removeEventListener("click",oe));const ge=i=>{Z(),A(i),D(!0)},d=async i=>{const y=P();try{y?(await et(y.id,{...i}),W.success("Rule updated")):(await tt({agent_name:r(),...i}),W.success("Rule created")),await u(),D(!1),A(null)}catch{}},$=i=>{Z(),_(i),V(!1)},M=async()=>{const i=w();if(i){q(!0);try{await Qe(i.id),await u(),W.success("Rule deleted")}catch{}finally{q(!1)}_(null),V(!1)}},N=()=>{const i=g();return i?i.some(y=>y.action==="notify"||y.action==="both"):!1},c=async()=>{ae(!0);try{await Xe(),await h(),K(!1),W.success("Email provider removed")}catch{}finally{ae(!1)}},F=i=>typeof i.is_active=="number"?!!i.is_active:i.is_active,re=()=>{const i=g();return i?i.some(y=>(y.action==="block"||y.action==="both")&&F(y)&&Number(y.trigger_count)>0):!1},X=i=>i==="notify"||i==="both",de=i=>i==="block"||i==="both";return(()=>{var i=Tt(),y=i.firstChild,ee=y.firstChild,ce=ee.firstChild,$e=ce.nextSibling,ue=$e.firstChild,he=ee.nextSibling,l=y.nextSibling;return l.firstChild,e(i,n(Ve,{get children(){return[te(()=>Ee()??r())," Limits - Manifest"]}}),y),e(i,n(qe,{name:"description",get content(){return`Configure limits and alerts for ${Ee()??r()}.`}}),y),e($e,()=>Ee()??r(),ue),he.$$click=()=>{A(null),D(!0)},e(i,n(m,{get when(){return re()},get children(){return Pt()}}),l),e(i,n(m,{get when(){return te(()=>!!(C()&&!ne()))()&&!ve()},get children(){return Rt()}}),l),e(i,n(m,{get when(){return!ve()},get children(){var a=Te();return e(a,n(yt,{get email(){return k().data?.user?.email??""}})),a}}),l),e(i,n(m,{get when(){return ve()},get children(){var a=Te();return e(a,n(m,{get when(){return!v.loading},get fallback(){return n(m,{get when(){return!!v()},get fallback(){return(()=>{var b=Nt(),x=b.firstChild,f=x.nextSibling,I=f.nextSibling;return e(I,n(Ce,{each:[1,2,3],children:()=>At()})),b})()},get children(){return Dt()}})},get children(){return n(m,{get when(){return v()},get fallback(){return n($t,{onConfigured:h})},get children(){return n(ot,{get config(){return v()},onEdit:()=>z(!0),onRemove:()=>K(!0)})}})}})),a}}),l),e(l,n(m,{get when(){return!g.loading},get fallback(){return(()=>{var a=De(),b=a.firstChild,x=b.nextSibling;return e(x,n(Ce,{each:[1,2,3],children:()=>Kt()})),a})()},get children(){return n(m,{get when(){return(g()??[]).length>0},get fallback(){return It()},get children(){var a=De(),b=a.firstChild,x=b.nextSibling;return e(x,n(Ce,{get each(){return g()},children:f=>(()=>{var I=jt(),L=I.firstChild,j=L.firstChild,G=L.nextSibling,be=G.firstChild,ye=be.nextSibling,xe=ye.nextSibling,me=G.nextSibling,we=me.nextSibling,ke=we.firstChild,_e=ke.firstChild;return e(j,n(m,{get when(){return X(f.action??"notify")},get children(){var O=zt();return e(O,n(je,{size:14})),O}}),null),e(j,n(m,{get when(){return de(f.action??"notify")},get children(){var O=Bt();return e(O,n(Ge,{size:14})),O}}),null),e(j,n(m,{get when(){return te(()=>!!X(f.action??"notify"))()&&!J()},get children(){return Ot()}}),null),e(be,()=>Ae(f)),e(xe,()=>(Ke[f.period]??f.period).toLowerCase()),e(me,()=>f.trigger_count??0),_e.$$click=O=>Q(f.id,O),E(()=>I.classList.toggle("notif-table__row--disabled",!F(f))),I})()})),a}})}}),null),e(i,n(pe,{get children(){return n(m,{get when(){return S()},children:a=>{const b=(g()??[]).find(x=>x.id===S());return b?(()=>{var x=Gt(),f=x.firstChild,I=f.nextSibling;return f.$$click=()=>ge(b),I.$$click=()=>$(b),E(L=>{var j=`${R().top}px`,G=`${R().left}px`;return j!==L.e&&Pe(x,"top",L.e=j),G!==L.t&&Pe(x,"left",L.t=G),L},{e:void 0,t:void 0}),x})():null}})}}),null),e(i,n(pe,{get children(){return n(m,{get when(){return w()},get children(){var a=Mt(),b=a.firstChild,x=b.firstChild,f=x.nextSibling,I=f.firstChild,L=I.nextSibling,j=L.nextSibling,G=j.nextSibling,be=G.nextSibling,ye=be.nextSibling;ye.nextSibling;var xe=f.nextSibling,me=xe.firstChild,we=xe.nextSibling,ke=we.firstChild,_e=ke.nextSibling;return a.$$click=()=>{_(null),V(!1)},b.$$click=O=>O.stopPropagation(),e(L,()=>w().metric_type==="tokens"?"token":"cost"),e(f,()=>Ae(w()),G),e(f,()=>Ke[w().period]?.toLowerCase()??w().period,ye),me.addEventListener("change",O=>V(O.currentTarget.checked)),ke.$$click=()=>{_(null),V(!1)},_e.$$click=M,e(_e,(()=>{var O=te(()=>!!le());return()=>O()?Ne():"Delete rule"})()),E(()=>_e.disabled=!B()||le()),E(()=>me.checked=B()),a}})}}),null),e(i,n(pe,{get children(){return n(m,{get when(){return U()},get children(){var a=Lt(),b=a.firstChild,x=b.firstChild,f=x.nextSibling;f.firstChild;var I=f.nextSibling,L=I.firstChild,j=L.nextSibling;return a.$$click=()=>K(!1),b.$$click=G=>G.stopPropagation(),e(f,n(m,{get when(){return N()},get children(){return[" ","Email alerts won't be sent until you set up a new one."]}}),null),L.$$click=()=>K(!1),j.$$click=c,e(j,(()=>{var G=te(()=>!!se());return()=>G()?Ne():"Remove"})()),E(()=>j.disabled=se()),a}})}}),null),e(i,n(Et,{get open(){return T()},onClose:()=>{D(!1),A(null)},onSave:d,get hasProvider(){return J()},get editData(){return te(()=>!!P())()?{metric_type:P().metric_type,threshold:Number(P().threshold),period:P().period,action:P().action??"notify"}:null}}),null),e(i,n(Oe,{get open(){return Y()},get initialProvider(){return v()?.provider??"resend"},editMode:!0,get existingKeyPrefix(){return v()?.keyPrefix??null},get existingDomain(){return v()?.domain??null},get existingNotificationEmail(){return v()?.notificationEmail??null},onClose:()=>z(!1),onSaved:()=>h()}),null),i})()};fe(["click"]);export{Zt as default};
@@ -0,0 +1 @@
1
+ import{a as n,D as A,e as F,g as r,T as q,M as U,S as f,i,m,h as d,A as R,t as s,d as W}from"./vendor-K8fEFSq9.js";import{S as B}from"./SocialButtons-CJFTtTz6.js";import{U as J,J as x}from"./index-DrLOx3nR.js";import"./auth-C2bQ9WcQ.js";var j=s("<div class=auth-header><h1 class=auth-header__title>Connecting...</h1><p class=auth-header__subtitle>Setting up your local session"),z=s("<div class=auth-header><h1 class=auth-header__title>Welcome back</h1><p class=auth-header__subtitle>Take control of your OpenClaw costs"),G=s("<div class=auth-divider><span class=auth-divider__text>or"),H=s("<button type=button class=auth-form__link-btn>"),K=s('<form class=auth-form><label class=auth-form__label>Email<input class=auth-form__input type=email placeholder=you@example.com required></label><label class=auth-form__label>Password<input class=auth-form__input type=password placeholder="Enter your password"required></label><div class=auth-form__actions></div><button class=auth-form__submit type=submit>'),Q=s("<div class=auth-footer><span>Don't have an account? "),X=s("<div class=auth-form__error>"),Y=s("<span class=spinner>");const Z=60,se=()=>{const[h,I]=n(""),[_,D]=n(""),[p,l]=n(""),[g,v]=n(!1),[M,$]=n(!1),[o,b]=n(0),[w,S]=n(!1),[O]=A();F(async()=>{if(O.error&&l("Login failed. Please try again or use a different method."),await J()){S(!0);try{if((await fetch("/api/auth/local-session",{credentials:"include"})).ok){window.location.href="/";return}}catch{}S(!1)}});const P=()=>{b(Z);const e=setInterval(()=>{b(t=>t<=1?(clearInterval(e),0):t-1)},1e3)},T=async e=>{e.preventDefault(),l(""),$(!1),v(!0);const{error:t}=await x.signIn.email({email:h(),password:_()});if(v(!1),t){const c=t.message??"";if(c.toLowerCase().includes("email is not verified")||t.code==="EMAIL_NOT_VERIFIED"){$(!0),l("Please verify your email before signing in.");return}l(c||"Invalid email or password");return}window.location.href="/"},V=async()=>{if(o()>0)return;const{error:e}=await x.sendVerificationEmail({email:h(),callbackURL:"/"});if(e){l(e.message??"Failed to resend verification email");return}P(),l("Verification email sent! Check your inbox.")};return[r(q,{children:"Sign In - Manifest"}),r(U,{name:"description",content:"Sign in to Manifest to monitor your AI agents."}),r(f,{get when(){return w()},get children(){return j()}}),r(f,{get when(){return!w()},get children(){return[z(),r(B,{}),G(),(()=>{var e=K(),t=e.firstChild,c=t.firstChild,y=c.nextSibling,E=t.nextSibling,N=E.firstChild,C=N.nextSibling,k=E.nextSibling,L=k.nextSibling;return e.addEventListener("submit",T),i(e,(()=>{var a=m(()=>!!p());return()=>a()&&(()=>{var u=X();return i(u,p),u})()})(),t),i(e,r(f,{get when(){return M()},get children(){var a=H();return a.$$click=V,i(a,(()=>{var u=m(()=>o()>0);return()=>u()?`Resend in ${o()}s`:"Resend verification email"})()),d(()=>a.disabled=o()>0),a}}),t),y.$$input=a=>I(a.currentTarget.value),C.$$input=a=>D(a.currentTarget.value),i(k,r(R,{href:"/reset-password",class:"auth-form__forgot",children:"Forgot password?"})),i(L,(()=>{var a=m(()=>!!g());return()=>a()?Y():"Sign in"})()),d(()=>L.disabled=g()),d(()=>y.value=h()),d(()=>C.value=_()),e})(),(()=>{var e=Q();return e.firstChild,i(e,r(R,{href:"/register",class:"auth-footer__link",children:"Sign up"}),null),e})()]}})]};W(["click","input"]);export{se as default};
@@ -0,0 +1 @@
1
+ import{a as S,p as X,n as Rt,k as vt,o as At,f as ft,z as _t,i as s,g as n,m as c,T as jt,M as Bt,h as f,S as _,F as bt,s as M,B as Ot,q as Y,j as Ut,A as qt,t as o,d as Vt}from"./vendor-K8fEFSq9.js";import{i as Z,g as Wt,k as Ht,p as Gt,b as $t,d as Jt,f as Kt,c as R,e as Qt,l as Xt,h as tt,j as xt,E as Yt}from"./index-DrLOx3nR.js";import{P as Zt}from"./Pagination-CQk_Ps2L.js";import{i as et,s as te,p as ee,a as yt,P as se}from"./ProviderIcon-CsB_Gx2t.js";import{p as re,S as le,g as kt,a as ae}from"./overview-DoY4lTQc.js";import{a as ne,b as Ct}from"./AuthBadge-CXkjgzF2.js";import{I as st}from"./InfoTooltip-Bno8U6nE.js";import"./auth-C2bQ9WcQ.js";import"./SetupStepInstall-gm9pOgFh.js";import"./SetupStepVerify-B01hQCeb.js";function oe(g=50){const[N,T]=S([void 0]),[b,P]=S(0),[w,z]=S(!1),B=X(()=>b()+1),I=X(()=>N()[b()]),A=X(()=>w());function O(v){v?(z(!0),T(q=>{const V=b()+1,u=[...q];return u[V]=v,u})):z(!1)}function U(){w()&&P(v=>v+1)}function h(){b()<=0||P(v=>v-1)}function F(){T([void 0]),P(0),z(!1)}return{currentPage:B,currentCursor:I,hasNextPage:A,previousPage:h,nextPage:U,recordResponse:O,resetPage:F,pageSize:g}}var ie=o('<div class=cost-range-filter><input type=number class=cost-range-filter__input placeholder="Min $"min=0 step=0.01><span class=cost-range-filter__sep>&ndash;</span><input type=number class=cost-range-filter__input placeholder="Max $"min=0 step=0.01>'),de=o('<button class="btn btn--primary btn--sm">Set up agent'),ce=o(`<div class=waiting-banner><i class="bxd bx-florist"></i><p>Waiting for data. Messages will show up within seconds of your agent's first LLM call.`),ue=o("<div class=demo-dashboard><div class=panel><div style=display:flex;justify-content:space-between;align-items:center;margin-bottom:var(--gap-lg)><div class=panel__title style=margin-bottom:0>Messages</div><span style=font-size:var(--font-size-xs);color:hsl(var(--muted-foreground))>0 total</span></div><div class=data-table-scroll><table class=data-table><thead><tr><th>Date</th><th>Message</th><th>Cost</th><th>Total Tokens</th><th>Input</th><th>Output</th><th>Model</th><th>Cache</th><th>Duration</th><th>Status</th></tr></thead><tbody><tr><td colspan=10 style=text-align:center;color:hsl(var(--muted-foreground));padding:var(--gap-lg)>Messages will appear here"),ge=o('<div class=panel><div style=display:flex;justify-content:space-between;align-items:center;margin-bottom:var(--gap-lg)><div class=panel__title style=margin-bottom:0>Messages</div><span style=font-size:var(--font-size-xs);color:hsl(var(--muted-foreground))>0 results</span></div><div class=model-filter__empty><p class=model-filter__empty-title>No messages match your filters</p><p class=model-filter__empty-hint>Try adjusting your provider or cost filters to see more results.</p><button class="btn btn--outline btn--sm"type=button>Clear filters'),pe=o("<div class=panel><div style=display:flex;justify-content:space-between;align-items:center;margin-bottom:var(--gap-lg)><div class=panel__title style=margin-bottom:0>Messages</div><span style=font-size:var(--font-size-xs);color:hsl(var(--muted-foreground))> total</span></div><div class=data-table-scroll><table class=data-table><thead><tr><th>Date</th><th>Message</th><th>Cost</th><th>Total Tokens</th><th>Input</th><th>Output</th><th>Model</th><th>Cache</th><th>Duration</th><th>Status</th></tr></thead><tbody>"),he=o("<div class=container--full><div class=page-header><div><h1>Messages</h1><span class=breadcrumb>Full log of every LLM call. Filter by provider or cost.</span></div><div class=header-controls>"),me=o('<div class=panel><div style=display:flex;justify-content:space-between;align-items:center;margin-bottom:var(--gap-lg)><div class="skeleton skeleton--text"style=width:80px;height:16px></div><div class="skeleton skeleton--text"style=width:60px;height:14px></div></div><div class=data-table-scroll><table class=data-table><thead><tr><th>Date</th><th>Message</th><th>Cost</th><th>Total Tokens</th><th>Input</th><th>Output</th><th>Model</th><th>Cache</th><th>Duration</th><th>Status</th></tr></thead><tbody>'),ve=o('<tr><td><div class="skeleton skeleton--text"style=width:90px></div></td><td><div class="skeleton skeleton--text"style=width:55px></div></td><td><div class="skeleton skeleton--text"style=width:40px></div></td><td><div class="skeleton skeleton--text"style=width:40px></div></td><td><div class="skeleton skeleton--text"style=width:35px></div></td><td><div class="skeleton skeleton--text"style=width:35px></div></td><td><div class="skeleton skeleton--text"style=width:110px></div></td><td><div class="skeleton skeleton--text"style=width:90px></div></td><td><div class="skeleton skeleton--text"style=width:35px></div></td><td><div class="skeleton skeleton--text"style=width:50px>'),fe=o('<div class=empty-state><div class=empty-state__title>No messages recorded</div><p>Connect your agent and send a message. Each LLM call gets logged here.</p><button class="btn btn--primary btn--sm"style=margin-top:var(--gap-md)>Set up agent</button><div class=empty-state__img-wrapper><img src=/example-messages.svg alt="Example message log showing LLM call history"class=empty-state__img loading=lazy>',!0,!1,!1),_e=o('<span title="Included in subscription"style=color:hsl(var(--muted-foreground))>$0.00'),be=o("<span class=status-badge-tooltip tabindex=0 role=note><span></span><span class=status-badge-tooltip__bubble>"),$e=o("<tr><td style=font-family:var(--font-mono);font-size:var(--font-size-xs);color:hsl(var(--muted-foreground))></td><td style=font-family:var(--font-mono);font-size:var(--font-size-xs);color:hsl(var(--muted-foreground))></td><td style=font-family:var(--font-mono)></td><td style=font-family:var(--font-mono)></td><td style=font-family:var(--font-mono);font-size:var(--font-size-xs);color:hsl(var(--muted-foreground))></td><td style=font-family:var(--font-mono);font-size:var(--font-size-xs);color:hsl(var(--muted-foreground))></td><td style=font-family:var(--font-mono);font-size:var(--font-size-xs);color:hsl(var(--muted-foreground))><span style=display:inline-flex;align-items:center;gap:4px></span></td><td style=font-family:var(--font-mono);font-size:var(--font-size-xs);color:hsl(var(--muted-foreground))></td><td style=font-family:var(--font-mono);font-size:var(--font-size-xs);color:hsl(var(--muted-foreground))></td><td>"),xe=o('<span title=Heartbeat style=display:inline-flex;align-items:center;margin-left:4px;color:hsl(var(--muted-foreground));opacity:0.7><svg xmlns=http://www.w3.org/2000/svg width=12 height=12 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round aria-hidden=true><polyline points="22 12 18 12 15 21 9 3 6 12 2 12">'),rt=o("<span>"),ye=o("<span class=provider-card__logo-letter style=width:16px;height:16px;font-size:9px;flex-shrink:0;border-radius:50%>"),ke=o("<span role=img style=display:inline-flex;flex-shrink:0;position:relative>"),Ce=o('<span class="tier-badge tier-badge--fallback">fallback'),Se=o('<svg xmlns=http://www.w3.org/2000/svg width=11 height=11 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2.5 stroke-linecap=round stroke-linejoin=round style=margin-right:3px;flex-shrink:0><polyline points="15 17 20 12 15 7"></polyline><path d="M4 18v-2a4 4 0 0 1 4-4h12">');const Ee=()=>{const g=Rt();re();const[N,T]=S(""),[b,P]=S(""),[w,z]=S(""),[B,I]=S(!1),[A]=S(!!localStorage.getItem(`setup_completed_${g.agentName}`)||Z()===!0&&g.agentName==="local-agent"),[O]=vt(()=>g.agentName,e=>Wt(decodeURIComponent(e))),U=e=>{const i=e.match(/^custom:([^/]+)\//);if(!i)return;const C=i[1];return O()?.find($=>$.id===C)?.name},h=oe(50);let F,v;At(()=>{clearTimeout(F),clearTimeout(v)});const q=e=>{clearTimeout(F),F=setTimeout(()=>P(e),400)},V=e=>{clearTimeout(v),v=setTimeout(()=>z(e),400)};ft(_t([N,b,w],()=>h.resetPage(),{defer:!0}));const[u,{refetch:St}]=vt(()=>({provider:N(),costMin:b(),costMax:w(),agentName:g.agentName,_ping:Gt(),cursor:h.currentCursor(),limit:h.pageSize}),e=>{const i={};return e.provider&&(i.provider=e.provider),e.costMin&&(i.cost_min=e.costMin),e.costMax&&(i.cost_max=e.costMax),e.agentName&&(i.agent_name=e.agentName),e.cursor&&(i.cursor=e.cursor),i.limit=String(e.limit),Ht(i)});ft(_t(()=>u(),e=>{e&&h.recordResponse(e.next_cursor)}));const lt=()=>N()!==""||b()!==""||w()!=="",W=()=>{const e=u();return e&&e.total_count===0},wt=()=>W()&&lt(),H=()=>W()&&!lt(),Mt=()=>{T(""),P(""),z("")},Nt=e=>se.find(C=>C.id===e)?.name??e,Pt=e=>{const i=u()?.items;if(!i)return;const C=i.find(l=>l.fallback_from_model===e&&l.status==="ok");if(!C)return;const $=document.getElementById(`msg-${C.id}`);$&&($.scrollIntoView({behavior:"smooth",block:"center"}),$.classList.add("msg-highlight"),setTimeout(()=>$.classList.remove("msg-highlight"),2e3))};return(()=>{var e=he(),i=e.firstChild,C=i.firstChild,$=C.nextSibling;return s(e,n(jt,{get children(){return[c(()=>$t()??decodeURIComponent(g.agentName))," Messages - Manifest"]}}),i),s(e,n(Bt,{name:"description",get content(){return`Browse all messages sent and received by ${$t()??decodeURIComponent(g.agentName)}. Filter by provider or cost.`}}),i),s($,n(_,{get when(){return!H()},get children(){return[n(le,{get value(){return N()},onChange:T,get options(){return[{label:"All providers",value:""},...(u()?.providers??[]).map(l=>({label:Nt(l),value:l}))]}}),(()=>{var l=ie(),p=l.firstChild,x=p.nextSibling,m=x.nextSibling;return p.$$input=y=>q(y.currentTarget.value),m.$$input=y=>V(y.currentTarget.value),f(()=>p.value=b()),f(()=>m.value=w()),l})()]}}),null),s($,n(_,{get when(){return c(()=>!!(H()&&!(Z()&&g.agentName==="local-agent")))()&&!A()},get children(){var l=de();return l.$$click=()=>I(!0),l}}),null),s(e,n(_,{get when(){return u()!==void 0||!u.loading},get fallback(){return(()=>{var l=me(),p=l.firstChild,x=p.nextSibling,m=x.firstChild,y=m.firstChild,L=y.nextSibling;return s(L,n(bt,{each:[1,2,3,4,5,6,7,8,9,10],children:()=>ve()})),l})()},get children(){return n(_,{get when(){return!u.error},get fallback(){return n(Yt,{get error(){return u.error},onRetry:St})},get children(){return[n(_,{get when(){return H()},get children(){return n(_,{get when(){return c(()=>!!Z())()&&g.agentName==="local-agent"||A()},get fallback(){return(()=>{var l=fe(),p=l.firstChild,x=p.nextSibling,m=x.nextSibling;return m.$$click=()=>I(!0),l})()},get children(){return[ce(),ue()]}})}}),n(_,{get when(){return wt()},get children(){var l=ge(),p=l.firstChild,x=p.nextSibling,m=x.firstChild,y=m.nextSibling,L=y.nextSibling;return L.$$click=Mt,l}}),n(_,{get when(){return!W()},get children(){var l=pe(),p=l.firstChild,x=p.firstChild,m=x.nextSibling,y=m.firstChild,L=p.nextSibling,zt=L.firstChild,at=zt.firstChild,Tt=at.firstChild,It=Tt.firstChild,Ft=It.nextSibling,Lt=Ft.nextSibling,G=Lt.nextSibling;G.firstChild;var J=G.nextSibling;J.firstChild;var nt=J.nextSibling;nt.firstChild;var Dt=at.nextSibling;return s(m,()=>u().total_count,y),s(G,n(st,{text:"Tokens are units of text that AI models process. More tokens = higher cost."}),null),s(J,n(st,{text:"Tokens sent to the model (your prompt). Also called 'input tokens'."}),null),s(nt,n(st,{text:"Tokens returned by the model (its response). Also called 'output tokens'."}),null),s(Dt,n(bt,{get each(){return u()?.items},children:t=>(()=>{var K=$e(),ot=K.firstChild,Q=ot.nextSibling,it=Q.nextSibling,dt=it.nextSibling,ct=dt.nextSibling,ut=ct.nextSibling,gt=ut.nextSibling,j=gt.firstChild,pt=gt.nextSibling,ht=pt.nextSibling,Et=ht.nextSibling;return s(ot,()=>Jt(t.timestamp)),s(Q,()=>t.id.slice(0,8),null),s(Q,(()=>{var r=c(()=>t.routing_reason==="heartbeat");return()=>r()&&xe()})(),null),s(it,n(_,{get when(){return t.auth_type==="subscription"},get fallback(){return(()=>{var r=rt();return s(r,(()=>{var a=c(()=>t.cost!=null);return()=>a()?Kt(t.cost)??"—":"—"})()),f(()=>M(r,"title",t.cost!=null&&t.cost>0&&t.cost<.01?`$${t.cost.toFixed(6)}`:void 0)),r})()},get children(){return _e()}})),s(dt,(()=>{var r=c(()=>t.total_tokens!=null);return()=>r()?R(t.total_tokens):"—"})()),s(ct,(()=>{var r=c(()=>t.input_tokens!=null);return()=>r()?R(t.input_tokens):"—"})()),s(ut,(()=>{var r=c(()=>t.output_tokens!=null);return()=>r()?R(t.output_tokens):"—"})()),s(j,(()=>{var r=c(()=>!!(t.model&&et(t.model)==="custom"));return()=>r()?(()=>{const a=U(t.model),D=(a??te(t.model)).charAt(0).toUpperCase();return(()=>{var d=ye();return M(d,"title",a),s(d,D),f(k=>Ot(d,"background",Qt(a??""))),d})()})():c(()=>!!(t.model&&et(t.model)))()?(()=>{const a=ee(et(t.model),14),D=ne(t.auth_type,8);return(()=>{var d=ke();return s(d,a,null),s(d,D,null),f(k=>{var E=`${yt(t.model)} (${Ct(t.auth_type)})`,mt=`${yt(t.model)} (${Ct(t.auth_type)})`;return E!==k.e&&M(d,"aria-label",k.e=E),mt!==k.t&&M(d,"title",k.t=mt),k},{e:void 0,t:void 0}),d})()})():null})(),null),s(j,(()=>{var r=c(()=>!!t.model);return()=>r()?kt(t.model):"—"})(),null),s(j,(()=>{var r=c(()=>!!t.routing_tier);return()=>r()&&(()=>{var a=rt();return s(a,()=>t.routing_tier),f(()=>Y(a,`tier-badge tier-badge--${t.routing_tier}`)),a})()})(),null),s(j,(()=>{var r=c(()=>!!t.fallback_from_model);return()=>r()&&(()=>{var a=Ce();return f(()=>M(a,"title",`Fallback from ${kt(t.fallback_from_model)}`)),a})()})(),null),s(pt,(()=>{var r=c(()=>(t.cache_read_tokens??0)>0||(t.cache_creation_tokens??0)>0);return()=>r()?`Read: ${R(t.cache_read_tokens??0)} / Write: ${R(t.cache_creation_tokens??0)}`:"—"})()),s(ht,(()=>{var r=c(()=>t.duration_ms!=null);return()=>r()?Xt(t.duration_ms):"—"})()),s(Et,n(_,{get when(){return t.error_message},get fallback(){return(()=>{var r=rt();return s(r,(()=>{var a=c(()=>t.status==="rate_limited");return()=>a()?n(qt,{get href(){return`/agents/${encodeURIComponent(g.agentName)}/limits`},get children(){return tt(t.status)}}):tt(t.status)})()),f(()=>Y(r,`status-badge status-badge--${t.status}`)),r})()},get children(){var r=be(),a=r.firstChild,D=a.nextSibling;return Ut(a,"click",t.status==="fallback_error"&&t.model?()=>Pt(t.model):void 0,!0),s(a,(()=>{var d=c(()=>t.status==="fallback_error");return()=>d()&&Se()})(),null),s(a,()=>tt(t.status),null),s(D,()=>xt(t.error_message)),f(d=>{var k=xt(t.error_message),E=`status-badge status-badge--${t.status}`;return k!==d.e&&M(r,"aria-label",d.e=k),E!==d.t&&Y(a,d.t=E),d},{e:void 0,t:void 0}),r}})),f(()=>M(K,"id",`msg-${t.id}`)),K})()})),s(l,n(Zt,{get currentPage(){return h.currentPage},totalItems:()=>u()?.total_count??0,get pageSize(){return h.pageSize},get hasNextPage(){return h.hasNextPage},isLoading:()=>u.loading,get onPrevious(){return h.previousPage},get onNext(){return h.nextPage}}),null),l}})]}})}}),null),s(e,n(ae,{get open(){return B()},get agentName(){return decodeURIComponent(g.agentName)},onClose:()=>I(!1)}),null),e})()};Vt(["input","click"]);export{Ee as default};