beeos-claw 0.6.66-cloud.14 → 0.6.66-cloud.15
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.
package/dist/approval/bridge.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{toMessagePart}from"../message-client-types.js";import{approvalPresentation}from"./presentation.js";import{APPROVAL_PART_KIND,APPROVAL_SCHEMA_VERSION,readApprovalDocument}from"./protocol.generated.js";export function settleBeforeTerminal(e,t){return{get id(){return e.id},get isTerminated(){return e.isTerminated},get parts(){return e.parts},opened:()=>e.opened(),appendBody:t=>e.appendBody(t),setBody:t=>e.setBody(t),addPart:t=>e.addPart(t),replacePart:(t,r)=>e.replacePart(t,r),appendToolResult:(t,r,n)=>e.appendToolResult(t,r,n),finalize:r=>(t(),e.finalize(r)),fail:r=>(t(),e.fail(r)),cancel:r=>(t(),e.cancel(r))}}const NATIVE_DECISIONS=["allow-once","allow-always","deny"],ACTION_OF={"allow-once":"approve_once","allow-always":"approve_always",deny:"deny"},NATIVE_OF={approve_once:"allow-once",approve_always:"allow-always",deny:"deny"},record=e=>null!==e&&"object"==typeof e&&!Array.isArray(e),text=e=>"string"==typeof e&&e.length>0?e:void 0;export class OpenClawApprovalBridge{deps;sinks=new Map;pending=new Map;constructor(e){this.deps=e}bindSession(e,t){return this.sinks.set(e,t),()=>{if(this.sinks.get(e)===t){this.sinks.delete(e);for(const[e,r]of this.pending)r.sink===t&&(this.pending.delete(e),t.add(approvalPart(cancelledByRunEnd(e))))}}}onGatewayEvent(e,t){switch(e){case"exec.approval.requested":return this.requested("exec",t);case"plugin.approval.requested":return this.requested("plugin",t);case"exec.approval.resolved":case"plugin.approval.resolved":return this.resolved(t);default:return}}async onDecision(e){const t=readApprovalDocument(e);if(!t||"approval_decision"!==t.kind)return!1;const r=this.pending.get(t.request_id);if(!r)return this.deps.logger.info?.(`[approval] decision for unknown or settled request_id=${t.request_id}`),!0;if(r.actionId)return!0;const n=NATIVE_OF[t.decision];if(!n||!r.request.available_actions.includes(t.decision))return this.deps.logger.warn?.(`[approval] unsupported decision=${t.decision} request_id=${t.request_id}`),!0;r.actionId=t.action_id;try{await this.deps.request("approval.resolve",{id:t.request_id,kind:r.kind,decision:n})}catch(e){r.actionId=void 0,this.deps.logger.warn?.(`[approval] approval.resolve failed request_id=${t.request_id}: ${e instanceof Error?e.message:String(e)}`)}return!0}requested(e,t){if(!record(t)||!record(t.request))return;const r=text(t.id),n=text(t.request.sessionKey);if(!r||!n||this.pending.has(r))return;const a=this.sinks.get(n);if(!a)return;const
|
|
1
|
+
import{toMessagePart}from"../message-client-types.js";import{approvalPresentation}from"./presentation.js";import{APPROVAL_PART_KIND,APPROVAL_SCHEMA_VERSION,readApprovalDocument}from"./protocol.generated.js";export function settleBeforeTerminal(e,t){return{get id(){return e.id},get isTerminated(){return e.isTerminated},get parts(){return e.parts},opened:()=>e.opened(),appendBody:t=>e.appendBody(t),setBody:t=>e.setBody(t),addPart:t=>e.addPart(t),replacePart:(t,r)=>e.replacePart(t,r),appendToolResult:(t,r,n)=>e.appendToolResult(t,r,n),finalize:r=>(t(),e.finalize(r)),fail:r=>(t(),e.fail(r)),cancel:r=>(t(),e.cancel(r))}}const NATIVE_DECISIONS=["allow-once","allow-always","deny"],ACTION_OF={"allow-once":"approve_once","allow-always":"approve_always",deny:"deny"},NATIVE_OF={approve_once:"allow-once",approve_always:"allow-always",deny:"deny"},record=e=>null!==e&&"object"==typeof e&&!Array.isArray(e),text=e=>"string"==typeof e&&e.length>0?e:void 0;export class OpenClawApprovalBridge{deps;sinks=new Map;pending=new Map;constructor(e){this.deps=e}bindSession(e,t){return this.sinks.set(e,t),()=>{if(this.sinks.get(e)===t){this.sinks.delete(e);for(const[e,r]of this.pending)r.sink===t&&(this.pending.delete(e),t.add(approvalPart(cancelledByRunEnd(e,r.request))))}}}onGatewayEvent(e,t){switch(e){case"exec.approval.requested":return this.requested("exec",t);case"plugin.approval.requested":return this.requested("plugin",t);case"exec.approval.resolved":case"plugin.approval.resolved":return this.resolved(t);default:return}}async onDecision(e){const t=readApprovalDocument(e);if(!t||"approval_decision"!==t.kind)return!1;const r=this.pending.get(t.request_id);if(!r)return this.deps.logger.info?.(`[approval] decision for unknown or settled request_id=${t.request_id}`),!0;if(r.actionId)return!0;const n=NATIVE_OF[t.decision];if(!n||!r.request.available_actions.includes(t.decision))return this.deps.logger.warn?.(`[approval] unsupported decision=${t.decision} request_id=${t.request_id}`),!0;r.actionId=t.action_id;try{await this.deps.request("approval.resolve",{id:t.request_id,kind:r.kind,decision:n})}catch(e){r.actionId=void 0,this.deps.logger.warn?.(`[approval] approval.resolve failed request_id=${t.request_id}: ${e instanceof Error?e.message:String(e)}`)}return!0}requested(e,t){if(!record(t)||!record(t.request))return;const r=text(t.id),n=text(t.request.sessionKey);if(!r||!n||this.pending.has(r))return;const a=this.sinks.get(n);if(!a)return;const o=toApprovalRequest(e,r,t.request,t.expiresAtMs);void 0!==a.add(approvalPart(o))&&this.pending.set(r,{kind:e,sink:a,request:o})}resolved(e){if(!record(e))return;const t=text(e.id),r=t?this.pending.get(t):void 0;t&&r&&(this.pending.delete(t),r.sink.add(approvalPart(toApprovalResolved(t,e,r))))}}export function approvalPart(e){return toMessagePart({type:"custom",kind:APPROVAL_PART_KIND,data:e})}function toApprovalRequest(e,t,r,n){const a=Array.isArray(r.allowedDecisions)?NATIVE_DECISIONS.filter(e=>r.allowedDecisions.includes(e)):[...NATIVE_DECISIONS],o=Array.isArray(r.unavailableDecisions)?r.unavailableDecisions:[],i="exec"===e?{tool_name:"exec",summary:text(r.commandPreview)??text(r.command)??"",...text(r.cwd)?{detail:r.cwd}:{}}:{...text(r.toolName)?{tool_name:r.toolName}:{},summary:text(r.title)??"",...text(r.description)||text(r.detail)?{detail:[text(r.description),text(r.detail)].filter(Boolean).join("\n\n")}:{}},s="number"==typeof n&&Number.isFinite(n)?n:Date.now();return{schema_version:APPROVAL_SCHEMA_VERSION,kind:"approval_request",request_id:t,source:"exec"===e?"command":"plugin",operation:approvalPresentation(i,[]),available_actions:a.filter(e=>!o.includes(e)).map(e=>ACTION_OF[e]),expires_at:new Date(s).toISOString(),native:{kind:e,...approvalPresentation(r,[])}}}function requestContent(e){return{source:e.source,operation:e.operation}}function cancelledByRunEnd(e,t){return{schema_version:APPROVAL_SCHEMA_VERSION,kind:"approval_resolved",request_id:e,status:"cancelled",reason:"run_aborted",...requestContent(t),resolved_at:(new Date).toISOString()}}function toApprovalResolved(e,t,r){const{actionId:n}=r,a=text(t.terminalStatus),o=text(t.decision),i="number"==typeof t.ts&&Number.isFinite(t.ts)?t.ts:Date.now(),s="deny"===o&&!n&&i>=Date.parse(r.request.expires_at),d="expired"===a||!a&&s?"expired":"cancelled"===a?"cancelled":"deny"===o?"denied":o?"approved":a??"cancelled",p=o&&NATIVE_DECISIONS.includes(o)?ACTION_OF[o]:void 0;return{schema_version:APPROVAL_SCHEMA_VERSION,kind:"approval_resolved",request_id:e,status:d,..."expired"===d?{reason:"timeout"}:"approved"===d||"denied"===d?{reason:"user"}:{},...!n||"approved"!==d&&"denied"!==d?{}:{action_id:n},...!p||"approved"!==d&&"denied"!==d?{}:{decision:p},...requestContent(r.request),resolved_at:new Date(i).toISOString()}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export const APPROVAL_SCHEMA_VERSION="beeos.approval.v1";export const APPROVAL_REQUEST_MESSAGE_TYPE="agent.input_required";export const APPROVAL_DECISION_MESSAGE_TYPE="user.continue";export const APPROVAL_RESOLVED_MESSAGE_TYPE="approval.resolved";export const APPROVAL_PART_KIND="approval";export const APPROVAL_REQUESTED_EVENT="beeos.approval.requested";export const APPROVAL_RESOLVED_EVENT="beeos.approval.resolved";export const APPROVAL_SOURCES=["command","code_execution","protected_write","plugin","system"];export const APPROVAL_ACTIONS=["approve_once","approve_session","approve_always","deny"];export const APPROVAL_STATUSES=["approved","denied","expired","cancelled"];export const APPROVAL_REASONS=["user","timeout","no_human","run_aborted"];export function approvalRequestMessageId(e){return`approval_request:${e}`}export function approvalResolvedMessageId(e){return`approval_resolved:${e}`}function record(e){return null!==e&&"object"==typeof e&&!Array.isArray(e)}function text(e){return"string"==typeof e&&e.length>0}function optionalText(e){return void 0===e||"string"==typeof e}export function isApprovalDocument(e){return record(e)&&"beeos.approval.v1"===e.schema_version}export function readApprovalDocument(e){if(!isApprovalDocument(e)||!text(e.request_id))return null;switch(e.kind){case"approval_request":
|
|
1
|
+
export const APPROVAL_SCHEMA_VERSION="beeos.approval.v1";export const APPROVAL_REQUEST_MESSAGE_TYPE="agent.input_required";export const APPROVAL_DECISION_MESSAGE_TYPE="user.continue";export const APPROVAL_RESOLVED_MESSAGE_TYPE="approval.resolved";export const APPROVAL_PART_KIND="approval";export const APPROVAL_REQUESTED_EVENT="beeos.approval.requested";export const APPROVAL_RESOLVED_EVENT="beeos.approval.resolved";export const APPROVAL_SOURCES=["command","code_execution","protected_write","plugin","system"];export const APPROVAL_ACTIONS=["approve_once","approve_session","approve_always","deny"];export const APPROVAL_STATUSES=["approved","denied","expired","cancelled"];export const APPROVAL_REASONS=["user","timeout","no_human","run_aborted"];export function approvalRequestMessageId(e){return`approval_request:${e}`}export function approvalResolvedMessageId(e){return`approval_resolved:${e}`}function record(e){return null!==e&&"object"==typeof e&&!Array.isArray(e)}function text(e){return"string"==typeof e&&e.length>0}function optionalText(e){return void 0===e||"string"==typeof e}function isOperation(e){return record(e)&&"string"==typeof e.summary&&optionalText(e.tool_name)&&optionalText(e.detail)}export function isApprovalDocument(e){return record(e)&&"beeos.approval.v1"===e.schema_version}export function readApprovalDocument(e){if(!isApprovalDocument(e)||!text(e.request_id))return null;switch(e.kind){case"approval_request":return text(e.source)&&isOperation(e.operation)&&Array.isArray(e.available_actions)&&e.available_actions.every(text)&&text(e.expires_at)&&(void 0===e.native||record(e.native))?e:null;case"approval_decision":return text(e.action_id)&&text(e.decision)&&optionalText(e.reason)?e:null;case"approval_resolved":return text(e.status)&&optionalText(e.reason)&&optionalText(e.action_id)&&text(e.resolved_at)&&(void 0===e.decision||text(e.decision))&&(void 0===e.source||text(e.source))&&(void 0===e.operation||isOperation(e.operation))?e:null;default:return null}}export function knownApprovalActions(e){return e.available_actions.filter(e=>APPROVAL_ACTIONS.includes(e))}export function isKnownApprovalStatus(e){return APPROVAL_STATUSES.includes(e)}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "beeos-claw",
|
|
3
|
-
"version": "0.6.66-cloud.
|
|
3
|
+
"version": "0.6.66-cloud.15",
|
|
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>",
|
|
@@ -88,5 +88,5 @@
|
|
|
88
88
|
"fast-uri": ">=3.1.4",
|
|
89
89
|
"brace-expansion": ">=5.0.9"
|
|
90
90
|
},
|
|
91
|
-
"gitHead": "
|
|
91
|
+
"gitHead": "bca42b7e690faffe7e1fb6050ae07d39cf0ef513"
|
|
92
92
|
}
|