@rubytech/create-realagent 1.0.832 → 1.0.834

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 (97) hide show
  1. package/dist/index.js +131 -9
  2. package/package.json +1 -1
  3. package/payload/platform/lib/admins-write/dist/index.d.ts +87 -0
  4. package/payload/platform/lib/admins-write/dist/index.d.ts.map +1 -0
  5. package/payload/platform/lib/admins-write/dist/index.js +248 -0
  6. package/payload/platform/lib/admins-write/dist/index.js.map +1 -0
  7. package/payload/platform/lib/admins-write/src/index.ts +311 -0
  8. package/payload/platform/lib/admins-write/tsconfig.json +8 -0
  9. package/payload/platform/neo4j/migrations/009-conversation-archive-title.ts +197 -0
  10. package/payload/platform/neo4j/schema.cypher +1 -1
  11. package/payload/platform/package.json +2 -2
  12. package/payload/platform/plugins/admin/PLUGIN.md +1 -1
  13. package/payload/platform/plugins/admin/mcp/dist/index.js +37 -44
  14. package/payload/platform/plugins/admin/mcp/dist/index.js.map +1 -1
  15. package/payload/platform/plugins/docs/references/internals.md +4 -3
  16. package/payload/platform/plugins/memory/bin/conversation-archive-ingest.mjs +215 -43
  17. package/payload/platform/plugins/memory/bin/conversation-archive-ingest.sh +7 -2
  18. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/llm-classifier.test.js +75 -0
  19. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/llm-classifier.test.js.map +1 -1
  20. package/payload/platform/plugins/memory/mcp/dist/lib/llm-classifier.d.ts +16 -10
  21. package/payload/platform/plugins/memory/mcp/dist/lib/llm-classifier.d.ts.map +1 -1
  22. package/payload/platform/plugins/memory/mcp/dist/lib/llm-classifier.js +155 -100
  23. package/payload/platform/plugins/memory/mcp/dist/lib/llm-classifier.js.map +1 -1
  24. package/payload/platform/plugins/memory/mcp/dist/lib/llm-ranker.d.ts +13 -5
  25. package/payload/platform/plugins/memory/mcp/dist/lib/llm-ranker.d.ts.map +1 -1
  26. package/payload/platform/plugins/memory/mcp/dist/lib/llm-ranker.js +53 -59
  27. package/payload/platform/plugins/memory/mcp/dist/lib/llm-ranker.js.map +1 -1
  28. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-ingest.test.js +9 -0
  29. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-ingest.test.js.map +1 -1
  30. package/payload/platform/plugins/memory/mcp/dist/tools/memory-ingest.d.ts +24 -7
  31. package/payload/platform/plugins/memory/mcp/dist/tools/memory-ingest.d.ts.map +1 -1
  32. package/payload/platform/plugins/memory/mcp/dist/tools/memory-ingest.js +47 -11
  33. package/payload/platform/plugins/memory/mcp/dist/tools/memory-ingest.js.map +1 -1
  34. package/payload/platform/plugins/memory/skills/conversation-archive/SKILL.md +45 -8
  35. package/payload/platform/scripts/lib/resolve-account-dir.sh +3 -1
  36. package/payload/platform/scripts/migrate-import.sh +3 -1
  37. package/payload/platform/scripts/seed-neo4j.sh +13 -3
  38. package/payload/server/chunk-CRAIGEXY.js +654 -0
  39. package/payload/server/chunk-GK4WHM3H.js +9961 -0
  40. package/payload/server/chunk-I2NOLBQA.js +2123 -0
  41. package/payload/server/chunk-IVTESKFR.js +9961 -0
  42. package/payload/server/chunk-KD3XP4IK.js +1116 -0
  43. package/payload/server/chunk-KKGGT5RH.js +654 -0
  44. package/payload/server/chunk-MRJGG6CS.js +2124 -0
  45. package/payload/server/chunk-OJZPS4BL.js +367 -0
  46. package/payload/server/chunk-ZVW5XKPU.js +1116 -0
  47. package/payload/server/client-pool-FM3YJWV5.js +32 -0
  48. package/payload/server/client-pool-J5BCVVI2.js +32 -0
  49. package/payload/server/cloudflare-task-tracker-FSPEJOTH.js +19 -0
  50. package/payload/server/cloudflare-task-tracker-XCUO4N74.js +19 -0
  51. package/payload/server/maxy-edge.js +6 -5
  52. package/payload/server/neo4j-migrations-5AN2U3YO.js +664 -0
  53. package/payload/server/neo4j-migrations-XP7XDVPX.js +664 -0
  54. package/payload/server/public/assets/{Checkbox-CTGhpDKq.js → Checkbox-Bq6ORjz2.js} +1 -1
  55. package/payload/server/public/assets/admin-CstEkw-G.js +352 -0
  56. package/payload/server/public/assets/data-DwZZ7qbH.js +1 -0
  57. package/payload/server/public/assets/graph-DceEv42K.js +1 -0
  58. package/payload/server/public/assets/{jsx-runtime-D4WovFYk.css → jsx-runtime-DidQeNoZ.css} +1 -1
  59. package/payload/server/public/assets/page-Bpi_jPw6.js +50 -0
  60. package/payload/server/public/assets/{page-DkBfWy4C.js → page-CFWoVkgV.js} +1 -1
  61. package/payload/server/public/assets/{public-BdVIVpv8.js → public-BWMwq5Jj.js} +1 -1
  62. package/payload/server/public/assets/{useAdminFetch-DmHu0oCx.js → useAdminFetch-B93ig7ef.js} +1 -1
  63. package/payload/server/public/assets/{useVoiceRecorder-CSc_hxjV.js → useVoiceRecorder-Cb0nAtOo.js} +1 -1
  64. package/payload/server/public/data.html +5 -5
  65. package/payload/server/public/graph.html +6 -6
  66. package/payload/server/public/index.html +8 -8
  67. package/payload/server/public/public.html +5 -5
  68. package/payload/server/server.js +376 -167
  69. package/payload/platform/plugins/admin/mcp/dist/lib/review-tools.d.ts +0 -31
  70. package/payload/platform/plugins/admin/mcp/dist/lib/review-tools.d.ts.map +0 -1
  71. package/payload/platform/plugins/admin/mcp/dist/lib/review-tools.js +0 -666
  72. package/payload/platform/plugins/admin/mcp/dist/lib/review-tools.js.map +0 -1
  73. package/payload/platform/plugins/memory/mcp/dist/lib/semantic-chunker.d.ts +0 -61
  74. package/payload/platform/plugins/memory/mcp/dist/lib/semantic-chunker.d.ts.map +0 -1
  75. package/payload/platform/plugins/memory/mcp/dist/lib/semantic-chunker.js +0 -266
  76. package/payload/platform/plugins/memory/mcp/dist/lib/semantic-chunker.js.map +0 -1
  77. package/payload/platform/plugins/memory/mcp/dist/tools/whatsapp-export-insight-pass.d.ts +0 -27
  78. package/payload/platform/plugins/memory/mcp/dist/tools/whatsapp-export-insight-pass.d.ts.map +0 -1
  79. package/payload/platform/plugins/memory/mcp/dist/tools/whatsapp-export-insight-pass.js +0 -477
  80. package/payload/platform/plugins/memory/mcp/dist/tools/whatsapp-export-insight-pass.js.map +0 -1
  81. package/payload/platform/plugins/memory/mcp/dist/tools/whatsapp-export-insight-write.d.ts +0 -27
  82. package/payload/platform/plugins/memory/mcp/dist/tools/whatsapp-export-insight-write.d.ts.map +0 -1
  83. package/payload/platform/plugins/memory/mcp/dist/tools/whatsapp-export-insight-write.js +0 -160
  84. package/payload/platform/plugins/memory/mcp/dist/tools/whatsapp-export-insight-write.js.map +0 -1
  85. package/payload/platform/plugins/memory/mcp/dist/tools/whatsapp-export-parse.d.ts +0 -10
  86. package/payload/platform/plugins/memory/mcp/dist/tools/whatsapp-export-parse.d.ts.map +0 -1
  87. package/payload/platform/plugins/memory/mcp/dist/tools/whatsapp-export-parse.js +0 -29
  88. package/payload/platform/plugins/memory/mcp/dist/tools/whatsapp-export-parse.js.map +0 -1
  89. package/payload/platform/plugins/memory/mcp/dist/tools/whatsapp-export-preview.d.ts +0 -28
  90. package/payload/platform/plugins/memory/mcp/dist/tools/whatsapp-export-preview.d.ts.map +0 -1
  91. package/payload/platform/plugins/memory/mcp/dist/tools/whatsapp-export-preview.js +0 -34
  92. package/payload/platform/plugins/memory/mcp/dist/tools/whatsapp-export-preview.js.map +0 -1
  93. package/payload/server/public/assets/admin-BNwPsMhJ.js +0 -352
  94. package/payload/server/public/assets/data-Y77FLKjs.js +0 -1
  95. package/payload/server/public/assets/graph-N_Bw-8oT.js +0 -1
  96. package/payload/server/public/assets/page-BKLGP-th.js +0 -50
  97. /package/payload/server/public/assets/{jsx-runtime-DkaAusaX.js → jsx-runtime-DH5S-MwB.js} +0 -0
@@ -0,0 +1,367 @@
1
+ // app/lib/paths.ts
2
+ import { homedir } from "os";
3
+ import { resolve, join } from "path";
4
+ import { existsSync, readFileSync } from "fs";
5
+ var configDirName = ".maxy";
6
+ var commercialMode = false;
7
+ var platformRoot = process.env.MAXY_PLATFORM_ROOT;
8
+ if (platformRoot) {
9
+ const brandPath = join(platformRoot, "config", "brand.json");
10
+ if (existsSync(brandPath)) {
11
+ try {
12
+ const brand = JSON.parse(readFileSync(brandPath, "utf-8"));
13
+ if (brand.configDir) configDirName = brand.configDir;
14
+ if (brand.commercialMode === true) commercialMode = true;
15
+ } catch {
16
+ }
17
+ }
18
+ }
19
+ var MAXY_DIR = resolve(homedir(), configDirName);
20
+ var COMMERCIAL_MODE = commercialMode;
21
+ var PLATFORM_ROOT = process.env.MAXY_PLATFORM_ROOT ?? resolve(process.cwd(), "..");
22
+ var USERS_FILE = resolve(MAXY_DIR, "users.json");
23
+ var LOG_DIR = resolve(MAXY_DIR, "logs");
24
+ var BIN_DIR = resolve(MAXY_DIR, "bin");
25
+ var REMOTE_PASSWORD_FILE = resolve(MAXY_DIR, ".remote-password");
26
+ var REMOTE_SESSION_SECRET_FILE = resolve(MAXY_DIR, "credentials", "remote-session-secret");
27
+ var TELEGRAM_WEBHOOK_SECRET_FILE = resolve(MAXY_DIR, ".telegram-webhook-secret");
28
+ var TELEGRAM_ADMIN_WEBHOOK_SECRET_FILE = resolve(MAXY_DIR, ".telegram-admin-webhook-secret");
29
+ var CLAUDE_CREDENTIALS_FILE = resolve(homedir(), ".claude", ".credentials.json");
30
+
31
+ // app/lib/claude-agent/account.ts
32
+ import { resolve as resolve2 } from "path";
33
+ import { readFileSync as readFileSync3, readdirSync, existsSync as existsSync3, statSync } from "fs";
34
+
35
+ // ../lib/brand-templating/src/index.ts
36
+ import { join as join2 } from "path";
37
+ import { existsSync as existsSync2, readFileSync as readFileSync2 } from "fs";
38
+ var PLACEHOLDER = "{{productName}}";
39
+ var cachedProductName = null;
40
+ function brandJsonPath() {
41
+ const platformRoot2 = process.env.MAXY_PLATFORM_ROOT;
42
+ if (!platformRoot2) {
43
+ throw new Error(
44
+ "[skill-loader] MAXY_PLATFORM_ROOT not set \u2014 cannot resolve brand.json"
45
+ );
46
+ }
47
+ return join2(platformRoot2, "config", "brand.json");
48
+ }
49
+ function getBrandProductName() {
50
+ if (cachedProductName !== null) return cachedProductName;
51
+ const path = brandJsonPath();
52
+ if (!existsSync2(path)) {
53
+ throw new Error(`[skill-loader] brand.json missing at ${path}`);
54
+ }
55
+ let parsed;
56
+ try {
57
+ parsed = JSON.parse(readFileSync2(path, "utf-8"));
58
+ } catch (err) {
59
+ throw new Error(
60
+ `[skill-loader] brand.json unreadable at ${path}: ${err instanceof Error ? err.message : String(err)}`
61
+ );
62
+ }
63
+ const value = parsed.productName;
64
+ if (typeof value !== "string" || value.trim() === "") {
65
+ throw new Error(
66
+ `[skill-loader] brand.json at ${path} has missing or empty productName`
67
+ );
68
+ }
69
+ cachedProductName = value;
70
+ return value;
71
+ }
72
+ function substituteBrandPlaceholders(content, sourcePath) {
73
+ if (!content.includes(PLACEHOLDER)) return content;
74
+ let productName;
75
+ try {
76
+ productName = getBrandProductName();
77
+ } catch (err) {
78
+ console.error(
79
+ `[skill-loader] ERROR: brand.json missing \u2014 cannot resolve productName for skill ${sourcePath}`
80
+ );
81
+ throw err;
82
+ }
83
+ const occurrences = content.split(PLACEHOLDER).length - 1;
84
+ const substituted = content.split(PLACEHOLDER).join(productName);
85
+ console.log(
86
+ `[skill-loader] brand-substituted productName=${productName} skill=${sourcePath} occurrences=${occurrences}`
87
+ );
88
+ return substituted;
89
+ }
90
+
91
+ // app/lib/claude-agent/account.ts
92
+ var PLATFORM_ROOT2 = process.env.MAXY_PLATFORM_ROOT ?? resolve2(process.cwd(), "..");
93
+ var ACCOUNTS_DIR = resolve2(PLATFORM_ROOT2, "..", "data/accounts");
94
+ if (!existsSync3(PLATFORM_ROOT2)) {
95
+ throw new Error(
96
+ `PLATFORM_ROOT does not exist: ${PLATFORM_ROOT2}
97
+ Set the MAXY_PLATFORM_ROOT environment variable to the absolute path of the platform directory.`
98
+ );
99
+ }
100
+ function hasStubAccountDir() {
101
+ if (!existsSync3(ACCOUNTS_DIR)) return { stub: false, dirs: [] };
102
+ const stubs = [];
103
+ const entries = readdirSync(ACCOUNTS_DIR, { withFileTypes: true });
104
+ for (const entry of entries) {
105
+ if (!entry.isDirectory()) continue;
106
+ if (entry.name.startsWith(".")) continue;
107
+ const configPath = resolve2(ACCOUNTS_DIR, entry.name, "account.json");
108
+ if (!existsSync3(configPath)) stubs.push(entry.name);
109
+ }
110
+ return { stub: stubs.length > 0, dirs: stubs };
111
+ }
112
+ function resolveAccount() {
113
+ if (!existsSync3(ACCOUNTS_DIR)) return null;
114
+ let usersJsonUserId = null;
115
+ if (existsSync3(USERS_FILE)) {
116
+ try {
117
+ const raw = readFileSync3(USERS_FILE, "utf-8").trim();
118
+ if (raw) {
119
+ const users = JSON.parse(raw);
120
+ if (users.length > 0) {
121
+ usersJsonUserId = users[0].userId;
122
+ }
123
+ }
124
+ } catch {
125
+ }
126
+ }
127
+ const entries = readdirSync(ACCOUNTS_DIR, { withFileTypes: true });
128
+ let fallback = null;
129
+ for (const entry of entries) {
130
+ if (!entry.isDirectory()) continue;
131
+ const configPath = resolve2(ACCOUNTS_DIR, entry.name, "account.json");
132
+ if (!existsSync3(configPath)) continue;
133
+ const raw = readFileSync3(configPath, "utf-8");
134
+ let config;
135
+ try {
136
+ config = JSON.parse(raw);
137
+ } catch {
138
+ console.error(`[maxy] account.json is corrupt at ${configPath} \u2014 skipping`);
139
+ continue;
140
+ }
141
+ if (!config.adminModel || !config.publicModel) {
142
+ throw new Error(
143
+ `[maxy] account.json at ${configPath} is missing required model fields (adminModel / publicModel). Update account.json with valid model identifiers.`
144
+ );
145
+ }
146
+ const result = {
147
+ accountId: config.accountId,
148
+ accountDir: resolve2(ACCOUNTS_DIR, entry.name),
149
+ config
150
+ };
151
+ if (usersJsonUserId && config.admins?.some((a) => a.userId === usersJsonUserId)) {
152
+ return result;
153
+ }
154
+ if (!fallback) {
155
+ fallback = result;
156
+ }
157
+ }
158
+ if (usersJsonUserId && fallback) {
159
+ console.warn(
160
+ `[maxy] resolveAccount: no account matches users.json userId ${usersJsonUserId} \u2014 falling back to ${fallback.accountId}`
161
+ );
162
+ }
163
+ return fallback;
164
+ }
165
+ function readAgentFile(accountDir, agentName, filename) {
166
+ const filePath = resolve2(accountDir, "agents", agentName, filename);
167
+ if (!existsSync3(filePath)) return null;
168
+ const raw = readFileSync3(filePath, "utf-8");
169
+ if (filename.endsWith(".md")) {
170
+ return substituteBrandPlaceholders(raw, filePath);
171
+ }
172
+ return raw;
173
+ }
174
+ function readIdentity(accountDir, agentName) {
175
+ return readAgentFile(accountDir, agentName, "IDENTITY.md");
176
+ }
177
+ var RESERVED_SLUGS = /* @__PURE__ */ new Set(["admin", "api", "assets", "brand", "bot", "privacy"]);
178
+ var SLUG_PATTERN = /^[a-z][a-z0-9-]{2,49}$/;
179
+ function validateAgentSlug(slug) {
180
+ if (!SLUG_PATTERN.test(slug)) return false;
181
+ if (RESERVED_SLUGS.has(slug)) return false;
182
+ return true;
183
+ }
184
+ function resolveDefaultAgentSlug(accountDir) {
185
+ const configPath = resolve2(accountDir, "account.json");
186
+ if (!existsSync3(configPath)) {
187
+ console.error("[agent-resolve] account.json not found \u2014 cannot resolve defaultAgent");
188
+ return null;
189
+ }
190
+ let config;
191
+ try {
192
+ config = JSON.parse(readFileSync3(configPath, "utf-8"));
193
+ } catch (err) {
194
+ console.error("[agent-resolve] failed to read account.json:", err);
195
+ return null;
196
+ }
197
+ if (!config.defaultAgent) {
198
+ console.error("[agent-resolve] defaultAgent not configured in account.json \u2014 set it via the connect-whatsapp skill");
199
+ return null;
200
+ }
201
+ const agentConfigPath = resolve2(accountDir, "agents", config.defaultAgent, "config.json");
202
+ if (!existsSync3(agentConfigPath)) {
203
+ console.error(`[agent-resolve] defaultAgent="${config.defaultAgent}" has no config.json at ${agentConfigPath}`);
204
+ return null;
205
+ }
206
+ return config.defaultAgent;
207
+ }
208
+ function estimateTokens(text) {
209
+ return Math.ceil(text.length / 4);
210
+ }
211
+ function resolveAgentConfig(accountDir, agentName) {
212
+ let model = null;
213
+ let plugins = null;
214
+ let status = null;
215
+ let displayName = null;
216
+ let image = null;
217
+ let imageShape = null;
218
+ let showAgentName = false;
219
+ let liveMemory = false;
220
+ let knowledgeKeywords = null;
221
+ let accessMode = "open";
222
+ const MAX_KNOWLEDGE_KEYWORDS = 5;
223
+ const configRaw = readAgentFile(accountDir, agentName, "config.json");
224
+ if (configRaw) {
225
+ let parsed;
226
+ try {
227
+ parsed = JSON.parse(configRaw);
228
+ } catch {
229
+ console.warn(`[agent-config] ${agentName}/config.json: invalid JSON \u2014 using defaults`);
230
+ parsed = {};
231
+ }
232
+ model = typeof parsed.model === "string" ? parsed.model : null;
233
+ plugins = Array.isArray(parsed.plugins) ? parsed.plugins : null;
234
+ status = typeof parsed.status === "string" ? parsed.status : null;
235
+ displayName = typeof parsed.displayName === "string" ? parsed.displayName : null;
236
+ image = typeof parsed.image === "string" ? parsed.image : null;
237
+ if (typeof parsed.imageShape === "string" && ["circle", "rounded"].includes(parsed.imageShape)) {
238
+ imageShape = parsed.imageShape;
239
+ }
240
+ if (parsed.showAgentName === true) {
241
+ showAgentName = true;
242
+ } else if (parsed.showAgentName === "none") {
243
+ showAgentName = "none";
244
+ }
245
+ if (image || imageShape || showAgentName) {
246
+ console.log(`[agent-config] ${agentName}: image=${image || "(none)"} imageShape=${imageShape || "(none)"} showAgentName=${showAgentName}`);
247
+ }
248
+ if (typeof parsed.accessMode === "string" && ["gated", "paid"].includes(parsed.accessMode)) {
249
+ accessMode = parsed.accessMode;
250
+ }
251
+ if (typeof parsed.liveMemory === "boolean") {
252
+ liveMemory = parsed.liveMemory;
253
+ } else if (typeof parsed.liveMemory === "string") {
254
+ const lower = parsed.liveMemory.toLowerCase();
255
+ if (lower === "true") {
256
+ liveMemory = true;
257
+ console.warn(`[agent-config] ${agentName}: liveMemory is string "true" \u2014 coercing to boolean. Fix the config to use a boolean value.`);
258
+ } else if (lower === "false") {
259
+ liveMemory = false;
260
+ console.warn(`[agent-config] ${agentName}: liveMemory is string "false" \u2014 coercing to boolean. Fix the config to use a boolean value.`);
261
+ } else {
262
+ throw new Error(`[agent-config] ${agentName}: liveMemory has invalid string value "${parsed.liveMemory}" \u2014 expected boolean or "true"/"false"`);
263
+ }
264
+ } else if (parsed.liveMemory !== void 0 && parsed.liveMemory !== null) {
265
+ throw new Error(`[agent-config] ${agentName}: liveMemory has invalid type ${typeof parsed.liveMemory} \u2014 expected boolean or "true"/"false"`);
266
+ }
267
+ if (Array.isArray(parsed.knowledgeKeywords) && parsed.knowledgeKeywords.length > 0) {
268
+ const filtered = parsed.knowledgeKeywords.filter((k) => typeof k === "string" && k.trim()).map((k) => k.replace(/,/g, "").trim().toLowerCase()).filter(Boolean);
269
+ if (filtered.length > MAX_KNOWLEDGE_KEYWORDS) {
270
+ console.warn(`[agent-config] ${agentName}: knowledgeKeywords has ${filtered.length} entries \u2014 capping at ${MAX_KNOWLEDGE_KEYWORDS}`);
271
+ }
272
+ knowledgeKeywords = filtered.length > 0 ? filtered.slice(0, MAX_KNOWLEDGE_KEYWORDS) : null;
273
+ }
274
+ }
275
+ let knowledge = null;
276
+ let knowledgeBaked = false;
277
+ const agentDir = resolve2(accountDir, "agents", agentName);
278
+ const knowledgePath = resolve2(agentDir, "KNOWLEDGE.md");
279
+ const summaryPath = resolve2(agentDir, "KNOWLEDGE-SUMMARY.md");
280
+ const hasKnowledge = existsSync3(knowledgePath);
281
+ const hasSummary = existsSync3(summaryPath);
282
+ if (hasKnowledge && hasSummary) {
283
+ const knowledgeMtime = statSync(knowledgePath).mtimeMs;
284
+ const summaryMtime = statSync(summaryPath).mtimeMs;
285
+ if (summaryMtime >= knowledgeMtime) {
286
+ knowledge = readFileSync3(summaryPath, "utf-8");
287
+ } else {
288
+ console.warn(`[agent-config] ${agentName}: KNOWLEDGE-SUMMARY.md is stale (KNOWLEDGE.md is newer) \u2014 using full knowledge`);
289
+ knowledge = readFileSync3(knowledgePath, "utf-8");
290
+ }
291
+ knowledgeBaked = true;
292
+ } else if (hasKnowledge) {
293
+ knowledge = readFileSync3(knowledgePath, "utf-8");
294
+ knowledgeBaked = true;
295
+ }
296
+ let budget = null;
297
+ const identityRaw = readAgentFile(accountDir, agentName, "IDENTITY.md");
298
+ const soulRaw = readAgentFile(accountDir, agentName, "SOUL.md");
299
+ if (identityRaw || soulRaw || knowledge) {
300
+ const identityTokens = identityRaw ? estimateTokens(identityRaw) : 0;
301
+ const soulTokens = soulRaw ? estimateTokens(soulRaw) : 0;
302
+ const knowledgeTokens = knowledge ? estimateTokens(knowledge) : 0;
303
+ budget = {
304
+ identity: identityTokens,
305
+ soul: soulTokens,
306
+ knowledge: knowledgeTokens,
307
+ plugins: 0,
308
+ total: identityTokens + soulTokens + knowledgeTokens
309
+ };
310
+ }
311
+ return { model, plugins, status, displayName, image, imageShape, showAgentName, knowledge, knowledgeBaked, liveMemory, knowledgeKeywords, budget, accessMode };
312
+ }
313
+ function getDefaultAccountId() {
314
+ return resolveAccount()?.accountId ?? null;
315
+ }
316
+ function resolveUserAccounts(userId) {
317
+ if (!existsSync3(ACCOUNTS_DIR)) return [];
318
+ const results = [];
319
+ const entries = readdirSync(ACCOUNTS_DIR, { withFileTypes: true });
320
+ for (const entry of entries) {
321
+ if (!entry.isDirectory()) continue;
322
+ const configPath = resolve2(ACCOUNTS_DIR, entry.name, "account.json");
323
+ if (!existsSync3(configPath)) continue;
324
+ let config;
325
+ try {
326
+ config = JSON.parse(readFileSync3(configPath, "utf-8"));
327
+ } catch {
328
+ console.error(`[session] account.json corrupt at ${configPath} \u2014 skipping`);
329
+ continue;
330
+ }
331
+ const adminEntry = config.admins?.find((a) => a.userId === userId);
332
+ if (adminEntry) {
333
+ results.push({
334
+ accountId: config.accountId,
335
+ accountDir: resolve2(ACCOUNTS_DIR, entry.name),
336
+ config,
337
+ role: adminEntry.role
338
+ });
339
+ }
340
+ }
341
+ return results;
342
+ }
343
+
344
+ export {
345
+ MAXY_DIR,
346
+ COMMERCIAL_MODE,
347
+ USERS_FILE,
348
+ LOG_DIR,
349
+ BIN_DIR,
350
+ REMOTE_PASSWORD_FILE,
351
+ REMOTE_SESSION_SECRET_FILE,
352
+ TELEGRAM_WEBHOOK_SECRET_FILE,
353
+ TELEGRAM_ADMIN_WEBHOOK_SECRET_FILE,
354
+ CLAUDE_CREDENTIALS_FILE,
355
+ substituteBrandPlaceholders,
356
+ PLATFORM_ROOT2 as PLATFORM_ROOT,
357
+ ACCOUNTS_DIR,
358
+ hasStubAccountDir,
359
+ resolveAccount,
360
+ readAgentFile,
361
+ readIdentity,
362
+ validateAgentSlug,
363
+ resolveDefaultAgentSlug,
364
+ resolveAgentConfig,
365
+ getDefaultAccountId,
366
+ resolveUserAccounts
367
+ };