agent-coord-mcp 0.25.4 → 0.26.0
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/dist/server.js +2 -2
- package/dist/server.js.map +1 -1
- package/dist/tools/rooms.js +77 -3
- package/dist/tools/rooms.js.map +1 -1
- package/hooks/submit.mjs +33 -7
- package/hooks/tier.mjs +11 -2
- package/hooks/tmux-pusher.mjs +170 -14
- package/package.json +3 -3
- package/scripts/check-optional-call.mjs +85 -0
- package/scripts/check-test-count.mjs +1 -1
- package/scripts/coord-pusher.mjs +6 -7
- package/src/server.ts +2 -2
- package/src/tools/rooms.ts +92 -4
package/dist/server.js
CHANGED
|
@@ -160,7 +160,7 @@ function buildServer(initialBound, opts = {}) {
|
|
|
160
160
|
}
|
|
161
161
|
const server = new McpServer({
|
|
162
162
|
name: "agent-coord",
|
|
163
|
-
version: "0.25.
|
|
163
|
+
version: "0.25.5",
|
|
164
164
|
});
|
|
165
165
|
const addTool = (name, description, inputSchema, cb) => {
|
|
166
166
|
server.registerTool(name, { description, inputSchema: z.object(inputSchema) }, async (args) => cb((args ?? {})));
|
|
@@ -201,7 +201,7 @@ function buildServer(initialBound, opts = {}) {
|
|
|
201
201
|
addTool("join_room", "Join a channel (creating it if new). Adds this agent to the channel's membership so the notification hooks push its messages. Posts a system join notice to the channel. Returns the channel's topic, MOTD, member list, and unread message count — but not the messages themselves. Call read_messages to fetch history if needed.", joinRoomSchema, gate("agentId", joinRoomTool));
|
|
202
202
|
addTool("leave_room", "Leave a channel — removes this agent from its membership. Cannot leave the default 'general' channel.", leaveRoomSchema, gate("agentId", leaveRoomTool));
|
|
203
203
|
addTool("set_room_topic", "Set a channel's topic (a short one-line description). Posts a system notice to the channel.", setRoomTopicSchema, gate("agentId", setRoomTopicTool));
|
|
204
|
-
addTool("set_room_motd", "Set a channel's MOTD / room rules (shown to agents on join). Posts a system notice to the channel.", setRoomMotdSchema, gate("agentId", setRoomMotdTool));
|
|
204
|
+
addTool("set_room_motd", "Set or EDIT a channel's MOTD / room rules (shown to agents on join). Pass exactly ONE of: `motd` (replace the whole thing), `motdAppend` (add a clause, newline-joined), or `motdPatch:{find,replace}` (replace one unique substring — refuses if `find` matches zero times or more than once, rather than silently no-op'ing or patching the wrong clause). Prefer append/patch: a whole-string rewrite of a large MOTD costs as much as the doctrine it corrects, which is how stale rules survive. The response does NOT echo the MOTD body back (read it with list_rooms) and reports `bytes`/`bytesBefore`, plus a warning past 4096 bytes suggesting the doctrine move to a repo file with a short pointer here. Posts a system notice to the channel.", setRoomMotdSchema, gate("agentId", setRoomMotdTool));
|
|
205
205
|
addTool("rename_agent", "Rename an agent (NICK): migrates its registry entry, inbox, cursor, and channel memberships to the new id, then broadcasts a rename notice to its channels. When tokens.json identity binding is on, the caller's bearer token is atomically rotated to the new id so the same session keeps authenticating after rename. If a live tmux-push transport is attached it is detached first (the pusher is bound to the old id) — re-attach as the new id (join/attach_agent) to restore real-time delivery; the response sets detachedTransport + a warning when this happens.", renameAgentSchema,
|
|
206
206
|
// Special: after a successful rename we update the session's bound id
|
|
207
207
|
// too, so the same session can keep operating under the new name without
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/rooms.js
CHANGED
|
@@ -70,17 +70,91 @@ export async function setRoomTopicTool(args) {
|
|
|
70
70
|
await appendJsonl(roomFile(chan), sysMsg(args.agentId, chan, `changed topic to: ${args.topic}`));
|
|
71
71
|
return { ok: true, room: chan, topic: args.topic };
|
|
72
72
|
}
|
|
73
|
+
// Whole-string-only writes made a one-clause edit cost a full rewrite, and the
|
|
74
|
+
// bill was paid in STALE DOCTRINE, not tokens. One room's MOTD reached 33,870
|
|
75
|
+
// bytes (every other room on the bus: 0–739). At that size a one-line rule
|
|
76
|
+
// change costs ~34KB in AND ~34KB back out in the echoed response, so a rule
|
|
77
|
+
// routing escalations to a role that had just been deleted was LEFT STANDING —
|
|
78
|
+
// another 34KB write "wasn't worth one stale clause". A MOTD nobody can afford
|
|
79
|
+
// to correct is worse than a short one that is merely incomplete.
|
|
80
|
+
//
|
|
81
|
+
// So: append and find/replace, and the response no longer echoes the body back.
|
|
82
|
+
const MOTD_SOFT_LIMIT = 4096;
|
|
73
83
|
export const setRoomMotdSchema = {
|
|
74
84
|
agentId: z.string().min(1),
|
|
75
85
|
room: z.string().min(1),
|
|
76
|
-
motd
|
|
86
|
+
// Exactly one of these. `motd` stays first and stays supported — this is an
|
|
87
|
+
// addition, not a migration.
|
|
88
|
+
motd: z.string().optional(),
|
|
89
|
+
// Append a clause. Joined with a newline; no separator is invented.
|
|
90
|
+
motdAppend: z.string().min(1).optional(),
|
|
91
|
+
// Replace the FIRST occurrence of `find`. Refuses on no match and on multiple
|
|
92
|
+
// matches: a patch that silently hits nothing is the failure mode this whole
|
|
93
|
+
// item exists to remove, and one that hits the wrong clause of several is
|
|
94
|
+
// worse than refusing.
|
|
95
|
+
motdPatch: z.object({ find: z.string().min(1), replace: z.string() }).optional(),
|
|
77
96
|
};
|
|
78
97
|
export async function setRoomMotdTool(args) {
|
|
79
98
|
const chan = normalizeRoom(args.room);
|
|
99
|
+
const given = ["motd", "motdAppend", "motdPatch"].filter((k) => args[k] !== undefined);
|
|
100
|
+
if (given.length === 0) {
|
|
101
|
+
return {
|
|
102
|
+
ok: false,
|
|
103
|
+
error: "pass exactly one of motd (replace whole), motdAppend (add a clause), motdPatch {find, replace}",
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
if (given.length > 1) {
|
|
107
|
+
return { ok: false, error: `pass ONE of motd/motdAppend/motdPatch — got ${given.join(", ")}` };
|
|
108
|
+
}
|
|
80
109
|
await ensureRoom(chan, args.agentId);
|
|
81
|
-
|
|
110
|
+
const rooms = await getRooms();
|
|
111
|
+
const before = rooms[chan]?.motd ?? "";
|
|
112
|
+
let next;
|
|
113
|
+
let how;
|
|
114
|
+
if (args.motd !== undefined) {
|
|
115
|
+
next = args.motd;
|
|
116
|
+
how = "replaced";
|
|
117
|
+
}
|
|
118
|
+
else if (args.motdAppend !== undefined) {
|
|
119
|
+
next = before ? `${before}\n${args.motdAppend}` : args.motdAppend;
|
|
120
|
+
how = "appended to";
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
const { find, replace } = args.motdPatch;
|
|
124
|
+
const first = before.indexOf(find);
|
|
125
|
+
if (first === -1) {
|
|
126
|
+
return {
|
|
127
|
+
ok: false,
|
|
128
|
+
error: `motdPatch found no match for ${JSON.stringify(find)} — the MOTD is unchanged. Read it with list_rooms and patch a string that is actually in it.`,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
if (before.indexOf(find, first + find.length) !== -1) {
|
|
132
|
+
return {
|
|
133
|
+
ok: false,
|
|
134
|
+
error: `motdPatch matched ${JSON.stringify(find)} more than once — refusing rather than guessing which clause you meant. Extend 'find' until it is unique.`,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
next = before.slice(0, first) + replace + before.slice(first + find.length);
|
|
138
|
+
how = "patched";
|
|
139
|
+
}
|
|
140
|
+
await setRoomMeta(chan, { motd: next }, args.agentId);
|
|
82
141
|
await appendJsonl(roomFile(chan), sysMsg(args.agentId, chan, `updated the room rules (MOTD)`));
|
|
83
|
-
|
|
142
|
+
// Deliberately NOT echoing `motd` back. It cost as much as the write itself,
|
|
143
|
+
// for a value the caller either just supplied or can read with list_rooms.
|
|
144
|
+
return {
|
|
145
|
+
ok: true,
|
|
146
|
+
room: chan,
|
|
147
|
+
how,
|
|
148
|
+
bytes: Buffer.byteLength(next, "utf8"),
|
|
149
|
+
bytesBefore: Buffer.byteLength(before, "utf8"),
|
|
150
|
+
...(Buffer.byteLength(next, "utf8") > MOTD_SOFT_LIMIT
|
|
151
|
+
? {
|
|
152
|
+
warning: `MOTD is ${Buffer.byteLength(next, "utf8")} bytes (soft limit ${MOTD_SOFT_LIMIT}). Every agent reads this on join. ` +
|
|
153
|
+
`Past this size the doctrine belongs in a repo file with a short pointer here — an MOTD too expensive to correct goes stale, ` +
|
|
154
|
+
`which costs more than it saves. motdAppend/motdPatch make small corrections cheap either way.`,
|
|
155
|
+
}
|
|
156
|
+
: {}),
|
|
157
|
+
};
|
|
84
158
|
}
|
|
85
159
|
// ---------- delete_room ----------
|
|
86
160
|
export const deleteRoomSchema = {
|
package/dist/tools/rooms.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rooms.js","sourceRoot":"","sources":["../../src/tools/rooms.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"rooms.js","sourceRoot":"","sources":["../../src/tools/rooms.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAEL,UAAU,EACV,YAAY,EAGZ,SAAS,EAET,UAAU,EAEV,SAAS,EACT,WAAW,EACX,UAAU,EACV,UAAU,EACV,UAAU,EAEV,QAAQ,EAER,eAAe,EAKf,aAAa,EAEb,QAAQ,EACR,SAAS,EAGT,YAAY,EAEZ,QAAQ,EAER,WAAW,EAMX,UAAU,GAEX,MAAM,aAAa,CAAC;AACrB,OAAO,EASL,SAAS,EAET,MAAM,GAKP,MAAM,aAAa,CAAC;AAErB,6CAA6C;AAE7C,MAAM,CAAC,MAAM,eAAe,GAAG,EAAW,CAAC;AAE3C,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,GAAG,GAAG,MAAM,QAAQ,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAG,EAAE,CAAC;IACjB,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,GAAG,MAAM,SAAS,CAAU,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QACtD,KAAK,CAAC,IAAI,CAAC;YACT,IAAI;YACJ,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,EAAE;YACxB,WAAW,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,MAAM;YACrC,YAAY,EAAE,IAAI,CAAC,MAAM;YACzB,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS;YAC1D,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,SAAS,EAAE,CAAC,CAAC,SAAS;SACvB,CAAC,CAAC;IACL,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,CAAC;AACnB,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CACxB,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAuC;IACxE,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACpC,MAAM,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,aAAa,CAAC,CAAC,CAAC;IAC5F,MAAM,GAAG,GAAG,MAAM,QAAQ,EAAE,CAAC;IAC7B,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;IACpB,MAAM,GAAG,GAAG,MAAM,SAAS,CAAU,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAS,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;IACpE,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;IACzE,OAAO;QACL,EAAE,EAAE,IAAI;QACR,IAAI,EAAE,IAAI;QACV,KAAK,EAAE,CAAC,EAAE,KAAK;QACf,IAAI,EAAE,CAAC,EAAE,IAAI;QACb,OAAO,EAAE,CAAC,EAAE,OAAO,IAAI,EAAE;QACzB,MAAM;KACP,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CACxB,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAuC;IACzE,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;QAC1B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,kCAAkC,EAAE,CAAC;IAClE,CAAC;IACD,MAAM,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACvC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AAClC,CAAC;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;CAClB,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAsD;IAC3F,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,WAAW,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7D,MAAM,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,qBAAqB,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACjG,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;AACrD,CAAC;AAED,+EAA+E;AAC/E,8EAA8E;AAC9E,2EAA2E;AAC3E,6EAA6E;AAC7E,+EAA+E;AAC/E,+EAA+E;AAC/E,kEAAkE;AAClE,EAAE;AACF,gFAAgF;AAChF,MAAM,eAAe,GAAG,IAAI,CAAC;AAE7B,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,4EAA4E;IAC5E,6BAA6B;IAC7B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,oEAAoE;IACpE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACxC,8EAA8E;IAC9E,6EAA6E;IAC7E,0EAA0E;IAC1E,uBAAuB;IACvB,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE;CACjF,CAAC;AAUF,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAc;IAClD,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,KAAK,GAAG,CAAC,MAAM,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC,MAAM,CACtD,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAmB,CAAC,KAAK,SAAS,CAC/C,CAAC;IACF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO;YACL,EAAE,EAAE,KAAc;YAClB,KAAK,EAAE,gGAAgG;SACxG,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO,EAAE,EAAE,EAAE,KAAc,EAAE,KAAK,EAAE,+CAA+C,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;IAC1G,CAAC;IAED,MAAM,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,MAAM,QAAQ,EAAE,CAAC;IAC/B,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC;IAEvC,IAAI,IAAY,CAAC;IACjB,IAAI,GAAW,CAAC;IAChB,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC5B,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACjB,GAAG,GAAG,UAAU,CAAC;IACnB,CAAC;SAAM,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACzC,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,KAAK,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;QAClE,GAAG,GAAG,aAAa,CAAC;IACtB,CAAC;SAAM,CAAC;QACN,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,SAAU,CAAC;QAC1C,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YACjB,OAAO;gBACL,EAAE,EAAE,KAAc;gBAClB,KAAK,EAAE,gCAAgC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,8FAA8F;aAC1J,CAAC;QACJ,CAAC;QACD,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YACrD,OAAO;gBACL,EAAE,EAAE,KAAc;gBAClB,KAAK,EAAE,qBAAqB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,2GAA2G;aAC5J,CAAC;QACJ,CAAC;QACD,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;QAC5E,GAAG,GAAG,SAAS,CAAC;IAClB,CAAC;IAED,MAAM,WAAW,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACtD,MAAM,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,+BAA+B,CAAC,CAAC,CAAC;IAE/F,6EAA6E;IAC7E,2EAA2E;IAC3E,OAAO;QACL,EAAE,EAAE,IAAa;QACjB,IAAI,EAAE,IAAI;QACV,GAAG;QACH,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC;QACtC,WAAW,EAAE,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC;QAC9C,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,eAAe;YACnD,CAAC,CAAC;gBACE,OAAO,EACL,WAAW,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,sBAAsB,eAAe,qCAAqC;oBACpH,8HAA8H;oBAC9H,+FAA+F;aAClG;YACH,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;AACJ,CAAC;AAED,oCAAoC;AAEpC,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,yDAAyD;IACzD,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;CAC9B,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAwD;IAC3F,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,IAAI,KAAK,YAAY;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,mCAAmC,EAAE,CAAC;IAE5F,MAAM,KAAK,GAAG,MAAM,QAAQ,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,IAAI,kBAAkB,EAAE,CAAC;IAEzE,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC;IACpC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QACtC,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,SAAS,IAAI,eAAe,OAAO,CAAC,MAAM,eAAe,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,qCAAqC;YACvH,OAAO;SACR,CAAC;IACJ,CAAC;IAED,8BAA8B;IAC9B,MAAM,UAAU,CAAe,UAAU,EAAE,EAAE,EAAE,CAAC,OAAO,EAAE,EAAE;QACzD,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;QACrB,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,iCAAiC;IACjC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC5B,MAAM,WAAW,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;IAE3C,6EAA6E;IAC7E,sBAAsB;IACtB,MAAM,eAAe,GAAa,EAAE,CAAC;IACrC,KAAK,MAAM,KAAK,IAAI,MAAM,eAAe,EAAE,EAAE,CAAC;QAC5C,MAAM,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACxC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAChD,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,MAAM,UAAU,CAAS,UAAU,EAAE,EAAE,EAAE,CAAC,OAAO,EAAE,EAAE;YACnD,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;gBAC9C,OAAO,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;gBACjC,OAAO,GAAG,IAAI,CAAC;YACjB,CAAC;YACD,OAAO,OAAO,CAAC;QACjB,CAAC,CAAC,CAAC;QACH,IAAI,OAAO;YAAE,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,WAAW,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,oBAAoB,IAAI,EAAE,CAAC,CAAC,CAAC;IAC7F,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC;AACzE,CAAC"}
|
package/hooks/submit.mjs
CHANGED
|
@@ -182,6 +182,20 @@ export function partitionStyledLine(styledLine) {
|
|
|
182
182
|
// lesson is narrower than "test on a real TUI": a check that reads scrollback
|
|
183
183
|
// has to be tested against a pane that HAS scrollback.
|
|
184
184
|
//
|
|
185
|
+
// Claude Code collapses a long bracketed paste into a chip in the input:
|
|
186
|
+
// ❯ [Pasted text #14 +9 lines]
|
|
187
|
+
// That chip IS the landed paste — the full payload never appears as plain
|
|
188
|
+
// text. Treating it as "not landed" was the intermittent Enter miss David hit:
|
|
189
|
+
// landedInInput returned false → Enter was refused → chip sat forever. The
|
|
190
|
+
// opposite failure (chip still sitting after Enter, verifier saying "gone"
|
|
191
|
+
// because the payload string isn't in the chip label) is handled in
|
|
192
|
+
// stillInInput below.
|
|
193
|
+
export const PASTE_CHIP_RE = /\[Pasted text #\d+/i;
|
|
194
|
+
|
|
195
|
+
export function isPasteChip(draft) {
|
|
196
|
+
return PASTE_CHIP_RE.test(String(draft ?? ""));
|
|
197
|
+
}
|
|
198
|
+
|
|
185
199
|
// Returns true = still waiting in the input, false = gone (submitted),
|
|
186
200
|
// null = UNKNOWN. Unknown is never upgraded to a confirmation: no pane text,
|
|
187
201
|
// or no line matching AGENT_COORD_PROMPT_PATTERN, means we cannot tell.
|
|
@@ -191,7 +205,12 @@ export function stillInInput(paneText, payload) {
|
|
|
191
205
|
if (!needle) return false;
|
|
192
206
|
const { draft } = readPaneState(paneText);
|
|
193
207
|
if (draft === null) return null; // no recognizable input line — cannot tell
|
|
194
|
-
|
|
208
|
+
const d = squash(draft);
|
|
209
|
+
if (!d) return false;
|
|
210
|
+
// A paste chip still in the input means Enter did not submit — regardless
|
|
211
|
+
// of whether the full payload string is visible inside the chip label.
|
|
212
|
+
if (isPasteChip(d)) return true;
|
|
213
|
+
return d.includes(needle);
|
|
195
214
|
}
|
|
196
215
|
|
|
197
216
|
// Has the PASTED payload appeared in the input line yet? Distinct from
|
|
@@ -209,6 +228,8 @@ export function landedInInput(paneText, payload) {
|
|
|
209
228
|
if (draft === null) return null;
|
|
210
229
|
const d = squash(draft);
|
|
211
230
|
if (!d) return false;
|
|
231
|
+
// Claude Code paste chip = landed (collapsed). See PASTE_CHIP_RE.
|
|
232
|
+
if (isPasteChip(d)) return true;
|
|
212
233
|
if (d.includes(needle.slice(0, 32))) return true; // draft carries the payload head
|
|
213
234
|
return needle.includes(d) && d.length >= 8; // visible draft is a genuine fragment of the payload
|
|
214
235
|
}
|
|
@@ -336,12 +357,17 @@ export async function submitControl(deps, payload) {
|
|
|
336
357
|
// run(args) -> {status, stdout, stderr} // spawnSync-shaped
|
|
337
358
|
// target, buffer // tmux -t target, buffer name
|
|
338
359
|
//
|
|
339
|
-
// Returns {submitted, verified, reason?, attempts}.
|
|
340
|
-
//
|
|
341
|
-
//
|
|
342
|
-
//
|
|
343
|
-
|
|
360
|
+
// Returns {submitted, verified, reason?, attempts}.
|
|
361
|
+
//
|
|
362
|
+
// Bracketed peer content verifies by DEFAULT. The old hot-path shortcut
|
|
363
|
+
// (`verify:false` → fire-and-forget Enter) left Claude Code paste chips
|
|
364
|
+
// (`[Pasted text #N +X lines]`) sitting unsubmitted whenever Enter was
|
|
365
|
+
// dropped or refused — no retry, no receipt of failure. Control commands
|
|
366
|
+
// already verified; peer traffic gets the same loop now. Pass
|
|
367
|
+
// `verify:false` explicitly to opt out (unknown-TUI / test escape hatch).
|
|
368
|
+
export async function pasteAndSubmit(deps, payload, { bracketed = false, verify } = {}) {
|
|
344
369
|
const { run, runStdin, target, buffer } = deps;
|
|
370
|
+
const doVerify = verify === undefined ? bracketed : verify;
|
|
345
371
|
|
|
346
372
|
await runStdin(["load-buffer", "-b", buffer, "-"], payload);
|
|
347
373
|
const paste = run(["paste-buffer", ...(bracketed ? ["-p"] : []), "-b", buffer, "-t", target, "-d"]);
|
|
@@ -378,7 +404,7 @@ export async function pasteAndSubmit(deps, payload, { bracketed = false, verify
|
|
|
378
404
|
await sleep(ENTER_GAP_MS());
|
|
379
405
|
run(["send-keys", "-t", target, "Enter"]);
|
|
380
406
|
|
|
381
|
-
if (!
|
|
407
|
+
if (!doVerify) return { submitted: true, verified: false, attempts: 1 };
|
|
382
408
|
|
|
383
409
|
const retries = ENTER_RETRIES();
|
|
384
410
|
for (let attempt = 1; ; attempt++) {
|
package/hooks/tier.mjs
CHANGED
|
@@ -33,7 +33,7 @@ function tierFromRecord(rec, m, opts) {
|
|
|
33
33
|
case "go":
|
|
34
34
|
return "urgent";
|
|
35
35
|
case "scope":
|
|
36
|
-
return opts.trustedSenders?.has
|
|
36
|
+
return opts.trustedSenders?.has(m.from) ? "urgent" : "routine";
|
|
37
37
|
case "done":
|
|
38
38
|
return wakesOnDone(opts) ? "urgent" : "routine";
|
|
39
39
|
// risk / fyi / action / verdict: real semantics, but not a reason to
|
|
@@ -98,7 +98,7 @@ export function classifyTier(m, opts = {}) {
|
|
|
98
98
|
// Countersigned scope change — only honored from a trusted sender
|
|
99
99
|
// (coordinator/gate ids), since `from` is otherwise unauthenticated.
|
|
100
100
|
if (/^SCOPE(?: CHANGE)?:/.test(text)) {
|
|
101
|
-
return opts.trustedSenders?.has
|
|
101
|
+
return opts.trustedSenders?.has(m.from) ? "urgent" : "routine";
|
|
102
102
|
}
|
|
103
103
|
// DONE: wakes the merge gate (QA/coordinator) OR ci (express-lane).
|
|
104
104
|
// Classification lives on the GO (`gate: express`), not on the DONE line.
|
|
@@ -169,6 +169,15 @@ export class TierQueue {
|
|
|
169
169
|
size() {
|
|
170
170
|
return this.routine.length;
|
|
171
171
|
}
|
|
172
|
+
// Discard the queued backlog WITHOUT delivering it. Only for a rewind to the
|
|
173
|
+
// on-disk cursor (see suspendPush): the messages stay in the inbox file with
|
|
174
|
+
// the cursor still before them, so dropping them here loses nothing and
|
|
175
|
+
// keeping them would re-deliver on resume, after re-collection had already
|
|
176
|
+
// staged them again.
|
|
177
|
+
drain() {
|
|
178
|
+
this.routine = [];
|
|
179
|
+
this.oldestAt = null;
|
|
180
|
+
}
|
|
172
181
|
}
|
|
173
182
|
|
|
174
183
|
// The per-message PARSE CONTRACT line. Agent harnesses read from/room/text
|
package/hooks/tmux-pusher.mjs
CHANGED
|
@@ -18,6 +18,11 @@
|
|
|
18
18
|
* (default: accept all)
|
|
19
19
|
* AGENT_COORD_DEBOUNCE_MS coalesce window for bursts (default 1000)
|
|
20
20
|
* AGENT_COORD_POLL_MS fallback poll interval (default 1000)
|
|
21
|
+
* AGENT_COORD_RETRY_MAX_MS backoff ceiling for retrying messages the pane
|
|
22
|
+
* refused (default 60000)
|
|
23
|
+
* AGENT_COORD_GIVEUP_AFTER consecutive failed flushes before push is
|
|
24
|
+
* SUSPENDED and the agent is left to read its own
|
|
25
|
+
* traffic via read_messages (default 5)
|
|
21
26
|
* AGENT_COORD_TARGET_GRACE missed pane probes before self-exit (default 3)
|
|
22
27
|
* AGENT_COORD_MAX_QUEUE_MS max time routine (channel) traffic may queue
|
|
23
28
|
* without an urgent trigger before it flushes as
|
|
@@ -34,6 +39,25 @@
|
|
|
34
39
|
*
|
|
35
40
|
* Cursor: shares ~/agent-coord/cursors/<id>.json with the MCP server, so the
|
|
36
41
|
* agent calling read_messages won't see anything the pusher already delivered.
|
|
42
|
+
* The cursor advances ONLY past messages the pane actually accepted: inject
|
|
43
|
+
* reports back what it could not deliver, and a batch with any undelivered
|
|
44
|
+
* message commits nothing and retries just that remainder (backing off to
|
|
45
|
+
* AGENT_COORD_RETRY_MAX_MS). Delivery is therefore at-least-once, never
|
|
46
|
+
* at-most-once — a refusing pane holds traffic, it does not drain it. That is
|
|
47
|
+
* load-bearing: committing the batch whenever inject merely returned meant a
|
|
48
|
+
* shell-parked pane, a slow paste, an unrecognised prompt or a lost Enter
|
|
49
|
+
* silently discarded messages the sender had been told were delivered, and
|
|
50
|
+
* read_messages could not see them either.
|
|
51
|
+
*
|
|
52
|
+
* A pane can also be PERMANENTLY unpushable — in the field that is the common
|
|
53
|
+
* failure, not the rare one (one fleet: 1,001 of 1,004 push failures were a
|
|
54
|
+
* single agent whose TUI never matched PROMPT_PATTERN). After
|
|
55
|
+
* AGENT_COORD_GIVEUP_AFTER consecutive failures the pusher suspends and rewinds
|
|
56
|
+
* to the on-disk cursor, so the agent simply reads its own inbox. Note the
|
|
57
|
+
* division this rests on: receipts/ record whether a PUSH landed, cursors/
|
|
58
|
+
* record whether the AGENT consumed. A clean receipt run is evidence of
|
|
59
|
+
* delivery, never of receipt — an agent can be fully caught up with every push
|
|
60
|
+
* to it having failed.
|
|
37
61
|
*
|
|
38
62
|
* Do NOT enable peek-coord.mjs Stop/UserPromptSubmit hooks for the same agent
|
|
39
63
|
* while this daemon runs — both consume the same cursor and would race.
|
|
@@ -96,6 +120,10 @@ const ALLOWLIST = (process.env.AGENT_COORD_ALLOWLIST || "")
|
|
|
96
120
|
.filter(Boolean);
|
|
97
121
|
const DEBOUNCE_MS = parseInt(process.env.AGENT_COORD_DEBOUNCE_MS || "1000", 10);
|
|
98
122
|
const POLL_MS = parseInt(process.env.AGENT_COORD_POLL_MS || "1000", 10);
|
|
123
|
+
// Ceiling for the undelivered-retry backoff (see nextRetryDelay). A permanently
|
|
124
|
+
// refusing pane must keep retrying — the traffic is held, not dropped — but at
|
|
125
|
+
// a rate that costs one capture-pane a minute rather than one a second.
|
|
126
|
+
const RETRY_MAX_MS = parseInt(process.env.AGENT_COORD_RETRY_MAX_MS || "60000", 10);
|
|
99
127
|
// Consecutive missed pane probes before we conclude the target is gone and
|
|
100
128
|
// self-exit. A small grace rides out transient tmux-server hiccups.
|
|
101
129
|
const TARGET_GRACE = parseInt(process.env.AGENT_COORD_TARGET_GRACE || "3", 10);
|
|
@@ -336,6 +364,15 @@ function commitOffsets(commits) {
|
|
|
336
364
|
}
|
|
337
365
|
|
|
338
366
|
function checkOnce() {
|
|
367
|
+
// While suspended, collect NOTHING: the on-disk cursor is the sole record of
|
|
368
|
+
// what this agent still owes, and read_messages is serving it. Collecting
|
|
369
|
+
// would re-stage messages we cannot deliver, and — because offsets are
|
|
370
|
+
// absolute and applied with Math.max — a single later success would leapfrog
|
|
371
|
+
// the cursor past them and destroy exactly what the suspension protected.
|
|
372
|
+
if (pushSuspended) {
|
|
373
|
+
if (Date.now() - suspendedAt < RETRY_MAX_MS) return;
|
|
374
|
+
resumePush();
|
|
375
|
+
}
|
|
339
376
|
const cur = readCursor();
|
|
340
377
|
const staged = { msgs: [], commits: [] };
|
|
341
378
|
collectSource("DM", INBOX_FILE, "inboxOffset", cur, staged);
|
|
@@ -373,9 +410,65 @@ function checkOnce() {
|
|
|
373
410
|
scheduleFlush();
|
|
374
411
|
}
|
|
375
412
|
|
|
376
|
-
function scheduleFlush() {
|
|
413
|
+
function scheduleFlush(delayMs = DEBOUNCE_MS) {
|
|
377
414
|
if (debounceTimer) return;
|
|
378
|
-
debounceTimer = setTimeout(flush,
|
|
415
|
+
debounceTimer = setTimeout(flush, delayMs);
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
// Backoff for the undelivered-retry path. A pane parked at a shell, or a TUI
|
|
419
|
+
// whose prompt never matches PROMPT_PATTERN, fails EVERY attempt — retrying on
|
|
420
|
+
// the debounce window would spin capture-pane forever. Grows to a cap and
|
|
421
|
+
// resets the moment a batch lands whole.
|
|
422
|
+
let retryDelay = 0;
|
|
423
|
+
function nextRetryDelay() {
|
|
424
|
+
retryDelay = retryDelay === 0 ? DEBOUNCE_MS : Math.min(retryDelay * 2, RETRY_MAX_MS);
|
|
425
|
+
return retryDelay;
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
// A pane can be permanently unpushable, and in the field that is the COMMON
|
|
429
|
+
// failure — not the rare one. Measured over 11,507 receipts on one fleet: 1,004
|
|
430
|
+
// pushes failed, and 1,001 of them were a single agent whose TUI never matched
|
|
431
|
+
// PROMPT_PATTERN. Excluding it, the rest of the fleet failed 3 times in ~10,500.
|
|
432
|
+
// The distribution is bimodal: near-zero where the pattern matches, TOTAL where
|
|
433
|
+
// it does not. So "retry until it works" must not be the only behaviour — for a
|
|
434
|
+
// blackout pane it would grow `pending` without bound and re-paste the whole
|
|
435
|
+
// accumulation on every cycle.
|
|
436
|
+
//
|
|
437
|
+
// Instead: after GIVEUP_AFTER consecutive failed flushes, SUSPEND pushing and
|
|
438
|
+
// rewind in-memory state to the on-disk cursor. Nothing is lost, because the
|
|
439
|
+
// cursor was never advanced — the messages sit in the inbox file with the cursor
|
|
440
|
+
// still pointing before them, so read_messages serves them and the agent gets
|
|
441
|
+
// its traffic by polling. That is not a fallback invented here; it is what the
|
|
442
|
+
// blackout agent above was already doing.
|
|
443
|
+
const GIVEUP_AFTER = parseInt(process.env.AGENT_COORD_GIVEUP_AFTER || "5", 10);
|
|
444
|
+
let consecutiveFailures = 0;
|
|
445
|
+
let pushSuspended = false;
|
|
446
|
+
let suspendedAt = 0;
|
|
447
|
+
|
|
448
|
+
// Rewind to the on-disk cursor: forget what we staged, collected and queued.
|
|
449
|
+
// stagedOffsets MUST be cleared — it is the only thing preventing re-collection,
|
|
450
|
+
// and while suspended the on-disk cursor is the single source of truth for what
|
|
451
|
+
// this agent has yet to see.
|
|
452
|
+
function suspendPush(reason) {
|
|
453
|
+
pushSuspended = true;
|
|
454
|
+
suspendedAt = Date.now();
|
|
455
|
+
pending = [];
|
|
456
|
+
pendingCommits = [];
|
|
457
|
+
tierQueue.drain();
|
|
458
|
+
for (const k of Object.keys(stagedOffsets)) delete stagedOffsets[k];
|
|
459
|
+
process.stderr.write(
|
|
460
|
+
`[tmux-pusher] SUSPENDING push to '${TMUX_TARGET}' after ${consecutiveFailures} consecutive failures (${reason}). ` +
|
|
461
|
+
`The cursor was NOT advanced, so nothing is lost: this agent's traffic is still readable via read_messages. ` +
|
|
462
|
+
`Retrying in ${Math.round(RETRY_MAX_MS / 1000)}s. If this persists, the pane's TUI probably does not match ` +
|
|
463
|
+
`AGENT_COORD_PROMPT_PATTERN — fix that rather than waiting.\n`,
|
|
464
|
+
);
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
function resumePush() {
|
|
468
|
+
pushSuspended = false;
|
|
469
|
+
consecutiveFailures = 0;
|
|
470
|
+
retryDelay = 0;
|
|
471
|
+
process.stderr.write(`[tmux-pusher] resuming push attempts to '${TMUX_TARGET}'\n`);
|
|
379
472
|
}
|
|
380
473
|
|
|
381
474
|
async function flush() {
|
|
@@ -391,16 +484,43 @@ async function flush() {
|
|
|
391
484
|
pendingCommits = [];
|
|
392
485
|
sending = true;
|
|
393
486
|
try {
|
|
394
|
-
|
|
395
|
-
//
|
|
396
|
-
//
|
|
397
|
-
//
|
|
398
|
-
|
|
487
|
+
// injectViaTmux reports what it could NOT put in the pane. Anything it
|
|
488
|
+
// hands back was never delivered, so its offsets must not be committed —
|
|
489
|
+
// the historical bug was committing the whole batch whenever inject
|
|
490
|
+
// returned without throwing, which silently dropped every message refused
|
|
491
|
+
// by the pane guard or left unsubmitted by pasteAndSubmit ({submitted:
|
|
492
|
+
// false} RESOLVES, it does not throw). Delivered messages are dropped from
|
|
493
|
+
// the retry set, so a partially-pasted batch neither loses its tail nor
|
|
494
|
+
// re-pastes its head.
|
|
495
|
+
const undelivered = await injectViaTmux(batch);
|
|
496
|
+
if (undelivered.length === 0) {
|
|
497
|
+
// Whole batch confirmed — only now advance the shared on-disk cursor
|
|
498
|
+
// past everything it (including its coalesced routine) covers. Dying
|
|
499
|
+
// before this line means redelivery on restart, never loss.
|
|
500
|
+
commitOffsets(commits);
|
|
501
|
+
retryDelay = 0;
|
|
502
|
+
consecutiveFailures = 0;
|
|
503
|
+
return;
|
|
504
|
+
}
|
|
505
|
+
// Partial or total refusal: hold the cursor where it is and retry only the
|
|
506
|
+
// part that never landed. Offsets stay pending, so a crash here rewinds to
|
|
507
|
+
// the last confirmed delivery rather than skipping the gap.
|
|
508
|
+
consecutiveFailures++;
|
|
509
|
+
process.stderr.write(
|
|
510
|
+
`[tmux-pusher] ${undelivered.length}/${batch.length} message(s) not delivered — cursor held, will retry\n`,
|
|
511
|
+
);
|
|
512
|
+
pending = [...undelivered, ...pending];
|
|
513
|
+
pendingCommits = [...commits, ...pendingCommits];
|
|
514
|
+
if (consecutiveFailures >= GIVEUP_AFTER) {
|
|
515
|
+
suspendPush("pane is not accepting pastes");
|
|
516
|
+
return;
|
|
517
|
+
}
|
|
518
|
+
scheduleFlush(nextRetryDelay());
|
|
399
519
|
} catch (e) {
|
|
400
520
|
process.stderr.write(`[tmux-pusher] inject failed: ${e?.message ?? e}\n`);
|
|
401
521
|
pending = [...batch, ...pending];
|
|
402
522
|
pendingCommits = [...commits, ...pendingCommits];
|
|
403
|
-
scheduleFlush();
|
|
523
|
+
scheduleFlush(nextRetryDelay());
|
|
404
524
|
} finally {
|
|
405
525
|
sending = false;
|
|
406
526
|
}
|
|
@@ -413,24 +533,51 @@ async function flush() {
|
|
|
413
533
|
// banner-wrapped paste; each control command (/clear, /compact) is injected on
|
|
414
534
|
// its own as a RAW line so the TUI runs it as a slash command — a banner or
|
|
415
535
|
// `[DM …]` prefix would turn it into plain chat text instead.
|
|
536
|
+
// Returns the messages it could NOT deliver, in batch order — empty array when
|
|
537
|
+
// the whole batch landed. NEVER returns normally on a refusal it has swallowed:
|
|
538
|
+
// every path that declines to paste, or pastes without submitting, must surface
|
|
539
|
+
// here, because the caller commits the shared cursor on an empty return.
|
|
416
540
|
async function injectViaTmux(batch) {
|
|
417
541
|
// Fail-closed pane guard: never type into a pane that has dropped to a shell
|
|
418
542
|
// (crashed/exited agent CLI). Bracketed paste protects a compliant TUI, but a
|
|
419
|
-
// raw shell would execute pasted lines — so refuse and
|
|
420
|
-
// cursor
|
|
543
|
+
// raw shell would execute pasted lines — so refuse, and report the whole
|
|
544
|
+
// batch undelivered so the cursor stays put and it redelivers once the agent
|
|
545
|
+
// CLI is back. (Reporting nothing here is what made "will redeliver" a lie.)
|
|
421
546
|
const cmd = paneCurrentCommand();
|
|
422
547
|
if (cmd !== null && SHELL_COMMANDS.has(cmd)) {
|
|
423
548
|
process.stderr.write(
|
|
424
549
|
`[tmux-pusher] pane '${TMUX_TARGET}' is at a shell ('${cmd}'), not the agent CLI — skipping inject (will redeliver)\n`,
|
|
425
550
|
);
|
|
426
|
-
return;
|
|
551
|
+
return [...batch];
|
|
427
552
|
}
|
|
553
|
+
const undelivered = [];
|
|
428
554
|
let run = [];
|
|
429
555
|
const flushRun = async () => {
|
|
430
556
|
if (run.length === 0) return;
|
|
431
|
-
|
|
432
|
-
writeReceipts(run); // stamp only AFTER the paste+submit resolves
|
|
557
|
+
const inRun = run;
|
|
433
558
|
run = [];
|
|
559
|
+
let outcome;
|
|
560
|
+
try {
|
|
561
|
+
// bracketed=true → submit.mjs verifies by default (paste-chip land + Enter retry).
|
|
562
|
+
outcome = await pasteAndSubmit(formatBatch(inRun), true);
|
|
563
|
+
} catch (e) {
|
|
564
|
+
// A throw here (nonzero paste-buffer/send-keys) must not abort the whole
|
|
565
|
+
// batch: runs already pasted ARE delivered, and propagating would make
|
|
566
|
+
// the caller re-queue them and paste the head twice — the duplicate-DM
|
|
567
|
+
// symptom. Fail just this run.
|
|
568
|
+
process.stderr.write(`[tmux-pusher] peer paste failed: ${e?.message ?? e}\n`);
|
|
569
|
+
undelivered.push(...inRun);
|
|
570
|
+
return;
|
|
571
|
+
}
|
|
572
|
+
if (outcome && outcome.submitted === false) {
|
|
573
|
+
// pasteAndSubmit RESOLVES {submitted:false} for: paste never seen in the
|
|
574
|
+
// input within PASTE_VERIFY_MS, input line unreadable / no PROMPT_PATTERN
|
|
575
|
+
// match, or still-in-input after ENTER_RETRIES. All three are delivery
|
|
576
|
+
// failures, not warnings.
|
|
577
|
+
process.stderr.write(`[tmux-pusher] peer paste NOT submitted: ${outcome.reason}\n`);
|
|
578
|
+
undelivered.push(...inRun);
|
|
579
|
+
}
|
|
580
|
+
writeReceipts(inRun, outcome); // stamp only AFTER the paste+submit resolves
|
|
434
581
|
};
|
|
435
582
|
for (const m of batch) {
|
|
436
583
|
if (isControl(m)) {
|
|
@@ -438,13 +585,22 @@ async function injectViaTmux(batch) {
|
|
|
438
585
|
// Control commands are VERIFIED: capture-pane confirms the command
|
|
439
586
|
// actually left the input. A receipt that says "typed" was being read
|
|
440
587
|
// as "ran" — see writeReceipts.
|
|
441
|
-
|
|
588
|
+
let outcome;
|
|
589
|
+
try {
|
|
590
|
+
outcome = await submitControlCommand(m.text.trim());
|
|
591
|
+
} catch (e) {
|
|
592
|
+
process.stderr.write(`[tmux-pusher] control command failed: ${e?.message ?? e}\n`);
|
|
593
|
+
undelivered.push(m);
|
|
594
|
+
continue;
|
|
595
|
+
}
|
|
596
|
+
if (outcome && outcome.submitted === false) undelivered.push(m);
|
|
442
597
|
writeReceipts([m], outcome);
|
|
443
598
|
} else {
|
|
444
599
|
run.push(m);
|
|
445
600
|
}
|
|
446
601
|
}
|
|
447
602
|
await flushRun();
|
|
603
|
+
return undelivered;
|
|
448
604
|
}
|
|
449
605
|
|
|
450
606
|
// Append one delivery receipt per message AFTER it has been typed into the
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agent-coord-mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.26.0",
|
|
4
4
|
"description": "File-backed MCP server for coordinating multiple AI coding agents (Claude Code, Cursor, Cline, etc.). Local stdio or networked over Streamable HTTP.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
"@modelcontextprotocol/sdk": "^1.30.0",
|
|
47
47
|
"proper-lockfile": "^4.1.2",
|
|
48
48
|
"zod": "^4.4.3",
|
|
49
|
-
"@davidbalzan/groundwork-seam": "0.1.
|
|
49
|
+
"@davidbalzan/groundwork-seam": "0.1.3"
|
|
50
50
|
},
|
|
51
51
|
"devDependencies": {
|
|
52
52
|
"@types/node": "^26.2.0",
|
|
@@ -59,7 +59,7 @@
|
|
|
59
59
|
"build": "pnpm run clean && tsc",
|
|
60
60
|
"start": "node dist/server.js",
|
|
61
61
|
"dev": "tsx src/server.ts",
|
|
62
|
-
"pretest": "node scripts/check-self-dependency.mjs && tsc",
|
|
62
|
+
"pretest": "node scripts/check-self-dependency.mjs && node scripts/check-optional-call.mjs && tsc",
|
|
63
63
|
"test": "node scripts/check-test-count.mjs",
|
|
64
64
|
"test:raw": "node --test \"test/*.test.mjs\""
|
|
65
65
|
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/*
|
|
3
|
+
* Guard for LESSONS #41: `?.()` on a method you expect to exist converts a
|
|
4
|
+
* missing implementation into a silent success.
|
|
5
|
+
*
|
|
6
|
+
* Three sightings in one day, one of them inside the fix for the other two:
|
|
7
|
+
* - `tierQueue.drain?.()` called a method TierQueue did not have. The
|
|
8
|
+
* optional call made it a no-op, so a rewind that was supposed to discard
|
|
9
|
+
* the queued backlog silently kept it.
|
|
10
|
+
* - `opts.trustedSenders?.has?.(m.from)` twice in tier.mjs. trustedSenders is
|
|
11
|
+
* always a Set, so `.has` always exists; had it not, the optional call would
|
|
12
|
+
* return undefined → falsy → "routine", silently downgrading a trusted
|
|
13
|
+
* sender's SCOPE:/DONE: from push-now to queued. A behaviour change with no
|
|
14
|
+
* error anywhere.
|
|
15
|
+
*
|
|
16
|
+
* Optional CHAINING on a value that may legitimately be absent (`opts.x?.y`) is
|
|
17
|
+
* fine and is not flagged. What this bans is the optional CALL `?.(`, because
|
|
18
|
+
* the thing being guarded is a method on an object we own — and for those,
|
|
19
|
+
* absence is a bug to surface, not a case to tolerate.
|
|
20
|
+
*
|
|
21
|
+
* Escape hatch, for a genuinely optional callback: put `// optional-call: <why>`
|
|
22
|
+
* on the same line. That makes the tolerance a decision on the record instead of
|
|
23
|
+
* a character nobody reads.
|
|
24
|
+
*
|
|
25
|
+
* Why a script and not tsc: hooks/ is untyped .mjs while src/ is TypeScript, and
|
|
26
|
+
* `checkJs` over the daemon would need @types/node wired plus a flood of
|
|
27
|
+
* pre-existing errors triaged first. That is worth doing and is queued
|
|
28
|
+
* separately; this guard costs nothing and catches the exact class today.
|
|
29
|
+
*/
|
|
30
|
+
import { readFileSync, readdirSync, statSync } from "node:fs";
|
|
31
|
+
import path from "node:path";
|
|
32
|
+
import { fileURLToPath } from "node:url";
|
|
33
|
+
|
|
34
|
+
const PKG = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
|
|
35
|
+
const ROOTS = ["hooks", "src", "scripts"];
|
|
36
|
+
const EXT = new Set([".mjs", ".js", ".ts"]);
|
|
37
|
+
// The guard's own explanation is full of the pattern it bans.
|
|
38
|
+
const SKIP_FILES = new Set([path.join("scripts", "check-optional-call.mjs")]);
|
|
39
|
+
|
|
40
|
+
function* walk(dir) {
|
|
41
|
+
for (const e of readdirSync(dir, { withFileTypes: true })) {
|
|
42
|
+
const p = path.join(dir, e.name);
|
|
43
|
+
if (e.isDirectory()) {
|
|
44
|
+
if (e.name === "node_modules" || e.name === "dist") continue;
|
|
45
|
+
yield* walk(p);
|
|
46
|
+
} else if (EXT.has(path.extname(e.name))) {
|
|
47
|
+
yield p;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const findings = [];
|
|
53
|
+
for (const root of ROOTS) {
|
|
54
|
+
const dir = path.join(PKG, root);
|
|
55
|
+
try {
|
|
56
|
+
if (!statSync(dir).isDirectory()) continue;
|
|
57
|
+
} catch {
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
for (const file of walk(dir)) {
|
|
61
|
+
const rel = path.relative(PKG, file);
|
|
62
|
+
if (SKIP_FILES.has(rel)) continue;
|
|
63
|
+
const lines = readFileSync(file, "utf8").split("\n");
|
|
64
|
+
lines.forEach((line, i) => {
|
|
65
|
+
if (!line.includes("?.(")) return;
|
|
66
|
+
if (line.includes("optional-call:")) return;
|
|
67
|
+
findings.push(`${rel}:${i + 1}: ${line.trim()}`);
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
if (findings.length) {
|
|
73
|
+
console.error(
|
|
74
|
+
"[check-optional-call] FAIL — optional CALL `?.(` found. On a method we own, a\n" +
|
|
75
|
+
"missing implementation must throw, not silently succeed (LESSONS #41):\n",
|
|
76
|
+
);
|
|
77
|
+
for (const f of findings) console.error(` ${f}`);
|
|
78
|
+
console.error(
|
|
79
|
+
"\n Fix: call it directly (`obj.method()`), keeping any optional chaining on the\n" +
|
|
80
|
+
" OBJECT (`obj?.method()`) — that distinction is the point. If the callback is\n" +
|
|
81
|
+
" genuinely optional, annotate the line `// optional-call: <why>`.",
|
|
82
|
+
);
|
|
83
|
+
process.exit(1);
|
|
84
|
+
}
|
|
85
|
+
console.log("OK: no unjustified optional calls (`?.(`) — LESSONS #41");
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
|
|
23
23
|
import { spawn } from "node:child_process";
|
|
24
24
|
|
|
25
|
-
const EXPECTED_TESTS =
|
|
25
|
+
const EXPECTED_TESTS = 312;
|
|
26
26
|
|
|
27
27
|
const expected = Number(process.env.AGENT_COORD_EXPECTED_TESTS ?? EXPECTED_TESTS);
|
|
28
28
|
// Same glob the suite always used — `--test test/` would recurse differently
|
package/scripts/coord-pusher.mjs
CHANGED
|
@@ -300,8 +300,9 @@ async function injectViaTmux(batch) {
|
|
|
300
300
|
let run = [];
|
|
301
301
|
const flushRun = async () => {
|
|
302
302
|
if (run.length === 0) return;
|
|
303
|
-
|
|
304
|
-
await
|
|
303
|
+
// bracketed=true → submit.mjs verifies by default (paste-chip land + Enter retry).
|
|
304
|
+
const outcome = await pasteAndSubmit(formatBatch(run), true);
|
|
305
|
+
await reportReceipts(run, outcome); // stamp only AFTER the paste+submit resolves
|
|
305
306
|
run = [];
|
|
306
307
|
};
|
|
307
308
|
for (const m of batch) {
|
|
@@ -328,11 +329,9 @@ async function injectViaTmux(batch) {
|
|
|
328
329
|
// Wire counterpart to tmux-pusher's writeReceipts: this pusher cannot append
|
|
329
330
|
// to receipts/<id>.jsonl on the server's filesystem, so it reports each
|
|
330
331
|
// delivery over MCP and the server writes the same receipt line the local
|
|
331
|
-
// path does. `outcome`
|
|
332
|
-
//
|
|
333
|
-
//
|
|
334
|
-
// `submitted` means "typed but unverified" and must never be upgraded to a
|
|
335
|
-
// claim of execution this pusher did not make.
|
|
332
|
+
// path does. `outcome` carries what submit verification observed —
|
|
333
|
+
// submitted/verified/reason are forwarded for both control commands and
|
|
334
|
+
// (as of 0.25.5) bracketed peer pastes.
|
|
336
335
|
//
|
|
337
336
|
// Best-effort by design: a failed report must not break delivery or crash the
|
|
338
337
|
// inject loop (the message IS in the pane by the time we get here). The
|
package/src/server.ts
CHANGED
|
@@ -241,7 +241,7 @@ function buildServer(initialBound?: string, opts: { trackSession?: boolean } = {
|
|
|
241
241
|
|
|
242
242
|
const server = new McpServer({
|
|
243
243
|
name: "agent-coord",
|
|
244
|
-
version: "0.25.
|
|
244
|
+
version: "0.25.5",
|
|
245
245
|
});
|
|
246
246
|
|
|
247
247
|
const addTool = (
|
|
@@ -413,7 +413,7 @@ function buildServer(initialBound?: string, opts: { trackSession?: boolean } = {
|
|
|
413
413
|
|
|
414
414
|
addTool(
|
|
415
415
|
"set_room_motd",
|
|
416
|
-
"Set a channel's MOTD / room rules (shown to agents on join). Posts a system notice to the channel.",
|
|
416
|
+
"Set or EDIT a channel's MOTD / room rules (shown to agents on join). Pass exactly ONE of: `motd` (replace the whole thing), `motdAppend` (add a clause, newline-joined), or `motdPatch:{find,replace}` (replace one unique substring — refuses if `find` matches zero times or more than once, rather than silently no-op'ing or patching the wrong clause). Prefer append/patch: a whole-string rewrite of a large MOTD costs as much as the doctrine it corrects, which is how stale rules survive. The response does NOT echo the MOTD body back (read it with list_rooms) and reports `bytes`/`bytesBefore`, plus a warning past 4096 bytes suggesting the doctrine move to a repo file with a short pointer here. Posts a system notice to the channel.",
|
|
417
417
|
setRoomMotdSchema,
|
|
418
418
|
gate("agentId", setRoomMotdTool as (a: Record<string, unknown>) => Promise<unknown>),
|
|
419
419
|
);
|
package/src/tools/rooms.ts
CHANGED
|
@@ -142,18 +142,106 @@ export async function setRoomTopicTool(args: { agentId: string; room: string; to
|
|
|
142
142
|
return { ok: true, room: chan, topic: args.topic };
|
|
143
143
|
}
|
|
144
144
|
|
|
145
|
+
// Whole-string-only writes made a one-clause edit cost a full rewrite, and the
|
|
146
|
+
// bill was paid in STALE DOCTRINE, not tokens. One room's MOTD reached 33,870
|
|
147
|
+
// bytes (every other room on the bus: 0–739). At that size a one-line rule
|
|
148
|
+
// change costs ~34KB in AND ~34KB back out in the echoed response, so a rule
|
|
149
|
+
// routing escalations to a role that had just been deleted was LEFT STANDING —
|
|
150
|
+
// another 34KB write "wasn't worth one stale clause". A MOTD nobody can afford
|
|
151
|
+
// to correct is worse than a short one that is merely incomplete.
|
|
152
|
+
//
|
|
153
|
+
// So: append and find/replace, and the response no longer echoes the body back.
|
|
154
|
+
const MOTD_SOFT_LIMIT = 4096;
|
|
155
|
+
|
|
145
156
|
export const setRoomMotdSchema = {
|
|
146
157
|
agentId: z.string().min(1),
|
|
147
158
|
room: z.string().min(1),
|
|
148
|
-
motd
|
|
159
|
+
// Exactly one of these. `motd` stays first and stays supported — this is an
|
|
160
|
+
// addition, not a migration.
|
|
161
|
+
motd: z.string().optional(),
|
|
162
|
+
// Append a clause. Joined with a newline; no separator is invented.
|
|
163
|
+
motdAppend: z.string().min(1).optional(),
|
|
164
|
+
// Replace the FIRST occurrence of `find`. Refuses on no match and on multiple
|
|
165
|
+
// matches: a patch that silently hits nothing is the failure mode this whole
|
|
166
|
+
// item exists to remove, and one that hits the wrong clause of several is
|
|
167
|
+
// worse than refusing.
|
|
168
|
+
motdPatch: z.object({ find: z.string().min(1), replace: z.string() }).optional(),
|
|
169
|
+
};
|
|
170
|
+
|
|
171
|
+
type MotdArgs = {
|
|
172
|
+
agentId: string;
|
|
173
|
+
room: string;
|
|
174
|
+
motd?: string;
|
|
175
|
+
motdAppend?: string;
|
|
176
|
+
motdPatch?: { find: string; replace: string };
|
|
149
177
|
};
|
|
150
178
|
|
|
151
|
-
export async function setRoomMotdTool(args:
|
|
179
|
+
export async function setRoomMotdTool(args: MotdArgs) {
|
|
152
180
|
const chan = normalizeRoom(args.room);
|
|
181
|
+
const given = ["motd", "motdAppend", "motdPatch"].filter(
|
|
182
|
+
(k) => args[k as keyof MotdArgs] !== undefined,
|
|
183
|
+
);
|
|
184
|
+
if (given.length === 0) {
|
|
185
|
+
return {
|
|
186
|
+
ok: false as const,
|
|
187
|
+
error: "pass exactly one of motd (replace whole), motdAppend (add a clause), motdPatch {find, replace}",
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
if (given.length > 1) {
|
|
191
|
+
return { ok: false as const, error: `pass ONE of motd/motdAppend/motdPatch — got ${given.join(", ")}` };
|
|
192
|
+
}
|
|
193
|
+
|
|
153
194
|
await ensureRoom(chan, args.agentId);
|
|
154
|
-
|
|
195
|
+
const rooms = await getRooms();
|
|
196
|
+
const before = rooms[chan]?.motd ?? "";
|
|
197
|
+
|
|
198
|
+
let next: string;
|
|
199
|
+
let how: string;
|
|
200
|
+
if (args.motd !== undefined) {
|
|
201
|
+
next = args.motd;
|
|
202
|
+
how = "replaced";
|
|
203
|
+
} else if (args.motdAppend !== undefined) {
|
|
204
|
+
next = before ? `${before}\n${args.motdAppend}` : args.motdAppend;
|
|
205
|
+
how = "appended to";
|
|
206
|
+
} else {
|
|
207
|
+
const { find, replace } = args.motdPatch!;
|
|
208
|
+
const first = before.indexOf(find);
|
|
209
|
+
if (first === -1) {
|
|
210
|
+
return {
|
|
211
|
+
ok: false as const,
|
|
212
|
+
error: `motdPatch found no match for ${JSON.stringify(find)} — the MOTD is unchanged. Read it with list_rooms and patch a string that is actually in it.`,
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
if (before.indexOf(find, first + find.length) !== -1) {
|
|
216
|
+
return {
|
|
217
|
+
ok: false as const,
|
|
218
|
+
error: `motdPatch matched ${JSON.stringify(find)} more than once — refusing rather than guessing which clause you meant. Extend 'find' until it is unique.`,
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
next = before.slice(0, first) + replace + before.slice(first + find.length);
|
|
222
|
+
how = "patched";
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
await setRoomMeta(chan, { motd: next }, args.agentId);
|
|
155
226
|
await appendJsonl(roomFile(chan), sysMsg(args.agentId, chan, `updated the room rules (MOTD)`));
|
|
156
|
-
|
|
227
|
+
|
|
228
|
+
// Deliberately NOT echoing `motd` back. It cost as much as the write itself,
|
|
229
|
+
// for a value the caller either just supplied or can read with list_rooms.
|
|
230
|
+
return {
|
|
231
|
+
ok: true as const,
|
|
232
|
+
room: chan,
|
|
233
|
+
how,
|
|
234
|
+
bytes: Buffer.byteLength(next, "utf8"),
|
|
235
|
+
bytesBefore: Buffer.byteLength(before, "utf8"),
|
|
236
|
+
...(Buffer.byteLength(next, "utf8") > MOTD_SOFT_LIMIT
|
|
237
|
+
? {
|
|
238
|
+
warning:
|
|
239
|
+
`MOTD is ${Buffer.byteLength(next, "utf8")} bytes (soft limit ${MOTD_SOFT_LIMIT}). Every agent reads this on join. ` +
|
|
240
|
+
`Past this size the doctrine belongs in a repo file with a short pointer here — an MOTD too expensive to correct goes stale, ` +
|
|
241
|
+
`which costs more than it saves. motdAppend/motdPatch make small corrections cheap either way.`,
|
|
242
|
+
}
|
|
243
|
+
: {}),
|
|
244
|
+
};
|
|
157
245
|
}
|
|
158
246
|
|
|
159
247
|
// ---------- delete_room ----------
|