shennian 0.4.49 → 0.4.50
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 +1 @@
|
|
|
1
|
-
import ie from"node:os";import{createHash as V,randomUUID as Ae}from"node:crypto";import{buildUserMessagePayload as de}from"@shennian/wire";import{reportLog as x}from"../../log-reporter.js";import{appendMessage as le,getDaemonInstallationId as L,getMessageDeliveryStatus as Me,recordSession as Pe,upsertMessage as k}from"../store.js";import{mergeProjectedSessions as De}from"../projection.js";import{parsePersonalAttachmentReferences as Ee}from"../attachment-reference.js";import{assertFinishedAttachmentReferences as xe,markAttachmentReferences as be}from"../attachment-transfer-store.js";import{requestSessionIndexPublish as R}from"../index-publisher.js";import{getPersonalSyncIdentity as ce}from"../../personal-sync/epoch.js";import{buildManagedAgentPermissionPrompt as Te}from"../../room/managed-prompt-composer.js";import{getNativeSourceAgentType as Ce}from"./chat-events.js";import{configureAdapterForSession as ge,maybeResolveClaudeImportedWorkDir as $e,replaceManagedRoomContextToken as ue,revokeManagedRoomContextToken as me}from"./chat-adapter-config.js";import{createActiveSession as qe,disposeSession as q,prepareAdapterTurn as We,rememberProcessedReqId as je,sendAdapterTurn as pe}from"./chat-session-lifecycle.js";function Fe(e,n,t){if(!e.managedAgentPolicy)throw new Error("managed_agent_policy_missing");const l=e.managedRoomPromptSnapshot;if(!l)throw new Error("managed_room_prompt_snapshot_missing");if(!n?.trim())throw new Error("managed_room_prompt_incomplete");if(!t||!/^mrc_[A-Za-z0-9_-]{43}$/.test(t))throw new Error("managed_room_context_unavailable");const a=V("sha256").update(JSON.stringify({requestedPolicy:e.managedAgentPolicy.requestedPolicy,enforcement:e.managedAgentPolicy.enforcement})).digest("hex"),b=V("sha256").update(e.managedAgentPolicy.adapterPolicy.workDir).digest("hex");if(l.runtimePermissionPolicyHash!==a||l.resolvedWorkDirHash!==b||l.enforcementLevel!==e.managedAgentPolicy.enforcement.level)throw new Error("managed_room_prompt_snapshot_mismatch")}function fe(e,n){return`Agent send failed: ${n instanceof Error?n.message:String(n)}`}function Je(e,n){Pe({sessionId:n.sessionId,agentType:n.agentType,sessionMode:n.sessionMode,managerConfig:n.managerConfig,workDir:n.workDir,agentSessionId:n.agentSessionId??null,modelId:n.modelId??null,managerDefaultWorkerAgentType:n.managerDefaultWorkerAgentType,managerDefaultWorkerModelId:n.managerDefaultWorkerModelId}),e.client.sendEvent({type:"event",event:"session.update",payload:{session:{id:n.sessionId,agentType:n.agentType,sessionMode:n.sessionMode,managerConfig:n.managerConfig,agentSessionId:n.agentSessionId??null,modelId:n.modelId??null,workDir:n.workDir,status:"active",externalChannel:null}}})}function Be(e,n){const t=e.sessions.get(n),l=t?.currentRunId;if(!t||!l)return;const a=t.nextEventSeq;e.runTextAcc.delete(`${n}:${l}`),me(e,t),t.pendingTextEvent=null,t.currentRunId=null,t.currentRunPhase=null,t.nextEventSeq=0,t.heartbeatTimer&&(clearInterval(t.heartbeatTimer),t.heartbeatTimer=null),e.client.sendAgentEvent({type:"event",event:"agent",payload:{state:"aborted",sessionId:n,runId:l,seq:a},seq:a,id:`agent-evt-${l}-${a}`}),t.journalRunId&&(e.runJournal?.remove(n,t.journalRunId),e.recoveryBarrier?.end(n),t.journalRunId=null),e.chatQueue?.noteTerminal(n)}async function on(e,n,t){const l=t?n.params.managedRoomContextToken??null:null;let a=!1;try{await He(e,n,t,()=>{a=!0})}finally{l&&!a&&e.revokeManagedRoomContextToken?.(l)}}async function He(e,n,t,l){if(e.processedReqIds.has(n.id)){e.client.sendRes({type:"res",id:n.id,ok:!0});return}const{sessionId:a,text:b,agentType:_,sessionMode:ye,managerConfig:Q,workDir:ve,agentSessionId:u,modelId:v,systemPrompt:Z,managerDefaultWorkerAgentType:W,managerDefaultWorkerModelId:j,reasoningEffort:F,clientMessageId:he,sessionListProjection:Ie,waitForDispatch:G,responseId:Re,managedRoomContextToken:A,suppressExternalOwnerEcho:Se,queuedBatchItems:J,managedWorkerParentSessionId:h,managerWorkerNativeFull:X,managedRecoverySource:T}=n.params,c=Re||n.id;De(Ie);const C=null,B="";if(t?.source==="room_activation"&&(Fe(t,Z,A),_==="manager"))throw new Error("managed_agent_manager_mode_unsupported");if(je(e,n.id),!a||!b){e.processedReqIds.delete(n.id),e.client.sendRes({type:"res",id:c,ok:!1,error:"sessionId and text are required"});return}if(e.recoveryBarrier?.isDispatchFrozen()){e.processedReqIds.delete(n.id),e.client.sendRes({type:"res",id:c,ok:!1,error:"upgrade_in_progress"});return}e.recoveryBarrier?.isRecovering(a)&&await e.recoveryBarrier.wait(a);const i=_,S=i==="manager"||ye==="manager"?"manager":"standard";S==="manager"&&e.managerRuntime?.setManagerWorkerDefaults(a,W??null,j??null);const M=(i==="claude"||i==="codex"||i==="workbuddy"||i==="pi-coding-agent"||i.startsWith("acp:"))&&typeof F=="string"&&F.trim()?F.trim():void 0,p=e.resolvePath($e(i,ve||ie.homedir(),u)||ie.homedir()),f=t?.managedAgentPolicy??(h?e.managerRuntime?.getManagedAgentPolicyForWorker(h,p)??null:null);if(h&&!X&&!f)throw new Error("managed_worker_permission_context_unavailable");const H=i==="codex"&&(t?.source==="room_activation"||h)?"internal":"user",z=h&&f?Te({requestedPolicy:f.requestedPolicy,enforcement:f.enforcement,resolvedWorkDir:f.adapterPolicy.workDir}):Z,we=p,$=Ee(n.params.attachments);$?.length&&xe(p,$);const m={text:b,attachments:$,localized:!1};let s=e.sessions.get(a);if(s){if(s.lastActiveAt=Date.now(),s.agentType!==i||(s.sessionMode??(s.agentType==="manager"?"manager":"standard"))!==S||s.workDir!==p||(s.nativeSessionVisibility??"user")!==H||JSON.stringify(s.externalChannel??null)!==JSON.stringify(C??null)){e.sessions.delete(a);try{await q(e,s)}catch{e.processedReqIds.delete(n.id)}s=void 0}else if(u&&s.agentSessionId!==u)try{await s.adapter.resume(u),s.agentSessionId=u}catch{e.sessions.delete(a);try{await q(e,s)}catch{e.processedReqIds.delete(n.id)}s=void 0}}if(!s)try{s=await qe(e,a,i,S,p,u,C,B,f,H)}catch(o){const d=o instanceof Error&&o.message.startsWith("Unsupported agent:")?o.message:`Failed to start ${_}: ${o instanceof Error?o.message:String(o)}`;console.error(`[chat.send] start failed reqId=${n.id} sessionId=${a} agentType=${_} workDir=${p} agentSessionId=${u??""}: ${d}`),e.client.sendEvent({type:"event",event:"agent",payload:{state:"error",sessionId:a,message:d,runId:"",seq:0}}),e.processedReqIds.delete(n.id),e.client.sendRes({type:"res",id:c,ok:!1,error:d});return}const g={id:he??`user-${n.id}`,sessionId:a,role:"user",ts:Date.now(),payload:de(m.text,m.attachments)},Y=Array.isArray(J)&&J.length>0?J.map(o=>({id:o.clientMessageId??o.id,sessionId:a,role:T==="manager_event"?"agent":"user",ts:T==="manager_event"?Date.parse(o.createdAt):g.ts,payload:de(o.text,o.attachments)})):null,P=Y??[g],y=Me(a,g.id),ee=y.state==="queued";if(y.state!=="not_found"&&!ee){e.client.sendRes({type:"res",id:c,ok:!0,payload:y});return}if(G){t?.source==="room_activation"&&ge(s.adapter,a,i,C,B,A,t.managedAgentPolicy,e.managedRoomExecutor);try{await We(s.adapter,m.text,v,M,m.attachments,z,t?{source:t.source}:void 0)}catch(o){e.processedReqIds.delete(n.id),e.sessions.delete(a),await q(e,s),e.client.sendRes({type:"res",id:c,ok:!1,error:o instanceof Error?o.message:String(o)});return}}x({level:"info",sessionId:a,wsEvent:"chat.send.start",metadata:{reqId:n.id,agentType:i,sessionMode:S,managerConfig:Q??null,modelId:v,managerDefaultWorkerAgentType:W??null,managerDefaultWorkerModelId:j??null,reasoningEffort:M,...t?.source==="room_activation"?{managedRoomPromptSnapshot:t.managedRoomPromptSnapshot}:{}}});const D=(o,d)=>({...ce(L()),sessionId:a,clientMessageId:g.id,messageId:g.id,deliveryState:o,bodyRevision:d,committedAt:new Date(g.ts).toISOString()}),N=o=>{e.nativeFusion?.registerManagedSend({sessionId:a,agentType:i,sourceAgentType:Ce(i,v),canonicalMessageId:g.id,sourceSessionKey:s.agentSessionId??u??null,text:m.text,managedEchoPolicy:o?.deliveryMode==="external_owner_queue"&&!Se?"import_following":"suppress_following",externalRunId:o?.deliveryMode==="external_owner_queue"?`codex-external-${o.queuedSubmissionId??g.id}`:null})},ne=()=>{s.currentRunId||(s.currentRunId=`dispatch:${n.id}`,s.currentRunPhase="thinking",s.nextEventSeq=0)},ae=()=>{if(!e.runJournal||s.journalRunId)return;const o=`run:${Ae()}`;e.runJournal.begin({daemonInstallationId:L(),sessionId:a,runId:o,clientMessageId:g.id,agentType:i,sessionMode:S,workDir:p,agentSessionId:s.agentSessionId??u??null,modelId:v??null,reasoningEffort:M??null,nativeSessionVisibility:H,providerRunId:null,source:T==="manager_event"?"manager_event":t?.source==="room_activation"?T==="managed_direct"?"managed_direct":"managed_room":h?"manager_worker":"personal",parentSessionId:h??null,managerWorkerNativeFull:X===!0,roomContextRegistryKey:typeof n.params.roomContextRegistryKey=="string"?n.params.roomContextRegistryKey:null,activationCauseMessageId:typeof n.params.activationCauseMessageId=="string"?n.params.activationCauseMessageId:null,rootCauseMessageId:typeof n.params.rootCauseMessageId=="string"?n.params.rootCauseMessageId:null,activationSequence:typeof n.params.activationSequence=="string"?n.params.activationSequence:null,activationHopCount:typeof n.params.activationHopCount=="number"?n.params.activationHopCount:null,managedPolicyVersion:t?.managedRoomPromptSnapshot.managedRoomPolicyVersion??null,managedRuntimePolicyHash:t?.managedRoomPromptSnapshot.runtimePermissionPolicyHash??(f?V("sha256").update(JSON.stringify({requestedPolicy:f.requestedPolicy,enforcement:f.enforcement})).digest("hex"):null)}),s.journalRunId=o},oe=()=>{if(N(),ee)return{...ce(L()),sessionId:a,clientMessageId:y.clientMessageId,messageId:y.messageId,deliveryState:y.deliveryState,bodyRevision:y.bodyRevision,committedAt:y.committedAt};try{Je(e,{sessionId:a,agentType:i,sessionMode:S,managerConfig:Q??null,workDir:we,agentSessionId:s.agentSessionId??u??null,modelId:v,managerDefaultWorkerAgentType:W??null,managerDefaultWorkerModelId:j??null});let o=0;for(const[d,r]of P.entries()){const I=Y?k(a,r,"committed"):le(a,r,"committed");d===0&&(o=I)}return be(p,$??[]),R(e.client),D("committed",o)}catch(o){throw e.nativeFusion?.cancelManagedSend?.(g.id),o}},te=o=>{s.journalRunId&&e.runJournal?.update(a,s.journalRunId,{deliveryMode:o?.deliveryMode==="external_owner_queue"?"external_owner_queue":"direct",externalRunId:o?.deliveryMode==="external_owner_queue"?`codex-external-${o.queuedSubmissionId??g.id}`:null})},se=o=>{s.currentRunId||(s.nextEventSeq=0),te(o),N(o);const d=o?.deliveryMode==="external_owner_queue"?"queued":"executing";let r=0;for(const[I,E]of P.entries()){const w=k(a,E,d);I===0&&(r=w)}return R(e.client),D(d,r)},U=async(o,d)=>{e.nativeFusion?.cancelManagedSend?.(g.id);const r=fe(i,o);if(console.error(`[chat.send] send failed reqId=${n.id} sessionId=${a} agentType=${_} workDir=${p} agentSessionId=${s.agentSessionId??u??""}: ${r}`),s.adapter.hasPendingAuthenticationRetry?.()===!0){d&&e.client.sendRes({type:"res",id:c,ok:!0,payload:D("queued",0)});return}e.sessions.delete(a),s.journalRunId&&(e.runJournal?.update(a,s.journalRunId,{phase:"terminal"}),e.runJournal?.remove(a,s.journalRunId),e.recoveryBarrier?.end(a),s.journalRunId=null);try{await q(e,s)}catch{}if(e.client.sendEvent({type:"event",event:"agent",payload:{state:"error",sessionId:a,message:r,runId:"",seq:0}}),!d){const E={id:`agent-error-${n.id}-${Date.now()}`,sessionId:a,role:"agent",ts:Date.now(),payload:r};le(a,E),R(e.client)}d&&(e.processedReqIds.delete(n.id),e.client.sendRes({type:"res",id:c,ok:!1,error:r}))};if(G){try{oe()}catch(r){e.processedReqIds.delete(n.id),e.client.sendRes({type:"res",id:c,ok:!1,error:`Durable message commit failed: ${r instanceof Error?r.message:String(r)}`});return}ae(),ne();let o;try{t?.source==="room_activation"&&(ue(e,s,A),l());const r=m.attachments;o=await pe(s.adapter,m.text,v,M,r,z,t?{source:t.source}:void 0),x({level:"info",sessionId:a,wsEvent:"chat.send.done",metadata:{reqId:n.id}})}catch(r){if(s.adapter.hasPendingAuthenticationRetry?.()){let w=0;for(const[O,K]of P.entries()){const _e=k(a,K,"queued");O===0&&(w=_e)}R(e.client),await U(r,!1),e.client.sendRes({type:"res",id:c,ok:!0,payload:D("queued",w)});return}let I=0;for(const[w,O]of P.entries()){const K=k(a,O,"failed");w===0&&(I=K)}R(e.client);const E=fe(i,r);await U(r,!1),e.client.sendRes({type:"res",id:c,ok:!0,payload:{...D("failed",I),failureMessage:E}});return}const d=se(o??void 0);e.client.sendRes({type:"res",id:c,ok:!0,payload:{...d,...m.localized?{localizedAttachments:!0}:{},...o?.deliveryMode==="external_owner_queue"?{queued:!0,deliveryMode:o.deliveryMode,queuedSubmissionId:o.queuedSubmissionId}:{}}}),x({level:"info",sessionId:a,wsEvent:"chat.send.res",metadata:{reqId:n.id,ok:!0}});return}let re;try{re=oe()}catch(o){e.processedReqIds.delete(n.id),e.client.sendRes({type:"res",id:c,ok:!1,error:`Durable message commit failed: ${o instanceof Error?o.message:String(o)}`});return}ae(),ne(),t?.source==="room_activation"&&(ge(s.adapter,a,i,C,B,A,t.managedAgentPolicy,e.managedRoomExecutor),ue(e,s,A),l()),se(),e.client.sendRes({type:"res",id:c,ok:!0,payload:{...re,...m.localized?{localizedAttachments:!0}:{}}}),x({level:"info",sessionId:a,wsEvent:"chat.send.res",metadata:{reqId:n.id,ok:!0}});const ke=m.attachments;pe(s.adapter,m.text,v,M,ke,z,t?{source:t.source}:void 0).then(o=>{if(o?.deliveryMode==="external_owner_queue"){te(o),N(o);for(const d of P)k(a,d,"queued");R(e.client)}x({level:"info",sessionId:a,wsEvent:"chat.send.done",metadata:{reqId:n.id}})}).catch(o=>{k(a,g,s.adapter.hasPendingAuthenticationRetry?.()?"queued":"failed"),R(e.client),U(o,!1)})}async function tn(e,n){const{sessionId:t,discardPending:l}=n.params,a=e.sessions.get(t);if(a){a.journalRunId&&e.runJournal?.markAborted(t,a.journalRunId),me(e,a);try{await a.adapter.stop()}catch{e.client.sendRes({type:"res",id:n.id,ok:!1,error:"agent_stop_failed"});return}Be(e,t),e.activityPublisher?.publish(t,null)}l===!0&&e.chatQueue?.purgeSession(t),e.client.sendRes({type:"res",id:n.id,ok:!0})}export{tn as handleChatAbort,on as handleChatSend,Je as sendSessionUpdateEvent,Fe as validateManagedRoomExecutionContext};
|
|
1
|
+
import se from"node:os";import{createHash as V,randomUUID as _e}from"node:crypto";import{buildUserMessagePayload as ie}from"@shennian/wire";import{reportLog as E}from"../../log-reporter.js";import{appendMessage as de,getDaemonInstallationId as le,getMessageDeliveryStatus as Ae,recordSession as Me,upsertMessage as I}from"../store.js";import{mergeProjectedSessions as Pe}from"../projection.js";import{parsePersonalAttachmentReferences as De}from"../attachment-reference.js";import{assertFinishedAttachmentReferences as Ee,markAttachmentReferences as xe}from"../attachment-transfer-store.js";import{requestSessionIndexPublish as R}from"../index-publisher.js";import{getPersonalSyncIdentity as be}from"../../personal-sync/epoch.js";import{buildManagedAgentPermissionPrompt as Te}from"../../room/managed-prompt-composer.js";import{getNativeSourceAgentType as Ce}from"./chat-events.js";import{configureAdapterForSession as ce,maybeResolveClaudeImportedWorkDir as $e,replaceManagedRoomContextToken as ge,revokeManagedRoomContextToken as ue}from"./chat-adapter-config.js";import{createActiveSession as qe,disposeSession as $,prepareAdapterTurn as We,rememberProcessedReqId as je,sendAdapterTurn as me}from"./chat-session-lifecycle.js";function Fe(e,n,t){if(!e.managedAgentPolicy)throw new Error("managed_agent_policy_missing");const l=e.managedRoomPromptSnapshot;if(!l)throw new Error("managed_room_prompt_snapshot_missing");if(!n?.trim())throw new Error("managed_room_prompt_incomplete");if(!t||!/^mrc_[A-Za-z0-9_-]{43}$/.test(t))throw new Error("managed_room_context_unavailable");const o=V("sha256").update(JSON.stringify({requestedPolicy:e.managedAgentPolicy.requestedPolicy,enforcement:e.managedAgentPolicy.enforcement})).digest("hex"),x=V("sha256").update(e.managedAgentPolicy.adapterPolicy.workDir).digest("hex");if(l.runtimePermissionPolicyHash!==o||l.resolvedWorkDirHash!==x||l.enforcementLevel!==e.managedAgentPolicy.enforcement.level)throw new Error("managed_room_prompt_snapshot_mismatch")}function pe(e,n){return`Agent send failed: ${n instanceof Error?n.message:String(n)}`}function Be(e,n){Me({sessionId:n.sessionId,agentType:n.agentType,sessionMode:n.sessionMode,managerConfig:n.managerConfig,workDir:n.workDir,agentSessionId:n.agentSessionId??null,modelId:n.modelId??null,managerDefaultWorkerAgentType:n.managerDefaultWorkerAgentType,managerDefaultWorkerModelId:n.managerDefaultWorkerModelId}),e.client.sendEvent({type:"event",event:"session.update",payload:{session:{id:n.sessionId,agentType:n.agentType,sessionMode:n.sessionMode,managerConfig:n.managerConfig,agentSessionId:n.agentSessionId??null,modelId:n.modelId??null,workDir:n.workDir,status:"active",externalChannel:null}}})}function Je(e,n){const t=e.sessions.get(n),l=t?.currentRunId;if(!t||!l)return;const o=t.nextEventSeq;e.runTextAcc.delete(`${n}:${l}`),ue(e,t),t.pendingTextEvent=null,t.currentRunId=null,t.currentRunPhase=null,t.nextEventSeq=0,t.heartbeatTimer&&(clearInterval(t.heartbeatTimer),t.heartbeatTimer=null),e.client.sendAgentEvent({type:"event",event:"agent",payload:{state:"aborted",sessionId:n,runId:l,seq:o},seq:o,id:`agent-evt-${l}-${o}`}),t.journalRunId&&(e.runJournal?.remove(n,t.journalRunId),e.recoveryBarrier?.end(n),t.journalRunId=null),e.chatQueue?.noteTerminal(n)}async function on(e,n,t){const l=t?n.params.managedRoomContextToken??null:null;let o=!1;try{await He(e,n,t,()=>{o=!0})}finally{l&&!o&&e.revokeManagedRoomContextToken?.(l)}}async function He(e,n,t,l){if(e.processedReqIds.has(n.id)){e.client.sendRes({type:"res",id:n.id,ok:!0});return}const{sessionId:o,text:x,agentType:A,sessionMode:fe,managerConfig:L,workDir:ye,agentSessionId:u,modelId:v,systemPrompt:Q,managerDefaultWorkerAgentType:q,managerDefaultWorkerModelId:W,reasoningEffort:j,clientMessageId:ve,sessionListProjection:he,waitForDispatch:Z,responseId:Ie,managedRoomContextToken:M,suppressExternalOwnerEcho:Re,queuedBatchItems:F,managedWorkerParentSessionId:h,managerWorkerNativeFull:G,managedRecoverySource:b}=n.params,c=Ie||n.id;Pe(he);const T=null,B="";if(t?.source==="room_activation"&&(Fe(t,Q,M),A==="manager"))throw new Error("managed_agent_manager_mode_unsupported");if(je(e,n.id),!o||!x){e.processedReqIds.delete(n.id),e.client.sendRes({type:"res",id:c,ok:!1,error:"sessionId and text are required"});return}if(e.recoveryBarrier?.isDispatchFrozen()){e.processedReqIds.delete(n.id),e.client.sendRes({type:"res",id:c,ok:!1,error:"upgrade_in_progress"});return}e.recoveryBarrier?.isRecovering(o)&&await e.recoveryBarrier.wait(o);const d=A,S=d==="manager"||fe==="manager"?"manager":"standard";S==="manager"&&e.managerRuntime?.setManagerWorkerDefaults(o,q??null,W??null);const P=(d==="claude"||d==="codex"||d==="workbuddy"||d==="pi-coding-agent"||d.startsWith("acp:"))&&typeof j=="string"&&j.trim()?j.trim():void 0,p=e.resolvePath($e(d,ye||se.homedir(),u)||se.homedir()),f=t?.managedAgentPolicy??(h?e.managerRuntime?.getManagedAgentPolicyForWorker(h,p)??null:null);if(h&&!G&&!f)throw new Error("managed_worker_permission_context_unavailable");const J=d==="codex"&&(t?.source==="room_activation"||h)?"internal":"user",H=h&&f?Te({requestedPolicy:f.requestedPolicy,enforcement:f.enforcement,resolvedWorkDir:f.adapterPolicy.workDir}):Q,Se=p,C=De(n.params.attachments);C?.length&&Ee(p,C);const m={text:x,attachments:C,localized:!1};let r=e.sessions.get(o);if(r){if(r.lastActiveAt=Date.now(),r.agentType!==d||(r.sessionMode??(r.agentType==="manager"?"manager":"standard"))!==S||r.workDir!==p||(r.nativeSessionVisibility??"user")!==J||JSON.stringify(r.externalChannel??null)!==JSON.stringify(T??null)){e.sessions.delete(o);try{await $(e,r)}catch{e.processedReqIds.delete(n.id)}r=void 0}else if(u&&r.agentSessionId!==u)try{await r.adapter.resume(u),r.agentSessionId=u}catch{e.sessions.delete(o);try{await $(e,r)}catch{e.processedReqIds.delete(n.id)}r=void 0}}if(!r)try{r=await qe(e,o,d,S,p,u,T,B,f,J)}catch(a){const i=a instanceof Error&&a.message.startsWith("Unsupported agent:")?a.message:`Failed to start ${A}: ${a instanceof Error?a.message:String(a)}`;console.error(`[chat.send] start failed reqId=${n.id} sessionId=${o} agentType=${A} workDir=${p} agentSessionId=${u??""}: ${i}`),e.client.sendEvent({type:"event",event:"agent",payload:{state:"error",sessionId:o,message:i,runId:"",seq:0}}),e.processedReqIds.delete(n.id),e.client.sendRes({type:"res",id:c,ok:!1,error:i});return}const g={id:ve??`user-${n.id}`,sessionId:o,role:"user",ts:Date.now(),payload:ie(m.text,m.attachments)},X=Array.isArray(F)&&F.length>0?F.map(a=>({id:a.clientMessageId??a.id,sessionId:o,role:b==="manager_event"?"agent":"user",ts:b==="manager_event"?Date.parse(a.createdAt):g.ts,payload:ie(a.text,a.attachments)})):null,w=X??[g],z=Ae(o,g.id),Y=z.state==="queued";if(z.state!=="not_found"&&!Y){e.client.sendRes({type:"res",id:c,ok:!0,payload:z});return}if(Z){t?.source==="room_activation"&&ce(r.adapter,o,d,T,B,M,t.managedAgentPolicy,e.managedRoomExecutor);try{await We(r.adapter,m.text,v,P,m.attachments,H,t?{source:t.source}:void 0)}catch(a){e.processedReqIds.delete(n.id),e.sessions.delete(o),await $(e,r),e.client.sendRes({type:"res",id:c,ok:!1,error:a instanceof Error?a.message:String(a)});return}}E({level:"info",sessionId:o,wsEvent:"chat.send.start",metadata:{reqId:n.id,agentType:d,sessionMode:S,managerConfig:L??null,modelId:v,managerDefaultWorkerAgentType:q??null,managerDefaultWorkerModelId:W??null,reasoningEffort:P,...t?.source==="room_activation"?{managedRoomPromptSnapshot:t.managedRoomPromptSnapshot}:{}}});const k=(a,i)=>({...be(le()),sessionId:o,clientMessageId:g.id,messageId:g.id,deliveryState:a,bodyRevision:i,committedAt:new Date(g.ts).toISOString()}),N=a=>{e.nativeFusion?.registerManagedSend({sessionId:o,agentType:d,sourceAgentType:Ce(d,v),canonicalMessageId:g.id,sourceSessionKey:r.agentSessionId??u??null,text:m.text,managedEchoPolicy:a?.deliveryMode==="external_owner_queue"&&!Re?"import_following":"suppress_following",externalRunId:a?.deliveryMode==="external_owner_queue"?`codex-external-${a.queuedSubmissionId??g.id}`:null})},ee=()=>{r.currentRunId||(r.currentRunId=`dispatch:${n.id}`,r.currentRunPhase="thinking",r.nextEventSeq=0)},ne=()=>{if(!e.runJournal||r.journalRunId)return;const a=`run:${_e()}`;e.runJournal.begin({daemonInstallationId:le(),sessionId:o,runId:a,clientMessageId:g.id,agentType:d,sessionMode:S,workDir:p,agentSessionId:r.agentSessionId??u??null,modelId:v??null,reasoningEffort:P??null,nativeSessionVisibility:J,providerRunId:null,source:b==="manager_event"?"manager_event":t?.source==="room_activation"?b==="managed_direct"?"managed_direct":"managed_room":h?"manager_worker":"personal",parentSessionId:h??null,managerWorkerNativeFull:G===!0,roomContextRegistryKey:typeof n.params.roomContextRegistryKey=="string"?n.params.roomContextRegistryKey:null,activationCauseMessageId:typeof n.params.activationCauseMessageId=="string"?n.params.activationCauseMessageId:null,rootCauseMessageId:typeof n.params.rootCauseMessageId=="string"?n.params.rootCauseMessageId:null,activationSequence:typeof n.params.activationSequence=="string"?n.params.activationSequence:null,activationHopCount:typeof n.params.activationHopCount=="number"?n.params.activationHopCount:null,managedPolicyVersion:t?.managedRoomPromptSnapshot.managedRoomPolicyVersion??null,managedRuntimePolicyHash:t?.managedRoomPromptSnapshot.runtimePermissionPolicyHash??(f?V("sha256").update(JSON.stringify({requestedPolicy:f.requestedPolicy,enforcement:f.enforcement})).digest("hex"):null)}),r.journalRunId=a},ae=()=>{if(N(),Y){let a=0;for(const[i,s]of w.entries()){const y=I(o,s,"queued");i===0&&(a=y)}return k("queued",a)}try{Be(e,{sessionId:o,agentType:d,sessionMode:S,managerConfig:L??null,workDir:Se,agentSessionId:r.agentSessionId??u??null,modelId:v,managerDefaultWorkerAgentType:q??null,managerDefaultWorkerModelId:W??null});let a=0;for(const[i,s]of w.entries()){const y=X?I(o,s,"committed"):de(o,s,"committed");i===0&&(a=y)}return xe(p,C??[]),R(e.client),k("committed",a)}catch(a){throw e.nativeFusion?.cancelManagedSend?.(g.id),a}},oe=a=>{r.journalRunId&&e.runJournal?.update(o,r.journalRunId,{deliveryMode:a?.deliveryMode==="external_owner_queue"?"external_owner_queue":"direct",externalRunId:a?.deliveryMode==="external_owner_queue"?`codex-external-${a.queuedSubmissionId??g.id}`:null})},te=a=>{r.currentRunId||(r.nextEventSeq=0),oe(a),N(a);const i=a?.deliveryMode==="external_owner_queue"?"queued":"executing";let s=0;for(const[y,D]of w.entries()){const _=I(o,D,i);y===0&&(s=_)}return R(e.client),k(i,s)},U=async(a,i)=>{e.nativeFusion?.cancelManagedSend?.(g.id);const s=pe(d,a);if(console.error(`[chat.send] send failed reqId=${n.id} sessionId=${o} agentType=${A} workDir=${p} agentSessionId=${r.agentSessionId??u??""}: ${s}`),r.adapter.hasPendingAuthenticationRetry?.()===!0){i&&e.client.sendRes({type:"res",id:c,ok:!0,payload:k("queued",0)});return}e.sessions.delete(o),r.journalRunId&&(e.runJournal?.update(o,r.journalRunId,{phase:"terminal"}),e.runJournal?.remove(o,r.journalRunId),e.recoveryBarrier?.end(o),r.journalRunId=null);try{await $(e,r)}catch{}if(e.client.sendEvent({type:"event",event:"agent",payload:{state:"error",sessionId:o,message:s,runId:"",seq:0}}),!i){const D={id:`agent-error-${n.id}-${Date.now()}`,sessionId:o,role:"agent",ts:Date.now(),payload:s};de(o,D),R(e.client)}i&&(e.processedReqIds.delete(n.id),e.client.sendRes({type:"res",id:c,ok:!1,error:s}))};if(Z){try{ae()}catch(s){e.processedReqIds.delete(n.id),e.client.sendRes({type:"res",id:c,ok:!1,error:`Durable message commit failed: ${s instanceof Error?s.message:String(s)}`});return}ne(),ee();let a;try{t?.source==="room_activation"&&(ge(e,r,M),l());const s=m.attachments;a=await me(r.adapter,m.text,v,P,s,H,t?{source:t.source}:void 0),E({level:"info",sessionId:o,wsEvent:"chat.send.done",metadata:{reqId:n.id}})}catch(s){if(r.adapter.hasPendingAuthenticationRetry?.()){let _=0;for(const[O,K]of w.entries()){const ke=I(o,K,"queued");O===0&&(_=ke)}R(e.client),await U(s,!1),e.client.sendRes({type:"res",id:c,ok:!0,payload:k("queued",_)});return}let y=0;for(const[_,O]of w.entries()){const K=I(o,O,"failed");_===0&&(y=K)}R(e.client);const D=pe(d,s);await U(s,!1),e.client.sendRes({type:"res",id:c,ok:!0,payload:{...k("failed",y),failureMessage:D}});return}const i=te(a??void 0);e.client.sendRes({type:"res",id:c,ok:!0,payload:{...i,...m.localized?{localizedAttachments:!0}:{},...a?.deliveryMode==="external_owner_queue"?{queued:!0,deliveryMode:a.deliveryMode,queuedSubmissionId:a.queuedSubmissionId}:{}}}),E({level:"info",sessionId:o,wsEvent:"chat.send.res",metadata:{reqId:n.id,ok:!0}});return}let re;try{re=ae()}catch(a){e.processedReqIds.delete(n.id),e.client.sendRes({type:"res",id:c,ok:!1,error:`Durable message commit failed: ${a instanceof Error?a.message:String(a)}`});return}ne(),ee(),t?.source==="room_activation"&&(ce(r.adapter,o,d,T,B,M,t.managedAgentPolicy,e.managedRoomExecutor),ge(e,r,M),l()),te(),e.client.sendRes({type:"res",id:c,ok:!0,payload:{...re,...m.localized?{localizedAttachments:!0}:{}}}),E({level:"info",sessionId:o,wsEvent:"chat.send.res",metadata:{reqId:n.id,ok:!0}});const we=m.attachments;me(r.adapter,m.text,v,P,we,H,t?{source:t.source}:void 0).then(a=>{if(a?.deliveryMode==="external_owner_queue"){oe(a),N(a);for(const i of w)I(o,i,"queued");R(e.client)}E({level:"info",sessionId:o,wsEvent:"chat.send.done",metadata:{reqId:n.id}})}).catch(a=>{I(o,g,r.adapter.hasPendingAuthenticationRetry?.()?"queued":"failed"),R(e.client),U(a,!1)})}async function tn(e,n){const{sessionId:t,discardPending:l}=n.params,o=e.sessions.get(t);if(o){o.journalRunId&&e.runJournal?.markAborted(t,o.journalRunId),ue(e,o);try{await o.adapter.stop()}catch{e.client.sendRes({type:"res",id:n.id,ok:!1,error:"agent_stop_failed"});return}Je(e,t),e.activityPublisher?.publish(t,null)}l===!0&&e.chatQueue?.purgeSession(t),e.client.sendRes({type:"res",id:n.id,ok:!0})}export{tn as handleChatAbort,on as handleChatSend,Be as sendSessionUpdateEvent,Fe as validateManagedRoomExecutionContext};
|