agent-coord-mcp 0.25.5 → 0.26.1
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 +1 -1
- package/dist/server.js.map +1 -1
- package/dist/tools/rooms.js +77 -3
- package/dist/tools/rooms.js.map +1 -1
- package/hooks/tier.mjs +11 -2
- package/hooks/tmux-pusher.mjs +193 -18
- package/package.json +3 -3
- package/scripts/check-optional-call.mjs +85 -0
- package/scripts/check-test-count.mjs +1 -1
- package/src/server.ts +1 -1
- package/src/tools/rooms.ts +92 -4
package/dist/server.js
CHANGED
|
@@ -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":";AACA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAmC,MAAM,WAAW,CAAC;AAC1E,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AACnG,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,CAAC,EAAoB,MAAM,KAAK,CAAC;AAC1C,OAAO,EACL,UAAU,EACV,WAAW,EACX,kBAAkB,EAClB,WAAW,GAEZ,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,YAAY,EACZ,UAAU,EACV,qBAAqB,EACrB,mBAAmB,EACnB,eAAe,EACf,aAAa,EACb,cAAc,EACd,YAAY,EACZ,UAAU,EACV,QAAQ,EACR,eAAe,EACf,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,UAAU,EACV,QAAQ,EACR,eAAe,EACf,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,WAAW,EACX,SAAS,EACT,kBAAkB,EAClB,gBAAgB,EAChB,qBAAqB,EACrB,mBAAmB,EACnB,yBAAyB,EACzB,uBAAuB,EACvB,cAAc,EACd,YAAY,EACZ,iBAAiB,EACjB,eAAe,EACf,mBAAmB,EACnB,iBAAiB,EACjB,qBAAqB,EACrB,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,eAAe,EACf,kBAAkB,EAClB,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACV,gBAAgB,EAChB,cAAc,EACd,UAAU,EACV,QAAQ,EACR,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,cAAc,GACf,MAAM,kBAAkB,CAAC;AAE1B,SAAS,UAAU,CAAC,IAAa;IAC/B,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;KAC1E,CAAC;AACJ,CAAC;AAED,2EAA2E;AAC3E,4EAA4E;AAC5E,yCAAyC;AACzC,EAAE;AACF,8CAA8C;AAC9C,4EAA4E;AAC5E,iEAAiE;AACjE,6EAA6E;AAC7E,2EAA2E;AAC3E,4EAA4E;AAC5E,sDAAsD;AACtD,uEAAuE;AACvE,qCAAqC;AACrC,6EAA6E;AAC7E,qEAAqE;AACrE,0EAA0E;AAC1E,8EAA8E;AAC9E,8EAA8E;AAC9E,yEAAyE;AACzE,wEAAwE;AACxE,iEAAiE;AACjE,yEAAyE;AACzE,yEAAyE;AACzE,2EAA2E;AAC3E,0EAA0E;AAC1E,qCAAqC;AACrC,SAAS,WAAW,CAAC,YAAqB,EAAE,IAAI,GAA+B,EAAE;IAC/E,IAAI,KAAK,GAAG,YAAY,CAAC;IACzB,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,KAAK,CAAC;IAChD,IAAI,aAAiC,CAAC;IACtC,IAAI,kBAAkB,GAAG,KAAK,CAAC;IAE/B,0EAA0E;IAC1E,yEAAyE;IACzE,4CAA4C;IAC5C,SAAS,oBAAoB,CAAC,OAAe,EAAE,GAAW;QACxD,IAAI,CAAC,YAAY;YAAE,OAAO;QAC1B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACzE,MAAM,MAAM,GAAmB;gBAC7B,OAAO;gBACP,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE;gBACnB,GAAG;gBACH,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACtE,CAAC;YACF,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;YAC5D,IAAI,aAAa,EAAE,CAAC;gBAClB,IAAI,CAAC;oBAAC,UAAU,CAAC,aAAa,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;YACjE,CAAC;YACD,aAAa,GAAG,IAAI,CAAC;YACrB,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBACxB,kBAAkB,GAAG,IAAI,CAAC;gBAC1B,MAAM,OAAO,GAAG,GAAG,EAAE;oBACnB,IAAI,CAAC;wBAAC,IAAI,aAAa;4BAAE,UAAU,CAAC,aAAa,CAAC,CAAC;oBAAC,CAAC;oBAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;gBACpF,CAAC,CAAC;gBACF,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAC5B,oEAAoE;gBACpE,4CAA4C;gBAC5C,KAAK,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAU,EAAE,CAAC;oBACjD,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACzD,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,2DAA2D,CAAC,CAAC;IACzE,CAAC;IAED,0EAA0E;IAC1E,iEAAiE;IACjE,kDAAkD;IAClD,4EAA4E;IAC5E,sEAAsE;IACtE,kEAAkE;IAClE,0EAA0E;IAC1E,uEAAuE;IACvE,qEAAqE;IACrE,qEAAqE;IACrE,0EAA0E;IAC1E,0EAA0E;IAC1E,oEAAoE;IACpE,0CAA0C;IAC1C,2EAA2E;IAC3E,wEAAwE;IACxE,KAAK,UAAU,eAAe,CAAC,OAAe,EAAE,IAA6B;QAC3E,MAAM,KAAK,GAAG,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAE,IAAI,CAAC,OAAO,CAAY,CAAC,CAAC,CAAC,SAAS,CAAC;QACxF,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,IAAI,WAAW,EAAE,EAAE,GAAG,CAAC,KAAK,CAAC,KAAK,OAAO;gBAAE,OAAO,OAAO,CAAC;YAC1D,MAAM,IAAI,KAAK,CACb,wBAAwB,OAAO,4DAA4D;gBACzF,6CAA6C,OAAO,gEAAgE,CACvH,CAAC;QACJ,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI;YAAE,OAAO,OAAO,CAAC;QAC3C,MAAM,EAAE,GAAG,MAAM,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QACxD,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CACb,0BAA0B,OAAO,cAAc,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;gBACtE,wEAAwE;gBACxE,qFAAqF,CACxF,CAAC;QACJ,CAAC;QACD,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;YACZ,IAAI,EAAE,CAAC,QAAQ,IAAI,EAAE,CAAC,cAAc,KAAK,CAAC;gBAAE,OAAO,WAAW,CAAC;YAC/D,MAAM,IAAI,KAAK,CACb,UAAU,OAAO,0BAA0B,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,iDAAiD;gBAC/G,eAAe,OAAO,6FAA6F;gBACnH,qFAAqF,CACxF,CAAC;QACJ,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,4EAA4E;IAC5E,kDAAkD;IAClD,EAAE;IACF,sEAAsE;IACtE,wEAAwE;IACxE,wEAAwE;IACxE,uEAAuE;IACvE,iCAAiC;IACjC,SAAS,IAAI,CACX,KAAgC,EAChC,OAA4D,EAC5D,EAAE,WAAW,GAAG,IAAI,EAAE,GAA8B,EAAE;QAEtD,OAAO,KAAK,EAAE,IAA6B,EAAE,EAAE;YAC7C,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC5B,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;oBAChC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;wBACxB,IAAI,WAAW,EAAE,CAAC;4BAChB,2DAA2D;4BAC3D,4DAA4D;4BAC5D,iCAAiC;4BACjC,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;4BACjD,KAAK,GAAG,OAAO,CAAC;4BAChB,oBAAoB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;wBACrC,CAAC;oBACH,CAAC;yBAAM,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;wBAC7B,MAAM,IAAI,KAAK,CACb,sBAAsB,KAAK,kCAAkC,OAAO,GAAG,CACxE,CAAC;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC;YACD,OAAO,UAAU,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACzC,CAAC,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,aAAa;QACnB,OAAO,EAAE,QAAQ;KAClB,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,CACd,IAAY,EACZ,WAAmB,EACnB,WAAwB,EACxB,EAA6E,EAC7E,EAAE;QACF,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAC5F,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE,CAA4B,CAAC,CAC5C,CAAC;IACJ,CAAC,CAAC;IAEF,OAAO,CACL,MAAM,EACN,m3BAAm3B,EACn3B,UAAU;IACV,yEAAyE;IACzE,iEAAiE;IACjE,KAAK,EAAE,IAA6B,EAAE,EAAE;QACtC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;QAChC,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAChC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;gBACjD,KAAK,GAAG,OAAO,CAAC;gBAChB,oBAAoB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YACrC,CAAC;iBAAM,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;gBAC7B,MAAM,IAAI,KAAK,CACb,sBAAsB,KAAK,kCAAkC,OAAO,GAAG,CACxE,CAAC;YACJ,CAAC;QACH,CAAC;QACD,OAAO,UAAU,CAAC,MAAO,QAA6D,CAAC,IAAI,CAAC,CAAC,CAAC;IAChG,CAAC,CACF,CAAC;IAEF,OAAO,CACL,UAAU,EACV,uKAAuK,EACvK,cAAc,EACd,IAAI,CAAC,SAAS,EAAE,YAAgE,CAAC,CAClF,CAAC;IAEF,OAAO,CACL,YAAY,EACZ,6IAA6I,EAC7I,gBAAgB,EAChB,IAAI,CAAC,SAAS,EAAE,cAAkE,CAAC,CACpF,CAAC;IAEF,OAAO,CACL,MAAM,EACN,uOAAuO,EACvO,UAAU,EACV,IAAI,CAAC,SAAS,EAAE,QAAuE,CAAC,CACzF,CAAC;IAEF,OAAO,CACL,QAAQ,EACR,kRAAkR,EAClR,YAAY,EACZ,IAAI,CAAC,SAAS,EAAE,UAA8D,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CACxG,CAAC;IAEF,OAAO,CACL,WAAW,EACX,+CAA+C,EAC/C,eAAe,EACf,IAAI,CAAC,SAAS,EAAE,aAAiE,CAAC,CACnF,CAAC;IAEF,OAAO,CACL,MAAM,EACN,2vBAA2vB,EAC3vB,UAAU,EACV,IAAI,CAAC,MAAM,EAAE,QAA4D,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CACnG,CAAC;IAEF,OAAO,CACL,aAAa,EACb,yEAAyE,EACzE,gBAAgB,EAChB,IAAI,CAAC,IAAI,EAAE,cAAwC,CAAC,CACrD,CAAC;IAEF,OAAO,CACL,cAAc,EACd,2oBAA2oB,EAC3oB,iBAAiB,EACjB,IAAI,CAAC,MAAM,EAAE,eAAmE,CAAC,CAClF,CAAC;IAEF,OAAO,CACL,cAAc,EACd,ggCAAggC,EAChgC,iBAAiB,EACjB,IAAI,CAAC,MAAM,EAAE,eAAmE,CAAC,CAClF,CAAC;IAEF,OAAO,CACL,eAAe,EACf,4dAA4d,EAC5d,kBAAkB,EAClB,IAAI,CAAC,SAAS,EAAE,gBAAoE,CAAC,CACtF,CAAC;IAEF,OAAO,CACL,uBAAuB,EACvB,sVAAsV,EACtV,yBAAyB,EACzB,IAAI,CAAC,SAAS,EAAE,uBAA2E,CAAC,CAC7F,CAAC;IAEF,OAAO,CACL,kBAAkB,EAClB,klBAAklB,EACllB,qBAAqB,EACrB,IAAI,CAAC,SAAS,EAAE,mBAAuE,CAAC,CACzF,CAAC;IAEF,OAAO,CACL,aAAa,EACb,wDAAwD,EACxD,gBAAgB,EAChB,IAAI,CAAC,SAAS,EAAE,cAAkE,CAAC,CACpF,CAAC;IAEF,OAAO,CACL,OAAO,EACP,25BAA25B,EAC35B,WAAW,EACX,IAAI,CAAC,IAAI,EAAE,SAA6D,CAAC,CAC1E,CAAC;IAEF,OAAO,CACL,kBAAkB,EAClB,oKAAoK,EACpK,oBAAoB,EACpB,IAAI,CAAC,SAAS,EAAE,kBAAsE,CAAC,CACxF,CAAC;IAEF,OAAO,CACL,YAAY,EACZ,mGAAmG,EACnG,eAAe,EACf,IAAI,CAAC,IAAI,EAAE,aAAuC,CAAC,CACpD,CAAC;IAEF,OAAO,CACL,WAAW,EACX,qUAAqU,EACrU,cAAc,EACd,IAAI,CAAC,SAAS,EAAE,YAAgE,CAAC,CAClF,CAAC;IAEF,OAAO,CACL,YAAY,EACZ,uGAAuG,EACvG,eAAe,EACf,IAAI,CAAC,SAAS,EAAE,aAAiE,CAAC,CACnF,CAAC;IAEF,OAAO,CACL,gBAAgB,EAChB,6FAA6F,EAC7F,kBAAkB,EAClB,IAAI,CAAC,SAAS,EAAE,gBAAoE,CAAC,CACtF,CAAC;IAEF,OAAO,CACL,eAAe,EACf,oGAAoG,EACpG,iBAAiB,EACjB,IAAI,CAAC,SAAS,EAAE,eAAmE,CAAC,CACrF,CAAC;IAEF,OAAO,CACL,cAAc,EACd,8iBAA8iB,EAC9iB,iBAAiB;IACjB,sEAAsE;IACtE,yEAAyE;IACzE,sDAAsD;IACtD,KAAK,EAAE,IAA6B,EAAE,EAAE;QACtC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC7B,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAChC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,8DAA8D;gBAC9D,4DAA4D;gBAC5D,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;gBACjD,KAAK,GAAG,OAAO,CAAC;gBAChB,oBAAoB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YACrC,CAAC;iBAAM,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;gBAC7B,MAAM,IAAI,KAAK,CAAC,sBAAsB,KAAK,kCAAkC,OAAO,GAAG,CAAC,CAAC;YAC3F,CAAC;QACH,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,IAA+C,CAAC,CAAC;QACtF,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAK,MAA2B,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;YACrF,MAAM,EAAE,GAAI,MAA2B,CAAC,EAAE,CAAC;YAC3C,IAAI,OAAO,EAAE,KAAK,QAAQ,EAAE,CAAC;gBAC3B,KAAK,GAAG,EAAE,CAAC;gBACX,oBAAoB,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;QACD,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC,CACF,CAAC;IAEF,OAAO,CACL,cAAc,EACd,iYAAiY,EACjY,iBAAiB,EACjB,IAAI,CAAC,SAAS,EAAE,eAAmE,CAAC,CACrF,CAAC;IAEF,OAAO,CACL,cAAc,EACd,sGAAsG,EACtG,iBAAiB,EACjB,IAAI,CAAC,SAAS,EAAE,eAAmE,CAAC,CACrF,CAAC;IAEF,OAAO,CACL,kBAAkB,EAClB,0TAA0T,EAC1T,qBAAqB,EACrB,IAAI,CAAC,SAAS,EAAE,mBAAuE,CAAC,CACzF,CAAC;IAEF,OAAO,CACL,iBAAiB,EACjB,oLAAoL,EACpL,oBAAoB,EACpB,IAAI,CAAC,SAAS,EAAE,kBAAsE,CAAC,CACxF,CAAC;IAEF,OAAO,CACL,gBAAgB,EAChB,+qBAA+qB,EAC/qB,mBAAmB,EACnB,IAAI,CAAC,SAAS,EAAE,iBAAqE,CAAC,CACvF,CAAC;IAEF,OAAO,CACL,QAAQ,EACR,ydAAyd,EACzd,YAAY,EACZ,IAAI,CAAC,IAAI,EAAE,UAA8D,CAAC,CAC3E,CAAC;IAEF,OAAO,CACL,aAAa,EACb,+fAA+f,EAC/f,gBAAgB,EAChB,IAAI,CAAC,IAAI,EAAE,cAAkE,CAAC,CAC/E,CAAC;IAEF,OAAO,CACL,aAAa,EACb,qcAAqc,EACrc,gBAAgB,EAChB,IAAI,CAAC,IAAI,EAAE,cAAkE,CAAC,CAC/E,CAAC;IAEF,OAAO,CACL,WAAW,EACX,uTAAuT,EACvT,cAAc,EACd,IAAI,CAAC,IAAI,EAAE,YAAgE,CAAC,CAC7E,CAAC;IAEF,OAAO,CACL,aAAa,EACb,qfAAqf,EACrf,gBAAgB,EAChB,IAAI,CAAC,IAAI,EAAE,cAAkE,CAAC,CAC/E,CAAC;IAEF,OAAO,CACL,aAAa,EACb,4RAA4R,EAC5R,gBAAgB,EAChB,IAAI,CAAC,SAAS,EAAE,cAAkE,CAAC,CACpF,CAAC;IAEF,OAAO,CACL,kBAAkB,EAClB,0RAA0R,EAC1R,qBAAqB,EACrB,IAAI,CAAC,IAAI,EAAE,mBAAuE,CAAC,CACpF,CAAC;IAEF,2EAA2E;IAC3E,wEAAwE;IACxE,IAAI,YAAY;QAAE,oBAAoB,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IAE5D,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,sEAAsE;AACtE,4EAA4E;AAC5E,yEAAyE;AACzE,4DAA4D;AAC5D,SAAS,YAAY,CAAC,OAAgB;IACpC,IAAI,CAAC;QACH,kBAAkB,EAAE,CAAC;IACvB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,uEAAuE;QACvE,gEAAgE;QAChE,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,KAAK,CAAE,CAAW,CAAC,OAAO,CAAC,CAAC;YACpC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,6BAA8B,CAAW,CAAC,OAAO,yBAAyB,CAAC,CAAC;QAC1F,OAAO;IACT,CAAC;IACD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,iDAAiD,WAAW,EAAE,EAAE,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC;IACrG,CAAC;AACH,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,UAAU,EAAE,CAAC;IACb,YAAY,CAAC,IAAI,CAAC,CAAC;IACnB,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;IAEhD,2EAA2E;IAC3E,wEAAwE;IACxE,4EAA4E;IAC5E,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;IACnD,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;IAC1C,CAAC;SAAM,CAAC;QACN,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC;QACvD,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,CAAC,KAAK,CACX,kEAAkE;gBAChE,kFAAkF;gBAClF,2DAA2D;gBAC3D,+EAA+E;gBAC/E,kFAAkF;gBAClF,8DAA8D,CACjE,CAAC;QACJ,CAAC;QACD,MAAM,MAAM,GAAG,WAAW,CAAC,UAAU,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/D,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;QAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAClC,CAAC;AACH,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,IAAY;IACnC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAClD,MAAM,KAAK,GAAG,WAAW,EAAE,KAAK,IAAI,CAAC;IACrC,IAAI,CAAC,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC;QAC3B,OAAO,CAAC,KAAK,CACX,+EAA+E;YAC7E,mFAAmF;YACnF,oFAAoF,CACvF,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,KAAK,IAAI,WAAW,EAAE,CAAC;QACzB,OAAO,CAAC,KAAK,CACX,gFAAgF;YAC9E,qCAAqC,CACxC,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CACX,mFAAmF;YACjF,gFAAgF;YAChF,qFAAqF;YACrF,qDAAqD,CACxD,CAAC;IACJ,CAAC;IACD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,WAAW,CAAC;IAC7D,MAAM,cAAc,GAAG,WAAW,CAAC,CAAC,CAAC,UAAU,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAEpE,+EAA+E;IAC/E,+EAA+E;IAC/E,6EAA6E;IAC7E,sEAAsE;IACtE,MAAM,cAAc,GAClB,QAAQ,KAAK,WAAW,IAAI,QAAQ,KAAK,WAAW,IAAI,QAAQ,KAAK,KAAK,CAAC;IAC7E,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CACX,sCAAsC,QAAQ,+BAA+B;gBAC3E,oEAAoE;gBACpE,6EAA6E,CAChF,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,GAAG,EAAE,CAAC;YAC7C,OAAO,CAAC,KAAK,CACX,gDAAgD,QAAQ,wBAAwB;gBAC9E,mEAAmE;gBACnE,4EAA4E;gBAC5E,mCAAmC,CACtC,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,wEAAwE;IACxE,wEAAwE;IACxE,yEAAyE;IACzE,wEAAwE;IACxE,mEAAmE;IACnE,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAyC,CAAC;IAClE,6EAA6E;IAC7E,wEAAwE;IACxE,MAAM,aAAa,GAAG,IAAI,GAAG,EAA8B,CAAC;IAE5D,KAAK,UAAU,oBAAoB,CAAC,UAAmB;QACrD,sEAAsE;QACtE,sEAAsE;QACtE,IAAI,SAAwC,CAAC;QAC7C,SAAS,GAAG,IAAI,6BAA6B,CAAC;YAC5C,kBAAkB,EAAE,GAAG,EAAE,CAAC,UAAU,EAAE;YACtC,oBAAoB,EAAE,CAAC,EAAU,EAAE,EAAE;gBACnC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;gBAC5B,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;YACpC,CAAC;SACF,CAAC,CAAC;QACH,SAAS,CAAC,OAAO,GAAG,GAAG,EAAE;YACvB,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;gBACxB,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;gBACrC,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC,CAAC;QACF,MAAM,MAAM,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;QACvC,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAChC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,yEAAyE;IACzE,2EAA2E;IAC3E,0EAA0E;IAC1E,SAAS,iBAAiB,CAAC,UAA8B;QACvD,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;QAC3E,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAClD,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;QAC/B,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACnC,OAAO,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;QACrD,CAAC;QACD,uDAAuD;QACvD,OAAO,cAAc,IAAI,UAAU,KAAK,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;IACxF,CAAC;IAED,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,EAAE,GAAoB,EAAE,GAAmB,EAAE,EAAE;QAC5E,IAAI,CAAC;YACH,wEAAwE;YACxE,6CAA6C;YAC7C,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC;YAC3B,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,CAAC,GAAG,KAAK,UAAU,IAAI,GAAG,KAAK,SAAS,CAAC,EAAE,CAAC;gBACtE,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC,CAAC;gBACrD,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBAChB,OAAO;YACT,CAAC;YAED,sEAAsE;YACtE,uEAAuE;YACvE,kEAAkE;YAClE,qEAAqE;YACrE,0DAA0D;YAC1D,MAAM,QAAQ,GAAG,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YAC9D,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,kBAAkB,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACnF,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;gBAC1B,OAAO;YACT,CAAC;YAED,yEAAyE;YACzE,uEAAuE;YACvE,qDAAqD;YACrD,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAC1C,IAAI,SAAS,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACxE,0EAA0E;YAC1E,yEAAyE;YACzE,0EAA0E;YAC1E,4EAA4E;YAC5E,IACE,SAAS;gBACT,WAAW,EAAE;gBACb,OAAO,GAAG,KAAK,QAAQ;gBACvB,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,QAAQ,CAAC,KAAK,EACzC,CAAC;gBACD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC,CAAC;gBACrD,GAAG,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;gBACvC,OAAO;YACT,CAAC;YACD,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;oBAC1B,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC,CAAC;oBACrD,GAAG,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;oBAC/C,OAAO;gBACT,CAAC;gBACD,SAAS,GAAG,MAAM,oBAAoB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACzD,CAAC;YACD,MAAM,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,GAAG,CAAC,CAAC;YAC7D,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;gBACrB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC,CAAC;gBACrD,GAAG,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE;QAC/B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,cAAc,WAAW,EAAE,EAAE,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC;QAC/E,OAAO,CAAC,KAAK,CAAC,uCAAuC,QAAQ,IAAI,IAAI,eAAe,IAAI,EAAE,CAAC,CAAC;QAC5F,IAAI,QAAQ,KAAK,WAAW,IAAI,QAAQ,KAAK,WAAW,EAAE,CAAC;YACzD,OAAO,CAAC,KAAK,CACX,uCAAuC,QAAQ,+CAA+C;gBAC5F,uFAAuF,CAC1F,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,GAAG,CAAC,CAAC;IAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
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":"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,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,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;
|
|
1
|
+
{"version":3,"file":"rooms.js","sourceRoot":"","sources":["../../src/tools/rooms.ts"],"names":[],"mappings":"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"}
|
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,28 +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
|
-
|
|
557
|
+
const inRun = run;
|
|
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
|
+
}
|
|
433
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.
|
|
434
577
|
process.stderr.write(`[tmux-pusher] peer paste NOT submitted: ${outcome.reason}\n`);
|
|
578
|
+
undelivered.push(...inRun);
|
|
435
579
|
}
|
|
436
|
-
writeReceipts(
|
|
437
|
-
run = [];
|
|
580
|
+
writeReceipts(inRun, outcome); // stamp only AFTER the paste+submit resolves
|
|
438
581
|
};
|
|
439
582
|
for (const m of batch) {
|
|
440
583
|
if (isControl(m)) {
|
|
@@ -442,13 +585,22 @@ async function injectViaTmux(batch) {
|
|
|
442
585
|
// Control commands are VERIFIED: capture-pane confirms the command
|
|
443
586
|
// actually left the input. A receipt that says "typed" was being read
|
|
444
587
|
// as "ran" — see writeReceipts.
|
|
445
|
-
|
|
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);
|
|
446
597
|
writeReceipts([m], outcome);
|
|
447
598
|
} else {
|
|
448
599
|
run.push(m);
|
|
449
600
|
}
|
|
450
601
|
}
|
|
451
602
|
await flushRun();
|
|
603
|
+
return undelivered;
|
|
452
604
|
}
|
|
453
605
|
|
|
454
606
|
// Append one delivery receipt per message AFTER it has been typed into the
|
|
@@ -666,15 +818,38 @@ function setRoomOffset(cursor, chan, n) {
|
|
|
666
818
|
else (cursor.roomOffsets ??= {})[c] = n;
|
|
667
819
|
}
|
|
668
820
|
|
|
821
|
+
// Channels this agent is a MEMBER of, per rooms.json. #general included only
|
|
822
|
+
// if membership says so.
|
|
823
|
+
//
|
|
824
|
+
// It used to be seeded `new Set([DEFAULT_ROOM])` before the membership loop, so
|
|
825
|
+
// every pusher tailed #general whether or not the agent had ever joined it —
|
|
826
|
+
// membership was honoured for every channel except the one with the most
|
|
827
|
+
// traffic. Observed directly: rooms.json read `general -> 0 members []` while
|
|
828
|
+
// agents joined only to a project room were taking #general cross-project
|
|
829
|
+
// broadcasts into their panes.
|
|
830
|
+
//
|
|
831
|
+
// Deliberate consequence of dropping the seed: no registry (or an unparseable
|
|
832
|
+
// one) now yields NO channels rather than #general. Absence of a registry is
|
|
833
|
+
// absence of evidence of membership, and the safe reading of "I cannot tell
|
|
834
|
+
// whether this agent joined" is not "push to it" — that is the assumption that
|
|
835
|
+
// produced the defect. Nothing is lost either way: offsets are untouched here,
|
|
836
|
+
// so read_messages still serves whatever the pusher did not.
|
|
837
|
+
//
|
|
838
|
+
// Cursor safety: this function only decides what gets TAILED. Offsets advance
|
|
839
|
+
// exclusively in collectRoomChannel, which runs only for the channels returned
|
|
840
|
+
// here — so a channel this agent is not in has its offset left exactly where it
|
|
841
|
+
// was, and joining later resumes from that point. Not stranded (read_messages
|
|
842
|
+
// reads the same cursor), not skipped (nothing advanced it meanwhile), not
|
|
843
|
+
// double-served (the offset is preserved, not reset).
|
|
669
844
|
function joinedRooms() {
|
|
670
845
|
let reg = {};
|
|
671
846
|
try {
|
|
672
847
|
const raw = readFileSync(path.join(ROOT, "rooms.json"), "utf8");
|
|
673
848
|
if (raw.trim()) reg = JSON.parse(raw);
|
|
674
849
|
} catch {
|
|
675
|
-
// no registry yet →
|
|
850
|
+
// no registry yet → no memberships to honour
|
|
676
851
|
}
|
|
677
|
-
const out = new Set(
|
|
852
|
+
const out = new Set();
|
|
678
853
|
for (const [chan, e] of Object.entries(reg)) {
|
|
679
854
|
if (e && Array.isArray(e.members) && e.members.includes(AGENT_ID)) out.add(chan);
|
|
680
855
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agent-coord-mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.26.1",
|
|
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.4"
|
|
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 = 321;
|
|
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/src/server.ts
CHANGED
|
@@ -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 ----------
|