@nolag/agents 0.2.0 → 0.4.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/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # @nolag/agents
2
2
 
3
+ > Protocol contract (topics, directed replies, NACKs, version advertisement): [docs/AGENTS-PROTOCOL.md](../../docs/AGENTS-PROTOCOL.md)
4
+
3
5
  Multi-agent coordination SDK for [NoLag](https://nolag.app) — dispatch tasks, share state, observe decisions, gate actions with human approval, and invoke remote tools across connected agents.
4
6
 
5
7
  ## How It Works with NoLag
@@ -10,6 +10,14 @@ export interface ConnectedAgent {
10
10
  capabilities: string[];
11
11
  metadata?: Record<string, unknown>;
12
12
  connectedAt: number;
13
+ /** Agents-protocol version the agent advertised (absent presence field = 1) */
14
+ protocol: number;
15
+ /**
16
+ * Persistent Presence status: "online" (connected), "offline" (registered but
17
+ * disconnected — discoverable + wakeable), or "waking". Undefined for ordinary
18
+ * ephemeral agents (treat as online when present).
19
+ */
20
+ status?: "online" | "offline" | "waking";
13
21
  }
14
22
  /**
15
23
  * AgentRoom — wraps a RoomContext from @nolag/js-sdk.
@@ -47,7 +55,7 @@ export declare class AgentRoom extends EventEmitter<AgentRoomEvents> {
47
55
  hasCapability(capability: string): boolean;
48
56
  /** Get all capabilities available across connected agents */
49
57
  getAvailableCapabilities(): string[];
50
- /** Update this agent's presence data */
58
+ /** Update this agent's presence data (protocol version auto-injected) */
51
59
  setPresence(data: AgentPresenceData): void;
52
60
  /** Fetch current presence snapshot for this room */
53
61
  fetchPresence(): Promise<ConnectedAgent[]>;
package/dist/browser.d.ts CHANGED
@@ -5,6 +5,8 @@
5
5
  export { NoLagAgents } from "./NoLagAgents";
6
6
  export { AgentRoom } from "./AgentRoom";
7
7
  export { EventEmitter } from "./EventEmitter";
8
+ export { IncompatibleProtocolError } from "./errors";
9
+ export { AGENTS_PROTOCOL_VERSION } from "./constants";
8
10
  export { CorrelationManager } from "./correlation";
9
11
  export { Handoff } from "./patterns/handoff";
10
12
  export { Inbox } from "./patterns/inbox";
package/dist/browser.js CHANGED
@@ -1,2 +1,2 @@
1
- import{NoLag as e}from"@nolag/js-sdk";class t{constructor(){this._handlers=new Map}on(e,t){return this._handlers.has(e)||this._handlers.set(e,new Set),this._handlers.get(e).add(t),this}off(e,t){return t?this._handlers.get(e)?.delete(t):this._handlers.delete(e),this}removeAllListeners(){return this._handlers.clear(),this}emit(e,...t){const o=this._handlers.get(e);if(o)for(const s of o)try{s(...t)}catch(t){console.error(`Error in ${String(e)} handler:`,t)}}listenerCount(e){return this._handlers.get(e)?.size??0}}const o="tasks",s="results",n="state",i="events",r="inbox",a="tools",c="approval";class l extends t{constructor(e,t,o,s,n,i){super(),this._agents=new Map,this.name=e,this.agentId=n,this._roomContext=t,this._client=o,this._log=s,this._presence=i,this._wireTopicListeners(),this._wirePresenceListeners(),i&&(this._log(`setting presence in room ${e}:`,i),this._roomContext.setPresence(i)),this._fetchInitialPresence()}getConnectedAgents(){return Array.from(this._agents.values())}findAgents(e){return Array.from(this._agents.values()).filter(t=>t.capabilities.includes(e))}hasCapability(e){return this.findAgents(e).length>0}getAvailableCapabilities(){const e=new Set;for(const t of this._agents.values())for(const o of t.capabilities)e.add(o);return Array.from(e)}setPresence(e){this._presence=e,this._log(`updating presence in room ${this.name}`),this._roomContext.setPresence(e)}async fetchPresence(){try{return(await this._roomContext.fetchPresence()||[]).map(e=>this._toConnectedAgent(e))}catch{return[]}}_emitPresence(e,t,o){"presenceLeave"===e?this.emit("presenceLeave",t):this.emit(e,t,o||{})}get context(){return this._roomContext}publishTask(e){e.createdBy||(e.createdBy=this.agentId),this._publish(o,e)}publishResult(e){e.completedBy||(e.completedBy=this.agentId),e.replyTo?this._publish(s,e,{filter:e.replyTo}):this._publish(s,e)}publishState(e){e.updatedBy||(e.updatedBy=this.agentId),this._publish(n,e,{retain:!0})}publishEvent(e){e.emittedBy||(e.emittedBy=this.agentId),this._publish(i,e)}publishInbox(e){this._publish(r,e)}publishTools(e){"tool_response"===e?.type&&"string"==typeof e.replyTo&&e.replyTo?this._publish(s,e,{filter:e.replyTo}):this._publish(a,e)}publishApproval(e){this._publish(c,e,{retain:!0})}_publish(e,t,o){this._log(`publish to ${e} in room ${this.name}`),o?this._roomContext.emit(e,t,o):this._roomContext.emit(e,t)}_toConnectedAgent(e){const t=e.presence||e.data||{};return{actorId:e.actorTokenId||e.actorId||"",name:t.name||e.actorTokenId||"",role:t.role||"agent",capabilities:t.capabilities||[],metadata:t.metadata,connectedAt:e.joinedAt||Date.now()}}async _fetchInitialPresence(){try{const e=await this._roomContext.fetchPresence();if(Array.isArray(e)){for(const t of e){const e=this._toConnectedAgent(t);e.actorId&&this._agents.set(e.actorId,e)}this._log(`discovered ${this._agents.size} agents in room ${this.name}`)}}catch{}}_wirePresenceListeners(){if(!this._client)return;const e=this._client;e.on?.("presence:join",e=>{if(e?.roomId===this.name||!e?.roomId){const t=e?.actorId||e?.actorTokenId,o=e?.data||e?.presence||{};if(t){const e={actorId:t,name:o.name||t,role:o.role||"agent",capabilities:o.capabilities||[],metadata:o.metadata,connectedAt:Date.now()};this._agents.set(t,e),this._log(`agent joined room ${this.name}:`,e.name,e.capabilities),this.emit("presenceJoin",t,o)}}}),e.on?.("presence:leave",e=>{if(e?.roomId===this.name||!e?.roomId){const t=e?.actorId||e?.actorTokenId;if(t){const e=this._agents.get(t);this._agents.delete(t),this._log(`agent left room ${this.name}:`,e?.name||t),this.emit("presenceLeave",t)}}}),e.on?.("presence:update",e=>{if(e?.roomId===this.name||!e?.roomId){const t=e?.actorId||e?.actorTokenId,o=e?.data||e?.presence||{};if(t){const e=this._agents.get(t),s={actorId:t,name:o.name||e?.name||t,role:o.role||e?.role||"agent",capabilities:o.capabilities||e?.capabilities||[],metadata:o.metadata||e?.metadata,connectedAt:e?.connectedAt||Date.now()};this._agents.set(t,s),this.emit("presenceUpdate",t,o)}}})}_wireTopicListeners(){this._roomContext.subscribe(o),this._roomContext.subscribe(a),this._roomContext.subscribe(s,{loadBalance:!1,filters:[this.agentId]});const e=[n,i,r,c];for(const t of e)this._roomContext.subscribe(t,{loadBalance:!1});const t=[{topic:o,event:"task"},{topic:n,event:"stateChange"},{topic:i,event:"event"},{topic:r,event:"inbox"}];for(const{topic:e,event:o}of t)this._roomContext.on(e,t=>{this._log(`received ${e} in room ${this.name}`),this.emit(o,t)});this._roomContext.on(s,e=>{this._log(`received ${s} in room ${this.name}`),"tool_response"===e?.type?this.emit("toolResponse",e):this.emit("result",e)}),this._roomContext.on(c,e=>{this._log(`received ${c} in room ${this.name}`),"approval_response"===e?.type?this.emit("approvalResponse",e):this.emit("approvalRequest",e)}),this._roomContext.on(a,e=>{this._log(`received ${a} in room ${this.name}`),"tool_response"===e?.type?this.emit("toolResponse",e):this.emit("toolRequest",e)})}}function h(){return"undefined"!=typeof crypto&&"function"==typeof crypto.randomUUID?crypto.randomUUID():"xxxx-xxxx-xxxx-xxxx".replace(/x/g,()=>Math.floor(16*Math.random()).toString(16))}function d(){return Date.now()}class p extends t{constructor(e,t={}){var o;super(),this._client=null,this._appContext=null,this._rooms=new Map,this._connected=!1,this._token=e,this._options={appName:t.appName??"agents",agentId:t.agentId??h(),debug:t.debug??!1,rooms:t.rooms??["default-workflow"],lobby:t.lobby,presence:t.presence,clientOptions:t.clientOptions},this._log=(o="NoLagAgents",this._options.debug?(...e)=>{console.log(`[${o}]`,...e)}:(...e)=>{})}get agentId(){return this._options.agentId}get connected(){return this._connected}get rooms(){return this._rooms}async connect(){this._log("connecting..."),this._client=e(this._token,{...this._options.clientOptions}),this._appContext=this._client.setApp(this._options.appName),this._client.on("connected",()=>{this._connected=!0,this._log("connected"),this.emit("connected")}),this._client.on("disconnected",e=>{this._connected=!1,this._log("disconnected:",e),this.emit("disconnected",e)}),this._client.on("reconnected",()=>{this._connected=!0,this._log("reconnected"),this.emit("reconnected")}),this._client.on("error",e=>{this._log("error:",e.message),this.emit("error",e)}),await this._client.connect();for(const e of this._options.rooms)this.room(e);this._options.lobby&&await this.subscribeLobby(this._options.lobby)}async subscribeLobby(e){if(!this._appContext)throw new Error("Not connected. Call connect() before subscribing to lobbies.");this._log(`subscribing to lobby: ${e}`);const t=this._appContext.setLobby(e);this._client.on("lobbyPresence:join",e=>{const t=e?.actorId,o=e?.data||{};if(t){this._log(`lobby presence:join — ${o.name||t}`);for(const e of this._rooms.values()){const s=e._agents;s.has(t)||s.set(t,{actorId:t,name:o.name||t,role:o.role||"agent",capabilities:o.capabilities||[],metadata:o.metadata,connectedAt:Date.now()}),e._emitPresence("presenceJoin",t,o)}}}),this._client.on("lobbyPresence:leave",e=>{const t=e?.actorId;if(t){this._log(`lobby presence:leave — ${t}`);for(const e of this._rooms.values()){e._agents.delete(t),e._emitPresence("presenceLeave",t)}}}),this._client.on("lobbyPresence:update",e=>{const t=e?.actorId,o=e?.data||{};if(t)for(const e of this._rooms.values()){const s=e._agents.get(t);s&&(o.name&&(s.name=o.name),o.role&&(s.role=o.role),o.capabilities&&(s.capabilities=o.capabilities),o.metadata&&(s.metadata=o.metadata)),e._emitPresence("presenceUpdate",t,o)}});try{const e=await t.subscribe();return this._log("lobby subscribed, initial state:",Object.keys(e||{})),e||{}}catch(e){return this._log("lobby subscription failed:",e),{}}}disconnect(){this._log("disconnecting..."),this._client?.disconnect(),this._rooms.clear(),this._client=null,this._appContext=null,this._connected=!1}room(e){let t=this._rooms.get(e);if(t)return t;if(!this._appContext)throw new Error("Not connected. Call connect() before accessing rooms.");this._log(`joining room: ${e}`);const o=this._appContext.setRoom(e);return t=new l(e,o,this._client,this._log,this._options.agentId,this._options.presence),this._rooms.set(e,t),t}}class _{constructor(){this._pending=new Map}register(e,t){return new Promise((o,s)=>{let n=null;t&&t>0&&(n=setTimeout(()=>{this._pending.delete(e),s(new Error(`Correlation ${e} timed out after ${t}ms`))},t)),this._pending.set(e,{resolve:o,reject:s,timer:n})})}resolve(e,t){const o=this._pending.get(e);return!!o&&(o.timer&&clearTimeout(o.timer),this._pending.delete(e),o.resolve(t),!0)}reject(e,t){const o=this._pending.get(e);return!!o&&(o.timer&&clearTimeout(o.timer),this._pending.delete(e),o.reject(t),!0)}has(e){return this._pending.has(e)}clear(){for(const[e,t]of this._pending)t.timer&&clearTimeout(t.timer),t.reject(new Error(`Correlation ${e} cancelled`));this._pending.clear()}get size(){return this._pending.size}}function m(e,t,o){return{type:"task",taskId:h(),correlationId:h(),replyTo:o?.replyTo,capability:e,payload:t,tags:o?.tags,priority:o?.priority??"medium",metadata:o?.metadata,createdAt:d(),createdBy:o?.createdBy,timeout:o?.timeout}}function u(e,t,o,s,n,i,r){return{type:"result",correlationId:t,taskId:e,status:o,payload:s,error:n,completedAt:d(),completedBy:i,replyTo:r}}function g(e,t,o,s){return{type:"state",key:e,value:t,version:o,updatedBy:s,updatedAt:d()}}function y(e,t,o,s="info"){return{type:"event",eventId:h(),severity:s,category:e,emittedBy:t,payload:o,timestamp:d()}}function b(e,t,o,s){return{type:"approval_request",requestId:h(),correlationId:h(),action:e,context:t,urgency:s?.urgency??"medium",requestedBy:o,requestedAt:d(),expiresAt:s?.expiresAt}}function f(e,t,o,s,n){return{type:"approval_response",requestId:e,correlationId:t,decision:o,respondedBy:s,reason:n,respondedAt:d()}}function I(e,t,o,s){return{type:"tool_request",requestId:h(),correlationId:h(),replyTo:s?.replyTo,toolName:e,arguments:t,requestedBy:o,requestedAt:d()}}function v(e,t,o,s,n,i,r){return{type:"tool_response",requestId:e,correlationId:t,status:o,result:s,error:n,respondedBy:i,respondedAt:d(),replyTo:r}}class x{constructor(e){this._correlations=new _,this._room=e,this._room.on("result",e=>{this._correlations.resolve(e.correlationId,e)})}async dispatch(e,t,o){if(!o?.allowNoWorkers){if(0===this._room.findAgents(e).length)throw new Error(`No agent with capability "${e}" is connected. Available capabilities: [${this._room.getAvailableCapabilities().join(", ")}]. Connected agents: ${this._room.getConnectedAgents().length}. Use { allowNoWorkers: true } to dispatch anyway.`)}const s=m(e,t,{...o,createdBy:o?.createdBy??this._room.agentId,replyTo:o?.replyTo??this._room.agentId});if(this._room.publishTask(s),o?.waitForResult)return this._correlations.register(s.correlationId,o.timeout)}onTask(e,t){const o="function"==typeof e?"*":e,s="function"==typeof e?e:t;this._room.on("task",e=>{if("*"!==o&&!o.includes(e.capability))return;s(e,(t,o,s)=>{const n=u(e.taskId,e.correlationId,t,o,s,this._room.agentId,e.replyTo??e.createdBy);this._room.publishResult(n)})})}getCapableAgents(e){return this._room.findAgents(e)}dispose(){this._correlations.clear()}}class A{constructor(e,t){this._room=e,this._agentId=t}send(e,t){const o={messageId:h(),from:this._agentId,to:e,payload:t,createdAt:d()};this._room.publishInbox(o)}onMessage(e){this._room.on("inbox",t=>{const o=t;o.to===this._agentId&&e(o)})}}class C{constructor(e,t){this._state=new Map,this._room=e,this._agentId=t,this._room.on("stateChange",e=>{this._state.set(e.key,e)})}set(e,t){const o=this._state.get(e),s=g(e,t,o?o.version+1:1,this._agentId);this._state.set(e,s),this._room.publishState(s)}get(e){return this._state.get(e)?.value}getEnvelope(e){return this._state.get(e)}getAll(){return this._state}onChange(e,t){this._room.on("stateChange",o=>{o.key===e&&t(o)})}}class w{constructor(e,t){this._room=e,this._emittedBy=t}emit(e,t,o="info"){const s=y(e,this._emittedBy,t,o);this._room.publishEvent(s)}on(e,t){this._room.on("event",o=>{t?.category&&o.category!==t.category||t?.severity&&o.severity!==t.severity||e(o)})}}class T{constructor(e,t){this._correlations=new _,this._room=e,this._agentId=t,this._room.on("approvalResponse",e=>{this._correlations.resolve(e.correlationId,e)})}async request(e,t,o){const s=b(e,t,this._agentId,{urgency:o?.urgency,expiresAt:o?.expiresAt});return this._room.publishApproval(s),this._correlations.register(s.correlationId,o?.timeout)}onRequest(e){this._room.on("approvalRequest",t=>{e(t,(e,o)=>{const s=f(t.requestId,t.correlationId,e,this._agentId,o);this._room.publishApproval(s)})})}dispose(){this._correlations.clear()}}class ${constructor(e,t){this._correlations=new _,this._handlers=new Map,this._room=e,this._agentId=t,this._room.on("toolResponse",e=>{this._correlations.resolve(e.correlationId,e)}),this._room.on("toolRequest",async e=>{const t=this._handlers.get(e.toolName);if(!t)return;const o=e.replyTo??e.requestedBy;try{const s=await t(e.arguments),n=v(e.requestId,e.correlationId,"success",s,void 0,this._agentId,o);this._room.publishTools(n)}catch(t){const s=v(e.requestId,e.correlationId,"error",null,{code:"TOOL_ERROR",message:t instanceof Error?t.message:String(t)},this._agentId,o);this._room.publishTools(s)}})}register(e,t){this._handlers.set(e,t)}async invoke(e,t,o){const s=I(e,t,this._agentId,{replyTo:this._room.agentId});return this._room.publishTools(s),this._correlations.register(s.correlationId,o?.timeout)}dispose(){this._correlations.clear(),this._handlers.clear()}}const k={CAPABILITY:"capability",PRIORITY:"priority",ROLE:"role",SEVERITY:"severity",URGENCY:"urgency",TENANT:"tenant"},B={REQUIRES_HUMAN:"requires_human",REQUIRES_AUDIT:"requires_audit"};function R(e,t){return`${e}:${t}`}export{l as AgentRoom,T as Approve,C as Blackboard,_ as CorrelationManager,t as EventEmitter,x as Handoff,A as Inbox,p as NoLagAgents,w as Observe,B as TAG_FLAGS,k as TAG_PREFIX,$ as Tools,b as createApprovalRequest,f as createApprovalResponse,y as createEventEnvelope,u as createResultEnvelope,g as createStateEnvelope,m as createTaskEnvelope,I as createToolRequest,v as createToolResponse,R as tag};
1
+ import{NoLag as e}from"@nolag/js-sdk";class t{constructor(){this._handlers=new Map}on(e,t){return this._handlers.has(e)||this._handlers.set(e,new Set),this._handlers.get(e).add(t),this}off(e,t){return t?this._handlers.get(e)?.delete(t):this._handlers.delete(e),this}removeAllListeners(){return this._handlers.clear(),this}emit(e,...t){const o=this._handlers.get(e);if(o)for(const s of o)try{s(...t)}catch(t){console.error(`Error in ${String(e)} handler:`,t)}}listenerCount(e){return this._handlers.get(e)?.size??0}}const o="tasks",s="results",n="state",r="events",i="inbox",a="tools",c="approval",l=2;class h extends t{constructor(e,t,o,s,n,r){if(super(),this._agents=new Map,this.name=e,this.agentId=n,this._roomContext=t,this._client=o,this._log=s,this._presence=r,this._wireTopicListeners(),this._wirePresenceListeners(),r){const t={protocol:2,...r};this._presence=t,this._log(`setting presence in room ${e}:`,t),this._roomContext.setPresence(t)}this._fetchInitialPresence()}getConnectedAgents(){return Array.from(this._agents.values())}findAgents(e){return Array.from(this._agents.values()).filter(t=>t.capabilities.includes(e))}hasCapability(e){return this.findAgents(e).length>0}getAvailableCapabilities(){const e=new Set;for(const t of this._agents.values())for(const o of t.capabilities)e.add(o);return Array.from(e)}setPresence(e){const t={protocol:2,...e};this._presence=t,this._log(`updating presence in room ${this.name}`),this._roomContext.setPresence(t)}async fetchPresence(){try{return(await this._roomContext.fetchPresence()||[]).map(e=>this._toConnectedAgent(e))}catch{return[]}}_emitPresence(e,t,o){"presenceLeave"===e?this.emit("presenceLeave",t):this.emit(e,t,o||{})}get context(){return this._roomContext}publishTask(e){e.createdBy||(e.createdBy=this.agentId),this._publish(o,e)}publishResult(e){e.completedBy||(e.completedBy=this.agentId),e.replyTo?this._publish(s,e,{filter:e.replyTo}):this._publish(s,e)}publishState(e){e.updatedBy||(e.updatedBy=this.agentId),this._publish(n,e,{retain:!0})}publishEvent(e){e.emittedBy||(e.emittedBy=this.agentId),this._publish(r,e)}publishInbox(e){this._publish(i,e)}publishTools(e){"tool_response"===e?.type&&"string"==typeof e.replyTo&&e.replyTo?this._publish(s,e,{filter:e.replyTo}):this._publish(a,e)}publishApproval(e){this._publish(c,e,{retain:!0})}_publish(e,t,o){this._log(`publish to ${e} in room ${this.name}`),o?this._roomContext.emit(e,t,o):this._roomContext.emit(e,t)}_toConnectedAgent(e){const t=e.presence||e.data||{};return{actorId:e.actorTokenId||e.actorId||"",name:t.name||e.actorTokenId||"",role:t.role||"agent",capabilities:t.capabilities||[],metadata:t.metadata,connectedAt:e.joinedAt||Date.now(),protocol:"number"==typeof t.protocol?t.protocol:1,status:e.status}}async _fetchInitialPresence(){try{const e=await this._roomContext.fetchPresence();if(Array.isArray(e)){for(const t of e){const e=this._toConnectedAgent(t);e.actorId&&this._agents.set(e.actorId,e)}this._log(`discovered ${this._agents.size} agents in room ${this.name}`)}}catch{}}_wirePresenceListeners(){if(!this._client)return;const e=this._client;e.on?.("presence:join",e=>{if(e?.roomId===this.name||!e?.roomId){const t=e?.actorId||e?.actorTokenId,o=e?.data||e?.presence||{};if(t){const e={actorId:t,name:o.name||t,role:o.role||"agent",capabilities:o.capabilities||[],metadata:o.metadata,connectedAt:Date.now(),protocol:"number"==typeof o.protocol?o.protocol:1};this._agents.set(t,e),this._log(`agent joined room ${this.name}:`,e.name,e.capabilities),this.emit("presenceJoin",t,o)}}}),e.on?.("presence:leave",e=>{if(e?.roomId===this.name||!e?.roomId){const t=e?.actorId||e?.actorTokenId;if(t){const e=this._agents.get(t);this._agents.delete(t),this._log(`agent left room ${this.name}:`,e?.name||t),this.emit("presenceLeave",t)}}}),e.on?.("presence:update",e=>{if(e?.roomId===this.name||!e?.roomId){const t=e?.actorId||e?.actorTokenId,o=e?.data||e?.presence||{};if(t){const e=this._agents.get(t),s={actorId:t,name:o.name||e?.name||t,role:o.role||e?.role||"agent",capabilities:o.capabilities||e?.capabilities||[],metadata:o.metadata||e?.metadata,connectedAt:e?.connectedAt||Date.now(),protocol:"number"==typeof o.protocol?o.protocol:e?.protocol??1};this._agents.set(t,s),this.emit("presenceUpdate",t,o)}}})}_wireTopicListeners(){this._roomContext.subscribe(o),this._roomContext.subscribe(a),this._roomContext.subscribe(s,{loadBalance:!1,filters:[this.agentId]});const e=[n,r,i,c];for(const t of e)this._roomContext.subscribe(t,{loadBalance:!1});const t=[{topic:o,event:"task"},{topic:n,event:"stateChange"},{topic:r,event:"event"},{topic:i,event:"inbox"}];for(const{topic:e,event:o}of t)this._roomContext.on(e,t=>{this._log(`received ${e} in room ${this.name}`),this.emit(o,t)});this._roomContext.on(s,e=>{this._log(`received ${s} in room ${this.name}`),"tool_response"===e?.type?this.emit("toolResponse",e):this.emit("result",e)}),this._roomContext.on(c,e=>{this._log(`received ${c} in room ${this.name}`),"approval_response"===e?.type?this.emit("approvalResponse",e):this.emit("approvalRequest",e)}),this._roomContext.on(a,e=>{this._log(`received ${a} in room ${this.name}`),"tool_response"===e?.type?this.emit("toolResponse",e):this.emit("toolRequest",e)})}}function d(){return"undefined"!=typeof crypto&&"function"==typeof crypto.randomUUID?crypto.randomUUID():"xxxx-xxxx-xxxx-xxxx".replace(/x/g,()=>Math.floor(16*Math.random()).toString(16))}function p(){return Date.now()}class _ extends t{constructor(e,t={}){var o;super(),this._client=null,this._appContext=null,this._rooms=new Map,this._connected=!1,this._token=e,this._options={appName:t.appName??"agents",agentId:t.agentId??d(),debug:t.debug??!1,rooms:t.rooms??["default-workflow"],lobby:t.lobby,presence:t.presence,clientOptions:t.clientOptions},this._log=(o="NoLagAgents",this._options.debug?(...e)=>{console.log(`[${o}]`,...e)}:(...e)=>{})}get agentId(){return this._options.agentId}get connected(){return this._connected}get rooms(){return this._rooms}async connect(){this._log("connecting..."),this._client=e(this._token,{...this._options.clientOptions}),this._appContext=this._client.setApp(this._options.appName),this._client.on("connected",()=>{this._connected=!0,this._log("connected"),this.emit("connected")}),this._client.on("disconnected",e=>{this._connected=!1,this._log("disconnected:",e),this.emit("disconnected",e)}),this._client.on("reconnected",()=>{this._connected=!0,this._log("reconnected"),this.emit("reconnected")}),this._client.on("error",e=>{this._log("error:",e.message),this.emit("error",e)}),await this._client.connect();for(const e of this._options.rooms)this.room(e);this._options.lobby&&await this.subscribeLobby(this._options.lobby)}async subscribeLobby(e){if(!this._appContext)throw new Error("Not connected. Call connect() before subscribing to lobbies.");this._log(`subscribing to lobby: ${e}`);const t=this._appContext.setLobby(e);this._client.on("lobbyPresence:join",e=>{const t=e?.actorId,o=e?.data||{};if(t){this._log(`lobby presence:join — ${o.name||t}`);for(const e of this._rooms.values()){const s=e._agents;s.has(t)||s.set(t,{actorId:t,name:o.name||t,role:o.role||"agent",capabilities:o.capabilities||[],metadata:o.metadata,connectedAt:Date.now()}),e._emitPresence("presenceJoin",t,o)}}}),this._client.on("lobbyPresence:leave",e=>{const t=e?.actorId;if(t){this._log(`lobby presence:leave — ${t}`);for(const e of this._rooms.values()){e._agents.delete(t),e._emitPresence("presenceLeave",t)}}}),this._client.on("lobbyPresence:update",e=>{const t=e?.actorId,o=e?.data||{};if(t)for(const e of this._rooms.values()){const s=e._agents.get(t);s&&(o.name&&(s.name=o.name),o.role&&(s.role=o.role),o.capabilities&&(s.capabilities=o.capabilities),o.metadata&&(s.metadata=o.metadata)),e._emitPresence("presenceUpdate",t,o)}});try{const e=await t.subscribe();return this._log("lobby subscribed, initial state:",Object.keys(e||{})),e||{}}catch(e){return this._log("lobby subscription failed:",e),{}}}disconnect(){this._log("disconnecting..."),this._client?.disconnect(),this._rooms.clear(),this._client=null,this._appContext=null,this._connected=!1}room(e){let t=this._rooms.get(e);if(t)return t;if(!this._appContext)throw new Error("Not connected. Call connect() before accessing rooms.");this._log(`joining room: ${e}`);const o=this._appContext.setRoom(e);return t=new h(e,o,this._client,this._log,this._options.agentId,this._options.presence),this._rooms.set(e,t),t}}class m extends Error{constructor(e,t){super(`${e} cannot succeed: every relevant agent advertises agents-protocol < 2 [${t.map(e=>`${e.name} (protocol ${e.protocol})`).join(", ")}]. Protocol >= 2 responders direct replies to the requester; older ones broadcast and their replies never reach this SDK's filtered subscription. Upgrade the responders to @nolag/agents >= 0.2.0 / nolag-agents >= 0.3.0. NOTE: 0.2.x/0.3.0 responders DO have directed replies but do not yet advertise protocol — if your responders run those versions, pass { allowLegacyResponders: true }.`),this.name="IncompatibleProtocolError"}}class u{constructor(){this._pending=new Map}register(e,t,o){return new Promise((s,n)=>{let r=null;t&&t>0&&(r=setTimeout(()=>{this._pending.delete(e);n(new Error(`${o??`Correlation ${e}`} timed out after ${t}ms`))},t)),this._pending.set(e,{resolve:s,reject:n,timer:r})})}resolve(e,t){const o=this._pending.get(e);return!!o&&(o.timer&&clearTimeout(o.timer),this._pending.delete(e),o.resolve(t),!0)}reject(e,t){const o=this._pending.get(e);return!!o&&(o.timer&&clearTimeout(o.timer),this._pending.delete(e),o.reject(t),!0)}has(e){return this._pending.has(e)}clear(){for(const[e,t]of this._pending)t.timer&&clearTimeout(t.timer),t.reject(new Error(`Correlation ${e} cancelled`));this._pending.clear()}get size(){return this._pending.size}}function g(e,t,o){return{type:"task",protocol:2,taskId:d(),correlationId:d(),replyTo:o?.replyTo,capability:e,payload:t,tags:o?.tags,priority:o?.priority??"medium",metadata:o?.metadata,createdAt:p(),createdBy:o?.createdBy,timeout:o?.timeout}}function y(e,t,o,s,n,r,i){return{type:"result",protocol:2,correlationId:t,taskId:e,status:o,payload:s,error:n,completedAt:p(),completedBy:r,replyTo:i}}function b(e,t,o,s){return{type:"state",protocol:2,key:e,value:t,version:o,updatedBy:s,updatedAt:p()}}function f(e,t,o,s="info"){return{type:"event",protocol:2,eventId:d(),severity:s,category:e,emittedBy:t,payload:o,timestamp:p()}}function I(e,t,o,s){return{type:"approval_request",protocol:2,requestId:d(),correlationId:d(),action:e,context:t,urgency:s?.urgency??"medium",requestedBy:o,requestedAt:p(),expiresAt:s?.expiresAt}}function v(e,t,o,s,n){return{type:"approval_response",protocol:2,requestId:e,correlationId:t,decision:o,respondedBy:s,reason:n,respondedAt:p()}}function w(e,t,o,s){return{type:"tool_request",protocol:2,requestId:d(),correlationId:d(),replyTo:s?.replyTo,toolName:e,arguments:t,requestedBy:o,requestedAt:p()}}function x(e,t,o,s,n,r,i){return{type:"tool_response",protocol:2,requestId:e,correlationId:t,status:o,result:s,error:n,respondedBy:r,respondedAt:p(),replyTo:i}}class A{constructor(e){this._correlations=new u,this._warnedMixed=!1,this._room=e,this._room.on("result",e=>{this._correlations.resolve(e.correlationId,e)})}async dispatch(e,t,o){if(!o?.allowNoWorkers){const t=this._room.findAgents(e);if(0===(o?.requireOnline?t.filter(e=>void 0===e.status||"online"===e.status):t).length)throw new Error(`No ${o?.requireOnline?"online ":""}agent with capability "${e}" is available. Available capabilities: [${this._room.getAvailableCapabilities().join(", ")}]. Connected agents: ${this._room.getConnectedAgents().length}. Use { allowNoWorkers: true } to dispatch anyway.`)}const s=g(e,t,{...o,createdBy:o?.createdBy??this._room.agentId,replyTo:o?.replyTo??this._room.agentId});if(this._room.publishTask(s),o?.waitForResult){const t=this._room.findAgents(e);if(!o?.allowLegacyResponders&&t.length>0){const o=t.filter(e=>e.protocol>=2);if(0===o.length)throw new m(`Task '${e}' dispatch with waitForResult`,t.map(e=>({name:e.name,protocol:e.protocol})));o.length<t.length&&!this._warnedMixed&&(this._warnedMixed=!0,console.warn(`[nolag-agents] Capability '${e}' has workers on agents-protocol < 2: `+t.filter(e=>e.protocol<2).map(e=>e.name).join(", ")+". Their results may not be delivered — upgrade them."))}return this._correlations.register(s.correlationId,o.timeout,`Task '${e}' dispatch (${t.length} capable worker${1===t.length?"":"s"} visible). Likely causes: worker crashed mid-task, worker on agents-protocol < 2 (results not directed), or the room is not deliverable`)}}onTask(e,t){const o="function"==typeof e?"*":e,s="function"==typeof e?e:t;this._room.on("task",e=>{if("*"!==o&&!o.includes(e.capability))return;s(e,(t,o,s)=>{const n=y(e.taskId,e.correlationId,t,o,s,this._room.agentId,e.replyTo??e.createdBy);this._room.publishResult(n)})})}getCapableAgents(e){return this._room.findAgents(e)}dispose(){this._correlations.clear()}}class T{constructor(e,t){this._room=e,this._agentId=t}send(e,t){const o={messageId:d(),from:this._agentId,to:e,payload:t,createdAt:p()};this._room.publishInbox(o)}onMessage(e){this._room.on("inbox",t=>{const o=t;o.to===this._agentId&&e(o)})}}class ${constructor(e,t){this._state=new Map,this._room=e,this._agentId=t,this._room.on("stateChange",e=>{this._state.set(e.key,e)})}set(e,t){const o=this._state.get(e),s=b(e,t,o?o.version+1:1,this._agentId);this._state.set(e,s),this._room.publishState(s)}get(e){return this._state.get(e)?.value}getEnvelope(e){return this._state.get(e)}getAll(){return this._state}onChange(e,t){this._room.on("stateChange",o=>{o.key===e&&t(o)})}}class C{constructor(e,t){this._room=e,this._emittedBy=t}emit(e,t,o="info"){const s=f(e,this._emittedBy,t,o);this._room.publishEvent(s)}on(e,t){this._room.on("event",o=>{t?.category&&o.category!==t.category||t?.severity&&o.severity!==t.severity||e(o)})}}class k{constructor(e,t){this._correlations=new u,this._room=e,this._agentId=t,this._room.on("approvalResponse",e=>{this._correlations.resolve(e.correlationId,e)})}async request(e,t,o){const s=I(e,t,this._agentId,{urgency:o?.urgency,expiresAt:o?.expiresAt});return this._room.publishApproval(s),this._correlations.register(s.correlationId,o?.timeout)}onRequest(e){this._room.on("approvalRequest",t=>{e(t,(e,o)=>{const s=v(t.requestId,t.correlationId,e,this._agentId,o);this._room.publishApproval(s)})})}dispose(){this._correlations.clear()}}class R{constructor(e,t){this._correlations=new u,this._handlers=new Map,this._warnedMixed=!1,this._room=e,this._agentId=t,this._room.on("toolResponse",e=>{this._correlations.resolve(e.correlationId,e)}),this._room.on("toolRequest",async e=>{const t=this._handlers.get(e.toolName),o=e.replyTo??e.requestedBy;if(!t){if(!this._ownsNamespace(e.toolName))return;const t=x(e.requestId,e.correlationId,"error",null,{code:"NO_HANDLER",message:`Agent '${this._agentId}' has no handler for tool '${e.toolName}'`},this._agentId,o);return void this._room.publishTools(t)}try{const s=await t(e.arguments),n=x(e.requestId,e.correlationId,"success",s,void 0,this._agentId,o);this._room.publishTools(n)}catch(t){const s=x(e.requestId,e.correlationId,"error",null,{code:"TOOL_ERROR",message:t instanceof Error?t.message:String(t)},this._agentId,o);this._room.publishTools(s)}})}register(e,t){this._handlers.set(e,t)}_ownsNamespace(e){if(0===this._handlers.size)return!1;const t=e.includes(".")?e.slice(0,e.indexOf(".")):null;for(const e of this._handlers.keys()){if((e.includes(".")?e.slice(0,e.indexOf(".")):null)===t)return!0}return!1}async invoke(e,t,o){const s=this._room.getConnectedAgents().filter(e=>"tool-server"===e.role);if(!o?.allowLegacyResponders&&s.length>0){const t=s.filter(e=>e.protocol>=2);if(0===t.length)throw new m(`Tool '${e}' invocation`,s.map(e=>({name:e.name,protocol:e.protocol})));t.length<s.length&&!this._warnedMixed&&(this._warnedMixed=!0,console.warn(`[nolag-agents] Room '${this._room.name}' has tool servers on agents-protocol < 2: `+s.filter(e=>e.protocol<2).map(e=>e.name).join(", ")+". Their replies may not be delivered — upgrade them."))}const n=w(e,t,this._agentId,{replyTo:this._room.agentId});this._room.publishTools(n);const r=s.length;return this._correlations.register(n.correlationId,o?.timeout,`Tool '${e}' invocation in room '${this._room.name}' (${r} tool-server${1===r?"":"s"} visible). Likely causes: no agent has this tool registered (pre-0.3.0 responders don't NACK), the responder is offline, or the room is not deliverable (watch the room 'error' events)`)}dispose(){this._correlations.clear(),this._handlers.clear()}}const q={CAPABILITY:"capability",PRIORITY:"priority",ROLE:"role",SEVERITY:"severity",URGENCY:"urgency",TENANT:"tenant"},B={REQUIRES_HUMAN:"requires_human",REQUIRES_AUDIT:"requires_audit"};function E(e,t){return`${e}:${t}`}export{l as AGENTS_PROTOCOL_VERSION,h as AgentRoom,k as Approve,$ as Blackboard,u as CorrelationManager,t as EventEmitter,A as Handoff,T as Inbox,m as IncompatibleProtocolError,_ as NoLagAgents,C as Observe,B as TAG_FLAGS,q as TAG_PREFIX,R as Tools,I as createApprovalRequest,v as createApprovalResponse,f as createEventEnvelope,y as createResultEnvelope,b as createStateEnvelope,g as createTaskEnvelope,w as createToolRequest,x as createToolResponse,E as tag};
2
2
  //# sourceMappingURL=browser.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"browser.js","sources":["../src/EventEmitter.ts","../src/constants.ts","../src/AgentRoom.ts","../src/utils.ts","../src/NoLagAgents.ts","../src/correlation.ts","../src/envelope.ts","../src/patterns/handoff.ts","../src/patterns/inbox.ts","../src/patterns/blackboard.ts","../src/patterns/observe.ts","../src/patterns/approve.ts","../src/patterns/tools.ts","../src/tags.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null,null,null,null,null],"names":["EventEmitter","constructor","this","_handlers","Map","on","event","handler","has","set","Set","get","add","off","delete","removeAllListeners","clear","emit","args","handlers","e","console","error","String","listenerCount","size","TOPIC_TASKS","TOPIC_RESULTS","TOPIC_STATE","TOPIC_EVENTS","TOPIC_INBOX","TOPIC_TOOLS","TOPIC_APPROVAL","AgentRoom","name","roomContext","client","log","agentId","presence","super","_agents","_roomContext","_client","_log","_presence","_wireTopicListeners","_wirePresenceListeners","setPresence","_fetchInitialPresence","getConnectedAgents","Array","from","values","findAgents","capability","filter","a","capabilities","includes","hasCapability","length","getAvailableCapabilities","caps","agent","cap","data","fetchPresence","map","_toConnectedAgent","_emitPresence","actorId","context","publishTask","envelope","createdBy","_publish","publishResult","completedBy","replyTo","publishState","updatedBy","retain","publishEvent","emittedBy","publishInbox","publishTools","type","publishApproval","topic","options","actor","actorTokenId","role","metadata","connectedAt","joinedAt","Date","now","actors","isArray","connected","evt","roomId","id","existing","subscribe","loadBalance","filters","broadcastTopics","simpleMap","generateId","crypto","randomUUID","replace","Math","floor","random","toString","createTimestamp","NoLagAgents","token","prefix","_appContext","_rooms","_connected","_token","_options","appName","debug","rooms","lobby","clientOptions","_args","connect","NoLag","setApp","reason","err","message","roomName","room","subscribeLobby","lobbySlug","Error","setLobby","agents","initialState","Object","keys","disconnect","agentRoom","setRoom","CorrelationManager","_pending","register","correlationId","timeoutMs","Promise","resolve","reject","timer","setTimeout","value","entry","clearTimeout","createTaskEnvelope","payload","taskId","tags","priority","createdAt","timeout","createResultEnvelope","status","completedAt","createStateEnvelope","key","version","updatedAt","createEventEnvelope","category","severity","eventId","timestamp","createApprovalRequest","action","requestedBy","requestId","urgency","requestedAt","expiresAt","createApprovalResponse","decision","respondedBy","respondedAt","createToolRequest","toolName","arguments","createToolResponse","result","Handoff","_correlations","_room","dispatch","allowNoWorkers","join","waitForResult","onTask","capabilitiesOrHandler","maybeHandler","task","getCapableAgents","dispose","Inbox","_agentId","send","to","messageId","onMessage","msg","Blackboard","_state","getEnvelope","getAll","onChange","Observe","_emittedBy","Approve","request","onRequest","response","Tools","async","undefined","code","invoke","TAG_PREFIX","CAPABILITY","PRIORITY","ROLE","SEVERITY","URGENCY","TENANT","TAG_FLAGS","REQUIRES_HUMAN","REQUIRES_AUDIT","tag"],"mappings":"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"}
1
+ {"version":3,"file":"browser.js","sources":["../src/EventEmitter.ts","../src/constants.ts","../src/AgentRoom.ts","../src/utils.ts","../src/NoLagAgents.ts","../src/errors.ts","../src/correlation.ts","../src/envelope.ts","../src/patterns/handoff.ts","../src/patterns/inbox.ts","../src/patterns/blackboard.ts","../src/patterns/observe.ts","../src/patterns/approve.ts","../src/patterns/tools.ts","../src/tags.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"names":["EventEmitter","constructor","this","_handlers","Map","on","event","handler","has","set","Set","get","add","off","delete","removeAllListeners","clear","emit","args","handlers","e","console","error","String","listenerCount","size","TOPIC_TASKS","TOPIC_RESULTS","TOPIC_STATE","TOPIC_EVENTS","TOPIC_INBOX","TOPIC_TOOLS","TOPIC_APPROVAL","AGENTS_PROTOCOL_VERSION","AgentRoom","name","roomContext","client","log","agentId","presence","super","_agents","_roomContext","_client","_log","_presence","_wireTopicListeners","_wirePresenceListeners","withProtocol","protocol","setPresence","_fetchInitialPresence","getConnectedAgents","Array","from","values","findAgents","capability","filter","a","capabilities","includes","hasCapability","length","getAvailableCapabilities","caps","agent","cap","data","fetchPresence","map","_toConnectedAgent","_emitPresence","actorId","context","publishTask","envelope","createdBy","_publish","publishResult","completedBy","replyTo","publishState","updatedBy","retain","publishEvent","emittedBy","publishInbox","publishTools","type","publishApproval","topic","options","actor","actorTokenId","role","metadata","connectedAt","joinedAt","Date","now","status","actors","isArray","connected","evt","roomId","id","existing","subscribe","loadBalance","filters","broadcastTopics","simpleMap","generateId","crypto","randomUUID","replace","Math","floor","random","toString","createTimestamp","NoLagAgents","token","prefix","_appContext","_rooms","_connected","_token","_options","appName","debug","rooms","lobby","clientOptions","_args","connect","NoLag","setApp","reason","err","message","roomName","room","subscribeLobby","lobbySlug","Error","setLobby","agents","initialState","Object","keys","disconnect","agentRoom","setRoom","IncompatibleProtocolError","operation","join","CorrelationManager","_pending","register","correlationId","timeoutMs","Promise","resolve","reject","timer","setTimeout","value","entry","clearTimeout","createTaskEnvelope","payload","taskId","tags","priority","createdAt","timeout","createResultEnvelope","completedAt","createStateEnvelope","key","version","updatedAt","createEventEnvelope","category","severity","eventId","timestamp","createApprovalRequest","action","requestedBy","requestId","urgency","requestedAt","expiresAt","createApprovalResponse","decision","respondedBy","respondedAt","createToolRequest","toolName","arguments","createToolResponse","result","Handoff","_correlations","_warnedMixed","_room","dispatch","allowNoWorkers","capable","requireOnline","undefined","waitForResult","allowLegacyResponders","modern","warn","onTask","capabilitiesOrHandler","maybeHandler","task","getCapableAgents","dispose","Inbox","_agentId","send","to","messageId","onMessage","msg","Blackboard","_state","getEnvelope","getAll","onChange","Observe","_emittedBy","Approve","request","onRequest","response","Tools","async","_ownsNamespace","nack","code","ns","slice","indexOf","invoke","servers","serverCount","TAG_PREFIX","CAPABILITY","PRIORITY","ROLE","SEVERITY","URGENCY","TENANT","TAG_FLAGS","REQUIRES_HUMAN","REQUIRES_AUDIT","tag"],"mappings":"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"}
@@ -18,3 +18,7 @@ export declare const TOPIC_APPROVAL = "approval";
18
18
  export declare const DEFAULT_ROOM = "default-workflow";
19
19
  /** Lobby for agent activity observation */
20
20
  export declare const LOBBY_AGENT_ACTIVITY = "agent-activity";
21
+ /** Agents-protocol version: 2 = directed replies (filter-routed results),
22
+ * NO_HANDLER NACKs, presence protocol advertisement. Absent/1 = legacy
23
+ * broadcast replies (pre-0.2.0 SDKs). */
24
+ export declare const AGENTS_PROTOCOL_VERSION = 2;
@@ -8,7 +8,7 @@ export declare class CorrelationManager<T = unknown> {
8
8
  * Register a pending correlation. Returns a promise that resolves
9
9
  * when `resolve()` is called with the matching correlationId.
10
10
  */
11
- register(correlationId: string, timeoutMs?: number): Promise<T>;
11
+ register(correlationId: string, timeoutMs?: number, context?: string): Promise<T>;
12
12
  /**
13
13
  * Resolve a pending correlation with a value.
14
14
  * Returns true if the correlationId was found and resolved.
@@ -0,0 +1,11 @@
1
+ /**
2
+ * IncompatibleProtocolError — thrown when an operation would deterministically
3
+ * fail because every relevant counterpart runs an older agents-protocol
4
+ * (pre-directed-replies). Failing fast beats burning the correlation timeout.
5
+ */
6
+ export declare class IncompatibleProtocolError extends Error {
7
+ constructor(operation: string, agents: Array<{
8
+ name: string;
9
+ protocol: number;
10
+ }>);
11
+ }
package/dist/index.cjs CHANGED
@@ -68,6 +68,10 @@ const TOPIC_TOOLS = "tools";
68
68
  const TOPIC_APPROVAL = "approval";
69
69
  /** Default room for agent coordination */
70
70
  const DEFAULT_ROOM = "default-workflow";
71
+ /** Agents-protocol version: 2 = directed replies (filter-routed results),
72
+ * NO_HANDLER NACKs, presence protocol advertisement. Absent/1 = legacy
73
+ * broadcast replies (pre-0.2.0 SDKs). */
74
+ const AGENTS_PROTOCOL_VERSION = 2;
71
75
 
72
76
  /**
73
77
  * AgentRoom — wraps a RoomContext from @nolag/js-sdk.
@@ -100,10 +104,13 @@ class AgentRoom extends EventEmitter {
100
104
  this._presence = presence;
101
105
  this._wireTopicListeners();
102
106
  this._wirePresenceListeners();
103
- // Set presence if provided
107
+ // Set presence if provided (with the SDK's protocol version advertised
108
+ // so counterparts can detect incompatible reply semantics)
104
109
  if (presence) {
105
- this._log(`setting presence in room ${name}:`, presence);
106
- this._roomContext.setPresence(presence);
110
+ const withProtocol = { protocol: AGENTS_PROTOCOL_VERSION, ...presence };
111
+ this._presence = withProtocol;
112
+ this._log(`setting presence in room ${name}:`, withProtocol);
113
+ this._roomContext.setPresence(withProtocol);
107
114
  }
108
115
  // Fetch initial presence snapshot
109
116
  this._fetchInitialPresence();
@@ -136,11 +143,12 @@ class AgentRoom extends EventEmitter {
136
143
  // ============================================================
137
144
  // PRESENCE
138
145
  // ============================================================
139
- /** Update this agent's presence data */
146
+ /** Update this agent's presence data (protocol version auto-injected) */
140
147
  setPresence(data) {
141
- this._presence = data;
148
+ const withProtocol = { protocol: AGENTS_PROTOCOL_VERSION, ...data };
149
+ this._presence = withProtocol;
142
150
  this._log(`updating presence in room ${this.name}`);
143
- this._roomContext.setPresence(data);
151
+ this._roomContext.setPresence(withProtocol);
144
152
  }
145
153
  /** Fetch current presence snapshot for this room */
146
154
  async fetchPresence() {
@@ -251,6 +259,8 @@ class AgentRoom extends EventEmitter {
251
259
  capabilities: presence.capabilities || [],
252
260
  metadata: presence.metadata,
253
261
  connectedAt: actor.joinedAt || Date.now(),
262
+ protocol: typeof presence.protocol === 'number' ? presence.protocol : 1,
263
+ status: actor.status,
254
264
  };
255
265
  }
256
266
  async _fetchInitialPresence() {
@@ -286,6 +296,7 @@ class AgentRoom extends EventEmitter {
286
296
  capabilities: data.capabilities || [],
287
297
  metadata: data.metadata,
288
298
  connectedAt: Date.now(),
299
+ protocol: typeof data.protocol === 'number' ? data.protocol : 1,
289
300
  };
290
301
  this._agents.set(id, agent);
291
302
  this._log(`agent joined room ${this.name}:`, agent.name, agent.capabilities);
@@ -317,6 +328,7 @@ class AgentRoom extends EventEmitter {
317
328
  capabilities: data.capabilities || existing?.capabilities || [],
318
329
  metadata: data.metadata || existing?.metadata,
319
330
  connectedAt: existing?.connectedAt || Date.now(),
331
+ protocol: typeof data.protocol === 'number' ? data.protocol : (existing?.protocol ?? 1),
320
332
  };
321
333
  this._agents.set(id, agent);
322
334
  this.emit('presenceUpdate', id, data);
@@ -623,6 +635,24 @@ class NoLagAgents extends EventEmitter {
623
635
  }
624
636
  }
625
637
 
638
+ /**
639
+ * IncompatibleProtocolError — thrown when an operation would deterministically
640
+ * fail because every relevant counterpart runs an older agents-protocol
641
+ * (pre-directed-replies). Failing fast beats burning the correlation timeout.
642
+ */
643
+ class IncompatibleProtocolError extends Error {
644
+ constructor(operation, agents) {
645
+ const list = agents.map((a) => `${a.name} (protocol ${a.protocol})`).join(", ");
646
+ super(`${operation} cannot succeed: every relevant agent advertises agents-protocol < 2 ` +
647
+ `[${list}]. Protocol >= 2 responders direct replies to the requester; older ones ` +
648
+ `broadcast and their replies never reach this SDK's filtered subscription. ` +
649
+ `Upgrade the responders to @nolag/agents >= 0.2.0 / nolag-agents >= 0.3.0. ` +
650
+ `NOTE: 0.2.x/0.3.0 responders DO have directed replies but do not yet advertise ` +
651
+ `protocol — if your responders run those versions, pass { allowLegacyResponders: true }.`);
652
+ this.name = "IncompatibleProtocolError";
653
+ }
654
+ }
655
+
626
656
  /**
627
657
  * CorrelationManager — maps correlationIds to pending promises with timeout.
628
658
  * Used by Handoff and Tools patterns for request/response correlation.
@@ -635,13 +665,16 @@ class CorrelationManager {
635
665
  * Register a pending correlation. Returns a promise that resolves
636
666
  * when `resolve()` is called with the matching correlationId.
637
667
  */
638
- register(correlationId, timeoutMs) {
668
+ register(correlationId, timeoutMs, context) {
639
669
  return new Promise((resolve, reject) => {
640
670
  let timer = null;
641
671
  if (timeoutMs && timeoutMs > 0) {
642
672
  timer = setTimeout(() => {
643
673
  this._pending.delete(correlationId);
644
- reject(new Error(`Correlation ${correlationId} timed out after ${timeoutMs}ms`));
674
+ // Context turns an opaque correlation id into an actionable error —
675
+ // callers supply what they were waiting for and the likely causes.
676
+ const what = context ?? `Correlation ${correlationId}`;
677
+ reject(new Error(`${what} timed out after ${timeoutMs}ms`));
645
678
  }, timeoutMs);
646
679
  }
647
680
  this._pending.set(correlationId, { resolve, reject, timer });
@@ -699,6 +732,7 @@ class CorrelationManager {
699
732
  function createTaskEnvelope(capability, payload, options) {
700
733
  return {
701
734
  type: "task",
735
+ protocol: AGENTS_PROTOCOL_VERSION,
702
736
  taskId: generateId(),
703
737
  correlationId: generateId(),
704
738
  replyTo: options?.replyTo,
@@ -715,6 +749,7 @@ function createTaskEnvelope(capability, payload, options) {
715
749
  function createResultEnvelope(taskId, correlationId, status, payload, error, completedBy, replyTo) {
716
750
  return {
717
751
  type: "result",
752
+ protocol: AGENTS_PROTOCOL_VERSION,
718
753
  correlationId,
719
754
  taskId,
720
755
  status,
@@ -728,6 +763,7 @@ function createResultEnvelope(taskId, correlationId, status, payload, error, com
728
763
  function createStateEnvelope(key, value, version, updatedBy) {
729
764
  return {
730
765
  type: "state",
766
+ protocol: AGENTS_PROTOCOL_VERSION,
731
767
  key,
732
768
  value,
733
769
  version,
@@ -738,6 +774,7 @@ function createStateEnvelope(key, value, version, updatedBy) {
738
774
  function createEventEnvelope(category, emittedBy, payload, severity = "info") {
739
775
  return {
740
776
  type: "event",
777
+ protocol: AGENTS_PROTOCOL_VERSION,
741
778
  eventId: generateId(),
742
779
  severity,
743
780
  category,
@@ -749,6 +786,7 @@ function createEventEnvelope(category, emittedBy, payload, severity = "info") {
749
786
  function createApprovalRequest(action, context, requestedBy, options) {
750
787
  return {
751
788
  type: "approval_request",
789
+ protocol: AGENTS_PROTOCOL_VERSION,
752
790
  requestId: generateId(),
753
791
  correlationId: generateId(),
754
792
  action,
@@ -762,6 +800,7 @@ function createApprovalRequest(action, context, requestedBy, options) {
762
800
  function createApprovalResponse(requestId, correlationId, decision, respondedBy, reason) {
763
801
  return {
764
802
  type: "approval_response",
803
+ protocol: AGENTS_PROTOCOL_VERSION,
765
804
  requestId,
766
805
  correlationId,
767
806
  decision,
@@ -773,6 +812,7 @@ function createApprovalResponse(requestId, correlationId, decision, respondedBy,
773
812
  function createToolRequest(toolName, args, requestedBy, options) {
774
813
  return {
775
814
  type: "tool_request",
815
+ protocol: AGENTS_PROTOCOL_VERSION,
776
816
  requestId: generateId(),
777
817
  correlationId: generateId(),
778
818
  replyTo: options?.replyTo,
@@ -785,6 +825,7 @@ function createToolRequest(toolName, args, requestedBy, options) {
785
825
  function createToolResponse(requestId, correlationId, status, result, error, respondedBy, replyTo) {
786
826
  return {
787
827
  type: "tool_response",
828
+ protocol: AGENTS_PROTOCOL_VERSION,
788
829
  requestId,
789
830
  correlationId,
790
831
  status,
@@ -823,6 +864,7 @@ function createToolResponse(requestId, correlationId, status, result, error, res
823
864
  class Handoff {
824
865
  constructor(room) {
825
866
  this._correlations = new CorrelationManager();
867
+ this._warnedMixed = false;
826
868
  this._room = room;
827
869
  // Wire result correlation
828
870
  this._room.on("result", (envelope) => {
@@ -837,11 +879,16 @@ class Handoff {
837
879
  * agent is connected (unless `allowNoWorkers` is set).
838
880
  */
839
881
  async dispatch(capability, payload, options) {
840
- // Service discovery: check if any agent can handle this capability
882
+ // Service discovery: check if any agent can handle this capability.
883
+ // Persistent Presence: findAgents includes offline persistent agents, which
884
+ // the broker wakes on publish — so they satisfy the gate unless requireOnline.
841
885
  if (!options?.allowNoWorkers) {
842
886
  const capable = this._room.findAgents(capability);
843
- if (capable.length === 0) {
844
- throw new Error(`No agent with capability "${capability}" is connected. ` +
887
+ const usable = options?.requireOnline
888
+ ? capable.filter((a) => a.status === undefined || a.status === "online")
889
+ : capable;
890
+ if (usable.length === 0) {
891
+ throw new Error(`No ${options?.requireOnline ? "online " : ""}agent with capability "${capability}" is available. ` +
845
892
  `Available capabilities: [${this._room.getAvailableCapabilities().join(', ')}]. ` +
846
893
  `Connected agents: ${this._room.getConnectedAgents().length}. ` +
847
894
  `Use { allowNoWorkers: true } to dispatch anyway.`);
@@ -856,7 +903,26 @@ class Handoff {
856
903
  });
857
904
  this._room.publishTask(envelope);
858
905
  if (options?.waitForResult) {
859
- return this._correlations.register(envelope.correlationId, options.timeout);
906
+ // Fail fast when the outcome is deterministic: if capable workers are
907
+ // visible and ALL advertise agents-protocol < 2, their results cannot
908
+ // reach this dispatcher's filtered subscription. Mixed pools proceed
909
+ // with a warning (presence is eventually consistent).
910
+ const capable = this._room.findAgents(capability);
911
+ if (!options?.allowLegacyResponders && capable.length > 0) {
912
+ const modern = capable.filter((a) => a.protocol >= 2);
913
+ if (modern.length === 0) {
914
+ throw new IncompatibleProtocolError(`Task '${capability}' dispatch with waitForResult`, capable.map((a) => ({ name: a.name, protocol: a.protocol })));
915
+ }
916
+ if (modern.length < capable.length && !this._warnedMixed) {
917
+ this._warnedMixed = true;
918
+ console.warn(`[nolag-agents] Capability '${capability}' has workers on agents-protocol < 2: ` +
919
+ capable.filter((a) => a.protocol < 2).map((a) => a.name).join(", ") +
920
+ ". Their results may not be delivered — upgrade them.");
921
+ }
922
+ }
923
+ return this._correlations.register(envelope.correlationId, options.timeout, `Task '${capability}' dispatch (${capable.length} capable worker${capable.length === 1 ? "" : "s"} visible). ` +
924
+ `Likely causes: worker crashed mid-task, worker on agents-protocol < 2 ` +
925
+ `(results not directed), or the room is not deliverable`);
860
926
  }
861
927
  }
862
928
  onTask(capabilitiesOrHandler, maybeHandler) {
@@ -1070,6 +1136,7 @@ class Tools {
1070
1136
  constructor(room, agentId) {
1071
1137
  this._correlations = new CorrelationManager();
1072
1138
  this._handlers = new Map();
1139
+ this._warnedMixed = false;
1073
1140
  this._room = room;
1074
1141
  this._agentId = agentId;
1075
1142
  // Wire response correlation
@@ -1079,10 +1146,30 @@ class Tools {
1079
1146
  // Wire request handling
1080
1147
  this._room.on("toolRequest", async (envelope) => {
1081
1148
  const handler = this._handlers.get(envelope.toolName);
1082
- if (!handler)
1083
- return;
1084
1149
  // Direct the response back to the requester's filter sub-topic
1085
1150
  const replyTo = envelope.replyTo ?? envelope.requestedBy;
1151
+ if (!handler) {
1152
+ // Tool requests are load-balanced to EVERY group in the room, so
1153
+ // agents legitimately receive requests meant for other tool servers.
1154
+ // Stay silent unless this agent plausibly owns the tool:
1155
+ // - pure requesters (zero handlers) never answer
1156
+ // - servers answer only within their own namespace (the prefix
1157
+ // before the first '.', e.g. 'backend.*', 'chemistry.*') — a
1158
+ // 'backend.*' server NACKing 'chemistry.analyze' would race and
1159
+ // beat the real chemistry server's response
1160
+ if (!this._ownsNamespace(envelope.toolName))
1161
+ return;
1162
+ // A tool SERVER missing a handler in ITS OWN namespace NACKs instead
1163
+ // of silently ignoring — silence means the requester burns its full
1164
+ // timeout. (Requires homogeneous tool sets within a loadBalanceGroup
1165
+ // — see AGENTS-PROTOCOL.md.)
1166
+ const nack = createToolResponse(envelope.requestId, envelope.correlationId, "error", null, {
1167
+ code: "NO_HANDLER",
1168
+ message: `Agent '${this._agentId}' has no handler for tool '${envelope.toolName}'`,
1169
+ }, this._agentId, replyTo);
1170
+ this._room.publishTools(nack);
1171
+ return;
1172
+ }
1086
1173
  try {
1087
1174
  const result = await handler(envelope.arguments);
1088
1175
  const response = createToolResponse(envelope.requestId, envelope.correlationId, "success", result, undefined, this._agentId, replyTo);
@@ -1103,10 +1190,43 @@ class Tools {
1103
1190
  register(toolName, handler) {
1104
1191
  this._handlers.set(toolName, handler);
1105
1192
  }
1193
+ /** True when this agent hosts handlers in the tool's namespace (prefix
1194
+ * before the first '.'); unprefixed tools match any unprefixed handler. */
1195
+ _ownsNamespace(toolName) {
1196
+ if (this._handlers.size === 0)
1197
+ return false;
1198
+ const ns = toolName.includes(".") ? toolName.slice(0, toolName.indexOf(".")) : null;
1199
+ for (const name of this._handlers.keys()) {
1200
+ const handlerNs = name.includes(".") ? name.slice(0, name.indexOf(".")) : null;
1201
+ if (handlerNs === ns)
1202
+ return true;
1203
+ }
1204
+ return false;
1205
+ }
1106
1206
  /**
1107
1207
  * Invoke a remote tool and wait for the response.
1108
1208
  */
1109
1209
  async invoke(toolName, args, options) {
1210
+ // Fail fast when the outcome is deterministic: tool servers are visible
1211
+ // in presence; if some exist and ALL advertise protocol < 2, their
1212
+ // replies cannot reach this requester. Mixed pools proceed with a
1213
+ // warning (presence is eventually consistent — hard-failing on one
1214
+ // stale entry would flake).
1215
+ const servers = this._room
1216
+ .getConnectedAgents()
1217
+ .filter((a) => a.role === "tool-server");
1218
+ if (!options?.allowLegacyResponders && servers.length > 0) {
1219
+ const modern = servers.filter((a) => a.protocol >= 2);
1220
+ if (modern.length === 0) {
1221
+ throw new IncompatibleProtocolError(`Tool '${toolName}' invocation`, servers.map((a) => ({ name: a.name, protocol: a.protocol })));
1222
+ }
1223
+ if (modern.length < servers.length && !this._warnedMixed) {
1224
+ this._warnedMixed = true;
1225
+ console.warn(`[nolag-agents] Room '${this._room.name}' has tool servers on agents-protocol < 2: ` +
1226
+ servers.filter((a) => a.protocol < 2).map((a) => a.name).join(", ") +
1227
+ ". Their replies may not be delivered — upgrade them.");
1228
+ }
1229
+ }
1110
1230
  // replyTo is the room's agentId — the filter sub-topic this room's
1111
1231
  // results subscription listens on. (this._agentId may differ when a
1112
1232
  // caller attributes requests to a logical agent; delivery must use the
@@ -1115,7 +1235,12 @@ class Tools {
1115
1235
  replyTo: this._room.agentId,
1116
1236
  });
1117
1237
  this._room.publishTools(envelope);
1118
- return this._correlations.register(envelope.correlationId, options?.timeout);
1238
+ const serverCount = servers.length;
1239
+ return this._correlations.register(envelope.correlationId, options?.timeout, `Tool '${toolName}' invocation in room '${this._room.name}' ` +
1240
+ `(${serverCount} tool-server${serverCount === 1 ? "" : "s"} visible). ` +
1241
+ `Likely causes: no agent has this tool registered (pre-0.3.0 responders ` +
1242
+ `don't NACK), the responder is offline, or the room is not deliverable ` +
1243
+ `(watch the room 'error' events)`);
1119
1244
  }
1120
1245
  /** Cancel all pending correlations */
1121
1246
  dispose() {
@@ -1143,6 +1268,7 @@ function tag(prefix, value) {
1143
1268
  return `${prefix}:${value}`;
1144
1269
  }
1145
1270
 
1271
+ exports.AGENTS_PROTOCOL_VERSION = AGENTS_PROTOCOL_VERSION;
1146
1272
  exports.AgentRoom = AgentRoom;
1147
1273
  exports.Approve = Approve;
1148
1274
  exports.Blackboard = Blackboard;
@@ -1150,6 +1276,7 @@ exports.CorrelationManager = CorrelationManager;
1150
1276
  exports.EventEmitter = EventEmitter;
1151
1277
  exports.Handoff = Handoff;
1152
1278
  exports.Inbox = Inbox;
1279
+ exports.IncompatibleProtocolError = IncompatibleProtocolError;
1153
1280
  exports.NoLagAgents = NoLagAgents;
1154
1281
  exports.Observe = Observe;
1155
1282
  exports.TAG_FLAGS = TAG_FLAGS;