grix-connector
Version:
Connect local AI coding agents (Claude, Codex, Gemini, Qwen, DeepSeek, Cursor, OpenCode, Pi, OpenHuman, Reasonix) to the Grix scheduling platform. Also serves as an OpenClaw plugin for Grix channel transport.
2 lines (1 loc) • 3.28 kB
JavaScript
import{INTERACTION_KINDS as c,LOCAL_ACTION_TYPES as m,INTERACTION_RESOLUTION_TYPES as d}from"./protocol-contract.js";import{normalizeString as r}from"../../core/util/normalize-string.js";function a(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function p(e){return JSON.parse(JSON.stringify(e))}function f(e){return Array.isArray(e)?e.map(t=>{if(!a(t))return null;const u=r(t.key),o=r(t.value);return!u||!o?null:{key:u,value:o}}).filter(t=>t!==null):[]}function y(e){const t=r(e.kind);if(!Object.values(c).includes(t))throw new Error(`interaction kind ${t} is invalid`);return{kind:t,request_id:r(e.requestID),session_id:r(e.sessionID),message_id:r(e.messageID),payload:a(e.payload)?e.payload:{}}}function C(e){return{tool_name:r(e.tool_name),description:r(e.description),input_preview:r(e.input_preview)}}function I(e){const t=a(e?.request_payload)?e.request_payload:{},u=r(t.mode).toLowerCase()==="url"?"url":"form",o={mode:u},i=r(t.message||t.prompt);return i&&(o.message=i),u==="url"?(o.url=r(t.url),o):(a(t.requested_schema)&&(o.requested_schema=p(t.requested_schema)),o)}function g(e){return{domain:"interaction_reply",kind:r(e.kind),request_id:r(e.requestID),outcome:r(e.outcome)||"resolved"}}function h(e){if(r(e?.action_type).toLowerCase()!==m.interactionReply)return{matched:!1,kind:"",requestID:"",resolution:null,errorCode:"",errorMsg:""};const u=a(e?.params)?e.params:{},o=r(u.kind).toLowerCase();if(!Object.values(c).includes(o))return{matched:!0,kind:"",requestID:r(u.request_id),resolution:null,errorCode:"resolution_invalid",errorMsg:"interaction kind is invalid"};const i=r(u.request_id),l=a(u.resolution)?u.resolution:null;if(!l)return{matched:!0,kind:o,requestID:i,resolution:null,errorCode:"resolution_invalid",errorMsg:"interaction resolution is required"};const s=r(l.type).toLowerCase();if(s===d.decision){const n=r(l.value).toLowerCase();return n==="allow"||n==="deny"?{matched:!0,kind:o,requestID:i,resolution:{type:s,value:n},errorCode:"",errorMsg:""}:{matched:!0,kind:o,requestID:i,resolution:null,errorCode:"resolution_invalid",errorMsg:`interaction decision ${n} is invalid`}}if(s===d.action){const n=r(l.value).toLowerCase();return["accept","decline","cancel"].includes(n)?{matched:!0,kind:o,requestID:i,resolution:{type:s,value:n},errorCode:"",errorMsg:""}:{matched:!0,kind:o,requestID:i,resolution:null,errorCode:"resolution_invalid",errorMsg:`interaction action ${n} is invalid`}}if(s===d.text){const n=r(l.value);return n?{matched:!0,kind:o,requestID:i,resolution:{type:s,value:n},errorCode:"",errorMsg:""}:{matched:!0,kind:o,requestID:i,resolution:null,errorCode:"resolution_invalid",errorMsg:"interaction text resolution is required"}}if(s===d.map){const n=f(l.entries);return n.length>0?{matched:!0,kind:o,requestID:i,resolution:{type:s,entries:n},errorCode:"",errorMsg:""}:{matched:!0,kind:o,requestID:i,resolution:null,errorCode:"resolution_invalid",errorMsg:"interaction map resolution is required"}}return{matched:!0,kind:o,requestID:i,resolution:null,errorCode:"resolution_invalid",errorMsg:`interaction resolution type ${s} is invalid`}}export{I as buildElicitationInteractionPayload,g as buildInteractionReplyResult,y as buildInteractionRequestInvokeParams,C as buildPermissionInteractionPayload,h as parseInteractionReplyAction};