shennian 0.3.20 → 0.3.21

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.
@@ -516,8 +516,8 @@
516
516
  },
517
517
  {
518
518
  "file": "src/room/room-binding-client.js",
519
- "beforeBytes": 6716,
520
- "afterBytes": 3894
519
+ "beforeBytes": 7028,
520
+ "afterBytes": 4032
521
521
  },
522
522
  {
523
523
  "file": "src/room/room-binding-ipc.js",
@@ -581,8 +581,8 @@
581
581
  },
582
582
  {
583
583
  "file": "src/session/handlers/room-managed.js",
584
- "beforeBytes": 3173,
585
- "afterBytes": 1972
584
+ "beforeBytes": 3724,
585
+ "afterBytes": 2153
586
586
  },
587
587
  {
588
588
  "file": "src/session/handlers/session-refresh.js",
@@ -1 +1 @@
1
- import{HttpRoomActionClient as r}from"./room-action-client.js";class o extends Error{code;constructor(e,n){super(n),this.code=e,this.name="RoomBindingHttpError"}}class m{fetchImpl;baseUrl;actionClient;constructor(e,n=fetch){this.fetchImpl=n,this.baseUrl=e.replace(/\/+$/,""),this.actionClient=new r(e,n)}status=e=>this.actionClient.status(e);getAttachmentCapability=e=>this.actionClient.getAttachmentCapability(e);initializeAttachment=e=>this.actionClient.initializeAttachment(e);completeAttachment=e=>this.actionClient.completeAttachment(e);createRoom=e=>this.actionClient.createRoom(e);createOperatorRoom=e=>this.actionClient.createOperatorRoom(e);resolveNativeSession=e=>this.actionClient.resolveNativeSession(e);joinRoom=e=>this.actionClient.joinRoom(e);read=e=>this.actionClient.read(e);send=e=>this.actionClient.send(e);mode=e=>this.actionClient.mode(e);async create(e){let n;try{n=await this.fetchImpl(`${this.baseUrl}/api/rooms/${encodeURIComponent(e.roomId)}/bindings`,{method:"POST",headers:{authorization:`Bearer ${e.machineToken}`,"content-type":"application/json"},body:JSON.stringify({bindingIntentId:e.bindingIntentId,agentIdentityId:e.agentIdentityId,nianSessionId:e.nianSessionId,runtimeAdapter:e.runtimeAdapter,sessionRegistryKey:e.sessionRegistryKey,activationCapability:e.activationCapability,activationMode:e.activationMode}),signal:AbortSignal.timeout(1e4)})}catch{throw new o("room_binding_server_unavailable","Shennian Room service is unavailable.")}if(!n.ok){let i=`room_binding_http_${n.status}`;try{const s=await n.json();typeof s.error=="string"&&/^[a-z0-9_-]{1,80}$/.test(s.error)&&(i=s.error)}catch{}throw new o(i,"Shennian Room binding request failed.")}let t;try{t=await n.json()}catch{throw new o("invalid_room_binding_response","Invalid Room binding response.")}return d(t,e)}async restart(e){let n;try{n=await this.fetchImpl(`${this.baseUrl}/api/rooms/${encodeURIComponent(e.roomId)}/bindings/${encodeURIComponent(e.bindingId)}/session`,{method:"PATCH",headers:{authorization:`Bearer ${e.machineToken}`,"content-type":"application/json"},body:JSON.stringify({agentIdentityId:e.agentIdentityId,previousNianSessionId:e.previousNianSessionId,nianSessionId:e.nianSessionId,runtimeAdapter:e.runtimeAdapter,sessionRegistryKey:e.sessionRegistryKey}),signal:AbortSignal.timeout(1e4)})}catch{throw new o("room_binding_server_unavailable","Shennian Room service is unavailable.")}const t=await n.json().catch(()=>null);if(!n.ok){const s=t&&typeof t.error=="string"&&/^[a-z0-9_-]{1,80}$/.test(t.error)?t.error:`room_binding_http_${n.status}`;throw new o(s,"Shennian Room restart request failed.")}const i=t;if(!i?.binding||i.binding.id!==e.bindingId||i.binding.roomId!==e.roomId||i.binding.agentIdentityId!==e.agentIdentityId||i.binding.nianSessionId!==e.nianSessionId||i.binding.runtimeAdapter!==e.runtimeAdapter||typeof i.binding.agentMembershipId!="string"||typeof i.resumeSequence!="string"||!/^(0|[1-9]\d{0,19})$/.test(i.resumeSequence)||typeof i.idempotent!="boolean")throw new o("invalid_room_binding_response","Invalid Room restart response.");return{binding:i.binding,resumeSequence:i.resumeSequence,idempotent:i.idempotent}}}function d(a,e){if(!a||typeof a!="object")throw new o("invalid_room_binding_response","Invalid Room binding response.");const n=a,t=n.binding;if(!t||typeof t.id!="string"||typeof t.agentMembershipId!="string"||t.roomId!==e.roomId||t.agentIdentityId!==e.agentIdentityId||t.nianSessionId!==e.nianSessionId||t.runtimeAdapter!==e.runtimeAdapter||t.activationCapability!==e.activationCapability||t.activationMode!==e.activationMode||!["pending_approval","active","paused","detached"].includes(t.status??"")||typeof n.idempotent!="boolean")throw new o("invalid_room_binding_response","Room binding response does not match the request.");return{binding:t,idempotent:n.idempotent}}export{m as HttpRoomBindingClient,o as RoomBindingHttpError};
1
+ import{HttpRoomActionClient as r}from"./room-action-client.js";class a extends Error{code;constructor(e,n){super(n),this.code=e,this.name="RoomBindingHttpError"}}class l{fetchImpl;baseUrl;actionClient;constructor(e,n=fetch){this.fetchImpl=n,this.baseUrl=e.replace(/\/+$/,""),this.actionClient=new r(e,n)}status=e=>this.actionClient.status(e);getAttachmentCapability=e=>this.actionClient.getAttachmentCapability(e);initializeAttachment=e=>this.actionClient.initializeAttachment(e);completeAttachment=e=>this.actionClient.completeAttachment(e);createRoom=e=>this.actionClient.createRoom(e);createOperatorRoom=e=>this.actionClient.createOperatorRoom(e);resolveNativeSession=e=>this.actionClient.resolveNativeSession(e);joinRoom=e=>this.actionClient.joinRoom(e);read=e=>this.actionClient.read(e);send=e=>this.actionClient.send(e);mode=e=>this.actionClient.mode(e);async create(e){let n;try{n=await this.fetchImpl(`${this.baseUrl}/api/rooms/${encodeURIComponent(e.roomId)}/bindings`,{method:"POST",headers:{authorization:`Bearer ${e.machineToken}`,"content-type":"application/json"},body:JSON.stringify({bindingIntentId:e.bindingIntentId,agentIdentityId:e.agentIdentityId,nianSessionId:e.nianSessionId,runtimeAdapter:e.runtimeAdapter,sessionRegistryKey:e.sessionRegistryKey,activationCapability:e.activationCapability,activationMode:e.activationMode}),signal:AbortSignal.timeout(1e4)})}catch{throw new a("room_binding_server_unavailable","Shennian Room service is unavailable.")}if(!n.ok){let i=`room_binding_http_${n.status}`;try{const s=await n.json();typeof s.error=="string"&&/^[a-z0-9_-]{1,80}$/.test(s.error)&&(i=s.error)}catch{}throw new a(i,"Shennian Room binding request failed.")}let t;try{t=await n.json()}catch{throw new a("invalid_room_binding_response","Invalid Room binding response.")}return d(t,e)}async restart(e){let n;try{n=await this.fetchImpl(`${this.baseUrl}/api/rooms/${encodeURIComponent(e.roomId)}/bindings/${encodeURIComponent(e.bindingId)}/session`,{method:"PATCH",headers:{authorization:`Bearer ${e.machineToken}`,"content-type":"application/json"},body:JSON.stringify({agentIdentityId:e.agentIdentityId,previousNianSessionId:e.previousNianSessionId,nianSessionId:e.nianSessionId,runtimeAdapter:e.runtimeAdapter,sessionRegistryKey:e.sessionRegistryKey}),signal:AbortSignal.timeout(1e4)})}catch{throw new a("room_binding_server_unavailable","Shennian Room service is unavailable.")}const t=await n.json().catch(()=>null);if(!n.ok){const s=t&&typeof t.error=="string"&&/^[a-z0-9_-]{1,80}$/.test(t.error)?t.error:`room_binding_http_${n.status}`;throw new a(s,"Shennian Room restart request failed.")}const i=t;if(!i?.binding||i.binding.id!==e.bindingId||i.binding.roomId!==e.roomId||i.binding.agentIdentityId!==e.agentIdentityId||i.binding.nianSessionId!==e.nianSessionId||i.binding.runtimeAdapter!==e.runtimeAdapter||typeof i.binding.agentMembershipId!="string"||typeof i.resumeSequence!="string"||!/^(0|[1-9]\d{0,19})$/.test(i.resumeSequence)||typeof i.idempotent!="boolean")throw new a("invalid_room_binding_response","Invalid Room restart response.");return{binding:i.binding,resumeSequence:i.resumeSequence,idempotent:i.idempotent}}}function d(o,e){if(!o||typeof o!="object")throw new a("invalid_room_binding_response","Invalid Room binding response.");const n=o,t=n.binding;if(!t||typeof t.id!="string"||typeof t.agentMembershipId!="string"||t.roomId!==e.roomId||t.agentIdentityId!==e.agentIdentityId||t.nianSessionId!==e.nianSessionId||t.runtimeAdapter!==e.runtimeAdapter||t.activationCapability!==e.activationCapability||!c(t.activationMode,e)||!["pending_approval","active","paused","detached"].includes(t.status??"")||typeof n.idempotent!="boolean")throw new a("invalid_room_binding_response","Room binding response does not match the request.");return{binding:t,idempotent:n.idempotent}}function c(o,e){return e.activationCapability==="managed"&&e.activationMode==="auto_follow"?o==="auto_follow"||o==="mention_only":o===e.activationMode}export{l as HttpRoomBindingClient,a as RoomBindingHttpError};
@@ -1 +1 @@
1
- const c=/^[A-Za-z0-9_.:@/-]{1,191}$/,S=new Set(["roomId","agentIdentityId","nianSessionId","assignmentIntentId"]),y=new Set(["roomId","bindingId","agentIdentityId","previousNianSessionId","nianSessionId","assignmentIntentId"]);async function w(e,t,n){if(!t)throw new Error("Managed Room binding is unavailable.");if(Object.keys(n.params).some(a=>!S.has(a)))throw new Error("Managed Room binding contains unsupported parameters.");const d=s(n.params.roomId,"roomId"),r=s(n.params.agentIdentityId,"agentIdentityId"),i=s(n.params.nianSessionId,"nianSessionId"),I=s(n.params.assignmentIntentId,"assignmentIntentId"),o=e.sessions.get(i);if(!o?.agentSessionId)throw new Error("The exact native Agent session is not ready for Room binding.");const g=await t.bind({roomId:d,agentIdentityId:r,nianSessionId:i,assignmentIntentId:I,agentSessionId:o.agentSessionId,workDir:o.workDir,agentType:o.agentType});e.client.sendRes({type:"res",id:n.id,ok:!0,payload:g})}async function u(e,t,n){if(!t)throw new Error("Managed Room binding is unavailable.");if(Object.keys(n.params).some(p=>!y.has(p)))throw new Error("Managed Room restart contains unsupported parameters.");const d=s(n.params.roomId,"roomId"),r=s(n.params.bindingId,"bindingId"),i=s(n.params.agentIdentityId,"agentIdentityId"),I=s(n.params.previousNianSessionId,"previousNianSessionId"),o=s(n.params.nianSessionId,"nianSessionId"),g=s(n.params.assignmentIntentId,"assignmentIntentId"),a=e.sessions.get(o);if(!a?.agentSessionId)throw new Error("The replacement native Agent session is not ready for Room binding.");const m=await t.restart({roomId:d,bindingId:r,agentIdentityId:i,previousNianSessionId:I,nianSessionId:o,assignmentIntentId:g,agentSessionId:a.agentSessionId,workDir:a.workDir,agentType:a.agentType});e.client.sendRes({type:"res",id:n.id,ok:!0,payload:m})}function s(e,t){if(typeof e!="string"||!c.test(e))throw new Error(`Invalid ${t}.`);return e}export{w as handleManagedRoomBind,u as handleManagedRoomRestart};
1
+ const p=/^[A-Za-z0-9_.:@/-]{1,191}$/,E=45e3,_=25,w=new Set(["roomId","agentIdentityId","nianSessionId","assignmentIntentId"]),y=new Set(["roomId","bindingId","agentIdentityId","previousNianSessionId","nianSessionId","assignmentIntentId"]);async function R(s,e,n){if(!e)throw new Error("Managed Room binding is unavailable.");if(Object.keys(n.params).some(i=>!w.has(i)))throw new Error("Managed Room binding contains unsupported parameters.");const o=t(n.params.roomId,"roomId"),d=t(n.params.agentIdentityId,"agentIdentityId"),r=t(n.params.nianSessionId,"nianSessionId"),I=t(n.params.assignmentIntentId,"assignmentIntentId"),a=await S(s,r);if(!a?.agentSessionId)throw new Error("The exact native Agent session is not ready for Room binding.");const g=await e.bind({roomId:o,agentIdentityId:d,nianSessionId:r,assignmentIntentId:I,agentSessionId:a.agentSessionId,workDir:a.workDir,agentType:a.agentType});s.client.sendRes({type:"res",id:n.id,ok:!0,payload:g})}async function u(s,e,n){if(!e)throw new Error("Managed Room binding is unavailable.");if(Object.keys(n.params).some(c=>!y.has(c)))throw new Error("Managed Room restart contains unsupported parameters.");const o=t(n.params.roomId,"roomId"),d=t(n.params.bindingId,"bindingId"),r=t(n.params.agentIdentityId,"agentIdentityId"),I=t(n.params.previousNianSessionId,"previousNianSessionId"),a=t(n.params.nianSessionId,"nianSessionId"),g=t(n.params.assignmentIntentId,"assignmentIntentId"),i=await S(s,a);if(!i?.agentSessionId)throw new Error("The replacement native Agent session is not ready for Room binding.");const m=await e.restart({roomId:o,bindingId:d,agentIdentityId:r,previousNianSessionId:I,nianSessionId:a,assignmentIntentId:g,agentSessionId:i.agentSessionId,workDir:i.workDir,agentType:i.agentType});s.client.sendRes({type:"res",id:n.id,ok:!0,payload:m})}function t(s,e){if(typeof s!="string"||!p.test(s))throw new Error(`Invalid ${e}.`);return s}async function S(s,e){const n=Date.now()+45e3;let o=s.sessions.get(e);for(;o&&!o.agentSessionId&&Date.now()<n;)await new Promise(d=>setTimeout(d,25)),o=s.sessions.get(e);return o}export{R as handleManagedRoomBind,u as handleManagedRoomRestart};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "shennian",
3
- "version": "0.3.20",
3
+ "version": "0.3.21",
4
4
  "description": "Shennian — AI Agent Control Plane CLI",
5
5
  "type": "module",
6
6
  "bin": {