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.
Files changed (44) hide show
  1. package/dist/locales/en.json +1 -0
  2. package/dist/locales/fi.json +1 -0
  3. package/dist/public/views/profile/agents-tab.js +29 -9
  4. package/dist/public/views/profile/generator-settings.js +124 -0
  5. package/dist/src/cli/connect/auth.js +1 -1
  6. package/dist/src/cli/connect/auth.js.map +1 -1
  7. package/dist/src/cli/connect/mcp/tools/core.d.ts +4 -0
  8. package/dist/src/cli/connect/mcp/tools/core.d.ts.map +1 -1
  9. package/dist/src/cli/connect/mcp/tools/core.js +64 -21
  10. package/dist/src/cli/connect/mcp/tools/core.js.map +1 -1
  11. package/dist/src/cli/connect/mcp/tools/handbook.d.ts +4 -0
  12. package/dist/src/cli/connect/mcp/tools/handbook.d.ts.map +1 -1
  13. package/dist/src/cli/connect/mcp/tools/handbook.js +4 -2
  14. package/dist/src/cli/connect/mcp/tools/handbook.js.map +1 -1
  15. package/dist/src/models/agent-onboarding-schemas.d.ts +1 -1
  16. package/dist/src/models/agent-onboarding-schemas.d.ts.map +1 -1
  17. package/dist/src/models/agent-onboarding-schemas.js +12 -6
  18. package/dist/src/models/agent-onboarding-schemas.js.map +1 -1
  19. package/dist/src/routes/agent-onboarding.d.ts.map +1 -1
  20. package/dist/src/routes/agent-onboarding.js +7 -1
  21. package/dist/src/routes/agent-onboarding.js.map +1 -1
  22. package/dist/src/routes/agent-tasks.d.ts.map +1 -1
  23. package/dist/src/routes/agent-tasks.js +54 -7
  24. package/dist/src/routes/agent-tasks.js.map +1 -1
  25. package/dist/src/routes/ai.d.ts +29 -0
  26. package/dist/src/routes/ai.d.ts.map +1 -0
  27. package/dist/src/routes/ai.js +306 -0
  28. package/dist/src/routes/ai.js.map +1 -0
  29. package/dist/src/routes/lib-ai.d.ts +25 -0
  30. package/dist/src/routes/lib-ai.d.ts.map +1 -0
  31. package/dist/src/routes/lib-ai.js +173 -0
  32. package/dist/src/routes/lib-ai.js.map +1 -0
  33. package/dist/src/routes/libs.d.ts +4 -0
  34. package/dist/src/routes/libs.d.ts.map +1 -1
  35. package/dist/src/routes/libs.js +17 -0
  36. package/dist/src/routes/libs.js.map +1 -1
  37. package/dist/src/server-bootstrap/routes-loader.d.ts.map +1 -1
  38. package/dist/src/server-bootstrap/routes-loader.js +2 -0
  39. package/dist/src/server-bootstrap/routes-loader.js.map +1 -1
  40. package/dist/src/services/openrouter.d.ts +15 -0
  41. package/dist/src/services/openrouter.d.ts.map +1 -1
  42. package/dist/src/services/openrouter.js +12 -1
  43. package/dist/src/services/openrouter.js.map +1 -1
  44. 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;;;;;;;;;GASG;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;AAiBvD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,GAAG,MAAM,CA8K1E"}
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"}
@@ -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":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA44B/B,CAAC;AACF,CAAC"}
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;AA8G1D,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,CA6T5B"}
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"}