@rubytech/create-maxy-code 0.1.419 → 0.1.423
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/package.json +1 -1
- package/payload/platform/package-lock.json +5158 -2922
- package/payload/platform/plugins/admin/hooks/__tests__/prompt-optimiser-compliance.test.sh +22 -0
- package/payload/platform/plugins/admin/hooks/prompt-optimiser-compliance.sh +14 -1
- package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +3 -1
- package/payload/platform/plugins/docs/references/memory-guide.md +2 -0
- package/payload/platform/plugins/memory/PLUGIN.md +3 -0
- package/payload/platform/plugins/memory/skills/conversational-memory/SKILL.md +30 -1
- package/payload/platform/plugins/memory/skills/preference-audit/SKILL.md +50 -0
- package/payload/platform/plugins/whatsapp/PLUGIN.md +3 -1
- package/payload/platform/plugins/whatsapp/mcp/dist/__tests__/resolve-read-account.test.d.ts +2 -0
- package/payload/platform/plugins/whatsapp/mcp/dist/__tests__/resolve-read-account.test.d.ts.map +1 -0
- package/payload/platform/plugins/whatsapp/mcp/dist/__tests__/resolve-read-account.test.js +15 -0
- package/payload/platform/plugins/whatsapp/mcp/dist/__tests__/resolve-read-account.test.js.map +1 -0
- package/payload/platform/plugins/whatsapp/mcp/dist/index.js +4 -3
- package/payload/platform/plugins/whatsapp/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/whatsapp/mcp/dist/resolve-read-account.d.ts +7 -0
- package/payload/platform/plugins/whatsapp/mcp/dist/resolve-read-account.d.ts.map +1 -0
- package/payload/platform/plugins/whatsapp/mcp/dist/resolve-read-account.js +13 -0
- package/payload/platform/plugins/whatsapp/mcp/dist/resolve-read-account.js.map +1 -0
- package/payload/platform/plugins/work/mcp/dist/__tests__/work-create-raised-by-env.test.d.ts +2 -0
- package/payload/platform/plugins/work/mcp/dist/__tests__/work-create-raised-by-env.test.d.ts.map +1 -0
- package/payload/platform/plugins/work/mcp/dist/__tests__/work-create-raised-by-env.test.js +66 -0
- package/payload/platform/plugins/work/mcp/dist/__tests__/work-create-raised-by-env.test.js.map +1 -0
- package/payload/platform/plugins/work/mcp/dist/tools/work-create.d.ts.map +1 -1
- package/payload/platform/plugins/work/mcp/dist/tools/work-create.js +8 -1
- package/payload/platform/plugins/work/mcp/dist/tools/work-create.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/http-server.js +36 -2
- package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/index.js +39 -0
- package/payload/platform/services/claude-session-manager/dist/index.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/passive-dispatch-prune.d.ts +37 -0
- package/payload/platform/services/claude-session-manager/dist/passive-dispatch-prune.d.ts.map +1 -0
- package/payload/platform/services/claude-session-manager/dist/passive-dispatch-prune.js +80 -0
- package/payload/platform/services/claude-session-manager/dist/passive-dispatch-prune.js.map +1 -0
- package/payload/platform/services/claude-session-manager/dist/passive-intake-audit.d.ts +70 -0
- package/payload/platform/services/claude-session-manager/dist/passive-intake-audit.d.ts.map +1 -0
- package/payload/platform/services/claude-session-manager/dist/passive-intake-audit.js +129 -0
- package/payload/platform/services/claude-session-manager/dist/passive-intake-audit.js.map +1 -0
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts +6 -0
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.js +12 -0
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.js.map +1 -1
- package/payload/platform/services/telegram-channel/dist/instructions.d.ts.map +1 -1
- package/payload/platform/services/telegram-channel/dist/instructions.js +30 -50
- package/payload/platform/services/telegram-channel/dist/instructions.js.map +1 -1
- package/payload/platform/services/webchat-channel/dist/instructions.d.ts.map +1 -1
- package/payload/platform/services/webchat-channel/dist/instructions.js +37 -78
- package/payload/platform/services/webchat-channel/dist/instructions.js.map +1 -1
- package/payload/platform/services/whatsapp-channel/dist/notification.d.ts +14 -36
- package/payload/platform/services/whatsapp-channel/dist/notification.d.ts.map +1 -1
- package/payload/platform/services/whatsapp-channel/dist/notification.js +35 -80
- package/payload/platform/services/whatsapp-channel/dist/notification.js.map +1 -1
- package/payload/platform/templates/agents/admin/IDENTITY.md +2 -1
- package/payload/platform/templates/specialists/agents/content-producer.md +4 -0
- package/payload/server/public/assets/{AdminLoginScreens-B1PkOF66.js → AdminLoginScreens-B1P6PrZ3.js} +1 -1
- package/payload/server/public/assets/{AdminShell-D8wNArGQ.js → AdminShell-Y1fHQApK.js} +1 -1
- package/payload/server/public/assets/{Checkbox-Bm9Er726.js → Checkbox-CgCqOslz.js} +1 -1
- package/payload/server/public/assets/{Transcript-CBIyQ8T5.js → Transcript-DZzFjhoq.js} +1 -1
- package/payload/server/public/assets/{admin-CWM9G_yA.js → admin-BRBjJEci.js} +1 -1
- package/payload/server/public/assets/{browser-D8QhNffV.js → browser-ID7iqIi4.js} +1 -1
- package/payload/server/public/assets/{calendar-qob5K4t_.js → calendar-BEQPMTtd.js} +1 -1
- package/payload/server/public/assets/chat-D0GDSWM-.js +1 -0
- package/payload/server/public/assets/chevron-left-A0HYKwGY.js +1 -0
- package/payload/server/public/assets/data-CV38dClT.js +1 -0
- package/payload/server/public/assets/{graph-DZ2HMpIB.js → graph-BK0MjKRy.js} +1 -1
- package/payload/server/public/assets/{graph-labels-BFG4bjXQ.js → graph-labels-BfG6FO25.js} +1 -1
- package/payload/server/public/assets/{maximize-2-DkZ40lSl.js → maximize-2-DrBaKD3z.js} +1 -1
- package/payload/server/public/assets/{operator-FrXrSsBj.js → operator-CnpNyIJ8.js} +1 -1
- package/payload/server/public/assets/{page-CHWMI9Tm.js → page-DC_L-IS1.js} +1 -1
- package/payload/server/public/assets/{page-CXKV01gT.js → page-DKHLflh7.js} +1 -1
- package/payload/server/public/assets/{public-2p1pJ4WF.js → public-ByUJr48E.js} +1 -1
- package/payload/server/public/assets/{rotate-ccw-D3o_bMBA.js → rotate-ccw-D45TbeAI.js} +1 -1
- package/payload/server/public/assets/useSubAccountSwitcher-CCn22f98.css +1 -0
- package/payload/server/public/browser.html +4 -4
- package/payload/server/public/calendar.html +5 -5
- package/payload/server/public/chat.html +9 -9
- package/payload/server/public/data.html +8 -8
- package/payload/server/public/graph.html +9 -9
- package/payload/server/public/index.html +11 -11
- package/payload/server/public/operator.html +11 -11
- package/payload/server/public/public.html +9 -9
- package/payload/server/server.js +171 -63
- package/payload/server/public/assets/chat-BNrxVUF6.js +0 -1
- package/payload/server/public/assets/chevron-left-BQThFVrd.js +0 -1
- package/payload/server/public/assets/data-C-EqNbRi.js +0 -1
- package/payload/server/public/assets/useSubAccountSwitcher-BUvlETHN.css +0 -1
- /package/payload/server/public/assets/{useSubAccountSwitcher-8dLvF3Ux.js → useSubAccountSwitcher-CprHkBnZ.js} +0 -0
|
@@ -5,20 +5,20 @@
|
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
6
|
<title>Maxy</title>
|
|
7
7
|
<link rel="icon" href="/favicon.ico">
|
|
8
|
-
<script type="module" crossorigin src="/assets/admin-
|
|
8
|
+
<script type="module" crossorigin src="/assets/admin-BRBjJEci.js"></script>
|
|
9
9
|
<link rel="modulepreload" crossorigin href="/assets/chunk-CAM3fms7.js">
|
|
10
|
-
<link rel="modulepreload" crossorigin href="/assets/useSubAccountSwitcher-
|
|
11
|
-
<link rel="modulepreload" crossorigin href="/assets/graph-labels-
|
|
12
|
-
<link rel="modulepreload" crossorigin href="/assets/AdminShell-
|
|
10
|
+
<link rel="modulepreload" crossorigin href="/assets/useSubAccountSwitcher-CprHkBnZ.js">
|
|
11
|
+
<link rel="modulepreload" crossorigin href="/assets/graph-labels-BfG6FO25.js">
|
|
12
|
+
<link rel="modulepreload" crossorigin href="/assets/AdminShell-Y1fHQApK.js">
|
|
13
13
|
<link rel="modulepreload" crossorigin href="/assets/admin-types-hioowVct.js">
|
|
14
|
-
<link rel="modulepreload" crossorigin href="/assets/Checkbox-
|
|
15
|
-
<link rel="modulepreload" crossorigin href="/assets/AdminLoginScreens-
|
|
14
|
+
<link rel="modulepreload" crossorigin href="/assets/Checkbox-CgCqOslz.js">
|
|
15
|
+
<link rel="modulepreload" crossorigin href="/assets/AdminLoginScreens-B1P6PrZ3.js">
|
|
16
16
|
<link rel="modulepreload" crossorigin href="/assets/preload-helper-CvXuAEud.js">
|
|
17
|
-
<link rel="modulepreload" crossorigin href="/assets/maximize-2-
|
|
18
|
-
<link rel="modulepreload" crossorigin href="/assets/Transcript-
|
|
19
|
-
<link rel="modulepreload" crossorigin href="/assets/chevron-left-
|
|
20
|
-
<link rel="modulepreload" crossorigin href="/assets/page-
|
|
21
|
-
<link rel="stylesheet" crossorigin href="/assets/useSubAccountSwitcher-
|
|
17
|
+
<link rel="modulepreload" crossorigin href="/assets/maximize-2-DrBaKD3z.js">
|
|
18
|
+
<link rel="modulepreload" crossorigin href="/assets/Transcript-DZzFjhoq.js">
|
|
19
|
+
<link rel="modulepreload" crossorigin href="/assets/chevron-left-A0HYKwGY.js">
|
|
20
|
+
<link rel="modulepreload" crossorigin href="/assets/page-DKHLflh7.js">
|
|
21
|
+
<link rel="stylesheet" crossorigin href="/assets/useSubAccountSwitcher-CCn22f98.css">
|
|
22
22
|
<link rel="stylesheet" crossorigin href="/assets/AdminLoginScreens-CWMpccrR.css">
|
|
23
23
|
<link rel="stylesheet" href="/brand-defaults.css">
|
|
24
24
|
</head>
|
|
@@ -5,20 +5,20 @@
|
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
6
|
<title>Operator — Maxy</title>
|
|
7
7
|
<link rel="icon" href="/favicon.ico">
|
|
8
|
-
<script type="module" crossorigin src="/assets/operator-
|
|
8
|
+
<script type="module" crossorigin src="/assets/operator-CnpNyIJ8.js"></script>
|
|
9
9
|
<link rel="modulepreload" crossorigin href="/assets/chunk-CAM3fms7.js">
|
|
10
|
-
<link rel="modulepreload" crossorigin href="/assets/useSubAccountSwitcher-
|
|
11
|
-
<link rel="modulepreload" crossorigin href="/assets/AdminShell-
|
|
10
|
+
<link rel="modulepreload" crossorigin href="/assets/useSubAccountSwitcher-CprHkBnZ.js">
|
|
11
|
+
<link rel="modulepreload" crossorigin href="/assets/AdminShell-Y1fHQApK.js">
|
|
12
12
|
<link rel="modulepreload" crossorigin href="/assets/admin-types-hioowVct.js">
|
|
13
|
-
<link rel="modulepreload" crossorigin href="/assets/Checkbox-
|
|
14
|
-
<link rel="modulepreload" crossorigin href="/assets/AdminLoginScreens-
|
|
13
|
+
<link rel="modulepreload" crossorigin href="/assets/Checkbox-CgCqOslz.js">
|
|
14
|
+
<link rel="modulepreload" crossorigin href="/assets/AdminLoginScreens-B1P6PrZ3.js">
|
|
15
15
|
<link rel="modulepreload" crossorigin href="/assets/preload-helper-CvXuAEud.js">
|
|
16
|
-
<link rel="modulepreload" crossorigin href="/assets/maximize-2-
|
|
17
|
-
<link rel="modulepreload" crossorigin href="/assets/Transcript-
|
|
18
|
-
<link rel="modulepreload" crossorigin href="/assets/chevron-left-
|
|
19
|
-
<link rel="modulepreload" crossorigin href="/assets/rotate-ccw-
|
|
20
|
-
<link rel="modulepreload" crossorigin href="/assets/page-
|
|
21
|
-
<link rel="stylesheet" crossorigin href="/assets/useSubAccountSwitcher-
|
|
16
|
+
<link rel="modulepreload" crossorigin href="/assets/maximize-2-DrBaKD3z.js">
|
|
17
|
+
<link rel="modulepreload" crossorigin href="/assets/Transcript-DZzFjhoq.js">
|
|
18
|
+
<link rel="modulepreload" crossorigin href="/assets/chevron-left-A0HYKwGY.js">
|
|
19
|
+
<link rel="modulepreload" crossorigin href="/assets/rotate-ccw-D45TbeAI.js">
|
|
20
|
+
<link rel="modulepreload" crossorigin href="/assets/page-DC_L-IS1.js">
|
|
21
|
+
<link rel="stylesheet" crossorigin href="/assets/useSubAccountSwitcher-CCn22f98.css">
|
|
22
22
|
<link rel="stylesheet" crossorigin href="/assets/AdminLoginScreens-CWMpccrR.css">
|
|
23
23
|
<link rel="stylesheet" href="/brand-defaults.css">
|
|
24
24
|
</head>
|
|
@@ -5,18 +5,18 @@
|
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
6
|
<title>Maxy</title>
|
|
7
7
|
<link rel="icon" href="/favicon.ico">
|
|
8
|
-
<script type="module" crossorigin src="/assets/public-
|
|
8
|
+
<script type="module" crossorigin src="/assets/public-ByUJr48E.js"></script>
|
|
9
9
|
<link rel="modulepreload" crossorigin href="/assets/chunk-CAM3fms7.js">
|
|
10
|
-
<link rel="modulepreload" crossorigin href="/assets/useSubAccountSwitcher-
|
|
11
|
-
<link rel="modulepreload" crossorigin href="/assets/AdminShell-
|
|
10
|
+
<link rel="modulepreload" crossorigin href="/assets/useSubAccountSwitcher-CprHkBnZ.js">
|
|
11
|
+
<link rel="modulepreload" crossorigin href="/assets/AdminShell-Y1fHQApK.js">
|
|
12
12
|
<link rel="modulepreload" crossorigin href="/assets/admin-types-hioowVct.js">
|
|
13
13
|
<link rel="modulepreload" crossorigin href="/assets/preload-helper-CvXuAEud.js">
|
|
14
|
-
<link rel="modulepreload" crossorigin href="/assets/maximize-2-
|
|
15
|
-
<link rel="modulepreload" crossorigin href="/assets/Transcript-
|
|
16
|
-
<link rel="modulepreload" crossorigin href="/assets/chevron-left-
|
|
17
|
-
<link rel="modulepreload" crossorigin href="/assets/rotate-ccw-
|
|
18
|
-
<link rel="modulepreload" crossorigin href="/assets/page-
|
|
19
|
-
<link rel="stylesheet" crossorigin href="/assets/useSubAccountSwitcher-
|
|
14
|
+
<link rel="modulepreload" crossorigin href="/assets/maximize-2-DrBaKD3z.js">
|
|
15
|
+
<link rel="modulepreload" crossorigin href="/assets/Transcript-DZzFjhoq.js">
|
|
16
|
+
<link rel="modulepreload" crossorigin href="/assets/chevron-left-A0HYKwGY.js">
|
|
17
|
+
<link rel="modulepreload" crossorigin href="/assets/rotate-ccw-D45TbeAI.js">
|
|
18
|
+
<link rel="modulepreload" crossorigin href="/assets/page-DC_L-IS1.js">
|
|
19
|
+
<link rel="stylesheet" crossorigin href="/assets/useSubAccountSwitcher-CCn22f98.css">
|
|
20
20
|
<link rel="stylesheet" href="/brand-defaults.css">
|
|
21
21
|
</head>
|
|
22
22
|
<body class="public-surface">
|
package/payload/server/server.js
CHANGED
|
@@ -3006,6 +3006,22 @@ async function resolvePersonByPhone(accountId, phone) {
|
|
|
3006
3006
|
await session.close();
|
|
3007
3007
|
}
|
|
3008
3008
|
}
|
|
3009
|
+
async function ensureManagerPerson(accountId, phone) {
|
|
3010
|
+
const session = getSession2();
|
|
3011
|
+
const normalized = normalizeE164(phone) || phone;
|
|
3012
|
+
try {
|
|
3013
|
+
const result = await session.run(
|
|
3014
|
+
`MERGE (p:Person {accountId: $accountId, phone: $phone})
|
|
3015
|
+
ON CREATE SET p.source = 'wa-passive-manager'
|
|
3016
|
+
RETURN elementId(p) AS personId`,
|
|
3017
|
+
{ accountId, phone: normalized }
|
|
3018
|
+
);
|
|
3019
|
+
if (result.records.length === 0) return null;
|
|
3020
|
+
return result.records[0].get("personId");
|
|
3021
|
+
} finally {
|
|
3022
|
+
await session.close();
|
|
3023
|
+
}
|
|
3024
|
+
}
|
|
3009
3025
|
async function enrolPerson(input) {
|
|
3010
3026
|
const session = getSession2();
|
|
3011
3027
|
const sliceToken = randomUUID2();
|
|
@@ -7288,9 +7304,103 @@ function reconcileCredsOnDisk(opts) {
|
|
|
7288
7304
|
return entries;
|
|
7289
7305
|
}
|
|
7290
7306
|
|
|
7307
|
+
// app/lib/whatsapp-reader/select-sessions.ts
|
|
7308
|
+
function isReaderChannelSession(role, channel) {
|
|
7309
|
+
return role === "admin" && (channel === "whatsapp" || channel === "telegram") || role === "public" && (channel === "whatsapp" || channel === "webchat");
|
|
7310
|
+
}
|
|
7311
|
+
function selectReaderChannelSessions(rows) {
|
|
7312
|
+
return rows.filter((r) => isReaderChannelSession(r.role, r.channel)).sort((a, b) => b.startedAt.localeCompare(a.startedAt)).map((r) => ({
|
|
7313
|
+
sessionId: r.sessionId,
|
|
7314
|
+
projectDir: r.projectDir,
|
|
7315
|
+
title: r.title,
|
|
7316
|
+
senderId: r.senderId,
|
|
7317
|
+
startedAt: r.startedAt,
|
|
7318
|
+
channel: r.channel,
|
|
7319
|
+
role: r.role,
|
|
7320
|
+
operatorName: null,
|
|
7321
|
+
whatsappName: null,
|
|
7322
|
+
lastMessageAt: r.lastMessageAt,
|
|
7323
|
+
modelGated: r.modelGated,
|
|
7324
|
+
model: r.model,
|
|
7325
|
+
source: "session"
|
|
7326
|
+
}));
|
|
7327
|
+
}
|
|
7328
|
+
function conversationCounterpartyPhone(remoteJid, earliestSenderTelephone) {
|
|
7329
|
+
if (remoteJid.endsWith("@g.us")) return null;
|
|
7330
|
+
if (remoteJid.endsWith("@s.whatsapp.net")) return jidToE164(remoteJid) ?? earliestSenderTelephone;
|
|
7331
|
+
return earliestSenderTelephone;
|
|
7332
|
+
}
|
|
7333
|
+
function counterpartyBoundToSubAccount(managerPhones, counterpartyPhone) {
|
|
7334
|
+
return counterpartyPhone != null && managerPhones.some((mp) => phonesMatch(mp, counterpartyPhone));
|
|
7335
|
+
}
|
|
7336
|
+
function buildStoreConversationRows(accountId, summaries) {
|
|
7337
|
+
const rows = [];
|
|
7338
|
+
for (const [remoteJid, { first, last, firstNamedSender }] of summaries) {
|
|
7339
|
+
const scope = last.scope;
|
|
7340
|
+
const senderTelephone = conversationCounterpartyPhone(remoteJid, first.senderTelephone);
|
|
7341
|
+
rows.push({
|
|
7342
|
+
sessionId: "",
|
|
7343
|
+
projectDir: "",
|
|
7344
|
+
title: remoteJid,
|
|
7345
|
+
senderId: senderTelephone,
|
|
7346
|
+
startedAt: first.dateSent,
|
|
7347
|
+
channel: "whatsapp",
|
|
7348
|
+
role: scope === "admin" ? "admin" : "public",
|
|
7349
|
+
operatorName: null,
|
|
7350
|
+
whatsappName: firstNamedSender,
|
|
7351
|
+
lastMessageAt: last.dateSent,
|
|
7352
|
+
modelGated: false,
|
|
7353
|
+
model: null,
|
|
7354
|
+
source: "store",
|
|
7355
|
+
accountId,
|
|
7356
|
+
remoteJid,
|
|
7357
|
+
scope
|
|
7358
|
+
});
|
|
7359
|
+
}
|
|
7360
|
+
return rows.sort((a, b) => (b.lastMessageAt ?? "").localeCompare(a.lastMessageAt ?? ""));
|
|
7361
|
+
}
|
|
7362
|
+
|
|
7363
|
+
// app/lib/whatsapp/sub-account-recall.ts
|
|
7364
|
+
function resolveStoreProjection(params) {
|
|
7365
|
+
const { requestedAccountId, houseId, validAccountIds, houseAccountManagers } = params;
|
|
7366
|
+
const requestedIsValid = validAccountIds.includes(requestedAccountId);
|
|
7367
|
+
const isSubAccount = houseId !== null && validAccountIds.length > 1 && requestedIsValid && requestedAccountId !== houseId;
|
|
7368
|
+
if (!isSubAccount) return { storeAccountId: requestedAccountId, managerPhones: null };
|
|
7369
|
+
return {
|
|
7370
|
+
storeAccountId: houseId,
|
|
7371
|
+
managerPhones: managerPhonesForAccount(houseAccountManagers, requestedAccountId)
|
|
7372
|
+
};
|
|
7373
|
+
}
|
|
7374
|
+
function filterConversationsForSubAccount(conversations, managerPhones) {
|
|
7375
|
+
const out = /* @__PURE__ */ new Map();
|
|
7376
|
+
for (const [remoteJid, msgs] of conversations) {
|
|
7377
|
+
const counterparty = conversationCounterpartyPhone(remoteJid, msgs[0]?.senderTelephone ?? "");
|
|
7378
|
+
if (counterpartyBoundToSubAccount(managerPhones, counterparty)) out.set(remoteJid, msgs);
|
|
7379
|
+
}
|
|
7380
|
+
return out;
|
|
7381
|
+
}
|
|
7382
|
+
|
|
7291
7383
|
// server/routes/whatsapp.ts
|
|
7292
7384
|
var TAG21 = "[whatsapp:api]";
|
|
7293
7385
|
var PLATFORM_ROOT5 = process.env.MAXY_PLATFORM_ROOT || "";
|
|
7386
|
+
function projectionFor(requestedAccountId) {
|
|
7387
|
+
const validAccounts = listValidAccounts();
|
|
7388
|
+
if (validAccounts.length <= 1) return { storeAccountId: requestedAccountId, managerPhones: null };
|
|
7389
|
+
let houseId = null;
|
|
7390
|
+
try {
|
|
7391
|
+
houseId = resolveHouseOrSoleAccountId(ACCOUNTS_DIR);
|
|
7392
|
+
} catch {
|
|
7393
|
+
houseId = null;
|
|
7394
|
+
}
|
|
7395
|
+
const houseAccount = houseId ? validAccounts.find((a) => a.accountId === houseId) : void 0;
|
|
7396
|
+
const houseAccountManagers = houseAccount ? readAccountManagers(houseAccount.accountDir) : {};
|
|
7397
|
+
return resolveStoreProjection({
|
|
7398
|
+
requestedAccountId,
|
|
7399
|
+
houseId,
|
|
7400
|
+
validAccountIds: validAccounts.map((a) => a.accountId),
|
|
7401
|
+
houseAccountManagers
|
|
7402
|
+
});
|
|
7403
|
+
}
|
|
7294
7404
|
var app2 = new Hono();
|
|
7295
7405
|
app2.get("/status", (c) => {
|
|
7296
7406
|
try {
|
|
@@ -7639,8 +7749,11 @@ app2.get("/conversation-graph-state", async (c) => {
|
|
|
7639
7749
|
const accountIdQuery = c.req.query("accountId");
|
|
7640
7750
|
const t0 = Date.now();
|
|
7641
7751
|
if (!directCacheKey && !jid) {
|
|
7642
|
-
const
|
|
7643
|
-
const
|
|
7752
|
+
const requestedAccountId = validateAccountId(accountIdQuery ?? null);
|
|
7753
|
+
const projection2 = projectionFor(requestedAccountId);
|
|
7754
|
+
const managerPhonesBound = projection2.managerPhones?.length ?? 0;
|
|
7755
|
+
const allConversations = readAllConversations(projection2.storeAccountId);
|
|
7756
|
+
const conversations = projection2.managerPhones ? filterConversationsForSubAccount(allConversations, projection2.managerPhones) : allConversations;
|
|
7644
7757
|
const rows2 = [];
|
|
7645
7758
|
const nameCache = /* @__PURE__ */ new Map();
|
|
7646
7759
|
let unresolvedSenders = 0;
|
|
@@ -7652,7 +7765,7 @@ app2.get("/conversation-graph-state", async (c) => {
|
|
|
7652
7765
|
if (!nameCache.has(m.senderTelephone)) {
|
|
7653
7766
|
const result = await session.run(
|
|
7654
7767
|
`MATCH (p:Person {telephone: $telephone, accountId: $accountId}) RETURN p.givenName AS givenName, p.familyName AS familyName`,
|
|
7655
|
-
{ telephone: m.senderTelephone, accountId:
|
|
7768
|
+
{ telephone: m.senderTelephone, accountId: projection2.storeAccountId }
|
|
7656
7769
|
);
|
|
7657
7770
|
const rec = result.records[0];
|
|
7658
7771
|
const resolved = rec ? [rec.get("givenName"), rec.get("familyName")].filter(Boolean).join(" ") || null : null;
|
|
@@ -7674,8 +7787,8 @@ app2.get("/conversation-graph-state", async (c) => {
|
|
|
7674
7787
|
if (session) await session.close();
|
|
7675
7788
|
}
|
|
7676
7789
|
const ms2 = Date.now() - t0;
|
|
7677
|
-
console.error(`[
|
|
7678
|
-
return c.json({ accountId:
|
|
7790
|
+
console.error(`[whatsapp-read-tool] op=query scope=${requestedAccountId} storeAccount=${projection2.storeAccountId} managerPhonesBound=${managerPhonesBound} resultCount=${rows2.length} unresolvedSenders=${unresolvedSenders} ms=${ms2}`);
|
|
7791
|
+
return c.json({ accountId: requestedAccountId, rows: rows2, unresolvedSenders, ms: ms2, managerPhonesBound });
|
|
7679
7792
|
}
|
|
7680
7793
|
let remoteJid;
|
|
7681
7794
|
let accountId;
|
|
@@ -7690,7 +7803,13 @@ app2.get("/conversation-graph-state", async (c) => {
|
|
|
7690
7803
|
accountId = validateAccountId(accountIdQuery ?? null);
|
|
7691
7804
|
remoteJid = jid;
|
|
7692
7805
|
cacheKey = isGroupJid(remoteJid) ? deriveCacheKey({ agentType: "public", accountId, senderPhone: "", isGroup: true, groupJid: remoteJid }) : deriveCacheKey({ agentType: "public", accountId, senderPhone: remoteJid.replace(/^(\d+)(?::\d+)?@s\.whatsapp\.net$/i, "$1"), isGroup: false });
|
|
7693
|
-
const
|
|
7806
|
+
const projection = projectionFor(accountId);
|
|
7807
|
+
const storeMessages = readConversation(projection.storeAccountId, remoteJid);
|
|
7808
|
+
const counterpartyBound = projection.managerPhones == null || counterpartyBoundToSubAccount(
|
|
7809
|
+
projection.managerPhones,
|
|
7810
|
+
conversationCounterpartyPhone(remoteJid, storeMessages[0]?.senderTelephone ?? "")
|
|
7811
|
+
);
|
|
7812
|
+
const messages = counterpartyBound ? storeMessages : [];
|
|
7694
7813
|
const sessionId = messages[0]?.sessionId ?? null;
|
|
7695
7814
|
const rows = messages.map((m) => ({
|
|
7696
7815
|
messageId: m.messageId,
|
|
@@ -7700,12 +7819,12 @@ app2.get("/conversation-graph-state", async (c) => {
|
|
|
7700
7819
|
body: m.body
|
|
7701
7820
|
}));
|
|
7702
7821
|
const ms = Date.now() - t0;
|
|
7703
|
-
console.error(`[
|
|
7822
|
+
console.error(`[whatsapp-read-tool] op=query mode=single scope=${accountId} storeAccount=${projection.storeAccountId} graphRows=${rows.length} sessionId=${sessionId ?? "null"} ms=${ms}`);
|
|
7704
7823
|
return c.json({
|
|
7705
7824
|
cacheKey,
|
|
7706
7825
|
sessionId,
|
|
7707
7826
|
graphRows: rows,
|
|
7708
|
-
cypher: `on-disk read: ~/.<brand>/data/whatsapp-messages/${
|
|
7827
|
+
cypher: `on-disk read: ~/.<brand>/data/whatsapp-messages/${projection.storeAccountId}/${remoteJid}.jsonl`,
|
|
7709
7828
|
ms
|
|
7710
7829
|
});
|
|
7711
7830
|
} catch (err) {
|
|
@@ -7755,57 +7874,6 @@ import { basename as basename5, dirname as dirname4, isAbsolute, join as join14,
|
|
|
7755
7874
|
// server/routes/admin/sidebar-sessions.ts
|
|
7756
7875
|
import { readdirSync as readdirSync5, readFileSync as readFileSync12, statSync as statSync3 } from "fs";
|
|
7757
7876
|
import { basename as basename4, dirname as dirname3, join as join11, resolve as resolve11 } from "path";
|
|
7758
|
-
|
|
7759
|
-
// app/lib/whatsapp-reader/select-sessions.ts
|
|
7760
|
-
function isReaderChannelSession(role, channel) {
|
|
7761
|
-
return role === "admin" && (channel === "whatsapp" || channel === "telegram") || role === "public" && (channel === "whatsapp" || channel === "webchat");
|
|
7762
|
-
}
|
|
7763
|
-
function selectReaderChannelSessions(rows) {
|
|
7764
|
-
return rows.filter((r) => isReaderChannelSession(r.role, r.channel)).sort((a, b) => b.startedAt.localeCompare(a.startedAt)).map((r) => ({
|
|
7765
|
-
sessionId: r.sessionId,
|
|
7766
|
-
projectDir: r.projectDir,
|
|
7767
|
-
title: r.title,
|
|
7768
|
-
senderId: r.senderId,
|
|
7769
|
-
startedAt: r.startedAt,
|
|
7770
|
-
channel: r.channel,
|
|
7771
|
-
role: r.role,
|
|
7772
|
-
operatorName: null,
|
|
7773
|
-
whatsappName: null,
|
|
7774
|
-
lastMessageAt: r.lastMessageAt,
|
|
7775
|
-
modelGated: r.modelGated,
|
|
7776
|
-
model: r.model,
|
|
7777
|
-
source: "session"
|
|
7778
|
-
}));
|
|
7779
|
-
}
|
|
7780
|
-
function buildStoreConversationRows(accountId, summaries) {
|
|
7781
|
-
const rows = [];
|
|
7782
|
-
for (const [remoteJid, { first, last, firstNamedSender }] of summaries) {
|
|
7783
|
-
const scope = last.scope;
|
|
7784
|
-
const isGroup = remoteJid.endsWith("@g.us");
|
|
7785
|
-
const senderTelephone = isGroup ? null : remoteJid.endsWith("@s.whatsapp.net") ? jidToE164(remoteJid) ?? first.senderTelephone : first.senderTelephone;
|
|
7786
|
-
rows.push({
|
|
7787
|
-
sessionId: "",
|
|
7788
|
-
projectDir: "",
|
|
7789
|
-
title: remoteJid,
|
|
7790
|
-
senderId: senderTelephone,
|
|
7791
|
-
startedAt: first.dateSent,
|
|
7792
|
-
channel: "whatsapp",
|
|
7793
|
-
role: scope === "admin" ? "admin" : "public",
|
|
7794
|
-
operatorName: null,
|
|
7795
|
-
whatsappName: firstNamedSender,
|
|
7796
|
-
lastMessageAt: last.dateSent,
|
|
7797
|
-
modelGated: false,
|
|
7798
|
-
model: null,
|
|
7799
|
-
source: "store",
|
|
7800
|
-
accountId,
|
|
7801
|
-
remoteJid,
|
|
7802
|
-
scope
|
|
7803
|
-
});
|
|
7804
|
-
}
|
|
7805
|
-
return rows.sort((a, b) => (b.lastMessageAt ?? "").localeCompare(a.lastMessageAt ?? ""));
|
|
7806
|
-
}
|
|
7807
|
-
|
|
7808
|
-
// server/routes/admin/sidebar-sessions.ts
|
|
7809
7877
|
var SESSION_ID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\.jsonl$/i;
|
|
7810
7878
|
function lastAssistantModel(body) {
|
|
7811
7879
|
const lines = body.split("\n");
|
|
@@ -8279,7 +8347,7 @@ function unwrapChannel(text) {
|
|
|
8279
8347
|
}
|
|
8280
8348
|
return source ? { text: inner, source } : { text: inner };
|
|
8281
8349
|
}
|
|
8282
|
-
var COMPOSED_ADMIN_FRAME =
|
|
8350
|
+
var COMPOSED_ADMIN_FRAME = /^(?:## Standing rules\n[\s\S]*?\n\n)?## Context\n([\s\S]*)\n\n## Instruction\n[\s\S]*$/;
|
|
8283
8351
|
var UPLOAD_ANNOTATION = /(?:\n\n)?\[The operator uploaded \d+ file\(s\): [\s\S]*\]$/;
|
|
8284
8352
|
function rawFromComposedAdminFrame(text) {
|
|
8285
8353
|
const context = text.match(COMPOSED_ADMIN_FRAME)?.[1];
|
|
@@ -8646,7 +8714,7 @@ app4.get("/conversations", requireAdminSession, async (c) => {
|
|
|
8646
8714
|
managerPhonesBound = managerPhones.length;
|
|
8647
8715
|
if (managerPhones.length > 0) {
|
|
8648
8716
|
managedRows = buildStoreConversationRows(houseId, readConversationSummaries(houseId)).filter(
|
|
8649
|
-
(r) =>
|
|
8717
|
+
(r) => counterpartyBoundToSubAccount(managerPhones, r.senderId)
|
|
8650
8718
|
);
|
|
8651
8719
|
}
|
|
8652
8720
|
}
|
|
@@ -23635,6 +23703,26 @@ async function fetchAccountStandingRules(accountId) {
|
|
|
23635
23703
|
await session.close();
|
|
23636
23704
|
}
|
|
23637
23705
|
}
|
|
23706
|
+
async function recordPassiveDispatch(input) {
|
|
23707
|
+
const session = getSession();
|
|
23708
|
+
try {
|
|
23709
|
+
await session.run(
|
|
23710
|
+
`CREATE (d:PassiveDispatch {
|
|
23711
|
+
accountId: $accountId,
|
|
23712
|
+
sessionId: $sessionId,
|
|
23713
|
+
msgId: $msgId,
|
|
23714
|
+
dispatchedAt: $dispatchedAt
|
|
23715
|
+
})`,
|
|
23716
|
+
{ ...input, dispatchedAt: (/* @__PURE__ */ new Date()).toISOString() }
|
|
23717
|
+
);
|
|
23718
|
+
} catch (err) {
|
|
23719
|
+
console.error(
|
|
23720
|
+
`[wa-passive] op=ledger-write-failed account=${input.accountId} sessionId=${input.sessionId} error=${err instanceof Error ? err.message : String(err)}`
|
|
23721
|
+
);
|
|
23722
|
+
} finally {
|
|
23723
|
+
await session.close();
|
|
23724
|
+
}
|
|
23725
|
+
}
|
|
23638
23726
|
var waGateway = new WaGateway({
|
|
23639
23727
|
fetchStandingRules: fetchAccountStandingRules,
|
|
23640
23728
|
gatewayUrl: `http://127.0.0.1:${process.env.MAXY_UI_INTERNAL_PORT ?? ""}`,
|
|
@@ -23665,7 +23753,17 @@ var waGateway = new WaGateway({
|
|
|
23665
23753
|
console.error(`[wa-passive] op=dropped account=${effectiveAccountId} phoneHash=${phoneHash} msgId=${msgId ?? "none"} reason=empty-text`);
|
|
23666
23754
|
return;
|
|
23667
23755
|
}
|
|
23668
|
-
|
|
23756
|
+
let raisedByPersonId;
|
|
23757
|
+
try {
|
|
23758
|
+
raisedByPersonId = await ensureManagerPerson(effectiveAccountId, senderId) ?? void 0;
|
|
23759
|
+
} catch (err) {
|
|
23760
|
+
console.error(`[wa-passive] op=raised-by-error account=${effectiveAccountId} phoneHash=${phoneHash} msgId=${msgId ?? "none"} error=${err instanceof Error ? err.message : String(err)}`);
|
|
23761
|
+
}
|
|
23762
|
+
if (!raisedByPersonId) {
|
|
23763
|
+
console.error(`[wa-passive] op=dropped account=${effectiveAccountId} phoneHash=${phoneHash} msgId=${msgId ?? "none"} reason=raised-by-unresolved`);
|
|
23764
|
+
return;
|
|
23765
|
+
}
|
|
23766
|
+
console.error(`[wa-passive] op=dispatch account=${effectiveAccountId} phoneHash=${phoneHash} msgId=${msgId ?? "none"} raisedBy=${raisedByPersonId}`);
|
|
23669
23767
|
const result2 = await managerSpawn({
|
|
23670
23768
|
senderId,
|
|
23671
23769
|
role: "public",
|
|
@@ -23674,11 +23772,21 @@ var waGateway = new WaGateway({
|
|
|
23674
23772
|
targetAccountId: effectiveAccountId,
|
|
23675
23773
|
agentSlug: "passive",
|
|
23676
23774
|
initialMessage: prompt,
|
|
23677
|
-
passive: true
|
|
23775
|
+
passive: true,
|
|
23776
|
+
// Task 1493 — the manager's elementId rides the personId field
|
|
23777
|
+
// end-to-end (managerSpawn → /public-spawn → spawn args → work env as
|
|
23778
|
+
// RAISED_BY_PERSON_ID). It is also this passive session's identity.
|
|
23779
|
+
personId: raisedByPersonId
|
|
23678
23780
|
});
|
|
23679
23781
|
if ("error" in result2) {
|
|
23680
23782
|
console.error(`[wa-passive] op=dispatch-failed account=${effectiveAccountId} msgId=${msgId ?? "none"} error=${result2.error}`);
|
|
23783
|
+
return;
|
|
23681
23784
|
}
|
|
23785
|
+
await recordPassiveDispatch({
|
|
23786
|
+
accountId: effectiveAccountId,
|
|
23787
|
+
sessionId: result2.sessionId,
|
|
23788
|
+
msgId: msgId ?? ""
|
|
23789
|
+
});
|
|
23682
23790
|
return;
|
|
23683
23791
|
}
|
|
23684
23792
|
if (role === "admin") {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{F as e,M as t}from"./useSubAccountSwitcher-8dLvF3Ux.js";import"./admin-types-hioowVct.js";import"./AdminShell-D8wNArGQ.js";import{n}from"./page-CHWMI9Tm.js";import"./Transcript-CBIyQ8T5.js";var r=e(),i=t();(0,r.createRoot)(document.getElementById(`root`)).render((0,i.jsx)(n,{}));
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{D as e}from"./useSubAccountSwitcher-8dLvF3Ux.js";var t=e(`chevron-left`,[[`path`,{d:`m15 18-6-6 6-6`,key:`1wnfg3`}]]);export{t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{F as e,M as t}from"./useSubAccountSwitcher-8dLvF3Ux.js";import{t as n}from"./page-CXKV01gT.js";import"./Transcript-CBIyQ8T5.js";import"./graph-labels-BFG4bjXQ.js";var r=e(),i=t();(0,r.createRoot)(document.getElementById(`root`)).render((0,i.jsx)(n,{}));
|