@roll-agent/runtime 0.18.0 → 0.18.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.
|
@@ -1 +1 @@
|
|
|
1
|
-
import{randomUUID as e}from"node:crypto";import{RUNTIME_SERVER_REQUEST_CANCEL_NOTIFICATION as t,RUNTIME_SERVER_REQUEST_METHODS as i,approvalRequestParamsV12Schema as r,getRuntimeProtocolCapabilities as n,getRuntimeProtocolRegistry as s,interactionIdSchema as o,isRuntimeServerRequestMethodAvailable as d,pendingInteractionProjectionSchema as a,projectRuntimeServerRequestCancelParams as c,timestampSchema as p,userInputRequestParamsV12Schema as l}from"@roll-agent/protocol";import{RuntimeClientInteractionLifecycle as h}from"./runtime-client-interaction-lifecycle.js";const u=2147483647,m="Runtime 请求已取消";export function createRuntimeClientResponderId(){return`runtime-client:${e()}`}const R=new WeakMap;export class RuntimeClientRequestError extends Error{constructor(e){super(e),this.name="RuntimeClientRequestError"}}export class RuntimeClientRequestCancelledError extends RuntimeClientRequestError{reason;constructor(e){super(e),this.name="RuntimeClientRequestCancelledError",this.reason=e}}export class RuntimeClientRequestExpiredError extends RuntimeClientRequestError{expiresAt;constructor(e){super(`Runtime 请求已于 ${e} 到期`),this.name="RuntimeClientRequestExpiredError",this.expiresAt=e}}export class RuntimeClientRequestCoordinator{now;onDiagnostic;responders=new Map;responderAttachments=new WeakMap;interactions=new h;constructor(e={}){this.now=e.now??Date.now,this.onDiagnostic=e.onDiagnostic,R.set(this,{handleResponseForAttachment:(e,t)=>{const i=this.responderAttachments.get(e);return void 0===i?void 0:this.handleResponseFromAttachment(i,t)},setServerRequestMethodsForAttachment:(e,t,i)=>{const r=this.responderAttachments.get(e);return void 0===r?void 0:this.setServerRequestMethodsForAttachment(r,t,i)},setServerRequestMethodsForResponder:(e,t,i)=>{const r=this.responders.get(e);return void 0!==r&&this.setServerRequestMethodsForAttachment(r,t,i)},beginCapabilityNegotiationForAttachment:e=>{const t=this.responderAttachments.get(e);return void 0===t?void 0:this.beginCapabilityNegotiationForAttachment(t)},getPendingInteractionProjectionsForAttachment:(e,t)=>{const i=this.responderAttachments.get(e);return void 0===i?void 0:this.getPendingInteractionProjectionsForAttachment(i,t)},redeliver:(e,t)=>this.redeliver(e,t)})}attachResponder(e,t={}){if(this.responders.has(e.id))throw new RuntimeClientRequestError(`Runtime responder "${e.id}" 已连接`);const i={responder:e,acceptedServerRequestMethods:new Set(t.acceptedServerRequestMethods??s("1.1").serverRequestMethods),capabilitiesAcknowledged:t.capabilitiesAcknowledged??!0};this.responders.set(e.id,i);const r=()=>{this.detachResponder(i,"Runtime 客户端连接已关闭")};return this.responderAttachments.set(r,i),r}request(t,i,r){if(this.interactions.has(r.key))throw new RuntimeClientRequestError(`Runtime 请求 "${r.key}" 已存在`);const a=r.protocolVersion??"1.1";if(!d(a,t))throw new RuntimeClientRequestError(`Runtime Protocol ${a} 不支持 Server Request "${t}"`);const c=s(a).serverRequests[t];if(void 0===c)throw new RuntimeClientRequestError(`Runtime Protocol ${a} 缺少 Server Request "${t}" schema`);const l=c.params.parse(i),h=n(a).serverRequestCapabilityNegotiation;if(h&&(void 0===r.expiresAt||"object"!=typeof l||null===l||!("expiresAt"in l)||l.expiresAt!==r.expiresAt))throw new RuntimeClientRequestError(`Runtime Protocol ${a} 请求必须提供一致的绝对 expiresAt deadline`);const u=h?o.parse("object"==typeof l&&null!==l&&"interactionId"in l?l.interactionId:void 0):o.parse(e());let m;if(void 0!==r.expiresAt){const e=p.safeParse(r.expiresAt);if(!e.success||!Number.isFinite(Date.parse(e.data)))throw new RuntimeClientRequestError("Runtime 请求 expiresAt 必须是有效的 ISO 8601 时间戳");m=e.data}const R=Promise.withResolvers(),v=this.interactions.register({key:r.key,method:t,params:l,scopeId:r.scopeId,eligibleResponderId:r.eligibleResponderId,protocolVersion:a,interactionId:u,legacyApprovalId:r.approvalId,expiresAt:m,reject:R.reject,resolveResponse:e=>{try{R.resolve(c.result.parse(e))}catch(e){R.reject(new RuntimeClientRequestError(e instanceof Error?`客户端返回了无效的 Runtime 请求结果:${e.message}`:"客户端返回了无效的 Runtime 请求结果"))}}});return this.scheduleExpiration(v),this.interactions.get(v.key)===v&&this.deliver(v),{key:v.key,result:R.promise}}handleResponse(e,t){const i=this.responders.get(e);if(void 0===i){if("method"in t||!("id"in t))return!1;if(null===t.id)return!0;return void 0!==this.interactions.getByDeliveryId(t.id)&&(this.diagnose('忽略来自非目标 responder "'+e+'" 的 Runtime 响应 '+String(t.id)),!0)}return this.handleResponseFromAttachment(i,t)}handleResponseFromAttachment(e,t){if("method"in t||!("id"in t))return!1;const{responder:i}=e,r=i.id;if(this.responders.get(r)!==e)return this.diagnose('忽略来自已失效 responder session "'+r+'" 的 Runtime 响应'),!1;if(null===t.id){const n="error"in t?`${t.error.code} ${t.error.message}`:"客户端返回了非法的 id:null 成功响应";this.responders.delete(r),this.failAttachment(e,new RuntimeClientRequestError(`客户端返回无法关联的 JSON-RPC 错误:${n}`));try{i.close()}catch{}return!0}const n=this.interactions.getByDeliveryId(t.id);if(void 0===n)return!1;const{interaction:s,delivery:o}=n;if(o.attachment!==e)return this.diagnose(`忽略来自非目标 responder "${r}" 的 Runtime 响应 ${String(t.id)}`),!0;if(i.scopeId!==s.scopeId)return this.diagnose(`忽略 Runtime scope 不匹配的响应 ${String(t.id)} (${s.key})`),!0;if(this.isExpired(s))return this.expire(s),!0;if("error"in t)this.rejectInteraction(s,new RuntimeClientRequestError(`客户端未完成 Runtime 请求:${t.error.code} ${t.error.message}`));else{this.interactions.settle(s,{kind:"response"}).settled&&s.resolveResponse(t.result)}return!0}cancel(e,t){const i=this.interactions.get(e);if(void 0===i)return!1;const r="string"==typeof t&&t.length>0?t:m,n=this.interactions.settle(i,{kind:"cancelled",reason:r});return!!n.settled&&(this.sendCancellation(i,n.retiredDelivery,r),i.reject(new RuntimeClientRequestCancelledError(r)),!0)}cancelAll(e){for(const t of this.interactions.pending())this.cancel(t.key,e)}setResponderServerRequestMethods(e,t,i,r=!1){const n=this.responders.get(e);if(void 0===n)return!1;const s=this.setServerRequestMethodsForAttachment(n,t,i);return!1!==s&&(r?setTimeout(s,0):s(),!0)}beginResponderCapabilityNegotiation(e){const t=this.responders.get(e);return void 0!==t&&this.beginCapabilityNegotiationForAttachment(t)}getPendingInteractionProjections(e,t){const i=this.responders.get(e);return void 0===i?void 0:this.getPendingInteractionProjectionsForAttachment(i,t)}detachResponder(e,t){const{responder:i}=e;if(this.responders.get(i.id)===e){this.responders.delete(i.id);for(const e of this.interactions.pending()){if(e.eligibleResponderId!==i.id)continue;const r=this.interactions.settle(e,{kind:"cancelled",reason:t});r.settled&&(this.sendCancellation(e,r.retiredDelivery,t),e.reject(new RuntimeClientRequestCancelledError(t)))}}}deliver(e){if(this.isExpired(e))return void this.expire(e);const t=this.responders.get(e.eligibleResponderId);if(void 0===t||t.responder.scopeId!==e.scopeId)return void this.rejectInteraction(e,new RuntimeClientRequestError("没有可处理 Runtime 请求的目标客户端"));if(!t.capabilitiesAcknowledged)return;if(!t.acceptedServerRequestMethods.has(e.method))return void this.rejectInteraction(e,new RuntimeClientRequestError(`目标客户端未协商 Runtime Server Request "${e.method}"`));const i=this.interactions.beginDelivery(e,t);void 0!==i&&this.sendDelivery(e,i)}sendDelivery(e,t){try{t.attachment.responder.send({jsonrpc:"2.0",id:t.id,method:e.method,params:e.params})}catch(t){this.rejectInteraction(e,new RuntimeClientRequestError(t instanceof Error?`Runtime 请求发送失败:${t.message}`:"Runtime 请求发送失败"))}}scheduleExpiration(e){if(void 0===e.expiresAt)return;const t=Date.parse(e.expiresAt)-this.now();t<=0?this.expire(e):e.expiresTimer=setTimeout(()=>{e.expiresTimer=void 0,this.interactions.get(e.key)===e&&(this.isExpired(e)?this.expire(e):this.scheduleExpiration(e))},Math.min(t,u))}isExpired(e){return void 0!==e.expiresAt&&Date.parse(e.expiresAt)<=this.now()}expire(e){if(void 0===e.expiresAt||this.interactions.get(e.key)!==e)return;const t=this.interactions.settle(e,{kind:"expired",expiresAt:e.expiresAt});t.settled&&(this.sendCancellation(e,t.retiredDelivery,"Runtime 请求已到期"),e.reject(new RuntimeClientRequestExpiredError(e.expiresAt)))}sendCancellation(e,i,r){if(void 0!==i)try{const n=c(e.protocolVersion,{interactionId:e.interactionId,serverRequestId:i.id,...void 0!==e.legacyApprovalId?{approvalId:e.legacyApprovalId}:{},reason:r});i.attachment.responder.send({jsonrpc:"2.0",method:t,params:n})}catch{}}failAttachment(e,t){for(const i of this.interactions.pending())i.eligibleResponderId!==e.responder.id||i.scopeId!==e.responder.scopeId||"delivered"===i.state.kind&&i.state.delivery.attachment!==e||this.rejectInteraction(i,t)}getPendingInteractionProjectionsForAttachment(e,t){return this.responders.get(e.responder.id)===e&&e.capabilitiesAcknowledged?this.interactions.pending().flatMap(s=>{if(s.eligibleResponderId!==e.responder.id||s.scopeId!==e.responder.scopeId||"delivered"===s.state.kind&&s.state.delivery.attachment!==e||!n(s.protocolVersion).serverRequestCapabilityNegotiation||!e.acceptedServerRequestMethods.has(s.method))return[];if(s.method===i.approvalRequest){const e=r.safeParse(s.params);return e.success?e.data.threadId!==t?[]:[a.parse({method:s.method,interactionId:s.interactionId,threadId:e.data.threadId,turnId:e.data.turnId,expiresAt:e.data.expiresAt,sensitivity:e.data.sensitivity,approvalId:e.data.approval.id})]:(this.diagnose(`忽略无法投影的 pending Interaction "${s.key}":params 不符合 1.2 schema`),[])}const o=l.safeParse(s.params);return o.success?o.data.threadId!==t?[]:[a.parse({method:s.method,...o.data})]:(this.diagnose(`忽略无法投影的 pending Interaction "${s.key}":params 不符合 1.2 schema`),[])}):[]}diagnose(e){try{this.onDiagnostic?.(e)}catch{}}redeliver(e,t){const i=this.interactions.get(e),r=this.responders.get(t);if(void 0===i||void 0===r||i.eligibleResponderId!==t||r.responder.scopeId!==i.scopeId||!r.capabilitiesAcknowledged||!r.acceptedServerRequestMethods.has(i.method)||this.isExpired(i))return void 0!==i&&this.isExpired(i)&&this.expire(i),!1;const n=this.interactions.replaceDelivery(i,r);if(void 0===n)return!1;this.sendCancellation(i,n.previous,"Runtime 请求已重新投递");const s=this.interactions.getByDeliveryId(n.delivery.id);return s?.interaction===i&&s.delivery===n.delivery&&(this.isExpired(i)?(this.expire(i),!1):(this.sendDelivery(i,n.delivery),this.interactions.get(i.key)===i))}rejectInteraction(e,t){return!!this.interactions.settle(e,{kind:"failed",error:t}).settled&&(e.reject(t),!0)}setServerRequestMethodsForAttachment(e,t,i){const{responder:r}=e;if(this.responders.get(r.id)!==e)return!1;const n=new Set(t),s=new Set([...e.acceptedServerRequestMethods].filter(e=>!n.has(e)));e.acceptedServerRequestMethods=n,e.capabilitiesAcknowledged=!1;for(const e of this.interactions.pending()){if(e.eligibleResponderId!==r.id||!s.has(e.method))continue;const t=this.interactions.settle(e,{kind:"cancelled",reason:i});t.settled&&(this.sendCancellation(e,t.retiredDelivery,i),e.reject(new RuntimeClientRequestCancelledError(i)))}return()=>{if(this.responders.get(r.id)===e&&e.acceptedServerRequestMethods===n){e.capabilitiesAcknowledged=!0;for(const e of this.interactions.pending())e.eligibleResponderId===r.id&&"waiting"===e.state.kind&&this.deliver(e)}}}beginCapabilityNegotiationForAttachment(e){return this.responders.get(e.responder.id)===e&&(e.acceptedServerRequestMethods=new Set,e.capabilitiesAcknowledged=!1,!0)}}export function getRuntimeClientRequestCoordinatorInternal(e){const t=R.get(e);if(void 0===t)throw new RuntimeClientRequestError("Runtime client request coordinator is not initialized");return t}
|
|
1
|
+
import{randomUUID as e}from"node:crypto";import{RUNTIME_SERVER_REQUEST_CANCEL_NOTIFICATION as t,RUNTIME_SERVER_REQUEST_METHODS as i,approvalRequestParamsV12Schema as r,getRuntimeProtocolCapabilities as n,getRuntimeProtocolRegistry as s,interactionIdSchema as o,isRuntimeServerRequestMethodAvailable as d,pendingInteractionProjectionSchema as a,projectRuntimeServerRequestCancelParams as c,timestampSchema as p,userInputRequestParamsV12Schema as l}from"@roll-agent/protocol";import{RuntimeClientInteractionLifecycle as h}from"./runtime-client-interaction-lifecycle.js";const u=2147483647,m="Runtime 请求已取消";export function createRuntimeClientResponderId(){return`runtime-client:${e()}`}const R=new WeakMap;export class RuntimeClientRequestError extends Error{constructor(e){super(e),this.name="RuntimeClientRequestError"}}export class RuntimeClientRequestCancelledError extends RuntimeClientRequestError{reason;constructor(e){super(e),this.name="RuntimeClientRequestCancelledError",this.reason=e}}export class RuntimeClientRequestExpiredError extends RuntimeClientRequestError{expiresAt;constructor(e){super(`Runtime 请求已于 ${e} 到期`),this.name="RuntimeClientRequestExpiredError",this.expiresAt=e}}export class RuntimeClientRequestCoordinator{now;onDiagnostic;responders=new Map;responderAttachments=new WeakMap;interactions=new h;constructor(e={}){this.now=e.now??Date.now,this.onDiagnostic=e.onDiagnostic,R.set(this,{handleResponseForAttachment:(e,t)=>{const i=this.responderAttachments.get(e);return void 0===i?void 0:this.handleResponseFromAttachment(i,t)},setServerRequestMethodsForAttachment:(e,t,i)=>{const r=this.responderAttachments.get(e);return void 0===r?void 0:this.setServerRequestMethodsForAttachment(r,t,i)},setServerRequestMethodsForResponder:(e,t,i)=>{const r=this.responders.get(e);return void 0!==r&&this.setServerRequestMethodsForAttachment(r,t,i)},beginCapabilityNegotiationForAttachment:e=>{const t=this.responderAttachments.get(e);return void 0===t?void 0:this.beginCapabilityNegotiationForAttachment(t)},getPendingInteractionProjectionsForAttachment:(e,t)=>{const i=this.responderAttachments.get(e);return void 0===i?void 0:this.getPendingInteractionProjectionsForAttachment(i,t)},redeliver:(e,t)=>this.redeliver(e,t)})}attachResponder(e,t={}){if(this.responders.has(e.id))throw new RuntimeClientRequestError(`Runtime responder "${e.id}" 已连接`);const i={responder:e,acceptedServerRequestMethods:new Set(t.acceptedServerRequestMethods??s("1.1").serverRequestMethods),capabilitiesAcknowledged:t.capabilitiesAcknowledged??!0};this.responders.set(e.id,i);const r=()=>{this.detachResponder(i,"Runtime 客户端连接已关闭")};return this.responderAttachments.set(r,i),r}request(t,i,r){if(this.interactions.has(r.key))throw new RuntimeClientRequestError(`Runtime 请求 "${r.key}" 已存在`);const a=r.protocolVersion??"1.1";if(!d(a,t))throw new RuntimeClientRequestError(`Runtime Protocol ${a} 不支持 Server Request "${t}"`);const c=s(a).serverRequests[t];if(void 0===c)throw new RuntimeClientRequestError(`Runtime Protocol ${a} 缺少 Server Request "${t}" schema`);const l=c.params.parse(i),h=n(a).serverRequestCapabilityNegotiation;if(h&&(void 0===r.expiresAt||"object"!=typeof l||null===l||!("expiresAt"in l)||l.expiresAt!==r.expiresAt))throw new RuntimeClientRequestError(`Runtime Protocol ${a} 请求必须提供一致的绝对 expiresAt deadline`);const u=h?o.parse("object"==typeof l&&null!==l&&"interactionId"in l?l.interactionId:void 0):o.parse(e());let m;if(void 0!==r.expiresAt){const e=p.safeParse(r.expiresAt);if(!e.success||!Number.isFinite(Date.parse(e.data)))throw new RuntimeClientRequestError("Runtime 请求 expiresAt 必须是有效的 ISO 8601 时间戳");m=e.data}const R=Promise.withResolvers(),g=this.interactions.register({key:r.key,method:t,params:l,scopeId:r.scopeId,eligibleResponderId:r.eligibleResponderId,protocolVersion:a,interactionId:u,legacyApprovalId:r.approvalId,expiresAt:m,reject:R.reject,resolveResponse:e=>{try{R.resolve(c.result.parse(e))}catch(e){R.reject(new RuntimeClientRequestError(e instanceof Error?`客户端返回了无效的 Runtime 请求结果:${e.message}`:"客户端返回了无效的 Runtime 请求结果"))}}});return this.scheduleExpiration(g),this.interactions.get(g.key)===g&&this.deliver(g),{key:g.key,result:R.promise}}handleResponse(e,t){const i=this.responders.get(e);if(void 0===i){if("method"in t||!("id"in t))return!1;if(null===t.id)return!0;return void 0!==this.interactions.getByDeliveryId(t.id)&&(this.diagnose('忽略来自非目标 responder "'+e+'" 的 Runtime 响应 '+String(t.id)),!0)}return this.handleResponseFromAttachment(i,t)}handleResponseFromAttachment(e,t){if("method"in t||!("id"in t))return!1;const{responder:i}=e,r=i.id;if(this.responders.get(r)!==e)return this.diagnose('忽略来自已失效 responder session "'+r+'" 的 Runtime 响应'),!1;if(null===t.id){const n="error"in t?`${t.error.code} ${t.error.message}`:"客户端返回了非法的 id:null 成功响应";this.responders.delete(r),this.failAttachment(e,new RuntimeClientRequestError(`客户端返回无法关联的 JSON-RPC 错误:${n}`));try{i.close()}catch{}return!0}const n=this.interactions.getByDeliveryId(t.id);if(void 0===n)return!1;const{interaction:s,delivery:o}=n;if(o.attachment!==e)return this.diagnose(`忽略来自非目标 responder "${r}" 的 Runtime 响应 ${String(t.id)}`),!0;if(i.scopeId!==s.scopeId)return this.diagnose(`忽略 Runtime scope 不匹配的响应 ${String(t.id)} (${s.key})`),!0;if(this.isExpired(s))return this.expire(s),!0;if("error"in t)this.rejectInteraction(s,new RuntimeClientRequestError(`客户端未完成 Runtime 请求:${t.error.code} ${t.error.message}`));else{this.interactions.settle(s,{kind:"response"}).settled&&s.resolveResponse(t.result)}return!0}cancel(e,t){const i=this.interactions.get(e);if(void 0===i)return!1;const r="string"==typeof t&&t.length>0?t:m,n=this.interactions.settle(i,{kind:"cancelled",reason:r});return!!n.settled&&(this.sendCancellation(i,n.retiredDelivery,r),i.reject(new RuntimeClientRequestCancelledError(r)),!0)}cancelAll(e){for(const t of this.interactions.pending())this.cancel(t.key,e)}setResponderServerRequestMethods(e,t,i,r=!1){const n=this.responders.get(e);if(void 0===n)return!1;const s=this.setServerRequestMethodsForAttachment(n,t,i);return!1!==s&&(r?setTimeout(s,0):s(),!0)}beginResponderCapabilityNegotiation(e){const t=this.responders.get(e);return void 0!==t&&this.beginCapabilityNegotiationForAttachment(t)}getPendingInteractionProjections(e,t){const i=this.responders.get(e);return void 0===i?void 0:this.getPendingInteractionProjectionsForAttachment(i,t)}detachResponder(e,t){const{responder:i}=e;if(this.responders.get(i.id)===e){this.responders.delete(i.id);for(const e of this.interactions.pending()){if(e.eligibleResponderId!==i.id)continue;const r=this.interactions.settle(e,{kind:"cancelled",reason:t});r.settled&&(this.sendCancellation(e,r.retiredDelivery,t),e.reject(new RuntimeClientRequestCancelledError(t)))}}}deliver(e){if(this.isExpired(e))return void this.expire(e);const t=this.responders.get(e.eligibleResponderId);if(void 0===t||t.responder.scopeId!==e.scopeId)return void this.rejectInteraction(e,new RuntimeClientRequestError("没有可处理 Runtime 请求的目标客户端"));if(!t.capabilitiesAcknowledged)return;if(!t.acceptedServerRequestMethods.has(e.method))return void this.rejectInteraction(e,new RuntimeClientRequestError(`目标客户端未协商 Runtime Server Request "${e.method}"`));const i=this.interactions.beginDelivery(e,t);void 0!==i&&this.sendDelivery(e,i)}sendDelivery(e,t){try{t.attachment.responder.send({jsonrpc:"2.0",id:t.id,method:e.method,params:e.params})}catch(t){this.rejectInteraction(e,new RuntimeClientRequestError(t instanceof Error?`Runtime 请求发送失败:${t.message}`:"Runtime 请求发送失败"))}}scheduleExpiration(e){if(void 0===e.expiresAt)return;const t=Date.parse(e.expiresAt)-this.now();t<=0?this.expire(e):e.expiresTimer=setTimeout(()=>{e.expiresTimer=void 0,this.interactions.get(e.key)===e&&(this.isExpired(e)?this.expire(e):this.scheduleExpiration(e))},Math.min(t,u))}isExpired(e){return void 0!==e.expiresAt&&Date.parse(e.expiresAt)<=this.now()}expire(e){if(void 0===e.expiresAt||this.interactions.get(e.key)!==e)return;const t=this.interactions.settle(e,{kind:"expired",expiresAt:e.expiresAt});t.settled&&(this.sendCancellation(e,t.retiredDelivery,"Runtime 请求已到期"),e.reject(new RuntimeClientRequestExpiredError(e.expiresAt)))}sendCancellation(e,i,r){if(void 0===i)return;let n;try{n=c(e.protocolVersion,{interactionId:e.interactionId,serverRequestId:i.id,...void 0!==e.legacyApprovalId?{approvalId:e.legacyApprovalId}:{},reason:r})}catch(t){return void this.diagnose(`Runtime Protocol ${e.protocolVersion} 取消通知投影失败:${t instanceof Error?t.message:String(t)}`)}try{i.attachment.responder.send({jsonrpc:"2.0",method:t,params:n})}catch{}}failAttachment(e,t){for(const i of this.interactions.pending())i.eligibleResponderId!==e.responder.id||i.scopeId!==e.responder.scopeId||"delivered"===i.state.kind&&i.state.delivery.attachment!==e||this.rejectInteraction(i,t)}getPendingInteractionProjectionsForAttachment(e,t){return this.responders.get(e.responder.id)===e&&e.capabilitiesAcknowledged?this.interactions.pending().flatMap(s=>{if(s.eligibleResponderId!==e.responder.id||s.scopeId!==e.responder.scopeId||"delivered"===s.state.kind&&s.state.delivery.attachment!==e||!n(s.protocolVersion).serverRequestCapabilityNegotiation||!e.acceptedServerRequestMethods.has(s.method))return[];if(s.method===i.approvalRequest){const e=r.safeParse(s.params);return e.success?e.data.threadId!==t?[]:[a.parse({method:s.method,interactionId:s.interactionId,threadId:e.data.threadId,turnId:e.data.turnId,expiresAt:e.data.expiresAt,sensitivity:e.data.sensitivity,approvalId:e.data.approval.id})]:(this.diagnose(`忽略无法投影的 pending Interaction "${s.key}":params 不符合 1.2 schema`),[])}const o=l.safeParse(s.params);return o.success?o.data.threadId!==t?[]:[a.parse({method:s.method,...o.data})]:(this.diagnose(`忽略无法投影的 pending Interaction "${s.key}":params 不符合 1.2 schema`),[])}):[]}diagnose(e){try{this.onDiagnostic?.(e)}catch{}}redeliver(e,t){const i=this.interactions.get(e),r=this.responders.get(t);if(void 0===i||void 0===r||i.eligibleResponderId!==t||r.responder.scopeId!==i.scopeId||!r.capabilitiesAcknowledged||!r.acceptedServerRequestMethods.has(i.method)||this.isExpired(i))return void 0!==i&&this.isExpired(i)&&this.expire(i),!1;const n=this.interactions.replaceDelivery(i,r);if(void 0===n)return!1;this.sendCancellation(i,n.previous,"Runtime 请求已重新投递");const s=this.interactions.getByDeliveryId(n.delivery.id);return s?.interaction===i&&s.delivery===n.delivery&&(this.isExpired(i)?(this.expire(i),!1):(this.sendDelivery(i,n.delivery),this.interactions.get(i.key)===i))}rejectInteraction(e,t){return!!this.interactions.settle(e,{kind:"failed",error:t}).settled&&(e.reject(t),!0)}setServerRequestMethodsForAttachment(e,t,i){const{responder:r}=e;if(this.responders.get(r.id)!==e)return!1;const n=new Set(t),s=new Set([...e.acceptedServerRequestMethods].filter(e=>!n.has(e)));e.acceptedServerRequestMethods=n,e.capabilitiesAcknowledged=!1;for(const e of this.interactions.pending()){if(e.eligibleResponderId!==r.id||!s.has(e.method))continue;const t=this.interactions.settle(e,{kind:"cancelled",reason:i});t.settled&&(this.sendCancellation(e,t.retiredDelivery,i),e.reject(new RuntimeClientRequestCancelledError(i)))}return()=>{if(this.responders.get(r.id)===e&&e.acceptedServerRequestMethods===n){e.capabilitiesAcknowledged=!0;for(const e of this.interactions.pending())e.eligibleResponderId===r.id&&"waiting"===e.state.kind&&this.deliver(e)}}}beginCapabilityNegotiationForAttachment(e){return this.responders.get(e.responder.id)===e&&(e.acceptedServerRequestMethods=new Set,e.capabilitiesAcknowledged=!1,!0)}}export function getRuntimeClientRequestCoordinatorInternal(e){const t=R.get(e);if(void 0===t)throw new RuntimeClientRequestError("Runtime client request coordinator is not initialized");return t}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@roll-agent/runtime",
|
|
3
|
-
"version": "0.18.
|
|
3
|
+
"version": "0.18.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -32,11 +32,11 @@
|
|
|
32
32
|
"ai": "^7.0.9",
|
|
33
33
|
"yaml": "2.8.3",
|
|
34
34
|
"zod": "^3.25.76",
|
|
35
|
-
"@roll-agent/protocol": "0.6.
|
|
35
|
+
"@roll-agent/protocol": "0.6.1"
|
|
36
36
|
},
|
|
37
37
|
"devDependencies": {
|
|
38
38
|
"@types/node": "^22.0.0",
|
|
39
|
-
"@roll-agent/core": "0.34.
|
|
39
|
+
"@roll-agent/core": "0.34.1"
|
|
40
40
|
},
|
|
41
41
|
"scripts": {
|
|
42
42
|
"build": "rm -rf dist && tsc -p tsconfig.build.json && node ../../scripts/obfuscate.mjs",
|