@rubytech/create-realagent 1.0.831 → 1.0.833

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