@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.
Files changed (89) hide show
  1. package/package.json +1 -1
  2. package/payload/platform/package-lock.json +5158 -2922
  3. package/payload/platform/plugins/admin/hooks/__tests__/prompt-optimiser-compliance.test.sh +22 -0
  4. package/payload/platform/plugins/admin/hooks/prompt-optimiser-compliance.sh +14 -1
  5. package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +3 -1
  6. package/payload/platform/plugins/docs/references/memory-guide.md +2 -0
  7. package/payload/platform/plugins/memory/PLUGIN.md +3 -0
  8. package/payload/platform/plugins/memory/skills/conversational-memory/SKILL.md +30 -1
  9. package/payload/platform/plugins/memory/skills/preference-audit/SKILL.md +50 -0
  10. package/payload/platform/plugins/whatsapp/PLUGIN.md +3 -1
  11. package/payload/platform/plugins/whatsapp/mcp/dist/__tests__/resolve-read-account.test.d.ts +2 -0
  12. package/payload/platform/plugins/whatsapp/mcp/dist/__tests__/resolve-read-account.test.d.ts.map +1 -0
  13. package/payload/platform/plugins/whatsapp/mcp/dist/__tests__/resolve-read-account.test.js +15 -0
  14. package/payload/platform/plugins/whatsapp/mcp/dist/__tests__/resolve-read-account.test.js.map +1 -0
  15. package/payload/platform/plugins/whatsapp/mcp/dist/index.js +4 -3
  16. package/payload/platform/plugins/whatsapp/mcp/dist/index.js.map +1 -1
  17. package/payload/platform/plugins/whatsapp/mcp/dist/resolve-read-account.d.ts +7 -0
  18. package/payload/platform/plugins/whatsapp/mcp/dist/resolve-read-account.d.ts.map +1 -0
  19. package/payload/platform/plugins/whatsapp/mcp/dist/resolve-read-account.js +13 -0
  20. package/payload/platform/plugins/whatsapp/mcp/dist/resolve-read-account.js.map +1 -0
  21. package/payload/platform/plugins/work/mcp/dist/__tests__/work-create-raised-by-env.test.d.ts +2 -0
  22. package/payload/platform/plugins/work/mcp/dist/__tests__/work-create-raised-by-env.test.d.ts.map +1 -0
  23. package/payload/platform/plugins/work/mcp/dist/__tests__/work-create-raised-by-env.test.js +66 -0
  24. package/payload/platform/plugins/work/mcp/dist/__tests__/work-create-raised-by-env.test.js.map +1 -0
  25. package/payload/platform/plugins/work/mcp/dist/tools/work-create.d.ts.map +1 -1
  26. package/payload/platform/plugins/work/mcp/dist/tools/work-create.js +8 -1
  27. package/payload/platform/plugins/work/mcp/dist/tools/work-create.js.map +1 -1
  28. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
  29. package/payload/platform/services/claude-session-manager/dist/http-server.js +36 -2
  30. package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
  31. package/payload/platform/services/claude-session-manager/dist/index.js +39 -0
  32. package/payload/platform/services/claude-session-manager/dist/index.js.map +1 -1
  33. package/payload/platform/services/claude-session-manager/dist/passive-dispatch-prune.d.ts +37 -0
  34. package/payload/platform/services/claude-session-manager/dist/passive-dispatch-prune.d.ts.map +1 -0
  35. package/payload/platform/services/claude-session-manager/dist/passive-dispatch-prune.js +80 -0
  36. package/payload/platform/services/claude-session-manager/dist/passive-dispatch-prune.js.map +1 -0
  37. package/payload/platform/services/claude-session-manager/dist/passive-intake-audit.d.ts +70 -0
  38. package/payload/platform/services/claude-session-manager/dist/passive-intake-audit.d.ts.map +1 -0
  39. package/payload/platform/services/claude-session-manager/dist/passive-intake-audit.js +129 -0
  40. package/payload/platform/services/claude-session-manager/dist/passive-intake-audit.js.map +1 -0
  41. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts +6 -0
  42. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts.map +1 -1
  43. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js +12 -0
  44. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js.map +1 -1
  45. package/payload/platform/services/telegram-channel/dist/instructions.d.ts.map +1 -1
  46. package/payload/platform/services/telegram-channel/dist/instructions.js +30 -50
  47. package/payload/platform/services/telegram-channel/dist/instructions.js.map +1 -1
  48. package/payload/platform/services/webchat-channel/dist/instructions.d.ts.map +1 -1
  49. package/payload/platform/services/webchat-channel/dist/instructions.js +37 -78
  50. package/payload/platform/services/webchat-channel/dist/instructions.js.map +1 -1
  51. package/payload/platform/services/whatsapp-channel/dist/notification.d.ts +14 -36
  52. package/payload/platform/services/whatsapp-channel/dist/notification.d.ts.map +1 -1
  53. package/payload/platform/services/whatsapp-channel/dist/notification.js +35 -80
  54. package/payload/platform/services/whatsapp-channel/dist/notification.js.map +1 -1
  55. package/payload/platform/templates/agents/admin/IDENTITY.md +2 -1
  56. package/payload/platform/templates/specialists/agents/content-producer.md +4 -0
  57. package/payload/server/public/assets/{AdminLoginScreens-B1PkOF66.js → AdminLoginScreens-B1P6PrZ3.js} +1 -1
  58. package/payload/server/public/assets/{AdminShell-D8wNArGQ.js → AdminShell-Y1fHQApK.js} +1 -1
  59. package/payload/server/public/assets/{Checkbox-Bm9Er726.js → Checkbox-CgCqOslz.js} +1 -1
  60. package/payload/server/public/assets/{Transcript-CBIyQ8T5.js → Transcript-DZzFjhoq.js} +1 -1
  61. package/payload/server/public/assets/{admin-CWM9G_yA.js → admin-BRBjJEci.js} +1 -1
  62. package/payload/server/public/assets/{browser-D8QhNffV.js → browser-ID7iqIi4.js} +1 -1
  63. package/payload/server/public/assets/{calendar-qob5K4t_.js → calendar-BEQPMTtd.js} +1 -1
  64. package/payload/server/public/assets/chat-D0GDSWM-.js +1 -0
  65. package/payload/server/public/assets/chevron-left-A0HYKwGY.js +1 -0
  66. package/payload/server/public/assets/data-CV38dClT.js +1 -0
  67. package/payload/server/public/assets/{graph-DZ2HMpIB.js → graph-BK0MjKRy.js} +1 -1
  68. package/payload/server/public/assets/{graph-labels-BFG4bjXQ.js → graph-labels-BfG6FO25.js} +1 -1
  69. package/payload/server/public/assets/{maximize-2-DkZ40lSl.js → maximize-2-DrBaKD3z.js} +1 -1
  70. package/payload/server/public/assets/{operator-FrXrSsBj.js → operator-CnpNyIJ8.js} +1 -1
  71. package/payload/server/public/assets/{page-CHWMI9Tm.js → page-DC_L-IS1.js} +1 -1
  72. package/payload/server/public/assets/{page-CXKV01gT.js → page-DKHLflh7.js} +1 -1
  73. package/payload/server/public/assets/{public-2p1pJ4WF.js → public-ByUJr48E.js} +1 -1
  74. package/payload/server/public/assets/{rotate-ccw-D3o_bMBA.js → rotate-ccw-D45TbeAI.js} +1 -1
  75. package/payload/server/public/assets/useSubAccountSwitcher-CCn22f98.css +1 -0
  76. package/payload/server/public/browser.html +4 -4
  77. package/payload/server/public/calendar.html +5 -5
  78. package/payload/server/public/chat.html +9 -9
  79. package/payload/server/public/data.html +8 -8
  80. package/payload/server/public/graph.html +9 -9
  81. package/payload/server/public/index.html +11 -11
  82. package/payload/server/public/operator.html +11 -11
  83. package/payload/server/public/public.html +9 -9
  84. package/payload/server/server.js +171 -63
  85. package/payload/server/public/assets/chat-BNrxVUF6.js +0 -1
  86. package/payload/server/public/assets/chevron-left-BQThFVrd.js +0 -1
  87. package/payload/server/public/assets/data-C-EqNbRi.js +0 -1
  88. package/payload/server/public/assets/useSubAccountSwitcher-BUvlETHN.css +0 -1
  89. /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-CWM9G_yA.js"></script>
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-8dLvF3Ux.js">
11
- <link rel="modulepreload" crossorigin href="/assets/graph-labels-BFG4bjXQ.js">
12
- <link rel="modulepreload" crossorigin href="/assets/AdminShell-D8wNArGQ.js">
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-Bm9Er726.js">
15
- <link rel="modulepreload" crossorigin href="/assets/AdminLoginScreens-B1PkOF66.js">
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-DkZ40lSl.js">
18
- <link rel="modulepreload" crossorigin href="/assets/Transcript-CBIyQ8T5.js">
19
- <link rel="modulepreload" crossorigin href="/assets/chevron-left-BQThFVrd.js">
20
- <link rel="modulepreload" crossorigin href="/assets/page-CXKV01gT.js">
21
- <link rel="stylesheet" crossorigin href="/assets/useSubAccountSwitcher-BUvlETHN.css">
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-FrXrSsBj.js"></script>
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-8dLvF3Ux.js">
11
- <link rel="modulepreload" crossorigin href="/assets/AdminShell-D8wNArGQ.js">
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-Bm9Er726.js">
14
- <link rel="modulepreload" crossorigin href="/assets/AdminLoginScreens-B1PkOF66.js">
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-DkZ40lSl.js">
17
- <link rel="modulepreload" crossorigin href="/assets/Transcript-CBIyQ8T5.js">
18
- <link rel="modulepreload" crossorigin href="/assets/chevron-left-BQThFVrd.js">
19
- <link rel="modulepreload" crossorigin href="/assets/rotate-ccw-D3o_bMBA.js">
20
- <link rel="modulepreload" crossorigin href="/assets/page-CHWMI9Tm.js">
21
- <link rel="stylesheet" crossorigin href="/assets/useSubAccountSwitcher-BUvlETHN.css">
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-2p1pJ4WF.js"></script>
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-8dLvF3Ux.js">
11
- <link rel="modulepreload" crossorigin href="/assets/AdminShell-D8wNArGQ.js">
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-DkZ40lSl.js">
15
- <link rel="modulepreload" crossorigin href="/assets/Transcript-CBIyQ8T5.js">
16
- <link rel="modulepreload" crossorigin href="/assets/chevron-left-BQThFVrd.js">
17
- <link rel="modulepreload" crossorigin href="/assets/rotate-ccw-D3o_bMBA.js">
18
- <link rel="modulepreload" crossorigin href="/assets/page-CHWMI9Tm.js">
19
- <link rel="stylesheet" crossorigin href="/assets/useSubAccountSwitcher-BUvlETHN.css">
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">
@@ -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 accountId2 = validateAccountId(accountIdQuery ?? null);
7643
- const conversations = readAllConversations(accountId2);
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: accountId2 }
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(`[mcp:whatsapp] tool=whatsapp-conversation-graph-state mode=all-senders accountId=${accountId2} rows=${rows2.length} unresolvedSenders=${unresolvedSenders} ms=${ms2}`);
7678
- return c.json({ accountId: accountId2, rows: rows2, unresolvedSenders, ms: ms2 });
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 messages = readConversation(accountId, remoteJid);
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(`[mcp:whatsapp] tool=whatsapp-conversation-graph-state cacheKey=${cacheKey} graphRows=${rows.length} sessionId=${sessionId ?? "null"} ms=${ms}`);
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/${accountId}/${remoteJid}.jsonl`,
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 = /^## Context\n([\s\S]*)\n\n## Instruction\n[\s\S]*$/;
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) => r.senderId != null && managerPhones.some((mp) => phonesMatch(mp, r.senderId))
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
- console.error(`[wa-passive] op=dispatch account=${effectiveAccountId} phoneHash=${phoneHash} msgId=${msgId ?? "none"}`);
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,{}));