@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 +2 -0
- package/dist/AgentRoom.d.ts +9 -1
- package/dist/browser.d.ts +2 -0
- package/dist/browser.js +1 -1
- package/dist/browser.js.map +1 -1
- package/dist/constants.d.ts +4 -0
- package/dist/correlation.d.ts +1 -1
- package/dist/errors.d.ts +11 -0
- package/dist/index.cjs +142 -15
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.mjs +141 -16
- package/dist/index.mjs.map +1 -1
- package/dist/patterns/handoff.d.ts +9 -0
- package/dist/patterns/tools.d.ts +5 -0
- package/dist/types.d.ts +30 -0
- package/package.json +3 -3
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
|
package/dist/AgentRoom.d.ts
CHANGED
|
@@ -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
|
package/dist/browser.js.map
CHANGED
|
@@ -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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"}
|
package/dist/constants.d.ts
CHANGED
|
@@ -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;
|
package/dist/correlation.d.ts
CHANGED
|
@@ -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.
|
package/dist/errors.d.ts
ADDED
|
@@ -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
|
-
|
|
106
|
-
this.
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
844
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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;
|