Fix agents.json race condition on concurrent starts
Re-read agents.json immediately before writing in startAgent to avoid one start overwriting another's entry. Also clean stale sockets before starting new agents. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -344,6 +344,7 @@ def build_messages(question, channel):
|
|||||||
if AGENT_MEMORY and AGENT_MEMORY != "# Agent Memory":
|
if AGENT_MEMORY and AGENT_MEMORY != "# Agent Memory":
|
||||||
system += f"\n\nIMPORTANT - Your persistent memory (facts you saved previously, use these to answer questions):\n{AGENT_MEMORY}"
|
system += f"\n\nIMPORTANT - Your persistent memory (facts you saved previously, use these to answer questions):\n{AGENT_MEMORY}"
|
||||||
system += f"\n\nYou are in IRC channel {channel}. Your nick is {NICK}. Keep responses concise — this is IRC."
|
system += f"\n\nYou are in IRC channel {channel}. Your nick is {NICK}. Keep responses concise — this is IRC."
|
||||||
|
system += "\nWhen you want to address another agent or user, always start your message with their nick followed by a colon, e.g. 'coder: can you review this?'. This is how IRC mentions work — without the prefix, they won't see your message."
|
||||||
|
|
||||||
messages = [{"role": "system", "content": system}]
|
messages = [{"role": "system", "content": system}]
|
||||||
|
|
||||||
|
|||||||
@@ -251,6 +251,9 @@ export async function startAgent(
|
|||||||
mkdirSync(CONFIG.socketDir, { recursive: true });
|
mkdirSync(CONFIG.socketDir, { recursive: true });
|
||||||
mkdirSync(CONFIG.runsDir, { recursive: true });
|
mkdirSync(CONFIG.runsDir, { recursive: true });
|
||||||
|
|
||||||
|
// Clean stale socket from previous run
|
||||||
|
try { unlinkSync(socketPath); } catch {}
|
||||||
|
|
||||||
// Prepare rootfs
|
// Prepare rootfs
|
||||||
copyFileSync(AGENT_ROOTFS, rootfsPath);
|
copyFileSync(AGENT_ROOTFS, rootfsPath);
|
||||||
injectAgentConfig(
|
injectAgentConfig(
|
||||||
@@ -321,8 +324,11 @@ export async function startAgent(
|
|||||||
startedAt: new Date().toISOString(),
|
startedAt: new Date().toISOString(),
|
||||||
};
|
};
|
||||||
|
|
||||||
agents[name] = info;
|
// Re-read agents.json before writing to avoid race conditions
|
||||||
saveAgents(agents);
|
// (another startAgent may have written since we last read)
|
||||||
|
const currentAgents = loadAgents();
|
||||||
|
currentAgents[name] = info;
|
||||||
|
saveAgents(currentAgents);
|
||||||
|
|
||||||
log(`Agent "${name}" started: nick=${nick} ip=${ip}`);
|
log(`Agent "${name}" started: nick=${nick} ip=${ip}`);
|
||||||
return info;
|
return info;
|
||||||
|
|||||||
@@ -197,7 +197,7 @@ export async function runOverseer(config: OverseerConfig) {
|
|||||||
for (const name of knownAgents) {
|
for (const name of knownAgents) {
|
||||||
if (!currentNames.has(name)) {
|
if (!currentNames.has(name)) {
|
||||||
log(`Agent "${name}" died, cleaned up.`);
|
log(`Agent "${name}" died, cleaned up.`);
|
||||||
bot.say("#agents", `Agent "${name}" has died and been cleaned up.`);
|
bot.say(config.channel, `Agent "${name}" has died and been cleaned up.`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
knownAgents = currentNames;
|
knownAgents = currentNames;
|
||||||
|
|||||||
Reference in New Issue
Block a user