beeos-claw 0.6.29 → 0.6.30

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.
@@ -0,0 +1 @@
1
+ import{RUNTIME_ERROR_DESCRIPTORS,RUNTIME_HASH_DOMAINS}from"@beeos-ai/beeos-types/runtime";import{verifyAndCreateMessageServiceCoreExecutionAttempt}from"./core-execution-attempt-context.js";import{RuntimeSessionNewRejectedError}from"./runtime-rpc-consumer.js";import{RUNTIME_MESSAGE_TYPES,runtimeMessageHash}from"./runtime-message-channel-contract.js";const SESSION_NEW_METHOD="session/new",SESSION_NEW_COMMAND="session.create";export class SessionNewRuntimeDeliveryBridge{options;workers=new Map;constructor(e){this.options=e}async acceptDelivery(e,t,s){this.currentLease(t);const r=record(e.message.payload),n=string(r?.operationId)??e.message.channel_id,o=this.workers.get(n);if(o)return await o;const i=this.handleDelivery(e,t,s).finally(()=>this.workers.delete(n));this.workers.set(n,i),await i}async handleDelivery(e,t,s){const r=parseSessionNewRequest(e);if(!r.ok)return void await this.options.poison(e,`invalid_session_new:${r.reason}`,t);const n=r.request,o=this.options.consumer(),i=async()=>{this.currentLease(t),await o.acknowledge([e.deliveryId])},a=await o.history(n.operationId);if("found"!==a.status)return void await i();const d=parseSessionNewHistory(a.snapshot);if(!d.ok||d.request.operationId!==n.operationId||d.request.requestMessageId!==n.requestMessageId||d.request.requestHash!==n.requestHash)return void await this.options.poison(e,"session_new_history_mismatch",t);const c=d.request;if(d.terminal)return void await i();if(c.instanceId!==t.instanceId||c.runtimeHandlerIdentity!==t.handlerIdentity||c.dispatchEpoch!==t.runtimeEpoch)return await this.appendFailure(c,t,"INSTANCE_EPOCH_MISMATCH"),void await i();const u=Date.now();if("deadline"===d.terminalSource||Date.parse(c.executionDeadlineAt)<=u||!d.started&&Date.parse(c.claimDeadlineAt)<=u)return await this.appendFailure(c,t,"COMMAND_EXPIRED"),void await i();if(d.cancelRequested&&!d.started)return await this.appendFailure(c,t,"OPERATION_CANCELLED"),void await i();const p=e.executionGrant;if(!p)return await this.appendFailure(c,t,d.started?"OUTCOME_UNKNOWN":"INVALID_EXECUTION_GRANT"),void await i();await this.options.verifier.refresh(),this.options.verifier.verifyAndDecodeGrant(p)||await this.options.verifier.refresh(!0);const h=new AbortController,l=()=>h.abort();s.addEventListener("abort",l,{once:!0});try{const e=await verifyAndCreateMessageServiceCoreExecutionAttempt({request:c,executionGrant:p,runtimeEpoch:t.runtimeEpoch,lease:t,verifier:this.options.verifier,allowExpiredGrant:d.started,abortSignal:h.signal,resolvePorts:async()=>({resources:noSessionNewResources})});if(!e.ok)return await this.appendFailure(c,t,d.started?"OUTCOME_UNKNOWN":"INVALID_EXECUTION_GRANT"),void await i();if(s.aborted)throw new Error("session/new delivery owner stopped");d.started?this.currentLease(t):await this.append(c,t,RUNTIME_MESSAGE_TYPES.started,{...correlation(c),executionGrantHash:c.executionGrantHash,handlerIdentity:t.handlerIdentity,executionMode:"start",claimedAt:(new Date).toISOString()},p);const r=c.request.params.agentId;let n;try{n=await this.options.createRuntimeSession({operationId:c.operationId,platformAgentId:r,...optionalStringProperty(c.request.params,"cwd"),...optionalStringProperty(c.command.params,"title")},e.context)}catch(e){if(!(e instanceof RuntimeSessionNewRejectedError))throw e;return await this.appendFailure(c,t,"INVALID_INVOCATION"),void await i()}const o=c.instanceId,a=r.startsWith("agent:")?r:`agent:${r}`;let u;try{u=await this.options.client.conversations.create({agentId:r,participants:dedupe([o,a,c.callerIdentityId]),...optionalStringProperty(c.command.params,"title"),metadata:{source:"session/new",runtimeSessionId:n.sessionId,runtimeSessionKey:n.gatewaySessionKey,runtimeInstanceId:c.instanceId,runtimeEpoch:c.dispatchEpoch,platformAgentId:r},idempotencyKey:c.operationId})}catch(e){const s=httpStatus(e);if(void 0===s||s>=500||408===s||429===s)throw e;return await this.appendFailure(c,t,"INVALID_INVOCATION"),void await i()}const l={sessionId:n.sessionId,conversationId:u.id},I=runtimeMessageHash(RUNTIME_HASH_DOMAINS.serviceResult,{method:"session/new",result:l});await this.append(c,t,RUNTIME_MESSAGE_TYPES.final,{...correlation(c),outcome:"succeeded",response:{jsonrpc:"2.0",id:c.request.id,result:l},serviceResultHash:I,completedAt:(new Date).toISOString()}),await i()}finally{h.abort(),s.removeEventListener("abort",l)}}async appendFailure(e,t,s){const r="COMMAND_EXPIRED"===s?"expired":"OPERATION_CANCELLED"===s?"cancelled":"OUTCOME_UNKNOWN"===s||"INSTANCE_EPOCH_MISMATCH"===s?"outcome_unknown":"failed",n="outcome_unknown"===r?"OUTCOME_UNKNOWN":s,o=RUNTIME_ERROR_DESCRIPTORS[n];await this.append(e,t,RUNTIME_MESSAGE_TYPES.final,{...correlation(e),outcome:r,response:{jsonrpc:"2.0",id:e.request.id,error:{code:o.jsonRpcCode,message:n,data:{code:n,operationId:e.operationId,effectState:r,retryMode:o.retryMode}}},completedAt:(new Date).toISOString()})}async append(e,t,s,r,n){this.currentLease(t);const o=this.options.consumer(),i=await o.append(e.operationId,s,r,n);if("created"===i.outcome||"duplicate"===i.outcome)return;let a=i.history;if(void 0===a){const t=await o.history(e.operationId);"found"===t.status&&(a=t.snapshot)}if(!hasCorrelatedMessage(a,s,e))throw new Error(`session/new ${s} append outcome is unknown`)}currentLease(e){const t=this.options.getLease();if(!t||t.instanceId!==e.instanceId||t.leaseId!==e.leaseId||t.runtimeEpoch!==e.runtimeEpoch||t.handlerIdentity!==e.handlerIdentity)throw new Error("session/new runtime delivery lease fence changed");if(!Number.isFinite(Date.parse(t.leaseExpiresAt))||Date.parse(t.leaseExpiresAt)<=Date.now())throw new Error("session/new runtime delivery lease expired");return t}}export function isCanonicalSessionNewDelivery(e){return"session/new"===record(e.message.payload)?.method}function parseSessionNewRequest(e){const t=e.message,s=record(t.payload),r=record(s?.request),n=record(r?.params),o=record(s?.command),i=record(o?.context),a=void 0===o?.params?void 0:record(o.params),d=[s?.operationId,s?.requestMessageId,s?.requestHash,s?.executionGrantHash,s?.instanceId,s?.runtimeHandlerIdentity,s?.dispatchEpoch,s?.callerIdentityId,s?.claimDeadlineAt,s?.executionDeadlineAt];return 1===s?.schemaVersion&&"session/new"===s?.method&&d.every(nonempty)&&"2.0"===r?.jsonrpc&&"session/new"===r.method&&("string"==typeof r.id||"number"==typeof r.id)&&n&&nonempty(n.agentId)&&"session.create"===o?.name&&i&&"instance"===i.scope&&i.operationId===s.operationId&&i.runtimeInstanceUid===s.instanceId&&i.dispatchEpoch===s.dispatchEpoch&&(void 0===o.params||a)&&t.type===RUNTIME_MESSAGE_TYPES.request&&t.channel_id===s.operationId&&t.message_id===s.requestMessageId&&Number.isFinite(Date.parse(s.claimDeadlineAt))&&Number.isFinite(Date.parse(s.executionDeadlineAt))?{ok:!0,request:s}:{ok:!1,reason:"required session/new fields do not correlate"}}function parseSessionNewHistory(e){const t=record(e),s=parseSessionNewRequest({deliveryId:"retained",redelivered:!0,idleMs:0,message:record(t?.request)});if(!s.ok||t?.operationId!==s.request.operationId||t.requestMessageId!==s.request.requestMessageId||t.requestHash!==s.request.requestHash)return{ok:!1};const r=record(t.started),n=record(r?.payload),o=void 0!==r&&n?.operationId===s.request.operationId&&n.requestMessageId===s.request.requestMessageId&&n.requestHash===s.request.requestHash&&n.dispatchEpoch===s.request.dispatchEpoch&&"session/new"===n.method;return{ok:!0,request:s.request,terminal:!0===t.terminal,terminalSource:string(t.terminalSource)??"none",cancelRequested:!0===t.cancelRequested,started:o}}function correlation(e){return{schemaVersion:1,operationId:e.operationId,requestMessageId:e.requestMessageId,requestHash:e.requestHash,dispatchEpoch:e.dispatchEpoch,method:"session/new"}}function hasCorrelatedMessage(e,t,s){const r=record(e);return(Array.isArray(r?.messages)?r.messages:[]).some(e=>{const r=record(e),n=record(r?.payload);return r?.type===t&&n?.operationId===s.operationId&&n.requestMessageId===s.requestMessageId&&n.requestHash===s.requestHash&&n.dispatchEpoch===s.dispatchEpoch&&"session/new"===n.method})}function optionalStringProperty(e,t){const s=e?.[t];return"string"==typeof s&&s.length>0?{[t]:s}:{}}function dedupe(e){return[...new Set(e.filter(e=>e.length>0))]}function httpStatus(e){const t=record(e),s=t?.status;return"number"==typeof s?s:void 0}function record(e){return null===e||"object"!=typeof e||Array.isArray(e)?void 0:e}function string(e){return"string"==typeof e&&e.length>0?e:void 0}function nonempty(e){return"string"==typeof e&&e.length>0}const noSessionNewResources=Object.freeze({async readContent(){throw new Error("session/new does not accept content resources")},async readVerifiedArtifact(){throw new Error("session/new does not accept artifact resources")}});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "beeos-claw",
3
- "version": "0.6.29",
3
+ "version": "0.6.30",
4
4
  "description": "OpenClaw plugin that bridges the BeeOS platform with the local OpenClaw Gateway, providing file transfer, ACP bridge, and observability.",
5
5
  "license": "MIT",
6
6
  "author": "BeeOS <dev@beeos.ai>",
@@ -63,7 +63,7 @@
63
63
  "dependencies": {
64
64
  "@beeos-ai/beeos-types": "4.2.0",
65
65
  "@beeos-ai/bridge-client": "^0.1.0",
66
- "@beeos-ai/message-sdk": "2.0.4",
66
+ "@beeos-ai/message-sdk": "2.0.7",
67
67
  "@modelcontextprotocol/sdk": "^1.29.0",
68
68
  "adm-zip": "^0.6.0",
69
69
  "ws": "^8.18.0"