shennian 0.4.77 → 0.4.78
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.
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import{isAvailableBuiltinAgentType as k,managedAgentExecutionMode as P}from"@shennian/wire";import{getBuiltinAgentVersion as S,resolveBuiltinCommand as B}from"../agents/command-spec.js";import{registerCustomRuntimeSecurity as K,resolveCustomRuntimeExecutableFingerprint as
|
|
1
|
+
import{isAvailableBuiltinAgentType as k,managedAgentExecutionMode as P}from"@shennian/wire";import{getBuiltinAgentVersion as S,resolveBuiltinCommand as B}from"../agents/command-spec.js";import{registerCustomRuntimeSecurity as K,resolveCustomRuntimeExecutableFingerprint as $}from"../agents/custom-managed-runtime.js";import{loadConfig as x}from"../config/index.js";import{resolveManagedAgentExecutableIdentity as W}from"../security/managed-agent-executable.js";import{compileManagedAgentPolicy as T}from"../security/managed-agent-policy.js";import{resolveManagedAgentRuntimeProtection as q}from"../security/managed-agent-runtime.js";import{selectRoomActivationTargets as D}from"./activation-policy.js";import{buildManagedAgentPermissionPrompt as E,composeManagedRoomPrompt as R}from"./managed-prompt-composer.js";import{isCurrentRegistration as f}from"./registration-authority.js";const N=4,F=6e4,O=6,V=5*6e4;class ce{deps;latestContexts=new Map;constructor(e){this.deps=e}async processMessages(e,i,t,a={roomName:"\u5F53\u524D\u7FA4\u804A"}){const d=[],g=[],u=new Map,m=new Set,c=[...i].sort((o,s)=>J(o.sequence,s.sequence));for(const o of t){const s=this.deps.registry.getByRegistryKey(o.registryKey);!s?.binding||!f(this.deps.registry,o)||s.binding.roomId!==e||s.binding.status!=="active"&&s.binding.status!=="paused"&&s.binding.activationQueue.length}for(const o of t){const s=this.deps.registry.getByRegistryKey(o.registryKey);if(!s?.binding||!f(this.deps.registry,o)||s.binding.roomId!==e||s.binding.activationQueue.length===0&&!s.binding.activeActivation||(m.add(s.registryKey),s.binding.status!=="active"||s.binding.activationMode==="paused")||s.binding.activationQueue.length===0)continue;const y=this.deps.observations.getBySource(s);if(!y?.workspacePath||y.lifecycleState==="closed")throw new Error("managed_room_workspace_unavailable");this.latestContexts.set(s.registryKey,a);for(const r of s.binding.activationQueue)d.push({registration:s,input:{params:{sessionId:s.nianSessionId,text:r.deliveryText??"\u7FA4\u804A\u4E2D\u6709\u4E00\u6761\u5F85\u5904\u7406\u6D88\u606F\uFF0C\u8BF7\u7ED3\u5408\u5F53\u524D\u7FA4\u804A\u4E0A\u4E0B\u6587\u5904\u7406\u3002",agentType:l(s.runtimeAdapter),sessionMode:a.agentsByIdentityId?.[s.binding.agentIdentityId]?.sessionMode??"standard",managerConfig:a.agentsByIdentityId?.[s.binding.agentIdentityId]?.managerConfig??null,managerDefaultWorkerAgentType:a.agentsByIdentityId?.[s.binding.agentIdentityId]?.managerConfig?.defaultWorkerAgentType??null,managerDefaultWorkerModelId:a.agentsByIdentityId?.[s.binding.agentIdentityId]?.managerConfig?.defaultWorkerModelId??null,workDir:y.workspacePath,agentSessionId:s.sourceSessionKey,queueMessageId:`room-activation-${s.binding.bindingId}-${r.causeMessageId}`,clientMessageId:`room-activation-${s.binding.bindingId}-${r.causeMessageId}`},context:{registryKey:s.registryKey,causeMessageId:r.causeMessageId,rootCauseMessageId:r.rootCauseMessageId,sequence:r.sequence,hopCount:r.hopCount}}})}for(const o of c){const s=new Set(D(o,t).map(y=>y.registration.registryKey));for(const y of t){const r=this.deps.registry.getByRegistryKey(y.registryKey);if(!r?.binding||!f(this.deps.registry,y)||r.binding.roomId!==e||r.binding.status!=="active"&&r.binding.status!=="paused"||a.agentsByIdentityId?.[r.binding.agentIdentityId]?.configurationPending||BigInt(o.sequence)<=BigInt(r.binding.lastActivatedSequence))continue;const I=u.get(r.registryKey)??[...r.binding.mentionContext??[]];if(u.set(r.registryKey,I),s.has(r.registryKey)){const p=(o.activationCause?.hopCount??0)+(o.author.principalType==="agent"?1:0),h=o.activationCause?.rootCauseMessageId??o.id;if(p>N)this.audit(r,o.id,h,p,"suppressed","max_hops");else{const M=this.deps.registry.claimActivation({registryKey:r.registryKey,causeMessageId:o.id,windowMs:F,maxActivations:O,pauseMs:V,now:this.deps.now?.()});if(!M.allowed){M.newlyPaused&&this.audit(r,o.id,h,p,"suppressed","rate_limited"),g.push({registryKey:r.registryKey,sequence:o.sequence});continue}const b=this.deps.observations.getBySource(r);if(!b?.workspacePath||b.lifecycleState==="closed")throw new Error("managed_room_workspace_unavailable");const v=w([o]),C=r.binding.activationMode==="mention_only"?Q([...I.map(_=>_.deliveryText),v]):v;this.latestContexts.set(r.registryKey,a),d.push({registration:r,input:{params:{sessionId:r.nianSessionId,text:C,agentType:l(r.runtimeAdapter),sessionMode:a.agentsByIdentityId?.[r.binding.agentIdentityId]?.sessionMode??"standard",managerConfig:a.agentsByIdentityId?.[r.binding.agentIdentityId]?.managerConfig??null,managerDefaultWorkerAgentType:a.agentsByIdentityId?.[r.binding.agentIdentityId]?.managerConfig?.defaultWorkerAgentType??null,managerDefaultWorkerModelId:a.agentsByIdentityId?.[r.binding.agentIdentityId]?.managerConfig?.defaultWorkerModelId??null,workDir:b.workspacePath,agentSessionId:r.sourceSessionKey,queueMessageId:`room-activation-${r.binding.bindingId}-${o.id}`,clientMessageId:`room-activation-${r.binding.bindingId}-${o.id}`},context:{registryKey:r.registryKey,causeMessageId:o.id,rootCauseMessageId:h,sequence:o.sequence,hopCount:p}}}),r.binding.activationMode==="mention_only"&&u.set(r.registryKey,[])}}else r.binding.activationMode==="mention_only"&&o.kind!=="system"&&o.author.membershipId!==r.binding.agentMembershipId&&(I.some(p=>p.sequence===o.sequence)||I.push({sequence:o.sequence,deliveryText:w([o])}));g.push({registryKey:r.registryKey,sequence:o.sequence})}}await this.deps.enqueueConversationBatch(d.map(o=>o.input));for(const o of m)this.deps.registry.retireLegacyActivationState(o,this.deps.now?.()??new Date);for(const[o,s]of u)this.deps.registry.getByRegistryKey(o)?.lifecycleState!=="closed"&&this.deps.registry.replaceMentionContext(o,s,this.deps.now?.()??new Date);for(const o of d)this.audit(o.registration,o.input.context.causeMessageId,o.input.context.rootCauseMessageId,o.input.context.hopCount,"queued","conversation_queue");for(const o of g)this.deps.registry.getByRegistryKey(o.registryKey)?.lifecycleState!=="closed"&&this.deps.registry.advanceCursor({registryKey:o.registryKey,cursor:"activated",sequence:o.sequence})}async prepareConversationTurn(e){const i=e.at(-1);if(!i)throw new Error("managed_room_queue_context_missing");const t=this.deps.registry.getByRegistryKey(i.registryKey);if(!t)throw new Error("managed_room_binding_unavailable");const a=await this.prepareManagedTurn(t,i.causeMessageId);return this.audit(t,i.causeMessageId,i.rootCauseMessageId,i.hopCount,"activated","conversation_queue_dispatch"),a}async prepareDirectConversationTurn(e,i={}){const t=i.roomOrigin?this.deps.registry.getByRegistryKey(i.roomOrigin.registryKey):this.deps.registry.getByNianSessionId(e);return t?.nianSessionId!==e||!t||i.roomOrigin&&(t.registrationEpoch!==i.roomOrigin.registrationEpoch||t.binding?.bindingId!==i.roomOrigin.bindingId||t.binding.roomId!==i.roomOrigin.roomId)?null:this.prepareManagedTurn(t,void 0,i)}async prepareManagedTurn(e,i,t){if(!f(this.deps.registry,e)||!e.binding||e.binding.status!=="active")throw new Error("managed_room_binding_unavailable");const a=this.deps.loadContext?await this.deps.loadContext(e):this.latestContexts.get(e.registryKey);if(!a)throw new Error("managed_room_prompt_context_unavailable");const d=a.agentsByIdentityId?.[e.binding.agentIdentityId];if(d?.configurationPending)throw new Error("managed_agent_configuration_pending");if(!d?.permissionPolicy)throw new Error("managed_agent_policy_missing");const g=d.sessionMode==="manager"?"manager":"standard",u=g==="manager"?{...d.managerConfig,defaultWorkerAgentType:d.managerConfig?.defaultWorkerAgentType??l(e.runtimeAdapter),defaultWorkerModelId:d.managerConfig?.defaultWorkerModelId??null}:null,m=this.deps.observations.getBySource(e);if(!m?.workspacePath||m.lifecycleState==="closed")throw new Error("managed_room_workspace_unavailable");const c=this.deps.resolveManagedAgentPolicy?await this.deps.resolveManagedAgentPolicy({registration:e,permissionPolicy:d.permissionPolicy,permissionConfirmation:d.permissionConfirmation,workDir:m.workspacePath}):await U({registration:e,permissionPolicy:d.permissionPolicy,permissionConfirmation:d.permissionConfirmation,workDir:m.workspacePath});if(!f(this.deps.registry,e))throw new Error("managed_room_binding_unavailable");const o=H(a,e,c),s=this.deps.issueManagedRoomContext(e.registryKey,i,t?.allowedRoomActions);if(!/^mrc_[A-Za-z0-9_-]{43}$/.test(s))throw new Error("managed_room_context_unavailable");return{agentType:l(e.runtimeAdapter),workDir:c.adapterPolicy.workDir,agentSessionId:e.sourceSessionKey,systemPrompt:t?G({managerEvent:t.managerEvent===!0,roomSendAllowed:t.allowedRoomActions?.includes("send")===!0,agentSystemPrompt:a.agentSystemPromptsByIdentityId?.[e.binding.agentIdentityId],managedAgentPolicy:c,runtimeAdapter:l(e.runtimeAdapter)}):o.systemPrompt,sessionMode:g,managerConfig:u,managerDefaultWorkerAgentType:u?.defaultWorkerAgentType??null,managerDefaultWorkerModelId:u?.defaultWorkerModelId??null,roomContextRegistryKey:e.registryKey,managedRoomContextToken:s,managedAgentPolicy:c,managedRoomPromptSnapshot:o.snapshot}}audit(e,i,t,a,d,g){e.binding&&this.deps.audit?.record({roomId:e.binding.roomId,bindingId:e.binding.bindingId,causeMessageId:i,rootCauseMessageId:t,hopCount:a,outcome:d,reason:g,at:this.deps.now?.()})}}function w(n){const e=n.map(i=>{const t=i.text?.trim()||"\u53D1\u9001\u4E86\u4E00\u6761\u6D88\u606F",a=i.attachments.length>0?`
|
|
2
2
|
${i.attachments.map(L).join(`
|
|
3
|
-
`)}`:"";return{speaker:i.author.displayName,body:`${t}${
|
|
3
|
+
`)}`:"";return{speaker:i.author.displayName,body:`${t}${a}`}});return A(e)}function L(n){return`\u9644\u4EF6\uFF1A${`${j(n.name)} \xB7 ${z(n.byteSize)}`}\uFF5C${n.mimeType}\uFF5CattachmentId=${n.attachmentId}`}function j(n){return String(n||"\u9644\u4EF6").replace(/[[\]\\]/g,"\\$&").replace(/[\r\n]+/g," ")}function z(n){const e=Number(n);if(!Number.isFinite(e)||e<0)return`${n} B`;if(e<1024)return`${e} B`;const i=["KB","MB","GB","TB"];let t=e,a=-1;do t/=1024,a+=1;while(t>=1024&&a<i.length-1);const d=t>=100?0:t>=10?1:2;return`${t.toFixed(d).replace(/\.0+$|(?<=\.[0-9])0+$/,"")} ${i[a]}`}function Q(n){return A(n.map(X))}function X(n){const e=n.match(/^\[群消息\][ \t]+<([^>\n]+)>\n([\s\S]*)$/);if(e)return{speaker:e[1],body:e[2]};const i=n.match(/^\[群消息\]\n<([^>\n]+)>\n([\s\S]*)$/);if(i)return{speaker:i[1],body:i[2]};const t=n.match(/^群消息\n([^\n]+)\n([\s\S]*)$/);if(t)return{speaker:t[1],body:t[2]};const a=n.match(/^([^\n]+)\n([\s\S]*)$/);return a?{speaker:a[1],body:a[2]}:{speaker:"\u7FA4\u6210\u5458",body:n.trim()}}function A(n){if(n.length===1){const[e]=n;return`[\u7FA4\u6D88\u606F] <${e.speaker}>
|
|
4
4
|
${e.body}`}return`[\u7FA4\u6D88\u606F]
|
|
5
5
|
${n.map(e=>`<${e.speaker}>
|
|
6
6
|
${e.body}`).join(`
|
|
@@ -10,4 +10,4 @@ ${i}
|
|
|
10
10
|
\u4E0D\u5F97\u731C\u6D4B\u6216\u5C55\u793A Room\u3001Agent\u3001Session\u3001Binding\u3001Membership\u3001Machine \u6807\u8BC6\u6216\u4EFB\u4F55\u51ED\u636E\u3002`,e,t?`[\u667A\u80FD\u4F53\u79C1\u6709\u7CFB\u7EDF\u63D0\u793A\u8BCD]
|
|
11
11
|
${t}`:""].filter(Boolean).join(`
|
|
12
12
|
|
|
13
|
-
`)}function H(n,e,i){const t=e.binding?n.agentsByIdentityId?.[e.binding.agentIdentityId]:void 0;if(!e.binding||!t)throw new Error("managed_room_prompt_incomplete");return R({runtimeAdapter:
|
|
13
|
+
`)}function H(n,e,i){const t=e.binding?n.agentsByIdentityId?.[e.binding.agentIdentityId]:void 0;if(!e.binding||!t)throw new Error("managed_room_prompt_incomplete");return R({runtimeAdapter:l(e.runtimeAdapter),agent:{displayName:t.displayName,description:t.description,systemPrompt:n.agentSystemPromptsByIdentityId?.[e.binding.agentIdentityId],configurationVersion:t.configurationVersion},room:{name:n.roomName,activationMode:e.binding.activationMode,members:n.members},runtimePermissions:{requestedPolicy:i.requestedPolicy,enforcement:i.enforcement,resolvedWorkDir:i.adapterPolicy.workDir}})}async function U(n){const e=l(n.registration.runtimeAdapter),i=k(e)?B(e):null,t=e.startsWith("custom:")?x().customAgents?.[e.slice(7)]:void 0;t&&K(e,t);const a=n.runtime?.version??(i?S(e,i):t?.caps.version),d=n.runtime?{platform:n.runtime.runtimePlatform??process.platform,isWsl:n.runtime.runtimeIsWsl??!1,executableFingerprint:n.runtime.executableFingerprint}:i?W(i):{platform:process.platform,isWsl:process.platform==="linux"&&!!(process.env.WSL_DISTRO_NAME||process.env.WSL_INTEROP),executableFingerprint:t?$(t):void 0},g={agentType:e,runtimeVersion:a,platform:d.platform,isWsl:d.isWsl,executableFingerprint:d.executableFingerprint,requireExecutableFingerprint:!0},u=q(g),m=Z({confirmation:n.permissionConfirmation,policy:n.permissionPolicy,runtimeAdapter:e,protection:u}),c=await T({...g,policy:n.permissionPolicy,workDir:n.workDir,hostFullAccessConfirmed:m&&n.permissionConfirmation?.hostFullAccess,limitedProtectionConfirmed:m&&n.permissionConfirmation?.limitedProtection});if(!c.ok){const o=c.unsupportedCapabilities?.length?`:${c.unsupportedCapabilities.join(",")}`:"";throw new Error(`${c.errorCode}${o}`)}return c.value}function Z(n){const{confirmation:e,policy:i,runtimeAdapter:t}=n,a=P(i);return!!(e&&e.policyVersion===i.version&&e.runtimeAdapter===t&&(e.executionMode??"restricted")===a&&e.hostFullAccess===(a==="native-full"||i.fileAccess==="host-full"))}function l(n){return n==="claude_code"?"claude":n}function J(n,e){const i=BigInt(n),t=BigInt(e);return i<t?-1:i>t?1:0}export{ce as RoomActivationService,Z as managedAgentPermissionConfirmationMatches,U as resolveManagedAgentPolicy};
|
|
@@ -35,6 +35,8 @@ export type RoomSummary = {
|
|
|
35
35
|
humanCount: number;
|
|
36
36
|
agentCount: number;
|
|
37
37
|
lastSequence: RoomSequence;
|
|
38
|
+
/** First sequence still visible to this account. Older servers may omit it. */
|
|
39
|
+
historyFromSequence?: RoomSequence;
|
|
38
40
|
lastReadSequence?: RoomSequence;
|
|
39
41
|
unreadCount?: number;
|
|
40
42
|
membershipRole?: RoomMembershipRole;
|