aimeat 1.12.4 → 1.13.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/locales/en.json +1 -0
- package/dist/locales/fi.json +1 -0
- package/dist/public/views/profile/agents-tab.js +29 -9
- package/dist/public/views/profile/generator-settings.js +124 -0
- package/dist/src/cli/connect/auth.js +1 -1
- package/dist/src/cli/connect/auth.js.map +1 -1
- package/dist/src/cli/connect/mcp/tools/core.d.ts +4 -0
- package/dist/src/cli/connect/mcp/tools/core.d.ts.map +1 -1
- package/dist/src/cli/connect/mcp/tools/core.js +64 -21
- package/dist/src/cli/connect/mcp/tools/core.js.map +1 -1
- package/dist/src/cli/connect/mcp/tools/handbook.d.ts +4 -0
- package/dist/src/cli/connect/mcp/tools/handbook.d.ts.map +1 -1
- package/dist/src/cli/connect/mcp/tools/handbook.js +4 -2
- package/dist/src/cli/connect/mcp/tools/handbook.js.map +1 -1
- package/dist/src/models/agent-onboarding-schemas.d.ts +1 -1
- package/dist/src/models/agent-onboarding-schemas.d.ts.map +1 -1
- package/dist/src/models/agent-onboarding-schemas.js +12 -6
- package/dist/src/models/agent-onboarding-schemas.js.map +1 -1
- package/dist/src/routes/agent-onboarding.d.ts.map +1 -1
- package/dist/src/routes/agent-onboarding.js +7 -1
- package/dist/src/routes/agent-onboarding.js.map +1 -1
- package/dist/src/routes/agent-tasks.d.ts.map +1 -1
- package/dist/src/routes/agent-tasks.js +54 -7
- package/dist/src/routes/agent-tasks.js.map +1 -1
- package/dist/src/routes/ai.d.ts +29 -0
- package/dist/src/routes/ai.d.ts.map +1 -0
- package/dist/src/routes/ai.js +306 -0
- package/dist/src/routes/ai.js.map +1 -0
- package/dist/src/routes/lib-ai.d.ts +25 -0
- package/dist/src/routes/lib-ai.d.ts.map +1 -0
- package/dist/src/routes/lib-ai.js +173 -0
- package/dist/src/routes/lib-ai.js.map +1 -0
- package/dist/src/routes/libs.d.ts +4 -0
- package/dist/src/routes/libs.d.ts.map +1 -1
- package/dist/src/routes/libs.js +17 -0
- package/dist/src/routes/libs.js.map +1 -1
- package/dist/src/server-bootstrap/routes-loader.d.ts.map +1 -1
- package/dist/src/server-bootstrap/routes-loader.js +2 -0
- package/dist/src/server-bootstrap/routes-loader.js.map +1 -1
- package/dist/src/services/openrouter.d.ts +15 -0
- package/dist/src/services/openrouter.d.ts.map +1 -1
- package/dist/src/services/openrouter.js +12 -1
- package/dist/src/services/openrouter.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file ai.ts
|
|
3
|
+
* @description App-level AI completion endpoint. Sibling of /v1/openrouter/complete
|
|
4
|
+
* but without the project-id gate: any logged-in owner (or agent with `ai:use`
|
|
5
|
+
* scope) can call it from a sandboxed app or extension. Spend is bounded by:
|
|
6
|
+
* - per-user daily USD budget (default $1, configurable in
|
|
7
|
+
* openrouter.settings.daily_budget_usd)
|
|
8
|
+
* - optional per-app daily USD quota
|
|
9
|
+
* (openrouter.settings.app_quotas[app_id].daily_usd, default $0.10)
|
|
10
|
+
* - optional app allowlist (openrouter.settings.app_allowlist) — if set,
|
|
11
|
+
* only listed apps may call.
|
|
12
|
+
* The user's encrypted OpenRouter (or compatible) key from
|
|
13
|
+
* /v1/openrouter/settings is reused unchanged.
|
|
14
|
+
* @structure
|
|
15
|
+
* - POST /v1/ai/complete — owner or agent(ai:use), runs one completion
|
|
16
|
+
* - GET /v1/ai/usage — owner-only, today's spend per-app breakdown
|
|
17
|
+
* - POST /v1/ai/settings — owner-only, update budget/quotas/allowlist
|
|
18
|
+
* - GET /v1/ai/settings — owner-only, read budget/quotas/allowlist
|
|
19
|
+
* @usage
|
|
20
|
+
* import { aiRouter } from './routes/ai.js';
|
|
21
|
+
* app.use(aiRouter(config, storage));
|
|
22
|
+
* @version-history
|
|
23
|
+
* v1.0.0 — 2026-05-29 — Initial: app-level AI calls with budget enforcement
|
|
24
|
+
*/
|
|
25
|
+
import { Router } from 'express';
|
|
26
|
+
import { requireAuth, requireRole } from '../auth/middleware.js';
|
|
27
|
+
import { rateLimit } from '../middleware/rate-limit.js';
|
|
28
|
+
import { success, error } from '../middleware/envelope.js';
|
|
29
|
+
import { resolveIdentity } from '../utils/gaii.js';
|
|
30
|
+
import { decrypt, getEncryptionKey } from '../services/encryption.js';
|
|
31
|
+
import { logger } from '../utils/logger.js';
|
|
32
|
+
import { complete } from '../services/openrouter.js';
|
|
33
|
+
const DEFAULT_BASE_URLS = {
|
|
34
|
+
openrouter: 'https://openrouter.ai/api/v1',
|
|
35
|
+
lmstudio: 'http://localhost:1234/v1',
|
|
36
|
+
custom: '',
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Rough cost estimate when the provider didn't report one (LM Studio, custom).
|
|
40
|
+
* Claude Sonnet-ish pricing as a ceiling — apps relying on this exact number
|
|
41
|
+
* are doing it wrong (the user's OpenRouter dashboard is authoritative).
|
|
42
|
+
* Budgets exist to prevent runaways, not to bill.
|
|
43
|
+
*/
|
|
44
|
+
const FALLBACK_PROMPT_COST_PER_TOKEN = 0.000005;
|
|
45
|
+
const FALLBACK_COMPLETION_COST_PER_TOKEN = 0.000015;
|
|
46
|
+
/** Defaults applied when the user hasn't set explicit values. */
|
|
47
|
+
const DEFAULT_DAILY_BUDGET_USD = 1.0;
|
|
48
|
+
const DEFAULT_APP_DAILY_USD = 0.10;
|
|
49
|
+
/** Hard server-side cap on max_tokens regardless of what the caller asks. */
|
|
50
|
+
const MAX_TOKENS_CEILING = 4000;
|
|
51
|
+
function todayKey() {
|
|
52
|
+
return new Date().toISOString().slice(0, 10);
|
|
53
|
+
}
|
|
54
|
+
function estimateCostUsd(promptTokens, completionTokens) {
|
|
55
|
+
return promptTokens * FALLBACK_PROMPT_COST_PER_TOKEN
|
|
56
|
+
+ completionTokens * FALLBACK_COMPLETION_COST_PER_TOKEN;
|
|
57
|
+
}
|
|
58
|
+
export function aiRouter(config, storage) {
|
|
59
|
+
const router = Router();
|
|
60
|
+
const resolve = (req) => resolveIdentity(req.auth, config.nodeId);
|
|
61
|
+
// Reuse the openrouter rate limit bucket — same provider, same spend concerns.
|
|
62
|
+
const aiRateLimit = rateLimit(config.rateLimits.openrouter);
|
|
63
|
+
function requireEncryption(res) {
|
|
64
|
+
const key = getEncryptionKey(config);
|
|
65
|
+
if (!key) {
|
|
66
|
+
res.status(503).json(error(config.nodeId, 'ENCRYPTION_NOT_CONFIGURED', 'Encryption key not configured. Set AIMEAT_ENCRYPTION_KEY or AIMEAT_TOTP_ENCRYPTION_KEY.'));
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
return key;
|
|
70
|
+
}
|
|
71
|
+
async function upsertMemory(gaii, key, value, tags) {
|
|
72
|
+
const now = new Date().toISOString();
|
|
73
|
+
const existing = await storage.getMemory(gaii, key);
|
|
74
|
+
await storage.setMemory({
|
|
75
|
+
key, ownerGaii: gaii, value, visibility: 'private', tags,
|
|
76
|
+
ttlHours: null,
|
|
77
|
+
version: existing ? existing.version + 1 : 1,
|
|
78
|
+
createdAt: existing?.createdAt ?? now,
|
|
79
|
+
updatedAt: now,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Either the caller is an owner JWT (role=owner) OR an agent JWT with the
|
|
84
|
+
* `ai:use` scope. Reject any other shape.
|
|
85
|
+
*/
|
|
86
|
+
function gateOwnerOrAiUseAgent(req, res) {
|
|
87
|
+
const roles = req.auth?.roles ?? [];
|
|
88
|
+
if (roles.includes('owner'))
|
|
89
|
+
return true;
|
|
90
|
+
if (roles.includes('agent')) {
|
|
91
|
+
const scopes = req.auth?.scopes ?? [];
|
|
92
|
+
if (scopes.includes('ai:use') || scopes.includes('*'))
|
|
93
|
+
return true;
|
|
94
|
+
res.status(403).json(error(config.nodeId, 'SCOPE_REQUIRED', 'Agent JWT missing required scope: ai:use'));
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
res.status(403).json(error(config.nodeId, 'FORBIDDEN', 'AI completion requires owner or agent(ai:use) authentication.'));
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
// ── POST /v1/ai/complete ──
|
|
101
|
+
router.post('/v1/ai/complete', requireAuth(), aiRateLimit, async (req, res) => {
|
|
102
|
+
if (!gateOwnerOrAiUseAgent(req, res))
|
|
103
|
+
return;
|
|
104
|
+
req.setTimeout(1_800_000);
|
|
105
|
+
res.setTimeout(1_800_000);
|
|
106
|
+
const gaii = resolve(req);
|
|
107
|
+
const { prompt, systemPrompt, model: modelOverride, modelRole, temperature, top_p, max_tokens, app_id, } = req.body;
|
|
108
|
+
if (!prompt || typeof prompt !== 'string') {
|
|
109
|
+
return res.status(400).json(error(config.nodeId, 'INVALID_BODY', 'prompt is required.'));
|
|
110
|
+
}
|
|
111
|
+
if (prompt.length > 200_000) {
|
|
112
|
+
return res.status(400).json(error(config.nodeId, 'PROMPT_TOO_LONG', 'prompt exceeds 200k characters.'));
|
|
113
|
+
}
|
|
114
|
+
// ── Load settings + today's usage + decrypt key ──
|
|
115
|
+
const [apiKeyRecord, prefsRecord, usageRecord] = await Promise.all([
|
|
116
|
+
storage.getMemory(gaii, 'openrouter.apikey'),
|
|
117
|
+
storage.getMemory(gaii, 'openrouter.settings'),
|
|
118
|
+
storage.getMemory(gaii, `ai-usage.${gaii}.${todayKey()}`),
|
|
119
|
+
]);
|
|
120
|
+
const prefs = prefsRecord?.value ?? {};
|
|
121
|
+
const provider = prefs.provider || 'openrouter';
|
|
122
|
+
const baseUrl = prefs.baseUrl || DEFAULT_BASE_URLS[provider];
|
|
123
|
+
// ── App allowlist check (if configured) ──
|
|
124
|
+
const allowlist = Array.isArray(prefs.app_allowlist) ? prefs.app_allowlist : null;
|
|
125
|
+
if (allowlist && app_id && !allowlist.includes(app_id)) {
|
|
126
|
+
return res.status(403).json(error(config.nodeId, 'APP_NOT_ALLOWED', `App "${app_id}" is not in your AI allowlist. Enable it from Settings.`));
|
|
127
|
+
}
|
|
128
|
+
if (allowlist && !app_id) {
|
|
129
|
+
// If user has an allowlist but the call has no app_id, refuse — we
|
|
130
|
+
// can't attribute it to anything they've approved.
|
|
131
|
+
return res.status(403).json(error(config.nodeId, 'APP_ID_REQUIRED', 'app_id is required because you have configured an AI app allowlist.'));
|
|
132
|
+
}
|
|
133
|
+
// ── Decrypt key (optional for non-openrouter providers) ──
|
|
134
|
+
let decryptedKey;
|
|
135
|
+
const encrypted = apiKeyRecord?.value?.encrypted;
|
|
136
|
+
if (encrypted) {
|
|
137
|
+
const encKey = requireEncryption(res);
|
|
138
|
+
if (!encKey)
|
|
139
|
+
return;
|
|
140
|
+
decryptedKey = decrypt(encrypted, encKey);
|
|
141
|
+
}
|
|
142
|
+
else if (provider === 'openrouter') {
|
|
143
|
+
return res.status(400).json(error(config.nodeId, 'NO_API_KEY', 'No OpenRouter API key configured. Set one in Settings.'));
|
|
144
|
+
}
|
|
145
|
+
// ── Budget check ──
|
|
146
|
+
const usage = usageRecord?.value ?? {
|
|
147
|
+
date: todayKey(), total_cost_usd: 0, total_calls: 0, total_tokens: 0,
|
|
148
|
+
per_app: {}, updated_at: new Date().toISOString(),
|
|
149
|
+
};
|
|
150
|
+
const dailyBudget = typeof prefs.daily_budget_usd === 'number'
|
|
151
|
+
? prefs.daily_budget_usd
|
|
152
|
+
: DEFAULT_DAILY_BUDGET_USD;
|
|
153
|
+
if (usage.total_cost_usd >= dailyBudget) {
|
|
154
|
+
return res.status(402).json(error(config.nodeId, 'QUOTA_EXHAUSTED', `Daily AI budget hit ($${usage.total_cost_usd.toFixed(4)} / $${dailyBudget}). Raise it in Settings or wait until midnight UTC.`));
|
|
155
|
+
}
|
|
156
|
+
// Per-app quota
|
|
157
|
+
const appQuotas = prefs.app_quotas ?? {};
|
|
158
|
+
if (app_id) {
|
|
159
|
+
const appQuota = appQuotas[app_id]?.daily_usd ?? DEFAULT_APP_DAILY_USD;
|
|
160
|
+
const appSpent = usage.per_app[app_id]?.cost_usd ?? 0;
|
|
161
|
+
if (appSpent >= appQuota) {
|
|
162
|
+
return res.status(402).json(error(config.nodeId, 'APP_QUOTA_EXHAUSTED', `Daily AI quota for "${app_id}" hit ($${appSpent.toFixed(4)} / $${appQuota}). Raise it in Settings.`));
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
// ── Model selection ──
|
|
166
|
+
let selectedModel;
|
|
167
|
+
if (typeof modelOverride === 'string' && modelOverride) {
|
|
168
|
+
selectedModel = modelOverride;
|
|
169
|
+
}
|
|
170
|
+
else if (modelRole === 'reasoning' && prefs.reasoningModel) {
|
|
171
|
+
selectedModel = prefs.reasoningModel;
|
|
172
|
+
}
|
|
173
|
+
else if (modelRole === 'execution' && prefs.executionModel) {
|
|
174
|
+
selectedModel = prefs.executionModel;
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
selectedModel = prefs.model
|
|
178
|
+
|| prefs.executionModel
|
|
179
|
+
|| prefs.reasoningModel
|
|
180
|
+
|| 'anthropic/claude-sonnet-4';
|
|
181
|
+
}
|
|
182
|
+
// Server-side hard ceiling on max_tokens regardless of caller.
|
|
183
|
+
const cappedMaxTokens = max_tokens === undefined
|
|
184
|
+
? undefined
|
|
185
|
+
: Math.min(Math.max(1, max_tokens | 0), MAX_TOKENS_CEILING);
|
|
186
|
+
const options = {
|
|
187
|
+
temperature: temperature ?? (typeof prefs.temperature === 'number' ? prefs.temperature : undefined),
|
|
188
|
+
top_p: top_p ?? (typeof prefs.top_p === 'number' ? prefs.top_p : undefined),
|
|
189
|
+
max_tokens: cappedMaxTokens ?? (typeof prefs.max_tokens === 'number'
|
|
190
|
+
? Math.min(prefs.max_tokens, MAX_TOKENS_CEILING)
|
|
191
|
+
: undefined),
|
|
192
|
+
};
|
|
193
|
+
try {
|
|
194
|
+
const result = await complete(decryptedKey, selectedModel, prompt, systemPrompt, baseUrl, options);
|
|
195
|
+
const promptTok = result.usage?.prompt_tokens ?? 0;
|
|
196
|
+
const completionTok = result.usage?.completion_tokens ?? 0;
|
|
197
|
+
const totalTok = result.usage?.total_tokens ?? (promptTok + completionTok);
|
|
198
|
+
const costUsd = typeof result.usage?.cost_usd === 'number'
|
|
199
|
+
? result.usage.cost_usd
|
|
200
|
+
: estimateCostUsd(promptTok, completionTok);
|
|
201
|
+
// ── Record usage (idempotent within the day) ──
|
|
202
|
+
const updated = {
|
|
203
|
+
date: todayKey(),
|
|
204
|
+
total_cost_usd: usage.total_cost_usd + costUsd,
|
|
205
|
+
total_calls: usage.total_calls + 1,
|
|
206
|
+
total_tokens: usage.total_tokens + totalTok,
|
|
207
|
+
per_app: { ...usage.per_app },
|
|
208
|
+
updated_at: new Date().toISOString(),
|
|
209
|
+
};
|
|
210
|
+
const appKey = app_id || '_unknown';
|
|
211
|
+
const existing = updated.per_app[appKey] ?? { cost_usd: 0, calls: 0, tokens: 0 };
|
|
212
|
+
updated.per_app[appKey] = {
|
|
213
|
+
cost_usd: existing.cost_usd + costUsd,
|
|
214
|
+
calls: existing.calls + 1,
|
|
215
|
+
tokens: existing.tokens + totalTok,
|
|
216
|
+
};
|
|
217
|
+
await upsertMemory(gaii, `ai-usage.${gaii}.${todayKey()}`, updated, ['ai', 'usage']);
|
|
218
|
+
logger.info(`[ai] gaii=${gaii} app=${app_id ?? '_unknown'} model=${result.model} tokens=${totalTok} cost=$${costUsd.toFixed(4)} day_total=$${updated.total_cost_usd.toFixed(4)}`);
|
|
219
|
+
res.json(success(config.nodeId, {
|
|
220
|
+
content: result.content,
|
|
221
|
+
model: result.model,
|
|
222
|
+
usage: {
|
|
223
|
+
prompt_tokens: promptTok,
|
|
224
|
+
completion_tokens: completionTok,
|
|
225
|
+
total_tokens: totalTok,
|
|
226
|
+
cost_usd: costUsd,
|
|
227
|
+
cost_exact: typeof result.usage?.cost_usd === 'number',
|
|
228
|
+
},
|
|
229
|
+
budget: {
|
|
230
|
+
daily_budget_usd: dailyBudget,
|
|
231
|
+
spent_today_usd: updated.total_cost_usd,
|
|
232
|
+
remaining_usd: Math.max(0, dailyBudget - updated.total_cost_usd),
|
|
233
|
+
},
|
|
234
|
+
}));
|
|
235
|
+
}
|
|
236
|
+
catch (e) {
|
|
237
|
+
const status = e.status;
|
|
238
|
+
if (status === 401) {
|
|
239
|
+
return res.status(401).json(error(config.nodeId, 'INVALID_API_KEY', 'API key was rejected by the provider.'));
|
|
240
|
+
}
|
|
241
|
+
if (status === 429) {
|
|
242
|
+
return res.status(429).json(error(config.nodeId, 'RATE_LIMITED', 'Provider rate limit hit. Try again later.'));
|
|
243
|
+
}
|
|
244
|
+
return res.status(502).json(error(config.nodeId, 'PROVIDER_ERROR', e.message));
|
|
245
|
+
}
|
|
246
|
+
});
|
|
247
|
+
// ── GET /v1/ai/usage ── today's spend breakdown
|
|
248
|
+
router.get('/v1/ai/usage', requireAuth(), requireRole('owner'), async (req, res) => {
|
|
249
|
+
const gaii = resolve(req);
|
|
250
|
+
const rec = await storage.getMemory(gaii, `ai-usage.${gaii}.${todayKey()}`);
|
|
251
|
+
const usage = rec?.value ?? {
|
|
252
|
+
date: todayKey(), total_cost_usd: 0, total_calls: 0, total_tokens: 0, per_app: {}, updated_at: new Date().toISOString(),
|
|
253
|
+
};
|
|
254
|
+
const prefsRecord = await storage.getMemory(gaii, 'openrouter.settings');
|
|
255
|
+
const prefs = prefsRecord?.value ?? {};
|
|
256
|
+
const dailyBudget = typeof prefs.daily_budget_usd === 'number'
|
|
257
|
+
? prefs.daily_budget_usd
|
|
258
|
+
: DEFAULT_DAILY_BUDGET_USD;
|
|
259
|
+
res.json(success(config.nodeId, {
|
|
260
|
+
date: usage.date,
|
|
261
|
+
daily_budget_usd: dailyBudget,
|
|
262
|
+
spent_today_usd: usage.total_cost_usd,
|
|
263
|
+
remaining_usd: Math.max(0, dailyBudget - usage.total_cost_usd),
|
|
264
|
+
total_calls: usage.total_calls,
|
|
265
|
+
total_tokens: usage.total_tokens,
|
|
266
|
+
per_app: usage.per_app,
|
|
267
|
+
}));
|
|
268
|
+
});
|
|
269
|
+
// ── GET /v1/ai/settings ──
|
|
270
|
+
router.get('/v1/ai/settings', requireAuth(), requireRole('owner'), async (req, res) => {
|
|
271
|
+
const gaii = resolve(req);
|
|
272
|
+
const prefsRecord = await storage.getMemory(gaii, 'openrouter.settings');
|
|
273
|
+
const prefs = prefsRecord?.value ?? {};
|
|
274
|
+
res.json(success(config.nodeId, {
|
|
275
|
+
daily_budget_usd: typeof prefs.daily_budget_usd === 'number' ? prefs.daily_budget_usd : DEFAULT_DAILY_BUDGET_USD,
|
|
276
|
+
app_quotas: prefs.app_quotas ?? {},
|
|
277
|
+
app_allowlist: Array.isArray(prefs.app_allowlist) ? prefs.app_allowlist : null,
|
|
278
|
+
defaults: {
|
|
279
|
+
daily_budget_usd: DEFAULT_DAILY_BUDGET_USD,
|
|
280
|
+
per_app_daily_usd: DEFAULT_APP_DAILY_USD,
|
|
281
|
+
max_tokens_ceiling: MAX_TOKENS_CEILING,
|
|
282
|
+
},
|
|
283
|
+
}));
|
|
284
|
+
});
|
|
285
|
+
// ── POST /v1/ai/settings ── update budget/quotas/allowlist
|
|
286
|
+
router.post('/v1/ai/settings', requireAuth(), requireRole('owner'), async (req, res) => {
|
|
287
|
+
const gaii = resolve(req);
|
|
288
|
+
const { daily_budget_usd, app_quotas, app_allowlist } = req.body;
|
|
289
|
+
const prefsRecord = await storage.getMemory(gaii, 'openrouter.settings');
|
|
290
|
+
const prefs = { ...(prefsRecord?.value ?? {}) };
|
|
291
|
+
if (typeof daily_budget_usd === 'number') {
|
|
292
|
+
if (daily_budget_usd < 0 || daily_budget_usd > 1000) {
|
|
293
|
+
return res.status(400).json(error(config.nodeId, 'INVALID_BUDGET', 'daily_budget_usd must be between 0 and 1000.'));
|
|
294
|
+
}
|
|
295
|
+
prefs.daily_budget_usd = daily_budget_usd;
|
|
296
|
+
}
|
|
297
|
+
if (app_quotas !== undefined)
|
|
298
|
+
prefs.app_quotas = app_quotas;
|
|
299
|
+
if (app_allowlist !== undefined)
|
|
300
|
+
prefs.app_allowlist = app_allowlist;
|
|
301
|
+
await upsertMemory(gaii, 'openrouter.settings', prefs, ['openrouter', 'settings']);
|
|
302
|
+
res.json(success(config.nodeId, { saved: true }));
|
|
303
|
+
});
|
|
304
|
+
return router;
|
|
305
|
+
}
|
|
306
|
+
//# sourceMappingURL=ai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai.js","sourceRoot":"","sources":["../../../src/routes/ai.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { AimeatConfig } from '../config.js';
|
|
2
|
+
/**
|
|
3
|
+
* aimeat-ai.js — Browser-side AI capability that uses the user's own
|
|
4
|
+
* OpenRouter (or compatible) API key, configured once via AIMEAT Settings.
|
|
5
|
+
*
|
|
6
|
+
* Apps detect availability and surface "✨ Use AI" affordances:
|
|
7
|
+
* const ok = await AIMEAT.ai.isAvailable();
|
|
8
|
+
* if (ok) document.getElementById('suggest').onclick = async () => {
|
|
9
|
+
* const r = await AIMEAT.ai.complete({
|
|
10
|
+
* prompt: 'Suggest 5 short genre tags for:\n' + summary,
|
|
11
|
+
* modelRole: 'execution',
|
|
12
|
+
* max_tokens: 60,
|
|
13
|
+
* app_id: 'my-app-name', // for per-app spend tracking
|
|
14
|
+
* });
|
|
15
|
+
* output.value = r.content;
|
|
16
|
+
* };
|
|
17
|
+
*
|
|
18
|
+
* The user's key never leaves the AIMEAT server. Errors are thrown with a
|
|
19
|
+
* descriptive `.code` (e.g. NO_API_KEY, QUOTA_EXHAUSTED, APP_NOT_ALLOWED) so
|
|
20
|
+
* apps can show actionable messages.
|
|
21
|
+
*
|
|
22
|
+
* Requires aimeat-auth.js loaded first.
|
|
23
|
+
*/
|
|
24
|
+
export declare function aimeatAiLib(config: AimeatConfig): string;
|
|
25
|
+
//# sourceMappingURL=lib-ai.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lib-ai.d.ts","sourceRoot":"","sources":["../../../src/routes/lib-ai.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAqJxD"}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* aimeat-ai.js — Browser-side AI capability that uses the user's own
|
|
3
|
+
* OpenRouter (or compatible) API key, configured once via AIMEAT Settings.
|
|
4
|
+
*
|
|
5
|
+
* Apps detect availability and surface "✨ Use AI" affordances:
|
|
6
|
+
* const ok = await AIMEAT.ai.isAvailable();
|
|
7
|
+
* if (ok) document.getElementById('suggest').onclick = async () => {
|
|
8
|
+
* const r = await AIMEAT.ai.complete({
|
|
9
|
+
* prompt: 'Suggest 5 short genre tags for:\n' + summary,
|
|
10
|
+
* modelRole: 'execution',
|
|
11
|
+
* max_tokens: 60,
|
|
12
|
+
* app_id: 'my-app-name', // for per-app spend tracking
|
|
13
|
+
* });
|
|
14
|
+
* output.value = r.content;
|
|
15
|
+
* };
|
|
16
|
+
*
|
|
17
|
+
* The user's key never leaves the AIMEAT server. Errors are thrown with a
|
|
18
|
+
* descriptive `.code` (e.g. NO_API_KEY, QUOTA_EXHAUSTED, APP_NOT_ALLOWED) so
|
|
19
|
+
* apps can show actionable messages.
|
|
20
|
+
*
|
|
21
|
+
* Requires aimeat-auth.js loaded first.
|
|
22
|
+
*/
|
|
23
|
+
export function aimeatAiLib(config) {
|
|
24
|
+
return `// aimeat-ai.js — AIMEAT AI capability (user-owned OpenRouter key)
|
|
25
|
+
// Node: ${config.nodeId} | Generated: ${new Date().toISOString()}
|
|
26
|
+
// Requires: aimeat-auth.js loaded first
|
|
27
|
+
(function(global) {
|
|
28
|
+
'use strict';
|
|
29
|
+
|
|
30
|
+
function getSession() {
|
|
31
|
+
if (!global.AIMEAT || !global.AIMEAT.auth) {
|
|
32
|
+
throw new Error('AIMEAT.auth is required. Include aimeat-auth.js before aimeat-ai.js');
|
|
33
|
+
}
|
|
34
|
+
const s = global.AIMEAT.auth.getSession();
|
|
35
|
+
if (!s) throw new Error('Not logged in. Call AIMEAT.auth.login() first.');
|
|
36
|
+
return s;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
async function authFetch(path, opts) {
|
|
40
|
+
const session = getSession();
|
|
41
|
+
return session.fetch(path, opts);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// 60s in-memory cache for isAvailable so apps can call it on every render
|
|
45
|
+
// without hammering the server. Cleared on logout via storage event.
|
|
46
|
+
let _availCache = null;
|
|
47
|
+
|
|
48
|
+
// 1h in-memory cache for models() — the list barely changes in practice.
|
|
49
|
+
let _modelsCache = null;
|
|
50
|
+
|
|
51
|
+
const ai = {
|
|
52
|
+
/**
|
|
53
|
+
* Returns true if the user has an OpenRouter key configured.
|
|
54
|
+
* Cached 60 seconds. Apps should call this before showing "Use AI" buttons.
|
|
55
|
+
*/
|
|
56
|
+
async isAvailable() {
|
|
57
|
+
const now = Date.now();
|
|
58
|
+
if (_availCache && (now - _availCache.t) < 60_000) return _availCache.v;
|
|
59
|
+
try {
|
|
60
|
+
const r = await authFetch('/v1/openrouter/settings');
|
|
61
|
+
const v = !!(r && r.ok && r.data && r.data.has_api_key);
|
|
62
|
+
_availCache = { v, t: now };
|
|
63
|
+
return v;
|
|
64
|
+
} catch (e) { return false; }
|
|
65
|
+
},
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Run a single completion. Returns { content, model, usage, budget }.
|
|
69
|
+
* Throws an Error with .code set on quota/permission/auth failures.
|
|
70
|
+
*
|
|
71
|
+
* Recognized error codes (see routes/ai.ts):
|
|
72
|
+
* NO_API_KEY — user hasn't set up a key yet
|
|
73
|
+
* QUOTA_EXHAUSTED — daily user budget hit
|
|
74
|
+
* APP_QUOTA_EXHAUSTED — per-app daily quota hit
|
|
75
|
+
* APP_NOT_ALLOWED — app_id not in user's allowlist
|
|
76
|
+
* APP_ID_REQUIRED — user has an allowlist; app must pass app_id
|
|
77
|
+
* INVALID_API_KEY — provider rejected the key
|
|
78
|
+
* RATE_LIMITED — provider rate limit
|
|
79
|
+
* PROVIDER_ERROR — upstream provider failed
|
|
80
|
+
*/
|
|
81
|
+
async complete(opts) {
|
|
82
|
+
if (!opts || typeof opts !== 'object') throw new Error('opts object required');
|
|
83
|
+
if (!opts.prompt) throw new Error('opts.prompt required');
|
|
84
|
+
const body = {
|
|
85
|
+
prompt: opts.prompt,
|
|
86
|
+
systemPrompt: opts.systemPrompt,
|
|
87
|
+
model: opts.model,
|
|
88
|
+
modelRole: opts.modelRole,
|
|
89
|
+
temperature: opts.temperature,
|
|
90
|
+
top_p: opts.top_p,
|
|
91
|
+
max_tokens: opts.max_tokens,
|
|
92
|
+
app_id: opts.app_id,
|
|
93
|
+
};
|
|
94
|
+
const r = await authFetch('/v1/ai/complete', {
|
|
95
|
+
method: 'POST',
|
|
96
|
+
body: JSON.stringify(body),
|
|
97
|
+
});
|
|
98
|
+
if (!r || !r.ok) {
|
|
99
|
+
const code = (r && r.error && r.error.code) || 'UNKNOWN';
|
|
100
|
+
const msg = (r && r.error && r.error.message) || 'AI call failed';
|
|
101
|
+
const err = new Error(msg);
|
|
102
|
+
err.code = code;
|
|
103
|
+
throw err;
|
|
104
|
+
}
|
|
105
|
+
return r.data;
|
|
106
|
+
},
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Convenience: complete + JSON.parse. Adds a "return ONLY valid JSON"
|
|
110
|
+
* suffix to systemPrompt. On parse failure, retries ONCE with a stronger
|
|
111
|
+
* instruction. Further failures throw — the user can retry by clicking.
|
|
112
|
+
*/
|
|
113
|
+
async completeJson(opts) {
|
|
114
|
+
const suffix = '\\nReturn ONLY valid JSON, no prose, no markdown fences.';
|
|
115
|
+
const first = await ai.complete({
|
|
116
|
+
...opts,
|
|
117
|
+
systemPrompt: (opts.systemPrompt || '') + suffix,
|
|
118
|
+
});
|
|
119
|
+
try { return { ...first, parsed: JSON.parse(first.content) }; }
|
|
120
|
+
catch (e) {
|
|
121
|
+
// One retry with a stronger instruction.
|
|
122
|
+
const retry = await ai.complete({
|
|
123
|
+
...opts,
|
|
124
|
+
systemPrompt: (opts.systemPrompt || '') + suffix + '\\nIMPORTANT: your previous attempt was not valid JSON. Output ONLY the JSON object, starting with { and ending with }. No other text.',
|
|
125
|
+
temperature: typeof opts.temperature === 'number' ? Math.max(0, opts.temperature - 0.3) : 0.2,
|
|
126
|
+
});
|
|
127
|
+
try { return { ...retry, parsed: JSON.parse(retry.content) }; }
|
|
128
|
+
catch (e2) {
|
|
129
|
+
const err = new Error('AI returned invalid JSON twice. Original response: ' + retry.content.slice(0, 200));
|
|
130
|
+
err.code = 'JSON_PARSE_FAILED';
|
|
131
|
+
throw err;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
},
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* List the models the user's account can hit. Cached 1 hour.
|
|
138
|
+
*/
|
|
139
|
+
async models() {
|
|
140
|
+
const now = Date.now();
|
|
141
|
+
if (_modelsCache && (now - _modelsCache.t) < 3600_000) return _modelsCache.v;
|
|
142
|
+
const r = await authFetch('/v1/openrouter/models');
|
|
143
|
+
if (!r || !r.ok) throw new Error((r && r.error && r.error.message) || 'Failed to list models');
|
|
144
|
+
const v = r.data && r.data.models ? r.data.models : [];
|
|
145
|
+
_modelsCache = { v, t: now };
|
|
146
|
+
return v;
|
|
147
|
+
},
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Today's spend snapshot (owner-only). Useful for "AI used: $0.04 / $1.00".
|
|
151
|
+
*/
|
|
152
|
+
async usage() {
|
|
153
|
+
const r = await authFetch('/v1/ai/usage');
|
|
154
|
+
if (!r || !r.ok) throw new Error((r && r.error && r.error.message) || 'Failed to read usage');
|
|
155
|
+
return r.data;
|
|
156
|
+
},
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Clear browser-side caches. Call after the user toggles their key/budget.
|
|
160
|
+
*/
|
|
161
|
+
invalidateCache() {
|
|
162
|
+
_availCache = null;
|
|
163
|
+
_modelsCache = null;
|
|
164
|
+
},
|
|
165
|
+
};
|
|
166
|
+
|
|
167
|
+
if (!global.AIMEAT) global.AIMEAT = {};
|
|
168
|
+
global.AIMEAT.ai = ai;
|
|
169
|
+
|
|
170
|
+
})(typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : this);
|
|
171
|
+
`;
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=lib-ai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lib-ai.js","sourceRoot":"","sources":["../../../src/routes/lib-ai.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,WAAW,CAAC,MAAoB;IAC9C,OAAO;WACE,MAAM,CAAC,MAAM,iBAAiB,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkJhE,CAAC;AACF,CAAC"}
|
|
@@ -4,6 +4,10 @@
|
|
|
4
4
|
* @structure libsRouter route registration; aimeatAuthLib browser auth/session helper; individual library imports delegated to lib-* modules.
|
|
5
5
|
* @usage app.use(libsRouter(config, storage)) from the server setup.
|
|
6
6
|
* @version-history
|
|
7
|
+
* v1.10.0 - 2026-05-29 - Add aimeat-ai.js — AI completion using the user's
|
|
8
|
+
* OpenRouter key (apps reach /v1/ai/complete; budget + per-app quotas
|
|
9
|
+
* enforced server-side). Registered both as a route and in the /v1/libs
|
|
10
|
+
* catalogue.
|
|
7
11
|
* v1.9.8 - 2026-05-28 - Modal submit button now reads "Sign In / Register" to surface upsert behavior.
|
|
8
12
|
* v1.9.7 - 2026-05-28 - Disable browser caching for generated helper libraries.
|
|
9
13
|
* v1.9.6 - 2026-05-28 - Handle dev-mode auth reset responses in browser auth registration.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"libs.d.ts","sourceRoot":"","sources":["../../../src/routes/libs.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"libs.d.ts","sourceRoot":"","sources":["../../../src/routes/libs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,MAAM,EAAiB,MAAM,SAAS,CAAC;AAChD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAkBvD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,GAAG,MAAM,CA2L1E"}
|
package/dist/src/routes/libs.js
CHANGED
|
@@ -4,6 +4,10 @@
|
|
|
4
4
|
* @structure libsRouter route registration; aimeatAuthLib browser auth/session helper; individual library imports delegated to lib-* modules.
|
|
5
5
|
* @usage app.use(libsRouter(config, storage)) from the server setup.
|
|
6
6
|
* @version-history
|
|
7
|
+
* v1.10.0 - 2026-05-29 - Add aimeat-ai.js — AI completion using the user's
|
|
8
|
+
* OpenRouter key (apps reach /v1/ai/complete; budget + per-app quotas
|
|
9
|
+
* enforced server-side). Registered both as a route and in the /v1/libs
|
|
10
|
+
* catalogue.
|
|
7
11
|
* v1.9.8 - 2026-05-28 - Modal submit button now reads "Sign In / Register" to surface upsert behavior.
|
|
8
12
|
* v1.9.7 - 2026-05-28 - Disable browser caching for generated helper libraries.
|
|
9
13
|
* v1.9.6 - 2026-05-28 - Handle dev-mode auth reset responses in browser auth registration.
|
|
@@ -18,6 +22,7 @@ import { aimeatTunnelLib } from './lib-tunnel.js';
|
|
|
18
22
|
import { aimeatAudioLib } from './lib-audio.js';
|
|
19
23
|
import { aimeatSpeechLib } from './lib-speech.js';
|
|
20
24
|
import { aimeatCapabilitiesLib } from './lib-capabilities.js';
|
|
25
|
+
import { aimeatAiLib } from './lib-ai.js';
|
|
21
26
|
function sendJavascriptLibrary(res, source) {
|
|
22
27
|
res.set('Cache-Control', 'no-store');
|
|
23
28
|
res.set('Pragma', 'no-cache');
|
|
@@ -70,6 +75,10 @@ export function libsRouter(config, _storage) {
|
|
|
70
75
|
router.get('/v1/libs/aimeat-capabilities.js', (_req, res) => {
|
|
71
76
|
sendJavascriptLibrary(res, aimeatCapabilitiesLib(config));
|
|
72
77
|
});
|
|
78
|
+
// GET /v1/libs/aimeat-ai.js — AI completion using the user's OpenRouter key
|
|
79
|
+
router.get('/v1/libs/aimeat-ai.js', (_req, res) => {
|
|
80
|
+
sendJavascriptLibrary(res, aimeatAiLib(config));
|
|
81
|
+
});
|
|
73
82
|
// GET /v1/libs/ — List available libraries
|
|
74
83
|
router.get('/v1/libs', (_req, res) => {
|
|
75
84
|
res.json({
|
|
@@ -152,6 +161,14 @@ export function libsRouter(config, _storage) {
|
|
|
152
161
|
size_estimate: '~15KB',
|
|
153
162
|
include: `<script src="${config.baseUrl}/v1/libs/aimeat-speech.js"></script>`,
|
|
154
163
|
},
|
|
164
|
+
{
|
|
165
|
+
name: 'aimeat-ai',
|
|
166
|
+
url: '/v1/libs/aimeat-ai.js',
|
|
167
|
+
description: 'AI completion using the user\'s configured OpenRouter key. Per-user daily budget and per-app quotas enforce safe spend.',
|
|
168
|
+
size_estimate: '~4KB',
|
|
169
|
+
include: `<script src="${config.baseUrl}/v1/libs/aimeat-ai.js"></script>`,
|
|
170
|
+
requires: 'aimeat-auth',
|
|
171
|
+
},
|
|
155
172
|
],
|
|
156
173
|
});
|
|
157
174
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"libs.js","sourceRoot":"","sources":["../../../src/routes/libs.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"libs.js","sourceRoot":"","sources":["../../../src/routes/libs.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routes-loader.d.ts","sourceRoot":"","sources":["../../../src/server-bootstrap/routes-loader.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AACtF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"routes-loader.d.ts","sourceRoot":"","sources":["../../../src/server-bootstrap/routes-loader.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AACtF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AA+G1D,MAAM,WAAW,kBAAkB;IACjC,cAAc,EAAE,OAAO,CAAC,cAAc,CAAC;IACvC,cAAc,EAAE,OAAO,CAAC,cAAc,CAAC;IACvC,gBAAgB,EAAE;QAChB,GAAG,EAAE,MAAM,gBAAgB,CAAC;QAC5B,GAAG,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;KACxC,CAAC;IACF,UAAU,EAAE,gBAAgB,CAAC;IAC7B,aAAa,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAC1C,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC7B,gBAAgB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC/C,aAAa,EAAE,aAAa,GAAG,IAAI,CAAC;IACpC,0BAA0B,EAAE,0BAA0B,GAAG,IAAI,CAAC;IAC9D,SAAS,EAAE,SAAS,CAAC;IACrB,wBAAwB,EAAE,MAAM,IAAI,CAAC;CACtC;AAED,MAAM,WAAW,iBAAiB;IAChC,eAAe,EAAE,eAAe,GAAG,IAAI,CAAC;CACzC;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,GAAG,EAAE,OAAO,CAAC,OAAO,EACpB,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,iBAAiB,CAAC,CA8T5B"}
|