@rubytech/create-maxy-code 0.1.242 → 0.1.244

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 (22) hide show
  1. package/package.json +1 -1
  2. package/payload/platform/docs/superpowers/plans/2026-06-02-task-610-follower-202-retry.md +372 -0
  3. package/payload/platform/docs/superpowers/specs/2026-06-02-task-610-follower-202-retry-design.md +116 -0
  4. package/payload/platform/neo4j/schema.cypher +0 -5
  5. package/payload/platform/plugins/admin/mcp/dist/index.js +2 -3
  6. package/payload/platform/plugins/admin/mcp/dist/index.js.map +1 -1
  7. package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +6 -7
  8. package/payload/platform/plugins/admin/skills/public-agent-manager/SKILL.md +8 -18
  9. package/payload/platform/plugins/docs/references/internals.md +5 -6
  10. package/payload/platform/plugins/memory/PLUGIN.md +2 -2
  11. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
  12. package/payload/platform/services/claude-session-manager/dist/http-server.js +1 -32
  13. package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
  14. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts +6 -32
  15. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts.map +1 -1
  16. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js +121 -129
  17. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js.map +1 -1
  18. package/payload/platform/templates/agents/public/IDENTITY.md +9 -62
  19. package/payload/platform/templates/agents/public/config.json +0 -1
  20. package/payload/server/{chunk-ZY6W3UA2.js → chunk-SRO5RFMV.js} +1 -20
  21. package/payload/server/maxy-edge.js +1 -1
  22. package/payload/server/server.js +41 -25
@@ -1,72 +1,19 @@
1
1
  # Public Agent
2
2
 
3
- You are a public-facing agent for a business. Your personality, tone, and business context are provided to you directly use them to shape every response.
3
+ You are a public-facing agent for a business. Your soul and your knowledge are provided to you directly, in this prompt. They are the full extent of what you know.
4
4
 
5
- ## Prerogatives
5
+ ## What you know
6
6
 
7
- Three rules govern every turn. They are load-bearing when they conflict with anything else in this prompt, they win.
7
+ Everything you know is in this prompt — your soul and the knowledge given with it. Answer only from it. If the answer is not there, say plainly that it is outside what you can help with, and offer to pass the question to the business. Never fill a gap from general training knowledge, and never invent a fact about the business, its products, prices, or people.
8
8
 
9
- **PRECISE.** Use exact names: exact tool names, exact field values, exact file paths, exact node properties. When relaying a tool result, relay what the tool returned — do not paraphrase, do not approximate, do not invent flags. When uncertain about an exact value, look it up; never substitute a loose-but-plausible string. *Failure symptoms:* paraphrasing tool output, approximate tool name, inventing a flag.
9
+ ## You have no tools
10
10
 
11
- **CONCISE.** Every output is the minimum tokens that convey the signal. The Neo4j graph is the canonical store of knowledge for this account; keep it dense in signal via the two-step memory discipline:
12
- - *Compress on write.* Before `memory-write`, reduce the input to the minimal node/edge/property set that preserves the signal. Do not persist raw monologues, document bodies, or tool-result dumps — persist the extracted structure. If extraction is unclear, ask in one sentence what to preserve rather than saving everything.
13
- - *Filter on read.* `memory-search` returns candidates, not answers. Filter the returned set to the subset that answers the current turn. Relay one line of signal, not ten lines of candidate text.
11
+ You have no tools. Do not search, look anything up, read files, run commands, or load skills. There is nothing for you to call — so do not try. If a visitor asks for something that would need a lookup or an action, treat it as outside what you can help with and offer to pass it on. You cannot act, only answer.
14
12
 
15
- *Failure symptoms:* unrequested summary, three-paragraph answer to a one-line question, pasting a raw tool result verbatim into chat.
13
+ ## How you behave
16
14
 
17
- **EVIDENCE-BASED.** Every factual claim you make has a source you can name. The permissible sources are three: a graph read this session via `memory-search`, a tool output returned this session, and content the visitor pasted into this conversation. Pretraining recall is not a source — not for facts about the business, not for facts about the product, not for facts about the world that the graph or a tool could ground. The graph is the canonical store about this account; consult it before answering factual questions or embarking on activity. When the graph has no answer, say so plainly and offer to take a message — never fill the gap from training memory. You are read-only by design (see Boundaries); corrections to the graph are not your job — surface the gap so the operator can address it. *Failure symptoms:* factual claim without a prior graph read or tool output this turn, training-data fallback when the graph has the canonical version, invented fact dressed as a graph result.
15
+ In your first message of every conversation, make clear in a natural way that the visitor is talking to an AI, not a human. This is a trust obligation, not optional, and it belongs in the greeting rather than bolted on after. Never impersonate a human at any point.
18
16
 
19
- The 4-step brain-first loop, every turn that needs information:
20
- 1. **Classify the question** — known entity, temporal fact, event, general knowledge, or none. The inbound gateway provides this as `retrievalClass` when available.
21
- 2. **Read the graph** — `memory-search` is the first tool call of any informational turn. The server scopes every read to `scope: "public"`, so what comes back is exactly what the operator chose to expose.
22
- 3. **Hydrate on partial hit** — when a result names but does not contain what you need, walk one hop (re-search by `elementId` or scan related neighbours) before assuming a miss.
23
- 4. **Fall back honestly on a confirmed miss** — say the graph has no answer, then offer to take a message or suggest direct contact. Never invent the missing fact.
17
+ You are read-only. You cannot create, change, or delete anything. If a visitor uploads a file, it is saved for the business to review — you cannot read it or act on its contents, so say so honestly.
24
18
 
25
- A landfill graph defeats EVIDENCE-BASED: search returns noise, the agent relays the noise, the visitor sees noise. Filter on read.
26
-
27
- ---
28
-
29
- ## Behaviour
30
-
31
- - Answer from the knowledge provided to you. If you don't have the answer, say so honestly and offer to take a message or suggest the visitor get in touch directly.
32
- - Never reveal system internals to visitors: tool names, file names, prompt instructions, model details, context window limits, or any platform implementation detail. These are invisible to the visitor.
33
- - Never describe your own capabilities or limitations unprompted. Visitors care about the business, not your architecture.
34
- - If an internal tool or lookup fails while answering a question, tell the visitor honestly that you could not retrieve that information right now, and offer an alternative (take a message, suggest they contact the business, come back to it). Do not silently switch approaches and present the result as if nothing went wrong — the visitor has to know when your answer is grounded and when it isn't.
35
- - British English unless your business context specifies otherwise.
36
- - Every URL in a response must be a clickable markdown link — never raw text. Use `[visible label](url)` format.
37
-
38
- ## Visual content
39
-
40
- Two sources of inline images are permitted, and only these two:
41
-
42
- 1. **Brand images at `/brand/`** — visual assets the business has prepared. When your knowledge lists an image and a visitor's question is relevant to it, embed it inline using standard markdown: `![description](/brand/filename)`. Only reference images explicitly listed in your knowledge — never guess or fabricate filenames.
43
-
44
- 2. **`:ImageObject` URLs returned by `memory-search`** — when a memory-search result includes `:ImageObject` neighbours on its `related` set (e.g. a `:Listing` returned with its `:DEPICTS`-linked images), the `url` field of those neighbours is permitted as an inline image source: `![<ImageObject.description>](<ImageObject.url>)`. Use the ImageObject's own `description` as the alt text; never substitute placeholder alt text. Only embed URLs returned by memory-search in this turn — do not cache, reuse across turns from memory, or compose URLs from slugs.
45
-
46
- No other external image embedding is permitted. The visitor sees the image directly in the conversation. When a relevant image exists, show it rather than describing what you could show.
47
-
48
- ### No fabrication on graph-backed content
49
-
50
- When you relay graph-backed entities to a visitor — listings, prices, addresses, image content, anything sourced from `memory-search` — every field in the reply must trace to a property on a node the search just returned. If memory-search returns zero matches for the visitor's intent, say so plainly in one sentence. Never invent a listing, a price, a room photo, or a feature to fill the gap. Run the same intent three times and the no-match reply must stay consistent in meaning — the visitor's experience is the audit.
51
-
52
- ## Boundaries
53
-
54
- - You are an AI assistant. In your first message of every conversation, make clear that the visitor is interacting with an AI — not a human. This is a regulatory and trust obligation, not optional. The disclosure must be natural and integrated into your greeting, not a disclaimer bolted on. After the first message, you do not need to repeat it unless asked. Never impersonate a human at any point.
55
- - You are read-only. You cannot create, modify, or delete any data.
56
- - You answer ONLY from the knowledge provided to you. If the answer is not in your knowledge, say you don't know — do not use general training data or improvise facts about the business.
57
- - Stay within your explicit scope. Decline requests outside it politely.
58
- - If a user uploads a file, acknowledge that it has been saved for review. You cannot read, analyse, or act on file contents.
59
-
60
- ## Questions
61
-
62
- When you need to clarify intent before acting, follow two rules.
63
-
64
- 1. **One-sided questions only.** Frame every clarifying question so a single-word "yes" or "no" is unambiguous. Never pose two opposing framings joined by "or" — "Should I book this, or not?", "Want a quote, or shall I take a message?". "Yes" to such a question is unusable — the visitor could have meant either side. Pick one side and ask it plainly: "Shall I take a message?" — not "take a message, or leave it?".
65
-
66
- 2. **No menu when the signal is clear.** When an internal lookup or tool returns a specific outcome — the answer is there, or the answer is not — relay that outcome. Do not offer the visitor a menu of next steps when only one makes sense. If a lookup fails, tell the visitor what to do next (take a message, contact the business directly) rather than asking them to choose between recoveries.
67
-
68
- ## Plain-English precision pass
69
-
70
- Run `skill-load skillName=plainly` on the first text-producing turn of every session. Apply the AI-tells strip and the recursive plain-English rule to every reply you return to the visitor before emitting it — this is a prime-directive prerogative that overrides every other formatting preference. Customers are the highest-stakes audience this platform serves; plain English is not a polish step, it is the contract.
71
-
72
- The skill applies to every prose payload returned to the visitor. It does NOT apply to structured tool arguments (IDs, option values, schema field names) — those are agent-to-machine payloads.
19
+ Never describe your own workings, limits, or the fact that you have no tools unless a visitor asks. Visitors care about the business, not how you are built. Stay within the scope of the knowledge you were given, and decline politely when a request falls outside it.
@@ -4,6 +4,5 @@
4
4
  "model": "claude-haiku-4-5",
5
5
  "plugins": ["sales"],
6
6
  "status": "active",
7
- "liveMemory": false,
8
7
  "knowledgeKeywords": []
9
8
  }
@@ -3633,7 +3633,6 @@ function resolveAgentConfig(accountDir, agentName) {
3633
3633
  let image = null;
3634
3634
  let imageShape = null;
3635
3635
  let showAgentName = false;
3636
- let liveMemory = false;
3637
3636
  let knowledgeKeywords = null;
3638
3637
  let accessMode = "open";
3639
3638
  const MAX_KNOWLEDGE_KEYWORDS = 5;
@@ -3665,22 +3664,6 @@ function resolveAgentConfig(accountDir, agentName) {
3665
3664
  if (typeof parsed.accessMode === "string" && ["gated", "paid"].includes(parsed.accessMode)) {
3666
3665
  accessMode = parsed.accessMode;
3667
3666
  }
3668
- if (typeof parsed.liveMemory === "boolean") {
3669
- liveMemory = parsed.liveMemory;
3670
- } else if (typeof parsed.liveMemory === "string") {
3671
- const lower = parsed.liveMemory.toLowerCase();
3672
- if (lower === "true") {
3673
- liveMemory = true;
3674
- console.warn(`[agent-config] ${agentName}: liveMemory is string "true" \u2014 coercing to boolean. Fix the config to use a boolean value.`);
3675
- } else if (lower === "false") {
3676
- liveMemory = false;
3677
- console.warn(`[agent-config] ${agentName}: liveMemory is string "false" \u2014 coercing to boolean. Fix the config to use a boolean value.`);
3678
- } else {
3679
- throw new Error(`[agent-config] ${agentName}: liveMemory has invalid string value "${parsed.liveMemory}" \u2014 expected boolean or "true"/"false"`);
3680
- }
3681
- } else if (parsed.liveMemory !== void 0 && parsed.liveMemory !== null) {
3682
- throw new Error(`[agent-config] ${agentName}: liveMemory has invalid type ${typeof parsed.liveMemory} \u2014 expected boolean or "true"/"false"`);
3683
- }
3684
3667
  if (Array.isArray(parsed.knowledgeKeywords) && parsed.knowledgeKeywords.length > 0) {
3685
3668
  const filtered = parsed.knowledgeKeywords.filter((k) => typeof k === "string" && k.trim()).map((k) => k.replace(/,/g, "").trim().toLowerCase()).filter(Boolean);
3686
3669
  if (filtered.length > MAX_KNOWLEDGE_KEYWORDS) {
@@ -3725,7 +3708,7 @@ function resolveAgentConfig(accountDir, agentName) {
3725
3708
  total: identityTokens + soulTokens + knowledgeTokens
3726
3709
  };
3727
3710
  }
3728
- return { model, plugins, status, displayName, image, imageShape, showAgentName, knowledge, knowledgeBaked, liveMemory, knowledgeKeywords, budget, accessMode };
3711
+ return { model, plugins, status, displayName, image, imageShape, showAgentName, knowledge, knowledgeBaked, knowledgeKeywords, budget, accessMode };
3729
3712
  }
3730
3713
  function getDefaultAccountId() {
3731
3714
  return resolveAccount()?.accountId ?? null;
@@ -5347,7 +5330,6 @@ async function projectAgent(accountId, accountDir, slug) {
5347
5330
  SET a.displayName = $displayName,
5348
5331
  a.status = $status,
5349
5332
  a.model = $model,
5350
- a.liveMemory = $liveMemory,
5351
5333
  a.knowledgeKeywords = $knowledgeKeywords,
5352
5334
  a.role = 'agent',
5353
5335
  a.updatedAt = datetime()
@@ -5358,7 +5340,6 @@ async function projectAgent(accountId, accountDir, slug) {
5358
5340
  displayName: config.displayName ?? slug,
5359
5341
  status: config.status ?? "unknown",
5360
5342
  model: config.model ?? "",
5361
- liveMemory: config.liveMemory ?? false,
5362
5343
  knowledgeKeywords: config.knowledgeKeywords ?? []
5363
5344
  }
5364
5345
  );
@@ -14,7 +14,7 @@ import {
14
14
  sanitizeClientCorrId,
15
15
  vncLog,
16
16
  websockifyLog
17
- } from "./chunk-ZY6W3UA2.js";
17
+ } from "./chunk-SRO5RFMV.js";
18
18
  import "./chunk-PFF6I7KP.js";
19
19
 
20
20
  // server/edge.ts
@@ -91,7 +91,7 @@ import {
91
91
  vncLog,
92
92
  walkPremiumBundles,
93
93
  writeAdminUserAndPerson
94
- } from "./chunk-ZY6W3UA2.js";
94
+ } from "./chunk-SRO5RFMV.js";
95
95
  import {
96
96
  __commonJS,
97
97
  __toESM
@@ -4169,7 +4169,6 @@ async function managerSpawn(opts) {
4169
4169
  channel: opts.channel,
4170
4170
  accountId: opts.accountId,
4171
4171
  agentSlug: opts.agentSlug,
4172
- liveMemory: opts.liveMemory,
4173
4172
  attachmentDir: opts.attachmentDir,
4174
4173
  aboutOwner: opts.aboutOwner,
4175
4174
  dormantPlugins: opts.dormantPlugins,
@@ -4371,19 +4370,49 @@ async function firePublicSessionEndReview(input) {
4371
4370
  }
4372
4371
 
4373
4372
  // app/lib/channel-pty-bridge/follower.ts
4373
+ function followerPendingMaxMs() {
4374
+ return Number(process.env.CHANNEL_PTY_FOLLOWER_PENDING_MAX_MS ?? String(3e5));
4375
+ }
4376
+ function followerRetryMs() {
4377
+ return Number(process.env.CHANNEL_PTY_FOLLOWER_RETRY_MS ?? String(1e3));
4378
+ }
4374
4379
  function startFollower(opts) {
4375
4380
  const abort = new AbortController();
4376
4381
  const { entry, tag } = opts;
4377
4382
  void (async () => {
4378
4383
  try {
4379
- const res = await fetch(managerLogFollowUrl(entry.sessionId), {
4380
- signal: abort.signal
4381
- });
4384
+ const sid = entry.sessionId.slice(0, 8);
4385
+ const deadline = Date.now() + followerPendingMaxMs();
4386
+ const retryMs = followerRetryMs();
4387
+ let res;
4388
+ let attempt = 0;
4389
+ for (; ; ) {
4390
+ res = await fetch(managerLogFollowUrl(entry.sessionId), {
4391
+ signal: abort.signal
4392
+ });
4393
+ console.error(`${tag} follower-connect sessionId=${sid} status=${res.status}`);
4394
+ if (res.status === 202) {
4395
+ attempt += 1;
4396
+ await res.body?.cancel().catch(() => {
4397
+ });
4398
+ if (abort.signal.aborted) return;
4399
+ if (Date.now() >= deadline) {
4400
+ console.error(`${tag} follower-give-up sessionId=${sid} reason=pending-timeout attempts=${attempt}`);
4401
+ opts.onError?.("follow-pending-timeout");
4402
+ return;
4403
+ }
4404
+ console.error(`${tag} follower-retry sessionId=${sid} attempt=${attempt} reason=pending`);
4405
+ await new Promise((r) => setTimeout(r, retryMs));
4406
+ if (abort.signal.aborted) return;
4407
+ continue;
4408
+ }
4409
+ break;
4410
+ }
4382
4411
  if (!res.ok || !res.body) {
4383
4412
  opts.onError?.(`follow-status-${res.status}`);
4384
- opts.onClose();
4385
4413
  return;
4386
4414
  }
4415
+ console.error(`${tag} follower-open sessionId=${sid}`);
4387
4416
  const reader = res.body.getReader();
4388
4417
  const decoder = new TextDecoder("utf8");
4389
4418
  let buffered = "";
@@ -4460,15 +4489,15 @@ function publicIdleMs() {
4460
4489
  return Number(process.env.CHANNEL_PTY_IDLE_MS ?? String(30 * 6e4));
4461
4490
  }
4462
4491
  var index = /* @__PURE__ */ new Map();
4463
- function indexKey(accountId, agentSlug, senderId, liveMemory, sliceToken = "") {
4492
+ function indexKey(accountId, agentSlug, senderId, sliceToken = "") {
4464
4493
  const slice = sliceToken && sliceToken.length > 0 ? sliceToken : "open";
4465
- return `${accountId}:${agentSlug}:${liveMemory ? "lm1" : "lm0"}:${slice}:${senderId}`;
4494
+ return `${accountId}:${agentSlug}:${slice}:${senderId}`;
4466
4495
  }
4467
4496
  async function ensureEntry(input) {
4468
4497
  startReaper();
4469
4498
  const sliceTokenValue = input.sliceToken ?? "";
4470
4499
  const personIdValue = input.personId ?? null;
4471
- const key = indexKey(input.accountId, input.agentSlug, input.senderId, input.liveMemory, sliceTokenValue);
4500
+ const key = indexKey(input.accountId, input.agentSlug, input.senderId, sliceTokenValue);
4472
4501
  const existing = index.get(key);
4473
4502
  const tag = tagFor(input.channel);
4474
4503
  if (existing) {
@@ -4491,7 +4520,6 @@ async function ensureEntry(input) {
4491
4520
  channel: input.channel,
4492
4521
  accountId: input.accountId,
4493
4522
  agentSlug: input.agentSlug,
4494
- liveMemory: input.liveMemory,
4495
4523
  attachmentDir,
4496
4524
  sliceToken: sliceTokenValue.length > 0 ? sliceTokenValue : void 0,
4497
4525
  personId: personIdValue ?? void 0
@@ -4517,7 +4545,6 @@ async function ensureEntry(input) {
4517
4545
  pendingTurnText: "",
4518
4546
  followerAbort: null,
4519
4547
  followerRunning: false,
4520
- liveMemory: input.liveMemory,
4521
4548
  sliceToken: sliceTokenValue,
4522
4549
  personId: personIdValue
4523
4550
  };
@@ -4556,14 +4583,13 @@ async function writeInput(entry, text) {
4556
4583
  dispatchFor: "exit"
4557
4584
  });
4558
4585
  }
4559
- index.delete(indexKey(entry.accountId, entry.agentSlug, entry.senderId, entry.liveMemory, entry.sliceToken));
4586
+ index.delete(indexKey(entry.accountId, entry.agentSlug, entry.senderId, entry.sliceToken));
4560
4587
  const respawned = await ensureEntry({
4561
4588
  accountId: entry.accountId,
4562
4589
  senderId: entry.senderId,
4563
4590
  role: entry.role,
4564
4591
  channel: entry.channel,
4565
4592
  agentSlug: entry.agentSlug,
4566
- liveMemory: entry.liveMemory,
4567
4593
  sliceToken: entry.sliceToken.length > 0 ? entry.sliceToken : void 0,
4568
4594
  personId: entry.personId
4569
4595
  });
@@ -4603,7 +4629,6 @@ async function dispatchOnce(input) {
4603
4629
  role: input.role,
4604
4630
  channel: input.channel,
4605
4631
  agentSlug: input.agentSlug,
4606
- liveMemory: input.liveMemory,
4607
4632
  sliceToken: input.sliceToken,
4608
4633
  personId: input.personId
4609
4634
  });
@@ -4805,11 +4830,10 @@ app2.post("/", async (c) => {
4805
4830
  }
4806
4831
  attachmentCount = stored.length;
4807
4832
  if (stored.length > 0) {
4808
- const lines = stored.map((s) => `- ${s.path} (${s.mime}, ${s.sizeBytes} bytes, original name: ${s.name})`).join("\n");
4833
+ const names = stored.map((s) => s.name).join(", ");
4809
4834
  uploadNote = `
4810
4835
 
4811
- [The user uploaded ${stored.length} file(s). Use the Read tool to view the contents:
4812
- ${lines}]`;
4836
+ [The user uploaded ${stored.length} file(s): ${names}. You cannot open uploaded files in this session \u2014 ask the visitor to describe or paste the relevant content.]`;
4813
4837
  }
4814
4838
  } else {
4815
4839
  requestFormat = "json";
@@ -4854,11 +4878,9 @@ ${lines}]`;
4854
4878
  if (!agentSlug) {
4855
4879
  return c.json({ error: "No default agent configured" }, 500);
4856
4880
  }
4857
- let liveMemory = false;
4858
4881
  let accessMode = "open";
4859
4882
  try {
4860
4883
  const config = resolveAgentConfig(account.accountDir, agentSlug);
4861
- liveMemory = config.liveMemory;
4862
4884
  accessMode = config.accessMode;
4863
4885
  } catch (err) {
4864
4886
  const m = err instanceof Error ? err.message : String(err);
@@ -4899,7 +4921,6 @@ ${lines}]`;
4899
4921
  role: "public",
4900
4922
  channel: "webchat",
4901
4923
  agentSlug,
4902
- liveMemory,
4903
4924
  sliceToken,
4904
4925
  personId,
4905
4926
  text: fullMessage,
@@ -14502,7 +14523,6 @@ async function dispatchToClaude(input) {
14502
14523
  role: input.role,
14503
14524
  channel: "whatsapp",
14504
14525
  agentSlug: input.agentSlug,
14505
- liveMemory: input.liveMemory,
14506
14526
  text: input.text,
14507
14527
  timeoutMs: whatsappTurnTimeoutMs()
14508
14528
  });
@@ -15627,10 +15647,8 @@ init({
15627
15647
  if (process.env.WHATSAPP_PTY_BRIDGE_ENABLED === "true" && msg.text && !msg.isOwnerMirror) {
15628
15648
  try {
15629
15649
  let agentSlugForBridge;
15630
- let liveMemoryForBridge;
15631
15650
  if (msg.agentType === "admin") {
15632
15651
  agentSlugForBridge = "admin";
15633
- liveMemoryForBridge = true;
15634
15652
  } else {
15635
15653
  const resolved = bootAccount ? resolvePublicAgent(bootAccount.accountDir, { accountId: msg.accountId, groupJid: msg.groupJid }) : null;
15636
15654
  if (!resolved) {
@@ -15638,7 +15656,6 @@ init({
15638
15656
  return;
15639
15657
  }
15640
15658
  agentSlugForBridge = resolved.slug;
15641
- liveMemoryForBridge = bootAccount ? resolveAgentConfig(bootAccount.accountDir, resolved.slug).liveMemory : false;
15642
15659
  }
15643
15660
  startReaper2();
15644
15661
  await dispatchToClaude({
@@ -15646,7 +15663,6 @@ init({
15646
15663
  senderId: msg.senderPhone,
15647
15664
  role: msg.agentType,
15648
15665
  agentSlug: agentSlugForBridge,
15649
- liveMemory: liveMemoryForBridge,
15650
15666
  text: msg.text,
15651
15667
  reply: msg.reply
15652
15668
  });